Matrix Games Forums

Forums  Register  Login  Photo Gallery  Member List  Search  Calendars  FAQ 

My Profile  Inbox  Address Book  My Subscription  My Forums  Log Out

Save game editing?

 
View related threads: (in this forum | in all forums)

Logged in as: Guest
Users viewing this topic: none
  Printable Version
All Forums >> [Current Games From Matrix.] >> [American Civil War] >> Forge of Freedom: The American Civil War 1861-1865 >> Mods and Scenarios >> Save game editing? Page: [1]
Login
Message << Older Topic   Newer Topic >>
Save game editing? - 12/2/2006 9:43:20 PM   
bountyhunter

 

Posts: 53
Joined: 11/25/2006
From: Wherever Uncle Sam sends me
Status: offline
What format are the save games in? or what do you need to edit them? Let's face sometimes you you just can't resist doing some tinkering!

< Message edited by bountyhunter -- 12/2/2006 9:54:28 PM >
Post #: 1
RE: Save game editing? - 12/4/2006 4:31:15 AM   
ericbabe


Posts: 11927
Joined: 3/23/2005
Status: offline
They are in text format, though the format can only charitably be described as technical.

I can provide the source code for the save files if people are really interested in knowing the details, though I have to warn that the code for this is quite extensive.

(in reply to bountyhunter)
Post #: 2
RE: Save game editing? - 12/4/2006 7:07:46 AM   
jchastain


Posts: 2164
Joined: 8/8/2003
From: Marietta, GA
Status: offline

quote:

ORIGINAL: ericbabe

They are in text format, though the format can only charitably be described as technical.

I can provide the source code for the save files if people are really interested in knowing the details, though I have to warn that the code for this is quite extensive.



The most obvious use of such code would be for an editor - which we be a doable project with such a headstart for those who actually know what they are doing.

(in reply to ericbabe)
Post #: 3
RE: Save game editing? - 12/14/2006 4:57:18 PM   
Sonny

 

Posts: 2008
Joined: 4/3/2002
Status: offline
quote:

ORIGINAL: ericbabe

They are in text format, though the format can only charitably be described as technical.

I can provide the source code for the save files if people are really interested in knowing the details, though I have to warn that the code for this is quite extensive.




Would be handy (if I can get the time to do something with it).

_____________________________

Quote from Snigbert -

"If you mess with the historical accuracy, you're going to have ahistorical outcomes."

"I'll say it again for Sonny's sake: If you mess with historical accuracy, you're going to have
ahistorical outcomes. "

(in reply to ericbabe)
Post #: 4
RE: Save game editing? - 12/14/2006 5:43:13 PM   
ericbabe


Posts: 11927
Joined: 3/23/2005
Status: offline
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 << " ";

}






















_____________________________



(in reply to Sonny)
Post #: 5
Page:   [1]
All Forums >> [Current Games From Matrix.] >> [American Civil War] >> Forge of Freedom: The American Civil War 1861-1865 >> Mods and Scenarios >> Save game editing? Page: [1]
Jump to:





New Messages No New Messages
Hot Topic w/ New Messages Hot Topic w/o New Messages
Locked w/ New Messages Locked w/o New Messages
 Post New Thread
 Reply to Message
 Post New Poll
 Submit Vote
 Delete My Own Post
 Delete My Own Thread
 Rate Posts


Forum Software © ASPPlayground.NET Advanced Edition 2.4.5 ANSI

0.734