diff --git a/code/__DEFINES/ai/swarmer_defines.dm b/code/__DEFINES/ai/swarmer_defines.dm
deleted file mode 100644
index fd77592ce38..00000000000
--- a/code/__DEFINES/ai/swarmer_defines.dm
+++ /dev/null
@@ -1,9 +0,0 @@
-// Swarmers
-/// Key where we store the replication ability
-#define BB_SWARMER_REPLICATE_ACTION "BB_swarmer_replicate_action"
-/// Our construction target
-#define BB_SWARMER_CONSTRUCT_TARGET "BB_swarmer_construct_target"
-/// Key where we define the trap construction ability
-#define BB_SWARMER_TRAP_ACTION "BB_swarmer_trap_action"
-/// Key where we define the barrier construction ability
-#define BB_SWARMER_BARRIER_ACTION "BB_swarmer_barrier_action"
diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm
index 8f505f9003c..0a5574357d7 100644
--- a/code/__HELPERS/trait_helpers.dm
+++ b/code/__HELPERS/trait_helpers.dm
@@ -565,11 +565,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// A web is being spun on this turf presently
#define TRAIT_SPINNING_WEB_TURF "spinning_web_turf"
-/// A swarmer construct is being built here
-#define TRAIT_SWARMER_CONSTRUCTION "swarmer_construction_turf"
-/// A swarmer is deconstructing this already
-#define TRAIT_SWARMER_DISINTEGRATING "swarmer_disintegrating"
-
//***** EFFECT TRAITS *****//
// Causes the effect to go through a teleporter instead of being deleted by it.
#define TRAIT_EFFECT_CAN_TELEPORT "trait_effect_can_teleport"
diff --git a/code/_globalvars/lists/mob_lists.dm b/code/_globalvars/lists/mob_lists.dm
index d55e3db5c14..b345bdef7fa 100644
--- a/code/_globalvars/lists/mob_lists.dm
+++ b/code/_globalvars/lists/mob_lists.dm
@@ -37,83 +37,6 @@ GLOBAL_LIST_EMPTY(hear_radio_list) //Mobs that hear the radio even if there's
GLOBAL_LIST_EMPTY(emote_list)
-/// Blacklist of types that swarmers should not touch
-GLOBAL_LIST_INIT(swarmer_blacklist, list(
- /obj/item/gun,
- /turf/simulated/floor,
- /obj/structure/swarmer,
- /obj/structure/flora,
- /turf/simulated/wall/indestructible,
- /obj/machinery/atmospherics,
- /obj/structure/particle_accelerator,
- /obj/machinery/field/generator,
- /obj/machinery/chem_dispenser,
- /obj/machinery/nuclearbomb,
- /obj/structure/reagent_dispensers/fueltank,
- /obj/structure/cable,
- /obj/structure/fans/tiny,
- /obj/structure/holosign/barrier/atmos,
- /obj/machinery/tcomms,
- /obj/machinery/message_server,
- /obj/machinery/blackbox_recorder,
- /obj/machinery/power,
- /obj/machinery/cryopod,
- /obj/item/mmi,
- /obj/item/organ/internal/brain,
- /obj/machinery/computer/cryopod,
- /obj/machinery/porta_turret,
- /obj/machinery/clonepod,
- /obj/structure/shuttle/engine,
- /obj/machinery/hydroponics/soil,
- /obj/machinery/field/containment,
- /obj/machinery/gravity_generator,
- /mob/living/basic/swarmer,
- /obj/item/stack/sheet/wood,
- /obj/structure/table_frame/wood,
- /obj/structure/signpost/wood,
- /obj/structure/spirit_board,
- /obj/structure/mineral_door/wood,
- /obj/structure/falsewall/wood,
- /obj/structure/dresser,
- /obj/structure/door_assembly/door_assembly_wood,
- /obj/machinery/door/airlock/wood,
- /obj/item/storage/bag/plants/seed_sorting_tray,
- /obj/structure/displaycase_chassis,
- /obj/item/shield/riot/buckler,
- /obj/item/popsicle_stick,
- /obj/item/nullrod/claymore/bostaff,
- /obj/item/melee/classic_baton,
- /obj/item/storage/fancy/cigars/cohiba,
- /obj/item/stack/tile/wood,
- /obj/item/clothing/shoes/sandal,
- /obj/item/melee/baseball_bat,
- /obj/item/reagent_containers/glass/bucket/wooden,
- /obj/item/cultivator/rake,
- /obj/item/mounted/noticeboard,
- /obj/item/reagent_containers/drinks/mug/wood,
- /obj/item/match/firebrand,
- /obj/structure/chair/wood,
- /obj/structure/barricade/wooden,
- /obj/structure/chair/stool/wood,
- /obj/structure/bookcase,
- /obj/structure/spear_rack,
- /obj/structure/bed/wood,
- /obj/structure/bed/dogbed,
- /obj/structure/closet/coffin,
- /obj/structure/lightable/torch,
- /obj/structure/shelf/wood,
- /obj/structure/chair/sofa/pew,
- /obj/machinery/smartfridge/drying_rack,
- /obj/item/weaponcrafting/stock,
- /obj/structure/beebox,
- /obj/item/honey_frame,
- /obj/structure/ore_box,
- /obj/structure/loom,
- /obj/structure/fermenting_barrel,
- /obj/machinery/compost_bin,
- /obj/structure/roulette,
-))
-
// Dear God
GLOBAL_LIST_INIT(migo_sounds, list(
'sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg',
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm b/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm
index e191d5d5465..d2691e9b3f2 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm
@@ -99,12 +99,3 @@
/datum/ai_planning_subtree/attack_obstacle_in_path/prowl
attack_behaviour = /datum/ai_behavior/attack_obstructions/avoid_breaches
target_key = BB_PROWL_TARGET
-
-/datum/ai_planning_subtree/attack_obstacle_in_path/avoid_breaches
- attack_behaviour = /datum/ai_behavior/attack_obstructions/avoid_breaches
-
-/datum/ai_planning_subtree/attack_obstacle_in_path/avoid_breaches/walls
- attack_behaviour = /datum/ai_behavior/attack_obstructions/avoid_breaches/walls
-
-/datum/ai_behavior/attack_obstructions/avoid_breaches/walls
- can_attack_turfs = TRUE
diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm
index 955ff075ca3..07531535679 100644
--- a/code/modules/events/event_container.dm
+++ b/code/modules/events/event_container.dm
@@ -215,7 +215,6 @@ GLOBAL_LIST_EMPTY(event_last_fired)
new /datum/event_meta(EVENT_LEVEL_MAJOR, /datum/event/demon_incursion, 10, TRUE, _first_run_time = 35 MINUTES),
new /datum/event_meta(EVENT_LEVEL_MAJOR, /datum/event/disease_outbreak, 8, TRUE),
new /datum/event_meta(EVENT_LEVEL_MAJOR, /datum/event/revenant, 9),
- new /datum/event_meta(EVENT_LEVEL_MAJOR, /datum/event/swarmers, 9),
new /datum/event_meta(EVENT_LEVEL_MAJOR, /datum/event/spawn_morph, 16, is_one_shot = TRUE),
//new /datum/event_meta(EVENT_LEVEL_MAJOR, /datum/event/spawn_floor_cluwne, 15, is_one_shot = TRUE)
//new /datum/event_meta(EVENT_LEVEL_MAJOR, /datum/event/spawn_pulsedemon, 20, is_one_shot = TRUE)
diff --git a/code/modules/events/event_procs.dm b/code/modules/events/event_procs.dm
index 217db61eaec..4e0f17a7bd8 100644
--- a/code/modules/events/event_procs.dm
+++ b/code/modules/events/event_procs.dm
@@ -53,13 +53,6 @@
return possible_areas
-/proc/findMaintananceEventArea() // For maintanance events ONLY
- var/list/maintanance_area = typecacheof(list(/area/station/maintenance))
-
- var/list/possible_areas = typecache_filter_list(SSmapping.existing_station_areas, maintanance_area)
-
- return pick(possible_areas)
-
// Returns how many characters are currently active(not logged out, not AFK for more than 10 minutes)
// with a specific role.
// Note that this isn't sorted just by department, because e.g. having a roboticist shouldn't make meteors spawn.
diff --git a/code/modules/events/swarmers.dm b/code/modules/events/swarmers.dm
deleted file mode 100644
index cdc627ace26..00000000000
--- a/code/modules/events/swarmers.dm
+++ /dev/null
@@ -1,63 +0,0 @@
-/datum/event/swarmers
- name = "Swarmer Infestation"
- nominal_severity = EVENT_LEVEL_MAJOR
- role_weights = list(ASSIGNMENT_ENGINEERING = 5, ASSIGNMENT_SECURITY = 3, ASSIGNMENT_CREW = 0.8)
- role_requirements = list(ASSIGNMENT_ENGINEERING = 1, ASSIGNMENT_SECURITY = 1, ASSIGNMENT_CREW = 20)
- /// The name of the notification for dchat
- var/notify_title = "swarmer portal"
-
-/datum/event/swarmers/setup()
- impact_area = findMaintananceEventArea()
-
-/datum/event/swarmers/start()
- if(isnull(impact_area))
- log_debug("No valid event areas could be generated for swarmers.")
- return
- var/list/area_turfs = get_area_turfs(impact_area)
- for(var/i in 1 to length(area_turfs))
- var/turf/T = pick_n_take(area_turfs)
- if(T.is_blocked_turf())
- shuffle(area_turfs)
- continue
- // Give ghosts some time to jump there before it begins.
- var/image/alert_overlay = image('icons/mob/swarmer.dmi', "ui_replicate")
- notify_ghosts("\A [src] is about to spawn in [get_area(T)].", title = notify_title, source = T, alert_overlay = alert_overlay, flashwindow = FALSE, action = NOTIFY_FOLLOW)
- addtimer(CALLBACK(src, PROC_REF(spawn_portal), T), 5 SECONDS)
- return
-
- log_debug("swarmers failed to find a valid turf in [impact_area]")
-
-/datum/event/swarmers/proc/spawn_portal(location)
- new /obj/effect/swarmer_portal(location)
-
-/obj/effect/swarmer_portal
- // Swarmer Portal
- name = "Swarmer Portal"
- desc = "A shimmering portal, crackling and humming with live electricity."
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "portal"
- light_range = 4
-
- /// How many can we spawn
- var/spawn_max = 1
- /// How many have spawned?
- var/spawn_total = 0
-
-/obj/effect/swarmer_portal/Initialize(mapload)
- . = ..()
- spawn_max = max(length(GLOB.crew_list) / 10, 1)
- addtimer(CALLBACK(src, PROC_REF(spawn_next_swarmer)), 2 SECONDS)
-
-/obj/effect/swarmer_portal/proc/spawn_next_swarmer()
- if(spawn_total < spawn_max)
- make_mob(/mob/living/basic/swarmer)
- addtimer(CALLBACK(src, PROC_REF(spawn_next_swarmer)), 2 SECONDS)
- else
- qdel(src)
-
-/obj/effect/swarmer_portal/proc/make_mob(mob_type)
- var/mob/M = new mob_type(get_turf(src))
- M.faction = list("swarmer")
- spawn_total++
- do_sparks(5, TRUE, src)
- step(M, pick(GLOB.cardinal))
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 94378f48a35..46a2d46d044 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -795,15 +795,4 @@
return "[pick(syllables)][terminator]"
return "[copytext_char(input, 1, min(7, length(input)))][terminator]"
-/datum/language/swarmer
- name = "Swarmer"
- desc = "A heavily encoded alien binary pattern."
- speech_verb = "tones"
- ask_verb = "tones"
- exclaim_verbs = list("tones")
- colour = "say_quote"
- key = "z" // Zwarmer...Or Zerg!
- flags = RESTRICTED | HIVEMIND | NOBABEL
- follow = TRUE
-
#undef SCRAMBLE_CACHE_LEN
diff --git a/code/modules/mob/living/basic/hostile/swarmers/swarmer.dm b/code/modules/mob/living/basic/hostile/swarmers/swarmer.dm
deleted file mode 100644
index 03feca3189e..00000000000
--- a/code/modules/mob/living/basic/hostile/swarmers/swarmer.dm
+++ /dev/null
@@ -1,365 +0,0 @@
-// =====================
-// MARK: Swarmer
-// =====================
-/mob/living/basic/swarmer
- name = "swarmer"
- desc = "Robotic constructs of unknown design, swarmers seek only to consume materials and replicate themselves indefinitely."
- icon = 'icons/mob/swarmer.dmi'
- icon_state = "swarmer"
- icon_living = "swarmer"
- icon_dead = "swarmer_unactivated"
- bubble_icon = "swarmer"
- mob_biotypes = MOB_ROBOTIC
- health = 50
- maxHealth = 50
- melee_damage_lower = 6
- melee_damage_upper = 10
- melee_damage_type = BURN
- melee_attack_cooldown_min = 1.5 SECONDS
- melee_attack_cooldown_max = 2.5 SECONDS
- a_intent = INTENT_HARM
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
- mob_size = MOB_SIZE_SMALL
- pass_flags = PASSTABLE
- ventcrawler = VENTCRAWLER_ALWAYS
- light_color = LIGHT_COLOR_CYAN
- attack_verb_continuous = "shocks"
- attack_verb_simple = "shock"
- friendly_verb_continuous = "pinches"
- friendly_verb_simple = "pinch"
- attack_sound = 'sound/effects/empulse.ogg'
- faction = list("swarmer")
- 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)
- minimum_survivable_temperature = 0
- maximum_survivable_temperature = 500
- speak_emote = list("tones")
- loot = list(/obj/effect/decal/cleanable/blood/gibs/robot)
- death_message = "explodes with a sharp pop!"
- basic_mob_flags = DEL_ON_DEATH
- sentience_type = SENTIENCE_OTHER // No, you cannot sentience or mind-transfer into them
- environment_smash = ENVIRONMENT_SMASH_RWALLS // EAT EVERYTHING
- step_type = FOOTSTEP_MOB_CLAW
- is_ranged = TRUE
- projectile_type = /obj/projectile/beam/disabler
- projectile_sound = 'sound/weapons/taser2.ogg'
- ranged_cooldown = 1 SECONDS
- ai_controller = /datum/ai_controller/basic_controller/swarmer
- see_in_dark = 6
- light_range = 2
- light_color = LIGHT_COLOR_CYAN
- step_type = FOOTSTEP_MOB_CLAW
- loot = list(
- /obj/effect/gibspawner/robot,
- /obj/item/stack/ore/bluespace_crystal,
- )
-
- /// Swarmer actions
- var/list/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_replicate = BB_SWARMER_REPLICATE_ACTION,
- )
- /// Resources the swarmer gains from consuming things
- var/resources = 0
- /// Maximum possible resources a swarmer can have
- var/resource_max = 100
-
-/mob/living/basic/swarmer/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/ai_retaliate_advanced, CALLBACK(src, PROC_REF(retaliate_callback)))
- add_language("Swarmer", 1)
- verbs -= /mob/living/verb/pulled
- updatename()
- grant_actions_by_list(innate_actions)
- set_default_language(GLOB.all_languages["Swarmer"])
-
-/mob/living/basic/swarmer/proc/retaliate_callback(mob/living/attacker)
- if(!istype(attacker))
- return
- if(attacker.ai_controller) // Don't chain retaliates.
- var/list/shitlist = attacker.ai_controller.blackboard[BB_BASIC_MOB_RETALIATE_LIST]
- if(src in shitlist)
- return
- for(var/mob/living/basic/swarmer/lesser/the_swarm in oview(src, 7))
- if(the_swarm == attacker) // Do not commit suicide attacking yourself
- continue
- if(the_swarm.faction_check_mob(attacker, FALSE)) // Don't attack other swarmers
- continue
- the_swarm.ai_controller.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, attacker)
-
-/mob/living/basic/swarmer/proc/updatename()
- real_name = "Swarmer [rand(100,999)]-[pick("kappa", "sigma", "beta", "omicron", "iota", "epsilon", "omega", "gamma", "delta", "tau", "alpha")]"
- name = real_name
-
-/mob/living/basic/swarmer/get_status_tab_items()
- var/list/status_tab_data = ..()
- status_tab_data[++status_tab_data.len] = list("Resources:", "[resources] / [resource_max]")
- return status_tab_data
-
-/mob/living/basic/swarmer/emp_act()
- adjustHealth(35)
-
-/mob/living/basic/swarmer/death(gibbed)
- do_sparks(3, 1, src)
- . = ..()
-
-/mob/living/basic/swarmer/Login() // In case an admin gets a funny idea.
- ..()
- var/list/string_list = list()
- string_list += "You are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate."
- string_list += "Clicking on any object will try to consume it, either deconstructing it into its components, destroying it, or integrating any materials it has into you if successful."
- string_list += "Prime Directives:"
- string_list += "1. Consume resources and replicate until there are no more resources left."
- string_list += "2. Ensure that the station is fit for invasion at a later date, do not perform actions that would render it dangerous or inhospitable."
- string_list += "3. Defend yourself and your fellow machines."
- to_chat(src, string_list.Join())
-
-/mob/living/basic/swarmer/melee_attack(atom/target, list/modifiers, ignore_cooldown)
- face_atom(target)
- if(is_type_in_list(target, GLOB.swarmer_blacklist))
- to_chat(src, "Our sensors have designated this object important to station functionality or to our mission. Aborting.")
- ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET)
- return FALSE
- if(HAS_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING))
- to_chat(src, "This asset is already being converted into useable resources. Aborting.")
- return FALSE
- if(iswallturf(target))
- disintegrate_wall(target)
- return FALSE
- if(ismachinery(target))
- disintegrate_machine(target)
- return FALSE
- if(istype(target, /obj/structure))
- disintegrate_machine(target)
- return FALSE
- if(isitem(target))
- integrate(target)
- return FALSE
- if(!isliving(target))
- return ..()
- var/mob/living/L = target
- if(istype(L, /mob/living/basic/swarmer))
- to_chat(src, "We do not wish to harm one of our own. Aborting.")
- ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET)
- return FALSE
- if(L.stat == DEAD)
- disintegrate_mob(target)
- return FALSE
- if(iscarbon(target))
- var/mob/living/carbon/C = target
- if((!C.IsWeakened()))
- L.apply_damage(30, STAMINA)
- C.Confused(6 SECONDS)
- C.Jitter(6 SECONDS)
- return ..()
- else if(C.canBeHandcuffed() && !C.handcuffed)
- 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))
- cuffs.apply_cuffs(target, src)
- return FALSE
- // Make it go away.
- disintegrate_mob(target)
- return FALSE
- if(issilicon(target))
- var/mob/living/silicon/S = target
- S.apply_damage(30, STAMINA)
- if(S.IsWeakened())
- disintegrate_mob(target)
-
- return ..()
-
-/mob/living/basic/swarmer/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)
- if(!(flags & SHOCK_TESLA))
- return FALSE
- return ..()
-
-/mob/living/basic/swarmer/proc/disintegrate_wall(turf/simulated/wall/target)
- if(istype(target, /turf/simulated/wall/indestructible))
- ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET)
- return
- if(spacecheck(target))
- ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET)
- return
- new /obj/effect/temp_visual/swarmer(target.loc)
- to_chat(src, "Beginning disintegration of [target].")
- ADD_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src)
- if(!do_after_once(src, 1 SECONDS, target = target, attempt_cancel_message = "You stop disintegrating [target].", interaction_key = "disintegrate"))
- REMOVE_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src)
- return
- resources = clamp(resources + 8, 0, resource_max)
- adjustHealth(-40)
- REMOVE_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src)
- target.ex_act(EXPLODE_HEAVY)
-
-/mob/living/basic/swarmer/proc/disintegrate_machine(obj/machinery/target)
- if(spacecheck(target))
- return
-
- new /obj/effect/temp_visual/swarmer/dismantle(target.loc)
- to_chat(src, "Beginning disintegration of [target].")
- ADD_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src)
- if(!do_after_once(src, 2.5 SECONDS, target = target, attempt_cancel_message = "You stop disintegrating [target].", interaction_key = "disintegrate"))
- ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET)
- REMOVE_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src)
- return
- resources = clamp(resources + 10, 0, resource_max)
- adjustHealth(-20)
- REMOVE_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src)
- if(istype(target, /obj/structure/reagent_dispensers))
- var/obj/structure/reagent_dispensers/dispenser = target
- dispenser.boom()
- return
- target.deconstruct()
-
-/mob/living/basic/swarmer/proc/integrate(obj/item/target)
- new /obj/effect/temp_visual/swarmer/integrate(target.loc)
- resources = clamp(resources + 10, 0, resource_max)
- adjustHealth(-10)
- qdel(target)
-
-/mob/living/basic/swarmer/proc/disintegrate_mob(mob/living/target)
- new /obj/effect/temp_visual/swarmer/integrate(target.loc)
- ADD_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src)
- to_chat(src, "Beginning integration of [target].")
- if(!do_after_once(src, 1 SECONDS, target = target, attempt_cancel_message = "You stop integrating [target].", interaction_key = "disintegrate"))
- ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET)
- REMOVE_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src)
- return
- REMOVE_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src)
- resources = clamp(resources + 50, 0, resource_max)
- adjustHealth(-40)
- if(isanimal_or_basicmob(target) || issilicon(target)) // Not crew? Are a silicon? Don't care.
- target.gib()
- ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET)
- return
- ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET)
- disappear_mob(target)
-
-/mob/living/basic/swarmer/proc/disappear_mob(mob/target)
- if(!is_station_level(z))
- to_chat(src, "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.")
- return
-
- var/turf/simulated/floor/F = find_safe_turf(zlevels = z)
-
- if(!F)
- return
-
- do_sparks(4, 0, target)
- playsound(src,'sound/effects/sparks4.ogg', 50, TRUE)
- do_teleport(target, F, 0)
-
-/mob/living/basic/swarmer/proc/spacecheck(atom/target)
- for(var/turf/T in range(1, target))
- var/datum/gas_mixture/environment = T.get_readonly_air()
- var/datum/tlv/cur_tlv = new/datum/tlv(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE *0.90, ONE_ATMOSPHERE * 1.10,ONE_ATMOSPHERE * 1.20) /* kpa */
- var/environment_pressure = environment.return_pressure()
- var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure)
- var/area/A = get_area(T)
- if(isspaceturf(T) || istype(A, /area/shuttle) || istype(A, /area/space) || pressure_dangerlevel)
- to_chat(src, "Destroying this object has the potential to cause a hull breach. Aborting.")
- return TRUE
- else if(istype(A, /area/station/engineering/engine/supermatter))
- to_chat(src, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.")
- return TRUE
- return FALSE
-
-// =====================
-// MARK: Lesser Swarmer
-// =====================
-
-/mob/living/basic/swarmer/lesser
- name = "lesser swarmer"
- desc = "Robotic constructs of unknown design, swarmers seek only to consume materials and replicate themselves indefinitely. This one is more fragile."
- icon_state = "lesser_swarmer"
- health = 35
- maxHealth = 35
- ai_controller = /datum/ai_controller/basic_controller/swarmer/lesser
- loot = list(
- /obj/effect/gibspawner/robot,
- )
- 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,
- )
-
-/mob/living/basic/swarmer/lesser/Initialize(mapload)
- . = ..()
- icon_state = pick("lesser_swarmer", "lesser_swarmer_2")
-
-/mob/living/basic/swarmer/lesser/updatename()
- real_name = "Lesser Swarmer [rand(100,999)]-[pick("kappa", "sigma", "beta", "omicron", "iota", "epsilon", "omega", "gamma", "delta", "tau", "alpha")]"
- name = real_name
-
-// =====================
-// MARK: Swarmer Structures
-// =====================
-
-/obj/structure/swarmer // Default swarmer effect object visual feedback
- name = "swarmer ui"
- desc = null
- icon = 'icons/mob/swarmer.dmi'
- icon_state = "ui_light"
- layer = MOB_LAYER
- anchored = TRUE
- resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
- light_color = LIGHT_COLOR_CYAN
- max_integrity = 30
- anchored = TRUE
- /// Light range
- var/lon_range = 1
-
-/obj/structure/swarmer/Initialize(mapload)
- . = ..()
- set_light(lon_range)
-
-/obj/structure/swarmer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
- switch(damage_type)
- if(BRUTE)
- playsound(src, 'sound/weapons/egloves.ogg', 80, TRUE)
- if(BURN)
- playsound(src, 'sound/items/welder.ogg', 100, TRUE)
-
-/obj/structure/swarmer/emp_act()
- do_sparks(3, 1, src)
- qdel(src)
-
-/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."
- icon_state = "trap"
- max_integrity = 10
-
-/obj/structure/swarmer/trap/Initialize(mapload)
- . = ..()
- var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = PROC_REF(on_atom_entered),
- )
- AddElement(/datum/element/connect_loc, loc_connections)
-
-/obj/structure/swarmer/trap/proc/on_atom_entered(datum/source, atom/movable/entered)
- SIGNAL_HANDLER // COMSIG_ATOM_ENTERED
- if(!isliving(entered))
- return
- var/mob/living/L = entered
- if(istype(L, /mob/living/basic/swarmer))
- return
- playsound(loc,'sound/effects/snap.ogg', 50, 1, -1)
- L.electrocute_act(100, src, 1, flags = SHOCK_NOGLOVES | SHOCK_ILLUSION)
- L.Weaken(10 SECONDS)
- qdel(src)
-
-/obj/structure/swarmer/barricade
- name = "swarmer barricade"
- desc = "A quickly assembled energy barricade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through."
- icon_state = "barricade"
- light_range = MINIMUM_USEFUL_LIGHT_RANGE
- max_integrity = 50
-
-/obj/structure/swarmer/barricade/CanPass(atom/movable/O)
- if(istype(O, /mob/living/basic/swarmer))
- return TRUE
- if(istype(O, /obj/projectile/beam/disabler))
- return TRUE
diff --git a/code/modules/mob/living/basic/hostile/swarmers/swarmer_actions.dm b/code/modules/mob/living/basic/hostile/swarmers/swarmer_actions.dm
deleted file mode 100644
index 2efedd2717a..00000000000
--- a/code/modules/mob/living/basic/hostile/swarmers/swarmer_actions.dm
+++ /dev/null
@@ -1,99 +0,0 @@
-/datum/action/cooldown/mob_cooldown/swarmer_trap
- name = "Construct Shock Trap"
- button_icon = 'icons/mob/swarmer.dmi'
- button_icon_state = "ui_trap"
- desc = "Construct a shock trap, using 25 resources."
- click_to_activate = FALSE
- melee_cooldown_time = CLICK_CD_CLICK_ABILITY
- cooldown_time = 60 SECONDS
- shared_cooldown = NONE
-
-/datum/action/cooldown/mob_cooldown/swarmer_trap/Activate(atom/target)
- var/mob/living/basic/swarmer/user = target
- if(!istype(user))
- to_chat(target, "Incompatible hardware detected. Aborting.")
- return
- var/turf/T = get_turf(user)
- for(var/turf/turf_in_view in view(1, T))
- if(locate(/obj/structure/swarmer) in turf_in_view)
- to_chat(user, "Location too close to existing hardware. Aborting.")
- return
- if(user.resources < 25)
- to_chat(user, "Insufficient resources. Aborting.")
- return
- user.resources -= 25
- user.visible_message("[user] manufactures a sparking pylon.")
- playsound(get_turf(user), 'sound/machines/click.ogg', 50, TRUE)
- new /obj/structure/swarmer/trap(T)
- StartCooldown()
-
-/datum/action/cooldown/mob_cooldown/swarmer_barrier
- name = "Construct Barricade"
- button_icon = 'icons/mob/swarmer.dmi'
- button_icon_state = "ui_barricade"
- desc = "Construct a barricade, using 25 resources."
- click_to_activate = FALSE
- melee_cooldown_time = CLICK_CD_CLICK_ABILITY
- cooldown_time = 75 SECONDS
- shared_cooldown = NONE
-
-/datum/action/cooldown/mob_cooldown/swarmer_barrier/Activate(atom/target)
- var/mob/living/basic/swarmer/user = target
- if(!istype(user))
- to_chat(target, "Incompatible hardware detected. Aborting.")
- return
- if(user.resources < 25)
- to_chat(user, "Insufficient resources. Aborting.")
- return
- var/turf/T = get_turf(user)
- for(var/turf/turf_in_view in view(1, T))
- if(locate(/obj/structure/swarmer) in turf_in_view)
- to_chat(user, "Location too close to existing hardware. Aborting.")
- return
- if(!do_after_once(user, 2 SECONDS, target = T, attempt_cancel_message = "You stop building a barricade.", interaction_key = "swarmer_barricade_create"))
- return
- // Check again to make sure they still have the requirements
- if(user.resources < 25)
- to_chat(user, "Insufficient resources. Aborting.")
- return
- T = get_turf(user)
- for(var/turf/turf_in_view in view(1, T))
- if(locate(/obj/structure/swarmer) in turf_in_view)
- to_chat(user, "Location too close to existing hardware. Aborting.")
- return
- user.resources -= 25
- user.visible_message("[user] manufactures a holographic shield.")
- playsound(get_turf(user), 'sound/machines/click.ogg', 50, TRUE)
- new /obj/structure/swarmer/barricade(T)
- StartCooldown()
-
-/datum/action/cooldown/mob_cooldown/swarmer_replicate
- name = "Replicate"
- button_icon = 'icons/mob/swarmer.dmi'
- button_icon_state = "ui_replicate"
- desc = "Construct a new swarmer, using 50 resources."
- click_to_activate = FALSE
- cooldown_time = 20 SECONDS
- melee_cooldown_time = CLICK_CD_CLICK_ABILITY
- shared_cooldown = NONE
-
-/datum/action/cooldown/mob_cooldown/swarmer_replicate/Activate(atom/target)
- var/mob/living/basic/swarmer/user = target
- if(!istype(user))
- to_chat(target, "Incompatible hardware detected. Aborting.")
- return
- if(user.resources < 50)
- to_chat(user, "Insufficient resources. Aborting.")
- return
- if(!do_after_once(user, 4 SECONDS, target = user, attempt_cancel_message = "You stop building a new swarmer.", interaction_key = "swarmer_replicate_create"))
- return
- // Check again after the do-after.
- if(user.resources < 50)
- to_chat(user, "Insufficient resources. Aborting.")
- return
- var/turf/T = get_turf(user)
- user.resources -= 50
- user.visible_message("[user] manufactures a new swarmer.")
- playsound(get_turf(user), 'sound/items/rped.ogg', 50, TRUE)
- new /mob/living/basic/swarmer/lesser(T)
- StartCooldown()
diff --git a/code/modules/mob/living/basic/hostile/swarmers/swarmer_ai.dm b/code/modules/mob/living/basic/hostile/swarmers/swarmer_ai.dm
deleted file mode 100644
index 4efc90e82e9..00000000000
--- a/code/modules/mob/living/basic/hostile/swarmers/swarmer_ai.dm
+++ /dev/null
@@ -1,284 +0,0 @@
-/// Attacks people it can see, disintegrates things based on priority.
-/datum/ai_controller/basic_controller/swarmer
- blackboard = list(
- BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
- BB_AGGRO_RANGE = 4,
- )
- ai_movement = /datum/ai_movement/jps
- idle_behavior = /datum/idle_behavior/idle_random_walk
-
- ai_traits = AI_FLAG_PAUSE_DURING_DO_AFTER
-
- planning_subtrees = list(
- /datum/ai_planning_subtree/simple_find_target,
- /datum/ai_planning_subtree/target_retaliate/check_faction,
- /datum/ai_planning_subtree/ranged_skirmish/avoid_friendly,
- /datum/ai_planning_subtree/attack_obstacle_in_path/avoid_breaches/walls,
- /datum/ai_planning_subtree/basic_melee_attack_subtree,
- /datum/ai_planning_subtree/swarmer_replicate,
- /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/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,
- /datum/ai_planning_subtree/find_and_hunt_target/prowl,
- )
-
-/// Attacks people it can see, disintegrates things based on priority. More aggressive.
-/datum/ai_controller/basic_controller/swarmer/lesser
- blackboard = list(
- BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
- BB_AGGRO_RANGE = 8,
- )
- planning_subtrees = list(
- /datum/ai_planning_subtree/simple_find_target,
- /datum/ai_planning_subtree/target_retaliate/check_faction,
- /datum/ai_planning_subtree/ranged_skirmish/avoid_friendly,
- /datum/ai_planning_subtree/attack_obstacle_in_path/avoid_breaches/walls,
- /datum/ai_planning_subtree/basic_melee_attack_subtree,
- /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/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,
- /datum/ai_planning_subtree/find_and_hunt_target/prowl,
- )
-
-/datum/ai_planning_subtree/find_and_hunt_target/corpses/swarmer
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/swarmer
- hunt_range = 4
-
-/datum/ai_planning_subtree/find_and_hunt_target/swarmer_objects
- finding_behavior = /datum/ai_behavior/find_hunt_target/swarmer_objects
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/swarmer
- hunt_targets = list(/obj/item, /obj/structure, /obj/machinery, /turf/simulated/wall, /mob/living)
- hunt_range = 4
-
-/datum/ai_planning_subtree/attack_obstacle_in_path/avoid_breaches/walls/swarmer_hunting
- target_key = BB_CURRENT_HUNTING_TARGET
-
-/datum/ai_behavior/hunt_target/interact_with_target/swarmer
- always_reset_target = TRUE
- hunt_cooldown = 0 SECONDS
-
-/datum/ai_behavior/find_hunt_target/swarmer_objects
-
-/datum/ai_behavior/find_hunt_target/swarmer_objects/valid_dinner(mob/living/source, atom/dinner, radius)
- if(is_type_in_list(dinner, GLOB.swarmer_blacklist))
- return FALSE
- if(HAS_TRAIT(dinner, TRAIT_SWARMER_DISINTEGRATING))
- return FALSE
- if(isitem(dinner) && !isturf(dinner.loc))
- return FALSE
- if(isliving(dinner))
- var/mob/living/M = dinner
- if(M.stat == DEAD)
- return TRUE
- for(var/turf/T in range(1, dinner))
- var/datum/gas_mixture/environment = T.get_readonly_air()
- var/environment_pressure = environment.return_pressure()
- var/datum/tlv/cur_tlv = new/datum/tlv(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE *0.90, ONE_ATMOSPHERE * 1.10,ONE_ATMOSPHERE * 1.20) /* kpa */
- var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure)
- var/area/A = get_area(T)
- if(isspaceturf(T) || istype(A, /area/shuttle) || istype(A, /area/space) || istype(A, /area/station/engineering/engine/supermatter) || pressure_dangerlevel)
- return FALSE
- return TRUE
-
-/// Run the barricade construction behaviour if we have an ability to use for it
-/datum/ai_planning_subtree/swarmer_replicate
- /// Key where the trap action is stored
- var/action_key = BB_SWARMER_REPLICATE_ACTION
-
-/datum/ai_planning_subtree/swarmer_replicate/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
- var/mob/living/basic/swarmer/user = controller.pawn
- if(!istype(user))
- return
- if(user.resources < 50)
- return
- if(!controller.blackboard_key_exists(action_key))
- return
- var/datum/action/cooldown/mob_cooldown/swarmer_replicate/replicate_action = controller.blackboard[action_key]
- if(replicate_action.IsAvailable())
- controller.queue_behavior(/datum/ai_behavior/swarmer_replicate, action_key)
- return SUBTREE_RETURN_FINISH_PLANNING
-
-/// REPLICATE
-/datum/ai_behavior/swarmer_replicate
- required_distance = 0
- behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
-
-/datum/ai_behavior/swarmer_replicate/setup(datum/ai_controller/controller, action_key)
- var/datum/action/cooldown/mob_cooldown/swarmer_replicate/replicate_action = controller.blackboard[action_key]
- var/mob/living/basic/swarmer/user = controller.pawn
- if(!istype(user))
- return FALSE
- if(!replicate_action || user.resources < 50)
- return FALSE
- return ..()
-
-/datum/ai_behavior/swarmer_replicate/perform(seconds_per_tick, datum/ai_controller/controller, action_key)
- . = ..()
- var/datum/action/cooldown/mob_cooldown/swarmer_replicate/replicate_action = controller.blackboard[action_key]
- var/result = replicate_action.Trigger()
- if(result)
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
-
-/// Search for a nearby location to build on
-/datum/ai_planning_subtree/swarmer_find_construction_target
-
-/datum/ai_planning_subtree/swarmer_find_construction_target/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
- var/mob/living/basic/swarmer/user = controller.pawn
- if(!istype(user))
- return
- if(user.resources < 25)
- return
- controller.queue_behavior(/datum/ai_behavior/swarmer_find_construction_target)
-
-/// Find a nearby clear turf and store it
-/datum/ai_behavior/swarmer_find_construction_target
- action_cooldown = 5 SECONDS
- /// Where do we store the target data
- var/target_key = BB_SWARMER_CONSTRUCT_TARGET
- /// How far do we look for valid turfs?
- var/scan_range = 5
-
-/datum/ai_behavior/swarmer_find_construction_target/perform(seconds_per_tick, datum/ai_controller/controller)
- . = ..()
- var/mob/living/swarmer = controller.pawn
- var/atom/current_target = controller.blackboard[target_key]
- if(current_target && !(locate(/obj/structure/swarmer) in current_target))
- // Already got a target
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
-
- controller.clear_blackboard_key(target_key)
- var/turf/our_turf = get_turf(swarmer)
- if(is_valid_construction_turf(our_turf, swarmer))
- controller.set_blackboard_key(target_key, our_turf)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
-
- var/list/turfs_by_range = list()
- for(var/i in 1 to scan_range)
- turfs_by_range["[i]"] = list()
- for(var/turf/turf_in_view in oview(scan_range, our_turf))
- if(!is_valid_construction_turf(turf_in_view, swarmer))
- continue
- turfs_by_range["[get_dist(our_turf, turf_in_view)]"] += turf_in_view
-
- var/list/final_turfs
- for(var/list/turf_list as anything in turfs_by_range)
- if(length(turfs_by_range[turf_list]))
- final_turfs = turfs_by_range[turf_list]
- break
- if(!length(final_turfs))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
-
- controller.set_blackboard_key(target_key, pick(final_turfs))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
-
-/datum/ai_behavior/swarmer_find_construction_target/proc/is_valid_construction_turf(turf/target_turf, mob/living/swarmer)
- for(var/turf/turf_in_view in view(1, target_turf))
- if(locate(/obj/structure/swarmer) in turf_in_view)
- return FALSE
- if(HAS_TRAIT(target_turf, TRAIT_SWARMER_CONSTRUCTION))
- return FALSE
- if(isspaceturf(target_turf))
- return FALSE
- var/datum/gas_mixture/environment = target_turf.get_readonly_air()
- var/datum/tlv/cur_tlv = new/datum/tlv(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE *0.90, ONE_ATMOSPHERE * 1.10,ONE_ATMOSPHERE * 1.20) /* kpa */
- var/environment_pressure = environment.return_pressure()
- var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure)
- if(pressure_dangerlevel)
- return FALSE
- return !target_turf.is_blocked_turf(source_atom = swarmer)
-
-/// Run the trap construction behaviour if we have an ability to use for it
-/datum/ai_planning_subtree/swarmer_create_trap
- /// Key where the trap action is stored
- var/action_key = BB_SWARMER_TRAP_ACTION
- /// Key where the target turf is stored
- var/target_key = BB_SWARMER_CONSTRUCT_TARGET
-
-/datum/ai_planning_subtree/swarmer_create_trap/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
- if(!controller.blackboard_key_exists(action_key) || !controller.blackboard_key_exists(target_key))
- return
- var/datum/action/cooldown/mob_cooldown/swarmer_trap/trap_action = controller.blackboard[action_key]
- if(trap_action.IsAvailable())
- controller.queue_behavior(/datum/ai_behavior/swarmer_create_trap, action_key, target_key)
- return SUBTREE_RETURN_FINISH_PLANNING
-
-/// Move to an open nearby turf and build a trap
-/datum/ai_behavior/swarmer_create_trap
- action_cooldown = 15 SECONDS // We don't want them doing this too quickly
- required_distance = 0
- behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
-
-/datum/ai_behavior/swarmer_create_trap/setup(datum/ai_controller/controller, action_key, target_key)
- var/datum/action/cooldown/mob_cooldown/swarmer_trap/trap_action = controller.blackboard[action_key]
- var/turf/target_turf = controller.blackboard[target_key]
- var/mob/living/basic/swarmer/user = controller.pawn
- if(!istype(user))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- if(!trap_action || !target_turf || user.resources < 25)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
-
- set_movement_target(controller, target_turf)
- return ..()
-
-/datum/ai_behavior/swarmer_create_trap/perform(seconds_per_tick, datum/ai_controller/controller, action_key, target_key)
- . = ..()
- var/datum/action/cooldown/mob_cooldown/swarmer_trap/trap_action = controller.blackboard[action_key]
- var/result = trap_action.Trigger()
- if(result)
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
-
-/datum/ai_behavior/swarmer_create_trap/finish_action(datum/ai_controller/controller, succeeded, action_key, target_key)
- controller.clear_blackboard_key(target_key)
- return ..()
-
-/// Run the barricade construction behaviour if we have an ability to use for it
-/datum/ai_planning_subtree/swarmer_create_barricade
- /// Key where the trap action is stored
- var/action_key = BB_SWARMER_BARRIER_ACTION
- /// Key where the target turf is stored
- var/target_key = BB_SWARMER_CONSTRUCT_TARGET
-
-/datum/ai_planning_subtree/swarmer_create_barricade/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
- if(!controller.blackboard_key_exists(action_key) || !controller.blackboard_key_exists(target_key))
- return
- var/datum/action/cooldown/mob_cooldown/swarmer_barrier/barrier_action = controller.blackboard[action_key]
- if(barrier_action.IsAvailable())
- controller.queue_behavior(/datum/ai_behavior/swarmer_create_trap, action_key, target_key)
- return SUBTREE_RETURN_FINISH_PLANNING
-
-/// Move to an open nearby turf and build a barricade
-/datum/ai_behavior/swarmer_create_barricade
- action_cooldown = 45 SECONDS
- required_distance = 0
- behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
-
-/datum/ai_behavior/swarmer_create_barricade/setup(datum/ai_controller/controller, action_key, target_key)
- var/datum/action/cooldown/mob_cooldown/swarmer_barrier/barrier_action = controller.blackboard[action_key]
- var/turf/target_turf = controller.blackboard[target_key]
- var/mob/living/basic/swarmer/user = controller.pawn
- if(!istype(user))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- if(!barrier_action || !target_turf || user.resources < 25)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
-
- set_movement_target(controller, target_turf)
- return ..()
-
-/datum/ai_behavior/swarmer_create_barricade/perform(seconds_per_tick, datum/ai_controller/controller, action_key, target_key)
- . = ..()
- var/datum/action/cooldown/mob_cooldown/swarmer_barrier/barrier_action = controller.blackboard[action_key]
- if(barrier_action?.Trigger())
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
-
-/datum/ai_behavior/swarmer_create_barricade/finish_action(datum/ai_controller/controller, succeeded, action_key, target_key)
- controller.clear_blackboard_key(target_key)
- return ..()
diff --git a/code/modules/mob/living/basic/hostile/swarmers/swarmer_effects.dm b/code/modules/mob/living/basic/hostile/swarmers/swarmer_effects.dm
deleted file mode 100644
index 798a32f1ab0..00000000000
--- a/code/modules/mob/living/basic/hostile/swarmers/swarmer_effects.dm
+++ /dev/null
@@ -1,15 +0,0 @@
-/obj/effect/temp_visual/swarmer // temporary swarmer visual feedback objects
- icon = 'icons/mob/swarmer.dmi'
- icon_state = "disintegrate"
- layer = BELOW_MOB_LAYER
-
-/obj/effect/temp_visual/swarmer/Initialize(mapload)
- . = ..()
- playsound(loc, "sparks", 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
-
-/obj/effect/temp_visual/swarmer/dismantle
- icon_state = "dismantle"
- duration = 2.5 SECONDS
-
-/obj/effect/temp_visual/swarmer/integrate
- icon_state = "integrate"
diff --git a/icons/mob/swarmer.dmi b/icons/mob/swarmer.dmi
deleted file mode 100644
index 97c95ebdfdb..00000000000
Binary files a/icons/mob/swarmer.dmi and /dev/null differ
diff --git a/paradise.dme b/paradise.dme
index d85e3d18a11..4530a2b0d5d 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -162,7 +162,6 @@
#include "code\__DEFINES\ai\ai_defines.dm"
#include "code\__DEFINES\ai\blackboard_defines.dm"
#include "code\__DEFINES\ai\changeling_giant_spider_ai_defines.dm"
-#include "code\__DEFINES\ai\swarmer_defines.dm"
#include "code\__DEFINES\dcs\ai_signals.dm"
#include "code\__DEFINES\dcs\area_signals.dm"
#include "code\__DEFINES\dcs\atom_signals.dm"
@@ -2146,7 +2145,6 @@
#include "code\modules\events\spider_infestation.dm"
#include "code\modules\events\spider_terror.dm"
#include "code\modules\events\spontaneous_appendicitis.dm"
-#include "code\modules\events\swarmers.dm"
#include "code\modules\events\tear.dm"
#include "code\modules\events\tear_honk.dm"
#include "code\modules\events\traders.dm"
@@ -2533,10 +2531,6 @@
#include "code\modules\mob\living\basic\hostile\giant_spider\giant_spider_ai.dm"
#include "code\modules\mob\living\basic\hostile\gorilla\gorilla.dm"
#include "code\modules\mob\living\basic\hostile\gorilla\gorilla_emote.dm"
-#include "code\modules\mob\living\basic\hostile\swarmers\swarmer.dm"
-#include "code\modules\mob\living\basic\hostile\swarmers\swarmer_actions.dm"
-#include "code\modules\mob\living\basic\hostile\swarmers\swarmer_ai.dm"
-#include "code\modules\mob\living\basic\hostile\swarmers\swarmer_effects.dm"
#include "code\modules\mob\living\basic\hostile\revenant\revenant.dm"
#include "code\modules\mob\living\basic\hostile\revenant\revenant_abilities.dm"
#include "code\modules\mob\living\basic\lavaland\goliath\goliath.dm"