From 6a3bf19703f7e0e5cf5d6e4cc57ca4823e185cce Mon Sep 17 00:00:00 2001 From: sekelsenmat Date: Wed, 22 Sep 2010 15:45:23 +0000 Subject: [PATCH] Advances fpchess up to being able to draw the board and tiles, and adds the tile images. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1324 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- applications/fpchess/chessdrawer.pas | 153 ++++++++++++---- applications/fpchess/chessgame.pas | 8 +- applications/fpchess/fpchess.lpi | 173 +++++++++++------- applications/fpchess/mainform.lfm | 38 ++-- applications/fpchess/mainform.pas | 4 +- applications/fpchess/skins/classic/base.png | Bin 13254 -> 12671 bytes .../fpchess/skins/classic/bbishop.png | Bin 0 -> 457 bytes applications/fpchess/skins/classic/bking.png | Bin 0 -> 510 bytes .../fpchess/skins/classic/bknight.png | Bin 0 -> 458 bytes applications/fpchess/skins/classic/bpawn.png | Bin 0 -> 315 bytes applications/fpchess/skins/classic/bqueen.png | Bin 0 -> 443 bytes applications/fpchess/skins/classic/brook.png | Bin 0 -> 343 bytes .../fpchess/skins/classic/wbishop.png | Bin 0 -> 505 bytes applications/fpchess/skins/classic/wking.png | Bin 0 -> 517 bytes .../fpchess/skins/classic/wknight.png | Bin 0 -> 479 bytes applications/fpchess/skins/classic/wpawn.png | Bin 0 -> 361 bytes applications/fpchess/skins/classic/wqueen.png | Bin 0 -> 550 bytes applications/fpchess/skins/classic/wrook.png | Bin 0 -> 379 bytes 18 files changed, 248 insertions(+), 128 deletions(-) create mode 100644 applications/fpchess/skins/classic/bbishop.png create mode 100644 applications/fpchess/skins/classic/bking.png create mode 100644 applications/fpchess/skins/classic/bknight.png create mode 100644 applications/fpchess/skins/classic/bpawn.png create mode 100644 applications/fpchess/skins/classic/bqueen.png create mode 100644 applications/fpchess/skins/classic/brook.png create mode 100644 applications/fpchess/skins/classic/wbishop.png create mode 100644 applications/fpchess/skins/classic/wking.png create mode 100644 applications/fpchess/skins/classic/wknight.png create mode 100644 applications/fpchess/skins/classic/wpawn.png create mode 100644 applications/fpchess/skins/classic/wqueen.png create mode 100644 applications/fpchess/skins/classic/wrook.png diff --git a/applications/fpchess/chessdrawer.pas b/applications/fpchess/chessdrawer.pas index dbb5f5e43..9e168f609 100644 --- a/applications/fpchess/chessdrawer.pas +++ b/applications/fpchess/chessdrawer.pas @@ -5,8 +5,8 @@ unit chessdrawer; interface uses - Classes, SysUtils, Controls, Graphics, LCLType, - // + Classes, SysUtils, Controls, Graphics, LCLType, IntfGraphics, fpimage, + Math, chessgame, chessconfig; type @@ -15,17 +15,21 @@ type TChessDrawer = class(TCustomControl) private - imgBoard, - imgWPawn, imgWKnight, imgWBishop, imgWRook, imgWQueen, imgWKing, - imgBPawn, imgBKnight, imgBBishop, imgBRook, imgBQueen, imgBKing: - TPortableNetworkGraphic; + imgBoard, imgWPawn, imgWKnight, imgWBishop, imgWRook, imgWQueen, + imgWKing, imgBPawn, imgBKnight, imgBBishop, imgBRook, imgBQueen, + imgBKing: TPortableNetworkGraphic; +{ bmpBoard, bmpWPawn, bmpWKnight, bmpWBishop, bmpWRook, bmpWQueen, + bmpWKing, bmpBPawn, bmpBKnight, bmpBBishop, bmpBRook, bmpBQueen, + bmpBKing: TBitmap;} public constructor Create(AOwner: TComponent); override; procedure EraseBackground(DC: HDC); override; procedure Paint; override; procedure DrawToCanvas(ACanvas: TCanvas); - procedure DrawChessTile(ACanvas: TCanvas; ACol, ARow: Integer; - ATile: TChessTile); + procedure DrawImageWithTransparentColor( + ADest: TLazIntfImage; const ADestX, ADestY: Integer; AColor: TFPColor; + AImage: TFPImageBitmap); + function GetChessTileImage(ATile: TChessTile): TPortableNetworkGraphic; procedure LoadImages(); end; @@ -51,6 +55,20 @@ begin imgBRook := TPortableNetworkGraphic.Create; imgBQueen := TPortableNetworkGraphic.Create; imgBKing := TPortableNetworkGraphic.Create; + +{ bmpBoard := TBitmap.Create; + bmpWPawn := TBitmap.Create; + bmpWKnight := TBitmap.Create; + bmpWBishop := TBitmap.Create; + bmpWRook := TBitmap.Create; + bmpWQueen := TBitmap.Create; + bmpWKing := TBitmap.Create; + bmpBPawn := TBitmap.Create; + bmpBKnight := TBitmap.Create; + bmpBBishop := TBitmap.Create; + bmpBRook := TBitmap.Create; + bmpBQueen := TBitmap.Create; + bmpBKing := TBitmap.Create; } end; procedure TChessDrawer.EraseBackground(DC: HDC); @@ -61,7 +79,7 @@ end; procedure TChessDrawer.Paint; var - x, y: Integer; + x, y: integer; Bitmap: TBitmap; begin Bitmap := TBitmap.Create; @@ -77,45 +95,96 @@ begin Bitmap.Free; end; -// inherited Paint; + // inherited Paint; end; procedure TChessDrawer.DrawToCanvas(ACanvas: TCanvas); var - col, row: Integer; + col, row: integer; + lIntfImage: TLazIntfImage; + lTmpBmp: TBitmap; + lTileBmp: TPortableNetworkGraphic; + X, Y: integer; begin - // First draw the board - ACanvas.Draw(0, 0, imgBoard); + lIntfImage := TLazIntfImage.Create(0, 0); + lTmpBmp := TBitmap.Create; + try + // First draw the board + lIntfImage.LoadFromBitmap(imgBoard.Handle, 0{bmpBoard.MaskHandle}); - // Now all pieces - for col := 1 to 8 do - for row := 1 to 8 do - DrawChessTile(ACanvas, col, row, vChessGame.Board[col][row]); + // Now all pieces + for col := 1 to 8 do + for row := 1 to 8 do + begin + lTileBmp := GetChessTileImage(vChessGame.Board[col][row]); + if lTileBmp = nil then Continue; + + X := (col - 1) * INT_CHESSTILE_SIZE; + Y := (8 - row) * INT_CHESSTILE_SIZE; + + DrawImageWithTransparentColor(lIntfImage, X, Y, FPCOLOR_TRANSPARENT_TILE, lTileBmp); + end; + + lTmpBmp.LoadFromIntfImage(lIntfImage); + ACanvas.Draw(0, 0, lTmpBmp); + finally + lTmpBmp.Free; + lIntfImage.Free; + end; end; -procedure TChessDrawer.DrawChessTile(ACanvas: TCanvas; ACol, ARow: Integer; - ATile: TChessTile); +procedure TChessDrawer.DrawImageWithTransparentColor(ADest: TLazIntfImage; + const ADestX, ADestY: Integer; AColor: TFPColor; AImage: TFPImageBitmap); var - X, Y: Integer; + x, y, CurX, CurY: Integer; + CurColor: TFPColor; + IntfImage: TLazIntfImage; + lDrawWidth, lDrawHeight: Integer; begin - if ATile = ctEmpty then Exit; + IntfImage := TLazIntfImage.Create(0,0); + try + IntfImage.LoadFromBitmap(AImage.Handle, AImage.MaskHandle); - X := (ACol - 1) * INT_CHESSTILE_SIZE; - Y := (8 - ARow) * INT_CHESSTILE_SIZE; + // Take care not to draw outside the destination area + lDrawWidth := Min(ADest.Width - ADestX, AImage.Width); + lDrawHeight := Min(ADest.Height - ADestY, AImage.Height); + for y := 0 to lDrawHeight - 1 do + begin + for x := 0 to lDrawWidth - 1 do + begin + CurX := ADestX + x; + CurY := ADestY + y; + // Never draw outside the destination + if (CurX < 0) or (CurY < 0) then Continue; + + // CurColor := IntfImage.Colors[x, y]; // Just for debugging + if IntfImage.Colors[x, y].Green <> AColor.Green then + ADest.Colors[CurX, CurY] := IntfImage.Colors[x, y]; + end; + end; + finally + IntfImage.Free; + end; +end; + +function TChessDrawer.GetChessTileImage(ATile: TChessTile): TPortableNetworkGraphic; +begin case ATile of - ctWPawn: ACanvas.Draw(X, Y, imgWPawn); - ctWKnight: ACanvas.Draw(X, Y, imgWKnight); - ctWBishop: ACanvas.Draw(X, Y, imgWBishop); - ctWRook: ACanvas.Draw(X, Y, imgWRook); - ctWQueen: ACanvas.Draw(X, Y, imgWQueen); - ctWKing: ACanvas.Draw(X, Y, imgWKing); - ctBPawn: ACanvas.Draw(X, Y, imgBPawn); - ctBKnight: ACanvas.Draw(X, Y, imgBKnight); - ctBBishop: ACanvas.Draw(X, Y, imgBBishop); - ctBRook: ACanvas.Draw(X, Y, imgBRook); - ctBQueen: ACanvas.Draw(X, Y, imgBQueen); - ctBKing: ACanvas.Draw(X, Y, imgBKing); + ctWPawn: Result := imgWPawn; + ctWKnight: Result := imgWKnight; + ctWBishop: Result := imgWBishop; + ctWRook: Result := imgWRook; + ctWQueen: Result := imgWQueen; + ctWKing: Result := imgWKing; + ctBPawn: Result := imgBPawn; + ctBKnight: Result := imgBKnight; + ctBBishop: Result := imgBBishop; + ctBRook: Result := imgBRook; + ctBQueen: Result := imgBQueen; + ctBKing: Result := imgBKing; + else + Result := nil; end; end; @@ -125,7 +194,7 @@ var begin lDir := vChessConfig.GetCurrentSkinDir(); - imgBoard.LoadFromFile(lDir + 'board.png'); + imgBoard.LoadFromFile(lDir + 'base.png'); imgWPawn.LoadFromFile(lDir + 'wpawn.png'); imgWKnight.LoadFromFile(lDir + 'wknight.png'); imgWBishop.LoadFromFile(lDir + 'wbishop.png'); @@ -138,6 +207,18 @@ begin imgBRook.LoadFromFile(lDir + 'brook.png'); imgBQueen.LoadFromFile(lDir + 'bqueen.png'); imgBKing.LoadFromFile(lDir + 'bking.png'); + +{ bmpWKnight.Assign(imgWKnight); + bmpWKnight.Assign(imgWBishop); + bmpWKnight.Assign(imgWRook); + bmpWKnight.Assign(imgWQueen); + bmpWKnight.Assign(imgWKing); + bmpWKnight.Assign(imgBPawn); + bmpWKnight.Assign(imgBKnight); + bmpWKnight.Assign(imgBBishop); + bmpWKnight.Assign(imgBRook); + bmpWKnight.Assign(imgBQueen); + bmpWKnight.Assign(imgBKing); } end; end. diff --git a/applications/fpchess/chessgame.pas b/applications/fpchess/chessgame.pas index 164bd7444..03eed0fa6 100644 --- a/applications/fpchess/chessgame.pas +++ b/applications/fpchess/chessgame.pas @@ -5,7 +5,7 @@ unit chessgame; interface uses - Classes, SysUtils; + Classes, SysUtils, fpimage; const colA = 1; @@ -17,8 +17,10 @@ const colG = 7; colH = 8; - INT_CHESSTILE_SIZE = 20; - INT_CHESSBOARD_SIZE = 200; + INT_CHESSTILE_SIZE = 40; + INT_CHESSBOARD_SIZE = 40 * 8; + + FPCOLOR_TRANSPARENT_TILE: TFPColor = (Red: $0000; Green: $8000; Blue: $8000; Alpha: alphaOpaque); //colTeal type diff --git a/applications/fpchess/fpchess.lpi b/applications/fpchess/fpchess.lpi index 25f142f43..fd5a64be4 100644 --- a/applications/fpchess/fpchess.lpi +++ b/applications/fpchess/fpchess.lpi @@ -31,12 +31,12 @@ - + - + @@ -46,9 +46,9 @@ - - - + + + @@ -164,9 +164,9 @@ - - - + + + @@ -222,9 +222,9 @@ - - - + + + @@ -233,132 +233,177 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - + - + - + - + - + - + diff --git a/applications/fpchess/mainform.lfm b/applications/fpchess/mainform.lfm index e51311434..e127f5898 100644 --- a/applications/fpchess/mainform.lfm +++ b/applications/fpchess/mainform.lfm @@ -18,10 +18,8 @@ object formChess: TformChess TabOrder = 0 TabStop = True object pageStart: TUNBPage - Left = 0 - Height = 300 - Top = 0 - Width = 240 + ClientWidth = 240 + ClientHeight = 300 object Label1: TLabel Left = 0 Height = 32 @@ -72,7 +70,7 @@ object formChess: TformChess end object editPlayerName: TLabeledEdit Left = 104 - Height = 22 + Height = 21 Top = 80 Width = 120 EditLabel.AnchorSideLeft.Control = editPlayerName @@ -80,10 +78,10 @@ object formChess: TformChess EditLabel.AnchorSideTop.Side = asrCenter EditLabel.AnchorSideRight.Control = editPlayerName EditLabel.AnchorSideBottom.Control = editPlayerName - EditLabel.Left = 22 - EditLabel.Height = 17 + EditLabel.Left = 40 + EditLabel.Height = 14 EditLabel.Top = 83 - EditLabel.Width = 79 + EditLabel.Width = 61 EditLabel.Caption = 'Player Name' EditLabel.ParentColor = False LabelPosition = lpLeft @@ -91,9 +89,9 @@ object formChess: TformChess end object Label6: TLabel Left = 21 - Height = 17 + Height = 14 Top = 112 - Width = 52 + Width = 43 Caption = 'Start as:' ParentColor = False end @@ -102,7 +100,7 @@ object formChess: TformChess Height = 21 Top = 111 Width = 120 - ItemHeight = 0 + ItemHeight = 13 ItemIndex = 0 Items.Strings = ( 'White' @@ -113,10 +111,8 @@ object formChess: TformChess end end object pageConfigConnection: TUNBPage - Left = 0 - Height = 300 - Top = 0 - Width = 240 + ClientWidth = 240 + ClientHeight = 300 object Label3: TLabel Left = 0 Height = 32 @@ -180,10 +176,8 @@ object formChess: TformChess end end object pageConnecting: TUNBPage - Left = 0 - Height = 300 - Top = 0 - Width = 240 + ClientWidth = 240 + ClientHeight = 300 object Label4: TLabel Left = 0 Height = 32 @@ -205,10 +199,8 @@ object formChess: TformChess end end object pageGame: TUNBPage - Left = 0 - Height = 300 - Top = 0 - Width = 240 + ClientWidth = 240 + ClientHeight = 300 object Label5: TLabel Left = 0 Height = 32 diff --git a/applications/fpchess/mainform.pas b/applications/fpchess/mainform.pas index 110c9febc..4cbcf13c0 100644 --- a/applications/fpchess/mainform.pas +++ b/applications/fpchess/mainform.pas @@ -56,7 +56,7 @@ procedure TformChess.HandleMainScreenButton(Sender: TObject); begin if Sender = btnSinglePlayer then begin - notebookMain.PageIndex := 2; + notebookMain.PageIndex := 3; vChessGame.StartNewGame(comboStartColor.ItemIndex); end else if Sender = btnDirectComm then notebookMain.PageIndex := 1; @@ -67,7 +67,7 @@ begin // Creation of internal components vChessDrawer := TChessDrawer.Create(Self); vChessDrawer.Parent := pageGame; - vChessDrawer.Top := 20; + vChessDrawer.Top := 50; vChessDrawer.Left := 20; vChessDrawer.Height := INT_CHESSBOARD_SIZE; vChessDrawer.Width := INT_CHESSBOARD_SIZE; diff --git a/applications/fpchess/skins/classic/base.png b/applications/fpchess/skins/classic/base.png index ca816133b120a26451bf296e4b293f9932eadca6..3d11fe471f89907296b52e7a794f2bcb699a8930 100644 GIT binary patch literal 12671 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 literal 13254 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 G@xK7x_RF~d diff --git a/applications/fpchess/skins/classic/bbishop.png b/applications/fpchess/skins/classic/bbishop.png new file mode 100644 index 0000000000000000000000000000000000000000..4d49fe100c49b4aff6bb3a9f2b4e265259f43e35 GIT binary patch literal 457 zcmV;)0XF`LP)^2vQi8(Dv7^2vVD2&C+H+i_1MRv2@fMfu-t z$32k&ft&&6T`2*{NHn;@40 zG_psG4J#XB5Co@zgas1;u*xb(j*bSHT@JBm2IzF}Wg4`I<);8GrC20DipBqN@x!1) zIO|lbl=oWo0`*N*@oaz=aEDFnz)qP(u9Lq_My+;XfEOixb?+1%u9C|OkQbsY_IQ6$ zxLVnBx!4ekg;F)8M*!5Wm(AKw+?^q>L4%F=k?v6w!Jzgn#w?NufITp+_wdK0%EdCM zNfdn7>}yuno!VHrmK0v`UNLMnx^&z(-e(2Aqj2bMus8=-7#Ll1IzXw;5P(_$QzdMv zhcEF%3peo9~4`@L^VUkBjI_tJ2`=&r2ZG~l-V)8qI>cY8J?!jysy5J5I5X)^*k z4TvBm+!BBYLWX=qx$7gRURJrMm1~ewYj`iqB0zSYN=!lK+f~r2N*zkA5c}^{yp^k6 zk$7-gl}r_9{K{zE0HaQxwu69AFPin=<)GtWKQDL3U`6x?=C-CG0aVD>Ew`=S z^)>RY4wAs7d}RS8j9kcsRLY@uTt72_2b7tUAQ~1(Dd6Eut3?avRME040rb?O3#c4U ze<0lINY#aNu}ZyeqBeRJ3lnNP!@1Y(_krGpLhbe-^$;l^Zu)Sd4m8*dAhL}&dutvf zy$n^h6>1p)+M>FMvVk?bhmP303`KyEwi6DkIS)D$Nu)6|8~B`^SLm^GBxIR)ssUSZ zWUIIp3Y~&dMIsJ4Ss-SAfmSIfl{1^HvlB@LZ!M|{Fbfs7p9W-S*-SxbTL#w+3q?IK zq+SFr1?ZezLO^;-c?>Y>xXO+;>Z*lC{j3i70RjXgazf!G-~a#s07*qoM6N<$f_R0~ A=l}o! literal 0 HcmV?d00001 diff --git a/applications/fpchess/skins/classic/bknight.png b/applications/fpchess/skins/classic/bknight.png new file mode 100644 index 0000000000000000000000000000000000000000..7e82f9df13f27f2421c7c137e619860ce8f8722c GIT binary patch literal 458 zcmV;*0X6=KP)r=LEFR#8T;G1tZTq#xg{KG+j9Ly^Ln_>-a1tg^4kw~^XDz4K2qtt}~ zJt|Vwy^5Lu3FQ8}B)3nWTR}~LM3D+0LAK|tjRg`0?2<$T_}fyO0ThMI1Z*KNJq!W~ z0a{B8WABDs1z6Q|L8^cO>d|axAthH^0k!N!Iu84e8Kej(WbR$iVZ9kp2y{dx%?4JH zRWLa2X0VWo1K=V!n$?#B^sasqkcAWh7pm8HnN!6nAd|74X+@iI`gf|ya{2J-n!J{Y zXLyix>KddvP!%sRXaVHvmLo)T1qYuWJyTR72o8!vEsLQ!&Y>LFpV>qa3w8e;60Dq0 zL1c(*HaC^a1q^~yi?up#CAsxp42lD!@ec!_v^X@F6$Cc47V9{`1i083Oaz>cTqYMM z0S+NC?Zrq9%!X74Rs?dTjmgC;!Om{=#HNNlzuD>rdNwzLZU6uP07*qoM6N<$g1Hc~ AbpQYW literal 0 HcmV?d00001 diff --git a/applications/fpchess/skins/classic/bpawn.png b/applications/fpchess/skins/classic/bpawn.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5182d145219968a1e226dc844bddd3881eda7e GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEEa{HEjtmSN`?>!lvI6<+C7!;n z?AKX@xWu_s_J!{S3f=c~aSVxYe|!BQSF-^R%Y%1kYd`n;wJBXb{nd}dwE3Te>+gx1 zH}1Q&X;1X4c=j~8m4)|9jKkkY9=P@^?RJ~Cr1uf`JMZ^1YciiN&`V*wI^+5J2ftSR zvA^=lvsNINFZ}jG<+MbtDNL(&OuQz{wyQwLh^6GQ#1k2ZD|$iOX4+br3fRtH@hijb z3s2nLB@HW%czvBwRVNSIdtk!=MiP#8R2 L{an^LB{Ts5!LEXX literal 0 HcmV?d00001 diff --git a/applications/fpchess/skins/classic/bqueen.png b/applications/fpchess/skins/classic/bqueen.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a8699d775c9636e62cdf95cfb880e9d4b0d92f GIT binary patch literal 443 zcmV;s0Yv_ZP)>0BFS@~WhAHZ9O z_}3whFH@AmA-0T-!hJW$?54^}!`d3CoVm#iK&_Hf0nxsO=2axTJ%;tD;}RJ$&h|iU zO&U-$EW>OnN|Etrv1sP=bl##@kuiLPf(GitJSPJ}41)(Lu1J2dL3 z(F{Fkn#nK}T>}EN+#fZJ>OFv{r@ZQh?j(w_`SUC@9{W@sdOkGAtp<_>^5l1*;c;sP zl*UYN2+vy{-ylZ;yI~p0H>rCCVC!XiLm7Y-z%uU1biaEOy?ZCg3}utkQ2s%eCL-yr z%2f+1%Y$CqV85q(ux%G?5lG$o8~TUrA2|p&X($KJoNm1Qg8|QgMBpgEEJze=yYaCK lSIfIaay5{&_W%w?;0-UkTV(=hK(PP-002ovPDHLkV1fokyfXj* literal 0 HcmV?d00001 diff --git a/applications/fpchess/skins/classic/brook.png b/applications/fpchess/skins/classic/brook.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f24759da96e2bcc60f05cf4b047d9e078c827e GIT binary patch literal 343 zcmV-d0jU0oP)JWPk3TyMbs_tk*-r zs+NQ-8Q1l4eP*993}Y~TB0;T?Y`zM)Ua9(E8_AKX=8VsqgvWKn7@ezm}?sq+G z4Z{yiOk@K6ytcREYnta}y7g-X?0rwu`Xk%>Wa~`4VQ?O%9QQ(w09>|LrQ!!HTxZn# zmLGe8KR;9IHVXcl?5RPmlT8}edfS!E)|GOSYtTVd4PhF@uha493vA6Dfw=D~br~gl z0Cyj8A1sXhDs84CU>Yz$r8ZT|?<&mpcO{^;9=R4_ zK(O|ZR8whY0nzkEiZz}XjcCnYk9yLkpaSSqeLDpU;GzG&Ll>#LyxDKEH5j8UUN zN4^+7!$iOeU{Qhvl?Db1Fxc**8Sr#2MC_%gNdr1a6tFoDsXzIlN%Ta@|3)Z?Y-{o! zJOc1&oC?91DP{zq+{I}9_0}NMAhbdMTS3VKLj|M1EWB?CvtbHY?rr1R5~zI8!->b? z)WY7YNim^{Tzf!_M(JHa(R|O;VmrNQCJ)G{bGm)8X$|Xt&-L~fTGk}iWNl%io)$Gj vwpPXRfM~!g&kF&s4A^sTY24}wNM8E}iT4~IQzjnv00000NkvXXu0mjffzRA~ literal 0 HcmV?d00001 diff --git a/applications/fpchess/skins/classic/wking.png b/applications/fpchess/skins/classic/wking.png new file mode 100644 index 0000000000000000000000000000000000000000..a982397fd2169d9268f372ff624e81e7825a027e GIT binary patch literal 517 zcmV+g0{Z=lP)JMBShJ=WaSBrL?`P zV8p~MnGBxS_6qwf>$)vdUpwH;_tbDlbZ1tt8*o|n{Ka>V2we)EaNFWe;e?E zI|$FKQua;2OEn33!Ifuk16rz8-^~ChL)wITIABznaxqaDI>fGm?A+HnO%*e?v5)z; z$Z|{7WL_R))L3Xul?X}^nc#ZSW?^A7J!2bS6EILCREJgkOb6>lLTf4^25KNkT^L&J z2<#C+55V(72C$m5DUzgu`mJS~v&{Q7K-5WCuqMo-6!ZYIU^JlB_?gADRWQGS-dXJj z6E=f9?+%=4?jB&Tigy6r?OE08l<9g4$;~NhTe`ZD`lU6pz1TF-ME9^>K$|+(>YScD zBKcDOzl%n5kqIek`DIWMn~Lm{EAC zA}LLq_?s=$qZzmqVD|9s!LnfPZYDdy)8nC0KMjE9pB?ZE#OXXv5bT!Y00000NkvXX Hu0mjfY1QTK literal 0 HcmV?d00001 diff --git a/applications/fpchess/skins/classic/wknight.png b/applications/fpchess/skins/classic/wknight.png new file mode 100644 index 0000000000000000000000000000000000000000..35bca188dbeb955d453fd2808a2fda5e42e5e50f GIT binary patch literal 479 zcmV<50U-W~P)v;(l2UL>B<(yZuCsuT z>VWX0pfsRSu?D1Iv!D`SdC1%D2y*>BR8<9)0G&8QkRhl7Nds1J1!`4^JsL$>NEMI; zvg=&S8Au9{h&dKqR`Tb7y>{6Jbkr*HHF-Z#RhO9oZD$EWCY0AgR)b(9@@MEG)dvLvifGITPT1#C82@@Ae>Z^ z;Q=!`QVN^LvrK!w)e1B!Z@j>Z8i3q7q`6` zl^GB8th&irY-7sq=G;R1-R))7gW=O17T~1u4TrG4zz_fc002ovPDHLkV1nee%{>4B literal 0 HcmV?d00001 diff --git a/applications/fpchess/skins/classic/wpawn.png b/applications/fpchess/skins/classic/wpawn.png new file mode 100644 index 0000000000000000000000000000000000000000..a36cbaf3d23d193a80dbfceb6850dc1501fb95d5 GIT binary patch literal 361 zcmV-v0ha!WP)TH2);(;w&>}F`k^5W{?6_&Vt9GT>0H!)>uV~DGfSZO~wF!{q zriTQi0+Qj}kXFFM{}$Bhd;Ws`KOiz`7|*H^WPAj9M|8j^p(L1@yFFZE00000NkvXX Hu0mjfcN3Nq literal 0 HcmV?d00001 diff --git a/applications/fpchess/skins/classic/wqueen.png b/applications/fpchess/skins/classic/wqueen.png new file mode 100644 index 0000000000000000000000000000000000000000..2900f140977b39a5e333074e85898abab6e6a1a0 GIT binary patch literal 550 zcmV+>0@?kEP)f?1z07!J+4i~ zOi4E$EwvfI22KE!mVs9Zok}H6Fkm;EXWDO`;L8nakOf?C2+z_y_gs2={ zVwfCEVvkG4h4vMeI65H!-~g#iqG=vH0S4-Y3bLGo&14TG$!its&5>>t z2De$-(B1@ccby4>C~JrUI$aJlYUE)=Jw?I3tD#l}6|7E*UWrwqqZb+@?JE@pRj8Q> z@TQme5>gSiP-ww}@51py4#zl!jpA$&s$RGTL0hGkS&8!+-n18cT8?@#n}MDfomjg_ z0-yrftHLHFo%>FS9d$A|tGpBtbk9r~cK>65EU|N6F0Z3tIi~vK%JD=v27L{n0l0Z^ z6iX*X^V5J9&;_F>5zS8n-hfBphVF%VptJ^0+{yM1mI2Yry4W0qn}}6TI!VwVN5E95 o=7nnJp>IAj_1nxJ@cqxj9en;Z$o_H_6951J07*qoM6N<$g1dI;6#xJL literal 0 HcmV?d00001 diff --git a/applications/fpchess/skins/classic/wrook.png b/applications/fpchess/skins/classic/wrook.png new file mode 100644 index 0000000000000000000000000000000000000000..210abab6751c16641342cb3e0f019be9c91c27fe GIT binary patch literal 379 zcmV->0fhdEP)&AYf(XIt<< z=w=#B{ITs?z5$;4O3SjQsYeE!c}@-YsV>T1O1TBDvwhA>L$N#taNS4ECXqq2#*#sE z@VyPX@9_Z40jQoVfiD0}f3_O35?+93n32!!fcb@1>6>A}oUL02Y~^-viK? Z;WzjKz(kziEvEng002ovPDHLkV1g(mq@Dl( literal 0 HcmV?d00001