You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
7.3 KiB
198 lines
7.3 KiB
#ifndef _INCLUDED_ASW_CAMPAIGN_SAVE_H |
|
#define _INCLUDED_ASW_CAMPAIGN_SAVE_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "asw_shareddefs.h" |
|
#include "asw_marine_skills.h" |
|
|
|
class CASW_Player; |
|
class CASW_Campaign_Info; |
|
|
|
// This class describes the state of the current campaign game. This is what gets saved when the players save their game. |
|
// When a savegame is loaded in, it is networked to all the clients (so they can bring up the campaign map, etc) |
|
|
|
class CASW_Campaign_Save : public CBaseEntity |
|
{ |
|
public: |
|
DECLARE_CLASS( CASW_Campaign_Save, CBaseEntity ); |
|
DECLARE_SERVERCLASS(); |
|
DECLARE_DATADESC(); |
|
|
|
CASW_Campaign_Save(); |
|
~CASW_Campaign_Save(); |
|
|
|
// savegame version |
|
int m_iVersion; |
|
|
|
int m_iLowestSkillLevelPlayed; |
|
|
|
// the campaign this save game is meant for |
|
CNetworkString( m_CampaignName, 255 ); |
|
|
|
// the mission ID of the location the squad is current in |
|
CNetworkVar(int, m_iCurrentPosition); |
|
|
|
// how many missions are complete in this save |
|
CNetworkVar(int, m_iNumMissionsComplete); |
|
int m_iInitialNumMissionsComplete; // number of missions complete when this save was created |
|
|
|
// how many deaths occured in the playing of the campaign so far |
|
CNetworkVar(int, m_iNumDeaths); |
|
|
|
// a list of IDs describing the missions the squad has completed so far |
|
CNetworkArray(int, m_MissionComplete, ASW_MAX_MISSIONS_PER_CAMPAIGN); |
|
|
|
CNetworkArray(int, m_NumRetries, ASW_MAX_MISSIONS_PER_CAMPAIGN); |
|
|
|
// voting for next mission to play in a campaign |
|
CNetworkVar(float, m_fVoteEndTime); |
|
bool m_bNextMissionVoteEnded; |
|
CNetworkArray(int, m_NumVotes, ASW_MAX_MISSIONS_PER_CAMPAIGN); // number of votes each mission has |
|
|
|
// data specific to each marine that needs to be saved |
|
// rpg stats aren't networked in the save, but are networked in the game resource (since non-campaign games need rpg stats too) |
|
int m_iMarineSkill[ASW_NUM_MARINE_PROFILES][ASW_NUM_SKILL_SLOTS]; |
|
|
|
int m_iParasitesKilled[ASW_NUM_MARINE_PROFILES]; |
|
|
|
bool UsingFixedSkillPoints() { return m_bFixedSkillPoints.Get(); } |
|
CNetworkVar(bool, m_bFixedSkillPoints); |
|
|
|
CNetworkArray(bool, m_bMarineWounded, ASW_NUM_MARINE_PROFILES); |
|
CNetworkArray(bool, m_bMarineDead, ASW_NUM_MARINE_PROFILES); |
|
|
|
// store the marine skills from the end of the last map, so the players can undo if they want |
|
int m_iPreviousMarineSkill[ASW_NUM_MARINE_PROFILES][ASW_NUM_SKILL_SLOTS]; |
|
|
|
// history |
|
CNetworkArray(string_t, m_MissionsCompleteNames, ASW_NUM_MARINE_PROFILES); // a string of mission names this marine has participated in |
|
CNetworkArray(string_t, m_Medals, ASW_NUM_MARINE_PROFILES); // a string listing which medals this marine has (would be better as ints?) |
|
|
|
// single or multiplayer game |
|
CNetworkVar(bool, m_bMultiplayerGame); |
|
|
|
// date/time |
|
CNetworkString( m_DateTime, 255 ); |
|
|
|
// store Steam IDs and names of each player that has taken part in this save game |
|
int m_iNumPlayers; |
|
|
|
CUtlVector<string_t> m_PlayerIDs; |
|
CUtlVector<string_t> m_PlayerNames; |
|
|
|
string_t m_LastCommanders[ ASW_NUM_MARINE_PROFILES ]; // player name + network ID combo of commanders who used these marines last |
|
int m_LastMarineResourceSlot[ ASW_NUM_MARINE_PROFILES ]; // MR last occupied by this profile. Used for preserving order with autoselection. |
|
|
|
// todo: any extra data, such as optional objectives complete, fancy stuff unlocked? |
|
|
|
// reads in a savegame from keyfiles |
|
bool LoadGameFromFile(const char *szFileName); |
|
|
|
// converts savegame to keyfiles and writes it out the savegame folder |
|
bool SaveGameToFile(const char *szFileName = NULL); |
|
|
|
// updates which steamID owns which selected marine |
|
void UpdateLastCommanders(); |
|
|
|
// altering the game state |
|
void SetMissionComplete(int iMission); |
|
void MoveTo(int iMission); |
|
|
|
// doing a long move |
|
void SetMoveDestination(int iMission); |
|
void MoveThink(); |
|
int m_iMoveDestination; |
|
|
|
// creates a new savegame at the start of the campaign |
|
static bool CreateNewSaveGame(char *szFileName, int iFileNameMaxLen, const char *szCampaignName, bool bMultiplayer, const char *szStartingMission); // szFileName arg is the desired filename or NULL for an autogenerated one. Function sets szFileName with the filename used. |
|
|
|
// output the contents of the save game to the console for debugging |
|
void DebugInfo(); |
|
|
|
const char* GetCampaignName(); |
|
|
|
// boost a marine's skill up by 1 point |
|
void IncreaseMarineSkill(int nProfileIndex, int nSkillSlot); |
|
void ReduceMarineSkill(int nProfileIndex, int nSkillSlot); |
|
void ReviveMarine(int nProfileIndex); |
|
|
|
void IncreaseRetries(); |
|
int GetRetries(); |
|
|
|
void AddParasitesKilled(int nProfileIndex, int iParasitesKilled); |
|
int GetParasitesKilled(int nProfileIndex); |
|
|
|
// wounding |
|
void SetMarineWounded(int nProfileIndex, bool bWounded); |
|
bool IsMarineWounded(int nProfileIndex); |
|
|
|
// death |
|
void SetMarineDead(int nProfileIndex, bool bDead); |
|
bool IsMarineAlive(int nProfileIndex); |
|
|
|
// reverts one marine's skills to his undo state |
|
void RevertSkillsToUndoState(int nProfileIndex); |
|
|
|
// copies the current skill values over into the undo array |
|
void UpdateSkillUndoState(); |
|
|
|
// helper functions for examining the campaign save state |
|
bool IsMissionLinkedToACompleteMission(int i, CASW_Campaign_Info* pCampaignInfo); |
|
|
|
void SelectDefaultNextCampaignMission(); |
|
|
|
string_t m_CurrentSaveFileName; |
|
|
|
virtual int ShouldTransmit( const CCheckTransmitInfo *pInfo ); |
|
|
|
// route building |
|
struct campaign_route_node_t |
|
{ |
|
int iMission; |
|
int iParentMission; |
|
float f; // ( = g + h ) |
|
float g; // cost from starting point to here, following generated path |
|
float h; // estimate of cost to destination |
|
}; |
|
bool BuildCampaignRoute(int iStart, int iEnd); |
|
float EstimateCost(CASW_Campaign_Info *pCI, int iStart, int iEnd); |
|
void DebugBuiltRoute(); |
|
CASW_Campaign_Save::campaign_route_node_t* FindMissionInClosedList(int iMission); |
|
int m_iRouteDest; |
|
int m_iRouteStart; |
|
CUtlVector<campaign_route_node_t> m_ClosedList; |
|
CUtlVector<campaign_route_node_t> m_OpenList; |
|
|
|
void StartingCampaignVote(); // clears ready flags on players and sets up vote counts |
|
void ForceNextMissionLaunch(); // forces the vote to end in 10 seconds |
|
void VoteEndThink(); |
|
void VoteEnded(); |
|
void PlayerVote(CASW_Player* pPlayer, int iMission); |
|
void PlayerSpectating(CASW_Player* pPlayer); |
|
// notification of a player disconnecting (used to clear his next campaign map vote, if any) |
|
void PlayerDisconnected(CASW_Player *pPlayer); |
|
void OnMarineKilled(); |
|
}; |
|
|
|
// Swarm savegames are stored on the server. In a singleplayer game this is your machine. In multiplayer |
|
// this means if you save a campaign, you'll have to go back to the same server to continue that game. |
|
|
|
// A possible solution to this is to allow download/uploading of savegames, so a user could transparently keep a |
|
// copy of each savegame on his local machine and possibly upload that to the server if the server doesn't have it. |
|
// Would need some kind of random GUID to differentiate saves? And time/date so the player doesn't upload an older save. |
|
// And this would obviously make multiplayer savegames completely insecure (i.e. one player could upload a haxed savegame |
|
// with his marine having uber stats). |
|
|
|
|
|
// used by the campaign init vars (which get set by the new campaign, load game functions, so the |
|
// server knows what to do campaign wise when the map starts up) |
|
enum asw_campaign_init_t |
|
{ |
|
CAMPAIGN_INIT_SINGLE_MISSION, |
|
CAMPAIGN_INIT_NEW_CAMPAIGN, |
|
CAMPAIGN_INIT_LOAD_SAVED |
|
}; |
|
|
|
#endif // _INCLUDED_ASW_CAMPAIGN_SAVE_H
|