Lemurian Sea (#22686)

changes:
  - refactor: "Refactors Gravity Generator UI from HTML to TGUI."
- rscadd: "Adds sector-based modifier var 'overmap_hazards_multiplier'
for generating total overmap hazard count."
  - soundadd: "Adds new Lemurian Sea 'welcome' announcements."
- rscadd: "Added Lemurian Sea gravitic anomalies as overmap hazards and
random events."
  - rscadd: "Adds ADPI/The Voices."
- rscadd: "Adds ADPI Panel for modmins to send ADPI messages to a single
character or all characters from their respective pools, or custom
messages."
- balance: "Vaurca Hivenet communication, the Hivenet Manifest, and
Hivenet Echoes are now disabled while the ship is in Lemurian Sea
sectors."
This commit is contained in:
Batrachophreno
2026-06-13 16:25:49 +00:00
committed by GitHub
parent a11c25bef6
commit 0c7ab8baa7
53 changed files with 1818 additions and 417 deletions
@@ -197,6 +197,11 @@
set category = "Storyteller"
set desc = "Switch if Vaurcae can hear faint echoes (fluff) of the greater Hivenet. They will notice."
if(is_lemurian_sea_sector())
SSatlas.current_sector.hivenet_echoes = FALSE
to_chat(src, "The Fog prevents Hivenet Echoes from being restored in the Lemurian Sea.")
return
if(SSatlas.current_sector.hivenet_echoes)
SSatlas.current_sector.hivenet_echoes = FALSE
to_chat(src, "Vaurcae have been cut off from echoes (fluff) of the greater Hivenet.")
+11
View File
@@ -234,6 +234,10 @@
/datum/language/bug/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
log_say("[key_name(speaker)] : ([name]) [message]")
if(is_lemurian_sea_sector())
to_chat(speaker, SPAN_WARNING("You attempt to reach the Hivenet, but find nothing!"))
return
var/mob/living/carbon/human/H = speaker //Check for Preimminent Shaper robes, which obscure Hive affiliation
var/obj/item/clothing/head/shaper/helmet = H.get_equipped_item(slot_head)
if(!speaker_mask)
@@ -304,6 +308,9 @@
return "[verb], <span class='message'><span class='[message_color]'>\"[capitalize(message)]\"</span></span>"
/datum/language/bug/check_special_condition(var/mob/other)
if(is_lemurian_sea_sector())
return 0
if(istype(other, /mob/living/silicon))
var/mob/living/silicon/S = other
if(S.can_hear_hivenet)
@@ -340,6 +347,10 @@
return 0
/datum/language/bug/check_speech_restrict(var/mob/speaker)
if(is_lemurian_sea_sector())
to_chat(speaker, SPAN_WARNING("You attempt to reach the Hivenet, but find nothing!"))
return FALSE
var/mob/living/carbon/human/H = speaker
var/obj/item/organ/internal/vaurca/neuralsocket/S = H.internal_organs_by_name[BP_NEURAL_SOCKET]
var/obj/item/organ/internal/augment/language/vekatak/V = H.internal_organs_by_name[BP_AUG_LANGUAGE_VEKATAK]
@@ -1658,6 +1658,10 @@
to_chat(src, SPAN_DANGER("Your mind is dark, unable to communicate with the Hive."))
return
if(is_lemurian_sea_sector())
to_chat(src, SPAN_DANGER("The Fog cuts you off from the Hivenet."))
return
if(!istype(S) && !istype(V))
to_chat(src, SPAN_WARNING("You do not have a functional connection to the Hivenet!"))
return
@@ -2050,6 +2054,9 @@
if(!istype(S))
to_chat(src, SPAN_WARNING("You require a functional neural socket to do this!"))
return FALSE
if(is_lemurian_sea_sector())
to_chat(src, SPAN_DANGER("The Fog cuts you off from the Hivenet."))
return FALSE
if(S.last_action > world.time)
to_chat(src, SPAN_WARNING("You must wait before attempting another Hivenet action!"))
return FALSE
@@ -2185,6 +2192,10 @@
to_chat(src, SPAN_WARNING("You are not connected to the Hivenet!"))
return
if(is_lemurian_sea_sector())
to_chat(src, SPAN_WARNING("You attempt to reach the Hivenet, but find nothing!"))
return
if(within_jamming_range(src))
to_chat(src, SPAN_WARNING("You attempt to reach the Hivenet, but find nothing!"))
return
@@ -2204,6 +2215,10 @@
set desc = "Get a list of all vaurca currently on the Hivenet."
set category = "Hivenet"
if(is_lemurian_sea_sector())
to_chat(src, SPAN_WARNING("You attempt to query the Hivenet, but find nothing."))
return
var/list/all_vaurca = list()
for(var/mob/living/carbon/human/vaurca in GLOB.human_mob_list)
if(!vaurca.stat && isvaurca(vaurca) && vaurca.internal_organs_by_name[BP_NEURAL_SOCKET])
@@ -169,8 +169,8 @@
return default_language
return GLOB.all_languages[LANGUAGE_LOCAL_DRONE]
/mob/living/silicon/robot/drone/fall_impact()
..(damage_mod = 0.05) //reduces fall damage by 95%
/mob/living/silicon/robot/drone/fall_impact(levels_fallen, stopped_early = FALSE, var/damage_mod = 1)
..(levels_fallen, stopped_early, damage_mod * 0.05) //reduces fall damage by 95%
/mob/living/silicon/robot/drone/construction
// Look and feel
@@ -64,7 +64,7 @@
blood_overlay_icon = initial(blood_overlay_icon)
handle_blood(TRUE)
/mob/living/simple_animal/carp/fall_impact()
/mob/living/simple_animal/carp/fall_impact(levels_fallen, stopped_early = FALSE, var/damage_mod = 1)
src.visible_message(SPAN_NOTICE("\The [src] gently floats to a stop."))
return FALSE
@@ -209,7 +209,7 @@
. = ..()
set_flee_target(throwingdatum?.thrower?.resolve() ? throwingdatum.thrower.resolve() : src.loc)
/mob/living/simple_animal/cat/fall_impact()
/mob/living/simple_animal/cat/fall_impact(levels_fallen, stopped_early = FALSE, var/damage_mod = 1)
src.visible_message(SPAN_NOTICE("\The [src] lands softly on \the [loc]!"))
return FALSE
@@ -211,7 +211,7 @@
/mob/living/simple_animal/hostile/retaliate/minedrone/adjustHalLoss(var/damage)
return
/mob/living/simple_animal/hostile/retaliate/minedrone/fall_impact()
/mob/living/simple_animal/hostile/retaliate/minedrone/fall_impact(levels_fallen, stopped_early = FALSE, var/damage_mod = 1)
visible_message(SPAN_DANGER("\The [src] bounces harmlessly on its inflated wheels."))
return FALSE
+11 -5
View File
@@ -481,11 +481,13 @@ GLOBAL_LIST_INIT(organ_rel_size, list(
#define TILES_PER_SECOND 0.7
/// Shake the camera of the person viewing the mob SO REAL!
/// Takes the mob to shake, the time span to shake for, and the amount of tiles we're allowed to shake by in tiles
/// Takes the mob to shake, the time span to shake for, and the amount of tiles we're allowed to shake by in tiles.
/// Set drift to exactly TRUE for slower, gentler movement instead of impact-like shaking.
/// Duration isn't taken as a strict limit, since we don't trust our coders to not make things feel shitty. So it's more like a soft cap.
/proc/shake_camera(mob/M, duration, strength=1)
/proc/shake_camera(mob/M, duration, strength=1, drift = FALSE)
if(!M || !M.client || duration < 1)
return
var/drift_mode = (drift == TRUE)
var/client/C = M.client
var/oldx = C.pixel_x
var/oldy = C.pixel_y
@@ -505,8 +507,12 @@ GLOBAL_LIST_INIT(organ_rel_size, list(
var/x_pos = rand(min_x, max_x) + oldx
var/y_pos = rand(min_y, max_y) + oldy
//We take the smaller of our two distances so things still have the propencity to feel somewhat jerky
var/time = round(max(min(abs(last_x - x_pos), abs(last_y - y_pos)) * time_scalar, 1))
var/time
if(drift_mode)
time = round(clamp(max(abs(last_x - x_pos), abs(last_y - y_pos)) * time_scalar * 6, 6, 20))
else
//We take the smaller of our two distances so things still have the propencity to feel somewhat jerky
time = round(max(min(abs(last_x - x_pos), abs(last_y - y_pos)) * time_scalar, 1))
if (time_spent == 0)
animate(C, pixel_x=x_pos, pixel_y=y_pos, time=time)
@@ -518,7 +524,7 @@ GLOBAL_LIST_INIT(organ_rel_size, list(
//We go based on time spent, so there is a chance we'll overshoot our duration. Don't care
time_spent += time
animate(pixel_x=oldx, pixel_y=oldy, time=3)
animate(pixel_x=oldx, pixel_y=oldy, time = drift_mode ? 10 : 3)
#undef TILES_PER_SECOND