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>
This commit is contained in:
MrMelbert
2023-05-31 10:51:07 -07:00
committed by GitHub
co-authored by IndieanaJones IndieanaJones
parent f125f4592c
commit e563148710
12 changed files with 318 additions and 115 deletions
@@ -256,4 +256,8 @@
disk_overlay = mutable_appearance('icons/mob/simple/carp.dmi', "disk_overlay")
new_overlays += disk_overlay
/mob/living/basic/carp/advanced
health = 40
obj_damage = 15
#undef RARE_CAYENNE_CHANCE
@@ -686,10 +686,11 @@
project_action = new(src)
project_action.Grant(grant_to)
grant_to.AddComponent(/datum/component/mind_linker, \
grant_to.AddComponent( \
/datum/component/mind_linker/active_linking, \
network_name = "Slime Link", \
linker_action_path = /datum/action/innate/link_minds, \
signals_which_destroy_us = list(COMSIG_SPECIES_LOSS), \
linker_action_path = /datum/action/innate/link_minds, \
)
//Species datums don't normally implement destroy, but JELLIES SUCK ASS OUT OF A STEEL STRAW
@@ -813,7 +814,7 @@
return FALSE
return TRUE
#undef JELLY_REGEN_RATE
#undef JELLY_REGEN_RATE_EMPTY
#undef BLOOD_VOLUME_LOSE_NUTRITION
@@ -73,14 +73,16 @@
var/on_unlink_message = "Your mind shatters as [src]'s Mansus Link leaves your mind."
AddComponent(/datum/component/mind_linker, \
AddComponent( \
/datum/component/mind_linker/active_linking, \
network_name = "Mansus Link", \
chat_color = "#568b00", \
post_unlink_callback = CALLBACK(src, PROC_REF(after_unlink)), \
speech_action_background_icon_state = "bg_heretic", \
speech_action_overlay_state = "bg_heretic_border", \
linker_action_path = /datum/action/cooldown/spell/pointed/manse_link, \
link_message = on_link_message, \
unlink_message = on_unlink_message, \
post_unlink_callback = CALLBACK(src, PROC_REF(after_unlink)), \
speech_action_background_icon_state = "bg_heretic", \
)
/mob/living/simple_animal/hostile/heretic_summon/raw_prophet/attack_animal(mob/living/simple_animal/user, list/modifiers)
@@ -24,8 +24,8 @@
name = "Space Dragon"
desc = "A vile, leviathan-esque creature that flies in the most unnatural way. Looks slightly similar to a space carp."
gender = NEUTER
maxHealth = 320
health = 320
maxHealth = 400
health = 400
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0.5, OXY = 1)
combat_mode = TRUE
speed = 0
@@ -283,7 +283,7 @@
for(var/obj/machinery/door/D in T.contents)
if(D.density)
return
delayFire += 1.5
delayFire += 1.0
addtimer(CALLBACK(src, PROC_REF(dragon_fire_line), T), delayFire)
/**
@@ -295,25 +295,52 @@
* Arguments:
* * turf/T - The turf to trigger the effects on.
*/
/mob/living/simple_animal/hostile/space_dragon/proc/dragon_fire_line(turf/T)
/mob/living/simple_animal/hostile/space_dragon/proc/dragon_fire_line(turf/fire_turf)
var/list/hit_list = list()
hit_list += src
new /obj/effect/hotspot(T)
T.hotspot_expose(700,50,1)
for(var/mob/living/L in T.contents)
if(L in hit_list)
new /obj/effect/hotspot(fire_turf)
fire_turf.hotspot_expose(700,50,1)
for(var/mob/living/living_target in fire_turf.contents)
if(living_target.faction_check_mob(src) && living_target != src)
hit_list += living_target
start_carp_speedboost(living_target)
if(living_target in hit_list)
continue
if(L.mind?.has_antag_datum(/datum/antagonist/space_carp))
if(living_target.mind?.has_antag_datum(/datum/antagonist/space_carp))
continue
hit_list += L
L.adjustFireLoss(30)
to_chat(L, span_userdanger("You're hit by [src]'s fire breath!"))
hit_list += living_target
living_target.adjustFireLoss(30)
to_chat(living_target, span_userdanger("You're hit by [src]'s fire breath!"))
// deals damage to mechs
for(var/obj/vehicle/sealed/mecha/M in T.contents)
if(M in hit_list)
for(var/obj/vehicle/sealed/mecha/mech_target in fire_turf.contents)
if(mech_target in hit_list)
continue
hit_list += M
M.take_damage(50, BRUTE, MELEE, 1)
hit_list += mech_target
mech_target.take_damage(50, BRUTE, MELEE, 1)
/**
* Applies the speed boost to carps when hit by space dragon's flame breath
*
* Applies the dragon rage effect to carps temporarily, giving them a glow and a speed boost.
* This lasts for 8 seconds.
* Arguments:
* * mob/living/target - The carp being affected.
*/
/mob/living/simple_animal/hostile/space_dragon/proc/start_carp_speedboost(mob/living/target)
target.add_filter("anger_glow", 3, list("type" = "outline", "color" = "#ff330030", "size" = 2))
target.add_movespeed_modifier(/datum/movespeed_modifier/dragon_rage)
addtimer(CALLBACK(src, PROC_REF(end_carp_speedboost), target), 8 SECONDS)
/**
* Remove the speed boost from carps when hit by space dragon's flame breath
*
* Removes the dragon rage effect from carps, removing their glow and speed boost.
* Arguments:
* * mob/living/target - The carp being affected.
*/
/mob/living/simple_animal/hostile/space_dragon/proc/end_carp_speedboost(mob/living/target)
target.remove_filter("anger_glow")
target.remove_movespeed_modifier(/datum/movespeed_modifier/dragon_rage)
/**
* Handles consuming and storing consumed things inside Space Dragon
@@ -325,7 +352,7 @@
*/
/mob/living/simple_animal/hostile/space_dragon/proc/eat(atom/movable/A)
if(A && A.loc != src)
playsound(src, 'sound/magic/demon_attack1.ogg', 100, TRUE)
playsound(src, 'sound/magic/demon_attack1.ogg', 60, TRUE)
visible_message(span_warning("[src] swallows [A] whole!"))
A.forceMove(src)
return TRUE
@@ -357,7 +384,7 @@
/mob/living/simple_animal/hostile/space_dragon/proc/useGust(timer)
if(timer != 10)
pixel_y = pixel_y + 2;
addtimer(CALLBACK(src, PROC_REF(useGust), timer + 1), 1.5)
addtimer(CALLBACK(src, PROC_REF(useGust), timer + 1), 1.2)
return
pixel_y = 0
icon_state = "spacedragon_gust_2"
@@ -366,20 +393,22 @@
overlay.appearance_flags = RESET_COLOR
add_overlay(overlay)
playsound(src, 'sound/effects/gravhit.ogg', 100, TRUE)
var/gust_locs = spiral_range_turfs(gust_distance, get_turf(src))
var/list/hit_things = list()
for(var/turf/T in gust_locs)
for(var/mob/living/L in T.contents)
if(L == src)
continue
hit_things += L
visible_message(span_boldwarning("[L] is knocked back by the gust!"))
to_chat(L, span_userdanger("You're knocked back by the gust!"))
var/dir_to_target = get_dir(get_turf(src), get_turf(L))
var/throwtarget = get_edge_target_turf(target, dir_to_target)
L.safe_throw_at(throwtarget, 10, 1, src)
L.Paralyze(50)
for (var/mob/living/candidate in view(gust_distance, src))
if(candidate == src || candidate.faction_check_mob(src))
continue
visible_message(span_boldwarning("[candidate] is knocked back by the gust!"))
to_chat(candidate, span_userdanger("You're knocked back by the gust!"))
var/dir_to_target = get_dir(get_turf(src), get_turf(candidate))
var/throwtarget = get_edge_target_turf(target, dir_to_target)
candidate.safe_throw_at(throwtarget, 10, 1, src)
candidate.Paralyze(50)
addtimer(CALLBACK(src, PROC_REF(reset_status)), 4 + ((tiredness * tiredness_mult) / 10))
tiredness = tiredness + (gust_tiredness * tiredness_mult)
/mob/living/simple_animal/hostile/space_dragon/spawn_with_antag
/mob/living/simple_animal/hostile/space_dragon/spawn_with_antag/mind_initialize()
. = ..()
mind.add_antag_datum(/datum/antagonist/space_dragon)
#undef DARKNESS_THRESHOLD