From c9bcef21979457e9b3556f63eea1cdf5badad66e Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Wed, 22 Apr 2026 06:08:44 -0500 Subject: [PATCH] Spacers get pos mood for achieving nograv on planets (#95818) ## About The Pull Request Spacers who manage to get nograv on a planet are given a positive moodlet, and are considered in space for their buffs/debuffs ## Why It's Good For The Game I don't remember if I was opposed to this in the past or why I didn't make it work this way in the first place. It's sensible that, if you manage to disable your own gravity, all of the negative effects (which are tied to you feeling heavy gravity) would be lifted. ## Changelog :cl: Melbert add: Spacers who manage to get nograv while on a planet are given a positive moodlet, and are considered in space for the purpose of their buffs/debuffs /:cl: --- .../signals/signals_mob/signals_mob_living.dm | 3 + code/datums/quirks/positive_quirks/spacer.dm | 55 ++++++++++++++++--- code/datums/status_effects/debuffs/spacer.dm | 14 +++++ code/modules/mob/living/living_movement.dm | 2 +- 4 files changed, 66 insertions(+), 8 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index 4c7df9de234..72ea3d18623 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -390,3 +390,6 @@ /// From /mob/living/on_looking_z_level_change() : (turf/old_turf, turf/new_turf) #define COMSIG_LIVING_LOOK_Z_CHANGE "living_look_z_change" + +/// From /mob/living/proc/refresh_gravity() : (new_gravity, old_gravity) +#define COMSIG_LIVING_GRAVITY_CHANGED "living_gravity_changed" diff --git a/code/datums/quirks/positive_quirks/spacer.dm b/code/datums/quirks/positive_quirks/spacer.dm index a1c7f83ab42..24d392985de 100644 --- a/code/datums/quirks/positive_quirks/spacer.dm +++ b/code/datums/quirks/positive_quirks/spacer.dm @@ -1,5 +1,6 @@ #define LAST_STATE_PLANET "on_planet" #define LAST_STATE_SPACE "in_space" +#define LAST_STATE_NOGRAV "in_nograv" /datum/quirk/spacer_born name = "Spacer" @@ -26,7 +27,7 @@ var/recover_period = 1 MINUTES /// TimerID for time spend in space VAR_FINAL/recovering_timer - /// Determines the last state we were in ([LAST_STATE_PLANET] or [LAST_STATE_SPACE]) + /// Determines the last state we were in ([LAST_STATE_PLANET], [LAST_STATE_SPACE], or [LAST_STATE_NOGRAV]) VAR_FINAL/last_state /datum/quirk/spacer_born/add(client/client_source) @@ -38,9 +39,10 @@ // It won't really make sense to walk 3 feet and then suddenly gain / lose gravity sickness. // If I'm proven wrong, swap this to use Moved. RegisterSignal(quirk_holder, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(spacer_moved)) + RegisterSignal(quirk_holder, COMSIG_LIVING_GRAVITY_CHANGED, PROC_REF(spacer_grav)) // Yes, it's assumed for planetary maps that you start at gravity sickness. - check_z(quirk_holder, skip_timers = TRUE) + update_effects(quirk_holder, skip_timers = TRUE) // drift slightly faster through zero G quirk_holder.inertia_move_multiplier *= 0.8 @@ -69,6 +71,7 @@ /datum/quirk/spacer_born/remove() UnregisterSignal(quirk_holder, COMSIG_MOVABLE_Z_CHANGED) + UnregisterSignal(quirk_holder, COMSIG_LIVING_GRAVITY_CHANGED) if(QDELING(quirk_holder)) return @@ -87,7 +90,13 @@ /datum/quirk/spacer_born/proc/spacer_moved(mob/living/source, turf/old_turf, turf/new_turf, same_z_layer) SIGNAL_HANDLER - check_z(source) + update_effects(source) + +/// Check on gravity change whether we should start or stop timers +/datum/quirk/spacer_born/proc/spacer_grav(mob/living/source, new_gravity, old_gravity) + SIGNAL_HANDLER + + update_effects(source) /** * Used to check if we should start or stop timers based on the quirk holder's location. @@ -95,9 +104,12 @@ * * afflicted - the mob arriving / same as quirk holder * * skip_timers - if TRUE, this is being done instantly / should not have feedback (such as in init) */ -/datum/quirk/spacer_born/proc/check_z(mob/living/spacer, skip_timers = FALSE) +/datum/quirk/spacer_born/proc/update_effects(mob/living/spacer, skip_timers = FALSE) if(is_on_a_planet(spacer)) - on_planet(spacer, skip_timers) + if(spacer.has_gravity()) + on_planet(spacer, skip_timers) + else + has_nograv(spacer, skip_timers) else in_space(spacer, skip_timers) @@ -168,9 +180,10 @@ deltimer(planetside_timer) planetside_timer = null + var/was_nograv = last_state == LAST_STATE_NOGRAV last_state = LAST_STATE_SPACE - if(skip_timers) + if(skip_timers || was_nograv) comfortably_in_space(afflicted, TRUE) return @@ -181,7 +194,7 @@ to_chat(afflicted, span_green("You start feeling better now that you're back in space.")) /** - * Ran when living back in space for a long enough period. + * Ran when living back in space, or just no-grav in general, for a long enough period. * * * afflicted - the mob arriving / same as quirk holder * * skip_timers - if TRUE, this is being done instantly / should not have feedback (such as in init) @@ -197,5 +210,33 @@ if(!skip_timers) to_chat(afflicted, span_green("You feel better.")) +// On a planet but has no gravity + +/** + * Ran when we are on a planet while having no gravity. + * + * * afflicted - the mob arriving / same as quirk holder + * * skip_timers - if TRUE, this is being done instantly / should not have feedback (such as in init) + */ +/datum/quirk/spacer_born/proc/has_nograv(mob/living/afflicted, skip_timers = FALSE) + if(last_state == LAST_STATE_NOGRAV) + return + if(planetside_timer) + deltimer(planetside_timer) + planetside_timer = null + if(recovering_timer) + deltimer(recovering_timer) + recovering_timer = null + + var/was_in_space = last_state == LAST_STATE_SPACE + last_state = LAST_STATE_NOGRAV + + afflicted.apply_status_effect(/datum/status_effect/spacer/gravity_wellness) + afflicted.add_mood_event("spacer", /datum/mood_event/spacer/on_planet/low_grav) + afflicted.add_movespeed_modifier(/datum/movespeed_modifier/spacer/in_space) + if(!skip_timers && !was_in_space) + to_chat(afflicted, span_green("You feel like you're back in space!")) + #undef LAST_STATE_PLANET #undef LAST_STATE_SPACE +#undef LAST_STATE_NOGRAV diff --git a/code/datums/status_effects/debuffs/spacer.dm b/code/datums/status_effects/debuffs/spacer.dm index 6f970eafac9..99b724b1d35 100644 --- a/code/datums/status_effects/debuffs/spacer.dm +++ b/code/datums/status_effects/debuffs/spacer.dm @@ -105,6 +105,20 @@ description = "I'm stationed on a planet. I'd love to be back in space." mood_change = -3 +/datum/mood_event/spacer/on_planet/low_grav + description = "This feels like I'm back home!" + mood_change = 3 + +/datum/mood_event/spacer/on_planet/low_grav/add_effects(...) + . = ..() + addtimer(CALLBACK(src, PROC_REF(lower_mood_bonus)), 5 MINUTES, TIMER_DELETE_ME) + +/datum/mood_event/spacer/on_planet/low_grav/proc/lower_mood_bonus() + mood_change -= 1 + owner.mob_mood.update_mood() + if(mood_change > 1) + addtimer(CALLBACK(src, PROC_REF(lower_mood_bonus)), 5 MINUTES, TIMER_DELETE_ME) + /datum/movespeed_modifier/spacer id = "spacer" diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 5e334f3ac75..8ff67ffb6d9 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -46,7 +46,7 @@ return update_gravity(gravity_state) - + SEND_SIGNAL(src, COMSIG_LIVING_GRAVITY_CHANGED, gravity_state, old_grav_state) if(gravity_state > STANDARD_GRAVITY) gravity_animate() else if(old_grav_state > STANDARD_GRAVITY)