[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>
This commit is contained in:
SkyratBot
2022-01-15 17:19:18 +00:00
committed by GitHub
co-authored by Jeremiah Tom
parent 5023cea362
commit f42d424b49
35 changed files with 42 additions and 1834 deletions
@@ -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
"}
@@ -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"
+13 -21
View File
@@ -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
@@ -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
-2
View File
@@ -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))
-3
View File
@@ -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))
-2
View File
@@ -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
-1
View File
@@ -104,7 +104,6 @@
#define span_spider(str) ("<span class='spider'>" + str + "</span>")
#define span_suicide(str) ("<span class='suicide'>" + str + "</span>")
#define span_suppradio(str) ("<span class='suppradio'>" + str + "</span>")
#define span_swarmer(str) ("<span class='swarmer'>" + str + "</span>")
#define span_syndradio(str) ("<span class='syndradio'>" + str + "</span>")
#define span_tape_recorder(str) ("<span class='tape_recorder'>" + str + "</span>")
#define span_tinynotice(str) ("<span class='tinynotice'>" + str + "</span>")
-2
View File
@@ -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",
-2
View File
@@ -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(
-103
View File
@@ -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
-8
View File
@@ -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"
+1 -5
View File
@@ -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)
@@ -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) //
@@ -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."
-1
View File
@@ -356,7 +356,6 @@
ROLE_REV_HEAD,
ROLE_SENTIENT_DISEASE,
ROLE_SPIDER,
ROLE_SWARMER,
ROLE_SYNDICATE,
ROLE_TRAITOR,
ROLE_WIZARD,
@@ -1,44 +0,0 @@
/datum/team/swarmer
name = "Swarmers"
//Simply lists them.
/datum/team/swarmer/roundend_report()
var/list/parts = list()
parts += "<span class='header'>The [name] were:</span>"
parts += printplayerlist(members)
return "<div class='panel redborder'>[parts.Join("<br>")]</div>"
/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)
@@ -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()
-27
View File
@@ -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")
-5
View File
@@ -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))
@@ -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"
+3 -10
View File
@@ -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)
-468
View File
@@ -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 = "<B>Swarm communication - [src]</b> [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)
-275
View File
@@ -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
-185
View File
@@ -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, "<b>A swarmer is currently being created. Try again soon.</b>")
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, "<span class='bold'>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 !*# $*#^</span>")
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
-4
View File
@@ -125,10 +125,6 @@
"weight": 0
},
"Swarmers": {
"weight": 0
},
"Space Ninja": {
"weight": 0
},
-1
View File
@@ -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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

+1 -2
View File
@@ -145,7 +145,6 @@
"Blob",
"Ling",
"Ops",
"Swarmers",
"Spiders",
"Xenos",
"Revenant",
@@ -250,4 +249,4 @@
"?????"
]
}
}
-2
View File
@@ -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.
-1
View File
@@ -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.",
-8
View File
@@ -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"
@@ -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;