Пример #1
0
int BasicMonster::action()
{
	if ((usesMeleeWeapons() || usesRangedWeapons()) && inventory.size() > 0)
	{
		useBestWeapon();
	}
	int time;
	bool seen = seePlayer();
	if (shouldFlee())
	{
		time = doFlee();
		if (time > 0) return time;
	}
	if (attitude == ATTITUDE_HOSTILE && seen)
	{
		int sqdist = Point::sqlen(world.player->getCreature()->getPos() - position);
		Weapon* weapon = getMainWeapon();
		if (weapon == NULL) weapon = &baseWeapon;
		int range = weapon->getRange();

		// Ranged attack
		if (range > 1 && sqdist <= range*range)
		{
			time = doRangedAttack(weapon);
			if (time > 0) return time;
		}

		// Special attacks (e.g. dragon breath)
		time = doSpecialAttack();
		if (time > 0) return time;

		// Melee attack
		if (sqdist <= 2)
		{
			time = doMeleeAttack(weapon);
			if (time > 0) return time;
		}

		// Run towards player / tactical movement
		time = doChargePlayer();
		if (time > 0) return time;
	}

	// Random walk, search for items, etc.
	time = doWander();
	return time > 0 ? time : 10;
}
Пример #2
0
int Creature::flee(bool magicTerror, bool wimpyFlee) {
    Monster* mThis = getAsMonster();
    Player* pThis = getAsPlayer();

    if(!magicTerror && !canFlee(true, false))
        return(0);

    if(mThis || magicTerror || wimpyFlee) {
        if(wimpyFlee && pThis)
            pThis->setFleeing(true);
        doFlee(magicTerror);
    } else {
        *this << "You frantically look around for someplace to flee to!\n";
        pThis->setFleeing(true);
    }
    return(1);
}