Changeset 29 for trunk/UGame.pas


Ignore:
Timestamp:
Mar 3, 2014, 11:17:23 PM (10 years ago)
Author:
chronos
Message:
  • Added: Player customize dialog window.
  • Fixed: Rearm once set move count from predefined repeat move count.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UGame.pas

    r28 r29  
    120120  end;
    121121
     122  TPlayerArray = array of TPlayer;
     123
    122124  TPlayers = class(TObjectList)
    123125
     
    143145    FRunning: Boolean;
    144146    procedure MoveAll(Player: TPlayer);
     147    procedure ClearMovesFromCell(Cell: TCell);
    145148    procedure SetMove(CellFrom, CellTo: TCell; Power: Integer);
    146149    procedure SetRunning(AValue: Boolean);
     150    procedure UpdateRepeatMoves(Player: TPlayer);
    147151  public
    148152    Players: TPlayers;
     
    154158
    155159    procedure ComputePlayerStats;
     160    function GetAlivePlayers: TPlayerArray;
    156161    procedure NextTurn;
    157162    constructor Create;
     
    333338begin
    334339  for Y := 0 to Game.Map.Size.Y - 1 do
    335   for X := 0 to Game.Map.Size.Y - 1 do
     340  for X := 0 to Game.Map.Size.X - 1 do
    336341  with TCell(Game.Map.Cells[Y, X]) do begin
    337342    if (Terrain <> ttVoid) and (Player <> Self) then begin
     
    344349      end;
    345350      // Attack if target is weaker
    346       if TotalPower > Power then begin
     351      if TotalPower >= Power then begin
    347352        TotalAttackPower := 0;
    348353        for I := 0 to Length(Cells) - 1 do
     
    434439          CellTo.Power := CountOnce - CellTo.Power;
    435440          CellTo.Player := Player;
     441          ClearMovesFromCell(CellTo);
    436442        end;
    437443      end;
     
    448454    Moves.Delete(I);
    449455  end;
     456end;
     457
     458procedure TGame.ClearMovesFromCell(Cell: TCell);
     459var
     460  I: Integer;
     461begin
     462  for I := Moves.Count - 1 to 0 do
     463  if TMove(Moves[I]).CellFrom = Cell then
     464    Moves.Delete(I);
    450465end;
    451466
     
    510525end;
    511526
     527procedure TGame.UpdateRepeatMoves(Player: TPlayer);
     528var
     529  I: Integer;
     530begin
     531  for I := 0 to Moves.Count - 1 do
     532  with TMove(Moves[I]) do begin
     533    if CellFrom.Player = Player then
     534      if CountRepeat <= CellFrom.GetAvialPower then
     535        CountOnce := CountRepeat
     536        else CountOnce := CellFrom.GetAvialPower;
     537  end;
     538end;
     539
    512540procedure TGame.ComputePlayerStats;
    513541var
     
    522550end;
    523551
     552function TGame.GetAlivePlayers: TPlayerArray;
     553var
     554  I: Integer;
     555begin
     556  SetLength(Result, 0);
     557  for I := 0 to Players.Count - 1 do
     558    if TPlayer(Players[I]).TotalCells > 0 then begin
     559      SetLength(Result, Length(Result) + 1);
     560      Result[Length(Result) - 1] := TPlayer(Players[I]);
     561    end;
     562end;
     563
    524564procedure TGame.NextTurn;
    525565var
    526   AlivePlayers: TObjectList;
    527   I: Integer;
    528566  PrevPlayer: TPlayer;
     567  AlivePlayers: TPlayerArray;
    529568begin
    530569  MoveAll(CurrentPlayer);
     
    537576  until CurrentPlayer.TotalCells > 0;
    538577  if Players.IndexOf(CurrentPlayer) < Players.IndexOf(PrevPlayer) then Inc(TurnCounter);
    539   try
    540     AlivePlayers := TObjectList.Create;
    541     AlivePlayers.OwnsObjects := False;
    542     for I := 0 to Players.Count - 1 do
    543       if TPlayer(Players[I]).TotalCells > 0 then AlivePlayers.Add(TPlayer(Players[I]));
    544     if AlivePlayers.Count <= 1 then begin
    545       Running := False;
    546       if (AlivePlayers.Count = 1) and Assigned(OnWin) then OnWin(TPlayer(AlivePlayers.First));
    547     end;
    548   finally
    549     AlivePlayers.Free;
    550   end;
     578  AlivePlayers := GetAlivePlayers;
     579  if (Length(AlivePlayers) <= 1) then begin
     580    Running := False;
     581    if Assigned(OnWin) and (Length(AlivePlayers) > 0) then OnWin(TPlayer(AlivePlayers[0]));
     582  end;
     583  UpdateRepeatMoves(CurrentPlayer);
    551584end;
    552585
     
    574607  Map := THexMap.Create;
    575608  Map.Game := Self;
    576   Map.Size := Point(20, 20);
     609  Map.Size := Point(20, 16);
    577610  Moves := TObjectList.Create;
    578611end;
     
    758791      Pen.Color := clYellow;
    759792      Pen.Style := psSolid;
     793      Pen.Width := 1;
    760794    end else begin
    761795      Pen.Color := clBlack;
     
    764798      Pen.Color := Brush.Color;
    765799      Pen.Style := psSolid;
     800      Pen.Width := 0;
    766801    end;
    767802    Points := GetHexagonPolygon(Point(Trunc(Pos.X), Trunc(Pos.Y)), Point(Trunc(HexSize.X), Trunc(HexSize.Y)));
     
    812847            PosFrom := CellToPos(Cell, View);
    813848            PosTo := CellToPos(TMove(Cell.MovesFrom[I]).CellTo, View);
     849            if TMove(Cell.MovesFrom[I]).CountRepeat > 0 then Pen.Width := 2
     850              else Pen.Width := 1;
    814851            Line(View.CellToCanvasPos(Point(Trunc(PosFrom.X + (PosTo.X - PosFrom.X) / 4),
    815852              Trunc(PosFrom.Y + (PosTo.Y - PosFrom.Y) / 4))),
    816853              View.CellToCanvasPos(Point(Trunc(PosFrom.X + (PosTo.X - PosFrom.X) / 2),
    817854              Trunc(PosFrom.Y + (PosTo.Y - PosFrom.Y) / 2))));
     855            Pen.Width := 1;
    818856          end;
    819857        end;
Note: See TracChangeset for help on using the changeset viewer.