Changeset 29 for trunk/UGame.pas
- Timestamp:
- Mar 3, 2014, 11:17:23 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/UGame.pas
r28 r29 120 120 end; 121 121 122 TPlayerArray = array of TPlayer; 123 122 124 TPlayers = class(TObjectList) 123 125 … … 143 145 FRunning: Boolean; 144 146 procedure MoveAll(Player: TPlayer); 147 procedure ClearMovesFromCell(Cell: TCell); 145 148 procedure SetMove(CellFrom, CellTo: TCell; Power: Integer); 146 149 procedure SetRunning(AValue: Boolean); 150 procedure UpdateRepeatMoves(Player: TPlayer); 147 151 public 148 152 Players: TPlayers; … … 154 158 155 159 procedure ComputePlayerStats; 160 function GetAlivePlayers: TPlayerArray; 156 161 procedure NextTurn; 157 162 constructor Create; … … 333 338 begin 334 339 for Y := 0 to Game.Map.Size.Y - 1 do 335 for X := 0 to Game.Map.Size. Y- 1 do340 for X := 0 to Game.Map.Size.X - 1 do 336 341 with TCell(Game.Map.Cells[Y, X]) do begin 337 342 if (Terrain <> ttVoid) and (Player <> Self) then begin … … 344 349 end; 345 350 // Attack if target is weaker 346 if TotalPower > Power then begin351 if TotalPower >= Power then begin 347 352 TotalAttackPower := 0; 348 353 for I := 0 to Length(Cells) - 1 do … … 434 439 CellTo.Power := CountOnce - CellTo.Power; 435 440 CellTo.Player := Player; 441 ClearMovesFromCell(CellTo); 436 442 end; 437 443 end; … … 448 454 Moves.Delete(I); 449 455 end; 456 end; 457 458 procedure TGame.ClearMovesFromCell(Cell: TCell); 459 var 460 I: Integer; 461 begin 462 for I := Moves.Count - 1 to 0 do 463 if TMove(Moves[I]).CellFrom = Cell then 464 Moves.Delete(I); 450 465 end; 451 466 … … 510 525 end; 511 526 527 procedure TGame.UpdateRepeatMoves(Player: TPlayer); 528 var 529 I: Integer; 530 begin 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; 538 end; 539 512 540 procedure TGame.ComputePlayerStats; 513 541 var … … 522 550 end; 523 551 552 function TGame.GetAlivePlayers: TPlayerArray; 553 var 554 I: Integer; 555 begin 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; 562 end; 563 524 564 procedure TGame.NextTurn; 525 565 var 526 AlivePlayers: TObjectList;527 I: Integer;528 566 PrevPlayer: TPlayer; 567 AlivePlayers: TPlayerArray; 529 568 begin 530 569 MoveAll(CurrentPlayer); … … 537 576 until CurrentPlayer.TotalCells > 0; 538 577 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); 551 584 end; 552 585 … … 574 607 Map := THexMap.Create; 575 608 Map.Game := Self; 576 Map.Size := Point(20, 20);609 Map.Size := Point(20, 16); 577 610 Moves := TObjectList.Create; 578 611 end; … … 758 791 Pen.Color := clYellow; 759 792 Pen.Style := psSolid; 793 Pen.Width := 1; 760 794 end else begin 761 795 Pen.Color := clBlack; … … 764 798 Pen.Color := Brush.Color; 765 799 Pen.Style := psSolid; 800 Pen.Width := 0; 766 801 end; 767 802 Points := GetHexagonPolygon(Point(Trunc(Pos.X), Trunc(Pos.Y)), Point(Trunc(HexSize.X), Trunc(HexSize.Y))); … … 812 847 PosFrom := CellToPos(Cell, View); 813 848 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; 814 851 Line(View.CellToCanvasPos(Point(Trunc(PosFrom.X + (PosTo.X - PosFrom.X) / 4), 815 852 Trunc(PosFrom.Y + (PosTo.Y - PosFrom.Y) / 4))), 816 853 View.CellToCanvasPos(Point(Trunc(PosFrom.X + (PosTo.X - PosFrom.X) / 2), 817 854 Trunc(PosFrom.Y + (PosTo.Y - PosFrom.Y) / 2)))); 855 Pen.Width := 1; 818 856 end; 819 857 end;
Note:
See TracChangeset
for help on using the changeset viewer.