/** * Attempts to set the timer of the given monster effect to `timer`. * * Checks to see if the monster resists the effect, using mon_resist_effect(). * If not, the effect is set to `timer` turns. If `timer` is 0, or if the * effect timer was 0, or if MON_TMD_FLG_NOTIFY is set in `flag`, then a * message is printed, unless MON_TMD_FLG_NOMESSAGE is set in `flag`. * * Set a timed monster event to 'v'. Give messages if the right flags are set. * Check if the monster is able to resist the spell. Mark the lore. * Returns TRUE if the monster was affected. * Return FALSE if the monster was unaffected. */ static bool mon_set_timed(monster_type *m_ptr, int ef_idx, int timer, u16b flag, bool id) { mon_timed_effect *effect; int m_note = 0; int resisted; int old_timer; assert(ef_idx >= 0 && ef_idx < MON_TMD_MAX); effect = &effects[ef_idx]; assert(m_ptr); old_timer = m_ptr->m_timed[ef_idx]; /* Ignore dead monsters */ if (!m_ptr->r_idx) return FALSE; /* No change */ if (old_timer == timer) return FALSE; if (timer == 0) { /* Turning off, usually mention */ m_note = effect->message_end; flag |= MON_TMD_FLG_NOTIFY; } else if (old_timer == 0) { /* Turning on, usually mention */ flag |= MON_TMD_FLG_NOTIFY; m_note = effect->message_begin; } else if (timer > old_timer) { /* Different message for increases, but don't automatically mention. */ m_note = effect->message_increase; } /* Determine if the monster resisted or not */ resisted = mon_resist_effect(m_ptr, ef_idx, timer, flag); if (resisted) m_note = MON_MSG_UNAFFECTED; else m_ptr->m_timed[ef_idx] = timer; if (p_ptr->health_who == m_ptr->midx) p_ptr->redraw |= (PR_HEALTH); /* Update the visuals, as appropriate. */ p_ptr->redraw |= (PR_MONLIST); /* Print a message if there is one, if the effect allows for it, and if * either the monster is visible, or we're trying to ID something */ if (m_note && (m_ptr->ml || id) && !(flag & MON_TMD_FLG_NOMESSAGE) && (flag & MON_TMD_FLG_NOTIFY)) { char m_name[80]; monster_desc(m_name, sizeof(m_name), m_ptr, 0x04); add_monster_message(m_name, m_ptr->midx, m_note, TRUE); } return !resisted; }
/** * Attempts to set the timer of the given monster effect to `timer`. * * Checks to see if the monster resists the effect, using mon_resist_effect(). * If not, the effect is set to `timer` turns. If `timer` is 0, or if the * effect timer was 0, or if MON_TMD_FLG_NOTIFY is set in `flag`, then a * message is printed, unless MON_TMD_FLG_NOMESSAGE is set in `flag`. * * Set a timed monster event to 'v'. Give messages if the right flags are set. * Check if the monster is able to resist the spell. Mark the lore. * Returns true if the monster was affected. * Return false if the monster was unaffected. */ static bool mon_set_timed(struct monster *mon, int ef_idx, int timer, u16b flag, bool id) { bool check_resist = false; bool resisted = false; struct mon_timed_effect *effect; int m_note = 0; int old_timer; assert(ef_idx >= 0 && ef_idx < MON_TMD_MAX); effect = &effects[ef_idx]; assert(mon); assert(mon->race); old_timer = mon->m_timed[ef_idx]; /* No change */ if (old_timer == timer) return false; if (timer == 0) { /* Turning off, usually mention */ m_note = effect->message_end; flag |= MON_TMD_FLG_NOTIFY; } else if (old_timer == 0) { /* Turning on, usually mention */ flag |= MON_TMD_FLG_NOTIFY; m_note = effect->message_begin; check_resist = true; } else if (timer > old_timer) { /* Different message for increases, but don't automatically mention. */ m_note = effect->message_increase; check_resist = true; } /* Decreases don't get a message */ /* Determine if the monster resisted or not, if appropriate */ if (check_resist) resisted = mon_resist_effect(mon, ef_idx, timer, flag); if (resisted) m_note = MON_MSG_UNAFFECTED; else mon->m_timed[ef_idx] = timer; if (player->upkeep->health_who == mon) player->upkeep->redraw |= (PR_HEALTH); /* Update the visuals, as appropriate. */ player->upkeep->redraw |= (PR_MONLIST); /* Print a message if there is one, if the effect allows for it, and if * either the monster is visible, or we're trying to ID something */ if (m_note && !(flag & MON_TMD_FLG_NOMESSAGE) && (flag & MON_TMD_FLG_NOTIFY) && ((mflag_has(mon->mflag, MFLAG_VISIBLE) && !mflag_has(mon->mflag, MFLAG_UNAWARE)) || id)) { char m_name[80]; monster_desc(m_name, sizeof(m_name), mon, MDESC_IND_HID); add_monster_message(m_name, mon, m_note, true); } return !resisted; }