bool fear_p_hurt_m(int m_idx, int dam) { monster_type *m_ptr = &m_list[m_idx]; monster_race *r_ptr = &r_info[m_ptr->ap_r_idx]; bool result = FALSE; /* Apply Aura of Fear to the Player for non-melee damage */ if (!melee_hack && (r_ptr->flags2 & RF2_AURA_FEAR)) { int r_level = _r_level(r_ptr); if (!fear_save_p(r_level)) { mon_lore_2(m_ptr, RF2_AURA_FEAR); fear_add_p(r_level/MAX(1, m_ptr->cdis - 2)); } } if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & (RF3_NO_FEAR))) { int percentage = (100 * m_ptr->hp) / m_ptr->maxhp; int n = 10; n = n * adj_fear_m[p_ptr->stat_ind[A_CHR]] / 100; if ((n >= percentage) || (dam >= m_ptr->hp && randint0(100) < 80)) { if (!fear_save_m(m_ptr)) { result = TRUE; set_monster_monfear(m_idx, randint1(10) + 20); } } } return result; }
/* Monster Fear */ bool fear_process_m(int m_idx) { monster_type *m_ptr = &m_list[m_idx]; if (MON_MONFEAR(m_ptr) && !MON_CSLEEP(m_ptr)) { if (fear_save_m(m_ptr)) { bool recovered = FALSE; if (fear_save_m(m_ptr)) { set_monster_monfear(m_idx, 0); recovered = TRUE; } else { monster_race *r_ptr = &r_info[m_ptr->ap_r_idx]; recovered = set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(r_ptr->level / 20 + 1)); } if (recovered && is_seen(m_ptr)) { char m_name[80]; char m_poss[80]; monster_desc(m_poss, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE); monster_desc(m_name, m_ptr, 0); msg_format("%^s recovers %s courage.", m_name, m_poss); } } else if (one_in_(3) && !fear_save_m(m_ptr)) { if (is_seen(m_ptr)) { char m_name[80]; monster_desc(m_name, m_ptr, 0); msg_format("%^s is scared stiff!", m_name); } return FALSE; } } return TRUE; }
/*! * @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); }