diff --git a/code/modules/client/preference_setup/loadout/loadout_general.dm b/code/modules/client/preference_setup/loadout/loadout_general.dm
index 5e72918aac6..bd1b6044a1e 100644
--- a/code/modules/client/preference_setup/loadout/loadout_general.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_general.dm
@@ -110,3 +110,11 @@
/datum/gear/towel/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
+
+/datum/gear/checkers
+ display_name = "checkers game kit"
+ path = /obj/item/weapon/storage/box/checkers_kit
+
+/datum/gear/chess
+ display_name = "chess game kit"
+ path = /obj/item/weapon/storage/box/chess_kit
\ No newline at end of file
diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm
index 3f1c7e1a4f5..60078262ebd 100644
--- a/code/modules/games/boardgame.dm
+++ b/code/modules/games/boardgame.dm
@@ -1,6 +1,6 @@
/obj/item/weapon/board
name = "board"
- desc = "A standard 12' checkerboard. Well used."
+ desc = "A standard 16\" checkerboard. Well used."
icon = 'icons/obj/pieces.dmi'
icon_state = "board"
@@ -9,12 +9,11 @@
var/board = list()
var/selected = -1
-/obj/item/weapon/board/New()
- ..()
- var i
- for(i = 0; i < 12; i++)
- new /obj/item/weapon/checker(src.loc)
- new /obj/item/weapon/checker/red(src.loc)
+/obj/item/weapon/board/MouseDrop(mob/user as mob)
+ if((user == usr && (!use_check(user))) && (user.contents.Find(src) || in_range(src, user)))
+ if(ishuman(usr))
+ forceMove(get_turf(usr))
+ usr.put_in_hands(src)
/obj/item/weapon/board/examine(mob/user, var/distance = -1)
if(in_range(user,src))
@@ -24,6 +23,8 @@
..()
/obj/item/weapon/board/attack_hand(mob/living/carbon/human/M as mob)
+ if(!isturf(loc)) //so if you want to play the game, you need to put it down somewhere
+ ..()
if(M.machine == src)
..()
else
@@ -73,39 +74,39 @@ obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob)
user.unset_machine()
return
- var/dat = ""
- dat += "
"
- var i, stagger;
+ var/list/dat = list({"
+
+ "})
+ var i, stagger
stagger = 0 //so we can have the checkerboard effect
- for(i=0; i<64; i++)
+ for(i=0, i<64, i++)
if(i%8 == 0)
dat += ""
stagger = !stagger
- dat += "| "
+ dat += " | "
+ dat += " | "
- if(!isobserver(user))
- dat += ""
+ dat += " | "
+ dat += " style='background-image:url([I.icon_state].png)'>"
else
- dat += " "
-
+ dat+= ">"
if(!isobserver(user))
- dat += ""
+ dat += ""
dat += " | "
- dat += "
"
+ dat += "
"
if(selected >= 0 && !isobserver(user))
dat += "
Remove Selected Piece"
- user << browse(dat,"window=boardgame;size=500x500")
+ user << browse(jointext(dat, null),"window=boardgame;size=430x500") // 50px * 8 squares + 30 margin
onclose(usr, "boardgame")
/obj/item/weapon/board/Topic(href, href_list)
@@ -121,19 +122,19 @@ obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob)
if(selected >= 0)
//check to see if clicked on tile is currently selected one
if(text2num(s) == selected)
- selected = 0 //deselect it
- return
+ selected = -1 //deselect it
+ else
- if(I) //cant put items on other items.
- return
+ if(I) //cant put items on other items.
+ return
- //put item in new spot.
- I = board["[selected]"]
- board["[selected]"] = null
- board -= "[selected]"
- board -= null
- board["[s]"] = I
- selected = -1
+ //put item in new spot.
+ I = board["[selected]"]
+ board["[selected]"] = null
+ board -= "[selected]"
+ board -= null
+ board["[s]"] = I
+ selected = -1
else
if(I)
selected = text2num(s)
@@ -147,6 +148,8 @@ obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob)
addPiece(O,H,text2num(s))
if(href_list["remove"])
var/obj/item/I = board["[selected]"]
+ if(!I)
+ return
board["[selected]"] = null
board -= "[selected]"
board -= null
@@ -166,13 +169,135 @@ obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob)
board_icons -= null
src.updateDialog()
-/obj/item/weapon/checker/
- name = "black checker"
+//checkes
+/obj/item/weapon/checker
+ name = "checker"
desc = "It is plastic and shiny."
icon = 'icons/obj/pieces.dmi'
icon_state = "checker_black"
w_class = 1
+ var/piece_color ="black"
+
+/obj/item/weapon/checker/Initialize()
+ . = ..()
+ icon_state = "[name]_[piece_color]"
+ name = "[piece_color] [name]"
/obj/item/weapon/checker/red
- name = "red checker"
- icon_state = "checker_red"
+ piece_color ="red"
+
+/obj/item/weapon/storage/box/checkers
+ name = "checkers box"
+ desc = "This box holds a nifty portion of checkers."
+ icon_state = "checkers"
+ max_storage_space = 24
+ w_class = 1
+ can_hold = list(/obj/item/weapon/checker)
+
+/obj/item/weapon/storage/box/checkers/fill()
+ for(var/i = 0; i < 12; i++)
+ new /obj/item/weapon/checker(src)
+ new /obj/item/weapon/checker/red(src)
+
+//chess
+
+//Chess
+
+/obj/item/weapon/checker/pawn
+ name = "pawn"
+
+/obj/item/weapon/checker/pawn/red
+ piece_color ="red"
+
+/obj/item/weapon/checker/knight
+ name = "knight"
+
+/obj/item/weapon/checker/knight/red
+ piece_color ="red"
+
+/obj/item/weapon/checker/bishop
+ name = "bishop"
+
+/obj/item/weapon/checker/bishop/red
+ piece_color ="red"
+
+/obj/item/weapon/checker/rook
+ name = "rook"
+
+/obj/item/weapon/checker/rook/red
+ piece_color ="red"
+
+/obj/item/weapon/checker/queen
+ name = "queen"
+
+/obj/item/weapon/checker/queen/red
+ piece_color ="red"
+
+/obj/item/weapon/checker/king
+ name = "king"
+
+/obj/item/weapon/checker/king/red
+ piece_color ="red"
+
+/obj/item/weapon/storage/box/chess
+ name = "black chess box"
+ desc = "This box holds all the pieces needed for the black side of the chess board."
+ icon_state = "chess_b"
+ max_storage_space = 24
+ w_class = 2
+ can_hold = list(/obj/item/weapon/checker)
+
+/obj/item/weapon/storage/box/chess/fill()
+ for(var/i = 0; i < 8; i++)
+ new /obj/item/weapon/checker/pawn(src)
+ new /obj/item/weapon/checker/knight (src)
+ new /obj/item/weapon/checker/knight (src)
+ new /obj/item/weapon/checker/bishop (src)
+ new /obj/item/weapon/checker/bishop (src)
+ new /obj/item/weapon/checker/rook (src)
+ new /obj/item/weapon/checker/rook (src)
+ new /obj/item/weapon/checker/queen (src)
+ new /obj/item/weapon/checker/king (src)
+
+/obj/item/weapon/storage/box/chess/red
+ name = "red chess box"
+ desc = "This box holds all the pieces needed for the red side of the chess board."
+ icon_state = "chess_r"
+
+/obj/item/weapon/storage/box/chess/red/fill()
+ for(var/i = 0; i < 8; i++)
+ new /obj/item/weapon/checker/pawn/red(src)
+ new /obj/item/weapon/checker/knight/red (src)
+ new /obj/item/weapon/checker/knight/red (src)
+ new /obj/item/weapon/checker/bishop/red (src)
+ new /obj/item/weapon/checker/bishop/red (src)
+ new /obj/item/weapon/checker/rook/red (src)
+ new /obj/item/weapon/checker/rook/red (src)
+ new /obj/item/weapon/checker/queen/red (src)
+ new /obj/item/weapon/checker/king/red (src)
+
+//game kits
+/obj/item/weapon/storage/box/checkers_kit
+ name = "checkers game kit"
+ desc = "This box holds all the parts needed for a game of checkers."
+ icon_state = "largebox"
+ max_storage_space = 8
+ can_hold = list(/obj/item/weapon/board,
+ /obj/item/weapon/storage/box/checkers)
+
+/obj/item/weapon/storage/box/checkers_kit/fill()
+ new /obj/item/weapon/board (src)
+ new /obj/item/weapon/storage/box/checkers (src)
+
+/obj/item/weapon/storage/box/chess_kit
+ name = "chess game kit"
+ desc = "This box holds all the parts needed for a game of chess."
+ icon_state = "largebox"
+ max_storage_space = 8
+ can_hold = list(/obj/item/weapon/board,
+ /obj/item/weapon/storage/box/chess)
+
+/obj/item/weapon/storage/box/chess_kit/fill()
+ new /obj/item/weapon/board (src)
+ new /obj/item/weapon/storage/box/chess (src)
+ new /obj/item/weapon/storage/box/chess/red (src)
diff --git a/html/changelogs/alberyk-agameofchess.yml b/html/changelogs/alberyk-agameofchess.yml
new file mode 100644
index 00000000000..57ed8134b97
--- /dev/null
+++ b/html/changelogs/alberyk-agameofchess.yml
@@ -0,0 +1,6 @@
+author: Alberyk
+
+delete-after: True
+
+changes:
+ - rscadd: "Added checkers and chess game kits to the custom loadout."
diff --git a/icons/obj/pieces.dmi b/icons/obj/pieces.dmi
index de3a197b8ca..7b55092d2b0 100644
Binary files a/icons/obj/pieces.dmi and b/icons/obj/pieces.dmi differ