diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm new file mode 100644 index 00000000000..0045fefb4fb --- /dev/null +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -0,0 +1,80 @@ +/obj/item/device/soulstone + name = "Soul Stone Shard" + icon = 'wizard.dmi' + icon_state = "soulstone" + item_state = "electronic" + desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefacts power." + w_class = 1.0 + flags = FPRINT | TABLEPASS | ONBELT + var/flush = null + origin_tech = "bluespace=4;materials=4" + + + + attack(mob/living/carbon/human/M as mob, mob/user as mob) + if(!istype(M, /mob/living/carbon/human))//If target is not a human. + return ..() + M.attack_log += text("\[[time_stamp()]\] Has had their soul captured with [src.name] by [user.name] ([user.ckey])") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])") + + transfer_soul("VICTIM", M, user) + return + + + attack_self(mob/user) + if (!in_range(src, user)) + return + user.machine = src + var/dat = "Soul Stone
" + for(var/mob/living/carbon/human/A in src) + dat += "Captured Soul: [A.name]
" + user << browse(dat, "window=aicard") + onclose(user, "aicard") + return + + + + +/obj/item/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob). + switch(choice) + if("VICTIM") + var/mob/living/carbon/human/T = target + var/obj/item/device/soulstone/C = src + if (T.stat == 0) + U << "\red Capture failed!: \black Kill or maim the victim first!" + else + if(T.ckey == null) + U << "\red Capture failed!: \black The soul has already fled it's mortal frame." + else + if(C.contents.len) + U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room." + else + for(var/obj/item/W in T) + T.drop_from_slot(W) + new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton + T.invisibility = 101 + var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc ) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = T + flick("dust-h", animation) + del(animation) + T.nodamage = 1 //So they won't suffocate inside the stone + T.canmove = 0//Can't move out of the soul stone + T.loc = C//Throw "soul" into the stone. + T.stat = 0//Revive the victim as a "soul" + T.mutantrace = "trappedsoul" //To prevent suicide/maybe some other special effects later on + T.setToxLoss(0) + T.setOxyLoss(0) + T.setCloneLoss(0) + T.SetParalysis(0) + T.SetStunned(0) + T.SetWeakened(0) + T.radiation = 0 + T.heal_overall_damage(T.getBruteLoss(), T.getFireLoss()) + T.cancel_camera() + T.nodamage = 1 //So they won't suffocate inside the stone + C.icon_state = "soulstone2" + T << "Your soul has been captured!" + U << "\blue Capture successful!: \black [T.name]'s soul has been ripped from their body and stored within the soul stone." + return \ No newline at end of file diff --git a/code/game/objects/storage/belt.dm b/code/game/objects/storage/belt.dm index 92dae7a1f57..db2fb596e9a 100644 --- a/code/game/objects/storage/belt.dm +++ b/code/game/objects/storage/belt.dm @@ -115,4 +115,23 @@ "/obj/item/ammo_magazine", "/obj/item/weapon/reagent_containers/food/snacks/donut", "/obj/item/weapon/reagent_containers/food/snacks/jellydonut" - ) \ No newline at end of file + ) + +/obj/item/weapon/storage/belt/soulstone + name = "soul stone belt" + desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away" + icon_state = "utilitybelt" + item_state = "utility"//Could likely use a better one. + storage_slots = 6 + can_hold = list( + "/obj/item/device/soulstone" + ) + +/obj/item/weapon/storage/belt/utility/full/New() + ..() + new /obj/item/device/soulstone(src) + new /obj/item/device/soulstone(src) + new /obj/item/device/soulstone(src) + new /obj/item/device/soulstone(src) + new /obj/item/device/soulstone(src) + new /obj/item/device/soulstone(src) \ No newline at end of file diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 9de662a62d6..7ee53d48538 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -20,7 +20,9 @@ if(alien_egg_flag) src << "The alien inside you forces you to breathe, preventing you from suiciding." return - + if(mutantrace == "trappedsoul") + src << "You are already dead, your soul trapped and contained!" + return if(confirm == "Yes") suiciding = 1 //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index d34d0d0050d..bf62f579808 100644 Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 6a36573b709..d612f77e426 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -396,6 +396,7 @@ #include "code\game\gamemodes\sandbox\h_sandbox.dm" #include "code\game\gamemodes\sandbox\sandbox.dm" #include "code\game\gamemodes\traitor\traitor.dm" +#include "code\game\gamemodes\wizard\soulstone.dm" #include "code\game\gamemodes\wizard\spellbook.dm" #include "code\game\gamemodes\wizard\spells.dm" #include "code\game\gamemodes\wizard\wizard.dm"