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 += "The [name] were:" - 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 25951fdf649..00000000000 Binary files a/icons/hud/swarmer.dmi and /dev/null differ diff --git a/icons/mob/swarmer.dmi b/icons/mob/swarmer.dmi deleted file mode 100644 index 55b58e61773..00000000000 Binary files a/icons/mob/swarmer.dmi and /dev/null differ diff --git a/icons/obj/smooth_structures/swarmer_catwalk.dmi b/icons/obj/smooth_structures/swarmer_catwalk.dmi deleted file mode 100644 index 47f16b73af4..00000000000 Binary files a/icons/obj/smooth_structures/swarmer_catwalk.dmi and /dev/null differ diff --git a/strings/hallucination.json b/strings/hallucination.json index b6911b9a841..2eaea8568b1 100644 --- a/strings/hallucination.json +++ b/strings/hallucination.json @@ -145,7 +145,6 @@ "Blob", "Ling", "Ops", - "Swarmers", "Spiders", "Xenos", "Revenant", @@ -250,4 +249,4 @@ "?????" ] -} \ No newline at end of file +} diff --git a/strings/tips.txt b/strings/tips.txt index 67a96547a06..7f0786eb40e 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -228,8 +228,6 @@ As a Revenant, your Defile ability removes holy water from tiles in a small radi As a Revenant, your Overload Lights ability will only shock humans with lights if the lights are still on after a brief delay. As a Revenant, your Malfunction ability in general damages machinery and mechanical objects, possibly even emagging some objects. Experiment! As a Revenant, the illness inflicted on humans by Blight can be easily cured by lying down or with holy water, making it best used on targets that have no time to lie down, such as humans in combat. -As a Swarmer, you can deconstruct more things than you think. Try deconstructing light switches, buttons, air alarms and more. Experiment! -As a Swarmer, you can teleport fellow swarmers away if you think they are in danger. As a Morph, you can talk while disguised, but your words have a chance of being slurred, giving you away! As a Drone, you can ping other drones to alert them of areas in the station in need of repair. As a Ghost, you can see the inside of a container on the ground by clicking on it. diff --git a/strings/valentines.json b/strings/valentines.json index 18442c89008..77a9dcff61e 100644 --- a/strings/valentines.json +++ b/strings/valentines.json @@ -71,7 +71,6 @@ "I'm the QM, and my highest priority bounty is your love.", "Are you wearing space pants? Because I want to space your pants.", "You give me a positive moodlet.", - "Let's make like swarmers and reproduce.", "If you were a drone, would you be free tonight?", "Get the paramedics -- your body put me into crit!", "Come to the incinerator and be my maint squeeze.", diff --git a/tgstation.dme b/tgstation.dme index c42933b85c1..ae625a3b079 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -431,7 +431,6 @@ #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" #include "code\_onclick\hud\screentip.dm" -#include "code\_onclick\hud\swarmer.dm" #include "code\_onclick\hud\rendering\plane_master.dm" #include "code\_onclick\hud\rendering\plane_master_controller.dm" #include "code\_onclick\hud\rendering\render_plate.dm" @@ -2092,7 +2091,6 @@ #include "code\modules\antagonists\space_dragon\space_dragon.dm" #include "code\modules\antagonists\space_ninja\space_ninja.dm" #include "code\modules\antagonists\survivalist\survivalist.dm" -#include "code\modules\antagonists\swarmer\swarmer.dm" #include "code\modules\antagonists\traitor\balance_helper.dm" #include "code\modules\antagonists\traitor\datum_traitor.dm" #include "code\modules\antagonists\traitor\objective_category.dm" @@ -2586,7 +2584,6 @@ #include "code\modules\events\spacevine.dm" #include "code\modules\events\spider_infestation.dm" #include "code\modules\events\stray_cargo.dm" -#include "code\modules\events\swarmer.dm" #include "code\modules\events\wisdomcow.dm" #include "code\modules\events\wormholes.dm" #include "code\modules\events\holiday\halloween.dm" @@ -2892,7 +2889,6 @@ #include "code\modules\language\piratespeak.dm" #include "code\modules\language\shadowtongue.dm" #include "code\modules\language\slime.dm" -#include "code\modules\language\swarmer.dm" #include "code\modules\language\sylvan.dm" #include "code\modules\language\terrum.dm" #include "code\modules\language\uncommon.dm" @@ -3283,7 +3279,6 @@ #include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\wendigo.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm" @@ -3971,9 +3966,6 @@ #include "code\modules\surgery\organs\external\wings.dm" #include "code\modules\surgery\organs\stomach\_stomach.dm" #include "code\modules\surgery\organs\stomach\stomach_ethereal.dm" -#include "code\modules\swarmers\swarmer.dm" -#include "code\modules\swarmers\swarmer_act.dm" -#include "code\modules\swarmers\swarmer_objs.dm" #include "code\modules\tgchat\message.dm" #include "code\modules\tgchat\to_chat.dm" #include "code\modules\tgs\includes.dm" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/swarmer.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/swarmer.ts deleted file mode 100644 index 9b6696e261b..00000000000 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/swarmer.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Antagonist, Category } from "../base"; -import { multiline } from "common/string"; - -const Swarmer: Antagonist = { - key: "swarmer", - name: "Swarmer", - description: [ - multiline` - A swarmer is a small robot that replicates itself autonomously with - nearby given materials and prepare structures that they come - across for the following invasion force. - `, - - multiline` - Consume machines, structures, walls, anything to get materials. Replicate - as many swarmers as you can to repeat the process. - `, - ], - category: Category.Midround, -}; - -export default Swarmer;