MILLA phase 2 (#27659)

* MILLA phase 2

* Lint.

* Build Rust library

* Assorted bugfixes and tweaks

* Simplify fire mechanics and make hotspot sending to DM more reliable.

* Assorted tweaks, fixed an issue in the core engine and removed the softcap it made necesary.

* SM fixes, slower plasmafire, less overpowered pyro anomalies, and air alarm improvements.

* Review fixes.

* Build Rust library

* Unbalanced icon.

* Rebalance immovable rods.

* Unbalanced has alerts, can fight airflow (but get slowed)

* Build Rust library

* Stronger space cooling, slower temperature flow, faster burns, burnt floors, and a hotspot display fix.

* Build Rust library

* Tweaks to avoid merge conflict

* Oops.

* Build Rust library

* Rebalance wind.

* Rebalance temperature flow and space cooling.

* Fix gas flamethrower.

* Build Rust library

* Make air push slowdown directional, so you don't get slowed while moving with the air.

* Variable name cleanup.

* Reduce the speed of wind pushes.

* Prevent wind pushes from breaking your pull.

* Prevent swaps during wind push.

* Made supermatter crytals reliably run last in atmos machinery.

* Sped up plasmafire burning, but dropped the minimum burn amount.

* Rebalanced SM heat output.

* Rebalanced pyro anomaly.

* Build Rust library

* Lint

* Build Rust library

* Uncap fuel burnt readout.

* Added Custom air alarm mode, dropped Refill cap to ONE_ATMOSPHERE.

* Updated air alarm modes to use pressure settings instead of ONE_ATMOSPHERE

* Added a list of areas not in Filtering to atmos alert computer.

* Increase pressure gradient and vent output, especially at low distro pressure.

* Changed Immovable Rod from Moderate to Major.

* Lint

* Build Rust library

* More lint!

* Build Rust library

* Magboots, scaled slowdown, and nukie borg immunity

* Wind image

* Wind v2

* Wind v3

* pngcrush

* pngcrush again

* Moved hotspot removal into SSair, add wind effect.

* Lint

* Build Rust library

* Fix hotspots.

* Hotspot visual based on gas burnt

* Build Rust library

* Scaled wind to gas amount, stopped first wind push while moving.

* Made Rust panic logging safer.

* Made MILLA full tick and sleep timers more honest.

* Pressure overlay, ghost mode, atmos goggles.

* Build Rust library

* Lint

* Build Rust library

* More lint-y stuff.

* Build Rust library

* Repair pressure overlay if it loses its loc.

* Bind pressure overlays to their tile better.

* Build Rust library

* Make the pressure overlay work on z=1 and not proliferate effects.

* Don't block the supply shuttle.

* Don't fine for special effects.

* Maybe don't fine for ghosts, either.

* Build Rust library

* Make pressure overlay play nice with shuttles.

* Build Rust library

* Pressure scanning for borgs.

* Build Rust library

* Lint

* Build Rust library

* Made explosions not generate so much wind.

* Removed an old and non-functional proc.

* Clientless mobs can get pushed again.

* Build Rust library

* cargo fmt

* Build Rust library

* Don't divide by zero.

* Plasmafire generator for the Shadow

* Update shadow to use plasmafire generators

* Fix shadow's plasmafire generators going out on depart.

* Prevent heat2color from runtiming at absolute zero.

* Better nanofrost

* Build Rust library

* Singularity immunity

* Build Rust library

* Add back meson mode to atmospheric scanner goggles, so they don't stare deeply into the SM

* Build Rust library

* Dump panic outputs into data/ instead.

* Build Rust library

* Apply suggestions from code review

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Charlie Nolan <funnyman3595@gmail.com>

* Saner handling of MILLA crash.

* Build Rust library

---------

Signed-off-by: Charlie Nolan <funnyman3595@gmail.com>
Co-authored-by: paradisess13[bot] <165046124+paradisess13[bot]@users.noreply.github.com>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
This commit is contained in:
Charlie Nolan
2025-01-01 20:12:05 +00:00
committed by GitHub
co-authored by Burzah paradisess13[bot] <165046124+paradisess13[bot]@users.noreply.github.com>
parent b7c800727e
commit e6f99049f6
95 changed files with 2442 additions and 1708 deletions
+16
View File
@@ -30,6 +30,8 @@
RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_UNKNOWN), PROC_REF(on_unknown_trait))
RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_UNKNOWN), PROC_REF(on_unknown_trait))
RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_PRESSURE_VISION), PROC_REF(on_pressure_vision_trait_gain))
RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_PRESSURE_VISION), PROC_REF(on_pressure_vision_trait_loss))
/// Called when [TRAIT_KNOCKEDOUT] is added to the mob.
/mob/living/proc/on_knockedout_trait_gain(datum/source)
@@ -172,3 +174,17 @@
/mob/living/proc/on_unknown_trait_part_2()
name = get_visible_name()
sec_hud_set_ID()
/// Called when [TRAIT_PRESSURE_VISION] is added to the mob.
/mob/living/proc/on_pressure_vision_trait_gain(datum/source)
SIGNAL_HANDLER
var/datum/atom_hud/data/pressure/hud = GLOB.huds[DATA_HUD_PRESSURE]
if(!(src in hud.hudusers))
hud.add_hud_to(src)
/// Called when [TRAIT_PRESSURE_VISION] is removed from the mob.
/mob/living/proc/on_pressure_vision_trait_loss(datum/source)
SIGNAL_HANDLER
var/datum/atom_hud/data/pressure/hud = GLOB.huds[DATA_HUD_PRESSURE]
if(src in hud.hudusers)
hud.remove_hud_from(src)
+33 -35
View File
@@ -121,6 +121,10 @@
if(moving_diagonally) //no mob swap during diagonal moves.
return TRUE
if(has_status_effect(STATUS_EFFECT_UNBALANCED))
// Don't swap while being shoved by air.
return TRUE
if(a_intent == INTENT_HELP) // Help intent doesn't mob swap a mob pulling a structure
if(isstructure(M.pulling) || isstructure(pulling))
return TRUE
@@ -589,6 +593,11 @@
/mob/living/proc/UpdateDamageIcon()
return
/mob/living/get_spacemove_backup(movement_dir)
if(movement_dir == 0 && has_status_effect(STATUS_EFFECT_UNBALANCED))
return
return ..()
/mob/living/Move(atom/newloc, direct, movetime)
if(buckled && buckled.loc != newloc) //not updating position
if(!buckled.anchored)
@@ -683,41 +692,7 @@
/mob/living/experience_pressure_difference(flow_x, flow_y, pressure_resistance_prob_delta = 0)
if(buckled)
return
if(client && client.move_delay >= world.time + world.tick_lag * 2)
pressure_resistance_prob_delta -= 30
var/list/turfs_to_check = list()
if(has_limbs)
var/direction = 0
if(flow_x > 100)
direction |= EAST
if(flow_x < -100)
direction |= WEST
if(flow_y > 100)
direction |= NORTH
if(flow_y < -100)
direction |= SOUTH
var/turf/T = get_step(src, angle2dir(dir2angle(direction) + 90))
if(T)
turfs_to_check += T
T = get_step(src, angle2dir(dir2angle(direction) - 90))
if(T)
turfs_to_check += T
for(var/t in turfs_to_check)
T = t
if(T.density)
pressure_resistance_prob_delta -= 20
continue
for(var/atom/movable/AM in T)
if(AM.density && AM.anchored)
pressure_resistance_prob_delta -= 20
break
..(flow_x, flow_y, pressure_resistance_prob_delta)
..()
/*//////////////////////
START RESIST PROCS
@@ -982,6 +957,29 @@
var/datum/status_effect/incapacitating/slowed/S = IsSlowed()
if(S)
. += S.slowdown_value
else
// Only apply directional slow if we don't have a full slow.
var/datum/status_effect/incapacitating/directional_slow/DS = has_status_effect(STATUS_EFFECT_DIRECTIONAL_SLOW)
if(DS)
if(DS.direction == last_move)
// Moving directly in the direction we're slowed, full penalty
. += DS.slowdown_value
else if(REVERSE_DIR(DS.direction) == last_move)
// Moving directly opposite to the slow, no penalty.
// Lint doesn't like this block being empty so, uh, add zero, I guess.
. += 0
else if(IS_DIR_CARDINAL(DS.direction) || IS_DIR_CARDINAL(last_move))
if(DS.direction & last_move)
// Moving roughly in the direction we're slowed, full penalty.
. += DS.slowdown_value
else if(!(REVERSE_DIR(DS.direction) & last_move))
// Moving perpendicular to the slow, partial penalty.
. += DS.slowdown_value / 2
// Moving roughly opposite to the slow, no penalty.
else
// Diagonal move perpendicular to the slow, partial penalty.
. += DS.slowdown_value / 2
if(forced_look)
. += DIRECTION_LOCK_SLOWDOWN
if(ignorewalk)
+1 -1
View File
@@ -228,7 +228,7 @@
if(!G || G.oxygen() < 1)
ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire
return FALSE
T.hotspot_expose(700, 50, 1)
T.hotspot_expose(700, 10)
SEND_SIGNAL(src, COMSIG_LIVING_FIRE_TICK)
return TRUE
@@ -512,26 +512,26 @@ STATUS EFFECTS
/mob/living/proc/IsSlowed()
return has_status_effect(STATUS_EFFECT_SLOWED)
/mob/living/proc/Slowed(amount, _slowdown_value)
/mob/living/proc/Slowed(amount, slowdown_value)
var/datum/status_effect/incapacitating/slowed/S = IsSlowed()
if(S)
S.duration = max(world.time + amount, S.duration)
S.slowdown_value = _slowdown_value
S.slowdown_value = slowdown_value
else if(amount > 0)
S = apply_status_effect(STATUS_EFFECT_SLOWED, amount, _slowdown_value)
S = apply_status_effect(STATUS_EFFECT_SLOWED, amount, slowdown_value)
return S
/mob/living/proc/SetSlowed(amount, _slowdown_value)
/mob/living/proc/SetSlowed(amount, slowdown_value)
var/datum/status_effect/incapacitating/slowed/S = IsSlowed()
if(amount <= 0 || _slowdown_value <= 0)
if(amount <= 0 || slowdown_value <= 0)
if(S)
qdel(S)
else
if(S)
S.duration = amount
S.slowdown_value = _slowdown_value
S.slowdown_value = slowdown_value
else
S = apply_status_effect(STATUS_EFFECT_SLOWED, amount, _slowdown_value)
S = apply_status_effect(STATUS_EFFECT_SLOWED, amount, slowdown_value)
return S
@@ -40,6 +40,7 @@
#define MODE_MESON "meson"
#define MODE_TRAY "t-ray"
#define MODE_RAD "radiation"
#define MODE_PRESSURE "pressure"
#define RAD_RANGE 5
/datum/action/innate/robot_sight/engineering_scanner
@@ -47,7 +48,7 @@
sight_mode = BORGMESON
button_overlay_icon = 'icons/obj/clothing/glasses.dmi'
button_overlay_icon_state = "trayson-meson"
var/list/mode_list = list(MODE_NONE = MODE_MESON, MODE_MESON = MODE_TRAY, MODE_TRAY = MODE_RAD, MODE_RAD = MODE_NONE)
var/list/mode_list = list(MODE_NONE = MODE_MESON, MODE_MESON = MODE_TRAY, MODE_TRAY = MODE_RAD, MODE_RAD = MODE_PRESSURE, MODE_PRESSURE = MODE_NONE)
var/mode = MODE_NONE
/datum/action/innate/robot_sight/engineering_scanner/Activate()
@@ -67,8 +68,13 @@
else
STOP_PROCESSING(SSobj, src)
if(mode == MODE_PRESSURE)
ADD_TRAIT(R, TRAIT_PRESSURE_VISION, "borgsight")
else
REMOVE_TRAIT(R, TRAIT_PRESSURE_VISION, "borgsight")
/datum/action/innate/robot_sight/engineering_scanner/Deactivate()
return
REMOVE_TRAIT(owner, TRAIT_PRESSURE_VISION, "borgsight")
/datum/action/innate/robot_sight/engineering_scanner/process()
var/mob/living/silicon/robot/user = owner
@@ -84,6 +90,7 @@
#undef MODE_MESON
#undef MODE_TRAY
#undef MODE_RAD
#undef MODE_PRESSURE
#undef RAD_RANGE
/datum/action/innate/robot_magpulse
@@ -25,5 +25,6 @@
return ..() || mob_negates_gravity()
/mob/living/silicon/robot/experience_pressure_difference(flow_x, flow_y)
if(!HAS_TRAIT(src, TRAIT_MAGPULSE))
return ..()
if(HAS_TRAIT(src, TRAIT_MAGPULSE))
return
..()
@@ -40,6 +40,11 @@
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
/mob/living/silicon/robot/syndicate/air_push(direction, strength)
// Syndicate borgs ignore airflow, because they're bloody expensive.
// This should probably be revisited later, as part of a broader move_resist/move_force/pull_force rework.
return
/mob/living/silicon/robot/syndicate/medical
base_icon = "syndi-medi"
icon_state = "syndi-medi"
@@ -596,7 +596,7 @@ Difficulty: Hard
var/obj/effect/hotspot/hotspot = new /obj/effect/hotspot/fake(T)
hotspot.temperature = 1000
hotspot.recolor()
T.hotspot_expose(700,50,1)
T.hotspot_expose(700, 50)
if(mode == VORTEX)
var/turf/T = get_turf(src)
for(var/atom/A in T)
@@ -282,7 +282,7 @@ Difficulty: Medium
var/obj/effect/hotspot/hotspot = new /obj/effect/hotspot/fake(T)
hotspot.temperature = 1000
hotspot.recolor()
T.hotspot_expose(700,50,1)
T.hotspot_expose(700, 50)
for(var/mob/living/L in T.contents)
if((L in hit_list) || L == source)
continue
+1
View File
@@ -75,6 +75,7 @@
IMPMINDSHIELD_HUD = 'icons/mob/hud/sechud.dmi',
IMPCHEM_HUD = 'icons/mob/hud/sechud.dmi',
IMPTRACK_HUD = 'icons/mob/hud/sechud.dmi',
PRESSURE_HUD = 'icons/effects/effects.dmi',
)
for(var/hud in hud_possible)