Adjusts Swarmers (#31505)

* Adjusts Swarmers

* Reduced beam duration

* Clean up

* Clean up
This commit is contained in:
PollardTheDragon
2026-02-11 17:22:05 -05:00
committed by GitHub
parent 33652c77c9
commit cd6bc9f0c1
8 changed files with 94 additions and 5 deletions
@@ -41,7 +41,7 @@
environment_smash = ENVIRONMENT_SMASH_RWALLS // EAT EVERYTHING
step_type = FOOTSTEP_MOB_CLAW
is_ranged = TRUE
projectile_type = /obj/projectile/beam/disabler
projectile_type = /obj/projectile/beam/disabler/swarmer
projectile_sound = 'sound/weapons/taser2.ogg'
ranged_burst_count = 2
ranged_burst_interval = 0.5 SECONDS
@@ -163,7 +163,7 @@
L.apply_damage(30, STAMINA)
var/obj/item/restraints/handcuffs/cable/cyan/cuffs = new /obj/item/restraints/handcuffs/cable/cyan(src)
playsound(loc, cuffs.cuffsound, 15, TRUE, -10)
if(do_mob(src, C, 1 SECONDS))
if(do_mob(src, C, 2 SECONDS))
cuffs.apply_cuffs(target, src)
return FALSE
// Make it go away.
@@ -296,7 +296,10 @@
innate_actions = list(
/datum/action/cooldown/mob_cooldown/swarmer_trap = BB_SWARMER_TRAP_ACTION,
/datum/action/cooldown/mob_cooldown/swarmer_barrier = BB_SWARMER_BARRIER_ACTION,
/datum/action/cooldown/mob_cooldown/swarmer_share_resources = BB_SWARMER_RESOURCE_SHARE_ACTION,
)
/// Our creator
var/mob/living/basic/swarmer/progenitor
/mob/living/basic/swarmer/lesser/Initialize(mapload)
. = ..()
@@ -306,6 +309,13 @@
real_name = "Lesser Swarmer [rand(100,999)]-[pick("kappa", "sigma", "beta", "omicron", "iota", "epsilon", "omega", "gamma", "delta", "tau", "alpha")]"
name = real_name
/mob/living/basic/swarmer/lesser/death(gibbed)
progenitor = null
return ..()
/mob/living/basic/swarmer/lesser/proc/progenitor_death()
progenitor = null
// =====================
// MARK: Swarmer Structures
// =====================
@@ -67,6 +67,33 @@
new /obj/structure/swarmer/barricade(T)
StartCooldown()
/datum/action/cooldown/mob_cooldown/swarmer_share_resources
name = "Share Resources"
button_icon = 'icons/mob/swarmer.dmi'
button_icon_state = "ui_transfer"
desc = "Share 50 resources with the swarmer that created you."
click_to_activate = FALSE
melee_cooldown_time = CLICK_CD_CLICK_ABILITY
cooldown_time = 15 SECONDS
shared_cooldown = NONE
/datum/action/cooldown/mob_cooldown/swarmer_share_resources/Activate(atom/target)
var/mob/living/basic/swarmer/lesser/user = target
if(!istype(user))
to_chat(target, SPAN_WARNING("Incompatible hardware detected. Aborting."))
return
if(!user.progenitor)
to_chat(target, SPAN_WARNING("Progenitor not responding. Aborting."))
return
if(user.resources < 50)
to_chat(user, SPAN_WARNING("Insufficient resources. Aborting."))
return
user.progenitor.resources = clamp(user.progenitor.resources + 50, 0, user.progenitor.resource_max)
user.resources -= 50
user.Beam(user.progenitor, "light_beam", 'icons/effects/beam.dmi', 0.3 SECONDS, beam_color = LIGHT_COLOR_CYAN)
playsound(get_turf(user), 'sound/effects/empulse.ogg', 15, TRUE)
StartCooldown()
/datum/action/cooldown/mob_cooldown/swarmer_replicate
name = "Replicate"
button_icon = 'icons/mob/swarmer.dmi'
@@ -95,5 +122,7 @@
user.resources -= 50
user.visible_message(SPAN_WARNING("[user] manufactures a new swarmer."))
playsound(get_turf(user), 'sound/items/rped.ogg', 50, TRUE)
new /mob/living/basic/swarmer/lesser(T)
var/mob/living/basic/swarmer/lesser/child = new /mob/living/basic/swarmer/lesser(T)
child.progenitor = user
child.RegisterSignal(user, COMSIG_MOB_DEATH, TYPE_PROC_REF(/mob/living/basic/swarmer/lesser, progenitor_death))
StartCooldown()
@@ -40,6 +40,7 @@
/datum/ai_planning_subtree/swarmer_find_construction_target,
/datum/ai_planning_subtree/swarmer_create_trap,
/datum/ai_planning_subtree/swarmer_create_barricade,
/datum/ai_planning_subtree/swarmer_share_resources,
/datum/ai_planning_subtree/attack_obstacle_in_path/avoid_breaches/walls/swarmer_hunting,
/datum/ai_planning_subtree/find_and_hunt_target/corpses/swarmer,
/datum/ai_planning_subtree/find_and_hunt_target/swarmer_objects,
@@ -296,3 +297,46 @@
/datum/ai_behavior/swarmer_create_barricade/finish_action(datum/ai_controller/controller, succeeded, action_key, target_key)
controller.clear_blackboard_key(target_key)
return ..()
/// Run the resource sharing behavior
/datum/ai_planning_subtree/swarmer_share_resources
/// Key where the share action is stored
var/action_key = BB_SWARMER_RESOURCE_SHARE_ACTION
/datum/ai_planning_subtree/swarmer_share_resources/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
var/mob/living/basic/swarmer/lesser/user = controller.pawn
if(!istype(user))
return
if(!user.progenitor)
return
if(user.resources < 50)
return
if(!controller.blackboard_key_exists(action_key))
return
var/datum/action/cooldown/mob_cooldown/swarmer_share_resources/share_action = controller.blackboard[action_key]
if(share_action.IsAvailable())
controller.queue_behavior(/datum/ai_behavior/swarmer_share_resources, action_key)
return SUBTREE_RETURN_FINISH_PLANNING
/// Share resources with the parent swarmer
/datum/ai_behavior/swarmer_share_resources
action_cooldown = 15 SECONDS
required_distance = 0
behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
/datum/ai_behavior/swarmer_share_resources/setup(datum/ai_controller/controller, action_key)
var/datum/action/cooldown/mob_cooldown/swarmer_share_resources/share_action = controller.blackboard[action_key]
var/mob/living/basic/swarmer/user = controller.pawn
if(!istype(user))
return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
if(!share_action || user.resources < 50)
return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
return ..()
/datum/ai_behavior/swarmer_share_resources/perform(seconds_per_tick, datum/ai_controller/controller, action_key)
. = ..()
var/datum/action/cooldown/mob_cooldown/swarmer_share_resources/share_action = controller.blackboard[action_key]
if(share_action?.Trigger())
return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED