// Returns true if a creature can see another creature bool check_sight_vict(struct creature * self, struct creature * vict) { // Immortals players can always see non-immortal players if (IS_IMMORT(self) && !IS_IMMORT(vict)) return true; // Nothing at all gets through immort invis if (IS_PC(self) && IS_IMMORT(vict) && GET_LEVEL(self) < GET_INVIS_LVL(vict)) return false; // Mortals can't see unapproved mobs if (!NPC2_FLAGGED(self, NPC2_UNAPPROVED) && NPC2_FLAGGED(vict, NPC2_UNAPPROVED) && !IS_IMMORT(self) && !is_authorized(self, TESTER, NULL)) return false; // Non-tester mortal players can't see testers if (!IS_IMMORT(self) && !IS_NPC(self) && !IS_IMMORT(vict) && !is_authorized(self, TESTER, NULL) && is_authorized(vict, TESTER, NULL)) return false; // Holy is the light that shines on the chosen if (PRF_FLAGGED(self, PRF_HOLYLIGHT)) return true; // Sonic imagery and retina detects transparent creatures if (AFF2_FLAGGED(vict, AFF2_TRANSPARENT) && !(AFF3_FLAGGED(self, AFF3_SONIC_IMAGERY) || AFF_FLAGGED(self, AFF_RETINA) || affected_by_spell(self, ZEN_AWARENESS))) return false; // True seeing and detect invisibility counteract all magical invis if (AFF2_FLAGGED(self, AFF2_TRUE_SEEING) || AFF_FLAGGED(self, AFF_DETECT_INVIS)) return true; // Invis/Transparent if (AFF_FLAGGED(vict, AFF_INVISIBLE)) return false; // Invis to Undead if (IS_UNDEAD(self) && AFF2_FLAGGED(vict, AFF2_INVIS_TO_UNDEAD)) return false; return true; }
void hunt_room(struct char_data * ch) { int dir = -1; if (!ch) { return; } /* make sure the room is valid */ if (HUNTINGRM(ch) < 0 || AFF_FLAGGED(ch, AFF_MAJOR_PARALIZED) || AFF2_FLAGGED(ch, AFF2_MINOR_PARALIZED)) { return; } /* dez 19980805 if (IS_NPC(ch) && MOB_FLAGGED(ch, MOB_SENTINEL)) { dir = find_first_step(ch->in_room, HUNTINGRM(ch), 2); } else if (IS_NPC(ch) && MOB_FLAGGED(ch, MOB_STAY_ZONE)) { */ if (IS_NPC(ch) && MOB_FLAGGED(ch, MOB_STAY_ZONE)) { dir = find_first_step(ch->in_room, HUNTINGRM(ch), 1); } else { dir = find_first_step(ch->in_room, HUNTINGRM(ch), 0); } if (dir < 0) { HUNTINGRM(ch) = -1; return; } else { perform_move(ch, dir, 1); if (ch->in_room == HUNTINGRM(ch)) { HUNTINGRM(ch) = -1; } return; } }
void loss_breath(struct char_data * ch, int breath) { if (AFF2_FLAGGED(ch, AFF2_IRON_BODY)) return; if (ROOM_AFFECTED(ch->in_room, RAFF_LIQUID_AIR)) { GET_OXI(ch) -= number(2, 10); } if(GET_LEVEL(ch) < LVL_IMMORT && breath > 0) { if(GET_OXI(ch) >= 1) { GET_OXI(ch) -= breath; send_to_char("Your breath becomes deeper and slower...\r\n", ch); } else { if(GET_HIT(ch) > 0) { GET_HIT(ch) -= (GET_MAX_HIT(ch)*0.15); send_to_char("&RYou need some oxygen, your life is almost extinguished!&n\r\n", ch); } else { GET_HIT(ch) = 0; send_to_char("&RYour breath becomes so slow that you die because of it.&n\r\n", ch); raw_kill(ch, NULL); } } } }
// Returns true if a creature can see an object bool check_sight_object(struct creature * self, struct obj_data * obj) { if (PRF_FLAGGED(self, PRF_HOLYLIGHT)) return true; if (!OBJ_APPROVED(obj) && !NPC2_FLAGGED(self, NPC2_UNAPPROVED) && !IS_IMMORT(self) && !is_authorized(self, TESTER, NULL)) return false; if (IS_OBJ_STAT(obj, ITEM_TRANSPARENT) && !(AFF3_FLAGGED(self, AFF3_SONIC_IMAGERY) || AFF_FLAGGED(self, AFF_RETINA) || affected_by_spell(self, ZEN_AWARENESS))) return false; if (AFF_FLAGGED(self, AFF_DETECT_INVIS) || AFF2_FLAGGED(self, AFF2_TRUE_SEEING)) return true; if (IS_OBJ_STAT(obj, ITEM_INVISIBLE)) return false; return true; }
void mage_activity(struct creature *ch) { if (room_is_dark(ch->in_room) && can_cast_spell(ch, SPELL_INFRAVISION) && !has_dark_sight(ch)) { cast_spell(ch, ch, NULL, NULL, SPELL_INFRAVISION); } else if (room_is_dark(ch->in_room) && can_cast_spell(ch, SPELL_GLOWLIGHT) && !has_dark_sight(ch)) { cast_spell(ch, ch, NULL, NULL, SPELL_GLOWLIGHT); } else if (can_cast_spell(ch, SPELL_PRISMATIC_SPHERE) && !AFF3_FLAGGED(ch, AFF3_PRISMATIC_SPHERE)) { cast_spell(ch, ch, NULL, NULL, SPELL_PRISMATIC_SPHERE); } else if (can_cast_spell(ch, SPELL_ANTI_MAGIC_SHELL) && !affected_by_spell(ch, SPELL_ANTI_MAGIC_SHELL)) { cast_spell(ch, ch, NULL, NULL, SPELL_ANTI_MAGIC_SHELL); } else if (can_cast_spell(ch, SPELL_HASTE) && !AFF2_FLAGGED(ch, AFF2_HASTE)) { cast_spell(ch, ch, NULL, NULL, SPELL_HASTE); } else if (can_cast_spell(ch, SPELL_DISPLACEMENT) && !AFF2_FLAGGED(ch, AFF2_DISPLACEMENT)) { cast_spell(ch, ch, NULL, NULL, SPELL_DISPLACEMENT); } else if (can_cast_spell(ch, SPELL_TRUE_SEEING) && !AFF2_FLAGGED(ch, AFF2_TRUE_SEEING)) { cast_spell(ch, ch, NULL, NULL, SPELL_TRUE_SEEING); } else if (can_cast_spell(ch, SPELL_REGENERATE) && !AFF_FLAGGED(ch, AFF_REGEN)) { cast_spell(ch, ch, NULL, NULL, SPELL_REGENERATE); } else if (can_cast_spell(ch, SPELL_FIRE_SHIELD) && !AFF2_FLAGGED(ch, AFF2_FIRE_SHIELD)) { cast_spell(ch, ch, NULL, NULL, SPELL_FIRE_SHIELD); } else if (can_cast_spell(ch, SPELL_STRENGTH) && !affected_by_spell(ch, SPELL_STRENGTH)) { cast_spell(ch, ch, NULL, NULL, SPELL_STRENGTH); } else if (can_cast_spell(ch, SPELL_BLUR) && !AFF_FLAGGED(ch, AFF_BLUR)) { cast_spell(ch, ch, NULL, NULL, SPELL_BLUR); } else if (can_cast_spell(ch, SPELL_ARMOR) && !affected_by_spell(ch, SPELL_ARMOR)) { cast_spell(ch, ch, NULL, NULL, SPELL_ARMOR); } }
void psionic_activity(struct creature *ch) { if (room_is_dark(ch->in_room) && !has_dark_sight(ch) && can_cast_spell(ch, SPELL_RETINA)) cast_spell(ch, ch, NULL, NULL, SPELL_RETINA); else if (GET_HIT(ch) < GET_MAX_HIT(ch) * 0.80) { if (can_cast_spell(ch, SPELL_CELL_REGEN)) cast_spell(ch, ch, NULL, NULL, SPELL_CELL_REGEN); else if (can_cast_spell(ch, SPELL_WOUND_CLOSURE)) cast_spell(ch, ch, NULL, NULL, SPELL_WOUND_CLOSURE); } else if (!AFF_FLAGGED(ch, AFF_NOPAIN) && !AFF_FLAGGED(ch, AFF_SANCTUARY) && can_cast_spell(ch, SPELL_NOPAIN)) cast_spell(ch, ch, NULL, NULL, SPELL_NOPAIN); else if (!room_has_air(ch->in_room) && !can_travel_sector(ch, ch->in_room->sector_type, 0) && can_cast_spell(ch, SPELL_BREATHING_STASIS) && !AFF3_FLAGGED(ch, AFF3_NOBREATHE)) cast_spell(ch, ch, NULL, NULL, SPELL_BREATHING_STASIS); else if (!AFF2_FLAGGED(ch, AFF2_TELEKINESIS) && can_cast_spell(ch, SPELL_TELEKINESIS)) cast_spell(ch, ch, NULL, NULL, SPELL_TELEKINESIS); else if (!affected_by_spell(ch, SPELL_DERMAL_HARDENING) && can_cast_spell(ch, SPELL_DERMAL_HARDENING)) cast_spell(ch, ch, NULL, NULL, SPELL_DERMAL_HARDENING); else if (!AFF3_FLAGGED(ch, AFF3_PSISHIELD) && can_cast_spell(ch, SPELL_PSISHIELD)) cast_spell(ch, ch, NULL, NULL, SPELL_PSISHIELD); else if (can_cast_spell(ch, SPELL_PSYCHIC_RESISTANCE) && !affected_by_spell(ch, SPELL_PSYCHIC_RESISTANCE)) cast_spell(ch, ch, NULL, NULL, SPELL_PSYCHIC_RESISTANCE); else if (can_cast_spell(ch, SPELL_POWER) && !affected_by_spell(ch, SPELL_POWER)) cast_spell(ch, ch, NULL, NULL, SPELL_POWER); else if (!AFF_FLAGGED(ch, AFF_CONFIDENCE) && can_cast_spell(ch, SPELL_CONFIDENCE)) cast_spell(ch, ch, NULL, NULL, SPELL_CONFIDENCE); }
void update_breath(void) { struct char_data *i, *next_char; for (i = character_list; i; i = next_char) { next_char = i->next; if (!i) return; if (!IS_NPC(i)) { if (!has_boat) make_breath(i); else { if (GET_POS(i) >= POS_STUNNED) { if (!AFF2_FLAGGED(i, AFF2_ASPHYXIATE)) GET_OXI(i) = MIN(GET_OXI(i) + breath_gain(i), GET_MAX_OXI(i)); } } } } }
void hunt_victim(struct char_data * ch) { extern struct char_data *character_list; ACMD(do_open); int dir; byte found; struct char_data *tmp; struct char_data *hunted_ch; char abuf[80]; char doorname[80]; if (!ch || !HUNTING(ch) || AFF2_FLAGGED(ch, AFF2_MINOR_PARALIZED) || AFF_FLAGGED(ch, AFF_MAJOR_PARALIZED)) { return; } hunted_ch = find_hunted_char(HUNTING(ch)); /* make sure the char still exists */ for (found = 0, tmp = character_list; tmp && !found && hunted_ch; tmp = tmp->next) { if (HUNTING(ch) == GET_IDNUM(tmp)) { found = 1; } } if (!found) { act("$n says, 'Damn! My prey is gone!!'", TRUE, ch, 0, 0, TO_ROOM); /* don't forget vict until they die or I am dead HUNTING(ch) = 0; */ return; } /* dez 19980805 if (IS_NPC(ch) && MOB_FLAGGED(ch, MOB_SENTINEL)) { dir = find_first_step(ch->in_room, hunted_ch->in_room, 2); } else if (IS_NPC(ch) && MOB_FLAGGED(ch, MOB_STAY_ZONE)) { */ if (IS_NPC(ch) && MOB_FLAGGED(ch, MOB_STAY_ZONE)) { dir = find_first_step(ch->in_room, hunted_ch->in_room, 1); } else { dir = find_first_step(ch->in_room, hunted_ch->in_room, 0); } if (dir < 0) { sprintf(buf, "$n says 'Damn! Lost %s!'", HMHR(hunted_ch)); act(buf, TRUE, ch, 0, 0, TO_ROOM); /* don't forget vict until they die or I am dead HUNTING(ch) = 0; */ return; } else { if (IS_CLOSED(ch->in_room, dir)) { one_argument(EXIT(ch, dir)->keyword, doorname); sprintf(abuf, "%s %s", doorname, dirs[dir]); do_open(ch, abuf, 0, 0); } perform_move(ch, dir, 1); if (ch->in_room == hunted_ch->in_room && !ROOM_FLAGGED(hunted_ch->in_room, ROOM_PEACEFUL)) { if (CAN_SEE(ch, hunted_ch)) { hit(ch, hunted_ch, TYPE_UNDEFINED); } } return; } }
bool psionic_mob_fight(struct creature *ch, struct creature *precious_vict) { struct creature *vict = NULL; if (!is_fighting(ch)) return false; // pick an enemy if (!(vict = choose_opponent(ch, precious_vict))) return false; int aggression = calculate_mob_aggression(ch, vict); // Psions can't really do anything when there's a psishield in place if (AFF3_FLAGGED(vict, AFF3_PSISHIELD) && can_cast_spell(ch, SPELL_PSIONIC_SHATTER)) { cast_spell(ch, vict, NULL, NULL, SPELL_PSIONIC_SHATTER); return true; } // Prioritize healing with aggression if (GET_HIT(ch) < (GET_MAX_HIT(ch) * MIN(20, MAX(80, aggression)) / 100) && can_cast_spell(ch, SPELL_WOUND_CLOSURE)) { cast_spell(ch, ch, NULL, NULL, SPELL_WOUND_CLOSURE); return true; } if (aggression > 75) { // extremely aggressive - just attack hard if (can_cast_spell(ch, SKILL_PSIBLAST)) { perform_offensive_skill(ch, vict, SKILL_PSIBLAST); return true; } else if (GET_POSITION(vict) > POS_SITTING && can_cast_spell(ch, SPELL_EGO_WHIP)) { cast_spell(ch, vict, NULL, NULL, SPELL_EGO_WHIP); return true; } } if (aggression > 50) { // somewhat aggressive - balance attacking with crippling if (GET_MANA(ch) < GET_MAX_MANA(ch) / 2 && can_cast_spell(ch, SKILL_PSIDRAIN) && can_psidrain(ch, vict, NULL, false)) { perform_psidrain(ch, vict); return true; } else if (!affected_by_spell(vict, SPELL_PSYCHIC_CRUSH) && can_cast_spell(ch, SPELL_PSYCHIC_CRUSH)) { cast_spell(ch, vict, NULL, NULL, SPELL_PSYCHIC_CRUSH); return true; } else if (!affected_by_spell(vict, SPELL_MOTOR_SPASM) && can_cast_spell(ch, SPELL_MOTOR_SPASM)) { cast_spell(ch, vict, NULL, NULL, SPELL_MOTOR_SPASM); return true; } else if (!affected_by_spell(ch, SPELL_ADRENALINE) && can_cast_spell(ch, SPELL_ADRENALINE)) { cast_spell(ch, ch, NULL, NULL, SPELL_ADRENALINE); return true; } else if (GET_POSITION(vict) > POS_SITTING && can_cast_spell(ch, SPELL_EGO_WHIP)) { cast_spell(ch, vict, NULL, NULL, SPELL_EGO_WHIP); return true; } else if (can_cast_spell(ch, SKILL_PSIBLAST)) { perform_offensive_skill(ch, vict, SKILL_PSIBLAST); return true; } } if (aggression > 25) { // not very aggressive - play more defensively if (IS_PSIONIC(vict) && !affected_by_spell(ch, SPELL_PSYCHIC_RESISTANCE) && can_cast_spell(ch, SPELL_PSYCHIC_RESISTANCE)) { cast_spell(ch, ch, NULL, NULL, SPELL_PSYCHIC_RESISTANCE); return true; } else if (!IS_CONFUSED(vict) && can_cast_spell(ch, SPELL_CONFUSION) && (IS_MAGE(vict) || IS_PSIONIC(vict) || IS_CLERIC(vict) || IS_KNIGHT(vict) || IS_PHYSIC(vict))) { cast_spell(ch, vict, NULL, NULL, SPELL_CONFUSION); return true; } else if (GET_MOVE(ch) < GET_MAX_MOVE(ch) / 4 && can_cast_spell(ch, SPELL_ENDURANCE)) { cast_spell(ch, ch, NULL, NULL, SPELL_ENDURANCE); return true; } else if (GET_MOVE(ch) < GET_MAX_MOVE(ch) / 4 && can_cast_spell(ch, SPELL_DERMAL_HARDENING)) { cast_spell(ch, ch, NULL, NULL, SPELL_DERMAL_HARDENING); return true; } else if (!AFF2_FLAGGED(ch, AFF2_VERTIGO) && can_cast_spell(ch, SPELL_VERTIGO)) { cast_spell(ch, vict, NULL, NULL, SPELL_VERTIGO); return true; } else if (!affected_by_spell(vict, SPELL_PSYCHIC_FEEDBACK) && can_cast_spell(ch, SPELL_PSYCHIC_FEEDBACK)) { cast_spell(ch, vict, NULL, NULL, SPELL_PSYCHIC_FEEDBACK); return true; } else if (!affected_by_spell(vict, SPELL_WEAKNESS) && can_cast_spell(ch, SPELL_WEAKNESS)) { cast_spell(ch, vict, NULL, NULL, SPELL_WEAKNESS); return true; } else if (!affected_by_spell(vict, SPELL_CLUMSINESS) && can_cast_spell(ch, SPELL_CLUMSINESS)) { cast_spell(ch, vict, NULL, NULL, SPELL_CLUMSINESS); return true; } else if (can_cast_spell(ch, SKILL_PSIBLAST)) { perform_offensive_skill(ch, vict, SKILL_PSIBLAST); return true; } } if (aggression > 5) { // attempt to neutralize or get away if (GET_POSITION(vict) > POS_SLEEPING && can_cast_spell(ch, SPELL_MELATONIC_FLOOD)) { cast_spell(ch, vict, NULL, NULL, SPELL_MELATONIC_FLOOD); return true; } else if (can_cast_spell(ch, SPELL_ASTRAL_SPELL)) { cast_spell(ch, vict, NULL, NULL, SPELL_ASTRAL_SPELL); return true; } else if (can_cast_spell(ch, SPELL_AMNESIA)) { cast_spell(ch, vict, NULL, NULL, SPELL_AMNESIA); return true; } else if (can_cast_spell(ch, SPELL_FEAR)) { cast_spell(ch, vict, NULL, NULL, SPELL_FEAR); return true; } } return false; }
void psionic_best_attack(struct creature *ch, struct creature *vict) { int aggression = calculate_mob_aggression(ch, vict); // Psions can't really do anything when there's a psishield in place if (AFF3_FLAGGED(vict, AFF3_PSISHIELD) && can_cast_spell(ch, SPELL_PSIONIC_SHATTER)) { cast_spell(ch, vict, NULL, NULL, SPELL_PSIONIC_SHATTER); return; } if (aggression > 75) { // extremely aggressive - just attack hard if (!affected_by_spell(vict, SPELL_PSYCHIC_SURGE) && can_cast_spell(ch, SPELL_PSYCHIC_SURGE)) { cast_spell(ch, vict, NULL, NULL, SPELL_PSYCHIC_SURGE); return; } else if (can_cast_spell(ch, SKILL_PSIBLAST)) { perform_offensive_skill(ch, vict, SKILL_PSIBLAST); return; } else if (GET_POSITION(vict) > POS_SITTING && can_cast_spell(ch, SPELL_EGO_WHIP)) { cast_spell(ch, vict, NULL, NULL, SPELL_EGO_WHIP); return; } } if (aggression > 50) { // somewhat aggressive - balance attacking with crippling if (!affected_by_spell(vict, SPELL_PSYCHIC_CRUSH) && can_cast_spell(ch, SPELL_PSYCHIC_CRUSH)) { cast_spell(ch, vict, NULL, NULL, SPELL_PSYCHIC_CRUSH); return; } else if (!affected_by_spell(vict, SPELL_MOTOR_SPASM) && can_cast_spell(ch, SPELL_MOTOR_SPASM)) { cast_spell(ch, vict, NULL, NULL, SPELL_MOTOR_SPASM); return; } else if (GET_POSITION(vict) > POS_SITTING && can_cast_spell(ch, SPELL_EGO_WHIP)) { cast_spell(ch, vict, NULL, NULL, SPELL_EGO_WHIP); return; } else if (can_cast_spell(ch, SKILL_PSIBLAST)) { perform_offensive_skill(ch, vict, SKILL_PSIBLAST); return; } } if (aggression > 25) { // not very aggressive - play more defensively if (!IS_CONFUSED(vict) && can_cast_spell(ch, SPELL_CONFUSION) && (IS_MAGE(vict) || IS_PSIONIC(vict) || IS_CLERIC(vict) || IS_KNIGHT(vict) || IS_PHYSIC(vict))) { cast_spell(ch, vict, NULL, NULL, SPELL_CONFUSION); return; } else if (!AFF2_FLAGGED(ch, AFF2_VERTIGO) && can_cast_spell(ch, SPELL_VERTIGO)) { cast_spell(ch, vict, NULL, NULL, SPELL_VERTIGO); return; } else if (!affected_by_spell(vict, SPELL_PSYCHIC_FEEDBACK) && can_cast_spell(ch, SPELL_PSYCHIC_FEEDBACK)) { cast_spell(ch, vict, NULL, NULL, SPELL_PSYCHIC_FEEDBACK); return; } else if (nullpsi_is_advisable(vict) && can_cast_spell(ch, SPELL_NULLPSI)) { cast_spell(ch, vict, NULL, NULL, SPELL_NULLPSI); return; } else if (can_cast_spell(ch, SKILL_PSIBLAST)) { perform_offensive_skill(ch, vict, SKILL_PSIBLAST); return; } } if (aggression > 5) { // attempt to neutralize or get away if (GET_POSITION(vict) > POS_SLEEPING && can_cast_spell(ch, SPELL_MELATONIC_FLOOD)) { cast_spell(ch, vict, NULL, NULL, SPELL_MELATONIC_FLOOD); return; } else if (can_cast_spell(ch, SPELL_ASTRAL_SPELL)) { cast_spell(ch, vict, NULL, NULL, SPELL_ASTRAL_SPELL); return; } else if (can_cast_spell(ch, SPELL_AMNESIA)) { cast_spell(ch, vict, NULL, NULL, SPELL_AMNESIA); return; } else if (can_cast_spell(ch, SPELL_FEAR)) { cast_spell(ch, vict, NULL, NULL, SPELL_FEAR); return; } } // desperation - just attack full force, as hard as possible if (!affected_by_spell(vict, SPELL_PSYCHIC_SURGE) && can_cast_spell(ch, SPELL_PSYCHIC_SURGE)) { cast_spell(ch, vict, NULL, NULL, SPELL_PSYCHIC_SURGE); return; } else if (!affected_by_spell(vict, SPELL_PSYCHIC_CRUSH) && can_cast_spell(ch, SPELL_PSYCHIC_CRUSH)) { cast_spell(ch, vict, NULL, NULL, SPELL_PSYCHIC_CRUSH); return; } else if (!affected_by_spell(vict, SPELL_MOTOR_SPASM) && can_cast_spell(ch, SPELL_MOTOR_SPASM)) { cast_spell(ch, vict, NULL, NULL, SPELL_MOTOR_SPASM); return; } else if (can_cast_spell(ch, SKILL_PSIBLAST)) { perform_offensive_skill(ch, vict, SKILL_PSIBLAST); return; } else if (GET_POSITION(vict) > POS_SITTING && can_cast_spell(ch, SPELL_EGO_WHIP)) { cast_spell(ch, vict, NULL, NULL, SPELL_EGO_WHIP); return; } else if (GET_POSITION(vict) > POS_SLEEPING && can_cast_spell(ch, SPELL_MELATONIC_FLOOD)) { cast_spell(ch, vict, NULL, NULL, SPELL_MELATONIC_FLOOD); return; } else if (can_cast_spell(ch, SPELL_ASTRAL_SPELL)) { cast_spell(ch, vict, NULL, NULL, SPELL_ASTRAL_SPELL); return; } else if (can_cast_spell(ch, SPELL_AMNESIA)) { cast_spell(ch, vict, NULL, NULL, SPELL_AMNESIA); return; } else if (can_cast_spell(ch, SPELL_FEAR)) { cast_spell(ch, vict, NULL, NULL, SPELL_FEAR); return; } else { hit(ch, vict, TYPE_UNDEFINED); } }
bool mage_mob_fight(struct creature *ch, struct creature *precious_vict) { int calculate_mob_aggression(struct creature *ch, struct creature *vict); struct creature *vict = NULL; if (!is_fighting(ch)) return false; // pick an enemy if (!(vict = choose_opponent(ch, precious_vict))) return false; int aggression = calculate_mob_aggression(ch, vict); if (aggression > 75) { // extremely aggressive - just attack hard if (mage_damaging_attack(ch, vict)) return true; } if (aggression > 50) { // somewhat aggressive - balance attacking with crippling if (!AFF2_FLAGGED(vict, AFF2_SLOW) && can_cast_spell(ch, SPELL_SLOW)) { cast_spell(ch, vict, NULL, NULL, SPELL_SLOW); return true; } } if (aggression > 25) { // not very aggressive - play more defensively if (can_cast_spell(ch, SPELL_FIRE_SHIELD) && !AFF2_FLAGGED(ch, AFF2_FIRE_SHIELD)) { cast_spell(ch, ch, NULL, NULL, SPELL_FIRE_SHIELD); return true; } if (can_cast_spell(ch, SPELL_BLUR) && !AFF_FLAGGED(ch, AFF_BLUR)) { cast_spell(ch, ch, NULL, NULL, SPELL_BLUR); return true; } if (can_cast_spell(ch, SPELL_ARMOR) && !affected_by_spell(ch, SPELL_ARMOR)) { cast_spell(ch, ch, NULL, NULL, SPELL_ARMOR); return true; } if (mage_damaging_attack(ch, vict)) return true; } if (aggression > 5) { // attempt to neutralize or get away if (can_cast_spell(ch, SPELL_ASTRAL_SPELL)) { cast_spell(ch, vict, NULL, NULL, SPELL_ASTRAL_SPELL); return true; } else if (can_cast_spell(ch, SPELL_TELEPORT)) { cast_spell(ch, vict, NULL, NULL, SPELL_TELEPORT); return true; } else if (can_cast_spell(ch, SPELL_LOCAL_TELEPORT)) { cast_spell(ch, vict, NULL, NULL, SPELL_LOCAL_TELEPORT); return true; } } if (mage_damaging_attack(ch, vict)) return true; return false; }
void mage_best_attack(struct creature *ch, struct creature *vict) { int calculate_mob_aggression(struct creature *, struct creature *); int aggression = calculate_mob_aggression(ch, vict); if (aggression > 75) { // extremely aggressive - just attack hard if (mage_damaging_attack(ch, vict)) return; } if (aggression > 50) { // somewhat aggressive - balance attacking with crippling if (GET_POSITION(vict) > POS_SLEEPING && can_cast_spell(ch, SPELL_WORD_STUN)) { cast_spell(ch, vict, NULL, NULL, SPELL_WORD_STUN); return; } else if (GET_POSITION(vict) > POS_SLEEPING && can_cast_spell(ch, SPELL_SLEEP)) { cast_spell(ch, vict, NULL, NULL, SPELL_SLEEP); return; } else if (!AFF_FLAGGED(vict, AFF_BLIND) && can_cast_spell(ch, SPELL_BLINDNESS)) { cast_spell(ch, vict, NULL, NULL, SPELL_BLINDNESS); return; } else if (!AFF_FLAGGED(vict, AFF_CURSE) && can_cast_spell(ch, SPELL_CURSE)) { cast_spell(ch, vict, NULL, NULL, SPELL_CURSE); return; } } if (aggression > 25) { // not very aggressive - play more defensively if (can_cast_spell(ch, SPELL_DISPEL_MAGIC) && dispel_is_advisable(vict)) { cast_spell(ch, vict, NULL, NULL, SPELL_DISPEL_MAGIC); return; } else if (!AFF2_FLAGGED(vict, AFF2_SLOW) && can_cast_spell(ch, SPELL_SLOW)) { cast_spell(ch, vict, NULL, NULL, SPELL_SLOW); return; } else if (mage_damaging_attack(ch, vict)) return; } if (aggression > 5) { if (can_cast_spell(ch, SPELL_ASTRAL_SPELL)) { cast_spell(ch, vict, NULL, NULL, SPELL_ASTRAL_SPELL); return; } else if (can_cast_spell(ch, SPELL_TELEPORT)) { cast_spell(ch, vict, NULL, NULL, SPELL_TELEPORT); return; } else if (can_cast_spell(ch, SPELL_LOCAL_TELEPORT)) { cast_spell(ch, vict, NULL, NULL, SPELL_LOCAL_TELEPORT); return; } } // desperation - just attack full force, as hard as possible if (mage_damaging_attack(ch, vict)) return; else if (can_cast_spell(ch, SKILL_PUNCH)) perform_offensive_skill(ch, vict, SKILL_PUNCH); else hit(ch, vict, TYPE_UNDEFINED); }