diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm
index 8c31d589343..5c9336c5c5c 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm
@@ -812,7 +812,7 @@
/turf/open/floor/engine/vacuum,
/area/ruin/planetengi)
"yF" = (
-/mob/living/simple_animal/hostile/construct/proteon,
+/mob/living/basic/construct/proteon,
/turf/open/floor/iron,
/area/ruin/planetengi)
"Ai" = (
@@ -823,7 +823,7 @@
/turf/open/floor/iron/icemoon,
/area/ruin/planetengi)
"Iy" = (
-/mob/living/simple_animal/hostile/construct/proteon,
+/mob/living/basic/construct/proteon,
/obj/effect/turf_decal/tile/yellow,
/turf/open/floor/iron/icemoon,
/area/ruin/planetengi)
diff --git a/_maps/RandomRuins/SpaceRuins/clericden.dmm b/_maps/RandomRuins/SpaceRuins/clericden.dmm
index ed9b63c7947..c6e6bebddb0 100644
--- a/_maps/RandomRuins/SpaceRuins/clericden.dmm
+++ b/_maps/RandomRuins/SpaceRuins/clericden.dmm
@@ -131,7 +131,7 @@
/area/ruin/space)
"E" = (
/obj/effect/decal/cleanable/blood/tracks,
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/turf/open/floor/carpet/airless,
/area/ruin/space)
"F" = (
@@ -171,7 +171,7 @@
/turf/open/floor/plating/airless,
/area/ruin/space)
"N" = (
-/mob/living/simple_animal/hostile/construct/proteon,
+/mob/living/basic/construct/proteon,
/turf/open/misc/asteroid/airless,
/area/ruin/space)
"O" = (
diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm
index e6c3a96f8e0..ac334d9edf7 100644
--- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm
+++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm
@@ -107,7 +107,7 @@
/turf/open/misc/asteroid/airless,
/area/solars/tarkon)
"aA" = (
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/cult,
/area/ruin/space/has_grav/port_tarkon/observ)
@@ -657,7 +657,7 @@
/obj/structure/chair/sofa/corp{
dir = 8
},
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/ruin/space/has_grav/port_tarkon/observ)
@@ -4445,7 +4445,7 @@
/turf/open/floor/iron,
/area/ruin/space/has_grav/port_tarkon/trauma)
"yT" = (
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/ruin/space/has_grav/port_tarkon/porthall)
@@ -4646,7 +4646,7 @@
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/decal/cleanable/blood,
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/ruin/space/has_grav/port_tarkon/porthall)
@@ -7234,7 +7234,7 @@
"NZ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/ruin/space/has_grav/port_tarkon/observ)
@@ -8681,7 +8681,7 @@
/turf/open/floor/iron,
/area/ruin/space/has_grav/port_tarkon/forehall)
"WK" = (
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/cult,
/area/ruin/space/has_grav/port_tarkon/afthall)
diff --git a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm
index 89f41588081..e10d5abc111 100644
--- a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm
+++ b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm
@@ -75,7 +75,7 @@
/turf/open/floor/eighties,
/area/ruin/space/has_grav/the_outlet/storefront)
"cK" = (
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/machinery/light/small/directional/west,
/obj/effect/decal/cleanable/blood{
icon_state = "floor2-old"
@@ -1056,7 +1056,7 @@
/obj/effect/decal/cleanable/dirt{
icon_state = "dirt-4"
},
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/crayon{
icon_state = "rune6"
},
@@ -1222,7 +1222,7 @@
/area/ruin/space/has_grav/the_outlet/storefront)
"Db" = (
/obj/effect/decal/cleanable/crayon,
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/turf/open/floor/cult,
/area/ruin/space/has_grav/the_outlet/cultinfluence)
"Do" = (
@@ -1481,7 +1481,7 @@
/obj/effect/decal/cleanable/crayon{
icon_state = "rune2"
},
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/turf/open/floor/iron/white,
/area/ruin/space/has_grav/the_outlet/researchrooms)
"IF" = (
@@ -1573,7 +1573,7 @@
/turf/template_noop,
/area/template_noop)
"LL" = (
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/crayon{
icon_state = "rune2"
},
@@ -1667,7 +1667,7 @@
/obj/effect/decal/cleanable/crayon{
icon_state = "rune4"
},
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/turf/open/floor/cult,
/area/ruin/space/has_grav/the_outlet/cultinfluence)
"NE" = (
@@ -1976,7 +1976,7 @@
dir = 8
},
/obj/effect/decal/cleanable/crayon,
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/dirt{
icon_state = "dirt-127"
},
@@ -2101,7 +2101,7 @@
/turf/open/floor/iron/white,
/area/ruin/space/has_grav/the_outlet/researchrooms)
"Yr" = (
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/crayon,
/turf/open/floor/cult,
/area/ruin/space/has_grav/the_outlet/cultinfluence)
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm
index fa636a49184..c6eb6b38b64 100644
--- a/_maps/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/RandomZLevels/moonoutpost19.dmm
@@ -290,6 +290,12 @@
},
/turf/open/floor/iron/white,
/area/awaymission/moonoutpost19/research)
+"ca" = (
+/mob/living/basic/construct/proteon/hostile,
+/turf/open/misc/asteroid/moon{
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/mines)
"cb" = (
/obj/machinery/light/broken/directional/east,
/obj/machinery/airalarm/directional/east,
@@ -393,13 +399,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/awaymission/moonoutpost19/research)
-"cS" = (
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
-/obj/structure/flora/lunar_plant,
-/turf/open/misc/asteroid/moon{
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/mines)
"cT" = (
/obj/structure/cable,
/obj/effect/decal/cleanable/xenoblood,
@@ -433,12 +432,6 @@
temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"dr" = (
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
-/turf/open/misc/asteroid/moon{
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/mines)
"ds" = (
/obj/item/pizzabox{
pixel_x = 20;
@@ -2956,6 +2949,16 @@
},
/turf/open/floor/iron,
/area/awaymission/moonoutpost19/arrivals)
+"sM" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/item/flashlight/flare{
+ start_on = 1
+ },
+/turf/open/floor/iron{
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/syndicate)
"sO" = (
/obj/machinery/light/small/directional/west,
/obj/effect/turf_decal/lunar_sand,
@@ -3500,14 +3503,6 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/mines)
-"wA" = (
-/obj/item/flashlight/flare{
- start_on = 1
- },
-/turf/open/misc/asteroid/moon{
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/mines)
"wD" = (
/obj/machinery/light/small/broken/directional/east,
/obj/effect/decal/cleanable/dirt,
@@ -4980,6 +4975,13 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/awaymission/moonoutpost19/arrivals)
+"GQ" = (
+/mob/living/basic/construct/proteon/hostile,
+/obj/structure/flora/lunar_plant,
+/turf/open/misc/asteroid/moon{
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/mines)
"GR" = (
/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plating,
@@ -5450,16 +5452,6 @@
temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"JU" = (
-/obj/effect/mapping_helpers/burnt_floor,
-/obj/item/flashlight/flare{
- start_on = 1
- },
-/turf/open/floor/iron{
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/syndicate)
"JV" = (
/obj/structure/sink{
dir = 4;
@@ -6176,6 +6168,14 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/mines)
+"Pf" = (
+/obj/item/flashlight/flare{
+ start_on = 1
+ },
+/turf/open/misc/asteroid/moon{
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/mines)
"Ph" = (
/obj/effect/decal/cleanable/blood/tracks{
desc = "Your instincts say you shouldn't be following these.";
@@ -15631,7 +15631,7 @@ tb
tb
tb
tb
-dr
+ca
mo
mo
FB
@@ -16408,7 +16408,7 @@ eA
tb
tb
tb
-cS
+GQ
mo
mo
mo
@@ -16419,7 +16419,7 @@ mo
mo
mo
PP
-dr
+ca
tb
tb
sn
@@ -18718,7 +18718,7 @@ tb
tb
vE
mo
-dr
+ca
Qe
Qe
tb
@@ -18987,13 +18987,13 @@ tb
mo
Np
Zs
-dr
+ca
mo
rd
tb
tb
sn
-dr
+ca
tb
tb
tb
@@ -19989,7 +19989,7 @@ tb
mo
mo
mo
-dr
+ca
tb
tb
tb
@@ -20515,7 +20515,7 @@ tb
tb
Qe
tb
-dr
+ca
mo
mo
mo
@@ -20529,7 +20529,7 @@ eA
sn
tb
tb
-dr
+ca
eA
tb
tb
@@ -21784,7 +21784,7 @@ FB
tb
tb
eA
-dr
+ca
tb
tb
tb
@@ -22077,7 +22077,7 @@ tb
tb
tb
mo
-dr
+ca
tb
tb
tb
@@ -23321,7 +23321,7 @@ tb
tb
tb
tb
-dr
+ca
mo
tb
tb
@@ -23577,7 +23577,7 @@ zk
tb
tb
tb
-dr
+ca
mo
tb
tb
@@ -40252,7 +40252,7 @@ WZ
JQ
WZ
lj
-JU
+sM
WZ
WZ
Nr
@@ -56533,7 +56533,7 @@ tb
mo
mo
mo
-wA
+Pf
pS
tb
tb
diff --git a/_maps/shuttles/whiteship_obelisk.dmm b/_maps/shuttles/whiteship_obelisk.dmm
index 4a632a01df2..170c3db24bd 100644
--- a/_maps/shuttles/whiteship_obelisk.dmm
+++ b/_maps/shuttles/whiteship_obelisk.dmm
@@ -122,7 +122,7 @@
/area/shuttle/abandoned/engine)
"gw" = (
/obj/structure/cable,
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/crayon{
icon_state = "rune4";
paint_colour = "#DC143C"
@@ -134,7 +134,7 @@
/turf/open/floor/catwalk_floor/iron_smooth,
/area/shuttle/abandoned/engine)
"hg" = (
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/blood/old,
/obj/structure/cable,
/turf/open/floor/mineral/titanium/white,
@@ -166,7 +166,7 @@
/area/shuttle/abandoned/engine)
"ji" = (
/obj/structure/cable,
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
dir = 4
},
@@ -438,7 +438,7 @@
/area/shuttle/abandoned/crew)
"yo" = (
/obj/structure/cable,
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/crayon{
icon_state = "rune4";
paint_colour = "#DC143C"
@@ -616,7 +616,7 @@
/area/shuttle/abandoned)
"IH" = (
/obj/structure/cable,
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/blood/gibs/core,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
@@ -781,7 +781,7 @@
/area/shuttle/abandoned/medbay)
"SE" = (
/obj/structure/cable,
-/mob/living/simple_animal/hostile/construct/proteon/hostile,
+/mob/living/basic/construct/proteon/hostile,
/obj/effect/decal/cleanable/crayon{
icon_state = "rune4";
paint_colour = "#DC143C"
diff --git a/code/__DEFINES/ai/monsters.dm b/code/__DEFINES/ai/monsters.dm
index 72d756c0554..0aa0c97de8b 100644
--- a/code/__DEFINES/ai/monsters.dm
+++ b/code/__DEFINES/ai/monsters.dm
@@ -160,10 +160,8 @@
#define BB_DEMON_CLONE_ABILITY "demon_clone_ability"
///our slippery ice ability
#define BB_DEMON_SLIP_ABILITY "demon_slip_ability"
-///the turf we are escaping too
+///the turf we are escaping to
#define BB_ESCAPE_DESTINATION "escape_destination"
-///how far away we will be from our target before teleporting
-#define BB_MINIMUM_DISTANCE_RANGE "minimum_distance_range"
/// Corpse we have consumed
#define BB_LEGION_CORPSE "legion_corpse"
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 7f408a6805e..bfbec7dccf1 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -145,6 +145,8 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list(
// basic mobs
#define isbasicmob(A) (istype(A, /mob/living/basic))
+#define isconstruct(A) (istype(A, /mob/living/basic/construct))
+
#define iscow(A) (istype(A, /mob/living/basic/cow))
#define isgorilla(A) (istype(A, /mob/living/basic/gorilla))
@@ -159,9 +161,6 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list(
#define ismining(A) (istype(A, /mob/living/simple_animal/hostile/asteroid) || istype(A, /mob/living/basic/mining))
-/// constructs, which are both simple and basic for now
-#define isconstruct(A) (istype(A, /mob/living/simple_animal/hostile/construct) || istype(A, /mob/living/basic/construct))
-
//Simple animals
#define isanimal(A) (istype(A, /mob/living/simple_animal))
diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm
index 135fb00dea1..45c69734d6d 100644
--- a/code/_globalvars/lists/mobs.dm
+++ b/code/_globalvars/lists/mobs.dm
@@ -32,7 +32,6 @@ GLOBAL_LIST_INIT(abstract_mob_types, list(
/mob/living/simple_animal/bot,
/mob/living/simple_animal/hostile/asteroid/elite,
/mob/living/simple_animal/hostile/asteroid,
- /mob/living/simple_animal/hostile/construct,
/mob/living/simple_animal/hostile/guardian,
/mob/living/simple_animal/hostile/megafauna,
/mob/living/simple_animal/hostile/mimic, // Cannot exist if spawned without being passed an item reference
diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm
index f8ea532914b..f44f1f46b29 100644
--- a/code/_globalvars/phobias.dm
+++ b/code/_globalvars/phobias.dm
@@ -99,7 +99,6 @@ GLOBAL_LIST_INIT(phobia_mobs, list(
/mob/living/basic/skeleton,
/mob/living/basic/revenant,
/mob/living/simple_animal/bot/mulebot/paranormal,
- /mob/living/simple_animal/hostile/construct,
/mob/living/simple_animal/hostile/dark_wizard,
/mob/living/simple_animal/hostile/wizard,
/mob/living/simple_animal/hostile/zombie,
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 4275c78dbe4..f68776f5ec9 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -502,7 +502,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
alerttooltipstyle = "cult"
var/static/image/narnar
var/angle = 0
- var/mob/living/simple_animal/hostile/construct/Cviewer = null
+ var/mob/living/basic/construct/Cviewer
/atom/movable/screen/alert/bloodsense/Initialize(mapload, datum/hud/hud_owner)
. = ..()
diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm
index 124237fa597..1b6f1da06b6 100644
--- a/code/game/objects/structures/traps.dm
+++ b/code/game/objects/structures/traps.dm
@@ -8,7 +8,7 @@
alpha = 30 //initially quite hidden when not "recharging"
var/flare_message = "the trap flares brightly!"
var/last_trigger = 0
- var/time_between_triggers = 600 //takes a minute to recharge
+ var/time_between_triggers = 1 MINUTES
var/charges = INFINITY
var/antimagic_flags = MAGIC_RESISTANCE
@@ -61,50 +61,50 @@
last_trigger = world.time
charges--
if(charges <= 0)
- animate(src, alpha = 0, time = 10)
- QDEL_IN(src, 10)
+ animate(src, alpha = 0, time = 1 SECONDS)
+ QDEL_IN(src, 1 SECONDS)
else
animate(src, alpha = initial(alpha), time = time_between_triggers)
-/obj/structure/trap/proc/on_entered(datum/source, atom/movable/AM)
+/obj/structure/trap/proc/on_entered(datum/source, atom/movable/victim)
SIGNAL_HANDLER
if(last_trigger + time_between_triggers > world.time)
return
// Don't want the traps triggered by sparks, ghosts or projectiles.
- if(is_type_in_typecache(AM, ignore_typecache))
+ if(is_type_in_typecache(victim, ignore_typecache))
return
- if(ismob(AM))
- var/mob/M = AM
- if(M.mind in immune_minds)
+ if(ismob(victim))
+ var/mob/mob_victim = victim
+ if(mob_victim.mind in immune_minds)
return
- if(M.can_block_magic(antimagic_flags))
+ if(mob_victim.can_block_magic(antimagic_flags))
flare()
return
if(charges <= 0)
return
flare()
- if(isliving(AM))
- trap_effect(AM)
+ if(isliving(victim))
+ trap_effect(victim)
-/obj/structure/trap/proc/trap_effect(mob/living/L)
+/obj/structure/trap/proc/trap_effect(mob/living/victim)
return
/obj/structure/trap/stun
name = "shock trap"
desc = "A trap that will shock and render you immobile. You'd better avoid it."
icon_state = "trap-shock"
- var/stun_time = 100
+ var/stun_time = 10 SECONDS
-/obj/structure/trap/stun/trap_effect(mob/living/L)
- L.electrocute_act(30, src, flags = SHOCK_NOGLOVES) // electrocute act does a message.
- L.Paralyze(stun_time)
+/obj/structure/trap/stun/trap_effect(mob/living/victim)
+ victim.electrocute_act(30, src, flags = SHOCK_NOGLOVES) // electrocute act does a message.
+ victim.Paralyze(stun_time)
/obj/structure/trap/stun/hunter
name = "bounty trap"
desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. You'd better avoid it."
icon = 'icons/obj/restraints.dmi'
icon_state = "bounty_trap_on"
- stun_time = 200
+ stun_time = 20 SECONDS
sparks = FALSE //the item version gives them off to prevent runtimes (see Destroy())
antimagic_flags = NONE
var/obj/item/bountytrap/stored_item
@@ -112,7 +112,7 @@
/obj/structure/trap/stun/hunter/Initialize(mapload)
. = ..()
- time_between_triggers = 10
+ time_between_triggers = 1 SECONDS
flare_message = "[src] snaps shut!"
/obj/structure/trap/stun/hunter/Destroy()
@@ -121,10 +121,10 @@
stored_item = null
return ..()
-/obj/structure/trap/stun/hunter/on_entered(datum/source, atom/movable/AM)
- if(isliving(AM))
- var/mob/living/L = AM
- if(!L.mind?.has_antag_datum(/datum/antagonist/fugitive))
+/obj/structure/trap/stun/hunter/on_entered(datum/source, atom/movable/victim)
+ if(isliving(victim))
+ var/mob/living/living_victim = victim
+ if(!living_victim.mind?.has_antag_datum(/datum/antagonist/fugitive))
return
caught = TRUE
. = ..()
@@ -169,11 +169,11 @@
radio.talk_into(src, "Fugitive has triggered this trap in the [get_area_name(src)]!", RADIO_CHANNEL_COMMON)
/obj/item/bountytrap/attack_self(mob/living/user)
- var/turf/T = get_turf(src)
- if(!user || !user.transferItemToLoc(src, T))//visibly unequips
+ var/turf/target_turf = get_turf(src)
+ if(!user || !user.transferItemToLoc(src, target_turf))//visibly unequips
return
to_chat(user, span_notice("You set up [src]. Examine while close to disarm it."))
- stored_trap.forceMove(T)//moves trap to ground
+ stored_trap.forceMove(target_turf)//moves trap to ground
forceMove(stored_trap)//moves item into trap
/obj/item/bountytrap/Destroy()
@@ -189,9 +189,9 @@
desc = "A trap that will set you ablaze. You'd better avoid it."
icon_state = "trap-fire"
-/obj/structure/trap/fire/trap_effect(mob/living/L)
- to_chat(L, span_danger("Spontaneous combustion!"))
- L.Paralyze(20)
+/obj/structure/trap/fire/trap_effect(mob/living/victim)
+ to_chat(victim, span_danger("Spontaneous combustion!"))
+ victim.Paralyze(2 SECONDS)
new /obj/effect/hotspot(get_turf(src))
/obj/structure/trap/chill
@@ -199,11 +199,11 @@
desc = "A trap that will chill you to the bone. You'd better avoid it."
icon_state = "trap-frost"
-/obj/structure/trap/chill/trap_effect(mob/living/L)
- to_chat(L, span_danger("You're frozen solid!"))
- L.Paralyze(20)
- L.adjust_bodytemperature(-300)
- L.apply_status_effect(/datum/status_effect/freon)
+/obj/structure/trap/chill/trap_effect(mob/living/victim)
+ to_chat(victim, span_bolddanger("You're frozen solid!"))
+ victim.Paralyze(2 SECONDS)
+ victim.adjust_bodytemperature(-300)
+ victim.apply_status_effect(/datum/status_effect/freon)
/obj/structure/trap/damage
@@ -212,12 +212,12 @@
icon_state = "trap-earth"
-/obj/structure/trap/damage/trap_effect(mob/living/L)
- to_chat(L, span_danger("The ground quakes beneath your feet!"))
- L.Paralyze(100)
- L.adjustBruteLoss(35)
+/obj/structure/trap/damage/trap_effect(mob/living/victim)
+ to_chat(victim, span_bolddanger("The ground quakes beneath your feet!"))
+ victim.Paralyze(10 SECONDS)
+ victim.adjustBruteLoss(35)
var/obj/structure/flora/rock/style_random/giant_rock = new(get_turf(src))
- QDEL_IN(giant_rock, 200)
+ QDEL_IN(giant_rock, 20 SECONDS)
/obj/structure/trap/ward
@@ -225,7 +225,7 @@
desc = "A divine barrier, It looks like you could destroy it with enough effort, or wait for it to dissipate..."
icon_state = "ward"
density = TRUE
- time_between_triggers = 1200 //Exists for 2 minutes
+ time_between_triggers = 2 MINUTES
/obj/structure/trap/ward/Initialize(mapload)
. = ..()
@@ -236,10 +236,10 @@
desc = "A trap that rings with unholy energy. You think you hear... chittering?"
icon_state = "trap-cult"
-/obj/structure/trap/cult/trap_effect(mob/living/L)
- to_chat(L, span_danger("With a crack, the hostile constructs come out of hiding, stunning you!"))
- L.electrocute_act(10, src, flags = SHOCK_NOGLOVES) // electrocute act does a message.
- L.Paralyze(20)
- new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
- new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
- QDEL_IN(src, 30)
+/obj/structure/trap/cult/trap_effect(mob/living/victim)
+ to_chat(victim, span_bolddanger("With a crack, the hostile constructs come out of hiding, stunning you!"))
+ victim.electrocute_act(10, src, flags = SHOCK_NOGLOVES) // electrocute act does a message.
+ victim.Paralyze(2 SECONDS)
+ new /mob/living/basic/construct/proteon/hostile(loc)
+ new /mob/living/basic/construct/proteon/hostile(loc)
+ QDEL_IN(src, 3 SECONDS)
diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm
index 8ba039564da..ebf66a7ee15 100644
--- a/code/modules/antagonists/cult/cult_structures.dm
+++ b/code/modules/antagonists/cult/cult_structures.dm
@@ -37,26 +37,6 @@
icon_state = "[initial(icon_state)][anchored ? "" : "_off"]"
return ..()
-/obj/structure/destructible/cult/attack_animal(mob/living/simple_animal/user, list/modifiers)
- if(!isconstruct(user))
- return ..()
-
- var/mob/living/simple_animal/hostile/construct/healer = user
- if(!healer.can_repair)
- return ..()
-
- if(atom_integrity >= max_integrity)
- to_chat(user, span_cult("You cannot repair [src], as it's undamaged!"))
- return
-
- user.changeNext_move(CLICK_CD_MELEE)
- atom_integrity = min(max_integrity, atom_integrity + 5)
- Beam(user, icon_state = "sendbeam", time = 0.4 SECONDS)
- user.visible_message(
- span_danger("[user] repairs [src]."),
- span_cult("You repair [src], leaving it at [round(atom_integrity * 100 / max_integrity)]% stability.")
- )
-
/*
* Proc for use with the concealing spell. Hides the building (makes it invisible).
*/
diff --git a/code/modules/mapfluff/ruins/spaceruin_code/clericsden.dm b/code/modules/mapfluff/ruins/spaceruin_code/clericsden.dm
index 2ea63245661..56b09ef7f79 100644
--- a/code/modules/mapfluff/ruins/spaceruin_code/clericsden.dm
+++ b/code/modules/mapfluff/ruins/spaceruin_code/clericsden.dm
@@ -13,24 +13,3 @@
/obj/item/paper/fluff/ruins/clericsden/warning
default_raw_text = "FATHER ODIVALLUS DO NOT GO FORWARD WITH THE RITUAL. THE ASTEROID WE'RE ANCHORED TO IS UNSTABLE, YOU WILL DESTROY THE STATION. I HOPE THIS REACHES YOU IN TIME. FATHER AURELLION."
-
-/mob/living/simple_animal/hostile/construct/proteon
- name = "Proteon"
- real_name = "Proteon"
- desc = "A weaker construct meant to scour ruins for objects of Nar'Sie's affection. Those barbed claws are no joke."
- icon_state = "proteon"
- icon_living = "proteon"
- maxHealth = 35
- health = 35
- melee_damage_lower = 8
- melee_damage_upper = 10
- retreat_distance = 4 //AI proteons will rapidly move in and out of combat to avoid conflict, but will still target and follow you.
- attack_verb_continuous = "pinches"
- attack_verb_simple = "pinch"
- environment_smash = ENVIRONMENT_SMASH_WALLS
- attack_sound = 'sound/weapons/punch2.ogg'
- playstyle_string = "You are a Proteon. Your abilities in combat are outmatched by most combat constructs, but you are still fast and nimble. Run metal and supplies, and cooperate with your fellow cultists."
-
-/mob/living/simple_animal/hostile/construct/proteon/hostile //Style of mob spawned by trapped cult runes in the cleric ruin.
- AIStatus = AI_ON
- environment_smash = ENVIRONMENT_SMASH_STRUCTURES //standard ai construct behavior, breaks things if it wants, but not walls.
diff --git a/code/modules/mob/living/basic/constructs/_construct.dm b/code/modules/mob/living/basic/constructs/_construct.dm
index e4c21b5a23c..7007c11f79c 100644
--- a/code/modules/mob/living/basic/constructs/_construct.dm
+++ b/code/modules/mob/living/basic/constructs/_construct.dm
@@ -66,7 +66,7 @@
heal_brute = 5,\
heal_burn = 0,\
heal_time = 0,\
- valid_targets_typecache = typecacheof(list(/mob/living/basic/construct, /mob/living/simple_animal/hostile/construct, /mob/living/simple_animal/shade)),\
+ valid_targets_typecache = typecacheof(list(/mob/living/basic/construct, /mob/living/simple_animal/shade)),\
valid_biotypes = MOB_MINERAL | MOB_SPIRIT,\
self_targetting = can_repair_self ? HEALING_TOUCH_ANYONE : HEALING_TOUCH_NOT_SELF,\
action_text = "%SOURCE% begins repairing %TARGET%'s dents.",\
@@ -129,34 +129,6 @@
/mob/living/basic/construct/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)
return FALSE
-// Allows simple constructs to repair basic constructs.
-/mob/living/basic/construct/attack_animal(mob/living/simple_animal/user, list/modifiers)
- if(!isconstruct(user))
- if(src != user)
- return ..()
- return
-
- if(src == user) //basic constructs use the healing hands component instead
- return
-
- var/mob/living/simple_animal/hostile/construct/doll = user
- if(!doll.can_repair || (doll == src && !doll.can_repair_self))
- return ..()
- if(theme != doll.theme)
- return ..()
-
- if(health >= maxHealth)
- to_chat(user, span_cult("You cannot repair [src]'s dents, as [p_they()] [p_have()] none!"))
- return
-
- heal_overall_damage(brute = 5)
-
- Beam(user, icon_state = "sendbeam", time = 4)
- user.visible_message(
- span_danger("[user] repairs some of \the [src]'s dents."),
- span_cult("You repair some of [src]'s dents, leaving [src] at [health]/[maxHealth] health."),
- )
-
/// Construct ectoplasm. Largely a placeholder, since the death drop element needs a unique list.
/obj/item/ectoplasm/construct
name = "blood-red ectoplasm"
diff --git a/code/modules/mob/living/basic/constructs/construct_ai.dm b/code/modules/mob/living/basic/constructs/construct_ai.dm
index 6f837146837..69f668001f8 100644
--- a/code/modules/mob/living/basic/constructs/construct_ai.dm
+++ b/code/modules/mob/living/basic/constructs/construct_ai.dm
@@ -23,13 +23,12 @@
/**
* Juggernauts
*
- * Juggernauts slowly walk toward non-allied mobs and pummel them into hardcrit.
- * They do not finish off carbons, as that's the job of wraiths.
+ * Juggernauts slowly walk toward non-allied mobs and pummel them to death.
*/
/datum/ai_controller/basic_controller/juggernaut
blackboard = list(
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
- BB_TARGET_MINIMUM_STAT = SOFT_CRIT,
+ BB_TARGET_MINIMUM_STAT = HARD_CRIT,
)
ai_movement = /datum/ai_movement/basic_avoidance
@@ -40,6 +39,28 @@
/datum/ai_planning_subtree/basic_melee_attack_subtree,
)
+/**
+ * Proteons
+ *
+ * Proteons perform cowardly hit-and-run attacks, fleeing melee when struck but returning to fight again.
+ */
+/datum/ai_controller/basic_controller/proteon
+ blackboard = list(
+ BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
+ BB_TARGET_MINIMUM_STAT = HARD_CRIT,
+ BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic,
+ )
+
+ ai_movement = /datum/ai_movement/basic_avoidance
+ idle_behavior = /datum/idle_behavior/idle_random_walk
+ planning_subtrees = list(
+ /datum/ai_planning_subtree/target_retaliate/to_flee,
+ /datum/ai_planning_subtree/flee_target/from_flee_key,
+ /datum/ai_planning_subtree/simple_find_target,
+ /datum/ai_planning_subtree/attack_obstacle_in_path,
+ /datum/ai_planning_subtree/basic_melee_attack_subtree,
+ )
+
/**
* Wraiths
*
diff --git a/code/modules/mob/living/basic/constructs/proteon.dm b/code/modules/mob/living/basic/constructs/proteon.dm
new file mode 100644
index 00000000000..2ff58d2463c
--- /dev/null
+++ b/code/modules/mob/living/basic/constructs/proteon.dm
@@ -0,0 +1,39 @@
+/// Proteon - a very weak construct that only appears in NPC form in various ruins.
+/mob/living/basic/construct/proteon
+ name = "Proteon"
+ real_name = "Proteon"
+ desc = "A weaker construct meant to scour ruins for objects of Nar'Sie's affection. Those barbed claws are no joke."
+ icon_state = "proteon"
+ icon_living = "proteon"
+ maxHealth = 35
+ health = 35
+ melee_damage_lower = 8
+ melee_damage_upper = 10
+ attack_verb_continuous = "pinches"
+ attack_verb_simple = "pinch"
+ smashes_walls = TRUE
+ attack_sound = 'sound/weapons/punch2.ogg'
+ playstyle_string = span_bold("You are a Proteon. Your abilities in combat are outmatched by most combat constructs, but you are still fast and nimble. Run metal and supplies, and cooperate with your fellow cultists.")
+
+/// Hostile NPC version
+/mob/living/basic/construct/proteon/hostile
+ ai_controller = /datum/ai_controller/basic_controller/proteon
+ smashes_walls = FALSE
+ melee_attack_cooldown = 1.5 SECONDS
+
+/mob/living/basic/construct/proteon/hostile/Initialize(mapload)
+ . = ..()
+ var/datum/callback/retaliate_callback = CALLBACK(src, PROC_REF(ai_retaliate_behaviour))
+ AddComponent(/datum/component/ai_retaliate_advanced, retaliate_callback)
+
+/// Set a timer to clear our retaliate list
+/mob/living/basic/construct/proteon/hostile/proc/ai_retaliate_behaviour(mob/living/attacker)
+ if (!istype(attacker))
+ return
+ var/random_timer = rand(2 SECONDS, 4 SECONDS) //for unpredictability
+ addtimer(CALLBACK(src, PROC_REF(clear_retaliate_list)), random_timer)
+
+/mob/living/basic/construct/proteon/hostile/proc/clear_retaliate_list()
+ if(!ai_controller.blackboard_key_exists(BB_BASIC_MOB_RETALIATE_LIST))
+ return
+ ai_controller.clear_blackboard_key(BB_BASIC_MOB_RETALIATE_LIST)
diff --git a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_ai.dm b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_ai.dm
index 28ddd38324a..3f197860618 100644
--- a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_ai.dm
+++ b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_ai.dm
@@ -5,7 +5,6 @@
/obj/item/weldingtool,
/obj/item/flashlight/flare,
),
- BB_MINIMUM_DISTANCE_RANGE = 3,
)
ai_movement = /datum/ai_movement/basic_avoidance
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 361bd5e2769..3f5dd6f3340 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -494,7 +494,7 @@
if(3)
new /mob/living/basic/construct/artificer/hostile(get_turf(src))
if(4)
- new /mob/living/simple_animal/hostile/construct/proteon/hostile(get_turf(src))
+ new /mob/living/basic/construct/proteon/hostile(get_turf(src))
spawn_dust()
investigate_log("has been gibbed by Nar'Sie.", INVESTIGATE_DEATHS)
gib()
diff --git a/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm b/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm
deleted file mode 100644
index 31150a4dc89..00000000000
--- a/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm
+++ /dev/null
@@ -1,133 +0,0 @@
-/mob/living/simple_animal/hostile/construct
- name = "Construct"
- real_name = "Construct"
- desc = ""
- gender = NEUTER
- mob_biotypes = MOB_MINERAL | MOB_SPECIAL
- speak_emote = list("hisses")
- response_help_continuous = "thinks better of touching"
- response_help_simple = "think better of touching"
- response_disarm_continuous = "flails at"
- response_disarm_simple = "flail at"
- response_harm_continuous = "punches"
- response_harm_simple = "punch"
- speak_chance = 1
- icon = 'icons/mob/nonhuman-player/cult.dmi'
- speed = 0
- combat_mode = TRUE
- stop_automated_movement = 1
- status_flags = CANPUSH
- attack_sound = 'sound/weapons/punch1.ogg'
- // Vivid red, cause cult theme
- lighting_cutoff_red = 30
- lighting_cutoff_green = 5
- lighting_cutoff_blue = 20
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
- 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)
- minbodytemp = 0
- maxbodytemp = INFINITY
- faction = list(FACTION_CULT)
- pressure_resistance = 100
- unique_name = TRUE
- AIStatus = AI_OFF //normal constructs don't have AI
- loot = list(/obj/item/ectoplasm)
- del_on_death = TRUE
- initial_language_holder = /datum/language_holder/construct
- death_message = "collapses in a shattered heap."
- /// List of spells that this construct can cast
- var/list/construct_spells = list()
- /// Flavor text shown to players when they spawn as this construct
- var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this."
- /// The construct's master
- var/master = null
- /// Whether this construct is currently seeking nar nar
- var/seeking = FALSE
- /// Whether this construct can repair other constructs or cult buildings.
- var/can_repair = FALSE
- /// Whether this construct can repair itself. Works independently of can_repair.
- var/can_repair_self = FALSE
- /// Theme controls color. THEME_CULT is red THEME_WIZARD is purple and THEME_HOLY is blue
- var/theme = THEME_CULT
-
-/mob/living/simple_animal/hostile/construct/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/simple_flying)
- add_traits(list(TRAIT_HEALS_FROM_CULT_PYLONS, TRAIT_SPACEWALK), INNATE_TRAIT)
- for(var/spell in construct_spells)
- var/datum/action/new_spell = new spell(src)
- new_spell.Grant(src)
-
- var/spell_count = 1
- for(var/datum/action/spell as anything in actions)
- if(!(spell.type in construct_spells))
- continue
-
- var/pos = 2 + spell_count * 31
- if(construct_spells.len >= 4)
- pos -= 31 * (construct_spells.len - 4)
- spell.default_button_position = "6:[pos],4:-2" // Set the default position to this random position
- spell_count++
- update_action_buttons()
-
- if(icon_state)
- add_overlay("glow_[icon_state]_[theme]")
-
-/mob/living/simple_animal/hostile/construct/Login()
- . = ..()
- if(!. || !client)
- return FALSE
- to_chat(src, playstyle_string)
-
-/mob/living/simple_animal/hostile/construct/examine(mob/user)
- var/text_span
- switch(theme)
- if(THEME_CULT)
- text_span = "cult"
- if(THEME_WIZARD)
- text_span = "purple"
- if(THEME_HOLY)
- text_span = "blue"
- . = list("This is [icon2html(src, user)] \a [src]!\n[desc]")
- if(health < maxHealth)
- if(health >= maxHealth/2)
- . += span_warning("[p_They()] look[p_s()] slightly dented.")
- else
- . += span_warning("[p_They()] look[p_s()] severely dented!")
- . += ""
-
-/mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/user, list/modifiers)
- if(!isconstruct(user))
- if(src != user)
- return ..()
- return
-
- var/mob/living/simple_animal/hostile/construct/doll = user
- if(!doll.can_repair || (doll == src && !doll.can_repair_self))
- return ..()
- if(theme != doll.theme)
- return ..()
-
- if(health >= maxHealth)
- if(src != user)
- to_chat(user, span_cult("You cannot repair [src]'s dents, as [p_they()] [p_have()] none!"))
- else
- to_chat(user, span_cult("You cannot repair your own dents, as you have none!"))
- return
-
- adjustHealth(-5)
- if(src == user)
- user.visible_message(span_danger("[user] repairs some of [p_their()] own dents."), \
- span_cult("You repair some of your own dents, leaving you at [user.health]/[user.maxHealth] health."))
- return
-
- Beam(user, icon_state="sendbeam", time = 4)
- user.visible_message(span_danger("[user] repairs some of \the [src]'s dents."), \
- span_cult("You repair some of [src]'s dents, leaving [src] at [health]/[maxHealth] health."))
-
-
-/mob/living/simple_animal/hostile/construct/narsie_act()
- return
-
-/mob/living/simple_animal/hostile/construct/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)
- return FALSE
-
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index dbb795e91c5..6c6ce7c0e6a 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -48,21 +48,6 @@
return FALSE
return ..()
-/mob/living/simple_animal/shade/attack_animal(mob/living/simple_animal/user, list/modifiers)
- if(isconstruct(user))
- var/mob/living/simple_animal/hostile/construct/doll = user
- if(!doll.can_repair)
- return
- if(health < maxHealth)
- adjustHealth(-25)
- Beam(user,icon_state="sendbeam", time = 4)
- user.visible_message(span_danger("[user] heals \the [src]."), \
- span_cult("You heal [src], leaving [src] at [health]/[maxHealth] health."))
- else
- to_chat(user, span_cult("You cannot heal [src], as [p_theyre()] unharmed!"))
- else if(src != user)
- return ..()
-
/mob/living/simple_animal/shade/attackby(obj/item/item, mob/user, params) //Marker -Agouri
if(istype(item, /obj/item/soulstone))
var/obj/item/soulstone/stone = item
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 1caf5e9f1ea..fc366eab71c 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -376,7 +376,7 @@
if(!MP)
return FALSE //Sanity, this should never happen.
- if(ispath(MP, /mob/living/simple_animal/hostile/construct) || ispath(MP, /mob/living/basic/construct))
+ if(ispath(MP, /mob/living/basic/construct))
return FALSE //Verbs do not appear for players.
//Good mobs!
diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm
index 3c5dbfb6474..329cbc0bfc9 100644
--- a/code/modules/unit_tests/simple_animal_freeze.dm
+++ b/code/modules/unit_tests/simple_animal_freeze.dm
@@ -58,9 +58,6 @@
/mob/living/simple_animal/hostile/asteroid/polarbear,
/mob/living/simple_animal/hostile/asteroid/polarbear/lesser,
/mob/living/simple_animal/hostile/asteroid/wolf,
- /mob/living/simple_animal/hostile/construct,
- /mob/living/simple_animal/hostile/construct/proteon,
- /mob/living/simple_animal/hostile/construct/proteon/hostile,
/mob/living/simple_animal/hostile/dark_wizard,
/mob/living/simple_animal/hostile/guardian,
/mob/living/simple_animal/hostile/guardian/assassin,
diff --git a/tgstation.dme b/tgstation.dme
index 4bf422758ba..90f69e83520 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -4484,6 +4484,7 @@
#include "code\modules\mob\living\basic\constructs\construct_ai.dm"
#include "code\modules\mob\living\basic\constructs\harvester.dm"
#include "code\modules\mob\living\basic\constructs\juggernaut.dm"
+#include "code\modules\mob\living\basic\constructs\proteon.dm"
#include "code\modules\mob\living\basic\constructs\wraith.dm"
#include "code\modules\mob\living\basic\drone\_drone.dm"
#include "code\modules\mob\living\basic\drone\drone_say.dm"
@@ -4877,7 +4878,6 @@
#include "code\modules\mob\living\simple_animal\hostile\vatbeast.dm"
#include "code\modules\mob\living\simple_animal\hostile\wizard.dm"
#include "code\modules\mob\living\simple_animal\hostile\zombie.dm"
-#include "code\modules\mob\living\simple_animal\hostile\constructs\constructs.dm"
#include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm"
#include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\_megafauna.dm"
diff --git a/tools/UpdatePaths/Scripts/00000_simple_to_basic_construct_proteon.txt b/tools/UpdatePaths/Scripts/00000_simple_to_basic_construct_proteon.txt
new file mode 100644
index 00000000000..f13d42ce70f
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/00000_simple_to_basic_construct_proteon.txt
@@ -0,0 +1 @@
+/mob/living/simple_animal/hostile/construct/proteon/@SUBTYPES : /mob/living/basic/construct/proteon/@SUBTYPES{@OLD}