[MIRROR] Basic Constructs: Wraith [MDB IGNORE] (#24655)

* Basic Constructs: Wraith (#79235)

## About The Pull Request

Converts wraith constructs to basic mobs. The last of the "mainline"
constructs, though there's still one to go after this.

Wraiths are pretty much the same as they've always been - speedy
constructs that pack a bit of a punch, built around doing hit-and-run
tactics with their ability to ethereal jaunt. Notably, I've converted
their ability to recharge their jaunts with attacks into a new
component, `recharging_attacks`. This can be placed on any basic mob to
let them recharge a cooldown action by landing hits, which could
possibly be useful in the future.

NPC wraiths are pretty straightforward, with a twist - they will always
chase down and beat to death the lowest-hp mob they can see. Happening
upon one of these while wounded will end very badly! While I originally
wanted them to be more flighty and use hit-and-run tactics, I couldn't
figure out a way to do this that didn't look kind of silly and make them
less effective overall.

In addition to the wraiths, I've done some much-needed cleanup to basic
constructs as a whole, improving some things and covering some things I
missed along the way.
- Ectoplasm drop types from constructs is now properly based on their
theme. I _believe_ I've done this in a way that will pass unit tests
this time, but we'll see if my local tests were being honest with me.
- Player-controlled constructs now attack faster. I didn't realize that
being basic mobs capped them to attacking once every 2 seconds, which is
a gigantic nerf over the simple animal version. I cut this to just 1
second, which should be much closer to how it originally was.
- Artificers actually seek out and heal the most damaged ally they can
find, instead of the least damaged. Turns out the sort was doing the
exact opposite order from what I thought, which became much more obvious
when using the same targeting behavior on wraiths.
- I put the PR number in the juggernaut update script, which I somehow
missed on that one.
- Removed the extraneous "noncult" construct subtypes that didn't do
anything. The Artificer one, which does something, is still around.
## Why It's Good For The Game

For the same reasons as the previous three. 5 more simple animals gone,
and only one construct to go until I can nuke simple constructs from the
codebase entirely. Other than that, the new component could possibly
come in handy in future designs, and the NPC behavior should hopefully
be a little scary - even if just a little.
## Changelog
🆑
refactor: Wraith constructs have been converted to the basic mob
framework. NPC wraiths are now extra cruel and will attack the
lowest-health mob they can see at any given time. Make sure this isn't
you! Please report any bugs.
fix: Artificers and juggernauts no longer attack significantly more
slowly than intended.
/🆑

* Basic Constructs: Wraith

* Update defcon2.dmm

---------

Co-authored-by: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
This commit is contained in:
SkyratBot
2023-10-31 08:00:50 +01:00
committed by GitHub
parent 18909a2186
commit b5eb26abcc
17 changed files with 184 additions and 117 deletions

View File

@@ -128,7 +128,7 @@
/turf/open/floor/cult,
/area/ruin/space/has_grav/port_tarkon/porthall)
"aO" = (
/mob/living/simple_animal/hostile/construct/wraith/hostile{
/mob/living/basic/construct/wraith/hostile{
health = 125;
maxHealth = 125
},
@@ -1462,7 +1462,7 @@
/area/ruin/space/has_grav/port_tarkon/secoff)
"id" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/mob/living/simple_animal/hostile/construct/wraith/hostile{
/mob/living/basic/construct/wraith/hostile{
health = 125;
maxHealth = 125
},
@@ -1794,7 +1794,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/firealarm/directional/east,
/mob/living/simple_animal/hostile/construct/wraith/hostile,
/mob/living/basic/construct/wraith/hostile,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/ruin/space/has_grav/port_tarkon/starboardhall)
@@ -2901,7 +2901,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
/mob/living/simple_animal/hostile/construct/wraith/hostile{
/mob/living/basic/construct/wraith/hostile{
health = 125;
maxHealth = 125
},
@@ -6493,7 +6493,7 @@
"Kb" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/obj/effect/decal/cleanable/blood,
/mob/living/simple_animal/hostile/construct/wraith/hostile{
/mob/living/basic/construct/wraith/hostile{
health = 125;
maxHealth = 125
},
@@ -6918,7 +6918,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/mob/living/simple_animal/hostile/construct/wraith/hostile{
/mob/living/basic/construct/wraith/hostile{
health = 125;
maxHealth = 125
},
@@ -7253,7 +7253,7 @@
/turf/open/floor/engine,
/area/ruin/space/has_grav/port_tarkon/atmos)
"Od" = (
/mob/living/simple_animal/hostile/construct/wraith/hostile{
/mob/living/basic/construct/wraith/hostile{
health = 125;
maxHealth = 125
},
@@ -7972,7 +7972,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
},
/mob/living/simple_animal/hostile/construct/wraith/hostile{
/mob/living/basic/construct/wraith/hostile{
health = 125;
maxHealth = 125
},
@@ -8302,7 +8302,7 @@
/area/ruin/space/has_grav/port_tarkon/developement)
"Uh" = (
/obj/effect/decal/cleanable/blood,
/mob/living/simple_animal/hostile/construct/wraith/hostile{
/mob/living/basic/construct/wraith/hostile{
health = 125;
maxHealth = 125
},
@@ -8613,7 +8613,7 @@
/turf/open/floor/iron,
/area/ruin/space/has_grav/port_tarkon/secoff)
"Wi" = (
/mob/living/simple_animal/hostile/construct/wraith/hostile,
/mob/living/basic/construct/wraith/hostile,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/ruin/space/has_grav/port_tarkon/starboardhall)
@@ -9060,7 +9060,7 @@
/area/ruin/space/has_grav/port_tarkon/trauma)
"Zt" = (
/obj/machinery/light/dim/directional/north,
/mob/living/simple_animal/hostile/construct/wraith/hostile{
/mob/living/basic/construct/wraith/hostile{
health = 125;
maxHealth = 125
},

View File

@@ -166,7 +166,7 @@
/turf/open/floor/cult,
/area/shuttle/escape)
"H" = (
/mob/living/simple_animal/hostile/construct/wraith,
/mob/living/basic/construct/wraith,
/turf/open/floor/cult,
/area/shuttle/escape)
"I" = (

View File

@@ -7,5 +7,5 @@
living_targets += filtered_targets
if(living_targets.len)
sortTim(living_targets, GLOBAL_PROC_REF(cmp_mob_health))
return living_targets[1]
return pop(living_targets)
return ..()

View File

@@ -0,0 +1,66 @@
/// Reduces the cooldown of a given action upon landing attacks, critting, or killing mobs.
/datum/component/recharging_attacks
/// The target of the most recent attack
var/last_target
/// The stat of the most recently attacked mob
var/last_stat
/// The action to recharge when attacking
var/datum/action/cooldown/recharged_action
/// The amount of cooldown to refund on a successful attack
var/attack_refund
/// The amount of cooldown to refund when putting a target into critical
var/crit_refund
/datum/component/recharging_attacks/Initialize(
datum/action/cooldown/recharged_action,
attack_refund = 1 SECONDS,
crit_refund = 5 SECONDS,
)
. = ..()
if (!isbasicmob(parent) || !istype(recharged_action))
return COMPONENT_INCOMPATIBLE
src.recharged_action = recharged_action
src.attack_refund = attack_refund
src.crit_refund = crit_refund
/datum/component/recharging_attacks/Destroy()
UnregisterSignal(recharged_action, COMSIG_QDELETING)
recharged_action = null
return ..()
/datum/component/recharging_attacks/RegisterWithParent()
. = ..()
RegisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(set_old_stat))
RegisterSignal(parent, COMSIG_HOSTILE_POST_ATTACKINGTARGET, PROC_REF(check_stat))
RegisterSignal(recharged_action, COMSIG_QDELETING, PROC_REF(on_action_qdel))
/datum/component/recharging_attacks/UnregisterFromParent()
. = ..()
UnregisterSignal(parent, list(COMSIG_HOSTILE_PRE_ATTACKINGTARGET, COMSIG_HOSTILE_POST_ATTACKINGTARGET))
if(recharged_action)
UnregisterSignal(recharged_action, COMSIG_QDELETING)
/datum/component/recharging_attacks/proc/set_old_stat(mob/attacker, mob/attacked)
SIGNAL_HANDLER
if(!isliving(attacked))
return
last_target = attacked
last_stat = attacked.stat
/datum/component/recharging_attacks/proc/check_stat(mob/living/attacker, mob/living/attacked, success)
SIGNAL_HANDLER
if(!isliving(attacked) || attacked != last_target || attacker.faction_check_atom(attacked))
return
var/final_refund = attack_refund
if(QDELETED(attacked) || (attacked.stat == DEAD && last_stat != DEAD)) //The target is dead and we killed them - full refund
final_refund = recharged_action.cooldown_time
else if(attacked.stat > CONSCIOUS && last_stat == CONSCIOUS) //We knocked the target unconscious - partial refund
final_refund = crit_refund
recharged_action.next_use_time -= final_refund
recharged_action.build_all_button_icons()
/datum/component/recharging_attacks/proc/on_action_qdel()
SIGNAL_HANDLER
qdel(src)

View File

@@ -149,7 +149,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances)
/datum/atom_hud/alternate_appearance/basic/blessed_aware/mobShouldSee(mob/M)
if(M.mind?.holy_role)
return TRUE
if (istype(M, /mob/living/simple_animal/hostile/construct/wraith))
if (istype(M, /mob/living/basic/construct/wraith))
return TRUE
if(isrevenant(M) || IS_WIZARD(M))
return TRUE

View File

@@ -470,18 +470,18 @@
if(THEME_HOLY)
makeNewConstruct(/mob/living/basic/construct/juggernaut/angelic, target, creator, cultoverride, loc_override)
if(THEME_CULT)
makeNewConstruct(/mob/living/basic/construct/juggernaut/noncult, target, creator, cultoverride, loc_override)
makeNewConstruct(/mob/living/basic/construct/juggernaut, 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
makeNewConstruct(/mob/living/basic/construct/wraith, 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/wraith/mystic, target, creator, cultoverride, loc_override)
makeNewConstruct(/mob/living/basic/construct/wraith/mystic, target, creator, cultoverride, loc_override)
if(THEME_HOLY)
makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith/angelic, target, creator, cultoverride, loc_override)
makeNewConstruct(/mob/living/basic/construct/wraith/angelic, target, creator, cultoverride, loc_override)
if(THEME_CULT)
makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith/noncult, target, creator, cultoverride, loc_override)
makeNewConstruct(/mob/living/basic/construct/wraith, target, creator, cultoverride, loc_override)
if(CONSTRUCT_ARTIFICER)
if(IS_CULTIST(creator))
makeNewConstruct(/mob/living/basic/construct/artificer, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the makeNewConstruct proc
@@ -494,10 +494,10 @@
if(THEME_CULT)
makeNewConstruct(/mob/living/basic/construct/artificer/noncult, target, creator, cultoverride, loc_override)
/proc/makeNewConstruct(mob/living/simple_animal/hostile/construct/ctype, mob/target, mob/stoner = null, cultoverride = FALSE, loc_override = null)
/proc/makeNewConstruct(mob/living/basic/construct/ctype, mob/target, mob/stoner = null, cultoverride = FALSE, loc_override = null)
if(QDELETED(target))
return
var/mob/living/simple_animal/hostile/construct/newstruct = new ctype((loc_override) ? (loc_override) : (get_turf(target)))
var/mob/living/basic/construct/newstruct = new ctype((loc_override) ? (loc_override) : (get_turf(target)))
var/makeicon = newstruct.icon_state
var/theme = newstruct.theme
flick("make_[makeicon][theme]", newstruct)

View File

@@ -28,7 +28,7 @@
boss_types = list(/mob/living/basic/construct/artificer/hostile = 6)
hostile_types = list(
/mob/living/basic/construct/juggernaut/hostile = 8,
/mob/living/simple_animal/hostile/construct/wraith/hostile = 6,
/mob/living/basic/construct/wraith/hostile = 6,
)
/datum/round_event/portal_storm

View File

@@ -22,6 +22,7 @@
response_disarm_simple = "flail at"
response_harm_continuous = "punches"
response_harm_simple = "punch"
melee_attack_cooldown = CLICK_CD_MELEE
// Vivid red, cause cult theme
lighting_cutoff_red = 30
@@ -42,14 +43,19 @@
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
/// What flavor of gunk does this construct drop on death?
var/static/list/remains = list(/obj/item/ectoplasm/construct)
/// Can this construct smash walls? Gets the wall_smasher element if so.
var/smashes_walls = FALSE
/// The different flavors of goop constructs can drop, depending on theme.
var/static/list/remains_by_theme = list(
THEME_CULT = list(/obj/item/ectoplasm/construct),
THEME_HOLY = list(/obj/item/ectoplasm/angelic),
THEME_WIZARD = list(/obj/item/ectoplasm/mystic),
)
/mob/living/basic/construct/Initialize(mapload)
. = ..()
AddElement(/datum/element/simple_flying)
var/list/remains = string_list(remains_by_theme[theme])
if(length(remains))
AddElement(/datum/element/death_drops, remains)
if(smashes_walls)

View File

@@ -43,6 +43,7 @@
/mob/living/basic/construct/artificer/hostile
ai_controller = /datum/ai_controller/basic_controller/artificer
smashes_walls = FALSE
melee_attack_cooldown = 2 SECONDS
// Alternate artificer themes
/mob/living/basic/construct/artificer/angelic

View File

@@ -1,4 +1,9 @@
/// Artificers
/**
* Artificers
*
* Artificers will seek out and heal the most wounded construct or shade they can see.
* If there is no one to heal, they will run away from any non-allied mobs.
*/
/datum/ai_controller/basic_controller/artificer
blackboard = list(
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/same_faction/construct,
@@ -15,7 +20,12 @@
/datum/ai_planning_subtree/flee_target/from_flee_key,
)
/// Juggernauts
/**
* 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.
*/
/datum/ai_controller/basic_controller/juggernaut
blackboard = list(
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
@@ -26,6 +36,26 @@
idle_behavior = /datum/idle_behavior/idle_random_walk
planning_subtrees = list(
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/attack_obstacle_in_path,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
)
/**
* Wraiths
*
* Wraiths seek out the most injured non-allied mob to beat to death.
*/
/datum/ai_controller/basic_controller/wraith
blackboard = list(
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
BB_TARGET_MINIMUM_STAT = HARD_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_wounded_target,
/datum/ai_planning_subtree/attack_obstacle_in_path,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
)

View File

@@ -31,6 +31,7 @@
/mob/living/basic/construct/juggernaut/hostile
ai_controller = /datum/ai_controller/basic_controller/juggernaut
smashes_walls = FALSE
melee_attack_cooldown = 2 SECONDS
/mob/living/basic/construct/juggernaut/bullet_act(obj/projectile/bullet)
if(!istype(bullet, /obj/projectile/energy) && !istype(bullet, /obj/projectile/beam))
@@ -58,5 +59,3 @@
/mob/living/basic/construct/juggernaut/mystic
theme = THEME_WIZARD
/mob/living/basic/construct/juggernaut/noncult

View File

@@ -0,0 +1,50 @@
/mob/living/basic/construct/wraith
name = "Wraith"
real_name = "Wraith"
desc = "A wicked, clawed shell constructed to assassinate enemies and sow chaos behind enemy lines."
icon_state = "wraith"
icon_living = "wraith"
maxHealth = 65
health = 65
melee_damage_lower = 20
melee_damage_upper = 20
attack_verb_continuous = "slashes"
attack_verb_simple = "slash"
attack_sound = 'sound/weapons/bladeslice.ogg'
attack_vis_effect = ATTACK_EFFECT_SLASH
construct_spells = list(
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift,
/datum/action/innate/cult/create_rune/tele,
)
playstyle_string = span_bold("You are a Wraith. Though relatively fragile, you are fast, deadly, and can phase through walls. Your attacks will lower the cooldown on phasing, moreso for fatal blows.")
/mob/living/basic/construct/wraith/Initialize(mapload)
. = ..()
var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/jaunt = locate() in actions
if(isnull(jaunt))
return .
AddComponent(/datum/component/recharging_attacks, recharged_action = jaunt)
/// Hostile NPC version. Attempts to kill the lowest-health mob it can see.
/mob/living/basic/construct/wraith/hostile
ai_controller = /datum/ai_controller/basic_controller/wraith
melee_attack_cooldown = 1.5 SECONDS
// Alternate wraith themes
/mob/living/basic/construct/wraith/angelic
theme = THEME_HOLY
construct_spells = list(
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/angelic,
/datum/action/innate/cult/create_rune/tele,
)
/mob/living/basic/construct/wraith/angelic/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_ANGELIC, INNATE_TRAIT)
/mob/living/basic/construct/wraith/mystic
theme = THEME_WIZARD
construct_spells = list(
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/mystic,
/datum/action/innate/cult/create_rune/tele,
)

View File

@@ -490,7 +490,7 @@
if(1)
new /mob/living/basic/construct/juggernaut/hostile(get_turf(src))
if(2)
new /mob/living/simple_animal/hostile/construct/wraith/hostile(get_turf(src))
new /mob/living/basic/construct/wraith/hostile(get_turf(src))
if(3)
new /mob/living/basic/construct/artificer/hostile(get_turf(src))
if(4)

View File

@@ -1,82 +0,0 @@
/mob/living/simple_animal/hostile/construct/wraith
name = "Wraith"
real_name = "Wraith"
desc = "A wicked, clawed shell constructed to assassinate enemies and sow chaos behind enemy lines."
icon_state = "wraith"
icon_living = "wraith"
maxHealth = 65
health = 65
melee_damage_lower = 20
melee_damage_upper = 20
retreat_distance = 2 //AI wraiths will move in and out of combat
attack_verb_continuous = "slashes"
attack_verb_simple = "slash"
attack_sound = 'sound/weapons/bladeslice.ogg'
attack_vis_effect = ATTACK_EFFECT_SLASH
construct_spells = list(
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift,
/datum/action/innate/cult/create_rune/tele,
)
playstyle_string = "<b>You are a Wraith. Though relatively fragile, you are fast, deadly, \
can phase through walls, and your attacks will lower the cooldown on phasing.</b>"
// Accomplishing various things gives you a refund on jaunt, to jump in and out.
/// The seconds refunded per attack
var/attack_refund = 1 SECONDS
/// The seconds refunded when putting a target into critical
var/crit_refund = 5 SECONDS
/mob/living/simple_animal/hostile/construct/wraith/AttackingTarget(atom/attacked_target) //refund jaunt cooldown when attacking living targets
var/prev_stat
var/mob/living/living_target = target
if(isliving(living_target) && !IS_CULTIST(living_target))
prev_stat = living_target.stat
. = ..()
if(!. || !isnum(prev_stat))
return
var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/jaunt = locate() in actions
if(!jaunt)
return
var/total_refund = 0 SECONDS
// they're dead, and you killed them - full refund
if(QDELETED(living_target) || (living_target.stat == DEAD && prev_stat != DEAD))
total_refund += jaunt.cooldown_time
// you knocked them into critical
else if(HAS_TRAIT(living_target, TRAIT_CRITICAL_CONDITION) && prev_stat == CONSCIOUS)
total_refund += crit_refund
if(living_target.stat != DEAD && prev_stat != DEAD)
total_refund += attack_refund
jaunt.next_use_time -= total_refund
jaunt.build_all_button_icons()
/mob/living/simple_animal/hostile/construct/wraith/hostile //actually hostile, will move around, hit things
AIStatus = AI_ON
//////////////////////////Wraith-alts////////////////////////////
/mob/living/simple_animal/hostile/construct/wraith/angelic
theme = THEME_HOLY
construct_spells = list(
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/angelic,
/datum/action/innate/cult/create_rune/tele,
)
loot = list(/obj/item/ectoplasm/angelic)
/mob/living/simple_animal/hostile/construct/wraith/angelic/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_ANGELIC, INNATE_TRAIT)
/mob/living/simple_animal/hostile/construct/wraith/mystic
theme = THEME_WIZARD
construct_spells = list(
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/mystic,
/datum/action/innate/cult/create_rune/tele,
)
loot = list(/obj/item/ectoplasm/mystic)
/mob/living/simple_animal/hostile/construct/wraith/noncult

View File

@@ -61,11 +61,6 @@
/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/construct/wraith,
/mob/living/simple_animal/hostile/construct/wraith/angelic,
/mob/living/simple_animal/hostile/construct/wraith/hostile,
/mob/living/simple_animal/hostile/construct/wraith/mystic,
/mob/living/simple_animal/hostile/construct/wraith/noncult,
/mob/living/simple_animal/hostile/dark_wizard,
/mob/living/simple_animal/hostile/guardian,
/mob/living/simple_animal/hostile/guardian/assassin,

View File

@@ -1170,6 +1170,7 @@
#include "code\datums\components\radioactive_exposure.dm"
#include "code\datums\components\ranged_attacks.dm"
#include "code\datums\components\reagent_refiller.dm"
#include "code\datums\components\recharging_attacks.dm"
#include "code\datums\components\redirect_attack_hand_from_turf.dm"
#include "code\datums\components\reflection.dm"
#include "code\datums\components\regenerator.dm"
@@ -4484,6 +4485,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\wraith.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"
@@ -4877,7 +4879,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\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"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\_megafauna.dm"

View File

@@ -0,0 +1 @@
/mob/living/simple_animal/hostile/construct/wraith/@SUBTYPES : /mob/living/basic/construct/wraith/@SUBTYPES{@OLD}