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; }
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); }