summaryrefslogtreecommitdiff
path: root/plugins/Chess4Net/PromotionUnit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Chess4Net/PromotionUnit.pas')
-rw-r--r--plugins/Chess4Net/PromotionUnit.pas159
1 files changed, 159 insertions, 0 deletions
diff --git a/plugins/Chess4Net/PromotionUnit.pas b/plugins/Chess4Net/PromotionUnit.pas
new file mode 100644
index 0000000000..91abacbad7
--- /dev/null
+++ b/plugins/Chess4Net/PromotionUnit.pas
@@ -0,0 +1,159 @@
+unit PromotionUnit;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, ExtCtrls,
+ // Chess4net
+ ChessRulesEngine, ChessBoardHeaderUnit, BitmapResUnit;
+
+type
+ TPromotionForm = class(TForm)
+ PromFigImage: TImage;
+ procedure FormShow(Sender: TObject);
+ procedure PromFigImageMouseUp(Sender: TObject; Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+ procedure FormKeyPress(Sender: TObject; var Key: Char);
+ private
+ m_iSquareSize: integer;
+ m_BitmapRes: TBitmapRes;
+ m_bmFigure: array[TFigure] of TBitmap;
+ m_fig_color: TFigureColor;
+ m_fig: TFigureName;
+ procedure FLoadFigures;
+ public
+ function ShowPromotion(color: TFigureColor): TFigureName;
+ constructor Create(AOwner: TComponent; BitmapRes: TBitmapRes); reintroduce;
+ destructor Destroy; override;
+ end;
+
+implementation
+
+{$R *.dfm}
+
+const
+ INDENT_SIZE = 2;
+
+////////////////////////////////////////////////////////////////////////////////
+// TPromotionForm
+
+procedure TPromotionForm.FormShow(Sender: TObject);
+var
+ k: byte;
+begin
+ if (m_iSquareSize <> m_BitmapRes.SquareSize) then
+ FLoadFigures;
+
+ // Установить окно в пределах курсора
+ Left := Mouse.CursorPos.X - m_iSquareSize div 2;
+ Top := Mouse.CursorPos.Y - m_iSquareSize div 2;
+ if (Left + Width > Screen.Width) then
+ Left := Screen.Width - Width;
+
+ with PromFigImage.Canvas do
+ begin
+ Brush.Color:= Color;
+ FillRect(Rect(0,0, Width, PromFigImage.Height));
+
+ Brush.Color:= clWhite;
+ for k := 0 to 3 do
+ FillRect(Rect((m_iSquareSize + INDENT_SIZE) * k, 0,
+ (m_iSquareSize + INDENT_SIZE) * k + m_iSquareSize - 1, m_iSquareSize - 1));
+
+ case m_fig_color of
+ fcWhite:
+ begin
+ Draw(0, 0, m_bmFigure[WQ]);
+ Draw(m_iSquareSize + 2, 0, m_bmFigure[WR]);
+ Draw(2 * (m_iSquareSize + INDENT_SIZE), 0, m_bmFigure[WB]);
+ Draw(3 * (m_iSquareSize + INDENT_SIZE), 0, m_bmFigure[WN]);
+ end;
+ fcBlack:
+ begin
+ Draw(0, 0, m_bmFigure[BQ]);
+ Draw(m_iSquareSize + INDENT_SIZE, 0, m_bmFigure[BR]);
+ Draw(2 * (m_iSquareSize + INDENT_SIZE), 0, m_bmFigure[BB]);
+ Draw(3 * (m_iSquareSize + INDENT_SIZE), 0, m_bmFigure[BN]);
+ end;
+ end;
+ end;
+end;
+
+
+function TPromotionForm.ShowPromotion(color: TFigureColor): TFigureName;
+begin
+ m_fig_color := color;
+ ShowModal;
+ Result := m_fig;
+end;
+
+
+procedure TPromotionForm.PromFigImageMouseUp(Sender: TObject;
+ Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+begin
+ case X div (m_BitmapRes.SquareSize + 1) of
+ 1: m_fig:= R;
+ 2: m_fig:= B;
+ 3: m_fig:= N;
+ else
+ m_fig:= Q;
+ end;
+ Close;
+end;
+
+procedure TPromotionForm.FormKeyPress(Sender: TObject; var Key: Char);
+begin
+ Key:= UpCase(Key);
+ case Key of
+ 'Q', '1', ' ', #13:
+ m_fig:= Q;
+ 'R', '2':
+ m_fig:= R;
+ 'B', '3':
+ m_fig:= B;
+ 'N', '4':
+ m_fig:= N;
+ else
+ exit;
+ end;
+ Close;
+end;
+
+
+constructor TPromotionForm.Create(AOwner: TComponent; BitmapRes: TBitmapRes);
+begin
+ self.FormStyle := (AOwner as TForm).FormStyle;
+ inherited Create(AOwner);
+ m_BitmapRes := BitmapRes;
+ FLoadFigures;
+end;
+
+
+destructor TPromotionForm.Destroy;
+var
+ fig: TFigure;
+begin
+ for fig := Low(m_bmFigure) to High(m_bmFigure) do
+ m_bmFigure[fig].Free;
+ inherited;
+end;
+
+
+procedure TPromotionForm.FLoadFigures;
+var
+ fig: TFigure;
+begin
+ for fig := Low(m_bmFigure) to High(m_bmFigure) do
+ begin
+ FreeAndNil(m_bmFigure[fig]);
+ m_BitmapRes.CreateFigureBitmap(fig, m_bmFigure[fig]);
+ end;
+ m_iSquareSize := m_BitmapRes.SquareSize;
+
+ // Adjust size of the form
+ PromFigImage.Width := 4 * m_iSquareSize + 3 * INDENT_SIZE;
+ PromFigImage.Height := m_iSquareSize;
+end;
+
+end.