mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
Removed old cult/wizard files (#19850)
This commit is contained in:
@@ -1,264 +0,0 @@
|
||||
/obj/item/weapon/paper/talisman
|
||||
icon_state = "paper_talisman"
|
||||
var/imbue = null
|
||||
var/uses = 1
|
||||
var/nullblock = 0
|
||||
|
||||
/obj/item/weapon/paper/talisman/update_icon()
|
||||
var/suffix = ""
|
||||
if(imbue)
|
||||
suffix = imbue
|
||||
if(imbue in list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri"))
|
||||
suffix = "travel" // if the imbue is one of the words, it means it's a travel rune. a single "travel" sprite is used, instead of one per-word.
|
||||
if(suffix)
|
||||
icon_state = "[initial(icon_state)]_[suffix]"
|
||||
else
|
||||
icon_state = "[initial(icon_state)]"
|
||||
|
||||
/obj/item/weapon/paper/talisman/examine(mob/user)
|
||||
..()
|
||||
if(iscultist(user) || isobserver(user))
|
||||
switch(imbue)
|
||||
if("newtome")
|
||||
to_chat(user, "This talisman has been imbued with the power of spawning a new Arcane Tome.")
|
||||
if("armor")
|
||||
to_chat(user, "This talisman has been imbued with the power of clothing yourself in cult fighting gear.")
|
||||
if("emp")
|
||||
to_chat(user, "This talisman has been imbued with the power of disabling technology in a small radius around you.")
|
||||
if("conceal")
|
||||
to_chat(user, "This talisman has been imbued with the power of concealing nearby runes.")
|
||||
if("revealrunes")
|
||||
to_chat(user, "This talisman has been imbued with the power of revealing hidden nearby runes.")
|
||||
if("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri")
|
||||
to_chat(user, "This talisman has been imbued with the power of taking you to someplace else. You can read <i>[imbue]</i> on it.")
|
||||
if("communicate")
|
||||
to_chat(user, "This talisman has been imbued with the power of communicating your whispers to your allies.")
|
||||
if("deafen")
|
||||
to_chat(user, "This talisman has been imbued with the power of temporarily deafening visible enemies. Does not work on silicons.")
|
||||
if("blind")
|
||||
to_chat(user, "This talisman has been imbued with the power of temporarily blinding all enemies within three tiles. Does not work on silicons.")
|
||||
if("runestun")
|
||||
to_chat(user, "This talisman has been imbued with the power of paralyzing the beings you touch with it. The effect works on silicons as well, but humans will also be muted for a short time.")
|
||||
if("supply")
|
||||
to_chat(user, "This talisman has been imbued with the power of providing you and your allies with some supplies to start your cult.")
|
||||
else
|
||||
to_chat(user, "This talisman.....has no particular power. Is this some kind of joke?")
|
||||
to_chat(user, "Uses left: [src.uses]")
|
||||
else
|
||||
to_chat(user, "Something about the blood stains on this paper fills you with uneasiness.")
|
||||
|
||||
/obj/item/weapon/paper/talisman/proc/findNullRod(var/atom/target)
|
||||
if(istype(target,/obj/item/weapon/nullrod))
|
||||
var/turf/T = get_turf(target)
|
||||
nullblock = 1
|
||||
T.turf_animation('icons/effects/96x96.dmi',"nullding",-WORLD_ICON_SIZE,-WORLD_ICON_SIZE,MOB_LAYER+1,'sound/instruments/piano/Ab7.ogg',anim_plane = EFFECTS_PLANE)
|
||||
return 1
|
||||
else if(target.contents)
|
||||
for(var/atom/A in target.contents)
|
||||
findNullRod(A)
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/paper/talisman/New()
|
||||
..()
|
||||
pixel_x=0
|
||||
pixel_y=0
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/attack_self(mob/living/user as mob)
|
||||
if(iscultist(user))
|
||||
var/use_charge = 1
|
||||
switch(imbue)
|
||||
if("newtome")
|
||||
call(/obj/effect/rune/proc/tomesummon)()
|
||||
if("armor") //Fuck off with your shit /tg/. This isn't Edgy Rev+
|
||||
user.drop_from_inventory(src) //So that the blade goes straight to your active hand.
|
||||
call(/obj/effect/rune/proc/armor)()
|
||||
if("emp")
|
||||
call(/obj/effect/rune/proc/emp)(usr.loc,3)
|
||||
if("conceal")
|
||||
call(/obj/effect/rune/proc/obscure)(2)
|
||||
if("revealrunes")
|
||||
call(/obj/effect/rune/proc/revealrunes)(src)
|
||||
if("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri")
|
||||
var/turf/T1 = get_turf(user)
|
||||
call(/obj/effect/rune/proc/teleport)(imbue)
|
||||
var/turf/T2 = get_turf(user)
|
||||
if(T1!=T2)
|
||||
T1.turf_animation('icons/effects/effects.dmi',"rune_teleport")
|
||||
if("communicate")
|
||||
//If the user cancels the talisman this var will be set to 0
|
||||
use_charge = call(/obj/effect/rune/proc/communicate)()
|
||||
if("deafen")
|
||||
deafen()
|
||||
qdel(src)
|
||||
if("blind")
|
||||
blind()
|
||||
qdel(src)
|
||||
if("runestun")
|
||||
to_chat(user, "<span class='warning'>To use this talisman, attack your target directly.</span>")
|
||||
return
|
||||
if("supply")
|
||||
supply()
|
||||
user.take_organ_damage(5, 0)
|
||||
if(src && src.imbue!="supply" && src.imbue!="runestun")
|
||||
if(use_charge)
|
||||
uses--
|
||||
if(!src.uses)
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?")
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/attack(mob/living/carbon/T as mob, mob/living/user as mob)
|
||||
if(iscultist(user))
|
||||
if(imbue == "runestun")
|
||||
user.take_organ_damage(5, 0)
|
||||
runestun(T)
|
||||
qdel(src)
|
||||
else
|
||||
..() ///If its some other talisman, use the generic attack code, is this supposed to work this way?
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/paper/talisman/attack_animal(var/mob/living/simple_animal/M as mob)
|
||||
if(istype(M, /mob/living/simple_animal/construct/harvester))
|
||||
attack_self(M)
|
||||
|
||||
/obj/item/weapon/paper/talisman/proc/supply(var/key)
|
||||
if (!src.uses)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
var/dat = {"<B>There are [src.uses] bloody runes on the parchment.</B>
|
||||
<BR>Please choose the chant to be imbued into the fabric of reality.<BR>
|
||||
<HR>
|
||||
<A href='?src=\ref[src];rune=newtome'>N'ath reth sh'yro eth d'raggathnor!</A> - Allows you to summon a new arcane tome.<BR>
|
||||
<A href='?src=\ref[src];rune=teleport'>Sas'so c'arta forbici!</A> - Allows you to move to a rune with the same last word.<BR>
|
||||
<A href='?src=\ref[src];rune=emp'>Ta'gh fara'qha fel d'amar det!</A> - Allows you to destroy technology in a short range.<BR>
|
||||
<A href='?src=\ref[src];rune=conceal'>Kla'atu barada nikt'o!</A> - Allows you to conceal the runes you placed on the floor.<BR>
|
||||
<A href='?src=\ref[src];rune=communicate'>O bidai nabora se'sma!</A> - Allows you to coordinate with others of your cult.<BR>
|
||||
<A href='?src=\ref[src];rune=runestun'>Fuu ma'jin</A> - Allows you to stun a person by attacking them with the talisman.<BR>
|
||||
<A href='?src=\ref[src];rune=soulstone'>Kal om neth</A> - Summons a soul stone<BR>
|
||||
<A href='?src=\ref[src];rune=construct'>Da A'ig Osk</A> - Summons a construct shell for use with captured souls. It is too large to carry on your person.<BR>"}
|
||||
//<A href='?src=\ref[src];rune=armor'>Sa tatha najin</A> - Allows you to summon armored robes and an unholy blade<BR> //Kept for reference
|
||||
usr << browse(dat, "window=id_com;size=350x200")
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/Topic(href, href_list)
|
||||
if(!src)
|
||||
return
|
||||
if (usr.stat || usr.restrained() || !in_range(src, usr))
|
||||
return
|
||||
|
||||
if (href_list["rune"])
|
||||
var/obj/item/weapon/paper/talisman/T
|
||||
switch(href_list["rune"])
|
||||
if("newtome")
|
||||
T = new /obj/item/weapon/paper/talisman(get_turf(usr))
|
||||
T.imbue = "newtome"
|
||||
if("teleport")
|
||||
T = new /obj/item/weapon/paper/talisman(get_turf(usr))
|
||||
var/list/words = list("ire" = "ire", "ego" = "ego", "nahlizet" = "nahlizet", "certum" = "certum", "veri" = "veri", "jatkaa" = "jatkaa", "balaq" = "balaq", "mgar" = "mgar", "karazet" = "karazet", "geeri" = "geeri")
|
||||
T.imbue = input("Write your teleport destination rune:", "Rune Scribing") in words
|
||||
if("emp")
|
||||
T = new /obj/item/weapon/paper/talisman(get_turf(usr))
|
||||
T.imbue = "emp"
|
||||
if("conceal")
|
||||
T = new /obj/item/weapon/paper/talisman(get_turf(usr))
|
||||
T.imbue = "conceal"
|
||||
if("communicate")
|
||||
T = new /obj/item/weapon/paper/talisman(get_turf(usr))
|
||||
T.imbue = "communicate"
|
||||
if("runestun")
|
||||
T = new /obj/item/weapon/paper/talisman(get_turf(usr))
|
||||
T.imbue = "runestun"
|
||||
//if("armor")
|
||||
//T = new /obj/item/weapon/paper/talisman(get_turf(usr))
|
||||
//T.imbue = "armor"
|
||||
if("soulstone")
|
||||
new /obj/item/device/soulstone(get_turf(usr))
|
||||
if("construct")
|
||||
new /obj/structure/constructshell/cult(get_turf(usr))
|
||||
|
||||
if(T)
|
||||
T.uses = talisman_charges(T.imbue)
|
||||
src.uses--
|
||||
supply()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply
|
||||
imbue = "supply"
|
||||
uses = 5
|
||||
|
||||
|
||||
//imbued talismans invocation for a few runes, since calling the proc causes a runtime error due to src = null
|
||||
/obj/item/weapon/paper/talisman/proc/runestun(var/mob/living/T as mob)//When invoked as talisman, stun and mute the target mob.
|
||||
usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!")
|
||||
nullblock = 0
|
||||
for(var/turf/TU in range(T,1))
|
||||
findNullRod(TU)
|
||||
if(nullblock)
|
||||
usr.visible_message("<span class='danger'>[usr] invokes a talisman at [T], but they are unaffected!</span>")
|
||||
else
|
||||
usr.visible_message("<span class='danger'>[usr] invokes a talisman at [T]</span>")
|
||||
|
||||
if(issilicon(T))
|
||||
T.Knockdown(15)
|
||||
|
||||
else if(iscarbon(T))
|
||||
var/mob/living/carbon/C = T
|
||||
C.flash_eyes(visual = 1)
|
||||
if (!(M_HULK in C.mutations))
|
||||
C.silent += 15
|
||||
C.Knockdown(25)
|
||||
C.Stun(25)
|
||||
return
|
||||
|
||||
/obj/item/weapon/paper/talisman/proc/blind()
|
||||
var/affected = 0
|
||||
for(var/mob/living/carbon/C in view(3,usr))
|
||||
if (iscultist(C))
|
||||
continue
|
||||
nullblock = 0
|
||||
for(var/turf/T in range(C,1))
|
||||
findNullRod(T)
|
||||
if(nullblock)
|
||||
continue
|
||||
C.eye_blurry += 30
|
||||
C.eye_blind += 10
|
||||
//talismans is weaker.
|
||||
affected++
|
||||
to_chat(C, "<span class='warning'>You feel a sharp pain in your eyes, and the world disappears into darkness..</span>")
|
||||
if(affected)
|
||||
usr.whisper("Sti[pick("'","`")] kaliesin!")
|
||||
to_chat(usr, "<span class='warning'>Your talisman turns into gray dust, blinding those who not follow the Nar-Sie.</span>")
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/proc/deafen()
|
||||
var/affected = 0
|
||||
for(var/mob/living/carbon/C in range(7,usr))
|
||||
if (iscultist(C))
|
||||
continue
|
||||
nullblock = 0
|
||||
for(var/turf/T in range(C,1))
|
||||
findNullRod(T)
|
||||
if(nullblock)
|
||||
continue
|
||||
C.ear_deaf += 30
|
||||
//talismans is weaker.
|
||||
C.show_message("<span class='notice'>The world around you suddenly becomes quiet.</span>")
|
||||
affected++
|
||||
if(affected)
|
||||
usr.whisper("Sti[pick("'","`")] kaliedir!")
|
||||
to_chat(usr, "<span class='warning'>Your talisman turns into gray dust, deafening everyone around.</span>")
|
||||
for (var/mob/V in orange(1,src))
|
||||
if(!(iscultist(V)))
|
||||
V.show_message("<span class='warning'>Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..</span>")
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/show_text()
|
||||
return
|
||||
@@ -1,93 +0,0 @@
|
||||
//Machinery that gets deleted by Nar-Sie and isn't replaced with cult structures
|
||||
/obj/machinery/camera/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/power/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/light_switch/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/firealarm/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/alarm/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/atm/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/hologram/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/status_display/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/newscaster/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/media/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/door_control/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/access_button/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/embedded_controller/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/navbeacon/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/gateway/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/space_heater/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/crema_switch/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/portable_atmospherics/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/pos/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/requests_console/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/computer/security/telescreen/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/conveyor_switch/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/conveyor/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/vending/wallmed1/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/flasher/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/flasher_button/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/cell_charger/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/meter/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/keycard_auth/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/airlock_sensor/cultify()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/turretid/cultify()
|
||||
qdel(src)
|
||||
@@ -1,400 +0,0 @@
|
||||
/obj/item/device/soulstone
|
||||
name = "Soul Stone Shard"
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "soulstone"
|
||||
item_state = "shard-soulstone"
|
||||
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/shards.dmi', "right_hand" = 'icons/mob/in-hand/right/shards.dmi')
|
||||
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 = W_CLASS_TINY
|
||||
flags = FPRINT
|
||||
slot_flags = SLOT_BELT
|
||||
origin_tech = Tc_BLUESPACE + "=4;" + Tc_MATERIALS + "=4"
|
||||
|
||||
/obj/item/device/soulstone/Destroy()
|
||||
eject_shade()
|
||||
..()
|
||||
|
||||
/obj/item/device/soulstone/examine(mob/user)
|
||||
..()
|
||||
for(var/mob/living/simple_animal/shade/A in src)
|
||||
if(!A.client)
|
||||
to_chat(user, "<span class='warning'>The spirit within seems to be dormant.</span>")
|
||||
|
||||
//////////////////////////////Capturing////////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/device/soulstone/attack(var/mob/living/M, mob/user as mob)
|
||||
if(!istype(M, /mob/living/carbon) && !istype(M, /mob/living/simple_animal))
|
||||
return ..()
|
||||
if(istype(M, /mob/living/carbon/human/manifested))
|
||||
to_chat(user, "The soul stone shard seems unable to pull the soul out of that poor manifested ghost back onto our plane.")
|
||||
return
|
||||
add_logs(user, M, "captured [M.name]'s soul", object=src)
|
||||
|
||||
transfer_soul("VICTIM", M, user)
|
||||
return
|
||||
|
||||
/*attack(mob/living/simple_animal/shade/M as mob, mob/user as mob)//APPARENTLY THEY NEED THEIR OWN SPECIAL SNOWFLAKE CODE IN THE LIVING ANIMAL DEFINES
|
||||
if(!istype(M, /mob/living/simple_animal/shade))//If target is not a shade
|
||||
return ..()
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to capture the soul of [M.name] ([M.ckey])</font>")
|
||||
|
||||
transfer_soul("SHADE", M, user)
|
||||
return*/
|
||||
///////////////////Options for using captured souls///////////////////////////////////////
|
||||
|
||||
/obj/item/device/soulstone/attack_self(mob/user)
|
||||
if (!in_range(src, user))
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat = "<TT><B>Soul Stone</B><BR>"
|
||||
for(var/mob/living/simple_animal/shade/A in src)
|
||||
dat += "Captured Soul: [A.name]<br>"
|
||||
dat += {"<A href='byond://?src=\ref[src];choice=Summon'>Summon Shade</A>"}
|
||||
dat += "<br>"
|
||||
dat += {"<a href='byond://?src=\ref[src];choice=Close'> Close</a>"}
|
||||
user << browse(dat, "window=aicard")
|
||||
onclose(user, "aicard")
|
||||
return
|
||||
|
||||
/obj/item/device/soulstone/Topic(href, href_list)
|
||||
var/mob/living/carbon/U = usr
|
||||
if (!in_range(src, U)||U.machine!=src)
|
||||
U << browse(null, "window=aicard")
|
||||
U.unset_machine()
|
||||
return
|
||||
|
||||
add_fingerprint(U)
|
||||
U.set_machine(src)
|
||||
|
||||
switch(href_list["choice"])//Now we switch based on choice.
|
||||
if ("Close")
|
||||
U << browse(null, "window=aicard")
|
||||
U.unset_machine()
|
||||
return
|
||||
|
||||
if ("Summon")
|
||||
for(var/mob/living/simple_animal/shade/A in src)
|
||||
eject_shade(U)
|
||||
src.icon_state = "soulstone"
|
||||
src.item_state = "shard-soulstone"
|
||||
U.update_inv_hands()
|
||||
src.name = "Soul Stone Shard"
|
||||
|
||||
attack_self(U)
|
||||
|
||||
/obj/item/device/soulstone/cultify()
|
||||
return
|
||||
|
||||
///////////////////////////Transferring to constructs/////////////////////////////////////////////////////
|
||||
/obj/structure/constructshell
|
||||
name = "empty shell"
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "construct"
|
||||
desc = "A wicked machine used by those skilled in magical arts. It is inactive."
|
||||
flags = FPRINT
|
||||
|
||||
/obj/structure/constructshell/cultify()
|
||||
return
|
||||
|
||||
/obj/structure/constructshell/cult
|
||||
icon_state = "construct-cult"
|
||||
desc = "This eerie contraption looks like it would come alive if supplied with a missing ingredient."
|
||||
|
||||
/obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob)
|
||||
if(istype(O, /obj/item/device/soulstone))
|
||||
O.transfer_soul("CONSTRUCT",src,user)
|
||||
|
||||
|
||||
////////////////////////////Proc for moving soul in and out off stone//////////////////////////////////////
|
||||
|
||||
/obj/item/device/soulstone/proc/eject_shade(var/mob/user=null)
|
||||
for(var/mob/living/L in src)
|
||||
L.forceMove(get_turf(src))
|
||||
L.status_flags &= ~GODMODE
|
||||
if(user)
|
||||
to_chat(L, "<b>You have been released from your prison, but you are still bound to [user.name]'s will. Help them succeed in their goals at all costs.<br>\
|
||||
Be warned, you are as fragile as glass and your attacks are not terribly strong. On the plus side, you fly and have no need for air.<br>\
|
||||
You also cannot be stunned. If need be, your master can recapture you in the stone to heal you.</b>")
|
||||
L.canmove = 1
|
||||
L.cancel_camera()
|
||||
|
||||
/obj/item/proc/capture_soul(var/target, var/mob/user as mob)
|
||||
if(istype(target, /mob/living/carbon))//humans, monkeys, aliens
|
||||
var/mob/living/carbon/carbonMob = target
|
||||
//first of all, let's check that our target has a soul, somewhere
|
||||
|
||||
if(!carbonMob.client)
|
||||
//no client? the target could be either braindead, decapitated, or catatonic, let's check which
|
||||
var/mob/living/carbon/human/humanTarget = null
|
||||
var/datum/organ/internal/brain/humanBrain = null
|
||||
if(ishuman(target))
|
||||
humanTarget = target
|
||||
humanBrain = humanTarget.internal_organs_by_name["brain"]
|
||||
|
||||
if(!humanTarget || (humanTarget && humanBrain))
|
||||
//our target either is a monkey or alien, or is a human with their head. Did they have a soul in the first place? if so, where is it right now
|
||||
if(!carbonMob.mind)
|
||||
//if a mob doesn't have a mind, that means it never had a player controlling him
|
||||
to_chat(user, "<span class='warning'>The soul stone isn't reacting, looks like this target doesn't have much of a soul.</span>")
|
||||
return
|
||||
else
|
||||
//otherwise, that means the player either disconnected or ghosted. we can track their key from their mind,
|
||||
//but first let's make sure that they are dead or in crit
|
||||
var/mob/new_target = null
|
||||
for(var/mob/M in player_list)
|
||||
if(M.key == carbonMob.mind.key)
|
||||
new_target = M
|
||||
if(!new_target)
|
||||
to_chat(user, "<span class='warning'>The soul stone isn't reacting, looks like this target's soul went far, far away.</span>")
|
||||
return
|
||||
else if(!istype(new_target,/mob/dead/observer))
|
||||
to_chat(user, "<span class='warning'>The soul stone isn't reacting, looks like this target's soul already reincarnated.</span>")
|
||||
return
|
||||
else
|
||||
//if the player ghosted, you don't need to put his body into crit to successfully soulstone them.
|
||||
to_chat(new_target, "<span class='danger'>You feel your soul getting sucked into the soul stone.</span>")
|
||||
to_chat(user, "<span class='rose'>The soul stone reacts to the corpse and starts glowing.</span>")
|
||||
capture_soul_process(user,new_target.client,carbonMob)
|
||||
else if(humanTarget)
|
||||
//aw shit, our target is a brain/headless human, let's try and locate the head.
|
||||
if(!humanTarget.decapitated || (humanTarget.decapitated.loc == null))
|
||||
to_chat(user, "<span class='warning'>The soul stone isn't reacting, looks like their brain has been removed or head has been destroyed.</span>")
|
||||
return
|
||||
else if(istype(humanTarget.decapitated.loc,/mob/living/carbon/human))
|
||||
to_chat(user, "<span class='warning'>The soul stone isn't reacting, looks like their head has been grafted on another body.</span>")
|
||||
return
|
||||
else
|
||||
var/obj/item/organ/external/head/humanHead = humanTarget.decapitated
|
||||
if((humanHead.z != humanTarget.z) || (get_dist(humanTarget,humanHead) > 5))//F I V E T I L E S
|
||||
to_chat(user, "<span class='warning'>The soul stone isn't reacting, the head needs to be closer from the body.</span>")
|
||||
return
|
||||
else
|
||||
capture_soul_head(humanHead, user)
|
||||
return
|
||||
|
||||
else
|
||||
//if the body still has a client, then all we have to make sure of is that he's dead or in crit
|
||||
if (carbonMob.stat == CONSCIOUS)
|
||||
to_chat(user, "<span class='warning'>Kill or maim the victim first!</span>")
|
||||
else if(!carbonMob.isInCrit() && carbonMob.stat != DEAD)
|
||||
to_chat(user, "<span class='warning'>The victim is holding on, weaken them further!</span>")
|
||||
else
|
||||
to_chat(carbonMob, "<span class='danger'>You feel your soul getting sucked into the soul stone.</span>")
|
||||
to_chat(user, "<span class='rose'>The soul stone reacts to the corpse and starts glowing.</span>")
|
||||
capture_soul_process(user,carbonMob.client,carbonMob)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The soul stone doesn't seem compatible with that creature's soul.</span>")
|
||||
//TODO: add a few snowflake checks to specific simple_animals that could be soulstoned.
|
||||
|
||||
/obj/item/proc/capture_soul_head(var/target, var/mob/user as mob)//called either when using a soulstone on a head, or on a decapitated body
|
||||
if(istype(target, /obj/item/organ/external/head))
|
||||
var/obj/item/organ/external/head/humanHead = target
|
||||
if(!humanHead.organ_data)
|
||||
to_chat(user, "<span class='rose'>The soul stone isn't reacting, looks like their brain was separated from their head.</span>")
|
||||
return
|
||||
var/mob/living/carbon/brain/humanBrainMob = humanHead.brainmob
|
||||
if(!humanBrainMob.client)
|
||||
if(!humanBrainMob.mind)
|
||||
to_chat(user, "<span class='warning'>The soul stone isn't reacting, looks like this target doesn't have much of a soul.</span>")
|
||||
return
|
||||
else
|
||||
var/mob/new_target = null
|
||||
for(var/mob/M in player_list)
|
||||
if(M.key == humanBrainMob.mind.key)
|
||||
new_target = M
|
||||
if(!new_target)
|
||||
to_chat(user, "<span class='warning'>The soul stone isn't reacting, looks like this target's soul went far, far away.</span>")
|
||||
return
|
||||
else if(!istype(new_target,/mob/dead/observer))
|
||||
to_chat(user, "<span class='warning'>The soul stone isn't reacting, looks like this target's soul already reincarnated.</span>")
|
||||
return
|
||||
else
|
||||
to_chat(new_target, "<span class='danger'>You feel your soul getting sucked into the soulstone.</span>")
|
||||
to_chat(user, "<span class='rose'>The soul stone reacts to the corpse and starts glowing.</span>")
|
||||
capture_soul_process(user,new_target.client,humanHead,humanHead.origin_body)
|
||||
else
|
||||
to_chat(humanBrainMob, "<span class='danger'>You feel your soul getting sucked into the soul stone.</span>")
|
||||
to_chat(user, "<span class='rose'>The soul stone reacts to the corpse and starts glowing.</span>")
|
||||
capture_soul_process(user,humanBrainMob.client,humanHead,humanHead.origin_body)
|
||||
|
||||
|
||||
/obj/item/proc/capture_soul_process(var/mob/living/carbon/user, var/client/targetClient, var/atom/movable/target, var/atom/movable/add_target = null)
|
||||
//user is the guy using the soulstone
|
||||
//C is the client of the guy we're soulstoning, so we don't lose track of him between the beginning and the end of the soulstoning.
|
||||
//target is the source of the guy's soul (his body, or his head if decapitated)
|
||||
//add_target is his body if he has been decapitated, for cosmetic purposes (and so it dusts)
|
||||
|
||||
if(!targetClient)
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/body = null
|
||||
|
||||
if(istype(target,/mob/living/carbon/human))
|
||||
body = target
|
||||
else if(istype(add_target,/mob/living/carbon/human))
|
||||
body = add_target
|
||||
|
||||
var/true_name = "Unknown"
|
||||
|
||||
if(body)
|
||||
true_name = body.real_name
|
||||
|
||||
for(var/obj/item/W in body)
|
||||
body.drop_from_inventory(W)
|
||||
|
||||
body.dropBorers(1)
|
||||
|
||||
var/turf/T = get_turf(body)
|
||||
|
||||
body.invisibility = 101
|
||||
|
||||
var/datum/organ/external/head_organ = body.get_organ(LIMB_HEAD)
|
||||
if(head_organ.status & ORGAN_DESTROYED)
|
||||
new /obj/effect/decal/remains/human/noskull(T)
|
||||
anim(target = T, a_icon = 'icons/mob/mob.dmi', flick_anim = "dust-h2-nohead", sleeptime = 26)
|
||||
else
|
||||
new /obj/effect/decal/remains/human(T)
|
||||
if(body.lying)
|
||||
anim(target = T, a_icon = 'icons/mob/mob.dmi', flick_anim = "dust-h2", sleeptime = 26)
|
||||
else
|
||||
anim(target = T, a_icon = 'icons/mob/mob.dmi', flick_anim = "dust-h", sleeptime = 26)
|
||||
|
||||
if(body.decapitated && (body.decapitated == target))//just making sure we're dealing with the right head
|
||||
target.invisibility = 101
|
||||
new /obj/item/weapon/skull(get_turf(target))
|
||||
else
|
||||
target.invisibility = 101
|
||||
|
||||
if(ismob(target))
|
||||
var/mob/M = target
|
||||
true_name = M.real_name
|
||||
for(var/obj/item/W in M)
|
||||
M.drop_from_inventory(W)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
C.dropBorers(1)
|
||||
new /obj/effect/decal/cleanable/ash(get_turf(target))
|
||||
else if(istype(target,/obj/item/organ/external/head))
|
||||
var/obj/item/organ/external/head/H = target
|
||||
var/mob/living/carbon/brain/BM = H.brainmob
|
||||
true_name = BM.real_name
|
||||
new /obj/item/weapon/skull(get_turf(target))
|
||||
|
||||
//Scary sound
|
||||
playsound(src, get_sfx("soulstone"), 50,1)
|
||||
|
||||
//Creating a shade inside the stone and putting the victim in control
|
||||
var/mob/living/simple_animal/shade/shadeMob = new(src)//put shade in stone
|
||||
shadeMob.status_flags |= GODMODE //So they won't die inside the stone somehow
|
||||
shadeMob.canmove = 0//Can't move out of the soul stone
|
||||
shadeMob.name = "Shade of [true_name]"
|
||||
shadeMob.real_name = "Shade of [true_name]"
|
||||
shadeMob.ckey = targetClient.ckey
|
||||
shadeMob.cancel_camera()
|
||||
|
||||
//Changing the soulstone's icon and description
|
||||
icon_state = "soulstone2"
|
||||
item_state = "shard-soulstone2"
|
||||
user.update_inv_hands()
|
||||
name = "Soul Stone: [true_name]"
|
||||
to_chat(shadeMob, "Your soul has been captured! You are now bound to [user.name]'s will, help them suceed in their goals at all costs.")
|
||||
to_chat(user, "<span class='notice'>[true_name]'s soul has been ripped from their body and stored within the soul stone.</span>")
|
||||
|
||||
//Pretty particles
|
||||
var/turf/T1 = get_turf(target)
|
||||
var/turf/T2 = null
|
||||
|
||||
if(add_target && add_target.loc)
|
||||
T2 = get_turf(add_target)
|
||||
|
||||
make_tracker_effects(T1, user)
|
||||
if(T2)
|
||||
make_tracker_effects(T2, user)
|
||||
|
||||
//Cleaning up the corpse
|
||||
qdel(target)
|
||||
if(add_target)
|
||||
qdel(add_target)
|
||||
|
||||
|
||||
/obj/item/proc/transfer_soul(var/choice as text, var/target, var/mob/living/carbon/U as mob)
|
||||
var/deleteafter = 0
|
||||
switch(choice)
|
||||
if("VICTIM")
|
||||
if(src.contents.len)
|
||||
to_chat(U, "<span class='warning'>The soul stone is full! Use or free an existing soul to make room.</span>")
|
||||
return
|
||||
|
||||
var/mob/living/T = target
|
||||
for(var/datum/faction/cult/narsie/C in ticker.mode.factions)
|
||||
if(C.is_sacrifice_target(T.mind))
|
||||
to_chat(U, "<span class='warning'>The soul stone is unable to rip this soul. Such a powerful soul, it must be coveted by some powerful being.</span>")
|
||||
return
|
||||
capture_soul(T,U)
|
||||
|
||||
if("SHADE")
|
||||
var/mob/living/simple_animal/shade/T = target
|
||||
var/obj/item/device/soulstone/C = src
|
||||
if (T.stat == DEAD)
|
||||
to_chat(U, "<span class='danger'>Capture failed!: </span>The shade has already been banished!")
|
||||
else
|
||||
if(C.contents.len)
|
||||
to_chat(U, "<span class='danger'>Capture failed!: </span>The soul stone is full! Use or free an existing soul to make room.")
|
||||
else
|
||||
T.forceMove(C) //put shade in stone
|
||||
T.status_flags |= GODMODE
|
||||
T.canmove = 0
|
||||
T.health = T.maxHealth
|
||||
C.icon_state = "soulstone2"
|
||||
C.item_state = "shard-soulstone2"
|
||||
U.update_inv_hands()
|
||||
C.name = "Soul Stone: [T.real_name]"
|
||||
to_chat(T, "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form")
|
||||
to_chat(U, "<span class='notice'><b>Capture successful!</b>: </span>[T.name]'s has been recaptured and stored within the soul stone.")
|
||||
if("CONSTRUCT")
|
||||
var/obj/structure/constructshell/T = target
|
||||
var/obj/item/device/soulstone/C = src
|
||||
var/mob/living/simple_animal/shade/A = locate() in C
|
||||
var/mob/living/simple_animal/construct/Z
|
||||
if(A)
|
||||
var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer")
|
||||
switch(construct_class)
|
||||
if("Juggernaut")
|
||||
Z = new /mob/living/simple_animal/construct/armoured (get_turf(T.loc))
|
||||
Z.key = A.key
|
||||
qdel(T)
|
||||
to_chat(Z, "<B>You are a Juggernaut. Though slow, your shell can withstand extreme punishment, your body can reflect energy and laser weapons, and you can create temporary shields that block pathing and projectiles. Your fists can punch people and regular walls apart.</B>")
|
||||
to_chat(Z, "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>")
|
||||
Z.cancel_camera()
|
||||
deleteafter = 1
|
||||
|
||||
if("Wraith")
|
||||
Z = new /mob/living/simple_animal/construct/wraith (get_turf(T.loc))
|
||||
Z.key = A.key
|
||||
qdel(T)
|
||||
to_chat(Z, "<B>You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls for a few seconds. Use it both for surprise attacks and strategic retreats.</B>")
|
||||
to_chat(Z, "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>")
|
||||
Z.cancel_camera()
|
||||
deleteafter = 1
|
||||
|
||||
if("Artificer")
|
||||
Z = new /mob/living/simple_animal/construct/builder (get_turf(T.loc))
|
||||
Z.key = A.key
|
||||
qdel(T)
|
||||
to_chat(Z, "<B>You are an Artificer. You are incredibly weak and fragile, but you can heal both yourself and other constructs (by clicking on yourself/them). You can build (and deconstruct) new walls and floors, or replace existing ones by clicking on them, as well as place pylons that act as light source (these block paths but can be easily broken),</B><I>and most important of all you can produce the tools to create new constructs</I><B> (remember to periodically produce new soulstones for your master, and place empty shells in your hideout or when asked.).</B>")
|
||||
to_chat(Z, "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>")
|
||||
Z.cancel_camera()
|
||||
deleteafter = 1
|
||||
if(islegacycultist(U))
|
||||
var/datum/faction/cult/narsie/cult_round = find_active_faction(LEGACY_CULT)
|
||||
if(cult_round)
|
||||
cult_round.HandleRecruitedMind(Z.mind)
|
||||
|
||||
name = "Soul Stone Shard"
|
||||
else
|
||||
to_chat(U, "<span class='warning'><b>Creation failed!</b>: The soul stone is empty! Go kill someone!</span>")
|
||||
if(deleteafter)
|
||||
for(var/atom/A in src)//we get rid of the empty shade once we've transferred its mind to the construct, so it isn't dropped on the floor when the soulstone is destroyed.
|
||||
qdel(A)
|
||||
qdel(src)
|
||||
return
|
||||
Reference in New Issue
Block a user