OSDN Git Service

プレイヤーとモンスターのテレポートレベルを関数teleport_level()として
authornothere <nothere@0568b783-4c39-0410-ac80-bf13821ea2a2>
Wed, 2 Jul 2003 10:49:46 +0000 (10:49 +0000)
committernothere <nothere@0568b783-4c39-0410-ac80-bf13821ea2a2>
Wed, 2 Jul 2003 10:49:46 +0000 (10:49 +0000)
統合. 統合に当たり, 考え方の一部にTObandを参考にしている. モンスター
のテレポートレベルとしての仕様は次の通り.
* 固定クエストなどといったプレイヤーがテレポートレベルできない状況と
  同じ条件でテレポートレベルが無効になるが, ironman_downward だけは
  モンスターには影響しない.
* モンスター同士でのテレポート・レベルを実装. 非ユニークのテレポート
  耐性ではセービングスローせずに無効とした. これは青魔道師 / ものまね
  師のテレポートレベルに対する非ユニークのテレポート耐性の扱いと同じ
  である. また, プレイヤーが乗馬しているモンスターがテレポートレベル
  の対象である場合はプレイヤーのテレポートレベルとして扱う.
* モンスター格闘場ではテレポートレベルは無効.

src/cmd5.c
src/cmd6.c
src/externs.h
src/mane.c
src/mspells1.c
src/mspells2.c
src/mspells3.c
src/spells3.c

index 473ea65..b70b558 100644 (file)
@@ -1253,7 +1253,7 @@ static bool cast_sorcery_spell(int spell)
 #else
                if (!get_check("Are you sure? (Teleport Level)")) return FALSE;
 #endif
-               (void)teleport_player_level();
+               (void)teleport_level(0);
                break;
        case 22: /* Word of Recall */
                return word_of_recall();
@@ -2798,7 +2798,7 @@ msg_print("
 #else
                                if (!get_check("Are you sure? (Teleport Level)")) return FALSE;
 #endif
-                               (void)teleport_player_level();
+                               (void)teleport_level(0);
                        }
                        break;
                case 13: /* Dimension Door */
@@ -3389,7 +3389,7 @@ msg_print("
 #else
                if (!get_check("Are you sure? (Teleport Level)")) return FALSE;
 #endif
-               (void)teleport_player_level();
+               (void)teleport_level(0);
                break;
        case 27: /* Teleport Away */
                if (!get_aim_dir(&dir)) return FALSE;
index 3cae161..9aa2e48 100644 (file)
@@ -1733,7 +1733,7 @@ static void do_cmd_read_scroll_aux(int item, bool known)
 
                case SV_SCROLL_TELEPORT_LEVEL:
                {
-                       (void)teleport_player_level();
+                       (void)teleport_level(0);
                        ident = TRUE;
                        break;
                }
index 2199980..36e041e 100644 (file)
@@ -1093,7 +1093,7 @@ extern bool teleport_away(int m_idx, int dis, bool dec_valour);
 extern void teleport_to_player(int m_idx, int power);
 extern void teleport_player(int dis);
 extern void teleport_player_to(int ny, int nx, bool no_tele);
-extern void teleport_player_level(void);
+extern void teleport_level(int m_idx);
 extern bool recall_player(int turns);
 extern bool word_of_recall(void);
 extern bool reset_recall(void);
index 43f3a8a..0998f8f 100644 (file)
@@ -1007,20 +1007,22 @@ msg_format("%s
                break;
        case MS_TELE_LEVEL:
        {
+               int target_m_idx;
                monster_type *m_ptr;
                monster_race *r_ptr;
                char m_name[80];
 
                if (!target_set(TARGET_KILL)) return FALSE;
-               if (!cave[target_row][target_col].m_idx) break;
+               target_m_idx = cave[target_row][target_col].m_idx;
+               if (!target_m_idx) break;
                if (!los(py, px, target_row, target_col)) break;
-               m_ptr = &m_list[cave[target_row][target_col].m_idx];
+               m_ptr = &m_list[target_m_idx];
                r_ptr = &r_info[m_ptr->r_idx];
                monster_desc(m_name, m_ptr, 0);
 #ifdef JP
-                       msg_format("%s¤Î­¤ò»Ø¤µ¤·¤¿¡£", m_name);
+               msg_format("%^s¤Î­¤ò»Ø¤µ¤·¤¿¡£", m_name);
 #else
-                       msg_format("You gesture at %s's feet.", m_name);
+               msg_format("You gesture at %^s's feet.", m_name);
 #endif
 
                if ((r_ptr->flagsr & (RFR_EFF_RES_NEXU_MASK | RFR_RES_TELE)) ||
@@ -1029,27 +1031,10 @@ msg_format("%s
 #ifdef JP
                        msg_print("¤·¤«¤·¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª");
 #else
-                       msg_format("%s are unaffected!", m_name);
-#endif
-               }
-               else if (!dun_level || one_in_(2))
-               {
-#ifdef JP
-                       msg_format("%s¤Ï¾²¤òÆͤ­ÇˤäÆÄÀ¤ó¤Ç¤¤¤Ã¤¿¡£", m_name);
-#else
-                       msg_format("%s sink through the floor.", m_name);
-#endif
-                       delete_monster_idx(cave[target_row][target_col].m_idx);
-               }
-               else
-               {
-#ifdef JP
-                       msg_format("%s¤ÏÅ·°æ¤òÆͤ­ÇˤäÆÃè¤ØÉ⤤¤Æ¤¤¤Ã¤¿¡£",m_name);
-#else
-                       msg_format("%s rise up through the ceiling.", m_name);
+                       msg_format("%^s is unaffected!", m_name);
 #endif
-                       delete_monster_idx(cave[target_row][target_col].m_idx);
                }
+               else teleport_level(target_m_idx);
                break;
        }
        case MS_PSY_SPEAR:
index 17b7a7a..362eefd 100644 (file)
@@ -1433,7 +1433,7 @@ bool make_attack_spell(int m_idx)
        /* Remove the "ineffective" spells */
        remove_bad_spells(m_idx, &f4, &f5, &f6);
 
-       if (p_ptr->inside_arena)
+       if (p_ptr->inside_arena || p_ptr->inside_battle)
        {
                f4 &= ~(RF4_SUMMON_MASK);
                f5 &= ~(RF5_SUMMON_MASK);
@@ -3676,7 +3676,7 @@ msg_print("
                        }
                        else
                        {
-                               teleport_player_level();
+                               teleport_level(0);
                        }
                        learn_spell(MS_TELE_LEVEL);
                        update_smart_learn(m_idx, DRS_NEXUS);
index ff7219d..97c11d6 100644 (file)
@@ -328,6 +328,7 @@ bool monst_spell_monst(int m_idx)
                f5 &= ~(RF5_SUMMON_MASK);
                f6 &= ~(RF6_SUMMON_MASK);
        }
+
        if (p_ptr->inside_battle && !one_in_(3))
        {
                f6 &= ~(RF6_HEAL);
@@ -3339,8 +3340,43 @@ bool monst_spell_monst(int m_idx)
 
        /* RF6_TELE_LEVEL */
        case 160+10:
-               /* Not implemented */
-               return FALSE;
+               if (known)
+               {
+                       if (see_either)
+                       {
+#ifdef JP
+                               msg_format("%^s¤¬%s¤Î­¤ò»Ø¤µ¤·¤¿¡£", m_name, t_name);
+#else
+                               msg_format("%^s gestures at %s's feet.", m_name, t_name);
+#endif
+                       }
+                       else
+                       {
+                               mon_fight = TRUE;
+                       }
+               }
+
+               if (tr_ptr->flagsr & (RFR_EFF_RES_NEXU_MASK | RFR_RES_TELE))
+               {
+#ifdef JP
+                       if (see_t) msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", t_name);
+#else
+                       if (see_t) msg_format("%^s is unaffected!", t_name);
+#endif
+               }
+               else if ((tr_ptr->flags1 & RF1_QUESTOR) ||
+                           (tr_ptr->level > randint1((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10))
+               {
+#ifdef JP
+                       if (see_t) msg_format("%^s¤Ï¸úÎϤòÄ·¤ÍÊÖ¤·¤¿¡ª", t_name);
+#else
+                       if (see_t) msg_format("%^s resist the effects!", t_name);
+#endif
+               }
+               else teleport_level((t_idx == p_ptr->riding) ? 0 : t_idx);
+
+               wake_up = TRUE;
+               break;
 
        /* RF6_PSY_SPEAR */
        case 160+11:
index c1864a0..feaf7d7 100644 (file)
@@ -1441,20 +1441,22 @@ msg_format("%s
                break;
        case MS_TELE_LEVEL:
        {
+               int target_m_idx;
                monster_type *m_ptr;
                monster_race *r_ptr;
                char m_name[80];
 
                if (!target_set(TARGET_KILL)) return FALSE;
-               if (!cave[target_row][target_col].m_idx) break;
+               target_m_idx = cave[target_row][target_col].m_idx;
+               if (!target_m_idx) break;
                if (!los(py, px, target_row, target_col)) break;
-               m_ptr = &m_list[cave[target_row][target_col].m_idx];
+               m_ptr = &m_list[target_m_idx];
                r_ptr = &r_info[m_ptr->r_idx];
                monster_desc(m_name, m_ptr, 0);
 #ifdef JP
-                       msg_format("%s¤Î­¤ò»Ø¤µ¤·¤¿¡£", m_name);
+               msg_format("%^s¤Î­¤ò»Ø¤µ¤·¤¿¡£", m_name);
 #else
-                       msg_format("You gesture at %s's feet.", m_name);
+               msg_format("You gesture at %^s's feet.", m_name);
 #endif
 
                if ((r_ptr->flagsr & (RFR_EFF_RES_NEXU_MASK | RFR_RES_TELE)) ||
@@ -1463,27 +1465,10 @@ msg_format("%s
 #ifdef JP
                        msg_print("¤·¤«¤·¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª");
 #else
-                       msg_format("%s are unaffected!", m_name);
-#endif
-               }
-               else if (!dun_level || one_in_(2))
-               {
-#ifdef JP
-                       msg_format("%s¤Ï¾²¤òÆͤ­ÇˤäÆÄÀ¤ó¤Ç¤¤¤Ã¤¿¡£", m_name);
-#else
-                       msg_format("%s sinks through the floor.", m_name);
-#endif
-                       delete_monster_idx(cave[target_row][target_col].m_idx);
-               }
-               else
-               {
-#ifdef JP
-                       msg_format("%s¤ÏÅ·°æ¤òÆͤ­ÇˤäÆÃè¤ØÉ⤤¤Æ¤¤¤Ã¤¿¡£",m_name);
-#else
-                       msg_format("%s rises up through the ceiling.", m_name);
+                       msg_format("%^s is unaffected!", m_name);
 #endif
-                       delete_monster_idx(cave[target_row][target_col].m_idx);
                }
+               else teleport_level(target_m_idx);
                break;
        }
        case MS_PSY_SPEAR:
index 6ccdd6a..ad150eb 100644 (file)
@@ -512,32 +512,53 @@ msg_print("
 
 /*
  * Teleport the player one level up or down (random when legal)
+ * Note: If m_idx <= 0, target is player.
  */
-void teleport_player_level(void)
+void teleport_level(int m_idx)
 {
-       bool go_up;
+       bool         go_up;
+       monster_type *m_ptr;
+       char         m_name[160];
+       bool         see_m = TRUE;
+
+       if (m_idx <= 0) /* To player */
+       {
+#ifdef JP
+               strcpy(m_name, "¤¢¤Ê¤¿");
+#else
+               strcpy(m_name, "you");
+#endif
+       }
+       else /* To monster */
+       {
+               m_ptr = &m_list[m_idx];
+
+               /* Get the monster name (or "it") */
+               monster_desc(m_name, m_ptr, 0);
+
+               see_m = m_ptr->ml;
+       }
 
        /* No effect in arena or quest */
-       if (p_ptr->inside_arena || (p_ptr->inside_quest && !random_quest_number(dun_level)) ||
-           ((quest_number(dun_level) || (dun_level >= d_info[dungeon_type].maxdepth)) && (dun_level > 1) && ironman_downward))
+       if (p_ptr->inside_arena || p_ptr->inside_battle || (p_ptr->inside_quest && !random_quest_number(dun_level)) ||
+           ((quest_number(dun_level) || (dun_level >= d_info[dungeon_type].maxdepth)) && (dun_level > 1) && ironman_downward && (m_idx <= 0)))
        {
 #ifdef JP
-msg_print("¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£");
+               if (see_m) msg_print("¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£");
 #else
-               msg_print("There is no effect.");
+               if (see_m) msg_print("There is no effect.");
 #endif
 
                return;
        }
 
-       if (p_ptr->anti_tele)
+       if ((m_idx <= 0) && p_ptr->anti_tele) /* To player */
        {
 #ifdef JP
-msg_print("ÉԻ׵ĤÊÎϤ¬¥Æ¥ì¥Ý¡¼¥È¤òËɤ¤¤À¡ª");
+               msg_print("ÉԻ׵ĤÊÎϤ¬¥Æ¥ì¥Ý¡¼¥È¤òËɤ¤¤À¡ª");
 #else
                msg_print("A mysterious force prevents you from teleporting!");
 #endif
-
                return;
        }
 
@@ -545,104 +566,125 @@ msg_print("
        if (randint0(100) < 50) go_up = TRUE;
        else go_up = FALSE;
 
-       if (p_ptr->wizard)
+       if ((m_idx <= 0) && p_ptr->wizard)
        {
                if (get_check("Force to go up? ")) go_up = TRUE;
                else if (get_check("Force to go down? ")) go_up = FALSE;
        }
 
        /* Down only */ 
-       if (ironman_downward || (dun_level <= d_info[dungeon_type].mindepth))
+       if ((ironman_downward && (m_idx <= 0)) || (dun_level <= d_info[dungeon_type].mindepth))
        {
 #ifdef JP
-msg_print("¤¢¤Ê¤¿¤Ï¾²¤òÆͤ­ÇˤäÆÄÀ¤ó¤Ç¤¤¤¯¡£");
+               if (see_m) msg_format("%^s¤Ï¾²¤òÆͤ­ÇˤäÆÄÀ¤ó¤Ç¤¤¤¯¡£", m_name);
 #else
-               msg_print("You sink through the floor.");
+               if (see_m) msg_format("%^s sink%s through the floor.", m_name, (m_idx <= 0) ? "" : "s");
 #endif
-               if (!dun_level)
+               if (m_idx <= 0) /* To player */
                {
-                       dungeon_type = p_ptr->recall_dungeon;
-                       p_ptr->oldpy = py;
-                       p_ptr->oldpx = px;
-               }
+                       if (!dun_level)
+                       {
+                               dungeon_type = p_ptr->recall_dungeon;
+                               p_ptr->oldpy = py;
+                               p_ptr->oldpx = px;
+                       }
 
-               if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, 1, NULL);
+                       if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, 1, NULL);
 
-               if (autosave_l) do_cmd_save_game(TRUE);
+                       if (autosave_l) do_cmd_save_game(TRUE);
 
-               if (!dun_level)
-               {
-                       dun_level = d_info[dungeon_type].mindepth;
-                       prepare_change_floor_mode(CFM_RAND_PLACE | CFM_CLEAR_ALL);
-               }
-               else
-               {
-                       prepare_change_floor_mode(CFM_DOWN | CFM_RAND_PLACE | CFM_RAND_CONNECT);
-               }
+                       if (!dun_level)
+                       {
+                               dun_level = d_info[dungeon_type].mindepth;
+                               prepare_change_floor_mode(CFM_RAND_PLACE | CFM_CLEAR_ALL);
+                       }
+                       else
+                       {
+                               prepare_change_floor_mode(CFM_DOWN | CFM_RAND_PLACE | CFM_RAND_CONNECT);
+                       }
 
-               /* Leaving */
-               p_ptr->leaving = TRUE;
+                       /* Leaving */
+                       p_ptr->leaving = TRUE;
+               }
        }
 
        /* Up only */
        else if (quest_number(dun_level) || (dun_level >= d_info[dungeon_type].maxdepth))
        {
 #ifdef JP
-msg_print("¤¢¤Ê¤¿¤ÏÅ·°æ¤òÆͤ­ÇˤäÆÃè¤ØÉ⤤¤Æ¤¤¤¯¡£");
+               if (see_m) msg_format("%^s¤ÏÅ·°æ¤òÆͤ­ÇˤäÆÃè¤ØÉ⤤¤Æ¤¤¤¯¡£", m_name);
 #else
-               msg_print("You rise up through the ceiling.");
+               if (see_m) msg_format("%^s rise%s up through the ceiling.", m_name, (m_idx <= 0) ? "" : "s");
 #endif
 
 
-               if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, -1, NULL);
+               if (m_idx <= 0) /* To player */
+               {
+                       if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, -1, NULL);
 
-               if (autosave_l) do_cmd_save_game(TRUE);
+                       if (autosave_l) do_cmd_save_game(TRUE);
 
-               prepare_change_floor_mode(CFM_UP | CFM_RAND_PLACE | CFM_RAND_CONNECT);
+                       prepare_change_floor_mode(CFM_UP | CFM_RAND_PLACE | CFM_RAND_CONNECT);
 
-               leave_quest_check();
+                       leave_quest_check();
 
-               /* Leaving */
-               p_ptr->inside_quest = 0;
-               p_ptr->leaving = TRUE;
+                       /* Leaving */
+                       p_ptr->inside_quest = 0;
+                       p_ptr->leaving = TRUE;
+               }
        }
        else if (go_up)
        {
 #ifdef JP
-msg_print("¤¢¤Ê¤¿¤ÏÅ·°æ¤òÆͤ­ÇˤäÆÃè¤ØÉ⤤¤Æ¤¤¤¯¡£");
+               if (see_m) msg_format("%^s¤ÏÅ·°æ¤òÆͤ­ÇˤäÆÃè¤ØÉ⤤¤Æ¤¤¤¯¡£", m_name);
 #else
-               msg_print("You rise up through the ceiling.");
+               if (see_m) msg_format("%^s rise%s up through the ceiling.", m_name, (m_idx <= 0) ? "" : "s");
 #endif
 
 
-               if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, -1, NULL);
+               if (m_idx <= 0) /* To player */
+               {
+                       if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, -1, NULL);
 
-               if (autosave_l) do_cmd_save_game(TRUE);
+                       if (autosave_l) do_cmd_save_game(TRUE);
 
-               prepare_change_floor_mode(CFM_UP | CFM_RAND_PLACE | CFM_RAND_CONNECT);
+                       prepare_change_floor_mode(CFM_UP | CFM_RAND_PLACE | CFM_RAND_CONNECT);
 
-               /* Leaving */
-               p_ptr->leaving = TRUE;
+                       /* Leaving */
+                       p_ptr->leaving = TRUE;
+               }
        }
        else
        {
 #ifdef JP
-msg_print("¤¢¤Ê¤¿¤Ï¾²¤òÆͤ­ÇˤäÆÄÀ¤ó¤Ç¤¤¤¯¡£");
+               if (see_m) msg_format("%^s¤Ï¾²¤òÆͤ­ÇˤäÆÄÀ¤ó¤Ç¤¤¤¯¡£", m_name);
 #else
-               msg_print("You sink through the floor.");
+               if (see_m) msg_format("%^s sink%s through the floor.", m_name, (m_idx <= 0) ? "" : "s");
 #endif
 
-               /* Never reach this code on the surface */
-               /* if (!dun_level) dungeon_type = p_ptr->recall_dungeon; */
+               if (m_idx <= 0) /* To player */
+               {
+                       /* Never reach this code on the surface */
+                       /* if (!dun_level) dungeon_type = p_ptr->recall_dungeon; */
+
+                       if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, 1, NULL);
 
-               if (record_stair) do_cmd_write_nikki(NIKKI_TELE_LEV, 1, NULL);
+                       if (autosave_l) do_cmd_save_game(TRUE);
 
-               if (autosave_l) do_cmd_save_game(TRUE);
+                       prepare_change_floor_mode(CFM_DOWN | CFM_RAND_PLACE | CFM_RAND_CONNECT);
 
-               prepare_change_floor_mode(CFM_DOWN | CFM_RAND_PLACE | CFM_RAND_CONNECT);
+                       /* Leaving */
+                       p_ptr->leaving = TRUE;
+               }
+       }
+
+       /* Monster level teleportation is simple deleting now */
+       if (m_idx > 0)
+       {
+               /* Check for quest completion */
+               check_quest_completion(m_ptr);
 
-               /* Leaving */
-               p_ptr->leaving = TRUE;
+               delete_monster_idx(m_idx);
        }
 
        /* Sound */
@@ -1047,7 +1089,7 @@ msg_print("
                        }
 
                        /* Teleport Level */
-                       teleport_player_level();
+                       teleport_level(0);
                        break;
                }