diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index f05b74117d9..b8cebfbf271 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -32,6 +32,8 @@
#define ismouse(A) (istype(A, /mob/living/simple_animal/mouse))
+#define isconstruct(A) (istype(A, /mob/living/simple_animal/hostile/construct))
+
#define isbear(A) (istype(A, /mob/living/simple_animal/hostile/bear))
#define iscarp(A) (istype(A, /mob/living/simple_animal/hostile/carp))
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index ecd8c75aa6e..06b82c79c54 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -154,7 +154,7 @@ This file contains the arcane tome files.
text += "Juggernaut
The Juggernaut is a slow, but durable, melee attacker which can produce temporary forcewalls. It will also reflect most lethal energy weapons.
"
- text += "Artificer
The Artificer is a weak and fragile construct, able to heal other constructs, produce more soulstones and construct shells, \
+ text += "Artificer
The Artificer is a weak and fragile construct, able to heal other constructs, shades, or itself, produce more soulstones and construct shells, \
construct fortifying cult walls and flooring, and finally, it can release a few indiscriminate stunning missiles.
"
text += "Harvester
If you see one, know that you have done all you can and your life is void.
"
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index c7ed281b154..f1d0ececa64 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -24,6 +24,8 @@
pressure_resistance = 200
unique_name = 1
AIStatus = AI_OFF //normal constructs don't have AI
+ loot = list(/obj/item/weapon/ectoplasm)
+ del_on_death = 1
var/list/construct_spells = list()
var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this."
@@ -34,12 +36,8 @@
AddSpell(new spell(null))
/mob/living/simple_animal/hostile/construct/death()
- ..(1)
- new /obj/item/weapon/ectoplasm (src.loc)
- visible_message("[src] collapses in a shattered heap.")
- ghostize()
- qdel(src)
- return
+ deathmessage = "[src] collapses in a shattered heap."
+ ..()
/mob/living/simple_animal/hostile/construct/examine(mob/user)
var/msg = "*---------*\nThis is \icon[src] \a [src]!\n"
@@ -183,12 +181,12 @@
/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser,
/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser)
playstyle_string = "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, \
- use magic missile, repair allied constructs (by clicking on them), \
+ use magic missile, repair allied constructs, shades, and yourself (by clicking on them), \
and, most important of all, create new constructs by producing soulstones to capture souls, \
and shells to place those soulstones into."
/mob/living/simple_animal/hostile/construct/builder/Found(atom/A) //what have we found here?
- if(istype(A, /mob/living/simple_animal/hostile/construct)) //is it a construct?
+ if(isconstruct(A)) //is it a construct?
var/mob/living/simple_animal/hostile/construct/C = A
if(C.health < C.maxHealth) //is it hurt? let's go heal it if it is
return 1
@@ -207,7 +205,7 @@
..()
if(isliving(target))
var/mob/living/L = target
- if(istype(L, /mob/living/simple_animal/hostile/construct) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it
+ if(isconstruct(L) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it
LoseTarget()
return 0
if(L.health <= melee_damage_lower+melee_damage_upper) //ey bucko you're hurt as fuck let's go hit you
@@ -216,7 +214,7 @@
/mob/living/simple_animal/hostile/construct/builder/Aggro()
..()
- if(istype(target, /mob/living/simple_animal/hostile/construct)) //oh the target is a construct no need to flee
+ if(isconstruct(target)) //oh the target is a construct no need to flee
retreat_distance = null
minimum_distance = 1
@@ -229,11 +227,6 @@
AIStatus = AI_ON
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
-
-
-
-
-
/////////////////////////////Non-cult Artificer/////////////////////////
/mob/living/simple_animal/hostile/construct/builder/noncult
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall,
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index 955ccacb23d..f2164eec7b9 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -26,16 +26,28 @@
faction = list("cult")
status_flags = CANPUSH
flying = 1
+ loot = list(/obj/item/weapon/ectoplasm)
+ del_on_death = 1
/mob/living/simple_animal/shade/death()
- ..(1)
- new /obj/item/weapon/ectoplasm (src.loc)
- visible_message("[src] lets out a contented sigh as their form unwinds.")
- ghostize()
- qdel(src)
- return
+ deathmessage = "[src] lets out a contented sigh as their form unwinds."
+ ..()
+/mob/living/simple_animal/shade/Process_Spacemove(movement_dir = 0)
+ return TRUE //this doesn't make much sense; you'd thing TRUE would mean it'd process spacemove but it means it doesn't
+
+/mob/living/simple_animal/shade/attack_animal(mob/living/simple_animal/M)
+ if(istype(M, /mob/living/simple_animal/hostile/construct/builder))
+ if(health < maxHealth)
+ adjustHealth(-25)
+ Beam(M,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=4)
+ M.visible_message("[M] heals \the [src].", \
+ "You heal [src], leaving [src] at [health]/[maxHealth] health.")
+ else
+ M << "You cannot heal [src], as it is unharmed!"
+ else if(src != M)
+ ..()
/mob/living/simple_animal/shade/attackby(obj/item/O, mob/user, params) //Marker -Agouri
if(istype(O, /obj/item/device/soulstone))
@@ -43,4 +55,3 @@
SS.transfer_soul("SHADE", src, user)
else
..()
- return