diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm
index c55b84de088..19b6f4e527b 100644
--- a/_maps/shuttles/emergency_narnar.dmm
+++ b/_maps/shuttles/emergency_narnar.dmm
@@ -120,7 +120,7 @@
/turf/open/floor/plasteel/cult,
/area/shuttle/escape)
"w" = (
-/mob/living/simple_animal/hostile/construct/builder,
+/mob/living/simple_animal/hostile/construct/artificer,
/turf/open/floor/plasteel/cult,
/area/shuttle/escape)
"x" = (
@@ -148,7 +148,7 @@
/turf/open/floor/plasteel/cult,
/area/shuttle/escape)
"C" = (
-/mob/living/simple_animal/hostile/construct/armored,
+/mob/living/simple_animal/hostile/construct/juggernaut,
/turf/open/floor/plasteel/cult,
/area/shuttle/escape)
"D" = (
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index a49355e9a74..fdd36b9aad2 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -97,14 +97,20 @@
icon_state = "phaseout"
/obj/effect/temp_visual/dir_setting/wraith
- name = "blood"
+ name = "shadow"
icon = 'icons/mob/mob.dmi'
icon_state = "phase_shift2"
- duration = 12
+ duration = 6
+
+/obj/effect/temp_visual/dir_setting/wraith/angelic
+ icon_state = "phase_shift2_angelic"
/obj/effect/temp_visual/dir_setting/wraith/out
icon_state = "phase_shift"
+/obj/effect/temp_visual/dir_setting/wraith/out/angelic
+ icon_state = "phase_shift_angelic"
+
/obj/effect/temp_visual/dir_setting/tailsweep
icon_state = "tailsweep"
duration = 4
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index c6e14aeea02..0d3563f55bf 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -405,10 +405,10 @@
M.change_mob_type( /mob/living/simple_animal/parrot , null, null, delmob )
if("polyparrot")
M.change_mob_type( /mob/living/simple_animal/parrot/Poly , null, null, delmob )
- if("constructarmored")
- M.change_mob_type( /mob/living/simple_animal/hostile/construct/armored , null, null, delmob )
- if("constructbuilder")
- M.change_mob_type( /mob/living/simple_animal/hostile/construct/builder , null, null, delmob )
+ if("constructjuggernaut")
+ M.change_mob_type( /mob/living/simple_animal/hostile/construct/juggernaut , null, null, delmob )
+ if("constructartificer")
+ M.change_mob_type( /mob/living/simple_animal/hostile/construct/artificer , null, null, delmob )
if("constructwraith")
M.change_mob_type( /mob/living/simple_animal/hostile/construct/wraith , null, null, delmob )
if("shade")
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 277edd59347..42b927e2ad6 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -597,19 +597,27 @@
candidate.color = "black"
if(do_after(user, 90, target = candidate))
candidate.emp_act(EMP_HEAVY)
- var/construct_class = alert(user, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer")
+ var/list/constructs = list(
+ "Juggernaut" = image(icon = 'icons/mob/cult.dmi', icon_state = "juggernaut"),
+ "Wraith" = image(icon = 'icons/mob/cult.dmi', icon_state = "wraith"),
+ "Artificer" = image(icon = 'icons/mob/cult.dmi', icon_state = "artificer")
+ )
+ var/construct_class = show_radial_menu(user, src, constructs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
+ if(!check_menu(user))
+ return
if(QDELETED(candidate))
channeling = FALSE
return
user.visible_message("The dark cloud recedes from what was formerly [candidate], revealing a\n [construct_class]!")
switch(construct_class)
if("Juggernaut")
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored, candidate, user, 0, T)
+ makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut, candidate, user, 0, T)
if("Wraith")
makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, candidate, user, 0, T)
if("Artificer")
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder, candidate, user, 0, T)
- SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
+ makeNewConstruct(/mob/living/simple_animal/hostile/construct/artificer, candidate, user, 0, T)
+ else
+ return
uses--
candidate.mmi = null
qdel(candidate)
@@ -645,6 +653,14 @@
return
..()
+/obj/item/melee/blood_magic/construction/proc/check_menu(mob/user)
+ if(!istype(user))
+ return FALSE
+ if(user.incapacitated() || !user.Adjacent(src))
+ return FALSE
+ return TRUE
+
+
//Armor: Gives the target a basic cultist combat loadout
/obj/item/melee/blood_magic/armor
name = "Arming Aura"
diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm
index 3d5e9d77892..2f51431f6dd 100644
--- a/code/modules/antagonists/cult/cult_structures.dm
+++ b/code/modules/antagonists/cult/cult_structures.dm
@@ -42,7 +42,7 @@
return ..()
/obj/structure/destructible/cult/attack_animal(mob/living/simple_animal/M)
- if(istype(M, /mob/living/simple_animal/hostile/construct/builder))
+ if(istype(M, /mob/living/simple_animal/hostile/construct/artificer))
if(obj_integrity < max_integrity)
M.changeNext_move(CLICK_CD_MELEE)
obj_integrity = min(max_integrity, obj_integrity + 5)
@@ -65,6 +65,13 @@
else
return ..()
+/obj/structure/destructible/cult/proc/check_menu(mob/user)
+ if(!istype(user))
+ return FALSE
+ if(user.incapacitated() || !user.Adjacent(src))
+ return FALSE
+ return TRUE
+
/obj/structure/destructible/cult/talisman
name = "altar"
desc = "A bloodstained altar dedicated to Nar'Sie."
@@ -84,7 +91,12 @@
if(cooldowntime > world.time)
to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].")
return
- var/choice = alert(user,"You study the schematics etched into the altar...",,"Eldritch Whetstone","Construct Shell","Flask of Unholy Water")
+ var/list/items = list(
+ "Eldritch Whetstone" = image(icon = 'icons/obj/kitchen.dmi', icon_state = "cult_sharpener"),
+ "Construct Shell" = image(icon = 'icons/obj/wizard.dmi', icon_state = "construct_cult"),
+ "Flask of Unholy Water" = image(icon = 'icons/obj/drinks.dmi', icon_state = "holyflask")
+ )
+ var/choice = show_radial_menu(user, src, items, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
var/list/pickedtype = list()
switch(choice)
if("Eldritch Whetstone")
@@ -93,6 +105,8 @@
pickedtype += /obj/structure/constructshell
if("Flask of Unholy Water")
pickedtype += /obj/item/reagent_containers/glass/beaker/unholywater
+ else
+ return
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
cooldowntime = world.time + 2400
for(var/N in pickedtype)
@@ -120,11 +134,12 @@
if(cooldowntime > world.time)
to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].")
return
- var/choice
- if(user.mind.has_antag_datum(/datum/antagonist/cult/master))
- choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield")
- else
- choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield")
+ var/list/items = list(
+ "Shielded Robe" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "cult_armor"),
+ "Flagellant's Robe" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "cultrobes"),
+ "Mirror Shield" = image(icon = 'icons/obj/shields.dmi', icon_state = "mirror_shield")
+ )
+ var/choice = show_radial_menu(user, src, items, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
var/list/pickedtype = list()
switch(choice)
if("Shielded Robe")
@@ -133,6 +148,8 @@
pickedtype += /obj/item/clothing/suit/hooded/cultrobes/berserker
if("Mirror Shield")
pickedtype += /obj/item/shield/mirror
+ else
+ return
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
cooldowntime = world.time + 2400
for(var/N in pickedtype)
@@ -237,7 +254,12 @@
if(cooldowntime > world.time)
to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].")
return
- var/choice = alert(user,"You flip through the black pages of the archives...",,"Zealot's Blindfold","Shuttle Curse","Veil Walker Set")
+ var/list/items = list(
+ "Zealot's Blindfold" = image(icon = 'icons/obj/clothing/glasses.dmi', icon_state = "blindfold"),
+ "Shuttle Curse" = image(icon = 'icons/obj/cult.dmi', icon_state = "shuttlecurse"),
+ "Veil Walker Set" = image(icon = 'icons/obj/cult.dmi', icon_state = "shifter")
+ )
+ var/choice = show_radial_menu(user, src, items, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
var/list/pickedtype = list()
switch(choice)
if("Zealot's Blindfold")
@@ -247,6 +269,8 @@
if("Veil Walker Set")
pickedtype += /obj/item/cult_shift
pickedtype += /obj/item/flashlight/flare/culttorch
+ else
+ return
if(src && !QDELETED(src) && anchored && pickedtype.len && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
cooldowntime = world.time + 2400
for(var/N in pickedtype)
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index 2e0f3412e70..be454b6ac1a 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -82,7 +82,7 @@ Runes can either be invoked by one's self or with many different cultists. Each
/obj/effect/rune/attack_animal(mob/living/simple_animal/M)
if(istype(M, /mob/living/simple_animal/shade) || istype(M, /mob/living/simple_animal/hostile/construct))
- if(istype(M, /mob/living/simple_animal/hostile/construct/wraith/angelic) || istype(M, /mob/living/simple_animal/hostile/construct/armored/angelic) || istype(M, /mob/living/simple_animal/hostile/construct/builder/angelic))
+ if(istype(M, /mob/living/simple_animal/hostile/construct/wraith/angelic) || istype(M, /mob/living/simple_animal/hostile/construct/juggernaut/angelic) || istype(M, /mob/living/simple_animal/hostile/construct/artificer/angelic))
to_chat(M, "You purge the rune!")
qdel(src)
else if(construct_invoke || !iscultist(M)) //if you're not a cult construct we want the normal fail message
@@ -974,7 +974,7 @@ structure_check() searches for nearby cultist structures required for the invoca
if(!iscultist(M))
AH.remove_hud_from(M)
addtimer(CALLBACK(GLOBAL_PROC, .proc/hudFix, M), duration)
- var/image/A = image('icons/mob/mob.dmi',M,"cultist", ABOVE_MOB_LAYER)
+ var/image/A = image('icons/mob/cult.dmi',M,"cultist", ABOVE_MOB_LAYER)
A.override = 1
add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/noncult, "human_apoc", A, NONE)
addtimer(CALLBACK(M,/atom/.proc/remove_alt_appearance,"human_apoc",TRUE), duration)
diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm
index d8ae9f49285..59e41a22824 100644
--- a/code/modules/antagonists/wizard/equipment/soulstone.dm
+++ b/code/modules/antagonists/wizard/equipment/soulstone.dm
@@ -112,7 +112,7 @@
A.cancel_camera()
if(purified)
icon_state = "purified_soulstone"
- A.icon_state = "ghost1"
+ A.icon_state = "shade_angelic"
A.name = "Purified [initial(A.name)]"
else
icon_state = "soulstone"
@@ -127,7 +127,7 @@
/obj/structure/constructshell
name = "empty shell"
icon = 'icons/obj/wizard.dmi'
- icon_state = "construct-cult"
+ icon_state = "construct_cult"
desc = "A wicked machine used by those skilled in magical arts. It is inactive."
/obj/structure/constructshell/examine(mob/user)
@@ -219,18 +219,23 @@
var/obj/structure/constructshell/T = target
var/mob/living/simple_animal/shade/A = locate() in src
if(A)
- var/construct_class = alert(user, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer")
+ var/list/constructs = list(
+ "Juggernaut" = image(icon = 'icons/mob/cult.dmi', icon_state = "juggernaut"),
+ "Wraith" = image(icon = 'icons/mob/cult.dmi', icon_state = "wraith"),
+ "Artificer" = image(icon = 'icons/mob/cult.dmi', icon_state = "artificer")
+ )
+ var/construct_class = show_radial_menu(user, src, constructs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
if(!T || !T.loc)
return
switch(construct_class)
if("Juggernaut")
if(iscultist(user) || iswizard(user))
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored, A, user, 0, T.loc)
+ makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut, A, user, 0, T.loc)
else
if(purified)
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored/angelic, A, user, 0, T.loc)
+ makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut/angelic, A, user, 0, T.loc)
else
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored/noncult, A, user, 0, T.loc)
+ makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut/noncult, A, user, 0, T.loc)
if("Wraith")
if(iscultist(user) || iswizard(user))
makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, A, user, 0, T.loc)
@@ -241,12 +246,14 @@
makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith/noncult, A, user, 0, T.loc)
if("Artificer")
if(iscultist(user) || iswizard(user))
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder, A, user, 0, T.loc)
+ makeNewConstruct(/mob/living/simple_animal/hostile/construct/artificer, A, user, 0, T.loc)
else
if(purified)
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder/angelic, A, user, 0, T.loc)
+ makeNewConstruct(/mob/living/simple_animal/hostile/construct/artificer/angelic, A, user, 0, T.loc)
else
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder/noncult, A, user, 0, T.loc)
+ makeNewConstruct(/mob/living/simple_animal/hostile/construct/artificer/noncult, A, user, 0, T.loc)
+ else
+ return
for(var/datum/mind/B in SSticker.mode.cult)
if(B == A.mind)
SSticker.mode.remove_cultist(A.mind)
@@ -255,11 +262,21 @@
else
to_chat(user, "Creation failed!: The soul stone is empty! Go kill someone!")
+/obj/item/soulstone/proc/check_menu(mob/user)
+ if(!istype(user))
+ return FALSE
+ if(user.incapacitated() || !user.Adjacent(src))
+ return FALSE
+ return TRUE
/proc/makeNewConstruct(mob/living/simple_animal/hostile/construct/ctype, mob/target, mob/stoner = null, cultoverride = 0, 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/makeicon = newstruct.icon_state
+ var/holyness = newstruct.holy
+ flick("make_[makeicon][holyness]", newstruct)
+ playsound(newstruct, 'sound/effects/constructform.ogg', 50)
if(stoner)
newstruct.faction |= "[REF(stoner)]"
newstruct.master = stoner
diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm
index 67470e0e0b6..716fbd13e26 100644
--- a/code/modules/events/portal_storm.dm
+++ b/code/modules/events/portal_storm.dm
@@ -17,8 +17,8 @@
max_occurrences = 0
/datum/round_event/portal_storm/portal_storm_narsie
- boss_types = list(/mob/living/simple_animal/hostile/construct/builder = 6)
- hostile_types = list(/mob/living/simple_animal/hostile/construct/armored/hostile = 8,\
+ boss_types = list(/mob/living/simple_animal/hostile/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)
/datum/round_event/portal_storm
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 507ff78cbd3..efa00c25414 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -397,13 +397,15 @@
if(client)
makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, src, cultoverride = TRUE)
else
- switch(rand(1, 6))
+ switch(rand(1, 4))
if(1)
- new /mob/living/simple_animal/hostile/construct/armored/hostile(get_turf(src))
+ new /mob/living/simple_animal/hostile/construct/juggernaut/hostile(get_turf(src))
if(2)
new /mob/living/simple_animal/hostile/construct/wraith/hostile(get_turf(src))
- if(3 to 6)
- new /mob/living/simple_animal/hostile/construct/builder/hostile(get_turf(src))
+ if(3)
+ new /mob/living/simple_animal/hostile/construct/artificer/hostile(get_turf(src))
+ if(4)
+ new /mob/living/simple_animal/hostile/construct/proteon/hostile(get_turf(src))
spawn_dust()
gib()
return TRUE
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index aa50754e606..7a631ad49d1 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -12,7 +12,7 @@
response_harm_continuous = "punches"
response_harm_simple = "punch"
speak_chance = 1
- icon = 'icons/mob/mob.dmi'
+ icon = 'icons/mob/cult.dmi'
speed = 0
a_intent = INTENT_HARM
stop_automated_movement = 1
@@ -65,6 +65,7 @@
var/pos = 2+spellnum*31
CR.button.screen_loc = "6:[pos],4:-2"
CR.button.moved = "6:[pos],4:-2"
+ add_overlay("glow_[icon_state][holy]")
/mob/living/simple_animal/hostile/construct/Login()
. = ..()
@@ -119,12 +120,12 @@
update_health_hud()
/////////////////Juggernaut///////////////
-/mob/living/simple_animal/hostile/construct/armored
+/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 = "behemoth"
- icon_living = "behemoth"
+ icon_state = "juggernaut"
+ icon_living = "juggernaut"
maxHealth = 150
health = 150
response_harm_continuous = "harmlessly punches"
@@ -147,11 +148,11 @@
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/armored/hostile //actually hostile, will move around, hit things
+/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/armored/bullet_act(obj/projectile/P)
+/mob/living/simple_animal/hostile/construct/juggernaut/bullet_act(obj/projectile/P)
if(istype(P, /obj/projectile/energy) || istype(P, /obj/projectile/beam))
var/reflectchance = 40 - round(P.damage/3)
if(prob(reflectchance))
@@ -181,21 +182,19 @@
return ..()
//////////////////////////Angelic-Juggernaut////////////////////////////
-/mob/living/simple_animal/hostile/construct/armored/angelic
- icon_state = "behemoth_angelic"
- icon_living = "behemoth_angelic"
+/mob/living/simple_animal/hostile/construct/juggernaut/angelic
holy = TRUE
loot = list(/obj/item/ectoplasm/angelic)
-/mob/living/simple_animal/hostile/construct/armored/noncult
+/mob/living/simple_animal/hostile/construct/juggernaut/noncult
////////////////////////Wraith/////////////////////////////////////////////
/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 = "floating"
- icon_living = "floating"
+ icon_state = "wraith"
+ icon_living = "wraith"
maxHealth = 65
health = 65
melee_damage_lower = 20
@@ -237,15 +236,14 @@
//////////////////////////Angelic-Wraith////////////////////////////
/mob/living/simple_animal/hostile/construct/wraith/angelic
- icon_state = "floating_angelic"
- icon_living = "floating_angelic"
holy = TRUE
+ construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/angelic)
loot = list(/obj/item/ectoplasm/angelic)
/mob/living/simple_animal/hostile/construct/wraith/noncult
/////////////////////////////Artificer/////////////////////////
-/mob/living/simple_animal/hostile/construct/builder
+/mob/living/simple_animal/hostile/construct/artificer
name = "Artificer"
real_name = "Artificer"
desc = "A bulbous construct dedicated to building and maintaining the Cult of Nar'Sie's armies."
@@ -279,7 +277,7 @@
can_repair_constructs = TRUE
can_repair_self = TRUE
-/mob/living/simple_animal/hostile/construct/builder/Found(atom/A) //what have we found here?
+/mob/living/simple_animal/hostile/construct/artificer/Found(atom/A) //what have we found here?
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
@@ -289,13 +287,13 @@
else
return 0
-/mob/living/simple_animal/hostile/construct/builder/CanAttack(atom/the_target)
+/mob/living/simple_animal/hostile/construct/artificer/CanAttack(atom/the_target)
if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it
return 0
if(Found(the_target) || ..()) //If we Found it or Can_Attack it normally, we Can_Attack it as long as it wasn't invisible
return 1 //as a note this shouldn't be added to base hostile mobs because it'll mess up retaliate hostile mobs
-/mob/living/simple_animal/hostile/construct/builder/MoveToTarget(var/list/possible_targets)
+/mob/living/simple_animal/hostile/construct/artificer/MoveToTarget(var/list/possible_targets)
..()
if(isliving(target))
var/mob/living/L = target
@@ -306,33 +304,31 @@
retreat_distance = null
minimum_distance = 1
-/mob/living/simple_animal/hostile/construct/builder/Aggro()
+/mob/living/simple_animal/hostile/construct/artificer/Aggro()
..()
if(isconstruct(target)) //oh the target is a construct no need to flee
retreat_distance = null
minimum_distance = 1
-/mob/living/simple_animal/hostile/construct/builder/LoseAggro()
+/mob/living/simple_animal/hostile/construct/artificer/LoseAggro()
..()
retreat_distance = initial(retreat_distance)
minimum_distance = initial(minimum_distance)
-/mob/living/simple_animal/hostile/construct/builder/hostile //actually hostile, will move around, hit things, heal other constructs
+/mob/living/simple_animal/hostile/construct/artificer/hostile //actually hostile, will move around, hit things, heal other constructs
AIStatus = AI_ON
environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP
/////////////////////////////Angelic Artificer/////////////////////////
-/mob/living/simple_animal/hostile/construct/builder/angelic
+/mob/living/simple_animal/hostile/construct/artificer/angelic
desc = "A bulbous construct dedicated to building and maintaining holy armies."
- icon_state = "artificer_angelic"
- icon_living = "artificer_angelic"
holy = TRUE
loot = list(/obj/item/ectoplasm/angelic)
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/noncult/purified,
/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser,
/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser)
-/mob/living/simple_animal/hostile/construct/builder/noncult
+/mob/living/simple_animal/hostile/construct/artificer/noncult
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall,
/obj/effect/proc_holder/spell/aoe_turf/conjure/floor,
/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/noncult,
@@ -344,8 +340,8 @@
name = "Harvester"
real_name = "Harvester"
desc = "A long, thin construct built to herald Nar'Sie's rise. It'll be all over soon."
- icon_state = "chosen"
- icon_living = "chosen"
+ icon_state = "harvester"
+ icon_living = "harvester"
maxHealth = 40
health = 40
sight = SEE_MOBS
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index 95c9b60c146..13f4c86f53a 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -3,7 +3,7 @@
real_name = "Shade"
desc = "A bound spirit."
gender = PLURAL
- icon = 'icons/mob/mob.dmi'
+ icon = 'icons/mob/cult.dmi'
icon_state = "shade"
icon_living = "shade"
mob_biotypes = MOB_SPIRIT
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 7ad94005381..e9a69936684 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -1,7 +1,8 @@
/obj/singularity/narsie //Moving narsie to a child object of the singularity so it can be made to function differently. --NEO
name = "Nar'Sie's Avatar"
desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees."
- icon = 'icons/obj/magic_terror.dmi'
+ icon = 'icons/obj/narsie_small.dmi'
+ icon_state = "narsie"
pixel_x = -89
pixel_y = -85
density = FALSE
@@ -35,7 +36,7 @@
if(A)
var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/cult_effects.dmi', "ghostalertsie")
notify_ghosts("Nar'Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.", source = src, alert_overlay = alert_overlay, action=NOTIFY_ATTACK)
- INVOKE_ASYNC(src, .proc/narsie_spawn_animation)
+ narsie_spawn_animation()
UnregisterSignal(src, COMSIG_ATOM_BSA_BEAM) //set up in /singularity/Initialize()
/obj/singularity/narsie/large/cult // For the new cult ending, guaranteed to end the round within 3 minutes
@@ -226,13 +227,10 @@
/obj/singularity/narsie/proc/narsie_spawn_animation()
- icon = 'icons/obj/narsie_spawn_anim.dmi'
setDir(SOUTH)
- move_self = 0
+ move_self = FALSE
flick("narsie_spawn_anim",src)
- sleep(11)
- move_self = 1
- icon = initial(icon)
-
-
+ addtimer(CALLBACK(src, .proc/narsie_spawn_animation_end), 3.5 SECONDS)
+/obj/singularity/narsie/proc/narsie_spawn_animation_end()
+ move_self = TRUE
diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm
index 8e97d3c990c..f0e68077ea1 100644
--- a/code/modules/spells/spell_types/construct_spells.dm
+++ b/code/modules/spells/spell_types/construct_spells.dm
@@ -130,13 +130,17 @@
action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "phaseshift"
action_background_icon_state = "bg_demon"
- jaunt_in_time = 12
+ jaunt_in_time = 6
jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith
jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_steam(mobloc)
return
+/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/angelic
+ jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith/angelic
+ jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out/angelic
+
/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser
name = "Lesser Magic Missile"
desc = "This spell fires several, slow moving, magic projectiles at nearby targets."
diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm
index 63addacbc21..90055ec9482 100644
--- a/code/modules/spells/spell_types/shapeshift.dm
+++ b/code/modules/spells/spell_types/shapeshift.dm
@@ -22,7 +22,7 @@
/mob/living/simple_animal/hostile/carp/ranged/chaos,\
/mob/living/simple_animal/bot/secbot/ed209,\
/mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper,\
- /mob/living/simple_animal/hostile/construct/armored)
+ /mob/living/simple_animal/hostile/construct/juggernaut)
/obj/effect/proc_holder/spell/targeted/shapeshift/cast(list/targets,mob/user = usr)
if(src in user.mob_spell_list)
diff --git a/icons/mob/actions/actions_cult.dmi b/icons/mob/actions/actions_cult.dmi
index c2e04677810..008696c9f8f 100644
Binary files a/icons/mob/actions/actions_cult.dmi and b/icons/mob/actions/actions_cult.dmi differ
diff --git a/icons/mob/cult.dmi b/icons/mob/cult.dmi
new file mode 100644
index 00000000000..112057874a0
Binary files /dev/null and b/icons/mob/cult.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 58da44f72b0..64d0cc4ef8c 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/obj/narsie.dmi b/icons/obj/narsie.dmi
index 940b0941762..2d65d89d3fb 100644
Binary files a/icons/obj/narsie.dmi and b/icons/obj/narsie.dmi differ
diff --git a/icons/obj/magic_terror.dmi b/icons/obj/narsie_small.dmi
similarity index 98%
rename from icons/obj/magic_terror.dmi
rename to icons/obj/narsie_small.dmi
index 025e164ccd3..bbc3afefdca 100644
Binary files a/icons/obj/magic_terror.dmi and b/icons/obj/narsie_small.dmi differ
diff --git a/icons/obj/narsie_spawn_anim.dmi b/icons/obj/narsie_spawn_anim.dmi
deleted file mode 100644
index 4f3de372e7c..00000000000
Binary files a/icons/obj/narsie_spawn_anim.dmi and /dev/null differ
diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi
index 06af15db05b..2509eed61a5 100644
Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ
diff --git a/sound/effects/constructform.ogg b/sound/effects/constructform.ogg
new file mode 100644
index 00000000000..ee34a3a4f3e
Binary files /dev/null and b/sound/effects/constructform.ogg differ