diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index bfbec7dccf1..2d8a96213c4 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -151,6 +151,8 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list( #define isgorilla(A) (istype(A, /mob/living/basic/gorilla)) +#define isshade(A) (istype(A, /mob/living/basic/shade)) + #define is_simian(A) (isgorilla(A) || ismonkey(A)) /// returns whether or not the atom is either a basic mob OR simple animal @@ -168,8 +170,6 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list( #define isbot(A) (istype(A, /mob/living/simple_animal/bot)) -#define isshade(A) (istype(A, /mob/living/simple_animal/shade)) - #define ismouse(A) (istype(A, /mob/living/basic/mouse)) #define isslime(A) (istype(A, /mob/living/simple_animal/slime)) diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index f44f1f46b29..9cfa92231a6 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -96,13 +96,13 @@ GLOBAL_LIST_INIT(phobia_mobs, list( /mob/living/basic/faithless, /mob/living/basic/ghost, /mob/living/basic/heretic_summon, + /mob/living/basic/shade, /mob/living/basic/skeleton, /mob/living/basic/revenant, /mob/living/simple_animal/bot/mulebot/paranormal, /mob/living/simple_animal/hostile/dark_wizard, /mob/living/simple_animal/hostile/wizard, /mob/living/simple_animal/hostile/zombie, - /mob/living/simple_animal/shade, )), )) diff --git a/code/datums/components/spirit_holding.dm b/code/datums/components/spirit_holding.dm index 323f8802053..37186825d62 100644 --- a/code/datums/components/spirit_holding.dm +++ b/code/datums/components/spirit_holding.dm @@ -7,7 +7,7 @@ ///bool on if this component is currently polling for observers to inhabit the item var/attempting_awakening = FALSE ///mob contained in the item. - var/mob/living/simple_animal/shade/bound_spirit + var/mob/living/basic/shade/bound_spirit /datum/component/spirit_holding/Initialize() if(!ismovable(parent)) //you may apply this to mobs, i take no responsibility for how that works out diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 9db66fbd286..edd2755de75 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -35,20 +35,14 @@ /obj/item/soulstone/update_appearance(updates) . = ..() - for(var/mob/living/simple_animal/shade/sharded_shade in src) + for(var/mob/living/basic/shade/sharded_shade in src) switch(theme) if(THEME_HOLY) sharded_shade.name = "Purified [sharded_shade.real_name]" - sharded_shade.icon_state = "shade_holy" - sharded_shade.loot = list(/obj/item/ectoplasm/angelic) - if(THEME_CULT) + else sharded_shade.name = sharded_shade.real_name - sharded_shade.icon_state = "shade_cult" - sharded_shade.loot = list(/obj/item/ectoplasm) - if(THEME_WIZARD) - sharded_shade.name = sharded_shade.real_name - sharded_shade.icon_state = "shade_wizard" - sharded_shade.loot = list(/obj/item/ectoplasm/mystic) + sharded_shade.theme = theme + sharded_shade.update_appearance(UPDATE_ICON_STATE) /obj/item/soulstone/update_icon_state() . = ..() @@ -70,7 +64,7 @@ // "dull soulstone" name = "dull [name]" - var/mob/living/simple_animal/shade/shade = locate() in src + var/mob/living/basic/shade/shade = locate() in src if(shade) // "(dull) soulstone: Urist McCaptain" name = "[name]: [shade.real_name]" @@ -159,7 +153,7 @@ . += span_cult("This shard is spent; it is now just a creepy rock.") /obj/item/soulstone/Destroy() //Stops the shade from being qdel'd immediately and their ghost being sent back to the arrival shuttle. - for(var/mob/living/simple_animal/shade/shade in src) + for(var/mob/living/basic/shade/shade in src) INVOKE_ASYNC(shade, TYPE_PROC_REF(/mob/living, death)) return ..() @@ -212,7 +206,7 @@ release_shades(user) /obj/item/soulstone/proc/release_shades(mob/user, silent = FALSE) - for(var/mob/living/simple_animal/shade/captured_shade in src) + for(var/mob/living/basic/shade/captured_shade in src) captured_shade.forceMove(get_turf(user)) captured_shade.cancel_camera() update_appearance() @@ -229,7 +223,7 @@ on_release_spirits() /obj/item/soulstone/pre_attack(atom/A, mob/living/user, params) - var/mob/living/simple_animal/shade/occupant = (locate() in src) + var/mob/living/basic/shade/occupant = (locate() in src) var/obj/item/storage/toolbox/mechanical/target_toolbox = A if(!occupant || !istype(target_toolbox) || target_toolbox.has_soul) return ..() @@ -330,7 +324,7 @@ return TRUE //it'll probably get someone ;) ///captures a shade that was previously released from a soulstone. -/obj/item/soulstone/proc/capture_shade(mob/living/simple_animal/shade/shade, mob/living/user) +/obj/item/soulstone/proc/capture_shade(mob/living/basic/shade/shade, mob/living/user) if(isliving(user) && !role_check(user)) user.Unconscious(10 SECONDS) to_chat(user, span_userdanger("Your body is wracked with debilitating pain!")) @@ -353,7 +347,7 @@ ///transfer the mind of the shade to a construct mob selected by the user, then deletes both the shade and src. /obj/item/soulstone/proc/transfer_to_construct(obj/structure/constructshell/shell, mob/user) - var/mob/living/simple_animal/shade/shade = locate() in src + var/mob/living/basic/shade/shade = locate() in src if(!shade) to_chat(user, "[span_userdanger("Creation failed!")]: [src] is empty! Go kill someone!") return FALSE @@ -385,7 +379,7 @@ if(!shade_controller) shade_controller = victim victim.stop_sound_channel(CHANNEL_HEARTBEAT) - var/mob/living/simple_animal/shade/soulstone_spirit = new /mob/living/simple_animal/shade(src) + var/mob/living/basic/shade/soulstone_spirit = new /mob/living/basic/shade(src) soulstone_spirit.AddComponent(/datum/component/soulstoned, src) soulstone_spirit.name = "Shade of [victim.real_name]" soulstone_spirit.real_name = "Shade of [victim.real_name]" diff --git a/code/modules/library/bibles.dm b/code/modules/library/bibles.dm index 48621abfd1a..ecbcc397dba 100644 --- a/code/modules/library/bibles.dm +++ b/code/modules/library/bibles.dm @@ -323,13 +323,14 @@ GLOBAL_LIST_INIT(bibleitemstates, list( playsound(src,'sound/effects/pray_chaplain.ogg',60,TRUE) for(var/obj/item/soulstone/stone in sword.contents) stone.required_role = null - for(var/mob/living/simple_animal/shade/shade in stone) + for(var/mob/living/basic/shade/shade in stone) var/datum/antagonist/cult/cultist = shade.mind.has_antag_datum(/datum/antagonist/cult) if(cultist) cultist.silent = TRUE cultist.on_removal() - shade.icon_state = "shade_holy" - shade.name = "Purified [shade.name]" + shade.theme = THEME_HOLY + shade.name = "Purified [shade.real_name]" + shade.update_appearance(UPDATE_ICON_STATE) stone.release_shades(user) qdel(stone) new /obj/item/nullrod/claymore(get_turf(sword)) diff --git a/code/modules/mob/living/basic/constructs/_construct.dm b/code/modules/mob/living/basic/cult/constructs/_construct.dm similarity index 99% rename from code/modules/mob/living/basic/constructs/_construct.dm rename to code/modules/mob/living/basic/cult/constructs/_construct.dm index a39949b5208..534cb3a7eac 100644 --- a/code/modules/mob/living/basic/constructs/_construct.dm +++ b/code/modules/mob/living/basic/cult/constructs/_construct.dm @@ -66,7 +66,7 @@ heal_brute = 5,\ heal_burn = 0,\ heal_time = 0,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/construct, /mob/living/simple_animal/shade)),\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/construct, /mob/living/basic/shade)),\ valid_biotypes = MOB_MINERAL | MOB_SPIRIT,\ self_targetting = can_repair_self ? HEALING_TOUCH_ANYONE : HEALING_TOUCH_NOT_SELF,\ action_text = "%SOURCE% begins repairing %TARGET%'s dents.",\ diff --git a/code/modules/mob/living/basic/constructs/artificer.dm b/code/modules/mob/living/basic/cult/constructs/artificer.dm similarity index 100% rename from code/modules/mob/living/basic/constructs/artificer.dm rename to code/modules/mob/living/basic/cult/constructs/artificer.dm diff --git a/code/modules/mob/living/basic/constructs/construct_ai.dm b/code/modules/mob/living/basic/cult/constructs/construct_ai.dm similarity index 97% rename from code/modules/mob/living/basic/constructs/construct_ai.dm rename to code/modules/mob/living/basic/cult/constructs/construct_ai.dm index 69f668001f8..6f79b327915 100644 --- a/code/modules/mob/living/basic/constructs/construct_ai.dm +++ b/code/modules/mob/living/basic/cult/constructs/construct_ai.dm @@ -85,6 +85,6 @@ target_wounded_key = BB_TARGET_WOUNDED_ONLY /datum/targetting_datum/basic/same_faction/construct/can_attack(mob/living/living_mob, atom/the_target, vision_range, check_faction = TRUE) - if(isconstruct(the_target) || istype(the_target, /mob/living/simple_animal/shade)) + if(isconstruct(the_target) || istype(the_target, /mob/living/basic/shade)) return ..() return FALSE diff --git a/code/modules/mob/living/basic/constructs/harvester.dm b/code/modules/mob/living/basic/cult/constructs/harvester.dm similarity index 100% rename from code/modules/mob/living/basic/constructs/harvester.dm rename to code/modules/mob/living/basic/cult/constructs/harvester.dm diff --git a/code/modules/mob/living/basic/constructs/juggernaut.dm b/code/modules/mob/living/basic/cult/constructs/juggernaut.dm similarity index 100% rename from code/modules/mob/living/basic/constructs/juggernaut.dm rename to code/modules/mob/living/basic/cult/constructs/juggernaut.dm diff --git a/code/modules/mob/living/basic/constructs/proteon.dm b/code/modules/mob/living/basic/cult/constructs/proteon.dm similarity index 100% rename from code/modules/mob/living/basic/constructs/proteon.dm rename to code/modules/mob/living/basic/cult/constructs/proteon.dm diff --git a/code/modules/mob/living/basic/constructs/wraith.dm b/code/modules/mob/living/basic/cult/constructs/wraith.dm similarity index 100% rename from code/modules/mob/living/basic/constructs/wraith.dm rename to code/modules/mob/living/basic/cult/constructs/wraith.dm diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/basic/cult/shade.dm similarity index 55% rename from code/modules/mob/living/simple_animal/shade.dm rename to code/modules/mob/living/basic/cult/shade.dm index 6c6ce7c0e6a..fac1d347665 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/basic/cult/shade.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/shade +/mob/living/basic/shade name = "Shade" real_name = "Shade" desc = "A bound spirit." @@ -10,45 +10,60 @@ maxHealth = 40 health = 40 speak_emote = list("hisses") - emote_hear = list("wails.","screeches.") response_help_continuous = "puts their hand through" response_help_simple = "put your hand through" response_disarm_continuous = "flails at" response_disarm_simple = "flail at" response_harm_continuous = "punches" response_harm_simple = "punch" - speak_chance = 1 melee_damage_lower = 5 melee_damage_upper = 12 attack_verb_continuous = "metaphysically strikes" attack_verb_simple = "metaphysically strike" - minbodytemp = 0 - maxbodytemp = INFINITY - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - speed = -1 //they don't have to lug a body made of runed metal around - stop_automated_movement = 1 + unsuitable_cold_damage = 0 + unsuitable_heat_damage = 0 + unsuitable_atmos_damage = 0 + speed = -1 faction = list(FACTION_CULT) - status_flags = CANPUSH - loot = list(/obj/item/ectoplasm) - del_on_death = TRUE + basic_mob_flags = DEL_ON_DEATH initial_language_holder = /datum/language_holder/construct + /// Theme controls color. THEME_CULT is red THEME_WIZARD is purple and THEME_HOLY is blue + var/theme = THEME_CULT + /// The different flavors of goop shades 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/simple_animal/shade/Initialize(mapload) +/mob/living/basic/shade/Initialize(mapload) . = ..() AddElement(/datum/element/simple_flying) add_traits(list(TRAIT_HEALS_FROM_CULT_PYLONS, TRAIT_SPACEWALK, TRAIT_VENTCRAWLER_ALWAYS), INNATE_TRAIT) + if(isnull(theme)) + return + icon_state = "shade_[theme]" + var/list/remains = string_list(remains_by_theme[theme]) + if(length(remains)) + AddElement(/datum/element/death_drops, remains) -/mob/living/simple_animal/shade/death() +/mob/living/basic/shade/update_icon_state() + . = ..() + if(!isnull(theme)) + icon_state = "shade_[theme]" + icon_living = icon_state + +/mob/living/basic/shade/death() if(death_message == initial(death_message)) death_message = "lets out a contented sigh as [p_their()] form unwinds." ..() -/mob/living/simple_animal/shade/can_suicide() +/mob/living/basic/shade/can_suicide() if(istype(loc, /obj/item/soulstone)) //do not suicide inside the soulstone return FALSE return ..() -/mob/living/simple_animal/shade/attackby(obj/item/item, mob/user, params) //Marker -Agouri +/mob/living/basic/shade/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/soulstone)) var/obj/item/soulstone/stone = item stone.capture_shade(src, user) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index fc366eab71c..790f9312ea1 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -390,7 +390,7 @@ return TRUE if(ispath(MP, /mob/living/basic/mushroom)) return TRUE - if(ispath(MP, /mob/living/simple_animal/shade)) + if(ispath(MP, /mob/living/basic/shade)) return TRUE if(ispath(MP, /mob/living/basic/killer_tomato)) return TRUE diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index 60a1d657c1e..c25aa2cd2e5 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -128,7 +128,6 @@ /mob/living/simple_animal/pet/gondola, /mob/living/simple_animal/pet/gondola/gondolapod, /mob/living/simple_animal/pet/gondola/virtual_domain, - /mob/living/simple_animal/shade, /mob/living/simple_animal/slime, /mob/living/simple_animal/slime/pet, /mob/living/simple_animal/slime/random, diff --git a/tgstation.dme b/tgstation.dme index 47ca13b3d6e..9446949bf2f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4391,13 +4391,14 @@ #include "code\modules\mob\living\basic\blob_minions\blobbernaut.dm" #include "code\modules\mob\living\basic\clown\clown.dm" #include "code\modules\mob\living\basic\clown\clown_ai.dm" -#include "code\modules\mob\living\basic\constructs\_construct.dm" -#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\constructs\proteon.dm" -#include "code\modules\mob\living\basic\constructs\wraith.dm" +#include "code\modules\mob\living\basic\cult\shade.dm" +#include "code\modules\mob\living\basic\cult\constructs\_construct.dm" +#include "code\modules\mob\living\basic\cult\constructs\artificer.dm" +#include "code\modules\mob\living\basic\cult\constructs\construct_ai.dm" +#include "code\modules\mob\living\basic\cult\constructs\harvester.dm" +#include "code\modules\mob\living\basic\cult\constructs\juggernaut.dm" +#include "code\modules\mob\living\basic\cult\constructs\proteon.dm" +#include "code\modules\mob\living\basic\cult\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" @@ -4749,7 +4750,6 @@ #include "code\modules\mob\living\simple_animal\animal_defense.dm" #include "code\modules\mob\living\simple_animal\damage_procs.dm" #include "code\modules\mob\living\simple_animal\parrot.dm" -#include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\bot\bot.dm" #include "code\modules\mob\living\simple_animal\bot\bot_announcement.dm"