/*
* 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 .
*/
#ifndef GAME_GAME_ENTITY_H
#define GAME_GAME_ENTITY_H
#include "StdAfx.h"
using namespace hpl;
#include "GameTypes.h"
#include "SaveTypes.h"
class cInit;
class iGameEntity;
class cInventoryItem;
//-----------------------------------------
class cGameEntityScript : public iSerializable
{
kSerializableClassInit(cGameEntityScript)
public:
cGameEntityScript() : msScriptFunc(""){}
int mlNum;
tString msScriptFunc;
};
typedef std::map tGameEntityScriptMap;
typedef tGameEntityScriptMap::iterator tGameEntityScriptMapIt;
//-----------------------------------------
typedef std::map tGameEntityVarMap;
typedef tGameEntityVarMap::iterator tGameEntityVarMapIt;
//------------------------------------------
class iGameEntity;
//------------------------------------------
class cGameEntityAnimation_SaveData : public iSerializable
{
kSerializableClassInit(cGameEntityAnimation_SaveData)
public:
bool mbActive;
bool mbLoop;
float mfWeight;
float mfFadeStep;
float mfTimePos;
float mfSpeed;
};
//------------------------------------------
class iGameEntity_SaveData : public iSerializable
{
kSerializableClassInit(iGameEntity_SaveData)
public:
virtual ~iGameEntity_SaveData();
bool mbActive;
tString msFileName;
tString msName;
float mfHealth;
float mfMaxExamineDist;
float mfMaxInteractDist;
bool mbHasBeenExamined;
tWString msGameName;
tWString msDescription;
bool mbShowDescritionOnce;
eGameEntityType mType;
cMatrixf m_mtxTransform;
//Engine types
cContainerVec mvBodies;
cContainerVec mvPS;
cContainerVec mvBeams;
cContainerVec mvLights;
cContainerVec mvSounds;
cEnginePS_SaveData* GetParticleSystem(cParticleSystem3D* apPS);
cEngineSound_SaveData* GetSoundEntity(cSoundEntity* apSound);
//Animations
cContainerVec mvAnimations;
//Callbacks
cContainerList mlstCollideCallbacks;
cContainerList mlstCallbackScripts;
//Script variables
cContainerList mlstVars;
//Creation
virtual iGameEntity* CreateEntity()=0;
};
//------------------------------------------
class iGameEntity
{
friend class cPlayer;
public:
iGameEntity(cInit *apInit, const tString &asName);
virtual ~iGameEntity();
const tString& GetName(){ return msName;}
bool IsActive(){ return mbActive;}
void SetActive(bool abX);
virtual void OnSetActive(bool abX){}
virtual bool IsSaved(){ return mbIsSaved;}
virtual void OnWorldLoad(){}
virtual void OnPostLoadScripts(){}
virtual void OnWorldExit(){}
virtual void Update(float afTimeStep){}
virtual void OnDraw(){}
virtual void OnPostSceneDraw(){}
void OnUpdate(float afTimeStep);
eGameEntityType GetType(){ return mType;}
const tString& GetSubType(){ return msSubType;}
void SetDescription(const tWString& asDesc){ msDescription = asDesc;}
const tWString& GetDescription(){ return msDescription;}
void SetShowDescritionOnce(bool abX){mbShowDescritionOnce = abX;}
bool GetShowDescritionOnce(){ return mbShowDescritionOnce;}
bool GetHasBeenExamined(){ return mbHasBeenExamined;}
void SetGameName(const tWString& asName){ msGameName = asName;}
const tWString& GetGameName(){ return msGameName;}
iPhysicsBody *GetBody(int alNum){ return mvBodies[alNum];}
int GetBodyNum(){ return (int)mvBodies.size();}
void SetBodies(std::vector &avBodies){ mvBodies = avBodies;}
iPhysicsJoint *GetJoint(int alNum){ return mvJoints[alNum];}
int GetJointNum(){ return (int)mvJoints.size();}
void SetJoints(std::vector &avJoints){ mvJoints = avJoints;}
int GetLightNum(){ return (int)mvLights.size();}
iLight3D* GetLight(int alX){ return mvLights[alX];}
void SetLights(std::vector &avLights){mvLights = avLights;}
void SetParticleSystems(std::vector &avParticleSystems){mvParticleSystems = avParticleSystems;}
void SetBillboards(std::vector &avBillboards){mvBillboards = avBillboards;}
void SetBeams(std::vector &avBeams){mvBeams = avBeams;}
void SetSoundEntities(std::vector &avSoundEntities){mvSoundEntities = avSoundEntities;}
size_t GetHapticShapeNum(){ return mvHapticShapes.size();}
iHapticShape* GetHapticShape(size_t alNum){ return mvHapticShapes[alNum];}
void SetHapticShapes(std::vector &avShapes){mvHapticShapes = avShapes;}
void DestroyLight(iLight3D *apLight);
void DestroyParticleSystem(cParticleSystem3D* apPS);
void DestroyBillboard(cBillboard* apBillboard);
void SetSoundEntity(cSoundEntity* apSound);
cMeshEntity *GetMeshEntity(){return mpMeshEntity;}
void SetMeshEntity(cMeshEntity *apEnity){mpMeshEntity = apEnity;}
void PlayerPick();
void PlayerInteract();
void PlayerExamine();
virtual void OnPlayerPick(){}
virtual void OnPlayerInteract(){}
virtual void OnPlayerExamine();
virtual bool OnUseItem(cInventoryItem *apItem){return false;}
virtual void BreakAction(){}
virtual void OnDamage(float afDamage){}
virtual void OnDeath(float afDamage){}
virtual void OnPlayerGravityCollide(iCharacterBody *apCharBody, cCollideData *apCollideData){}
bool GetHasInteraction(){ return mbHasInteraction;}
float GetMaxExamineDist(){ return mfMaxExamineDist;}
void SetMaxExamineDist(float afX){ mfMaxExamineDist = afX;}
float GetMaxInteractDist(){ return mfMaxInteractDist;}
void SetMaxInteractDist(float afX){ mfMaxInteractDist = afX;}
virtual eCrossHairState GetPickCrossHairState(iPhysicsBody *apBody);
virtual float GetPickedDistance();
void AddCollideScript(eGameCollideScriptType aType,const tString &asFunc, const tString &asEntity);
void RemoveCollideScript(eGameCollideScriptType aType,const tString &asFunc);
void RemoveCollideScriptWithChildEntity(iGameEntity *apEntity);
void AddScript(eGameEntityScriptType aType,const tString &asFunc);
void RemoveScript(eGameEntityScriptType aType);
void CreateVar(const tString &asName, int alVal);
void SetVar(const tString &asName, int alVal);
void AddVar(const tString &asName, int alVal);
int GetVar(const tString &asName);
void Damage(float afDamage, int alStrength);
float GetHealth(){ return mfHealth;}
void SetHealth(float afHealth);
void SetToughness(int alX){ mlToughness = alX;}
int GetToughness(){ return mlToughness;}
bool GetDestroyMe(){ return mbDestroyMe;}
bool GetBreakMe(){ return mbBreakMe;}
void Break(){ mbBreakMe = true;}
void SetCharBody(iCharacterBody *apCharBody){ mpCharBody = apCharBody;}
iCharacterBody* SetCharBody(){ return mpCharBody;}
void SetUpTransMaterials();
void SetTransActive(bool abX);
void SetPauseControllers(bool abX){ mbPauseControllers = abX;}
bool GetPauseControllers(){ return mbPauseControllers;}
void SetPauseGravity(bool abX){ mbPauseGravity = abX;}
bool GetPauseGravity(){ return mbPauseGravity;}
const cMatrixf& GetOnLoadTransform(){ return m_mtxOnLoadTransform;}
void SetOnLoadTransform(const cMatrixf& a_mtxPose){ m_mtxOnLoadTransform = a_mtxPose;}
void SetLastImpulse(const cVector3f &avVec){ mvLastImpulse = avVec;}
const tString& GetFileName(){ return msFileName;}
cGameEntityScript* GetCallbackScript(eGameEntityScriptType aType) {return mvCallbackScripts[aType];}
//Save data stuff
void SetSaveData(iGameEntity_SaveData *apData){mpSaveData = apData;}
iGameEntity_SaveData *GetSaveData(){ return mpSaveData;}
virtual iGameEntity_SaveData* CreateSaveData()=0;
virtual void LoadFromSaveData(iGameEntity_SaveData* apSaveData);
virtual void SaveToSaveData(iGameEntity_SaveData* apSaveData);
virtual void SetupSaveData(iGameEntity_SaveData *apSaveData);
protected:
tString GetScriptCommand(eGameEntityScriptType aType);
void PreloadModel(const tString &asFile);
cInit *mpInit;
bool mbActive;
tString msFileName;
bool mbIsSaved;
bool mbDestroyMe;
bool mbBreakMe;
bool mbHasInteraction;
bool mbHasBeenExamined;
tString msName;
tString msSubType;
float mfHealth;
int mlToughness;
tWString msGameName;
tWString msDescription;
bool mbShowDescritionOnce;
float mfMaxExamineDist;
float mfMaxInteractDist;
eGameEntityType mType;
bool mbPauseControllers;
bool mbPauseGravity;
cMatrixf m_mtxOnLoadTransform;
iGameEntity_SaveData *mpSaveData;
std::vector mvBodies;
std::vector mvJoints;
std::vector mvHapticShapes;
std::vector mvLights;
std::vector mvParticleSystems;
std::vector mvBillboards;
std::vector mvBeams;
std::vector mvSoundEntities;
bool mbSaveLights;
cMeshEntity *mpMeshEntity;
std::vector mvNormalMaterials;
std::vector mvTransMaterials;
bool mbTransActive;
bool mbTransShadow;
cVector3f mvLastImpulse;
std::vector mvPreloadedBreakMeshes;
iCharacterBody *mpCharBody;
cGameEntityScript *mvCallbackScripts[eGameEntityScriptType_LastEnum];
tGameCollideScriptMap m_mapCollideCallbacks;
tGameEntityVarMap m_mapVars;
bool mbUpdatingCollisionCallbacks;
};
#endif // GAME_GAME_ENTITY_H