mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-15 12:53:46 +03:00
Compare commits
5 Commits
dev
...
7d5fe64891
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7d5fe64891 | ||
|
|
43711b24fe | ||
|
|
62ff43d321 | ||
|
|
37c7fc044a | ||
|
|
94063e4369 |
21
README.md
21
README.md
@@ -1,14 +1,11 @@
|
||||
# Willard Networks: Community Edition
|
||||
**We provide these files as is**. While you shouldn't use them like this on a production server, it's a good start for your own Willard Networks branch server! We don't provide direct support, but you can create an issue in this repository.
|
||||
# Willard Networks: France (Echo One)
|
||||
This branch contains files related to the **Willard Networks: Echo One**. They were retrieved on 2024/08/04 and are presented as is with minimal edits. This means that potential developers' bugs have been kept in their original form and it is up to you to resolve them. We do not and will not provide direct support (i.e. regular updates or patches). However, you can always create an issue, pointing out the problem.
|
||||
|
||||
### Navigation:
|
||||
* **Framework**\
|
||||
Databases, logs and so on are included
|
||||
* [Willard Networks: Development Server](https://google.com)
|
||||
* [Willard Networks: France (Echo One)](https://google.com)
|
||||
* [Willard Networks: Poland (Veles)](https://google.com)
|
||||
* [Willard Networks: Turkey](https://google.com)
|
||||
* **Forum**
|
||||
* [User data stack (including e-mails)](https://google.com/)
|
||||
**The files provided contain:**
|
||||
* Half-Life 2 RPG framework by Willard Networks, used on the French server as of 2024/08/04.
|
||||
* Settings (data/\*, settings/\*) used on the French server as of 2024/08/04.
|
||||
* Credentials from the French server database (including the master and SAM database).
|
||||
* Helix logs (data/helix/logs) from the French server as of 2024/08/04.
|
||||
|
||||
Bluntsmoke, Inc. © 2024
|
||||
**The files provided do not contain:**
|
||||
* Exported dump of databases (including the master and SAM database), since these files are overweight and cannot be uploaded to GitHub. Despite this, it is included in builds distributed via [The Twilight Zone](https://wnsrc.plymouth.thetwilightzone.ru/).
|
||||
|
||||
9
addons/checkers/checkers.vdf
Normal file
9
addons/checkers/checkers.vdf
Normal file
@@ -0,0 +1,9 @@
|
||||
"Checkers"
|
||||
{
|
||||
"DisplayName" "Checkers"
|
||||
"interface" "SteamAddOnCheckers001"
|
||||
"GameID" "ValveCheckers"
|
||||
"InviteUserMenu" "1"
|
||||
"TrackerMainMenu" "0"
|
||||
"SingleInvite" "1"
|
||||
}
|
||||
1
addons/checkers/checkers_danish.txt
Normal file
1
addons/checkers/checkers_danish.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_dutch.txt
Normal file
1
addons/checkers/checkers_dutch.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_english.txt
Normal file
1
addons/checkers/checkers_english.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_finnish.txt
Normal file
1
addons/checkers/checkers_finnish.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_french.txt
Normal file
1
addons/checkers/checkers_french.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_german.txt
Normal file
1
addons/checkers/checkers_german.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_italian.txt
Normal file
1
addons/checkers/checkers_italian.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_japanese.txt
Normal file
1
addons/checkers/checkers_japanese.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_korean.txt
Normal file
1
addons/checkers/checkers_korean.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_koreana.txt
Normal file
1
addons/checkers/checkers_koreana.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_norwegian.txt
Normal file
1
addons/checkers/checkers_norwegian.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_polish.txt
Normal file
1
addons/checkers/checkers_polish.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_portuguese.txt
Normal file
1
addons/checkers/checkers_portuguese.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_russian.txt
Normal file
1
addons/checkers/checkers_russian.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_schinese.txt
Normal file
1
addons/checkers/checkers_schinese.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_spanish.txt
Normal file
1
addons/checkers/checkers_spanish.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_swedish.txt
Normal file
1
addons/checkers/checkers_swedish.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_tchinese.txt
Normal file
1
addons/checkers/checkers_tchinese.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/checkers/checkers_thai.txt
Normal file
1
addons/checkers/checkers_thai.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
85
addons/checkers/dialogcheckershistory.res
Normal file
85
addons/checkers/dialogcheckershistory.res
Normal file
@@ -0,0 +1,85 @@
|
||||
"AddOns/Checkers/DialogCheckersHistory.res"
|
||||
{
|
||||
"DialogCheckersHistory"
|
||||
{
|
||||
"ControlName" "CDialogCheckersHistory"
|
||||
"fieldName" "DialogCheckersHistory"
|
||||
"xpos" "20"
|
||||
"ypos" "22"
|
||||
"wide" "575"
|
||||
"tall" "380"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"BoardCheckers"
|
||||
{
|
||||
"ControlName" "ImagePanel"
|
||||
"fieldName" "BoardCheckers"
|
||||
"xpos" "15"
|
||||
"ypos" "35"
|
||||
"wide" "320"
|
||||
"tall" "320"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"SummaryLabel"
|
||||
{
|
||||
"ControlName" "Label"
|
||||
"fieldName" "SummaryLabel"
|
||||
"xpos" "360"
|
||||
"ypos" "25"
|
||||
"wide" "200"
|
||||
"tall" "48"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#SteamAddOn_ReviewMoves"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
}
|
||||
"MoveHistoryPanel"
|
||||
{
|
||||
"ControlName" "ListPanel"
|
||||
"fieldName" "MoveHistoryPanel"
|
||||
"xpos" "360"
|
||||
"ypos" "72"
|
||||
"wide" "200"
|
||||
"tall" "250"
|
||||
"autoResize" "3"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
}
|
||||
"CloseButton"
|
||||
{
|
||||
"ControlName" "Button"
|
||||
"fieldName" "CloseButton"
|
||||
"xpos" "485"
|
||||
"ypos" "335"
|
||||
"wide" "75"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "3"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#SteamAddOn_Close"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"Default" "0"
|
||||
}
|
||||
}
|
||||
254
addons/checkers/dialoggamecheckers.res
Normal file
254
addons/checkers/dialoggamecheckers.res
Normal file
@@ -0,0 +1,254 @@
|
||||
"Friends/DialogGameCheckers.res"
|
||||
{
|
||||
"DialogGameCheckers"
|
||||
{
|
||||
"ControlName" "CDialogGameGo"
|
||||
"fieldName" "DialogGameCheckers"
|
||||
"xpos" "20"
|
||||
"ypos" "22"
|
||||
"wide" "600"
|
||||
"tall" "435"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"SysMenu"
|
||||
{
|
||||
"ControlName" "Menu"
|
||||
"fieldName" "SysMenu"
|
||||
"xpos" "0"
|
||||
"ypos" "0"
|
||||
"wide" "64"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "0"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"BoardCheckers"
|
||||
{
|
||||
"ControlName" "ImagePanel"
|
||||
"fieldName" "BoardCheckers"
|
||||
"xpos" "15"
|
||||
"ypos" "35"
|
||||
"wide" "320"
|
||||
"tall" "320"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"ChatTextLog"
|
||||
{
|
||||
"ControlName" "URLTextEntry"
|
||||
"fieldName" "ChatTextLog"
|
||||
"xpos" "350"
|
||||
"ypos" "135"
|
||||
"wide" "235"
|
||||
"tall" "222"
|
||||
"autoResize" "3"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "0"
|
||||
"tabPosition" "0"
|
||||
"textHidden" "0"
|
||||
"editable" "0"
|
||||
"maxchars" "-1"
|
||||
}
|
||||
"TextEntry"
|
||||
{
|
||||
"ControlName" "TextEntry"
|
||||
"fieldName" "TextEntry"
|
||||
"xpos" "350"
|
||||
"ypos" "370"
|
||||
"wide" "165"
|
||||
"tall" "24"
|
||||
"autoResize" "1"
|
||||
"pinCorner" "2"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"textHidden" "0"
|
||||
"editable" "1"
|
||||
"maxchars" "-1"
|
||||
"unicode" "1"
|
||||
}
|
||||
"SendBtn"
|
||||
{
|
||||
"ControlName" "Button"
|
||||
"fieldName" "SendBtn"
|
||||
"xpos" "524"
|
||||
"ypos" "370"
|
||||
"wide" "64"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "3"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#SteamAddOn_Btn_Send"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"default" "1"
|
||||
}
|
||||
"DeclareDrawBtn"
|
||||
{
|
||||
"ControlName" "Button"
|
||||
"fieldName" "DeclareDrawBtn"
|
||||
"xpos" "20"
|
||||
"ypos" "370"
|
||||
"wide" "100"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "0"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#Checkers_Btn_DeclareDraw"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"default" "0"
|
||||
}
|
||||
"ResignBtn"
|
||||
{
|
||||
"ControlName" "Button"
|
||||
"fieldName" "ResignBtn"
|
||||
"xpos" "135"
|
||||
"ypos" "370"
|
||||
"wide" "80"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "0"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#SteamAddOn_Btn_Resign"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"default" "0"
|
||||
}
|
||||
"ShowHistoryBtn"
|
||||
{
|
||||
"ControlName" "Button"
|
||||
"fieldName" "ShowHistoryBtn"
|
||||
"xpos" "227"
|
||||
"ypos" "370"
|
||||
"wide" "110"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#SteamAddOn_Btn_ShowHistory"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"Default" "0"
|
||||
}
|
||||
"LastMoveLabel"
|
||||
{
|
||||
"ControlName" "Label"
|
||||
"fieldName" "LastMoveLabel"
|
||||
"xpos" "20"
|
||||
"ypos" "405"
|
||||
"wide" "250"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "2"
|
||||
"visible" "0"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "Last Move made at:"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
}
|
||||
"TurnLabel"
|
||||
{
|
||||
"ControlName" "Label"
|
||||
"fieldName" "TurnLabel"
|
||||
"xpos" "535"
|
||||
"ypos" "405"
|
||||
"wide" "64"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "3"
|
||||
"visible" "0"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "Turn: 1"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
}
|
||||
"RedIcon"
|
||||
{
|
||||
"ControlName" "ImagePanel"
|
||||
"fieldName" "RedIcon"
|
||||
"xpos" "396"
|
||||
"ypos" "86"
|
||||
"wide" "12"
|
||||
"tall" "12"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"WhiteIcon"
|
||||
{
|
||||
"ControlName" "ImagePanel"
|
||||
"fieldName" "WhiteIcon"
|
||||
"xpos" "396"
|
||||
"ypos" "41"
|
||||
"wide" "12"
|
||||
"tall" "12"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"RedName"
|
||||
{
|
||||
"ControlName" "Label"
|
||||
"fieldName" "RedName"
|
||||
"xpos" "415"
|
||||
"ypos" "80"
|
||||
"wide" "100"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "0"
|
||||
"enabled" "0"
|
||||
"tabPosition" "0"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
}
|
||||
"WhiteName"
|
||||
{
|
||||
"ControlName" "Label"
|
||||
"fieldName" "WhiteName"
|
||||
"xpos" "415"
|
||||
"ypos" "35"
|
||||
"wide" "100"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "0"
|
||||
"enabled" "0"
|
||||
"tabPosition" "0"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
}
|
||||
}
|
||||
1
addons/checkers/piece_red.tga.b64
Normal file
1
addons/checkers/piece_red.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/checkers/piece_red_king.tga.b64
Normal file
1
addons/checkers/piece_red_king.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/checkers/piece_white.tga.b64
Normal file
1
addons/checkers/piece_white.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/checkers/piece_white_king.tga.b64
Normal file
1
addons/checkers/piece_white_king.tga.b64
Normal file
File diff suppressed because one or more lines are too long
40
addons/checkers/reslist.lst
Normal file
40
addons/checkers/reslist.lst
Normal file
@@ -0,0 +1,40 @@
|
||||
addons\checkers\Checkers.dll
|
||||
addons\checkers\checkers.vdf
|
||||
addons\checkers\checkers_chinese.txt
|
||||
addons\checkers\checkers_english.txt
|
||||
addons\checkers\checkers_french.txt
|
||||
addons\checkers\checkers_german.txt
|
||||
addons\checkers\checkers_italian.txt
|
||||
addons\checkers\checkers_korean.txt
|
||||
addons\checkers\checkers_spanish.txt
|
||||
addons\checkers\DialogCheckersHistory.res
|
||||
addons\checkers\DialogGameCheckers.res
|
||||
addons\checkers\piece_red.tga
|
||||
addons\checkers\piece_red_king.tga
|
||||
addons\checkers\piece_white.tga
|
||||
addons\checkers\piece_white_king.tga
|
||||
addons\common\AddOnDialogWaiting.res
|
||||
addons\common\board_checkered_LL.tga
|
||||
addons\common\board_checkered_LR.tga
|
||||
addons\common\board_checkered_UL.tga
|
||||
addons\common\board_checkered_UR.tga
|
||||
addons\common\DialogColorChoice.res
|
||||
addons\common\DialogWaiting.res
|
||||
addons\common\piece_black_move.tga
|
||||
addons\common\piece_blank_selected.tga
|
||||
addons\common\piece_red_lastmove.tga
|
||||
addons\common\piece_red_move.tga
|
||||
addons\common\piece_red_selected.tga
|
||||
addons\common\piece_white_move.tga
|
||||
addons\common\player_red_marker.tga
|
||||
addons\common\player_white_marker.tga
|
||||
addons\common\SteamAddOns_chinese.txt
|
||||
addons\common\SteamAddOns_english.txt
|
||||
addons\common\SteamAddOns_french.txt
|
||||
addons\common\SteamAddOns_german.txt
|
||||
addons\common\SteamAddOns_italian.txt
|
||||
addons\common\SteamAddOns_korean.txt
|
||||
addons\common\SteamAddOns_spanish.txt
|
||||
addons\common\turn_marker.tga
|
||||
addons\common\TwoPlayerColorChoiceDialog.res
|
||||
|
||||
9
addons/chess/addon.txt
Normal file
9
addons/chess/addon.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
"AddonInfo"
|
||||
{
|
||||
"name" "Chess"
|
||||
"version" "1.3.10"
|
||||
"author_name" "my_hat_stinks"
|
||||
"author_url" ""
|
||||
"info" "Let's play Chess"
|
||||
"override" "0"
|
||||
}
|
||||
9
addons/chess/chess.vdf
Normal file
9
addons/chess/chess.vdf
Normal file
@@ -0,0 +1,9 @@
|
||||
"Chess"
|
||||
{
|
||||
"DisplayName" "Chess"
|
||||
"interface" "SteamAddOnChess001"
|
||||
"GameID" "ValveChess"
|
||||
"InviteUserMenu" "1"
|
||||
"TrackerMainMenu" "0"
|
||||
"SingleInvite" "1"
|
||||
}
|
||||
1
addons/chess/chess_danish.txt
Normal file
1
addons/chess/chess_danish.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_dutch.txt
Normal file
1
addons/chess/chess_dutch.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_english.txt
Normal file
1
addons/chess/chess_english.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_finnish.txt
Normal file
1
addons/chess/chess_finnish.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_french.txt
Normal file
1
addons/chess/chess_french.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_german.txt
Normal file
1
addons/chess/chess_german.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_italian.txt
Normal file
1
addons/chess/chess_italian.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_japanese.txt
Normal file
1
addons/chess/chess_japanese.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_korean.txt
Normal file
1
addons/chess/chess_korean.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_koreana.txt
Normal file
1
addons/chess/chess_koreana.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_norwegian.txt
Normal file
1
addons/chess/chess_norwegian.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_polish.txt
Normal file
1
addons/chess/chess_polish.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_portuguese.txt
Normal file
1
addons/chess/chess_portuguese.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_russian.txt
Normal file
1
addons/chess/chess_russian.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_schinese.txt
Normal file
1
addons/chess/chess_schinese.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_spanish.txt
Normal file
1
addons/chess/chess_spanish.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_swedish.txt
Normal file
1
addons/chess/chess_swedish.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_tchinese.txt
Normal file
1
addons/chess/chess_tchinese.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
1
addons/chess/chess_thai.txt
Normal file
1
addons/chess/chess_thai.txt
Normal file
@@ -0,0 +1 @@
|
||||
<EFBFBD><EFBFBD>"
|
||||
85
addons/chess/dialogchesshistory.res
Normal file
85
addons/chess/dialogchesshistory.res
Normal file
@@ -0,0 +1,85 @@
|
||||
"AddOns/Go/DialogChessHistory.res"
|
||||
{
|
||||
"DialogChessHistory"
|
||||
{
|
||||
"ControlName" "CDialogChessHistory"
|
||||
"fieldName" "DialogChessHistory"
|
||||
"xpos" "20"
|
||||
"ypos" "22"
|
||||
"wide" "575"
|
||||
"tall" "380"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"BoardChess"
|
||||
{
|
||||
"ControlName" "ImagePanel"
|
||||
"fieldName" "BoardChess"
|
||||
"xpos" "15"
|
||||
"ypos" "35"
|
||||
"wide" "320"
|
||||
"tall" "320"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"SummaryLabel"
|
||||
{
|
||||
"ControlName" "Label"
|
||||
"fieldName" "SummaryLabel"
|
||||
"xpos" "360"
|
||||
"ypos" "25"
|
||||
"wide" "200"
|
||||
"tall" "48"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#SteamAddOn_ReviewMoves"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
}
|
||||
"MoveHistoryPanel"
|
||||
{
|
||||
"ControlName" "ListPanel"
|
||||
"fieldName" "MoveHistoryPanel"
|
||||
"xpos" "360"
|
||||
"ypos" "72"
|
||||
"wide" "200"
|
||||
"tall" "250"
|
||||
"autoResize" "3"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
}
|
||||
"CloseButton"
|
||||
{
|
||||
"ControlName" "Button"
|
||||
"fieldName" "CloseButton"
|
||||
"xpos" "485"
|
||||
"ypos" "330"
|
||||
"wide" "75"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "3"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#SteamAddOn_Close"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"Default" "0"
|
||||
}
|
||||
}
|
||||
111
addons/chess/dialogchesspawnpromote.res
Normal file
111
addons/chess/dialogchesspawnpromote.res
Normal file
@@ -0,0 +1,111 @@
|
||||
"AddOns/Chess/DialogChessPawnPromote.res"
|
||||
{
|
||||
"DialogChessPawnPromote"
|
||||
{
|
||||
"ControlName" "CDialogChessPawnPromote"
|
||||
"fieldName" "DialogChessPawnPromote"
|
||||
"xpos" "519"
|
||||
"ypos" "306"
|
||||
"wide" "250"
|
||||
"tall" "230"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"TextLabel"
|
||||
{
|
||||
"ControlName" "Label"
|
||||
"fieldName" "TextLabel"
|
||||
"xpos" "15"
|
||||
"ypos" "35"
|
||||
"wide" "225"
|
||||
"tall" "40"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#Chess_PawnPromotion_Text"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
}
|
||||
"QueenBtn"
|
||||
{
|
||||
"ControlName" "Button"
|
||||
"fieldName" "QueenBtn"
|
||||
"xpos" "55"
|
||||
"ypos" "84"
|
||||
"wide" "128"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#Chess_PromoteQueen"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"Default" "0"
|
||||
}
|
||||
"RookBtn"
|
||||
{
|
||||
"ControlName" "Button"
|
||||
"fieldName" "RookBtn"
|
||||
"xpos" "55"
|
||||
"ypos" "115"
|
||||
"wide" "128"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#Chess_PromoteRook"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"Default" "0"
|
||||
}
|
||||
"BishopBtn"
|
||||
{
|
||||
"ControlName" "Button"
|
||||
"fieldName" "BishopBtn"
|
||||
"xpos" "55"
|
||||
"ypos" "145"
|
||||
"wide" "128"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#Chess_PromoteBishop"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"Default" "0"
|
||||
}
|
||||
"KnightBtn"
|
||||
{
|
||||
"ControlName" "Button"
|
||||
"fieldName" "KnightBtn"
|
||||
"xpos" "55"
|
||||
"ypos" "176"
|
||||
"wide" "128"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#Chess_PromoteKnight"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"Default" "1"
|
||||
}
|
||||
}
|
||||
235
addons/chess/dialoggamechess.res
Normal file
235
addons/chess/dialoggamechess.res
Normal file
@@ -0,0 +1,235 @@
|
||||
"AddOns/Chess/DialogGameChess.res"
|
||||
{
|
||||
"DialogGameChess"
|
||||
{
|
||||
"ControlName" "CDialogGameChess"
|
||||
"fieldName" "DialogGameChess"
|
||||
"xpos" "18"
|
||||
"ypos" "32"
|
||||
"wide" "600"
|
||||
"tall" "435"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"SysMenu"
|
||||
{
|
||||
"ControlName" "Menu"
|
||||
"fieldName" "SysMenu"
|
||||
"xpos" "0"
|
||||
"ypos" "0"
|
||||
"wide" "64"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "0"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"BoardChess"
|
||||
{
|
||||
"ControlName" "ImagePanel"
|
||||
"fieldName" "BoardChess"
|
||||
"xpos" "15"
|
||||
"ypos" "35"
|
||||
"wide" "320"
|
||||
"tall" "320"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"ChatTextLog"
|
||||
{
|
||||
"ControlName" "URLTextEntry"
|
||||
"fieldName" "ChatTextLog"
|
||||
"xpos" "350"
|
||||
"ypos" "135"
|
||||
"wide" "235"
|
||||
"tall" "222"
|
||||
"autoResize" "3"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "0"
|
||||
"tabPosition" "0"
|
||||
"textHidden" "0"
|
||||
"editable" "0"
|
||||
"maxchars" "-1"
|
||||
}
|
||||
"TextEntry"
|
||||
{
|
||||
"ControlName" "TextEntry"
|
||||
"fieldName" "TextEntry"
|
||||
"xpos" "350"
|
||||
"ypos" "370"
|
||||
"wide" "165"
|
||||
"tall" "24"
|
||||
"autoResize" "1"
|
||||
"pinCorner" "2"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"textHidden" "0"
|
||||
"editable" "1"
|
||||
"maxchars" "500"
|
||||
"unicode" "1"
|
||||
}
|
||||
"SendBtn"
|
||||
{
|
||||
"ControlName" "Button"
|
||||
"fieldName" "SendBtn"
|
||||
"xpos" "524"
|
||||
"ypos" "370"
|
||||
"wide" "64"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "3"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#SteamAddOn_Btn_Send"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"Default" "1"
|
||||
}
|
||||
"ResignBtn"
|
||||
{
|
||||
"ControlName" "Button"
|
||||
"fieldName" "ResignBtn"
|
||||
"xpos" "110"
|
||||
"ypos" "370"
|
||||
"wide" "80"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "0"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#SteamAddOn_Btn_Resign"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"Default" "0"
|
||||
}
|
||||
"ShowHistoryBtn"
|
||||
{
|
||||
"ControlName" "Button"
|
||||
"fieldName" "ShowHistoryBtn"
|
||||
"xpos" "227"
|
||||
"ypos" "370"
|
||||
"wide" "110"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "#SteamAddOn_Btn_ShowHistory"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"Default" "0"
|
||||
}
|
||||
"LastMoveLabel"
|
||||
{
|
||||
"ControlName" "Label"
|
||||
"fieldName" "LastMoveLabel"
|
||||
"xpos" "20"
|
||||
"ypos" "405"
|
||||
"wide" "250"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "2"
|
||||
"visible" "0"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "Last Move made at:"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
}
|
||||
"TurnLabel"
|
||||
{
|
||||
"ControlName" "Label"
|
||||
"fieldName" "TurnLabel"
|
||||
"xpos" "535"
|
||||
"ypos" "405"
|
||||
"wide" "64"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "3"
|
||||
"visible" "0"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "Turn: 1"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
}
|
||||
"BlackIcon"
|
||||
{
|
||||
"ControlName" "ImagePanel"
|
||||
"fieldName" "BlackIcon"
|
||||
"xpos" "396"
|
||||
"ypos" "41"
|
||||
"wide" "12"
|
||||
"tall" "12"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"WhiteIcon"
|
||||
{
|
||||
"ControlName" "ImagePanel"
|
||||
"fieldName" "WhiteIcon"
|
||||
"xpos" "396"
|
||||
"ypos" "86"
|
||||
"wide" "12"
|
||||
"tall" "12"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"BlackName"
|
||||
{
|
||||
"ControlName" "Label"
|
||||
"fieldName" "BlackName"
|
||||
"xpos" "415"
|
||||
"ypos" "35"
|
||||
"wide" "100"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "0"
|
||||
"tabPosition" "0"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
}
|
||||
"WhiteName"
|
||||
{
|
||||
"ControlName" "Label"
|
||||
"fieldName" "WhiteName"
|
||||
"xpos" "415"
|
||||
"ypos" "80"
|
||||
"wide" "100"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "0"
|
||||
"tabPosition" "0"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
}
|
||||
}
|
||||
214
addons/chess/lua/autorun/sh_chess.lua
Normal file
214
addons/chess/lua/autorun/sh_chess.lua
Normal file
@@ -0,0 +1,214 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
if SERVER then
|
||||
AddCSLuaFile()
|
||||
AddCSLuaFile( "chess/sh_player_ext.lua" )
|
||||
AddCSLuaFile( "chess/cl_top.lua" )
|
||||
AddCSLuaFile( "chess/cl_dermaboard.lua" )
|
||||
|
||||
include( "chess/sh_player_ext.lua" )
|
||||
include( "chess/sv_sql.lua" )
|
||||
else
|
||||
include( "chess/sh_player_ext.lua" )
|
||||
include( "chess/cl_top.lua" )
|
||||
include( "chess/cl_dermaboard.lua" )
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
function ChessBoard_DoOverrides()
|
||||
if GAMEMODE.Name=="Cinema" then --Cinema overrides
|
||||
hook.Add("CanPlayerEnterVehicle", "EnterSeat", function(ply, vehicle) --Overrides default func
|
||||
if vehicle:GetClass() != "prop_vehicle_prisoner_pod" then return end
|
||||
|
||||
if vehicle.Removing then return false end
|
||||
return (vehicle:GetOwner() == ply) or vehicle:GetNWBool( "IsChessSeat", false )
|
||||
end)
|
||||
end
|
||||
end
|
||||
hook.Add( "Initialize", "ChessBoardOverrides", ChessBoard_DoOverrides )
|
||||
|
||||
CreateConVar( "chess_wagers", 1, FCVAR_ARCHIVE, "Set whether players can wager on their chess games." )
|
||||
CreateConVar( "chess_darkrp_wager", 1, FCVAR_ARCHIVE, "[DarkRP only] Wagers should use DarkRP wallet." )
|
||||
|
||||
CreateConVar( "chess_debug", 0, FCVAR_ARCHIVE, "Debug mode." )
|
||||
CreateConVar( "chess_limitmoves", 1, FCVAR_ARCHIVE, "Enable 50 move rule." )
|
||||
else -- CLIENT
|
||||
CreateConVar( "chess_gridletters", 1, FCVAR_ARCHIVE, "Show grid letters." )
|
||||
end
|
||||
|
||||
-- DarkRP --
|
||||
------------
|
||||
hook.Add("canArrest", "Chess PreventArrest", function( cop, target )
|
||||
if not (IsValid(target) and target:GetNWBool("IsInChess", false)) then return end
|
||||
|
||||
local board = target:GetNWEntity( "ActiveChessBoard", nil )
|
||||
if not (IsValid(board) and board:GetPlaying()) then return end
|
||||
if target~=board:GetWhitePlayer() and target~=board:GetBlackPlayer() then return end
|
||||
|
||||
return false,"Cannot arrest players during a game in progress" -- Prevent arrest during Chess
|
||||
end)
|
||||
|
||||
-- Admin Commands --
|
||||
--------------------
|
||||
local function SetupCommands()
|
||||
if serverguard then
|
||||
/////////////////
|
||||
// Serverguard //
|
||||
/////////////////
|
||||
serverguard.permission:Add("Set Chess Elo")
|
||||
|
||||
if SERVER then
|
||||
// Update function
|
||||
local function SGUpdate(player, target, newElo, isDraughts)
|
||||
if type(target)=="Player" and IsValid(target) then
|
||||
if isDraughts then
|
||||
target:SetDraughtsElo( newElo )
|
||||
else
|
||||
target:SetChessElo( newElo )
|
||||
end
|
||||
Chess_UpdateElo( target )
|
||||
|
||||
serverguard.Notify(nil,
|
||||
SERVERGUARD.NOTIFY.GREEN, serverguard.player:GetName(player),
|
||||
SERVERGUARD.NOTIFY.WHITE, isDraughts and " has set the Checkers Elo rating of " or " has set the Chess Elo rating of ",
|
||||
SERVERGUARD.NOTIFY.RED, serverguard.player:GetName(target),
|
||||
SERVERGUARD.NOTIFY.WHITE, " to ",
|
||||
SERVERGUARD.NOTIFY.RED, tostring(newElo),
|
||||
SERVERGUARD.NOTIFY.WHITE, "."
|
||||
)
|
||||
elseif (string.SteamID(target)) then
|
||||
local success,reason = Chess_SetElo( target, newElo, isDraughts )
|
||||
|
||||
local queryObj = serverguard.mysql:Select("serverguard_users");
|
||||
queryObj:Where("steam_id", target)
|
||||
queryObj:Limit(1)
|
||||
queryObj:Callback(function(result, status, lastID)
|
||||
local name = target
|
||||
if (type(result) == "table" and #result > 0) then
|
||||
name = result[1].name or name
|
||||
end
|
||||
|
||||
if success then
|
||||
serverguard.Notify(nil,
|
||||
SERVERGUARD.NOTIFY.GREEN, serverguard.player:GetName(player),
|
||||
SERVERGUARD.NOTIFY.WHITE, isDraughts and " has set the Checkers Elo rating of " or " has set the Chess Elo rating of ",
|
||||
SERVERGUARD.NOTIFY.RED, name,
|
||||
SERVERGUARD.NOTIFY.WHITE, " to ",
|
||||
SERVERGUARD.NOTIFY.RED, tostring(newElo),
|
||||
SERVERGUARD.NOTIFY.WHITE, "."
|
||||
)
|
||||
else
|
||||
serverguard.Notify(player, SERVERGUARD.NOTIFY.RED, ("Could not set elo. (%s)"):format(tostring(reason)) )
|
||||
end
|
||||
end)
|
||||
queryObj:Execute()
|
||||
else
|
||||
serverguard.Notify(player, SGPF("cant_find_player_with_identifier"))
|
||||
end
|
||||
end
|
||||
|
||||
// Chess command
|
||||
local command = {}
|
||||
|
||||
command.help = "Set a player's Chess Elo rating."
|
||||
command.command = "setelo"
|
||||
command.arguments = {"player", "elo"}
|
||||
command.permissions = {"Set Chess Elo"}
|
||||
command.aliases = {"setelochess", "chesselo", "setchess", "setchesselo"}
|
||||
|
||||
function command:Execute(player, silent, arguments)
|
||||
local target = util.FindPlayer(arguments[1], player, true)
|
||||
local newElo = tonumber(arguments[2]) or 1400
|
||||
|
||||
SGUpdate( player, IsValid(target) and target or arguments[1], newElo, false )
|
||||
end
|
||||
serverguard.command:Add(command)
|
||||
|
||||
// Draughts command
|
||||
local command = {}
|
||||
|
||||
command.help = "Set a player's Checkers Elo rating."
|
||||
command.command = "setelocheckers"
|
||||
command.arguments = {"player", "elo"}
|
||||
command.permissions = {"Set Chess Elo"}
|
||||
command.aliases = {"setcheckers", "setcheckerselo", "checkerselo", "setelodraughts", "setdraughts", "setdraughtselo", "draughtselo"}
|
||||
|
||||
function command:Execute(player, silent, arguments)
|
||||
local target = util.FindPlayer(arguments[1], player, true)
|
||||
local newElo = tonumber(arguments[2]) or 1400
|
||||
|
||||
SGUpdate( player, IsValid(target) and target or arguments[1], newElo, true )
|
||||
end
|
||||
|
||||
serverguard.command:Add(command)
|
||||
end
|
||||
end
|
||||
if ulx then
|
||||
/////////
|
||||
// ULX //
|
||||
/////////
|
||||
|
||||
// Update
|
||||
local function ULXUpdate(calling_ply, target, newElo, isDraughts)
|
||||
if CLIENT then return end
|
||||
|
||||
if type(target)=="Player" and IsValid(target) then
|
||||
if isDraughts then
|
||||
target:SetDraughtsElo( newElo )
|
||||
else
|
||||
target:SetChessElo( newElo )
|
||||
end
|
||||
Chess_UpdateElo( target )
|
||||
|
||||
ulx.fancyLogAdmin( calling_ply, "#A set the #s Elo rating of #T to #i.", isDraughts and "Checkers" or "Chess", target, newElo )
|
||||
elseif (string.SteamID(target or "")) then
|
||||
local success,reason = Chess_SetElo( target, newElo, isDraughts )
|
||||
|
||||
if success then
|
||||
ulx.fancyLogAdmin( calling_ply, "#A set the #s Elo rating of #s to #i.", isDraughts and "Checkers" or "Chess", target, newElo )
|
||||
else
|
||||
ULib.tsayError( calling_ply, ("Could not set elo. (%s)"):format(tostring(reason)) )
|
||||
end
|
||||
else
|
||||
ULib.tsayError( calling_ply, "Invalid SteamID or Player." )
|
||||
end
|
||||
end
|
||||
|
||||
// Autocomplete
|
||||
local function AutoComplete(...) return ULib.cmds.PlayerArg.complete(ULib.cmds.PlayerArg, ...) end
|
||||
|
||||
// Chess command
|
||||
local function SetChessElo( calling_ply, steamid, newElo )
|
||||
local target = ULib.getUser( steamid or "", true, calling_ply )
|
||||
|
||||
ULXUpdate( calling_ply, IsValid(target) and target or steamid, newElo, false )
|
||||
end
|
||||
local setchess = ulx.command( "Chess", "ulx chesselo", SetChessElo, {"!setelo", "!setelochess", "!chesselo", "!setchess", "!setchesselo"}, false, false, true )
|
||||
setchess:addParam{ type=ULib.cmds.StringArg, hint="Player or SteamID", autocomplete_fn=AutoComplete }
|
||||
setchess:addParam{ type=ULib.cmds.NumArg, hint="New Elo", min=0, default=1400 }
|
||||
setchess:defaultAccess( ULib.ACCESS_SUPERADMIN )
|
||||
setchess:help( "Set Chess Elo rating for user." )
|
||||
|
||||
// Draughts command
|
||||
local function SetDraughtsElo( calling_ply, steamid, newElo )
|
||||
local target = ULib.getUser( steamid, true, calling_ply )
|
||||
|
||||
ULXUpdate( calling_ply, IsValid(target) and target or steamID, newElo, true )
|
||||
end
|
||||
local setdraughts = ulx.command( "Chess", "ulx checkerselo", SetDraughtsElo, {"!setelocheckers", "!setcheckers", "!setcheckerselo", "!checkerselo", "!setelodraughts", "!setdraughts", "!setdraughtselo", "!draughtselo"}, false, false, true )
|
||||
setdraughts:addParam{ type=ULib.cmds.StringArg, hint="Player or SteamID", autocomplete_fn=AutoComplete }
|
||||
setdraughts:addParam{ type=ULib.cmds.NumArg, hint="New Elo", min=0, default=1400 }
|
||||
setdraughts:defaultAccess( ULib.ACCESS_SUPERADMIN )
|
||||
setdraughts:help( "Set Checkers Elo rating for user." )
|
||||
end
|
||||
end
|
||||
hook.Add( "Initialize", "ChessBoardPermissions", SetupCommands )
|
||||
174
addons/chess/lua/chess/cl_dermaboard.lua
Normal file
174
addons/chess/lua/chess/cl_dermaboard.lua
Normal file
@@ -0,0 +1,174 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
local PanelCol = {
|
||||
Main = Color(0,0,0,200), Hover = Color(0,255,0,50), Selected = Color(150,50,50,170),
|
||||
Move = Color(10,25,150,150), HasMoved = Color(50,50,50,100), Text = Color(0,0,0,255),
|
||||
|
||||
GridWhite = Color(255, 248, 220), GridBlack = Color(210, 180, 140),
|
||||
|
||||
White = Color(180,180,180), Black = Color(0,0,0),
|
||||
}
|
||||
-- local ColText = Color(50,50,50,200)
|
||||
-- local ColBlack,ColWhite = Color(0,0,0,120),Color(255,255,255,10)
|
||||
|
||||
local NumToLetter = {"a", "b", "c", "d", "e", "f", "g", "h", ["a"]=1, ["b"]=2, ["c"]=3, ["d"]=4, ["e"]=5, ["f"]=6, ["g"]=7, ["h"]=8} --Used extensively for conversions
|
||||
surface.CreateFont( "ChessPieces", { font = "Arial", size = 64, weight = 300})
|
||||
|
||||
function Chess_Open2DBoard( board )
|
||||
if not IsValid(board) then return end
|
||||
if IsValid( Chess_2DDermaPanel ) then Chess_2DDermaPanel:Remove() end
|
||||
|
||||
Chess_2DDermaPanel = vgui.Create( "DFrame" )
|
||||
local frame = Chess_2DDermaPanel
|
||||
frame:SetTitle( "2D Game Board" )
|
||||
frame:SetSize( 740, 760 )
|
||||
frame:SetPos( (ScrW()/2)-370, (ScrH()/2)-380 )
|
||||
frame.Paint = function( s,w,h )
|
||||
if not IsValid(board) then
|
||||
s:Remove()
|
||||
end
|
||||
|
||||
draw.RoundedBox( 8, 0, 0, w, h, PanelCol.Main )
|
||||
end
|
||||
frame:MakePopup()
|
||||
|
||||
local pnlBoard = vgui.Create( "DPanel", frame )
|
||||
pnlBoard:SetSize( 720, 720 )
|
||||
pnlBoard:SetPos(10,30)
|
||||
|
||||
pnlBoard.Squares = {}
|
||||
pnlBoard.Paint = function() end
|
||||
|
||||
local function DoTiles(swapped)
|
||||
if pnlBoard.Squares then
|
||||
for _,v in pairs(pnlBoard.Squares) do
|
||||
for _,pnl in pairs(v) do
|
||||
pnl:Remove()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for i=0,7 do
|
||||
pnlBoard.Squares[i] = {}
|
||||
for n=0,7 do
|
||||
local pnl = vgui.Create( "DModelPanel", pnlBoard )
|
||||
pnlBoard.Squares[i][n] = pnl
|
||||
|
||||
pnl:SetPos( (swapped and 7-i or i)*90, (swapped and 7-n or n)*90 )
|
||||
pnl:SetSize(90,90)
|
||||
pnl.GridCol = (((i+n)%2)==1) and PanelCol.GridBlack or PanelCol.GridWhite
|
||||
pnl.GridPos = {i,n}
|
||||
pnl.oPaint = pnl.Paint
|
||||
pnl.Paint = function(s,w,h)
|
||||
surface.SetDrawColor( s.GridCol )
|
||||
surface.DrawRect( 0,0, w,h )
|
||||
|
||||
if not IsValid(board) then return end
|
||||
|
||||
if s:IsHovered() then
|
||||
surface.SetDrawColor( PanelCol.Hover )
|
||||
surface.DrawRect( 0,0, w,h )
|
||||
end
|
||||
if board.Selected and board.Selected[1]==s.GridPos[1] and board.Selected[2]==s.GridPos[2] then
|
||||
surface.SetDrawColor( PanelCol.Selected )
|
||||
surface.DrawRect( 0,0, w,h )
|
||||
end
|
||||
if board:GetTableGrid( board.Moves, s.GridPos[1], s.GridPos[2]) then
|
||||
surface.SetDrawColor( PanelCol.Move )
|
||||
surface.DrawRect( 0,0, w,h )
|
||||
end
|
||||
|
||||
local col,square = board.Pieces[ NumToLetter[s.GridPos[1]+1] ]
|
||||
if col then
|
||||
square = col[8-s.GridPos[2]]
|
||||
if square then
|
||||
if not (square.Team and square.Class) then return end
|
||||
|
||||
if square.Moving then
|
||||
surface.SetDrawColor( PanelCol.HasMoved )
|
||||
surface.DrawRect( 0,0, w,h )
|
||||
end
|
||||
|
||||
if board.Characters then
|
||||
draw.SimpleText( board.Characters[square.Team .. square.Class], "ChessPieces", w/2, h/2, PanelCol.Text, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER )
|
||||
else
|
||||
s:SetModel( board.Models[square.Team .. square.Class] )
|
||||
|
||||
return s.oPaint( s,w,h )
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if cvars.Bool("chess_gridletters") then
|
||||
local str = (NumToLetter[i+1]..tostring(8-n)):upper()
|
||||
draw.SimpleText( str, "ChessTextSmall", 5, h-20, PanelCol.Black )
|
||||
end
|
||||
end
|
||||
|
||||
pnl.DoClick = function(s)
|
||||
if not IsValid(board) then return end
|
||||
|
||||
if board.Selected and board:GetTableGrid( board.Moves, pnl.GridPos[1], pnl.GridPos[2] ) then
|
||||
board:RequestMove( board.Selected[1], board.Selected[2], pnl.GridPos[1], pnl.GridPos[2] )
|
||||
board:ResetHighlights()
|
||||
elseif board.Selected and board.Selected[1]==s.GridPos[1] and board.Selected[2]==s.GridPos[2] then
|
||||
board:ResetHighlights()
|
||||
else
|
||||
board:ResetHighlights()
|
||||
board.Selected = {s.GridPos[1],s.GridPos[2]}
|
||||
board.Moves = board:GetMove( NumToLetter[s.GridPos[1]+1], 8-s.GridPos[2] )
|
||||
end
|
||||
end
|
||||
pnl.LayoutEntity = function( s, ent )
|
||||
ent:SetPos( Vector(20,20,20) )
|
||||
ent:SetAngles( Angle(0,-50,0) )
|
||||
end
|
||||
|
||||
pnl:SetModel( board.Models["WhitePawn"] )
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local swap = vgui.Create( "DButton", frame )
|
||||
swap:SetImage( "icon16/arrow_rotate_clockwise.png" )
|
||||
swap:SetSize( 18,18 )
|
||||
swap:SetPos( 620,6 )
|
||||
swap:SetText( "" )
|
||||
swap.DoClick = function(s)
|
||||
s.Swapped = not s.Swapped
|
||||
DoTiles( s.Swapped )
|
||||
end
|
||||
swap.Paint = function() end
|
||||
|
||||
local toggleGridLetters = vgui.Create( "DCheckBox", frame )
|
||||
toggleGridLetters:SetImage( "icon16/font.png" )
|
||||
toggleGridLetters:SetSize( 18,18 )
|
||||
toggleGridLetters:SetPos( 600,6 )
|
||||
toggleGridLetters:SetText( "" )
|
||||
toggleGridLetters:SetConVar( "chess_gridletters" )
|
||||
toggleGridLetters.OnChange = function(s,newvalue)
|
||||
s:SetAlpha( s:GetChecked() and 255 or 100 )
|
||||
end
|
||||
toggleGridLetters.Paint = function() end
|
||||
toggleGridLetters.PerformLayout = function(s) -- DCheckBox overwrites DButton's PerformLayout, re-apply it
|
||||
if IsValid(s.m_Image) then
|
||||
s.m_Image:SetPos( 4, ( s:GetTall() - s.m_Image:GetTall() ) * 0.5 )
|
||||
s:SetTextInset( s.m_Image:GetWide() + 16, 0 )
|
||||
end
|
||||
|
||||
DLabel.PerformLayout( s )
|
||||
end
|
||||
|
||||
swap.Swapped = false
|
||||
DoTiles( swap.Swapped )
|
||||
end
|
||||
149
addons/chess/lua/chess/cl_top.lua
Normal file
149
addons/chess/lua/chess/cl_top.lua
Normal file
@@ -0,0 +1,149 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
local Top10
|
||||
local function ChessTop10( typ )
|
||||
if IsValid(Top10) then Top10:Remove() end
|
||||
|
||||
typ = typ or "Chess"
|
||||
|
||||
Top10 = vgui.Create( "DFrame" )
|
||||
Top10:SetSize( 450, 245 )
|
||||
Top10:SetPos( (ScrW()/2)-150, (ScrH()/2)-100 )
|
||||
Top10:SetTitle( "Top 10 Chess Elo ratings" )
|
||||
Top10:MakePopup()
|
||||
Top10.Column = "Elo"
|
||||
|
||||
local pnl = vgui.Create("DPanel", Top10)
|
||||
pnl.Paint = function() end
|
||||
pnl:SetTall(20)
|
||||
pnl:Dock(BOTTOM)
|
||||
|
||||
Top10.Rank = vgui.Create( "DLabel", pnl )
|
||||
Top10.Rank:Dock( LEFT )
|
||||
Top10.Rank:SetTall( 20 )
|
||||
Top10.Rank:SetWide( 150 )
|
||||
Top10.Rank:SetText("")
|
||||
|
||||
Top10.Updated = vgui.Create( "DLabel", pnl )
|
||||
Top10.Updated:Dock( RIGHT )
|
||||
Top10.Updated:SetTall( 150 )
|
||||
Top10.Updated:SetText("")
|
||||
|
||||
Top10.List = vgui.Create( "DListView", Top10 )
|
||||
local List = Top10.List
|
||||
List:Dock( FILL )
|
||||
List:AddColumn( "Rank" )
|
||||
List:AddColumn( "Name" )
|
||||
List:AddColumn( "SteamID" )
|
||||
List:AddColumn( "Elo" )
|
||||
|
||||
List:AddLine( "", "Loading..." )
|
||||
-- PrintTable( List.Columns )
|
||||
List:OnRequestResize( List.Columns[1], 10 )
|
||||
List:OnRequestResize( List.Columns[2], 150 )
|
||||
List:OnRequestResize( List.Columns[3], 100 )
|
||||
List:OnRequestResize( List.Columns[4], 10 )
|
||||
|
||||
net.Start( "Chess Top10" ) net.WriteString( typ ) net.SendToServer()
|
||||
end
|
||||
local function DraughtsTop10()
|
||||
ChessTop10( "Draughts" )
|
||||
end
|
||||
concommand.Add( "chess_top", function( p,c,a ) ChessTop10() end)
|
||||
concommand.Add( "checkers_top", function( p,c,a ) DraughtsTop10() end)
|
||||
|
||||
local ChatCommands = {
|
||||
["!chess"]=ChessTop10, ["!chesstop"]=ChessTop10, ["!topchess"]=ChessTop10,
|
||||
["/chess"]=ChessTop10, ["/chesstop"]=ChessTop10, ["/topchess"]=ChessTop10,
|
||||
|
||||
["!draughts"]=DraughtsTop10, ["!draughtstop"]=DraughtsTop10, ["!topdraughts"]=DraughtsTop10,
|
||||
["/draughts"]=DraughtsTop10, ["/draughtstop"]=DraughtsTop10, ["/topdraughts"]=DraughtsTop10,
|
||||
|
||||
["!checkers"]=DraughtsTop10, ["!checkerstop"]=DraughtsTop10, ["!topcheckers"]=DraughtsTop10,
|
||||
["/checkers"]=DraughtsTop10, ["/checkerstop"]=DraughtsTop10, ["/topcheckers"]=DraughtsTop10,
|
||||
}
|
||||
hook.Add( "OnPlayerChat", "Chess Top10 PlayerChat", function( ply, str, tm, dead )
|
||||
if ChatCommands[str:lower()] then
|
||||
if ply==LocalPlayer() then
|
||||
ChatCommands[str:lower()]()
|
||||
end
|
||||
return true
|
||||
end
|
||||
end)
|
||||
|
||||
local function SecondsToTime(num)
|
||||
if updateTime>=86400 then
|
||||
return ("%i day%s"):format( math.floor(updateTime/86400), updateTime>=172800 and "s" or "")
|
||||
elseif updateTime>=3600 then
|
||||
return ("%i hour%s"):format( math.floor(updateTime/3600), updateTime>=7200 and "s" or "")
|
||||
elseif updateTime>=60 then
|
||||
return ("%i minute%s"):format( math.floor(updateTime/60), updateTime>=120 and "s" or "")
|
||||
else
|
||||
return ("%i second%s"):format(updateTime, updateTime>=2 and "s" or "")
|
||||
end
|
||||
end
|
||||
|
||||
local lastTable = {}
|
||||
local lastRank = {}
|
||||
local lastUpdate = {}
|
||||
net.Receive( "Chess Top10", function()
|
||||
if not (IsValid(Top10) and IsValid(Top10.List)) then return end
|
||||
|
||||
Top10.List:Clear()
|
||||
|
||||
local typ = net.ReadString() or "[Error]"
|
||||
|
||||
Top10:SetTitle( "Top 10 "..typ.." Elo ratings" )
|
||||
|
||||
local tbl = net.ReadTable()
|
||||
if (not tbl) or (#tbl==0) then -- Rate limit exceeded
|
||||
if lastTable[typ] then
|
||||
for i=1,#lastTable[typ] do
|
||||
Top10.List:AddLine( tonumber(lastTable[typ][i].Rank), lastTable[typ][i].Username, lastTable[typ][i].SteamID, tonumber(lastTable[typ][i]["Elo" ]) )
|
||||
end
|
||||
Top10.Rank:SetText( "You are rank "..lastRank[typ] )
|
||||
|
||||
if lastUpdate[typ] then
|
||||
updateTime = math.floor(CurTime() - lastUpdate[typ])
|
||||
if updateTime>0 then
|
||||
Top10.Updated:SetText( ("Updated %s ago."):format(SecondsToTime(updateTime)) )
|
||||
end
|
||||
Top10.Updated:SizeToContents()
|
||||
end
|
||||
else
|
||||
Top10.List:AddLine( "", "ERROR: Rate limit exceeded." )
|
||||
Top10.List:AddLine( "", "Please try again in a few minutes." )
|
||||
end
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
for i=1,#tbl do
|
||||
Top10.List:AddLine( tonumber(tbl[i].Rank), tbl[i].Username, tbl[i].SteamID, tonumber(tbl[i]["Elo" ]) )
|
||||
end
|
||||
|
||||
local rank = (net.ReadString() or "N/A")
|
||||
Top10.Rank:SetText( "You are rank "..rank )
|
||||
|
||||
lastUpdate[typ] = tonumber(net.ReadString())
|
||||
if lastUpdate[typ] then
|
||||
updateTime = math.floor(CurTime() - lastUpdate[typ])
|
||||
|
||||
if updateTime>0 then
|
||||
Top10.Updated:SetText( ("Updated %s ago."):format(SecondsToTime(updateTime)) )
|
||||
end
|
||||
Top10.Updated:SizeToContents()
|
||||
end
|
||||
|
||||
lastTable[typ] = tbl
|
||||
lastRank[typ] = rank
|
||||
end)
|
||||
123
addons/chess/lua/chess/sh_player_ext.lua
Normal file
123
addons/chess/lua/chess/sh_player_ext.lua
Normal file
@@ -0,0 +1,123 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
local PLAYER = FindMetaTable( "Player" )
|
||||
if not PLAYER then return end
|
||||
|
||||
function PLAYER:GetChessElo()
|
||||
return self:GetNWInt( "ChessElo", 1400 ) or 1400
|
||||
end
|
||||
function PLAYER:GetDraughtsElo()
|
||||
return self:GetNWInt( "DraughtsElo", 1400 ) or 1400
|
||||
end
|
||||
if CLIENT then return end
|
||||
function PLAYER:SetChessElo( num )
|
||||
self:SetNWInt( "ChessElo", num or Chess_GetElo(ply:SteamID()) or 1400 )
|
||||
Chess_SetElo( self:SteamID(), num, false )
|
||||
end
|
||||
function PLAYER:SetDraughtsElo( num )
|
||||
self:SetNWInt( "DraughtsElo", num or Chess_GetElo(ply:SteamID(), true) or 1400 )
|
||||
Chess_SetElo( self:SteamID(), num, true )
|
||||
end
|
||||
|
||||
function PLAYER:RefreshChessElo()
|
||||
-- Convert old PData stuff
|
||||
if self:GetPData("ChessElo") then
|
||||
Chess_SetElo( self:SteamID(), self:GetPData("ChessElo"), false )
|
||||
self:RemovePData("ChessElo")
|
||||
end
|
||||
if self:GetPData("DraughtsElo") then
|
||||
Chess_SetElo( self:SteamID(), self:GetPData("DraughtsElo"), true )
|
||||
self:RemovePData("DraughtsElo")
|
||||
end
|
||||
|
||||
self:SetChessElo( Chess_GetElo(self:SteamID()) or 1400)
|
||||
self:SetDraughtsElo( Chess_GetElo(self:SteamID(), true) or 1400)
|
||||
end
|
||||
hook.Add( "PlayerInitialSpawn", "Chess InitialSpawn InitElo", function(ply)
|
||||
ply:RefreshChessElo()
|
||||
end)
|
||||
|
||||
function PLAYER:ExpectedChessWin( against )
|
||||
return (1/ (1+( 10^( (against:GetChessElo() - self:GetChessElo())/400 ) )) )
|
||||
end
|
||||
function PLAYER:ExpectedDraughtsWin( against )
|
||||
return (1/ (1+( 10^( (against:GetDraughtsElo() - self:GetDraughtsElo())/400 ) )) )
|
||||
end
|
||||
|
||||
function PLAYER:GetChessKFactor() --Imitating FIDE's K-factor ranges
|
||||
local games = tonumber(self:GetPData( "ChessGamesPlayed", 0 )) or 0
|
||||
if games<30 then
|
||||
self:SetPData( "ChessEloKFactor", 15 )
|
||||
return 30
|
||||
end
|
||||
local k = self:GetChessElo()>=2400 and 10 or self:GetPData( "ChessEloKFactor", 15 ) or 15
|
||||
self:SetPData( "ChessEloKFactor", k )
|
||||
return k
|
||||
end
|
||||
function PLAYER:GetDraughtsKFactor() --Imitating FIDE's K-factor ranges
|
||||
local games = self:GetPData( "DraughtsGamesPlayed", 0 )
|
||||
if games<30 then
|
||||
self:SetPData( "DraughtsEloKFactor", 15 )
|
||||
return 30
|
||||
end
|
||||
local k = self:GetDraughtsElo()>=2400 and 10 or self:GetPData( "DraughtsEloKFactor", 15 ) or 15
|
||||
self:SetPData( "DraughtsEloKFactor", k )
|
||||
return k
|
||||
end
|
||||
|
||||
function PLAYER:DoChessElo( score, against )
|
||||
local mod = math.ceil(self:GetChessKFactor() * (score - self:ExpectedChessWin(against)))
|
||||
local NewElo = math.floor( self:GetChessElo() + mod )
|
||||
|
||||
self:SetChessElo( NewElo )
|
||||
|
||||
if IsValid(against) then
|
||||
mod = mod*(-1)
|
||||
local NewElo = math.floor( against:GetChessElo() + mod )
|
||||
|
||||
against:SetChessElo( NewElo )
|
||||
local rank,count = Chess_GetRank(against)
|
||||
against:ChatPrint( "Your chess Elo rating changed by "..tostring(mod).." to "..tostring(NewElo).."!" ..(rank and " You are #"..tostring(rank).." on this server." or "") )
|
||||
end
|
||||
local rank,count = Chess_GetRank(self)
|
||||
self:ChatPrint( "Your chess Elo rating changed by "..tostring(mod).." to "..tostring(NewElo).."!" ..(rank and " You are #"..tostring(rank).." on this server." or "") )
|
||||
|
||||
Chess_UpdateElo( self )
|
||||
end
|
||||
function PLAYER:ChessWin( against )
|
||||
if not IsValid(against) then return end
|
||||
|
||||
self:DoChessElo(1, against)
|
||||
end
|
||||
function PLAYER:ChessDraw( against ) self:DoChessElo(0.5, against) end
|
||||
|
||||
function PLAYER:DoDraughtsElo( score, against )
|
||||
local mod = math.ceil(self:GetDraughtsKFactor() * (score - self:ExpectedDraughtsWin(against)))
|
||||
local NewElo = math.floor( self:GetDraughtsElo() + mod )
|
||||
|
||||
self:SetDraughtsElo( NewElo )
|
||||
|
||||
if IsValid(against) then
|
||||
mod = mod*(-1)
|
||||
local NewElo = math.floor( against:GetDraughtsElo() + mod )
|
||||
|
||||
against:SetDraughtsElo( NewElo )
|
||||
local rank = Chess_GetRank(self, "Draughts")
|
||||
against:ChatPrint( "Your draughts Elo rating changed by "..tostring(mod).." to "..tostring(NewElo).."!" ..(rank and " You are #"..tostring(rank).." on this server." or "") )
|
||||
end
|
||||
local rank = Chess_GetRank(self, "Draughts")
|
||||
self:ChatPrint( "Your draughts Elo rating changed by "..tostring(mod).." to "..tostring(NewElo).."!" ..(rank and " You are #"..tostring(rank).." on this server." or "") )
|
||||
|
||||
Chess_UpdateElo( self )
|
||||
end
|
||||
function PLAYER:DraughtsWin( against ) self:DoDraughtsElo(1, against) end
|
||||
function PLAYER:DraughtsDraw( against ) self:DoDraughtsElo(0.5, against) end
|
||||
212
addons/chess/lua/chess/sv_sql.lua
Normal file
212
addons/chess/lua/chess/sv_sql.lua
Normal file
@@ -0,0 +1,212 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
local nextTopUpdate = {}
|
||||
local playerResults = {}
|
||||
|
||||
local function InitChessLeaderboard()
|
||||
sql.Begin()
|
||||
local query = sql.Query( [[CREATE TABLE ChessLeaderboard (SteamID varchar(255), Username varchar(255), Elo int, DraughtsElo int);]] )
|
||||
sql.Commit()
|
||||
|
||||
if query==false then else print("Chess: Created Elo table") end
|
||||
end
|
||||
InitChessLeaderboard()
|
||||
|
||||
function Chess_UpdateElo( ply )
|
||||
if not IsValid(ply) then return end
|
||||
|
||||
local SelStr = [[SELECT * FROM ChessLeaderboard WHERE SteamID==]].. sql.SQLStr(ply:SteamID()) ..[[;]]
|
||||
sql.Begin()
|
||||
local Select = sql.Query( SelStr )
|
||||
sql.Commit()
|
||||
|
||||
local UpdateStr
|
||||
if Select==false then
|
||||
Error( "Chess: Save failed for player "..ply:Nick().." - Query error. "..sql.LastError().."\n" )
|
||||
elseif Select==nil then
|
||||
UpdateStr = [[INSERT INTO ChessLeaderboard (SteamID, Username, Elo, DraughtsElo) VALUES (]]..sql.SQLStr(ply:SteamID())..[[,]]..sql.SQLStr(ply:Nick())..[[,]]..sql.SQLStr(ply:GetChessElo())..[[,]]..sql.SQLStr(ply:GetDraughtsElo())..[[);]]
|
||||
else
|
||||
UpdateStr = [[UPDATE ChessLeaderboard SET Username=]]..sql.SQLStr(ply:GetName())..[[,Elo=]]..sql.SQLStr(ply:GetChessElo())..[[,DraughtsElo=]]..sql.SQLStr(ply:GetDraughtsElo())..[[ WHERE SteamID==]]..sql.SQLStr(ply:SteamID())..[[;]]
|
||||
end
|
||||
|
||||
sql.Begin()
|
||||
local Update = sql.Query( UpdateStr )
|
||||
sql.Commit()
|
||||
|
||||
if Update==false then
|
||||
Error( "Chess: Update failed for player "..ply:Nick().." - Query error. "..sql.LastError().."\n" )
|
||||
end
|
||||
|
||||
nextTopUpdate = {}
|
||||
playerResults = {}
|
||||
end
|
||||
function Chess_SetElo( steamID, newElo, isDraughts )
|
||||
if not tonumber(newElo) then return false,"Elo must be a number." end
|
||||
if type(steamID)=="Player" then
|
||||
if not IsValid(steamID) then return end
|
||||
steamID = steamID:SteamID()
|
||||
end
|
||||
|
||||
local ply = player.GetBySteamID(steamID)
|
||||
|
||||
local SelStr = [[SELECT * FROM ChessLeaderboard WHERE SteamID==]].. sql.SQLStr(steamID) ..[[;]]
|
||||
sql.Begin()
|
||||
local Select = sql.Query( SelStr )
|
||||
sql.Commit()
|
||||
|
||||
local UpdateStr
|
||||
if Select==nil then
|
||||
UpdateStr = [[INSERT INTO ChessLeaderboard (SteamID, Username, Elo, DraughtsElo) VALUES (]]..sql.SQLStr(steamID)..[[,]]..sql.SQLStr(IsValid(ply) and ply:Nick() or "N/A")..[[,]]..sql.SQLStr(IsValid(ply) and ply:GetChessElo() or 1400)..[[,]]..sql.SQLStr(IsValid(ply) and ply:GetDraughtsElo() or 1400)..[[);]]
|
||||
end
|
||||
|
||||
if isDraughts then
|
||||
UpdateStr = [[UPDATE ChessLeaderboard SET DraughtsElo=]]..sql.SQLStr(tonumber(newElo))..[[ WHERE SteamID==]]..sql.SQLStr(steamID)..[[;]]
|
||||
else
|
||||
UpdateStr = [[UPDATE ChessLeaderboard SET Elo=]]..sql.SQLStr(tonumber(newElo))..[[ WHERE SteamID==]]..sql.SQLStr(steamID)..[[;]]
|
||||
end
|
||||
|
||||
sql.Begin()
|
||||
local Update = sql.Query( UpdateStr )
|
||||
sql.Commit()
|
||||
|
||||
if Update==false then
|
||||
Error( "Chess: Update failed for player "..steamID.." - Query error. "..sql.LastError().."\n" )
|
||||
return false
|
||||
end
|
||||
|
||||
nextTopUpdate = {}
|
||||
playerResults = {}
|
||||
end
|
||||
function Chess_GetElo( steamID, isDraughts )
|
||||
if type(steamID)=="Player" then
|
||||
if not IsValid(steamID) then return end
|
||||
steamID = steamID:SteamID()
|
||||
end
|
||||
|
||||
local SelStr = [[SELECT * FROM ChessLeaderboard WHERE SteamID==]].. sql.SQLStr(steamID) ..[[;]]
|
||||
sql.Begin()
|
||||
local Select = sql.Query( SelStr )
|
||||
sql.Commit()
|
||||
|
||||
if Select==nil then
|
||||
return false, "Player does not have an Elo rating"
|
||||
end
|
||||
|
||||
if isDraughts then
|
||||
return Select[1].DraughtsElo or 1400
|
||||
else
|
||||
return Select[1].Elo or 1400 -- Chess
|
||||
end
|
||||
end
|
||||
|
||||
function Chess_GetRank( ply, typ )
|
||||
local query = string.gsub([[SELECT (
|
||||
SELECT COUNT(*)+1
|
||||
FROM ChessLeaderboard ordered
|
||||
WHERE (ordered.{ELO}) > (uo.{ELO})
|
||||
) AS Rank, (SELECT COUNT(*) FROM ChessLeaderboard) AS Count
|
||||
FROM ChessLeaderboard uo WHERE SteamID==]]..sql.SQLStr(ply:SteamID())..[[;]], "{ELO}", (typ=="Draughts" and [[DraughtsElo]] or [[Elo]]) )
|
||||
sql.Begin()
|
||||
local rank = sql.Query( query )
|
||||
sql.Commit()
|
||||
|
||||
if not (rank and rank[1] and rank[1].Rank and rank[1].Count) then return false end
|
||||
|
||||
return rank and rank[1] and rank[1].Rank, rank and rank[1] and rank[1].Count
|
||||
end
|
||||
|
||||
util.AddNetworkString( "Chess Top10" )
|
||||
local ValidType = {["Chess"] = true, ["Draughts"] = true}
|
||||
|
||||
local TopTable = {}
|
||||
net.Receive( "Chess Top10", function( len, ply )
|
||||
if not IsValid(ply) then return end
|
||||
|
||||
local typ = net.ReadString()
|
||||
if not (typ and ValidType[typ]) then typ = "Chess" end
|
||||
if not playerResults[typ] then playerResults[typ] = {} end
|
||||
|
||||
if playerResults[typ][ply] and (CurTime()<(playerResults[typ][ply].nextUpdate or 0)) then
|
||||
net.Start( "Chess Top10" )
|
||||
net.WriteString( typ )
|
||||
net.Send( ply )
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
if CurTime()>(nextTopUpdate[typ] or 0) then
|
||||
local query = string.gsub([[SELECT Username, SteamID, {ELO} as Elo, (
|
||||
SELECT COUNT(*)+1
|
||||
FROM ChessLeaderboard ordered
|
||||
WHERE (ordered.{ELO}) > (uo.{ELO})
|
||||
) AS Rank
|
||||
FROM ChessLeaderboard uo ORDER BY {ELO} DESC LIMIT 10;]], "{ELO}", (typ=="Draughts" and [[DraughtsElo]] or [[Elo]]) )
|
||||
sql.Begin()
|
||||
local Top10 = sql.Query( query )
|
||||
sql.Commit()
|
||||
|
||||
if Top10==false then
|
||||
Error( "Chess: Top10 retrieval failed - Query error. "..sql.LastError().."\n" )
|
||||
return
|
||||
elseif Top10==nil then
|
||||
Error( "Chess: Top10 retrieval failed - No data." )
|
||||
return
|
||||
end
|
||||
|
||||
TopTable = Top10
|
||||
|
||||
table.Empty(playerResults[typ])
|
||||
nextTopUpdate[typ] = CurTime() + 120
|
||||
end
|
||||
|
||||
local str = ""
|
||||
if (not playerResults[typ][ply]) or CurTime()<(playerResults[typ][ply].nextUpdate) then
|
||||
local rank,total = Chess_GetRank(ply, typ)
|
||||
playerResults[typ][ply] = {rank = rank, total = total}
|
||||
end
|
||||
local res = playerResults[typ][ply]
|
||||
str = (res.rank and res.total and res.rank.." of "..res.total) or res.rank or "N/A"
|
||||
|
||||
net.Start( "Chess Top10" )
|
||||
net.WriteString( typ )
|
||||
net.WriteTable( TopTable )
|
||||
|
||||
net.WriteString( str )
|
||||
net.WriteString(math.floor(nextTopUpdate[typ] - 120))
|
||||
net.Send( ply )
|
||||
|
||||
playerResults[typ][ply].nextUpdate = CurTime() + 30
|
||||
end)
|
||||
|
||||
-- function TestElo()
|
||||
-- local typ = ""
|
||||
|
||||
-- local query = string.gsub([[SELECT *,(
|
||||
-- SELECT COUNT(*)+1
|
||||
-- FROM ChessLeaderboard ordered
|
||||
-- WHERE (ordered.{ELO}) > (uo.{ELO})
|
||||
-- ) AS Rank, (SELECT COUNT(*) FROM ChessLeaderboard) AS Count
|
||||
-- FROM ChessLeaderboard uo ORDER BY {ELO} DESC;]], "{ELO}", (typ=="Draughts" and [[DraughtsElo]] or [[Elo]]) )
|
||||
-- sql.Begin()
|
||||
-- local Top10 = sql.Query( query )
|
||||
-- sql.Commit()
|
||||
|
||||
-- if Top10 then
|
||||
-- print( Top10 )
|
||||
-- PrintTable( Top10 )
|
||||
|
||||
-- print( Top10[1].Rank, type(Top10[1].Rank) )
|
||||
-- else
|
||||
-- print( sql.LastError() )
|
||||
-- end
|
||||
-- end
|
||||
|
||||
2950
addons/chess/lua/entities/ent_chess_board.lua
Normal file
2950
addons/chess/lua/entities/ent_chess_board.lua
Normal file
File diff suppressed because it is too large
Load Diff
684
addons/chess/lua/entities/ent_draughts_board.lua
Normal file
684
addons/chess/lua/entities/ent_draughts_board.lua
Normal file
@@ -0,0 +1,684 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
if SERVER then
|
||||
AddCSLuaFile()
|
||||
end
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.Model = Model("models/weapons/w_slam.mdl")
|
||||
ENT.Base = "ent_chess_board"
|
||||
ENT.Models = {
|
||||
["board"] = Model("models/props_phx/games/chess/board.mdl"),
|
||||
["table"] = Model("models/props/de_tides/restaurant_table.mdl"),
|
||||
["hl2table"] = Model( "models/props_c17/furnituretable001a.mdl" ),
|
||||
|
||||
["dama"] = Model("models/props_phx/games/chess/white_pawn.mdl"),
|
||||
|
||||
["WhiteMan"] = Model("models/props_phx/games/chess/white_dama.mdl"), ["BlackMan"] = Model("models/props_phx/games/chess/black_dama.mdl"),
|
||||
["WhiteKing"] = Model("models/props_phx/games/chess/white_dama.mdl"), ["BlackKing"] = Model("models/props_phx/games/chess/black_dama.mdl"),
|
||||
}
|
||||
ENT.Characters = { -- Notepad's being weird and not showing these characters. If you can't see them, they'll still show up in-game.
|
||||
["WhiteMan"] = Model("⛀"), ["BlackMan"] = Model("⛂"),
|
||||
["WhiteKing"] = Model("⛁"), ["BlackKing"] = Model("⛃"),
|
||||
}
|
||||
ENT.DrawDouble = {
|
||||
["King"] = true,
|
||||
}
|
||||
|
||||
ENT.PrintName = "Draughts/Checkers"
|
||||
ENT.Author = "my_hat_stinks"
|
||||
ENT.Information = "A draughts (checkers) board"
|
||||
ENT.Category = "Game boards"
|
||||
|
||||
ENT.Game = "Draughts"
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminOnly = true
|
||||
ENT.AdminSpawnable = true
|
||||
|
||||
--Status
|
||||
local CHESS_INACTIVE = 0
|
||||
local CHESS_WHITEMOVE = 1
|
||||
local CHESS_BLACKMOVE = 2
|
||||
local CHESS_WHITEPROMO = 3 local CHESS_WHITEJUMP = 3
|
||||
local CHESS_BLACKPROMO = 4 local CHESS_BLACKJUMP = 4
|
||||
local CHESS_WAGER = 5
|
||||
|
||||
--Captured piece squares
|
||||
local CHESS_WCAP1 = 10
|
||||
local CHESS_WCAP2 = 11
|
||||
local CHESS_BCAP1 = 12
|
||||
local CHESS_BCAP2 = 13
|
||||
|
||||
-- Draw Offer
|
||||
local PLAYER_NONE = 0 -- Nobody offering to draw
|
||||
local PLAYER_WHITE = 1 -- White offering to draw
|
||||
local PLAYER_BLACK = 2 -- Black offering to draw
|
||||
|
||||
local NumToLetter = {"a", "b", "c", "d", "e", "f", "g", "h", ["a"]=1, ["b"]=2, ["c"]=3, ["d"]=4, ["e"]=5, ["f"]=6, ["g"]=7, ["h"]=8} --Used extensively for conversions
|
||||
|
||||
ENT.StartState = CHESS_BLACKMOVE
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
-- self:NetworkVar( "Int", 0, "BlackPassant" )
|
||||
-- self:NetworkVar( "Int", 1, "WhitePassant" )
|
||||
|
||||
self:NetworkVar( "Int", 2, "ChessState" )
|
||||
self:NetworkVar( "Bool", 0, "Playing" )
|
||||
self:NetworkVar( "Int", 3, "DrawOffer" )
|
||||
|
||||
self:NetworkVar( "Float", 0, "WhiteWager" )
|
||||
self:NetworkVar( "Float", 1, "BlackWager" )
|
||||
|
||||
self:NetworkVar( "Entity", 0, "WhitePlayer" )
|
||||
self:NetworkVar( "Entity", 1, "BlackPlayer" )
|
||||
self:NetworkVar( "Entity", 2, "TableEnt" )
|
||||
|
||||
-- self:NetworkVar( "Int", 3, "MoveCount" )
|
||||
-- self:NetworkVar( "Bool", 1, "Repetition" )
|
||||
|
||||
self:NetworkVar( "Bool", 2, "PSWager" )
|
||||
|
||||
self:NetworkVar( "Float", 2, "WhiteTime" )
|
||||
self:NetworkVar( "Float", 3, "BlackTime" )
|
||||
|
||||
--Draughts vars
|
||||
self:NetworkVar( "Bool", 1, "JumpMove" )
|
||||
self:NetworkVar( "Int", 0, "JumpLet" )
|
||||
self:NetworkVar( "Int", 1, "JumpNum" )
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
self.ChessDerived = true
|
||||
self.IsDraughts = true
|
||||
|
||||
return self.BaseClass.Initialize( self )
|
||||
end
|
||||
|
||||
function ENT:GetManMoves( tbl, GridLet, GridNum, IsWhite )
|
||||
local CapMove = false
|
||||
|
||||
--Forward Right
|
||||
local TargetRow = GridNum+ (IsWhite and 1 or (-1))
|
||||
local TargetColumn = NumToLetter[GridLet]+1
|
||||
if TargetRow<=8 and TargetRow>=1 and TargetColumn<=8 and TargetColumn>=1 then
|
||||
local target = self:GetSquare( NumToLetter[TargetColumn], TargetRow )
|
||||
if target then
|
||||
if ((self:SquareTeam(target)=="White")~=IsWhite) then --Enemy piece
|
||||
local CapRow = TargetRow+ (IsWhite and 1 or (-1))
|
||||
local CapCol = TargetColumn+1
|
||||
|
||||
if CapRow<=8 and CapRow>=1 and CapCol<=8 and CapCol>=1 then --In range
|
||||
local target = self:GetSquare( NumToLetter[CapCol], CapRow )
|
||||
if not target then --Empty space
|
||||
tbl[NumToLetter[CapCol]][CapRow] = {"CAPTURE", NumToLetter[TargetColumn], TargetRow} --Capture move
|
||||
CapMove = true --Flag as capture move
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
tbl[NumToLetter[TargetColumn]][TargetRow] = true --Standard valid move
|
||||
end
|
||||
end
|
||||
--Forward Left
|
||||
local TargetRow = GridNum+ (IsWhite and 1 or (-1))
|
||||
local TargetColumn = NumToLetter[GridLet]-1
|
||||
if TargetRow<=8 and TargetRow>=1 and TargetColumn<=8 and TargetColumn>=1 then
|
||||
local target = self:GetSquare( NumToLetter[TargetColumn], TargetRow )
|
||||
if target then
|
||||
if ((self:SquareTeam(target)=="White")~=IsWhite) then
|
||||
local CapRow = TargetRow+ (IsWhite and 1 or (-1))
|
||||
local CapCol = TargetColumn-1
|
||||
|
||||
if CapRow<=8 and CapRow>=1 and CapCol<=8 and CapCol>=1 then
|
||||
local target = self:GetSquare( NumToLetter[CapCol], CapRow )
|
||||
if not target then
|
||||
tbl[NumToLetter[CapCol]][CapRow] = {"CAPTURE", NumToLetter[TargetColumn], TargetRow}
|
||||
CapMove = true
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
tbl[NumToLetter[TargetColumn]][TargetRow] = true --Standard valid move
|
||||
end
|
||||
end
|
||||
|
||||
return CapMove
|
||||
end
|
||||
function ENT:GetKingMoves( tbl, GridLet, GridNum, IsWhite )
|
||||
local CapMove = self:GetManMoves( tbl, GridLet, GridNum, IsWhite ) --Forward moves
|
||||
|
||||
--Back Right
|
||||
local TargetRow = GridNum+ (IsWhite and (-1) or (1))
|
||||
local TargetColumn = NumToLetter[GridLet]+1
|
||||
if TargetRow<=8 and TargetRow>=1 and TargetColumn<=8 and TargetColumn>=1 then
|
||||
local target = self:GetSquare( NumToLetter[TargetColumn], TargetRow )
|
||||
if target then
|
||||
if ((self:SquareTeam(target)=="White")~=IsWhite) then
|
||||
local CapRow = TargetRow+ (IsWhite and (-1) or (1))
|
||||
local CapCol = TargetColumn+1
|
||||
|
||||
if CapRow<=8 and CapRow>=1 and CapCol<=8 and CapCol>=1 then
|
||||
local target = self:GetSquare( NumToLetter[CapCol], CapRow )
|
||||
if not target then
|
||||
tbl[NumToLetter[CapCol]][CapRow] = {"CAPTURE", NumToLetter[TargetColumn], TargetRow}
|
||||
CapMove = true
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
tbl[NumToLetter[TargetColumn]][TargetRow] = true --Standard valid move
|
||||
end
|
||||
end
|
||||
--Back Left
|
||||
local TargetRow = GridNum+ (IsWhite and (-1) or (1))
|
||||
local TargetColumn = NumToLetter[GridLet]-1
|
||||
if TargetRow<=8 and TargetRow>=1 and TargetColumn<=8 and TargetColumn>=1 then
|
||||
local target = self:GetSquare( NumToLetter[TargetColumn], TargetRow )
|
||||
if target then
|
||||
if ((self:SquareTeam(target)=="White")~=IsWhite) then
|
||||
local CapRow = TargetRow+ (IsWhite and (-1) or (1))
|
||||
local CapCol = TargetColumn-1
|
||||
|
||||
if CapRow<=8 and CapRow>=1 and CapCol<=8 and CapCol>=1 then
|
||||
local target = self:GetSquare( NumToLetter[CapCol], CapRow )
|
||||
if not target then
|
||||
tbl[NumToLetter[CapCol]][CapRow] = {"CAPTURE", NumToLetter[TargetColumn], TargetRow}
|
||||
CapMove = true
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
tbl[NumToLetter[TargetColumn]][TargetRow] = true --Standard valid move
|
||||
end
|
||||
end
|
||||
|
||||
return CapMove
|
||||
end
|
||||
function ENT:GetMove( GridLet, GridNum, IgnoreCap )
|
||||
if not (GridLet and GridNum) then return {} end
|
||||
if not NumToLetter[GridLet] then return {} end
|
||||
if NumToLetter[GridLet]<1 or NumToLetter[GridLet]>8 then return {} end
|
||||
if GridNum<1 or GridNum>8 then return {} end
|
||||
|
||||
local square = self:GetSquare( GridLet, GridNum )
|
||||
if not square then return {} end
|
||||
|
||||
local class = square.Class or (IsValid(square.Ent) and square.Ent:GetRole())
|
||||
if not class then return {} end
|
||||
|
||||
if self:GetJumpMove() and self:GetJumpLet()~=0 and self:GetJumpNum()~=0 and (NumToLetter[GridLet]~=self:GetJumpLet() or GridNum~=self:GetJumpNum()) then return {} end
|
||||
|
||||
local IsWhite = self:SquareTeam(square)=="White"
|
||||
local Moved = self:SquareMoved(square)
|
||||
|
||||
local CanJump = IgnoreCap or self:CanCapture( IsWhite )
|
||||
local tbl = { ["a"] = {}, ["b"] = {}, ["c"] = {}, ["d"] = {}, ["e"] = {}, ["f"] = {}, ["g"] = {}, ["h"] = {} }
|
||||
if class=="King" then
|
||||
self:GetKingMoves( tbl, GridLet, GridNum, IsWhite )
|
||||
else
|
||||
self:GetManMoves( tbl, GridLet, GridNum, IsWhite )
|
||||
end
|
||||
|
||||
if CanJump then
|
||||
for CheckLet,File in pairs(tbl) do
|
||||
for CheckNum,v in pairs(File) do
|
||||
if v==true then
|
||||
tbl[CheckLet][CheckNum] = nil --We can capture, but this isn't a capture move
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return tbl
|
||||
end
|
||||
|
||||
function ENT:ResetBoard()
|
||||
if SERVER then
|
||||
self:SetDrawOffer( PLAYER_NONE )
|
||||
|
||||
self:SetWhiteWager( -1 )
|
||||
self:SetBlackWager( -1 )
|
||||
|
||||
self:SetWhiteTime( 600 )
|
||||
self:SetBlackTime( 600 )
|
||||
|
||||
self:SetJumpMove( false )
|
||||
self:SetJumpLet( 0 )
|
||||
self:SetJumpNum( 0 )
|
||||
end
|
||||
self:RefreshSquares()
|
||||
|
||||
if self.Pieces then
|
||||
for _,File in pairs( self.Pieces ) do
|
||||
for _,Square in pairs(File) do
|
||||
if IsValid(Square.Ent) then Square.Ent:SetGridNum(-1) Square.Ent:Remove() end
|
||||
end
|
||||
end
|
||||
end
|
||||
self.Pieces = {
|
||||
["a"] = {
|
||||
[1] = {Team="White",Class="Man",Moved=false}, [3] = {Team="White",Class="Man",Moved=false}, [7] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
["b"] = {
|
||||
[2] = {Team="White",Class="Man",Moved=false}, [6] = {Team="Black",Class="Man",Moved=false}, [8] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
["c"] = {
|
||||
[1] = {Team="White",Class="Man",Moved=false}, [3] = {Team="White",Class="Man",Moved=false}, [7] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
["d"] = {
|
||||
[2] = {Team="White",Class="Man",Moved=false}, [6] = {Team="Black",Class="Man",Moved=false}, [8] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
["e"] = {
|
||||
[1] = {Team="White",Class="Man",Moved=false}, [3] = {Team="White",Class="Man",Moved=false}, [7] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
["f"] = {
|
||||
[2] = {Team="White",Class="Man",Moved=false}, [6] = {Team="Black",Class="Man",Moved=false}, [8] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
["g"] = {
|
||||
[1] = {Team="White",Class="Man",Moved=false}, [3] = {Team="White",Class="Man",Moved=false}, [7] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
["h"] = {
|
||||
[2] = {Team="White",Class="Man",Moved=false}, [6] = {Team="Black",Class="Man",Moved=false}, [8] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
[CHESS_WCAP1] = {}, [CHESS_WCAP2] = {}, [CHESS_BCAP1] = {}, [CHESS_BCAP2] = {},
|
||||
}
|
||||
self:Update()
|
||||
end
|
||||
|
||||
function ENT:CanCapture( White )
|
||||
for Let,column in pairs( self.Pieces ) do
|
||||
for Num,square in pairs( column ) do
|
||||
if square.Team==(White and "White" or "Black") then
|
||||
local moves = self:GetMove( Let, Num, true )
|
||||
for _,column in pairs( moves ) do
|
||||
for _,move in pairs( column ) do
|
||||
if type(move)=="table" and move[1]=="CAPTURE" then return true end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
function ENT:CanMove( White )
|
||||
for Let,column in pairs( self.Pieces ) do
|
||||
for Num,square in pairs( column ) do
|
||||
if square.Team==(White and "White" or "Black") then
|
||||
local moves = self:GetMove( Let, Num )
|
||||
for _,column in pairs( moves ) do
|
||||
for _,move in pairs( column ) do
|
||||
if move then return true end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function ENT:NoMaterialCheck()
|
||||
local BlackMat = {}
|
||||
local WhiteMat = {}
|
||||
|
||||
for GridLet,File in pairs(self.Pieces) do
|
||||
if GridLet==CHESS_WCAP1 or GridLet==CHESS_WCAP2 or GridLet==CHESS_BCAP1 or GridLet==CHESS_BCAP2 then continue end
|
||||
for GridNum,square in pairs(File) do
|
||||
if square then
|
||||
local IsWhite = self:SquareTeam(square)=="White"
|
||||
|
||||
if IsWhite then
|
||||
table.insert( WhiteMat, {Square=square, Class=Class, GridLet=GridLet, GridNum=GridNum} )
|
||||
else
|
||||
table.insert( BlackMat, {square=square, Class=Class, GridLet=GridLet, GridNum=GridNum} )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if (#BlackMat+#WhiteMat)==0 then self:EndGame() return false end
|
||||
if #WhiteMat==0 then self:EndGame("Black") return false end
|
||||
if #BlackMat==0 then self:EndGame("White") return false end
|
||||
|
||||
return true
|
||||
end
|
||||
function ENT:EndGame( winner, NoMsg )
|
||||
self:SetChessState( CHESS_INACTIVE )
|
||||
self:SetPlaying( false )
|
||||
|
||||
local White = self:GetPlayer( "White" )
|
||||
local Black = self:GetPlayer( "Black" )
|
||||
local WhiteName = IsValid(White) and White:Nick() or "[Anonymous White]"
|
||||
local BlackName = IsValid(Black) and Black:Nick() or "[Anonymous Black]"
|
||||
if not NoMsg then
|
||||
net.Start( "Chess GameOver" )
|
||||
if winner=="White" then
|
||||
net.WriteTable( {" ", Color(255,255,255), WhiteName, Color(150,255,150), " has won against ", Color(100,100,100), BlackName, Color(150,255,150), "!"} )
|
||||
else
|
||||
net.WriteTable( {" ", Color(100,100,100), BlackName, Color(150,255,150), " has won against ", Color(255,255,255), WhiteName, Color(150,255,150), "!"} )
|
||||
end
|
||||
net.WriteString( "icon16/medal_gold_2.png" )
|
||||
net.Broadcast()
|
||||
end
|
||||
|
||||
timer.Simple( 0.5, function()
|
||||
if not IsValid(self) then return end
|
||||
if IsValid(Black) and Black:GetVehicle()==self.BlackSeat then Black:ExitVehicle() end
|
||||
if IsValid(White) and White:GetVehicle()==self.WhiteSeat then White:ExitVehicle() end
|
||||
end)
|
||||
|
||||
local winnings = (self.WagerValue or 0)*2
|
||||
if IsValid( White ) then
|
||||
if winner=="White" then
|
||||
if IsValid(Black) then White:DraughtsWin( Black ) end
|
||||
if self.WagerValue then
|
||||
if self:GetPSWager() then
|
||||
White:PS_GivePoints( winnings )
|
||||
else
|
||||
if White.addMoney then White:addMoney( winnings ) else White:SetDarkRPVar( "money", (White:getDarkRPVar( "money" ) or 0) + winnings ) end
|
||||
end
|
||||
end
|
||||
elseif winner~="Black" then
|
||||
if IsValid(Black) and winner~="Error" then White:DraughtsDraw( Black ) end
|
||||
if self.WagerValue then
|
||||
if self:GetPSWager() then
|
||||
White:PS_GivePoints( self.WagerValue )
|
||||
else
|
||||
if White.addMoney then White:addMoney( self.WagerValue ) else White:SetDarkRPVar( "money", (White:getDarkRPVar( "money" ) or 0) + self.WagerValue ) end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if IsValid( Black ) then
|
||||
if winner=="Black" then
|
||||
if IsValid(White) then Black:DraughtsWin( White ) end
|
||||
if self.WagerValue then
|
||||
if self:GetPSWager() then
|
||||
Black:PS_GivePoints( winnings )
|
||||
else
|
||||
if Black.addMoney then Black:addMoney( winnings ) else Black:SetDarkRPVar( "money", (Black:getDarkRPVar( "money" ) or 0) + winnings ) end
|
||||
end
|
||||
end
|
||||
elseif winner~="White" then
|
||||
if self.WagerValue then
|
||||
if self:GetPSWager() then
|
||||
White:PS_GivePoints( self.WagerValue )
|
||||
else
|
||||
if White.addMoney then White:addMoney( self.WagerValue ) else White:SetDarkRPVar( "money", (White:getDarkRPVar( "money" ) or 0) + self.WagerValue ) end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function ENT:DoCapture( square, EndLet, EndNum )
|
||||
if not square then return end
|
||||
|
||||
local class = square.Class
|
||||
|
||||
local made = false
|
||||
local CapLet,CapNum
|
||||
if square.Team=="White" then --Black captured
|
||||
for i=CHESS_BCAP1,CHESS_BCAP2 do
|
||||
for n=1,8 do
|
||||
local CapSq = self:GetSquare( i, n )
|
||||
if not CapSq then
|
||||
self.Pieces[i][n] = {Team="White", Class=class, Moved=false}
|
||||
CapSq = self.Pieces[i][n]
|
||||
|
||||
made = true
|
||||
CapLet,CapNum = i,n
|
||||
break
|
||||
end
|
||||
end
|
||||
if made then break end
|
||||
end
|
||||
else
|
||||
for i=CHESS_WCAP1,CHESS_WCAP2 do
|
||||
for n=1,8 do
|
||||
local CapSq = self:GetSquare( i, n )
|
||||
if not CapSq then
|
||||
self.Pieces[i][n] = {Team="Black", Class=class, Moved=false}
|
||||
CapSq = self.Pieces[i][n]
|
||||
|
||||
made = true
|
||||
CapLet,CapNum = i,n
|
||||
break
|
||||
end
|
||||
end
|
||||
if made then break end
|
||||
end
|
||||
end
|
||||
|
||||
return {From={EndLet,EndNum}, To={CapLet,CapNum}}
|
||||
end
|
||||
function ENT:DoMove( StartLet, StartNum, EndLet, EndNum )
|
||||
if CLIENT then return end
|
||||
if not (StartLet and EndLet and StartNum and EndNum) then return end
|
||||
if (StartLet==EndLet) and (StartNum==EndNum) then return end
|
||||
|
||||
local Start = self:GetSquare( StartLet, StartNum )
|
||||
if not Start then return end
|
||||
|
||||
local Moves = self:GetMove( StartLet, StartNum )
|
||||
if not Moves[EndLet][EndNum] then return end
|
||||
local Move = Moves[EndLet][EndNum]
|
||||
|
||||
local CapMove
|
||||
if type(Move)=="table" then
|
||||
if Move[1]=="CAPTURE" then
|
||||
local CapLet, CapNum = Move[2], Move[3]
|
||||
local square = self:GetSquare( CapLet, CapNum )
|
||||
if CapLet and CapNum then
|
||||
CapMove = self:DoCapture( square, CapLet, CapNum )
|
||||
self.Pieces[CapLet][CapNum] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local End = self:GetSquare( EndLet, EndNum )
|
||||
if not End then
|
||||
self.Pieces[EndLet] = self.Pieces[EndLet] or {}
|
||||
self.Pieces[EndLet][EndNum] = self.Pieces[EndLet][EndNum] or {}
|
||||
End = self.Pieces[EndLet][EndNum]
|
||||
end
|
||||
|
||||
End.Team=Start.Team
|
||||
End.Class=Start.Class
|
||||
End.Moved=true
|
||||
|
||||
self.Pieces[StartLet][StartNum] = nil
|
||||
|
||||
local ply = self:GetPlayer( End.Team )
|
||||
if (EndNum==1 or EndNum==8) and End.Class=="Man" then --End of the board, promote
|
||||
End.Class = "King"
|
||||
// self:SetChessState( End.Team=="White" and CHESS_BLACKMOVE or CHESS_WHITEMOVE )
|
||||
//
|
||||
// self:SetJumpMove( false )
|
||||
// self:SetJumpLet( 0 )
|
||||
// self:SetJumpNum( 0 )
|
||||
end
|
||||
if type(Move)=="table" and Move[1]=="CAPTURE" then
|
||||
self:SetJumpMove(false)
|
||||
if self:CanCapture( End.Team=="White" ) then
|
||||
local GetMoves = self:GetMove(EndLet, EndNum)
|
||||
local Cap = false
|
||||
for _,column in pairs( GetMoves ) do
|
||||
for _,move in pairs(column) do
|
||||
if move and move~=true then
|
||||
Cap=true
|
||||
end
|
||||
end
|
||||
end
|
||||
if Cap then
|
||||
self:SetJumpMove( true )
|
||||
self:SetJumpLet( NumToLetter[EndLet] )
|
||||
self:SetJumpNum( EndNum )
|
||||
else
|
||||
self:SetChessState( End.Team=="White" and CHESS_BLACKMOVE or CHESS_WHITEMOVE )
|
||||
|
||||
self:SetJumpMove( false )
|
||||
self:SetJumpLet( 0 )
|
||||
self:SetJumpNum( 0 )
|
||||
end
|
||||
else
|
||||
self:SetChessState( End.Team=="White" and CHESS_BLACKMOVE or CHESS_WHITEMOVE )
|
||||
|
||||
self:SetJumpMove( false )
|
||||
self:SetJumpLet( 0 )
|
||||
self:SetJumpNum( 0 )
|
||||
end
|
||||
else --Standard move, other player's turn
|
||||
self:SetChessState( End.Team=="White" and CHESS_BLACKMOVE or CHESS_WHITEMOVE )
|
||||
|
||||
self:SetJumpMove( false )
|
||||
self:SetJumpLet( 0 )
|
||||
self:SetJumpNum( 0 )
|
||||
end
|
||||
|
||||
local move = {From={StartLet,StartNum},To={EndLet,EndNum}}
|
||||
self:Update( move, CapMove )
|
||||
|
||||
self:NoMaterialCheck()
|
||||
|
||||
if self:GetChessState()==CHESS_BLACKMOVE and not self:CanMove( false ) then self:EndGame( "White" ) end
|
||||
if self:GetChessState()==CHESS_WHITEMOVE and not self:CanMove( true ) then self:EndGame( "Black" ) end
|
||||
|
||||
return move
|
||||
end
|
||||
|
||||
function ENT:GetElo( ply )
|
||||
return IsValid(ply) and " ("..ply:GetDraughtsElo()..")" or ""
|
||||
end
|
||||
|
||||
if CLIENT then
|
||||
local PanelCol = {
|
||||
Main = Color(0,0,0,200), ToMove = Color(200,200,200,20), Text = Color(180,180,180),
|
||||
White = Color(255,255,255), Black = Color(20,20,20,255),
|
||||
}
|
||||
local StateToString = {[CHESS_INACTIVE] = "Waiting", [CHESS_WHITEMOVE] = "White", [CHESS_BLACKMOVE] = "Black", [CHESS_WHITEPROMO] = "White (jumping)", [CHESS_BLACKPROMO] = "Black (jumping)", [CHESS_WAGER] = "Wagers"}
|
||||
function ENT:CreateChessPanel()
|
||||
self:EndSpectating()
|
||||
|
||||
local frame = vgui.Create( "DFrame" )
|
||||
frame:SetSize(400,115)
|
||||
frame:SetPos( (ScrW()/2)-100, ScrH()-150 )
|
||||
--frame:SetDraggable( false )
|
||||
frame:SetTitle( "" )
|
||||
frame:ShowCloseButton( false )
|
||||
frame:SetDeleteOnClose( true )
|
||||
frame.Paint = function( s,w,h )
|
||||
if not IsValid(self) then
|
||||
s:Remove()
|
||||
gui.EnableScreenClicker( false )
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
draw.RoundedBox( 8, 0, 0, w, h, PanelCol.Main )
|
||||
end
|
||||
frame:DockMargin( 0,0,0,0 )
|
||||
frame:DockPadding( 5,6,5,5 )
|
||||
|
||||
local TimePnl = vgui.Create( "DPanel", frame )
|
||||
TimePnl:Dock( RIGHT )
|
||||
TimePnl:SetWide( 100 )
|
||||
TimePnl:DockMargin( 2,2,2,2 )
|
||||
TimePnl.Paint = function(s,w,h)
|
||||
if not IsValid(self) then return end
|
||||
|
||||
draw.RoundedBox( 16, 0, 0, w, (h/2)-1, PanelCol.ToMove )
|
||||
draw.RoundedBox( 16, 0, (h/2)+1, w, (h/2)-1, PanelCol.ToMove )
|
||||
|
||||
draw.SimpleText( string.FormattedTime( math.Round(self:GetWhiteTime() or 300,1), "%02i:%02i" ), "ChessText", w/2, h/4, PanelCol.White, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER )
|
||||
draw.SimpleText( string.FormattedTime( math.Round(self:GetBlackTime() or 300,1), "%02i:%02i" ), "ChessText", w/2, (h/4)+(h/2), PanelCol.Black, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER )
|
||||
end
|
||||
|
||||
local ButtonPanel = vgui.Create( "DPanel", frame )
|
||||
ButtonPanel:SetSize( 100, 20 )
|
||||
ButtonPanel:Dock( LEFT )
|
||||
ButtonPanel.Paint = function() end
|
||||
|
||||
local ToMove = vgui.Create( "DPanel", frame )
|
||||
ToMove:SetSize(200,80)
|
||||
ToMove:Dock( FILL )
|
||||
ToMove.Paint = function( s,w,h )
|
||||
draw.RoundedBox( 4, 0, 0, w, h, PanelCol.ToMove )
|
||||
draw.SimpleText( "To move", "ChessTextSmall", 5, 0, PanelCol.Text )
|
||||
local state = IsValid(self) and self:GetChessState()
|
||||
if not (IsValid( self ) and state) then
|
||||
draw.SimpleText( "[N/A]", "ChessTextSmall", w/2, h/2, PanelCol.Text, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER )
|
||||
else
|
||||
local str = (StateToString[state] or "N/A")..( (self:GetPlaying() and self:GetJumpMove() and " (jump)") or "" )
|
||||
local col = ((state==CHESS_WHITEMOVE or state==CHESS_WHITEPROMO) and PanelCol.White) or ((state==CHESS_BLACKMOVE or state==CHESS_BLACKPROMO) and PanelCol.Black) or PanelCol.Text
|
||||
draw.SimpleText( str, "ChessTextLarge", w/2, h/2, col, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER )
|
||||
end
|
||||
end
|
||||
|
||||
frame.OfferDraw = vgui.Create( "DButton", ButtonPanel)
|
||||
frame.OfferDraw:SetSize(94,35)
|
||||
frame.OfferDraw:Dock( TOP )
|
||||
frame.OfferDraw:SetText( "Offer Draw" )
|
||||
frame.OfferDraw.DoClick = function( s )
|
||||
if (IsValid(self)) and not (self:GetPlaying()) then
|
||||
chat.AddText( Color(150,255,150), "You can't offer a draw before the game starts!" )
|
||||
return
|
||||
end
|
||||
net.Start( "Chess DrawOffer" ) net.SendToServer()
|
||||
-- s:SetText( "Draw offered" )
|
||||
end
|
||||
frame.OfferDraw.Think = function(s)
|
||||
if IsValid(self) and self:GetDrawOffer()~=PLAYER_NONE then
|
||||
if s.TextChanged then return end
|
||||
s.TextChanged = true
|
||||
|
||||
if LocalPlayer()==self:GetWhitePlayer() then
|
||||
if self:GetDrawOffer()==PLAYER_WHITE then
|
||||
s:SetText( "Draw Offered" )
|
||||
elseif self:GetDrawOffer()==PLAYER_BLACK then
|
||||
s:SetText( "Accept Draw Offer" )
|
||||
end
|
||||
elseif LocalPlayer()==self:GetBlackPlayer() then
|
||||
if self:GetDrawOffer()==PLAYER_WHITE then
|
||||
s:SetText( "Accept Draw Offer" )
|
||||
elseif self:GetDrawOffer()==PLAYER_BLACK then
|
||||
s:SetText( "Draw Offered" )
|
||||
end
|
||||
end
|
||||
elseif s.TextChanged then
|
||||
s.TextChanged = false
|
||||
s:SetText( "Offer Draw" )
|
||||
end
|
||||
end
|
||||
|
||||
local Resign = vgui.Create( "DButton", ButtonPanel)
|
||||
Resign:SetSize(94,35)
|
||||
Resign:Dock( TOP )
|
||||
Resign:SetText( "Resign" )
|
||||
Resign.DoClick = function( s )
|
||||
net.Start( "Chess ClientResign" ) net.SendToServer() --No client-side exit func :/
|
||||
end
|
||||
|
||||
local DermaMode = vgui.Create( "DButton", ButtonPanel)
|
||||
DermaMode:SetSize(94,35)
|
||||
DermaMode:Dock( TOP )
|
||||
DermaMode:SetText( "Toggle 2D Mode" )
|
||||
DermaMode.DoClick = function( s )
|
||||
if IsValid(Chess_2DDermaPanel) then
|
||||
Chess_2DDermaPanel:Remove()
|
||||
else
|
||||
Chess_Open2DBoard( self )
|
||||
end
|
||||
end
|
||||
|
||||
return frame
|
||||
end
|
||||
end
|
||||
241
addons/chess/lua/weapons/chess_admin_tool.lua
Normal file
241
addons/chess/lua/weapons/chess_admin_tool.lua
Normal file
@@ -0,0 +1,241 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
--Easy placement and saving for Chess boards
|
||||
if SERVER then AddCSLuaFile() end
|
||||
|
||||
SWEP.Base = "weapon_base"
|
||||
|
||||
SWEP.Category = "Game boards"
|
||||
SWEP.Author = "my_hat_stinks"
|
||||
SWEP.Instructions = "Left click to place a board, right click to remove a board, reload for menu"
|
||||
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminOnly = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.Slot = 4
|
||||
SWEP.PrintName = "Chess Admin Tool"
|
||||
|
||||
SWEP.ViewModelFOV = 80
|
||||
SWEP.Weight = 5
|
||||
SWEP.AutoSwitchTo = false
|
||||
SWEP.AutoSwitchFrom = false
|
||||
|
||||
SWEP.WorldModel = "models/weapons/w_toolgun.mdl"
|
||||
SWEP.ViewModel = "models/weapons/c_toolgun.mdl"
|
||||
SWEP.UseHands = true
|
||||
|
||||
SWEP.Primary.Recoil = 1
|
||||
SWEP.Primary.Damage = 5
|
||||
SWEP.Primary.NumShots = 1
|
||||
SWEP.Primary.Cone = 0
|
||||
SWEP.Primary.Delay = 1
|
||||
|
||||
SWEP.Primary.ClipSize = -1
|
||||
SWEP.Primary.DefaultClip = -1
|
||||
SWEP.Primary.Automatic = false
|
||||
SWEP.Primary.Ammo = "none"
|
||||
SWEP.Primary.ClipMax = -1
|
||||
|
||||
SWEP.Secondary.ClipSize = -1
|
||||
SWEP.Secondary.DefaultClip = -1
|
||||
SWEP.Secondary.Automatic = false
|
||||
SWEP.Secondary.Ammo = "none"
|
||||
SWEP.Secondary.ClipMax = -1
|
||||
|
||||
SWEP.DeploySpeed = 1.5
|
||||
|
||||
SWEP.PrimaryAnim = ACT_VM_PRIMARYATTACK
|
||||
SWEP.ReloadAnim = ACT_VM_RELOAD
|
||||
SWEP.HoldType = "pistol"
|
||||
|
||||
SWEP.GameEntities = {
|
||||
{"Chess", "ent_chess_board", {["board"] = Model("models/props_phx/games/chess/board.mdl"), ["table"] = Model("models/props/de_tides/restaurant_table.mdl")}},
|
||||
{"Draughts/Checkers", "ent_draughts_board", {["board"] = Model("models/props_phx/games/chess/board.mdl"), ["table"] = Model("models/props/de_tides/restaurant_table.mdl")}},
|
||||
}
|
||||
function SWEP:SetupDataTables()
|
||||
self:NetworkVar( "Int", 0, "EntID" )
|
||||
end
|
||||
|
||||
function SWEP:Initialize()
|
||||
self:SetEntID( 1 ) --Chess by default
|
||||
end
|
||||
function SWEP:PrimaryAttack()
|
||||
if SERVER and IsValid( self.Owner ) then
|
||||
if not self.Owner:IsAdmin() then
|
||||
self.Owner:ChatPrint( "You are not allowed to use this tool!" )
|
||||
self:Remove()
|
||||
return
|
||||
end
|
||||
local tr = self.Owner:GetEyeTrace()
|
||||
if tr.Hit and tr.HitPos then
|
||||
local ent = ents.Create( self.GameEntities[self:GetEntID()][2] )
|
||||
ent:SetPos( tr.HitPos )
|
||||
ent:Spawn()
|
||||
end
|
||||
end
|
||||
end
|
||||
function SWEP:SecondaryAttack()
|
||||
if SERVER and IsValid( self.Owner ) then
|
||||
if not self.Owner:IsAdmin() then
|
||||
self.Owner:ChatPrint( "You are not allowed to use this tool!" )
|
||||
self:Remove()
|
||||
return
|
||||
end
|
||||
|
||||
local tr = self.Owner:GetEyeTrace()
|
||||
if IsValid(tr.Entity) and tr.Entity.IsChessEntity then tr.Entity:Remove() end
|
||||
end
|
||||
end
|
||||
function SWEP:Reload()
|
||||
if CLIENT then self:OpenMenu() end
|
||||
end
|
||||
|
||||
function SWEP:OpenMenu()
|
||||
if SERVER then return end
|
||||
if IsValid(self.Menu) then self.Menu:Remove() end
|
||||
|
||||
self.Menu = vgui.Create( "DFrame" )
|
||||
self.Menu:SetTitle( "Chess Admin Tool" )
|
||||
self.Menu:SetSize( 300, 80 )
|
||||
self.Menu:SetPos( ScrW()/2-150, ScrH()/2-50 )
|
||||
self.Menu:MakePopup()
|
||||
|
||||
local drop = vgui.Create( "DComboBox", self.Menu )
|
||||
drop:Dock( TOP )
|
||||
drop:SetValue( "Select Board" )
|
||||
for i=1,#self.GameEntities do
|
||||
drop:AddChoice( self.GameEntities[i][1], i )
|
||||
end
|
||||
drop.OnSelect = function( s, ind, val, data )
|
||||
RunConsoleCommand( "chess_admin_toolent", tostring(data) )
|
||||
end
|
||||
|
||||
local btnpnl = vgui.Create( "DPanel", self.Menu )
|
||||
btnpnl:Dock( BOTTOM )
|
||||
btnpnl:SetTall( 20 )
|
||||
btnpnl.Paint = function() end
|
||||
|
||||
local close = vgui.Create( "DButton", btnpnl )
|
||||
close:SetWidth( 98 )
|
||||
close:Dock( RIGHT )
|
||||
close:SetText( "Close" )
|
||||
close.DoClick = function(s) if IsValid(self) and IsValid(self.Menu) then self.Menu:Remove() end end
|
||||
|
||||
local rem = vgui.Create( "DButton", btnpnl )
|
||||
rem:SetWidth( 98 )
|
||||
rem:Dock( LEFT )
|
||||
rem:SetText( "Remove tool" )
|
||||
rem.DoClick = function(s)
|
||||
RunConsoleCommand( "chess_admin_toolremove" )
|
||||
if IsValid(self) and IsValid(self.Menu) then self.Menu:Remove() end
|
||||
end
|
||||
|
||||
local sv = vgui.Create( "DButton", btnpnl )
|
||||
sv:SetWidth( 98 )
|
||||
sv:Dock( FILL )
|
||||
sv:SetText( "Save boards" )
|
||||
sv.DoClick = function(s)
|
||||
RunConsoleCommand( "chess_save" )
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:OnRemove()
|
||||
if CLIENT and self.Ghosts then
|
||||
for _,v in pairs(self.Ghosts) do if IsValid(v) then v:Remove() end end
|
||||
end
|
||||
end
|
||||
function SWEP:Holster()
|
||||
if CLIENT then
|
||||
if self.Ghosts then
|
||||
for _,v in pairs(self.Ghosts) do if IsValid(v) then v:Remove() end end
|
||||
end
|
||||
return true
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
local function SetToolEnt( tool, index )
|
||||
if tool.GameEntities[index] then tool:SetEntID( index ) end
|
||||
end
|
||||
concommand.Add( "chess_admin_toolent", function(p,c,a)
|
||||
if IsValid(p:GetActiveWeapon()) and p:GetActiveWeapon():GetClass()=="chess_admin_tool" then
|
||||
SetToolEnt( p:GetActiveWeapon(), tonumber(a[1]) )
|
||||
end
|
||||
end)
|
||||
concommand.Add( "chess_admin_toolremove", function(p,c,a)
|
||||
if IsValid(p:GetActiveWeapon()) and p:GetActiveWeapon():GetClass()=="chess_admin_tool" then p:GetActiveWeapon():Remove() end
|
||||
end)
|
||||
end
|
||||
|
||||
if CLIENT then
|
||||
surface.CreateFont( "ChessAdmin", {
|
||||
font="Arial", size=40,
|
||||
})
|
||||
local ColBox = Color(0,0,0,150)
|
||||
local ColText = Color(255,255,255,255)
|
||||
local ColGhost = Color(0,255,0,150)
|
||||
function SWEP:DrawHUD()
|
||||
local w,h = ScrW(), ScrH()
|
||||
local txt = "Board: ".. tostring( self.GameEntities[self:GetEntID()][1] )
|
||||
|
||||
surface.SetFont( "ChessAdmin" )
|
||||
local tw, th = surface.GetTextSize( txt )
|
||||
|
||||
surface.SetDrawColor( ColBox )
|
||||
surface.DrawRect( (w/2) - ((tw/2)+3), h - (th+6), tw+6, th+6 )
|
||||
|
||||
draw.DrawText( txt, "ChessAdmin", w/2, h-(th)-3, ColText, TEXT_ALIGN_CENTER )
|
||||
end
|
||||
|
||||
function SWEP:DoGhosts()
|
||||
local tr = self.Owner:GetEyeTrace()
|
||||
if (not tr.Hit) then return end
|
||||
|
||||
self.Ghosts = self.Ghosts or {}
|
||||
local mdltbl = self.GameEntities[self:GetEntID()][3]
|
||||
if not mdltbl then return end
|
||||
|
||||
self.Ghosts[1] = IsValid(self.Ghosts[1]) and self.Ghosts[1] or ClientsideModel( mdltbl.table, RENDERGROUP_BOTH )
|
||||
self.Ghosts[1]:SetPos( tr.HitPos )
|
||||
self.Ghosts[1]:SetRenderMode( RENDERMODE_TRANSALPHA )
|
||||
self.Ghosts[1]:SetColor( ColGhost )
|
||||
|
||||
local h = 30 --(self.Ghosts[1]:OBBMaxs()[3] - self.Ghosts[1]:OBBMins()[3])
|
||||
self.Ghosts[2] = IsValid(self.Ghosts[2]) and self.Ghosts[2] or ClientsideModel( mdltbl.board, RENDERGROUP_BOTH )
|
||||
self.Ghosts[2]:SetPos( tr.HitPos+Vector(0,0,h or 50) )
|
||||
self.Ghosts[2]:SetAngles( Angle(-90,0,0) )
|
||||
self.Ghosts[2]:SetModelScale( 0.35, 0 )
|
||||
self.Ghosts[2]:SetRenderMode( RENDERMODE_TRANSALPHA )
|
||||
self.Ghosts[2]:SetColor( ColGhost )
|
||||
|
||||
self.Ghosts[3] = IsValid(self.Ghosts[3]) and self.Ghosts[3] or ClientsideModel( "models/nova/chair_plastic01.mdl", RENDERGROUP_BOTH )
|
||||
self.Ghosts[3]:SetPos( tr.HitPos+ (self.Ghosts[2]:GetRight()*40) )
|
||||
self.Ghosts[3]:SetRenderMode( RENDERMODE_TRANSALPHA )
|
||||
self.Ghosts[3]:SetColor( ColGhost )
|
||||
|
||||
self.Ghosts[4] = IsValid(self.Ghosts[4]) and self.Ghosts[4] or ClientsideModel( "models/nova/chair_plastic01.mdl", RENDERGROUP_BOTH )
|
||||
self.Ghosts[4]:SetPos( tr.HitPos+ (self.Ghosts[2]:GetRight()*-40) )
|
||||
self.Ghosts[4]:SetAngles( Angle(0,180,0) )
|
||||
self.Ghosts[4]:SetRenderMode( RENDERMODE_TRANSALPHA )
|
||||
self.Ghosts[4]:SetColor( ColGhost )
|
||||
end
|
||||
function SWEP:PostDrawViewModel()
|
||||
if LocalPlayer()~=self.Owner then return self.BaseClass.PostDrawViewModel( self ) end
|
||||
self:DoGhosts()
|
||||
end
|
||||
function SWEP:DrawWorldModel()
|
||||
if LocalPlayer()~=self.Owner then return self.BaseClass.DrawWorldModel( self ) end
|
||||
self:DrawModel()
|
||||
self:DoGhosts()
|
||||
end
|
||||
end
|
||||
1
addons/chess/piece_black_bishop.tga.b64
Normal file
1
addons/chess/piece_black_bishop.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/chess/piece_black_king.tga.b64
Normal file
1
addons/chess/piece_black_king.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/chess/piece_black_knight.tga.b64
Normal file
1
addons/chess/piece_black_knight.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/chess/piece_black_pawn.tga.b64
Normal file
1
addons/chess/piece_black_pawn.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/chess/piece_black_queen.tga.b64
Normal file
1
addons/chess/piece_black_queen.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/chess/piece_black_rook.tga.b64
Normal file
1
addons/chess/piece_black_rook.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/chess/piece_white_bishop.tga.b64
Normal file
1
addons/chess/piece_white_bishop.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/chess/piece_white_king.tga.b64
Normal file
1
addons/chess/piece_white_king.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/chess/piece_white_knight.tga.b64
Normal file
1
addons/chess/piece_white_knight.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/chess/piece_white_pawn.tga.b64
Normal file
1
addons/chess/piece_white_pawn.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/chess/piece_white_queen.tga.b64
Normal file
1
addons/chess/piece_white_queen.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/chess/piece_white_rook.tga.b64
Normal file
1
addons/chess/piece_white_rook.tga.b64
Normal file
File diff suppressed because one or more lines are too long
66
addons/chess/reslist.lst
Normal file
66
addons/chess/reslist.lst
Normal file
@@ -0,0 +1,66 @@
|
||||
addons\chess\Chess.dll
|
||||
addons\chess\chess.vdf
|
||||
addons\chess\chess_chinese.txt
|
||||
addons\chess\chess_english.txt
|
||||
addons\chess\chess_french.txt
|
||||
addons\chess\chess_german.txt
|
||||
addons\chess\chess_italian.txt
|
||||
addons\chess\chess_korean.txt
|
||||
addons\chess\chess_spanish.txt
|
||||
addons\chess\DialogChessHistory.res
|
||||
addons\chess\DialogChessPawnPromote.res
|
||||
addons\chess\DialogGameChess.res
|
||||
addons\chess\piece_black_bishop.tga
|
||||
addons\chess\piece_black_king.tga
|
||||
addons\chess\piece_black_knight.tga
|
||||
addons\chess\piece_black_pawn.tga
|
||||
addons\chess\piece_black_queen.tga
|
||||
addons\chess\piece_black_rook.tga
|
||||
addons\chess\piece_white_bishop.tga
|
||||
addons\chess\piece_white_king.tga
|
||||
addons\chess\piece_white_knight.tga
|
||||
addons\chess\piece_white_pawn.tga
|
||||
addons\chess\piece_white_queen.tga
|
||||
addons\chess\piece_white_rook.tga
|
||||
addons\common\AddOnDialogWaiting.res
|
||||
addons\common\board_checkered_LL.tga
|
||||
addons\common\board_checkered_LR.tga
|
||||
addons\common\board_checkered_UL.tga
|
||||
addons\common\board_checkered_UR.tga
|
||||
addons\common\board_label_1.tga
|
||||
addons\common\board_label_2.tga
|
||||
addons\common\board_label_3.tga
|
||||
addons\common\board_label_4.tga
|
||||
addons\common\board_label_5.tga
|
||||
addons\common\board_label_6.tga
|
||||
addons\common\board_label_7.tga
|
||||
addons\common\board_label_8.tga
|
||||
addons\common\board_label_A.tga
|
||||
addons\common\board_label_B.tga
|
||||
addons\common\board_label_C.tga
|
||||
addons\common\board_label_D.tga
|
||||
addons\common\board_label_E.tga
|
||||
addons\common\board_label_F.tga
|
||||
addons\common\board_label_G.tga
|
||||
addons\common\board_label_H.tga
|
||||
addons\common\DialogColorChoice.res
|
||||
addons\common\DialogWaiting.res
|
||||
addons\common\piece_black_move.tga
|
||||
addons\common\piece_blank_selected.tga
|
||||
addons\common\piece_red_lastmove.tga
|
||||
addons\common\piece_red_move.tga
|
||||
addons\common\piece_red_selected.tga
|
||||
addons\common\piece_white_move.tga
|
||||
addons\common\player_black_marker.tga
|
||||
addons\common\player_red_marker.tga
|
||||
addons\common\player_white_marker.tga
|
||||
addons\common\SteamAddOns_chinese.txt
|
||||
addons\common\SteamAddOns_english.txt
|
||||
addons\common\SteamAddOns_french.txt
|
||||
addons\common\SteamAddOns_german.txt
|
||||
addons\common\SteamAddOns_italian.txt
|
||||
addons\common\SteamAddOns_korean.txt
|
||||
addons\common\SteamAddOns_spanish.txt
|
||||
addons\common\turn_marker.tga
|
||||
addons\common\TwoPlayerColorChoiceDialog.res
|
||||
|
||||
54
addons/common/addondialogwaiting.res
Normal file
54
addons/common/addondialogwaiting.res
Normal file
@@ -0,0 +1,54 @@
|
||||
"AddOns/Common/AddOnDialogWaiting.res"
|
||||
{
|
||||
"AddOnDialogWaiting"
|
||||
{
|
||||
"ControlName" "CAddOnDialogWaiting"
|
||||
"fieldName" "AddOnDialogWaiting"
|
||||
"xpos" "519"
|
||||
"ypos" "306"
|
||||
"wide" "400"
|
||||
"tall" "140"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
}
|
||||
"TextLabel"
|
||||
{
|
||||
"ControlName" "Label"
|
||||
"fieldName" "TextLabel"
|
||||
"xpos" "35"
|
||||
"ypos" "40"
|
||||
"wide" "350"
|
||||
"tall" "40"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "Setting up YYY Game with XXX"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
}
|
||||
"AbortBtn"
|
||||
{
|
||||
"ControlName" "Button"
|
||||
"fieldName" "AbortBtn"
|
||||
"xpos" "320"
|
||||
"ypos" "100"
|
||||
"wide" "60"
|
||||
"tall" "24"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
"enabled" "1"
|
||||
"tabPosition" "0"
|
||||
"labelText" "Abort"
|
||||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"Default" "0"
|
||||
}
|
||||
}
|
||||
1
addons/common/board_checkered_ll.tga.b64
Normal file
1
addons/common/board_checkered_ll.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/common/board_checkered_lr.tga.b64
Normal file
1
addons/common/board_checkered_lr.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/common/board_checkered_ul.tga.b64
Normal file
1
addons/common/board_checkered_ul.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/common/board_checkered_ur.tga.b64
Normal file
1
addons/common/board_checkered_ur.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/common/board_label_1.tga.b64
Normal file
1
addons/common/board_label_1.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAYnqcS2iOISEhISEhboSkU3OXRGOLRGOLXXmcQl6AISEhISEhZ3+hU3iZRWiORGSMZoOkSmOIKCksISEhYXmcUW6URGKLRGKKcY2tXHGVLTA1ISEhYHWZUGuQRGCJRGCJV1lXXWZ4OD1FISEhX3OVUGmNQ12GQ1yGSlRfKyolMjY8ISIiX3CTT2aMQ1yEQlqCYnOSUFJVKy0xKiwvV2iOTGOJQlmCQlmBW2+TZHWSMCQOJygrWGySXHKWWGuQWGySAAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_2.tga.b64
Normal file
1
addons/common/board_label_2.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAr83sKioqISEhQ0dKKywudXV1msbqmMjuoMPnVFRUXV1dpb/TmsXom8XolsTplMTrkbTWmpqaJCQkW11gnL3Xncjqo8rqlsXpkrbbdZawkLDJP0JFMzMznLzWnMjql8XomrnbgqfFfqLAjbTSISEhVFRUo8rqlsPoor7cmL3birXXqb3OISEhISEhocrrmMbqmrjYSEhIISEhoKCgISEhVllcm8bql8bqh6rOkai7YGVpISEhPz8/lbbQl8PmnsfpAAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_3.tga.b64
Normal file
1
addons/common/board_label_3.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAX2WUYnKROTxBHx0YHxkOeJCwdY61R0dePz90HhMAIB4YSExUJCMhREdNepCwQUFQPDxnODhRPEBVZn6nOj9JISAehZCmRkZiUVFzOTlYPEFTf5GoISAeIBsPWlyBTE98SEhIRERWOThSIB4YJiUifIqaf461Skp0WFhiVlZ0Y2qWbX6bNzpBOjs4fIy3S0t3WVl3MB8AXmRpeYyoMjQ4KCclfIetR0d2TVCCYHGSPDw8Q0dLIBwSXHCWV2mWV1eDAAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_4.tga.b64
Normal file
1
addons/common/board_label_4.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAo8bmk73hkrzmISEhISEhqs3uk77ogrPgtNLvqczqmMLqISEhISEhrNDxncbthbbiISEhISEhISEhISEhISEhISEhmsfwhLbkQUFBam1wnMnzISEhISEhnMr1lMXzhbjno6OjKSkpgJ66Ky0uISEhnsr0lMTyibzskbvjipKZTU5QKy0uISEhpc/3mcj2jMDxg6/Vp8LbRUdIISEhISEhoM33mMn3jsLznMnyganNhJGdISEhISEho8/4o873oM33AAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_5.tga.b64
Normal file
1
addons/common/board_label_5.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAXX+hVm2CMjMyISEhXGNoXomvXIGlUXaaS3KYIyAZJSYnQUVFISEiTVFQUoWzTnGWUnudRGmMQ2OEU3icOUJLISEhZ4ywTHCVUnmcSGeGXomva46sODo8KisqY4mtTnWaSm6UNT1EISEhHx4dIiEhQllwR22TSnKYRmmPMTY7ISEhU2R1S2+RR2ySR2ySR2ySRmmPLjI2ISEha42uVoazaoysWXmcS22TSG6UOkJJISEhOj1AQkdKKSosaIOjYH+hAAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_6.tga.b64
Normal file
1
addons/common/board_label_6.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAncHjq8vncXN2ISEhPz8/psPdqc7vksHpiLHZb29vISEhkZGRISEhRUVFqc/wl8bukb3oNjY2ISEhlMXvISEhISEhpM7xmMfvl8fwISEhISEhk5OTISEhPz8/ncjulMPrmsrzISEhLS0tPDw8MDAwnrDAnMftkcHrl8fwPz8/MzMznsrwnsvwpc3wocrulMLrksHoe3t7ISEhmpqaKioqSEhIps/xmMfum8nwrsfdeXt+JycnNjY2kJCQqdL1p9H1AAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_7.tga.b64
Normal file
1
addons/common/board_label_7.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAYXCZSVeEIiIjRElNeI+xZGSKR0dyPT1rW2iSQkt0JyUlIiIjb4uwZWWMTlOBQEd4WGSOUlV9LygvIiIkfpCvcXidT1iFQU59V2SPWVuDWFFoIyMlcXyXcoCiVFiERE18VWKOU1Z9aWWBIyMmU1ZbepCzYmqRS1aEXGONb3qggYuuR0VVIyMld4GYbnedUV+LYGWKR0xeQkVWR0RUIiIkQ0NCfI24S1SCX2SLIiIjIiIjIiIkIiIkISEid4SqWmKNAAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_8.tga.b64
Normal file
1
addons/common/board_label_8.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAsNj4rdDrPT0+IiIkTE5Pq8risNj4otD3otD3PDw8IiIkiYmKISEhYWRnsNf4oc/2lcXuIiIjIiIjmcrzISEhISEhq9L0n8vxl8fwYGBgIyMle3t8IiIjWlparNT2oc70oc/1r8vhNDQ0IiIjLCwtr6+vrtX3os71ns74SEhITVJWqL/RISEhS0tLrdT3os/1pdP4LS0tISEhoKCgISEhSkxPtdr4sNf4rtj5pcTcOTk5ISEhOTk5kp6ovN76wuD6AAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_a.tga.b64
Normal file
1
addons/common/board_label_a.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAgI2f////oq29a4KiTWOFlZic////////YXCI/P3+wM3geI+vX3WWkZyr////0t/zQVZ2wMnX////////////////////fpCsQld3hpGi////pbHET2WH1ODx////c4CVQ1l5W2qC6/H65u34eoOP////9Pj8U2N7RF18QFR1gZSy////tsfg////t8nkQld6RWOEQVZ2cX6S////////////hpCgQVZ6RGKGQVl3P1N009/y////////XGd5QFV5AAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_b.tga.b64
Normal file
1
addons/common/board_label_b.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAdqLGc57B////////////////9fX1zs7OibrhdJ7A////////jL/oy8vL////8/Pzg7PaaY6t////////jL7nd6PH////////fq/WZ42r////////nsnsz8/P////9/f3eqvSZouq////////////////9fX1y8vLeqvSZ42r////////ir3lyMjI////7+/vfq/VaIyp////////kcPsx8fH////+/v7grPZaYyn////////////////+fn51dXVAAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_c.tga.b64
Normal file
1
addons/common/board_label_c.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAQFR3Q1h6g5i3ydv3////9/n9w9Ttk4ZtQVV5gZi5////tczwi4+VhJCi////3+n6RVt7y936////e42mPlFxO0tiPExkPlFvQFR0////////jJSgSVx+PlFxQFR2Qld5PlJx/P3+////iJOkZnqaXnKTXHGTS2aMPlFvxtv5////d4uqeZCyepGyeI+xcIioPE1ng5q8////scvzhY+efIyl////3eTuPU9sOkheiaHG1OP6////8/f9qMHolZeZAAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_d.tga.b64
Normal file
1
addons/common/board_label_d.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAbZjAaZK5////////////+vz+0d/2uL/KdqXRZYuw////////kbbnuND1////2N/pgbDYZ4ur////////ep/Nqb7e////8PP4fKzTZ4mr////////kbzqZ4mx////////fqvUaIiu////////osvxha3Z////////hbDaaIqy////////pMvxrb/a////8/b7iLLbZ4mx////////lr/svtT2////097whrHaaIiu////////////+vz+0uD2t8DOAAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_e.tga.b64
Normal file
1
addons/common/board_label_e.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAPkxwPk5xPk1x////////////////////QlF6QE92PUls////////QlWCP090PkxvRExzQktuP0Ri////////YHCVU2WLRVV+RE50QUptP0Ri////////d4Sjc4GiXmuQRFB3Qk1wP0Vi////////////////////RFF3QktvPkBe////////SleARFB5Q01zQ093QkxvPkRh////////X2qOYGuQUl+FQkxzQUtvP0di////////////////////AAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_f.tga.b64
Normal file
1
addons/common/board_label_f.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAfKXIfKPG////////qNb7kMLpf6zRdZ6/jLjheZ7A////////sNn6oND4k8jyhLTbi7fecZOz////////sNX5qtP5os/5kMHvhrHZbpCv////////tdj5s9j5rtX4nMr2gKzTa4yr////////////////////ksTzfanQaYup////////lMXzibrnjr7sirnmeqbNbIqm////////o8z0o830os30l8f0gq3UbIum////////////////////ksX0AAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_g.tga.b64
Normal file
1
addons/common/board_label_g.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAQ2CESGSJhJCgvdb8////9fn/tND8eJO9RV+EjZCS////tMrriZGajpKV////////QlVzs9D8////gI2iQ1Z2QExi////////QlVz9vn+////jJSfSV1+////////////Q1Z0+/3+////iJGeXXGSSV18RFd2RFd3Q1Z0uNH3////doqpeY2sdIinbYGgXnKRQVRxdomn////qsXxfY2kd4uq////1OP7QlVzPEtie4ymxNr7////8/f9scnuipWlAAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/board_label_h.tga.b64
Normal file
1
addons/common/board_label_h.tga.b64
Normal file
@@ -0,0 +1 @@
|
||||
AAACAAAAAAAAAAAACAAIABgAdqHDdaHB////////o8/0ibje////////ibrgdJ6+////////q9T4irbd////////iLjdbZOw////////rNX2jbvi////////hrfcbJOw////////sdX1m8z1////////hbbba5Gv////////////////////////hbfaa5Gu////////i7rha46s////////hLTZaY6p////////kMDpao6s////////jLzgbI6q////////iLXcbI6t////////AAAAAAAAAABUUlVFVklTSU9OLVhGSUxFLgA=
|
||||
1
addons/common/cards/c_2.tga.b64
Normal file
1
addons/common/cards/c_2.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/common/cards/c_3.tga.b64
Normal file
1
addons/common/cards/c_3.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/common/cards/c_4.tga.b64
Normal file
1
addons/common/cards/c_4.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/common/cards/c_5.tga.b64
Normal file
1
addons/common/cards/c_5.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/common/cards/c_6.tga.b64
Normal file
1
addons/common/cards/c_6.tga.b64
Normal file
File diff suppressed because one or more lines are too long
1
addons/common/cards/c_7.tga.b64
Normal file
1
addons/common/cards/c_7.tga.b64
Normal file
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user