/*
* 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_SAVE_HANDLER_H
#define GAME_SAVE_HANDLER_H
#include "StdAfx.h"
using namespace hpl;
class cInit;
#include "GameTypes.h"
#include "SaveTypes.h"
class iGameEntity_SaveData;
//---------------------------------------------
class cMusic_GlobalSave : public iSerializable
{
kSerializableClassInit(cMusic_GlobalSave)
public:
tString msName;
float mfVolume;
bool mbLoop;
};
//---------------------------------------------
class cGameMusic_GlobalSave : public iSerializable
{
kSerializableClassInit(cGameMusic_GlobalSave)
public:
tString msFile;
bool mbLoop;
float mfVolume;
};
class cGameMusicHandler_GlobalSave : public iSerializable
{
kSerializableClassInit(cGameMusicHandler_GlobalSave)
public:
int mlCurrentMaxPrio;
bool mbAttackPlaying;
bool mbEnemyClosePlaying;
cContainerVec mvGameMusic;
};
//---------------------------------------------
class cNotebookTask_GlobalSave : public iSerializable
{
kSerializableClassInit(cNotebookTask_GlobalSave)
public:
tString msName;
tWString msText;
};
class cNotebookNote_GlobalSave : public iSerializable
{
kSerializableClassInit(cNotebookNote_GlobalSave)
public:
tWString msName;
bool mbRead;
tString msTextCat;
tString msTextEntry;
};
class cNotebook_GlobalSave : public iSerializable
{
kSerializableClassInit(cNotebook_GlobalSave)
public:
cContainerList mlstNotes;
cContainerList mlstTasks;
};
//---------------------------------------------
class cInventorySlot_GlobalSave : public iSerializable
{
kSerializableClassInit(cInventorySlot_GlobalSave)
public:
tString msItemName;
};
class cInventoryItem_GlobalSave : public iSerializable
{
kSerializableClassInit(cInventoryItem_GlobalSave)
public:
tString msName;
tWString msGameName;
tWString msDescription;
tString msSubType;
eGameItemType mItemType;
tString msEntityFile;
tString msGfxObjectFile;
tString msHudModelFile;
tString msHudModelName;
bool mbCanBeDropped;
bool mbHasCount;
int mlCount;
};
class cInventory_GlobalSave : public iSerializable
{
kSerializableClassInit(cInventory_GlobalSave)
public:
bool mbNoteBookActive;
cContainerList mlstSlots;
cContainerVec mvEquipSlots;
cContainerList mlstItems;
};
//---------------------------------------------
class cSceneLoadedMap_GlobalSave : public iSerializable
{
kSerializableClassInit(cSceneLoadedMap_GlobalSave)
public:
tString msName;
};
//---------------------------------------------
class cMapHandlerLoadedMap_GlobalSave : public iSerializable
{
kSerializableClassInit(cMapHandlerLoadedMap_GlobalSave)
public:
tString msName;
double mfTime;
};
/////////////
class cMapHandlerTimer_GlobalSave : public iSerializable
{
kSerializableClassInit(cMapHandlerTimer_GlobalSave)
public:
tString msName;
tString msCallback;
bool mbGlobal;
float mfTime;
bool mbDeleteMe;
bool mbPaused;
};
/////////////
class cMapHandler_GlobalSave : public iSerializable
{
kSerializableClassInit(cMapHandler_GlobalSave);
public:
double mfGameTime;
tString msCurrentMap;
cContainerVec mvLoadedMaps;
cContainerList mlstTimers;
};
//---------------------------------------------
class cPlayer_GlobalSave_CameraPS : public iSerializable
{
kSerializableClassInit(cPlayer_GlobalSave_CameraPS);
public:
tString msName;
tString msFile;
};
class cPlayer_GlobalSave : public iSerializable
{
kSerializableClassInit(cPlayer_GlobalSave);
public:
//////////////////////////////
//Stats
int mlStat_NumOfSaves;
//////////////////////////////
//Global vars
float mfForwardUpMul;
float mfForwardRightMul;
float mfUpMul;
float mfRightMul;
bool mbPickAtPoint;
bool mbRotateWithPlayer;
bool mbUseNormalMass;
float mfGrabMassMul;
//////////////////////////////
//Private
bool mbActive;
float mfHeightAdd;
float mfSpeedMul;
float mfHealthSpeedMul;
float mfHeadMoveSizeMul;
float mfHeadMoveSpeedMul;
ePlayerState mState;
ePlayerMoveState mMoveState;
eCrossHairState mCrossHairState;
bool mbItemFlash;
float mfHealth;
float mfPower;
float mfMass;
cContainerVec mvOnCameraPS;
//////////////////////////////
// Lights
bool mbFlashlightActive;
bool mbFlashlightDisabled;
bool mbGlowstickActive;
bool mbFlareActive;
float mfFlareTime;
//////////////////////////////
//Body and Camera Specific
cVector3f mvPosition;
float mfYaw;
float mfPitch;
};
//---------------------------------------------
class cSavedWorld : public iSerializable
{
kSerializableClassInit(cSavedWorld)
public:
~cSavedWorld();
void Reset();
tString msName;
tWString msGameName;
//Ambient color
cColor mAmbientColor;
//Fog
bool mbFogActive;
float mfFogStartDist;
float mfFogEndDist;
cColor mFogColor;
bool mbFogCulling;
//Skybox
bool mbSkyboxActive;
cColor mSkyboxColor;
tString msSkyboxFile;
//Script variables
cContainerList mlstVars;
//Inventory variables
cContainerList mlstUseCallbacks;
cContainerList mlstPickupCallbacks;
cContainerList mlstCombineCallbacks;
//Player collider callbacks
cContainerList mlstCollideCallbacks;
//Local Timers
cContainerList mlstTimers;
//Entities
cContainerList mlstEntities;
//Engine types
cContainerList mlstLights;
cContainerList mlstPS;
cContainerList mlstBeams;
cContainerList mlstSounds;
cContainerList mlstJoints;
bool PSExists(cParticleSystem3D *apPS);
bool BeamExists(cBeam *apPS);
bool SoundExists(cSoundEntity *apSound);
bool JointExists(iPhysicsJoint *apJoint);
};
//----------------------------
class cSavedGame : public iSerializable
{
kSerializableClassInit(cSavedGame)
public:
~cSavedGame();
void Reset();
void ResetWorlds();
void ResetGlobalData();
cSavedWorld* GetSavedWorld(const tString &asName);
//Variables:
eGameDifficulty mDifficulty;
tString msOnRadioEndCallback;
cPlayer_GlobalSave mPlayer;
cMapHandler_GlobalSave mMapHandler;
cInventory_GlobalSave mInventory;
cNotebook_GlobalSave mNotebook;
cGameMusicHandler_GlobalSave mGameMusicHandler;
cMusic_GlobalSave mMusic;
cContainerList mvSceneLoadedMap;
cContainerList mlstScriptVars;
cContainerList mlstWorlds;
};
//----------------------------
class cSaveHandler : public iUpdateable
{
public:
cSaveHandler(cInit *apInit);
~cSaveHandler();
void SaveData(const tString &asName);
void LoadData(const tString &asName);
void SaveGameToFile(const tWString& asFile);
void LoadGameFromFile(const tWString& asFile);
void AutoSave(const tWString &asDir, int alMaxSaves);
void AutoLoad(const tWString &asDir);
void ClearSavedMaps();
void OnWorldLoad();
void OnStart();
void Reset();
void OnExit();
const tWString& GetSaveDir(){return msSaveDir;}
void DeleteOldestIfMax(const tWString &asDir,const tWString &asMask, int alMaxFiles);
tWString GetLatest(const tWString &asDir,const tWString &asMask);
private:
cInit *mpInit;
cSavedGame* mpSavedGame;
tWString msSaveDir;
};
#endif // GAME_SAVE_HANDLER_H