From 3aa72f7d31fe9ecd3e8c4d6a96caa4978ef15e92 Mon Sep 17 00:00:00 2001 From: keronshb Date: Fri, 14 May 2021 12:31:42 -0400 Subject: [PATCH] Space Dragon QOL and Additional Features (#54124) Co-authored-by: Jared-Fogle <35135081+Jared-Fogle@users.noreply.github.com> --- code/modules/events/space_dragon.dm | 44 ++++---- .../simple_animal/hostile/space_dragon.dm | 99 +++++++++++++++++- icons/mob/spacedragon.dmi | Bin 8111 -> 7686 bytes 3 files changed, 116 insertions(+), 27 deletions(-) diff --git a/code/modules/events/space_dragon.dm b/code/modules/events/space_dragon.dm index e6e197f5aa..ddf8e670c6 100644 --- a/code/modules/events/space_dragon.dm +++ b/code/modules/events/space_dragon.dm @@ -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 diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index f4ef134d07..68a9d11baa 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -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("[src] vomits up [consumed_mob]!") + 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, "Not a valid name, please try again.") + dragon_name() + return + visible_message("Your name is now [chosen_name], the feared Space Dragon.") + 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, "Not a valid color, please try again.") + 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, "Invalid color. Your color is not bright enough.") + 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 diff --git a/icons/mob/spacedragon.dmi b/icons/mob/spacedragon.dmi index 98f20ea8851d5c7c1cf3c03cb93aa7ec1d294074..3745284f422e696d5db42dbb53b4bca70e020145 100644 GIT binary patch literal 7686 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