Files
Bubberstation/code/datums/proximity_monitor/fields/gravity.dm
T
MrMelbert e563148710 Re-pr of #70522 "Space Dragon Update: Up Close and Personal" (#75607)
## About The Pull Request

This PR is a re-pr of ##70522 , with some tweaks: 

Notably:

- Wavespeak is not a say override, but instead uses a mindlink. Meaning
carp and space dragons can still talk verbally, but they can also use
telepathy to talk to all carp and the dragon.
- I would refactor Mind Linker a bit further to be a full datum rather
than a component but that's for another time.
- Removed the gravity aura component in favor of using the existing
forced gravity proximity monitor.
    - Also fixed a bug involving that. Lol.  
- Minor refactoring around the place.
- Reduced the volume on a lot of space dragon sounds. 
- Edited the roundend report for Space Dragons to collate all entries
into one per player.


![image](https://github.com/tgstation/tgstation/assets/51863163/5c3222b2-a80c-4df9-a060-4c5733ab712f)


## Why It's Good For The Game

Space dragon still plays pretty "play lame win game" right now, the
optimal strategy for them is to find the cheesiest spot for a portal and
spam their stun / fire breath to make it unreachable.

I was a fan of the original PR so I updated it and brought it back. 

## Changelog

🆑 IndieanaJones, Melbert
balance: Space Dragon can no longer choose its rift locations freely,
and instead is given 5 pre-determined locations to pick from instead
balance: Space Dragon itself has been buffed in order to support a more
confrontational playstyle, however its wing gust now requires a line of
sight to targets in order to affect them.
balance: Player Space Carp from rifts now have buffed health, but
reduced object damage values. They also gain a temporary speed boost
when hit by Space Dragon's fire breath instead of taking damage.
balance: Carp rift spawn times have been reduced, the healing AOE is now
a 3x3 instead of a 1x1, and apply normal gravity in a large radius
around them
balance: Space Dragon and rift carps now communicate on a private mind
link channel via action button similar to Raw Prophets and Slimepeople.
fix: Fixed Gravity Generator forced gravity not applying. 
fix: Intern Announcer will no longer replace Space Dragon announcements.
qol: The roundend report for space dragons now collates all players who
played a carp into one entry, rather than one per carp spawned.
qol: Space Dragon sounds are much less ear piercingly loud. 
/🆑

---------

Co-authored-by: IndieanaJones <mariosuperstar384@gmail.com>
Co-authored-by: IndieanaJones <47086570+IndieanaJones@users.noreply.github.com>
2023-05-31 10:51:07 -07:00

66 lines
2.4 KiB
Plaintext

// Proximity monitor applies forced gravity to all turfs in range.
/datum/proximity_monitor/advanced/gravity
edge_is_a_field = TRUE
var/gravity_value = 0
var/list/modified_turfs = list()
/datum/proximity_monitor/advanced/gravity/New(atom/_host, range, _ignore_if_not_on_turf = TRUE, gravity)
. = ..()
gravity_value = gravity
recalculate_field()
/datum/proximity_monitor/advanced/gravity/setup_field_turf(turf/target)
. = ..()
if(!isnull(modified_turfs[target]))
return
if(HAS_TRAIT(target, TRAIT_FORCED_GRAVITY))
return
target.AddElement(/datum/element/forced_gravity, gravity_value)
modified_turfs[target] = gravity_value
/datum/proximity_monitor/advanced/gravity/cleanup_field_turf(turf/target)
. = ..()
if(isnull(modified_turfs[target]))
return
var/grav_value = modified_turfs[target] || 0
target.RemoveElement(/datum/element/forced_gravity, grav_value)
modified_turfs -= target
// Subtype which pops up a balloon alert when a mob enters the field
/datum/proximity_monitor/advanced/gravity/warns_on_entrance
/// This is a list of mob refs that have recently entered the field.
/// We track it so that we don't spam a player who is stutter stepping in and out with balloon alerts.
var/list/recently_warned
/datum/proximity_monitor/advanced/gravity/warns_on_entrance/setup_field_turf(turf/target)
. = ..()
for(var/mob/living/guy in target)
warn_mob(guy, target)
/datum/proximity_monitor/advanced/gravity/warns_on_entrance/cleanup_field_turf(turf/target)
. = ..()
for(var/mob/living/guy in target)
warn_mob(guy, target)
/datum/proximity_monitor/advanced/gravity/warns_on_entrance/field_edge_crossed(atom/movable/movable, turf/location)
. = ..()
if(isliving(movable))
warn_mob(movable, location)
/datum/proximity_monitor/advanced/gravity/warns_on_entrance/field_edge_uncrossed(atom/movable/movable, turf/location)
. = ..()
if(isliving(movable))
warn_mob(movable, location)
/datum/proximity_monitor/advanced/gravity/warns_on_entrance/proc/warn_mob(mob/living/to_warn, turf/location)
var/mob_ref_key = REF(to_warn)
if(mob_ref_key in recently_warned)
return
location.balloon_alert(to_warn, "gravity [(location in modified_turfs) ? "shifts!" : "reverts..."]")
LAZYADD(recently_warned, mob_ref_key)
addtimer(CALLBACK(src, PROC_REF(clear_recent_warning), mob_ref_key), 3 SECONDS)
/datum/proximity_monitor/advanced/gravity/warns_on_entrance/proc/clear_recent_warning(mob_ref_key)
LAZYREMOVE(recently_warned, mob_ref_key)