/* 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_SAVE_HANDLER_H
#define GAME_SAVE_HANDLER_H
#include "hpl1/engine/engine.h"
using namespace hpl;
class cInit;
#include "hpl1/penumbra-overture/GameTypes.h"
#include "hpl1/penumbra-overture/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_nodestructor(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_nodestructor(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();
static cDate parseDate(const Common::String &saveFile);
void SaveData(const tString &asName);
void LoadData(const tString &asName);
void SaveGameToFile(const tWString &asFile);
void LoadGameFromFile(const tWString &asFile, bool drawLoadingScreen = true);
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 &asMask);
private:
cInit *mpInit;
cSavedGame *mpSavedGame;
tWString msSaveDir;
};
#endif // GAME_SAVE_HANDLER_H