OSDN Git Service

add type casting for fprintf
[hengband/hengband.git] / src / spells2.c
index ace5f53..2359722 100644 (file)
@@ -109,9 +109,9 @@ sprintf(Dummy, "
        info[i++] = "";
 
 #ifdef JP
-       sprintf(Dummy, "¸½ºß¤Î°À­ : %s(%ld)", your_alignment(), p_ptr->align);
+       sprintf(Dummy, "¸½ºß¤Î°À­ : %s(%ld)", your_alignment(), (long int)p_ptr->align);
 #else
-       sprintf(Dummy, "Your alighnment : %s(%ld)", your_alignment(), p_ptr->align);
+       sprintf(Dummy, "Your alighnment : %s(%ld)", your_alignment(), (long int)p_ptr->align);
 #endif
        strcpy(buf[1], Dummy);
        info[i++] = buf[1];
@@ -528,7 +528,7 @@ sprintf(Dummy, "
 
                        info[i++] = Dummy;
                        break;
-               case RACE_KUTA:
+               case RACE_KUTAR:
                        if (plev > 19)
 #ifdef JP
 info[i++] = "¤¢¤Ê¤¿¤Ï d20+30 ¥¿¡¼¥ó¤Î´Ö²£¤Ë¿­¤Ó¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(15 MP)";
@@ -588,8 +588,9 @@ info[i++] = "
 #endif
                        }
                        break;
-               case CLASS_MAGE:
                case CLASS_HIGH_MAGE:
+                       if (p_ptr->realm1 == REALM_HEX) break;
+               case CLASS_MAGE:
                case CLASS_SORCERER:
                        if (plev > 24)
                        {
@@ -749,7 +750,7 @@ info[i++] = "
                        break;
                case CLASS_BEASTMASTER:
 #ifdef JP
-info[i++] = "¤¢¤Ê¤¿¤Ï1ɤ¤ÎÀ¸Ì¿¤Î¤¢¤ë¥â¥ó¥¹¥¿¡¼¤ò»ÙÇÛ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(¥ì¥Ù¥ë/4 MP)";
+info[i++] = "¤¢¤Ê¤¿¤Ï1ÂΤÎÀ¸Ì¿¤Î¤¢¤ë¥â¥ó¥¹¥¿¡¼¤ò»ÙÇÛ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(¥ì¥Ù¥ë/4 MP)";
 #else
                        info[i++] = "You can dominate a monster (cost level/4).";
 #endif
@@ -773,9 +774,9 @@ info[i++] = "
                        if (plev > 47)
                        {
 #ifdef JP
-info[i++] = "¤¢¤Ê¤¿¤Ï1¥¿¡¼¥ó¤Ë2²óËâË¡¤ò¾§¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(77 MP)";
+info[i++] = "¤¢¤Ê¤¿¤Ï1¥¿¡¼¥ó¤Ë2²óËâË¡¤ò¾§¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(20 MP)";
 #else
-                               info[i++] = "You can cast two spells in one time (cost 77).";
+                               info[i++] = "You can cast two spells in one time (cost 20).";
 #endif
                        }
                        break;
@@ -3850,6 +3851,7 @@ bool detect_objects_magic(int range)
                        (tv == TV_CRUSADE_BOOK) ||
                        (tv == TV_MUSIC_BOOK) ||
                        (tv == TV_HISSATSU_BOOK) ||
+                       (tv == TV_HEX_BOOK) ||
                    ((o_ptr->to_a > 0) || (o_ptr->to_h + o_ptr->to_d > 0)))
                {
                        /* Memorize the item */
@@ -4655,12 +4657,25 @@ bool genocide_aux(int m_idx, int power, bool player_cast, int dam_side, cptr spe
 
        else if (m_idx == p_ptr->riding) resist = TRUE;
 
+       else if ((p_ptr->inside_quest && !random_quest_number(dun_level)) || p_ptr->inside_arena || p_ptr->inside_battle) resist = TRUE;
+
        else if (player_cast && (r_ptr->level > randint0(power))) resist = TRUE;
 
        else if (player_cast && (m_ptr->mflag2 & MFLAG2_NOGENO)) resist = TRUE;
 
        /* Delete the monster */
-       else delete_monster_idx(m_idx);
+       else
+       {
+               if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
+               {
+                       char m_name[80];
+
+                       monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
+                       do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_GENOCIDE, m_name);
+               }
+
+               delete_monster_idx(m_idx);
+       }
 
        if (resist && player_cast)
        {
@@ -4679,7 +4694,7 @@ bool genocide_aux(int m_idx, int power, bool player_cast, int dam_side, cptr spe
                if (MON_CSLEEP(m_ptr))
                {
                        (void)set_monster_csleep(m_idx, 0);
-                       if (see_m)
+                       if (m_ptr->ml)
                        {
 #ifdef JP
                                msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name);
@@ -4745,7 +4760,7 @@ bool symbol_genocide(int power, bool player_cast)
        bool result = FALSE;
 
        /* Prevent genocide in quest levels */
-       if (p_ptr->inside_quest && !random_quest_number(dun_level))
+       if ((p_ptr->inside_quest && !random_quest_number(dun_level)) || p_ptr->inside_arena || p_ptr->inside_battle)
        {
                return (FALSE);
        }
@@ -4796,7 +4811,7 @@ bool mass_genocide(int power, bool player_cast)
        bool result = FALSE;
 
        /* Prevent mass genocide in quest levels */
-       if (p_ptr->inside_quest && !random_quest_number(dun_level))
+       if ((p_ptr->inside_quest && !random_quest_number(dun_level)) || p_ptr->inside_arena || p_ptr->inside_battle)
        {
                return (FALSE);
        }
@@ -4840,7 +4855,7 @@ bool mass_genocide_undead(int power, bool player_cast)
        bool result = FALSE;
 
        /* Prevent mass genocide in quest levels */
-       if (p_ptr->inside_quest && !random_quest_number(dun_level))
+       if ((p_ptr->inside_quest && !random_quest_number(dun_level)) || p_ptr->inside_arena || p_ptr->inside_battle)
        {
                return (FALSE);
        }
@@ -4923,7 +4938,7 @@ bool probing(void)
 
                        msg_print(NULL);
 
-                       if (m_ptr->ap_r_idx != m_ptr->r_idx)
+                       if (!is_original_ap(m_ptr))
                        {
                                if (m_ptr->mflag2 & MFLAG2_KAGE)
                                        m_ptr->mflag2 &= ~(MFLAG2_KAGE);
@@ -5129,7 +5144,7 @@ bool destroy_area(int y1, int x1, int r, bool in_generate)
                                        m_ptr->hp = m_ptr->maxhp;
 
                                        /* Try to teleport away quest monsters */
-                                       if (!teleport_away(c_ptr->m_idx, (r * 2) + 1, TRUE, FALSE)) continue;
+                                       if (!teleport_away(c_ptr->m_idx, (r * 2) + 1, TELEPORT_DEC_VALOUR)) continue;
                                }
                                else
                                {
@@ -5138,7 +5153,7 @@ bool destroy_area(int y1, int x1, int r, bool in_generate)
                                                char m_name[80];
 
                                                monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
-                                               do_cmd_write_nikki(NIKKI_NAMED_PET, 6, m_name);
+                                               do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_DESTROY, m_name);
                                        }
 
                                        /* Delete the monster (if any) */
@@ -5204,17 +5219,17 @@ bool destroy_area(int y1, int x1, int r, bool in_generate)
                                        if (t < 20)
                                        {
                                                /* Create granite wall */
-                                               cave_set_feat(y, x, FEAT_WALL);
+                                               cave_set_feat(y, x, feat_granite);
                                        }
                                        else if (t < 70)
                                        {
                                                /* Create quartz vein */
-                                               cave_set_feat(y, x, FEAT_QUARTZ);
+                                               cave_set_feat(y, x, feat_quartz_vein);
                                        }
                                        else if (t < 100)
                                        {
                                                /* Create magma vein */
-                                               cave_set_feat(y, x, FEAT_MAGMA);
+                                               cave_set_feat(y, x, feat_magma_vein);
                                        }
                                        else
                                        {
@@ -5232,12 +5247,12 @@ bool destroy_area(int y1, int x1, int r, bool in_generate)
                                        else if (t < 70)
                                        {
                                                /* Create quartz vein */
-                                               c_ptr->feat = FEAT_QUARTZ;
+                                               c_ptr->feat = feat_quartz_vein;
                                        }
                                        else if (t < 100)
                                        {
                                                /* Create magma vein */
-                                               c_ptr->feat = FEAT_MAGMA;
+                                               c_ptr->feat = feat_magma_vein;
                                        }
                                        else
                                        {
@@ -5354,7 +5369,7 @@ bool destroy_area(int y1, int x1, int r, bool in_generate)
  * for a single turn, unless that monster can pass_walls or kill_walls.
  * This has allowed massive simplification of the "monster" code.
  */
-bool earthquake(int cy, int cx, int r)
+bool earthquake_aux(int cy, int cx, int r, int m_idx)
 {
        int             i, t, y, x, yy, xx, dy, dx;
        int             damage = 0;
@@ -5454,31 +5469,28 @@ bool earthquake(int cy, int cx, int r)
                        case 1:
                        {
 #ifdef JP
-msg_print("¥À¥ó¥¸¥ç¥ó¤ÎÊɤ¬Êø¤ì¤¿¡ª");
+                               msg_print("¥À¥ó¥¸¥ç¥ó¤ÎÊɤ¬Êø¤ì¤¿¡ª");
 #else
                                msg_print("The cave ceiling collapses!");
 #endif
-
                                break;
                        }
                        case 2:
                        {
 #ifdef JP
-msg_print("¥À¥ó¥¸¥ç¥ó¤Î¾²¤¬ÉÔ¼«Á³¤Ë¤Í¤¸¶Ê¤¬¤Ã¤¿¡ª");
+                               msg_print("¥À¥ó¥¸¥ç¥ó¤Î¾²¤¬ÉÔ¼«Á³¤Ë¤Í¤¸¶Ê¤¬¤Ã¤¿¡ª");
 #else
                                msg_print("The cave floor twists in an unnatural way!");
 #endif
-
                                break;
                        }
                        default:
                        {
 #ifdef JP
-msg_print("¥À¥ó¥¸¥ç¥ó¤¬Íɤ줿¡ªÊø¤ì¤¿´ä¤¬Æ¬¤Ë¹ß¤Ã¤Æ¤­¤¿¡ª");
+                               msg_print("¥À¥ó¥¸¥ç¥ó¤¬Íɤ줿¡ªÊø¤ì¤¿´ä¤¬Æ¬¤Ë¹ß¤Ã¤Æ¤­¤¿¡ª");
 #else
                                msg_print("The cave quakes!  You are pummeled with debris!");
 #endif
-
                                break;
                        }
                }
@@ -5488,11 +5500,10 @@ msg_print("
                {
                        /* Message and damage */
 #ifdef JP
-msg_print("¤¢¤Ê¤¿¤Ï¤Ò¤É¤¤²ø²æ¤òÉé¤Ã¤¿¡ª");
+                       msg_print("¤¢¤Ê¤¿¤Ï¤Ò¤É¤¤²ø²æ¤òÉé¤Ã¤¿¡ª");
 #else
                        msg_print("You are severely crushed!");
 #endif
-
                        damage = 200;
                }
 
@@ -5505,22 +5516,20 @@ msg_print("
                                case 1:
                                {
 #ifdef JP
-msg_print("¹ß¤êÃí¤°´ä¤ò¤¦¤Þ¤¯Èò¤±¤¿¡ª");
+                                       msg_print("¹ß¤êÃí¤°´ä¤ò¤¦¤Þ¤¯Èò¤±¤¿¡ª");
 #else
                                        msg_print("You nimbly dodge the blast!");
 #endif
-
                                        damage = 0;
                                        break;
                                }
                                case 2:
                                {
 #ifdef JP
-msg_print("´äÀФ¬¤¢¤Ê¤¿¤Ëľ·â¤·¤¿!");
+                                       msg_print("´äÀФ¬¤¢¤Ê¤¿¤Ëľ·â¤·¤¿!");
 #else
                                        msg_print("You are bashed by rubble!");
 #endif
-
                                        damage = damroll(10, 4);
                                        (void)set_stun(p_ptr->stun + randint1(50));
                                        break;
@@ -5528,11 +5537,10 @@ msg_print("
                                case 3:
                                {
 #ifdef JP
-msg_print("¤¢¤Ê¤¿¤Ï¾²¤ÈÊɤȤδ֤˶´¤Þ¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª");
+                                       msg_print("¤¢¤Ê¤¿¤Ï¾²¤ÈÊɤȤδ֤˶´¤Þ¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª");
 #else
                                        msg_print("You are crushed between the floor and ceiling!");
 #endif
-
                                        damage = damroll(10, 4);
                                        (void)set_stun(p_ptr->stun + randint1(50));
                                        break;
@@ -5547,12 +5555,35 @@ msg_print("
                map[16+py-cy][16+px-cx] = FALSE;
 
                /* Take some damage */
+               if (damage)
+               {
+                       char *killer;
+
+                       if (m_idx)
+                       {
+                               char m_name[80];
+                               monster_type *m_ptr = &m_list[m_idx];
+
+                               /* Get the monster's real name */
+                               monster_desc(m_name, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
+
+#ifdef JP
+                               killer = format("%s¤Îµ¯¤³¤·¤¿ÃÏ¿Ì", m_name);
+#else
+                               killer = format("an earthquake caused by %s", m_name);
+#endif
+                       }
+                       else
+                       {
 #ifdef JP
-if (damage) take_hit(DAMAGE_ATTACK, damage, "ÃÏ¿Ì", -1);
+                               killer = "ÃÏ¿Ì";
 #else
-               if (damage) take_hit(DAMAGE_ATTACK, damage, "an earthquake", -1);
+                               killer = "an earthquake";
 #endif
+                       }
 
+                       take_hit(DAMAGE_ATTACK, damage, killer, -1);
+               }
        }
 
        /* Examine the quaked region */
@@ -5638,12 +5669,11 @@ if (damage) take_hit(DAMAGE_ATTACK, damage, "
 
                                        /* Scream in pain */
 #ifdef JP
-msg_format("%^s¤Ï¶ìÄˤǵ㤭¤ï¤á¤¤¤¿¡ª", m_name);
+                                       if (!ignore_unview || is_seen(m_ptr)) msg_format("%^s¤Ï¶ìÄˤǵ㤭¤ï¤á¤¤¤¿¡ª", m_name);
 #else
-                                       msg_format("%^s wails out in pain!", m_name);
+                                       if (!ignore_unview || is_seen(m_ptr)) msg_format("%^s wails out in pain!", m_name);
 #endif
 
-
                                        /* Take damage from the quake */
                                        damage = (sn ? damroll(4, 8) : (m_ptr->hp + 1));
 
@@ -5658,9 +5688,9 @@ msg_format("%^s
                                        {
                                                /* Message */
 #ifdef JP
-                                               msg_format("%^s¤Ï´äÀФËËä¤â¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª", m_name);
+                                               if (!ignore_unview || is_seen(m_ptr)) msg_format("%^s¤Ï´äÀФËËä¤â¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª", m_name);
 #else
-                                               msg_format("%^s is embedded in the rock!", m_name);
+                                               if (!ignore_unview || is_seen(m_ptr)) msg_format("%^s is embedded in the rock!", m_name);
 #endif
 
                                                if (c_ptr->m_idx)
@@ -5670,7 +5700,7 @@ msg_format("%^s
                                                                char m2_name[80];
 
                                                                monster_desc(m2_name, m_ptr, MD_INDEF_VISIBLE);
-                                                               do_cmd_write_nikki(NIKKI_NAMED_PET, 7, m2_name);
+                                                               do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_EARTHQUAKE, m2_name);
                                                        }
                                                }
 
@@ -5744,21 +5774,21 @@ msg_format("%^s
                                if (t < 20)
                                {
                                        /* Create granite wall */
-                                       cave_set_feat(yy, xx, FEAT_WALL);
+                                       cave_set_feat(yy, xx, feat_granite);
                                }
 
                                /* Quartz */
                                else if (t < 70)
                                {
                                        /* Create quartz vein */
-                                       cave_set_feat(yy, xx, FEAT_QUARTZ);
+                                       cave_set_feat(yy, xx, feat_quartz_vein);
                                }
 
                                /* Magma */
                                else if (t < 100)
                                {
                                        /* Create magma vein */
-                                       cave_set_feat(yy, xx, FEAT_MAGMA);
+                                       cave_set_feat(yy, xx, feat_magma_vein);
                                }
 
                                /* Floor */
@@ -5837,6 +5867,11 @@ msg_format("%^s
        return (TRUE);
 }
 
+bool earthquake(int cy, int cx, int r)
+{
+       return earthquake_aux(cy, cx, r, 0);
+}
+
 
 void discharge_minion(void)
 {
@@ -5887,6 +5922,15 @@ void discharge_minion(void)
                project(i, 2+(r_ptr->level/20), m_ptr->fy,
                        m_ptr->fx, dam, GF_PLASMA, 
                        PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL, -1);
+
+               if (record_named_pet && m_ptr->nickname)
+               {
+                       char m_name[80];
+
+                       monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
+                       do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_BLAST, m_name);
+               }
+
                delete_monster_idx(i);
        }
 }
@@ -5953,7 +5997,7 @@ static void cave_temp_room_lite(void)
                                (void)set_monster_csleep(c_ptr->m_idx, 0);
 
                                /* Notice the "waking up" */
-                               if (is_seen(m_ptr))
+                               if (m_ptr->ml)
                                {
                                        char m_name[80];
 
@@ -6978,7 +7022,7 @@ msg_print("
                                msg_print("Space warps about you!");
 #endif
 
-                               teleport_player(damroll(10, 10), TRUE);
+                               teleport_player(damroll(10, 10), TELEPORT_PASSIVE);
                                if (randint0(13)) (*count) += activate_hi_summon(py, px, FALSE);
                                if (!one_in_(6)) break;
                        }
@@ -7357,14 +7401,15 @@ bool charm_living(int dir, int plev)
 }
 
 
-void kawarimi(bool success)
+bool kawarimi(bool success)
 {
        object_type forge;
        object_type *q_ptr = &forge;
        int y, x;
 
-       if (p_ptr->confused || p_ptr->blind || p_ptr->paralyzed || p_ptr->image) return;
-       if (randint0(200) < p_ptr->stun) return;
+       if (p_ptr->is_dead) return FALSE;
+       if (p_ptr->confused || p_ptr->blind || p_ptr->paralyzed || p_ptr->image) return FALSE;
+       if (randint0(200) < p_ptr->stun) return FALSE;
 
        if (!success && one_in_(3))
        {
@@ -7375,13 +7420,13 @@ void kawarimi(bool success)
 #endif
                p_ptr->special_defense &= ~(NINJA_KAWARIMI);
                p_ptr->redraw |= (PR_STATUS);
-               return;
+               return FALSE;
        }
 
        y = py;
        x = px;
 
-       teleport_player(10 + randint1(90), FALSE);
+       teleport_player(10 + randint1(90), 0L);
 
        object_wipe(q_ptr);
 
@@ -7402,6 +7447,9 @@ void kawarimi(bool success)
 
        p_ptr->special_defense &= ~(NINJA_KAWARIMI);
        p_ptr->redraw |= (PR_STATUS);
+
+       /* Teleported */
+       return TRUE;
 }
 
 
@@ -7417,6 +7465,7 @@ bool rush_attack(bool *mdeath)
        u16b path_g[32];
        int path_n, i;
        bool tmp_mdeath = FALSE;
+       bool moved = FALSE;
 
        if (mdeath) *mdeath = FALSE;
 
@@ -7487,7 +7536,7 @@ bool rush_attack(bool *mdeath)
                }
 
                /* Move player before updating the monster */
-               if (!player_bold(ty, tx)) teleport_player_to(ty, tx, FALSE, FALSE);
+               if (!player_bold(ty, tx)) teleport_player_to(ty, tx, TELEPORT_NONMAGICAL);
 
                /* Update the monster */
                update_mon(cave[ny][nx].m_idx, TRUE);
@@ -7518,12 +7567,14 @@ bool rush_attack(bool *mdeath)
 #endif
                }
 
+               if (!player_bold(ty, tx)) teleport_player_to(ty, tx, TELEPORT_NONMAGICAL);
+               moved = TRUE;
                tmp_mdeath = py_attack(ny, nx, HISSATSU_NYUSIN);
 
                break;
        }
 
-       if (!player_bold(ty, tx)) teleport_player_to(ty, tx, FALSE, FALSE);
+       if (!moved && !player_bold(ty, tx)) teleport_player_to(ty, tx, TELEPORT_NONMAGICAL);
 
        if (mdeath) *mdeath = tmp_mdeath;
        return TRUE;