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."