From 05437fe376f520f42182797c9d31699da27c500d Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 24 Oct 2023 22:44:31 +0200 Subject: [PATCH] [MIRROR] Basic Constructs: Juggernaut [MDB IGNORE] (#24547) * Basic Constructs: Juggernaut (#79170) ## About The Pull Request Converts juggernaut constructs to basic mobs. These guys are really simple, so this is a pretty straightforward one. The one notable thing about this PR is that I got annoyed that projectile reflection code was copy-pasted in two different places (the main one for things like the ablative trenchcoat, and right here on the juggernaut). So, trenchcoat-style reflection is now a proc on `/obj/projectile`, which is used in both places. AI-controlled juggernauts are as simple as befits these big lugs, doing nothing but slowly walking toward mobs and beating them to death with their giant fists. ## Why It's Good For The Game Removes another 5 simple animals. Not too much else to say about this one, but it's easier to make projectiles bounce off of things now if anyone wants to do that. ## Changelog :cl: refactor: Juggernaut constructs now use the basic mob framework. Please report any bugs. /:cl: --------- Co-authored-by: san7890 * Basic Constructs: Juggernaut * Modular * Map Reset --------- Co-authored-by: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com> Co-authored-by: san7890 Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com> --- .../icemoon_underground_abandoned_village.dmm | 4 +- .../SpaceRuins/skyrat/port_tarkon/defcon2.dmm | 8 +- _maps/RandomRuins/SpaceRuins/the_outlet.dmm | 2 +- _maps/shuttles/emergency_narnar.dmm | 2 +- _maps/shuttles/whiteship_obelisk.dmm | 2 +- .../antagonists/wizard/equipment/soulstone.dm | 8 +- code/modules/events/portal_storm.dm | 6 +- .../living/basic/constructs/construct_ai.dm | 14 ++++ .../mob/living/basic/constructs/juggernaut.dm | 62 +++++++++++++++ .../mob/living/carbon/human/human_defense.dm | 40 +++------- code/modules/mob/living/living_defense.dm | 2 +- .../hostile/constructs/juggernaut.dm | 79 ------------------- code/modules/projectiles/projectile.dm | 19 +++++ .../spell_types/shapeshift/shapechange.dm | 6 +- .../unit_tests/simple_animal_freeze.dm | 5 -- tgstation.dme | 2 +- ...0_simple_to_basic_construct_juggernaut.txt | 1 + 17 files changed, 131 insertions(+), 131 deletions(-) create mode 100644 code/modules/mob/living/basic/constructs/juggernaut.dm delete mode 100644 code/modules/mob/living/simple_animal/hostile/constructs/juggernaut.dm create mode 100644 tools/UpdatePaths/Scripts/00000_simple_to_basic_construct_juggernaut.txt diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm index 00ba4c00af8..939ddf92b5e 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm @@ -135,7 +135,7 @@ /area/icemoon/underground/explored) "mi" = ( /obj/effect/decal/remains/human, -/mob/living/simple_animal/hostile/construct/juggernaut/hostile{ +/mob/living/basic/construct/juggernaut/hostile{ health = 450; maxHealth = 450; name = "Right Hand of the Elder" @@ -360,7 +360,7 @@ "EF" = ( /obj/effect/decal/cleanable/blood/gibs/torso, /obj/effect/decal/remains/human, -/mob/living/simple_animal/hostile/construct/juggernaut/hostile{ +/mob/living/basic/construct/juggernaut/hostile{ health = 450; maxHealth = 450; name = "Left Hand of the Elder" diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm index 95d181b18d6..fdf272d8aa4 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm @@ -1775,7 +1775,7 @@ /obj/effect/decal/cleanable/blood/tracks{ dir = 9 }, -/mob/living/simple_animal/hostile/construct/juggernaut/hostile, +/mob/living/basic/construct/juggernaut/hostile, /obj/effect/decal/cleanable/dirt, /turf/open/floor/cult, /area/ruin/space/has_grav/port_tarkon/cargo) @@ -2048,7 +2048,7 @@ "lj" = ( /obj/effect/decal/cleanable/glass, /obj/effect/decal/cleanable/blood, -/mob/living/simple_animal/hostile/construct/juggernaut/hostile{ +/mob/living/basic/construct/juggernaut/hostile{ health = 275; maxHealth = 275; name = "Left hand of the veil" @@ -4932,7 +4932,7 @@ "Cf" = ( /obj/effect/decal/cleanable/glass, /obj/effect/decal/cleanable/blood, -/mob/living/simple_animal/hostile/construct/juggernaut/hostile{ +/mob/living/basic/construct/juggernaut/hostile{ health = 275; maxHealth = 275; name = "Right hand of the veil" @@ -5211,7 +5211,7 @@ "DE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/mob/living/simple_animal/hostile/construct/juggernaut/hostile{ +/mob/living/basic/construct/juggernaut/hostile{ health = 200; maxHealth = 200 }, diff --git a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm index 6b0f009dcc6..89f41588081 100644 --- a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm +++ b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm @@ -1626,7 +1626,7 @@ /obj/effect/decal/cleanable/blood{ icon_state = "gib2-old" }, -/mob/living/simple_animal/hostile/construct/juggernaut/hostile, +/mob/living/basic/construct/juggernaut/hostile, /turf/open/floor/cult, /area/ruin/space/has_grav/the_outlet/cultinfluence) "MR" = ( diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm index 9f8cbbcc00d..804c59fa4ff 100644 --- a/_maps/shuttles/emergency_narnar.dmm +++ b/_maps/shuttles/emergency_narnar.dmm @@ -139,7 +139,7 @@ /turf/open/floor/cult, /area/shuttle/escape) "C" = ( -/mob/living/simple_animal/hostile/construct/juggernaut, +/mob/living/basic/construct/juggernaut, /turf/open/floor/cult, /area/shuttle/escape) "D" = ( diff --git a/_maps/shuttles/whiteship_obelisk.dmm b/_maps/shuttles/whiteship_obelisk.dmm index ec9697103d9..4a632a01df2 100644 --- a/_maps/shuttles/whiteship_obelisk.dmm +++ b/_maps/shuttles/whiteship_obelisk.dmm @@ -598,7 +598,7 @@ /area/shuttle/abandoned) "HU" = ( /obj/structure/cable, -/mob/living/simple_animal/hostile/construct/juggernaut/hostile, +/mob/living/basic/construct/juggernaut/hostile, /obj/effect/decal/cleanable/crayon{ icon_state = "rune4"; paint_colour = "#DC143C" diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 80dd5a1b2d9..a0498c38c45 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -462,15 +462,15 @@ switch(construct_class) if(CONSTRUCT_JUGGERNAUT) if(IS_CULTIST(creator)) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the makeNewConstruct proc + makeNewConstruct(/mob/living/basic/construct/juggernaut, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the makeNewConstruct proc return switch(theme) if(THEME_WIZARD) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut/mystic, target, creator, cultoverride, loc_override) + makeNewConstruct(/mob/living/basic/construct/juggernaut/mystic, target, creator, cultoverride, loc_override) if(THEME_HOLY) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut/angelic, target, creator, cultoverride, loc_override) + makeNewConstruct(/mob/living/basic/construct/juggernaut/angelic, target, creator, cultoverride, loc_override) if(THEME_CULT) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut/noncult, target, creator, cultoverride, loc_override) + makeNewConstruct(/mob/living/basic/construct/juggernaut/noncult, target, creator, cultoverride, loc_override) if(CONSTRUCT_WRAITH) if(IS_CULTIST(creator)) makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the makeNewConstruct proc diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 662b2f404c3..f195764073e 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -24,8 +24,10 @@ /datum/round_event/portal_storm/portal_storm_narsie boss_types = list(/mob/living/basic/construct/artificer/hostile = 6) - hostile_types = list(/mob/living/simple_animal/hostile/construct/juggernaut/hostile = 8,\ - /mob/living/simple_animal/hostile/construct/wraith/hostile = 6) + hostile_types = list( + /mob/living/basic/construct/juggernaut/hostile = 8, + /mob/living/simple_animal/hostile/construct/wraith/hostile = 6, + ) /datum/round_event/portal_storm start_when = 7 diff --git a/code/modules/mob/living/basic/constructs/construct_ai.dm b/code/modules/mob/living/basic/constructs/construct_ai.dm index fde0876955b..367bce49183 100644 --- a/code/modules/mob/living/basic/constructs/construct_ai.dm +++ b/code/modules/mob/living/basic/constructs/construct_ai.dm @@ -15,6 +15,20 @@ /datum/ai_planning_subtree/flee_target/from_flee_key, ) +/// Juggernauts +/datum/ai_controller/basic_controller/juggernaut + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_TARGET_MINIMUM_STAT = SOFT_CRIT, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + /// Targetting datum that will only allow mobs that constructs can heal. /datum/targetting_datum/basic/same_faction/construct target_wounded_key = BB_TARGET_WOUNDED_ONLY diff --git a/code/modules/mob/living/basic/constructs/juggernaut.dm b/code/modules/mob/living/basic/constructs/juggernaut.dm new file mode 100644 index 00000000000..9d8f4567bd2 --- /dev/null +++ b/code/modules/mob/living/basic/constructs/juggernaut.dm @@ -0,0 +1,62 @@ +/mob/living/basic/construct/juggernaut + name = "Juggernaut" + real_name = "Juggernaut" + desc = "A massive, armored construct built to spearhead attacks and soak up enemy fire." + icon_state = "juggernaut" + icon_living = "juggernaut" + maxHealth = 150 + health = 150 + response_harm_continuous = "harmlessly punches" + response_harm_simple = "harmlessly punch" + obj_damage = 90 + melee_damage_lower = 25 + melee_damage_upper = 25 + attack_verb_continuous = "smashes their armored gauntlet into" + attack_verb_simple = "smash your armored gauntlet into" + speed = 2.5 + attack_sound = 'sound/weapons/punch3.ogg' + status_flags = NONE + mob_size = MOB_SIZE_LARGE + force_threshold = 10 + construct_spells = list( + /datum/action/cooldown/spell/forcewall/cult, + /datum/action/cooldown/spell/basic_projectile/juggernaut, + /datum/action/innate/cult/create_rune/wall, + ) + playstyle_string = span_bold("You are a Juggernaut. Though slow, your shell can withstand heavy punishment, create shield walls, rip apart enemies and walls alike, and even deflect energy weapons.") + + smashes_walls = TRUE + +/// Hostile NPC version. Pretty dumb, just attacks whoever is near. +/mob/living/basic/construct/juggernaut/hostile + ai_controller = /datum/ai_controller/basic_controller/juggernaut + smashes_walls = FALSE + +/mob/living/basic/construct/juggernaut/bullet_act(obj/projectile/bullet) + if(!istype(bullet, /obj/projectile/energy) && !istype(bullet, /obj/projectile/beam)) + return ..() + if(!prob(40 - round(bullet.damage / 3))) // reflect chance + return ..() + + apply_damage(bullet.damage * 0.5, bullet.damage_type) + visible_message( + span_danger("The [bullet.name] is reflected by [src]'s armored shell!"), + span_userdanger("The [bullet.name] is reflected by your armored shell!"), + ) + + bullet.reflect(src) + + return BULLET_ACT_FORCE_PIERCE // complete projectile permutation + +// Alternate juggernaut themes +/mob/living/basic/construct/juggernaut/angelic + theme = THEME_HOLY + +/mob/living/basic/construct/juggernaut/angelic/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_ANGELIC, INNATE_TRAIT) + +/mob/living/basic/construct/juggernaut/mystic + theme = THEME_WIZARD + +/mob/living/basic/construct/juggernaut/noncult diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 2b58f9a8206..860e8392dd4 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -44,46 +44,32 @@ covering_part += C return covering_part -/mob/living/carbon/human/bullet_act(obj/projectile/P, def_zone, piercing_hit = FALSE) +/mob/living/carbon/human/bullet_act(obj/projectile/bullet, def_zone, piercing_hit = FALSE) - if(P.firer == src && P.original == src) //can't block or reflect when shooting yourself + if(bullet.firer == src && bullet.original == src) //can't block or reflect when shooting yourself return ..() - if(P.reflectable & REFLECT_NORMAL) + if(bullet.reflectable & REFLECT_NORMAL) if(check_reflect(def_zone)) // Checks if you've passed a reflection% check visible_message( - span_danger("The [P.name] gets reflected by [src]!"), - span_userdanger("The [P.name] gets reflected by [src]!"), + span_danger("The [bullet.name] gets reflected by [src]!"), + span_userdanger("The [bullet.name] gets reflected by [src]!"), ) // Finds and plays the block_sound of item which reflected - for(var/obj/item/I in held_items) - if(I.IsReflect(def_zone)) - playsound(src, I.block_sound, BLOCK_SOUND_VOLUME, TRUE) + for(var/obj/item/held_item in held_items) + if(held_item.IsReflect(def_zone)) + playsound(src, held_item.block_sound, BLOCK_SOUND_VOLUME, TRUE) // Find a turf near or on the original location to bounce to if(!isturf(loc)) //Open canopy mech (ripley) check. if we're inside something and still got hit - P.force_hit = TRUE //The thing we're in passed the bullet to us. Pass it back, and tell it to take the damage. - loc.bullet_act(P, def_zone, piercing_hit) + bullet.force_hit = TRUE //The thing we're in passed the bullet to us. Pass it back, and tell it to take the damage. + loc.bullet_act(bullet, def_zone, piercing_hit) return BULLET_ACT_HIT - if(P.starting) - var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/turf/curloc = get_turf(src) - - // redirect the projectile - P.original = locate(new_x, new_y, P.z) - P.starting = curloc - P.firer = src - P.yo = new_y - curloc.y - P.xo = new_x - curloc.x - var/new_angle_s = P.Angle + rand(120,240) - while(new_angle_s > 180) // Translate to regular projectile degrees - new_angle_s -= 360 - P.set_angle(new_angle_s) + bullet.reflect(src) return BULLET_ACT_FORCE_PIERCE // complete projectile permutation - if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armour_penetration, P.damage_type)) - P.on_hit(src, 100, def_zone, piercing_hit) + if(check_shields(bullet, bullet.damage, "the [bullet.name]", PROJECTILE_ATTACK, bullet.armour_penetration, bullet.damage_type)) + bullet.on_hit(src, 100, def_zone, piercing_hit) return BULLET_ACT_HIT return ..() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index daa7d0e60ae..ffa6c8ce264 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -488,7 +488,7 @@ else switch(rand(1, 4)) if(1) - new /mob/living/simple_animal/hostile/construct/juggernaut/hostile(get_turf(src)) + new /mob/living/basic/construct/juggernaut/hostile(get_turf(src)) if(2) new /mob/living/simple_animal/hostile/construct/wraith/hostile(get_turf(src)) if(3) diff --git a/code/modules/mob/living/simple_animal/hostile/constructs/juggernaut.dm b/code/modules/mob/living/simple_animal/hostile/constructs/juggernaut.dm deleted file mode 100644 index 893700abe8a..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/constructs/juggernaut.dm +++ /dev/null @@ -1,79 +0,0 @@ -/mob/living/simple_animal/hostile/construct/juggernaut - name = "Juggernaut" - real_name = "Juggernaut" - desc = "A massive, armored construct built to spearhead attacks and soak up enemy fire." - icon_state = "juggernaut" - icon_living = "juggernaut" - maxHealth = 150 - health = 150 - response_harm_continuous = "harmlessly punches" - response_harm_simple = "harmlessly punch" - harm_intent_damage = 0 - obj_damage = 90 - melee_damage_lower = 25 - melee_damage_upper = 25 - attack_verb_continuous = "smashes their armored gauntlet into" - attack_verb_simple = "smash your armored gauntlet into" - speed = 2.5 - environment_smash = ENVIRONMENT_SMASH_WALLS - attack_sound = 'sound/weapons/punch3.ogg' - status_flags = 0 - mob_size = MOB_SIZE_LARGE - force_threshold = 10 - construct_spells = list( - /datum/action/cooldown/spell/forcewall/cult, - /datum/action/cooldown/spell/basic_projectile/juggernaut, - /datum/action/innate/cult/create_rune/wall, - ) - playstyle_string = "You are a Juggernaut. Though slow, your shell can withstand heavy punishment, \ - create shield walls, rip apart enemies and walls alike, and even deflect energy weapons." - -/mob/living/simple_animal/hostile/construct/juggernaut/hostile //actually hostile, will move around, hit things - AIStatus = AI_ON - environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP - -/mob/living/simple_animal/hostile/construct/juggernaut/bullet_act(obj/projectile/bullet) - if(!istype(bullet, /obj/projectile/energy) && !istype(bullet, /obj/projectile/beam)) - return ..() - if(!prob(40 - round(bullet.damage / 3))) // reflect chance - return ..() - - apply_damage(bullet.damage * 0.5, bullet.damage_type) - visible_message(span_danger("The [bullet.name] is reflected by [src]'s armored shell!"), \ - span_userdanger("The [bullet.name] is reflected by your armored shell!")) - - if(!bullet.starting) - return BULLET_ACT_FORCE_PIERCE - // Find a turf near or on the original location to bounce to - var/new_x = bullet.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) - var/new_y = bullet.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) - var/turf/current_tile = get_turf(src) - - // redirect the projectile - bullet.original = locate(new_x, new_y, bullet.z) - bullet.starting = current_tile - bullet.firer = src - bullet.yo = new_y - current_tile.y - bullet.xo = new_x - current_tile.x - var/new_angle_s = bullet.Angle + rand(120,240) - while(new_angle_s > 180) // Translate to regular projectile degrees - new_angle_s -= 360 - bullet.set_angle(new_angle_s) - - return BULLET_ACT_FORCE_PIERCE // complete projectile permutation - - -//////////////////////////Juggernaut-alts//////////////////////////// -/mob/living/simple_animal/hostile/construct/juggernaut/angelic - theme = THEME_HOLY - loot = list(/obj/item/ectoplasm/angelic) - -/mob/living/simple_animal/hostile/construct/juggernaut/angelic/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_ANGELIC, INNATE_TRAIT) - -/mob/living/simple_animal/hostile/construct/juggernaut/mystic - theme = THEME_WIZARD - loot = list(/obj/item/ectoplasm/mystic) - -/mob/living/simple_animal/hostile/construct/juggernaut/noncult diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 5b84194f49e..078b2fef898 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -1168,6 +1168,25 @@ /obj/projectile/proc/can_embed_into(atom/hit) return embedding && shrapnel_type && iscarbon(hit) && !HAS_TRAIT(hit, TRAIT_PIERCEIMMUNE) +/// Reflects the projectile off of something +/obj/projectile/proc/reflect(atom/hit_atom) + if(!starting) + return + var/new_x = starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/new_y = starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/turf/current_tile = get_turf(hit_atom) + + // redirect the projectile + original = locate(new_x, new_y, z) + starting = current_tile + firer = hit_atom + yo = new_y - current_tile.y + xo = new_x - current_tile.x + var/new_angle_s = Angle + rand(120,240) + while(new_angle_s > 180) // Translate to regular projectile degrees + new_angle_s -= 360 + set_angle(new_angle_s) + #undef MOVES_HITSCAN #undef MUZZLE_EFFECT_PIXEL_INCREMENT diff --git a/code/modules/spells/spell_types/shapeshift/shapechange.dm b/code/modules/spells/spell_types/shapeshift/shapechange.dm index 2e890eed632..dd2597d0097 100644 --- a/code/modules/spells/spell_types/shapeshift/shapechange.dm +++ b/code/modules/spells/spell_types/shapeshift/shapechange.dm @@ -12,10 +12,10 @@ spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC possible_shapes = list( + /mob/living/basic/carp/magic/chaos, + /mob/living/basic/construct/juggernaut/mystic, /mob/living/basic/mouse, /mob/living/basic/pet/dog/corgi, - /mob/living/basic/carp/magic/chaos, - /mob/living/simple_animal/bot/secbot/ed209, /mob/living/basic/spider/giant/viper/wizard, - /mob/living/simple_animal/hostile/construct/juggernaut/mystic, + /mob/living/simple_animal/bot/secbot/ed209, ) diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index aa9f7f4713b..54804caade0 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -59,11 +59,6 @@ /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/juggernaut, - /mob/living/simple_animal/hostile/construct/juggernaut/angelic, - /mob/living/simple_animal/hostile/construct/juggernaut/hostile, - /mob/living/simple_animal/hostile/construct/juggernaut/mystic, - /mob/living/simple_animal/hostile/construct/juggernaut/noncult, /mob/living/simple_animal/hostile/construct/proteon, /mob/living/simple_animal/hostile/construct/proteon/hostile, /mob/living/simple_animal/hostile/construct/wraith, diff --git a/tgstation.dme b/tgstation.dme index 6445568b120..3ed3c763dc6 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4473,6 +4473,7 @@ #include "code\modules\mob\living\basic\constructs\artificer.dm" #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\drone\_drone.dm" #include "code\modules\mob\living\basic\drone\drone_say.dm" #include "code\modules\mob\living\basic\drone\drone_tools.dm" @@ -4859,7 +4860,6 @@ #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\constructs\juggernaut.dm" #include "code\modules\mob\living\simple_animal\hostile\constructs\wraith.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm" diff --git a/tools/UpdatePaths/Scripts/00000_simple_to_basic_construct_juggernaut.txt b/tools/UpdatePaths/Scripts/00000_simple_to_basic_construct_juggernaut.txt new file mode 100644 index 00000000000..f74e0e64585 --- /dev/null +++ b/tools/UpdatePaths/Scripts/00000_simple_to_basic_construct_juggernaut.txt @@ -0,0 +1 @@ +/mob/living/simple_animal/hostile/construct/juggernaut/@SUBTYPES : /mob/living/basic/construct/juggernaut/@SUBTYPES{@OLD}