/* * Copyright (C) 2006-2010 - Frictional Games * * This file is part of Penumbra Overture. * * Penumbra Overture is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Penumbra Overture is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Penumbra Overture. If not, see . */ #include "GameItemType.h" #include "Init.h" #include "Inventory.h" #include "Player.h" #include "PlayerHands.h" #include "MapHandler.h" #include "GameEntity.h" #include "GameMessageHandler.h" #include "Notebook.h" #include "GameItem.h" #include "PlayerState_Weapon.h" #include "PlayerState_WeaponHaptX.h" #include "HudModel_Weapon.h" #include "HudModel_Throw.h" ////////////////////////////////////////////////////////////////////////// // BASE ITEM CLASS ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cGameItemType::cGameItemType(cInit *apInit) { mpInit = apInit; } cGameItemType::~cGameItemType(void) { } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // NORMAL ITEM ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cGameItemType_Normal::cGameItemType_Normal(cInit *apInit) : cGameItemType(apInit) { mvActions.resize(2); mvActions[0] = kTranslate("Inventory", "Use"); mvActions[1] = kTranslate("Inventory", "Drop"); mvNonDropActions.resize(1); mvNonDropActions[0] = kTranslate("Inventory", "Use"); } bool cGameItemType_Normal::OnAction(cInventoryItem *apItem, int alActionNum) { ////////////// //Use if(alActionNum == 0) { if(mpInit->mpInventory->IsActive()) mpInit->mpInventory->SetActive(false); mpInit->mpPlayer->ChangeState(ePlayerState_UseItem); mpInit->mpPlayer->SetCurrentItem(apItem); } ////////////// //Drop else if(alActionNum == 1) { apItem->Drop(); mpInit->mpInventory->RemoveItem(apItem); } return true; } //----------------------------------------------------------------------- void cGameItemType_Normal::OnUse(cInventoryItem *apItem, iGameEntity* apEntity) { bool bUsed = apEntity->OnUseItem(apItem); if(mpInit->mpInventory->CheckUseCallback(apItem->GetName(), apEntity->GetName())==false) { if(bUsed==false) { tString sEntry = "CannotUseItem" + cString::ToString(cMath::RandRectl(1,5)); mpInit->mpGameMessageHandler->Add(kTranslate("Inventory", sEntry)); } } } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // NOTEBOOK ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cGameItemType_Notebook::cGameItemType_Notebook(cInit *apInit) : cGameItemType(apInit) { mvActions.resize(1); mvActions[0] = kTranslate("Inventory", "Read"); mvNonDropActions.resize(1); mvNonDropActions[0] = kTranslate("Inventory", "Read"); } bool cGameItemType_Notebook::OnPickUp(cInventoryItem *apItem, bool abInGame) { //mpInit->mpInventory->SetNoteBookActive(true); //return false; return true; } bool cGameItemType_Notebook::OnAction(cInventoryItem *apItem, int alActionNum) { ////////////// //Read if(alActionNum == 0) { mpInit->mpNotebook->SetActive(true); } return true; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // NOTE ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cGameItemType_Note::cGameItemType_Note(cInit *apInit) : cGameItemType(apInit) { mvActions.resize(1); mvActions[0] = kTranslate("Inventory", "Read"); mvNonDropActions.resize(1); mvNonDropActions[0] = kTranslate("Inventory", "Read"); } bool cGameItemType_Note::OnPickUp(cInventoryItem *apItem, bool abInGame) { cNotebook_Note *pNote = mpInit->mpNotebook->AddNote(apItem->GetGameName(),"Notes",apItem->GetName()); if(abInGame) { mpInit->mpNotebook->SetActive(true); mpInit->mpNotebook->SetSelectedNote(pNote); mpInit->mpNotebook->GetStateMachine()->ChangeState(eNotebookState_Note); } return false; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // BATTERY ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cGameItemType_Battery::cGameItemType_Battery(cInit *apInit) : cGameItemType(apInit) { mvActions.resize(1); mvActions[0] = kTranslate("Inventory", "Read"); mvNonDropActions.resize(1); mvNonDropActions[0] = kTranslate("Inventory", "Read"); } bool cGameItemType_Battery::OnPickUp(cInventoryItem *apItem, bool abInGame) { mpInit->mpPlayer->AddPower(10.0f); return false; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // FLASHLIGHT ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cGameItemType_Flashlight::cGameItemType_Flashlight(cInit *apInit) : cGameItemType(apInit) { mvActions.resize(1); mvActions[0] = kTranslate("Inventory", "Turn onoff"); mvNonDropActions.resize(1); mvNonDropActions[0] = kTranslate("Inventory", "Turn onoff"); } bool cGameItemType_Flashlight::OnAction(cInventoryItem *apItem, int alActionNum) { ////////////// //Read if(alActionNum == 0) { mpInit->mpPlayer->StartFlashLightButton(); } return true; } //----------------------------------------------------------------------- tWString cGameItemType_Flashlight::GetString(cInventoryItem *apItem) { if(mpInit->mpPlayer->GetFlashLight()->IsActive()) return kTranslate("Inventory","On"); return kTranslate("Inventory","Off"); } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // GLOW STICK ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cGameItemType_GlowStick::cGameItemType_GlowStick(cInit *apInit) : cGameItemType(apInit) { mvActions.resize(1); mvActions[0] = kTranslate("Inventory", "Equip"); mvNonDropActions.resize(1); mvNonDropActions[0] = kTranslate("Inventory", "Equip"); } bool cGameItemType_GlowStick::OnAction(cInventoryItem *apItem, int alActionNum) { ////////////// //Equip if(alActionNum == 0) { if(mpInit->mpPlayer->GetGlowStick()->IsActive()) { mpInit->mpPlayer->GetGlowStick()->SetActive(false); } else { mpInit->mpPlayer->GetGlowStick()->SetActive(true); mpInit->mpPlayer->GetFlashLight()->SetActive(false); } } return true; } //----------------------------------------------------------------------- tWString cGameItemType_GlowStick::GetString(cInventoryItem *apItem) { if(mpInit->mpPlayer->GetGlowStick()->IsActive()) return kTranslate("Inventory","On"); return kTranslate("Inventory","Off"); } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// //FLARE ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cGameItemType_Flare::cGameItemType_Flare(cInit *apInit) : cGameItemType(apInit) { mvActions.resize(1); mvActions[0] = kTranslate("Inventory", "Equip"); mvNonDropActions.resize(1); mvNonDropActions[0] = kTranslate("Inventory", "Equip"); } bool cGameItemType_Flare::OnAction(cInventoryItem *apItem, int alActionNum) { ////////////// //Equip if(alActionNum == 0) { if(mpInit->mpPlayer->GetFlare()->IsActive()==false) { mpInit->mpPlayer->GetFlare()->SetActive(true); apItem->AddCount(-1); if(apItem->GetCount()<=0) mpInit->mpInventory->RemoveItem(apItem); } else { mpInit->mpPlayer->GetFlare()->SetActive(false); } } return true; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // WEAPON MELEE ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cGameItemType_WeaponMelee::cGameItemType_WeaponMelee(cInit *apInit) : cGameItemType(apInit) { mvActions.resize(1); mvActions[0] = kTranslate("Inventory", "Equip"); mvNonDropActions.resize(1); mvNonDropActions[0] = kTranslate("Inventory", "Equip"); } //----------------------------------------------------------------------- bool cGameItemType_WeaponMelee::OnAction(cInventoryItem *apItem, int alActionNum) { ////////////// //Equip if(alActionNum == 0) { //Make sure the model is loaded if(mpInit->mpPlayerHands->GetModel(apItem->GetHudModelName())==NULL) mpInit->mpPlayerHands->AddModelFromFile(apItem->GetHudModelFile()); if(mpInit->mpPlayerHands->GetCurrentModel(1) && mpInit->mpPlayerHands->GetCurrentModel(1)->msName == apItem->GetHudModelName()) { //mpInit->mpPlayerHands->SetCurrentModel(1, ""); mpInit->mpPlayer->ChangeState(ePlayerState_Normal); } else { iHudModel *pHudModel = mpInit->mpPlayerHands->GetModel(apItem->GetHudModelName()); if(pHudModel==NULL){ Error("Hud model with name '%s' does not exist!\n",apItem->GetHudModelName().c_str()); return true; } if(mpInit->mbHasHaptics==false) mpInit->mpPlayerHands->SetCurrentModel(1, apItem->GetHudModelName()); ////////////////////////// //Set up the melee state iPlayerState *pState = mpInit->mpPlayer->GetStateData(ePlayerState_WeaponMelee); cHudModel_WeaponMelee *pMeleeHud = static_cast(pHudModel); cPlayerState_WeaponMelee *pMeleeState = static_cast(pState); pMeleeState->SetHudWeapon(pMeleeHud); //change state to melee mpInit->mpPlayer->ChangeState(ePlayerState_WeaponMelee); } } return true; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // WEAPON MELEE HAPTX ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cGameItemType_WeaponMeleeHaptX::cGameItemType_WeaponMeleeHaptX(cInit *apInit) : cGameItemType(apInit) { mvActions.resize(1); mvActions[0] = kTranslate("Inventory", "Equip"); mvNonDropActions.resize(1); mvNonDropActions[0] = kTranslate("Inventory", "Equip"); } //----------------------------------------------------------------------- bool cGameItemType_WeaponMeleeHaptX::OnAction(cInventoryItem *apItem, int alActionNum) { ////////////// //Equip if(alActionNum == 0) { //Make sure the model is loaded if(mpInit->mpPlayerHands->GetModel(apItem->GetHudModelName())==NULL) mpInit->mpPlayerHands->AddModelFromFile(apItem->GetHudModelFile()); iHudModel *pHudModel = mpInit->mpPlayerHands->GetModel(apItem->GetHudModelName()); if(pHudModel==NULL){ Error("Hud model with name '%s' does not exist!\n",apItem->GetHudModelName().c_str()); return true; } cHudModel_WeaponMelee *pMeleeHud = static_cast(pHudModel); iPlayerState *pState = mpInit->mpPlayer->GetStateData(ePlayerState_WeaponMelee); cPlayerState_WeaponMeleeHaptX *pMeleeState = static_cast(pState); if(mpInit->mpPlayer->GetState() == ePlayerState_WeaponMelee && pMeleeState->GetHudWeapon() == pMeleeHud) { mpInit->mpPlayer->ChangeState(ePlayerState_Normal); //pMeleeState->SetHudWeapon(NULL); } else { if(mpInit->mbHasHaptics==false) mpInit->mpPlayerHands->SetCurrentModel(1, apItem->GetHudModelName()); if(mpInit->mpPlayer->GetState() == ePlayerState_WeaponMelee) { mpInit->mpPlayer->ChangeState(ePlayerState_Normal); } ////////////////////////// //Set up the melee state iPlayerState *pState = mpInit->mpPlayer->GetStateData(ePlayerState_WeaponMelee); cPlayerState_WeaponMeleeHaptX *pMeleeState = static_cast(pState); pMeleeState->SetHudWeapon(pMeleeHud); //change state to melee mpInit->mpPlayer->ChangeState(ePlayerState_WeaponMelee); mpInit->mpInventory->SetActive(false); } } return true; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // THROW ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cGameItemType_Throw::cGameItemType_Throw(cInit *apInit) : cGameItemType(apInit) { mvActions.resize(1); mvActions[0] = kTranslate("Inventory", "Equip"); mvNonDropActions.resize(1); mvNonDropActions[0] = kTranslate("Inventory", "Equip"); } //----------------------------------------------------------------------- bool cGameItemType_Throw::OnAction(cInventoryItem *apItem, int alActionNum) { ////////////// //Equip if(alActionNum == 0) { //Make sure the model is loaded if(mpInit->mpPlayerHands->GetModel(apItem->GetHudModelName())==NULL) mpInit->mpPlayerHands->AddModelFromFile(apItem->GetHudModelFile()); if(mpInit->mpPlayerHands->GetCurrentModel(1) && mpInit->mpPlayerHands->GetCurrentModel(1)->msName == apItem->GetHudModelName()) { //mpInit->mpPlayerHands->SetCurrentModel(1, ""); mpInit->mpPlayer->ChangeState(ePlayerState_Normal); } else { iHudModel *pHudModel = mpInit->mpPlayerHands->GetModel(apItem->GetHudModelName()); if(pHudModel==NULL){ Error("Hud model with name '%s' does not exist!\n",apItem->GetHudModelName().c_str()); return true; } mpInit->mpPlayerHands->SetCurrentModel(1, apItem->GetHudModelName()); ////////////////////////// //Set up the throw state iPlayerState *pState = mpInit->mpPlayer->GetStateData(ePlayerState_Throw); cPlayerState_Throw *pThrowState = static_cast(pState); cHudModel_Throw *pHud = static_cast(pHudModel); pHud->SetItem(apItem); pThrowState->SetHudObject(pHud); //change state to melee mpInit->mpPlayer->ChangeState(ePlayerState_Throw); } } return true; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // PAINLKILLERS ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cGameItemType_Painkillers::cGameItemType_Painkillers(cInit *apInit) : cGameItemType(apInit) { mvActions.resize(1); mvActions[0] = kTranslate("Inventory", "Eat"); mvNonDropActions.resize(1); mvNonDropActions[0] = kTranslate("Inventory", "Eat"); } bool cGameItemType_Painkillers::OnAction(cInventoryItem *apItem, int alActionNum) { ////////////// //Eat if(alActionNum == 0) { mpInit->mpGame->GetSound()->GetSoundHandler()->PlayGui("player_eat_painkillers",false,1); mpInit->mpPlayer->SetHealth(100); apItem->AddCount(-1); if(apItem->GetCount()<=0) { mpInit->mpInventory->RemoveItem(apItem); } } return true; } //-----------------------------------------------------------------------