Files
Paradise/code/game/gamemodes/wizard/artefact.dm
Kyani b1b3eee1dc Adds wizard item: Plague Talisman (#28150)
* first bits

* moving to an item

* progress

* more.... progress?

* it works! now sprites

* sprite + bugfixing

* renaming

* removed spacing

* upgraded to advanced kingstons

* added examine text

* Update code/game/gamemodes/wizard/artefact.dm

Co-authored-by: Sheep <46016730+Scribble-Sheep@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/wizard/artefact.dm

Co-authored-by: Sheep <46016730+Scribble-Sheep@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/wizard/artefact.dm

Co-authored-by: Sheep <46016730+Scribble-Sheep@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/wizard/godhand.dm

Co-authored-by: Sheep <46016730+Scribble-Sheep@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/wizard/spellbook.dm

Co-authored-by: Sheep <46016730+Scribble-Sheep@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/objects/items/weapons/storage/belt.dm

Co-authored-by: Sheep <46016730+Scribble-Sheep@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update zombie_spells.dm

* made the talisman smaller

* this was leftovers. Deleted

* alerts zombies to their disease

* Update code/game/gamemodes/wizard/artefact.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* updated to new attack chain

* I think this will work?...

* maybe this time + bugfix

* Update code/game/gamemodes/wizard/artefact.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/wizard/artefact.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/objects/items/weapons/storage/belt.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/antagonists/zombie/zombie_spells.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/mob/living/carbon/examine.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* fixed some reviews

* new sprite!!!!

* reworkin it

* oops spacing

* more rework. claws dont work no mo

* FINALLY

* fixed indent

* fixed an exploit + comments

* forgot to save this

* beginning rework

* Update wizard_diseases.dm

* Update wizard_diseases.dm

* finished the diseases

* removed unused proc

* removed brainrot

* misc fixes

* adds diseases to blacklist

* fixed the empty box

* silent already exists, bah

* reworked, per contra

* more fixing

* Update code/datums/diseases/wizard_diseases.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/datums/diseases/wizard_diseases.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/datums/diseases/zombie_virus.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/wizard/artefact.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/wizard/artefact.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/antagonists/zombie/zombie_spells.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/antagonists/zombie/zombie_spells.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/wizard/artefact.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/datums/diseases/wizard_diseases.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* small tweaks

* fix + tweak

* rework + revive tweak

* tweaks

* tweaks

* slight tweak

* Apply suggestions from code review

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* review fixes

* Update artefact.dm

* Update code/game/gamemodes/wizard/artefact.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/wizard/artefact.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/datums/diseases/wizard_diseases.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* small tweaks

* lower regen. why was this so high

* linter

* linter

---------

Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>
Co-authored-by: Sheep <46016730+Scribble-Sheep@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
2025-08-06 19:53:27 +00:00

1069 lines
45 KiB
Plaintext

/////////Apprentice Contract//////////
/obj/item/contract
name = "contract"
desc = "A magic contract previously signed by an apprentice. In exchange for instruction in the magical arts, they are bound to answer your call for aid."
icon = 'icons/obj/wizard.dmi'
icon_state ="scroll2"
throw_speed = 1
throw_range = 5
w_class = WEIGHT_CLASS_TINY
var/used = FALSE
/obj/item/contract/ui_state(mob/user)
return GLOB.inventory_state
/obj/item/contract/ui_interact(mob/user, datum/tgui/ui = null)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "WizardApprenticeContract", name)
ui.open()
/obj/item/contract/ui_data(mob/user)
var/list/data = list()
data["used"] = used
return data
/obj/item/contract/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
if(..())
return
if(used)
return
INVOKE_ASYNC(src, PROC_REF(async_find_apprentice), action, ui.user)
SStgui.close_uis(src)
/obj/item/contract/proc/async_find_apprentice(action, user)
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
used = TRUE
var/image/source = image('icons/obj/cardboard_cutout.dmi', "cutout_wizard")
var/list/candidates = SSghost_spawns.poll_candidates("Do you want to play as the wizard apprentice of [H.real_name]?", ROLE_WIZARD, TRUE, source = source)
if(!length(candidates))
used = FALSE
to_chat(H, "<span class='warning'>Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.</span>")
return
new /obj/effect/particle_effect/smoke(get_turf(H))
var/mob/C = pick(candidates)
var/mob/living/carbon/human/M = new /mob/living/carbon/human(get_turf(H))
M.key = C.key
var/datum/antagonist/wizard/apprentice/apprentice = new /datum/antagonist/wizard/apprentice()
apprentice.my_teacher = H
apprentice.class_type = action
M.mind.add_antag_datum(apprentice)
dust_if_respawnable(C)
/obj/item/contract/attack_self__legacy__attackchain(mob/user as mob)
if(..())
return
if(used)
to_chat(user, "<span class='warning'>You've already summoned an apprentice or you are in process of summoning one.</span>")
return
ui_interact(user)
///////////////////////////Veil Render//////////////////////
/obj/item/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
hitsound = 'sound/weapons/bladeslice.ogg'
var/charged = 1
var/spawn_type = /obj/singularity/narsie/wizard
var/spawn_amt = 1
var/activate_descriptor = "reality"
var/rend_desc = "You should run now."
/obj/item/veilrender/attack_self__legacy__attackchain(mob/user as mob)
if(charged)
new /obj/effect/rend(get_turf(user), spawn_type, spawn_amt, rend_desc)
charged = 0
user.visible_message("<span class='userdanger'>[src] hums with power as [user] deals a blow to [activate_descriptor] itself!</span>")
else
to_chat(user, "<span class='danger'>The unearthly energies that powered the blade are now dormant.</span>")
/obj/effect/rend
name = "tear in the fabric of reality"
desc = "You should run now."
icon = 'icons/obj/biomass.dmi'
icon_state = "rift"
density = TRUE
var/spawn_path = /mob/living/basic/cow //defaulty cows to prevent unintentional narsies
var/spawn_amt_left = 20
/obj/effect/rend/New(loc, spawn_type, spawn_amt, desc)
..()
src.spawn_path = spawn_type
src.spawn_amt_left = spawn_amt
src.desc = desc
START_PROCESSING(SSobj, src)
//return
/obj/effect/rend/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/effect/rend/process()
for(var/mob/M in loc)
return
new spawn_path(loc)
spawn_amt_left--
if(spawn_amt_left <= 0)
qdel(src)
/obj/effect/rend/item_interaction(mob/living/user, obj/item/used, list/modifiers)
if(istype(used, /obj/item/nullrod))
user.visible_message("<span class='danger'>[user] seals \the [src] with \the [used].</span>")
qdel(src)
return ITEM_INTERACT_COMPLETE
/obj/effect/rend/singularity_pull()
return
/obj/item/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/basic/cow
spawn_amt = 20
activate_descriptor = "hunger"
rend_desc = "Reverberates with the sound of ten thousand moos."
/obj/item/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/basic/clown
spawn_amt = 10
activate_descriptor = "depression"
rend_desc = "Gently wafting with the sounds of endless laughter."
icon_state = "clownrender"
/obj/item/veilrender/crabrender
name = "crab render"
desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast aquarium."
spawn_type = /mob/living/simple_animal/crab
spawn_amt = 10
activate_descriptor = "sea life"
rend_desc = "Gently wafting with the sounds of endless clacking."
/////////////////////////////////////////Scrying///////////////////
/obj/item/scrying
name = "scrying orb"
desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means. Also works well as a throwing weapon."
icon = 'icons/obj/wizard.dmi'
icon_state ="scrying_orb"
throw_speed = 7
throw_range = 15
throwforce = 25
damtype = BURN
force = 15
hitsound = 'sound/items/welder2.ogg'
var/mob/current_owner
var/mob/dead/observer/ghost // owners ghost when active
/obj/item/scrying/Initialize(mapload)
. = ..()
START_PROCESSING(SSobj, src)
AddComponent(/datum/component/boomerang, throw_range, TRUE)
/obj/item/scrying/Destroy()
STOP_PROCESSING(SSobj, src)
current_owner = null
return ..()
/obj/item/scrying/process()
var/mob/holder = get(loc, /mob)
if(current_owner && current_owner != holder)
to_chat(current_owner, "<span class='notice'>Your otherworldly vision fades...</span>")
REMOVE_TRAIT(current_owner, TRAIT_XRAY_VISION, SCRYING_ORB)
REMOVE_TRAIT(current_owner, TRAIT_NIGHT_VISION, SCRYING_ORB)
current_owner.update_sight()
current_owner.update_icons()
current_owner = null
if(!current_owner && holder)
current_owner = holder
to_chat(current_owner, "<span class='notice'>You can see...everything!</span>")
ADD_TRAIT(current_owner, TRAIT_XRAY_VISION, SCRYING_ORB)
ADD_TRAIT(current_owner, TRAIT_NIGHT_VISION, SCRYING_ORB)
current_owner.update_sight()
current_owner.update_icons()
/obj/item/scrying/attack_self__legacy__attackchain(mob/user as mob)
if(in_use)
return
in_use = TRUE
ADD_TRAIT(user, SCRYING, SCRYING_ORB)
user.visible_message("<span class='notice'>[user] stares into [src], [user.p_their()] eyes glazing over.</span>",
"<span class='danger'>You stare into [src], you can see the entire universe!</span>")
ghost = user.ghostize(TRUE, COLOR_BLUE, "Magic Spirit of [user.name]")
while(!QDELETED(user))
if(user.key || QDELETED(src))
user.visible_message("<span class='notice'>[user] blinks, returning to the world around [user.p_them()].</span>",
"<span class='danger'>You look away from [src].</span>")
break
if(user.get_active_hand() != src)
user.grab_ghost()
user.visible_message("<span class='notice'>[user]'s focus is forced away from [src].</span>",
"<span class='userdanger'>Your vision is ripped away from [src].</span>")
break
sleep(5)
in_use = FALSE
if(QDELETED(user))
return
user.remove_atom_colour(ADMIN_COLOUR_PRIORITY, COLOR_BLUE)
REMOVE_TRAIT(user, SCRYING, SCRYING_ORB)
/obj/item/scrying/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
if(!ishuman(hit_atom) || !throwingdatum || iswizard(hit_atom))
return
var/mob/living/carbon/human/crushee = hit_atom
var/zone = ran_zone(throwingdatum.target_zone) // Base 80% to hit the zone you're aiming for
var/obj/item/organ/external/hit_limb = crushee.get_organ(zone)
if(hit_limb)
hit_limb.fracture()
/////////////////////Multiverse Blade////////////////////
GLOBAL_LIST_EMPTY(multiverse)
/obj/item/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/energy_melee.dmi'
lefthand_file = 'icons/mob/inhands/weapons_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons_righthand.dmi'
icon_state = "energy_katana"
item_state = "energy_katana"
hitsound = 'sound/weapons/bladeslice.ogg'
flags = CONDUCT
slot_flags = ITEM_SLOT_BELT
force = 20
throwforce = 10
sharp = TRUE
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
var/faction = list("unassigned")
var/cooldown = 0
var/cooldown_between_uses = 400 //time in deciseconds between uses--default of 40 seconds.
var/assigned = "unassigned"
var/evil = TRUE
var/probability_evil = 30 //what's the probability this sword will be evil when activated?
var/duplicate_self = 0 //Do we want the species randomized along with equipment should the user be duplicated in their entirety?
var/sword_type = /obj/item/multisword //type of sword to equip.
/obj/item/multisword/New()
..()
GLOB.multiverse |= src
/obj/item/multisword/Destroy()
GLOB.multiverse.Remove(src)
return ..()
/obj/item/multisword/attack__legacy__attackchain(mob/living/M as mob, mob/living/user as mob) //to prevent accidental friendly fire or out and out grief.
if(M.real_name == user.real_name)
to_chat(user, "<span class='warning'>[src] detects benevolent energies in your target and redirects your attack!</span>")
return
..()
/obj/item/multisword/attack_self__legacy__attackchain(mob/user)
if(user.mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE)
to_chat(user, "<span class='warning'>You know better than to touch your teacher's stuff.</span>")
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(!usr.mind.special_role)
if(prob(probability_evil))
to_chat(user, "<span class='warning'><B>With your new found power you could easily conquer the station!</B></span>")
var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone
hijack_objective.explanation_text = "Ensure only [usr.real_name] and [usr.p_their()] copies are on the shuttle!"
usr.mind.add_mind_objective(hijack_objective)
var/list/messages = user.mind.prepare_announce_objectives(FALSE)
to_chat(user, chat_box_red(messages.Join("<br>")))
SSticker.mode.traitors += usr.mind
usr.mind.special_role = "[usr.real_name] Prime"
evil = TRUE
else
to_chat(user, "<span class='warning'><B>With your new found power you could easily defend the station!</B></span>")
var/datum/objective/survive/new_objective = new /datum/objective/survive
new_objective.explanation_text = "Survive, and help defend the innocent from the mobs of multiverse clones."
usr.mind.add_mind_objective(new_objective)
var/list/messages = user.mind.prepare_announce_objectives(FALSE)
to_chat(user, chat_box_red(messages.Join("<br>")))
SSticker.mode.traitors += usr.mind
usr.mind.special_role = "[usr.real_name] Prime"
evil = FALSE
else
cooldown = world.time + cooldown_between_uses
for(var/obj/item/multisword/M in GLOB.multiverse)
if(M.assigned == assigned)
M.cooldown = cooldown
var/image/source = image('icons/obj/cardboard_cutout.dmi', "cutout_wizard")
var/list/candidates = SSghost_spawns.poll_candidates("Do you want to play as the wizard apprentice of [user.real_name]?", ROLE_WIZARD, TRUE, 10 SECONDS, source = source)
if(length(candidates))
var/mob/C = pick(candidates)
spawn_copy(C.client, get_turf(user.loc), user)
to_chat(user, "<span class='warning'><B>The sword flashes, and you find yourself face to face with...you!</B></span>")
dust_if_respawnable(C)
else
to_chat(user, "You fail to summon any copies of yourself. Perhaps you should try again in a bit.")
else
to_chat(user, "<span class='warning'><B>[src] is recharging! Keep in mind it shares a cooldown with the swords wielded by your copies.</span>")
/obj/item/multisword/proc/spawn_copy(client/C, turf/T, mob/user)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
if(duplicate_self)
user.client.prefs.active_character.copy_to(M)
else
C.prefs.active_character.copy_to(M)
M.key = C.key
M.mind.name = user.real_name
to_chat(M, "<B>You are an alternate version of [user.real_name] from another universe! Help [user.p_them()] accomplish [user.p_their()] goals at all costs.</B>")
M.faction = list("[user.real_name]")
if(duplicate_self)
M.set_species(user.dna.species.type) //duplicate the sword user's species.
else
if(prob(50))
var/list/list_all_species = list(/datum/species/human, /datum/species/unathi, /datum/species/skrell, /datum/species/tajaran, /datum/species/kidan, /datum/species/golem, /datum/species/diona, /datum/species/machine, /datum/species/slime, /datum/species/grey, /datum/species/vulpkanin)
M.set_species(pick(list_all_species))
M.real_name = user.real_name //this is clear down here in case the user happens to become a golem; that way they have the proper name.
M.name = user.real_name
if(duplicate_self)
M.dna = user.dna.Clone()
M.UpdateAppearance()
domutcheck(M)
M.update_body()
M.update_hair()
M.update_fhair()
equip_copy(M)
if(evil)
var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone
hijack_objective.explanation_text = "Ensure only [usr.real_name] and [usr.p_their()] copies are on the shuttle!"
M.mind.add_mind_objective(hijack_objective)
var/list/messages = M.mind.prepare_announce_objectives(FALSE)
to_chat(M, chat_box_red(messages.Join("<br>")))
M.mind.special_role = SPECIAL_ROLE_MULTIVERSE
log_game("[M.key] was made a multiverse traveller with the objective to help [usr.real_name] hijack.")
else
var/datum/objective/protect/new_objective = new /datum/objective/protect
new_objective.target = usr.mind
new_objective.explanation_text = "Protect [usr.real_name], your copy, and help [usr.p_them()] defend the innocent from the mobs of multiverse clones."
M.mind.add_mind_objective(new_objective)
var/list/messages = M.mind.prepare_announce_objectives(FALSE)
to_chat(M, chat_box_red(messages.Join("<br>")))
M.mind.special_role = SPECIAL_ROLE_MULTIVERSE
log_game("[M.key] was made a multiverse traveller with the objective to help [usr.real_name] protect the station.")
/obj/item/multisword/proc/equip_copy(mob/living/carbon/human/M)
var/obj/item/multisword/sword = new sword_type
sword.assigned = assigned
sword.faction = list("[assigned]")
sword.evil = evil
if(duplicate_self)
//Duplicates the user's current equipent
var/mob/living/carbon/human/H = usr
var/obj/head = H.get_item_by_slot(ITEM_SLOT_HEAD)
if(head)
M.equip_to_slot_or_del(new head.type(M), ITEM_SLOT_HEAD)
var/obj/mask = H.get_item_by_slot(ITEM_SLOT_MASK)
if(mask)
M.equip_to_slot_or_del(new mask.type(M), ITEM_SLOT_MASK)
var/obj/glasses = H.get_item_by_slot(ITEM_SLOT_EYES)
if(glasses)
M.equip_to_slot_or_del(new glasses.type(M), ITEM_SLOT_EYES)
var/obj/left_ear = H.get_item_by_slot(ITEM_SLOT_LEFT_EAR)
if(left_ear)
M.equip_to_slot_or_del(new left_ear.type(M), ITEM_SLOT_LEFT_EAR)
var/obj/right_ear = H.get_item_by_slot(ITEM_SLOT_RIGHT_EAR)
if(right_ear)
M.equip_to_slot_or_del(new right_ear.type(M), ITEM_SLOT_RIGHT_EAR)
var/obj/uniform = H.get_item_by_slot(ITEM_SLOT_JUMPSUIT)
if(uniform)
M.equip_to_slot_or_del(new uniform.type(M), ITEM_SLOT_JUMPSUIT)
var/obj/suit = H.get_item_by_slot(ITEM_SLOT_OUTER_SUIT)
if(suit)
M.equip_to_slot_or_del(new suit.type(M), ITEM_SLOT_OUTER_SUIT)
var/obj/gloves = H.get_item_by_slot(ITEM_SLOT_GLOVES)
if(gloves)
M.equip_to_slot_or_del(new gloves.type(M), ITEM_SLOT_GLOVES)
var/obj/shoes = H.get_item_by_slot(ITEM_SLOT_SHOES)
if(shoes)
M.equip_to_slot_or_del(new shoes.type(M), ITEM_SLOT_SHOES)
var/obj/belt = H.get_item_by_slot(ITEM_SLOT_BELT)
if(belt)
M.equip_to_slot_or_del(new belt.type(M), ITEM_SLOT_BELT)
var/obj/pda = H.get_item_by_slot(ITEM_SLOT_PDA)
if(pda)
M.equip_to_slot_or_del(new pda.type(M), ITEM_SLOT_PDA)
var/obj/back = H.get_item_by_slot(ITEM_SLOT_BACK)
if(back)
M.equip_to_slot_or_del(new back.type(M), ITEM_SLOT_BACK)
var/obj/suit_storage = H.get_item_by_slot(ITEM_SLOT_SUIT_STORE)
if(suit_storage)
M.equip_to_slot_or_del(new suit_storage.type(M), ITEM_SLOT_SUIT_STORE)
var/obj/left_pocket = H.get_item_by_slot(ITEM_SLOT_LEFT_POCKET)
if(left_pocket)
M.equip_to_slot_or_del(new left_pocket.type(M), ITEM_SLOT_LEFT_POCKET)
var/obj/right_pocket = H.get_item_by_slot(ITEM_SLOT_RIGHT_POCKET)
if(right_pocket)
M.equip_to_slot_or_del(new right_pocket.type(M), ITEM_SLOT_RIGHT_POCKET)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND) //Don't duplicate what's equipped to hands, or else duplicate swords could be generated...or weird cases of factionless swords.
else
if(istajaran(M) || isunathi(M))
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), ITEM_SLOT_SHOES) //If they can't wear shoes, give them a pair of sandals.
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), ITEM_SLOT_HEAD)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(M), ITEM_SLOT_SHOES)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), ITEM_SLOT_GLOVES)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), ITEM_SLOT_LEFT_EAR)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), ITEM_SLOT_EYES)
M.equip_to_slot_or_del(new /obj/item/clothing/under/suit/really_black(M), ITEM_SLOT_JUMPSUIT)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
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), ITEM_SLOT_HEAD)
M.equip_to_slot_or_del(new /obj/item/clothing/under/costume/roman(M), ITEM_SLOT_JUMPSUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(M), ITEM_SLOT_SHOES)
M.equip_to_slot_or_del(new /obj/item/shield/riot/roman(M), ITEM_SLOT_LEFT_HAND)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
if("wizard")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), ITEM_SLOT_JUMPSUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(M), ITEM_SLOT_OUTER_SUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), ITEM_SLOT_SHOES)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), ITEM_SLOT_LEFT_EAR)
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(M), ITEM_SLOT_HEAD)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
if("cyborg")
if(!ismachineperson(M))
for(var/obj/item/organ/O in M.bodyparts)
O.robotize(make_tough = 1)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), ITEM_SLOT_EYES)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
if("syndicate")
M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), ITEM_SLOT_JUMPSUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), ITEM_SLOT_SHOES)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), ITEM_SLOT_GLOVES)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/swat(M), ITEM_SLOT_HEAD)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), ITEM_SLOT_LEFT_EAR)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), ITEM_SLOT_OUTER_SUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M),ITEM_SLOT_MASK)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
if("assistant")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), ITEM_SLOT_JUMPSUIT)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), ITEM_SLOT_LEFT_EAR)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), ITEM_SLOT_SHOES)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
if("animu")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), ITEM_SLOT_SHOES)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), ITEM_SLOT_LEFT_EAR)
M.equip_to_slot_or_del(new /obj/item/clothing/head/kitty(M), ITEM_SLOT_HEAD)
M.equip_to_slot_or_del(new /obj/item/clothing/under/dress/schoolgirl(M), ITEM_SLOT_JUMPSUIT)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
if("cultist")
M.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/cultrobes/alt(M), ITEM_SLOT_OUTER_SUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(M), ITEM_SLOT_SHOES)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), ITEM_SLOT_LEFT_EAR)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
if("highlander")
M.equip_to_slot_or_del(new /obj/item/clothing/under/costume/kilt(M), ITEM_SLOT_JUMPSUIT)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), ITEM_SLOT_LEFT_EAR)
M.equip_to_slot_or_del(new /obj/item/clothing/head/beret(M), ITEM_SLOT_HEAD)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), ITEM_SLOT_SHOES)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
if("clown")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/civilian/clown(M), ITEM_SLOT_JUMPSUIT)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), ITEM_SLOT_LEFT_EAR)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), ITEM_SLOT_SHOES)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), ITEM_SLOT_MASK)
M.equip_to_slot_or_del(new /obj/item/bikehorn(M), ITEM_SLOT_LEFT_POCKET)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
if("killer")
M.equip_to_slot_or_del(new /obj/item/clothing/under/misc/overalls(M), ITEM_SLOT_JUMPSUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), ITEM_SLOT_SHOES)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), ITEM_SLOT_GLOVES)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), ITEM_SLOT_MASK)
M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), ITEM_SLOT_HEAD)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), ITEM_SLOT_LEFT_EAR)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), ITEM_SLOT_OUTER_SUIT)
M.equip_to_slot_or_del(new /obj/item/kitchen/knife(M), ITEM_SLOT_LEFT_POCKET)
M.equip_to_slot_or_del(new /obj/item/scalpel(M), ITEM_SLOT_RIGHT_POCKET)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
for(var/obj/item/carried_item in M.contents)
if(!istype(carried_item, /obj/item/bio_chip))
carried_item.add_mob_blood(M)
if("pirate")
M.equip_to_slot_or_del(new /obj/item/clothing/under/costume/pirate(M), ITEM_SLOT_JUMPSUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), ITEM_SLOT_SHOES)
M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), ITEM_SLOT_HEAD)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), ITEM_SLOT_EYES)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), ITEM_SLOT_LEFT_EAR)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
if("soviet")
M.equip_to_slot_or_del(new /obj/item/clothing/head/sovietofficerhat(M), ITEM_SLOT_HEAD)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), ITEM_SLOT_SHOES)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), ITEM_SLOT_GLOVES)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), ITEM_SLOT_LEFT_EAR)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/sovietcoat(M), ITEM_SLOT_OUTER_SUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/under/new_soviet/sovietofficer(M), ITEM_SLOT_JUMPSUIT)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
if("officer")
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), ITEM_SLOT_HEAD)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), ITEM_SLOT_SHOES)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), ITEM_SLOT_GLOVES)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/havana(M), ITEM_SLOT_MASK)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), ITEM_SLOT_LEFT_EAR)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/jacket/miljacket(M), ITEM_SLOT_OUTER_SUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), ITEM_SLOT_JUMPSUIT)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), ITEM_SLOT_EYES)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
if("gladiator")
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/gladiator(M), ITEM_SLOT_HEAD)
M.equip_to_slot_or_del(new /obj/item/clothing/under/costume/gladiator(M), ITEM_SLOT_JUMPSUIT)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), ITEM_SLOT_LEFT_EAR)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), ITEM_SLOT_SHOES)
M.equip_to_slot_or_del(sword, ITEM_SLOT_RIGHT_HAND)
else
return
var/obj/item/card/id/W = new /obj/item/card/id
if(duplicate_self)
var/duplicated_access = usr.get_item_by_slot(ITEM_SLOT_ID)
if(duplicated_access && istype(duplicated_access, /obj/item/card/id))
var/obj/item/card/id/duplicated_id = duplicated_access
W.access = duplicated_id.access
W.icon_state = duplicated_id.icon_state
else
W.access += ACCESS_MAINT_TUNNELS
W.icon_state = "centcom"
else
W.access += ACCESS_MAINT_TUNNELS
W.icon_state = "centcom"
W.assignment = "Multiverse Traveller"
W.registered_name = M.real_name
W.update_label(M.real_name)
W.SetOwnerInfo(M)
M.equip_to_slot_or_del(W, ITEM_SLOT_ID)
if(isvox(M))
M.dna.species.after_equip_job(null, M) //Nitrogen tanks
if(isplasmaman(M))
M.dna.species.after_equip_job(null, M) //No fireballs from other dimensions.
M.update_icons()
/obj/item/multisword/pure_evil
probability_evil = 100
/// If We are to be used and spent, let it be for a noble purpose.
/obj/item/multisword/pike
name = "phantom pike"
desc = "A fishing pike that appears to be imbued with a peculiar energy."
icon = 'icons/obj/weapons/melee.dmi'
icon_state = "harpoon"
item_state = "harpoon"
cooldown_between_uses = 200 //Half the time
probability_evil = 100
duplicate_self = 1
sword_type = /obj/item/multisword/pike
/////////////////////////////////////////Necromantic Stone///////////////////
/obj/item/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
///List of mobs transformed into skeletons by the stone
var/list/active_skeletons = list()
///How many skeletons can be converted by the stone at a time
var/max_skeletons = 3
///If the stone can convert infinite skeletons, bypassing max_skeletons
var/unlimited = FALSE
///If the stone converts into anime instead of skeletons
var/heresy = FALSE
///how long the additional_thralls_cooldown is
var/above_cap_cooldown = 1 MINUTES
///Cooldown between uses when living skeletons above max skeletons
COOLDOWN_DECLARE(additional_thralls_cooldown)
/obj/item/necromantic_stone/Destroy()
. = ..()
active_skeletons = null
/obj/item/necromantic_stone/examine(mob/user)
. = ..()
var/skele_count = length(active_skeletons)
if(skele_count)
. += "[skele_count] skeleton thrall[skele_count > 1 ? "s have" : " has"] been risen by [src]."
if(unlimited || skele_count < max_skeletons)
return
var/cooldown_time_left = COOLDOWN_TIMELEFT(src, additional_thralls_cooldown)
if(cooldown_time_left)
. += "[src] is being strained by the amount of risen skeletons thralls. It cannot be used to rise another skeleton thrall for <b>[cooldown_time_left / 10] seconds</b>."
/obj/item/necromantic_stone/attack__legacy__attackchain(mob/living/carbon/human/victim, mob/living/carbon/human/necromancer)
if(!istype(victim) || !istype(necromancer))
return ..()
if(victim.stat != DEAD)
to_chat(necromancer, "<span class='warning'>This artifact can only affect the dead!</span>")
return
if((!victim.mind || !victim.client) && !victim.grab_ghost())
to_chat(necromancer, "<span class='warning'>There is no soul connected to this body...</span>")
return
if(victim.mind.has_antag_datum(/datum/antagonist/mindslave/necromancy/plague_zombie))
to_chat(necromancer, "<span class='warning'>This one is already under another artifact's influence!</span>")
return
if(!check_skeletons()) //If above the cap, there is a cooldown on additional skeletons
to_chat(necromancer, "<span class='notice'>The amount of skeleton thralls risen by [src] strains its power.</span>")
if(!COOLDOWN_FINISHED(src, additional_thralls_cooldown))
to_chat(necromancer, "<span class='warning'>[src] cannot rise another thrall for [DisplayTimeText(COOLDOWN_TIMELEFT(src, additional_thralls_cooldown))].</span>")
return
COOLDOWN_START(src, additional_thralls_cooldown, above_cap_cooldown)
convert_victim(victim, necromancer)
///Mindslave and equip the victim
/obj/item/necromantic_stone/proc/convert_victim(mob/living/carbon/human/victim, mob/living/carbon/human/necromancer)
active_skeletons |= victim
var/greet_text = "<span class='userdanger'>You have been revived by <b>[necromancer.real_name]</b>!\n[necromancer.p_theyre(TRUE)] your master now, assist them even if it costs you your new life!</span>"
if(!victim.mind.has_antag_datum(/datum/antagonist/mindslave/necromancy))
victim.mind.add_antag_datum(new /datum/antagonist/mindslave/necromancy(necromancer.mind, greet_text))
if(heresy)
equip_heresy(victim)//oh god why
return
victim.visible_message("<span class='warning'>A massive amount of flesh sloughs off [victim] and a skeleton rises up!</span>")
equip_skeleton(victim)
///Clean the list of active skeletons and check if more can be summoned easily
/obj/item/necromantic_stone/proc/check_skeletons()
. = FALSE
if(unlimited)
return TRUE
listclearnulls(active_skeletons)
var/living_skeletons = 0
for(var/mob/living/carbon/human/skeleton as anything in active_skeletons)
if(!ishuman(skeleton))
active_skeletons.Remove(skeleton)
continue
if(skeleton.stat != DEAD)
living_skeletons++
if(living_skeletons < max_skeletons)
return TRUE
//Funny gimmick, skeletons always seem to wear roman/ancient armour
//Voodoo Zombie Pirates added for paradise
///Udate the mobs species and gear
/obj/item/necromantic_stone/proc/equip_skeleton(mob/living/carbon/human/victim)
victim.set_species(/datum/species/skeleton) // OP skellybones
victim.grab_ghost() // yoinks the ghost if its not in the body
victim.revive()
for(var/obj/item/item in victim)
victim.drop_item_to_ground(item)
var/skeleton_type = pick("roman", "pirate", "yand", "clown")
switch(skeleton_type)
if("roman")
var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionaire)
victim.equip_to_slot_or_del(new hat(victim), ITEM_SLOT_HEAD)
victim.equip_to_slot_or_del(new /obj/item/clothing/under/costume/roman(victim), ITEM_SLOT_JUMPSUIT)
victim.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(victim), ITEM_SLOT_SHOES)
victim.equip_to_slot_or_del(new /obj/item/shield/riot/roman(victim), ITEM_SLOT_LEFT_HAND)
victim.equip_to_slot_or_del(new /obj/item/claymore(victim), ITEM_SLOT_RIGHT_HAND)
victim.equip_to_slot_or_del(new /obj/item/spear(victim), ITEM_SLOT_BACK)
if("pirate")
victim.equip_to_slot_or_del(new /obj/item/clothing/under/costume/pirate(victim), ITEM_SLOT_JUMPSUIT)
victim.equip_to_slot_or_del(new /obj/item/clothing/suit/pirate_brown(victim), ITEM_SLOT_OUTER_SUIT)
victim.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(victim), ITEM_SLOT_HEAD)
victim.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(victim), ITEM_SLOT_SHOES)
victim.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(victim), ITEM_SLOT_EYES)
victim.equip_to_slot_or_del(new /obj/item/claymore(victim), ITEM_SLOT_RIGHT_HAND)
victim.equip_to_slot_or_del(new /obj/item/spear(victim), ITEM_SLOT_BACK)
victim.equip_to_slot_or_del(new /obj/item/shield/riot/roman(victim), ITEM_SLOT_LEFT_HAND)
if("yand")//mine is an evil laugh
victim.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(victim), ITEM_SLOT_SHOES)
victim.equip_to_slot_or_del(new /obj/item/clothing/head/kitty(victim), ITEM_SLOT_HEAD)
victim.equip_to_slot_or_del(new /obj/item/clothing/under/dress/schoolgirl(victim), ITEM_SLOT_JUMPSUIT)
victim.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(victim), ITEM_SLOT_OUTER_SUIT)
victim.equip_to_slot_or_del(new /obj/item/katana(victim), ITEM_SLOT_RIGHT_HAND)
victim.equip_to_slot_or_del(new /obj/item/shield/riot/roman(victim), ITEM_SLOT_LEFT_HAND)
victim.equip_to_slot_or_del(new /obj/item/spear(victim), ITEM_SLOT_BACK)
if("clown")
victim.equip_to_slot_or_del(new /obj/item/clothing/under/rank/civilian/clown(victim), ITEM_SLOT_JUMPSUIT)
victim.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(victim), ITEM_SLOT_SHOES)
victim.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(victim), ITEM_SLOT_MASK)
victim.equip_to_slot_or_del(new /obj/item/clothing/head/stalhelm(victim), ITEM_SLOT_HEAD)
victim.equip_to_slot_or_del(new /obj/item/bikehorn(victim), ITEM_SLOT_LEFT_POCKET)
victim.equip_to_slot_or_del(new /obj/item/claymore(victim), ITEM_SLOT_RIGHT_HAND)
victim.equip_to_slot_or_del(new /obj/item/shield/riot/roman(victim), ITEM_SLOT_LEFT_HAND)
victim.equip_to_slot_or_del(new /obj/item/spear(victim), ITEM_SLOT_BACK)
///Updates the mobs species and gear to anime
/obj/item/necromantic_stone/proc/equip_heresy(mob/living/carbon/human/victim)
victim.set_species(/datum/species/human)
if(victim.gender == MALE)
victim.change_gender(FEMALE)
var/list/anime_hair =list("Odango", "Kusanagi Hair", "Pigtails", "Hime Cut", "Floorlength Braid", "Ombre", "Twincurls", "Twincurls 2")
victim.change_hair(pick(anime_hair))
var/list/anime_hair_colours = list(list(216, 192, 120),
list(140,170,74),list(0,0,0))
var/list/chosen_colour = pick(anime_hair_colours)
victim.change_hair_color(chosen_colour[1], chosen_colour[2], chosen_colour[3])
victim.update_dna()
victim.update_body()
victim.grab_ghost()
victim.revive()
victim.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(victim), ITEM_SLOT_SHOES)
victim.equip_to_slot_or_del(new /obj/item/clothing/head/kitty(victim), ITEM_SLOT_HEAD)
victim.equip_to_slot_or_del(new /obj/item/clothing/under/dress/schoolgirl(victim), ITEM_SLOT_JUMPSUIT)
victim.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(victim), ITEM_SLOT_OUTER_SUIT)
victim.equip_to_slot_or_del(new /obj/item/katana(victim), ITEM_SLOT_RIGHT_HAND)
victim.equip_to_slot_or_del(new /obj/item/shield/riot/roman(victim), ITEM_SLOT_LEFT_HAND)
victim.equip_to_slot_or_del(new /obj/item/spear(victim), ITEM_SLOT_BACK)
if(!victim.real_name || victim.real_name == "unknown")
victim.real_name = "Neko-chan"
else
victim.real_name = "[victim.name]-chan"
victim.mind.assigned_role = SPECIAL_ROLE_WIZARD
victim.mind.special_role = SPECIAL_ROLE_WIZARD
victim.say("NYA!~")
/obj/item/necromantic_stone/unlimited
unlimited = TRUE
/obj/item/necromantic_stone/nya
name = "nya-cromantic stone"
desc = "A shard capable of resurrecting humans as creatures of Vile Heresy. Even the Wizard Federation fears it.."
icon_state = "nyacrostone"
heresy = TRUE
unlimited = TRUE
//////////////////////// plague Talisman //////////////////////////////
/obj/item/plague_talisman
name = "\improper Plague Talisman"
desc = "A vile rune, capable of raising the dead as plague-bearing creatures of destruction. The edges have sharp hooks."
icon = 'icons/obj/wizard.dmi'
icon_state = "plague_talisman"
origin_tech = "bluespace=4;materials=4"
w_class = WEIGHT_CLASS_TINY
new_attack_chain = TRUE
var/chosen_plague
//checks if they're a valid target before trying to raise
/obj/item/plague_talisman/attack(mob/living/carbon/human/victim, mob/living/carbon/human/necromancer)
if(!istype(victim) || !istype(necromancer))
return ..()
if(victim.stat != DEAD)
to_chat(necromancer, "<span class='warning'>This artifact can only affect the dead!</span>")
return
if(ismachineperson(victim))
to_chat(necromancer, "<span class='warning'>This one isn't vulnerable to this form of plague magic.</span>")
return
if((!victim.mind || !victim.client) && !victim.grab_ghost())
to_chat(necromancer, "<span class='warning'>There is no soul connected to this body...</span>")
return
if(victim.mind.has_antag_datum(/datum/antagonist/mindslave/necromancy))
to_chat(necromancer, "<span class='warning'>This one is already under the artifact's influence! Give it time.</span>")
return
raise_victim(victim, necromancer)
//raises the victim into a special zombies and binds them to wiz
/obj/item/plague_talisman/proc/raise_victim(mob/living/carbon/human/victim, mob/living/carbon/human/necromancer)
var/datum/disease/chosen_plague = pick_disease() //what disease to give them
victim.grab_ghost() // to attempt to hold their ghost still while we do our thing
victim.visible_message("<span class='danger'>[necromancer] places a vile rune upon [victim]'s lifeless forehead. The rune adheres to the flesh, and [victim]'s body rots and decays at unnatural speeds, before rising into a horrendous undead creature!</span>")
var/static/list/plague_traits = list(TRAIT_NON_INFECTIOUS_ZOMBIE, TRAIT_PLAGUE_ZOMBIE)
for(var/trait in plague_traits)
ADD_TRAIT(victim, trait, ZOMBIE_TRAIT)
var/datum/disease/zombie/wizard/plague_virus = new /datum/disease/zombie/wizard(chosen_plague, TRUE)
victim.ForceContractDisease(plague_virus)
for(var/datum/disease/V in victim.viruses)
if(istype(V, /datum/disease/zombie))
V.stage = 8 // immediate zombie!
else
V.cure() // lets remove any other annoying viruses
// Wiz and minions shouldnt be able to contract their own diseases
ADD_TRAIT(necromancer, TRAIT_VIRUSIMMUNE, MAGIC_TRAIT)
ADD_TRAIT(victim, TRAIT_VIRUSIMMUNE, MAGIC_TRAIT)
necromancer.add_language("Zombie", TRUE) // make sure necromancer can speak to the bois
playsound(victim, 'sound/magic/mutate.ogg', 50)
addtimer(CALLBACK(src, PROC_REF(finish_convert), victim, necromancer, chosen_plague), 5 SECONDS)
/obj/item/plague_talisman/proc/finish_convert(mob/living/carbon/human/victim, mob/living/carbon/human/necromancer, datum/disease/chosen_plague)
var/greet_text = "<span class='userdanger'>You have been raised into undeath by <b>[necromancer.real_name]</b>!<br> \
[necromancer.p_theyre(TRUE)] your master now, assist [necromancer.p_them()] at all costs, for you are now above death!<br> \
You have been bestowed the following plague: <br> \
[chosen_plague.name]!</span>"
victim.mind.add_antag_datum(new /datum/antagonist/mindslave/necromancy(necromancer.mind, greet_text, chosen_plague))
// Cant very well have your new minions dead for so long. Make em stronk!
victim.maxHealth = 200
victim.health = 200
victim.rejuvenate()
qdel(src) // talismans are single use
//choose what disease this zombie will get
/obj/item/plague_talisman/proc/pick_disease()
var/picked_disease
var/static/list/possible_diseases = list(
/datum/disease/beesease/wizard_variant,
/datum/disease/cold9/wizard_variant,
/datum/disease/fluspanish/wizard_variant,
/datum/disease/kingstons_advanced/wizard_variant,
/datum/disease/dna_retrovirus/wizard_variant,
/datum/disease/tuberculosis/wizard_variant,
/datum/disease/anxiety/wizard_variant,
/datum/disease/wizarditis/wizard_variant,
/datum/disease/berserker,
/datum/disease/appendicitis,
/datum/disease/grut_gut,
/datum/disease/wand_rot,
/datum/disease/mystic_malaise
)
picked_disease = pick(possible_diseases)
return picked_disease
/obj/item/organ/internal/heart/cursed/wizard
max_shocks_allowed = 3
pump_delay = 60
heal_brute = 25
heal_burn = 25
heal_oxy = 25
/obj/item/reagent_containers/drinks/everfull
name = "everfull mug"
desc = "An enchanted mug which can be filled with any of various liquids on command."
icon_state = "evermug"
/obj/item/reagent_containers/drinks/everfull/activate_self(mob/user)
if(..())
return
var/static/list/options = list("Omnizine" = image(icon = 'icons/obj/storage.dmi', icon_state = "firstaid"),
"Ale" = image(icon = 'icons/obj/drinks.dmi', icon_state = "alebottle"),
"Wine" = image(icon = 'icons/obj/drinks.dmi', icon_state = "wineglass"),
"Holy Water" = image(icon = 'icons/obj/drinks.dmi', icon_state = "holyflask"),
"Welder Fuel" = image(icon = 'icons/obj/objects.dmi', icon_state = "fuel"),
"Vomit" = image(icon = 'icons/effects/blood.dmi', icon_state = "vomit_1"))
var/static/list/options_to_reagent = list("Omnizine" = "omnizine",
"Ale" = "ale",
"Wine" = "wine",
"Holy Water" = "holywater",
"Welder Fuel" = "fuel",
"Vomit" = "vomit")
var/static/list/options_to_descriptions = list("Omnizine" = "a strange pink-white liquid",
"Ale" = "foamy amber ale",
"Wine" = "deep red wine",
"Holy Water" = "sparkling clear water",
"Welder Fuel" = "a dark, pungent, oily substance",
"Vomit" = "warm chunky vomit")
var/choice = show_radial_menu(user, src, options, require_near = TRUE)
if(!choice || user.stat || !in_range(user, src) || QDELETED(src))
return
to_chat(user, "<span class='notice'>The [name] fills to brimming with [options_to_descriptions[choice]].</span>")
magic_fill(options_to_reagent[choice])
/obj/item/reagent_containers/drinks/everfull/proc/magic_fill(reagent_choice)
reagents.clear_reagents()
reagents.add_reagent(reagent_choice, volume)
//Oblivion Enforcer clothing (the halberd and gloves are defined elsewhere)
/obj/item/clothing/head/hooded/oblivion
name = "Oblivion Enforcer's hood"
desc = "A hood worn by an Oblivion Enforcer."
icon_state = "oblivionhood"
flags = BLOCKHAIR
flags_inv = HIDEFACE
flags_cover = HEADCOVERSEYES
armor = list(MELEE = 20, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, RAD = INFINITY, FIRE = 5, ACID = 5)
flags_2 = RAD_PROTECT_CONTENTS_2
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
magical = TRUE
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/head.dmi',
"Kidan" = 'icons/mob/clothing/species/kidan/head.dmi',
"Grey" = 'icons/mob/clothing/species/grey/head.dmi',
"Drask" = 'icons/mob/clothing/species/drask/head.dmi',
"Tajaran" = 'icons/mob/clothing/species/tajaran/head.dmi',
"Unathi" = 'icons/mob/clothing/species/unathi/head.dmi',
"Vulpkanin" = 'icons/mob/clothing/species/vulpkanin/head.dmi'
)
/obj/item/clothing/suit/hooded/oblivion
name = "Oblivion Enforcer's robes"
desc = "A set of armored, radiation-proof robes worn by Oblivion Enforcers."
icon_state = "oblivionarmor"
item_state = "oblivionarmor"
body_parts_covered = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
hoodtype = /obj/item/clothing/head/hooded/oblivion
allowed = list(/obj/item/supermatter_halberd, /obj/item/nuke_core/supermatter_sliver)
armor = list(MELEE = 35, BULLET = 20, LASER = 35, ENERGY = 10, BOMB = 15, RAD = INFINITY, FIRE = 5, ACID = 5)
flags_inv = HIDEJUMPSUIT | HIDESHOES | HIDETAIL | HIDESHOES
flags = THICKMATERIAL
flags_2 = RAD_PROTECT_CONTENTS_2
magical = TRUE
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/suit.dmi',
"Kidan" = 'icons/mob/clothing/species/kidan/suit.dmi',
"Grey" = 'icons/mob/clothing/species/grey/suit.dmi',
"Drask" = 'icons/mob/clothing/species/drask/suit.dmi',
"Tajaran" = 'icons/mob/clothing/species/tajaran/suit.dmi',
"Unathi" = 'icons/mob/clothing/species/unathi/suit.dmi',
"Vulpkanin" = 'icons/mob/clothing/species/vulpkanin/suit.dmi'
)
/obj/item/clothing/suit/hooded/oblivion/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_SUPERMATTER_IMMUNE, ROUNDSTART_TRAIT)
/obj/item/clothing/mask/gas/voice_modulator/oblivion
name = "Oblivion Enforcer's mask"
desc = "The mask of an Oblivion Enforcer. Don't forget to turn it on before giving your one-liners!"
icon_state = "oblivionmask"
item_state = "oblivionmask"
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/mask.dmi',
"Kidan" = 'icons/mob/clothing/species/kidan/mask.dmi',
"Grey" = 'icons/mob/clothing/species/grey/mask.dmi',
"Drask" = 'icons/mob/clothing/species/drask/mask.dmi',
"Tajaran" = 'icons/mob/clothing/species/tajaran/mask.dmi',
"Unathi" = 'icons/mob/clothing/species/unathi/mask.dmi',
"Vulpkanin" = 'icons/mob/clothing/species/vulpkanin/mask.dmi'
)
/obj/item/clothing/shoes/white/enforcer
name = "hypernobilium weave shoes"
desc = "They're surprisingly comfortable and designed to fit under an Oblivion Enforcer's robes."
magical = TRUE
/obj/item/clothing/shoes/white/enforcer/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_SUPERMATTER_IMMUNE, ROUNDSTART_TRAIT)
/obj/item/clothing/under/color/white/enforcer
name = "hypernobilium weave jumpsuit"
desc = "A close-fitting, breathable jumpsuit, tailored for the dirty work of an Oblivion Enforcer."
has_sensor = FALSE
magical = TRUE
/obj/item/clothing/under/color/white/enforcer/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_SUPERMATTER_IMMUNE, ROUNDSTART_TRAIT)