Space Dragon QOL and Additional Features (#54124)
Co-authored-by: Jared-Fogle <35135081+Jared-Fogle@users.noreply.github.com>
This commit is contained in:
@@ -1,9 +1,8 @@
|
||||
/datum/round_event_control/space_dragon
|
||||
name = "Spawn Space Dragon"
|
||||
typepath = /datum/round_event/ghost_role/space_dragon
|
||||
weight = 10
|
||||
max_occurrences = 1
|
||||
weight = 8
|
||||
earliest_start = 70 MINUTES
|
||||
min_players = 20
|
||||
|
||||
/datum/round_event/ghost_role/space_dragon
|
||||
@@ -16,30 +15,31 @@
|
||||
|
||||
|
||||
/datum/round_event/ghost_role/space_dragon/spawn_role()
|
||||
var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN)
|
||||
if(!candidates.len)
|
||||
return NOT_ENOUGH_PLAYERS
|
||||
|
||||
var/mob/dead/selected = pick(candidates)
|
||||
|
||||
var/datum/mind/player_mind = new /datum/mind(selected.key)
|
||||
player_mind.active = TRUE
|
||||
|
||||
var/list/spawn_locs = list()
|
||||
for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list)
|
||||
spawn_locs += (C.loc)
|
||||
for(var/obj/effect/landmark/carpspawn/carp_spawn in GLOB.landmarks_list)
|
||||
if(!isturf(carp_spawn.loc))
|
||||
stack_trace("Carp spawn found not on a turf: [carp_spawn.type] on [isnull(carp_spawn.loc) ? "null" : carp_spawn.loc.type]")
|
||||
continue
|
||||
spawn_locs += carp_spawn.loc
|
||||
if(!spawn_locs.len)
|
||||
message_admins("No valid spawn locations found, aborting...")
|
||||
return MAP_ERROR
|
||||
|
||||
var/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/S = new ((pick(spawn_locs)))
|
||||
player_mind.transfer_to(S)
|
||||
player_mind.assigned_role = "Space Dragon"
|
||||
player_mind.special_role = "Space Dragon"
|
||||
player_mind.add_antag_datum(/datum/antagonist/space_dragon)
|
||||
playsound(S, 'sound/magic/ethereal_exit.ogg', 50, 1, -1)
|
||||
message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Space Dragon by an event.")
|
||||
log_game("[key_name(S)] was spawned as a Space Dragon by an event.")
|
||||
spawned_mobs += S
|
||||
var/list/candidates = get_candidates(ROLE_SPACE_DRAGON, null, ROLE_SPACE_DRAGON)
|
||||
if(!candidates.len)
|
||||
return NOT_ENOUGH_PLAYERS
|
||||
|
||||
var/mob/dead/selected = pick(candidates)
|
||||
var/key = selected.key
|
||||
|
||||
var/mob/living/simple_animal/hostile/space_dragon/dragon = new (pick(spawn_locs))
|
||||
dragon.key = key
|
||||
dragon.mind.assigned_role = "Space Dragon"
|
||||
dragon.mind.special_role = "Space Dragon"
|
||||
dragon.mind.add_antag_datum(/datum/antagonist/space_dragon)
|
||||
playsound(dragon, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1)
|
||||
message_admins("[ADMIN_LOOKUPFLW(dragon)] has been made into a Space Dragon by an event.")
|
||||
log_game("[key_name(dragon)] was spawned as a Space Dragon by an event.")
|
||||
spawned_mobs += dragon
|
||||
return SUCCESSFUL_SPAWN
|
||||
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
#define CHARGE_FINALWARNING 1
|
||||
/// The carp rift is now fully charged.
|
||||
#define CHARGE_COMPLETED 2
|
||||
/// The darkness threshold for space dragon when choosing a color
|
||||
#define DARKNESS_THRESHOLD 0.5
|
||||
|
||||
/**
|
||||
* # Space Dragon
|
||||
@@ -79,6 +81,8 @@
|
||||
var/datum/action/innate/space_dragon/gust_attack/gust
|
||||
/// The innate ability to summon rifts
|
||||
var/datum/action/innate/space_dragon/summon_rift/rift
|
||||
/// The color of the space dragon.
|
||||
var/chosen_color
|
||||
|
||||
/mob/living/simple_animal/hostile/space_dragon/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -91,9 +95,23 @@
|
||||
rift = new
|
||||
rift.Grant(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/space_dragon/Login()
|
||||
. = ..()
|
||||
if(!chosen_color)
|
||||
dragon_name()
|
||||
color_selection()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/space_dragon/Life(mapload)
|
||||
. = ..()
|
||||
tiredness = max(tiredness - 1, 0)
|
||||
for(var/mob/living/consumed_mob in src)
|
||||
if(consumed_mob.stat == DEAD)
|
||||
continue
|
||||
playsound(src, 'sound/effects/splat.ogg', 50, TRUE)
|
||||
visible_message("<span class='danger'>[src] vomits up [consumed_mob]!</span>")
|
||||
consumed_mob.forceMove(loc)
|
||||
consumed_mob.Paralyze(50)
|
||||
if(rifts_charged == 3 && !objective_complete)
|
||||
victory()
|
||||
if(riftTimer == -1)
|
||||
@@ -153,12 +171,72 @@
|
||||
empty_contents()
|
||||
if(!objective_complete)
|
||||
destroy_rifts()
|
||||
add_overlay()
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/space_dragon/wabbajack_act(mob/living/new_mob)
|
||||
empty_contents()
|
||||
. = ..()
|
||||
|
||||
/**
|
||||
* Allows space dragon to choose its own name.
|
||||
*
|
||||
* Prompts the space dragon to choose a name, which it will then apply to itself.
|
||||
* If the name is invalid, will re-prompt the dragon until a proper name is chosen.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/dragon_name()
|
||||
var/chosen_name = sanitize_name(reject_bad_text(stripped_input(src, "What would you like your name to be?", "Choose Your Name", real_name, MAX_NAME_LEN)))
|
||||
if(!chosen_name)
|
||||
to_chat(src, "<span class='warning'>Not a valid name, please try again.</span>")
|
||||
dragon_name()
|
||||
return
|
||||
visible_message("<span class='notice'>Your name is now <span class='name'>[chosen_name]</span>, the feared Space Dragon.</span>")
|
||||
fully_replace_character_name(null, chosen_name)
|
||||
|
||||
/**
|
||||
* Allows space dragon to choose a color for itself.
|
||||
*
|
||||
* Prompts the space dragon to choose a color, from which it will then apply to itself.
|
||||
* If an invalid color is given, will re-prompt the dragon until a proper color is chosen.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/color_selection()
|
||||
chosen_color = input(src,"What would you like your color to be?","Choose Your Color", COLOR_WHITE) as color|null
|
||||
if(!chosen_color) //redo proc until we get a color
|
||||
to_chat(src, "<span class='warning'>Not a valid color, please try again.</span>")
|
||||
color_selection()
|
||||
return
|
||||
var/temp_hsv = RGBtoHSV(chosen_color)
|
||||
if(chosen_color == COLOR_BLACK)
|
||||
chosen_color = COLOR_WHITE
|
||||
else if(ReadHSV(temp_hsv)[3] < DARKNESS_THRESHOLD)
|
||||
to_chat(src, "<span class='danger'>Invalid color. Your color is not bright enough.</span>")
|
||||
color_selection()
|
||||
return
|
||||
add_atom_colour(chosen_color, FIXED_COLOUR_PRIORITY)
|
||||
add_dragon_overlay()
|
||||
|
||||
/**
|
||||
* Adds the proper overlay to the space dragon.
|
||||
*
|
||||
* Clears the current overlay on space dragon and adds a proper one for whatever animation he's in.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/add_dragon_overlay()
|
||||
cut_overlays()
|
||||
if(stat == DEAD)
|
||||
var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_dead")
|
||||
overlay.appearance_flags = RESET_COLOR
|
||||
add_overlay(overlay)
|
||||
return
|
||||
if(!using_special)
|
||||
var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_base")
|
||||
overlay.appearance_flags = RESET_COLOR
|
||||
add_overlay(overlay)
|
||||
return
|
||||
if(using_special)
|
||||
var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_gust")
|
||||
overlay.appearance_flags = RESET_COLOR
|
||||
add_overlay(overlay)
|
||||
|
||||
/**
|
||||
* Determines a line of turfs from sources's position to the target with length range.
|
||||
*
|
||||
@@ -273,6 +351,7 @@
|
||||
if(stat != DEAD)
|
||||
icon_state = "spacedragon"
|
||||
using_special = FALSE
|
||||
add_dragon_overlay()
|
||||
|
||||
/**
|
||||
* Handles Space Dragon's temporary empowerment after boosting a rift.
|
||||
@@ -284,11 +363,11 @@
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/rift_empower(is_empowered)
|
||||
if(is_empowered)
|
||||
fully_heal()
|
||||
color = "#FF0000"
|
||||
add_filter("anger_glow", 3, list("type" = "outline", "color" = "#ff330030", "size" = 5))
|
||||
set_varspeed(-0.5)
|
||||
addtimer(CALLBACK(src, .proc/rift_empower, FALSE), 300)
|
||||
else
|
||||
color = "#FFFFFF"
|
||||
remove_filter("anger_glow")
|
||||
set_varspeed(0)
|
||||
|
||||
/**
|
||||
@@ -323,6 +402,10 @@
|
||||
return
|
||||
pixel_y = 0
|
||||
icon_state = "spacedragon_gust_2"
|
||||
cut_overlays()
|
||||
var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_gust_2")
|
||||
overlay.appearance_flags = RESET_COLOR
|
||||
add_overlay(overlay)
|
||||
playsound(src, 'sound/effects/gravhit.ogg', 100, TRUE)
|
||||
var/gust_locs = spiral_range_turfs(3, get_turf(src))
|
||||
var/list/hit_things = list()
|
||||
@@ -378,6 +461,7 @@
|
||||
return
|
||||
S.using_special = TRUE
|
||||
S.icon_state = "spacedragon_gust"
|
||||
S.add_dragon_overlay()
|
||||
S.useGust(0)
|
||||
|
||||
/datum/action/innate/space_dragon/summon_rift
|
||||
@@ -480,9 +564,13 @@
|
||||
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(hostilehere))
|
||||
H.color = "#0000FF"
|
||||
|
||||
// If we're fully charged, just start mass spawning carp.
|
||||
if(charge_state == CHARGE_COMPLETED && DT_PROB(1.25, delta_time))
|
||||
new /mob/living/simple_animal/hostile/carp(loc)
|
||||
// If we're fully charged, just start mass spawning carp and move around.
|
||||
if(charge_state == CHARGE_COMPLETED)
|
||||
if(DT_PROB(1.25, delta_time))
|
||||
new /mob/living/simple_animal/hostile/carp(loc)
|
||||
if(DT_PROB(1.5, delta_time))
|
||||
var/rand_dir = pick(GLOB.cardinals)
|
||||
Move(get_step(src, rand_dir), rand_dir)
|
||||
return
|
||||
|
||||
// Increase time trackers and check for any updated states.
|
||||
@@ -577,3 +665,4 @@
|
||||
#undef CHARGE_ONGOING
|
||||
#undef CHARGE_FINALWARNING
|
||||
#undef CHARGE_COMPLETED
|
||||
#undef DARKNESS_THRESHOLD
|
||||
|
||||
Reference in New Issue
Block a user