diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index cddea783625..4d38135edce 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -8,84 +8,114 @@
slot_flags = SLOT_BELT
origin_tech = "bluespace=4;materials=4"
var/imprinted = "empty"
+
+ var/usability = TRUE // Can this soul stone be used by anyone, or only cultists/wizards?
+ var/reusable = TRUE // Can this soul stone be used more than once?
+ var/spent = FALSE // If the soul stone can only be used once, has it been used?
+/obj/item/device/soulstone/proc/can_use(mob/living/user)
+ if(iscultist(user) || iswizard(user) || usability)
+ return TRUE
-//////////////////////////////Capturing////////////////////////////////////////////////////////
+ return FALSE
+
+/obj/item/device/soulstone/proc/was_used()
+ if(!reusable)
+ spent = TRUE
+ name = "dull [name]"
+ desc = "A fragment of the legendary treasure known simply as \
+ the 'Soul Stone'. The shard lies still, dull and lifeless; \
+ whatever spark it once held long extinguished."
+
+/obj/item/device/soulstone/anybody
+ usability = TRUE
- 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 ..()
- if(istype(M, /mob/living/carbon/human/dummy))
- return ..()
-
- if(M.has_brain_worms()) //Borer stuff - RR
- to_chat(user, "This being is corrupted by an alien intelligence and cannot be soul trapped.")
- return ..()
-
- if(jobban_isbanned(M, "cultist") || jobban_isbanned(M, "Syndicate"))
- to_chat(user, "A mysterious force prevents you from trapping this being's soul.")
- return ..()
-
- M.create_attack_log("Has had their soul captured with [src.name] by [key_name(user)]")
- user.create_attack_log("Used the [src.name] to capture the soul of [key_name(M)]")
-
- log_attack("[key_name(user)] used the [src.name] to capture the soul of [key_name(M)]")
-
-
- transfer_soul("VICTIM", M, user)
+/obj/item/device/soulstone/anybody/chaplain
+ name = "mysterious old shard"
+ reusable = FALSE
+
+/obj/item/device/soulstone/pickup(mob/living/user)
+ ..()
+ if(!can_use(user))
+ to_chat(user, "An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly.")
+ user.Dizzy(120)
+
+//////////////////////////////Capturing////////////////////////////////////////////////////////
+/obj/item/device/soulstone/attack(mob/living/carbon/human/M as mob, mob/user as mob)
+ if(!can_use(user))
+ user.Paralyse(5)
+ to_chat(user, "Your body is wracked with debilitating pain!")
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.create_attack_log("Used the [src.name] to capture the soul of [M.name] ([M.ckey])")
-
- transfer_soul("SHADE", M, user)
- return*/
-///////////////////Options for using captured souls///////////////////////////////////////
-
- attack_self(mob/user)
- if(!in_range(src, user))
- return
- user.set_machine(src)
- var/dat = "Soul Stone
"
- for(var/mob/living/simple_animal/shade/A in src)
- dat += "Captured Soul: [A.name]
"
- dat += {"Summon Shade"}
- dat += "
"
- dat += {" Close"}
- user << browse(dat, "window=aicard")
- onclose(user, "aicard")
+ if(spent)
+ to_chat(user, "There is no power left in the shard.")
return
+ if(!ishuman(M) || istype(M, /mob/living/carbon/human/dummy)) //If target is not a human or a dummy
+ return ..()
+ if(jobban_isbanned(M, "cultist") || jobban_isbanned(M, "Syndicate"))
+ to_chat(user, "A mysterious force prevents you from trapping this being's soul.")
+ return ..()
+ M.create_attack_log("Has had their soul captured with [src.name] by [key_name(user)]")
+ user.create_attack_log("Used the [src.name] to capture the soul of [key_name(M)]")
+ log_attack("[key_name(user)] used the [src.name] to capture the soul of [key_name(M)]")
- Topic(href, href_list)
- var/mob/U = usr
- if(!in_range(src, U)||U.machine!=src)
+ transfer_soul("VICTIM", M, user)
+ return
+
+///////////////////Options for using captured souls///////////////////////////////////////
+/obj/item/device/soulstone/attack_self(mob/user)
+ if(!in_range(src, user))
+ return
+
+ if(!can_use(user))
+ user.Paralyse(5)
+ to_chat(user, "Your body is wracked with debilitating pain!")
+ return
+
+ user.set_machine(src)
+ var/dat = "Soul Stone
"
+ for(var/mob/living/simple_animal/shade/A in src)
+ dat += "Captured Soul: [A.name]
"
+ dat += {"Summon Shade"}
+ dat += "
"
+ dat += {" Close"}
+ user << browse(dat, "window=aicard")
+ onclose(user, "aicard")
+ return
+
+/obj/item/device/soulstone/Topic(href, href_list)
+ var/mob/U = usr
+ if(!in_range(src, U) || U.machine != src || !can_use(user))
+ 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
- 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)
- A.status_flags &= ~GODMODE
- A.canmove = 1
- to_chat(A, "You have been released from your prison, but you are still bound to [U.name]'s will. Help them suceed in their goals at all costs.")
- A.loc = U.loc
- A.cancel_camera()
- src.icon_state = "soulstone"
- attack_self(U)
+ if("Summon")
+ for(var/mob/living/simple_animal/shade/A in src)
+ A.status_flags &= ~GODMODE
+ A.canmove = 1
+ A.forceMove(get_turf(user))
+ A.cancel_camera()
+ icon_state = "soulstone"
+ name = initial(name)
+ if(iswizard(usr) || usability)
+ to_chat(A, "You have been released from your prison, but you are still bound to [user.real_name]'s will. Help them succeed in their goals at all costs.")
+ else if(iscultist(usr))
+ to_chat(A, "You have been released from your prison, but you are still bound to the cult's will. Help them succeed in their goals at all costs.")
+ was_used()
+ attack_self(U)
///////////////////////////Transferring to constructs/////////////////////////////////////////////////////
/obj/structure/constructshell
@@ -93,15 +123,30 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "construct"
desc = "A wicked machine used by those skilled in magical arts. It is inactive"
+
+/obj/structure/constructshell/examine(mob/user)
+ if(..(user, 0))
+ if(iscultist(user) || iswizard(user) || user.stat == DEAD)
+ to_chat(user, "A construct shell, used to house bound souls from a soulstone.")
+ to_chat(user, "Placing a soulstone with a soul into this shell allows you to produce your choice of the following:")
+ to_chat(user, "An Artificer, which can produce more shells and soulstones, as well as fortifications.")
+ to_chat(user, "A Wraith, which does high damage and can jaunt through walls, though it is quite fragile.")
+ to_chat(user, "A Juggernaut, which is very hard to kill and can produce temporary walls, but is slow.")
/obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/device/soulstone))
- O.transfer_soul("CONSTRUCT",src,user)
-
+ var/obj/item/device/soulstone/SS = O
+ if(!SS.can_use(user))
+ to_chat(user, "An overwhelming feeling of dread comes over you as you attempt to place the soulstone into the shell. It would be wise to be rid of this quickly.")
+ user.Dizzy(120)
+ return
+ SS.transfer_soul("CONSTRUCT",src,user)
+ SS.was_used()
+ else
+ return ..()
////////////////////////////Proc for moving soul in and out off stone//////////////////////////////////////
-
/obj/item/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob).
switch(choice)
if("FORCE")
@@ -238,7 +283,6 @@
to_chat(newstruct, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.")
newstruct.cancel_camera()
-
/obj/item/device/soulstone/proc/init_shade(mob/living/carbon/human/T, mob/U, vic = 0)
new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
T.invisibility = 101
@@ -268,7 +312,6 @@
if(vic && U)
to_chat(U, "Capture successful!: [T.real_name]'s soul has been ripped from their body and stored within the soul stone.")
-
/obj/item/device/soulstone/proc/getCultGhost(mob/living/carbon/human/T, mob/U)
var/mob/dead/observer/chosen_ghost
diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm
index dd006f641de..6e484d27ff7 100644
--- a/code/modules/clothing/spacesuits/ert.dm
+++ b/code/modules/clothing/spacesuits/ert.dm
@@ -110,38 +110,39 @@
item_color = "ert_paranormal"
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
sprite_sheets = null
+ icon_override = 'icons/mob/clothing/paranormal_hardsuit.dmi'
+ actions_types = list()
has_camera = 0
/obj/item/clothing/suit/space/rig/ert/paranormal
name = "paranormal response team suit"
desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats."
- icon_state = "knight_grey"
- item_state = "knight_grey"
+ icon_state = "rig-paranormal"
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
sprite_sheets = null
+ icon_override = 'icons/mob/clothing/paranormal_hardsuit.dmi'
+ actions_types = list()
/obj/item/clothing/suit/space/rig/ert/paranormal/New()
..()
new /obj/item/weapon/nullrod(src)
-/obj/item/clothing/suit/space/rig/ert/paranormal/inquisitor
- name = "inquisitor's hardsuit"
- icon_state = "hardsuit-inq"
- item_state = "hardsuit-inq"
-
/obj/item/clothing/head/helmet/space/rig/ert/paranormal/inquisitor
name = "inquisitor's helmet"
- icon_state = "hardsuit0-inq"
- item_state = "hardsuit0-inq"
+ icon_state = "rig0-inquisitor"
+ item_color = "inquisitor"
+
+/obj/item/clothing/suit/space/rig/ert/paranormal/inquisitor
+ name = "inquisitor's hardsuit"
+ icon_state = "rig-inquisitor"
-/obj/item/clothing/suit/space/rig/ert/paranormal/beserker
- name = "champion's hardsuit"
- desc = "Voices echo from the hardsuit, driving the user insane."
- icon_state = "hardsuit-beserker"
- item_state = "hardsuit-beserker"
-
-/obj/item/clothing/head/helmet/space/rig/ert/paranormal/beserker
+/obj/item/clothing/head/helmet/space/rig/ert/paranormal/berserker
name = "champion's helmet"
desc = "Peering into the eyes of the helmet is enough to seal damnation."
- icon_state = "hardsuit0-beserker"
- item_state = "hardsuit0-beserker"
\ No newline at end of file
+ icon_state = "rig0-berserker"
+ item_color = "berserker"
+
+/obj/item/clothing/suit/space/rig/ert/paranormal/berserker
+ name = "champion's hardsuit"
+ desc = "Voices echo from the hardsuit, driving the user insane."
+ icon_state = "rig-berserker"
\ No newline at end of file
diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm
index 5ed3000752b..a0ea548d0c0 100644
--- a/code/modules/mining/lavaland/loot/tendril_loot.dm
+++ b/code/modules/mining/lavaland/loot/tendril_loot.dm
@@ -31,7 +31,7 @@
/obj/item/device/shared_storage/attackby(obj/item/W, mob/user, params)
if(bag)
- bag.forceMove(user)
+ bag.loc = user
bag.attackby(W, user, params)
/obj/item/device/shared_storage/attack_hand(mob/living/carbon/user)
@@ -39,7 +39,7 @@
return
if(loc == user && user.back && user.back == src)
if(bag)
- bag.forceMove(user)
+ bag.loc = user
bag.attack_hand(user)
else
..()
@@ -63,7 +63,6 @@
M.put_in_active_hand(src)
add_fingerprint(usr)
-
//Potion of Flight: as we do not have the "Angel" species this currently does not work.
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 2a8fbbe3db0..3910baf10de 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -22,7 +22,7 @@
new /obj/item/clothing/head/helmet/space/cult(src)
new /obj/item/clothing/suit/space/cult(src)
if(3)
- new /obj/item/device/soulstone(src)
+ new /obj/item/device/soulstone/anybody(src)
if(4)
new /obj/item/weapon/katana/cursed(src)
if(5)
@@ -40,8 +40,8 @@
if(10)
new /obj/item/ship_in_a_bottle(src)
if(11)
- new /obj/item/clothing/head/helmet/space/rig/ert/paranormal/beserker(src)
- new /obj/item/clothing/suit/space/rig/ert/paranormal/beserker(src)
+ new /obj/item/clothing/head/helmet/space/rig/ert/paranormal/berserker(src)
+ new /obj/item/clothing/suit/space/rig/ert/paranormal/berserker(src)
if(12)
new /obj/item/weapon/sord(src)
if(13)
diff --git a/icons/mob/clothing/paranormal_hardsuit.dmi b/icons/mob/clothing/paranormal_hardsuit.dmi
new file mode 100644
index 00000000000..f06e81ab1e7
Binary files /dev/null and b/icons/mob/clothing/paranormal_hardsuit.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index d338612b2ec..d56a42ca099 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 1939a6b95d8..f12fcf3d86c 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index ea3b7bf31de..b98c786872a 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ