From f42d424b499697c1f8456c1fa86ca1082847b489 Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Sat, 15 Jan 2022 18:19:18 +0100
Subject: [PATCH] [MIRROR] Removes swarmers from the game [MDB IGNORE] (#10645)
* Removes swarmers from the game
* Removes swarmers from the game
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
Co-authored-by: Tom <8881105+tf-4@users.noreply.github.com>
---
.../lavaland_surface_swarmer_crash.dmm | 252 ----------
.../SpaceRuins/skyrat/salvagepost.dmm | 40 +-
_maps/RandomZLevels/mothership_astrum.dmm | 34 +-
.../map_files/IceBoxStation/IceBoxStation.dmm | 7 +-
code/__DEFINES/is_helpers.dm | 2 -
code/__DEFINES/mobs.dm | 3 -
code/__DEFINES/role_preferences.dm | 2 -
code/__DEFINES/span.dm | 1 -
code/_globalvars/lists/poll_ignore.dm | 2 -
code/_globalvars/traumas.dm | 2 -
code/_onclick/hud/swarmer.dm | 103 ----
code/datums/ruins/lavaland.dm | 8 -
code/datums/saymode.dm | 6 +-
.../dynamic/dynamic_rulesets_midround.dm | 39 --
code/game/objects/items/cardboard_cutouts.dm | 5 -
code/modules/admin/sql_ban_system.dm | 1 -
code/modules/antagonists/swarmer/swarmer.dm | 44 --
.../traitor/objectives/hack_comm_console.dm | 12 +-
code/modules/events/swarmer.dm | 27 -
code/modules/language/language_holder.dm | 5 -
.../hostile/megafauna/swarmer.dm | 299 -----------
code/modules/ninja/suit/ninjaDrainAct.dm | 13 +-
code/modules/swarmers/swarmer.dm | 468 ------------------
code/modules/swarmers/swarmer_act.dm | 275 ----------
code/modules/swarmers/swarmer_objs.dm | 185 -------
config/dynamic.json | 4 -
config/lavaruinblacklist.txt | 1 -
icons/hud/swarmer.dmi | Bin 2241 -> 0 bytes
icons/mob/swarmer.dmi | Bin 25942 -> 0 bytes
.../obj/smooth_structures/swarmer_catwalk.dmi | Bin 3981 -> 0 bytes
strings/hallucination.json | 3 +-
strings/tips.txt | 2 -
strings/valentines.json | 1 -
tgstation.dme | 8 -
.../antagonists/antagonists/swarmer.ts | 22 -
35 files changed, 42 insertions(+), 1834 deletions(-)
delete mode 100644 _maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm
delete mode 100644 code/_onclick/hud/swarmer.dm
delete mode 100644 code/modules/antagonists/swarmer/swarmer.dm
delete mode 100644 code/modules/events/swarmer.dm
delete mode 100644 code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
delete mode 100644 code/modules/swarmers/swarmer.dm
delete mode 100644 code/modules/swarmers/swarmer_act.dm
delete mode 100644 code/modules/swarmers/swarmer_objs.dm
delete mode 100644 icons/hud/swarmer.dmi
delete mode 100644 icons/mob/swarmer.dmi
delete mode 100644 icons/obj/smooth_structures/swarmer_catwalk.dmi
delete mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/swarmer.ts
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm
deleted file mode 100644
index f37f7abcbf9..00000000000
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm
+++ /dev/null
@@ -1,252 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"a" = (
-/turf/template_noop,
-/area/template_noop)
-"b" = (
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/template_noop)
-"c" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ruin/unpowered)
-"d" = (
-/turf/open/floor/mineral/plastitanium/red{
- initial_gas_mix = "LAVALAND_ATMOS"
- },
-/area/ruin/unpowered)
-"e" = (
-/obj/structure/shuttle/engine/propulsion{
- dir = 4
- },
-/turf/template_noop,
-/area/ruin/unpowered)
-"f" = (
-/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon,
-/turf/open/floor/mineral/plastitanium/red{
- initial_gas_mix = "LAVALAND_ATMOS"
- },
-/area/ruin/unpowered)
-
-(1,1,1) = {"
-a
-a
-a
-a
-b
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(2,1,1) = {"
-a
-a
-a
-b
-b
-b
-c
-a
-c
-a
-b
-b
-a
-a
-"}
-(3,1,1) = {"
-a
-a
-b
-b
-b
-b
-d
-d
-d
-c
-b
-b
-a
-a
-"}
-(4,1,1) = {"
-b
-b
-b
-b
-b
-b
-a
-d
-d
-b
-b
-b
-a
-a
-"}
-(5,1,1) = {"
-b
-b
-b
-b
-b
-b
-a
-a
-a
-b
-b
-b
-b
-a
-"}
-(6,1,1) = {"
-a
-b
-b
-b
-b
-c
-a
-a
-d
-c
-a
-b
-b
-a
-"}
-(7,1,1) = {"
-a
-b
-b
-b
-c
-d
-d
-d
-d
-d
-c
-b
-b
-a
-"}
-(8,1,1) = {"
-a
-b
-b
-a
-c
-d
-d
-d
-d
-d
-c
-b
-b
-a
-"}
-(9,1,1) = {"
-a
-a
-b
-a
-c
-d
-d
-f
-d
-d
-c
-b
-b
-b
-"}
-(10,1,1) = {"
-a
-a
-b
-a
-a
-d
-d
-d
-d
-d
-c
-b
-b
-b
-"}
-(11,1,1) = {"
-a
-a
-b
-b
-a
-d
-d
-d
-d
-d
-c
-b
-b
-a
-"}
-(12,1,1) = {"
-a
-a
-a
-b
-a
-d
-c
-c
-c
-a
-a
-a
-a
-a
-"}
-(13,1,1) = {"
-a
-a
-a
-a
-c
-c
-e
-e
-e
-c
-c
-a
-a
-a
-"}
-(14,1,1) = {"
-a
-a
-a
-a
-c
-e
-a
-a
-a
-e
-c
-a
-a
-a
-"}
diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/salvagepost.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/salvagepost.dmm
index d6126f0f728..b3c648bde84 100644
--- a/_maps/RandomRuins/SpaceRuins/skyrat/salvagepost.dmm
+++ b/_maps/RandomRuins/SpaceRuins/skyrat/salvagepost.dmm
@@ -50,7 +50,7 @@
/area/ruin/powered)
"cR" = (
/obj/item/wallframe/airalarm,
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -188,7 +188,7 @@
/area/template_noop)
"im" = (
/obj/structure/frame/computer,
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -202,7 +202,7 @@
/obj/structure/window/reinforced/survival_pod{
dir = 8
},
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -236,7 +236,7 @@
/obj/item/wallframe/airalarm{
pixel_y = -7
},
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -303,7 +303,7 @@
/obj/structure/window/reinforced/survival_pod{
dir = 4
},
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -322,12 +322,12 @@
/turf/template_noop,
/area/template_noop)
"oN" = (
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
},
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -345,7 +345,7 @@
/area/template_noop)
"pF" = (
/obj/item/poster/random_contraband,
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -388,7 +388,7 @@
/obj/structure/shuttle/engine/propulsion{
dir = 4
},
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -556,7 +556,7 @@
anchored = 0;
dir = 8
},
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -573,7 +573,7 @@
pixel_x = 3;
pixel_y = 10
},
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -613,7 +613,7 @@
/obj/structure/window/reinforced/survival_pod{
dir = 4
},
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -635,7 +635,7 @@
/obj/structure/window/reinforced/survival_pod{
dir = 1
},
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -766,7 +766,7 @@
/area/template_noop)
"Iu" = (
/obj/item/wallframe/apc,
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -802,7 +802,7 @@
dir = 4
},
/obj/structure/closet/emcloset,
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -871,7 +871,7 @@
/obj/structure/window/reinforced/survival_pod{
dir = 8
},
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -898,7 +898,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/layer4{
anchored = 0
},
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -909,7 +909,7 @@
/turf/open/floor/engine/airless,
/area/template_noop)
"OU" = (
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -1061,7 +1061,7 @@
/area/template_noop)
"WR" = (
/obj/structure/window/reinforced/survival_pod,
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
@@ -1086,7 +1086,7 @@
desc = "Plasma gas. Highly fuel efficient. Highly volatile. Highly toxic.";
name = "Fuel canister"
},
-/obj/structure/lattice/catwalk/swarmer_catwalk{
+/obj/structure/lattice/catwalk{
color = "#318350";
desc = "A catwalk-like mesh, used for the collection of space debris before processing.";
name = "barge mesh"
diff --git a/_maps/RandomZLevels/mothership_astrum.dmm b/_maps/RandomZLevels/mothership_astrum.dmm
index f5ed19e253a..813cf2a9b68 100644
--- a/_maps/RandomZLevels/mothership_astrum.dmm
+++ b/_maps/RandomZLevels/mothership_astrum.dmm
@@ -1114,10 +1114,6 @@
/obj/item/organ/cyberimp/arm/medibeam,
/turf/open/floor/plating/abductor2,
/area/awaymission/mothership_astrum/halls)
-"rI" = (
-/obj/structure/swarmer/trap,
-/turf/open/floor/plating/abductor2,
-/area/awaymission/mothership_astrum/halls)
"rK" = (
/obj/structure/table/abductor,
/obj/item/paper/fluff/awaymissions/astrum1,
@@ -3932,10 +3928,6 @@
"XO" = (
/turf/open/space/basic,
/area/awaymission/mothership_astrum/halls)
-"XR" = (
-/obj/structure/swarmer/trap,
-/turf/open/floor/mineral/abductor,
-/area/awaymission/mothership_astrum/halls)
"XU" = (
/obj/effect/mapping_helpers/airlock/locked,
/obj/machinery/door/airlock/abductor{
@@ -42341,15 +42333,15 @@ ee
ee
ee
ee
-XR
bV
-XR
bV
-XR
+bV
+bV
+bV
Vh
-XR
bV
-XR
+bV
+bV
bV
ee
ee
@@ -42856,15 +42848,15 @@ ee
ee
ee
bV
-XR
bV
-XR
bV
-rI
bV
-XR
bV
-XR
+Vh
+bV
+bV
+bV
+bV
ee
ee
ee
@@ -44048,7 +44040,7 @@ bV
bV
bV
bV
-XR
+bV
bV
bV
bV
@@ -44305,7 +44297,7 @@ Vh
Vh
Vh
Vh
-rI
+Vh
Vh
Vh
Vh
@@ -44562,7 +44554,7 @@ bV
bV
bV
bV
-XR
+bV
bV
bV
bV
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index 26c5a346615..86cc1b1983c 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -11402,7 +11402,6 @@
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/temp_visual/swarmer,
/turf/open/floor/iron,
/area/command/bridge)
"cwj" = (
@@ -15996,10 +15995,6 @@
},
/turf/open/floor/iron,
/area/command/heads_quarters/hop)
-"eNr" = (
-/obj/effect/temp_visual/swarmer,
-/turf/closed/wall/r_wall,
-/area/command/heads_quarters/captain)
"eNs" = (
/turf/open/floor/iron,
/area/maintenance/port/fore)
@@ -86835,7 +86830,7 @@ olj
olj
olj
olj
-eNr
+olj
olj
vtF
vtF
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index f6792362302..c5e00a71642 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -140,8 +140,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isregalrat(A) (istype(A, /mob/living/simple_animal/hostile/regalrat))
-#define isswarmer(A) (istype(A, /mob/living/simple_animal/hostile/swarmer))
-
#define isguardian(A) (istype(A, /mob/living/simple_animal/hostile/guardian))
#define isconstruct(A) (istype(A, /mob/living/simple_animal/hostile/construct))
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index c6755d2a061..a66b97a9f8c 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -435,9 +435,6 @@
#define SILENCE_RANGED_MESSAGE (1<<0)
-///Swarmer flags
-#define SWARMER_LIGHT_ON (1<<0)
-
/// Returns whether or not the given mob can succumb
#define CAN_SUCCUMB(target) (HAS_TRAIT(target, TRAIT_CRITICAL_CONDITION) && !HAS_TRAIT(target, TRAIT_NODEATH))
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index f9ace7a20d3..bf43b53131b 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -36,7 +36,6 @@
#define ROLE_SLEEPER_AGENT "Syndicate Sleeper Agent"
#define ROLE_SPACE_DRAGON "Space Dragon"
#define ROLE_SPIDER "Spider"
-#define ROLE_SWARMER "Swarmer"
#define ROLE_WIZARD_MIDROUND "Wizard (Midround)"
// Latejoin roles
@@ -136,7 +135,6 @@ GLOBAL_LIST_INIT(special_roles, list(
ROLE_SLEEPER_AGENT = 0,
ROLE_SPACE_DRAGON = 0,
ROLE_SPIDER = 0,
- ROLE_SWARMER = 0,
ROLE_WIZARD_MIDROUND = 14,
// Latejoin
diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm
index fd95f3a6182..65cee0c356a 100644
--- a/code/__DEFINES/span.dm
+++ b/code/__DEFINES/span.dm
@@ -104,7 +104,6 @@
#define span_spider(str) ("" + str + "")
#define span_suicide(str) ("" + str + "")
#define span_suppradio(str) ("" + str + "")
-#define span_swarmer(str) ("" + str + "")
#define span_syndradio(str) ("" + str + "")
#define span_tape_recorder(str) ("" + str + "")
#define span_tinynotice(str) ("" + str + "")
diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm
index 330174f266e..1d464c16456 100644
--- a/code/_globalvars/lists/poll_ignore.dm
+++ b/code/_globalvars/lists/poll_ignore.dm
@@ -11,7 +11,6 @@
#define POLL_IGNORE_SPIDER "spider"
#define POLL_IGNORE_ASHWALKER "ashwalker"
#define POLL_IGNORE_GOLEM "golem"
-#define POLL_IGNORE_SWARMER "swarmer"
#define POLL_IGNORE_DRONE "drone"
#define POLL_IGNORE_FUGITIVE "fugitive"
#define POLL_IGNORE_PYROSLIME "slime"
@@ -36,7 +35,6 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list(
POLL_IGNORE_SPIDER = "Spiders",
POLL_IGNORE_ASHWALKER = "Ashwalker eggs",
POLL_IGNORE_GOLEM = "Golems",
- POLL_IGNORE_SWARMER = "Swarmer shells",
POLL_IGNORE_DRONE = "Drone shells",
POLL_IGNORE_FUGITIVE = "Fugitive Hunter",
POLL_IGNORE_PYROSLIME = "Slime",
diff --git a/code/_globalvars/traumas.dm b/code/_globalvars/traumas.dm
index 60cb35898f1..b836a65b9e3 100644
--- a/code/_globalvars/traumas.dm
+++ b/code/_globalvars/traumas.dm
@@ -61,7 +61,6 @@ GLOBAL_LIST_INIT(phobia_mobs, list(
/mob/living/silicon/robot,
/mob/living/simple_animal/bot,
/mob/living/simple_animal/drone,
- /mob/living/simple_animal/hostile/swarmer,
)),
"doctors" = typecacheof(list(/mob/living/simple_animal/bot/medbot)),
"the supernatural" = typecacheof(list(
@@ -238,7 +237,6 @@ GLOBAL_LIST_INIT(phobia_objs, list(
/obj/structure/statue/diamond/ai2,
/obj/structure/statue/silver/medborg,
/obj/structure/statue/silver/secborg,
- /obj/structure/swarmer_beacon,
)),
"doctors" = typecacheof(list(
diff --git a/code/_onclick/hud/swarmer.dm b/code/_onclick/hud/swarmer.dm
deleted file mode 100644
index 317b3fbd187..00000000000
--- a/code/_onclick/hud/swarmer.dm
+++ /dev/null
@@ -1,103 +0,0 @@
-/atom/movable/screen/swarmer
- icon = 'icons/hud/swarmer.dmi'
-
-/atom/movable/screen/swarmer/MouseEntered(location, control, params)
- . = ..()
- openToolTip(usr, src, params, title = name, content = desc)
-
-/atom/movable/screen/swarmer/MouseExited(location, control, params)
- closeToolTip(usr)
-
-/atom/movable/screen/swarmer/fabricate_trap
- icon_state = "ui_trap"
- name = "Create Trap (Costs 4 Resources)"
- desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it."
-
-/atom/movable/screen/swarmer/fabricate_trap/Click()
- if(isswarmer(usr))
- var/mob/living/simple_animal/hostile/swarmer/our_swarmer = usr
- our_swarmer.create_trap()
-
-/atom/movable/screen/swarmer/barricade
- icon_state = "ui_barricade"
- name = "Create Barricade (Costs 4 Resources)"
- desc = "Creates a destructible barricade that will stop any non-swarmer from passing it. Also allows disabler beams to pass through."
-
-/atom/movable/screen/swarmer/barricade/Click()
- if(isswarmer(usr))
- var/mob/living/simple_animal/hostile/swarmer/our_swarmer = usr
- our_swarmer.create_barricade()
-
-/atom/movable/screen/swarmer/replicate
- icon_state = "ui_replicate"
- name = "Replicate (Costs 20 Resources)"
- desc = "Creates an autonomous melee drone that will follow you and attack all non-swamers entities in sight. They can be ordered to move to a target location by a middle-click."
-
-/atom/movable/screen/swarmer/replicate/Click()
- if(isswarmer(usr))
- var/mob/living/simple_animal/hostile/swarmer/our_swarmer = usr
- our_swarmer.create_swarmer()
-
-/atom/movable/screen/swarmer/repair_self
- icon_state = "ui_self_repair"
- name = "Repair Self"
- desc = "Fully repairs damage done to our body after a moderate delay."
-
-/atom/movable/screen/swarmer/repair_self/Click()
- if(isswarmer(usr))
- var/mob/living/simple_animal/hostile/swarmer/our_swarmer = usr
- our_swarmer.repair_self()
-
-/atom/movable/screen/swarmer/toggle_light
- icon_state = "ui_light"
- name = "Toggle Light"
- desc = "Toggles our inbuilt light on or off. Follower drones will also synchronize their lights with a master unit."
-
-/atom/movable/screen/swarmer/toggle_light/Click()
- if(isswarmer(usr))
- var/mob/living/simple_animal/hostile/swarmer/our_swarmer = usr
- our_swarmer.toggle_light()
-
-/atom/movable/screen/swarmer/contact_swarmers
- icon_state = "ui_contact_swarmers"
- name = "Contact Swarmers"
- desc = "Sends a message to all other swarmers, should they exist."
-
-/atom/movable/screen/swarmer/contact_swarmers/Click()
- if(isswarmer(usr))
- var/mob/living/simple_animal/hostile/swarmer/our_swarmer = usr
- our_swarmer.contact_swarmers()
-
-/datum/hud/living/swarmer/New(mob/living/owner)
- . = ..()
- var/atom/movable/screen/using
-
- using = new /atom/movable/screen/swarmer/fabricate_trap()
- using.screen_loc = ui_hand_position(2)
- using.hud = src
- static_inventory += using
-
- using = new /atom/movable/screen/swarmer/barricade()
- using.screen_loc = ui_hand_position(1)
- using.hud = src
- static_inventory += using
-
- using = new /atom/movable/screen/swarmer/replicate()
- using.screen_loc = ui_zonesel
- using.hud = src
- static_inventory += using
-
- using = new /atom/movable/screen/swarmer/repair_self()
- using.screen_loc = ui_storage1
- using.hud = src
- static_inventory += using
-
- using = new /atom/movable/screen/swarmer/toggle_light()
- using.screen_loc = ui_back
- using.hud = src
- static_inventory += using
-
- using = new /atom/movable/screen/swarmer/contact_swarmers()
- using.screen_loc = ui_inventory
- using.hud = src
- static_inventory += using
diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm
index 995d0c8a617..14943ac8edb 100644
--- a/code/datums/ruins/lavaland.dm
+++ b/code/datums/ruins/lavaland.dm
@@ -205,14 +205,6 @@
allow_duplicates = FALSE
cost = 10
-/datum/map_template/ruin/lavaland/swarmer_boss
- name = "Crashed Shuttle"
- id = "swarmerboss"
- description = "A Syndicate shuttle had an unfortunate stowaway..."
- suffix = "lavaland_surface_swarmer_crash.dmm"
- allow_duplicates = FALSE
- cost = 20
-
/datum/map_template/ruin/lavaland/miningripley
name = "Ripley"
id = "ripley"
diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm
index fe08b0db68d..1533bdef7e3 100644
--- a/code/datums/saymode.dm
+++ b/code/datums/saymode.dm
@@ -33,15 +33,11 @@
return FALSE
-/datum/saymode/binary //everything that uses .b (silicons, drones, swarmers)
+/datum/saymode/binary //everything that uses .b (silicons, drones)
key = MODE_KEY_BINARY
mode = MODE_BINARY
/datum/saymode/binary/handle_message(mob/living/user, message, datum/language/language)
- if(isswarmer(user))
- var/mob/living/simple_animal/hostile/swarmer/S = user
- S.swarmer_chat(message)
- return FALSE
if(isdrone(user))
var/mob/living/simple_animal/drone/D = user
D.drone_chat(message)
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
index 7de6ee3d678..f7b13f44718 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
@@ -806,45 +806,6 @@
#undef ABDUCTOR_MAX_TEAMS
-//////////////////////////////////////////////
-// //
-// SWARMERS (GHOST) //
-// //
-//////////////////////////////////////////////
-
-/datum/dynamic_ruleset/midround/swarmers
- name = "Swarmers"
- antag_datum = /datum/antagonist/swarmer
- antag_flag = ROLE_SWARMER
- required_type = /mob/dead/observer
- enemy_roles = list(
- JOB_CAPTAIN,
- JOB_DETECTIVE,
- JOB_HEAD_OF_SECURITY,
- JOB_SECURITY_OFFICER,
- )
- required_enemies = list(2,2,1,1,1,1,1,0,0,0)
- required_candidates = 0
- weight = 3
- cost = 10
- requirements = list(101,101,101,80,60,50,30,20,10,10)
- repeatable = TRUE
-
-/datum/dynamic_ruleset/midround/swarmers/execute()
- var/list/spawn_locs = list()
- for(var/x in GLOB.xeno_spawn)
- var/turf/spawn_turf = x
- var/light_amount = spawn_turf.get_lumcount()
- if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
- spawn_locs += spawn_turf
- if(!spawn_locs.len)
- message_admins("No valid spawn locations found in GLOB.xeno_spawn, aborting swarmer spawning...")
- return MAP_ERROR
- var/obj/structure/swarmer_beacon/new_beacon = new(pick(spawn_locs))
- log_game("A Swarmer Beacon was spawned via Dynamic Mode.")
- notify_ghosts("\A Swarmer Beacon has spawned!", source = new_beacon, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Swarmer Beacon Spawned")
- return ..()
-
//////////////////////////////////////////////
// //
// SPACE NINJA (GHOST) //
diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm
index 14b95f61a0c..4e6f3e79137 100644
--- a/code/game/objects/items/cardboard_cutouts.dm
+++ b/code/game/objects/items/cardboard_cutouts.dm
@@ -28,7 +28,6 @@
"Shadowling" = image(icon = src.icon, icon_state = "cutout_shadowling"),
"Xenomorph" = image(icon = src.icon, icon_state = "cutout_fukken_xeno"),
"Xenomorph Maid" = image(icon = src.icon, icon_state = "cutout_lusty"),
- "Swarmer" = image(icon = src.icon, icon_state = "cutout_swarmer"),
"Ash Walker" = image(icon = src.icon, icon_state = "cutout_free_antag"),
"Deathsquad Officer" = image(icon = src.icon, icon_state = "cutout_deathsquad"),
"Ian" = image(icon = src.icon, icon_state = "cutout_ian"),
@@ -166,10 +165,6 @@
name = "lusty xenomorph maid ([rand(1, 999)])"
desc = "A cardboard cutout of a xenomorph maid."
icon_state = "cutout_lusty"
- if("Swarmer")
- name = "Swarmer ([rand(1, 999)])"
- desc = "A cardboard cutout of a swarmer."
- icon_state = "cutout_swarmer"
if("Ash Walker")
name = lizard_name(pick(MALE, FEMALE))
desc = "A cardboard cutout of an ash walker."
diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm
index eb6b081d44b..0e8efe8b838 100644
--- a/code/modules/admin/sql_ban_system.dm
+++ b/code/modules/admin/sql_ban_system.dm
@@ -356,7 +356,6 @@
ROLE_REV_HEAD,
ROLE_SENTIENT_DISEASE,
ROLE_SPIDER,
- ROLE_SWARMER,
ROLE_SYNDICATE,
ROLE_TRAITOR,
ROLE_WIZARD,
diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm
deleted file mode 100644
index 0764363be06..00000000000
--- a/code/modules/antagonists/swarmer/swarmer.dm
+++ /dev/null
@@ -1,44 +0,0 @@
-/datum/team/swarmer
- name = "Swarmers"
-
-//Simply lists them.
-/datum/team/swarmer/roundend_report()
- var/list/parts = list()
- parts += ""
- parts += printplayerlist(members)
- return "
[parts.Join("
")]
"
-
-/datum/antagonist/swarmer
- name = "\improper Swarmer"
- job_rank = ROLE_SWARMER
- show_to_ghosts = TRUE
- show_in_antagpanel = FALSE
- prevent_roundtype_conversion = FALSE
- var/datum/team/swarmer/swarmer_team
-
-/datum/antagonist/swarmer/create_team(datum/team/swarmer/new_team)
- if(!new_team)
- for(var/datum/antagonist/swarmer/swarmerantag in GLOB.antagonists)
- if(!swarmerantag.owner || !swarmerantag.swarmer_team)
- continue
- swarmer_team = swarmerantag.swarmer_team
- return
- swarmer_team = new
- else
- if(!istype(new_team))
- CRASH("Wrong swarmer team type provided to create_team")
- swarmer_team = new_team
-
-/datum/antagonist/swarmer/get_team()
- return swarmer_team
-
-/datum/antagonist/swarmer/get_preview_icon()
- var/icon/swarmer_icon = icon('icons/mob/swarmer.dmi', "swarmer")
- swarmer_icon.Shift(NORTH, 8)
- return finish_preview_icon(swarmer_icon)
-
-//SWARMER
-/mob/living/simple_animal/hostile/swarmer/mind_initialize()
- ..()
- if(!mind.has_antag_datum(/datum/antagonist/swarmer))
- mind.add_antag_datum(/datum/antagonist/swarmer)
diff --git a/code/modules/antagonists/traitor/objectives/hack_comm_console.dm b/code/modules/antagonists/traitor/objectives/hack_comm_console.dm
index f9977338eb6..f998ef34bdc 100644
--- a/code/modules/antagonists/traitor/objectives/hack_comm_console.dm
+++ b/code/modules/antagonists/traitor/objectives/hack_comm_console.dm
@@ -45,12 +45,6 @@
if(!do_after(user, 30 SECONDS, target))
return
succeed_objective()
- switch(rand(0, 1))
- if(0)
- priority_announce("Attention crew, it appears that someone on your station has made unexpected communication with an alien device in nearby space.", "[command_name()] High-Priority Update")
- var/datum/round_event_control/spawn_swarmer/swarmer_event = new/datum/round_event_control/spawn_swarmer
- swarmer_event.runEvent()
- if(1)
- priority_announce("Attention crew, it appears that someone on your station has made unexpected communication with a syndicate ship in nearby space.", "[command_name()] High-Priority Update")
- var/datum/round_event_control/pirates/pirate_event = new/datum/round_event_control/pirates
- pirate_event.runEvent()
+ priority_announce("Attention crew, it appears that someone on your station has made unexpected communication with a syndicate ship in nearby space.", "[command_name()] High-Priority Update")
+ var/datum/round_event_control/pirates/pirate_event = new/datum/round_event_control/pirates
+ pirate_event.runEvent()
diff --git a/code/modules/events/swarmer.dm b/code/modules/events/swarmer.dm
deleted file mode 100644
index c6a01ffa900..00000000000
--- a/code/modules/events/swarmer.dm
+++ /dev/null
@@ -1,27 +0,0 @@
-/datum/round_event_control/spawn_swarmer
- name = "Spawn Swarmer Beacon"
- typepath = /datum/round_event/spawn_swarmer
- weight = 10
- max_occurrences = 1 //Only once okay fam
- min_players = 20
- dynamic_should_hijack = TRUE
-
-/datum/round_event/spawn_swarmer/announce(fake)
- priority_announce("Our long-range sensors have detected that your station's defenses have been breached by some sort of alien device. We suggest searching for and destroying it as soon as possible.", "[command_name()] High-Priority Update")
-
-/datum/round_event/spawn_swarmer
- announceWhen = 70
-
-/datum/round_event/spawn_swarmer/start()
- var/list/spawn_locs = list()
- for(var/x in GLOB.xeno_spawn)
- var/turf/spawn_turf = x
- var/light_amount = spawn_turf.get_lumcount()
- if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
- spawn_locs += spawn_turf
- if(!spawn_locs.len)
- message_admins("No valid spawn locations found in GLOB.xeno_spawn, aborting swarmer spawning...")
- return MAP_ERROR
- var/obj/structure/swarmer_beacon/new_beacon = new /obj/structure/swarmer_beacon(pick(spawn_locs))
- log_game("A Swarmer Beacon was spawned via an event.")
- notify_ghosts("\A Swarmer Beacon has spawned!", source = new_beacon, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Swarmer Beacon Spawned")
diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm
index b17f8b5fdb5..37b063341d7 100644
--- a/code/modules/language/language_holder.dm
+++ b/code/modules/language/language_holder.dm
@@ -308,11 +308,6 @@ Key procs
/datum/language/slime = list(LANGUAGE_ATOM))
spoken_languages = list(/datum/language/slime = list(LANGUAGE_ATOM))
-/datum/language_holder/swarmer
- understood_languages = list(/datum/language/swarmer = list(LANGUAGE_ATOM))
- spoken_languages = list(/datum/language/swarmer = list(LANGUAGE_ATOM))
- blocked_languages = list(/datum/language/common = list(LANGUAGE_ATOM))
-
/datum/language_holder/venus
understood_languages = list(/datum/language/sylvan = list(LANGUAGE_ATOM))
spoken_languages = list(/datum/language/sylvan = list(LANGUAGE_ATOM))
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
deleted file mode 100644
index 681390adad0..00000000000
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
-
-Swarmer Beacon
-
-A strange machine appears anywhere a normal lavaland mob can it produces a swarmer at a rate of
-1/15 seconds, until there are GetTotalAISwarmerCap()/2 swarmers, after this it is up to the swarmers themselves to
-increase their population (it will repopulate them should they fall under GetTotalAISwarmerCap()/2 again)
-
-tl;dr A million of the little hellraisers spawn (controlled by AI) and try to eat mining
-
-Loot: Not much, besides a shit load of artificial bluespace crystals, Oh and mining doesn't get eaten
-that's a plus I suppose.
-
-Difficulty: Special
-
-*/
-
-GLOBAL_LIST_EMPTY(AISwarmers)
-GLOBAL_LIST_EMPTY(AISwarmersByType)//AISwarmersByType[.../resource] = list(1st, 2nd, nth), AISwarmersByType[../ranged] = list(1st, 2nd, nth) etc.
-GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swarmer/ai/resource = 30, /mob/living/simple_animal/hostile/swarmer/ai/ranged_combat = 20, /mob/living/simple_animal/hostile/swarmer/ai/melee_combat = 10))
-
-
-//returns a type of AI swarmer that is NOT at max cap
-//type order is shuffled, to prevent bias
-/proc/GetUncappedAISwarmerType()
- var/static/list/swarmerTypes = subtypesof(/mob/living/simple_animal/hostile/swarmer/ai)
- LAZYINITLIST(GLOB.AISwarmersByType)
- for(var/t in shuffle(swarmerTypes))
- var/list/amount = GLOB.AISwarmersByType[t]
- if(!amount || amount.len < GLOB.AISwarmerCapsByType[t])
- return t
-
-
-//Total of all subtype caps
-/proc/GetTotalAISwarmerCap()
- var/static/list/swarmerTypes = subtypesof(/mob/living/simple_animal/hostile/swarmer/ai)
- . = 0
- LAZYINITLIST(GLOB.AISwarmersByType)
- for(var/t in swarmerTypes)
- . += GLOB.AISwarmerCapsByType[t]
-
-
-/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon
- name = "swarmer beacon"
- desc = "That name is a bit of a mouthful, but stop paying attention to your mouth they're eating everything!"
- icon = 'icons/mob/swarmer.dmi'
- icon_state = "swarmer_console"
- health = 750
- maxHealth = 750 //""""low-ish"""" HP because it's a passive boss, and the swarm itself is the real foe
- mob_biotypes = MOB_ROBOTIC
- gps_name = "Hungry Signal"
- achievement_type = /datum/award/achievement/boss/swarmer_beacon_kill
- crusher_achievement_type = /datum/award/achievement/boss/swarmer_beacon_crusher
- score_achievement_type = /datum/award/score/swarmer_beacon_score
- faction = list("mining", "boss", "swarmer")
- weather_immunities = list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE)
- stop_automated_movement = TRUE
- wander = FALSE
- layer = BELOW_MOB_LAYER
- AIStatus = AI_OFF
- del_on_death = TRUE
- var/swarmer_spawn_cooldown = 0
- var/swarmer_spawn_cooldown_amt = 15 SECONDS //Deciseconds between the swarmers we spawn
- var/call_help_cooldown = 0
- var/call_help_cooldown_amt = 15 SECONDS //Deciseconds between calling swarmers to help us when attacked
- var/static/list/swarmer_caps
-
-
-/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/Initialize(mapload)
- . = ..()
- swarmer_caps = GLOB.AISwarmerCapsByType //for admin-edits
- for(var/ddir in GLOB.cardinals)
- new /obj/structure/swarmer/blockade (get_step(src, ddir))
- var/mob/living/simple_animal/hostile/swarmer/ai/resource/R = new(loc)
- step(R, ddir) //Step the swarmers, instead of spawning them there, incase the turf is solid
-
-
-/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/Life(delta_time = SSMOBS_DT, times_fired)
- . = ..()
- if(.)
- var/createtype = GetUncappedAISwarmerType()
- if(createtype && world.time > swarmer_spawn_cooldown && GLOB.AISwarmers.len < (GetTotalAISwarmerCap()*0.5))
- update_cooldowns(list(COOLDOWN_UPDATE_SET_SPAWN = swarmer_spawn_cooldown_amt))
- new createtype(loc)
-
-
-/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- . = ..()
- if(. > 0 && world.time > call_help_cooldown)
- update_cooldowns(list(COOLDOWN_UPDATE_SET_HELP = call_help_cooldown_amt))
- summon_backup(25) //long range, only called max once per 15 seconds, so it's not deathlag
-
-/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/update_cooldowns(list/cooldown_updates, ignore_staggered = FALSE)
- . = ..()
- if(cooldown_updates[COOLDOWN_UPDATE_SET_SPAWN])
- swarmer_spawn_cooldown = world.time + cooldown_updates[COOLDOWN_UPDATE_SET_SPAWN]
- if(cooldown_updates[COOLDOWN_UPDATE_ADD_SPAWN])
- swarmer_spawn_cooldown += cooldown_updates[COOLDOWN_UPDATE_ADD_SPAWN]
- if(cooldown_updates[COOLDOWN_UPDATE_SET_HELP])
- call_help_cooldown = world.time + cooldown_updates[COOLDOWN_UPDATE_SET_HELP]
- if(cooldown_updates[COOLDOWN_UPDATE_ADD_HELP])
- call_help_cooldown += cooldown_updates[COOLDOWN_UPDATE_ADD_HELP]
-
-//SWARMER AI
-//AI versions of the swarmer mini-antag
-//This is an Abstract Base, it re-enables AI, but does not give the swarmer any goals/targets
-/mob/living/simple_animal/hostile/swarmer/ai
- wander = 1
- faction = list("swarmer", "mining")
- weather_immunities = list(TRAIT_ASHSTORM_IMMUNE) //wouldn't be fun otherwise
- AIStatus = AI_ON
-
-/mob/living/simple_animal/hostile/swarmer/ai/Initialize(mapload)
- . = ..()
- toggle_light() //so you can see them eating you out of house and home/shooting you/stunlocking you for eternity
- LAZYINITLIST(GLOB.AISwarmersByType[type])
- GLOB.AISwarmers += src
- GLOB.AISwarmersByType[type] += src
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/Destroy()
- GLOB.AISwarmers -= src
- GLOB.AISwarmersByType[type] -= src
- return ..()
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/swarmer_type_to_create()
- return GetUncappedAISwarmerType()
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/resource/handle_automated_action()
- . = ..()
- if(.)
- if(!stop_automated_movement)
- if(health < maxHealth*0.25)
- StartAction(100)
- repair_self()
- return
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/Move(atom/newloc)
- if(newloc)
- if(newloc.z == z) //so these actions are Z-specific
- if(islava(newloc))
- var/turf/open/lava/L = newloc
- if(!L.is_safe())
- StartAction(20)
- new /obj/structure/lattice/catwalk/swarmer_catwalk(newloc)
- return FALSE
-
- if(ischasm(newloc) && !throwing)
- throw_at(get_edge_target_turf(src, get_dir(src, newloc)), 7 , 3, src, FALSE) //my planet needs me
- return FALSE
-
- return ..()
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/proc/StartAction(deci = 0)
- stop_automated_movement = TRUE
- AIStatus = AI_OFF
- addtimer(CALLBACK(src, .proc/EndAction), deci)
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/proc/EndAction()
- stop_automated_movement = FALSE
- AIStatus = AI_ON
-
-
-
-
-//RESOURCE SWARMER:
-//Similar to the original Player-Swarmers, these dismantle things to obtain the iron inside
-//They then use this medal to produce more swarmers or traps/barricades
-
-/mob/living/simple_animal/hostile/swarmer/ai/resource
- search_objects = 1
- attack_all_objects = TRUE //attempt to nibble everything
- lose_patience_timeout = 150
- var/static/list/sharedWanted = typecacheof(list(/turf/closed/mineral, /turf/closed/wall)) //eat rocks and walls
- var/static/list/sharedIgnore = list()
-
-//This handles viable things to eat/attack
-//Place specific cases of AI derpiness here
-//Most can be left to the automatic Gain/LosePatience() system
-/mob/living/simple_animal/hostile/swarmer/ai/resource/CanAttack(atom/the_target)
-
- //SPECIFIC CASES:
- //Smash fulltile windows before grilles
- if(istype(the_target, /obj/structure/grille))
- for(var/obj/structure/window/rogueWindow in get_turf(the_target))
- if(rogueWindow.fulltile) //done this way because the subtypes are weird.
- the_target = rogueWindow
- break
-
- //GENERAL CASES:
- if(is_type_in_typecache(the_target, sharedIgnore)) //always ignore
- return FALSE
- if(is_type_in_typecache(the_target, sharedWanted)) //always eat
- return TRUE
-
- return ..() //else, have a nibble, see if it's food
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/resource/OpenFire(atom/A)
- if(isliving(A)) //don't shoot rocks, sillies.
- ..()
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/resource/AttackingTarget()
- if(target.swarmer_act(src))
- add_type_to_wanted(target.type)
- return TRUE
- else
- add_type_to_ignore(target.type)
- return FALSE
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/resource/handle_automated_action()
- . = ..()
- if(.)
- if(!stop_automated_movement)
- if(GLOB.AISwarmers.len < GetTotalAISwarmerCap() && resources >= 50)
- StartAction(100) //so they'll actually sit still and use the verbs
- create_swarmer()
- return
-
- if(resources > 5)
- if(prob(5)) //lower odds, as to prioritise reproduction
- StartAction(10) //not a typo
- create_barricade()
- return
- if(prob(5))
- create_trap()
- return
-
-
-//So swarmers can learn what is and isn't food
-/mob/living/simple_animal/hostile/swarmer/ai/resource/proc/add_type_to_wanted(typepath)
- if(!sharedWanted[typepath])// this and += is faster than |=
- sharedWanted += typecacheof(typepath)
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/resource/proc/add_type_to_ignore(typepath)
- if(!sharedIgnore[typepath])
- sharedIgnore += typecacheof(typepath)
-
-
-//RANGED SWARMER
-/mob/living/simple_animal/hostile/swarmer/ai/ranged_combat
- icon_state = "swarmer_ranged"
- icon_living = "swarmer_ranged"
- projectiletype = /obj/projectile/beam/laser
- projectilesound = 'sound/weapons/laser.ogg'
- check_friendly_fire = TRUE //you're supposed to protect the resource swarmers, you poop
- retreat_distance = 3
- minimum_distance = 3
-
-/mob/living/simple_animal/hostile/swarmer/ai/ranged_combat/Aggro()
- ..()
- summon_backup(15, TRUE) //Exact matching, so that goliaths don't come to aid the swarmers, that'd be silly
-
-
-//MELEE SWARMER
-/mob/living/simple_animal/hostile/swarmer/ai/melee_combat
- icon_state = "swarmer_melee"
- icon_living = "swarmer_melee"
- health = 60
- maxHealth = 60
- ranged = FALSE
-
-/mob/living/simple_animal/hostile/swarmer/ai/melee_combat/Aggro()
- ..()
- summon_backup(15, TRUE)
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/melee_combat/AttackingTarget()
- if(isliving(target))
- if(prob(35))
- StartAction(30)
- prepare_target(target)
- else
- var/mob/living/L = target
- L.attack_animal(src)
- L.electrocute_act(10, src, flags = SHOCK_NOGLOVES)
- return TRUE
- else
- return ..()
-
-
-
-
-//SWARMER CATWALKS
-//Used so they can survive lavaland better
-/obj/structure/lattice/catwalk/swarmer_catwalk
- name = "swarmer catwalk"
- desc = "A catwalk-like mesh, produced by swarmers to allow them to navigate hostile terrain."
- icon = 'icons/obj/smooth_structures/swarmer_catwalk.dmi'
- icon_state = "swarmer_catwalk-0"
- base_icon_state = "swarmer_catwalk"
diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm
index 5515ace3904..65d6e81000f 100644
--- a/code/modules/ninja/suit/ninjaDrainAct.dm
+++ b/code/modules/ninja/suit/ninjaDrainAct.dm
@@ -178,16 +178,9 @@
return
AI_notify_hack()
if(do_after(ninja, 300))
- var/announcement_pick = rand(0, 1)
- switch(announcement_pick)
- if(0)
- priority_announce("Attention crew, it appears that someone on your station has made unexpected communication with an alien device in nearby space.", "[command_name()] High-Priority Update")
- var/datum/round_event_control/spawn_swarmer/swarmer_event = new/datum/round_event_control/spawn_swarmer
- swarmer_event.runEvent()
- if(1)
- priority_announce("Attention crew, it appears that someone on your station has made unexpected communication with a syndicate ship in nearby space.", "[command_name()] High-Priority Update")
- var/datum/round_event_control/pirates/pirate_event = new/datum/round_event_control/pirates
- pirate_event.runEvent()
+ priority_announce("Attention crew, it appears that someone on your station has made unexpected communication with a syndicate ship in nearby space.", "[command_name()] High-Priority Update")
+ var/datum/round_event_control/pirates/pirate_event = new/datum/round_event_control/pirates
+ pirate_event.runEvent()
ninja_gloves.communication_console_hack_success = TRUE
var/datum/antagonist/ninja/ninja_antag = ninja.mind.has_antag_datum(/datum/antagonist/ninja)
if(!ninja_antag)
diff --git a/code/modules/swarmers/swarmer.dm b/code/modules/swarmers/swarmer.dm
deleted file mode 100644
index b7c187ad9cc..00000000000
--- a/code/modules/swarmers/swarmer.dm
+++ /dev/null
@@ -1,468 +0,0 @@
-/**
- * # Swarmer
- *
- * Tiny machines made by an ancient civilization, they seek only to consume materials and replicate.
- *
- * Tiny robots which, while not lethal, seek to destroy station components in order to recycle them into more swarmers.
- * Sentient player swarmers spawn from a beacon spawned in maintenance and they can spawn melee swarmers to protect them.
- * Swarmers have the following abilities:
- * - Can melee targets to deal stamina damage. Stuns cyborgs.
- * - Can teleport friend and foe alike away using ctrl + click. Applies binds to carbons, preventing them from immediate retaliation
- * - Can shoot lasers which deal stamina damage to carbons and direct damage to simple mobs
- * - Can self repair for free, completely healing themselves
- * - Can construct traps which stun targets, and walls which block non-swarmer entites and projectiles
- * - Can create swarmer drones, which lack the above abilities sans melee stunning targets. A swarmer can order its drones around by middle-clicking a tile.
- */
-
-/mob/living/simple_animal/hostile/swarmer
- name = "swarmer"
- icon = 'icons/mob/swarmer.dmi'
- desc = "Robotic constructs of unknown design, swarmers seek only to consume materials and replicate themselves indefinitely."
- speak_emote = list("tones")
- initial_language_holder = /datum/language_holder/swarmer
- bubble_icon = "swarmer"
- mob_biotypes = MOB_ROBOTIC
- health = 40
- maxHealth = 40
- status_flags = CANPUSH
- icon_state = "swarmer"
- icon_living = "swarmer"
- icon_dead = "swarmer_unactivated"
- icon_gib = null
- wander = 0
- harm_intent_damage = 5
- minbodytemp = 0
- maxbodytemp = 500
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 0
- 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)
- obj_damage = 0
- environment_smash = ENVIRONMENT_SMASH_NONE
- attack_verb_continuous = "shocks"
- attack_verb_simple = "shock"
- attack_sound = 'sound/effects/empulse.ogg'
- friendly_verb_continuous = "pinches"
- friendly_verb_simple = "pinch"
- speed = 0
- faction = list("swarmer")
- AIStatus = AI_OFF
- pass_flags = PASSTABLE
- mob_size = MOB_SIZE_TINY
- ranged = TRUE
- projectiletype = /obj/projectile/beam/disabler/swarmer
- ranged_cooldown_time = 20
- projectilesound = 'sound/weapons/taser2.ogg'
- loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/stack/ore/bluespace_crystal)
- del_on_death = TRUE
- deathmessage = "explodes with a sharp pop!"
- light_system = MOVABLE_LIGHT
- light_range = 3
- light_color = LIGHT_COLOR_CYAN
- hud_type = /datum/hud/living/swarmer
- speech_span = SPAN_ROBOT
- unique_name = TRUE
- ///Resource points, generated by consuming metal/glass
- var/resources = 20
- ///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/drone/dronelist
- ///Bitflags to store boolean conditions, such as whether the light is on or off.
- var/swarmer_flags = NONE
-
-
-/mob/living/simple_animal/hostile/swarmer/Initialize(mapload)
- . = ..()
- remove_verb(src, /mob/living/verb/pulled)
- for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
- diag_hud.add_to_hud(src)
-
-/mob/living/simple_animal/hostile/swarmer/Move()
- . = ..()
- if(!LAZYLEN(dronelist))
- return
- for(var/d in dronelist)
- var/mob/living/simple_animal/hostile/drone = d
- if(!drone.target && !HAS_TRAIT(drone, TRAIT_IMMOBILIZED) && isturf(drone.loc))
- step_to(drone, src)
-
-/mob/living/simple_animal/hostile/swarmer/med_hud_set_health()
- var/image/holder = hud_list[DIAG_HUD]
- var/icon/I = icon(icon, icon_state, dir)
- holder.pixel_y = I.Height() - world.icon_size
- holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]"
-
-/mob/living/simple_animal/hostile/swarmer/med_hud_set_status()
- var/image/holder = hud_list[DIAG_STAT_HUD]
- var/icon/I = icon(icon, icon_state, dir)
- holder.pixel_y = I.Height() - world.icon_size
- holder.icon_state = "hudstat"
-
-/mob/living/simple_animal/hostile/swarmer/get_status_tab_items()
- . = ..()
- . += "Resources: [resources]"
-
-/mob/living/simple_animal/hostile/swarmer/emp_act()
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- if(health > 1)
- adjustHealth(health-1)
- else
- death()
-
-/mob/living/simple_animal/hostile/swarmer/CanAllowThrough(atom/movable/mover, border_dir)
- . = ..()
- if(istype(mover, /obj/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other
- return TRUE
- else if(isswarmer(mover))
- return TRUE
-
-////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S////
-/mob/living/simple_animal/hostile/swarmer/AttackingTarget()
- if(!isliving(target))
- return target.swarmer_act(src)
- if(iscyborg(target))
- var/mob/living/silicon/borg = target
- borg.adjustBruteLoss(melee_damage_lower)
- return ..()
-
-/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/target)
- face_atom(target)
- if(!istype(target, /mob/living))
- return
- if(!isturf(loc))
- return
- if(next_move > world.time)
- return
- if(!target.Adjacent(src))
- return
- prepare_target(target)
-
-////END CTRL CLICK FOR SWARMERS////
-
-/**
- * Called when a swarmer creates a structure or drone
- *
- * Proc called whenever a swarmer creates a structure or drone
- * Arguments:
- * * fabrication_object - The atom to create
- * * fabrication_cost - How many resources it costs for a swarmer to create the object
- */
-/mob/living/simple_animal/hostile/swarmer/proc/Fabricate(atom/fabrication_object,fabrication_cost = 0)
- if(!isturf(loc))
- to_chat(src, span_warning("This is not a suitable location for fabrication. We need more space."))
- return
- if(resources < fabrication_cost)
- to_chat(src, span_warning("You do not have the necessary resources to fabricate this object."))
- return
- resources -= fabrication_cost
- return new fabrication_object(drop_location())
-
-/**
- * Called when a swarmer attempts to consume an object
- *
- * Proc which determines interaction between a swarmer and whatever it is attempting to consume
- * Arguments:
- * * target - The material or object the swarmer is attempting to consume
- */
-/mob/living/simple_animal/hostile/swarmer/proc/Integrate(obj/target)
- var/resource_gain = target.integrate_amount()
- if(resources + resource_gain > max_resources)
- to_chat(src, span_warning("We cannot hold more materials!"))
- return TRUE
- if(!resource_gain)
- to_chat(src, span_warning("[target] is incompatible with our internal matter recycler."))
- return FALSE
- resources += resource_gain
- do_attack_animation(target)
- changeNext_move(CLICK_CD_RAPID)
- var/obj/effect/temp_visual/swarmer/integrate/I = new /obj/effect/temp_visual/swarmer/integrate(get_turf(target))
- I.pixel_x = target.pixel_x
- I.pixel_y = target.pixel_y
- I.pixel_z = target.pixel_z
- if(istype(target, /obj/item/stack))
- var/obj/item/stack/S = target
- S.use(1)
- if(S.amount)
- return TRUE
- qdel(target)
- return TRUE
-
-/**
- * Called when a swarmer attempts to destroy a structure
- *
- * Proc which determines interaction between a swarmer and a structure it is destroying
- * Arguments:
- * * target - The material or object the swarmer is attempting to destroy
- */
-/mob/living/simple_animal/hostile/swarmer/proc/dis_integrate(atom/movable/target)
- new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target))
- do_attack_animation(target)
- changeNext_move(CLICK_CD_MELEE)
- SSexplosions.low_mov_atom += target
-
-/**
- * Called when a swarmer attempts to teleport a living entity away
- *
- * Proc which finds a safe location to teleport a living entity to when a swarmer teleports it away. Also energy handcuffs carbons.
- * Arguments:
- * * target - The entity the swarmer is trying to teleport away
- */
-/mob/living/simple_animal/hostile/swarmer/proc/prepare_target(mob/living/target)
- if(target == src)
- return
-
- if(!is_station_level(z) && !is_mining_level(z))
- to_chat(src, span_warning("Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area."))
- return
-
- to_chat(src, span_info("Attempting to remove this being from our presence."))
-
- if(!do_mob(src, target, 30))
- return
-
- teleport_target(target)
-
-/mob/living/simple_animal/hostile/swarmer/proc/teleport_target(mob/living/target)
- var/turf/open/floor/safe_turf = find_safe_turf(zlevels = z, extended_safety_checks = TRUE)
-
- if(!safe_turf )
- return
- // If we're getting rid of a human, slap some energy cuffs on
- // them to keep them away from us a little longer
-
- if(ishuman(target))
- var/mob/living/carbon/human/victim = target
- if(!victim.handcuffed)
- victim.set_handcuffed(new /obj/item/restraints/handcuffs/energy/used(victim))
- victim.update_handcuffed()
- log_combat(src, victim, "handcuffed")
-
- var/datum/effect_system/spark_spread/sparks = new
- sparks.set_up(4,0,get_turf(target))
- sparks.start()
- playsound(src, 'sound/effects/sparks4.ogg', 50, TRUE)
- do_teleport(target, safe_turf , 0, channel = TELEPORT_CHANNEL_BLUESPACE)
-
-/mob/living/simple_animal/hostile/swarmer/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)
- if(!(flags & SHOCK_TESLA))
- return FALSE
- return ..()
-
-/**
- * Called when a swarmer attempts to disassemble a machine
- *
- * Proc called when a swarmer attempts to disassemble a machine. Destroys the machine, and gives the swarmer metal.
- * Arguments:
- * * target - The machine the swarmer is attempting to disassemble
- */
-/mob/living/simple_animal/hostile/swarmer/proc/dismantle_machine(obj/machinery/target)
- do_attack_animation(target)
- to_chat(src, span_info("We begin to dismantle this machine. We will need to be uninterrupted."))
- var/obj/effect/temp_visual/swarmer/dismantle/dismantle_effect = new /obj/effect/temp_visual/swarmer/dismantle(get_turf(target))
- dismantle_effect.pixel_x = target.pixel_x
- dismantle_effect.pixel_y = target.pixel_y
- dismantle_effect.pixel_z = target.pixel_z
- if(do_mob(src, target, 100))
- to_chat(src, span_info("Dismantling complete."))
- var/atom/target_loc = target.drop_location()
- new /obj/item/stack/sheet/iron(target_loc, 5)
- for(var/p in target.component_parts)
- var/obj/item/part = p
- part.forceMove(target_loc)
- var/obj/effect/temp_visual/swarmer/disintegration/disintegration_effect = new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target))
- disintegration_effect.pixel_x = target.pixel_x
- disintegration_effect.pixel_y = target.pixel_y
- disintegration_effect.pixel_z = target.pixel_z
- target.dump_contents()
- if(istype(target, /obj/machinery/computer))
- var/obj/machinery/computer/computer_target = target
- if(computer_target.circuit)
- computer_target.circuit.forceMove(target_loc)
- qdel(target)
-
-/**
- * Called when a swarmer attempts to create a trap
- *
- * Proc used to allow a swarmer to create a trap. Checks if a trap is on the tile, then if the swarmer can afford, and then places the trap.
- */
-/mob/living/simple_animal/hostile/swarmer/proc/create_trap()
- set name = "Create trap"
- set category = "Swarmer"
- set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 4 resources."
- if(locate(/obj/structure/swarmer/trap) in loc)
- to_chat(src, span_warning("There is already a trap here. Aborting."))
- return
- if(resources < 4)
- to_chat(src, span_warning("We do not have the resources for this!"))
- return
- Fabricate(/obj/structure/swarmer/trap, 4)
-
-/**
- * Called when a swarmer attempts to create a barricade
- *
- * Proc used to allow a swarmer to create a barricade. Checks if a barricade is on the tile, then if the swarmer can afford it, and then will attempt to create a barricade after a second delay.
- */
-/mob/living/simple_animal/hostile/swarmer/proc/create_barricade()
- set name = "Create barricade"
- set category = "Swarmer"
- set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through. Costs 4 resources."
- if(locate(/obj/structure/swarmer/blockade) in loc)
- to_chat(src, span_warning("There is already a blockade here. Aborting."))
- return
- if(resources < 4)
- to_chat(src, span_warning("We do not have the resources for this!"))
- return
- if(!do_mob(src, src, 1 SECONDS))
- return
- Fabricate(/obj/structure/swarmer/blockade, 4)
-
-/**
- * Called when a swarmer attempts to create a drone
- *
- * Proc used to allow a swarmer to create a drone. Checks if the swarmer can afford the drone, then creates it after 5 seconds, and also registers it to the creating swarmer so it can command it
- */
-/mob/living/simple_animal/hostile/swarmer/proc/create_swarmer()
- set name = "Replicate"
- set category = "Swarmer"
- set desc = "Creates a duplicate of ourselves, capable of protecting us while we complete our objectives."
- to_chat(src, span_info("We are attempting to replicate ourselves. We will need to stand still until the process is complete."))
- if(resources < 20)
- to_chat(src, span_warning("We do not have the resources for this!"))
- return
- if(!isturf(loc))
- to_chat(src, span_warning("This is not a suitable location for replicating ourselves. We need more room."))
- return
- if(!do_mob(src, src, 5 SECONDS))
- return
- var/createtype = swarmer_type_to_create()
- if(!createtype)
- return
- var/mob/newswarmer = Fabricate(createtype, 20)
- add_drone(newswarmer)
- playsound(loc,'sound/items/poster_being_created.ogg', 20, TRUE, -1)
-
-/**
- * Used to determine what type of swarmer a swarmer should create
- *
- * 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/drone
-
-/**
- * Called when a swarmer attempts to repair itself
- *
- * Proc used to allow a swarmer self-repair. If the swarmer does not move after a period of time, then it will heal fully
- */
-/mob/living/simple_animal/hostile/swarmer/proc/repair_self()
- if(!isturf(loc))
- return
- to_chat(src, span_info("Attempting to repair damage to our body, stand by..."))
- if(!do_mob(src, src, 10 SECONDS))
- return
- adjustHealth(-maxHealth)
- to_chat(src, span_info("We successfully repaired ourselves."))
-
-/**
- * Called when a swarmer toggles its light
- *
- * Proc used to allow a swarmer to toggle its light on and off. If a swarmer has any drones, change their light settings to match their master's.
- */
-/mob/living/simple_animal/hostile/swarmer/proc/toggle_light()
- if(swarmer_flags & SWARMER_LIGHT_ON)
- swarmer_flags = ~SWARMER_LIGHT_ON
- set_light_on(FALSE)
- if(!mind)
- return
- for(var/d in dronelist)
- var/mob/living/simple_animal/hostile/swarmer/drone/drone = d
- drone.swarmer_flags = ~SWARMER_LIGHT_ON
- drone.set_light_on(FALSE)
- return
- swarmer_flags |= SWARMER_LIGHT_ON
- set_light_on(TRUE)
- if(!mind)
- return
- for(var/d in dronelist)
- var/mob/living/simple_animal/hostile/swarmer/drone/drone = d
- drone.swarmer_flags |= SWARMER_LIGHT_ON
- drone.set_light_on(TRUE)
-
-
-/**
- * Proc which is used for swarmer comms
- *
- * Proc called which sends a message to all other swarmers.
- * Arugments:
- * * msg - The message the swarmer is sending, gotten from ContactSwarmers()
- */
-/mob/living/simple_animal/hostile/swarmer/proc/swarmer_chat(msg)
- var/rendered = "Swarm communication - [src] [say_quote(msg)]"
- for(var/i in GLOB.mob_list)
- var/mob/listener = i
- if(isswarmer(listener))
- to_chat(listener, rendered)
- else if(isobserver(listener))
- var/link = FOLLOW_LINK(listener, src)
- to_chat(listener, "[link] [rendered]")
-
-/**
- * Proc which is used for inputting a swarmer message
- *
- * Proc which is used for a swarmer to input a message on a pop-up box, then attempt to send that message to the other swarmers
- */
-/mob/living/simple_animal/hostile/swarmer/proc/contact_swarmers()
- var/message = tgui_input_text(src, "Announce to other swarmers", "Swarmer contact")
- // TODO get swarmers their own colour rather than just boldtext
- if(message)
- swarmer_chat(message)
-
-
-///Adds a drone to the swarmer list and keeps track of it in case it's deleted and requires cleanup.
-/mob/living/simple_animal/hostile/swarmer/proc/add_drone(mob/newswarmer)
- LAZYADD(dronelist, newswarmer)
- RegisterSignal(newswarmer, COMSIG_PARENT_QDELETING, .proc/remove_drone, newswarmer)
-
-
-/**
- * Removes a drone from the swarmer's list.
- *
- * Removes the drone from our list.
- * Called specifically when a drone is about to be destroyed, so we don't have any null references.
- * Arguments:
- * * mob/drone - The drone to be removed from the list.
- */
-/mob/living/simple_animal/hostile/swarmer/proc/remove_drone(mob/drone, force)
- SIGNAL_HANDLER
-
- UnregisterSignal(drone, COMSIG_PARENT_QDELETING)
- dronelist -= drone
-
-/**
- * # Swarmer Drone
- *
- * AI subtype of swarmers, always AI-controlled under normal circumstances. Automatically attacks nearby threats.
- */
-/mob/living/simple_animal/hostile/swarmer/drone
- icon_state = "swarmer_melee"
- icon_living = "swarmer_melee"
- AIStatus = AI_ON
-
-/obj/projectile/beam/disabler/swarmer/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(!.)
- return
- if((!isanimal(target) && !ishuman(target)) || isswarmer(target))
- return
- if(ishuman(target))
- var/mob/living/carbon/human/possibleHulk = target
- if(!possibleHulk.dna || !possibleHulk.dna.check_mutation(HULK))
- return
- var/mob/living/simple_animal/hostile/swarmer/swarmer = firer
- swarmer.teleport_target(target)
diff --git a/code/modules/swarmers/swarmer_act.dm b/code/modules/swarmers/swarmer_act.dm
deleted file mode 100644
index c10e91ba606..00000000000
--- a/code/modules/swarmers/swarmer_act.dm
+++ /dev/null
@@ -1,275 +0,0 @@
-/**
- * Determines what happens to an atom when a swarmer interacts with it
- *
- * Determines behavior upon being interacted on by a swarmer.
- * Arguments:
- * * S - A reference to the swarmer doing the interaction
- */
-#define DANGEROUS_DELTA_P 250 //Value in kPa where swarmers arent allowed to break a wall or window with this difference in pressure.
-
-///Finds the greatest difference in pressure across a turf, only considers open turfs.
-/turf/proc/return_turf_delta_p()
- var/pressure_greatest = 0
- var/pressure_smallest = INFINITY //Freaking terrified to use INFINITY, man
- for(var/t in RANGE_TURFS(1, src)) //Begin processing the delta pressure across the wall.
- var/turf/open/turf_adjacent = t
- if(!istype(turf_adjacent))
- continue
- pressure_greatest = max(pressure_greatest, turf_adjacent.air.return_pressure())
- pressure_smallest = min(pressure_smallest, turf_adjacent.air.return_pressure())
-
- return pressure_greatest - pressure_smallest
-
-///Runs through all adjacent open turfs and checks if any are planetary_atmos returns true if even one passes.
-/turf/proc/is_nearby_planetary_atmos()
- . = FALSE
- for(var/t in RANGE_TURFS(1, src))
- if(!isopenturf(t))
- continue
- var/turf/open/turf_adjacent = t
- if(turf_adjacent.planetary_atmos)
- return TRUE
-
-/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- actor.dis_integrate(src)
- return TRUE //return TRUE/FALSE whether or not an AI swarmer should try this swarmer_act() again, NOT whether it succeeded.
-
-/obj/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- if(resistance_flags & INDESTRUCTIBLE)
- return FALSE
- for(var/mob/living/living_content in contents)
- if(issilicon(living_content) || isbrain(living_content))
- continue
- to_chat(actor, span_warning("An organism has been detected inside this object. Aborting."))
- return FALSE
- return ..()
-
-/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- return actor.Integrate(src)
-
-/**
- * Return used to determine how many resources a swarmer gains when consuming an object
- */
-/obj/proc/integrate_amount()
- return 0
-
-/obj/item/integrate_amount() //returns the amount of resources gained when eating this item
- var/list/mats = get_material_composition(ALL) // Ensures that items made from plasteel, and plas/titanium/plastitaniumglass get integrated correctly.
- if(length(mats) && (mats[GET_MATERIAL_REF(/datum/material/iron)] || mats[GET_MATERIAL_REF(/datum/material/glass)]))
- return 1
- return ..()
-
-/obj/item/gun/swarmer_act()//Stops you from eating the entire armory
- return FALSE
-
-/turf/open/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor
- return FALSE
-
-/obj/structure/lattice/catwalk/swarmer_catwalk/swarmer_act()
- return FALSE
-
-/obj/structure/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- if(actor.AIStatus == AI_ON)
- return FALSE
- return ..()
-
-/obj/effect/swarmer_act()
- return FALSE
-
-/obj/effect/decal/cleanable/robot_debris/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- actor.dis_integrate(src)
- qdel(src)
- return TRUE
-
-/obj/structure/swarmer_beacon/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("This machine is required for further reproduction of swarmers. Aborting."))
- return FALSE
-
-/obj/structure/flora/swarmer_act()
- return FALSE
-
-/turf/open/lava/swarmer_act()
- if(!is_safe())
- new /obj/structure/lattice/catwalk/swarmer_catwalk(src)
- return FALSE
-
-/obj/machinery/atmospherics/swarmer_act()
- return FALSE
-
-/obj/structure/disposalpipe/swarmer_act()
- return FALSE
-
-/obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- actor.dismantle_machine(src)
- return TRUE
-
-/obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- actor.dis_integrate(src)
- return TRUE
-
-/obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- var/isonshuttle = istype(get_area(src), /area/shuttle)
- for(var/turf/turf_in_range as anything in RANGE_TURFS(1, src))
- var/area/turf_area = get_area(turf_in_range)
- //Check for dangerous pressure differences
- if (turf_in_range.return_turf_delta_p() > DANGEROUS_DELTA_P)
- to_chat(actor, span_warning("Destroying this object has the potential to cause an explosive pressure release. Aborting."))
- actor.LoseTarget()
- return TRUE
- //Check if breaking this door will expose the station to space/planetary atmos
- else if(turf_in_range.is_nearby_planetary_atmos() || isspaceturf(turf_in_range) || (!isonshuttle && (istype(turf_area, /area/shuttle) || istype(turf_area, /area/space))) || (isonshuttle && !istype(turf_area, /area/shuttle)))
- to_chat(actor, span_warning("Destroying this object has the potential to cause a hull breach. Aborting."))
- actor.LoseTarget()
- return FALSE
- //Check if this door is important in supermatter containment
- else if(istype(turf_area, /area/engineering/supermatter))
- to_chat(actor, span_warning("Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting."))
- actor.LoseTarget()
- return FALSE
- actor.dis_integrate(src)
- return TRUE
-
-/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- actor.dis_integrate(src)
- if(!QDELETED(actor)) //If it got blown up no need to turn it off.
- toggle_cam(actor, FALSE)
- return TRUE
-
-/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- actor.dis_integrate(src)
- return TRUE
-
-/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- actor.dis_integrate(src)
- return TRUE
-
-/obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)//It's more visually interesting than dismantling the machine
- actor.dis_integrate(src)
- return TRUE
-
-/obj/machinery/turretid/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- actor.dis_integrate(src)
- return TRUE
-
-/obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("The volatile chemicals in this machine would destroy us. Aborting."))
- return FALSE
-
-/obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("This device's destruction would result in the extermination of everything in the area. Aborting."))
- return FALSE
-
-/obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("Searching... sensor malfunction! Target lost. Aborting."))
- return FALSE
-
-/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("Destroying this object could cause a chain reaction. Aborting."))
- return FALSE
-
-/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("Disrupting the power grid would bring no benefit to us. Aborting."))
- return FALSE
-
-/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("An inhospitable area may be created as a result of destroying this object. Aborting."))
- return FALSE
-
-/obj/structure/shuttle/engine/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("Destroying this object has the potential to cause a hull breach. Aborting."))
- return FALSE
-
-/obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting."))
- return FALSE
-
-/obj/machinery/deepfryer/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("This kitchen appliance should be preserved, it will make delicious unhealthy snacks for our masters in the future. Aborting."))
- return FALSE
-
-/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("Disrupting the power grid would bring no benefit to us. Aborting."))
- return FALSE
-
-/obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("This bluespace source will be important to us later. Aborting."))
- return FALSE
-
-/turf/closed/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- var/isonshuttle = istype(loc, /area/shuttle)
- for(var/turf/turf_in_range as anything in RANGE_TURFS(1, src))
- var/area/turf_area = get_area(turf_in_range)
- if (turf_in_range.return_turf_delta_p() > DANGEROUS_DELTA_P)
- to_chat(actor, span_warning("Destroying this object has the potential to cause an explosive pressure release. Aborting."))
- actor.LoseTarget()
- return TRUE
- else if(turf_in_range.is_nearby_planetary_atmos() || isspaceturf(turf_area) || (!isonshuttle && (istype(turf_area, /area/shuttle) || istype(turf_area, /area/space))) || (isonshuttle && !istype(turf_area, /area/shuttle) ))
- to_chat(actor, span_warning("Destroying this object has the potential to cause a hull breach. Aborting."))
- actor.LoseTarget()
- return TRUE
- else if(istype(turf_area, /area/engineering/supermatter))
- to_chat(actor, span_warning("Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting."))
- actor.LoseTarget()
- return TRUE
- return ..()
-
-/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- var/is_on_shuttle = istype(get_area(src), /area/shuttle)
- for(var/t in RANGE_TURFS(1, src))
- var/turf/turf_in_range = t
- var/area/turf_area = get_area(turf_in_range)
- if (turf_in_range.return_turf_delta_p() > DANGEROUS_DELTA_P)
- to_chat(actor, span_warning("Destroying this object has the potential to cause an explosive pressure release. Aborting."))
- actor.LoseTarget()
- return TRUE
- else if(turf_in_range.is_nearby_planetary_atmos() || isspaceturf(turf_in_range) || (!is_on_shuttle && (istype(turf_area, /area/shuttle) || istype(turf_area, /area/space))) || (is_on_shuttle && !istype(turf_area, /area/shuttle)))
- to_chat(actor, span_warning("Destroying this object has the potential to cause a hull breach. Aborting."))
- actor.LoseTarget()
- return TRUE
- else if(istype(turf_area, /area/engineering/supermatter))
- to_chat(actor, span_warning("Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting."))
- actor.LoseTarget()
- return TRUE
- return ..()
-
-/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)//Wiring would be too effective as a resource
- to_chat(actor, span_warning("This object does not contain enough materials to work with."))
- return FALSE
-
-/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("Attempting to dismantle this machine would result in an immediate counterattack. Aborting."))
- return FALSE
-
-/obj/machinery/porta_turret_cover/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("Attempting to dismantle this machine would result in an immediate counterattack. Aborting."))
- return FALSE
-
-/obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- var/turf/here = get_turf(src)
- for(var/a in here.contents)
- if(istype(a, /obj/structure/cable))
- to_chat(actor, span_warning("Disrupting the power grid would bring no benefit to us. Aborting."))
- return FALSE
- return ..()
-
-/obj/machinery/hydroponics/soil/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("This object does not contain enough materials to work with."))
- return FALSE
-
-/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("Destroying this object would cause a catastrophic chain reaction. Aborting."))
- return FALSE
-
-/obj/machinery/field/containment/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("This object does not contain solid matter. Aborting."))
- return FALSE
-
-/obj/machinery/power/shieldwallgen/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("Destroying this object would have an unpredictable effect on structure integrity. Aborting."))
- return FALSE
-
-/obj/machinery/shieldwall/swarmer_act(mob/living/simple_animal/hostile/swarmer/actor)
- to_chat(actor, span_warning("This object does not contain solid matter. Aborting."))
- return FALSE
-
-#undef DANGEROUS_DELTA_P
diff --git a/code/modules/swarmers/swarmer_objs.dm b/code/modules/swarmers/swarmer_objs.dm
deleted file mode 100644
index 630ce15f184..00000000000
--- a/code/modules/swarmers/swarmer_objs.dm
+++ /dev/null
@@ -1,185 +0,0 @@
-/obj/structure/swarmer //Default swarmer effect object visual feedback
- name = "swarmer ui"
- desc = null
- gender = NEUTER
- icon = 'icons/mob/swarmer.dmi'
- icon_state = "ui_light"
- layer = MOB_LAYER
- resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
- light_color = LIGHT_COLOR_CYAN
- max_integrity = 30
- anchored = TRUE
- ///How strong the light effect for the structure is
- var/glow_range = 1
-
-/obj/structure/swarmer/Initialize(mapload)
- . = ..()
- set_light(glow_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()
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- qdel(src)
-
-/**
- * # Swarmer Beacon
- *
- * Beacon which creates sentient player swarmers.
- *
- * The beacon which creates sentient player swarmers during the swarmer event. Spawns in maint on xeno locations, and can create a player swarmer once every 30 seconds.
- * The beacon cannot be damaged by swarmers, and must be destroyed to prevent the spawning of further player-controlled swarmers.
- * Holds a swarmer within itself during the 30 seconds before releasing it and allowing for another swarmer to be spawned in.
- */
-
-/obj/structure/swarmer_beacon
- name = "swarmer beacon"
- desc = "A machine that prints swarmers."
- icon = 'icons/mob/swarmer.dmi'
- icon_state = "swarmer_console"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100)
- max_integrity = 500
- plane = MASSIVE_OBJ_PLANE
- light_color = LIGHT_COLOR_CYAN
- light_range = 10
- anchored = TRUE
- 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(mapload)
- . = ..()
- SSpoints_of_interest.make_point_of_interest(src)
-
-/obj/structure/swarmer_beacon/attack_ghost(mob/user)
- . = ..()
- if(processing_swarmer)
- to_chat(user, "A swarmer is currently being created. Try again soon.")
- return
- if(is_banned_from(user.ckey, ROLE_SWARMER))
- to_chat(user, span_danger("You are banned from playing as a Swarmer."))
- return
- que_swarmer(user)
-
-/**
- * Interaction when a ghost interacts with a swarmer beacon
- *
- * Called when a ghost interacts with a swarmer beacon, allowing them to become a swarmer
- * Arguments:
- * * user - A reference to the ghost interacting with the beacon
- */
-/obj/structure/swarmer_beacon/proc/que_swarmer(mob/user)
- var/swarm_ask = tgui_alert(usr, "Become a swarmer?", "Do you wish to consume the station?", list("Yes", "No"))
- if(swarm_ask == "No" || QDELETED(src) || QDELETED(user) || processing_swarmer)
- 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), (LAZYLEN(swarmerlist) * 2 SECONDS) + 5 SECONDS)
- to_chat(newswarmer, span_boldannounce("SWARMER CONSTRUCTION INITIALIZED."))
- processing_swarmer = TRUE
- return TRUE
-
-/**
- * Releases a swarmer from the beacon and tells it what to do
- *
- * 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
- */
-/obj/structure/swarmer_beacon/proc/release_swarmer(mob/swarmer)
- to_chat(swarmer, "SWARMER CONSTRUCTION COMPLETED. OBJECTIVES:\n\
- 1. CONSUME RESOURCES AND REPLICATE UNTIL THERE ARE NO MORE RESOURCES LEFT\n\
- 2. ENSURE PROTECTION OF THE BEACON SO THIS LOCATION CAN BE INVADED AT A LATER DATE; DO NOT PERFORM ACTIONS THAT WOULD RENDER THIS LOCATION DANGEROUS OR INHOSPITABLE\n\
- 3. BIOLOGICAL RESOURCES WILL BE HARVESTED AT A LATER DATE: DO NOT HARM THEM\n\
- OPERATOR NOTES:\n\
- - CONSUME RESOURCES TO CONSTRUCT TRAPS, BARRIERS, AND FOLLOWER DRONES\n\
- - FOLLOWER DRONES WILL FOLLOW YOU AUTOMATCIALLY UNLESS THEY POSSESS A TARGET. WHILE DRONES CANNOT ASSIST IN RESOURCE HARVESTING, THEY CAN PROTECT YOU FROM THREATS\n\
- - LCTRL + ATTACKING AN ORGANIC WILL ALOW YOU TO REMOVE SAID ORGANIC FROM THE AREA\n\
- - 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."
- icon_state = "trap"
- max_integrity = 10
- density = FALSE
-
-/obj/structure/swarmer/trap/Initialize(mapload)
- . = ..()
- var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
- )
- AddElement(/datum/element/connect_loc, loc_connections)
-
-/obj/structure/swarmer/trap/proc/on_entered(datum/source, atom/movable/AM)
- SIGNAL_HANDLER
- if(isliving(AM))
- 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(100, src, TRUE, flags = SHOCK_NOGLOVES|SHOCK_ILLUSION)
- if(iscyborg(living_crosser))
- living_crosser.Paralyze(100)
- qdel(src)
-
-/obj/structure/swarmer/blockade
- name = "swarmer blockade"
- desc = "A quickly assembled energy blockade. 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
- density = TRUE
-
-/obj/structure/swarmer/blockade/CanAllowThrough(atom/movable/mover, border_dir)
- . = ..()
- if(isswarmer(mover) || istype(mover, /obj/projectile/beam/disabler))
- return TRUE
-
-/obj/effect/temp_visual/swarmer //temporary swarmer visual feedback objects
- icon = 'icons/mob/swarmer.dmi'
- layer = BELOW_MOB_LAYER
-
-/obj/effect/temp_visual/swarmer/disintegration
- icon_state = "disintegrate"
- duration = 1 SECONDS
-
-/obj/effect/temp_visual/swarmer/disintegration/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"
- duration = 0.5 SECONDS
diff --git a/config/dynamic.json b/config/dynamic.json
index 8c66692733f..fdd1d33e4d6 100644
--- a/config/dynamic.json
+++ b/config/dynamic.json
@@ -125,10 +125,6 @@
"weight": 0
},
- "Swarmers": {
- "weight": 0
- },
-
"Space Ninja": {
"weight": 0
},
diff --git a/config/lavaruinblacklist.txt b/config/lavaruinblacklist.txt
index bda6aab4e4f..88605f907b0 100644
--- a/config/lavaruinblacklist.txt
+++ b/config/lavaruinblacklist.txt
@@ -35,7 +35,6 @@
#_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm
diff --git a/icons/hud/swarmer.dmi b/icons/hud/swarmer.dmi
deleted file mode 100644
index 25951fdf649bef8b354758144d6babb15ddaf39c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2241
zcmV;y2tN0TP)DQ9?*L~10j&OFp#T5>{|pcd009674-XMZMg|B51Ox;H1_cHQ4+IAT6B-f^4-z0L
z9|8jc2MGri6%`OCN*^*CT3T8N83h_57&A~VD=Rftd`?GdKa<@5Mn*r*FVr3;685#Ef08C6we}8`h
zTHF9+`2$tYGfyr8UF8H!xC2(x94#0zOe|G;O#o*8RC!EOcS|r!D;zBu0$A4rQ_3nT
zG8GjWDk?DuIfE1*5f&p92NVQLY(!9VN&EZz`1tq;7zIvnM@wu)7$y}4LYgTlF(@c6
z6ciXICoU!?EeSGj2{dyN8V?DJga!}&ddL0mf{HXsxq5*ivG5E&02A0!hK7ZVc}2`*(38xJ2Z90o+7ATS*n866T5777Xs
z2?+}b2nq-Y2?{M@3N2v=2M7lT2?Y%V34eJBfO-ioWC8*M0s;aGEnp243<@k?0RaL5
z0Rayd4GJt>0000BTUT*$aS1PG3u0XhURezj3<@h<3u0aiURn!WSeO*9O#lD@p?XwU
zbVOxyV{&P5bZKvH004NLjgY+x!!QhlXZtBkvX}m?T}nd9(7ZxWZKW1CKgeqH`gNM6
zOTpXS@d@r!nrnS)T2tK{{YH*7jpky`yS-KmIq}Jyj#_!7rIT9uw=nuEtUh?X%w*1#RYgsOLJ}_hJLLB#Q*Tp)NS>B
z-v@LuVE+Q4lCuB+1q}5`*
z6>ODiy{~G-dMgFAT8|d17Adr}Ry_Vn-OB5R=Vr}#w9Go}VOV_bD{%$;9%{ZRmK1Ym7#Ov#6yB#5zA0bBxt
z50C_Fqg2S{;a)2MTr}qbz`6ba*n%1c1>5jwuT=oZ7FuvM5YPYwhkNlgpj4QhO8^k$
zfaU|<;L?&0Ks2Qs6gLb2fOt;yD2gnew;n~D7~DY9B1x#?320<~e4s@Dh^G|)3HchJ
zk@-bNXn-U%DW|=oBMK04!@)XKsvzYz^8wcYsZ>e=+OO#BxRPuM1F)e3P(EJ#6_AFD
zcQZo0pYBSfx-*$H+0xV7+j&)Qdr#EK!aPDeTsa0-gFI+6jJ9YVn8~h;X#$`tX_B7a
zP77K9fU+=%47^|q0GeuGCexWrUmpN6X(ZSdh_FK%P%biya*QNSsb-=?L-YGSFwInY
zYetx8D@&QCowag|<&eO%M3ZU=0OkSL05PJdJBcPrb~Dmp=lk;
zcT@0zB&bYgQ6Dr05U-ZtdM~GL4JQYl_rysqrZ$4HGGMP4-?XgC_oWKhAE
z@4X)*54>tzZ=y5_Z57f!PVoIW0KXa+4R5xntwMle8Pytb0`G^af}k~|0IeE#0d`iD
zpCJ>K@#taMJ|O~-4@3c8H7)^6Rfjr&p?rMC$|8Y90N0~@^#F8l2mrilT!<1ix){>|
zAV1%a3+zWi6mTQRR}b6-gqy=AQq{OvKi24B6Un28%^1KvWp%(Ux88R99q_=N_FcQ~
zzUSWi!WzhGTxx(7bVvhr^so&>+?28cP}^PGv!{0d1AE6G+_%eq=;259J^I-A<9nZ|
z)t;>F_I)6$ao5Q?E9e9F=mEhC09RQFcxqzu>B;>Eo_Tia;B(I(df~-GFTH&5l~-ST
z{f)`VH{TKhv})YHisWzs#WJ&scrXwefU;$a9d^gthgd}o*u#|I=PCT8d6=VlXMd^vUO*wj}?
zzMh-ie|&cK_?!f2)wtw%HM#^;%hjrX^ssR;4r9(?5Ae;m-+h1L
zaI0}Q|GXMqkD~C=LkrVYXlItrpNHFpU*|8t?c#51zvHOB6&Tv#km~;%lL)D$DXRfi
z*92ho;vabZ^RKnl2!LoU3J4uNhz7V+r6cuE1~gDQZrECxHzJ*X<9zTpB{A%Ex=D#W
P00000NkvXXu0mjf!Lyej
diff --git a/icons/mob/swarmer.dmi b/icons/mob/swarmer.dmi
deleted file mode 100644
index 55b58e61773b288a79c149fd41f72e70772043d9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 25942
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