/* * 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 "StdAfx.h" #include "PlayerState_MiscHaptX.h" #include "Init.h" #include "Player.h" #include "EffectHandler.h" #include "GameLadder.h" #include "MapHandler.h" #include "HapticGameCamera.h" ////////////////////////////////////////////////////////////////////////// // NORMAL STATE ////////////////////////////////////////////////////////////////////////// cPlayerState_NormalHaptX::cPlayerState_NormalHaptX(cInit *apInit,cPlayer *apPlayer) : iPlayerState(apInit,apPlayer,ePlayerState_Normal) { } //----------------------------------------------------------------------- cVector3f gvStart,gvEnd; cVector3f gvFinalStart=0,gvFinalEnd=0; void cPlayerState_NormalHaptX::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. mpPlayer->mbProxyTouching = false; mpPlayer->GetPickRay()->mpPickedBody = NULL; cVector3f vProxyPos = mpInit->mpGame->GetHaptic()->GetLowLevel()->GetProxyPosition(); mpPlayer->GetPickRay()->mvPickedPos = vProxyPos; mpPlayer->GetPickRay()->mfPickedDist = cMath::Vector3Dist(vProxyPos,mpPlayer->GetCamera()->GetPosition()); cPortalContainer *pCont = mpInit->mpGame->GetScene()->GetWorld3D()->GetPortalContainer(); iPhysicsWorld *pPhysicsWorld =mpInit->mpGame->GetScene()->GetWorld3D()->GetPhysicsWorld(); cBoundingVolume bv; bv.SetSize(mpPlayer->GetHapticCamera()->GetHandReachRadius()*2); bv.SetPosition(vProxyPos); cCollideData collideData; collideData.SetMaxSize(1); cPortalContainerEntityIterator it = pCont->GetEntityIterator(&bv); iGameEntity *pPickedEntity = NULL; eGameEntityType pickedType = eGameEntityType_LastEnum; while(it.HasNext()) { iPhysicsBody *pBody = static_cast(it.Next()); if(pBody->GetUserData()==NULL) continue; if(cMath::CheckCollisionBV(bv, *pBody->GetBV())==false) continue; iGameEntity *pEntity = (iGameEntity*)pBody->GetUserData(); eGameEntityType type = pEntity->GetType(); ////////////////////////////////////// //TODO: Sort out more unwanted entites here (areas etc?) //If Item is picked, skip all else if(pickedType == eGameEntityType_Item && type != eGameEntityType_Item) continue; //Non moveable if(pBody->GetMass()==0) continue; //Static if(pEntity->GetType() == eGameEntityType_Object) { cGameObject *pObject = static_cast(pEntity); if(pObject->GetInteractMode() == eObjectInteractMode_Static) continue; } //more checks... //////////////////////////////////// // Collision check if(pPhysicsWorld->CheckShapeCollision( mpPlayer->GetHapticCamera()->GetHandShape(), cMath::MatrixTranslate(vProxyPos), pBody->GetShape(), pBody->GetWorldMatrix(), collideData,1)) { pickedType = type; mpPlayer->mbProxyTouching = true; mpPlayer->GetPickRay()->mpPickedBody = pBody; if(pickedType == eGameEntityType_Item) break; } } //////////////////////////////////// // Cross hair and pick check if(mpPlayer->GetPickRay()->mpPickedBody) { iGameEntity *pEntity = (iGameEntity*)mpPlayer->GetPickedBody()->GetUserData(); //Set cross hair state eCrossHairState CrossState = pEntity->GetPickCrossHairState(mpPlayer->GetPickedBody()); if( CrossState == eCrossHairState_Active || CrossState == eCrossHairState_Examine) { mpPlayer->SetCrossHairState(CrossState); } else { mpPlayer->SetCrossHairState(eCrossHairState_None); } //Call entity pEntity->PlayerPick(); } ///////////////////////////////////////////////// // Ray Check, if a body is not yet picked if(mpPlayer->GetPickRay()->mpPickedBody==NULL) { cVector3f vStart,vEnd; vStart = mpPlayer->GetCamera()->GetPosition(); vEnd = vStart + cMath::Vector3Normalize(vProxyPos - vStart) * mpPlayer->GetPickRay()->mfMaxDistance; //gvEnd = vEnd; gvStart = vStart; mpPlayer->GetPickRay()->Clear(); pPhysicsWorld->CastRay(mpPlayer->GetPickRay(),vStart,vEnd,true,false,true); mpPlayer->GetPickRay()->CalculateResults(); //Log("Picked body: %d\n",(size_t)mpPlayer->GetPickedBody()); if(mpPlayer->GetPickedBody()) { iGameEntity *pEntity = (iGameEntity*)mpPlayer->GetPickedBody()->GetUserData(); //Set cross hair state eCrossHairState CrossState = pEntity->GetPickCrossHairState(mpPlayer->GetPickedBody()); //TODO: Check here if it is some non physical interaction. if( //CrossState == eCrossHairState_Active || Skip active here... CrossState == eCrossHairState_Examine) { mpPlayer->SetCrossHairState(CrossState); if(CrossState == eCrossHairState_Active) { if( ( pEntity->GetType() == eGameEntityType_Object && pEntity->GetCallbackScript(eGameEntityScriptType_PlayerInteract)==NULL) ) { mpPlayer->SetCrossHairState(eCrossHairState_None); } } } else { mpPlayer->SetCrossHairState(eCrossHairState_None); } //Call entity pEntity->PlayerPick(); } else { mpPlayer->SetCrossHairState(eCrossHairState_None); } } } //----------------------------------------------------------------------- void cPlayerState_NormalHaptX::OnStartInteract() { //gvFinalEnd = gvEnd; //gvFinalStart = gvStart; if(mpPlayer->GetPickedBody()) { iGameEntity *pEntity = (iGameEntity*)mpPlayer->GetPickedBody()->GetUserData(); pEntity->PlayerInteract(); } } //----------------------------------------------------------------------- void cPlayerState_NormalHaptX::OnStartExamine() { //Log("Picked body: %d\n",(size_t)mpPlayer->GetPickedBody()); if(mpPlayer->GetPickedBody()) { iGameEntity *pEntity = (iGameEntity*)mpPlayer->GetPickedBody()->GetUserData(); pEntity->PlayerExamine(); } } //----------------------------------------------------------------------- void cPlayerState_NormalHaptX::OnStartRun() { if( mpPlayer->GetMoveState() == ePlayerMoveState_Walk || mpPlayer->GetMoveState() == ePlayerMoveState_Crouch) { mpPlayer->ChangeMoveState(ePlayerMoveState_Run); } if( mpPlayer->GetMoveState() == ePlayerMoveState_Jump) { mpPlayer->SetPrevMoveState(ePlayerMoveState_Run); } } void cPlayerState_NormalHaptX::OnStopRun() { if(mpPlayer->GetMoveState() == ePlayerMoveState_Run) mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); else if(mpPlayer->GetMoveState() == ePlayerMoveState_Jump) mpPlayer->SetPrevMoveState(ePlayerMoveState_Walk); } //----------------------------------------------------------------------- void cPlayerState_NormalHaptX::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_NormalHaptX::OnStopCrouch() { if( mpPlayer->GetMoveState() == ePlayerMoveState_Crouch && mpInit->mpButtonHandler->GetToggleCrouch()==false) { mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); } } //----------------------------------------------------------------------- void cPlayerState_NormalHaptX::OnStartInteractMode() { mpPlayer->ChangeState(ePlayerState_InteractMode); } //----------------------------------------------------------------------- void cPlayerState_NormalHaptX::EnterState(iPlayerState* apPrevState) { mpPlayer->ResetCrossHairPos(); } //----------------------------------------------------------------------- void cPlayerState_NormalHaptX::LeaveState(iPlayerState* apNextState) { //Can cause crashes!! //mpPlayer->GetPickRay()->mpPickedBody = NULL; } void cPlayerState_NormalHaptX::OnPostSceneDraw() { /*iLowLevelGraphics *pLowGfx = mpInit->mpGame->GetGraphics()->GetLowLevel(); pLowGfx->DrawLine( gvFinalStart,gvFinalEnd,cColor(1,1)); pLowGfx->DrawSphere(gvFinalStart,0.1f,cColor(1,0,0,1)); pLowGfx->DrawSphere(gvFinalEnd,0.1f,cColor(0,1,0,1));*/ } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // INTERACT MODE STATE ////////////////////////////////////////////////////////////////////////// cPlayerState_InteractModeHaptX::cPlayerState_InteractModeHaptX(cInit *apInit,cPlayer *apPlayer) : iPlayerState(apInit,apPlayer,ePlayerState_InteractMode) { mvLookSpeed =0; mfRange = 15.0f; } //----------------------------------------------------------------------- void cPlayerState_InteractModeHaptX::OnUpdate(float afTimeStep) { ///////////////////////////////////////////////// // Cast ray to see if anything is picked. iPhysicsWorld *pPhysicsWorld = mpInit->mpGame->GetScene()->GetWorld3D()->GetPhysicsWorld(); cVector3f vStart,vEnd; cVector3f vDir = mpPlayer->GetCamera()->UnProject( mpPlayer->GetCrossHairPos(), mpInit->mpGame->GetGraphics()->GetLowLevel()); vStart = mpPlayer->GetCamera()->GetPosition(); vEnd = vStart + vDir * mpPlayer->GetPickRay()->mfMaxDistance; mpPlayer->GetPickRay()->Clear(); pPhysicsWorld->CastRay(mpPlayer->GetPickRay(),vStart,vEnd,true,false,true); //LogUpdate(" Calc pickray results\n"); mpPlayer->GetPickRay()->CalculateResults(); //LogUpdate(" Use picked body\n"); if(mpPlayer->GetPickedBody()) { iGameEntity *pEntity = (iGameEntity*)mpPlayer->GetPickedBody()->GetUserData(); eCrossHairState CrossState = pEntity->GetPickCrossHairState(mpPlayer->GetPickedBody()); if(CrossState == eCrossHairState_None) mpPlayer->SetCrossHairState(eCrossHairState_Inactive); else mpPlayer->SetCrossHairState(CrossState); pEntity->PlayerPick(); } else { mpPlayer->SetCrossHairState(eCrossHairState_Inactive); } } //----------------------------------------------------------------------- void cPlayerState_InteractModeHaptX::OnStartInteract() { if(mpPlayer->GetPickedBody()) { iGameEntity *pEntity = (iGameEntity*)mpPlayer->GetPickedBody()->GetUserData(); pEntity->PlayerInteract(); } } //----------------------------------------------------------------------- void cPlayerState_InteractModeHaptX::OnStartExamine() { if(mpPlayer->GetPickedBody()) { iGameEntity *pEntity = (iGameEntity*)mpPlayer->GetPickedBody()->GetUserData(); pEntity->PlayerExamine(); } } //----------------------------------------------------------------------- bool cPlayerState_InteractModeHaptX::OnAddYaw(float afVal) { /*cInput *pInput = mpInit->mpGame->GetInput(); if(pInput->IsTriggerd("LookMode")) { mpPlayer->GetCamera()->AddYaw( -afVal * 2.0f * mpPlayer->GetLookSpeed()); mpPlayer->GetCharacterBody()->SetYaw(mpPlayer->GetCamera()->GetYaw()); } else { if(mpPlayer->AddCrossHairPos(cVector2f(afVal * 800.0f,0))) { mpPlayer->GetCamera()->AddYaw( -afVal * mpPlayer->GetLookSpeed()); mpPlayer->GetCharacterBody()->SetYaw(mpPlayer->GetCamera()->GetYaw()); } cVector2f vBorder = mpPlayer->GetInteractMoveBorder(); cVector2f vPos = mpPlayer->GetCrossHairPos(); if(vPos.x < vBorder.x + mfRange || vPos.x > (799 - vBorder.x - mfRange)) { float fDist; if(vPos.x < vBorder.x + mfRange) { fDist = (vPos.x - vBorder.x); mvLookSpeed.x = 1 - (fDist / mfRange) * 1; } else { fDist = ((799 - vBorder.x) - vPos.x); mvLookSpeed.x = (1-(fDist / mfRange)) * -1; } } else { mvLookSpeed.x =0; } } return false;*/ return true; } bool cPlayerState_InteractModeHaptX::OnAddPitch(float afVal) { /*cInput *pInput = mpInit->mpGame->GetInput(); if(pInput->IsTriggerd("LookMode")) { float fInvert = mpInit->mpButtonHandler->GetInvertMouseY() ? -1.0f : 1.0f; mpPlayer->GetCamera()->AddPitch( -afVal *2.0f*fInvert * mpPlayer->GetLookSpeed()); } else { if(mpPlayer->AddCrossHairPos(cVector2f(0,afVal * 600.0f))) { mpPlayer->GetCamera()->AddPitch( -afVal * mpPlayer->GetLookSpeed()); } cVector2f vBorder = mpPlayer->GetInteractMoveBorder(); cVector2f vPos = mpPlayer->GetCrossHairPos(); if(vPos.y < vBorder.y + mfRange || vPos.y > (599 - vBorder.y - mfRange)) { float fDist; if(vPos.y < vBorder.y + mfRange) { fDist = (vPos.y - vBorder.y); mvLookSpeed.y = 1 - (fDist / mfRange) * 1; } else { fDist = ((599 - vBorder.y) - vPos.y); mvLookSpeed.y = (1-(fDist / mfRange)) * -1; } } else { mvLookSpeed.y =0; } } return false;*/ return true; } //----------------------------------------------------------------------- void cPlayerState_InteractModeHaptX::OnStartInteractMode() { mpPlayer->ChangeState(ePlayerState_Normal); } //----------------------------------------------------------------------- void cPlayerState_InteractModeHaptX::EnterState(iPlayerState* apPrevState) { mPrevMoveState = mpPlayer->GetMoveState(); if(mpPlayer->GetMoveState() == ePlayerMoveState_Run) mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); mvLookSpeed =0; } //----------------------------------------------------------------------- void cPlayerState_InteractModeHaptX::LeaveState(iPlayerState* apNextState) { /*if(mPrevMoveState != ePlayerMoveState_Run) mpPlayer->ChangeMoveState(mPrevMoveState); else mpPlayer->ChangeMoveState(ePlayerMoveState_Walk);*/ if(apNextState->mType == ePlayerState_Normal) mpPlayer->ResetCrossHairPos(); //Can cause crashes!! //mpPlayer->GetPickRay()->mpPickedBody = NULL; } //----------------------------------------------------------------------- void cPlayerState_InteractModeHaptX::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_InteractModeHaptX::OnStopCrouch() { if( mpPlayer->GetMoveState() == ePlayerMoveState_Crouch && mpInit->mpButtonHandler->GetToggleCrouch()==false) { mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); } } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // USE ITEM STATE ////////////////////////////////////////////////////////////////////////// cPlayerState_UseItemHaptX::cPlayerState_UseItemHaptX(cInit *apInit,cPlayer *apPlayer) : iPlayerState(apInit,apPlayer,ePlayerState_UseItem) { } //----------------------------------------------------------------------- void cPlayerState_UseItemHaptX::OnUpdate(float afTimeStep) { iLowLevelHaptic *pLowLevelHaptic = mpInit->mpGame->GetHaptic()->GetLowLevel(); ///////////////////////////////////////////////// // Move cross hair cVector2f vCrossPos = pLowLevelHaptic->GetProxyScreenPos(cVector2f(800,600)); mpPlayer->SetCrossHairPos(vCrossPos); ///////////////////////////////////////////////// // Cast ray to see if anything is picked. iPhysicsWorld *pPhysicsWorld = mpInit->mpGame->GetScene()->GetWorld3D()->GetPhysicsWorld(); cVector3f vStart,vEnd; cVector3f vDir = mpPlayer->GetCamera()->UnProject( mpPlayer->GetCrossHairPos(), mpInit->mpGame->GetGraphics()->GetLowLevel()); vStart = mpPlayer->GetCamera()->GetPosition(); vEnd = vStart + vDir * mpPlayer->GetPickRay()->mfMaxDistance; mpPlayer->GetPickRay()->Clear(); pPhysicsWorld->CastRay(mpPlayer->GetPickRay(),vStart,vEnd,true,false,true); mpPlayer->GetPickRay()->CalculateResults(); iPhysicsBody *pBody = mpPlayer->GetPickedBody(); iGameEntity *pEntity = NULL; if(pBody) pEntity = (iGameEntity*)pBody->GetUserData(); if(pEntity && mpPlayer->GetPickedDist() <= pEntity->GetMaxInteractDist()) { mpInit->mpPlayer->SetItemFlash(true); } else { mpInit->mpPlayer->SetItemFlash(false); } } //----------------------------------------------------------------------- void cPlayerState_UseItemHaptX::OnStartInteract() { iPhysicsBody *pBody = mpPlayer->GetPickedBody(); iGameEntity *pEntity = NULL; if(pBody) pEntity = (iGameEntity*)pBody->GetUserData(); if(pEntity && mpPlayer->GetPickedDist() <= pEntity->GetMaxExamineDist()) { if( mpPlayer->GetPickedDist() <= pEntity->GetMaxInteractDist()) { iGameEntity *pEntity = (iGameEntity*)mpPlayer->GetPickedBody()->GetUserData(); cGameItemType *pType = mpInit->mpInventory->GetItemType(mpPlayer->GetCurrentItem()->GetItemType()); if( mPrevState == ePlayerState_WeaponMelee || mPrevState == ePlayerState_Throw) { mpPlayer->ChangeState(ePlayerState_Normal); } else { mpPlayer->ChangeState(mPrevState); } pType->OnUse(mpPlayer->GetCurrentItem(), pEntity); } else { mpInit->mpEffectHandler->GetSubTitle()->Add(kTranslate("Player", "UseItemTooFar"),2.0f,true); return; } } else { if( mPrevState == ePlayerState_WeaponMelee || mPrevState == ePlayerState_Throw) { mpPlayer->ChangeState(ePlayerState_Normal); } else { mpPlayer->ChangeState(mPrevState); } } } //----------------------------------------------------------------------- void cPlayerState_UseItemHaptX::OnStartExamine() { if(mpPlayer->GetPickedBody()) { iGameEntity *pEntity = (iGameEntity*)mpPlayer->GetPickedBody()->GetUserData(); if(mpPlayer->GetPickedDist() <= pEntity->GetMaxExamineDist()) { pEntity->PlayerExamine(); } } else { if( mPrevState == ePlayerState_WeaponMelee || mPrevState == ePlayerState_Throw) { mpPlayer->ChangeState(ePlayerState_Normal); } else { mpPlayer->ChangeState(mPrevState); } } } //----------------------------------------------------------------------- bool cPlayerState_UseItemHaptX::OnAddYaw(float afVal) { cInput *pInput = mpInit->mpGame->GetInput(); if(pInput->IsTriggerd("LookMode")) { mpPlayer->GetCamera()->AddYaw( -afVal * 2.0f * mpPlayer->GetLookSpeed()); mpPlayer->GetCharacterBody()->SetYaw(mpPlayer->GetCamera()->GetYaw()); } else if(mpPlayer->AddCrossHairPos(cVector2f(afVal * 800.0f,0))) { mpPlayer->GetCamera()->AddYaw( -afVal * mpPlayer->GetLookSpeed()); mpPlayer->GetCharacterBody()->SetYaw(mpPlayer->GetCamera()->GetYaw()); } return false; } bool cPlayerState_UseItemHaptX::OnAddPitch(float afVal) { cInput *pInput = mpInit->mpGame->GetInput(); if(pInput->IsTriggerd("LookMode")) { float fInvert = mpInit->mpButtonHandler->GetInvertMouseY() ? -1.0f : 1.0f; mpPlayer->GetCamera()->AddPitch( -afVal *2.0f*fInvert * mpPlayer->GetLookSpeed()); } else if(mpPlayer->AddCrossHairPos(cVector2f(0,afVal * 600.0f))) { mpPlayer->GetCamera()->AddPitch( -afVal * mpPlayer->GetLookSpeed()); } return false; } //----------------------------------------------------------------------- void cPlayerState_UseItemHaptX::EnterState(iPlayerState* apPrevState) { mPrevMoveState = mpPlayer->GetMoveState(); mPrevState = apPrevState->mType; mpPlayer->SetCrossHairState(eCrossHairState_Item); mpPlayer->GetHapticCamera()->SetHandVisible(false); } //----------------------------------------------------------------------- void cPlayerState_UseItemHaptX::LeaveState(iPlayerState* apNextState) { mpPlayer->SetCrossHairState(eCrossHairState_None); mpPlayer->GetHapticCamera()->SetHandVisible(true); } //----------------------------------------------------------------------- void cPlayerState_UseItemHaptX::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_UseItemHaptX::OnStopCrouch() { if( mpPlayer->GetMoveState() == ePlayerMoveState_Crouch && mpInit->mpButtonHandler->GetToggleCrouch()==false) { mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); } } //----------------------------------------------------------------------- bool cPlayerState_UseItemHaptX::OnStartInventory() { mpPlayer->ChangeState(mPrevState); return true; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // MESSAGE STATE ////////////////////////////////////////////////////////////////////////// cPlayerState_MessageHaptX::cPlayerState_MessageHaptX(cInit *apInit,cPlayer *apPlayer) : iPlayerState(apInit,apPlayer,ePlayerState_Message) { } //----------------------------------------------------------------------- void cPlayerState_MessageHaptX::OnUpdate(float afTimeStep) { } //----------------------------------------------------------------------- bool cPlayerState_MessageHaptX::OnJump() { return false; } //----------------------------------------------------------------------- void cPlayerState_MessageHaptX::OnStartInteract() { mpInit->mpGameMessageHandler->ShowNext(); } void cPlayerState_MessageHaptX::OnStopInteract() { } //----------------------------------------------------------------------- void cPlayerState_MessageHaptX::OnStartExamine() { mpInit->mpGameMessageHandler->ShowNext(); } //----------------------------------------------------------------------- bool cPlayerState_MessageHaptX::OnMoveForwards(float afMul, float afTimeStep){ return false;} bool cPlayerState_MessageHaptX::OnMoveSideways(float afMul, float afTimeStep){ return false;} //----------------------------------------------------------------------- bool cPlayerState_MessageHaptX::OnAddYaw(float afVal){ return false;} bool cPlayerState_MessageHaptX::OnAddPitch(float afVal){return false;} //----------------------------------------------------------------------- void cPlayerState_MessageHaptX::EnterState(iPlayerState* apPrevState) { //Change move state so the player is still mPrevMoveState = mpPlayer->GetMoveState(); //mpPlayer->ChangeMoveState(ePlayerMoveState_Still); mpPlayer->SetCrossHairState(eCrossHairState_None); mpPlayer->GetHapticCamera()->SetHandVisible(false); mpPlayer->GetHapticCamera()->SetRenderActive(false); } //----------------------------------------------------------------------- void cPlayerState_MessageHaptX::LeaveState(iPlayerState* apNextState) { if(mPrevMoveState != ePlayerMoveState_Run && mPrevMoveState !=ePlayerMoveState_Jump) mpPlayer->ChangeMoveState(mPrevMoveState); else mpPlayer->ChangeMoveState(ePlayerMoveState_Walk); mpPlayer->GetHapticCamera()->SetHandVisible(true); mpPlayer->GetHapticCamera()->SetRenderActive(true); } //----------------------------------------------------------------------- bool cPlayerState_MessageHaptX::OnStartInventory() { return false; } //----------------------------------------------------------------------- bool cPlayerState_MessageHaptX::OnStartInventoryShortCut(int alNum) { return false; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // CLIMB STATE ////////////////////////////////////////////////////////////////////////// cPlayerState_ClimbHaptX::cPlayerState_ClimbHaptX(cInit *apInit,cPlayer *apPlayer) : iPlayerState(apInit,apPlayer,ePlayerState_Climb) { mpLadder = NULL; mfUpSpeed = mpInit->mpGameConfig->GetFloat("Movement_Climb","UpSpeed",0); mfDownSpeed = mpInit->mpGameConfig->GetFloat("Movement_Climb","DownSpeed",0); mfStepLength = mpInit->mpGameConfig->GetFloat("Movement_Climb","StepLength",0); mfStepCount =0; mlState =0; } //----------------------------------------------------------------------- void cPlayerState_ClimbHaptX::PlaySound(const tString &asSound) { if(asSound=="") return; iCharacterBody *pCharBody = mpPlayer->GetCharacterBody(); cWorld3D *pWorld = mpInit->mpGame->GetScene()->GetWorld3D(); cSoundEntity *pSound = pWorld->CreateSoundEntity("LadderStep",asSound,true); if(pSound) pSound->SetPosition(pCharBody->GetPosition()); } //----------------------------------------------------------------------- void cPlayerState_ClimbHaptX::EnterState(iPlayerState* apPrevState) { mpPlayer->SetCrossHairState(eCrossHairState_None); mvPrevPitchLimits = mpPlayer->GetCamera()->GetPitchLimits(); mlState =0; mpPlayer->GetCharacterBody()->SetGravityActive(false); mpPlayer->GetCharacterBody()->SetTestCollision(false); mvGoalPos = mvStartPosition; mvGoalRot.x = 0; mvGoalRot.y = mpLadder->GetStartRotation().y; //Different time if you are above the ladder. float fTime = 0.5f; if(mpPlayer->GetCharacterBody()->GetPosition().y > mpLadder->GetMaxY()) fTime = 1.2f; cVector3f vStartRot; vStartRot.x = mpPlayer->GetCamera()->GetPitch(); vStartRot.y = mpPlayer->GetCamera()->GetYaw(); mvPosAdd = (mvGoalPos - mpPlayer->GetCharacterBody()->GetPosition()) / fTime; mvRotAdd.x = cMath::GetAngleDistance(vStartRot.x, mvGoalRot.x,k2Pif) / fTime; mvRotAdd.y = cMath::GetAngleDistance(vStartRot.y, mvGoalRot.y,k2Pif) / fTime; mvCharPosition = mpPlayer->GetCharacterBody()->GetPosition(); mfTimeCount = fTime; mfStepCount =0; mbPlayedSound = false; //Play Sound PlaySound(mpLadder->GetAttachSound()); //Haptic mpPlayer->GetHapticCamera()->SetRenderActive(false); mpPlayer->GetHapticCamera()->SetType(eHapticGameCameraType_Centre); mpPlayer->GetHapticCamera()->SetHandVisible(false); } //----------------------------------------------------------------------- void cPlayerState_ClimbHaptX::LeaveState(iPlayerState* apNextState) { mpPlayer->SetCrossHairState(eCrossHairState_None); mpPlayer->GetCharacterBody()->SetGravityActive(true); mpPlayer->GetCamera()->SetPitchLimits(mvPrevPitchLimits); mpPlayer->GetCamera()->SetYawLimits(cVector2f(0, 0)); //Haptic mpPlayer->GetHapticCamera()->SetRenderActive(true); mpPlayer->GetHapticCamera()->SetType(eHapticGameCameraType_Frame); mpPlayer->GetHapticCamera()->SetHandVisible(true); } //----------------------------------------------------------------------- void cPlayerState_ClimbHaptX::OnUpdate(float afTimeStep) { iCharacterBody *pCharBody = mpPlayer->GetCharacterBody(); cCamera3D *pCam = mpPlayer->GetCamera(); ////////////////////////////////// // Attach To Ladder if(mlState ==0) { mfTimeCount -= afTimeStep; mvCharPosition += mvPosAdd*afTimeStep; pCharBody->SetPosition(mvCharPosition); mvCharPosition = pCharBody->GetPosition(); pCam->AddPitch(mvRotAdd.x *afTimeStep); pCam->AddYaw(mvRotAdd.y *afTimeStep); pCharBody->SetYaw(pCam->GetYaw()); if(mfTimeCount<=0) { mpPlayer->GetCharacterBody()->SetTestCollision(true); //////////////////////////// //Set turn head limits cVector2f vMaxHeadLimits = cVector2f(cMath::ToRad(120),cMath::ToRad(79)); cVector2f vMinHeadLimits = cVector2f(cMath::ToRad(-120),cMath::ToRad(-60)); float fXmax = pCam->GetYaw() + vMaxHeadLimits.x; float fYmax = pCam->GetPitch() + vMaxHeadLimits.y; float fXmin = pCam->GetYaw() + vMinHeadLimits.x; float fYmin = pCam->GetPitch() + vMinHeadLimits.y; pCam->SetPitchLimits(cVector2f(fYmax, fYmin)); pCam->SetYawLimits(cVector2f(fXmax, fXmin)); mlState++; } } ////////////////////////////////// // Move On Ladder else if(mlState == 1) { } ////////////////////////////////// // On the top of the ladder else if(mlState == 2) { mfLeaveAtTopCount -= afTimeStep; pCharBody->Move(eCharDir_Forward,1,afTimeStep); if(pCharBody->IsOnGround()) { mfLeaveAtTopCount -= afTimeStep; } if(mfLeaveAtTopCount <=0) { mpPlayer->ChangeState(ePlayerState_Normal); } } } //----------------------------------------------------------------------- void cPlayerState_ClimbHaptX::OnStartInteract() { if(mlState!=0) mpPlayer->ChangeState(ePlayerState_Normal); } //----------------------------------------------------------------------- void cPlayerState_ClimbHaptX::OnStartExamine() { if(mlState!=0) mpPlayer->ChangeState(ePlayerState_Normal); } //----------------------------------------------------------------------- bool cPlayerState_ClimbHaptX::OnAddYaw(float afVal) { if(mlState!=0) mpPlayer->GetCamera()->AddYaw( -afVal * mpPlayer->GetLookSpeed()); return false; } bool cPlayerState_ClimbHaptX::OnAddPitch(float afVal) { //if(mlState!=0) // mpPlayer->GetCamera()->AddPitch( -afVal * mpPlayer->GetLookSpeed()); if(mlState==0) return false; else return true; } //----------------------------------------------------------------------- bool cPlayerState_ClimbHaptX::OnMoveForwards(float afMul, float afTimeStep) { if(mlState==0 || mlState==2) return false; iCharacterBody *pCharBody = mpPlayer->GetCharacterBody(); iPhysicsWorld *pWorld = mpInit->mpGame->GetScene()->GetWorld3D()->GetPhysicsWorld(); mvCharPosition = pCharBody->GetPosition(); if(afMul > 0) { mvCharPosition.y += afMul*mfUpSpeed*afTimeStep; if(mfStepCount<0)mfStepCount=0; } else if(afMul < 0) { mvCharPosition.y += afMul*mfDownSpeed*afTimeStep; if(mfStepCount>0)mfStepCount=0; } else { if(!mbPlayedSound) { if(mfStepCount>0) PlaySound(mpLadder->GetClimbUpSound()); if(mfStepCount<0) PlaySound(mpLadder->GetClimbDownSound()); } mfStepCount =0; mbPlayedSound = false; } //Check collision cMatrixf mtxPos = cMath::MatrixTranslate(mvCharPosition); cVector3f vNewPos; pWorld->CheckShapeWorldCollision(&vNewPos,pCharBody->GetShape(),mtxPos, pCharBody->GetBody(),false,true,NULL,true); if(vNewPos != mtxPos.GetTranslation()) { return false; } if(afMul > 0) { mfStepCount += afMul*mfUpSpeed*afTimeStep; if(mfStepCount >= mfStepLength) { mfStepCount =0; PlaySound(mpLadder->GetClimbUpSound()); mbPlayedSound = true; } } else if(afMul < 0) { mfStepCount += afMul*mfDownSpeed*afTimeStep; if(mfStepCount <= -mfStepLength) { mfStepCount =0; PlaySound(mpLadder->GetClimbDownSound()); mbPlayedSound = true; } } else { } pCharBody->SetPosition(mvCharPosition); if((mvCharPosition.y - pCharBody->GetSize().y*0.5f) > mpLadder->GetMaxY()) { //mpPlayer->ChangeState(ePlayerState_Normal); mlState = 2; mfLeaveAtTopCount = 2; mpPlayer->GetCharacterBody()->SetGravityActive(true); } else if((mvCharPosition.y - pCharBody->GetSize().y/2) < mpLadder->GetMinY()) { mpPlayer->ChangeState(ePlayerState_Normal); } return false; } bool cPlayerState_ClimbHaptX::OnMoveSideways(float afMul, float afTimeStep) { iCharacterBody *pCharBody = mpPlayer->GetCharacterBody(); return false; } //----------------------------------------------------------------------- void cPlayerState_ClimbHaptX::OnStartCrouch() { } void cPlayerState_ClimbHaptX::OnStopCrouch() { } //----------------------------------------------------------------------- bool cPlayerState_ClimbHaptX::OnJump() { mpPlayer->ChangeState(ePlayerState_Normal); return true; } //----------------------------------------------------------------------- bool cPlayerState_ClimbHaptX::OnStartInventory() { return false; } //-----------------------------------------------------------------------