From 4028970e091dcdae167e0519815d7fc97c35fa0e Mon Sep 17 00:00:00 2001 From: IndieanaJones <47086570+IndieanaJones@users.noreply.github.com> Date: Wed, 23 Dec 2020 13:38:01 -0500 Subject: [PATCH] [READY] Swarmer Balance Buffs (#55353) * Update Swarmers * Always Work With an Updated Version of The Game * Changed How Spawn Timer Works, Fixed Traps * Document force * Use Helpers --- code/modules/swarmers/swarmer.dm | 21 +++++++++---------- code/modules/swarmers/swarmer_objs.dm | 29 ++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/code/modules/swarmers/swarmer.dm b/code/modules/swarmers/swarmer.dm index 043283c0b1f..4fc64d049ea 100644 --- a/code/modules/swarmers/swarmer.dm +++ b/code/modules/swarmers/swarmer.dm @@ -35,8 +35,8 @@ maxbodytemp = 500 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 0 - melee_damage_lower = 15 - melee_damage_upper = 15 + melee_damage_lower = 30 + melee_damage_upper = 30 melee_damage_type = STAMINA damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD) @@ -69,7 +69,7 @@ ///Maximum amount of resources a swarmer can store var/max_resources = 100 ///List used for player swarmers to keep track of their drones - var/list/mob/living/simple_animal/hostile/swarmer/melee/dronelist + var/list/mob/living/simple_animal/hostile/swarmer/drone/dronelist ///Bitflags to store boolean conditions, such as whether the light is on or off. var/swarmer_flags = NONE @@ -352,7 +352,7 @@ * Returns the type of the swarmer to be created */ /mob/living/simple_animal/hostile/swarmer/proc/swarmer_type_to_create() - return /mob/living/simple_animal/hostile/swarmer/melee + return /mob/living/simple_animal/hostile/swarmer/drone /** * Called when a swarmer attempts to repair itself @@ -380,7 +380,7 @@ if(!mind) return for(var/d in dronelist) - var/mob/living/simple_animal/hostile/swarmer/melee/drone = d + var/mob/living/simple_animal/hostile/swarmer/drone/drone = d drone.swarmer_flags = ~SWARMER_LIGHT_ON drone.set_light_on(FALSE) return @@ -389,7 +389,7 @@ if(!mind) return for(var/d in dronelist) - var/mob/living/simple_animal/hostile/swarmer/melee/drone = d + var/mob/living/simple_animal/hostile/swarmer/drone/drone = d drone.swarmer_flags |= SWARMER_LIGHT_ON drone.set_light_on(TRUE) @@ -446,21 +446,18 @@ /** * # Swarmer Drone * - * Melee subtype of swarmers, always AI-controlled under normal circumstances. Cannot fire projectiles, but does double stamina damage on melee + * AI subtype of swarmers, always AI-controlled under normal circumstances. Automatically attacks nearby threats. */ -/mob/living/simple_animal/hostile/swarmer/melee +/mob/living/simple_animal/hostile/swarmer/drone icon_state = "swarmer_melee" icon_living = "swarmer_melee" - ranged = FALSE AIStatus = AI_ON - melee_damage_lower = 30 - melee_damage_upper = 30 /obj/projectile/beam/disabler/swarmer/on_hit(atom/target, blocked = FALSE) . = ..() if(!.) return - if((!istype(target, /mob/living/simple_animal) && !ishuman(target)) || !istype(firer, /mob/living/simple_animal/hostile/swarmer)) + if((!isanimal(target) && !ishuman(target)) || isswarmer(target)) return if(ishuman(target)) var/mob/living/carbon/human/possibleHulk = target diff --git a/code/modules/swarmers/swarmer_objs.dm b/code/modules/swarmers/swarmer_objs.dm index 2ec292c407a..4c7b276b21c 100644 --- a/code/modules/swarmers/swarmer_objs.dm +++ b/code/modules/swarmers/swarmer_objs.dm @@ -45,7 +45,7 @@ icon = 'icons/mob/swarmer.dmi' icon_state = "swarmer_console" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) - max_integrity = 400 + max_integrity = 500 layer = MASSIVE_OBJ_LAYER light_color = LIGHT_COLOR_CYAN light_range = 10 @@ -53,6 +53,8 @@ density = FALSE ///Whether or not a swarmer is currently being created by this beacon var/processing_swarmer = FALSE + ///Reference to all the swarmers currently alive this beacon has created + var/list/mob/living/simple_animal/hostile/swarmer/swarmerlist /obj/structure/swarmer_beacon/Initialize() . = ..() @@ -78,15 +80,15 @@ return FALSE var/mob/living/simple_animal/hostile/swarmer/newswarmer = new /mob/living/simple_animal/hostile/swarmer(src) newswarmer.key = user.key - addtimer(CALLBACK(src, .proc/release_swarmer, newswarmer), 30 SECONDS) - to_chat(newswarmer, "SWARMER CONSTRUCTION INITIALIZED. TIME TO COMPLETION: 30 SECONDS") + addtimer(CALLBACK(src, .proc/release_swarmer, newswarmer), (LAZYLEN(swarmerlist) * 2 SECONDS) + 5 SECONDS) + to_chat(newswarmer, "SWARMER CONSTRUCTION INITIALIZED.") processing_swarmer = TRUE return TRUE /** * Releases a swarmer from the beacon and tells it what to do * - * Occcurs 30 seconds after a ghost becomes a swarmer. The beacon releases it, tells it what to do, and opens itself up to spawn in a new swarmer. + * Occcurs 5 + (alive swarmers made from beacon * 2) seconds after a ghost becomes a swarmer. The beacon releases it, tells it what to do, and opens itself up to spawn in a new swarmer. * Arguments: * * swarmer - The swarmer being released and told what to do */ @@ -102,8 +104,25 @@ - YOU AND YOUR DRONES HAVE A STUN EFFECT ON MELEE. YOU ARE ALSO ARMED WITH A DISABLER PROJECTILE, USE THESE TO PREVENT ORGANICS FROM HALTING YOUR PROGRESS\n\ GLORY TO !*# $*#^") swarmer.forceMove(get_turf(src)) + LAZYADD(swarmerlist, swarmer) + RegisterSignal(swarmer, COMSIG_PARENT_QDELETING, .proc/remove_swarmer, swarmer) processing_swarmer = FALSE +/** + * Removes a swarmer from the beacon's list. + * + * Removes the swarmer from our list. + * Called specifically when a swarmer is about to be destroyed, so we don't have any null references. + * Arguments: + * * mob/swarmer - The swarmer to be removed from the list. + * * force - Parameter sent by the COSMIG_PARENT_QDELETING signal. Does nothing in this proc. + */ +/obj/structure/swarmer_beacon/proc/remove_swarmer(mob/swarmer, force) + SIGNAL_HANDLER + + UnregisterSignal(swarmer, COMSIG_PARENT_QDELETING) + swarmerlist -= swarmer + /obj/structure/swarmer/trap name = "swarmer trap" desc = "A quickly assembled trap that electrifies living beings and overwhelms machine sensors. Will not retain its form if damaged enough." @@ -116,7 +135,7 @@ var/mob/living/living_crosser = AM if(!istype(living_crosser, /mob/living/simple_animal/hostile/swarmer)) playsound(loc,'sound/effects/snap.ogg',50, TRUE, -1) - living_crosser.electrocute_act(0, src, 1, flags = SHOCK_NOGLOVES|SHOCK_ILLUSION) + living_crosser.electrocute_act(100, src, TRUE, flags = SHOCK_NOGLOVES|SHOCK_ILLUSION) if(iscyborg(living_crosser)) living_crosser.Paralyze(100) qdel(src)