From 96d91518170d6e21fdf60d5abbd8effc5cf48eb1 Mon Sep 17 00:00:00 2001 From: Batrachophreno Date: Wed, 19 Aug 2026 17:35:13 +0000 Subject: [PATCH] Post-Arc Bugfixes, Non-Sea Balance, etc. (#22836) Fixes bugs associated with Lemurian Sea. Former test merge PR --- code/controllers/subsystems/hallucinations.dm | 45 ++++++++++++++++++- code/controllers/subsystems/machinery.dm | 30 ------------- .../items/devices/lighting/hull_beacon.dm | 2 +- code/modules/events/event_container.dm | 4 +- code/modules/events/gravity_anomaly.dm | 14 +++--- code/modules/mob/living/carbon/human/human.dm | 7 +-- code/modules/overmap/events/event.dm | 29 ++++++++---- code/modules/overmap/ships/ship.dm | 10 +++++ code/modules/power/lights/bulbs.dm | 4 +- code/modules/power/lights/fixtures.dm | 2 +- html/changelogs/Bat-Sea.yml | 4 ++ 11 files changed, 95 insertions(+), 56 deletions(-) create mode 100644 html/changelogs/Bat-Sea.yml diff --git a/code/controllers/subsystems/hallucinations.dm b/code/controllers/subsystems/hallucinations.dm index 7b2af9003c8..a72f2eed56c 100644 --- a/code/controllers/subsystems/hallucinations.dm +++ b/code/controllers/subsystems/hallucinations.dm @@ -348,14 +348,57 @@ SUBSYSTEM_DEF(hallucinations) message = pick("The water is dripping dripping dripping all around you.","Water flowing over stone, but there is no stone.","The waterfall roars o'er the cliff's edge.","Water, water, water. You are drowning.","Water, water, water. You will be awake for it.","Drums, drums, drums, unrelenting.","The drumbeat draws e'er closer.","Tap, ta-tap, ta-tap, tap, ta-tap, ta-tap.","Tap, tap tap, ta-tap, tap-tap, ta-tap.","Ta-ta-tap, tap, ta-tap, tap, tap ta-tap.") target.play_screen_text("[message]", message_type, COLOR_PURPLE) to_chat(target, SPAN_CULT(FONT_LARGE("[message]"))) - + var/datum/weakref/target_ref = WEAKREF(target) + if(prob(25)) + addtimer(CALLBACK(src, PROC_REF(apply_delayed_adpi_response), target_ref), rand(5,25)) + if(prob(25)) + addtimer(CALLBACK(src, PROC_REF(apply_delayed_adpi_response), target_ref), rand(30,60)) + if(prob(25)) + addtimer(CALLBACK(src, PROC_REF(apply_delayed_adpi_response), target_ref), rand(65,120)) + if(prob(2)) + addtimer(CALLBACK(src, PROC_REF(radio_alarm), target_ref), 120) + addtimer(CALLBACK(src, PROC_REF(radio_alarm), target_ref), 135) + addtimer(CALLBACK(src, PROC_REF(radio_alarm), target_ref), 140) + if(prob(1)) + target.hallucination += rand(1,120) if(isskrell(target)) var/mob/living/carbon/human/H = target apply_skrell_adpi_pain(H) +//straight up cloned delam_call, fuck it +/datum/controller/subsystem/hallucinations/proc/radio_alarm(var/datum/weakref/target_ref) + var/mob/living/target = target_ref?.resolve() + if(!istype(target) || QDELETED(target)) + return + + var/list/people = list() + for(var/mob/living/carbon/human/M in GLOB.living_mob_list) + if(!M.isMonkey() && !player_is_antag(M, only_offstation_roles = TRUE) && is_station_level(M.z)) + people += M + + people -= target + if(!length(people)) + return + + var/radio_exclaim = pick("Oh SHIT!", "Oh fuck.", "Uhhh!", "That's not good!", "FUCK.", "Engineering?", "It's under control!", "We're fucked!", "Ohhhh boy.", "What?!", "Um, what?!", "Shots, shots!", "HELP!", "MEDICAL!") + var/mob/living/carbon/human/requester = pick(people) + + to_chat(target, "[requester.get_accent_icon(null, target)] [requester] says, \"[radio_exclaim]\"") + /datum/controller/subsystem/hallucinations/proc/apply_skrell_adpi_pain(var/mob/living/carbon/human/H) H.adjustHalLoss(rand(5, 12)) if(prob(35)) to_chat(H, SPAN_WARNING("A sharp ache lances through your head as the thought passes.")) if(prob(15)) H.emote("shiver") + +/datum/controller/subsystem/hallucinations/proc/apply_delayed_adpi_response(var/mob/living/carbon/human/H) + if(!H.stat) + var/chosen_emote = pick(SShallucinations.hal_emote) + // You are aware of it in this instance + if(prob(10)) + H.visible_message("[H] [chosen_emote]") + // Only shows to others, not you; you're not aware of what you're doing. Could prompt others to ask if you're okay, and lead to confusion. + else + for(var/mob/M in oviewers(world.view, H)) + to_chat(M, "[H] [chosen_emote]") diff --git a/code/controllers/subsystems/machinery.dm b/code/controllers/subsystems/machinery.dm index 1d239f8313e..a16cdb4a92b 100644 --- a/code/controllers/subsystems/machinery.dm +++ b/code/controllers/subsystems/machinery.dm @@ -71,15 +71,11 @@ SUBSYSTEM_DEF(machinery) // Cooking stuff. Not substantial enough to get its own SS, so it's shoved in here. var/list/recipe_datums = list() - // LEMURIAN SEA ARC SNOWFLAKE: Break one random ship light every few minutes. REMOVE AFTER ARC - var/next_arc_light_break = 0 - /datum/controller/subsystem/machinery/Recover() all_cameras = SSmachinery.all_cameras all_holopads = SSmachinery.all_holopads all_apcs = SSmachinery.all_apcs all_lights = SSmachinery.all_lights - next_arc_light_break = SSmachinery.next_arc_light_break recipe_datums = SSmachinery.recipe_datums breaker_boxes = SSmachinery.breaker_boxes all_sensors = SSmachinery.all_sensors @@ -91,7 +87,6 @@ SUBSYSTEM_DEF(machinery) makepowernets() build_rcon_lists() setup_atmos_machinery(machinery) - next_arc_light_break = world.time + 3 MINUTES // LEMURIAN SEA, REMOVE AFTER ARC fire(FALSE, TRUE) // Tick machinery once to pare down the list so we don't hammer the server on round-start. return SS_INIT_SUCCESS @@ -122,10 +117,6 @@ SUBSYSTEM_DEF(machinery) return current_step = SSMACHINERY_PIPENETS resumed = FALSE - // LEMURIAN SEA, REMOVE AFTER ARC - if(!resumed && world.time >= next_arc_light_break) - break_random_arc_light() - next_arc_light_break = world.time + 3 MINUTES /datum/controller/subsystem/machinery/proc/makepowernets() for(var/datum/powernet/powernet as anything in powernets) @@ -236,27 +227,6 @@ SUBSYSTEM_DEF(machinery) queue.Cut(i) return -/// LEMURIAN SEA, REMOVE AFTER ARC -/datum/controller/subsystem/machinery/proc/break_random_arc_light() - var/list/valid_lights = list() - for(var/obj/structure/machinery/light/light as anything in all_lights) - if(QDELETED(light)) - continue - if(!is_station_level(light.z)) - continue - if(light.status != LIGHT_OK) - continue - valid_lights += light - - if(!length(valid_lights)) - return - - var/number_lights_broken = rand(1,4) - var/obj/structure/machinery/light/chosen_light - for(var/n = 0 to number_lights_broken) - chosen_light = pick(valid_lights) - chosen_light.broken() - /datum/controller/subsystem/machinery/stat_entry(msg) msg = {"\n\ Queues: \ diff --git a/code/game/objects/items/devices/lighting/hull_beacon.dm b/code/game/objects/items/devices/lighting/hull_beacon.dm index 719f9c7c233..44993bf7070 100644 --- a/code/game/objects/items/devices/lighting/hull_beacon.dm +++ b/code/game/objects/items/devices/lighting/hull_beacon.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/lighting.dmi' anchored = TRUE light_system = MOVABLE_LIGHT - light_range = 1.6 // LEMURIAN SEA, AFTER ARC RESTORE TO 3 + light_range = 3.0 /obj/item/hullbeacon/Initialize() . = ..() diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 10533c884e0..1383dc8f635 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -388,8 +388,8 @@ GLOBAL_LIST_INIT(severity_to_string, alist(EVENT_LEVEL_MUNDANE = "Mundane", EVEN 20, list(ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_JANITOR = 20)), new /datum/event_meta(EVENT_LEVEL_MAJOR, "Dark Matter Influx", /datum/event/gravity_anomaly, - 35, list(ASSIGNMENT_ENGINEER = 20), is_one_shot = TRUE, - pop_needed = 12), + 15, list(ASSIGNMENT_ENGINEER = 20), is_one_shot = TRUE, + pop_needed = 8), new /datum/event_meta(EVENT_LEVEL_MAJOR, "Wandering Psiren School", /datum/event/wandering_psirens, 10, list(ASSIGNMENT_SECURITY = 15, ASSIGNMENT_MEDICAL = 5)), diff --git a/code/modules/events/gravity_anomaly.dm b/code/modules/events/gravity_anomaly.dm index 44b461c6a6d..89b0ab947f4 100644 --- a/code/modules/events/gravity_anomaly.dm +++ b/code/modules/events/gravity_anomaly.dm @@ -1,6 +1,6 @@ /datum/event/gravity_anomaly announceWhen = 0 - startWhen = 30 + startWhen = 0 // In practice, gravity generator is always nearly done already if it starts too late. endWhen = 60 // Actually gets set in setup() ic_name = "a gravitational anomaly" var/list/valid_victims @@ -102,7 +102,7 @@ return FALSE /datum/event/gravity_anomaly/proc/pick_victim_disturbance() - if(activeFor >= next_gravity_surge && prob(67)) + if(activeFor >= next_gravity_surge) schedule_next_gravity_surge() if(prob(10)) return "surge_hilarious" @@ -119,7 +119,7 @@ return null /datum/event/gravity_anomaly/proc/schedule_next_gravity_surge() - next_gravity_surge = activeFor + rand(2, 90) + next_gravity_surge = activeFor + rand(2, 10) /datum/event/gravity_anomaly/proc/get_current_victims() var/list/current_victims = list() @@ -197,13 +197,13 @@ /datum/event/gravity_anomaly/proc/apply_surge_default(var/mob/living/carbon/human/victim) victim.dizziness += rand(10, 20) victim.confused += rand(20, 25) - if(prob(50)) + if(prob(33)) if(isipc(victim)) to_chat(victim, SPAN_MACHINE_WARNING(pick(nausea_strong_ipc))) else to_chat(victim, SPAN_WARNING(pick(nausea_strong_organic))) victim.vomit() - if(prob(70)) + if(prob(90)) if(victim.buckled_to) to_chat(victim, SPAN_WARNING("Sudden gravity flux presses you into your chair!")) shake_camera(victim, 3, 1) @@ -215,7 +215,7 @@ else to_chat(victim, SPAN_WARNING("The floor lurches beneath you!")) shake_camera(victim, 10, 1) - victim.visible_message(SPAN_DANGER("[victim.name] is tossed around by a sudden knot in the artifical gravity field!")) + victim.visible_message(SPAN_HIGHDANGER("[victim.name] is tossed around by a sudden knot in the artifical gravity field!")) victim.throw_at_random(FALSE, 4, 1) victim.Weaken(3) @@ -240,7 +240,7 @@ to_chat(victim, SPAN_WARNING("You feel like your ankles are about to be ripped apart as the artificial gravity surges!")) shake_camera(victim, 8, 2) else - victim.visible_message(SPAN_DANGER("[victim.name] is flung violently by a horrible gravity flux!")) + victim.visible_message(SPAN_HIGHDANGER("[victim.name] is flung violently by a horrible gravity flux!")) victim.Weaken(8) if(prob(90)) victim.throw_at_random(FALSE, 7, 1) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f2904f8314a..6b165ece3a0 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1116,15 +1116,16 @@ timevomit = clamp(timevomit, 1, 10) level = clamp(level, 1, 3) + var/delay = rand(100,175) lastpuke = TRUE to_chat(src, SPAN_WARNING("You feel nauseous...")) if(level > 1) - sleep(150 / timevomit) //15 seconds until second warning + sleep(delay / timevomit) to_chat(src, SPAN_WARNING("You feel like you are about to throw up!")) if(level > 2) - sleep(100 / timevomit) //and you have 10 more for mad dash to the bucket + sleep(delay / timevomit) empty_stomach() - sleep(350) //wait 35 seconds before next volley + sleep(delay * 2) lastpuke = FALSE /// A damaged stomach can put blood in your vomit. diff --git a/code/modules/overmap/events/event.dm b/code/modules/overmap/events/event.dm index 1bd94603d8c..ee62d86cf39 100644 --- a/code/modules/overmap/events/event.dm +++ b/code/modules/overmap/events/event.dm @@ -142,19 +142,30 @@ GLOB.exited_event.register(T, src, PROC_REF(on_turf_exited)) for(var/obj/effect/overmap/visitable/ship/ship in T) - var/list/active_ship_events = ship_events[ship] - for(var/datum/event/E as anything in active_ship_events) - if(is_event_in_turf(E,T)) - continue - E.kill() - LAZYREMOVE(ship_events[ship], E) + update_ship_hazards(ship, T) - for(var/obj/effect/overmap/event/E in active_hazards) - start_hazard(ship,E) +/singleton/overmap_event_handler/proc/update_ship_hazards(var/obj/effect/overmap/visitable/ship/ship, var/turf/T) + if(!istype(ship)) + return + if(!istype(T)) + T = get_turf(ship) + + var/list/active_ship_events = ship_events[ship] + for(var/datum/event/E as anything in active_ship_events) + if(istype(T) && is_event_in_turf(E, T)) + continue + E.kill() + LAZYREMOVE(ship_events[ship], E) + + if(!istype(T)) + return + + for(var/obj/effect/overmap/event/E in hazard_by_turf[T]) + start_hazard(ship, E) /singleton/overmap_event_handler/proc/is_event_in_turf(var/datum/event/E, var/turf/T) for(var/obj/effect/overmap/event/hazard in hazard_by_turf[T]) - if((E in hazard.events) && E.severity == hazard.difficulty) + if((E.type in hazard.events) && E.severity == hazard.difficulty) return TRUE /singleton/overmap_event_handler/proc/is_event_included(var/list/hazards, var/obj/effect/overmap/event/E, var/equal_or_better)//this proc is only used so it can break out of 2 loops cleanly diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm index 25811ec7f20..8bc5c509a34 100644 --- a/code/modules/overmap/ships/ship.dm +++ b/code/modules/overmap/ships/ship.dm @@ -102,6 +102,16 @@ . = ..() +/obj/effect/overmap/visitable/ship/Move(atom/newloc, direction, glide_size_override = 0, update_dir = TRUE) + . = ..() + if(.) + overmap_event_handler.update_ship_hazards(src) + +/obj/effect/overmap/visitable/ship/forceMove(atom/destination) + . = ..() + if(.) + overmap_event_handler.update_ship_hazards(src) + /obj/effect/overmap/visitable/ship/relaymove(mob/living/user, direction, accel_limit) . = ..() diff --git a/code/modules/power/lights/bulbs.dm b/code/modules/power/lights/bulbs.dm index 2ad3e635234..6d416e30189 100644 --- a/code/modules/power/lights/bulbs.dm +++ b/code/modules/power/lights/bulbs.dm @@ -32,9 +32,9 @@ if(randomize_range) switch(lighttype) if("tube") - brightness_range = rand(5,8) // LEMURIAN SEA - INCREASE BY 1,1 AFTER ARC + brightness_range = rand(6,9) if("bulb") - brightness_range = rand(3,5) // LEMURIAN SEA - INCREASE BY 1,1 AFTER ARC + brightness_range = rand(4,6) if(randomize_color) brightness_color = pick(randomized_colors) update() diff --git a/code/modules/power/lights/fixtures.dm b/code/modules/power/lights/fixtures.dm index 1d5c3fdd878..9c28b8b1228 100644 --- a/code/modules/power/lights/fixtures.dm +++ b/code/modules/power/lights/fixtures.dm @@ -240,7 +240,7 @@ message_admins("LOG: Rigged light explosion, last touched by [fingerprintslast]") explode() - else if(prob(min(60,(switchcount**2) * 0.05))) // LEMURIAN SEA, REDUCE 0.05 -> 0.01 AFTER ARC + else if(prob(min(60,(switchcount**2) * 0.01))) if(status == LIGHT_OK && trigger) status = LIGHT_BURNED stat |= BROKEN diff --git a/html/changelogs/Bat-Sea.yml b/html/changelogs/Bat-Sea.yml new file mode 100644 index 00000000000..46d70618d2e --- /dev/null +++ b/html/changelogs/Bat-Sea.yml @@ -0,0 +1,4 @@ +author: Batrachophrenoboocosmomachia +delete-after: True +changes: + - bugfix: "Additional LS logic fixes."