/* returns ms elapsed */ int shCreature::utilizeWreck (shObject *obj) { if (Hero.canSee (this)) { I->p ("%s utilizes %s.", the (), AN (obj)); } shObject *cells = createObject ("energy cells", 0); if (isPet ()) { mLevel->putObject (cells, mX, mY); } else { addObjectToInventory (cells); } return FULLTURN; }
void ScummEngine_v0::o_pickupObject() { int obj = fetchScriptByte(); if (!obj) obj = _cmdObject; /* Don't take an object twice */ if (whereIsObject(obj) == WIO_INVENTORY) return; addObjectToInventory(obj, _roomResource); markObjectRectAsDirty(obj); putOwner(obj, VAR(VAR_EGO)); putState(obj, getState(obj) | kObjectState_08 | kObjectStateUntouchable); clearDrawObjectQueue(); runInventoryScript(1); }
void ScummEngine_v70he::o70_pickupObject() { int obj, room; room = pop(); obj = pop(); if (room == 0) room = getObjectRoom(obj); addObjectToInventory(obj, room); putOwner(obj, VAR(VAR_EGO)); if (_game.heversion <= 70) { putClass(obj, kObjectClassUntouchable, 1); putState(obj, 1); markObjectRectAsDirty(obj); clearDrawObjectQueue(); } runInventoryScript(obj); /* Difference */ }
void ScummEngine_v4::o4_pickupObject() { int obj = getVarOrDirectWord(PARAM_1); if (obj < 1) { error("pickupObjectOld received invalid index %d (script %d)", obj, vm.slot[_currentScript].number); } if (getObjectIndex(obj) == -1) return; if (whereIsObject(obj) == WIO_INVENTORY) // Don't take an object twice return; // debug(0, "adding %d from %d to inventoryOld", obj, _currentRoom); addObjectToInventory(obj, _roomResource); markObjectRectAsDirty(obj); putOwner(obj, VAR(VAR_EGO)); putClass(obj, kObjectClassUntouchable, 1); putState(obj, 1); clearDrawObjectQueue(); runInventoryScript(1); }
void IgorEngine::PART_19_ACTION_107() { if (_objectsState[58] == 1) { ADD_DIALOGUE_TEXT(211, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); return; } ADD_DIALOGUE_TEXT(206, 1); ADD_DIALOGUE_TEXT(207, 1); SET_DIALOGUE_TEXT(1, 2); startIgorDialogue(); waitForEndOfIgorDialogue(); for (int i = 1; i <= 2; ++i) { const int offset = 27110; for (int j = 0; j <= 48; ++j) { memcpy(_screenVGA + j * 320 + offset, _animFramesBuffer + i * 1372 + j * 28 - 506, 28); waitForTimer(120); } } addObjectToInventory(12, 47); _objectsState[58] = 1; PART_19_HELPER_1(255); }
//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); }