OSDN Git Service

Add a monster, Young quicksilver dragon.
[hengband/hengband.git] / src / mind.c
index f4dee69..4e5788f 100644 (file)
@@ -295,128 +295,128 @@ void mindcraft_info(char *p, int use_mind, int power)
        cptr s_dur = "dur ";
        cptr s_range = "range ";
 #endif
-  int plev = p_ptr->lev;
+       int plev = p_ptr->lev;
 
-  strcpy(p, "");
+       strcpy(p, "");
 
-  switch (use_mind)
-    {
-    case MIND_MINDCRAFTER:
-      switch (power)
+       switch (use_mind)
        {
-       case 0:  break;
-       case 1:  sprintf(p, " %s%dd%d", s_dam, 3 + ((plev - 1) / 4), 3 + plev/15); break;
-       case 2:  sprintf(p, " %s10", s_range); break;
-       case 3:  sprintf(p, " %s%d", s_range, plev * 5);  break;
-       case 4:  break;
-       case 5: sprintf(p, " %s%dd8", s_dam, 8 + ((plev - 5) / 4));  break;
-       case 6:  sprintf(p, " %s%d", s_dur, plev);  break;
-       case 7:  break;
-       case 8:  sprintf(p, (plev < 25 ? " %s%d" : " %sd%d"), s_dam, (plev < 25 ? plev * 3 / 2 : plev * ((plev - 5) / 10 + 1))); break;
-       case 9:  sprintf(p, " %s10+d%d", s_dur, plev * 3 / 2);  break;
+       case MIND_MINDCRAFTER:
+               switch (power)
+               {
+               case 0:  break;
+               case 1:  sprintf(p, " %s%dd%d", s_dam, 3 + ((plev - 1) / 4), 3 + plev/15); break;
+               case 2:  sprintf(p, " %s10", s_range); break;
+               case 3:  sprintf(p, " %s%d", s_range, plev * 5);  break;
+               case 4:  break;
+               case 5: sprintf(p, " %s%dd8", s_dam, 8 + ((plev - 5) / 4));  break;
+               case 6:  sprintf(p, " %s%d", s_dur, plev);  break;
+               case 7:  break;
+               case 8:  sprintf(p, (plev < 25 ? " %s%d" : " %sd%d"), s_dam, (plev < 25 ? plev * 3 / 2 : plev * ((plev - 5) / 10 + 1))); break;
+               case 9:  sprintf(p, " %s10+d%d", s_dur, plev * 3 / 2);  break;
 #ifdef JP
-       case 10: sprintf(p, " ºÇÂç½ÅÎÌ:%d.%dkg", lbtokg1(plev * 15),lbtokg2(plev * 15));  break;
+               case 10: sprintf(p, " ºÇÂç½ÅÎÌ:%d.%dkg", lbtokg1(plev * 15),lbtokg2(plev * 15));  break;
 #else
-       case 10: sprintf(p, " max wgt %d", plev * 15);  break;
+               case 10: sprintf(p, " max wgt %d", plev * 15);  break;
 #endif
-       case 11: sprintf(p, " %s%dd6", s_dam, plev / 2);  break;
-       case 12: sprintf(p, " %sd%d+%d", s_dam, plev * 3, plev * 3); break;
+               case 11: sprintf(p, " %s%dd6", s_dam, plev / 2);  break;
+               case 12: sprintf(p, " %sd%d+%d", s_dam, plev * 3, plev * 3); break;
 #ifdef JP
-       case 13: sprintf(p, " ¹ÔÆ°:%d²ó", (p_ptr->csp + 100-p_ptr->energy_need - 50)/100); break;
+               case 13: sprintf(p, " ¹ÔÆ°:%ld²ó", (long int)(p_ptr->csp + 100-p_ptr->energy_need - 50)/100); break;
 #else
-       case 13: sprintf(p, " %d acts.", (p_ptr->csp + 100-p_ptr->energy_need - 50)/100); break;
+               case 13: sprintf(p, " %ld acts.", (p_ptr->csp + 100-p_ptr->energy_need - 50)/100); break;
 #endif
-       }
-      break;
-    case MIND_KI:
-      {
-       int boost = p_ptr->magic_num1[0];
+               }
+               break;
+       case MIND_KI:
+       {
+               int boost = p_ptr->magic_num1[0];
 
-       if (heavy_armor()) boost /= 2;
+               if (heavy_armor()) boost /= 2;
 
-       switch (power)
-         {
-         case 0:  sprintf(p, " %s%dd4", s_dam, 3 + ((plev - 1) / 5) + boost / 12); break;
-         case 1:  break;
-         case 2:  sprintf(p, " %s%d+d30", s_dur, 30 + boost / 5); break;
-         case 3:  sprintf(p, " %s%dd5", s_dam, 5 + ((plev - 1) / 5) + boost / 10); break;
-         case 4:  sprintf(p, " %s%d+d20", s_dur, 20 + boost / 5); break;
-         case 5:  break;
-         case 6:  sprintf(p, " %s%d+d%d", s_dur, 15 + boost / 7, plev / 2); break;
-         case 7:  sprintf(p, " %s%dd8", s_dam, 8 + ((plev - 5) / 5) + boost / 12); break;
-         case 8:  sprintf(p, " %s10d6+%d", s_dam, plev * 3 / 2 + boost * 3 / 5); break;
-         case 9:  break;
+               switch (power)
+               {
+               case 0:  sprintf(p, " %s%dd4", s_dam, 3 + ((plev - 1) / 5) + boost / 12); break;
+               case 1:  break;
+               case 2:  sprintf(p, " %s%d+d30", s_dur, 30 + boost / 5); break;
+               case 3:  sprintf(p, " %s%dd5", s_dam, 5 + ((plev - 1) / 5) + boost / 10); break;
+               case 4:  sprintf(p, " %s%d+d20", s_dur, 20 + boost / 5); break;
+               case 5:  break;
+               case 6:  sprintf(p, " %s%d+d%d", s_dur, 15 + boost / 7, plev / 2); break;
+               case 7:  sprintf(p, " %s%dd8", s_dam, 8 + ((plev - 5) / 5) + boost / 12); break;
+               case 8:  sprintf(p, " %s10d6+%d", s_dam, plev * 3 / 2 + boost * 3 / 5); break;
+               case 9:  break;
 #ifdef JP
-         case 10: sprintf(p, " ºÇÂç%dɤ", 1+boost/100); break;
+               case 10: sprintf(p, " ºÇÂç%dÂÎ", 1+boost/100); break;
 #else
-         case 10: sprintf(p, " max %d", 1+boost/100); break;
+               case 10: sprintf(p, " max %d", 1+boost/100); break;
 #endif
-         case 11: sprintf(p, " %s%d", s_dam, 100 + plev + boost); break;
-         case 12: sprintf(p, " %s%dd15", s_dam, 10 + plev / 2 + boost * 3 / 10); break;
+               case 11: sprintf(p, " %s%d", s_dam, 100 + plev + boost); break;
+               case 12: sprintf(p, " %s%dd15", s_dam, 10 + plev / 2 + boost * 3 / 10); break;
 #ifdef JP
-         case 13: sprintf(p, " ¹ÔÆ°:%d+d16²ó", 16+boost/20); break;
+               case 13: sprintf(p, " ¹ÔÆ°:%d+d16²ó", 16+boost/20); break;
 #else
-         case 13: sprintf(p, " %d+d16 acts", 16+boost/20); break;
+               case 13: sprintf(p, " %d+d16 acts", 16+boost/20); break;
 #endif
-         }
-       break;
-      case MIND_MIRROR_MASTER:
+               }
+               break;
+       }
+       case MIND_MIRROR_MASTER:
        {
-         switch (power)
-           {
-           case 0:  break;
-           case 1:  break;
-           case 2:  sprintf(p, " %s%dd4", s_dam,  3 + ((plev - 1) / 5) ); break;
-           case 3:  sprintf(p, " %s10", s_range); break;
-           case 4:  break;
-           case 5:  sprintf(p, " %s%d", s_range, plev *5); break;
-           case 6:  sprintf(p, " %s20+d20", s_dur);  break;
-           case 7:  break;
-           case 8:  sprintf(p, " %s%dd8", s_dam, 8+((plev -5)/4) ); break;
-           case 9:  break;
-           case 10: sprintf(p, " %s%dd8", s_dam, 11+(plev-5)/4 ); break;
-           case 11: break;
-           case 12: sprintf(p, " %s20+d20", s_dur);  break;
-           case 13: sprintf(p, " %s150+d%d", s_dam, plev*2 ); break;
-           case 14: break;
-           case 15: break;
-           case 16: sprintf(p, " %s%d", s_range, plev/2 +10); break;
-           case 17: break;
-           case 18: sprintf(p, " %s6+d6", s_dur);  break;
-           case 19: sprintf(p, " %s%d", s_dam, plev*11+5 ); break;
-           case 20: sprintf(p, " %s4+d4", s_dur);  break;
-           }
-         break;
+               switch (power)
+               {
+               case 0:  break;
+               case 1:  break;
+               case 2:  sprintf(p, " %s%dd4", s_dam,  3 + ((plev - 1) / 5) ); break;
+               case 3:  sprintf(p, " %s10", s_range); break;
+               case 4:  break;
+               case 5:  sprintf(p, " %s%d", s_range, plev *5); break;
+               case 6:  sprintf(p, " %s20+d20", s_dur);  break;
+               case 7:  break;
+               case 8:  sprintf(p, " %s%dd8", s_dam, 8+((plev -5)/4) ); break;
+               case 9:  break;
+               case 10: sprintf(p, " %s%dd8", s_dam, 11+(plev-5)/4 ); break;
+               case 11: break;
+               case 12: sprintf(p, " %s20+d20", s_dur);  break;
+               case 13: sprintf(p, " %s150+d%d", s_dam, plev*2 ); break;
+               case 14: break;
+               case 15: break;
+               case 16: sprintf(p, " %s%d", s_range, plev/2 +10); break;
+               case 17: break;
+               case 18: sprintf(p, " %s6+d6", s_dur);  break;
+               case 19: sprintf(p, " %s%d", s_dam, plev*11+5 ); break;
+               case 20: sprintf(p, " %s4+d4", s_dur);  break;
+               }
+               break;
        }
-      case MIND_NINJUTSU:
+       case MIND_NINJUTSU:
        {
-         switch (power)
-           {
-           case 0:  break;
-           case 1:  break;
-           case 2:  sprintf(p, " %s10", s_range); break;
-           case 3:  break;
-           case 4:  sprintf(p, " %s%d", s_range , plev *5); break;
-           case 5:  sprintf(p, " %s30", s_range); break;
-           case 6:  break;
-           case 7:  break;
-           case 8:  sprintf(p, " %s20+d20", s_dur);  break;
-           case 9:  sprintf(p, " %s%d", s_dam, (50+plev)/2 ); break;
-           case 10: break;
-           case 11: break;
-           case 12: break;
-           case 13: break;
-           case 14: break;
-           case 15: break;
-           case 16: sprintf(p, " %s%d+d%d", s_dur, plev/2, plev/2);  break;
-           case 17: sprintf(p, " %s%d*3", s_dam, (75+plev*2/3)/2 ); break;
-           case 18: sprintf(p, " %s%dd10", s_dam, 6+plev/8 ); break;
-           case 19: sprintf(p, " %s6+d6", s_dur);  break;
-           }
-         break;
+               switch (power)
+               {
+               case 0:  break;
+               case 1:  break;
+               case 2:  sprintf(p, " %s10", s_range); break;
+               case 3:  break;
+               case 4:  sprintf(p, " %s%d", s_range , plev *5); break;
+               case 5:  sprintf(p, " %s30", s_range); break;
+               case 6:  break;
+               case 7:  break;
+               case 8:  sprintf(p, " %s20+d20", s_dur);  break;
+               case 9:  sprintf(p, " %s%d", s_dam, (50+plev)/2 ); break;
+               case 10: break;
+               case 11: break;
+               case 12: break;
+               case 13: break;
+               case 14: break;
+               case 15: break;
+               case 16: sprintf(p, " %s%d+d%d", s_dur, plev/2, plev/2);  break;
+               case 17: sprintf(p, " %s%d*3", s_dam, (75+plev*2/3)/2 ); break;
+               case 18: sprintf(p, " %s%dd10", s_dam, 6+plev/8 ); break;
+               case 19: sprintf(p, " %s6+d6", s_dur);  break;
+               }
+               break;
+       }
        }
-      }
-    }
 }
 
   /*
@@ -889,11 +889,11 @@ if (!b) msg_print("
                break;
        case 2:
                /* Minor displace */
-               teleport_player(10);
+               teleport_player(10, 0L);
                break;
        case 3:
                /* Major displace */
-               teleport_player(plev * 5);
+               teleport_player(plev * 5, 0L);
                break;
        case 4:
                /* Domination */
@@ -1056,7 +1056,7 @@ static bool cast_force_spell(int spell)
                (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1);
                break;
        case 2:
-               set_tim_ffall(randint1(30) + 30 + boost / 5, FALSE);
+               set_tim_levitation(randint1(30) + 30 + boost / 5, FALSE);
                break;
        case 3:
                project_length = plev / 8 + 3;
@@ -1166,49 +1166,14 @@ static bool cast_force_spell(int spell)
                break;
        case 9:
        {
-               monster_type *m_ptr;
-               char m_name[80];
+               int m_idx;
 
                if (!target_set(TARGET_KILL)) return FALSE;
-               if (!cave[target_row][target_col].m_idx) break;
-               if (!los(py, px, target_row, target_col)) break;
+               m_idx = cave[target_row][target_col].m_idx;
+               if (!m_idx) break;
+               if (!player_has_los_bold(target_row, target_col)) break;
                if (!projectable(py, px, target_row, target_col)) break;
-               m_ptr = &m_list[cave[target_row][target_col].m_idx];
-               monster_desc(m_name, m_ptr, 0);
-               if (m_ptr->invulner)
-               {
-                       m_ptr->invulner = 0;
-                       if (m_ptr->ml)
-                       {
-#ifdef JP
-                               msg_format("%s¤Ï¤â¤¦ÌµÅ¨¤Ç¤Ï¤Ê¤¤¡£", m_name);
-#else
-                               msg_format("%^s is no longer invulnerable.", m_name);
-#endif
-                               p_ptr->redraw |= (PR_HEALTH);
-                               if (p_ptr->riding == cave[target_row][target_col].m_idx) p_ptr->redraw |= (PR_UHEALTH);
-                       }
-                       m_ptr->energy_need += ENERGY_NEED();
-               }
-               if (m_ptr->fast)
-               {
-                       m_ptr->fast = 0;
-#ifdef JP
-                       if (m_ptr->ml) msg_format("%s¤Ï¤â¤¦²Ã®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
-#else
-                       if (m_ptr->ml) msg_format("%^s is no longer fast.", m_name);
-#endif
-               }
-               if (m_ptr->slow)
-               {
-                       m_ptr->slow = 0;
-#ifdef JP
-                       if (m_ptr->ml) msg_format("%s¤Ï¤â¤¦¸ºÂ®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
-#else
-                       if (m_ptr->ml) msg_format("%^s is no longer slow.", m_name);
-#endif
-               }
-
+               dispel_monster_status(m_idx);
                break;
        }
        case 10:
@@ -1325,7 +1290,7 @@ msg_format("There are too many mirrors to control!");
          break;
        /* warped mirror */
        case 3:
-         teleport_player(10);
+         teleport_player(10, 0L);
          break;
        /* mirror of light */
        case 4:
@@ -1333,7 +1298,7 @@ msg_format("There are too many mirrors to control!");
          break;
        /* mirror of wandering */
        case 5:
-         teleport_player(plev * 5);
+         teleport_player(plev * 5, 0L);
          break;
        /* robe of dust */
        case 6:
@@ -1384,7 +1349,7 @@ msg_format("There are too many mirrors to control!");
        /* illusion light */
        case 14:
          tmp = is_mirror_grid(&cave[py][px]) ? 4 : 3;
-         slow_monsters();
+         slow_monsters(plev);
          stun_monsters(plev*tmp);
          confuse_monsters(plev*tmp);
          turn_monsters(plev*tmp);
@@ -1498,40 +1463,10 @@ static bool cast_berserk_spell(int spell)
 
                if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
                {
-                       int oy, ox;
-
                        msg_print(NULL);
 
-                       /* Save the old location */
-                       oy = py;
-                       ox = px;
-
                        /* Move the player */
-                       py = y;
-                       px = x;
-
-                       forget_flow();
-
-                       /* Redraw the old spot */
-                       lite_spot(oy, ox);
-
-                       /* Redraw the new spot */
-                       lite_spot(py, px);
-
-                       /* Check for new panel (redraw map) */
-                       verify_panel();
-
-                       /* Update stuff */
-                       p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE);
-
-                       /* Update the monsters */
-                       p_ptr->update |= (PU_DISTANCE);
-
-                       /* Window stuff */
-                       p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
-
-                       /* Handle stuff XXX XXX XXX */
-                       handle_stuff();
+                       (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
                }
                break;
        }
@@ -1547,25 +1482,8 @@ static bool cast_berserk_spell(int spell)
                earthquake(py, px, 8+randint0(5));
                break;
        case 4:
-       {
-               cave_type       *c_ptr;
-               monster_type    *m_ptr;
-
-               for (dir = 0; dir < 8; dir++)
-               {
-                       y = py + ddy_ddd[dir];
-                       x = px + ddx_ddd[dir];
-                       c_ptr = &cave[y][x];
-
-                       /* Get the monster */
-                       m_ptr = &m_list[c_ptr->m_idx];
-
-                       /* Hack -- attack monsters */
-                       if (c_ptr->m_idx && (m_ptr->ml || have_flag(f_flags_bold(y, x), FF_PROJECT)))
-                               py_attack(y, x, 0);
-               }
+               massacre(py, px);
                break;
-       }
        default:
 #ifdef JP
 msg_print("¤Ê¤Ë¡©");
@@ -1614,9 +1532,7 @@ static bool cast_ninja_spell(int spell)
                break;
        case 2:
        {
-               teleport_player(10);
-               if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
-               else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
+               teleport_player(10, 0L);
                break;
        }
        case 3:
@@ -1636,9 +1552,7 @@ static bool cast_ninja_spell(int spell)
        }
        case 4:
        {
-               teleport_player(p_ptr->lev*5);
-               if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
-               else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
+               teleport_player(p_ptr->lev * 5, 0L);
                break;
        }
        case 5:
@@ -1657,9 +1571,7 @@ msg_print("
 #endif
                        else
                        {
-                               teleport_player(30);
-                               if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
-                               else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
+                               teleport_player(30, 0L);
                        }
                }
                else
@@ -1683,13 +1595,11 @@ msg_print("
        case 7:
                return ident_spell(FALSE);
        case 8:
-               set_tim_ffall(randint1(20) + 20, FALSE);
+               set_tim_levitation(randint1(20) + 20, FALSE);
                break;
        case 9:
                fire_ball(GF_FIRE, 0, 50+plev, plev/10+2);
-               teleport_player(30);
-               if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
-               else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
+               teleport_player(30, 0L);
                set_oppose_fire(plev, FALSE);
                break;
        case 10:
@@ -1737,6 +1647,7 @@ msg_print("
                if (!target_set(TARGET_KILL)) return FALSE;
                m_idx = cave[target_row][target_col].m_idx;
                if (!m_idx) break;
+               if (m_idx == p_ptr->riding) break;
                if (!player_has_los_bold(target_row, target_col)) break;
                if (!projectable(py, px, target_row, target_col)) break;
                m_ptr = &m_list[m_idx];
@@ -1774,7 +1685,7 @@ msg_print("
                m_ptr->fx = tx;
 
                /* Wake the monster up */
-               m_ptr->csleep = 0;
+               (void)set_monster_csleep(m_idx, 0);
 
                /* Update the monster (new location) */
                update_mon(m_idx, TRUE);
@@ -1788,6 +1699,15 @@ msg_print("
                if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
                        p_ptr->update |= (PU_MON_LITE);
 
+               if (m_ptr->ml)
+               {
+                       /* Auto-Recall if possible and visible */
+                       if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx);
+
+                       /* Track a new monster */
+                       health_track(m_idx);
+               }
+
                break;
        }
        case 13:
@@ -1816,9 +1736,7 @@ msg_print("
                fire_ball(GF_POIS, 0, 75+plev*2/3, plev/5+2);
                fire_ball(GF_OLD_DRAIN, 0, 75+plev*2/3, plev/5+2);
                fire_ball(GF_CONFUSION, 0, 75+plev*2/3, plev/5+2);
-               teleport_player(30);
-               if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
-               else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
+               teleport_player(30, 0L);
                break;
        case 18:
        {
@@ -2077,7 +1995,7 @@ msg_format("%s
                                        msg_print("Your mind unleashes its power in an uncontrollable storm!");
 #endif
 
-                                       project(1, 2 + plev / 10, py, px, plev * 2,
+                                       project(PROJECT_WHO_UNCTRL_POWER, 2 + plev / 10, py, px, plev * 2,
                                                GF_MANA, PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM, -1);
                                        p_ptr->csp = MAX(0, p_ptr->csp - plev * MAX(1, plev / 10));
                                }
@@ -2094,8 +2012,7 @@ msg_print("
 #else
                                        msg_print("Weird visions seem to dance before your eyes...");
 #endif
-                                       teleport_player(10);
-                                       
+                                       teleport_player(10, TELEPORT_PASSIVE);
                                }
                                else if (b < 96)
                                {
@@ -2116,7 +2033,7 @@ msg_format("%s
                                        msg_print("Your mind unleashes its power in an uncontrollable storm!");
 #endif
 
-                                       project(1, 2 + plev / 10, py, px, plev * 2,
+                                       project(PROJECT_WHO_UNCTRL_POWER, 2 + plev / 10, py, px, plev * 2,
                                                GF_MANA, PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM, -1);
                                        p_ptr->csp = MAX(0, p_ptr->csp - plev * MAX(1, plev / 10));
                                }