From 3018ff04b5c6f0469bb65b7d542d70315880eee5 Mon Sep 17 00:00:00 2001
From: Ghost Actual <86997650+GhostActual@users.noreply.github.com>
Date: Sat, 7 Aug 2021 17:32:35 -0400
Subject: [PATCH] CHOMPStation Casino Port (#11301)
* Create casino.dmi
* Base Commit
* Secondary Commit
* Third Commit
* Final Commit
* Final Final Commit
* Update casino_book.dm
* Update casino_cards.dm
* Update casino_cards.dm
* Update casinocash.dm
* The Claaaaaw
* Power Fix
* fix
---
code/game/machinery/clawmachine.dm | 209 ++++++++
code/game/machinery/computer/arcade.dm | 4 +-
.../objects/items/weapons/storage/wallets.dm | 58 +++
code/game/objects/structures/dancepole_vr.dm | 18 +-
code/game/objects/structures/salvageable.dm | 27 +
code/modules/casino/casino.dm | 485 ++++++++++++++++++
code/modules/casino/casino_book.dm | 284 ++++++++++
code/modules/casino/casino_cards.dm | 48 ++
code/modules/casino/casino_prize_vendor.dm | 305 +++++++++++
code/modules/casino/premium_dispenser.dm | 69 +++
code/modules/casino/premium_vendors.dm | 129 +++++
code/modules/casino/slots.dm | 462 +++++++++++++++++
.../under/accessories/accessory_vr.dm | 29 +-
code/modules/economy/casinocash.dm | 207 ++++++++
icons/inventory/accessory/item_vr.dmi | Bin 3251 -> 11360 bytes
icons/inventory/accessory/mob_vr.dmi | Bin 1225 -> 2918 bytes
icons/inventory/accessory/mob_vr_teshari.dmi | Bin 678 -> 2371 bytes
icons/obj/64x64.dmi | Bin 0 -> 21003 bytes
icons/obj/casino.dmi | Bin 0 -> 54768 bytes
icons/obj/computer.dmi | Bin 163009 -> 166094 bytes
icons/obj/playing_cards.dmi | Bin 1945 -> 3577 bytes
icons/obj/salvageable.dmi | Bin 23108 -> 25062 bytes
maps/tether/tether-01-surface1.dmm | 45 +-
maps/tether/tether_areas.dm | 3 +
sound/machines/clawmachine_play.ogg | Bin 0 -> 91474 bytes
sound/machines/clawmachine_win.ogg | Bin 0 -> 25139 bytes
sound/machines/roulette.ogg | Bin 0 -> 143391 bytes
sound/machines/slotmachine.ogg | Bin 0 -> 36503 bytes
sound/machines/slotmachine_pull.ogg | Bin 0 -> 78420 bytes
.../tgui/interfaces/CasinoPrizeDispenser.js | 180 +++++++
tgui/public/tgui.bundle.js | 2 +-
vorestation.dme | 9 +
32 files changed, 2547 insertions(+), 26 deletions(-)
create mode 100644 code/game/machinery/clawmachine.dm
create mode 100644 code/modules/casino/casino.dm
create mode 100644 code/modules/casino/casino_book.dm
create mode 100644 code/modules/casino/casino_cards.dm
create mode 100644 code/modules/casino/casino_prize_vendor.dm
create mode 100644 code/modules/casino/premium_dispenser.dm
create mode 100644 code/modules/casino/premium_vendors.dm
create mode 100644 code/modules/casino/slots.dm
create mode 100644 code/modules/economy/casinocash.dm
create mode 100644 icons/obj/64x64.dmi
create mode 100644 icons/obj/casino.dmi
create mode 100644 sound/machines/clawmachine_play.ogg
create mode 100644 sound/machines/clawmachine_win.ogg
create mode 100644 sound/machines/roulette.ogg
create mode 100644 sound/machines/slotmachine.ogg
create mode 100644 sound/machines/slotmachine_pull.ogg
create mode 100644 tgui/packages/tgui/interfaces/CasinoPrizeDispenser.js
diff --git a/code/game/machinery/clawmachine.dm b/code/game/machinery/clawmachine.dm
new file mode 100644
index 00000000000..ff65f31c847
--- /dev/null
+++ b/code/game/machinery/clawmachine.dm
@@ -0,0 +1,209 @@
+
+//Original Codebase created by Shadowfire117#1269 - Ported from CHOMPstation
+//Modified by GhostActual#2055 to produce Claw Machine
+
+/*
+ * Space Crane
+ */
+
+/obj/machinery/clawmachine
+ name = "Space Crane"
+ desc = "Try your luck at winning a cute plush toy! No refunds, and whining won't win you anything."
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "clawmachine"
+ anchored = 1
+ density = 1
+ power_channel = EQUIP
+ use_power = USE_POWER_IDLE
+ idle_power_usage = 10
+ active_power_usage = 100
+ light_power = 0.9
+ light_range = 2
+ light_color = "#B1FBBFF"
+ var/isbroken = 0 //1 if someone banged it with something heavy
+ var/ispowered = 1 //starts powered, changes with power_change()
+ var/busy = 0
+ var/symbol1 = null
+ var/symbol2 = null
+ var/symbol3 = null
+ var/list/prizes = list(/obj/random/carp_plushie,
+ /obj/item/toy/plushie/nymph,
+ /obj/item/toy/plushie/teshari,
+ /obj/item/toy/plushie/mouse,
+ /obj/item/toy/plushie/kitten,
+ /obj/item/toy/plushie/lizard,
+ /obj/item/toy/plushie/spider,
+ /obj/item/toy/plushie/farwa,
+ /obj/item/toy/plushie/corgi,
+ /obj/item/toy/plushie/girly_corgi,
+ /obj/item/toy/plushie/robo_corgi,
+ /obj/item/toy/plushie/octopus,
+ /obj/item/toy/plushie/face_hugger,
+ /obj/item/toy/plushie/red_fox,
+ /obj/item/toy/plushie/black_fox,
+ /obj/item/toy/plushie/marble_fox,
+ /obj/item/toy/plushie/blue_fox,
+ /obj/item/toy/plushie/orange_fox,
+ /obj/item/toy/plushie/coffee_fox,
+ /obj/item/toy/plushie/pink_fox,
+ /obj/item/toy/plushie/purple_fox,
+ /obj/item/toy/plushie/crimson_fox,
+ /obj/item/toy/plushie/deer,
+ /obj/item/toy/plushie/black_cat,
+ /obj/item/toy/plushie/grey_cat,
+ /obj/item/toy/plushie/white_cat,
+ /obj/item/toy/plushie/orange_cat,
+ /obj/item/toy/plushie/siamese_cat,
+ /obj/item/toy/plushie/tabby_cat,
+ /obj/item/toy/plushie/tuxedo_cat,
+ /obj/item/toy/plushie/borgplushie/medihound,
+ /obj/item/toy/plushie/borgplushie/scrubpuppy,
+ /obj/item/toy/plushie/borgplushie/drakiesec,
+ /obj/item/toy/plushie/borgplushie/drakiemed,
+ /obj/item/toy/plushie/otter
+ )
+
+/obj/machinery/clawmachine/update_icon()
+ cut_overlays()
+ if(!ispowered || isbroken)
+ icon_state = "clawmachine_off"
+ if(isbroken) //If the thing is smashed, add crack overlay on top of the unpowered sprite.
+ add_overlay("clawmachine_broken")
+ set_light(0)
+ set_light_on(FALSE)
+ return
+
+ icon_state = "clawmachine"
+ set_light(2)
+ set_light_on(TRUE)
+ return
+
+/obj/machinery/clawmachine/power_change()
+ if(isbroken) //Broken shit can't be powered.
+ return
+ ..()
+ if(!(stat & NOPOWER))
+ ispowered = 1
+ update_icon()
+ else
+ spawn(rand(0, 15))
+ ispowered = 0
+ update_icon()
+
+/obj/machinery/clawmachine/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(busy)
+ to_chat(user,"The claw machine is currently running. ")
+ return
+ if(W.is_wrench())
+ playsound(src, W.usesound, 100, 1)
+ if(anchored)
+ user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
+ else
+ user.visible_message("[user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
+
+ if(do_after(user, 20 * W.toolspeed))
+ if(!src) return
+ to_chat(user, "You [anchored? "un" : ""]secured \the [src]!")
+ anchored = !anchored
+ return
+
+ if(!anchored)
+ to_chat(user," The machine isn't secured.")
+ return
+
+ var/handled = 0
+ var/paid = 0
+
+ if(istype(W, /obj/item/weapon/spacecash))
+ var/obj/item/weapon/spacecash/C = W
+ paid = insert_cash(C, user)
+ handled = 1
+ if(paid)
+ return
+ if(handled)
+ SStgui.update_uis(src)
+ return // don't smack that machine with your 2 chips
+
+ else if(!(stat & NOPOWER))
+ return
+
+ else if(isbroken)
+ return
+
+/obj/machinery/clawmachine/proc/prizevend()
+ if(LAZYLEN(prizes))
+ var/prizeselect = pickweight(prizes)
+ new prizeselect(src.loc)
+
+/obj/machinery/clawmachine/proc/insert_cash(var/obj/item/weapon/spacecash/cashmoney, mob/user)
+ if (ispowered == 0)
+ return
+ if (isbroken)
+ return
+ if(busy)
+ to_chat(user,"The claw machine is currently running. ")
+ return
+ if(cashmoney.worth < 5)
+ to_chat(user,"You dont have enough Thalers to play! ")
+ return
+
+ to_chat(user,"You put 5 Thalers in the claw machine and press start.")
+ cashmoney.worth -= 5
+ cashmoney.update_icon()
+
+ if(cashmoney.worth <= 0)
+ usr.drop_from_inventory(cashmoney)
+ qdel(cashmoney)
+ cashmoney.update_icon()
+
+ busy = 1
+ icon_state = "clawmachine_play"
+ playsound(src.loc, 'sound/machines/clawmachine_play.ogg', 50, 0)
+
+ var/slot1 = rand(0,4)
+ switch(slot1)
+ if(0 to 2) symbol1 = "one"
+ if(3 to 4) symbol1 = "two"
+
+ var/slot2 = rand(0,4)
+ switch(slot2)
+ if(0 to 2) symbol2 = "one"
+ if(3 to 4) symbol2 = "two"
+
+ var/slot3 = rand(0,4)
+ switch(slot3)
+ if(0 to 2) symbol3 = "one"
+ if(3 to 4) symbol3 = "two"
+
+ var/output //Output variable to send out in chat after the large if statement.
+ var/winnings = 0 //If you win a toy or not
+ var/delaytime = 7 SECONDS
+
+ spawn(delaytime)
+ to_chat(user,"The clam machine lights up and starts to play!")
+
+ if (symbol1 == "one" && symbol2 == "one" && symbol3 == "one")
+ output = "Hooray! You Win!"
+ winnings = TRUE
+
+ if (symbol1 == "two" && symbol2 == "two" && symbol3 == "two")
+ output = "Hooray! You Win!!"
+ winnings = TRUE
+
+ icon_state = initial(icon_state) // Set it back to the original iconstate.
+
+ if(!output) // Is there anything to output? If not, consider it a loss.
+ to_chat(user,"Better luck next time!")
+ busy = FALSE
+ return
+
+ to_chat(user,output) //Output message
+
+ if(winnings) //Did the person win?
+ icon_state = "clawmachine_win"
+ prizevend()
+ playsound(src.loc, 'sound/machines/clawmachine_win.ogg', 50, 0)
+ spawn(delaytime)
+ icon_state = "clawmachine"
+
+ busy = FALSE
\ No newline at end of file
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 059f0582431..59cb5769712 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -40,7 +40,7 @@
var/atom/movable/AM = pick_n_take(special_prizes)
AM.forceMove(get_turf(src))
special_prizes -= AM
-
+
else if(LAZYLEN(prizes))
var/prizeselect = pickweight(prizes)
new prizeselect(src.loc)
@@ -1322,7 +1322,7 @@
gameStatus = "CLAWMACHINE_NEW"
emagged = 1
return 1
-
+
/obj/machinery/computer/arcade/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/stack/arcadeticket))
var/obj/item/stack/arcadeticket/T = O
diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm
index 4161ae740b9..b36078028b1 100644
--- a/code/game/objects/items/weapons/storage/wallets.dm
+++ b/code/game/objects/items/weapons/storage/wallets.dm
@@ -139,3 +139,61 @@
desc = "A stylish wallet typically used by women."
icon_state = "girl_wallet"
item_state_slots = list(slot_r_hand_str = "wowallet", slot_l_hand_str = "wowallet")
+
+//Casino Wallet
+
+/obj/item/weapon/storage/wallet/casino
+ name = "casino wallet"
+ desc = "A fancy casino wallet with flashy lights, oooh~"
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "casinowallet_black"
+ can_hold = list(
+ /obj/item/weapon/spacecash,
+ /obj/item/weapon/card,
+ /obj/item/clothing/mask/smokable/cigarette/,
+ /obj/item/device/flashlight/pen,
+ /obj/item/device/tape,
+ /obj/item/weapon/cartridge,
+ /obj/item/device/encryptionkey,
+ /obj/item/seeds,
+ /obj/item/stack/medical,
+ /obj/item/weapon/coin,
+ /obj/item/weapon/dice,
+ /obj/item/weapon/disk,
+ /obj/item/weapon/implanter,
+ /obj/item/weapon/flame/lighter,
+ /obj/item/weapon/flame/match,
+ /obj/item/weapon/forensics,
+ /obj/item/weapon/glass_extra,
+ /obj/item/weapon/haircomb,
+ /obj/item/weapon/hand,
+ /obj/item/weapon/key,
+ /obj/item/weapon/lipstick,
+ /obj/item/weapon/paper,
+ /obj/item/weapon/pen,
+ /obj/item/weapon/photo,
+ /obj/item/weapon/reagent_containers/dropper,
+ /obj/item/weapon/sample,
+ /obj/item/weapon/tool/screwdriver,
+ /obj/item/weapon/stamp,
+ /obj/item/clothing/accessory/permit,
+ /obj/item/clothing/accessory/badge,
+ /obj/item/weapon/makeover,
+ /obj/item/weapon/spacecasinocash,
+ /obj/item/weapon/casino_platinum_chip,
+ /obj/item/weapon/deck
+ )
+
+/obj/item/weapon/storage/wallet/casino/verb/toggle_design()
+ set category = "Object"
+ set name = "Toggle design"
+ set src in usr
+
+ if (icon_state == "casinowallet_black")
+ icon_state = "casinowallet_brown"
+ return
+ if (icon_state == "casinowallet_brown")
+ icon_state = "casinowallet_white"
+ return
+ else
+ icon_state = "casinowallet_black"
\ No newline at end of file
diff --git a/code/game/objects/structures/dancepole_vr.dm b/code/game/objects/structures/dancepole_vr.dm
index 3a548f11332..90270b88ce3 100644
--- a/code/game/objects/structures/dancepole_vr.dm
+++ b/code/game/objects/structures/dancepole_vr.dm
@@ -2,10 +2,22 @@
/obj/structure/dancepole
name = "dance pole"
desc = "Engineered for your entertainment"
- icon = 'icons/obj/objects_vr.dmi'
- icon_state = "dancepole"
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "dance_pole"
density = FALSE
anchored = TRUE
+ density = 0
+
+/obj/structure/dancepole/attack_hand(mob/user)
+ dance(user)
+ user.spin(32,2)
+ ..()
+
+/obj/structure/dancepole/proc/dance(mob/user)
+ if(layer == BELOW_MOB_LAYER)
+ layer = ABOVE_MOB_LAYER
+ else
+ layer = BELOW_MOB_LAYER
/obj/structure/dancepole/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(O.is_screwdriver())
@@ -22,4 +34,4 @@
if(!src) return
to_chat(user, "You dissasembled \the [src]!")
new /obj/item/stack/material/steel(src.loc, 1)
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/game/objects/structures/salvageable.dm b/code/game/objects/structures/salvageable.dm
index 0a35848d8d2..2073e150348 100644
--- a/code/game/objects/structures/salvageable.dm
+++ b/code/game/objects/structures/salvageable.dm
@@ -364,3 +364,30 @@
/obj/item/weapon/computer_hardware/card_slot = 40,
/obj/item/weapon/computer_hardware/network_card/advanced = 40
)
+
+
+/obj/structure/salvageable/slotmachine1
+ name = "broken slot machine"
+ icon_state = "slot1"
+ salvageable_parts = list(
+ /obj/item/stack/cable_coil{amount = 5} = 90,
+ /obj/item/weapon/stock_parts/console_screen = 90,
+ /obj/item/stack/cable_coil{amount = 5} = 90,
+ /obj/item/stack/material/glass{amount = 5} = 90,
+ /obj/item/weapon/stock_parts/capacitor = 60,
+ /obj/item/weapon/stock_parts/capacitor = 60,
+ /obj/item/weapon/computer_hardware/network_card/advanced = 40
+ )
+
+/obj/structure/salvageable/slotmachine2
+ name = "broken slot machine"
+ icon_state = "slot2"
+ salvageable_parts = list(
+ /obj/item/stack/cable_coil{amount = 5} = 90,
+ /obj/item/weapon/stock_parts/console_screen = 90,
+ /obj/item/stack/cable_coil{amount = 5} = 90,
+ /obj/item/stack/material/glass{amount = 5} = 90,
+ /obj/item/weapon/stock_parts/capacitor = 60,
+ /obj/item/weapon/stock_parts/capacitor = 60,
+ /obj/item/weapon/computer_hardware/network_card/advanced = 40
+ )
\ No newline at end of file
diff --git a/code/modules/casino/casino.dm b/code/modules/casino/casino.dm
new file mode 100644
index 00000000000..eeb850f6880
--- /dev/null
+++ b/code/modules/casino/casino.dm
@@ -0,0 +1,485 @@
+
+//Original Casino Code created by Shadowfire117#1269 - Ported from CHOMPstation
+//Modified by GhostActual#2055 for use with VOREstation
+
+//
+//Roulette Table
+//
+
+/obj/structure/casino_table
+ name = "casino table"
+ desc = "this is an unremarkable table for a casino."
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "roulette_table"
+ density = 1
+ anchored = 1
+ climbable = 1
+ layer = TABLE_LAYER
+ throwpass = 1
+ var/item_place = 1 //allows items to be placed on the table, but not on benches.
+
+ var/busy = 0
+
+/obj/structure/casino_table/attackby(obj/item/W as obj, mob/user as mob)
+ if(item_place)
+ user.drop_item(src.loc)
+ return
+
+/obj/structure/casino_table/roulette_table
+ name = "roulette"
+ desc = "Spin the roulette to try your luck."
+ icon_state = "roulette_wheel"
+
+/obj/structure/casino_table/roulette_table/attack_hand(mob/user as mob)
+ if (busy)
+ to_chat(user,"You cannot spin now! The roulette is already spinning. ")
+ return
+ visible_message("\ [user] spins the roulette and throws inside little ball.")
+ playsound(src.loc, 'sound/machines/roulette.ogg', 40, 1)
+ busy = 1
+ icon_state = "roulette_wheel_spinning"
+ var/result = rand(0,36)
+ var/color = "green"
+ add_fingerprint(user)
+ if ((result>0 && result<11) || (result>18 && result<29))
+ if (result%2)
+ color="red"
+ else
+ color="black"
+ if ( (result>10 && result<19) || (result>28) )
+ if (result%2)
+ color="black"
+ else
+ color="red"
+ spawn(5 SECONDS)
+ visible_message("The roulette stops spinning, the ball landing on [result], [color].")
+ busy=0
+ icon_state = "roulette_wheel"
+
+/obj/structure/casino_table/roulette_chart
+ name = "roulette chart"
+ desc = "Roulette chart. Place your bets!"
+ icon_state = "roulette_table"
+
+//
+//Blackjack table - no sprite
+//
+
+/obj/structure/casino_table/blackjack_l
+ name = "gambling table"
+ desc = "Gambling table, try your luck and skills! "
+ icon_state = "blackjack_l"
+
+/obj/structure/casino_table/blackjack_r
+ name = "gambling table"
+ desc = "Gambling table, try your luck and skills! "
+ icon_state = "blackjack_r"
+
+/obj/structure/casino_table/blackjack_m
+ name = "gambling table"
+ desc = "Gambling table, try your luck and skills! "
+ icon_state = "blackjack_m"
+
+//
+//Wheel. Of. FORTUNE!
+//
+
+/obj/machinery/wheel_of_fortune
+ name = "wheel of fortune"
+ desc = "The Wheel of Fortune! Insert chips and may fortune favour the lucky one at the next lottery!"
+ icon = 'icons/obj/64x64.dmi'
+ icon_state = "wheel_of_fortune"
+ density = 1
+ anchored = 1
+ pixel_x = -16
+
+ req_access = list(300)
+ var/interval = 1
+ var/busy = 0
+ var/public_spin = 0
+ var/lottery_sale = "disabled"
+ var/lottery_price = 100
+ var/lottery_entries = 0
+ var/lottery_tickets = list()
+ var/lottery_tickets_ckeys = list()
+
+ var/datum/effect/effect/system/confetti_spread
+ var/confetti_strength = 15
+
+
+/obj/machinery/wheel_of_fortune/attack_hand(mob/user as mob)
+ if (busy)
+ to_chat(user,"The wheel of fortune is already spinning! ")
+ return
+
+ if(usr.incapacitated())
+ return
+ if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
+ switch(input(user,"Choose what to do","Wheel Of Fortune") in list("Spin the Wheel! (Not Lottery)", "Set the interval", "Cancel"))
+ if("Cancel")
+ return
+ if("Spin the Wheel! (Not Lottery)")
+ if(public_spin == 0)
+ to_chat(user,"The Wheel makes a sad beep, public spins are not enabled right now.. ")
+ return
+ else
+ to_chat(user,"You spin the wheel! ")
+ spin_the_wheel("not_lottery")
+ if("Set the interval")
+ setinterval()
+
+
+/obj/machinery/wheel_of_fortune/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if (busy)
+ to_chat(user,"The wheel of fortune is already spinning! ")
+ return
+
+ if(usr.incapacitated())
+ return
+
+ if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
+ if(!check_access(W))
+ to_chat(user, "Access Denied.")
+ return
+ else
+ to_chat(user, "Proper access, allowed staff controls.")
+ if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
+ switch(input(user,"Choose what to do (Management)","Wheel Of Fortune (Management)") in list("Spin the Lottery Wheel!", "Toggle Lottery Sales", "Toggle Public Spins", "Reset Lottery", "Cancel"))
+ if("Cancel")
+ return
+ if("Spin the Lottery Wheel!")
+ to_chat(user,"You spin the wheel for the lottery! ")
+ spin_the_wheel("lottery")
+
+ if("Toggle Lottery Sales")
+ if(lottery_sale == "disabled")
+ lottery_sale = "enabled"
+ to_chat(user,"Public Lottery sale has been enabled. ")
+ else
+ lottery_sale = "disabled"
+ to_chat(user,"Public Lottery sale has been disabled. ")
+
+ if("Toggle Public Spins")
+ if(public_spin == 0)
+ public_spin = 1
+ to_chat(user,"Public spins has been enabled. ")
+ else
+ public_spin = 0
+ to_chat(user,"Public spins has been disabled. ")
+
+ if("Reset Lottery")
+ var/confirm = tgui_alert(usr, "Are you sure you want to reset Lottery?", "Confirm Lottery Reset", list("Yes", "No"))
+ if(confirm == "Yes")
+ to_chat(user, "Lottery has been Reset!")
+ lottery_entries = 0
+ lottery_tickets = list()
+ lottery_tickets_ckeys = list()
+
+ if(istype(W, /obj/item/weapon/spacecasinocash))
+ if(lottery_sale == "disabled")
+ to_chat(user, "Lottery sales are currently disabled.")
+ return
+ else
+ if(user.client.ckey in lottery_tickets_ckeys)
+ to_chat(user, "The scanner beeps in an upset manner, you already have a ticket!")
+ return
+
+ var/obj/item/weapon/spacecasinocash/C = W
+ insert_chip(C, user)
+
+/obj/machinery/wheel_of_fortune/proc/insert_chip(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user)
+ if (busy)
+ to_chat(user,"The Wheel of Fortune is busy, wait for it to be done to buy a lottery ticket. ")
+ return
+ if(cashmoney.worth < lottery_price)
+ to_chat(user,"You dont have enough chips to buy a lottery ticket! ")
+ return
+
+ to_chat(user,"You put [lottery_price] credits worth of chips into the Wheel of Fortune and it pings to notify of your lottery ticket registered!")
+ cashmoney.worth -= lottery_price
+ cashmoney.update_icon()
+
+ if(cashmoney.worth <= 0)
+ usr.drop_from_inventory(cashmoney)
+ qdel(cashmoney)
+ cashmoney.update_icon()
+
+ lottery_entries++
+ lottery_tickets += "Number.[lottery_entries] [user.name]"
+ lottery_tickets_ckeys += user.client.ckey
+
+/obj/machinery/wheel_of_fortune/proc/spin_the_wheel(var/mode)
+ var/result = 0
+
+ if(mode == "not_lottery")
+ busy = 1
+ icon_state = "wheel_of_fortune_spinning"
+ result = rand(1,interval)
+
+ spawn(5 SECONDS)
+ visible_message("The wheel of fortune stops spinning, the number is [result]!")
+ src.confetti_spread = new /datum/effect/effect/system/confetti_spread()
+ src.confetti_spread.attach(src) //If somehow people start dragging slot machine
+ spawn(0)
+ for(var/i = 1 to confetti_strength)
+ src.confetti_spread.start()
+ sleep(10)
+
+ flick("[icon_state]-winning",src)
+ busy = 0
+ icon_state = "wheel_of_fortune"
+
+ if(mode == "lottery")
+ if(lottery_entries == 0)
+ visible_message("There are no tickets in the system!")
+ return
+
+ busy = 1
+ icon_state = "wheel_of_fortune_spinning"
+ result = pick(lottery_tickets)
+
+ spawn(5 SECONDS)
+ visible_message("The wheel of fortune stops spinning, and the winner is [result]!")
+ src.confetti_spread = new /datum/effect/effect/system/confetti_spread()
+ src.confetti_spread.attach(src) //If somehow people start dragging slot machine
+ spawn(0)
+ for(var/i = 1 to confetti_strength)
+ src.confetti_spread.start()
+ sleep(10)
+
+ flick("[icon_state]-winning",src)
+ busy = 0
+ icon_state = "wheel_of_fortune"
+
+/obj/machinery/wheel_of_fortune/verb/setinterval()
+ set name = "Change interval"
+ set category = "Object"
+ set src in view(1)
+
+ if(usr.incapacitated())
+ return
+ if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
+ interval = input("Put the desired interval (1-1000)", "Set Interval") as num
+ if(interval>1000 || interval<1)
+ usr << "Invalid interval."
+ return
+ usr << "You set the interval to [interval]"
+ return
+
+//
+//Slave Terminal
+//
+
+/obj/machinery/casinoslave_handler
+ name = "Sentient Prize Automated Sales Machinery"
+ desc = "The Sentient Prize Automated Sales Machinery, also known as SPASM! Here one can see who is on sale as sentinet prizes, as well as selling self and also buying prizes."
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "casinoslave_hub_off"
+ density = 1
+ anchored = 1
+ req_access = list(300)
+
+ var/casinoslave_sale = "disabled"
+ var/casinoslave_price = 100
+ var/collar_list = list()
+ var/slaves_ckeys_list = list() //Same trick as lottery, to keep life simple
+ var/obj/item/clothing/accessory/collar/casinoslave/selected_collar = null
+
+/obj/machinery/casinoslave_handler/attack_hand(mob/living/user as mob)
+ if(usr.incapacitated())
+ return
+ if(casinoslave_sale == "disabled")
+ to_chat(user,"The SPASM is disabled. ")
+ return
+
+ if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
+ switch(input(user,"Choose what to do","SPASM") in list("Show selected Prize", "Select Prize", "Become Prize (Please examine yourself first)", "Cancel"))
+ if("Cancel")
+ return
+ if("Show selected Prize")
+ if(QDELETED(selected_collar))
+ collar_list -= selected_collar
+ slaves_ckeys_list -= selected_collar.slaveckey
+ to_chat(user, "No collar is currently selected or the currently selected one has been destroyed or disabled.")
+ selected_collar = null
+ return
+ to_chat(user, "Sentient Prize information")
+ to_chat(user, "Name: [selected_collar.slavename]")
+ to_chat(user, "Description: [selected_collar.slaveflavor]")
+ to_chat(user, "OOC: [selected_collar.slaveooc]")
+ if(selected_collar.ownername != null)
+ to_chat(user, "This prize is already owned by [selected_collar.ownername]")
+
+ if("Select Prize")
+ selected_collar = tgui_input_list(user, "Select a prize", "Chose a collar", collar_list)
+ if(QDELETED(selected_collar))
+ collar_list -= selected_collar
+ slaves_ckeys_list -= selected_collar.slaveckey
+ to_chat(user, "No collars to chose, or selected collar has been destroyed or deactived, selection has been removed from list.")
+ selected_collar = null
+ return
+
+ if("Become Prize (Please examine yourself first)") //Its awkward, but no easy way to obtain flavor_text due to server not loading text of mob until its been examined at least once.
+ var/safety_ckey = user.client.ckey
+ if(safety_ckey in slaves_ckeys_list)
+ to_chat(user, "The SPASM beeps in an upset manner, you already have a collar!")
+ return
+ var/confirm = tgui_alert(usr, "Are you sure you want to become a sentient prize?", "Confirm Sentient Prize", list("Yes", "No"))
+ if(confirm == "Yes")
+ to_chat(user, "You are now a prize!")
+ if(safety_ckey in slaves_ckeys_list)
+ to_chat(user, "The SPASM beeps in an upset manner, you already have a collar!")
+ return
+ slaves_ckeys_list += user.ckey
+ var/obj/item/clothing/accessory/collar/casinoslave/C = new(src.loc)
+ C.slavename = "[user.name]"
+ C.slaveckey = "[user.ckey]"
+ C.slaveflavor = user.flavor_text
+ C.slaveooc = user.ooc_notes
+ C.name = "Sentient Prize Collar: Available! [user.name] purchaseable at the SPASM!"
+ C.desc = "SPASM collar. The tags shows in flashy colorful text the wearer is [user.name] and is currently available to buy at the Sentient Prize Automated Sales Machinery!"
+ C.icon_state = "casinoslave_available"
+ C.update_icon()
+ collar_list += C
+
+ spawn_casinochips(casinoslave_price, src.loc)
+
+/obj/machinery/casinoslave_handler/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(usr.incapacitated())
+ return
+
+ if(istype(W, /obj/item/weapon/spacecasinocash))
+ if(casinoslave_sale == "disabled")
+ to_chat(user, "Sentient Prize sales are currently disabled.")
+ return
+ if(!selected_collar.ownername)
+ var/obj/item/weapon/spacecasinocash/C = W
+ if(user.client.ckey == selected_collar.slaveckey)
+ insert_chip(C, user, "selfbuy")
+ return
+ else
+ insert_chip(C, user, "buy")
+ return
+ else
+ to_chat(user, "This Sentient Prize is already owned! If you are the owner you can release the prize by swiping the collar on the SPASM!")
+ return
+
+ if(istype(W, /obj/item/clothing/accessory/collar/casinoslave))
+ var/obj/item/clothing/accessory/collar/casinoslave/C = W
+ if(user.name != C.slavename && user.name != C.ownername)
+ to_chat(user, "This Sentient Prize collar isn't yours, please give it to the one it tagged for, belongs to, or a casino staff member!")
+ return
+ if(user.name == C.slavename)
+ if(!C.ownername)
+ to_chat(user,"If collar isn't disabled and entry removed, please select your entry and insert chips. Or contact staff if you need assistance. ")
+ return
+ else
+ to_chat(user,"If collar isn't disabled and entry removed, please ask your owner to free you with collar swipe on the SPASM, or contact staff if you need assistance. ")
+ return
+ if(user.name == C.ownername)
+ var/confirm = tgui_alert(usr, "Are you sure you want to wipe [C.slavename] entry?", "Confirm Sentient Prize Release", list("Yes", "No"))
+ if(confirm == "Yes")
+ to_chat(user, "[C.slavename] collar has been deleted from registry!")
+ C.icon_state = "casinoslave"
+ C.update_icon()
+ C.name = "a disabled Sentient Prize Collar: [C.slavename]"
+ C.desc = "A collar worn by sentient prizes registered to a SPASM. The tag says its registered to [C.slavename], but harsh red text informs you its been disabled."
+ slaves_ckeys_list -= C.slaveckey
+ C.slaveckey = null
+ collar_list -= C
+
+ if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
+ if(!check_access(W))
+ to_chat(user, "Access Denied.")
+ return
+ else
+ to_chat(user, "Proper access, allowed staff controls.")
+ if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
+ switch(input(user,"Choose what to do (Management)","SPASM (Management)") in list("Toggle Sentient Prize Sales", "Wipe Selected Prize Entry", "Change Prize Value", "Cancel"))
+ if("Cancel")
+ return
+
+ if("Toggle Sentient Prize Sales")
+ if(casinoslave_sale == "disabled")
+ casinoslave_sale = "enabled"
+ icon_state = "casinoslave_hub_on"
+ update_icon()
+ to_chat(user,"Prize sale has been enabled. ")
+ else
+ casinoslave_sale = "disabled"
+ icon_state = "casinoslave_hub_off"
+ update_icon()
+ to_chat(user,"Prize sale has been disabled. ")
+
+ if("Wipe Selected Prize Entry")
+ if(!selected_collar)
+ to_chat(user, "No collar selected!")
+ return
+ if(QDELETED(selected_collar))
+ collar_list -= selected_collar
+ slaves_ckeys_list -= selected_collar.slaveckey
+ to_chat(user, "Collar has been destroyed!")
+ selected_collar = null
+ return
+ var/safety_ckey = selected_collar.slaveckey
+ var/confirm = tgui_alert(usr, "Are you sure you want to wipe [selected_collar.slavename] entry?", "Confirm Sentient Prize", list("Yes", "No"))
+ if(confirm == "Yes")
+ if(safety_ckey == selected_collar.slaveckey)
+ to_chat(user, "[selected_collar.slavename] collar has been deleted from registry!")
+ selected_collar.icon_state = "casinoslave"
+ selected_collar.update_icon()
+ selected_collar.name = "a disabled Sentient Prize Collar: [selected_collar.slavename]"
+ selected_collar.desc = "A collar worn by sentient prizes registered to a SPASM. The tag says its registered to [selected_collar.slavename], but harsh red text informs you its been disabled."
+ slaves_ckeys_list -= selected_collar.slaveckey
+ selected_collar.slaveckey = null
+ collar_list -= selected_collar
+ selected_collar = null
+ else
+ to_chat(user, "Registry deletion aborted! Changed collar selection!")
+ return
+
+ if("Change Prize Value")
+ setprice(user)
+
+/obj/machinery/casinoslave_handler/proc/insert_chip(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user, var/buystate)
+ if(cashmoney.worth < casinoslave_price)
+ to_chat(user,"You dont have enough chips to pay for the sentient prize! ")
+ return
+
+ cashmoney.worth -= casinoslave_price
+ cashmoney.update_icon()
+
+ if(cashmoney.worth <= 0)
+ usr.drop_from_inventory(cashmoney)
+ qdel(cashmoney)
+ cashmoney.update_icon()
+
+ if(buystate == "selfbuy")
+ to_chat(user,"You put [casinoslave_price] credits worth of chips into the SPASM and nullify your collar! ")
+ selected_collar.icon_state = "casinoslave"
+ selected_collar.update_icon()
+ selected_collar.name = "a disabled Sentient Prize Collar: [selected_collar.slavename]"
+ selected_collar.desc = "A collar worn by sentient prizes registered to a SPASM. The tag says its registered to [selected_collar.slavename], but harsh red text informs you its been disabled."
+ slaves_ckeys_list -= selected_collar.slaveckey
+ selected_collar.slaveckey = null
+ collar_list -= selected_collar
+ selected_collar = null
+
+ if(buystate == "buy")
+ to_chat(user,"You put [casinoslave_price] credits worth of chips into the SPASM and it pings to inform you bought [selected_collar.slavename]! ")
+ selected_collar.icon_state = "casinoslave_owned"
+ selected_collar.update_icon()
+ selected_collar.ownername = user.name
+ selected_collar.name = "Sentient Prize Collar: [selected_collar.slavename] owned by [selected_collar.ownername]!"
+ selected_collar.desc = "A collar worn by sentient prizes registered to a SPASM. The tag says its registered to [selected_collar.slavename] and they are owned by [selected_collar.ownername]."
+ selected_collar = null
+
+/obj/machinery/casinoslave_handler/proc/setprice(mob/living/user as mob)
+ if(usr.incapacitated())
+ return
+ if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
+ casinoslave_price = input("Select the desired price (1-1000)", "Set Price") as num
+ if(casinoslave_price>1000 || casinoslave_price<1)
+ to_chat(user,"Invalid price. ")
+ return
+ to_chat(user,"You set the price to [casinoslave_price] ")
diff --git a/code/modules/casino/casino_book.dm b/code/modules/casino/casino_book.dm
new file mode 100644
index 00000000000..1f80817112b
--- /dev/null
+++ b/code/modules/casino/casino_book.dm
@@ -0,0 +1,284 @@
+
+//Original Casino Code created by Shadowfire117#1269 - Ported from CHOMPstation
+//Modified by GhostActual#2055 for use with VOREstation
+
+//
+//Casino Manual - NEEDS EDITING
+//
+
+/obj/item/weapon/book/manual/casino
+ name = "A dummy guide to losing your thalers"
+ icon = 'icons/obj/casino.dmi'
+ icon_state ="casinomanual"
+ author = "Sleazy Serpent Saren"
+ w_class = 2 // To allow it to be stuffed away into wallets for easy readings during events
+ title = "A dummy guide to losing your thalers"
+ dat = {"
+
+
+
+
+
+
+
+ - Foreword: Welcome to gambling!
+ - Blackjack
+ - Roulette
+ - Poker
+ - Cards against the galaxy
+ - Prizes
+ - Sentient prizes
+
+
+
+ In this book I'll teach you all about how to gamble your money away or at least get lucky and win some! This book also has a handy little overview of the prizes one can earn and the limitations of what can do with the living and breathing ones.
+ (This book will also contain out of character information to help people be aware of how touchy subjects like sentient prizes are to be handled.)
+
+
+ First up is the classic sport of blackjack, blackjack is played normally between a gambler and a dealer, the goal is to have the higher number than the opponent but not go above 21 or it will be a bust and one loses automatically.
+ The values of cards are as follow:
+
+ - Ace - 1 or 11, can be freely decided at any moment
+ - 2 - 10 - value coresponding to their number
+ - All face cards excluding joker - Value of 10
+
+ A game of blackjack begins with the dealer giving the gambler two cards, in normal blackjack all cards dealt to gambler and dealer are always shown. The two cards dealt have their values put together, the gambler has three choices, stand, hit, or double down.
+
+ - Stand - Gambler or dealer decides not to draw any more cards and it becomes the dealers turn or ends.
+ - Hit - 10 - The dealer draws a new card, adding to the existing hand, if its a bust the game will end and they will lose.
+ - Double down - A risky move the gambler can do, the dealer draws one more card and the bet is doubled, but no more cards can be drawn and it becomes the dealer's turn.
+
+ When it becomes the dealer's turn they do the same as the gambler, though their only goal is to get a higher or equal value to gambler. The dealer cant double down, and the large majority of casino's has the rule that a dealer cant draw anymore cards once they reach or go above a value. The most common value is 17, and there are two variants to that rule, soft and hard 17.
+
+ - Soft 17 - If the gambler gets 17, they can draw another card.
+ - Hard 17 - They dealer must stop if they get a value of 17.
+
+ The casino who supplies this version of the manual follows the rule of hard 17.
+ The game ends when the dealer busts, reaches the threshold of what they are allowed to draw, or if they get a higher value than the gambler. Again, the one who has the highest value that isnt higher than 21 wins, but if both has the same value no one wins and the bet goes back to the gambler.
+ And thats it! Now go out there and gamble your savings away! This casino allows bets between 5 and 50 with double down ignoring that limit!
+
+ But wait! Theres more! Theres also group blackjack! This game is a little different, the dealer can be part of it or simple deal for players, this game works differently with everyone keeping their hands hidden, everyone makes initial bets, gets two facedown cards, then its a matter of trying to get as good a hand as possible, but if you go bust, its over. But dont tell or show until everyone reveals! If youre going down, its best if youre opponents dont know they simply can play safe and win, if youre lucky everyone else gets themselves busted and you dont lose your beloved chips!
+ Its kinda like texas hold em in a way, everyone draws, folks can raise bets or fold, then draw more. Rinse and repeat until no one wants to raise any more nor draw cards, if everyone except one person has folded, they win by default even if they have busted, cause they dont need to reveal their hand that game, so you can choose to either sit and wait and fold if someone raise the bets, or you can gamble and make it look like you have an amazing hand and win by default since everyone else folds and no one is wise that you had a bust! This game has turned from simple probability and chance against the dealer to a game of risk and deception, fun fun fun!
+
+
+ So this game of roulette is all about chance! what happens is that people bet on different odds and hope for the best as the dealer rolls the ball and makes that roulette thingy make than fun addicting spin! Once it lands on a number between 0 and 36 its either bust or payout! Pretty simple, right?
+ Everyone starts by putting their bets down, people can bet more than once before the ball goes rolling, the odds and their payoffs are these:
+
+ - Single number - 35/1 payoff - The most unlikely one to get, but if the ball lands on your number, then youre loaded!
+ - Split Number - 17/1 - Choose an interval of 2, not very likely and therefore big reward!
+ - Row - 11/1 - Choose an interval of 3, more likely so not the biggest outcome!
+ - Split - 8/1 - Choose an interval of 4, not gonna win big time.
+ - Split row - 5/1 - Choose an interval of 6, getting to the safer bets.
+ - Column - 2/1 - Choose an interval of 12, boring, but likely.
+ - Red/Black or even/odd numbers - 1/1 - Odd or even numbers explains themselves. Red numbers are from 0 to 11 and 18 to 29 while the rest is black. These are the safest bets there are!
+
+ Theres not much more to it! Bets made, ball rolls, number announced, people win, people lose! Bets allowed here are from 1 to 25 per bet. Oh, im also being told this casino has the fancy rule that if ball lands on 0, one wins at least one bet no matter what it is! So lets hope you got that big bet on a single number!
+
+
+ Aaah yes, good old poker. This casino runs by the rules of texas hold em, though the might be a little modified to be simpler for the average joe. In a game of poker it can be a single gambler and a dealer against each other, but most often its the dealer making the game proceed while several gamblers fights tooth and nail to steal each others chips, but the dealer can still join in on the free for all if they so wish!
+ To simply explain the game, people gamble with each other, a game of trying to get the best hand and raise bets or back out depending on what the outcome may be. The game starts with everyone betting a certain amount, it can be 5 or 10 chips depending on dealer, but if one wants to join, there needs to be chips on that table! Once everyone has made their initial bet, everyone gets two cards face down, these are kept hidden, no one not even dealer gets to see players cards until the end, not even folded cards are to be shown unless wanted to, sometimes its better making people unsure if you dropped out with bad cards or if you have other motives, deception is a large part of this game!
+ With everyone having cards dealt, its time for the dealer to lay three on the table face up, these cards are 3 of 5 cards in the community pool, everyone can use these cards to make sets like pairs and such, this doesnt mean they are taken, multiple people can use the same community card for their own sets!
+ With the community having three we enter the second betting stage, here people have two options, standing or raising. Standing means you dont want to raise, raising explains itself, though if someone bets, people have three options, commit putting the chips in to risk as much as the raised bet, but if one doesnt have enough, then they can still go all in with their remaining chips, one can also drop out if its too risky, the chips bet will remain on the table, but at least you wont lose more eh? Final one is to raise further, sometimes people can dare each other to raise more, but its not allowed for someone to raise, then raise further if no one else raises after them!
+ As said earlier, we got like a community pool of 5 cards total, this time another card is revealed and we enter a new betting phase, then the final fifth card is revealed and final bets are made, and then the cards are revealed so it can be determined who has the best hand! If two or more have equally good sets, then the chips are split evenly between them.
+ But notice, if someone is left because everyone else didnt dare to raise with their bet, they can decide to not reveal their hand, they might have had a winning hand, or maybe its terrible and they just bluffed their way to victory, only they know and can decide if they want to expose their cards to gloat or confuse their opponents. So in summary, the game can be simple, but hard to master!
+ And here is the order of winning hands folks!
+
+ - Royal flush - The big and best one, this is a set of a 10, Ace, Knave/Jack, Queen and King of the same suit.
+ - Straight flush - This one is also definently a winner, though can be easier to get as it just needs to be five cards making a sraight of the same suit, an example being black 3 to 7.
+ - Four of a kind - Nice one, if you get this then you got a good chance to win. The value of the cards determine who wins, so ace is the best followed by king, queen and jack, then the peasant number cards!
+ - Full House - This one is good, but it requires you have three of a kind and a two of a kind, obviously value is part of the house, so the best roof is made of Ace with king making a strong foundation!
+ - Flush - This one requires the gambler to have 5 cards of a suit, not in any order, but the highest value card determines worth, so hope you got an Ace in your combo!
+ - Straight - Its like the royal flush, but can be any suits in combo, Ace can be lowest from Ace to 5 or highest from 10 to Ace!
+ - Three of a kind - Explains itself well enough, get three together and you got something going, lets hope you can build a house!
+ - Two pairs - You almost got yourself a house! But at least at this point its something!
+ - A pair - The worst set you can get, but you might be extremely lucky and have this while others have an inferior pair or the worst possible hand ever which is...
+ - High card - The absolute worst, if you cant get any of those sets, then you got this sad case, if a game mananages to end with no one getting a set, then the one with the highest value cards wins!
+
+
+ Wew, what a long lesson, but thats how one does the Texas hold em here at this casino, hope you guys have fun winning and losing your hard earned cash with this one!
+
+
+
+ So hear this, NT is now sponsoring team building at the casino, so folks who wants to just relax with friends, play some games, earn chips with no risk, even the ones broke can join in on a fun game of Cards against the galaxy and have fun!
+ The idea is that once a round has concluded and a casino member is present to see the game being actually played, everyone gets 10 chips while the one who won the round gets 25 instead! Interested? Good! Its easy and simple to play and very fun and vulgar!
+
+ The game is best played with at least 4 players and starts with everyone drawing 7 white cards, the person who most recently pooped starts as the 'card czar', but folks can agree on another criteria for the czar or simply pick one. Each round the current card czar draws a black card that has text written on it and blank lines, everyone aside from the czar takes a white card from their hand for every blank line which they find funny in that sentence and puts on the table face down with the others. The card czar cant know who has which white card and simply reads the black card with the white ones, the most funniest combination is choosen by the czar and the one who made that combination is the current rounds winner and the next rounds czar. At the end of each round everyone makes sure to draw enough white card to have 7 on hand and if theres a casino staff member playing or watching, they note down or hand out chips for everyone, and if they are playing, they get to add chips to their own personal stockpile too!
+ Thats it for cards against the galaxy! Simple, fun and vulgar, whats there not to love?
+
+
+
+ Hey folks, welcome to the prize section! This part is definently important for you folks operating the prize booth! First off I wanna tell you some great news! Nanotransen has gone along with a nice deal that allows crew to occasionally keep their hard earned rewards on station for a limited time, now you can enjoy your new fancy toolbelt or bluespace beaker for more than just the shift where the casino comes around!
+ ((Be aware, there can be limitations on how many rewards you get to keep after the shift, it might be unfair if some shows up and wins one thing, while they watch as command staff crew with high background income as well as hyperactive miners walks home with 20 prizes they get to enjoy while having almost done no gambling at all.))
+
+ Lets get to the prizes and exchange rate before we get started on the stuff specifically for the booth operators, so heres the current prizes one can win and their costs! Be aware there might be new prizes or absent ones from time to time!
+
+ EXCHANGE RATE
+ FROM = TO
+ 5 Thalers = 1 casino chip
+ 1 casino chip = 5 Thalers
+
+ The special sentient prize is 100 chips! More about it in section below!
+
+ Melee weapons
+
+ - scepter 500
+ - chain of command 250
+
+ Guns and 'guns' ((disclaimer, giving out guns will mean you get a weapons license as well with the shifts you have it, abusing these weapons will quickly get them removed!))
+
+ - sizegun 100
+ - advanced anti particle rifle 500
+ - temperature gun 250
+ - alien pistol 1000
+ - floral somatoray 250
+ - net gun 500
+
+ Gear
+
+ - experimental welder 500
+ - alien belt 750
+ - alien enhancement vest 750
+ - The monocoole 1000
+ - chameleon black tie 250
+ - cryostasis beaker 200
+ - bluespace beaker 200
+ - chem sprayer 250
+
+ Masks and hats - EVERYTHING IS 50 except chameleon!
+
+ - assistant hat
+ - Shark mask
+ - Pig mask
+ - Luchador mask
+ - Horse mask
+ - Goblin mask
+ - Fake moustache
+ - Dolphin mask
+ - Demon mask
+ - Chameleon gas mask 250
+
+ Costumes - All costumes are 100 except the hoodies which are 50!
+
+ - Black bunny girl outfit (black suit and rabbit ears)
+ - White bunny girl outfit (white suit and rabbit ears)
+ - Corgi hoodie
+ - Sexy clown
+ - nyan girl
+ - Wizard
+ - Chicken
+ - Carp hoodie
+ - Sexy mime
+ - Pirate
+ - Commie
+ - Plague doctor
+ - Imperium monk
+ - Cute witch
+ - Gladiator
+
+ Toys and misc - ALL THESE ARE 50
+
+ - Toy sword
+ - Water flower
+ - Stick horse
+ - Replica katana
+ - Magic conch
+ - Magic 8-ball
+ - Foam sword
+ - Foam crossbow (with 5 bolts)
+ - Bosun's whistle
+ - Golden cup
+ - Havana cigar case
+ - Casino wallet (to keep after shift)
+ - Casino card deck (to keep after shift)
+
+ Booze - ALL BOOZE IS 50
+
+ - Redeemer brew
+ - Warlock velvet
+ - Wrapp artiste patron
+ - Flask of holy water
+ - College girl goldschlager
+ - Gilthari luxury champagne
+ - Bottle of nothing
+ - Special blend whiskey
+ - Akvavit
+
+ Pets
+
+ - Armadillo 150
+ - Cat 150
+ - Goat 150
+ - Fox 150
+ - Lizard 150
+ - Penguin 150
+ - Goose 200
+ - Chicken 200
+ - Cow 200
+ - Corgi 200
+ - Snake 200
+ - Yithian 200
+ - Tindalos 200
+ - Fennec 300
+ - Red Panda 300
+ - Horse 300
+ - Otie 500
+ - Chonker Otie 500
+ - Zorgoia 500
+
+ Mechs
+
+ - Mining Ripley 1000
+ - Firefighter Ripley 750
+ - Serenity 1500
+ - Odysseus 1250
+ - Phazon Scuttlebug 2000
+ - Phazon Janus 3500
+ - Scarab 500
+ - Shuttlepod 250
+ - ´Shuttlecraft 500
+
+ Implants
+
+ - Implanter 100 (A basic empty implanter, you are going to need this to implant yourself with cyberntic augments)
+ - Implant: Tazer 1000 (A cybernetic implant that allows one to spawn a personal defense taser)
+ - Implant: Medkit 500 (A cybernetic implant that allows you to spawn all the tools needed for surgery)
+ - Implant: Shades 750 (A cybernetic implant that will spawn protective thermoshades upon your eyes, AR included!)
+ - Implant: Sprinter 1500 (A cybernetic implant that will give you that extra kick of energy to run faster!)
+ - Implant: Toolkit 500 (A cybernetic implant that allows you to spawn all the tools needed for engineering)
+ - Implant: Language 1000 (A cybernetic implant that allows you to understand almost all languages)
+ - Implant: Analyzer 500 (A cybernetic implant that allows one to spawn a Portable Resonant Analyzer for any science needs)
+ - Implant: Size Control 500 (A cybernetic implant that allows one to change the size of others via specific voice commands)
+
+
+ Thats it for prizes!
+
+ Now comes the part for the both operators, you got a very important job, it has a lot of responsibility, so it means that you gotta put that first before your own fun, cause unless you do it, a lot of folks are gonna be left sad and dissappointed they cant get any goodies! But the process is simple and can be quick, someone comes to you, they want some chips, or thalers back or a prize, you simply check this nice guide above to determine cost and ask for the amount of thalers or chips needed, if its a prize, then you follow this procedure:
+
+ - First get the thalers or chips for payment.
+ - Before giving the prize you take out your prize winner folder and a piece of paper, this paper will be named after the one getting the reward and will have further prizes noted down into it, so make sure its safe in that folder!
+ - You write at the top of the document the winner's name, then below write in big letters 'PRIZES' and put each new reward on its own line! ((You skip to a new line by writing < br > without the space between the br and the clamps))
+ - Once written down, you just put the paper back in the folder and hand over the prize!
+
+ ((When shift is nearing its end you pray to staff or DM the one responsible for the event, they will get the folder and copy paste all the reward info before shift is over and ensure people get their rewards. This is a very important job and we understand it might not be so fun being restricted during an event, but just like the rest of volunteer staff, you get rewarded with guaranteed prizes to enjoy after the shift for being a big help!))
+ ((This gets to the sour part, cheating and giving others and yourself free prizes and/or chips is absolutely forbidden, this has OOC consequences and will likely blacklist you from being important roles in future events. Though dont fear getting punished even if you havent done anything wrong, we will rather let cheaters slip than let honest players get wrongfully punished!))
+
+
+ Goodness me this is quite the casino huh? Who would have thought one could win other people as a prize? Well you can do just about anything you want with them! Be it just company, some less children friendly company, heck you can even eat them or make them eat you! The options and possibilities are quite frankly limitless!
+ Now you might ask, how does one get these fancy prizes? Well they can be obtained by checking in at the exchange both and see the list of prizes, there might be none, there might be many, it depends on volunteers and losers! This brings us first to volunteers and then to losers!
+ Volunteering is simple! Anyone can walk up to the booth and ask to be a sentient prize, what this means is that you get a nice sum of 150 chips for you to do whatever you want, but someone might come at any point and claim you!
+ Losers are obtained differently, if youre completly busted and have nothing left, you become a prize that the one you lost to can do whatever they want with, this means both gamblers and dealers can end up as a prize, though if for whatever reason you dont become their prize, you get added to the list for someone else to enjoy. Becoming a prize means you also get 100 chips in compensation!
+
+ Now hear this! The casino has decided that to spice things up, folks can bet themselves at any time and arent already a prize on the list! Doesnt matter if youre rich or broke, playing blackjack or roulette, you can bet yourself in any game and youre worth 250 chips! But be careful, cause if you lose, youre the winners prize! They can keep you, give you to someone else. or to the prize booth and get the chips you would have gotten as volunteer! But if given to the booth, the winner cant buy their prize back for the lower cost!
+
+ ((Sour part again, but very important. These sentient prizes can be fun, but one thing always dictates how these things goes down, preferences and ooc wants. If preferences dont line up and people dont agree to do winner/loser scene it becomes sentient prize on list. And someone cant win a prize if the prize ooc doesnt want to do what the winner wants to do. We still wish people to try and reach out and try things with new people and/or new things they are comfortable doing, but never shall anyone be forced into a situation they dont want!))
+
+
+
+ "}
\ No newline at end of file
diff --git a/code/modules/casino/casino_cards.dm b/code/modules/casino/casino_cards.dm
new file mode 100644
index 00000000000..9df021abbe8
--- /dev/null
+++ b/code/modules/casino/casino_cards.dm
@@ -0,0 +1,48 @@
+
+//Original Casino Code created by Shadowfire117#1269 - Ported from CHOMPstation
+//Modified by GhostActual#2055 for use with VOREstation
+
+/obj/item/weapon/deck/cards/casino/New()
+ var/datum/playingcard/casino/P
+ for(var/suit in list("spades","clubs","diamonds","hearts"))
+
+ var/colour
+ if(suit == "spades" || suit == "clubs")
+ colour = "black_"
+ else
+ colour = "red_"
+
+ for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten"))
+ P = new()
+ P.name = "[number] of [suit]"
+ P.card_icon = "casino_[colour]num"
+ P.back_icon = "casino_card_back"
+ cards += P
+
+ for(var/number in list("jack","queen","king"))
+ P = new()
+ P.name = "[number] of [suit]"
+ P.card_icon = "casino_[colour]col"
+ P.back_icon = "casino_card_back"
+ cards += P
+
+/datum/playingcard/casino
+ name = "playing card"
+ card_icon = "card_back"
+ back_icon = "card_back"
+
+/obj/item/weapon/deck/casino
+ w_class = ITEMSIZE_SMALL
+ icon = 'icons/obj/playing_cards.dmi'
+
+/obj/item/weapon/deck/holder/casino //WIP In future do a cool holder
+ name = "card box"
+ desc = "A small leather case to show how classy you are compared to everyone else."
+ icon = 'icons/obj/playing_cards.dmi'
+ icon_state = "card_holder"
+
+/obj/item/weapon/deck/cards/casino
+ name = "deck of casino cards"
+ desc = "A deck of playing cards from the golden goose casino, comes without a joker card!"
+ icon = 'icons/obj/playing_cards.dmi'
+ icon_state = "casino_deck"
\ No newline at end of file
diff --git a/code/modules/casino/casino_prize_vendor.dm b/code/modules/casino/casino_prize_vendor.dm
new file mode 100644
index 00000000000..0672170d8f2
--- /dev/null
+++ b/code/modules/casino/casino_prize_vendor.dm
@@ -0,0 +1,305 @@
+
+//Original Casino Code created by Shadowfire117#1269 - Ported from CHOMPstation
+//Modified by GhostActual#2055 for use with VOREstation
+
+// Use this define to register a prize!
+// * n - The proper name of the purchasable
+// * o - The object type path of the purchasable to spawn
+// * r - The amount to dispense
+// * p - The price of the purchasable in chips
+// * l - The restriction of the item
+#define CASINO_PRIZE(n, o, r, p, l) n = new /datum/data/casino_prize(n, o, r, p, l)
+
+/datum/data/casino_prize
+ var/equipment_path = null
+ var/equipment_amt = 1
+ var/cost = 0
+ var/category = null
+ var/restriction = null
+
+/datum/data/casino_prize/New(name, path, amt, cost, restriction)
+ src.name = name
+ src.equipment_path = path
+ src.equipment_amt = amt
+ src.cost = cost
+ src.category = category
+ src.restriction = restriction
+
+/obj/machinery/casino_prize_dispenser
+ name = "Casino Prize Exchanger"
+ desc = "Exchange your chips to obtain wonderful prizes! Hoepfully you'll get to keep some of them for a while."
+ icon = 'icons/obj/casino.dmi'
+ icon_state ="casino_prize_dispenser"
+ var/icon_vend ="casino_prize_dispenser-vend"
+ anchored = 1
+ density = 1
+ opacity = 0
+ var/list/item_list
+
+ clicksound = "button"
+ var/vending_sound = "machines/vending/vending_drop.ogg"
+
+ // Power
+ use_power = USE_POWER_IDLE
+ idle_power_usage = 10
+ var/vend_power_usage = 150 //actuators and stuff
+
+ // Vending-related
+ var/datum/data/casino_prize/currently_vending = null // What we're requesting payment for right now
+ var/list/log = list() //Log only SS13 staff is allowed to look at, CKEYS are listed here for record keeping of prizes and players for events!
+
+ var/category_weapons = 1 //For listing categories, if false then prizes of this categories cant be obtained nor bought for post-shift enjoyment
+ var/category_gear = 1 //If 1 prizes will be only logged
+ var/category_clothing = 1 //If 2 prizes will both be logged and spawned
+ var/category_misc = 1
+ var/category_drinks = 1
+ var/category_implants = 1
+ var/category_event = 1 //For special events, holidays, etc
+
+/obj/machinery/casino_prize_dispenser/Initialize()
+ . = ..()
+ power_change()
+
+ item_list = list()
+ item_list["Weapons"] = list(
+ CASINO_PRIZE("Scepter", /obj/item/weapon/scepter, 1, 500, "weapons"),
+ CASINO_PRIZE("Chain of Command", /obj/item/weapon/melee/chainofcommand, 1, 250, "weapons"),
+ CASINO_PRIZE("Size Gun", /obj/item/weapon/gun/energy/sizegun, 1, 100, "weapons"),
+ CASINO_PRIZE("Advanced Particle Rifle", /obj/item/weapon/gun/energy/particle/advanced, 1, 500, "weapons"),
+ CASINO_PRIZE("Temperature Gun", /obj/item/weapon/gun/energy/temperature, 1, 250, "weapons"),
+ CASINO_PRIZE("Alien Pistol", /obj/item/weapon/gun/energy/alien, 1, 1000, "weapons"),
+ CASINO_PRIZE("Floral Gun", /obj/item/weapon/gun/energy/floragun, 1, 250, "weapons"),
+ CASINO_PRIZE("Net Gun", /obj/item/weapon/gun/energy/netgun, 1, 500, "weapons"),
+ )
+ item_list["Gear"] = list(
+ CASINO_PRIZE("Experimental Welder", /obj/item/weapon/weldingtool/experimental, 1, 500, "gear"),
+ CASINO_PRIZE("Chameleon Tie", /obj/item/clothing/accessory/chameleon, 1, 250, "gear"),
+ CASINO_PRIZE("Chemsprayer", /obj/item/weapon/reagent_containers/spray/chemsprayer, 1, 250, "gear"),
+ CASINO_PRIZE("Bluespace Beaker", /obj/item/weapon/reagent_containers/glass/beaker/bluespace, 1, 200, "gear"),
+ CASINO_PRIZE("Cryo Beaker", /obj/item/weapon/reagent_containers/glass/beaker/noreact, 1, 200, "gear"),
+ )
+ item_list["Clothing"] = list(
+ CASINO_PRIZE("Shark mask", /obj/item/clothing/mask/shark, 1, 50, "clothing"),
+ CASINO_PRIZE("Pig mask", /obj/item/clothing/mask/pig, 1, 50, "clothing"),
+ CASINO_PRIZE("Luchador mask", /obj/item/clothing/mask/luchador, 1, 50, "clothing"),
+ CASINO_PRIZE("Horse mask", /obj/item/clothing/mask/horsehead, 1, 50, "clothing"),
+ CASINO_PRIZE("Goblin mask", /obj/item/clothing/mask/goblin, 1, 50, "clothing"),
+ CASINO_PRIZE("Fake moustache", /obj/item/clothing/mask/fakemoustache, 1, 50, "clothing"),
+ CASINO_PRIZE("Dolphin mask", /obj/item/clothing/mask/dolphin, 1, 50, "clothing"),
+ CASINO_PRIZE("Demon mask", /obj/item/clothing/mask/demon, 1, 50, "clothing"),
+ CASINO_PRIZE("Chameleon mask", /obj/item/clothing/under/chameleon, 1, 250, "clothing"),
+ CASINO_PRIZE("Ian costume", /obj/item/clothing/suit/storage/hooded/ian_costume, 1, 50, "clothing"),
+ CASINO_PRIZE("Carp costume", /obj/item/clothing/suit/storage/hooded/carp_costume, 1, 50, "clothing"),
+ )
+ item_list["Miscellaneous"] = list(
+ CASINO_PRIZE("Toy sword", /obj/item/toy/sword, 1, 50, "misc"),
+ CASINO_PRIZE("Waterflower", /obj/item/weapon/reagent_containers/spray/waterflower, 1, 50, "misc"),
+ CASINO_PRIZE("Horse stick", /obj/item/toy/stickhorse, 1, 50, "misc"),
+ CASINO_PRIZE("Katana", /obj/item/toy/katana, 1, 50, "misc"),
+ CASINO_PRIZE("Conch", /obj/item/toy/eight_ball/conch, 1, 50, "misc"),
+ CASINO_PRIZE("Eight ball", /obj/item/toy/eight_ball, 1, 50, "misc"),
+ CASINO_PRIZE("Foam sword", /obj/item/weapon/material/sword/foam, 1, 50, "misc"),
+ CASINO_PRIZE("Whistle", /obj/item/toy/bosunwhistle, 1, 50, "misc"),
+ CASINO_PRIZE("Golden cup", /obj/item/weapon/reagent_containers/food/drinks/golden_cup, 1, 50, "misc"),
+ CASINO_PRIZE("Quality cigars", /obj/item/weapon/storage/fancy/cigar/havana, 1, 50, "misc"),
+ CASINO_PRIZE("Casino wallet (kept after event)", /obj/item/weapon/storage/wallet/casino, 1, 50, "misc"),
+ CASINO_PRIZE("Casino cards", /obj/item/weapon/deck/cards/casino, 1, 50, "misc"),
+ )
+ item_list["Drinks"] = list(
+ CASINO_PRIZE("Redeemer's brew", /obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew, 1, 50, "drinks"),
+ CASINO_PRIZE("Poison wine", /obj/item/weapon/reagent_containers/food/drinks/bottle/pwine, 1, 50, "drinks"),
+ CASINO_PRIZE("Patron", /obj/item/weapon/reagent_containers/food/drinks/bottle/patron, 1, 50, "drinks"),
+ CASINO_PRIZE("Holy water", /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, 1, 50, "drinks"),
+ CASINO_PRIZE("Goldschlager", /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager, 1, 50, "drinks"),
+ CASINO_PRIZE("Champagne", /obj/item/weapon/reagent_containers/food/drinks/bottle/champagne, 1, 50, "drinks"),
+ CASINO_PRIZE("Bottle of Nothing", /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing, 1, 50, "drinks"),
+ CASINO_PRIZE("Whiskey bliss", /obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey, 1, 50, "drinks"),
+ )
+
+ item_list["Implants"] = list(
+ CASINO_PRIZE("Implanter (Remember to get one unless you want to borrow from station!)", /obj/item/weapon/implanter, 1, 100, "implants"),
+ CASINO_PRIZE("Implant: Tazer", /obj/item/weapon/implantcase/taser, 1, 1000, "implants"),
+ CASINO_PRIZE("Implant: Medkit", /obj/item/weapon/implantcase/medkit, 1, 500, "implants"),
+ CASINO_PRIZE("Implant: Shades", /obj/item/weapon/implantcase/shades, 1, 750, "implants"),
+ CASINO_PRIZE("Implant: Sprinter", /obj/item/weapon/implantcase/sprinter, 1, 1500, "implants"),
+ CASINO_PRIZE("Implant: Toolkit", /obj/item/weapon/implantcase/toolkit, 1, 500, "implants"),
+ CASINO_PRIZE("Implant: Language", /obj/item/weapon/implantcase/vrlanguage, 1, 1000, "implants"),
+ CASINO_PRIZE("Implant: Analyzer", /obj/item/weapon/implantcase/analyzer, 1, 500, "implants"),
+ CASINO_PRIZE("Implant: Size control", /obj/item/weapon/implant/sizecontrol , 1, 500, "implants"),
+ )
+
+ item_list["Event"] = list(
+ )
+
+/obj/machinery/casino_prize_dispenser/power_change()
+ ..()
+ if(stat & BROKEN)
+ icon_state = "[initial(icon_state)]-broken"
+ else
+ if(!(stat & NOPOWER))
+ icon_state = initial(icon_state)
+ else
+ spawn(rand(0, 15))
+ icon_state = "[initial(icon_state)]-off"
+
+/obj/machinery/casino_prize_dispenser/attack_hand(mob/user as mob)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ tgui_interact(user)
+
+/obj/machinery/casino_prize_dispenser/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(currently_vending)
+ if(istype(W, /obj/item/weapon/spacecasinocash))
+ to_chat(usr, "Please select prize on display with sufficient amount of chips.")
+ else
+ SStgui.update_uis(src)
+ return // don't smack that machine with your 2 chips
+
+ if(istype(W, /obj/item/weapon/spacecasinocash))
+ attack_hand(user)
+ return
+ ..()
+
+/obj/machinery/casino_prize_dispenser/proc/pay_with_chips(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user, var/price)
+ //"cashmoney_:[cashmoney] user:[user] currently_vending:[currently_vending]"
+ if(price > cashmoney.worth)
+ to_chat(usr, "\icon[cashmoney] That is not enough chips.")
+ return 0
+
+ if(istype(cashmoney, /obj/item/weapon/spacecasinocash))
+ visible_message("\The [usr] inserts some chips into \the [src].")
+ cashmoney.worth -= price
+
+ if(cashmoney.worth <= 0)
+ usr.drop_from_inventory(cashmoney)
+ qdel(cashmoney)
+ else
+ cashmoney.update_icon()
+ return 1
+
+/obj/machinery/casino_prize_dispenser/ui_assets(mob/user)
+ return list(
+ get_asset_datum(/datum/asset/spritesheet/vending),
+ )
+
+/obj/machinery/casino_prize_dispenser/tgui_data(mob/user)
+ var/list/data[0]
+
+ data["items"] = list()
+ for(var/cat in item_list)
+ var/list/cat_items = list()
+ for(var/prize_name in item_list[cat])
+ var/datum/data/casino_prize/prize = item_list[cat][prize_name]
+ cat_items[prize_name] = list("name" = prize_name, "price" = prize.cost, "restriction" = prize.restriction)
+ data["items"][cat] = cat_items
+ return data
+
+/obj/machinery/casino_prize_dispenser/tgui_interact(mob/user, datum/tgui/ui = null)
+ // Open the window
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "CasinoPrizeDispenser", name)
+ ui.open()
+
+/obj/machinery/casino_prize_dispenser/tgui_act(action, params)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ if(usr.stat || usr.restrained())
+ return
+ if(..())
+ return TRUE
+ . = TRUE
+ switch(action)
+ if("purchase")
+ var/paid = FALSE
+ var/category = params["cat"]
+ var/restriction_category = params["restriction"]
+ var/restriction_check = 0
+ var/item_given = FALSE
+ var/name = params["name"]
+ var/price = params["price"]
+ var/datum/data/casino_prize/bi = item_list[category][name]
+ switch(restriction_category)
+ if("weapons")
+ restriction_check = category_weapons
+ if("gear")
+ restriction_check = category_gear
+ if("clothing")
+ restriction_check = category_clothing
+ if("misc")
+ restriction_check = category_misc
+ if("drinks")
+ restriction_check = category_drinks
+ if("implants")
+ restriction_check = category_implants
+ if("event")
+ restriction_check = category_event
+ else
+ to_chat(usr, "Prize checkout error has occured, purchase cancelled.")
+ return FALSE
+
+ if(restriction_check < 1)
+ to_chat(usr, "[name] is restricted, this prize can't be bought.")
+ return FALSE
+ if(restriction_check > 1)
+ item_given = TRUE
+
+ if(price <= 0 && item_given == TRUE)
+ vend(bi, usr)
+ return TRUE
+
+ currently_vending = bi
+
+ if(istype(usr.get_active_hand(), /obj/item/weapon/spacecasinocash))
+ var/obj/item/weapon/spacecasinocash/cash = usr.get_active_hand()
+ paid = pay_with_chips(cash, usr, price)
+ else
+ to_chat(usr, "Payment failure: Improper payment method, please provide chips.")
+ return TRUE // we set this because they shouldn't even be able to get this far, and we want the UI to update.
+ if(paid)
+ if(item_given == TRUE)
+ vend(bi, usr)
+
+ speak("Thank you for your purchase, your [bi] has been logged.")
+ do_logging(currently_vending, usr, bi)
+ . = TRUE
+ else
+ to_chat(usr, "Payment failure: unable to process payment.")
+
+/obj/machinery/casino_prize_dispenser/proc/vend(datum/data/casino_prize/bi, mob/user)
+ SStgui.update_uis(src)
+
+ if(ispath(bi.equipment_path, /obj/item/stack))
+ var/obj/item/stack/S = new bi.equipment_path(loc)
+ S.amount = bi.equipment_amt
+ playsound(src, 'sound/machines/vending/vending_drop.ogg', 100, 1)
+ return TRUE
+
+ for(var/i in 1 to bi.equipment_amt)
+ new bi.equipment_path(loc)
+ playsound(src, 'sound/machines/vending/vending_drop.ogg', 100, 1)
+
+ currently_vending = null
+ use_power(vend_power_usage) //actuators and stuff
+ flick("[icon_state]-vend",src)
+
+
+/obj/machinery/casino_prize_dispenser/proc/do_logging(item, mob/user, datum/data/casino_prize/bi)
+ var/prize_log = "{ckey:[user.ckey]character_name:[user.name]item_path: [bi.equipment_path]}"
+ log[++log.len] = prize_log
+ //Currently doesnt have an ingame way to show. Can only be viewed through View-Variables, to ensure theres no chance of players ckeys exposed - Jack
+
+/obj/machinery/casino_prize_dispenser/proc/speak(var/message)
+ if(stat & NOPOWER)
+ return
+
+ if(!message)
+ return
+
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\The [src] beeps, \"[message]\"",2)
+ return
+
+/obj/machinery/casino_prize_dispenser/process() //Might not need this, but just to be safe for now
+ if(stat & (BROKEN|NOPOWER))
+ return
\ No newline at end of file
diff --git a/code/modules/casino/premium_dispenser.dm b/code/modules/casino/premium_dispenser.dm
new file mode 100644
index 00000000000..91b4833d6ef
--- /dev/null
+++ b/code/modules/casino/premium_dispenser.dm
@@ -0,0 +1,69 @@
+
+//Original Casino Code created by Shadowfire117#1269 - Ported from CHOMPstation
+//Modified by GhostActual#2055 for use with VOREstation
+
+/obj/machinery/chemical_dispenser/premium
+ name = "premium drink dispensary"
+ desc = "A specialty dispenser unit designed with Bluespace Technology."
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "premiumdispenser"
+ ui_title = "Premium Drink Dispensary"
+ accept_drinking = 1
+ var/max_cartridges = 90
+
+/obj/machinery/chemical_dispenser/premium/full
+ spawn_cartridges = list(
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon_lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/orange,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/sodawater,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tonic,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/beer,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/kahlua,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/whiskey,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/redwine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/whitewine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/vodka,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/gin,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/rum,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tequila,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/vermouth,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cognac,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cider,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ale,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/mead,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/water,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ice,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/coffee,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cream,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tea,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/icetea,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cola,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/smw,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/dr_gibb,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/spaceup,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tonic,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/sodawater,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon_lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/orange,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/watermelon,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/coffee,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cafe_latte,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/soy_latte,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/hot_coco,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/milk,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cream,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tea,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ice,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/mint,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/orange,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/berry,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/greentea,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/decaf
+ )
\ No newline at end of file
diff --git a/code/modules/casino/premium_vendors.dm b/code/modules/casino/premium_vendors.dm
new file mode 100644
index 00000000000..81075857458
--- /dev/null
+++ b/code/modules/casino/premium_vendors.dm
@@ -0,0 +1,129 @@
+
+//Original Casino Code created by Shadowfire117#1269 - Ported from CHOMPstation
+//Modified by GhostActual#2055 for use with VOREstation
+
+//
+//The code for Casino Vendors
+//Devs Feel free to modify this to vend what you please
+//
+
+/obj/machinery/vending/deluxe_boozeomat
+ name = "Premium Drink Distributor"
+ desc = "A top of the line drink vendor that carries some of the finest drinks."
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "premiumbooze"
+ products = list(/obj/item/weapon/glass_extra/stick = 50,
+ /obj/item/weapon/glass_extra/straw = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/square = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/rocks = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/shake = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/shot = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/pint = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/mug = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/wine = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/carafe = 2,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/pitcher = 2,
+ /obj/item/weapon/reagent_containers/food/drinks/metaglass = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/metaglass/metapint = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/grenadine = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/sake = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/patron = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/champagne = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale/hushedwhisper = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer/silverdragon = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer/meteor = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/small/litebeer = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/small/cider = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/gingerale = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/tea = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/cola = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/space_up = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/lemonjuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/applejuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/milk = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/ice = 10
+ )
+
+ contraband = list()
+ vend_delay = 15
+ idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
+ req_access = list(access_bar)
+ req_log_access = access_bar
+ has_logs = 1
+ vending_sound = "machines/vending/vending_cans.ogg"
+
+/obj/machinery/vending/deluxe_dinner
+ name = "Premium Dining Distributor"
+ desc = "A top of the line drink vendor that carries some of the finest foods in the frontier."
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "premiumfood"
+ products = list(/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/fries = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/onionrings = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cheeseburrito= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/enchiladas= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/meatburrito= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/taco= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cheesenachos= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cubannachos= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/stew= 20,
+ /obj/item/weapon/reagent_containers/food/snacks/roastbeef = 20,
+ /obj/item/weapon/reagent_containers/food/snacks/aesirsalad = 20,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi = 20,
+ /obj/item/weapon/reagent_containers/food/snacks/kitsuneudon = 20,
+ /obj/item/weapon/reagent_containers/food/snacks/baguette = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/appletart = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/muffin = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/berrymuffin = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cherrypie = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/croissant = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/pie = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/poppypretzel = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/sugarcookie = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/waffles = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake = 2,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake = 2,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake = 2,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake = 2,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake = 2,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake = 2,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake = 2,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake = 2,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake = 2
+ )
+
+ contraband = list()
+ vend_delay = 15
+ idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
+ req_access = list(access_bar)
+ req_log_access = access_bar
+ has_logs = 1
+ vending_sound = "machines/vending/vending_cans.ogg"
\ No newline at end of file
diff --git a/code/modules/casino/slots.dm b/code/modules/casino/slots.dm
new file mode 100644
index 00000000000..773c1d15e05
--- /dev/null
+++ b/code/modules/casino/slots.dm
@@ -0,0 +1,462 @@
+
+//Original Casino Code created by Shadowfire117#1269 - Ported from CHOMPstation
+//Modified by GhostActual#2055 for use with VOREstation
+
+/*
+ * Slot Machine
+ */
+
+/obj/machinery/slot_machine
+ name = "slot machine"
+ desc = "A gambling machine designed to give you false hope and rob you of your wealth, hence why it's often called a one armed bandit."
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "slotmachine"
+ anchored = 1
+ density = 1
+ power_channel = EQUIP
+ use_power = USE_POWER_IDLE
+ idle_power_usage = 10
+ active_power_usage = 100
+ light_power = 0.9
+ light_range = 2
+ light_color = "#B1FBBFF"
+ var/isbroken = 0 //1 if someone banged it with something heavy
+ var/ispowered = 1 //starts powered, changes with power_change()
+ var/busy = 0
+ var/symbol1 = null
+ var/symbol2 = null
+ var/symbol3 = null
+
+ var/datum/effect/effect/system/confetti_spread
+ var/confetti_strength = 8
+
+/obj/machinery/slot_machine/update_icon()
+ cut_overlays()
+ if(!ispowered || isbroken)
+ icon_state = "slotmachine_off"
+ if(isbroken) //If the thing is smashed, add crack overlay on top of the unpowered sprite.
+ add_overlay("slotmachine_broken")
+ set_light(0)
+ set_light_on(FALSE)
+ return
+
+ icon_state = "slotmachine"
+ set_light(2)
+ set_light_on(TRUE)
+ return
+
+/obj/machinery/slot_machine/power_change()
+ if(isbroken) //Broken shit can't be powered.
+ return
+ ..()
+ if(!(stat & NOPOWER))
+ ispowered = 1
+ update_icon()
+ else
+ spawn(rand(0, 15))
+ ispowered = 0
+ update_icon()
+
+/obj/machinery/slot_machine/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(busy)
+ to_chat(user,"The slot machine is currently running. ")
+ return
+ if(W.is_wrench())
+ playsound(src, W.usesound, 100, 1)
+ if(anchored)
+ user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
+ else
+ user.visible_message("[user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
+
+ if(do_after(user, 20 * W.toolspeed))
+ if(!src) return
+ to_chat(user, "You [anchored? "un" : ""]secured \the [src]!")
+ anchored = !anchored
+ return
+
+ if(!anchored)
+ to_chat(user," The slot machine isn't secured.")
+ return
+
+ var/handled = 0
+ var/paid = 0
+
+ if(istype(W, /obj/item/weapon/spacecasinocash))
+ var/obj/item/weapon/spacecasinocash/C = W
+ paid = insert_chip(C, user)
+ handled = 1
+
+ if(paid)
+ return
+ if(handled)
+ SStgui.update_uis(src)
+ return // don't smack that machine with your 2 chips
+
+ else if(!(stat & NOPOWER))
+ return
+
+ else if(isbroken)
+ return
+
+/obj/machinery/slot_machine/proc/insert_chip(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user)
+ if (ispowered == 0)
+ return
+ if (isbroken)
+ return
+ if (busy)
+ to_chat(user,"The slot machine is currently rolling. ")
+ return
+ if(cashmoney.worth < 5)
+ to_chat(user,"You dont have enough chips to gamble! ")
+ return
+
+ to_chat(user,"You puts 5 credits in the slot machine and presses start.")
+ cashmoney.worth -= 5
+ cashmoney.update_icon()
+
+ if(cashmoney.worth <= 0)
+ usr.drop_from_inventory(cashmoney)
+ qdel(cashmoney)
+ cashmoney.update_icon()
+
+ busy = 1
+ icon_state = "slotmachine_rolling"
+ playsound(src.loc, 'sound/machines/slotmachine_pull.ogg', 15, 1)
+
+ var/slot1 = rand(0,9)
+ switch(slot1)
+ if(0 to 3) symbol1 = "cherry"
+ if(4 to 4) symbol1 = "lemon"
+ if(5 to 5) symbol1 = "bell"
+ if(6 to 6) symbol1 = "four leaf clover"
+ if(7 to 7) symbol1 = "seven"
+ if(8 to 8) symbol1 = "diamond"
+ if(9 to 9) symbol1 = "platinum coin"
+
+ var/slot2 = rand(0,16)
+ switch(slot2)
+ if(0 to 5) symbol2 = "cherry"
+ if(6 to 7) symbol2 = "lemon"
+ if(8 to 9) symbol2 = "bell"
+ if(10 to 11) symbol2 = "four leaf clover"
+ if(12 to 13) symbol2 = "seven"
+ if(14 to 15) symbol2 = "diamond"
+ if(16) symbol2 = "platinum coin"
+
+ var/slot3 = rand(0,9)
+ switch(slot3)
+ if(0 to 3) symbol3 = "cherry"
+ if(4 to 4) symbol3 = "lemon"
+ if(5 to 5) symbol3 = "bell"
+ if(6 to 6) symbol3 = "four leaf clover"
+ if(7 to 7) symbol3 = "seven"
+ if(8 to 8) symbol3 = "diamond"
+ if(9 to 9) symbol3 = "platinum coin"
+
+ var/output //Output variable to send out in chat after the large if statement.
+ var/winnings = 0 //How much money will be given if any.
+ var/platinumwin = 0 // If you win the platinum chip or not
+ var/celebrate = 0
+ var/delaytime = 5 SECONDS
+
+
+ spawn(delaytime)
+ to_chat(user,"The slot machine flashes with bright colours as the slots lights up with a [symbol1], a [symbol2] and a [symbol3]!")
+
+ if (symbol1 == "cherry" && symbol2 == "cherry" && symbol3 == "cherry")
+ output = "Three cherries! The slot machine deposits chips worth 25 credits!"
+ winnings = 25
+
+ if ((symbol1 != "cherry" && symbol2 == "cherry" && symbol3 == "cherry") || (symbol1 == "cherry" && symbol2 != "cherry" && symbol3 == "cherry") ||(symbol1 == "cherry" && symbol2 == "cherry" && symbol3 != "cherry"))
+ output = "Two cherries! The slot machine deposits a 10 credit chip!"
+ winnings = 10
+
+ if (symbol1 == "lemon" && symbol2 == "lemon" && symbol3 == "lemon")
+ output = "Three lemons! The slot machine deposits a 50 credit chip!"
+ winnings = 50
+
+ if (symbol1 == "watermelon" && symbol2 == "watermelon" && symbol3 == "watermelon")
+ output = "Three watermelons! The slot machine deposits chips worth 75 credits!"
+ winnings = 75
+
+ if (symbol1 == "bell" && symbol2 == "bell" && symbol3 == "bell")
+ output = "Three bells! The slot machine deposits chips a 100 credit chip!"
+ winnings = 100
+
+ if (symbol1 == "four leaf clover" && symbol2 == "four leaf clover" && symbol3 == "four leaf clover")
+ output = "Three four leaf clovers! The slot machine deposits a 200 credit chip!"
+ winnings = 200
+
+ if (symbol1 == "seven" && symbol2 == "seven" && symbol3 == "seven")
+ output = "Three sevens! The slot machine deposits a 500 credit chip!"
+ winnings = 500
+ celebrate = 1
+
+ if (symbol1 == "diamond" && symbol2 == "diamond" && symbol3 == "diamond")
+ output = "Three diamonds! The slot machine deposits a 1000 credit chip!"
+ winnings = 1000
+ celebrate = 1
+
+ if (symbol1 == "platinum coin" && symbol2 == "platinum coin" && symbol3 == "platinum coin")
+ output = "Three platinum coins! The slot machine deposits a platinum chip!"
+ platinumwin = TRUE;
+ celebrate = 1
+
+ icon_state = initial(icon_state) // Set it back to the original iconstate.
+
+ if(!output) // Is there anything to output? If not, consider it a loss.
+ to_chat(user,"Better luck next time!")
+ busy = FALSE
+ return
+
+ to_chat(user,output) //Output message
+
+ if(platinumwin) // Did they win the platinum chip?
+ new /obj/item/weapon/casino_platinum_chip(src.loc)
+ playsound(src.loc, 'sound/machines/slotmachine.ogg', 25, 1)
+
+ if(winnings) //Did the person win?
+ icon_state = "slotmachine_winning"
+ playsound(src.loc, 'sound/machines/slotmachine.ogg', 25, 1)
+ spawn(delaytime)
+ spawn_casinochips(winnings, src.loc)
+ icon_state = "slotmachine"
+
+ if(celebrate) // Happy celebrations!
+ src.confetti_spread = new /datum/effect/effect/system/confetti_spread()
+ src.confetti_spread.attach(src) //If somehow people start dragging slot machine
+ spawn(0)
+ for(var/i = 1 to confetti_strength)
+ src.confetti_spread.start()
+ sleep(10)
+
+ busy = FALSE
+
+/*
+ * Station Slot Machine (takes space cash instead of chips)
+ */
+
+/obj/machinery/station_slot_machine
+ name = "station slot machine"
+ desc = "A gambling machine owned by NanoTrasen, designed to take Thalers as opposed to casino chips."
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "ntslotmachine"
+ anchored = 1
+ density = 1
+ power_channel = EQUIP
+ use_power = USE_POWER_IDLE
+ idle_power_usage = 10
+ active_power_usage = 100
+ light_power = 0.9
+ light_range = 2
+ light_color = "#B1FBBFF"
+ var/isbroken = 0 //1 if someone banged it with something heavy
+ var/ispowered = 1 //starts powered, changes with power_change()
+ var/busy = 0
+ var/symbol1 = null
+ var/symbol2 = null
+ var/symbol3 = null
+
+ var/datum/effect/effect/system/confetti_spread
+ var/confetti_strength = 8
+
+/obj/machinery/station_slot_machine/update_icon()
+ cut_overlays()
+ if(!ispowered || isbroken)
+ icon_state = "ntslotmachine_off"
+ if(isbroken) //If the thing is smashed, add crack overlay on top of the unpowered sprite.
+ add_overlay("ntslotmachine_broken")
+ set_light(0)
+ set_light_on(FALSE)
+ return
+
+ icon_state = "ntslotmachine"
+ set_light(2)
+ set_light_on(TRUE)
+ return
+
+/obj/machinery/station_slot_machine/power_change()
+ if(isbroken) //Broken shit can't be powered.
+ return
+ ..()
+ if(!(stat & NOPOWER))
+ ispowered = 1
+ update_icon()
+ else
+ spawn(rand(0, 15))
+ ispowered = 0
+ update_icon()
+
+/obj/machinery/station_slot_machine/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(busy)
+ to_chat(user,"The slot machine is currently running. ")
+ return
+ if(W.is_wrench())
+ playsound(src, W.usesound, 100, 1)
+ if(anchored)
+ user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
+ else
+ user.visible_message("[user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
+
+ if(do_after(user, 20 * W.toolspeed))
+ if(!src) return
+ to_chat(user, "You [anchored? "un" : ""]secured \the [src]!")
+ anchored = !anchored
+ return
+
+ if(!anchored)
+ to_chat(user," The slot machine isn't secured.")
+ return
+
+ var/handled = 0
+ var/paid = 0
+
+ if(istype(W, /obj/item/weapon/spacecash))
+ var/obj/item/weapon/spacecash/C = W
+ paid = insert_cash(C, user)
+ handled = 1
+ if(paid)
+ return
+ if(handled)
+ SStgui.update_uis(src)
+ return // don't smack that machine with your 2 chips
+
+ else if(!(stat & NOPOWER))
+ return
+
+ else if(isbroken)
+ return
+
+/obj/machinery/station_slot_machine/proc/insert_cash(var/obj/item/weapon/spacecash/cashmoney, mob/user)
+ if (ispowered == 0)
+ return
+ if (isbroken)
+ return
+ if (busy)
+ to_chat(user,"The slot machine is currently rolling. ")
+ return
+ if(cashmoney.worth < 5)
+ to_chat(user,"You dont have enough Thalers to gamble! ")
+ return
+
+ to_chat(user,"You puts 5 Thalers in the slot machine and presses start.")
+ cashmoney.worth -= 5
+ cashmoney.update_icon()
+
+ if(cashmoney.worth <= 0)
+ usr.drop_from_inventory(cashmoney)
+ qdel(cashmoney)
+ cashmoney.update_icon()
+
+ busy = 1
+ icon_state = "ntslotmachine_rolling"
+ playsound(src.loc, 'sound/machines/slotmachine_pull.ogg', 15, 1)
+
+ var/slot1 = rand(0,9)
+ switch(slot1)
+ if(0 to 3) symbol1 = "cherry"
+ if(4 to 4) symbol1 = "lemon"
+ if(5 to 5) symbol1 = "bell"
+ if(6 to 6) symbol1 = "four leaf clover"
+ if(7 to 7) symbol1 = "seven"
+ if(8 to 8) symbol1 = "diamond"
+ if(9 to 9) symbol1 = "platinum coin"
+
+ var/slot2 = rand(0,16)
+ switch(slot2)
+ if(0 to 5) symbol2 = "cherry"
+ if(6 to 7) symbol2 = "lemon"
+ if(8 to 9) symbol2 = "bell"
+ if(10 to 11) symbol2 = "four leaf clover"
+ if(12 to 13) symbol2 = "seven"
+ if(14 to 15) symbol2 = "diamond"
+ if(16) symbol2 = "platinum coin"
+
+ var/slot3 = rand(0,9)
+ switch(slot3)
+ if(0 to 3) symbol3 = "cherry"
+ if(4 to 4) symbol3 = "lemon"
+ if(5 to 5) symbol3 = "bell"
+ if(6 to 6) symbol3 = "four leaf clover"
+ if(7 to 7) symbol3 = "seven"
+ if(8 to 8) symbol3 = "diamond"
+ if(9 to 9) symbol3 = "platinum coin"
+
+ var/output //Output variable to send out in chat after the large if statement.
+ var/winnings = 0 //How much money will be given if any.
+ var/platinumwin = 0 // If you win the platinum chip or not
+ var/celebrate = 0
+ var/delaytime = 5 SECONDS
+
+
+ spawn(delaytime)
+ to_chat(user,"The slot machine flashes with bright colours as the slots lights up with a [symbol1], a [symbol2] and a [symbol3]!")
+
+ if (symbol1 == "cherry" && symbol2 == "cherry" && symbol3 == "cherry")
+ output = "Three cherries! The slot machine deposits 25 Thalers!"
+ winnings = 25
+
+ if ((symbol1 != "cherry" && symbol2 == "cherry" && symbol3 == "cherry") || (symbol1 == "cherry" && symbol2 != "cherry" && symbol3 == "cherry") ||(symbol1 == "cherry" && symbol2 == "cherry" && symbol3 != "cherry"))
+ output = "Two cherries! The slot machine deposits 10 Thalers!"
+ winnings = 10
+
+ if (symbol1 == "lemon" && symbol2 == "lemon" && symbol3 == "lemon")
+ output = "Three lemons! The slot machine deposits 50 Thalers!"
+ winnings = 50
+
+ if (symbol1 == "watermelon" && symbol2 == "watermelon" && symbol3 == "watermelon")
+ output = "Three watermelons! The slot machine deposits 75 Thalers!"
+ winnings = 75
+
+ if (symbol1 == "bell" && symbol2 == "bell" && symbol3 == "bell")
+ output = "Three bells! The slot machine deposits 100 Thalers!"
+ winnings = 100
+
+ if (symbol1 == "four leaf clover" && symbol2 == "four leaf clover" && symbol3 == "four leaf clover")
+ output = "Three four leaf clovers! The slot machine deposits 200 Thalers!"
+ winnings = 200
+
+ if (symbol1 == "seven" && symbol2 == "seven" && symbol3 == "seven")
+ output = "Three sevens! The slot machine deposits 500 Thalers!"
+ winnings = 500
+ celebrate = 1
+
+ if (symbol1 == "diamond" && symbol2 == "diamond" && symbol3 == "diamond")
+ output = "Three diamonds! The slot machine deposits 1000 Thalers!"
+ winnings = 1000
+ celebrate = 1
+
+ if (symbol1 == "platinum coin" && symbol2 == "platinum coin" && symbol3 == "platinum coin")
+ output = "Three platinum coins! The slot machine deposits a platinum chip!"
+ platinumwin = TRUE;
+ celebrate = 1
+
+ icon_state = initial(icon_state) // Set it back to the original iconstate.
+
+ if(!output) // Is there anything to output? If not, consider it a loss.
+ to_chat(user,"Better luck next time!")
+ busy = FALSE
+ return
+
+ to_chat(user,output) //Output message
+
+ if(platinumwin) // Did they win the platinum chip?
+ new /obj/item/weapon/casino_platinum_chip(src.loc)
+ playsound(src.loc, 'sound/machines/slotmachine.ogg', 25, 1)
+
+ if(winnings) //Did the person win?
+ icon_state = "ntslotmachine_winning"
+ playsound(src.loc, 'sound/machines/slotmachine.ogg', 25, 1)
+ spawn(delaytime)
+ spawn_money(winnings, src.loc)
+ icon_state = "ntslotmachine"
+
+ if(celebrate) // Happy celebrations!
+ src.confetti_spread = new /datum/effect/effect/system/confetti_spread()
+ src.confetti_spread.attach(src) //If somehow people start dragging slot machine
+ spawn(0)
+ for(var/i = 1 to confetti_strength)
+ src.confetti_spread.start()
+ sleep(10)
+
+ busy = FALSE
diff --git a/code/modules/clothing/under/accessories/accessory_vr.dm b/code/modules/clothing/under/accessories/accessory_vr.dm
index a35580499db..1a4c93eb678 100644
--- a/code/modules/clothing/under/accessories/accessory_vr.dm
+++ b/code/modules/clothing/under/accessories/accessory_vr.dm
@@ -374,4 +374,31 @@
icon_override = 'icons/inventory/accessory/mob_vr.dmi'
icon_state = "talon_pin"
item_state = "talonpin"
- overlay_state = "talonpin"
\ No newline at end of file
+ overlay_state = "talonpin"
+
+//Casino Slave Collar
+
+/obj/item/clothing/accessory/collar/casinoslave
+ name = "a disabled Sentient Prize Collar"
+ desc = "A collar worn by sentient prizes registered to a SPASM. Although the red text on it shows its disconnected and nonfunctional."
+
+ icon_state = "casinoslave"
+ item_state = "casinoslave"
+ overlay_state = "casinoslave"
+
+ var/slavename = null //Name for system to put on collar description
+ var/ownername = null //Name for system to put on collar description
+ var/slaveckey = null //Ckey for system to check who is the person and ensure no abuse of system or errors
+ var/slaveflavor = null //Description to show on the SPASM
+ var/slaveooc = null //OOC text to show on the SPASM
+
+/obj/item/clothing/accessory/collar/casinoslave/attack_self(mob/user as mob)
+ //keeping it blank so people don't tag and reset collar status
+
+/obj/item/clothing/accessory/collar/casinoslave_fake
+ name = "a Sentient Prize Collar"
+ desc = "A collar worn by sentient prizes registered to a SPASM. This one has been disconnected from the system and is now an accessory!"
+
+ icon_state = "casinoslave_owned"
+ item_state = "casinoslave_owned"
+ overlay_state = "casinoslave_owned"
\ No newline at end of file
diff --git a/code/modules/economy/casinocash.dm b/code/modules/economy/casinocash.dm
new file mode 100644
index 00000000000..25486c33f83
--- /dev/null
+++ b/code/modules/economy/casinocash.dm
@@ -0,0 +1,207 @@
+
+//Original Casino Code created by Shadowfire117#1269 - Ported from CHOMPstation
+//Modified by GhostActual#2055 for use with VOREstation
+
+/obj/machinery/chipmachine
+ name = "Casino Chip Exchange"
+ desc = "Takes all your cash and gives you chips back! No change and half refund!"
+ icon = 'icons/obj/casino.dmi'
+ icon_state ="chipmachine"
+ anchored = 1
+
+/obj/machinery/chipmachine/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I,/obj/item/weapon/spacecash))
+ //consume the money
+ if(prob(50))
+ playsound(loc, 'sound/items/polaroid1.ogg', 50, 1)
+ else
+ playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
+
+ user << "You insert [I] into [src]."
+ spawn_casinochips(round(I:worth/5), src.loc)
+ src.attack_hand(user)
+ qdel(I)
+
+ if(istype(I,/obj/item/weapon/spacecasinocash))
+ //consume the chips
+ if(prob(50))
+ playsound(loc, 'sound/items/polaroid1.ogg', 50, 1)
+ else
+ playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
+
+ user << "You insert [I] into [src]."
+ spawn_money(round(I:worth/5), src.loc)
+ src.attack_hand(user)
+ qdel(I)
+
+/obj/item/weapon/spacecasinocash
+ name = "broken casino chip"
+ desc = "It's worth nothing in a casino."
+ gender = PLURAL
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "spacecasinocash1"
+ opacity = 0
+ density = 0
+ anchored = 0.0
+ force = 1.0
+ throwforce = 1.0
+ throw_speed = 1
+ throw_range = 2
+ w_class = ITEMSIZE_SMALL
+ var/access = list()
+ access = access_crate_cash
+ var/worth = 0
+
+/obj/item/weapon/spacecasinocash/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/spacecasinocash))
+
+ var/obj/item/weapon/spacecasinocash/SC = W
+
+ SC.adjust_worth(src.worth)
+ if(istype(user, /mob/living/carbon/human))
+ var/mob/living/carbon/human/h_user = user
+
+ h_user.drop_from_inventory(src)
+ h_user.drop_from_inventory(SC)
+ h_user.put_in_hands(SC)
+ user << "You combine the casino chips to a stack of [SC.worth] of credits."
+ qdel(src)
+
+/obj/item/weapon/spacecasinocash/update_icon()
+ overlays.Cut()
+ name = "[worth] casino credit\s"
+ if(worth in list(1000,500,200,100,50,20,10,1))
+ icon_state = "spacecasinocash[worth]"
+ desc = "It's a stack of casino chips with a combined value of [worth] credits."
+ return
+ var/sum = src.worth
+ var/num = 0
+ for(var/i in list(1000,500,200,100,50,20,10,1))
+ while(sum >= i && num < 50)
+ sum -= i
+ num++
+ var/image/banknote = image('icons/obj/casino.dmi', "spacecasinocash[i]")
+ var/matrix/M = matrix()
+ M.Translate(rand(-6, 6), rand(-4, 8))
+ M.Turn(pick(-45, -27.5, 0, 0, 0, 0, 0, 0, 0, 27.5, 45))
+ banknote.transform = M
+ src.overlays += banknote
+ if(num == 0) // Less than one credit, let's just make it look like 1 for ease
+ var/image/banknote = image('icons/obj/casino.dmi', "spacecasinocash1")
+ var/matrix/M = matrix()
+ M.Translate(rand(-6, 6), rand(-4, 8))
+ M.Turn(pick(-45, -27.5, 0, 0, 0, 0, 0, 0, 0, 27.5, 45))
+ banknote.transform = M
+ src.overlays += banknote
+ src.desc = "They are worth [worth] of credits."
+
+/obj/item/weapon/spacecasinocash/proc/adjust_worth(var/adjust_worth = 0, var/update = 1)
+ worth += adjust_worth
+ if(worth > 0)
+ if(update)
+ update_icon()
+ return worth
+ else
+ qdel(src)
+ return 0
+
+/obj/item/weapon/spacecasinocash/proc/set_worth(var/new_worth = 0, var/update = 1)
+ worth = max(0, new_worth)
+ if(update)
+ update_icon()
+ return worth
+
+/obj/item/weapon/spacecasinocash/attack_self()
+ var/amount = input(usr, "How much credits worth of chips do you want to take? (0 to [src.worth])", "Take chips", 20) as num
+ if(!src || QDELETED(src))
+ return
+ amount = round(CLAMP(amount, 0, src.worth))
+
+ if(!amount)
+ return
+
+ adjust_worth(-amount)
+ var/obj/item/weapon/spacecasinocash/SC = new (usr.loc)
+ SC.set_worth(amount)
+ usr.put_in_hands(SC)
+
+/obj/item/weapon/spacecasinocash/c1
+ name = "1 credit casino chip"
+ icon_state = "spacecasinocash1"
+ desc = "It's worth 1 credit."
+ worth = 1
+
+/obj/item/weapon/spacecasinocash/c10
+ name = "10 credit casino chip"
+ icon_state = "spacecasinocash10"
+ desc = "It's worth 10 credits."
+ worth = 10
+
+/obj/item/weapon/spacecasinocash/c20
+ name = "20 credit casino chip"
+ icon_state = "spacecasinocash20"
+ desc = "It's worth 20 credits."
+ worth = 20
+
+/obj/item/weapon/spacecasinocash/c50
+ name = "50 credit casino chip"
+ icon_state = "spacecasinocash50"
+ desc = "It's worth 50 credits."
+ worth = 50
+
+/obj/item/weapon/spacecasinocash/c100
+ name = "100 credit casino chip"
+ icon_state = "spacecasinocash100"
+ desc = "It's worth 100 credits."
+ worth = 100
+
+/obj/item/weapon/spacecasinocash/c200
+ name = "200 credit casino chip"
+ icon_state = "spacecasinocash200"
+ desc = "It's worth 200 credits."
+ worth = 200
+
+/obj/item/weapon/spacecasinocash/c500
+ name = "500 credit casino chip"
+ icon_state = "spacecasinocash500"
+ desc = "It's worth 500 credits."
+ worth = 500
+
+/obj/item/weapon/spacecasinocash/c1000
+ name = "1000 credit casino chip"
+ icon_state = "spacecasinocash1000"
+ desc = "It's worth 1000 credits."
+ worth = 1000
+
+/proc/spawn_casinochips(var/sum, spawnloc, mob/living/carbon/human/human_user as mob)
+ var/obj/item/weapon/spacecasinocash/SC = new (spawnloc)
+
+ SC.set_worth(sum)
+ if (ishuman(human_user) && !human_user.get_active_hand())
+ human_user.put_in_hands(SC)
+ return
+
+/obj/item/weapon/casino_platinum_chip
+ name = "platinum chip"
+ desc = "Ringa-a-Ding-Ding!"
+ icon = 'icons/obj/casino.dmi'
+ icon_state = "platinum_chip"
+ var/sides = 2
+ opacity = 0
+ density = 0
+ anchored = 0.0
+ force = 1.0
+ throwforce = 1.0
+ throw_speed = 1
+ throw_range = 2
+ w_class = ITEMSIZE_SMALL
+
+/obj/item/weapon/casino_platinum_chip/attack_self(mob/user as mob)
+ var/result = rand(1, sides)
+ var/comment = ""
+ if(result == 1)
+ comment = "Ace"
+ else if(result == 2)
+ comment = "Joker"
+ user.visible_message("[user] has thrown \the [src]. It lands on [comment]! ", \
+ "You throw \the [src]. It lands on [comment]! ")
\ No newline at end of file
diff --git a/icons/inventory/accessory/item_vr.dmi b/icons/inventory/accessory/item_vr.dmi
index fdb86086483bf622abce753a663cebea5a6e277f..f4b317aba94421fb0304d714d01788c9c680cd70 100644
GIT binary patch
literal 11360
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
F{{fa4mE-^b
literal 3251
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
jOZo_BNUX0?+8zBS%d_EtP_jx18*w`3#$475!
z{0_JQ1c1JB@5=yW0`NTmCjmGIKzn;TA%iPZPT?ILpY-&o7<)GzJr`$oJde^WSP>K&
z2vEE@jwT~nk%w92xHRUe6RE5dDak0NqOhbX8MEEylCqaZZp2M}JJp>Vuo?i1_yagyMbhUL<#*jSYi}%;tRuz}h;mJSJ#MBKoVNIFowt>5<
zVyy*?{jbR`s|)Ue@EC7$fB!#s2rJ^(>3Rz_v
z$JEwqMkd>E!47q$*aO?R5KTuY&gZ+9Fgr!vuGfPa{#|wO0^@MLc+>0U5n&z+6_-9Q
zt665`??rrKJ4*<^AeU;Lt#omGBa}V@*`l6+eI8WP|
zPKOmi^63S$cO!-HnU&wetO#UoNFD0srkd!g((om0orK2UC8yCwed9hj0|0093Pa=tulAb^q1v_{eUyXhmFf4iF
zUD&%5Nzo88FyDMrFS&<`S3eL1wGfB>da0hvB7|#3lud>uJoy9s?qm+fw_l-ID-9el
zCeESLwVXNWzXuU%J4KJ?xL?yB@jKw*fSpZHpoPA2Lx}58Yd#G{v!jou&
zmRbalq1(($g%xID!n|ba%D60jS*y012?k+>%BU#o$d6(Rq2O&96f4fGCOq=1@*u7QGORhS?k1y*z2i`C^{F0h*
zj*C1X#qaB6rp^)nX8M*%f
D-pfpZ
diff --git a/icons/inventory/accessory/mob_vr_teshari.dmi b/icons/inventory/accessory/mob_vr_teshari.dmi
index fce61f2bb899bedbf1ce2a1c8db0c8e277bd1345..45e62b93258482ee7063964e6f7671749beb31dd 100644
GIT binary patch
literal 2371
zcmbW&e^gUd902e;c5MDaR0=&goSq^zAOcLlAFL3LVz`k~K_X(7v=GK`(1JHpBFQ7>
z52k{R{J{zWhLMy!-GV~{7jbkc$j?ZAxMU1r+k?Hmce{@x9K@4<@OHlE-gnR2yPx~L
z_q!bl7HqPe{o-r@fNkJr|7`%+NSK((MkDL&eHNf5IXEaJK&4WlZgzIIL?VH}6MDkZ
z0sx^WIQs`=?qP9paeI3^4gd~T<6sXC&XfcE6u_ea?gwytH0+6k_i%6+2N!UFUjTR_
zz=Hw4!UhNHagd6G0yO+Hz>fl41n?k$y8-&TJB?;#C2bRI2XFQ^??rvD10kVF{vRjq
zNf5;)iNvu0q~+^#%VQ6{{(L~x$m~-;uJrhQ{^DyPM~db)xGl49YtH_9!PT!UL}tn-
zwN9>Y=gnAtsjpbm_2_daeBM$*n6*doneWK?Pf9$J2j?qnA6+jl%I{y~ZrZTwudr*4
znaOQOZiJsddKY)yk{&i1aruLF>vf;GxneJDbUb+H=8n6Uq?x_qjgEAjsbq1~5>KO_
z-$IWxb=doft*bKcCSKpVfpornYp>b=#WxN)Hw0AF)?e!^X)9_8ZCK~7zpQJzq;O8NYEf^V1m%~}Zx-#m7Z%Rb9uK0d4jo9^f9Rvq8IOneZZk?>si
zT=m>;Zk^BZmuwzRTs@^amuL%T3`?faoeEgK|LEf(eAoFY;))JpO*&ix4;=&Q7uP|Jn2b|bWS=EI(N
z%GH3WST^HdoM?A^q$j$JsZ~mvjI&g=!5jFed3AnPGsJXly5#AOEh6T0oFqs
zlviLC!7^3eup575qTP4$=gzEF6WzzdstujgO}Yirrp_#9NaptB5SaDiMc6~}ltFzO
z!ZezAU}?-+$bxj40gjj;Ojq%%N3A)xSpqmD#ZHsEImPK+bl_
zfeE}gNi?B_Z1fz58(A-dk|nGO!sAZCouQbc;;tDb_Y9+I<%$l%Fh**a{X(=dr}7~s
z)>Jy}tiv)I78zYB&ObTu-5X_T-whA9w>q1pPA>ghVP9*f8&OkDS733$16i4eatT)I
z&b6vz8IQwv>XbmS^=<}AQ6;&DyVQY`>*T@}@Zp2++wA6S($bIOf8{wGlT#;8Ch%SI
zgGjl&CnMB5Wzg=qlQw%`RaFt
zpCWg6eb}PJU68n^0!w}uiHng~%UaXDX%d>jKMNkdYY_tv7xH0mA%c5pX?+ZW$I7Xy
zDgaO1VcwWV1C39U=;4(DDIVeUk|4OVA3$TDl_w
zt-xGJQ52f3zY@1QGf%Ocf18zJ)J}@0j*ukgig~O!c=!J<@K(6&?uxXGW@RzkmT%5E
zb`zz3wVub5qSU9g@O@UH)CX!vi4H6odTA1x!9NQw5Pr?T1#%gd@*aZ!B!X5P!TYpy
zZ2*G5R!C_y2p)cQ8t{LM#^9e?Mw^weqxfaw*~v0IfwTvpfLoE%O{;fx>ufI@z#NL7ABtBPSu()GTobMAIN!R
z4d;gDDhAh6R;d)N9uFeR%9ulP-rU)NRxr3mZ_uA6ckeFiNmnIFY)8MDr?@Da6#w(%
zr0vwxi%GKf;K#G(klIGR_ev!FtpZC6MbaA4lycqC!3p9tALosO$J=MX;}fKFONe;zkS
A2LJ#7
literal 678
zcmeAS@N?(olHy`uVBq!ia0y~yU~~Xt1r}zYh`HDH!$3+az$e7@z<~omW>;5NLqo%V
z2IF-L82^;GBB0|`2{mLJiCzw@d4Uggs#~+Xt3G8q{N%IvEqss5a(BRoN$HhgYtniwj@)|5U>LUh
z%*ALer>=b`7AgPInss2y-qPqxAtAm$Yag-usx(_&~y
zH^^FA9BUu3&y=ff;XIS&W%KH1hAfYro$uew99rdA^6S~p3P(`5Su854kJ$I0`%~!0
zfA3$}fQ0^szx=0vX8ODThiY{8K6w8bBv!EU(%;0N|IYsgYnlgCasKzg-_IF=QV)Wb
z{yzNsd;R9kpVr^wX99|RaPj(H|MB<1$Pe6(_2U2kKdvl(HD_+W@2tb?|E)7V|9_IV
z_?i7>_IeR7Wj;22KMRWcfD4fqg#Q(;pmUGKlY{=ld`zL$PgUtNbKX`zKF!Zn7D%s0@cK8cDq_Y+C5$U
KT-G@yGywqLq&zqP
diff --git a/icons/obj/64x64.dmi b/icons/obj/64x64.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..db555529a7ec9a14d9e10be8c1eff2dacf75a78c
GIT binary patch
literal 21003
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
bPm_PHZhL%mit|-azKGf$856-H(@*^m_AfI*
literal 0
HcmV?d00001
diff --git a/icons/obj/casino.dmi b/icons/obj/casino.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..17405361e249d8b4bc2f112654d5eb9fc46076dd
GIT binary patch
literal 54768
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