close Warning: Can't synchronize with repository "(default)" (No changeset 184 in the repository). Look in the Trac log for more information.

Changeset 64 for trunk/UGame.pas


Ignore:
Timestamp:
Sep 26, 2014, 9:01:50 PM (10 years ago)
Author:
chronos
Message:
  • Modified: Improved saving game state to XML file. Not yet finished and can't be loaded yet.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UGame.pas

    r62 r64  
    77uses
    88  Classes, SysUtils, ExtCtrls, Graphics, Contnrs, XMLConf, XMLRead, XMLWrite,
    9   DOM, Math;
     9  DOM, Math, FileUtil, UXMLUtils;
    1010
    1111const
     
    2323  TPlayer = class;
    2424  TView = class;
     25  TUnitMoves = class;
    2526
    2627  TFloatPoint = record
     
    3940    procedure SetPower(AValue: Integer);
    4041  public
     42    Id: Integer;
    4143    PosPx: TPoint;
    4244    Polygon: TPointArray;
    4345    Terrain: TTerrainType;
    4446    Player: TPlayer;
    45     MovesFrom: TObjectList; // TList<TMove>
    46     MovesTo: TObjectList; // TList<TMove>
     47    MovesFrom: TUnitMoves;
     48    MovesTo: TUnitMoves;
    4749    Neighbors: TObjectList; // TList<TCell>
    4850    procedure Assign(Source: TCell);
     
    106108    procedure LoadFromFile(FileName: string); virtual;
    107109    procedure SaveToFile(FileName: string); virtual;
     110    procedure LoadFromNode(Node: TDOMNode);
     111    procedure SaveToNode(Node: TDOMNode);
    108112    function PosToCell(Pos: TPoint; View: TView): TCell; virtual;
    109113    function CellToPos(Cell: TCell): TPoint; virtual;
     
    173177    procedure SetGame(AValue: TGame);
    174178  public
     179    Id: Integer;
    175180    Name: string;
    176181    Color: TColor;
     
    181186    TotalCities: Integer;
    182187    StartUnits: Integer;
     188    procedure LoadFromNode(Node: TDOMNode);
     189    procedure SaveToNode(Node: TDOMNode);
    183190    procedure ComputerTurn;
    184191    procedure Paint(PaintBox: TPaintBox);
     
    191198  TPlayerArray = array of TPlayer;
    192199
     200  { TPlayers }
     201
    193202  TPlayers = class(TObjectList)
    194 
     203    procedure LoadFromNode(Node: TDOMNode);
     204    procedure SaveToNode(Node: TDOMNode);
    195205  end;
    196206
     
    207217    CountOnce: Integer;
    208218    CountRepeat: Integer;
     219    procedure LoadFromNode(Node: TDOMNode);
     220    procedure SaveToNode(Node: TDOMNode);
    209221    constructor Create;
    210222    destructor Destroy; override;
    211223    property CellFrom: TCell read FCellFrom write SetCellFrom;
    212224    property CellTo: TCell read FCellTo write SetCellTo;
     225  end;
     226
     227  { TUnitMoves }
     228
     229  TUnitMoves = class(TObjectList)
     230    procedure LoadFromNode(Node: TDOMNode);
     231    procedure SaveToNode(Node: TDOMNode);
    213232  end;
    214233
     
    248267    CityPercentage: Integer;
    249268    CurrentPlayer: TPlayer;
    250     Moves: TObjectList; // TList<TUnitMove>
     269    Moves: TUnitMoves;
    251270    TurnCounter: Integer;
    252271    WinObjective: TWinObjective;
     
    254273    StayAliveForDefinedTurns: Integer;
    255274    MaxNeutralUnits: Integer;
     275    FileName: string;
    256276    function AttackProbability(AttackCount, DefendCount, Depth: Integer): Double;
    257277    procedure SaveConfig(Config: TXmlConfig; Path: string);
    258278    procedure LoadConfig(Config: TXmlConfig; Path: string);
     279    procedure LoadFromFile(FileName: string);
     280    procedure SaveToFile(FileName: string);
    259281    procedure ComputePlayerStats;
    260282    function GetAlivePlayers: TPlayerArray;
     
    292314  SComputer = 'Computer';
    293315  SCannotSetPlayerStartCells = 'Cannot choose start cell for player';
     316  SWrongFileFormat = 'Wrong file format';
    294317  SUnfinishedBattle = 'Unfinished battle';
     318  SNewGameFile = 'New game.xtg';
    295319
    296320procedure InitStrings;
     
    354378    if Y < Result.Top then
    355379      Result.Top := Y;
     380  end;
     381end;
     382
     383{ TPlayers }
     384
     385procedure TPlayers.LoadFromNode(Node: TDOMNode);
     386begin
     387
     388end;
     389
     390procedure TPlayers.SaveToNode(Node: TDOMNode);
     391var
     392  I: Integer;
     393  NewNode: TDOMNode;
     394begin
     395  for I := 0 to Count - 1 do begin;
     396    NewNode := Node.OwnerDocument.CreateElement('Player');
     397    Node.AppendChild(NewNode);
     398    TPlayer(Items[I]).SaveToNode(NewNode);
     399  end;
     400end;
     401
     402{ TUnitMoves }
     403
     404procedure TUnitMoves.LoadFromNode(Node: TDOMNode);
     405begin
     406
     407end;
     408
     409procedure TUnitMoves.SaveToNode(Node: TDOMNode);
     410var
     411  I: Integer;
     412  NewNode: TDOMNode;
     413begin
     414  for I := 0 to Count - 1 do begin;
     415    NewNode := Node.OwnerDocument.CreateElement('UnitMove');
     416    Node.AppendChild(NewNode);
     417    TUnitMove(Items[I]).SaveToNode(NewNode);
    356418  end;
    357419end;
     
    595657end;
    596658
     659procedure TMap.LoadFromNode(Node: TDOMNode);
     660begin
     661  DefaultCellSize.X := ReadInteger(Node, 'DefaultCellSizeX', 1);
     662  DefaultCellSize.Y := ReadInteger(Node, 'DefaultCellSizeY', 1);
     663  MaxPower := ReadInteger(Node, 'MaxPower', 99);
     664end;
     665
     666procedure TMap.SaveToNode(Node: TDOMNode);
     667var
     668  NewNode: TDOMNode;
     669  NewNode2: TDOMNode;
     670  I: Integer;
     671begin
     672  WriteInteger(Node, 'DefaultCellSizeX', DefaultCellSize.X);
     673  WriteInteger(Node, 'DefaultCellSizeY', DefaultCellSize.Y);
     674  WriteInteger(Node, 'MaxPower', MaxPower);
     675  NewNode := Node.OwnerDocument.CreateElement('Cells');
     676  Node.AppendChild(NewNode);
     677  for I := 0 to Cells.Count - 1 do
     678  with TCell(Cells[I]) do begin
     679    NewNode2 := Node.OwnerDocument.CreateElement('Cell');
     680    NewNode.AppendChild(NewNode2);
     681    WriteInteger(NewNode2, 'Id', I);
     682    WriteInteger(NewNode2, 'Power', Power);
     683    WriteInteger(NewNode2, 'Terrain', Integer(Terrain));
     684    WriteInteger(NewNode2, 'PosX', PosPx.X);
     685    WriteInteger(NewNode2, 'PosY', PosPx.Y);
     686  end;
     687end;
     688
    597689function TMap.PosToCell(Pos: TPoint; View: TView): TCell;
    598690var
     
    792884end;
    793885
     886procedure TUnitMove.LoadFromNode(Node: TDOMNode);
     887begin
     888  CountOnce := ReadInteger(Node, 'CountOnce', 0);
     889  CountRepeat := ReadInteger(Node, 'CountRepeat', 0);
     890  //CellFrom := ReadInteger(Node, 'CellFrom', 0);
     891  //CellTo := ReadInteger(Node, 'CellTo', 0);
     892end;
     893
     894procedure TUnitMove.SaveToNode(Node: TDOMNode);
     895begin
     896  WriteInteger(Node, 'CountOnce', CountOnce);
     897  WriteInteger(Node, 'CountRepeat', CountRepeat);
     898  WriteInteger(Node, 'CellFrom', CellFrom.Id);
     899  WriteInteger(Node, 'CellTo', CellTo.Id);
     900end;
     901
    794902constructor TUnitMove.Create;
    795903begin
     
    9171025  Neighbors := TObjectList.Create;
    9181026  Neighbors.OwnsObjects := False;
    919   MovesFrom := TObjectList.Create;
     1027  MovesFrom := TUnitMoves.Create;
    9201028  MovesFrom.OwnsObjects := False;
    921   MovesTo := TObjectList.Create;
     1029  MovesTo := TUnitMoves.Create;
    9221030  MovesTo.OwnsObjects := False;
    9231031end;
     
    9771085  FGame := AValue;
    9781086  View.Game := Game;
     1087end;
     1088
     1089procedure TPlayer.LoadFromNode(Node: TDOMNode);
     1090begin
     1091  Id := ReadInteger(Node, 'Id', 0);
     1092  Name := ReadString(Node, 'Name', '');
     1093  Color := ReadInteger(Node, 'Color', clSilver);
     1094  Mode := TPlayerMode(ReadInteger(Node, 'Mode', Integer(pmHuman)));
     1095end;
     1096
     1097procedure TPlayer.SaveToNode(Node: TDOMNode);
     1098begin
     1099  WriteInteger(Node, 'Id', Id);
     1100  WriteString(Node, 'Name', Name);
     1101  WriteInteger(Node, 'Color', Color);
     1102  WriteInteger(Node, 'Mode', Integer(Mode));
    9791103end;
    9801104
     
    13491473begin
    13501474  I := 0;
    1351   while (I < Moves.Count) and ((TUnitMove(Moves[I]).CellTo <> Move.CellFrom) and
     1475  while (I < Moves.Count) and ((TUnitMove(Moves[I]).CellTo <> Move.CellFrom) or
    13521476    (TUnitMove(Moves[I]).CellFrom <> Move.CellTo)) do Inc(I);
    13531477  if I < Moves.Count then CounterMove := TUnitMove(Moves[I])
     
    13901514    GrowCells := TGrowCells(GetValue(Path + '/GrowCells', Integer(gcPlayerAll)));
    13911515    WinObjective := TWinObjective(GetValue(Path + '/WinObjective', Integer(woDefeatAllOponents)));
     1516  end;
     1517end;
     1518
     1519procedure TGame.LoadFromFile(FileName: string);
     1520var
     1521  NewNode: TDOMNode;
     1522  Value: Integer;
     1523  Doc: TXMLDocument;
     1524  Dump: TStringList;
     1525  RootNode: TDOMNode;
     1526begin
     1527  Self.FileName := FileName;
     1528  ReadXMLFile(Doc, UTF8Decode(FileName));
     1529  with Doc do try
     1530    if Doc.DocumentElement.NodeName <> 'XtacticsGame' then
     1531      raise Exception.Create(SWrongFileFormat);
     1532    RootNode := Doc.DocumentElement;
     1533    with RootNode do begin
     1534      VoidEnabled := ReadBoolean(RootNode, 'VoidEnabled', False);
     1535      VoidPercentage := ReadInteger(RootNode, 'VoidPercentage', 0);
     1536      MaxNeutralUnits := ReadInteger(RootNode, 'MaxNeutralUnits', 3);
     1537      GrowCells := TGrowCells(ReadInteger(RootNode, 'GrowCells', Integer(gcNone)));
     1538      GrowAmount := TGrowAmount(ReadInteger(RootNode, 'GrowAmount', Integer(gaByOne)));
     1539      CityEnabled := ReadBoolean(RootNode, 'CityEnabled', False);
     1540      CityPercentage := ReadInteger(RootNode, 'CityPercentage', 0);
     1541      TurnCounter := ReadInteger(RootNode, 'TurnCounter', 0);
     1542      WinObjective := TWinObjective(ReadInteger(RootNode, 'WinObjective', Integer(woDefeatAllOponents)));
     1543      ReadInteger(RootNode, 'StayAliveForDefinedTurns', StayAliveForDefinedTurns);
     1544
     1545      NewNode := FindNode('Map');
     1546      if Assigned(NewNode) then
     1547        Map.LoadFromNode(NewNode);
     1548
     1549      NewNode := FindNode('Players');
     1550      if Assigned(NewNode) then
     1551        Players.LoadFromNode(NewNode);
     1552
     1553      NewNode := FindNode('UnitMoves');
     1554      if Assigned(NewNode) then
     1555        Moves.LoadFromNode(NewNode);
     1556    end;
     1557  finally
     1558    Doc.Free;
     1559  end;
     1560end;
     1561
     1562procedure TGame.SaveToFile(FileName: string);
     1563var
     1564  NewNode: TDOMNode;
     1565  NewNode2: TDOMNode;
     1566  Doc: TXMLDocument;
     1567  RootNode: TDOMNode;
     1568  I: Integer;
     1569begin
     1570  Self.FileName := FileName;
     1571  Doc := TXMLDocument.Create;
     1572  with Doc do try
     1573    RootNode := CreateElement('XtacticsGame');
     1574    AppendChild(RootNode);
     1575    with RootNode do begin
     1576      WriteBoolean(RootNode, 'VoidEnabled', VoidEnabled);
     1577      WriteInteger(RootNode, 'VoidPercentage', VoidPercentage);
     1578      WriteInteger(RootNode, 'MaxNeutralUnits', MaxNeutralUnits);
     1579      WriteInteger(RootNode, 'GrowCells', Integer(GrowCells));
     1580      WriteInteger(RootNode, 'GrowAmount', Integer(GrowAmount));
     1581      WriteBoolean(RootNode, 'CityEnabled', CityEnabled);
     1582      WriteInteger(RootNode, 'CityPercentage', CityPercentage);
     1583      WriteInteger(RootNode, 'TurnCounter', TurnCounter);
     1584      WriteInteger(RootNode, 'WinObjective', Integer(WinObjective));
     1585      WriteInteger(RootNode, 'StayAliveForDefinedTurns', StayAliveForDefinedTurns);
     1586
     1587      NewNode := OwnerDocument.CreateElement('Map');
     1588      AppendChild(NewNode);
     1589      Map.SaveToNode(NewNode);
     1590
     1591      NewNode := OwnerDocument.CreateElement('Players');
     1592      AppendChild(NewNode);
     1593      for I := 0 to Players.Count - 1 do begin;
     1594        NewNode2 := OwnerDocument.CreateElement('Player');
     1595        NewNode.AppendChild(NewNode2);
     1596        TPlayer(Players[I]).SaveToNode(NewNode2);
     1597      end;
     1598
     1599      NewNode := OwnerDocument.CreateElement('UnitMoves');
     1600      AppendChild(NewNode);
     1601      Moves.SaveToNode(NewNode);
     1602  end;
     1603    ForceDirectoriesUTF8(ExtractFileDir(FileName));
     1604    WriteXMLFile(Doc, UTF8Decode(FileName));
     1605  finally
     1606    Doc.Free;
    13921607  end;
    13931608end;
     
    14841699  Player: TPlayer;
    14851700begin
    1486   Moves := TObjectList.Create;
     1701  Moves := TUnitMoves.Create;
    14871702  Map := TMap.Create;
    14881703  Players := TPlayers.Create;
     
    15281743  C: Integer;
    15291744begin
     1745  FileName := SNewGameFile;
    15301746  TurnCounter := 1;
    15311747  Moves.Clear;
Note: See TracChangeset for help on using the changeset viewer.