diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index c925a5cbd5..a3cd947b81 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -1,635 +1,643 @@
-
-//Apprenticeship contract - moved to antag_spawner.dm
-
-///////////////////////////Veil Render//////////////////////
-
-/obj/item/weapon/veilrender
- name = "veil render"
- desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast city."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "render"
- item_state = "render"
- force = 15
- throwforce = 10
- w_class = WEIGHT_CLASS_NORMAL
- hitsound = 'sound/weapons/bladeslice.ogg'
- var/charges = 1
- var/spawn_type = /obj/singularity/wizard
- var/spawn_amt = 1
- var/activate_descriptor = "reality"
- var/rend_desc = "You should run now."
- var/spawn_fast = 0 //if 1, ignores checking for mobs on loc before spawning
-
-/obj/item/weapon/veilrender/attack_self(mob/user)
- if(charges > 0)
- new /obj/effect/rend(get_turf(user), spawn_type, spawn_amt, rend_desc, spawn_fast)
- charges--
- user.visible_message("[src] hums with power as [user] deals a blow to [activate_descriptor] itself!")
- else
- to_chat(user, "The unearthly energies that powered the blade are now dormant.")
-
-/obj/effect/rend
- name = "tear in the fabric of reality"
- desc = "You should run now."
- icon = 'icons/obj/biomass.dmi'
- icon_state = "rift"
- density = 1
- anchored = 1
- var/spawn_path = /mob/living/simple_animal/cow //defaulty cows to prevent unintentional narsies
- var/spawn_amt_left = 20
- var/spawn_fast = 0
-
-/obj/effect/rend/New(loc, var/spawn_type, var/spawn_amt, var/desc, var/spawn_fast)
- src.spawn_path = spawn_type
- src.spawn_amt_left = spawn_amt
- src.desc = desc
- src.spawn_fast = spawn_fast
- START_PROCESSING(SSobj, src)
- return
-
-/obj/effect/rend/process()
- if(!spawn_fast)
- if(locate(/mob) in loc)
- return
- new spawn_path(loc)
- spawn_amt_left--
- if(spawn_amt_left <= 0)
- qdel(src)
-
-/obj/effect/rend/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/nullrod))
- user.visible_message("[user] seals \the [src] with \the [I].")
- qdel(src)
- return
- else
- return ..()
-
-/obj/item/weapon/veilrender/vealrender
- name = "veal render"
- desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast farm."
- spawn_type = /mob/living/simple_animal/cow
- spawn_amt = 20
- activate_descriptor = "hunger"
- rend_desc = "Reverberates with the sound of ten thousand moos."
-
-/obj/item/weapon/veilrender/honkrender
- name = "honk render"
- desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast circus."
- spawn_type = /mob/living/simple_animal/hostile/retaliate/clown
- spawn_amt = 10
- activate_descriptor = "depression"
- rend_desc = "Gently wafting with the sounds of endless laughter."
- icon_state = "clownrender"
-
-////TEAR IN REALITY
-
-/obj/singularity/wizard
- name = "tear in the fabric of reality"
- desc = "This isn't right."
- icon = 'icons/effects/224x224.dmi'
- icon_state = "reality"
- pixel_x = -96
- pixel_y = -96
- grav_pull = 6
- consume_range = 3
- current_size = STAGE_FOUR
- allowed_size = STAGE_FOUR
-
-/obj/singularity/wizard/process()
- move()
- eat()
- return
-/////////////////////////////////////////Scrying///////////////////
-
-/obj/item/weapon/scrying
- name = "scrying orb"
- desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means."
- icon = 'icons/obj/projectiles.dmi'
- icon_state ="bluespace"
- throw_speed = 3
- throw_range = 7
- throwforce = 15
- damtype = BURN
- force = 15
- hitsound = 'sound/items/welder2.ogg'
-
-/obj/item/weapon/scrying/attack_self(mob/user)
- to_chat(user, "You can see...everything!")
- visible_message("[user] stares into [src], their eyes glazing over.")
- user.ghostize(1)
- return
-
-/////////////////////////////////////////Necromantic Stone///////////////////
-
-/obj/item/device/necromantic_stone
- name = "necromantic stone"
- desc = "A shard capable of resurrecting humans as skeleton thralls."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "necrostone"
- item_state = "electronic"
- origin_tech = "bluespace=4;materials=4"
- w_class = WEIGHT_CLASS_TINY
- var/list/spooky_scaries = list()
- var/unlimited = 0
-
-/obj/item/device/necromantic_stone/unlimited
- unlimited = 1
-
-/obj/item/device/necromantic_stone/attack(mob/living/carbon/human/M, mob/living/carbon/human/user)
- if(!istype(M))
- return ..()
-
- if(!istype(user) || !user.canUseTopic(M,1))
- return
-
- if(M.stat != DEAD)
- to_chat(user, "This artifact can only affect the dead!")
- return
-
- if(!M.mind || !M.client)
- to_chat(user, "There is no soul connected to this body...")
- return
-
- check_spooky()//clean out/refresh the list
- if(spooky_scaries.len >= 3 && !unlimited)
- to_chat(user, "This artifact can only affect three undead at a time!")
- return
-
- M.set_species(/datum/species/skeleton, icon_update=0)
- M.revive(full_heal = 1, admin_revive = 1)
- spooky_scaries |= M
- to_chat(M, "You have been revived by [user.real_name]!")
- to_chat(M, "[user.p_they(TRUE)] [user.p_are()] your master now, assist them even if it costs you your new life!")
-
- equip_roman_skeleton(M)
-
- desc = "A shard capable of resurrecting humans as skeleton thralls[unlimited ? "." : ", [spooky_scaries.len]/3 active thralls."]"
-
-/obj/item/device/necromantic_stone/proc/check_spooky()
- if(unlimited) //no point, the list isn't used.
- return
-
- for(var/X in spooky_scaries)
- if(!ishuman(X))
- spooky_scaries.Remove(X)
- continue
- var/mob/living/carbon/human/H = X
- if(H.stat == DEAD)
- spooky_scaries.Remove(X)
- continue
- listclearnulls(spooky_scaries)
-
-//Funny gimmick, skeletons always seem to wear roman/ancient armour
-/obj/item/device/necromantic_stone/proc/equip_roman_skeleton(mob/living/carbon/human/H)
- for(var/obj/item/I in H)
- H.dropItemToGround(I)
-
- var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionaire)
- H.equip_to_slot_or_del(new hat(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/roman(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), slot_shoes)
- H.put_in_hands_or_del(new /obj/item/weapon/shield/riot/roman(H))
- H.put_in_hands_or_del(new /obj/item/weapon/claymore(H))
- H.equip_to_slot_or_del(new /obj/item/weapon/twohanded/spear(H), slot_back)
-
-
-
-/////////////////////Multiverse Blade////////////////////
-
-/obj/item/weapon/multisword
- name = "multiverse sword"
- desc = "A weapon capable of conquering the universe and beyond. Activate it to summon copies of yourself from others dimensions to fight by your side."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "multiverse"
- item_state = "multiverse"
- hitsound = 'sound/weapons/bladeslice.ogg'
- flags = CONDUCT
- slot_flags = SLOT_BELT
- sharpness = IS_SHARP
- force = 20
- throwforce = 10
- w_class = WEIGHT_CLASS_NORMAL
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- var/faction = list("unassigned")
- var/cooldown = 0
- var/assigned = "unassigned"
- var/static/list/multiverse = list()
-
-/obj/item/weapon/multisword/New()
- ..()
- multiverse += src
-
-
-/obj/item/weapon/multisword/Destroy()
- multiverse.Remove(src)
- return ..()
-
-/obj/item/weapon/multisword/attack_self(mob/user)
- if(user.mind.special_role == "apprentice")
- to_chat(user, "You know better than to touch your teacher's stuff.")
- return
- if(cooldown < world.time)
- var/faction_check = 0
- for(var/F in faction)
- if(F in user.faction)
- faction_check = 1
- break
- if(faction_check == 0)
- faction = list("[user.real_name]")
- assigned = "[user.real_name]"
- user.faction = list("[user.real_name]")
- to_chat(user, "You bind the sword to yourself. You can now use it to summon help.")
- if(!is_gangster(user))
- var/datum/gang/multiverse/G = new(src, "[user.real_name]")
- SSticker.mode.gangs += G
- G.bosses += user.mind
- G.add_gang_hud(user.mind)
- user.mind.gang_datum = G
- to_chat(user, "With your new found power you could easily conquer the station!")
- var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone
- hijack_objective.owner = user.mind
- user.mind.objectives += hijack_objective
- hijack_objective.explanation_text = "Ensure only [user.real_name] and their copies are on the shuttle!"
- to_chat(user, "Objective #[1]: [hijack_objective.explanation_text]")
- SSticker.mode.traitors += user.mind
- user.mind.special_role = "[user.real_name] Prime"
- else
- var/list/candidates = get_candidates(ROLE_WIZARD)
- if(candidates.len)
- var/client/C = pick(candidates)
- spawn_copy(C, get_turf(user.loc), user)
- to_chat(user, "The sword flashes, and you find yourself face to face with...you!")
- cooldown = world.time + 400
- for(var/obj/item/weapon/multisword/M in multiverse)
- if(M.assigned == assigned)
- M.cooldown = cooldown
-
- else
- to_chat(user, "You fail to summon any copies of yourself. Perhaps you should try again in a bit.")
- else
- to_chat(user, "[src] is recharging! Keep in mind it shares a cooldown with the swords wielded by your copies.")
-
-
-/obj/item/weapon/multisword/proc/spawn_copy(var/client/C, var/turf/T, mob/user)
- var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
- C.prefs.copy_to(M, icon_updates=0)
- M.key = C.key
- M.mind.name = user.real_name
- to_chat(M, "You are an alternate version of [user.real_name] from another universe! Help them accomplish their goals at all costs.")
- SSticker.mode.add_gangster(M.mind, user.mind.gang_datum, FALSE)
- M.real_name = user.real_name
- M.name = user.real_name
- M.faction = list("[user.real_name]")
- if(prob(50))
- var/list/all_species = list()
- for(var/speciestype in subtypesof(/datum/species))
- var/datum/species/S = speciestype
- if(!initial(S.dangerous_existence))
- all_species += speciestype
- M.set_species(pick(all_species), icon_update=0)
- M.update_body()
- M.update_hair()
- M.update_body_parts()
- M.dna.update_dna_identity()
- equip_copy(M)
-
-/obj/item/weapon/multisword/proc/equip_copy(var/mob/living/carbon/human/M)
-
- var/obj/item/weapon/multisword/sword = new /obj/item/weapon/multisword
- sword.assigned = assigned
- sword.faction = list("[assigned]")
-
- var/randomize = pick("mobster","roman","wizard","cyborg","syndicate","assistant", "animu", "cultist", "highlander", "clown", "killer", "pirate", "soviet", "officer", "gladiator")
-
- switch(randomize)
- if("mobster")
- M.equip_to_slot_or_del(new /obj/item/clothing/head/fedora(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/really_black(M), slot_w_uniform)
- M.put_in_hands_or_del(sword)
-
- if("roman")
- var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionaire)
- M.equip_to_slot_or_del(new hat(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/roman(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(M), slot_shoes)
- M.put_in_hands_or_del(new /obj/item/weapon/shield/riot/roman(M))
- M.put_in_hands_or_del(sword)
-
- if("wizard")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(M), slot_head)
- M.put_in_hands_or_del(sword)
- if("cyborg")
- for(var/X in M.bodyparts)
- var/obj/item/bodypart/affecting = X
- affecting.change_bodypart_status(BODYPART_ROBOTIC, FALSE, TRUE)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
- M.put_in_hands_or_del(sword)
-
- if("syndicate")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/swat(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M),slot_wear_mask)
- M.put_in_hands_or_del(sword)
-
- if("assistant")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes)
- M.put_in_hands_or_del(sword)
-
- if("animu")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/kitty(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/schoolgirl/red(M), slot_w_uniform)
- M.put_in_hands_or_del(sword)
-
- if("cultist")
- M.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
- M.put_in_hands_or_del(sword)
-
- if("highlander")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/beret(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.put_in_hands_or_del(sword)
-
- if("clown")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_l_store)
- M.put_in_hands_or_del(sword)
-
- if("killer")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/white(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store)
- M.put_in_hands_or_del(sword)
- for(var/obj/item/carried_item in M.get_equipped_items())
- carried_item.add_mob_blood(M)
- for(var/obj/item/I in M.held_items)
- I.add_mob_blood(M)
- if("pirate")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/brown(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
- M.put_in_hands_or_del(sword)
-
- if("soviet")
- M.equip_to_slot_or_del(new /obj/item/clothing/head/pirate/captain(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/pirate/captain(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- M.put_in_hands_or_del(sword)
-
- if("officer")
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/beret(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/havana(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/jacket/miljacket(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
- M.put_in_hands_or_del(sword)
-
- if("gladiator")
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/gladiator(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/gladiator(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
- M.put_in_hands_or_del(sword)
-
-
- else
- return
-
- M.update_body_parts()
-
- var/obj/item/weapon/card/id/W = new /obj/item/weapon/card/id
- W.icon_state = "centcom"
- W.access += GLOB.access_maint_tunnels
- W.assignment = "Multiverse Traveller"
- W.registered_name = M.real_name
- W.update_label(M.real_name)
- M.equip_to_slot_or_del(W, slot_wear_id)
-
-
-/obj/item/voodoo
- name = "wicker doll"
- desc = "Something creepy about it."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "voodoo"
- item_state = "electronic"
- var/mob/living/carbon/human/target = null
- var/list/mob/living/carbon/human/possible = list()
- var/obj/item/link = null
- var/cooldown_time = 30 //3s
- var/cooldown = 0
- obj_integrity = 10
- max_integrity = 10
- resistance_flags = FLAMMABLE
-
-/obj/item/voodoo/attackby(obj/item/I, mob/user, params)
- if(target && cooldown < world.time)
- if(I.is_hot())
- to_chat(target, "You suddenly feel very hot")
- target.bodytemperature += 50
- GiveHint(target)
- else if(is_pointed(I))
- to_chat(target, "You feel a stabbing pain in [parse_zone(user.zone_selected)]!")
- target.Weaken(2)
- GiveHint(target)
- else if(istype(I,/obj/item/weapon/bikehorn))
- to_chat(target, "HONK")
- target << 'sound/items/AirHorn.ogg'
+
+//Apprenticeship contract - moved to antag_spawner.dm
+
+///////////////////////////Veil Render//////////////////////
+
+/obj/item/weapon/veilrender
+ name = "veil render"
+ desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast city."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "render"
+ item_state = "render"
+ force = 15
+ throwforce = 10
+ w_class = WEIGHT_CLASS_NORMAL
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ var/charges = 1
+ var/spawn_type = /obj/singularity/wizard
+ var/spawn_amt = 1
+ var/activate_descriptor = "reality"
+ var/rend_desc = "You should run now."
+ var/spawn_fast = 0 //if 1, ignores checking for mobs on loc before spawning
+
+/obj/item/weapon/veilrender/attack_self(mob/user)
+ if(charges > 0)
+ new /obj/effect/rend(get_turf(user), spawn_type, spawn_amt, rend_desc, spawn_fast)
+ charges--
+ user.visible_message("[src] hums with power as [user] deals a blow to [activate_descriptor] itself!")
+ else
+ to_chat(user, "The unearthly energies that powered the blade are now dormant.")
+
+/obj/effect/rend
+ name = "tear in the fabric of reality"
+ desc = "You should run now."
+ icon = 'icons/obj/biomass.dmi'
+ icon_state = "rift"
+ density = 1
+ anchored = 1
+ var/spawn_path = /mob/living/simple_animal/cow //defaulty cows to prevent unintentional narsies
+ var/spawn_amt_left = 20
+ var/spawn_fast = 0
+
+/obj/effect/rend/New(loc, var/spawn_type, var/spawn_amt, var/desc, var/spawn_fast)
+ src.spawn_path = spawn_type
+ src.spawn_amt_left = spawn_amt
+ src.desc = desc
+ src.spawn_fast = spawn_fast
+ START_PROCESSING(SSobj, src)
+ return
+
+/obj/effect/rend/process()
+ if(!spawn_fast)
+ if(locate(/mob) in loc)
+ return
+ new spawn_path(loc)
+ spawn_amt_left--
+ if(spawn_amt_left <= 0)
+ qdel(src)
+
+/obj/effect/rend/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/nullrod))
+ user.visible_message("[user] seals \the [src] with \the [I].")
+ qdel(src)
+ return
+ else
+ return ..()
+
+/obj/item/weapon/veilrender/vealrender
+ name = "veal render"
+ desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast farm."
+ spawn_type = /mob/living/simple_animal/cow
+ spawn_amt = 20
+ activate_descriptor = "hunger"
+ rend_desc = "Reverberates with the sound of ten thousand moos."
+
+/obj/item/weapon/veilrender/honkrender
+ name = "honk render"
+ desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast circus."
+ spawn_type = /mob/living/simple_animal/hostile/retaliate/clown
+ spawn_amt = 10
+ activate_descriptor = "depression"
+ rend_desc = "Gently wafting with the sounds of endless laughter."
+ icon_state = "clownrender"
+
+////TEAR IN REALITY
+
+/obj/singularity/wizard
+ name = "tear in the fabric of reality"
+ desc = "This isn't right."
+ icon = 'icons/effects/224x224.dmi'
+ icon_state = "reality"
+ pixel_x = -96
+ pixel_y = -96
+ grav_pull = 6
+ consume_range = 3
+ current_size = STAGE_FOUR
+ allowed_size = STAGE_FOUR
+
+/obj/singularity/wizard/process()
+ move()
+ eat()
+ return
+/////////////////////////////////////////Scrying///////////////////
+
+/obj/item/weapon/scrying
+ name = "scrying orb"
+ desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means."
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state ="bluespace"
+ throw_speed = 3
+ throw_range = 7
+ throwforce = 15
+ damtype = BURN
+ force = 15
+ hitsound = 'sound/items/welder2.ogg'
+
+/obj/item/weapon/scrying/attack_self(mob/user)
+ to_chat(user, "You can see...everything!")
+ visible_message("[user] stares into [src], their eyes glazing over.")
+ user.ghostize(1)
+ return
+
+/////////////////////////////////////////Necromantic Stone///////////////////
+
+/obj/item/device/necromantic_stone
+ name = "necromantic stone"
+ desc = "A shard capable of resurrecting humans as skeleton thralls."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "necrostone"
+ item_state = "electronic"
+ origin_tech = "bluespace=4;materials=4"
+ w_class = WEIGHT_CLASS_TINY
+ var/list/spooky_scaries = list()
+ var/unlimited = 0
+
+/obj/item/device/necromantic_stone/unlimited
+ unlimited = 1
+
+/obj/item/device/necromantic_stone/attack(mob/living/carbon/human/M, mob/living/carbon/human/user)
+ if(!istype(M))
+ return ..()
+
+ if(!istype(user) || !user.canUseTopic(M,1))
+ return
+
+ if(M.stat != DEAD)
+ to_chat(user, "This artifact can only affect the dead!")
+ return
+
+ if(!M.mind || !M.client)
+ to_chat(user, "There is no soul connected to this body...")
+ return
+
+ check_spooky()//clean out/refresh the list
+ if(spooky_scaries.len >= 3 && !unlimited)
+ to_chat(user, "This artifact can only affect three undead at a time!")
+ return
+
+ M.set_species(/datum/species/skeleton, icon_update=0)
+ M.revive(full_heal = 1, admin_revive = 1)
+ spooky_scaries |= M
+ to_chat(M, "You have been revived by [user.real_name]!")
+ to_chat(M, "[user.p_they(TRUE)] [user.p_are()] your master now, assist them even if it costs you your new life!")
+
+ equip_roman_skeleton(M)
+
+ desc = "A shard capable of resurrecting humans as skeleton thralls[unlimited ? "." : ", [spooky_scaries.len]/3 active thralls."]"
+
+/obj/item/device/necromantic_stone/proc/check_spooky()
+ if(unlimited) //no point, the list isn't used.
+ return
+
+ for(var/X in spooky_scaries)
+ if(!ishuman(X))
+ spooky_scaries.Remove(X)
+ continue
+ var/mob/living/carbon/human/H = X
+ if(H.stat == DEAD)
+ spooky_scaries.Remove(X)
+ continue
+ listclearnulls(spooky_scaries)
+
+//Funny gimmick, skeletons always seem to wear roman/ancient armour
+/obj/item/device/necromantic_stone/proc/equip_roman_skeleton(mob/living/carbon/human/H)
+ for(var/obj/item/I in H)
+ H.dropItemToGround(I)
+
+ var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionaire)
+ H.equip_to_slot_or_del(new hat(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/roman(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), slot_shoes)
+ H.put_in_hands_or_del(new /obj/item/weapon/shield/riot/roman(H))
+ H.put_in_hands_or_del(new /obj/item/weapon/claymore(H))
+ H.equip_to_slot_or_del(new /obj/item/weapon/twohanded/spear(H), slot_back)
+
+
+
+/////////////////////Multiverse Blade////////////////////
+
+/obj/item/weapon/multisword
+ name = "multiverse sword"
+ desc = "A weapon capable of conquering the universe and beyond. Activate it to summon copies of yourself from others dimensions to fight by your side."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "multiverse"
+ item_state = "multiverse"
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ sharpness = IS_SHARP
+ force = 20
+ throwforce = 10
+ w_class = WEIGHT_CLASS_NORMAL
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ var/faction = list("unassigned")
+ var/cooldown = 0
+ var/assigned = "unassigned"
+ var/static/list/multiverse = list()
+
+/obj/item/weapon/multisword/New()
+ ..()
+ multiverse += src
+
+
+/obj/item/weapon/multisword/Destroy()
+ multiverse.Remove(src)
+ return ..()
+
+/obj/item/weapon/multisword/attack_self(mob/user)
+ if(user.mind.special_role == "apprentice")
+ to_chat(user, "You know better than to touch your teacher's stuff.")
+ return
+ if(cooldown < world.time)
+ var/faction_check = 0
+ for(var/F in faction)
+ if(F in user.faction)
+ faction_check = 1
+ break
+ if(faction_check == 0)
+ faction = list("[user.real_name]")
+ assigned = "[user.real_name]"
+ user.faction = list("[user.real_name]")
+ to_chat(user, "You bind the sword to yourself. You can now use it to summon help.")
+ if(!is_gangster(user))
+ var/datum/gang/multiverse/G = new(src, "[user.real_name]")
+ SSticker.mode.gangs += G
+ G.bosses += user.mind
+ G.add_gang_hud(user.mind)
+ user.mind.gang_datum = G
+ to_chat(user, "With your new found power you could easily conquer the station!")
+ var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone
+ hijack_objective.owner = user.mind
+ user.mind.objectives += hijack_objective
+ hijack_objective.explanation_text = "Ensure only [user.real_name] and their copies are on the shuttle!"
+ to_chat(user, "Objective #[1]: [hijack_objective.explanation_text]")
+ SSticker.mode.traitors += user.mind
+ user.mind.special_role = "[user.real_name] Prime"
+ else
+ var/list/candidates = get_candidates(ROLE_WIZARD)
+ if(candidates.len)
+ var/client/C = pick(candidates)
+ spawn_copy(C, get_turf(user.loc), user)
+ to_chat(user, "The sword flashes, and you find yourself face to face with...you!")
+ cooldown = world.time + 400
+ for(var/obj/item/weapon/multisword/M in multiverse)
+ if(M.assigned == assigned)
+ M.cooldown = cooldown
+
+ else
+ to_chat(user, "You fail to summon any copies of yourself. Perhaps you should try again in a bit.")
+ else
+ to_chat(user, "[src] is recharging! Keep in mind it shares a cooldown with the swords wielded by your copies.")
+
+
+/obj/item/weapon/multisword/proc/spawn_copy(var/client/C, var/turf/T, mob/user)
+ var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
+ C.prefs.copy_to(M, icon_updates=0)
+ M.key = C.key
+ M.mind.name = user.real_name
+ to_chat(M, "You are an alternate version of [user.real_name] from another universe! Help them accomplish their goals at all costs.")
+ SSticker.mode.add_gangster(M.mind, user.mind.gang_datum, FALSE)
+ M.real_name = user.real_name
+ M.name = user.real_name
+ M.faction = list("[user.real_name]")
+ if(prob(50))
+ var/list/all_species = list()
+ for(var/speciestype in subtypesof(/datum/species))
+ var/datum/species/S = speciestype
+ if(!initial(S.dangerous_existence))
+ all_species += speciestype
+ M.set_species(pick(all_species), icon_update=0)
+ M.update_body()
+ M.update_hair()
+ M.update_body_parts()
+ M.dna.update_dna_identity()
+ equip_copy(M)
+
+/obj/item/weapon/multisword/proc/equip_copy(var/mob/living/carbon/human/M)
+
+ var/obj/item/weapon/multisword/sword = new /obj/item/weapon/multisword
+ sword.assigned = assigned
+ sword.faction = list("[assigned]")
+
+ var/randomize = pick("mobster","roman","wizard","cyborg","syndicate","assistant", "animu", "cultist", "highlander", "clown", "killer", "pirate", "soviet", "officer", "gladiator")
+
+ switch(randomize)
+ if("mobster")
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/fedora(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/really_black(M), slot_w_uniform)
+ M.put_in_hands_or_del(sword)
+
+ if("roman")
+ var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionaire)
+ M.equip_to_slot_or_del(new hat(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/roman(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(M), slot_shoes)
+ M.put_in_hands_or_del(new /obj/item/weapon/shield/riot/roman(M))
+ M.put_in_hands_or_del(sword)
+
+ if("wizard")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(M), slot_head)
+ M.put_in_hands_or_del(sword)
+ if("cyborg")
+ for(var/X in M.bodyparts)
+ var/obj/item/bodypart/affecting = X
+ affecting.change_bodypart_status(BODYPART_ROBOTIC, FALSE, TRUE)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
+ M.put_in_hands_or_del(sword)
+
+ if("syndicate")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/swat(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M),slot_wear_mask)
+ M.put_in_hands_or_del(sword)
+
+ if("assistant")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes)
+ M.put_in_hands_or_del(sword)
+
+ if("animu")
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/kitty(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/schoolgirl/red(M), slot_w_uniform)
+ M.put_in_hands_or_del(sword)
+
+ if("cultist")
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
+ M.put_in_hands_or_del(sword)
+
+ if("highlander")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/beret(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
+ M.put_in_hands_or_del(sword)
+
+ if("clown")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_l_store)
+ M.put_in_hands_or_del(sword)
+
+ if("killer")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/white(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store)
+ M.put_in_hands_or_del(sword)
+ for(var/obj/item/carried_item in M.get_equipped_items())
+ carried_item.add_mob_blood(M)
+ for(var/obj/item/I in M.held_items)
+ I.add_mob_blood(M)
+ if("pirate")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/brown(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
+ M.put_in_hands_or_del(sword)
+
+ if("soviet")
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/pirate/captain(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/pirate/captain(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
+ M.put_in_hands_or_del(sword)
+
+ if("officer")
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/beret(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/havana(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/jacket/miljacket(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
+ M.put_in_hands_or_del(sword)
+
+ if("gladiator")
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/gladiator(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/gladiator(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
+ M.put_in_hands_or_del(sword)
+
+
+ else
+ return
+
+ M.update_body_parts()
+
+ var/obj/item/weapon/card/id/W = new /obj/item/weapon/card/id
+ W.icon_state = "centcom"
+ W.access += GLOB.access_maint_tunnels
+ W.assignment = "Multiverse Traveller"
+ W.registered_name = M.real_name
+ W.update_label(M.real_name)
+ M.equip_to_slot_or_del(W, slot_wear_id)
+
+
+/obj/item/voodoo
+ name = "wicker doll"
+ desc = "Something creepy about it."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "voodoo"
+ item_state = "electronic"
+ var/mob/living/carbon/human/target = null
+ var/list/mob/living/carbon/human/possible = list()
+ var/obj/item/link = null
+ var/cooldown_time = 30 //3s
+ var/cooldown = 0
+ obj_integrity = 10
+ max_integrity = 10
+ resistance_flags = FLAMMABLE
+
+/obj/item/voodoo/attackby(obj/item/I, mob/user, params)
+ if(target && cooldown < world.time)
+ if(I.is_hot())
+ to_chat(target, "You suddenly feel very hot")
+ target.bodytemperature += 50
+ GiveHint(target)
+ else if(is_pointed(I))
+ to_chat(target, "You feel a stabbing pain in [parse_zone(user.zone_selected)]!")
+ target.Weaken(2)
+ GiveHint(target)
+ else if(istype(I,/obj/item/weapon/bikehorn))
+ to_chat(target, "HONK")
+ target << 'sound/items/AirHorn.ogg'
target.adjustEarDamage(0,3)
- GiveHint(target)
- cooldown = world.time +cooldown_time
- return
-
- if(!link)
- if(I.loc == user && istype(I) && I.w_class <= WEIGHT_CLASS_SMALL)
- user.drop_item()
- I.loc = src
- link = I
- to_chat(user, "You attach [I] to the doll.")
- update_targets()
-
-/obj/item/voodoo/check_eye(mob/user)
- if(loc != user)
- user.reset_perspective(null)
- user.unset_machine()
-
-/obj/item/voodoo/attack_self(mob/user)
- if(!target && possible.len)
- target = input(user, "Select your victim!", "Voodoo") as null|anything in possible
- return
-
- if(user.zone_selected == "chest")
- if(link)
- target = null
- link.loc = get_turf(src)
- to_chat(user, "You remove the [link] from the doll.")
- link = null
- update_targets()
- return
-
- if(target && cooldown < world.time)
- switch(user.zone_selected)
- if("mouth")
- var/wgw = sanitize(input(user, "What would you like the victim to say", "Voodoo", null) as text)
- target.say(wgw)
- log_game("[user][user.key] made [target][target.key] say [wgw] with a voodoo doll.")
- if("eyes")
- user.set_machine(src)
- user.reset_perspective(target)
- spawn(100)
- user.reset_perspective(null)
- user.unset_machine()
- if("r_leg","l_leg")
- to_chat(user, "You move the doll's legs around.")
- var/turf/T = get_step(target,pick(GLOB.cardinal))
- target.Move(T)
- if("r_arm","l_arm")
- target.click_random_mob()
- GiveHint(target)
- if("head")
- to_chat(user, "You smack the doll's head with your hand.")
- target.Dizzy(10)
- to_chat(target, "You suddenly feel as if your head was hit with a hammer!")
- GiveHint(target,user)
- cooldown = world.time + cooldown_time
-
-/obj/item/voodoo/proc/update_targets()
- possible = list()
- if(!link)
- return
- for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
- if(md5(H.dna.uni_identity) in link.fingerprints)
- possible |= H
-
-/obj/item/voodoo/proc/GiveHint(mob/victim,force=0)
- if(prob(50) || force)
- var/way = dir2text(get_dir(victim,get_turf(src)))
- to_chat(victim, "You feel a dark presence from [way]")
- if(prob(20) || force)
- var/area/A = get_area(src)
- to_chat(victim, "You feel a dark presence from [A.name]")
-
-/obj/item/voodoo/fire_act(exposed_temperature, exposed_volume)
- if(target)
- target.adjust_fire_stacks(20)
- target.IgniteMob()
- GiveHint(target,1)
- return ..()
-
-
-//Provides a decent heal, need to pump every 6 seconds
-/obj/item/organ/heart/cursed/wizard
- pump_delay = 60
- heal_brute = 25
- heal_burn = 25
- heal_oxy = 25
-
-//Warp Whistle: Provides uncontrolled long distance teleportation.
-
-/obj/item/warpwhistle
- name = "warp whistle"
- desc = "One toot on this whistle will send you to a far away land!"
- icon = 'icons/obj/wizard.dmi'
- icon_state = "whistle"
- var/on_cooldown = 0 //0: usable, 1: in use, 2: on cooldown
- var/mob/living/carbon/last_user
-
-/obj/item/warpwhistle/proc/interrupted(mob/living/carbon/user)
- if(!user || QDELETED(src))
- on_cooldown = FALSE
- return TRUE
- return FALSE
-
-/obj/item/warpwhistle/attack_self(mob/living/carbon/user)
- if(!istype(user) || on_cooldown)
- return
- on_cooldown = TRUE
- last_user = user
- var/turf/T = get_turf(user)
- playsound(T,'sound/magic/WarpWhistle.ogg', 200, 1)
- user.canmove = 0
- new /obj/effect/overlay/temp/tornado(T)
- sleep(20)
- if(interrupted(user))
- return
- user.invisibility = INVISIBILITY_MAXIMUM
- user.status_flags |= GODMODE
- sleep(20)
- if(interrupted(user))
- return
- var/breakout = 0
- while(breakout < 50)
- var/turf/potential_T = find_safe_turf()
- if(T.z != potential_T.z || abs(get_dist_euclidian(potential_T,T)) > 50 - breakout)
- user.forceMove(potential_T)
- user.canmove = 0
- T = potential_T
- break
- breakout += 1
- new /obj/effect/overlay/temp/tornado(T)
- sleep(20)
- if(interrupted(user))
- return
- user.invisibility = initial(user.invisibility)
- user.status_flags &= ~GODMODE
- user.canmove = 1
- on_cooldown = 2
- sleep(40)
- on_cooldown = 0
-
-/obj/item/warpwhistle/Destroy()
- if(on_cooldown == 1 && last_user) //Flute got dunked somewhere in the teleport
- last_user.invisibility = initial(last_user.invisibility)
- last_user.status_flags &= ~GODMODE
- last_user.canmove = 1
- return ..()
-
-/obj/effect/overlay/temp/tornado
- icon = 'icons/obj/wizard.dmi'
- icon_state = "tornado"
- name = "tornado"
- desc = "This thing sucks!"
- layer = FLY_LAYER
- randomdir = 0
- duration = 40
- pixel_x = 500
-
-/obj/effect/overlay/temp/tornado/New(loc)
- ..()
- animate(src, pixel_x = -500, time = 40)
+ GiveHint(target)
+ cooldown = world.time +cooldown_time
+ return
+
+ if(!link)
+ if(I.loc == user && istype(I) && I.w_class <= WEIGHT_CLASS_SMALL)
+ user.drop_item()
+ I.loc = src
+ link = I
+ to_chat(user, "You attach [I] to the doll.")
+ update_targets()
+
+/obj/item/voodoo/check_eye(mob/user)
+ if(loc != user)
+ user.reset_perspective(null)
+ user.unset_machine()
+
+/obj/item/voodoo/attack_self(mob/user)
+ if(!target && possible.len)
+ target = input(user, "Select your victim!", "Voodoo") as null|anything in possible
+ return
+
+ if(user.zone_selected == "chest")
+ if(link)
+ target = null
+ link.loc = get_turf(src)
+ to_chat(user, "You remove the [link] from the doll.")
+ link = null
+ update_targets()
+ return
+
+ if(target && cooldown < world.time)
+ switch(user.zone_selected)
+ if("mouth")
+ var/wgw = sanitize(input(user, "What would you like the victim to say", "Voodoo", null) as text)
+ target.say(wgw)
+ log_game("[user][user.key] made [target][target.key] say [wgw] with a voodoo doll.")
+ if("eyes")
+ user.set_machine(src)
+ user.reset_perspective(target)
+ spawn(100)
+ user.reset_perspective(null)
+ user.unset_machine()
+ if("r_leg","l_leg")
+ to_chat(user, "You move the doll's legs around.")
+ var/turf/T = get_step(target,pick(GLOB.cardinal))
+ target.Move(T)
+ if("r_arm","l_arm")
+ target.click_random_mob()
+ GiveHint(target)
+ if("head")
+ to_chat(user, "You smack the doll's head with your hand.")
+ target.Dizzy(10)
+ to_chat(target, "You suddenly feel as if your head was hit with a hammer!")
+ GiveHint(target,user)
+ if("groin")
+ if(target.canbearoused)
+ to_chat(user, "You rub the groin on [src]. You're weird.")
+ target.adjustArousalLoss(5)
+ to_chat(target, "You suddenly feel hot... and quite good")
+ if(prob(33))
+ target.emote(pick("moan","blush"))
+ GiveHint(target, user)
+ cooldown = world.time + cooldown_time
+
+/obj/item/voodoo/proc/update_targets()
+ possible = list()
+ if(!link)
+ return
+ for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
+ if(md5(H.dna.uni_identity) in link.fingerprints)
+ possible |= H
+
+/obj/item/voodoo/proc/GiveHint(mob/victim,force=0)
+ if(prob(50) || force)
+ var/way = dir2text(get_dir(victim,get_turf(src)))
+ to_chat(victim, "You feel a dark presence from [way]")
+ if(prob(20) || force)
+ var/area/A = get_area(src)
+ to_chat(victim, "You feel a dark presence from [A.name]")
+
+/obj/item/voodoo/fire_act(exposed_temperature, exposed_volume)
+ if(target)
+ target.adjust_fire_stacks(20)
+ target.IgniteMob()
+ GiveHint(target,1)
+ return ..()
+
+
+//Provides a decent heal, need to pump every 6 seconds
+/obj/item/organ/heart/cursed/wizard
+ pump_delay = 60
+ heal_brute = 25
+ heal_burn = 25
+ heal_oxy = 25
+
+//Warp Whistle: Provides uncontrolled long distance teleportation.
+
+/obj/item/warpwhistle
+ name = "warp whistle"
+ desc = "One toot on this whistle will send you to a far away land!"
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "whistle"
+ var/on_cooldown = 0 //0: usable, 1: in use, 2: on cooldown
+ var/mob/living/carbon/last_user
+
+/obj/item/warpwhistle/proc/interrupted(mob/living/carbon/user)
+ if(!user || QDELETED(src))
+ on_cooldown = FALSE
+ return TRUE
+ return FALSE
+
+/obj/item/warpwhistle/attack_self(mob/living/carbon/user)
+ if(!istype(user) || on_cooldown)
+ return
+ on_cooldown = TRUE
+ last_user = user
+ var/turf/T = get_turf(user)
+ playsound(T,'sound/magic/WarpWhistle.ogg', 200, 1)
+ user.canmove = 0
+ new /obj/effect/overlay/temp/tornado(T)
+ sleep(20)
+ if(interrupted(user))
+ return
+ user.invisibility = INVISIBILITY_MAXIMUM
+ user.status_flags |= GODMODE
+ sleep(20)
+ if(interrupted(user))
+ return
+ var/breakout = 0
+ while(breakout < 50)
+ var/turf/potential_T = find_safe_turf()
+ if(T.z != potential_T.z || abs(get_dist_euclidian(potential_T,T)) > 50 - breakout)
+ user.forceMove(potential_T)
+ user.canmove = 0
+ T = potential_T
+ break
+ breakout += 1
+ new /obj/effect/overlay/temp/tornado(T)
+ sleep(20)
+ if(interrupted(user))
+ return
+ user.invisibility = initial(user.invisibility)
+ user.status_flags &= ~GODMODE
+ user.canmove = 1
+ on_cooldown = 2
+ sleep(40)
+ on_cooldown = 0
+
+/obj/item/warpwhistle/Destroy()
+ if(on_cooldown == 1 && last_user) //Flute got dunked somewhere in the teleport
+ last_user.invisibility = initial(last_user.invisibility)
+ last_user.status_flags &= ~GODMODE
+ last_user.canmove = 1
+ return ..()
+
+/obj/effect/overlay/temp/tornado
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "tornado"
+ name = "tornado"
+ desc = "This thing sucks!"
+ layer = FLY_LAYER
+ randomdir = 0
+ duration = 40
+ pixel_x = 500
+
+/obj/effect/overlay/temp/tornado/New(loc)
+ ..()
+ animate(src, pixel_x = -500, time = 40)