sqwarmed/sdk_src/game/server/swarm/asw_campaign_save.h

198 lines
7.5 KiB
C
Raw Normal View History

2024-08-29 19:18:30 -04:00
#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