mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-25 01:22:58 +00:00
Critters have been added and livestock removed Xbow damage raised to 30 a shot Centcom Survival Kit is once again a box Sec uniforms moved into their own locker After IRC talk Guns that are created in the protolathe now spawn inside of a lockbox They can be unlocked by an ID with Armory access or an Emag. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2045 316c924e-a436-60f5-8080-3fe189b3f50e
874 lines
37 KiB
Plaintext
874 lines
37 KiB
Plaintext
|
|
/datum/game_mode
|
|
var/list/datum/mind/wizards = list()
|
|
|
|
/datum/game_mode/wizard
|
|
name = "wizard"
|
|
config_tag = "wizard"
|
|
required_players = 0
|
|
required_enemies = 1
|
|
|
|
var/finished = 0
|
|
|
|
var/const/prob_int_murder_target = 50 // intercept names the assassination target half the time
|
|
var/const/prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target
|
|
var/const/prob_right_murder_target_h = 50 // upper bound on probability of naimg the right assassination target
|
|
|
|
var/const/prob_int_item = 50 // intercept names the theft target half the time
|
|
var/const/prob_right_item_l = 25 // lower bound on probability of naming right theft target
|
|
var/const/prob_right_item_h = 50 // upper bound on probability of naming the right theft target
|
|
|
|
var/const/prob_int_sab_target = 50 // intercept names the sabotage target half the time
|
|
var/const/prob_right_sab_target_l = 25 // lower bound on probability of naming right sabotage target
|
|
var/const/prob_right_sab_target_h = 50 // upper bound on probability of naming right sabotage target
|
|
|
|
var/const/prob_right_killer_l = 25 //lower bound on probability of naming the right operative
|
|
var/const/prob_right_killer_h = 50 //upper bound on probability of naming the right operative
|
|
var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly
|
|
var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly
|
|
|
|
//apparently BYOND doesn't have enums, so this seems to be the best approximation
|
|
var/const/obj_murder = 1
|
|
var/const/obj_hijack = 2
|
|
var/const/obj_steal = 3
|
|
var/const/obj_sabotage = 4
|
|
|
|
|
|
var/const/laser = 1
|
|
var/const/hand_tele = 2
|
|
var/const/plasma_bomb = 3
|
|
var/const/jetpack = 4
|
|
var/const/captain_card = 5
|
|
var/const/captain_suit = 6
|
|
|
|
var/const/destroy_plasma = 1
|
|
var/const/destroy_ai = 2
|
|
var/const/kill_monkeys = 3
|
|
var/const/cut_power = 4
|
|
|
|
var/const/percentage_plasma_destroy = 70 // what percentage of the plasma tanks you gotta destroy
|
|
var/const/percentage_station_cut_power = 80 // what percentage of the tiles have to have power cut
|
|
var/const/percentage_station_evacuate = 80 // what percentage of people gotta leave
|
|
|
|
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
|
|
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
|
|
|
|
/datum/game_mode/wizard/announce()
|
|
world << "<B>The current game mode is - Wizard!</B>"
|
|
world << "<B>There is a \red SPACE WIZARD\black on the station. You can't let him achieve his objective!</B>"
|
|
|
|
/datum/game_mode/wizard/can_start()//This could be better, will likely have to recode it later
|
|
if(!..())
|
|
return 0
|
|
var/list/datum/mind/possible_wizards = get_players_for_role(BE_WIZARD)
|
|
if(possible_wizards.len==0)
|
|
return 0
|
|
var/datum/mind/wizard = pick(possible_wizards)
|
|
wizards += wizard
|
|
modePlayer += wizard
|
|
wizard.assigned_role = "MODE" //So they aren't chosen for other jobs.
|
|
wizard.special_role = "Wizard"
|
|
wizard.original = wizard.current
|
|
if(wizardstart.len == 0)
|
|
wizard.current << "<B>\red A starting location for you could not be found, please report this bug!</B>"
|
|
return 0
|
|
else
|
|
wizard.current.loc = pick(wizardstart)
|
|
return 1
|
|
|
|
/datum/game_mode/wizard/pre_setup()
|
|
return 1
|
|
|
|
/datum/game_mode/wizard/post_setup()
|
|
for(var/datum/mind/wizard in wizards)
|
|
forge_wizard_objectives(wizard)
|
|
learn_basic_spells(wizard.current)
|
|
equip_wizard(wizard.current)
|
|
name_wizard(wizard.current)
|
|
greet_wizard(wizard)
|
|
|
|
spawn (rand(waittime_l, waittime_h))
|
|
send_intercept()
|
|
..()
|
|
return
|
|
|
|
|
|
/datum/game_mode/proc/forge_wizard_objectives(var/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(wizard_first)
|
|
var/wizard_name_second = pick(wizard_second)
|
|
var/randomname = "[wizard_name_first] [wizard_name_second]"
|
|
spawn(0)
|
|
var/newname = input(wizard_mob, "You are the Space Wizard. Would you like to change your name to something else?", "Name change", randomname) as null|text
|
|
|
|
if (length(newname) == 0)
|
|
newname = randomname
|
|
|
|
if (newname)
|
|
if (length(newname) >= 26)
|
|
newname = copytext(newname, 1, 26)
|
|
newname = dd_replacetext(newname, ">", "'")
|
|
wizard_mob.real_name = newname
|
|
wizard_mob.name = newname
|
|
return
|
|
|
|
/datum/game_mode/proc/greet_wizard(var/datum/mind/wizard, var/you_are=1)
|
|
if (you_are)
|
|
wizard.current << "<B>\red You are the Space Wizard!</B>"
|
|
wizard.current << "<B>The Space Wizards Federation has given you the following tasks:</B>"
|
|
|
|
var/obj_count = 1
|
|
for(var/datum/objective/objective in wizard.objectives)
|
|
wizard.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
|
|
obj_count++
|
|
return
|
|
|
|
|
|
/datum/game_mode/proc/learn_basic_spells(mob/living/carbon/human/wizard_mob)
|
|
if (!istype(wizard_mob))
|
|
return
|
|
if(!config.feature_object_spell_system)
|
|
wizard_mob.verbs += /client/proc/jaunt
|
|
wizard_mob.mind.special_verbs += /client/proc/jaunt
|
|
else
|
|
wizard_mob.spell_list += new /obj/proc_holder/spell/targeted/ethereal_jaunt(usr)
|
|
|
|
/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.
|
|
del(wizard_mob.wear_suit)
|
|
del(wizard_mob.head)
|
|
del(wizard_mob.shoes)
|
|
del(wizard_mob.r_hand)
|
|
del(wizard_mob.r_store)
|
|
del(wizard_mob.l_store)
|
|
|
|
wizard_mob.equip_if_possible(new /obj/item/device/radio/headset(wizard_mob), wizard_mob.slot_ears)
|
|
wizard_mob.equip_if_possible(new /obj/item/clothing/under/lightpurple(wizard_mob), wizard_mob.slot_w_uniform)
|
|
wizard_mob.equip_if_possible(new /obj/item/clothing/shoes/sandal(wizard_mob), wizard_mob.slot_shoes)
|
|
wizard_mob.equip_if_possible(new /obj/item/clothing/suit/wizrobe(wizard_mob), wizard_mob.slot_wear_suit)
|
|
wizard_mob.equip_if_possible(new /obj/item/clothing/head/wizard(wizard_mob), wizard_mob.slot_head)
|
|
wizard_mob.equip_if_possible(new /obj/item/weapon/storage/backpack(wizard_mob), wizard_mob.slot_back)
|
|
wizard_mob.equip_if_possible(new /obj/item/weapon/storage/box(wizard_mob), wizard_mob.slot_in_backpack)
|
|
// wizard_mob.equip_if_possible(new /obj/item/weapon/scrying_gem(wizard_mob), wizard_mob.slot_l_store) For scrying gem.
|
|
wizard_mob.equip_if_possible(new /obj/item/weapon/teleportation_scroll(wizard_mob), wizard_mob.slot_r_store)
|
|
if(config.feature_object_spell_system) //if it's turned on (in config.txt), spawns an object spell spellbook
|
|
wizard_mob.equip_if_possible(new /obj/item/weapon/spellbook/object_type_spells(wizard_mob), wizard_mob.slot_r_hand)
|
|
else
|
|
wizard_mob.equip_if_possible(new /obj/item/weapon/spellbook(wizard_mob), wizard_mob.slot_r_hand)
|
|
|
|
wizard_mob << "You will find a list of available spells in your spell book. Choose your magic arsenal carefully."
|
|
wizard_mob << "In your pockets you will find two more important, magical artifacts. Use them as needed."
|
|
wizard_mob.mind.store_memory("<B>Remember:</B> do not forget to prepare your spells.")
|
|
return 1
|
|
|
|
|
|
/datum/game_mode/wizard/check_finished()
|
|
var/wizards_alive = 0
|
|
for(var/datum/mind/wizard in wizards)
|
|
if(!istype(wizard.current,/mob/living/carbon))
|
|
continue
|
|
if(wizard.current.stat==2)
|
|
continue
|
|
wizards_alive++
|
|
|
|
if (wizards_alive)
|
|
return ..()
|
|
else
|
|
finished = 1
|
|
return 1
|
|
|
|
/datum/game_mode/wizard/declare_completion()
|
|
if(finished)
|
|
world << "\red <FONT size = 3><B> 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!</B></FONT>"
|
|
..()
|
|
return 1
|
|
|
|
/datum/game_mode/proc/auto_declare_completion_wizard()
|
|
for(var/datum/mind/wizard in wizards)
|
|
var/wizard_name
|
|
if(wizard.current)
|
|
if(wizard.current == wizard.original)
|
|
wizard_name = "[wizard.current.real_name] (played by [wizard.key])"
|
|
else if (wizard.original)
|
|
wizard_name = "[wizard.current.real_name] (originally [wizard.original.real_name]) (played by [wizard.key])"
|
|
else
|
|
wizard_name = "[wizard.current.real_name] (original character destroyed) (played by [wizard.key])"
|
|
else
|
|
wizard_name = "[wizard.key] (character destroyed)"
|
|
world << "<B>The wizard was [wizard_name]</B>"
|
|
var/count = 1
|
|
var/wizardwin = 1
|
|
for(var/datum/objective/objective in wizard.objectives)
|
|
if(objective.check_completion())
|
|
world << "<B>Objective #[count]</B>: [objective.explanation_text] \green <B>Success</B>"
|
|
else
|
|
world << "<B>Objective #[count]</B>: [objective.explanation_text] \red Failed"
|
|
wizardwin = 0
|
|
count++
|
|
|
|
if(wizard.current && wizard.current.stat!=2 && wizardwin)
|
|
world << "<B>The wizard was successful!<B>"
|
|
else
|
|
world << "<B>The wizard has failed!<B>"
|
|
return 1
|
|
|
|
//SPELL BOOK PROCS
|
|
|
|
/obj/item/weapon/spellbook/attack_self(mob/user as mob)
|
|
user.machine = src
|
|
var/dat
|
|
if (src.temp)
|
|
dat = "[src.temp]<BR><BR><A href='byond://?src=\ref[src];temp=1'>Clear</A>"
|
|
else
|
|
dat = "<B>The Book of Spells:</B><BR>"
|
|
dat += "Spells left to memorize: [src.uses]<BR>"
|
|
dat += "<HR>"
|
|
dat += "<B>Memorize which spell:</B><BR>"
|
|
dat += "<I>The number after the spell name is the cooldown time.</I><BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_choice=1'>Magic Missile</A> (10)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_choice=2'>Fireball</A> (10)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_choice=3'>Disintegrate</A> (60)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_choice=4'>Disable Technology</A> (60)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_choice=5'>Smoke</A> (10)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_choice=6'>Blind</A> (30)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_choice=7'>Mind Transfer</A> (60)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_choice=8'>Forcewall</A> (10)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_choice=9'>Blink</A> (2)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_choice=10'>Teleport</A> (60)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_choice=11'>Mutate</A> (60)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_choice=12'>Ethereal Jaunt</A> (60)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_choice=13'>Knock</A> (10)<BR>"
|
|
dat += "<HR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_choice=14'>Re-memorize Spells</A><BR>"
|
|
user << browse(dat, "window=radio")
|
|
onclose(user, "radio")
|
|
return
|
|
|
|
/obj/item/weapon/spellbook/Topic(href, href_list)
|
|
..()
|
|
if (usr.stat || usr.restrained())
|
|
return
|
|
var/mob/living/carbon/human/H = usr
|
|
if (!( istype(H, /mob/living/carbon/human)))
|
|
return 1
|
|
if ((usr.contents.Find(src) || (in_range(src,usr) && istype(src.loc, /turf))))
|
|
usr.machine = src
|
|
if(href_list["spell_choice"])
|
|
if(src.uses >= 1 && href_list["spell_choice"] != 14)
|
|
src.uses--
|
|
if(spell_type == "verb")
|
|
switch(href_list["spell_choice"])
|
|
if ("1")
|
|
usr.verbs += /client/proc/magicmissile
|
|
usr.mind.special_verbs += /client/proc/magicmissile
|
|
src.temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage."
|
|
if ("2")
|
|
usr.verbs += /client/proc/fireball
|
|
usr.mind.special_verbs += /client/proc/fireball
|
|
src.temp = "This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you."
|
|
if ("3")
|
|
usr.verbs += /mob/proc/kill
|
|
usr.mind.special_verbs += /mob/proc/kill
|
|
src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown."
|
|
if ("4")
|
|
usr.verbs += /mob/proc/tech
|
|
usr.mind.special_verbs += /mob/proc/tech
|
|
src.temp = "This spell disables all weapons, cameras and most other technology in range."
|
|
if ("5")
|
|
usr.verbs += /client/proc/smokecloud
|
|
usr.mind.special_verbs += /client/proc/smokecloud
|
|
src.temp = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb."
|
|
if ("6")
|
|
usr.verbs += /client/proc/blind
|
|
usr.mind.special_verbs += /client/proc/blind
|
|
src.temp = "This spell temporarly blinds a single person and does not require wizard garb."
|
|
if ("7")
|
|
usr.verbs += /mob/proc/swap
|
|
src.temp = "This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process."
|
|
if ("8")
|
|
usr.verbs += /client/proc/forcewall
|
|
usr.mind.special_verbs += /client/proc/forcewall
|
|
src.temp = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb."
|
|
if ("9")
|
|
usr.verbs += /client/proc/blink
|
|
usr.mind.special_verbs += /client/proc/blink
|
|
src.temp = "This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience."
|
|
if ("10")
|
|
usr.verbs += /mob/proc/teleport
|
|
usr.mind.special_verbs += /mob/proc/teleport
|
|
src.temp = "This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable."
|
|
if ("11")
|
|
usr.verbs += /client/proc/mutate
|
|
usr.mind.special_verbs += /client/proc/mutate
|
|
src.temp = "This spell causes you to turn into a hulk and gain telekinesis for a short while."
|
|
if ("12")
|
|
usr.verbs += /client/proc/jaunt
|
|
usr.mind.special_verbs += /client/proc/jaunt
|
|
src.temp = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls."
|
|
if ("13")
|
|
usr.verbs += /client/proc/knock
|
|
usr.mind.special_verbs += /client/proc/knock
|
|
src.temp = "This spell opens nearby doors and does not require wizard garb."
|
|
else if(spell_type == "object")
|
|
var/list/available_spells = list("Magic Missile","Fireball","Disintegrate","Disable Tech","Smoke","Blind","Mind Transfer","Forcewall","Blink","Teleport","Mutate","Ethereal Jaunt","Knock")
|
|
var/already_knows = 0
|
|
for(var/obj/proc_holder/spell/aspell in usr.spell_list)
|
|
if(available_spells[text2num(href_list["spell_choice"])] == aspell.name)
|
|
already_knows = 1
|
|
src.temp = "You already know that spell."
|
|
src.uses++
|
|
break
|
|
if(!already_knows)
|
|
switch(href_list["spell_choice"])
|
|
if ("1")
|
|
usr.spell_list += new /obj/proc_holder/spell/targeted/projectile/magic_missile(usr)
|
|
src.temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage."
|
|
if ("2")
|
|
usr.spell_list += new /obj/proc_holder/spell/targeted/projectile/fireball(usr)
|
|
src.temp = "This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you."
|
|
if ("3")
|
|
usr.spell_list += new /obj/proc_holder/spell/targeted/inflict_handler/disintegrate(usr)
|
|
src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown."
|
|
if ("4")
|
|
usr.spell_list += new /obj/proc_holder/spell/targeted/emplosion/disable_tech(usr)
|
|
src.temp = "This spell disables all weapons, cameras and most other technology in range."
|
|
if ("5")
|
|
usr.spell_list += new /obj/proc_holder/spell/targeted/smoke(usr)
|
|
src.temp = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb."
|
|
if ("6")
|
|
usr.spell_list += new /obj/proc_holder/spell/targeted/trigger/blind(usr)
|
|
src.temp = "This spell temporarly blinds a single person and does not require wizard garb."
|
|
if ("7")
|
|
usr.spell_list += new /obj/proc_holder/spell/targeted/mind_transfer(usr)
|
|
src.temp = "This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process."
|
|
if ("8")
|
|
usr.spell_list += new /obj/proc_holder/spell/aoe_turf/conjure/forcewall(usr)
|
|
src.temp = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb."
|
|
if ("9")
|
|
usr.spell_list += new /obj/proc_holder/spell/targeted/turf_teleport/blink(usr)
|
|
src.temp = "This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience."
|
|
if ("10")
|
|
usr.spell_list += new /obj/proc_holder/spell/targeted/area_teleport/teleport(usr)
|
|
src.temp = "This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable."
|
|
if ("11")
|
|
usr.spell_list += new /obj/proc_holder/spell/targeted/genetic/mutate(usr)
|
|
src.temp = "This spell causes you to turn into a hulk and gain telekinesis for a short while."
|
|
if ("12")
|
|
usr.spell_list += new /obj/proc_holder/spell/targeted/ethereal_jaunt(usr)
|
|
src.temp = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls."
|
|
if ("13")
|
|
usr.spell_list += new /obj/proc_holder/spell/aoe_turf/knock(usr)
|
|
src.temp = "This spell opens nearby doors and does not require wizard garb."
|
|
if (href_list["spell_choice"] == "14")
|
|
var/area/wizard_station/A = locate()
|
|
if(usr in A.contents)
|
|
src.uses = src.max_uses
|
|
usr.spellremove(usr,spell_type)
|
|
src.temp = "All spells have been removed. You may now memorize a new set of spells."
|
|
else
|
|
src.temp = "You may only re-memorize spells whilst located inside the wizard sanctuary."
|
|
else
|
|
if (href_list["temp"])
|
|
src.temp = null
|
|
if (istype(src.loc, /mob))
|
|
attack_self(src.loc)
|
|
else
|
|
for(var/mob/M in viewers(1, src))
|
|
if (M.client)
|
|
src.attack_self(M)
|
|
return
|
|
|
|
//SWF UPLINK PROCS
|
|
/obj/item/weapon/SWF_uplink/attack_self(mob/user as mob)
|
|
user.machine = src
|
|
var/dat
|
|
if (src.selfdestruct)
|
|
dat = "Self Destructing..."
|
|
else
|
|
if (src.temp)
|
|
dat = "[src.temp]<BR><BR><A href='byond://?src=\ref[src];temp=1'>Clear</A>"
|
|
else
|
|
dat = "<B>Syndicate Uplink Console:</B><BR>"
|
|
dat += "Tele-Crystals left: [src.uses]<BR>"
|
|
dat += "<HR>"
|
|
dat += "<B>Request item:</B><BR>"
|
|
dat += "<I>Each item costs 1 telecrystal. The number afterwards is the cooldown time.</I><BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_magicmissile=1'>Magic Missile</A> (10)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_fireball=1'>Fireball</A> (10)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_disintegrate=1'>Disintegrate</A> (60)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_emp=1'>Disable Technology</A> (60)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_smoke=1'>Smoke</A> (10)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_blind=1'>Blind</A> (30)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_swap=1'>Mind Transfer</A> (60)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_forcewall=1'>Forcewall</A> (10)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_blink=1'>Blink</A> (2)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_teleport=1'>Teleport</A> (60)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_mutate=1'>Mutate</A> (60)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_jaunt=1'>Ethereal Jaunt</A> (60)<BR>"
|
|
dat += "<A href='byond://?src=\ref[src];spell_knock=1'>Knock</A> (10)<BR>"
|
|
dat += "<HR>"
|
|
if (src.origradio)
|
|
dat += "<A href='byond://?src=\ref[src];lock=1'>Lock</A><BR>"
|
|
dat += "<HR>"
|
|
dat += "<A href='byond://?src=\ref[src];selfdestruct=1'>Self-Destruct</A>"
|
|
user << browse(dat, "window=radio")
|
|
onclose(user, "radio")
|
|
return
|
|
|
|
/obj/item/weapon/SWF_uplink/Topic(href, href_list)
|
|
..()
|
|
if (usr.stat || usr.restrained())
|
|
return
|
|
var/mob/living/carbon/human/H = usr
|
|
if (!( istype(H, /mob/living/carbon/human)))
|
|
return 1
|
|
if ((usr.contents.Find(src) || (in_range(src,usr) && istype(src.loc, /turf))))
|
|
usr.machine = src
|
|
if (href_list["spell_magicmissile"])
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/magicmissile
|
|
usr.mind.special_verbs += /client/proc/magicmissile
|
|
src.temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage."
|
|
else if (href_list["spell_fireball"])
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/fireball
|
|
usr.mind.special_verbs += /client/proc/fireball
|
|
src.temp = "This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you."
|
|
else if (href_list["spell_disintegrate"])
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /mob/proc/kill
|
|
usr.mind.special_verbs += /mob/proc/kill
|
|
src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown."
|
|
else if (href_list["spell_emp"])
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /mob/proc/tech
|
|
usr.mind.special_verbs += /mob/proc/tech
|
|
src.temp = "This spell disables all weapons, cameras and most other technology in range."
|
|
else if (href_list["spell_smoke"])
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/smokecloud
|
|
usr.mind.special_verbs += /client/proc/smokecloud
|
|
src.temp = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb."
|
|
else if (href_list["spell_blind"])
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/blind
|
|
usr.mind.special_verbs += /client/proc/blind
|
|
src.temp = "This spell temporarly blinds a single person and does not require wizard garb."
|
|
else if (href_list["spell_swap"])
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /mob/proc/swap
|
|
src.temp = "This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process."
|
|
else if (href_list["spell_forcewall"])
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/forcewall
|
|
usr.mind.special_verbs += /client/proc/forcewall
|
|
src.temp = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb."
|
|
else if (href_list["spell_blink"])
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/blink
|
|
usr.mind.special_verbs += /client/proc/blink
|
|
src.temp = "This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience."
|
|
else if (href_list["spell_teleport"])
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /mob/proc/teleport
|
|
usr.mind.special_verbs += /mob/proc/teleport
|
|
src.temp = "This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable."
|
|
else if (href_list["spell_mutate"])
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/mutate
|
|
usr.mind.special_verbs += /client/proc/mutate
|
|
src.temp = "This spell causes you to turn into a hulk and gain telekinesis for a short while."
|
|
else if (href_list["spell_jaunt"])
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/jaunt
|
|
usr.mind.special_verbs += /client/proc/jaunt
|
|
src.temp = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls."
|
|
else if (href_list["spell_knock"])
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/knock
|
|
usr.mind.special_verbs += /client/proc/knock
|
|
src.temp = "This spell opens nearby doors and does not require wizard garb."
|
|
else if (href_list["lock"] && src.origradio)
|
|
// presto chango, a regular radio again! (reset the freq too...)
|
|
usr.machine = null
|
|
usr << browse(null, "window=radio")
|
|
var/obj/item/device/radio/T = src.origradio
|
|
var/obj/item/weapon/SWF_uplink/R = src
|
|
R.loc = T
|
|
T.loc = usr
|
|
// R.layer = initial(R.layer)
|
|
R.layer = 0
|
|
if (usr.client)
|
|
usr.client.screen -= R
|
|
if (usr.r_hand == R)
|
|
usr.u_equip(R)
|
|
usr.r_hand = T
|
|
else
|
|
usr.u_equip(R)
|
|
usr.l_hand = T
|
|
R.loc = T
|
|
T.layer = 20
|
|
T.set_frequency(initial(T.frequency))
|
|
T.attack_self(usr)
|
|
return
|
|
else if (href_list["selfdestruct"])
|
|
src.temp = "<A href='byond://?src=\ref[src];selfdestruct2=1'>Self-Destruct</A>"
|
|
else if (href_list["selfdestruct2"])
|
|
src.selfdestruct = 1
|
|
spawn (100)
|
|
explode()
|
|
return
|
|
else
|
|
if (href_list["temp"])
|
|
src.temp = null
|
|
if (istype(src.loc, /mob))
|
|
attack_self(src.loc)
|
|
else
|
|
for(var/mob/M in viewers(1, src))
|
|
if (M.client)
|
|
src.attack_self(M)
|
|
return
|
|
|
|
/obj/item/weapon/SWF_uplink/proc/explode()
|
|
var/turf/location = get_turf(src.loc)
|
|
location.hotspot_expose(700, 125)
|
|
|
|
explosion(location, 0, 0, 2, 4)
|
|
|
|
del(src.master)
|
|
del(src)
|
|
return
|
|
|
|
//OTHER PROCS
|
|
|
|
//To batch-remove wizard spells. Linked to mind.dm.
|
|
/mob/proc/spellremove(var/mob/M as mob, var/spell_type = "verb")
|
|
// ..()
|
|
if(spell_type == "verb")
|
|
if(M.verbs.len)
|
|
M.verbs -= /client/proc/jaunt
|
|
M.verbs -= /client/proc/magicmissile
|
|
M.verbs -= /client/proc/fireball
|
|
M.verbs -= /mob/proc/kill
|
|
M.verbs -= /mob/proc/tech
|
|
M.verbs -= /client/proc/smokecloud
|
|
M.verbs -= /client/proc/blind
|
|
M.verbs -= /client/proc/forcewall
|
|
M.verbs -= /mob/proc/teleport
|
|
M.verbs -= /client/proc/mutate
|
|
M.verbs -= /client/proc/knock
|
|
M.verbs -= /mob/proc/swap
|
|
M.verbs -= /client/proc/blink
|
|
if(M.mind && M.mind.special_verbs.len)
|
|
M.mind.special_verbs -= /client/proc/jaunt
|
|
M.mind.special_verbs -= /client/proc/magicmissile
|
|
M.mind.special_verbs -= /client/proc/fireball
|
|
M.mind.special_verbs -= /mob/proc/kill
|
|
M.mind.special_verbs -= /mob/proc/tech
|
|
M.mind.special_verbs -= /client/proc/smokecloud
|
|
M.mind.special_verbs -= /client/proc/blind
|
|
M.mind.special_verbs -= /client/proc/forcewall
|
|
M.mind.special_verbs -= /mob/proc/teleport
|
|
M.mind.special_verbs -= /client/proc/mutate
|
|
M.mind.special_verbs -= /client/proc/knock
|
|
M.mind.special_verbs -= /mob/proc/swap
|
|
M.mind.special_verbs -= /client/proc/blink
|
|
else if(spell_type == "object")
|
|
for(var/obj/proc_holder/spell/spell_to_remove in src.spell_list)
|
|
del(spell_to_remove)
|
|
|
|
/*Checks if the wizard can cast spells.
|
|
Made a proc so this is not repeated 14 (or more) times.*/
|
|
/mob/proc/casting()
|
|
//Removed the stat check because not all spells require clothing now.
|
|
if(!istype(usr:wear_suit, /obj/item/clothing/suit/wizrobe))
|
|
usr << "I don't feel strong enough without my robe."
|
|
return 0
|
|
if(!istype(usr:shoes, /obj/item/clothing/shoes/sandal))
|
|
usr << "I don't feel strong enough without my sandals."
|
|
return 0
|
|
if(!istype(usr:head, /obj/item/clothing/head/wizard))
|
|
usr << "I don't feel strong enough without my hat."
|
|
return 0
|
|
else
|
|
return 1
|
|
|
|
/*Checks if the wizard is a mime and male/female.
|
|
Outputs the appropriate voice if the user is not a mime.
|
|
Made a proc here so it's not repeated several times.*/
|
|
/mob/proc/spellvoice()
|
|
// if(!usr.miming)No longer necessary.
|
|
if(usr.gender=="male")
|
|
playsound(usr.loc, pick('null.ogg','null.ogg'), 100, 1)
|
|
else
|
|
playsound(usr.loc, pick('null.ogg','null.ogg'), 100, 1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//UNUSED/OLD CODE
|
|
|
|
// for (var/obj/landmark/A in world)
|
|
// if (A.name == "Teleport-Scroll")
|
|
// new /obj/item/weapon/teleportation_scroll(A.loc)
|
|
// del(A)
|
|
// continue
|
|
//Scroll now starts in the wizard's inventory.
|
|
|
|
// if (wizard_mob.mind.assigned_role == "Clown")
|
|
// wizard_mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
|
|
// wizard_mob.mutations &= ~CLOWN No more clowns as wizarrrddsss
|
|
|
|
/*Creates random numbers/codes for the uplink.
|
|
var/freq = 1441
|
|
var/list/freqlist = list()
|
|
while (freq <= 1489)
|
|
if (freq < 1451 || freq > 1459)
|
|
freqlist += freq
|
|
freq += 2
|
|
if ((freq % 2) == 0)
|
|
freq += 1
|
|
freq = freqlist[rand(1, freqlist.len)]
|
|
// generate a passcode if the uplink is hidden in a PDA
|
|
var/pda_pass = "[rand(100,999)] [pick("Morgan","Circe","Prospero","Elminister","Raistlin","Tzeentch","Saruman","Khelben","Dumbledor","Gandalf","Houdini","Teferi","Urza","Tenser","Zagyg","Mystryl","Boccob","Merlin")]"
|
|
No longer used because wizards begin with a spell book.*/
|
|
|
|
/*Checks where to spawn the swf uplink.
|
|
var/loc = ""
|
|
var/obj/item/device/R = null //Hide the uplink in a PDA if available, otherwise radio
|
|
if (!R && istype(wizard_mob.belt, /obj/item/device/pda))
|
|
R = wizard_mob.belt
|
|
loc = "on your belt"
|
|
if (!R && istype(wizard_mob.l_hand, /obj/item/weapon/storage))
|
|
var/obj/item/weapon/storage/S = wizard_mob.l_hand
|
|
var/list/L = S.return_inv()
|
|
for (var/obj/item/device/radio/foo in L)
|
|
R = foo
|
|
loc = "in the [S.name] in your left hand"
|
|
break
|
|
if (!R && istype(wizard_mob.r_hand, /obj/item/weapon/storage))
|
|
var/obj/item/weapon/storage/S = wizard_mob.r_hand
|
|
var/list/L = S.return_inv()
|
|
for (var/obj/item/device/radio/foo in L)
|
|
R = foo
|
|
loc = "in the [S.name] in your right hand"
|
|
break
|
|
if (!R && istype(wizard_mob.back, /obj/item/weapon/storage))
|
|
var/obj/item/weapon/storage/S = wizard_mob.back
|
|
var/list/L = S.return_inv()
|
|
for (var/obj/item/device/radio/foo in L)
|
|
R = foo
|
|
loc = "in the [S.name] on your back"
|
|
break
|
|
if (!R && wizard_mob.w_uniform && istype(wizard_mob.belt, /obj/item/device/radio))
|
|
R = wizard_mob.belt
|
|
loc = "on your belt"
|
|
if (!R && istype(wizard_mob.ears, /obj/item/device/radio))
|
|
R = wizard_mob.ears
|
|
loc = "on your head"
|
|
if (!R)
|
|
wizard_mob << "Unfortunately, the Space Wizards Federation wasn't able to get you a radio."
|
|
else
|
|
if (istype(R, /obj/item/device/radio))
|
|
var/obj/item/weapon/SWF_uplink/T = new /obj/item/weapon/SWF_uplink(R)
|
|
R:traitorradio = T
|
|
R:traitor_frequency = freq
|
|
T.name = R.name
|
|
T.icon_state = R.icon_state
|
|
T.origradio = R
|
|
wizard_mob << "The Space Wizards Federation have cunningly disguised a spell book as your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock it's hidden features."
|
|
wizard_mob.mind.store_memory("<B>Radio Freq:</B> [format_frequency(freq)] ([R.name] [loc]).")
|
|
else if (istype(R, /obj/item/device/pda))
|
|
var/obj/item/weapon/integrated_uplink/SWF/T = new /obj/item/weapon/integrated_uplink/SWF(R)
|
|
R:uplink = T
|
|
T.lock_code = pda_pass
|
|
T.hostpda = R
|
|
wizard_mob << "The Space Wizards Federation have cunningly enchanted a spellbook into your PDA [loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features."
|
|
wizard_mob.mind.store_memory("<B>Uplink Passcode:</B> [pda_pass] ([R.name] [loc]).")
|
|
No longer used because wizards begin with a spell book.*/
|
|
|
|
/*Code which works for intergrated uplinks, like those in PDAs.
|
|
/obj/item/weapon/integrated_uplink/SWF
|
|
name = "enchanted uplink"
|
|
uses = 4
|
|
var/temp = null
|
|
|
|
/obj/item/weapon/integrated_uplink/SWF/generate_menu()
|
|
src.menu_message = "<b>Wizarding Uplink Console:</b><br>"
|
|
src.menu_message += "Tele-Crystals left: [src.uses]<BR>"
|
|
src.menu_message += "<HR>"
|
|
|
|
if(src.temp)
|
|
src.menu_message += "[src.temp]<br>"
|
|
else //Nice empty space for it to appear in.
|
|
src.menu_message += "<br>"
|
|
src.menu_message += "<B>Request item:</B><BR>"
|
|
src.menu_message += "<I>Each item costs 1 telecrystal. The number afterwards is the cooldown time.</I><BR>"
|
|
src.menu_message += "<A href='byond://?src=\ref[src];buy_spell=magicmissile'>Magic Missile</A> (10)<BR>"
|
|
src.menu_message += "<A href='byond://?src=\ref[src];buy_spell=fireball'>Fireball</A> (10)<BR>"
|
|
src.menu_message += "<A href='byond://?src=\ref[src];buy_spell=disintegrate'>Disintegrate</A> (60)<BR>"
|
|
src.menu_message += "<A href='byond://?src=\ref[src];buy_spell=emp'>Disable Technology</A> (60)<BR>"
|
|
src.menu_message += "<A href='byond://?src=\ref[src];buy_spell=smoke'>Smoke</A> (10)<BR>"
|
|
src.menu_message += "<A href='byond://?src=\ref[src];buy_spell=blind'>Blind</A> (30)<BR>"
|
|
src.menu_message += "<A href='byond://?src=\ref[src];buy_spell=forcewall'>Forcewall</A> (10)<BR>"
|
|
src.menu_message += "<A href='byond://?src=\ref[src];buy_spell=blink'>Blink</A> (2)<BR>"
|
|
src.menu_message += "<A href='byond://?src=\ref[src];buy_spell=teleport'>Teleport</A> (30)<BR>"
|
|
src.menu_message += "<A href='byond://?src=\ref[src];buy_spell=mutate'>Mutate</A> (60)<BR>"
|
|
src.menu_message += "<A href='byond://?src=\ref[src];buy_spell=jaunt'>Ethereal Jaunt</A> (60)<BR>"
|
|
src.menu_message += "<A href='byond://?src=\ref[src];buy_spell=knock'>Knock</A> (10)<BR>"
|
|
src.menu_message += "<HR>"
|
|
return
|
|
|
|
/obj/item/weapon/integrated_uplink/SWF/Topic(href, href_list)
|
|
if ((isnull(src.hostpda)) || (!src.active))
|
|
return
|
|
|
|
if (usr.stat || usr.restrained() || !in_range(src.hostpda, usr))
|
|
return
|
|
|
|
if (href_list["buy_spell"])
|
|
switch(href_list["buy_spell"])
|
|
if("magicmissile")
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/magicmissile
|
|
src.temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage."
|
|
if("fireball")
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/fireball
|
|
src.temp = "This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you."
|
|
if("disintegrate")
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /mob/proc/kill
|
|
src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown."
|
|
if("emp")
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /mob/proc/tech
|
|
src.temp = "This spell disables all weapons, cameras and most other technology in range."
|
|
if("smoke")
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/smokecloud
|
|
src.temp = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb."
|
|
if("blind")
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/blind
|
|
src.temp = "This spell temporarly blinds a single person and does not require wizard garb."
|
|
if("forcewall")
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/forcewall
|
|
src.temp = "This spell creates an unbreakable wall that lasts for 30 seconds and does not require wizard garb."
|
|
if("blink")
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/blink
|
|
src.temp = "This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience."
|
|
if("teleport")
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /mob/proc/teleport
|
|
src.temp = "This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable."
|
|
if("mutate")
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/mutate
|
|
src.temp = "This spell causes you to turn into a hulk, and gain telekinesis for a short while."
|
|
if("jaunt")
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/jaunt
|
|
src.temp = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls."
|
|
if("knock")
|
|
if (src.uses >= 1)
|
|
src.uses -= 1
|
|
usr.verbs += /client/proc/knock
|
|
src.temp = "This spell opens nearby doors and does not require wizard garb."
|
|
src.generate_menu()
|
|
src.print_to_host(src.menu_message)
|
|
return
|
|
|
|
return
|
|
No longer used because wizards begin with a spell book.*/ |