예제 #1
0
// 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;
}
예제 #2
0
파일: graph.c 프로젝트: nawglan/ShadowWind
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;
  }
}
예제 #3
0
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);
			}
		}
	}
}
예제 #4
0
// 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;
}
예제 #5
0
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);
    }
}
예제 #6
0
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);
}
예제 #7
0
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));
			}
		}
	}
  }
}
예제 #8
0
파일: graph.c 프로젝트: nawglan/ShadowWind
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;
  }
}
예제 #9
0
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;
}
예제 #10
0
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);
    }
}
예제 #11
0
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;
}
예제 #12
0
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);
}