From ff46f9c9794672b253b36a39aa9bd8fcd07f91ad Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 2 Nov 2023 01:04:55 +0100 Subject: [PATCH] [MIRROR] Basic Constructs: Proteon [MDB IGNORE] (#24729) * Basic Constructs: Proteon (#79425) ## About The Pull Request Last one! Makes proteons into a basic mob, and completely removes the simple_animal construct supertype. Proteons aren't really designed to be played by a player, instead being a nuisance mapped into various ruins and traps. As such, they don't really have any special abilities. Instead, the hostile variant has a somewhat unique behavior. They'll viciously attack anyone who comes close, but, being frail little cowards, if a proteon takes damage it will immediately flee. After a random period between 2 and 4 seconds, it will stop fleeing and come back for more. In addition to this, a few other things have been done, some only related because they're in files I touched. - Moved proteons from the file for the Cleric's Den to their own file in the basic constructs folder. Given that they're used in several different ruins, they might as well not just be in the file for one. - Simple constructs have been cut, and with them the procs for healing/repairing on shades and cult structures, as those are no longer needed. - Because I was touching it anyway, I touched up the file for trap structures. They no longer use any one-letter variable names, and time is now universally listed in seconds rather than deciseconds in that file. - I removed a completely unused blackboard key from ice demons. This is something I noticed due to a change I ended up not making while working on proteon AI, but I figured I might as well leave it gone. ## Why It's Good For The Game Kills the last three simple construct typepaths, bringing us to the destined 19 removed. Huzzah! The proteon AI routine should inject a little spice into fighting proteons, especially for the unprepared - unlike many mobs, they won't stand there and take it if you decide to fight back, but you can never safely ignore them when they run away. They still aren't particularly dangerous. ## Changelog :cl: refactor: Proteon constructs now use the basic mob framework. The ones encountered in ruins are a bit flightier now, and will briefly flee combat if attacked - only so that they can return and menace you again soon after. Please report any bugs. /:cl: --------- Co-authored-by: san7890 * Basic Constructs: Proteon * Update defcon2.dmm --------- Co-authored-by: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com> Co-authored-by: san7890 Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com> --- .../IceRuins/icemoon_surface_engioutpost.dmm | 4 +- _maps/RandomRuins/SpaceRuins/clericden.dmm | 4 +- .../SpaceRuins/skyrat/port_tarkon/defcon2.dmm | 12 +- _maps/RandomRuins/SpaceRuins/the_outlet.dmm | 16 +-- _maps/RandomZLevels/moonoutpost19.dmm | 92 ++++++------ _maps/shuttles/whiteship_obelisk.dmm | 12 +- code/__DEFINES/ai/monsters.dm | 4 +- code/__DEFINES/is_helpers.dm | 5 +- code/_globalvars/lists/mobs.dm | 1 - code/_globalvars/phobias.dm | 1 - code/_onclick/hud/alert.dm | 2 +- code/game/objects/structures/traps.dm | 92 ++++++------ .../antagonists/cult/cult_structures.dm | 20 --- .../ruins/spaceruin_code/clericsden.dm | 21 --- .../mob/living/basic/constructs/_construct.dm | 30 +--- .../living/basic/constructs/construct_ai.dm | 27 +++- .../mob/living/basic/constructs/proteon.dm | 39 +++++ .../basic/icemoon/ice_demon/ice_demon_ai.dm | 1 - code/modules/mob/living/living_defense.dm | 2 +- .../hostile/constructs/constructs.dm | 133 ------------------ .../modules/mob/living/simple_animal/shade.dm | 15 -- code/modules/mob/transform_procs.dm | 2 +- .../unit_tests/simple_animal_freeze.dm | 3 - tgstation.dme | 2 +- ...0000_simple_to_basic_construct_proteon.txt | 1 + 25 files changed, 188 insertions(+), 353 deletions(-) create mode 100644 code/modules/mob/living/basic/constructs/proteon.dm delete mode 100644 code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm create mode 100644 tools/UpdatePaths/Scripts/00000_simple_to_basic_construct_proteon.txt 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}