/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program 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. * * This program 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 this program. If not, see . * */ /* * Copyright (C) 2006-2010 - Frictional Games * * This file is part of Penumbra Overture. */ #include "hpl1/penumbra-overture/PlayerState_Weapon.h" #include "hpl1/engine/engine.h" #include "hpl1/penumbra-overture/Init.h" #include "hpl1/penumbra-overture/Player.h" #include "hpl1/penumbra-overture/HudModel_Throw.h" #include "hpl1/penumbra-overture/HudModel_Weapon.h" ////////////////////////////////////////////////////////////////////////// // THROW STATE ////////////////////////////////////////////////////////////////////////// cPlayerState_Throw::cPlayerState_Throw(cInit *apInit, cPlayer *apPlayer) : iPlayerState(apInit, apPlayer, ePlayerState_Throw) { mfLastForward = 1.0f; mfLastSideways = 1.0f; mpHudObject = NULL; } //----------------------------------------------------------------------- void cPlayerState_Throw::OnUpdate(float afTimeStep) { if (mpInit->mpNotebook->IsActive() == false && mpInit->mpInventory->IsActive() == false && mpInit->mpNumericalPanel->IsActive() == false && mpInit->mpDeathMenu->IsActive() == false) { mpPlayer->ResetCrossHairPos(); } ///////////////////////////////////// // If run is down, run!! cInput *pInput = mpInit->mpGame->GetInput(); if (pInput->IsTriggerd("Run") && mpPlayer->GetMoveState() == ePlayerMoveState_Walk) { mpPlayer->ChangeMoveState(ePlayerMoveState_Run); } ///////////////////////////////////////////////// // Cast ray to see if anything is picked. iPhysicsWorld *pPhysicsWorld = mpInit->mpGame->GetScene()->GetWorld3D()->GetPhysicsWorld(); cVector3f vStart, vEnd; vStart = mpPlayer->GetCamera()->GetPosition(); vEnd = vStart + mpPlayer->GetCamera()->GetForward() * mpPlayer->GetPickRay()->mfMaxDistance; mpPlayer->GetPickRay()->Clear(); pPhysicsWorld->CastRay(mpPlayer->GetPickRay(), vStart, vEnd, true, false, true); mpPlayer->GetPickRay()->CalculateResults(); if (mpPlayer->GetPickedBody()) { iGameEntity *pEntity = (iGameEntity *)mpPlayer->GetPickedBody()->GetUserData(); // Set cross hair state eCrossHairState CrossState = pEntity->GetPickCrossHairState(mpPlayer->GetPickedBody()); if (CrossState != eCrossHairState_None && pEntity->GetDescription() != _W("") && !pEntity->GetHasBeenExamined()) { mpPlayer->SetCrossHairState(eCrossHairState_Examine); } else { mpPlayer->SetCrossHairState(eCrossHairState_None); } // Call entity // pEntity->PlayerPick(); } else { mpPlayer->SetCrossHairState(eCrossHairState_None); } // Quick fix but works, the OnLeave of the previous states sets an old cross hair state. // mpPlayer->SetCrossHairState(eCrossHairState_None); } //----------------------------------------------------------------------- void cPlayerState_Throw::OnDraw() { } //----------------------------------------------------------------------- void cPlayerState_Throw::OnPostSceneDraw() { // mpHudObject->PostSceneDraw(); } //----------------------------------------------------------------------- bool cPlayerState_Throw::OnJump() { return true; } //----------------------------------------------------------------------- void cPlayerState_Throw::OnStartInteractMode() { } //----------------------------------------------------------------------- void cPlayerState_Throw::OnStartInteract() { mpHudObject->OnAttackDown(); } //----------------------------------------------------------------------- void cPlayerState_Throw::OnStopInteract() { mpHudObject->OnAttackUp(); } //----------------------------------------------------------------------- void cPlayerState_Throw::OnStartExamine() { // mpInit->mpPlayerHands->SetCurrentModel(1,""); // mpInit->mpPlayer->ChangeState(ePlayerState_Normal); if (mpPlayer->GetPickedBody()) { iGameEntity *pEntity = (iGameEntity *)mpPlayer->GetPickedBody()->GetUserData(); pEntity->PlayerExamine(); } } //----------------------------------------------------------------------- void cPlayerState_Throw::OnStartHolster() { mpInit->mpPlayerHands->SetCurrentModel(1, ""); mpInit->mpPlayer->ChangeState(ePlayerState_Normal); } //----------------------------------------------------------------------- bool cPlayerState_Throw::OnAddYaw(float afVal) { return true; // mpHudObject->OnMouseMove(cVector2f(afVal,0)); } bool cPlayerState_Throw::OnAddPitch(float afVal) { return true; // return mpHudObject->OnMouseMove(cVector2f(0,afVal)); } //----------------------------------------------------------------------- bool cPlayerState_Throw::OnMoveForwards(float afMul, float afTimeStep) { mfLastForward = afMul; return true; } //----------------------------------------------------------------------- bool cPlayerState_Throw::OnMoveSideways(float afMul, float afTimeStep) { mfLastSideways = afMul; return true; } //----------------------------------------------------------------------- void cPlayerState_Throw::EnterState(iPlayerState *apPrevState) { mpHudObject->OnStart(); } //----------------------------------------------------------------------- void cPlayerState_Throw::LeaveState(iPlayerState *apNextState) { if (apNextState->mType != ePlayerState_Message && apNextState->mType != ePlayerState_WeaponMelee && mpInit->mpPlayerHands->GetCurrentModel(1) == mpHudObject) { mpInit->mpPlayerHands->SetCurrentModel(1, ""); } } //----------------------------------------------------------------------- // No running when you have a weapon: void cPlayerState_Throw::OnStartRun() { if (mpPlayer->GetMoveState() == ePlayerMoveState_Walk) mpPlayer->ChangeMoveState(ePlayerMoveState_Run); if (mpPlayer->GetMoveState() == ePlayerMoveState_Jump) { mpPlayer->SetPrevMoveState(ePlayerMoveState_Run); } } void cPlayerState_Throw::OnStopRun() { if (mpPlayer->GetMoveState() == ePlayerMoveState_Run) mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); else if (mpPlayer->GetMoveState() == ePlayerMoveState_Jump) mpPlayer->SetPrevMoveState(ePlayerMoveState_Walk); } //----------------------------------------------------------------------- void cPlayerState_Throw::OnStartCrouch() { if (mpPlayer->GetMoveState() == ePlayerMoveState_Jump) return; if (mpInit->mpButtonHandler->GetToggleCrouch()) { if (mpPlayer->GetMoveState() == ePlayerMoveState_Crouch) mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); else mpPlayer->ChangeMoveState(ePlayerMoveState_Crouch); } else { mpPlayer->ChangeMoveState(ePlayerMoveState_Crouch); } } void cPlayerState_Throw::OnStopCrouch() { if (mpPlayer->GetMoveState() == ePlayerMoveState_Crouch && mpInit->mpButtonHandler->GetToggleCrouch() == false) { mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); } } //----------------------------------------------------------------------- bool cPlayerState_Throw::OnStartInventory() { // mpPlayer->ChangeState(ePlayerState_Normal); return true; } //----------------------------------------------------------------------- bool cPlayerState_Throw::OnStartInventoryShortCut(int alNum) { return true; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // WEAPON MELEE STATE ////////////////////////////////////////////////////////////////////////// cPlayerState_WeaponMelee::cPlayerState_WeaponMelee(cInit *apInit, cPlayer *apPlayer) : iPlayerState(apInit, apPlayer, ePlayerState_WeaponMelee) { mfLastForward = 1.0f; mfLastSideways = 1.0f; } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnUpdate(float afTimeStep) { if (mpInit->mpNotebook->IsActive() == false && mpInit->mpInventory->IsActive() == false && mpInit->mpNumericalPanel->IsActive() == false && mpInit->mpDeathMenu->IsActive() == false) { mpPlayer->ResetCrossHairPos(); } ///////////////////////////////////// // If run is down, run!! cInput *pInput = mpInit->mpGame->GetInput(); if (pInput->IsTriggerd("Run") && mpPlayer->GetMoveState() == ePlayerMoveState_Walk) { mpPlayer->ChangeMoveState(ePlayerMoveState_Run); } ///////////////////////////////////////////////// // Cast ray to see if anything is picked. iPhysicsWorld *pPhysicsWorld = mpInit->mpGame->GetScene()->GetWorld3D()->GetPhysicsWorld(); cVector3f vStart, vEnd; vStart = mpPlayer->GetCamera()->GetPosition(); vEnd = vStart + mpPlayer->GetCamera()->GetForward() * mpPlayer->GetPickRay()->mfMaxDistance; mpPlayer->GetPickRay()->Clear(); pPhysicsWorld->CastRay(mpPlayer->GetPickRay(), vStart, vEnd, true, false, true); mpPlayer->GetPickRay()->CalculateResults(); if (mpPlayer->GetPickedBody() && mpHudWeapon->IsAttacking() == false) { iGameEntity *pEntity = (iGameEntity *)mpPlayer->GetPickedBody()->GetUserData(); // Set cross hair state eCrossHairState CrossState = pEntity->GetPickCrossHairState(mpPlayer->GetPickedBody()); if (CrossState != eCrossHairState_None && pEntity->GetDescription() != _W("") && !pEntity->GetHasBeenExamined()) { mpPlayer->SetCrossHairState(eCrossHairState_Examine); } else { mpPlayer->SetCrossHairState(eCrossHairState_None); } // Call entity // pEntity->PlayerPick(); } else { mpPlayer->SetCrossHairState(eCrossHairState_None); } // Quick fix but works, the OnLeave of the previous states sets an old cross hair state. // mpPlayer->SetCrossHairState(eCrossHairState_None); } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnDraw() { } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnPostSceneDraw() { mpHudWeapon->PostSceneDraw(); } //----------------------------------------------------------------------- bool cPlayerState_WeaponMelee::OnJump() { return true; } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnStartInteractMode() { } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnStartInteract() { mpHudWeapon->OnAttackDown(); } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnStopInteract() { mpHudWeapon->OnAttackUp(); } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnStartExamine() { // mpPlayer->ChangeState(ePlayerState_Normal); if (mpPlayer->GetPickedBody() && mpHudWeapon->IsAttacking() == false) { iGameEntity *pEntity = (iGameEntity *)mpPlayer->GetPickedBody()->GetUserData(); pEntity->PlayerExamine(); } } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnStartHolster() { mpInit->mpPlayer->ChangeState(ePlayerState_Normal); } //----------------------------------------------------------------------- bool cPlayerState_WeaponMelee::OnAddYaw(float afVal) { return mpHudWeapon->OnMouseMove(cVector2f(afVal, 0)); } bool cPlayerState_WeaponMelee::OnAddPitch(float afVal) { return mpHudWeapon->OnMouseMove(cVector2f(0, afVal)); } //----------------------------------------------------------------------- bool cPlayerState_WeaponMelee::OnMoveForwards(float afMul, float afTimeStep) { /*cInput *pInput = mpInit->mpGame->GetInput(); if(pInput->IsTriggerd("Run")) { if(mfLastForward == 0.0f && afMul != 0.0f && mpPlayer->GetCharacterBody()->IsOnGround()) { cVector3f vFwd = mpPlayer->GetCharacterBody()->GetForward(); cVector3f vDir = afMul>0 ? vFwd : vFwd * -1.0f; mpPlayer->GetCharacterBody()->AddForce( vDir * 300 * mpPlayer->GetDefaultMass() + cVector3f(0,200 * mpPlayer->GetDefaultMass() ,0)); } mfLastForward = afMul; return false; } else*/ { mfLastForward = afMul; return true; } } //----------------------------------------------------------------------- bool cPlayerState_WeaponMelee::OnMoveSideways(float afMul, float afTimeStep) { /*cInput *pInput = mpInit->mpGame->GetInput(); if(pInput->IsTriggerd("Run")) { if(mfLastSideways == 0.0f && afMul != 0.0f && mpPlayer->GetCharacterBody()->IsOnGround()) { cVector3f vRight = mpPlayer->GetCharacterBody()->GetRight(); cVector3f vDir = afMul>0 ? vRight : vRight * -1.0f; mpPlayer->GetCharacterBody()->AddForce( vDir * 400 * mpPlayer->GetDefaultMass() + cVector3f(0,200 * mpPlayer->GetDefaultMass() ,0)); } mfLastSideways = afMul; return false; } else*/ { mfLastSideways = afMul; return true; } } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::EnterState(iPlayerState *apPrevState) { // get the callback /*mpWeaponCallback = mpPlayer->GetWeaponCallback(); if(mpWeaponCallback==NULL) { Error("No weapon callback for player weapon state!\n"); mpPlayer->ChangeState(ePlayerState_Normal); } //Load the data cCamera3D *pCamera = mpPlayer->GetCamera(); cWorld3D *pWorld = mpInit->mpGame->GetScene()->GetWorld3D(); cResources *pResources = mpInit->mpGame->GetResources(); cMesh* pMesh = pResources->GetMeshManager()->CreateMesh(mpWeaponCallback->GetModelFile().c_str()); if(pMesh==NULL) { Error("Couldn't load mesh %s for player weapon state!\n",mpWeaponCallback->GetModelFile().c_str()); mpPlayer->ChangeState(ePlayerState_Normal); } mpMeshEntity = pWorld->CreateMeshEntity("Weapon",pMesh); m_mtxOffset = mpWeaponCallback->GetOffsetMatrix(); mpMeshEntity->SetMatrix(cMath::MatrixMul(cMath::MatrixInverse(pCamera->GetViewMatrix()),m_mtxOffset)); mpMeshEntity->SetPosition(pCamera->GetPosition() + pCamera->GetForward()); mpPlayer->SetCrossHairState(eCrossHairState_None);*/ // Try not doing this. // mpPlayer->GetGlowStick()->SetActive(false); } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::LeaveState(iPlayerState *apNextState) { if (apNextState->mType != ePlayerState_Message && apNextState->mType != ePlayerState_Throw && mpInit->mpPlayerHands->GetCurrentModel(1) == mpHudWeapon) { mpInit->mpPlayerHands->SetCurrentModel(1, ""); } } //----------------------------------------------------------------------- // No running when you have a weapon: void cPlayerState_WeaponMelee::OnStartRun() { if (mpPlayer->GetMoveState() == ePlayerMoveState_Walk) mpPlayer->ChangeMoveState(ePlayerMoveState_Run); if (mpPlayer->GetMoveState() == ePlayerMoveState_Jump) { mpPlayer->SetPrevMoveState(ePlayerMoveState_Run); } } void cPlayerState_WeaponMelee::OnStopRun() { if (mpPlayer->GetMoveState() == ePlayerMoveState_Run) mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); else if (mpPlayer->GetMoveState() == ePlayerMoveState_Jump) mpPlayer->SetPrevMoveState(ePlayerMoveState_Walk); } //----------------------------------------------------------------------- void cPlayerState_WeaponMelee::OnStartCrouch() { if (mpPlayer->GetMoveState() == ePlayerMoveState_Jump) return; if (mpInit->mpButtonHandler->GetToggleCrouch()) { if (mpPlayer->GetMoveState() == ePlayerMoveState_Crouch) mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); else mpPlayer->ChangeMoveState(ePlayerMoveState_Crouch); } else { mpPlayer->ChangeMoveState(ePlayerMoveState_Crouch); } } void cPlayerState_WeaponMelee::OnStopCrouch() { if (mpPlayer->GetMoveState() == ePlayerMoveState_Crouch && mpInit->mpButtonHandler->GetToggleCrouch() == false) { mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); } } //----------------------------------------------------------------------- bool cPlayerState_WeaponMelee::OnStartInventory() { // mpPlayer->ChangeState(ePlayerState_Normal); return true; } //----------------------------------------------------------------------- bool cPlayerState_WeaponMelee::OnStartInventoryShortCut(int alNum) { return true; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // WEAPON STATE ////////////////////////////////////////////////////////////////////////// /*class cPlayerState_Weapon : public iPlayerState { public: iPlayerWeaponCallback *mpWeaponCallback; cMatrixf m_mtxOffset; cMeshEntity *mpMeshEntity; cVector3f mvPosition; cPlayerState_Weapon(cInit *apInit,cPlayer *apPlayer) : iPlayerState(apInit,apPlayer,ePlayerState_Weapon) { mvPosition = cVector3f(0.13f, -0.16f, 0.2f); } //----------------------------------------------------------------------- void OnUpdate(float afTimeStep) { //Quick fix but works, the OnLeave of the previous states sets an old cross hair state. mpPlayer->SetCrossHairState(eCrossHairState_None); cCamera3D *pCamera = mpPlayer->GetCamera(); cMatrixf mtxInv = cMath::MatrixInverse(pCamera->GetViewMatrix()); mpMeshEntity->SetMatrix(cMath::MatrixMul(mtxInv,m_mtxOffset)); cVector3f vLocalPos = mvPosition + cVector3f(0,-mpPlayer->GetHeadMove()->GetPos()*0.1f,0); cVector3f vPos = pCamera->GetForward() * vLocalPos.z + pCamera->GetUp() * vLocalPos.y + pCamera->GetRight() * vLocalPos.x; mpMeshEntity->SetPosition(pCamera->GetPosition() + vPos); } //----------------------------------------------------------------------- void OnDraw() { } //----------------------------------------------------------------------- void OnPostSceneDraw() { } //----------------------------------------------------------------------- bool OnJump() { return true; } //----------------------------------------------------------------------- void OnStartInteractMode() { //Do nothing } //----------------------------------------------------------------------- void OnStartInteract() { mpWeaponCallback->OnAttackDown(); } //----------------------------------------------------------------------- void OnStopInteract() { mpWeaponCallback->OnAttackUp(); } //----------------------------------------------------------------------- void OnStartExamine() { mpPlayer->ChangeState(ePlayerState_Normal); } //----------------------------------------------------------------------- bool OnAddYaw(float afVal) { return true; } bool OnAddPitch(float afVal) { return true; } //----------------------------------------------------------------------- bool OnMoveForwards(float afMul, float afTimeStep) { return true; } //----------------------------------------------------------------------- bool OnMoveSideways(float afMul, float afTimeStep) { return true; } //----------------------------------------------------------------------- void EnterState(iPlayerState* apPrevState) { //get the callback mpWeaponCallback = mpPlayer->GetWeaponCallback(); if(mpWeaponCallback==NULL) { Error("No weapon callback for player weapon state!\n"); mpPlayer->ChangeState(ePlayerState_Normal); } //Load the data cCamera3D *pCamera = mpPlayer->GetCamera(); cWorld3D *pWorld = mpInit->mpGame->GetScene()->GetWorld3D(); cResources *pResources = mpInit->mpGame->GetResources(); cMesh* pMesh = pResources->GetMeshManager()->CreateMesh(mpWeaponCallback->GetModelFile().c_str()); if(pMesh==NULL) { Error("Couldn't load mesh %s for player weapon state!\n",mpWeaponCallback->GetModelFile().c_str()); mpPlayer->ChangeState(ePlayerState_Normal); } mpMeshEntity = pWorld->CreateMeshEntity("Weapon",pMesh); m_mtxOffset = mpWeaponCallback->GetOffsetMatrix(); mpMeshEntity->SetMatrix(cMath::MatrixMul(cMath::MatrixInverse(pCamera->GetViewMatrix()),m_mtxOffset)); mpMeshEntity->SetPosition(pCamera->GetPosition() + pCamera->GetForward()); mpPlayer->SetCrossHairState(eCrossHairState_None); //Try not doing this. //mpPlayer->GetGlowStick()->SetActive(false); } //----------------------------------------------------------------------- void LeaveState(iPlayerState* apNextState) { cWorld3D *pWorld = mpInit->mpGame->GetScene()->GetWorld3D(); pWorld->DestroyMeshEntity(mpMeshEntity); //Skipping this... //mpPlayer->SetWeaponCallback(NULL); } //----------------------------------------------------------------------- // No running when you have a weapon: void OnStartRun() { //if(mpPlayer->GetMoveState() == ePlayerMoveState_Walk) // mpPlayer->ChangeMoveState(ePlayerMoveState_Run); } void OnStopRun() { //if(mpPlayer->GetMoveState() == ePlayerMoveState_Run) // mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); //else if(mpPlayer->GetMoveState() == ePlayerMoveState_Jump) // mpPlayer->SetPrevMoveState(ePlayerMoveState_Walk); } //----------------------------------------------------------------------- void OnStartCrouch() { if(mpPlayer->GetMoveState() == ePlayerMoveState_Jump)return; if(mpInit->mpButtonHandler->GetToggleCrouch()) { if(mpPlayer->GetMoveState() == ePlayerMoveState_Crouch) mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); else mpPlayer->ChangeMoveState(ePlayerMoveState_Crouch); } else { mpPlayer->ChangeMoveState(ePlayerMoveState_Crouch); } } void OnStopCrouch() { if(mpInit->mpButtonHandler->GetToggleCrouch()==false) { mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); } } //----------------------------------------------------------------------- bool OnStartInventory() { mpPlayer->ChangeState(ePlayerState_Normal); return true; } //----------------------------------------------------------------------- bool OnStartInventoryShortCut(int alNum) { return false; } //----------------------------------------------------------------------- };*/