/*! * @brief モンスターが敵モンスターに魔力消去を使うかどうかを返す / * Check should monster cast dispel spell at other monster. * @param m_idx 術者のモンスターID * @param t_idx 目標のモンスターID * @return 魔力消去を使うべきならばTRUEを変えす。 */ static bool dispel_check_monster(int m_idx, int t_idx) { monster_type *t_ptr = &m_list[t_idx]; /* Invulnabilty */ if (MON_INVULNER(t_ptr)) return TRUE; /* Speed */ if (t_ptr->mspeed < 135) { if (MON_FAST(t_ptr)) return TRUE; } /* Riding monster */ if (t_idx == p_ptr->riding) { if (dispel_check(m_idx)) return TRUE; } /* No need to cast dispel spell */ return FALSE; }
/*! * @brief モンスター情報を書き込む / Write a "monster" record * @param m_ptr モンスター情報保存元ポインタ * @return なし */ static void wr_monster(monster_type *m_ptr) { u32b flags = 0x00000000; byte tmp8u; if (!is_original_ap(m_ptr)) flags |= SAVE_MON_AP_R_IDX; if (m_ptr->sub_align) flags |= SAVE_MON_SUB_ALIGN; if (MON_CSLEEP(m_ptr)) flags |= SAVE_MON_CSLEEP; if (MON_FAST(m_ptr)) flags |= SAVE_MON_FAST; if (MON_SLOW(m_ptr)) flags |= SAVE_MON_SLOW; if (MON_STUNNED(m_ptr)) flags |= SAVE_MON_STUNNED; if (MON_CONFUSED(m_ptr)) flags |= SAVE_MON_CONFUSED; if (MON_MONFEAR(m_ptr)) flags |= SAVE_MON_MONFEAR; if (m_ptr->target_y) flags |= SAVE_MON_TARGET_Y; if (m_ptr->target_x) flags |= SAVE_MON_TARGET_X; if (MON_INVULNER(m_ptr)) flags |= SAVE_MON_INVULNER; if (m_ptr->smart) flags |= SAVE_MON_SMART; if (m_ptr->exp) flags |= SAVE_MON_EXP; if (m_ptr->mflag2) flags |= SAVE_MON_MFLAG2; if (m_ptr->nickname) flags |= SAVE_MON_NICKNAME; if (m_ptr->parent_m_idx) flags |= SAVE_MON_PARENT; /*** Monster save flags ***/ wr_u32b(flags); /*** Write only un-obvious elements ***/ wr_s16b(m_ptr->r_idx); wr_byte(m_ptr->fy); wr_byte(m_ptr->fx); wr_s16b(m_ptr->hp); wr_s16b(m_ptr->maxhp); wr_s16b(m_ptr->max_maxhp); wr_u32b(m_ptr->dealt_damage); /* Monster race index of its appearance */ if (flags & SAVE_MON_AP_R_IDX) wr_s16b(m_ptr->ap_r_idx); if (flags & SAVE_MON_SUB_ALIGN) wr_byte(m_ptr->sub_align); if (flags & SAVE_MON_CSLEEP) wr_s16b(m_ptr->mtimed[MTIMED_CSLEEP]); wr_byte(m_ptr->mspeed); wr_s16b(m_ptr->energy_need); if (flags & SAVE_MON_FAST) { tmp8u = (byte)m_ptr->mtimed[MTIMED_FAST]; wr_byte(tmp8u); } if (flags & SAVE_MON_SLOW) { tmp8u = (byte)m_ptr->mtimed[MTIMED_SLOW]; wr_byte(tmp8u); } if (flags & SAVE_MON_STUNNED) { tmp8u = (byte)m_ptr->mtimed[MTIMED_STUNNED]; wr_byte(tmp8u); } if (flags & SAVE_MON_CONFUSED) { tmp8u = (byte)m_ptr->mtimed[MTIMED_CONFUSED]; wr_byte(tmp8u); } if (flags & SAVE_MON_MONFEAR) { tmp8u = (byte)m_ptr->mtimed[MTIMED_MONFEAR]; wr_byte(tmp8u); } if (flags & SAVE_MON_TARGET_Y) wr_s16b(m_ptr->target_y); if (flags & SAVE_MON_TARGET_X) wr_s16b(m_ptr->target_x); if (flags & SAVE_MON_INVULNER) { tmp8u = (byte)m_ptr->mtimed[MTIMED_INVULNER]; wr_byte(tmp8u); } if (flags & SAVE_MON_SMART) wr_u32b(m_ptr->smart); if (flags & SAVE_MON_EXP) wr_u32b(m_ptr->exp); if (flags & SAVE_MON_MFLAG2) wr_byte(m_ptr->mflag2); if (flags & SAVE_MON_NICKNAME) wr_string(quark_str(m_ptr->nickname)); if (flags & SAVE_MON_PARENT) wr_s16b(m_ptr->parent_m_idx); }