diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 02ce1451c22..cc17e337791 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -462,3 +462,15 @@ /// from /obj/plunger_act when an object is being plungered #define COMSIG_PLUNGER_ACT "plunger_act" + +/// from /obj/structure/cursed_slot_machine/handle_status_effect() when someone pulls the handle on the slot machine +#define COMSIG_CURSED_SLOT_MACHINE_USE "cursed_slot_machine_use" + #define SLOT_MACHINE_USE_CANCEL (1<<0) //! we've used up the number of times we may use this slot machine. womp womp. + #define SLOT_MACHINE_USE_POSTPONE (1<<1) //! we haven't used up all our attempts to gamble away our life but we should chill for a few seconds + +/// from /obj/structure/cursed_slot_machine/determine_victor() when someone loses. +#define COMSIG_CURSED_SLOT_MACHINE_LOST "cursed_slot_machine_lost" + +/// from /obj/structure/cursed_slot_machine/determine_victor() when someone finally wins. +#define COMSIG_GLOB_CURSED_SLOT_MACHINE_WON "cursed_slot_machine_won" + diff --git a/code/datums/status_effects/_status_effect.dm b/code/datums/status_effects/_status_effect.dm index 4a9e916941b..b8d77db4ff7 100644 --- a/code/datums/status_effects/_status_effect.dm +++ b/code/datums/status_effects/_status_effect.dm @@ -205,3 +205,4 @@ /atom/movable/screen/alert/status_effect/Destroy() attached_effect = null //Don't keep a ref now return ..() + diff --git a/code/datums/status_effects/debuffs/cursed.dm b/code/datums/status_effects/debuffs/cursed.dm new file mode 100644 index 00000000000..2ee7266f7b9 --- /dev/null +++ b/code/datums/status_effects/debuffs/cursed.dm @@ -0,0 +1,193 @@ +#define DEFAULT_MAX_CURSE_COUNT 5 + +/// Status effect that gives the target miscellanous debuffs while throwing a status alert and causing them to smoke from the damage they're incurring. +/// Purposebuilt for cursed slot machines. +/datum/status_effect/grouped/cursed + id = "cursed" + alert_type = /atom/movable/screen/alert/status_effect/cursed + /// The max number of curses a target can incur with this status effect. + var/max_curse_count = DEFAULT_MAX_CURSE_COUNT + /// The amount of times we have been "applied" to the target. + var/curse_count = 0 + /// Raw probability we have to deal damage this tick. + var/damage_chance = 10 + /// Are we currently in the process of sending a monologue? + var/monologuing = FALSE + /// The hand we are branded to. + var/obj/item/bodypart/branded_hand = null + /// The cached path of the particles we're using to smoke + var/smoke_path = null + +/datum/status_effect/grouped/cursed/on_apply() + RegisterSignal(owner, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_changed)) + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + RegisterSignal(owner, COMSIG_CURSED_SLOT_MACHINE_USE, PROC_REF(check_curses)) + RegisterSignal(owner, COMSIG_CURSED_SLOT_MACHINE_LOST, PROC_REF(update_curse_count)) + RegisterSignal(SSdcs, COMSIG_GLOB_CURSED_SLOT_MACHINE_WON, PROC_REF(clear_curses)) + return ..() + +/datum/status_effect/grouped/cursed/Destroy() + UnregisterSignal(SSdcs, COMSIG_GLOB_CURSED_SLOT_MACHINE_WON) + branded_hand = null + return ..() + +/// Checks the number of curses we have and returns information back to the slot machine. `max_curse_amount` is set by the slot machine itself. +/datum/status_effect/grouped/cursed/proc/check_curses(max_curse_amount) + SIGNAL_HANDLER + if(curse_count >= max_curse_amount) + return SLOT_MACHINE_USE_CANCEL + + if(monologuing) + to_chat(owner, span_warning("Your arm is resisting your attempts to pull the lever!")) // listening to kitschy monologues to postpone your powergaming is the true curse here. + return SLOT_MACHINE_USE_POSTPONE + +/// Handles the debuffs of this status effect and incrementing the number of curses we have. +/datum/status_effect/grouped/cursed/proc/update_curse_count() + SIGNAL_HANDLER + curse_count++ + + linked_alert?.update_appearance() // we may have not initialized it yet + + addtimer(CALLBACK(src, PROC_REF(handle_after_effects), 1 SECONDS)) // give it a second to let the failure sink in before we exact our toll + +/// Makes a nice lorey message about the curse level we're at. I think it's nice +/datum/status_effect/grouped/cursed/proc/handle_after_effects() + if(QDELETED(src)) + return + + monologuing = TRUE + var/list/messages = list() + switch(curse_count) + if(1) // basically your first is a "freebie" that will still require urgent medical attention and will leave you smoking forever but could be worse tbh + if(ishuman(owner)) + var/mob/living/carbon/human/human_owner = owner + playsound(human_owner, SFX_SEAR, 50, TRUE) + var/obj/item/bodypart/affecting = human_owner.get_active_hand() + branded_hand = affecting + affecting.force_wound_upwards(/datum/wound/burn/severe/cursed_brand, wound_source = "curse of the slot machine") + + messages += span_boldwarning("Your hand burns, and you quickly let go of the lever! You feel a little sick as the nerves deaden in your hand...") + messages += span_boldwarning("Some smoke appears to be coming out of your hand now, but it's not too bad...") + messages += span_boldwarning("Fucking stupid machine.") + + if(2) + messages += span_boldwarning("The machine didn't burn you this time, it must be some arcane work of the brand recognizing a source...") + messages += span_boldwarning("Blisters and boils start to appear over your skin. Each one hissing searing hot steam out of its own pocket...") + messages += span_boldwarning("You understand that the machine tortures you with its simplistic allure. It can kill you at any moment, but it derives a sick satisfaction at forcing you to keep going.") + messages += span_boldwarning("If you could get away from here, you might be able to live with some medical supplies. Is it too late to stop now?") + messages += span_boldwarning("As you shut your eyes to dwell on this conundrum, the brand surges in pain. You shudder to think what might happen if you go unconscious.") + + if(3) + owner.emote("cough") + messages += span_boldwarning("Your throat becomes to feel like it's slowly caking up with sand and dust. You eject the contents of the back of your throat onto your sleeve.") + messages += span_boldwarning("It is sand. Crimson red. You've never felt so thirsty in your life, yet you don't trust your own hand to carry the glass to your lips.") + messages += span_boldwarning("You get the sneaking feeling that if someone else were to win, that it might clear your curse too. Saving your life is a noble cause.") + messages += span_boldwarning("Of course, you might have to not speak on the nature of this machine, in case they scamper off to leave you to die.") + messages += span_boldwarning("Is it truly worth it to condemn someone to this fate to cure the manifestation of your own hedonistic urges? You'll have to decide quickly.") + + if(4) + messages += span_boldwarning("A migraine swells over your head as your thoughts become hazy. Your hand desperately inches closer towards the slot machine for one final pull...") + messages += span_boldwarning("The ultimate test of mind over matter. You can jerk your own muscle back in order to prevent a terrible fate, but your life already is worth so little now.") + messages += span_boldwarning("This is what they want, is it not? To witness your failure against itself? The compulsion carries you forward as a sinking feeling of dread fills your stomach.") + messages += span_boldwarning("Paradoxically, where there is hopelessness, there is elation. Elation at the fact that there's still enough power in you for one more pull.") + messages += span_boldwarning("Your legs desperate wish to jolt away on the thought of running away from this wretched machination, but your own arm remains complacent in the thought of seeing spinning wheels.") + messages += span_userdanger("The toll has already been exacted. There is no longer death on 'your' terms. Is your dignity worth more than your life?") + + if(5 to INFINITY) + if(max_curse_count != DEFAULT_MAX_CURSE_COUNT) // this probably will only happen through admin schenanigans letting people stack up infinite curses or something + to_chat(owner, span_boldwarning("Do you still think you're in control?")) + return + + to_chat(owner, span_userdanger("Why couldn't I get one more try?!")) + owner.investigate_log("has been gibbed by the cursed status effect after accumulating [curse_count] curses.", INVESTIGATE_DEATHS) + owner.gib() + qdel(src) + return + + for(var/message in messages) + to_chat(owner, message) + sleep(1.5 SECONDS) // yes yes a bit fast but it can be a lot of text and i want the whole thing to send before the cooldown on the slot machine might expire + monologuing = FALSE + +/// Cleans ourselves up and removes our curses. Meant to be done in a "positive" way, when the curse is broken. Directly use qdel otherwise. +/datum/status_effect/grouped/cursed/proc/clear_curses() + SIGNAL_HANDLER + + if(!isnull(branded_hand)) + var/datum/wound/brand = branded_hand.get_wound_type(/datum/wound/burn/severe/cursed_brand) + brand?.remove_wound() + + owner.visible_message( + span_notice("The smoke slowly clears from [owner.name]..."), + span_notice("Your skin finally settles down and your throat no longer feels as dry... The brand disappearing confirms that the curse has been lifted."), + ) + QDEL_NULL(particle_effect) + qdel(src) + +/// If our owner's stat changes, rapidly surge the damage chance. +/datum/status_effect/grouped/cursed/proc/on_stat_changed() + SIGNAL_HANDLER + if(owner.stat == CONSCIOUS || owner.stat == DEAD) // reset on these two states + damage_chance = initial(damage_chance) + return + + to_chat(owner, span_userdanger("As your body crumbles, you feel the curse of the slot machine surge through your body!")) + damage_chance += 75 //ruh roh raggy + +/// If our owner dies without getting gibbed (as in of other causes), stop smoking because we've "expended all the life energy". +/datum/status_effect/grouped/cursed/proc/on_death(mob/living/source, gibbed) + SIGNAL_HANDLER + + if(gibbed) + return + + QDEL_NULL(particle_effect) + +/datum/status_effect/grouped/cursed/update_particles() + var/particle_path = /particles/smoke/steam/mild + switch(curse_count) + if(2 to 3) + particle_path = /particles/smoke/steam + if(4 to INFINITY) + particle_path = /particles/smoke/steam/bad + + if(smoke_path == particle_path) + return + + QDEL_NULL(particle_effect) + smoke_path = particle_path + particle_effect = new(owner, particle_path) + +/datum/status_effect/grouped/cursed/tick(seconds_between_ticks) + if(curse_count <= 1) + return // you get one "freebie" (single damage) to nudge you into thinking this is a bad idea before the house begins to win. + + // the house won. + var/ticked_coefficient = (rand(15, 40) / 100) + var/effective_percentile_chance = ((curse_count == 2 ? 1 : curse_count) * damage_chance * ticked_coefficient) + + if(SPT_PROB(effective_percentile_chance, seconds_between_ticks)) + owner.apply_damages( + brute = (curse_count * ticked_coefficient), + burn = (curse_count * ticked_coefficient), + oxy = (curse_count * ticked_coefficient), + ) + +/atom/movable/screen/alert/status_effect/cursed + name = "Cursed!" + desc = "The brand on your hand reminds you of your greed, yet you seem to be okay otherwise." + icon_state = "cursed_by_slots" + +/atom/movable/screen/alert/status_effect/cursed/update_desc() + . = ..() + var/datum/status_effect/grouped/cursed/linked_effect = attached_effect + var/curses = linked_effect.curse_count + switch(curses) + if(2) + desc = "Your greed is catching up to you..." + if(3) + desc = "You really don't feel good right now... But why stop now?" + if(4 to INFINITY) + desc = "Real winners quit before they reach the ultimate prize." + +#undef DEFAULT_MAX_CURSE_COUNT diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index 4446f0c0c3d..d3e7221d8f3 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -315,4 +315,14 @@ desc = "Patient is suffering extreme burns from a strange brand marking, creating serious risk of infection and greatly reduced limb integrity." examine_desc = "appears to have holy symbols painfully branded into their flesh, leaving severe burns." occur_text = "chars rapidly into a strange pattern of holy symbols, burned into the flesh." + +/// special severe wound caused by the cursed slot machine. +/datum/wound/burn/severe/cursed_brand + name = "Ancient Brand" + desc = "Patient is suffering extreme burns with oddly ornate brand markings, creating serious risk of infection and greatly reduced limb integrity." + examine_desc = "appears to have ornate symbols painfully branded into their flesh, leaving severe burns" + occur_text = "chars rapidly into a pattern that can only be described as an agglomeration of several financial symbols, burned into the flesh" + +/datum/wound/burn/severe/cursed_brand/get_limb_examine_description() + return span_warning("The flesh on this limb has several ornate symbols burned into it, with pitting throughout.") */ diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/cursed_slot_machine.dm b/code/modules/mapfluff/ruins/objects_and_mobs/cursed_slot_machine.dm new file mode 100644 index 00000000000..e85a90b783c --- /dev/null +++ b/code/modules/mapfluff/ruins/objects_and_mobs/cursed_slot_machine.dm @@ -0,0 +1,126 @@ +/// Greed's slot machine: Used in the Greed ruin. Deals damage on each use, with a successful use giving a d20 of fate. +/obj/structure/cursed_slot_machine + name = "greed's slot machine" + desc = "High stakes, high rewards." + icon = 'icons/obj/machines/computer.dmi' + icon_state = "slots" + anchored = TRUE + density = TRUE + /// Variable that tracks the screen we display. + var/icon_screen = "slots_screen" + /// Should we be emitting light? + var/brightness_on = TRUE + /// The probability the player has to win. + var/win_prob = 5 + /// The maximum amount of curses we will allow a player to have before disallowing them to use the machine. + var/max_curse_amount = 5 + /// machine's reward when you hit jackpot + var/prize = /obj/structure/cursed_money + /// should we be applying the cursed status effect? + var/status_effect_on_roll = TRUE + /// Length of the cooldown between the machine being used and being able to spin the machine again. + var/cooldown_length = 15 SECONDS + /// Are we currently in use? Anti-spam prevention measure. + var/in_use = FALSE + /// Cooldown between pulls of the cursed slot machine. + COOLDOWN_DECLARE(spin_cooldown) + +/obj/structure/cursed_slot_machine/Initialize(mapload) + . = ..() + update_appearance() + set_light(brightness_on) + +/obj/structure/cursed_slot_machine/interact(mob/user) + if(!ishuman(user)) + return + + var/mob/living/carbon/human/human_user = user + + if(in_use) + balloon_alert(human_user, "already spinning!") + return + + if(!COOLDOWN_FINISHED(src, spin_cooldown)) + to_chat(human_user, span_danger("The machine doesn't engage. You get the compulsion to try again in a few seconds.")) + return + + in_use = TRUE + + var/signal_value = SEND_SIGNAL(human_user, COMSIG_CURSED_SLOT_MACHINE_USE, max_curse_amount) + + if(signal_value & SLOT_MACHINE_USE_POSTPONE) + return + + if(signal_value & SLOT_MACHINE_USE_CANCEL) // failsafe in case we don't want to let the machine be used for some reason (like if we're maxed out on curses but not getting gibbed) + say("We're sorry, but we can no longer serve you at this establishment.") + return + + user.visible_message( + span_warning("[human_user] pulls [src]'s lever with a glint in [user.p_their()] eyes!"), + span_warning("You feel a draining as you pull the lever, but you know it'll be worth it."), + ) + + icon_screen = "slots_screen_working" + update_appearance() + playsound(src, 'sound/lavaland/cursed_slot_machine.ogg', 50, FALSE) + addtimer(CALLBACK(src, PROC_REF(determine_victor), human_user), 5 SECONDS) + +/obj/structure/cursed_slot_machine/update_overlays() + . = ..() + var/overlay_state = icon_screen + . += mutable_appearance(icon, overlay_state) + . += emissive_appearance(icon, overlay_state, src) + +/obj/structure/cursed_slot_machine/proc/determine_victor(mob/living/user) + icon_screen = initial(icon_screen) + update_appearance() + in_use = FALSE + COOLDOWN_START(src, spin_cooldown, cooldown_length) + if(!prob(win_prob)) + if(status_effect_on_roll && isnull(user.has_status_effect(/datum/status_effect/grouped/cursed))) + user.apply_status_effect(/datum/status_effect/grouped/cursed) + + SEND_SIGNAL(user, COMSIG_CURSED_SLOT_MACHINE_LOST) + playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + balloon_alert_to_viewers("you lost!") + return + + playsound(src, 'sound/lavaland/cursed_slot_machine_jackpot.ogg', 50, FALSE) + new prize(get_turf(src)) + if(user) + to_chat(user, span_boldwarning("You've hit the jackpot!!! Laughter echoes around you as your reward appears in the machine's place.")) + + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CURSED_SLOT_MACHINE_WON) + qdel(src) + +/// Prize given out by the cursed slot machine that will give the user one Die of Fate and then delete itself. +/obj/structure/cursed_money + name = "bag of money" + desc = "RICH! YES! YOU KNEW IT WAS WORTH IT! YOU'RE RICH! RICH! RICH!" + icon = 'icons/obj/storage/storage.dmi' + icon_state = "moneybag" + anchored = FALSE + density = TRUE + +/obj/structure/cursed_money/Initialize(mapload) + . = ..() + addtimer(CALLBACK(src, PROC_REF(collapse)), 1 MINUTES) + +/obj/structure/cursed_money/proc/collapse() + if(QDELETED(src)) + return + visible_message(span_warning("[src] falls in on itself, with the canvas rotting away and contents vanishing.")) + qdel(src) + +/obj/structure/cursed_money/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(.) + return + user.visible_message( + span_warning("[user] opens the bag and removes a die."), + span_warning("[span_boldwarning("You open the bag...!")] But all you see is a bag full of dice. Confused, you take one..."), + ) + var/turf/location = get_turf(user) + var/obj/item/dice/d20/fate/one_use/critical_fail = new(location) + user.put_in_hands(critical_fail) + collapse() diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm index 1373dcc4b6d..eb5f2437bcd 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm @@ -1,95 +1,5 @@ //These objects are used in the cardinal sin-themed ruins (i.e. Gluttony, Pride...) -/obj/structure/cursed_slot_machine //Greed's slot machine: Used in the Greed ruin. Deals clone damage on each use, with a successful use giving a d20 of fate. - name = "greed's slot machine" - desc = "High stakes, high rewards." - icon = 'icons/obj/machines/computer.dmi' - icon_state = "slots" - var/icon_screen = "slots_screen" - var/brightness_on = 1 - anchored = TRUE - density = TRUE - var/win_prob = 5 - /// clone damaged dealt each roll - var/damage_on_roll = 20 - /// machine's reward when you hit jackpot - var/prize = /obj/structure/cursed_money - -/obj/structure/cursed_slot_machine/Initialize(mapload) - . = ..() - update_appearance() - set_light(brightness_on) - -/obj/structure/cursed_slot_machine/interact(mob/living/carbon/human/user) - if(!istype(user)) - return - if(obj_flags & IN_USE) - return - obj_flags |= IN_USE - user.adjustCloneLoss(damage_on_roll) - if(user.stat) - to_chat(user, span_userdanger("No... just one more try...")) - user.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) - user.gib() - else - user.visible_message(span_warning("[user] pulls [src]'s lever with a glint in [user.p_their()] eyes!"), "You feel a draining as you pull the lever, but you \ - know it'll be worth it.") - icon_screen = "slots_screen_working" - update_appearance() - playsound(src, 'sound/lavaland/cursed_slot_machine.ogg', 50, FALSE) - addtimer(CALLBACK(src, PROC_REF(determine_victor), user), 50) - -/obj/structure/cursed_slot_machine/proc/determine_victor(mob/living/user) - icon_screen = "slots_screen" - update_appearance() - obj_flags &= ~IN_USE - if(prob(win_prob)) - playsound(src, 'sound/lavaland/cursed_slot_machine_jackpot.ogg', 50, FALSE) - new prize(get_turf(src)) - if(user) - to_chat(user, span_boldwarning("You've hit jackpot. Laughter echoes around you as your reward appears in the machine's place.")) - qdel(src) - else - if(user) - to_chat(user, span_boldwarning("Fucking machine! Must be rigged. Still... one more try couldn't hurt, right?")) - -/obj/structure/cursed_slot_machine/update_overlays() - . = ..() - var/overlay_state = icon_screen - . += mutable_appearance(icon, overlay_state) - . += emissive_appearance(icon, overlay_state, src) - -/obj/structure/cursed_money - name = "bag of money" - desc = "RICH! YES! YOU KNEW IT WAS WORTH IT! YOU'RE RICH! RICH! RICH!" - icon = 'icons/obj/storage/storage.dmi' - icon_state = "moneybag" - anchored = FALSE - density = TRUE - -/obj/structure/cursed_money/Initialize(mapload) - . = ..() - addtimer(CALLBACK(src, PROC_REF(collapse)), 600) - -/obj/structure/cursed_money/proc/collapse() - visible_message("[src] falls in on itself, \ - canvas rotting away and contents vanishing.") - qdel(src) - -/obj/structure/cursed_money/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(.) - return - user.visible_message("[user] opens the bag and \ - and removes a die. The bag then vanishes.", - "[span_boldwarning("You open the bag...!")]\n\ - And see a bag full of dice. Confused, \ - you take one... and the bag vanishes.") - var/turf/T = get_turf(user) - var/obj/item/dice/d20/fate/one_use/critical_fail = new(T) - user.put_in_hands(critical_fail) - qdel(src) - /obj/effect/gluttony //Gluttony's wall: Used in the Gluttony ruin. Only lets the overweight through. name = "gluttony's wall" desc = "Only those who truly indulge may pass." diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 50373f5e8f3..7a1f40d6fcd 100755 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/modular_skyrat/modules/medical/code/wounds/burns.dm b/modular_skyrat/modules/medical/code/wounds/burns.dm index 256cc67a99e..45eb0f2b7dc 100644 --- a/modular_skyrat/modules/medical/code/wounds/burns.dm +++ b/modular_skyrat/modules/medical/code/wounds/burns.dm @@ -299,3 +299,13 @@ desc = "Patient is suffering extreme burns from a strange brand marking, creating serious risk of infection and greatly reduced limb integrity." examine_desc = "appears to have holy symbols painfully branded into their flesh, leaving severe burns." occur_text = "chars rapidly into a strange pattern of holy symbols, burned into the flesh." + +/// special severe wound caused by the cursed slot machine. +/datum/wound/burn/severe/cursed_brand + name = "Ancient Brand" + desc = "Patient is suffering extreme burns with oddly ornate brand markings, creating serious risk of infection and greatly reduced limb integrity." + examine_desc = "appears to have ornate symbols painfully branded into their flesh, leaving severe burns" + occur_text = "chars rapidly into a pattern that can only be described as an agglomeration of several financial symbols, burned into the flesh" + +/datum/wound/burn/severe/cursed_brand/get_limb_examine_description() + return span_warning("The flesh on this limb has several ornate symbols burned into it, with pitting throughout.") diff --git a/tgstation.dme b/tgstation.dme index 0bbc971ec10..38f17483879 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1627,6 +1627,7 @@ #include "code\datums\status_effects\debuffs\blindness.dm" #include "code\datums\status_effects\debuffs\choke.dm" #include "code\datums\status_effects\debuffs\confusion.dm" +#include "code\datums\status_effects\debuffs\cursed.dm" #include "code\datums\status_effects\debuffs\debuffs.dm" #include "code\datums\status_effects\debuffs\decloning.dm" #include "code\datums\status_effects\debuffs\dizziness.dm" @@ -4080,6 +4081,7 @@ #include "code\modules\mapfluff\ruins\lavalandruin_code\surface.dm" #include "code\modules\mapfluff\ruins\lavalandruin_code\syndicate_base.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\ash_walker_den.dm" +#include "code\modules\mapfluff\ruins\objects_and_mobs\cursed_slot_machine.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\necropolis_gate.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\sin_ruins.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\allamericandiner.dm"