/*---------------------------------------------------------------------*//** アイテムをユニット化 ※ ソウマから装備アイテムをフォーカスできるようにユニット化する **//*---------------------------------------------------------------------*/ void ItemEquip::unitization(s32 ieqp, Item* item, u16 spid) { UnitManager* unitmng = Game::getGame()->getUnitManager(); ASSERT(unitmng != 0L); // 既にあるユニットを一度削除 if(_uidarrEq[ieqp] != 0) { Unit* unit = unitmng->getUnitFromId(_uidarrEq[ieqp]); if(unit != 0) { ASSERT(unit->getUnitType() == UNITTYPE_EQUIPMENT_ITEM); // 一度削除する unitmng->removeUnit(unit); } _uidarrEq[ieqp] = 0; } // アイテムを外した場合はここで抜ける if(item == 0L) { return; } // アイテムユニットを作成 EquipmentItemUnit* itmu = new EquipmentItemUnit(); ASSERT(itmu != 0L); itmu->create(item, _unitOwner, spid); // ユニットマネージャに追加 if(unitmng->addUnit(itmu)) { _uidarrEq[ieqp] = itmu->getUnitId(); } }
/*---------------------------------------------------------------------*//** ユニット化した装備品を得る **//*---------------------------------------------------------------------*/ Unit* ItemEquip::getEquipUnit(s32 ieqp) const { ASSERT((0 <= ieqp) && (ieqp < EquipPlace::NUM_EQP)); if(_uidarrEq[ieqp] == 0) { return 0L; } UnitManager* unitmng = Game::getGame()->getUnitManager(); ASSERT(unitmng != 0L); Unit* unit = unitmng->getUnitFromId(_uidarrEq[ieqp]); return unit; }
/*---------------------------------------------------------------------*//** コマンドフレーム処理 - アイテムを拾う **//*---------------------------------------------------------------------*/ int PcRole::execCommand_pickupItem(ExecRes* res, const ExecCtx* ec, const CmdParam* param) { const int STEP_ANIM_START = 1; const int STEP_ANIM_WAIT = 2; const int END = 999; int step = param->_step; switch(step) { case STEP_ANIM_START: step = STEP_ANIM_WAIT; { // アイテムの空き確認 ItemManager* itmmng = Game::getGame()->getMyParty()->getItemManager(); ASSERT(itmmng != 0L); if(itmmng->getEmptyItemIndex(false) == -1) { res->setDone(); // この時点で空きがなかったら失敗 return END; } // アニメーション変更 _sprtRef->pcUnit()->changeAnim(CharUnit::ANIMID_PICKUP_ITEM, false); } break; case STEP_ANIM_WAIT: if(param->_frmcntStep >= 20.0f) // 実行フレーム { // 対象アイテム取得 FieldItemUnit* fiunit = 0L; const ItemDef* itmdf = 0L; do { u16 unitidRsvPickup = _sprtRef->getReservedBefaviorParameter(); if(unitidRsvPickup == 0) { break; } UnitManager* unitmng = Game::getGame()->getUnitManager(); ASSERT(unitmng != 0L); Unit* unit = unitmng->getUnitFromId(unitidRsvPickup); if((unit == 0L) || (unit->getUnitType() != UNITTYPE_FIELD_ITEM)) { break; } fiunit = (FieldItemUnit*)unit; itmdf = fiunit->getItemDef(); } while(false); if(itmdf == 0L) { res->setDone(); return END; } // アイテムを拾う ItemManager* itmmng = Game::getGame()->getMyParty()->getItemManager(); ASSERT(itmmng != 0L); if(itmmng->pickupItem(Game::getGame()->getMap(), fiunit->getPlacementObj(), fiunit->getEleneStat())) { // 成功時 fiunit->setEnable(false); // ユニット無効化 // メッセージを表示する VcString msg(VcString::format(GameFixedStrTbl::getString(GameFixedStrTbl::SID_GET_SOMETHING)->getRaw(), itmdf->getName(Env_getLangId())->getRaw(), "\n")); Game::getGame()->getConductor()->on(&msg, _sprtRef->getPcUnit(), 0); // SE ///Game::getGame()->getSoundManager()->playSe(???, false, 1.0f, _sprtRef->getThisUnit()->getCenterPos(), 0L); // 通知発行 Game::getGame()->getGameNotifier()->notifyPickupItem(_sprtRef->getPcUnit(), fiunit); // クエストの可変達成状態の更新 QuestManager* qsmng = Game::getGame()->getQuestManager(); qsmng->updateVariableAchievementState(); } step = END; } break; case END: if(param->_frmcntStep >= 10.0f) { res->setDone(); } break; } //STRACE("... use_item ...\n"); return step; }