/* 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. */ #ifndef GAME_GAME_ENTITY_H #define GAME_GAME_ENTITY_H #include "hpl1/engine/engine.h" using namespace hpl; #include "hpl1/penumbra-overture/GameTypes.h" #include "hpl1/penumbra-overture/SaveTypes.h" class cInit; class iGameEntity; class cInventoryItem; //----------------------------------------- class cGameEntityScript : public iSerializable { kSerializableClassInit(cGameEntityScript) public : cGameEntityScript() : msScriptFunc("") {} int mlNum; tString msScriptFunc; }; typedef Common::StableMap tGameEntityScriptMap; typedef tGameEntityScriptMap::iterator tGameEntityScriptMapIt; //----------------------------------------- typedef Common::StableMap 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 : 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(Common::Array &avBodies) { mvBodies = avBodies; } iPhysicsJoint *GetJoint(int alNum) { return mvJoints[alNum]; } int GetJointNum() { return (int)mvJoints.size(); } void SetJoints(Common::Array &avJoints) { mvJoints = avJoints; } int GetLightNum() { return (int)mvLights.size(); } iLight3D *GetLight(int alX) { return mvLights[alX]; } void SetLights(Common::Array &avLights) { mvLights = avLights; } void SetParticleSystems(Common::Array &avParticleSystems) { mvParticleSystems = avParticleSystems; } void SetBillboards(Common::Array &avBillboards) { mvBillboards = avBillboards; } void SetBeams(Common::Array &avBeams) { mvBeams = avBeams; } void SetSoundEntities(Common::Array &avSoundEntities) { mvSoundEntities = avSoundEntities; } 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; Common::Array mvBodies; Common::Array mvJoints; Common::Array mvLights; Common::Array mvParticleSystems; Common::Array mvBillboards; Common::Array mvBeams; Common::Array mvSoundEntities; bool mbSaveLights; cMeshEntity *mpMeshEntity; Common::Array mvNormalMaterials; Common::Array mvTransMaterials; bool mbTransActive; bool mbTransShadow; cVector3f mvLastImpulse; Common::Array mvPreloadedBreakMeshes; iCharacterBody *mpCharBody; cGameEntityScript *mvCallbackScripts[eGameEntityScriptType_LastEnum]; tGameCollideScriptMap m_mapCollideCallbacks; tGameEntityVarMap m_mapVars; bool mbUpdatingCollisionCallbacks; }; #endif // GAME_GAME_ENTITY_H