/datum/game_mode var/list/datum/mind/wizards = list() var/list/datum/mind/apprentices = list() /datum/game_mode/wizard name = "wizard" config_tag = "wizard" antag_flag = ROLE_WIZARD required_players = 20 required_enemies = 1 recommended_enemies = 1 enemy_minimum_age = 14 round_ends_with_antag_death = 1 announce_span = "danger" announce_text = "There is a space wizard attacking the station!\n\ Wizard: Accomplish your objectives and cause mayhem on the station.\n\ Crew: Eliminate the wizard before they can succeed!" var/use_huds = 0 var/finished = 0 /datum/game_mode/wizard/pre_setup() var/datum/mind/wizard = pick(antag_candidates) wizards += wizard modePlayer += wizard wizard.assigned_role = "Wizard" wizard.special_role = "Wizard" if(GLOB.wizardstart.len == 0) to_chat(wizard.current, "A starting location for you could not be found, please report this bug!") return 0 for(var/datum/mind/wiz in wizards) wiz.current.loc = pick(GLOB.wizardstart) return 1 /datum/game_mode/wizard/post_setup() for(var/datum/mind/wizard in wizards) log_game("[wizard.key] (ckey) has been selected as a Wizard") equip_wizard(wizard.current) forge_wizard_objectives(wizard) if(use_huds) update_wiz_icons_added(wizard) greet_wizard(wizard) name_wizard(wizard.current) ..() return /datum/game_mode/proc/forge_wizard_objectives(datum/mind/wizard) switch(rand(1,100)) if(1 to 30) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = wizard kill_objective.find_target() wizard.objectives += kill_objective if (!(locate(/datum/objective/escape) in wizard.objectives)) var/datum/objective/escape/escape_objective = new escape_objective.owner = wizard wizard.objectives += escape_objective if(31 to 60) var/datum/objective/steal/steal_objective = new steal_objective.owner = wizard steal_objective.find_target() wizard.objectives += steal_objective if (!(locate(/datum/objective/escape) in wizard.objectives)) var/datum/objective/escape/escape_objective = new escape_objective.owner = wizard wizard.objectives += escape_objective if(61 to 85) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = wizard kill_objective.find_target() wizard.objectives += kill_objective var/datum/objective/steal/steal_objective = new steal_objective.owner = wizard steal_objective.find_target() wizard.objectives += steal_objective if (!(locate(/datum/objective/survive) in wizard.objectives)) var/datum/objective/survive/survive_objective = new survive_objective.owner = wizard wizard.objectives += survive_objective else if (!(locate(/datum/objective/hijack) in wizard.objectives)) var/datum/objective/hijack/hijack_objective = new hijack_objective.owner = wizard wizard.objectives += hijack_objective return /datum/game_mode/proc/name_wizard(mob/living/carbon/human/wizard_mob) //Allows the wizard to choose a custom name or go with a random one. Spawn 0 so it does not lag the round starting. var/wizard_name_first = pick(GLOB.wizard_first) var/wizard_name_second = pick(GLOB.wizard_second) var/randomname = "[wizard_name_first] [wizard_name_second]" spawn(0) var/newname = copytext(sanitize(input(wizard_mob, "You are the Space Wizard. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN) if (!newname) newname = randomname wizard_mob.real_name = newname wizard_mob.name = newname if(wizard_mob.mind) wizard_mob.mind.name = newname /* Wizards by nature cannot be too young. */ if(wizard_mob.age < WIZARD_AGE_MIN) wizard_mob.age = WIZARD_AGE_MIN return /datum/game_mode/proc/greet_wizard(datum/mind/wizard, you_are=1) if (you_are) to_chat(wizard.current, "You are the Space Wizard!") to_chat(wizard.current, "The Space Wizards Federation has given you the following tasks:") wizard.announce_objectives() return /datum/game_mode/proc/learn_basic_spells(mob/living/carbon/human/wizard_mob) if(!istype(wizard_mob) || !wizard_mob.mind) return 0 wizard_mob.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null)) //Wizards get Magic Missile and Ethereal Jaunt by default wizard_mob.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)) /datum/game_mode/proc/equip_wizard(mob/living/carbon/human/wizard_mob) if (!istype(wizard_mob)) return //So zards properly get their items when they are admin-made. qdel(wizard_mob.wear_suit) qdel(wizard_mob.head) qdel(wizard_mob.shoes) for(var/obj/item/I in wizard_mob.held_items) qdel(I) qdel(wizard_mob.r_store) qdel(wizard_mob.l_store) wizard_mob.set_species(/datum/species/human) wizard_mob.equip_to_slot_or_del(new /obj/item/device/radio/headset(wizard_mob), slot_ears) wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(wizard_mob), slot_w_uniform) wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(wizard_mob), slot_shoes) wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(wizard_mob), slot_wear_suit) wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(wizard_mob), slot_head) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(wizard_mob), slot_in_backpack) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(wizard_mob), slot_r_store) var/obj/item/weapon/spellbook/spellbook = new /obj/item/weapon/spellbook(wizard_mob) spellbook.owner = wizard_mob wizard_mob.put_in_hands_or_del(spellbook) to_chat(wizard_mob, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.") to_chat(wizard_mob, "The spellbook is bound to you, and others cannot use it.") to_chat(wizard_mob, "In your pockets you will find a teleport scroll. Use it as needed.") wizard_mob.mind.store_memory("Remember: do not forget to prepare your spells.") return 1 /datum/game_mode/wizard/check_finished() for(var/datum/mind/wizard in wizards) if(isliving(wizard.current) && wizard.current.stat!=DEAD) return ..() if(SSevents.wizardmode) //If summon events was active, turn it off SSevents.toggleWizardmode() SSevents.resetFrequency() return ..() /datum/game_mode/wizard/declare_completion() if(finished) SSticker.mode_result = "loss - wizard killed" to_chat(world, "The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!") SSticker.news_report = WIZARD_KILLED ..() return 1 /datum/game_mode/proc/auto_declare_completion_wizard() if(wizards.len) var/text = "
the wizards/witches were:" for(var/datum/mind/wizard in wizards) text += "
[wizard.key] was [wizard.name] (" if(wizard.current) if(wizard.current.stat == DEAD) text += "died" else text += "survived" if(wizard.current.real_name != wizard.name) text += " as [wizard.current.real_name]" else text += "body destroyed" text += ")" var/count = 1 var/wizardwin = 1 for(var/datum/objective/objective in wizard.objectives) if(objective.check_completion()) text += "
Objective #[count]: [objective.explanation_text] Success!" SSblackbox.add_details("wizard_objective","[objective.type]|SUCCESS") else text += "
Objective #[count]: [objective.explanation_text] Fail." SSblackbox.add_details("wizard_objective","[objective.type]|FAIL") wizardwin = 0 count++ if(wizard.current && wizard.current.stat!=2 && wizardwin) text += "
The wizard was successful!" SSblackbox.add_details("wizard_success","SUCCESS") else text += "
The wizard has failed!" SSblackbox.add_details("wizard_success","FAIL") if(wizard.spell_list.len>0) text += "
[wizard.name] used the following spells: " var/i = 1 for(var/obj/effect/proc_holder/spell/S in wizard.spell_list) text += "[S.name]" if(wizard.spell_list.len > i) text += ", " i++ text += "
" to_chat(world, text) return 1 //OTHER PROCS //To batch-remove wizard spells. Linked to mind.dm. /mob/proc/spellremove(mob/M) if(!mind) return for(var/X in src.mind.spell_list) var/obj/effect/proc_holder/spell/spell_to_remove = X qdel(spell_to_remove) mind.spell_list -= spell_to_remove //returns whether the mob is a wizard (or apprentice) /proc/iswizard(mob/living/M) return istype(M) && M.mind && SSticker && SSticker.mode && ((M.mind in SSticker.mode.wizards) || (M.mind in SSticker.mode.apprentices)) /datum/game_mode/proc/update_wiz_icons_added(datum/mind/wiz_mind) var/datum/atom_hud/antag/wizhud = GLOB.huds[ANTAG_HUD_WIZ] wizhud.join_hud(wiz_mind.current) set_antag_hud(wiz_mind.current, ((wiz_mind in wizards) ? "wizard" : "apprentice")) /datum/game_mode/proc/update_wiz_icons_removed(datum/mind/wiz_mind) var/datum/atom_hud/antag/wizhud = GLOB.huds[ANTAG_HUD_WIZ] wizhud.leave_hud(wiz_mind.current) set_antag_hud(wiz_mind.current, null)