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

Changeset 128 for trunk/UGame.pas


Ignore:
Timestamp:
Jun 17, 2017, 5:55:16 PM (7 years ago)
Author:
chronos
Message:
  • Added: Graph window can be shown from menu which presents development of various statistic values during game turns.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UGame.pas

    r127 r128  
    77uses
    88  Classes, SysUtils, ExtCtrls, Graphics, Contnrs, XMLConf, XMLRead, XMLWrite,
    9   DOM, Math, FileUtil, UXMLUtils, Dialogs, Types, LCLType, LCLIntf;
     9  DOM, Math, LazFileUtils, UXMLUtils, Dialogs, Types, LCLType, LCLIntf;
    1010
    1111const
     
    243243  end;
    244244
     245  { TGameTurnStat }
     246
     247  TGameTurnStat = class
     248    OccupiedCells: Integer;
     249    Units: Integer;
     250    DiscoveredCells: Integer;
     251    Cities: Integer;
     252    procedure LoadFromNode(Node: TDOMNode);
     253    procedure SaveToNode(Node: TDOMNode);
     254  end;
     255
     256  { TGameTurnStats }
     257
     258  TGameTurnStats = class(TObjectList)
     259    procedure LoadFromNode(Node: TDOMNode);
     260    procedure SaveToNode(Node: TDOMNode);
     261  end;
     262
    245263  TPlayerMode = (pmHuman, pmComputer);
    246264  TComputerAgressivity = (caLow, caMedium, caHigh);
     
    262280    TotalCells: Integer;
    263281    TotalCities: Integer;
     282    TotalDiscovered: Integer;
    264283    StartUnits: Integer;
    265284    StartCell: TCell;
     
    267286    Defensive: Boolean;
    268287    Agressivity: TComputerAgressivity;
     288    TurnStats: TGameTurnStats;
     289    procedure Clear;
    269290    procedure LoadFromNode(Node: TDOMNode);
    270291    procedure SaveToNode(Node: TDOMNode);
     
    385406    procedure MoveAll(Player: TPlayer);
    386407    procedure ClearMovesFromCell(Cell: TCell);
     408    procedure RecordTurnStats;
    387409    procedure SetMapType(AValue: TMapType);
    388410    function SetMove(CellFrom, CellTo: TCell; Power: Integer; Confirmation: Boolean = True): TUnitMove;
     
    543565end;
    544566
     567{ TGameTurnStat }
     568
     569procedure TGameTurnStat.LoadFromNode(Node: TDOMNode);
     570begin
     571  OccupiedCells := ReadInteger(Node, 'OccupiedCells', 0);
     572  Units := ReadInteger(Node, 'Units', 0);
     573  DiscoveredCells := ReadInteger(Node, 'DiscoveredCells', 0);
     574  Cities := ReadInteger(Node, 'Cities', 0);
     575end;
     576
     577procedure TGameTurnStat.SaveToNode(Node: TDOMNode);
     578begin
     579  WriteInteger(Node, 'OccupiedCells', OccupiedCells);
     580  WriteInteger(Node, 'Units', Units);
     581  WriteInteger(Node, 'DiscoveredCells', DiscoveredCells);
     582  WriteInteger(Node, 'Cities', Cities);
     583end;
     584
     585{ TGameTurnStats }
     586
     587procedure TGameTurnStats.LoadFromNode(Node: TDOMNode);
     588var
     589  Node2: TDOMNode;
     590  NewTurnStat: TGameTurnStat;
     591begin
     592  Count := 0;
     593  Node2 := Node.FirstChild;
     594  while Assigned(Node2) and (Node2.NodeName = 'TurnStat') do begin
     595    NewTurnStat := TGameTurnStat.Create;
     596    NewTurnStat.LoadFromNode(Node2);
     597    Add(NewTurnStat);
     598    Node2 := Node2.NextSibling;
     599  end;
     600end;
     601
     602procedure TGameTurnStats.SaveToNode(Node: TDOMNode);
     603var
     604  I: Integer;
     605  NewNode: TDOMNode;
     606begin
     607  for I := 0 to Count - 1 do begin;
     608    NewNode := Node.OwnerDocument.CreateElement('TurnStat');
     609    Node.AppendChild(NewNode);
     610    TGameTurnStat(Items[I]).SaveToNode(NewNode);
     611  end;
     612end;
     613
    545614{ TClients }
    546615
     
    18171886end;
    18181887
     1888procedure TPlayer.Clear;
     1889begin
     1890  TurnStats.Clear;
     1891end;
     1892
    18191893procedure TPlayer.SetClient(AValue: TClient);
    18201894begin
     
    18431917      PlayerMap.LoadFromNode(NewNode);
    18441918  end;
     1919  with Node do begin
     1920    NewNode := FindNode('TurnStats');
     1921    if Assigned(NewNode) then
     1922      TurnStats.LoadFromNode(NewNode);
     1923  end;
    18451924end;
    18461925
     
    18621941    AppendChild(NewNode);
    18631942    PlayerMap.SaveToNode(NewNode);
     1943  end;
     1944  with Node do begin
     1945    NewNode := OwnerDocument.CreateElement('TurnStats');
     1946    AppendChild(NewNode);
     1947    TurnStats.SaveToNode(NewNode);
    18641948  end;
    18651949end;
     
    22472331  PlayerMap := TPlayerMap.Create;
    22482332  PlayerMap.Player := Self;
     2333  TurnStats := TGameTurnStats.Create;
    22492334end;
    22502335
    22512336destructor TPlayer.Destroy;
    22522337begin
     2338  FreeAndNil(TurnStats);
    22532339  FreeAndNil(PlayerMap);
    22542340  inherited Destroy;
     
    28842970var
    28852971  I: Integer;
     2972  J: Integer;
    28862973begin
    28872974  for I := 0 to Players.Count - 1 do
     
    28902977    TotalCells := 0;
    28912978    TotalCities := 0;
    2892   end;
     2979
     2980    TotalDiscovered := 0;
     2981    for J := 0 to PlayerMap.Cells.Count - 1 do
     2982    with TPlayerCell(PlayerMap.Cells[J]) do begin
     2983      if Explored then Inc(TotalDiscovered);
     2984    end;
     2985  end;
     2986
    28932987  Map.ComputePlayerStats;
     2988end;
     2989
     2990procedure TGame.RecordTurnStats;
     2991var
     2992  I: Integer;
     2993  NewStat: TGameTurnStat;
     2994begin
     2995  for I := 0 to Players.Count - 1 do
     2996  with TPlayer(Players[I]) do begin
     2997    NewStat := TGameTurnStat.Create;
     2998    NewStat.DiscoveredCells := TotalDiscovered;
     2999    NewStat.OccupiedCells := TotalCells;
     3000    NewStat.Units := TotalUnits;
     3001    NewStat.Cities := TotalCities;
     3002    TurnStats.Add(NewStat);
     3003  end;
    28943004end;
    28953005
     
    29273037  UpdateRepeatMoves(CurrentPlayer);
    29283038  ComputePlayerStats;
     3039  RecordTurnStats;
    29293040  PrevPlayer := CurrentPlayer;
    29303041  // Skip dead players
     
    30453156  for I := 0 to Players.Count - 1 do
    30463157  with TPlayer(Players[I]) do begin
     3158    Clear;
    30473159    PlayerMap.Update;
    30483160    if (Map.Size.X > 0) and (Map.Size.Y > 0) then begin
Note: See TracChangeset for help on using the changeset viewer.