ericbabe -> RE: Save game editing? (12/14/2006 5:43:13 PM)
|
Alright, will post here. This should be all the code you need to program a loader for the .sve file. It is thorough, but I'm not sure the adjective "handy" applies since that generally connotes something that's easy with which to work. SaveGame_Stream takes a standard iostream on the .sve file opened in text mode (I use fstream, but any iostream properly initialized will be OK). It also takes a pointer to a CHexWar object, which contains the data for detailed combat; I'll include the data members of CHexWar and its base classes as well. This method also uses stream overrides for various classes of data, such as TPlayer. I will include the code for the classes (or for the base classes, it gets tricky) after this method. It should be obvious in most cases which class instantiations go with which classes (i.e. Player obviously goes with TPlayer) but in some cases it may not be obvious... I can help sort these out if you're still interested and can't puzzle-out particular instantiations. Similarly, the names of the actual data members should on the whole be self-explanatory... the data that is not self explanatory you probably don't care about anyway. I follow some Hungarian-style naming conventions, so fVariable is usually a variable of type "float" and pVariable is a pointer, ppVariable a pointer to a pointer; I also use code that uses PT and PTPT as the Hungarian-style prefixes, but this shouldn't be too confusing... when MSFT switched from PT to p, so did I, albeit a few years later. In some cases I don't use a Hungarian style prefix for string variables... I've gotten better about this, but older code doesn't use it, though often the name of the variable should tell you whether it's of type char[] or char*: e.g., variables called "Name" are a good indication that they are strings. Finally, I'm including code for all Save(iostream) methods within my code... some of these may not be relevant to the save game code, some may be old COG stuff that the current engine doesn't even compile. All the calls to base class methods are explicit in the code: e.g., TPiece has TMover as a base class, and the so the save method for TPiece makes an explicit call to the save method in TMover.) You should be able to reconstruct all the class hierarchy from this. Good luck! bool TGame::SaveGame_Stream(iostream &stream, CHexWar* pHexWar) { // save version stream << MajorVersion << " "; stream << MajorVersion2 << " "; stream << MinorVersion << " "; // save scenario if (ScenarioPath) { stream << ScenarioPath << "\n"; } else { stream << "Data\\" << "\n"; } // game options for (int g=0; g<eo_gameopt; g++) stream << GameOptions[g] << " "; PTProvMap->Save(stream); for (int p=1; p<NoPlayers; p++) Players[p].Save(stream); for (p=1; p<NoPlayersWithTreaties; p++) stream << (int) HaveReceivedOrders[p] << " "; stream << 101001 << " "; for (p=1; p<NoPlayers; p++) PlayerOrders[p].Save(stream); stream << 202002 << " "; for (p=1; p<NoPlayers; p++) for (int p2=1; p2<NoPlayers; p2++) Relations[p][p2].Save(stream); for (p=1; p<NoPlayers; p++) for (int p2=1; p2<NoPlayers; p2++) Remember_Relations[p][p2].Save(stream); // TTreaty::Save_TreatyList(stream); // TTreaty::Save_Proposals(stream); stream << Phase << "\n" << ActivePlayer << "\n" << Turn << "\n" << NextOrderOfArrival << "\n" ; /* for (p=1; p<NoPlayersWithTreaties; p++) for (int p2=1; p2<NoPlayersWithTreaties; p2++) { stream << SurrenderPoints[p][p2] << " "; stream << CarnageTotal[p][p2] << " "; stream << PeaceTurns[p][p2] << " "; } */ for (p=1; p<NoPlayersWithTreaties; p++) { for (int r=1; r<NoTradeRoutes; r++) Routes[p][r].Save(stream); GetGovs(p).Save(stream); SelectGovs[p].Save(stream); Remember_Govs[p].Save(stream); //stream << Glory[p] << " "; //stream << fTreatyMakingPoints[p] << " "; stream << NationalMorale[p] << " "; } for (int d=0; d<3; d++) { stream << Europe_TradeLevel[d] << " "; stream << Europe_MilitaryLevel[d] << " "; } for (d=0; d<3; d++) stream << NationWonLastBattles[d] << " "; for (int c=1; c<NoCities; c++) Cities[c].Save(stream); for (int r=1; r<NoProvinces; r++) { stream << ProvWeather[r] << " "; } /* for (p=1; p<NoPlayersWithTreaties; p++) for (int p2=1; p2<NoPlayers; p2++) stream << HotList[p][p2] << " "; for (int p1=1; p<NoNations; p++) for (int p2=1; p2<NoNations; p2++) { stream << RejectAlliance[p1][p2] << " "; stream << RejectLimSur[p1][p2] << " "; stream << RejectCeaseFire[p1][p2] << " "; for (int g1=1; g1<NoMasterGoods; g1++) stream << RejectTrade[p1][p2][g1] << " "; } */ // check stream << 112233 << " "; // save governor variable info for (r=1; r<NoRulers; r++) Rulers[r].Save(stream); // save history for (p=1; p<NoPlayers; p++) for (int t=0; t<MaxTurnsOfHistory; t++) { stream << History_TotalStrength[p][t] << " "; stream << History_Casualties[p][t] << " "; stream << History_Victory[p][t] << " "; stream << History_NationalWill[p][t] << " "; stream << History_Quality[p][t] << " "; stream << History_Weapons[p][t] << " "; } // save number key for (p=1; p<NoNations; p++) for (int t=0; t<10; t++) stream << hPieceStore[p][t] << " "; pbem.Save(stream); stream << DifficultyLevel << " "; stream << GameLength << " "; stream << GloryVictoryCondition << " "; stream << StartOfGame << " "; stream << EndOfGame << " "; if (pHexWar) { stream << "HEXWAR" << " "; pHexWar->SaveGame_Stream(stream); stream << CurrentSubphase << " "; stream << hSaveBattlePlayer << " "; saveDummyCFight.Save(stream); // save TGameFightBattle data for (int p=1; p<NoPlayers; p++) { stream << dead[p] << " "; stream << fresh[p] << " "; stream << PlayerBattleStrength[p] << " "; stream << StrengthByPlayer[0][p] << " "; stream << StrengthByPlayer[1][p] << " "; stream << PlayerStrength[p] << " "; } for (int g=0; g<MaxGarList; g++) stream << hGarrisonList[g] << " "; //char description[2048]; for (int i=0; i<2; i++) { stream << teamCount << " "; stream << strength << " "; stream << isTeamComputer << " "; stream << frontSize << " "; stream << TotalTeamStrength << " "; } stream << GarrisonIndex << " "; stream << hGarrisonControllerPlayer << " "; stream << hStrongestHumanInBattle << " "; stream << TotalMenInBattle << " "; stream << hVictor << " "; stream << hSiegeUnitCombat << " "; int scratch; scratch = bResults; stream << scratch << " "; scratch = bRallyGarrison; stream << scratch << " "; } else { stream << "NOHEX" << " "; } stream << ends; return true; } void CFight::Save(iostream &stream) { for (int u=0; u<szFightUnits; u++) { stream << Units.hPiece << " "; stream << Units.team << " "; stream << Units.x << " "; stream << Units.y << " "; stream << Units.movex << " "; stream << Units.movey << " "; stream << Units.reinforce << " "; } // DONT NEED TO SAVE THIS....int Map[FightWidth][FightHeight]; for (int i=0; i<2; i++) { stream << hTeamLeader << " "; stream << Supply << " "; stream << CarnageTakenByTeam << " "; stream << CarnageCausedByTeamThisRound << " "; } for (int p=1; p<NoPlayers; p++) stream << CarnageTakenByPlayer[p] << " "; GCOfBattle.Save(stream); GCOfPortAttack.Save(stream); for (int g=0; g<szFightGenerals; g++) for (int i=0; i<2; i++) { stream << hGenerals[g] << " "; } stream << Weather << " "; stream << DefenderPortDefenses << " "; stream << WeatherGauge << " "; stream << VictoriousTeam << " "; stream << DefenderTerrainBonus << " "; stream << DefenderFortBonus << " "; int scratch; scratch = bIsNavalBattle; stream << scratch << " "; scratch = bSilentRun; stream << scratch << " "; } void TCity::Save(iostream &stream) { for (int d=1; d<eoDev; d++) stream << Development[d] << " "; stream << DevelopmentArea << " "; stream << TurnsToNextDevelopment << " "; } void THexAi::Save(iostream &stream) { stream << ourTeam << " "; stream << Stance << " "; stream << Opx << " "; stream << Opy << " "; stream << hDesignatedVictim << " "; stream << ourPower << " "; stream << theirPower << " "; // PERIMETER STUFF for (int x=0; x<HexMapSize; x++) for (int y=0; y<HexMapSize; y++) stream << EnemyPower[x][y] << " "; for (int per=0; per<szPerList; per++) { stream << PerList[per].x << " "; stream << PerList[per].y << " "; stream << PerList[per].hAssignedBat << " "; } stream << PerListIndex << " "; for (int b=0; b<szBat; b++) stream << BatIndex2AssignedPerListIndex << " "; } void TPbem::Save(iostream &stream) { stream << 123456 << "\n"; // check stream << IsPbemGame << "\n"; if (PbemName[0]) stream << PbemName << "\n"; else stream << "noname" << "\n"; for (PLAYER_HANDLE a=1; a<NoNations; a++) { for (PLAYER_HANDLE b=1; b<NoNations; b++) { stream << OpportunityAlliance[a] << " "; stream << OpportunityWar[a] << " "; stream << OpportunityTradeWithPlayer[a] << " "; } for (int g=1; g<TMasterGoods::eoGoods; g++) { stream << OpportunityTradeFor[a][g] << " "; stream << OpportunityTradeAway[a][g] << " "; } } for (a=1; a<NoNations; a++) { if (Passwords[a][0]) stream << Passwords[a] << "\n"; else stream << "default" << "\n"; } } void TRuler::Save(iostream &stream) { stream << IsGovernor << " "; stream << State << " "; stream << Player << " "; stream << Mugshot << " "; stream << WantDev << " "; stream << WantDevLevel << " "; stream << WantBrigades << " "; stream << WantBrigadesLevel << " "; stream << Action << " "; stream << Support << " "; stream << Party << " "; stream << Power << " "; stream << Temper << " "; } void TGov::Save(iostream &stream) { stream << FeudalDues << " "; stream << MilitaryReadiness << " "; stream << MilitaryIndustry << " "; stream << Tax << " "; stream << Dole << " "; stream << WantDole << " "; stream << FoodRation << " "; stream << Loan << " "; stream << LoanRate << " "; stream << DraftYoung << " "; stream << DraftOld << " "; stream << DraftTime << " "; stream << DraftSize << " "; stream << DraftPool << " "; stream << DraftPoolMorale << " "; stream << DraftTraining << " "; for (int u=0; u<eo_Upg; u++) stream << Upgrades << " "; } void TVisible::Save(iostream &stream) { stream << Visible_Bits << " "; } void TNapPiece::Save(iostream &stream) { stream << Forage << " "; stream << ForcedMarch << " "; stream << (int) Blockade << " "; stream << LookingForBattle << " "; stream << Supplied << " "; stream << hProduction_AutoJoin << " "; stream << DivisionNumber << " "; stream << CityIndex << " "; stream << Diplomat_Espionage << " "; stream << Diplomat_Influence << " "; stream << Diplomat_Legal << " "; stream << DetailedOrderNumber << " "; TPiece::Save(stream); } void TPieceInterface::Save(iostream &stream) { PTPieceList->Save(stream); } void TContainer::Save(iostream &stream) { stream << HContainer << " " << hContainerAtBeginningOfTurn << " " << CanCarry << " " << CarryType << "\n"; } void TGameCoord::Save(iostream &stream) { //ZoomCoord.Save(stream); stream << Province << "\n"; } void TGeneralAttrib::Save(iostream &stream) { stream << Initiative_Modifier << " " << Rank << " " << TacticalSkill << " " << MoraleBonus << " " << CavalryRating << " " << CommandRating << " " << SpecTactic[0] << " " << SpecTactic[1] << " " << SpecTactic[2] << " " << SpecTactic[3] << " " << SpecTactic[4] << " " //<< MugshotNo << " " << FoughtThisTurn << " " << WestPoint << " " << VMI << " " << GraduationRank << " " << ForeignService << " " << RelievedOfCommand << " " << ResignedCommand << " " << MedalOfHonor << " " << hState << " " ; for (int k=0; k<eo_gk; k++) stream << Know[k] << " "; stream << 57455475 << "\n"; if (!pNotes) stream << "NoNotes" << " "; else { if (!strlen(pNotes)) stream << "NoNotes" << " "; else stream << pNotes << " "; } stream << "\n"; } void TOwned::Save(iostream &stream) { stream << PlayerID << "\n"; stream << OriginalPlayerID << "\n"; stream << Surrendered << "\n"; } void TCoord::Save(iostream &stream) { stream << location[0] << " " << location[1] << "\n"; } void TCoordf::Save(iostream &stream) { stream << location[0] << " " << location[1] << "\n"; } ostream& operator << (ostream& os, TGoods& g) { int n; for (int i=1; i<NoMasterGoods; i++) { n = g.GetNumber(i); os << n << " "; } return os; } // NOTE FROM ERIC: This method uses the above stream override void TGoods::Save(iostream &stream) { /* for (int i=1; i<NoMasterGoods; i++) { stream << GetNumber(i) << " "; } */ stream << *this; } void TLoc::Save(iostream &stream) { TOwned::Save(stream); stream << MasterLocID << " "; Coord.Save(stream); } void TMover::Save(iostream &stream) { stream << MovesLeft << " "; MoveTimer.Save(stream); GameCoord.Save(stream); AssociatedEdge.Save(stream); BegGameCoord.Save(stream); Destination.Save(stream); TOrderThing::Save(stream); for (int m=0; m<MaxMovePath; m++) MovePath[m].Save(stream); } void TOrders::Save(iostream &stream) { if (string[0]==0) strcpy(string, "NoString"); stream << (int) Order << " " << hOwner << " " << hPiece << " " << When << " " << data.arg1 << " " << data.arg2 << " " << data.argf1 << " " << data.argf2 << " " << string << "\n" ; gcHere.Save(stream); gcThere.Save(stream); } void TOrderThing::Save(iostream &stream) { int count = 0; for (int i=0; i<MaxNoOrders; i++) { if (Orders.GetOrder()) { Orders.Save(stream); count++; } //Orders.Save(stream); //if (!Orders.GetOrder()) // break; } // save blank order to mark end of orders TOrders blank; blank.Save(stream); } void TPiece::Save(iostream &stream) { //stream << "Piece\n"; if (!UniqueName) stream << "noname" << " "; else stream << UniqueName << " "; stream << Handle << " " << Selected << " " << MasterPieceIndex << " " << Strength << " " << Morale << " " << Experience << " " << Disposition << " " << Firearm << " " << StratSupply << " " << LogisticStaff << " " << CommandStaff << " " << EngineeringJob << " " << SupplyPriority << " " << hGunBuy << " " << GunBuyNumbers << " " << hSiegeTarget << " " << FlagNumber << " " << AIGroup << " " << hFleetInvasionProvince << " " << Remember_Strength << " " << Remember_Morale << " " << Temporary_Piece << " " << Temporary_Deleted << " " << Port << " " << Province_CoordList_Index << "\n" ; for (int i=0; i<NoPieceAttributes; i++) stream << Attributes << " "; for (i=0; i<NoPieceSpecialAbilities; i++) stream << SpecialAbility << " "; TMover::Save(stream); TOwned::Save(stream); TContainer::Save(stream); TGeneralAttrib::Save(stream); TVisible::Save(stream); //LifeTimer.Save(stream); // save reports for (int no=0; no<NoPieceReports; no++) { for (int r=0; r<NoPieceReportEntries; r++) { if (Reports[no][r] && strlen(Reports[no][r])>0) { NonGraphLetters_To_Underscores(Reports[no][r]); stream << no << " " << r << " " << Reports[no][r] << "\n"; } else { break; } } } stream << -1 << " " << -1 << " " << "end" << "\n"; stream << 31 << "\n"; } void TPieceList::Save(iostream &stream) { for (int i=0; i<List.GetIndex(); i++) { List->Save(stream); } // SAVE END OF LIST PIECE GAMEPIECE_OBJECT blank; blank.Save(stream); // save handle list for (i=0; i<MaxPieceHandle; i++) stream << HandleToListIndex << " "; } void TPcMap::Save(iostream &stream) { TPieceInterface::Save(stream); TMap::Save(stream); } void TPcProvMap::Save(iostream &stream) { TPcMap::Save(stream); stream << 20052006 << " "; TProvMap::Save(stream); } void TPlayer::Save(iostream &stream) { stream << 13117 << " "; stream << id << " "; //char* Name; if (!LeaderName) stream << "noname" << " "; else stream << LeaderName << " "; stream << ComputerPlayer << " "; Goods.Save(stream); stream << BaseMorale << " "; stream << Expert << " "; stream << Empire << " "; stream << Handicap << " "; stream << gcHome.Province << " "; stream << hRallyLocation << "\n"; for (int d=0; d<3; d++) { stream << DiploSpending[d] << " "; stream << DiploLevels[d] << " "; } stream << Emancipated << " "; stream << POWs << " "; stream << Will << " "; stream << LastBattle << " "; stream << 13113 << "\n "; } void TRelation::Save(iostream &stream) { stream << Declaration << " " << Attitude << " " << ViolateNeutrality << " " << Slaughter << "\n"; } void TProvince::Save(iostream &stream) { stream << 18611864 << " "; // test TLoc::Save(stream); Production.Save(stream); for (int lab = 0; lab<eoLabor; lab++) stream << LaborAllocation[lab] << " "; stream << hVeryOriginalPlayer << " "; stream << hVeryOriginalNation << " "; stream << FOWVisible << " "; // stream << 717273 << " "; // test stream << SpecialCharacteristic << " "; stream << Unrest << " "; stream << ImpressGood << " "; stream << ImpressAmount << " "; stream << ImpressSuccess << " "; stream << ImpressDanger << " "; Production.Save(stream); for (int dx=0; dx<DevelopmentMapWidth; dx++) for (int dy=0; dy<DevelopmentMapHeight; dy++) stream << DevelopmentXY[dx][dy] << " "; for (dx=0; dx<DevelopmentMapWidth; dx++) for (int dy=0; dy<DevelopmentMapHeight; dy++) stream << DevelopmentXY_TimeLeft[dx][dy] << " "; // stream << 554433 << " "; // test for (int r=0; r<5; r++) stream << ResourcesUsed[r] << " "; stream << SustainablePopulation << " "; // stream << 999888 << " "; // test } void TProvMap::Save(iostream &stream) { for (int i=0; i<NoProvinces; i++) { pProvinces.Save(stream); } } void CHexWar::SaveGame_Stream(iostream &stream) { int scratch; stream << 10001 << " "; for (int x=0; x<HexMapSize; x++) for (int y=0; y<HexMapSize; y++) { stream << Map[x][y] << " "; // prop stream << Prop[x][y].road << " "; stream << Prop[x][y].river << " "; stream << Prop[x][y].trench << " "; stream << Prop[x][y].height << " "; stream << Prop[x][y].coast << " "; // stream << Prop[x][y].tree << " "; stream << Prop[x][y].swamp << " "; stream << Prop[x][y].mud << " "; stream << Prop[x][y].village << " "; stream << Prop[x][y].smoke << " "; stream << Prop[x][y].fow << " "; stream << Prop[x][y].variety << " "; stream << Prop[x][y].corpses << " "; stream << Prop[x][y].crater << " "; stream << Prop[x][y].forested << " "; stream << Prop[x][y].ford << " "; stream << Prop[x][y].trench << " "; stream << Prop[x][y].urban << " "; stream << Prop[x][y].impass << " "; stream << Prop[x][y].rock << " "; stream << Prop[x][y].GrassType0 << " "; stream << Prop[x][y].GrassType1 << " "; stream << Prop[x][y].GrassTile << " "; for (int c=0; c<MaxCorpsesPerHex; c++) { stream << Prop[x][y].CorpseUgxPlus1[c] << " "; stream << Prop[x][y].CorpseFace[c] << " "; stream << Prop[x][y].CorpsePlayer[c] << " "; stream << Prop[x][y].CorpseCell[c] << " "; stream << Prop[x][y].CorpseDxDy[c][2] << " "; } stream << hBat[x][y] << " "; stream << HiMap[x][y] << " "; stream << Move[x][y] << " "; stream << ScratchMove[x][y] << " "; stream << Face[x][y] << " "; scratch = AlreadyMoved[x][y]; stream << scratch << " "; scratch = Zoc[x][y]; stream << scratch << " "; scratch = FortWallZoc[x][y]; stream << scratch << " "; scratch = Sight[x][y]; stream << scratch << " "; scratch = LocalSight[x][y]; stream << scratch << " "; scratch = Threat[x][y]; stream << scratch << " "; } stream << 10002 << " "; // save units for (int b=0; b<szBat; b++) { if (Bat.Name[0]==0) strcpy(Bat.Name, "Unit"); NonLetters_NonPeriodsAndAsterisks_To_Underscores(Bat.Name); stream << Bat.Name << " "; stream << Bat.type << " "; stream << Bat.form << " "; stream << Bat.strength << " "; stream << Bat.morale << " "; stream << Bat.maxMorale << " "; stream << Bat.supply << " "; stream << Bat.x << " "; stream << Bat.y << " "; stream << Bat.hPlayer << " "; stream << Bat.team << " "; stream << Bat.hOriginalPlayer << " "; stream << Bat.initiative << " "; stream << Bat.hPiece << " "; stream << Bat.hCorps << " "; stream << Bat.Moves << " "; stream << Bat.face << " "; stream << Bat.hGeneral << " "; stream << Bat.Gun << " "; stream << Bat.CanBePlaced << " "; stream << Bat.Attributes[0] << " "; stream << Bat.Attributes[1] << " "; stream << Bat.Special[0] << " "; stream << Bat.Special[1] << " "; stream << Bat.AutoThisTurn << " "; stream << Bat.TelegraphBonus << " "; stream << Bat.RailBonus << " "; stream << Bat.RangingX << " "; stream << Bat.RangingY << " "; scratch = Bat.bSkirmishers; stream << scratch << " "; scratch = Bat.bSurrendered; stream << scratch << " "; scratch = Bat.bSentry; stream << scratch << " "; scratch = Bat.bFortified; stream << scratch << " "; scratch = Bat.bFresh; stream << scratch << " "; scratch = Bat.bForceMarch; stream << scratch << " "; scratch = Bat.bFatigue; stream << scratch << " "; scratch = Bat.bEagle; stream << scratch << " "; scratch = Bat.bShaken; stream << scratch << " "; scratch = Bat.bInCommand; stream << scratch << " "; } stream << 10003 << " "; for (b=0; b<szReinforcementList; b++) { if (ReinforcementList.Name[0]==0) strcpy(ReinforcementList.Name, "Unit"); NonLetters_NonPeriodsAndAsterisks_To_Underscores(ReinforcementList.Name); stream << ReinforcementList.Name << " "; stream << ReinforcementList.type << " "; stream << ReinforcementList.form << " "; stream << ReinforcementList.strength << " "; stream << ReinforcementList.morale << " "; stream << ReinforcementList.maxMorale << " "; stream << ReinforcementList.supply << " "; stream << ReinforcementList.x << " "; stream << ReinforcementList.y << " "; stream << ReinforcementList.hPlayer << " "; stream << ReinforcementList.team << " "; stream << ReinforcementList.hOriginalPlayer << " "; stream << ReinforcementList.initiative << " "; stream << ReinforcementList.hPiece << " "; stream << ReinforcementList.hCorps << " "; stream << ReinforcementList.Moves << " "; stream << ReinforcementList.face << " "; stream << ReinforcementList.hGeneral << " "; stream << ReinforcementList.Gun << " "; stream << ReinforcementList.CanBePlaced << " "; stream << ReinforcementList.Attributes[0] << " "; stream << ReinforcementList.Attributes[1] << " "; stream << ReinforcementList.Special[0] << " "; stream << ReinforcementList.Special[1] << " "; stream << ReinforcementList.AutoThisTurn << " "; stream << ReinforcementList.TelegraphBonus << " "; stream << ReinforcementList.RailBonus << " "; stream << ReinforcementList.RangingX << " "; stream << ReinforcementList.RangingY << " "; scratch = ReinforcementList.bSkirmishers; stream << scratch << " "; scratch = ReinforcementList.bSurrendered; stream << scratch << " "; scratch = ReinforcementList.bSentry; stream << scratch << " "; scratch = ReinforcementList.bFortified; stream << scratch << " "; scratch = ReinforcementList.bFresh; stream << scratch << " "; scratch = ReinforcementList.bForceMarch; stream << scratch << " "; scratch = ReinforcementList.bFatigue; stream << scratch << " "; scratch = ReinforcementList.bEagle; stream << scratch << " "; scratch = ReinforcementList.bShaken; stream << scratch << " "; scratch = ReinforcementList.bInCommand; stream << scratch << " "; } // save title of battle if (TitleOfBattle[0]==0) strcpy(TitleOfBattle, "Battle"); NonLetters_NonPeriodsAndAsterisks_To_Underscores(TitleOfBattle); stream << TitleOfBattle << " "; for (int p=1; p<NoPlayers; p++) { stream << CarnageTakenByPlayer[p] << " "; stream << RetreatRounds[p] << " "; stream << ReinforcementDelay[p] << " "; scratch = bCallReinforce[p]; stream << scratch << " "; scratch = bTotalMopup[p]; stream << scratch << " "; scratch = bSkipAll[p]; stream << scratch << " "; } stream << 10004 << " "; GCOfBattle.Save(stream); stream << AdvisorBkgNumber << " "; for (int i=0; i<2; i++) { stream << BattlefieldIsFull << " "; stream << BattlefieldSizeLimit << " "; stream << CarnageTakenByTeam << " "; } ai[0].Save(stream); ai[1].Save(stream); stream << MapSeed << " "; stream << ScoutCheck << " "; stream << ScoutingTeam << " "; stream << ScoutSuccess << " "; stream << CommandCounter[0] << " "; stream << CommandCounter[1] << " "; for (i=0; i<NoVictoryLocations; i++) { stream << VictoryLocations[0] << " "; stream << VictoryLocations[1] << " "; } for (i=0; i<NoRallyLocations; i++) { stream << RallyLocations[0] << " "; stream << RallyLocations[1] << " "; stream << RallyLocations[2] << " "; } for (int g=0; g<3; g++) stream << GrassTypeNumbers[g] << " "; for (int t=0; t<2; t++) for (int m=0; m<eo_gm; m++) stream << GlobalMorale[t][m] << " "; stream << 10005 << " "; for (b=0; b<szBat; b++) { scratch = bCanSupply; stream << scratch << " "; } stream << iWeather << " "; stream << hVictoriousPlayer << " "; stream << iServerBaseWeather << " "; stream << xPos << " "; stream << yPos << " "; stream << Init << " "; stream << hSelect << " "; stream << DrawCount << " "; stream << Minutes << " "; stream << TurnNumber << " "; stream << mountainous << " "; stream << forested << " "; stream << swampy << " "; stream << desert << " "; stream << rivers << " "; stream << RetreatingSide << " "; for (int r=0; r<szReinforcementList; r++) { stream << hReinforceAtStart[r] << " "; stream << hReinforceAtStart_team[r] << " "; } for (r=0; r<szhPieceRetreated; r++) { stream << hPieceRetreated[r] << " "; stream << hStrengthRetreated[r] << " "; stream << hTeamRetreated[r] << " "; } stream << 10006 << " "; scratch = bDontEnterUnitControl; stream << scratch << " "; scratch = bPleaseDeleteMe; stream << scratch << " "; scratch = bIsWinter; stream << scratch << " "; scratch = bIsDesert; stream << scratch << " "; scratch = bConiferous; stream << scratch << " "; scratch = bMixedConiferous; stream << scratch << " "; scratch = bScrubtrees; stream << scratch << " "; scratch = bAlreadyPlayedVictoryMusic; stream << scratch << " "; scratch = bIsFirstTurn; stream << scratch << " "; for (int n=0; n<NoNamedLocations; n++) { stream << Name[n][0] << " "; stream << NameXY[n][0] << " "; stream << Name[n][1] << " "; stream << NameXY[n][1] << " "; } // **************** stream << pProvince->GetProvinceIndex() << " "; // CONVERT THIS TO -> TProvince* pProvince; // **************** stream << 10007 << " "; }
|
|
|
|