//constructor: shMonster::shMonster (shMonId id, int extralevels /* = 0 */ ) :shCreature () { int do_or = 0; int do_and = 0; int gotweapon = 0; shMonsterIlk *ilk = &MonIlks[id]; mIlkId = id; mType = ilk->mType; strncpy (mName, ilk->mName, 30); mCLevel = ilk->mBaseLevel; mNaturalArmorBonus = ilk->mNaturalArmorBonus; mReflexSaveBonus = 0; mDir = kNoDirection; mTame = 0; mStrategy = ilk->mDefaultStrategy; mDisposition = ilk->mDefaultDisposition; mTactic = kReady; mDestX = -1; mEnemyX = -1; mPlannedMoveIndex = -1; mSpellTimer = 0; memcpy (mInnateResistances, ilk->mInnateResistances, sizeof (mInnateResistances)); mInnateIntrinsics = ilk->mInnateIntrinsics; for (int i = 0; i < ilk->mNumPowers; ++i) if (ilk->mPowers[i] == kTelepathyPower) mInnateIntrinsics |= kTelepathy; /* Assume always on. */ mFeats = ilk->mFeats; #define IMMUNE 122 switch (mType) { case kMutant: mInnateResistances[kRadiological] = IMMUNE; mInnateResistances[kMagnetic] = IMMUNE; break; case kHumanoid: mInnateResistances[kMagnetic] = IMMUNE; break; case kAnimal: mInnateResistances[kMagnetic] = IMMUNE; mInnateIntrinsics |= kScent; break; case kInsect: mInnateResistances[kMagnetic] = IMMUNE; mInnateResistances[kRadiological] = IMMUNE; mInnateIntrinsics |= kScent; break; case kOutsider: mInnateResistances[kMagnetic] = IMMUNE; break; case kBot: mInnateResistances[kToxic] = IMMUNE; mInnateResistances[kPsychic] = IMMUNE; mInnateResistances[kRadiological] = IMMUNE; mInnateResistances[kViolating] = IMMUNE; mInnateResistances[kMesmerizing] = IMMUNE; mInnateResistances[kBlinding] = IMMUNE; mInnateIntrinsics |= kBreathless; break; case kDroid: mInnateResistances[kToxic] = IMMUNE; mInnateResistances[kPsychic] = IMMUNE; mInnateResistances[kRadiological] = IMMUNE; mInnateResistances[kViolating] = IMMUNE; mInnateResistances[kMesmerizing] = IMMUNE; mInnateResistances[kBlinding] = IMMUNE; mInnateIntrinsics |= kBreathless; break; case kProgram: mInnateResistances[kToxic] = IMMUNE; mInnateResistances[kRadiological] = IMMUNE; mInnateResistances[kViolating] = IMMUNE; /* Processes can be put to sleep so no kMesmerizing immunity. */ mInnateIntrinsics |= kBreathless; break; case kConstruct: mInnateResistances[kToxic] = IMMUNE; mInnateResistances[kPsychic] = IMMUNE; mInnateResistances[kRadiological] = IMMUNE; mInnateResistances[kStunning] = IMMUNE; mInnateResistances[kConfusing] = IMMUNE; mInnateResistances[kViolating] = IMMUNE; mInnateResistances[kParalyzing] = IMMUNE; mInnateResistances[kMesmerizing] = IMMUNE; mInnateResistances[kBlinding] = IMMUNE; mInnateIntrinsics |= kBreathless; break; case kOoze: mInnateResistances[kToxic] = 3; mInnateResistances[kMagnetic] = IMMUNE; mInnateResistances[kRadiological] = IMMUNE; mInnateResistances[kViolating] = IMMUNE; mInnateResistances[kWebbing] = IMMUNE; mInnateIntrinsics |= kBreathless; break; case kAberration: mInnateResistances[kMagnetic] = IMMUNE; mInnateResistances[kRadiological] = IMMUNE; mInnateResistances[kViolating] = IMMUNE; break; case kCyborg: mInnateResistances[kToxic] = 2; mInnateResistances[kRadiological] = 10; mInnateIntrinsics |= kBreathless; break; case kEgg: mInnateResistances[kViolating] = IMMUNE; mInnateIntrinsics |= kBreathless; /* fall through */ case kBeast: mInnateResistances[kMagnetic] = IMMUNE; mInnateIntrinsics |= kScent; break; case kVermin: mInnateResistances[kMagnetic] = IMMUNE; mInnateIntrinsics |= kScent; mInnateIntrinsics |= kCanSwim; break; case kAlien: mAlienEgg.mHatchChance = 0; mInnateResistances[kMagnetic] = IMMUNE; mInnateResistances[kRadiological] = 10; mInnateResistances[kCorrosive] = IMMUNE; mInnateIntrinsics |= kScent; if (!isA (kMonAlienQueen)) /* Too heavy and bloated. */ mInnateIntrinsics |= kJumpy; gainRank (kUnarmedCombat, mCLevel/2); break; default: debug.log ("Alert! Unknown monster type"); mInnateResistances[kMagnetic] = IMMUNE; } #undef IMMUNE if (3 == ilk->mGender) { mGender = RNG (1, 2); } else { mGender = ilk->mGender; } /* roll ability scores */ rollAbilityScores (ilk->mStr, ilk->mCon, ilk->mAgi, ilk->mDex, ilk->mInt, ilk->mPsi); /* roll hit points */ rollHitPoints (ilk->mHitDice, 8); /* setup speed */ mSpeed = ilk->mSpeed; computeAC (); mGlyph = ilk->mGlyph; if (isA (kMonMutantNinjaTurtle)) mGlyph.mTileX += RNG (4); /* Got four of those. */ mState = kActing; if (equipment[id].mPtr) /* Does monster get standard equipment? */ for (int i = 0; i < equipment[id].mCnt; ++i) { const char *str = equipment[id].mPtr[i]; if ('|' == str[0]) { /* the or symbol indicates don't try to create the object unless the previous obj failed */ if (0 == do_or) { do_or = 1; do_and = 0; continue; } else { ++str; } } else if (',' == str[0]) { /* the comma symbol indicates create the object only if the prev obj was made */ if (1 == do_and) { ++str; } else { continue; } } shObject *obj = createObject (str, 0); if (NULL == obj) { do_or = 1; do_and = 0; debug.log ("unable to equip %s", str); continue; } do_or = 0; do_and = 1; addObjectToInventory (obj); if (!mWeapon and obj->isA (kWeapon)) { if (obj->myIlk ()->mMeleeSkill != kNoSkillCode) { gainRank (obj->myIlk ()->mMeleeSkill, 1 + mCLevel * 2/3); } if (obj->myIlk ()->mGunSkill != kNoSkillCode) { gainRank (obj->myIlk ()->mGunSkill, 1 + mCLevel * 2/3); } ++gotweapon; /* don't wield until hero is in sight so he can see message */ //wield (obj, 1); } else if (obj->isA (kArmor) or obj->isA (kImplant)) { don (obj, 1); } } if (!gotweapon) { gainRank (kUnarmedCombat, 1 + mCLevel); } /* Maybe monster gets some more treasure. */ if (noTreasure () or kAnimal == mType or kBeast == mType or kAberration == mType or kInsect == mType or kVermin == mType or kOutsider == mType or kEgg == mType or kOoze == mType or kAlien == mType or kBot == mType or kConstruct == mType) { /* No treasure requested or a monster does not want treasure. */ } else { if (RNG (50) <= 5 + mCLevel) { shObject *cash = new shObject (kObjMoney); cash->mCount = NDX (mCLevel + 1, 10); addObjectToInventory (cash); } if (RNG (80) <= 5 + mCLevel) { shObject *obj = generateObject (-1); while (obj->getMass () > 5000) { delete obj; obj = generateObject (-1); } addObjectToInventory (obj); } } computeIntrinsics (); if (RNG (100) < ilk->mPeacefulChance) { mDisposition = kIndifferent; } debug.log ("spawned %s with %d HP speed %d", mName, mHP, mSpeed); }
void getParameter(double &a, double &b, double &c) { computeAC(); // this line may not be needed a = _a; b = _b; c = _c; }