diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 1aea336e3752..5a9bd31b568c 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -24,8 +24,12 @@ SUBSYSTEM_DEF(events) var/wizardmode = FALSE /datum/controller/subsystem/events/Initialize() - for(var/type in typesof(/datum/round_event_control)) - var/datum/round_event_control/event = new type() + // DARKPACK EDIT CHANGE START - EVENTS + for(var/datum/round_event_control/event_typepath as anything in valid_subtypesof(/datum/round_event_control)) + if(!event_typepath::darkpack_allowed) + continue + var/datum/round_event_control/event = new event_typepath() + // DARKPACK EDIT CHANGE END if(!event.typepath) continue if(!event.valid_for_map()) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm index 66798ae798c6..73915938adac 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm @@ -17,7 +17,10 @@ overflow_control = locate(/datum/round_event_control/scrubber_overflow/every_vent) in SSevents.control /obj/machinery/nuclearbomb/beer/Destroy() - UnregisterSignal(overflow_control, COMSIG_CREATED_ROUND_EVENT) + // DARKPACK EDIT CHANGE - this was causing runtimes as overflow_control is null if the associated event is not in SSevents + if(!isnull(overflow_control)) + UnregisterSignal(overflow_control, COMSIG_CREATED_ROUND_EVENT) + // DARKPACK EDIT CHANGE END . = ..() /obj/machinery/nuclearbomb/beer/examine(mob/user) diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index 76fe9d365490..98b7e92c5180 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -38,6 +38,8 @@ /// Flags dictating whether this event should be run on certain kinds of map var/map_flags = NONE + var/darkpack_allowed = FALSE // DARKPACK EDIT ADD - EVENTS + /datum/round_event_control/New() if(!length(admin_setup)) return diff --git a/config/game_options.txt b/config/game_options.txt index 3b66a0668bee..43d3b5725b9a 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -157,7 +157,7 @@ DYNAMIC_CONFIG_ENABLED ## RANDOM EVENTS ### ## Comment this out to disable random events during the round. -#ALLOW_RANDOM_EVENTS +ALLOW_RANDOM_EVENTS ## Uncomment this to disable station traits. #FORBID_STATION_TRAITS diff --git a/modular_darkpack/modules/city_traits/code/negative_traits.dm b/modular_darkpack/modules/city_traits/code/negative_traits.dm index 1f0ff9742bd6..ba2b4f7305b8 100644 --- a/modular_darkpack/modules/city_traits/code/negative_traits.dm +++ b/modular_darkpack/modules/city_traits/code/negative_traits.dm @@ -39,10 +39,7 @@ /datum/station_trait/faulty_power_grid/on_round_start() . = ..() - // Fuck I hate it, rework fusebox code - for(var/obj/fusebox/broken_box in world) + for(var/obj/fusebox/F in GLOB.fuseboxes) if(prob(75)) continue - broken_box.damaged += rand(50, 200) - broken_box.check_damage() - + F.take_damage(rand(50,200)) diff --git a/modular_darkpack/modules/electricity/code/fusebox.dm b/modular_darkpack/modules/electricity/code/fusebox.dm index a0bbd69e9226..e5e322382fee 100644 --- a/modular_darkpack/modules/electricity/code/fusebox.dm +++ b/modular_darkpack/modules/electricity/code/fusebox.dm @@ -1,3 +1,5 @@ +GLOBAL_LIST_EMPTY(fuseboxes) + // The way this completely bypasses the entire power system is so strange /obj/fusebox name = "fuse box" @@ -7,50 +9,68 @@ base_icon_state = "fusebox" layer = SIGN_LAYER anchored = TRUE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF pixel_y = 32 - + max_integrity = 100 + prevent_destruction = TRUE //Damage on the fusebox var/damaged = 0 - //If our door is open/closed. bool - var/open = FALSE //Repairing var for the loop var/repairing = FALSE //Soundloop for Transformers var/datum/looping_sound/generator/soundloop +/obj/fusebox/Initialize(mapload) + . = ..() + GLOB.fuseboxes += src + +/obj/fusebox/atom_destruction(damage_flag) + . = ..() + power_off() + + +//they shouldnt really ever be destroyed, but... +/obj/fusebox/Destroy() + GLOB.fuseboxes -= src + return ..() + /obj/fusebox/update_icon_state() . = ..() - if(damaged > 100) + if(atom_integrity <= 0) icon_state = "[base_icon_state]_off" else icon_state = base_icon_state /obj/fusebox/proc/update_sound_state() if(!isnull(soundloop)) - if(damaged > 100) + if(atom_integrity <= 0) soundloop.stop() else soundloop.start(src) -/obj/fusebox/proc/check_damage(mob/living/user) - if(damaged > 100 && !open) - open = TRUE - var/area/power_area = get_area(src) - power_area.power_light = FALSE - power_area.power_equip = FALSE - power_area.power_environ = FALSE - power_area.power_change() - power_area.fire_controled = FALSE - var/datum/effect_system/basic/spark_spread/local_spark = new(get_turf(src), 5, 1) - local_spark.start() - for(var/obj/machinery/light/L in power_area) - L.update(FALSE) - playsound(loc, 'modular_darkpack/modules/electricity/sounds/generator_break.ogg', 100, TRUE) - user?.electrocute_act(50, src, siemens_coeff = 1, flags = NONE) +/obj/fusebox/proc/power_off() + var/area/power_area = get_area(src) + power_area.power_light = FALSE + power_area.power_equip = FALSE + power_area.power_environ = FALSE + power_area.power_change() + power_area.fire_controled = FALSE + var/datum/effect_system/basic/spark_spread/local_spark = new(get_turf(src), 5, 1) + local_spark.start() + for(var/obj/machinery/light/L in power_area) + L.update(FALSE) + playsound(loc, 'modular_darkpack/modules/electricity/sounds/generator_break.ogg', 100, TRUE) + for(var/mob/living/M in range(1, src)) + M.electrocute_act(50, src, siemens_coeff = 1, flags = NONE) update_icon() update_sound_state() +/datum/storyteller_roll/fusebox_repair + bumper_text = "electrical repair" + applicable_stats = list(STAT_INTELLIGENCE, STAT_TECHNOLOGY) + difficulty = 7 + numerical = TRUE + /obj/fusebox/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if(tool.tool_behaviour == TOOL_WIRECUTTER) if(!repairing) @@ -59,32 +79,31 @@ repairing = FALSE return ITEM_INTERACT_BLOCKING - damaged = 0 - update_icon_state() - update_sound_state() - playsound(get_turf(src),'modular_darkpack/modules/electricity/sounds/fusebox_fix.ogg', 50, FALSE) - var/area/power_area = get_area(src) - power_area.power_light = TRUE - power_area.power_equip = TRUE - power_area.power_environ = TRUE - power_area.power_change() - if(initial(power_area.fire_controled)) - power_area.fire_controled = TRUE - for(var/obj/machinery/light/L in power_area) - L.update(FALSE) + var/datum/storyteller_roll/fusebox_repair/fusebox_roll = new() + var/successes = fusebox_roll.st_roll(user, src) + var/repair_amount = successes * 40 + if(repair_amount > 0) + repair_damage(repair_amount) + update_icon_state() + update_sound_state() + playsound(get_turf(src), 'modular_darkpack/modules/electricity/sounds/fusebox_fix.ogg', 50, FALSE) + var/area/power_area = get_area(src) + power_area.power_light = TRUE + power_area.power_equip = TRUE + power_area.power_environ = TRUE + power_area.power_change() + if(initial(power_area.fire_controled)) + power_area.fire_controled = TRUE + for(var/obj/machinery/light/L in power_area) + L.update(FALSE) - repairing = FALSE - return ITEM_INTERACT_SUCCESS + repairing = FALSE + return ITEM_INTERACT_SUCCESS + if(repair_amount <= 0) + user.electrocute_act(50, src, siemens_coeff = 1, flags = NONE) return NONE -// This sucks. Snowflaking its own integrity system is always bad. -/obj/fusebox/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) - . = ..() - if(attacking_item.force) - damaged += attacking_item.force - check_damage(user) - // transformers (another type of fusebox) /obj/fusebox/transformer name = "transformer" @@ -96,4 +115,3 @@ /obj/fusebox/transformer/Initialize(mapload) . = ..() soundloop = new(src, TRUE) - diff --git a/modular_darkpack/modules/events/attributions.txt b/modular_darkpack/modules/events/attributions.txt new file mode 100644 index 000000000000..9184d81866e8 --- /dev/null +++ b/modular_darkpack/modules/events/attributions.txt @@ -0,0 +1,2 @@ +thank you to yfjesse on freesound.org for news_notification.ogg +https://freesound.org/people/yfjesse/sounds/235911/ diff --git a/modular_darkpack/modules/events/code/_darkpack_event.dm b/modular_darkpack/modules/events/code/_darkpack_event.dm new file mode 100644 index 000000000000..7e354a05fced --- /dev/null +++ b/modular_darkpack/modules/events/code/_darkpack_event.dm @@ -0,0 +1,4 @@ +/datum/round_event_control/darkpack + darkpack_allowed = TRUE + +// note - no need for a /datum/round_event/darkpack subtype. they only fire if the above exists. diff --git a/modular_darkpack/modules/events/code/blackout_event.dm b/modular_darkpack/modules/events/code/blackout_event.dm new file mode 100644 index 000000000000..ab7036ba74d3 --- /dev/null +++ b/modular_darkpack/modules/events/code/blackout_event.dm @@ -0,0 +1,30 @@ +/datum/round_event_control/darkpack/blackout + name = "Blackout" + typepath = /datum/round_event/blackout + weight = 6 + min_players = 5 + max_occurrences = 2 + earliest_start = 10 MINUTES + category = EVENT_CATEGORY_ENGINEERING + description = "A cascading failure in the city's power grid." + darkpack_allowed = TRUE + +/datum/round_event/blackout + start_when = 1 + announce_when = 5 + +/datum/round_event/blackout/announce(fake) + priority_announce( + "A breaking news notification has appeared on your phone - rolling blackouts are affecting your area due to inclement weather.", + "Local BREAKING NEWS Alert", + 'modular_darkpack/modules/events/sounds/news_notification.ogg', + ANNOUNCEMENT_TYPE_PRIORITY, + color_override = "red", + ) + +/datum/round_event/blackout/start() + for(var/obj/fusebox/F in GLOB.fuseboxes) + if(prob(50)) + continue + F.take_damage(101) + F.power_off() diff --git a/modular_darkpack/modules/events/sounds/news_notification.ogg b/modular_darkpack/modules/events/sounds/news_notification.ogg new file mode 100644 index 000000000000..571fecf098e1 Binary files /dev/null and b/modular_darkpack/modules/events/sounds/news_notification.ogg differ diff --git a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/paths/levinbolt.dm b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/paths/levinbolt.dm index aef105534047..07ecc504117b 100644 --- a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/paths/levinbolt.dm +++ b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/paths/levinbolt.dm @@ -106,8 +106,8 @@ var/obj/fusebox/fuse = target // Break the fusebox - fuse.damaged += 101 - fuse.check_damage(owner, TRUE) + fuse.take_damage(101) + fuse.power_off() var/datum/effect_system/basic/spark_spread/spark_system = new(get_turf(target), 5, 1) spark_system.start() diff --git a/tgstation.dme b/tgstation.dme index abd68a3bc508..2d63a8084bd3 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7221,6 +7221,8 @@ #include "modular_darkpack\modules\ert\code\outfits\first_team_outfits.dm" #include "modular_darkpack\modules\ert\code\outfits\national_guard_outfits.dm" #include "modular_darkpack\modules\ert\code\outfits\swat_outfits.dm" +#include "modular_darkpack\modules\events\code\_darkpack_event.dm" +#include "modular_darkpack\modules\events\code\blackout_event.dm" #include "modular_darkpack\modules\external_organs\code\gargoyle_wings.dm" #include "modular_darkpack\modules\external_organs\code\gargoyle_wings_sprite_accessory_datum.dm" #include "modular_darkpack\modules\fire\code\fire.dm"