lazarus-ccr/applications/fpchess/mainform.pas
sekelsenmat f59a8e2941 fpchess: FICS playing now works =)
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1906 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2011-09-06 12:24:08 +00:00

319 lines
8.2 KiB
ObjectPascal

{
}
unit mainform;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
ExtCtrls, ComCtrls, StdCtrls, Buttons, Spin,
// fpchess
chessdrawer, chessgame, chessconfig, chesstcputils,
chessmodules, selectpromotionpiece;
type
{ TFormDrawerDelegate }
TFormDrawerDelegate = class(TChessDrawerDelegate)
public
procedure HandleMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); override;
procedure HandleMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); override;
procedure HandleMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); override;
end;
{ TformChess }
TformChess = class(TForm)
btnGameNewGame: TBitBtn;
btnResign: TBitBtn;
btnQuitGame: TBitBtn;
btnQuit: TBitBtn;
btnStartGame: TBitBtn;
btnPlayAgainstAI: TButton;
checkTimer: TCheckBox;
comboGameMode: TComboBox;
comboStartColor: TComboBox;
editLocalIP: TLabeledEdit;
editWebserviceURL: TLabeledEdit;
Label1: TLabel;
labelMode: TLabel;
labelTime: TLabel;
Label2: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
editWebServiceAI: TLabeledEdit;
labelPos: TLabel;
editPlayerName: TLabeledEdit;
memoDebug: TMemo;
pageStart: TPage;
notebookMain: TNotebook;
panelModules: TPanel;
pageGame: TPage;
spinPlayerTime: TSpinEdit;
timerChessTimer: TTimer;
pageWebservice: TPage;
procedure btnGameNewGameClick(Sender: TObject);
procedure btnQuitClick(Sender: TObject);
procedure btnQuitGameClick(Sender: TObject);
procedure btnStartGameClick(Sender: TObject);
procedure comboGameModeSelect(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure timerChessTimerTimer(Sender: TObject);
private
{ private declarations }
function FormatTime(ATimeInMiliseconds: Integer): string;
procedure UpdateChessModulesUI(ANewIndex: Integer);
function HandlePawnPromotion(APiece: TChessTile): TChessTile;
public
{ public declarations }
procedure UpdateCaptions;
procedure InitializeGameModel;
end;
var
formChess: TformChess;
vFormDrawerDelegate: TFormDrawerDelegate;
procedure HandleOnMove(AFrom, ATo: TPoint);
implementation
{$R *.lfm}
const
INT_PAGE_START = 0;
INT_PAGE_GAME = 1;
INT_PAGE_WEBSERVICE = 2;
{ TformChess }
procedure TformChess.timerChessTimerTimer(Sender: TObject);
begin
vChessGame.UpdateTimes();
UpdateCaptions();
vChessDrawer.HandleOnTimer(Sender);
GetCurrentChessModule().HandleOnTimer();
end;
function TformChess.FormatTime(ATimeInMiliseconds: Integer): string;
var
lTimePart: Integer;
begin
Result := '';
// Hours
lTimePart := ATimeInMiliseconds div (60*60*1000);
if lTimePart > 0 then
Result := IntToStr(lTimePart) + 'h';
// Minutes
lTimePart := (ATimeInMiliseconds div (60*1000)) mod 60;
if (lTimePart > 0) or (Result <> '') then
Result := Result + IntToStr(lTimePart) + 'm';
// Seconds
lTimePart := (ATimeInMiliseconds div (1000)) mod 60;
Result := Result + IntToStr(lTimePart) + 's';
// Miliseconds
lTimePart := ATimeInMiliseconds mod (1000);
Result := Result + IntToStr(lTimePart);
end;
procedure TformChess.UpdateChessModulesUI(ANewIndex: Integer);
var
lModule: TChessModule;
begin
if ANewIndex = gSelectedModuleIndex then Exit;
lModule := GetChessModule(gSelectedModuleIndex);
if lModule <> nil then lModule.HideUserInterface();
GetChessModule(ANewIndex).ShowUserInterface(panelModules);
end;
function TformChess.HandlePawnPromotion(APiece: TChessTile): TChessTile;
var
dlgPromotion: TformPromotion;
begin
dlgPromotion := TformPromotion.Create(vChessGame.IsWhitePlayerTurn);
try
dlgPromotion.ShowModal;
finally
dlgPromotion.Free;
Result := selectPromotionPiece.pieceChosen;
end;
end;
procedure HandleOnMove(AFrom, ATo: TPoint);
var
lStr: String;
begin
lStr := vChessGame.GetCurrentPlayerColor();
lStr := Format('%s executed the move %s-%s', [lStr, vChessGame.BoardPosToChessCoords(AFrom), vChessGame.BoardPosToChessCoords(ATo)]);
formChess.MemoDebug.Lines.Add(lStr);
end;
procedure TformChess.UpdateCaptions;
var
lStr, lStr2: string;
begin
if vChessGame.IsWhitePlayerTurn then lStr := 'White playing'
else lStr := 'Black playing';
lStr2 := vChessGame.BoardPosToChessCoords(vChessGame.MouseMovePos);
lStr := lStr + Format(' X: %d Y: %d = %s',
[vChessGame.MouseMovePos.X, vChessGame.MouseMovePos.Y, lStr2]);
formChess.labelPos.Caption := lStr;
lStr := Format('White time: %s Black time: %s',
[FormatTime(vChessGame.WhitePlayerTime), FormatTime(vChessGame.BlackPlayerTime)]);
formChess.labelTime.Caption := lStr;
lStr := GetChessModule(gSelectedModuleIndex).PlayingDescription;
formChess.labelMode.Caption := lStr;
end;
procedure TformChess.InitializeGameModel;
begin
vChessGame.StartNewGame(comboStartColor.ItemIndex, checkTimer.Checked, spinPlayerTime.Value);
end;
procedure TformChess.FormCreate(Sender: TObject);
begin
// Creation of internal components
vChessDrawer := TChessDrawer.Create(Self);
vChessDrawer.Parent := pageGame;
vChessDrawer.Top := 50;
vChessDrawer.Left := 20;
vChessDrawer.Height := INT_CHESSBOARD_SIZE;
vChessDrawer.Width := INT_CHESSBOARD_SIZE;
vChessDrawer.SetDelegate(vFormDrawerDelegate);
// Loading of resources
vChessDrawer.LoadImages();
// Prepare the modules view
InitializeGameModel();
editLocalIP.Text := ChessGetLocalIP();
PopulateChessModulesList(comboGameMode.Items);
if GetChessModuleCount() >= 1 then
begin
comboGameMode.ItemIndex := 0;
UpdateChessModulesUI(0);
gSelectedModuleIndex := 0;
end;
gChessModulesDebugOutputDestiny := memoDebug;
// Prepare the callbacks
vChessGame.OnBeforeMove := @HandleOnMove;
vChessGame.OnPawnPromotion := @HandlePawnPromotion;
end;
procedure TformChess.btnQuitClick(Sender: TObject);
begin
Close;
end;
procedure TformChess.btnGameNewGameClick(Sender: TObject);
begin
notebookMain.PageIndex := INT_PAGE_START;
timerChessTimer.Enabled := False;
end;
procedure TformChess.btnQuitGameClick(Sender: TObject);
begin
Close;
end;
procedure TformChess.btnStartGameClick(Sender: TObject);
var
lModule: TChessModule;
begin
InitializeGameModel();
vChessGame.Enabled := False;
notebookMain.PageIndex := INT_PAGE_GAME;
gSelectedModuleIndex := comboGameMode.ItemIndex;
lModule := GetChessModule(gSelectedModuleIndex);
vChessGame.PlayerName := editPlayerName.Text;
lModule.PrepareForGame();
// Make sure this is done after lModule.PrepareForGame()
vChessGame.Enabled := True;
timerChessTimer.Enabled := True;
end;
procedure TformChess.comboGameModeSelect(Sender: TObject);
begin
UpdateChessModulesUI(comboGameMode.ItemIndex);
gSelectedModuleIndex := comboGameMode.ItemIndex;
end;
{ TFormDrawerDelegate }
procedure TFormDrawerDelegate.HandleMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
vChessGame.MouseMovePos := vChessGame.ClientToBoardCoords(Point(X, Y));
formChess.UpdateCaptions;
end;
procedure TFormDrawerDelegate.HandleMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
lCoords: TPoint;
lModule: TChessModule;
begin
lModule := GetChessModule(gSelectedModuleIndex);
if not lModule.IsMovingAllowedNow() then Exit;
vChessGame.Dragging := False;
lCoords := vChessGame.ClientToBoardCoords(Point(X, Y));
if not vChessGame.MovePiece(vChessGame.DragStart, lCoords) then Exit;
vChessDrawer.Invalidate;
formChess.UpdateCaptions;
end;
procedure TFormDrawerDelegate.HandleMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
lCoords: TPoint;
lModule: TChessModule;
begin
lModule := GetChessModule(gSelectedModuleIndex);
if not lModule.IsMovingAllowedNow() then Exit;
lCoords := vChessGame.ClientToBoardCoords(Point(X, Y));
if not vChessGame.CheckStartMove(lCoords) then Exit;
vChessGame.Dragging := True;
vChessGame.DragStart := lCoords;
vChessDrawer.Invalidate;
formChess.UpdateCaptions;
end;
initialization
vFormDrawerDelegate := TFormDrawerDelegate.Create;
finalization
vFormDrawerDelegate.Free;
end.