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
(tv == TV_DEATH_BOOK) ||
(tv == TV_TRUMP_BOOK) ||
(tv == TV_ARCANE_BOOK) ||
- (tv == TV_ENCHANT_BOOK) ||
+ (tv == TV_CRAFT_BOOK) ||
(tv == TV_DAEMON_BOOK) ||
(tv == TV_CRUSADE_BOOK) ||
(tv == TV_MUSIC_BOOK) ||
if (m_ptr->cdis < MAX_SIGHT * 2)
{
/* Wake up */
- if (m_ptr->csleep)
+ if (MON_CSLEEP(m_ptr))
{
- /* Wake up */
- m_ptr->csleep = 0;
- if (r_info[m_ptr->r_idx].flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- if (m_ptr->ml)
- {
- /* Redraw (later) if needed */
- if (p_ptr->health_who == i) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == i) p_ptr->redraw |= (PR_UHEALTH);
- }
+ (void)set_monster_csleep(i, 0);
sleep = TRUE;
}
if (!is_pet(m_ptr)) m_ptr->mflag2 |= MFLAG2_NOPET;
{
if (!is_pet(m_ptr))
{
- m_ptr->fast = MIN(200, m_ptr->fast + 100);
+ (void)set_monster_fast(i, MON_FAST(m_ptr) + 100);
speed = TRUE;
}
}
else if (m_idx == p_ptr->riding) resist = TRUE;
+ else if (p_ptr->inside_quest || 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;
msg_format("%^s is unaffected.", m_name);
#endif
}
- if (m_ptr->csleep)
+ if (MON_CSLEEP(m_ptr))
{
- m_ptr->csleep = 0;
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
- if (m_ptr->ml)
- {
- /* Redraw (later) if needed */
- if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
- }
+ (void)set_monster_csleep(m_idx, 0);
if (see_m)
{
#ifdef JP
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);
}
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);
}
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);
}
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);
monster_desc(m_name, m_ptr, MD_IGNORE_HALLU | MD_INDEF_HIDDEN);
speed = m_ptr->mspeed - 110;
- if(m_ptr->fast) speed += 10;
- if(m_ptr->slow) speed -= 10;
+ if (MON_FAST(m_ptr)) speed += 10;
+ if (MON_SLOW(m_ptr)) speed -= 10;
/* Get the monster's alignment */
#ifdef JP
}
#ifdef JP
- if (m_ptr->csleep) strcat(buf,"¿ç̲ ");
- if (m_ptr->stunned) strcat(buf,"ۯ۰ ");
- if (m_ptr->monfear) strcat(buf,"¶²ÉÝ ");
- if (m_ptr->confused) strcat(buf,"º®Íð ");
- if (m_ptr->invulner) strcat(buf,"̵Ũ ");
+ if (MON_CSLEEP(m_ptr)) strcat(buf,"¿ç̲ ");
+ if (MON_STUNNED(m_ptr)) strcat(buf,"ۯ۰ ");
+ if (MON_MONFEAR(m_ptr)) strcat(buf,"¶²ÉÝ ");
+ if (MON_CONFUSED(m_ptr)) strcat(buf,"º®Íð ");
+ if (MON_INVULNER(m_ptr)) strcat(buf,"̵Ũ ");
#else
- if (m_ptr->csleep) strcat(buf,"sleeping ");
- if (m_ptr->stunned) strcat(buf,"stunned ");
- if (m_ptr->monfear) strcat(buf,"scared ");
- if (m_ptr->confused) strcat(buf,"confused ");
- if (m_ptr->invulner) strcat(buf,"invulnerable ");
+ if (MON_CSLEEP(m_ptr)) strcat(buf,"sleeping ");
+ if (MON_STUNNED(m_ptr)) strcat(buf,"stunned ");
+ if (MON_MONFEAR(m_ptr)) strcat(buf,"scared ");
+ if (MON_CONFUSED(m_ptr)) strcat(buf,"confused ");
+ if (MON_INVULNER(m_ptr)) strcat(buf,"invulnerable ");
#endif
buf[strlen(buf)-1] = '\0';
prt(buf,0,0);
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
{
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
{
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
{
* 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;
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;
}
}
{
/* Message and damage */
#ifdef JP
-msg_print("¤¢¤Ê¤¿¤Ï¤Ò¤É¤¤²ø²æ¤òÉé¤Ã¤¿¡ª");
+ msg_print("¤¢¤Ê¤¿¤Ï¤Ò¤É¤¤²ø²æ¤òÉé¤Ã¤¿¡ª");
#else
msg_print("You are severely crushed!");
#endif
-
damage = 200;
}
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;
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;
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 */
/* 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));
/* Monster is certainly awake */
- m_ptr->csleep = 0;
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
/* Apply damage directly */
m_ptr->hp -= damage;
{
/* 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)
{
int m_idx = cave[yy][xx].m_idx;
- /* Update the new location */
- cave[sy][sx].m_idx = m_idx;
-
/* Update the old location */
cave[yy][xx].m_idx = 0;
+ /* Update the new location */
+ cave[sy][sx].m_idx = m_idx;
+
/* Move the monster */
m_ptr->fy = sy;
m_ptr->fx = sx;
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 */
return (TRUE);
}
+bool earthquake(int cy, int cx, int r)
+{
+ return earthquake_aux(cy, cx, r, 0);
+}
+
void discharge_minion(void)
{
if (r_ptr->flags2 & (RF2_SMART)) chance = 100;
/* Sometimes monsters wake up */
- if (m_ptr->csleep && (randint0(100) < chance))
+ if (MON_CSLEEP(m_ptr) && (randint0(100) < chance))
{
/* Wake up! */
- m_ptr->csleep = 0;
-
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
/* Notice the "waking up" */
if (is_seen(m_ptr))
/* Dump a message */
#ifdef JP
-msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name);
+ msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name);
#else
msg_format("%^s wakes up.", m_name);
#endif
}
-
- if (m_ptr->ml)
- {
- /* Redraw the health bar */
- if (p_ptr->health_who == c_ptr->m_idx) p_ptr->redraw |= (PR_HEALTH);
- if (p_ptr->riding == c_ptr->m_idx) p_ptr->redraw |= (PR_UHEALTH);
- }
}
}
/* Darken the grid */
if (do_dark)
{
- for (j = 0; j < 9; j++)
+ if (dun_level || !is_daytime())
{
- int by = y + ddy_ddd[j];
- int bx = x + ddx_ddd[j];
-
- if (in_bounds2(by, bx))
+ for (j = 0; j < 9; j++)
{
- cave_type *cc_ptr = &cave[by][bx];
+ int by = y + ddy_ddd[j];
+ int bx = x + ddx_ddd[j];
- if (have_flag(f_info[get_feat_mimic(cc_ptr)].flags, FF_GLOW))
+ if (in_bounds2(by, bx))
{
- do_dark = FALSE;
- break;
+ cave_type *cc_ptr = &cave[by][bx];
+
+ if (have_flag(f_info[get_feat_mimic(cc_ptr)].flags, FF_GLOW))
+ {
+ do_dark = FALSE;
+ break;
+ }
}
}
- }
- if (!do_dark) continue;
+ if (!do_dark) continue;
+ }
c_ptr->info &= ~(CAVE_GLOW);
}
/* Use an actual "target" */
- else if (dir == 5)
+ else /* if (dir == 5) */
{
tx = target_col;
ty = target_row;
m_ptr = &m_list[c_ptr->m_idx];
r_ptr = &r_info[m_ptr->r_idx];
- /* Redraw the health bar */
- if (p_ptr->health_who == c_ptr->m_idx) p_ptr->redraw |= (PR_HEALTH);
+ (void)set_monster_csleep(c_ptr->m_idx, 0);
if (r_ptr->flagsr & RFR_RES_TELE)
{
if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
- m_ptr->csleep = 0;
- if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
-
/* Failure */
return FALSE;
}
sound(SOUND_TELEPORT);
/* Swap the player and monster */
- (void)move_player_effect(ty, tx, MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
+ (void)move_player_effect(ty, tx, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
/* Success */
return TRUE;
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;
}
}
-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))
{
#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);
p_ptr->special_defense &= ~(NINJA_KAWARIMI);
p_ptr->redraw |= (PR_STATUS);
+
+ /* Teleported */
+ return TRUE;
}
u16b path_g[32];
int path_n, i;
bool tmp_mdeath = FALSE;
+ bool moved = FALSE;
if (mdeath) *mdeath = FALSE;
}
/* 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);
#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;