From a5f0b88225ec996b294c584c4c0ba0eaf14bdf0f Mon Sep 17 00:00:00 2001 From: Shadowfire117 Date: Mon, 22 Jul 2019 01:59:43 +0200 Subject: [PATCH 1/6] Heres the big one folks, the casino! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New space map with room to add more interesting event places! ((Will be revealed when event happens ;3)) Casino ship! It has waiting lounge, medbay, security wing, engineering closet, janitor closet, emergency eva storage, bar, stripper poles and lap dance rooms, large gambling area, exchange booth, several dorms, staff only area with staff R&R, restroom and showers, cockpit and the casino managers private quarters! ((As above)) Casino shuttle! That’s right, gamblers and casino staff can be brought back and forth easily enough in a comfortable casino shuttle! ((As above above)) Casino roulette table, its fully functional with rolling and even nice sound to fill the atmosphere with that rolling ball! Casino card table, a three parts table for a dealer to work at with up to 3 or even 5 players to sit at! Casino slot machine, it eats chips and sometimes spits out rewards when you get three of a kind! Also got a lovely little sound effect when you win! Casino chips, they work like similarly to thalers but has can only be used for slot machine and gambling and rewards in casino, Theres chips for values of 1, 10, 20, 50, 100, 200, 500 and 1000! A fancy casino platinum chip that looks pretty fancy! The wheel of fortune, its interval for roll results can be adjusted on the fly to suit how many lottery entries there are or for other events! Stripper pole, finally people can dance and grind on a pole, interacting with the pole makes the dancer swing around and move in front or behind the pole! Three special bluespace deluxe machines for drinking and dining! - The deluxe dispenser, this bad boy can hold up to 90 cartridges and can restock anything the soft drink, hard drink and coffe dispensers can do, and even more! - The deluxe dining distributor, holds a big variety of food and also tools and gear for a chef, nice and compact storage! - The deluxe drink distributor, this one holds a lot more drinks than the standard booze o mat, and there’s not much one can’t mix with this and the deluxe dispenser! A fancy new jukebox! This one plays music specifically for the casino unlike the normal jukebox! A looong manual on how to play casino games, get prizes, even got info for casino staff and also ooc info! --- code/game/area/Space Station 13 areas.dm | 24 +- code/game/machinery/casino.dm | 841 ++++++++++++++++++ code/game/machinery/jukebox.dm | 22 + code/modules/economy/casinocash.dm | 173 ++++ code/modules/media/media_tracks.dm | 5 +- .../reagents/dispenser/cartridge_presets.dm | 42 + icons/obj/casino.dmi | Bin 0 -> 46304 bytes maps/northern_star/northern_star.dm | 2 +- maps/northern_star/northern_star_shuttles.dm | 6 +- maps/northern_star/polaris-1.dmm | 25 +- maps/northern_star/polaris-6.dmm | 655 ++++++++++++++ sound/machines/roulette.ogg | Bin 0 -> 143391 bytes sound/machines/slotmachine.ogg | Bin 0 -> 36503 bytes vorestation.dme | 2 + 14 files changed, 1773 insertions(+), 24 deletions(-) create mode 100644 code/game/machinery/casino.dm create mode 100644 code/modules/economy/casinocash.dm create mode 100644 icons/obj/casino.dmi create mode 100644 maps/northern_star/polaris-6.dmm create mode 100644 sound/machines/roulette.ogg create mode 100644 sound/machines/slotmachine.ogg diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 4103bcd500..95974c5334 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -476,17 +476,27 @@ area/space/atmosalert() - - - - - - - /area/casino/casino_ship name = "\improper Casino Ship" icon_state = "yellow" requires_power = 0 + dynamic_lighting = 0 + +/area/casino/casino_ship/wing_left + name = "\improper Casino Ship left wing" + icon_state = "yellow" + +/area/casino/casino_ship/wing_right + name = "\improper Casino Ship right wing" + icon_state = "yellow" + +/area/casino/casino_ship/dorms + name = "\improper Casino Ship dorms" + icon_state = "yellow" + +/area/casino/casino_ship/cockpit + name = "\improper Casino Ship left wing" + icon_state = "yellow" /area/planet/clown name = "\improper Clown Planet" diff --git a/code/game/machinery/casino.dm b/code/game/machinery/casino.dm new file mode 100644 index 0000000000..d2e837b094 --- /dev/null +++ b/code/game/machinery/casino.dm @@ -0,0 +1,841 @@ +#define DISPENSER_MAX_CARTRIDGES 90 + +/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" + +/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" + +/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 + var/busy = 0 + var/symbol1 = null + var/symbol2 = null + var/symbol3 = null + +/obj/machinery/slot_machine/attackby(obj/item/weapon/W as obj, mob/user as mob) + + 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) + nanomanager.update_uis(src) + return // don't smack that machine with your 2 chips + +/obj/machinery/slot_machine/proc/insert_chip(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user) + 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 + + visible_message("\ [user] puts 5 credits in the slot machine and presses start.") + cashmoney.worth -= 5 + + if(cashmoney.worth <= 0) + usr.drop_from_inventory(cashmoney) + qdel(cashmoney) + cashmoney.update_icon() + + busy = 1 + icon_state = "slotmachine_rolling" + + var/slot1 = rand(0,9) + switch(slot1) + if(0 to 2) symbol1 = "cherry" + if(3 to 3) symbol1 = "lemon" + if(4 to 4) symbol1 = "watermelon" + 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,9) + switch(slot2) + if(0 to 2) symbol2 = "cherry" + if(3 to 3) symbol2 = "lemon" + if(4 to 4) symbol2 = "watermelon" + if(5 to 5) symbol2 = "bell" + if(6 to 6) symbol2 = "four leaf clover" + if(7 to 7) symbol2 = "seven" + if(8 to 8) symbol2 = "diamond" + if(9 to 9) symbol2 = "platinum coin" + + var/slot3 = rand(0,9) + switch(slot3) + if(0 to 2) symbol3 = "cherry" + if(3 to 3) symbol3 = "lemon" + if(4 to 4) symbol3 = "watermelon" + 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/delaytime = 5 SECONDS // Put this somewhere else I'm just proving a point >:C + + + spawn(delaytime) + visible_message("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 + + if (symbol1 == "diamond" && symbol2 == "diamond" && symbol3 == "diamond") + output = "Three diamonds! The slot machine deposits a 1000 credit chip!" + winnings = 1000 + + if (symbol1 == "platinum coin" && symbol2 == "platinum coin" && symbol3 == "platinum coin") + output = "Three platinum coins! The slot machine deposits a platinum chip!" + platinumwin = 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. + visible_message("Better luck next time!") + busy = FALSE + return + + visible_message(output) //Output message + + if(platinumwin) // Did they win the platinum chip? + new /obj/item/weapon/casin_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" + + busy = FALSE //Set busy to false, we're done here fam. + + +/obj/structure/wheel_of_fortune + name = "wheel of fortune" + desc = "May fortune favour the lucky one!" + icon = 'icons/obj/casino.dmi' + icon_state = "wheel_of_fortune" + density = 1 + anchored = 1 + var/interval = 1 + var/busy = 0 + +/obj/structure/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-100)", "Set Interval") as num + if(interval>100 || interval<1) + usr << "Invalid interval." + return + usr << "You set the interval to [interval]" + return + + +/obj/structure/wheel_of_fortune/attack_hand(mob/user as mob) + if (busy) + to_chat(user,"The wheel of fortune is already spinning! ") + return + visible_message("\ [user] spins the wheel of fortune!") + busy = 1 + icon_state = "wheel_of_fortune_spinning" + var/result = rand(1,interval) + add_fingerprint(user) + spawn(5 SECONDS) + visible_message("The wheel of fortune stops spinning, the number is [result]!") + busy=0 + icon_state = "wheel_of_fortune" + +/obj/structure/stripper_pole + name = "stripper pole" + icon = 'icons/obj/casino.dmi' + icon_state = "stripper_pole" + plane = MOB_PLANE + layer = BELOW_MOB_LAYER + density = 0 + +/obj/structure/stripper_pole/attack_hand(mob/user) + dance(user) + user.spin(32,2) + ..() + +/obj/structure/stripper_pole/proc/dance(mob/user) + if(layer == BELOW_MOB_LAYER) + layer = ABOVE_MOB_LAYER + else + layer = BELOW_MOB_LAYER + +/obj/machinery/chemical_dispenser/deluxe + name = "deluxe drink dispenser" + desc = "The premium within dispenser for drinks, its made with bluespace technology!" + icon = 'icons/obj/casino.dmi' + icon_state = "deluxe_dispenser" + ui_title = "Deluxe Drink Dispenser" + accept_drinking = 1 + + +/obj/machinery/chemical_dispenser/deluxe + dispense_reagents = list( + "water", "ice", "coffee", "cream", "tea", "icetea", "cola", "spacemountainwind", "dr_gibb", "space_up", "tonic", + "sodawater", "lemon_lime", "sugar", "orangejuice", "limejuice", "watermelonjuice", "thirteenloko", "grapesoda", + "coffee", "cafe_latte", "soy_latte", "hot_coco", "milk", "cream", "tea", "ice", "orangejuice", "lemonjuice", + "limejuice", "berryjuice", "mint", "matcha_latte", "lemon_lime", "sugar", "orangejuice", "limejuice", "sodawater", + "tonic", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequilla", "vermouth", "cognac", + "ale", "mead", "bitters", "champagne", "singulo", "doctor_delight", "nothing", "banana", "honey", "egg", + "coco", "cherryjelly", "carrot", "apple", "tomato", "nutbutter", "soymilk", "grenadine", "gingerale", "royrogers", + "patron", "goldschlager", "gelatin", "melonliquor", "bluecuracao", "thirteenloko", "deadrum", "sake", "acidspit", + "amasec", "beepsky_smash", "atomicbomb", "nuka_cola", "threemileisland", "manhattan_proj", "psilocybin", "moonshine", + "specialwhiskey", "unathiliquor", "winebrandy", "snaps" + ) + +/obj/machinery/chemical_dispenser/deluxe/full + spawn_cartridges = list( + /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/matcha_latte, + /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/wine, + /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/ale, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/mead, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/champagne, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/grapesoda, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/singulo, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/doctor_delight, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/nothing, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/banana, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/honey, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/egg, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/coco, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/cherryjelly, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/carrot, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/apple, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/tomato, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/nutbutter, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/soymilk, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/grenadine, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/gingerale, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/royrogers, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/patron, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/goldschlager, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/gelatin, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/melonliquor, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/bluecuracao, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/thirteenloko, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/deadrum, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/sake, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/acidspit, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/amasec, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/beepsky_smash, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/atomicbomb, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/nuka_cola, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/threemileisland, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/manhattan_proj, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/psilocybin, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/moonshine, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/specialwhiskey, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/unathiliquor, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/winebrandy, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/snaps + ) + +/obj/machinery/chemical_dispenser/deluxe/New() + ..() + + if(spawn_cartridges) + for(var/type in spawn_cartridges) + add_cartridge_deluxe(new type(src)) + +/obj/machinery/chemical_dispenser/deluxe/examine(mob/user) + user << desc + user << "It has [cartridges.len] cartridges installed, and has space for [DISPENSER_MAX_CARTRIDGES - cartridges.len] more." + +/obj/machinery/chemical_dispenser/deluxe/proc/add_cartridge_deluxe(obj/item/weapon/reagent_containers/chem_disp_cartridge/C, mob/user) + if(!istype(C)) + if(user) + user << "\The [C] will not fit in \the [src]!" + return + + if(cartridges.len >= DISPENSER_MAX_CARTRIDGES) + if(user) + user << "\The [src] does not have any slots open for \the [C] to fit into!" + return + + if(!C.label) + if(user) + user << "\The [C] does not have a label!" + return + + if(cartridges[C.label]) + if(user) + user << "\The [src] already contains a cartridge with that label!" + return + + if(user) + user.drop_from_inventory(C) + user << "You add \the [C] to \the [src]." + + C.loc = src + cartridges[C.label] = C + cartridges = sortAssoc(cartridges) + nanomanager.update_uis(src) + +/obj/machinery/chemical_dispenser/deluxe/attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/weapon/wrench)) + playsound(src, W.usesound, 50, 1) + user << "You begin to [anchored ? "un" : ""]fasten \the [src]." + if (do_after(user, 20 * W.toolspeed)) + user.visible_message( + "\The [user] [anchored ? "un" : ""]fastens \the [src].", + "You have [anchored ? "un" : ""]fastened \the [src].", + "You hear a ratchet.") + anchored = !anchored + else + user << "You decide not to [anchored ? "un" : ""]fasten \the [src]." + + else if(istype(W, /obj/item/weapon/reagent_containers/chem_disp_cartridge)) + add_cartridge_deluxe(W, user) + + else if(istype(W, /obj/item/weapon/screwdriver)) + var/label = input(user, "Which cartridge would you like to remove?", "Chemical Dispenser") as null|anything in cartridges + if(!label) return + var/obj/item/weapon/reagent_containers/chem_disp_cartridge/C = remove_cartridge(label) + if(C) + user << "You remove \the [C] from \the [src]." + C.loc = loc + playsound(src, W.usesound, 50, 1) + + else if(istype(W, /obj/item/weapon/reagent_containers/glass) || istype(W, /obj/item/weapon/reagent_containers/food)) + if(container) + user << "There is already \a [container] on \the [src]!" + return + + var/obj/item/weapon/reagent_containers/RC = W + + if(!accept_drinking && istype(RC,/obj/item/weapon/reagent_containers/food)) + user << "This machine only accepts beakers!" + return + + if(!RC.is_open_container()) + user << "You don't see how \the [src] could dispense reagents into \the [RC]." + return + + container = RC + user.drop_from_inventory(RC) + RC.loc = src + user << "You set \the [RC] on \the [src]." + nanomanager.update_uis(src) // update all UIs attached to src + + else + return ..() + +/obj/machinery/vending/deluxe_boozeomat + name = "Deluxe Drink Distributor" + desc = "A top of the line and experimental drink vendor, it uses bluespace technology for storage!" + icon = 'icons/obj/casino.dmi' + icon_state = "deluxe_boozeomat" + icon_deny = "deluxe_boozeomat_deny" + products = list(/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/metaglass = 25, + /obj/item/weapon/reagent_containers/food/drinks/metaglass/metapint = 25, + /obj/item/weapon/glass_extra/stick = 50, + /obj/item/weapon/glass_extra/straw = 50, + /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/snaps = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 50, + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 50, + /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, + /obj/item/weapon/reagent_containers/food/drinks/flask/barflask = 10, + /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask = 10) + + contraband = list() + vend_delay = 15 + idle_power_usage = 300 + req_access = list(access_bar) + req_log_access = access_bar + has_logs = 1 + + +/obj/machinery/vending/deluxe_dinner + name = "Deluxe Dining Distributor" + desc = "A top of the line and experimental food vendor, it uses bluespace technology for storage!" + icon = 'icons/obj/casino.dmi' + icon_state = "deluxe_dining" + icon_deny = "deluxe_dining_deny" + products = list(/obj/item/weapon/tray = 8, + /obj/item/weapon/material/kitchen/utensil/fork = 15, + /obj/item/weapon/material/knife/plastic = 15, + /obj/item/weapon/material/kitchen/utensil/spoon = 15, + /obj/item/weapon/material/kitchen/rollingpin = 5, + /obj/item/weapon/material/knife = 5, + /obj/item/weapon/material/knife/butch = 3, + /obj/item/clothing/suit/chef/classic = 3, + /obj/item/weapon/storage/bag/food = 3, + /obj/item/weapon/storage/toolbox/lunchbox = 10, + /obj/item/weapon/storage/toolbox/lunchbox/heart = 10, + /obj/item/weapon/storage/toolbox/lunchbox/cat = 10, + /obj/item/weapon/storage/toolbox/lunchbox/nt = 10, + /obj/item/weapon/storage/toolbox/lunchbox/mars = 10, + /obj/item/weapon/storage/toolbox/lunchbox/cti = 10, + /obj/item/weapon/storage/toolbox/lunchbox/nymph = 10, + /obj/item/weapon/storage/toolbox/lunchbox/syndicate = 10, + /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/tamales = 30, + /obj/item/weapon/reagent_containers/food/snacks/bigos = 30, + /obj/item/weapon/reagent_containers/food/snacks/concha = 30, + /obj/item/weapon/reagent_containers/food/snacks/pandenata = 30, + /obj/item/weapon/reagent_containers/food/snacks/tocino = 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/cookie = 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 = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake = 10) + + contraband = list() + vend_delay = 15 + idle_power_usage = 300 + req_access = list(access_bar) + req_log_access = access_bar + has_logs = 1 + + +/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" + title = "A dummy guide to losing your thalers" + dat = {" + + + + + +

Contents

+
    +
  1. Foreword: Welcome to gambling!
  2. +
  3. Blackjack
  4. +
  5. Roulette
  6. +
  7. Poker
  8. +
  9. Prizes
  10. +
  11. Sentient prizes
  12. +
+
+

Foreword: Welcome to gambling!

+ 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.) + +

Blackjack

+ 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: + + 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. + + 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. + + 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! + +

Roulette

+ 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 something 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: + + 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! + +

Poker

+ 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! + + 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! + +

Prizes

+ + 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
+ 10 Thalers = 1 casino chip
+ 1 casino chip = 5 Thalers

+ + The special sentient prize is 100 chips! More about it in section below!

+ + Melee weapons + + 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!)) + + Gear + + Accessories + + Masks - ALL MASK ARE 50 except chameleon! + + Costumes - All costumes are 150! + + Toys and misc - ALL THESE ARE 50 + + Booze - ALL BOOZE IS 50 + + 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: +
    +
  1. First get the thalers or chips for payment.
  2. +
  3. 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!
  4. +
  5. 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))
  6. +
  7. Once written down, you just put the paper back in the folder and hand over the prize!
  8. +
+ ((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!)) + +

Sentient prizes

+ 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 250 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!

+ + ((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/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 8ffcb5cec4..4ebef2b336 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -13,6 +13,7 @@ icon = 'icons/obj/jukebox.dmi' icon_state = "jukebox2-nopower" var/state_base = "jukebox2" + var/jukebox_edition = "default" anchored = 1 density = 1 power_channel = EQUIP @@ -33,6 +34,12 @@ var/list/datum/track/tracks = list() // Available tracks var/list/datum/track/secret_tracks = list() // Only visible if hacked +/obj/machinery/media/jukebox/casinojukebox + name = "space casino jukebox" + icon = 'icons/obj/casino.dmi' + icon_state = "casinojukebox-nopower" + state_base = "casinojukebox" + /obj/machinery/media/jukebox/New() ..() default_apply_parts() @@ -58,6 +65,21 @@ tracks |= T return +// On initialization, copy our tracks from the global list +/obj/machinery/media/jukebox/casinojukebox/initialize() + . = ..() + if(all_jukebox_tracks.len < 1) + stat |= BROKEN // No tracks configured this round! + return + // Ootherwise load from the global list! + for(var/datum/track/T in all_jukebox_tracks) + if(!T.casino) + tracks -= T + secret_tracks -= T + if(T.casino) + tracks |= T + return + /obj/machinery/media/jukebox/process() if(!playing) return diff --git a/code/modules/economy/casinocash.dm b/code/modules/economy/casinocash.dm new file mode 100644 index 0000000000..cefa530164 --- /dev/null +++ b/code/modules/economy/casinocash.dm @@ -0,0 +1,173 @@ +/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)) + if(istype(W, /obj/item/weapon/spacecasinocash/ewallet)) return 0 + + 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 + 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/spacecasinocash/ewallet + name = "Casino chip card" + icon_state = "efundcard" + desc = "A casino card that can hold credits." + var/owner_name = "" //So the ATM can set it so the EFTPOS can put a valid name on transactions. + attack_self() return //Don't act + attackby() return //like actual + update_icon() return //space cash + +/obj/item/weapon/spacecasinocash/ewallet/examine(mob/user) + ..(user) + if (!(user in view(2)) && user!=src.loc) return + user << "Casino chip card's owner: [src.owner_name]. credits remaining: [src.worth]." + +/obj/item/weapon/casin_platinum_chip + name = "platinum chip" + desc = "Ringa-a-Ding-Ding!" + icon = 'icons/obj/casino.dmi' + icon_state = "platinum_chip" + opacity = 0 + density = 0 + anchored = 0.0 + force = 1.0 + throwforce = 1.0 + throw_speed = 1 + throw_range = 2 + w_class = ITEMSIZE_SMALL \ No newline at end of file diff --git a/code/modules/media/media_tracks.dm b/code/modules/media/media_tracks.dm index 6544e62571..f3e401c7dc 100644 --- a/code/modules/media/media_tracks.dm +++ b/code/modules/media/media_tracks.dm @@ -9,15 +9,17 @@ var/artist // Song's creator var/duration // Song length in deciseconds var/secret // Show up in regular playlist or secret playlist? + var/casino // Music for casino jukebox var/lobby // Be one of the choices for lobby music? -/datum/track/New(var/url, var/title, var/duration, var/artist = "", var/secret = 0, var/lobby = 0) +/datum/track/New(var/url, var/title, var/duration, var/artist = "", var/secret = 0, var/lobby = 0, var/casino = 0) src.url = url src.title = title src.artist = artist src.duration = duration src.secret = secret src.lobby = lobby + src.casino = casino /datum/track/proc/display() var str = "\"[title]\"" @@ -58,6 +60,7 @@ var/global/list/all_lobby_tracks = list() if(istext(entry["artist"])) T.artist = entry["artist"] T.secret = entry["secret"] ? 1 : 0 + T.casino = entry["casino"] ? 1 : 0 T.lobby = entry["lobby"] ? 1 : 0 all_jukebox_tracks += T if(T.lobby) diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index 925a2c2519..261ed5ef3f 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -103,3 +103,45 @@ chloral spawn_reagent = "chloralhydrate" cryoxadone spawn_reagent = "cryoxadone" clonexadone spawn_reagent = "clonexadone" + + // Chems that are used but not meant for cargo supplies, at least for now. + champagne spawn_reagent = "champagne" + grapesoda spawn_reagent = "grapesoda" + singulo spawn_reagent = "singulo" + doctor_delight spawn_reagent = "doctor_delight" + nothing spawn_reagent = "nothing" + banana spawn_reagent = "banana" + honey spawn_reagent = "honey" + egg spawn_reagent = "egg" + coco spawn_reagent = "coco" + cherryjelly spawn_reagent = "cherryjelly" + carrot spawn_reagent = "carrot" + apple spawn_reagent = "apple" + tomato spawn_reagent = "tomato" + nutbutter spawn_reagent = "nutbutter" //ha + soymilk spawn_reagent = "soymilk" + grenadine spawn_reagent = "grenadine" + gingerale spawn_reagent = "gingerale" + royrogers spawn_reagent = "royrogers" + patron spawn_reagent = "patron" + goldschlager spawn_reagent = "goldschlager" + gelatin spawn_reagent = "gelatin" + melonliquor spawn_reagent = "melonliquor" + bluecuracao spawn_reagent = "bluecuracao" + thirteenloko spawn_reagent = "thirteenloko" + deadrum spawn_reagent = "deadrum" + sake spawn_reagent = "sake" + acidspit spawn_reagent = "acidspit" + amasec spawn_reagent = "amasec" + beepsky_smash spawn_reagent = "beepsky_smash" + atomicbomb spawn_reagent = "atomicbomb" + nuka_cola spawn_reagent = "nuka_cola" + threemileisland spawn_reagent = "threemileisland" + manhattan_proj spawn_reagent = "manhattan_proj" + psilocybin spawn_reagent = "psilocybin" + moonshine spawn_reagent = "moonshine" + specialwhiskey spawn_reagent = "specialwhiskey" + unathiliquor spawn_reagent = "unathiliquor" + winebrandy spawn_reagent = "winebrandy" + snaps spawn_reagent = "snaps" + \ No newline at end of file diff --git a/icons/obj/casino.dmi b/icons/obj/casino.dmi new file mode 100644 index 0000000000000000000000000000000000000000..12af34017fdd2dc1fe84b969b94fae12ef8c903c GIT binary patch literal 46304 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