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