Bay wizard port/rework (#1635)

Ports the newest bay wizard version, with some additions and changes.

General changes:
-ported the newest bay wizard
-wizards can select some school of magic, which also changes their spell selection as whole.
-added several new spells, like raise dead, contracts that bind the person with the wizard, and more.
-added wands, limited sources of certain types of effects/spell, also with their own bad effects for non wizards
-changed the wizard checks to a faction check instead of a mind check
-fixed wizards without certain slots due to race being fucked over due to it
-added new artifacts
-balanced some spells like the emp
-added a lot of new sounds to spell, mostly from tg
-remove horse mask from spell selection, also, you can melt the mask with acid now
-wizard's spell are now displayed at round end like traitors and what they did buy
-also fixes vaurca, and vox, antags spawning without a mask by default
This commit is contained in:
Alberyk
2017-02-07 18:45:42 +02:00
committed by skull132
parent 723f5c3fb2
commit ed6dbee896
111 changed files with 3213 additions and 658 deletions
+1 -1
View File
@@ -1003,7 +1003,7 @@ var/list/admin_verbs_cciaa = list(
set desc = "Gives a spell to a mob."
var/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spells
if(!S) return
T.spell_list += new S
T.add_spell(new S)
feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].")
message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1)
@@ -11,9 +11,10 @@
armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60)
siemens_coefficient = 0.3
wizard_garb = 1
species_restricted = list("Human", "Machine", "Skeleton")
equipped(var/mob/user)
if(!(user.mind.assigned_role == "Space Wizard"))
if(!(user.faction == "Space Wizard"))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/LH = H.get_organ("l_hand")
var/obj/item/organ/external/RH = H.get_organ("r_hand")
@@ -42,9 +43,10 @@
siemens_coefficient = 0.3
wizard_garb = 1
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/teleportation_scroll,/obj/item/weapon/scrying,/obj/item/weapon/spellbook,/obj/item/device/soulstone,/obj/item/weapon/material/knife/ritual)
species_restricted = list("Human", "Skrell", "Machine", "Skeleton")
equipped(var/mob/user)
if(!(user.mind.assigned_role == "Space Wizard"))
if(!(user.faction == "Space Wizard"))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/LH = H.get_organ("l_hand")
var/obj/item/organ/external/RH = H.get_organ("r_hand")
+29 -13
View File
@@ -22,15 +22,16 @@
desc = "It has WIZZARD written across it in sequins. Comes with a cool beard."
icon_state = "wizard-fake"
body_parts_covered = HEAD|FACE
siemens_coefficient = 1.0
/obj/item/clothing/head/wizard/marisa
name = "Witch Hat"
name = "witch Hat"
desc = "Strange-looking hat-wear, makes you want to cast fireballs."
icon_state = "marisa"
siemens_coefficient = 0.7
/obj/item/clothing/head/wizard/magus
name = "Magus Helm"
name = "magus Helm"
desc = "A mysterious helmet that hums with an unearthly power"
icon_state = "magus"
item_state = "magus"
@@ -38,7 +39,7 @@
slot_l_hand_str = "helmet",
slot_r_hand_str = "helmet"
)
siemens_coefficient = 0.8
siemens_coefficient = 0.7
body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/head/wizard/amp
@@ -49,17 +50,15 @@
slot_l_hand_str = "helmet",
slot_r_hand_str = "helmet"
)
siemens_coefficient = 0.8
/obj/item/clothing/head/wizard/cap
name = "Gentlemans Cap"
name = "gentlemans cap"
desc = "A checkered gray flat cap woven together with the rarest of threads."
icon_state = "gentcap"
item_state_slots = list(
slot_l_hand_str = "det_hat",
slot_r_hand_str = "det_hat"
)
siemens_coefficient = 0.8
/obj/item/clothing/suit/wizrobe
name = "wizard robe"
@@ -80,22 +79,21 @@
icon_state = "redwizard"
item_state = "redwizrobe"
/obj/item/clothing/suit/wizrobe/marisa
name = "Witch Robe"
name = "witch robe"
desc = "Magic is all about the spell power, ZE!"
icon_state = "marisa"
item_state = "marisarobe"
/obj/item/clothing/suit/wizrobe/magusblue
name = "Magus Robe"
name = "magus robe"
desc = "A set of armoured robes that seem to radiate a dark power"
icon_state = "magusblue"
item_state = "magusblue"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|HANDS|LEGS|FEET
/obj/item/clothing/suit/wizrobe/magusred
name = "Magus Robe"
name = "magus robe"
desc = "A set of armoured robes that seem to radiate a dark power"
icon_state = "magusred"
item_state = "magusred"
@@ -108,11 +106,12 @@
item_state = "psyamp"
/obj/item/clothing/suit/wizrobe/gentlecoat
name = "Gentlemans Coat"
name = "gentlemans coat"
desc = "A heavy threaded twead gray jacket. For a different sort of Gentleman."
icon_state = "gentlecoat"
item_state = "gentlecoat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
flags_inv = null
/obj/item/clothing/suit/wizrobe/fake
name = "wizard robe"
@@ -123,14 +122,14 @@
siemens_coefficient = 1.0
/obj/item/clothing/head/wizard/marisa/fake
name = "Witch Hat"
name = "witch hat"
desc = "Strange-looking hat-wear, makes you want to cast fireballs."
icon_state = "marisa"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 1.0
/obj/item/clothing/suit/wizrobe/marisa/fake
name = "Witch Robe"
name = "witch robe"
desc = "Magic is all about the spell power, ZE!"
icon_state = "marisa"
item_state = "marisarobe"
@@ -138,3 +137,20 @@
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 1.0
//black robes
/obj/item/clothing/head/wizard/black
name = "black wizard hat"
desc = "Strange-looking, black, hat-wear that most certainly belongs to a real dark magic user."
icon = 'icons/obj/necromancer.dmi'
icon_state = "blackwizardhat"
item_state = "blackwizardhat"
contained_sprite = 1
/obj/item/clothing/suit/wizrobe/black
name = "black wizard robe"
desc = "An unnerving black gem-lined robe that reeks of death and decay."
icon = 'icons/obj/necromancer.dmi'
icon_state = "blackwizard"
item_state = "blackwizard"
contained_sprite = 1
+4 -1
View File
@@ -5,4 +5,7 @@
plantname = "ambrosiadeus"
/obj/item/weapon/reagent_containers/food/snacks/grown/kois
plantname = "koisspore"
plantname = "koisspore"
/obj/item/weapon/reagent_containers/food/snacks/grown/banana
plantname = "banana"
+19
View File
@@ -787,3 +787,22 @@ var/list/name_to_material
name = "human hide"
stack_type = /obj/item/stack/material/animalhide/human
icon_colour = "#833C00"
/material/bone
name = "bone"
icon_colour = "#e3dac9"
icon_base = "stone"
icon_reinf = "reinf_stone"
sheet_singular_name = "bone"
sheet_plural_name = "bones"
weight = 10
hardness = 20
integrity = 70
stack_origin_tech = list(TECH_MATERIAL = 2)
door_icon_base = "stone"
/material/bone/necromancer
name = "cursed bone"
weight = 20
integrity = 150
hardness = 60
@@ -4,7 +4,7 @@
/datum/species/skeleton //SPOOKY
name = "Skeleton"
name_plural = "skeletons"
bodytype = "Skeleton"
icobase = 'icons/mob/human_races/r_skeleton.dmi'
deform = 'icons/mob/human_races/r_skeleton.dmi'
@@ -0,0 +1,182 @@
/mob/living/simple_animal/familiar
name = "familiar"
desc = "No wizard is complete without a mystical sidekick."
supernatural = 1
response_help = "pets"
response_disarm = "pushes"
response_harm = "hits"
universal_speak = 1
universal_understand = 1
min_oxy = 1 //still require a /bit/ of air.
max_co2 = 0
unsuitable_atoms_damage = 1
var/list/wizardy_spells = list()
/mob/living/simple_animal/familiar/New()
..()
add_language("Ceti Basic")
for(var/spell in wizardy_spells)
src.add_spell(new spell, "const_spell_ready")
/mob/living/simple_animal/familiar/carcinus
name = "crab"
desc = "An odd looking crab."
icon = 'icons/mob/animal.dmi'
icon_state = "evilcrab"
icon_living = "evilcrab"
icon_dead = "evilcrab_dead"
speak_emote = list("chitters","clicks")
health = 200
maxHealth = 200
melee_damage_lower = 10
melee_damage_upper = 15
attacktext = "pinches"
resistance = 9
/mob/living/simple_animal/familiar/pike
name = "space pike"
desc = "A bigger, more magical cousin of the space carp."
icon = 'icons/mob/spaceshark.dmi'
icon_state = "shark"
icon_living = "shark"
icon_dead = "shark_dead"
pixel_x = -16
speak_emote = list("gnashes")
health = 100
maxHealth = 100
melee_damage_lower = 10
melee_damage_upper = 10
min_oxy = 0
wizardy_spells = list(/spell/aoe_turf/conjure/forcewall)
/mob/living/simple_animal/familiar/pike/Process_Spacemove(var/check_drift = 0)
return 1
/mob/living/simple_animal/familiar/horror
name = "horror"
desc = "A sanity-destroying otherthing."
icon = 'icons/mob/mob.dmi'
icon_state = "horror"
icon_living = "horror"
speak_emote = list("moans", "groans")
response_help = "thinks better of touching"
health = 150
maxHealth = 150
melee_damage_lower = 5
melee_damage_upper = 8
attacktext = "touches"
wizardy_spells = list(/spell/targeted/torment)
/mob/living/simple_animal/familiar/horror/death()
..(null,"rapidly deteriorates")
ghostize()
gibs(src.loc)
qdel(src)
/mob/living/simple_animal/familiar/goat
name = "goat"
desc = "An elder looking goat."
icon_state = "goat"
icon_living = "goat"
icon_dead = "goat_dead"
speak_emote = list("brays")
mob_size = MOB_SMALL
health = 50
maxHealth = 50
wizardy_spells = list(/spell/targeted/heal_target,
/spell/targeted/heal_target/area)
/mob/living/simple_animal/familiar/pet //basically variants of normal animals with spells.
icon = 'icons/mob/animal.dmi'
var/icon_rest //so that we can have resting little guys.
/mob/living/simple_animal/familiar/pet/MouseDrop(atom/over_object)
var/mob/living/carbon/H = over_object
if(!istype(H) || !Adjacent(H)) return ..()
if(H.a_intent == "help" && holder_type)
get_scooped(H)
return
else
return ..()
/mob/living/simple_animal/familiar/pet/Life()
..()
if(!icon_rest)
return
if(stat == UNCONSCIOUS || resting)
icon_state = icon_rest
/mob/living/simple_animal/familiar/pet/mouse
name = "mouse"
desc = "A small rodent. It looks very old."
icon_state = "mouse_gray"
icon_living = "mouse_gray"
icon_dead = "mouse_gray_dead"
icon_rest = "mouse_gray_sleep"
speak_emote = list("squeeks")
holder_type = /obj/item/weapon/holder/mouse
pass_flags = PASSTABLE
mob_size = MOB_MINISCULE
response_harm = "stamps on"
health = 15
maxHealth = 15
melee_damage_lower = 1
melee_damage_upper = 1
attacktext = "nibbles"
wizardy_spells = list(/spell/aoe_turf/smoke)
/mob/living/simple_animal/familiar/pet/mouse/New()
..()
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
/mob/living/simple_animal/familiar/pet/cat
name = "black cat"
desc = "A pitch black cat. Said to be especially unlucky."
icon_state = "cat3"
icon_living = "cat3"
icon_dead = "cat3_dead"
icon_rest = "cat3_rest"
speak_emote = list("meows", "purrs")
holder_type = /obj/item/weapon/holder/cat
mob_size = MOB_SMALL
health = 25
maxHealth = 25
melee_damage_lower = 3
melee_damage_upper = 4
attacktext = "claws"
wizardy_spells = list(/spell/targeted/subjugation)
@@ -0,0 +1,3 @@
#define COMMANDED_STOP 6 //basically 'do nothing'
#define COMMANDED_FOLLOW 7 //follows a target
#define COMMANDED_MISC 8 //catch all state for misc commands that need one.
@@ -0,0 +1,69 @@
/mob/living/simple_animal/hostile/commanded/bear
name = "bear"
desc = "A large brown bear."
icon_state = "brownbear"
icon_living = "brownbear"
icon_dead = "brownbear_dead"
icon_gib = "brownbear_gib"
health = 75
maxHealth = 75
density = 1
attacktext = "swatted"
melee_damage_lower = 10
melee_damage_upper = 10
min_oxy = 5
max_co2 = 5
max_tox = 2 //We tuff bear
response_help = "pets"
response_harm = "hits"
response_disarm = "pushes"
known_commands = list("stay", "stop", "attack", "follow", "dance", "boogie", "boogy")
/mob/living/simple_animal/hostile/commanded/bear/hit_with_weapon(obj/item/O, mob/living/user, var/effective_force, var/hit_zone)
. = ..()
if(!.)
src.emote("roars in rage!")
/mob/living/simple_animal/hostile/commanded/bear/attack_hand(mob/living/carbon/human/M as mob)
..()
if(M.a_intent == I_HURT)
src.emote("roars in rage!")
/mob/living/simple_animal/hostile/commanded/bear/listen()
if(stance != COMMANDED_MISC) //cant listen if its booty shakin'
..()
//WE DANCE!
/mob/living/simple_animal/hostile/commanded/bear/misc_command(var/mob/speaker,var/text)
stay_command()
stance = COMMANDED_MISC //nothing can stop this ride
spawn(0)
src.visible_message("\The [src] starts to dance!.")
var/datum/gender/G = gender_datums[gender]
for(var/i in 1 to 10)
if(stance != COMMANDED_MISC || incapacitated()) //something has stopped this ride.
return
var/message = pick(\
"moves [G.his] head back and forth!",\
"bobs [G.his] booty!",\
"shakes [G.his] paws in the air!",\
"wiggles [G.his] ears!",\
"taps [G.his] foot!",\
"shrugs [G.his] shoulders!",\
"dances like you've never seen!")
if(dir != WEST)
set_dir(WEST)
else
set_dir(EAST)
src.visible_message("\The [src] [message]")
sleep(30)
stance = COMMANDED_STOP
set_dir(SOUTH)
src.visible_message("\The [src] bows, finished with [G.his] dance.")
@@ -0,0 +1,192 @@
/mob/living/simple_animal/hostile/commanded
name = "commanded"
stance = COMMANDED_STOP
melee_damage_lower = 0
melee_damage_upper = 0
density = 0
var/list/command_buffer = list()
var/list/known_commands = list("stay", "stop", "attack", "follow")
var/mob/master = null //undisputed master. Their commands hold ultimate sway and ultimate power.
var/list/allowed_targets = list() //WHO CAN I KILL D:
var/retribution = 1 //whether or not they will attack us if we attack them like some kinda dick.
/mob/living/simple_animal/hostile/commanded/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
if((speaker in friends) || speaker == master)
command_buffer.Add(speaker)
command_buffer.Add(lowertext(html_decode(message)))
return 0
/mob/living/simple_animal/hostile/commanded/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0)
if((speaker in friends) || speaker == master)
command_buffer.Add(speaker)
command_buffer.Add(lowertext(html_decode(message)))
return 0
/mob/living/simple_animal/hostile/commanded/Life()
while(command_buffer.len > 0)
var/mob/speaker = command_buffer[1]
var/text = command_buffer[2]
var/filtered_name = lowertext(html_decode(name))
if(dd_hasprefix(text,filtered_name) || dd_hasprefix(text,"everyone") || dd_hasprefix(text, "everybody")) //in case somebody wants to command 8 bears at once.
var/substring = copytext(text,length(filtered_name)+1) //get rid of the name.
listen(speaker,substring)
command_buffer.Remove(command_buffer[1],command_buffer[2])
. = ..()
if(.)
switch(stance)
if(COMMANDED_FOLLOW)
follow_target()
if(COMMANDED_STOP)
commanded_stop()
/mob/living/simple_animal/hostile/commanded/FindTarget(var/new_stance = HOSTILE_STANCE_ATTACK)
if(!allowed_targets.len)
return null
var/mode = "specific"
if(allowed_targets[1] == "everyone") //we have been given the golden gift of murdering everything. Except our master, of course. And our friends. So just mostly everyone.
mode = "everyone"
for(var/atom/A in ListTargets(10))
var/mob/M = null
if(A == src)
continue
if(isliving(A))
M = A
if(istype(A,/obj/mecha))
var/obj/mecha/mecha = A
if(!mecha.occupant)
continue
M = mecha.occupant
if(M && M.stat)
continue
if(mode == "specific")
if(!(A in allowed_targets))
continue
stance = new_stance
return A
else
if(M == master || (M in friends))
continue
stance = new_stance
return A
/mob/living/simple_animal/hostile/commanded/proc/follow_target()
stop_automated_movement = 1
if(!target_mob)
return
if(target_mob in ListTargets(10))
walk_to(src,target_mob,1,move_to_delay)
/mob/living/simple_animal/hostile/commanded/proc/commanded_stop() //basically a proc that runs whenever we are asked to stay put. Probably going to remain unused.
return
/mob/living/simple_animal/hostile/commanded/proc/listen(var/mob/speaker, var/text)
for(var/command in known_commands)
if(findtext(text,command))
switch(command)
if("stay")
if(stay_command(speaker,text)) //find a valid command? Stop. Dont try and find more.
break
if("stop")
if(stop_command(speaker,text))
break
if("attack")
if(attack_command(speaker,text))
break
if("follow")
if(follow_command(speaker,text))
break
else
misc_command(speaker,text) //for specific commands
return 1
//returns a list of everybody we wanna do stuff with.
/mob/living/simple_animal/hostile/commanded/proc/get_targets_by_name(var/text, var/filter_friendlies = 0)
var/list/possible_targets = hearers(src,10)
. = list()
for(var/mob/M in possible_targets)
if(filter_friendlies && ((M in friends) || M.faction == faction || M == master))
continue
var/found = 0
if(findtext(text, "[M]"))
found = 1
else
var/list/parsed_name = splittext(replace_characters(lowertext(html_decode("[M]")),list("-"=" ", "."=" ", "," = " ", "'" = " ")), " ") //this big MESS is basically 'turn this into words, no punctuation, lowercase so we can check first name/last name/etc'
for(var/a in parsed_name)
if(a == "the" || length(a) < 2) //get rid of shit words.
continue
if(findtext(text,"[a]"))
found = 1
break
if(found)
. += M
/mob/living/simple_animal/hostile/commanded/proc/attack_command(var/mob/speaker,var/text)
target_mob = null //want me to attack something? Well I better forget my old target.
walk_to(src,0)
stance = HOSTILE_STANCE_IDLE
if(text == "attack" || findtext(text,"everyone") || findtext(text,"anybody") || findtext(text, "somebody") || findtext(text, "someone")) //if its just 'attack' then just attack anybody, same for if they say 'everyone', somebody, anybody. Assuming non-pickiness.
allowed_targets = list("everyone")//everyone? EVERYONE
return 1
var/list/targets = get_targets_by_name(text)
allowed_targets += targets
return targets.len != 0
/mob/living/simple_animal/hostile/commanded/proc/stay_command(var/mob/speaker,var/text)
target_mob = null
stance = COMMANDED_STOP
stop_automated_movement = 1
walk_to(src,0)
return 1
/mob/living/simple_animal/hostile/commanded/proc/stop_command(var/mob/speaker,var/text)
allowed_targets = list()
walk_to(src,0)
target_mob = null //gotta stop SOMETHIN
stance = HOSTILE_STANCE_IDLE
stop_automated_movement = 0
return 1
/mob/living/simple_animal/hostile/commanded/proc/follow_command(var/mob/speaker,var/text)
//we can assume 'stop following' is handled by stop_command
if(findtext(text,"me"))
stance = COMMANDED_FOLLOW
target_mob = speaker //this wont bite me in the ass later.
return 1
var/list/targets = get_targets_by_name(text)
if(targets.len > 1 || !targets.len) //CONFUSED. WHO DO I FOLLOW?
return 0
stance = COMMANDED_FOLLOW //GOT SOMEBODY. BETTER FOLLOW EM.
target_mob = targets[1] //YEAH GOOD IDEA
return 1
/mob/living/simple_animal/hostile/commanded/proc/misc_command(var/mob/speaker,var/text)
return 0
/mob/living/simple_animal/hostile/commanded/hit_with_weapon(obj/item/O, mob/living/user, var/effective_force, var/hit_zone)
//if they attack us, we want to kill them. None of that "you weren't given a command so free kill" bullshit.
. = ..()
if(!. && retribution)
stance = HOSTILE_STANCE_ATTACK
target_mob = user
allowed_targets += user //fuck this guy in particular.
if(user in friends) //We were buds :'(
friends -= user
/mob/living/simple_animal/hostile/commanded/attack_hand(mob/living/carbon/human/M as mob)
..()
if(M.a_intent == I_HURT && retribution) //assume he wants to hurt us.
target_mob = M
allowed_targets += M
stance = HOSTILE_STANCE_ATTACK
if(M in friends)
friends -= M
+20
View File
@@ -105,6 +105,26 @@
return DIONA_NYMPH
return 0
/proc/isskeleton(A)
if(istype(A, /mob/living/carbon/human) && (A:get_species() == "Skeleton"))
return 1
return 0
/proc/islesserform(A)
if(istype(A, /mob/living/carbon/human))
switch(A:get_species())
if ("Monkey")
return 1
if ("Farwa")
return 1
if ("Neaera")
return 1
if ("Stok")
return 1
if ("V'krexi")
return 1
return 0
proc/isdeaf(A)
if(istype(A, /mob))
var/mob/M = A
@@ -0,0 +1,341 @@
/* Staves */
/obj/item/weapon/gun/energy/staff
name = "staff of change"
desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself"
icon = 'icons/obj/gun.dmi'
item_icons = null
icon_state = "staffofchange"
item_state = "staffofchange"
fire_sound = 'sound/magic/Staff_Change.ogg'
flags = CONDUCT
slot_flags = SLOT_BACK
w_class = 4.0
max_shots = 5
projectile_type = /obj/item/projectile/change
origin_tech = null
self_recharge = 1
charge_meter = 0
obj/item/weapon/gun/energy/staff/special_check(var/mob/user)
if(HULK in user.mutations)
user << "<span class='danger'>In your rage you momentarily forget the operation of this stave!</span>"
return 0
if(!(user.faction == "Space Wizard"))
if(istype(user, /mob/living/carbon/human))
//Save the users active hand
var/mob/living/new_mob
var/mob/living/carbon/human/H = user
for(var/obj/item/W in H)
if(istype(W, /obj/item/weapon/implant))
qdel(W)
continue
H.drop_from_inventory(W)
playsound(user, 'sound/weapons/emitter.ogg', 40, 1)
var/obj/item/organ/external/LA = H.get_organ("l_arm")
var/obj/item/organ/external/RA = H.get_organ("r_arm")
var/obj/item/organ/external/LL = H.get_organ("l_leg")
var/obj/item/organ/external/RL = H.get_organ("r_leg")
LA.droplimb(0,DROPLIMB_BLUNT)
RA.droplimb(0,DROPLIMB_BLUNT)
LL.droplimb(0,DROPLIMB_BLUNT)
RL.droplimb(0,DROPLIMB_BLUNT)
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class = 'danger'> With a sickening series of crunches, [user]'s body shrinks, and they begin to sprout feathers!</span>")
user.visible_message("<b>[user]</b> screams!",2)
new_mob = new /mob/living/simple_animal/parrot(H.loc)
new_mob.universal_speak = 1
new_mob.key = H.key
new_mob.a_intent = "harm"
qdel(H)
sleep(20)
new_mob.say("Poly wanna cracker!")
return 0
return 1
/obj/item/weapon/gun/energy/staff/handle_click_empty(mob/user = null)
if (user)
user.visible_message("*fizzle*", "<span class='danger'>*fizzle*</span>")
else
src.visible_message("*fizzle*")
playsound(src.loc, 'sound/effects/sparks1.ogg', 100, 1)
/obj/item/weapon/gun/energy/staff/animate
name = "staff of animation"
desc = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines."
projectile_type = /obj/item/projectile/animate
fire_sound = 'sound/magic/wand.ogg'
max_shots = 10
obj/item/weapon/gun/energy/staff/animate/special_check(var/mob/user)
if(HULK in user.mutations)
user << "<span class='danger'>In your rage you momentarily forget the operation of this stave!</span>"
return 0
if(!(user.faction == "Space Wizard"))
if(istype(user, /mob/living/carbon/human))
//Save the users active hand
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/LA = H.get_organ("l_hand")
var/obj/item/organ/external/RA = H.get_organ("r_hand")
var/active_hand = H.hand
playsound(user, 'sound/effects/blobattack.ogg', 40, 1)
user.visible_message("<span class = 'danger'> With a sickening crunch, [user]'s hand rips itself off, and begins crawling away!</span>")
user.visible_message("<b>[user]</b> screams!",2)
user.drop_item()
if(active_hand)
LA.droplimb(0,DROPLIMB_EDGE)
new /mob/living/simple_animal/hostile/mimic/copy(LA.loc, LA)
qdel(LA)
else
RA.droplimb(0,DROPLIMB_EDGE)
new /mob/living/simple_animal/hostile/mimic/copy(RA.loc, RA)
qdel(RA)
return 0
return 1
obj/item/weapon/gun/energy/staff/focus
name = "mental focus"
desc = "An artefact that channels the will of the user into destructive bolts of force. If you aren't careful with it, you might poke someone's brain out."
icon = 'icons/obj/wizard.dmi'
icon_state = "focus"
item_state = "focus"
fire_sound = 'sound/magic/wand.ogg'
slot_flags = SLOT_BACK
projectile_type = /obj/item/projectile/forcebolt
obj/item/weapon/gun/energy/staff/focus/special_check(var/mob/user)
if(HULK in user.mutations)
user << "<span class='danger'>In your rage you momentarily forget the operation of this stave!</span>"
return 0
if(!(user.faction == "Space Wizard"))
if(istype(user, /mob/living/carbon/human))
//Save the users active hand
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/LA = H.get_organ("l_arm")
var/obj/item/organ/external/RA = H.get_organ("r_arm")
var/active_hand = H.hand
playsound(user, 'sound/magic/lightningbolt.ogg', 40, 1)
user << "\red Coruscating waves of energy wreathe around your arm...hot...so <b>hot</b>!"
user.show_message("<b>[user]</b> screams!",2)
user.drop_item()
if(active_hand)
LA.droplimb(0,DROPLIMB_BURN)
else
RA.droplimb(0,DROPLIMB_BURN)
return 0
return 1
obj/item/weapon/gun/energy/staff/focus/attack_self(mob/living/user as mob)
if(projectile_type == /obj/item/projectile/forcebolt)
charge_cost = 400
user << "<span class='warning'>The [src.name] will now strike a small area.</span>"
projectile_type = /obj/item/projectile/forcebolt/strong
else
charge_cost = 200
user << "<span class='warning'>The [src.name] will now strike only a single person.</span>"
projectile_type = /obj/item/projectile/forcebolt
/obj/item/weapon/gun/energy/staff/chaos
name = "staff of chaos"
desc = "An artefact that spits bolts of chaotic energy, expect anything."
icon = 'icons/obj/wands.dmi'
icon_state = "staffofchaos"
item_state = "staffofchaos"
contained_sprite = 1
fire_sound = 'sound/magic/Staff_Chaos.ogg'
flags = CONDUCT
w_class = 4.0
max_shots = 5
projectile_type = /obj/item/projectile/magic
var/list/possible_projectiles = list(/obj/item/projectile/magic, /obj/item/projectile/change, /obj/item/projectile/forcebolt,
/obj/item/weapon/gun/energy/staff/animate, /obj/item/projectile/magic/fireball, /obj/item/projectile/magic/teleport,
/obj/item/projectile/temp, /obj/item/projectile/ion, /obj/item/projectile/energy/declone, /obj/item/projectile/meteor)
/obj/item/weapon/gun/energy/staff/chaos/special_check(var/mob/user)
projectile_type = pick(possible_projectiles)
if(HULK in user.mutations)
user << "<span class='danger'>In your rage you momentarily forget the operation of this stave!</span>"
return 0
if(!(user.faction == "Space Wizard"))
if(istype(user, /mob/living/carbon/human))
var/obj/P = consume_next_projectile()
if(P)
if(process_projectile(P, user, user, pick("head", "chest")))
handle_post_fire(user, user)
user.visible_message("<span class='danger'>\The [src] backfires!</span>")
user.drop_item()
return 0
return 1
//wands
/obj/item/weapon/gun/energy/wand
name = "wand of nothing"
desc = "A magic stick, this one don't do much however."
icon = 'icons/obj/wands.dmi'
item_icons = null
icon_state = "nothingwand"
item_state = "wand"
contained_sprite = 1
fire_sound = 'sound/magic/wand.ogg'
slot_flags = SLOT_BELT
w_class = 3
max_shots = 20
projectile_type = /obj/item/projectile/magic
origin_tech = null
charge_meter = 0
/obj/item/weapon/gun/energy/wand/handle_click_empty(mob/user = null)
if (user)
user.visible_message("*fizzle*", "<span class='danger'>*fizzle*</span>")
else
src.visible_message("*fizzle*")
playsound(src.loc, 'sound/effects/sparks1.ogg', 100, 1)
/obj/item/weapon/gun/energy/wand/special_check(var/mob/user)
if(HULK in user.mutations)
user << "<span class='danger'>In your rage you momentarily forget the operation of this wand!</span>"
return 0
return 1
/obj/item/weapon/gun/energy/wand/fire
name = "wand of fire"
desc = "A wand that can fire destructive flames."
icon = 'icons/obj/wands.dmi'
contained_sprite = 1
icon_state = "firewand"
item_state = "firewand"
fire_sound = 'sound/magic/Fireball.ogg'
max_shots = 5
projectile_type = /obj/item/projectile/magic/fireball
/obj/item/weapon/gun/energy/wand/fire/special_check(var/mob/user)
if(HULK in user.mutations)
user << "<span class='danger'>In your rage you momentarily forget the operation of this wand!</span>"
return 0
if(!(user.faction == "Space Wizard"))
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
H.fire_stacks += 15
H.IgniteMob()
H.visible_message("<span class='danger'>\The [src] explodes in a shower of fire!</span>")
H.drop_item()
qdel(src)
return 0
return 1
/obj/item/weapon/gun/energy/wand/polymorph
name = "wand of polymorph"
desc = "A wand that will change the shape of the its victims."
icon = 'icons/obj/wands.dmi'
contained_sprite = 1
icon_state = "polywand"
item_state = "polywand"
fire_sound = 'sound/magic/Staff_Change.ogg'
max_shots = 10
projectile_type = /obj/item/projectile/change
/obj/item/weapon/gun/energy/wand/polymorph/special_check(var/mob/user)
if(HULK in user.mutations)
user << "<span class='danger'>In your rage you momentarily forget the operation of this wand!</span>"
return 0
if(!(user.faction == "Space Wizard"))
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
H.drop_item()
H.visible_message("<span class='danger'>\The [H] collapses on the floor, their body shrinking and growing hair!</span>")
H.monkeyize()
H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(H), slot_l_hand)
qdel(src)
return 0
return 1
/obj/item/weapon/gun/energy/wand/teleport
name = "wand of teleportation"
desc = "This wand will send your targets away, or closer, to yourself."
icon = 'icons/obj/wands.dmi'
contained_sprite = 1
icon_state = "telewand"
item_state = "telewand"
fire_sound = 'sound/magic/Wand_Teleport.ogg'
max_shots = 10
projectile_type = /obj/item/projectile/magic/teleport
/obj/item/weapon/gun/energy/wand/teleport/special_check(var/mob/user) //todo: think of something else for this
if(HULK in user.mutations)
user << "<span class='danger'>In your rage you momentarily forget the operation of this wand!</span>"
return 0
if(!(user.faction == "Space Wizard"))
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
var/obj/item/organ/O = H.internal_organs_by_name[pick("eyes","appendix","kidneys","liver", "heart", "lungs", "brain")]
if(O == null)
user << "<span class='notice'>You can't make any sense of the arcane glyphs. . . maybe you should try again.</span>"
else
user <<"<span class='danger'>As you stumble over the arcane glyphs, you feel a twisting sensation in [O]!</span>"
user.visible_message("<span class='danger'>\A flash of smoke pours out of [user]'s orifices!</span>")
playsound(user, 'sound/magic/lightningshock.ogg', 40, 1)
var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread()
smoke.set_up(5, 0, user.loc)
smoke.attach(user)
smoke.start()
user.show_message("<b>[user]</b> screams!",2)
user.drop_item()
if(O && istype(O))
O.removed(user)
qdel(src)
return 0
return 1
/obj/item/weapon/gun/energy/wand/force
name = "wand of force"
desc = "A more portable version of the mental focus, still deadly."
icon = 'icons/obj/wands.dmi'
contained_sprite = 1
icon_state = "deathwand"
item_state = "deathwand"
max_shots = 10
projectile_type = /obj/item/projectile/forcebolt
/obj/item/weapon/gun/energy/wand/force/special_check(var/mob/user)
if(HULK in user.mutations)
user << "<span class='danger'>In your rage you momentarily forget the operation of this wand!</span>"
return 0
if(!(user.faction == "Space Wizard"))
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
H.visible_message("<span class='danger'>\The [src] escapes from [H]'s hand, hitting their face and shattering into pieces!</span>")
H.apply_damage(35, BRUTE, "head", 0, sharp=0, edge=0)
H.adjustBrainLoss(50)
H.sdisabilities += CLUMSY
H.drop_item()
qdel(src)
return 0
return 1
/obj/item/weapon/gun/energy/wand/animation
name = "wand of animation"
desc = "This wand will create a legion of murderous toilets, for your own leisure."
icon = 'icons/obj/wands.dmi'
contained_sprite = 1
icon_state = "revivewand"
item_state = "revivewand"
max_shots = 10
projectile_type = /obj/item/projectile/animate
/obj/item/weapon/gun/energy/wand/animation/special_check(var/mob/user)
if(HULK in user.mutations)
user << "<span class='danger'>In your rage you momentarily forget the operation of this wand!</span>"
return 0
if(!(user.faction == "Space Wizard"))
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
H.visible_message("<span class='danger'>\The [src] jumps from [H]'s hand and swifts into a crate!</span>")
new /mob/living/simple_animal/hostile/mimic(H.loc)
H.drop_item()
qdel(src)
return 0
return 1
@@ -452,140 +452,3 @@
firemodes = list(
list(mode_name="spray", burst = 20, burst_delay = -1, fire_delay = 10, dispersion = list(0.5, 0.5, 1.0, 1.0, 1.5, 1.5, 2.0, 2.0, 2.5, 2.5, 3.0, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.0, 6.0)),
)*/
/* Staves */
/obj/item/weapon/gun/energy/staff
name = "staff of change"
desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself"
icon = 'icons/obj/gun.dmi'
item_icons = null
icon_state = "staffofchange"
item_state = "staffofchange"
fire_sound = 'sound/weapons/emitter.ogg'
flags = CONDUCT
slot_flags = SLOT_BACK
w_class = 4.0
max_shots = 5
projectile_type = /obj/item/projectile/change
origin_tech = null
self_recharge = 1
charge_meter = 0
obj/item/weapon/gun/energy/staff/special_check(var/mob/user)
if(HULK in user.mutations)
user << "<span class='danger'>In your rage you momentarily forget the operation of this stave!</span>"
return 0
if(!(user.mind.assigned_role == "Space Wizard"))
if(istype(user, /mob/living/carbon/human))
//Save the users active hand
var/mob/living/new_mob
var/mob/living/carbon/human/H = user
for(var/obj/item/W in H)
if(istype(W, /obj/item/weapon/implant))
qdel(W)
continue
H.drop_from_inventory(W)
playsound(user, 'sound/weapons/emitter.ogg', 40, 1)
var/obj/item/organ/external/LA = H.get_organ("l_arm")
var/obj/item/organ/external/RA = H.get_organ("r_arm")
var/obj/item/organ/external/LL = H.get_organ("l_leg")
var/obj/item/organ/external/RL = H.get_organ("r_leg")
LA.droplimb(0,DROPLIMB_BLUNT)
RA.droplimb(0,DROPLIMB_BLUNT)
LL.droplimb(0,DROPLIMB_BLUNT)
RL.droplimb(0,DROPLIMB_BLUNT)
playsound(user, 'sound/effects/splat.ogg', 50, 1)
user.visible_message("<span class = 'danger'> With a sickening series of crunches, [user]'s body shrinks, and they begin to sprout feathers!</span>")
user.visible_message("<b>[user]</b> screams!",2)
new_mob = new /mob/living/simple_animal/parrot(H.loc)
new_mob.universal_speak = 1
new_mob.key = H.key
new_mob.a_intent = "harm"
qdel(H)
sleep(20)
new_mob.say("Poly wanna cracker!")
return 0
return 1
/obj/item/weapon/gun/energy/staff/handle_click_empty(mob/user = null)
if (user)
user.visible_message("*fizzle*", "<span class='danger'>*fizzle*</span>")
else
src.visible_message("*fizzle*")
playsound(src.loc, 'sound/effects/sparks1.ogg', 100, 1)
/obj/item/weapon/gun/energy/staff/animate
name = "staff of animation"
desc = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines."
projectile_type = /obj/item/projectile/animate
max_shots = 10
obj/item/weapon/gun/energy/staff/animate/special_check(var/mob/user)
if(HULK in user.mutations)
user << "<span class='danger'>In your rage you momentarily forget the operation of this stave!</span>"
return 0
if(!(user.mind.assigned_role == "Space Wizard"))
if(istype(user, /mob/living/carbon/human))
//Save the users active hand
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/LA = H.get_organ("l_hand")
var/obj/item/organ/external/RA = H.get_organ("r_hand")
var/active_hand = H.hand
playsound(user, 'sound/effects/blobattack.ogg', 40, 1)
user.visible_message("<span class = 'danger'> With a sickening crunch, [user]'s hand rips itself off, and begins crawling away!</span>")
user.visible_message("<b>[user]</b> screams!",2)
user.drop_item()
if(active_hand)
LA.droplimb(0,DROPLIMB_EDGE)
new /mob/living/simple_animal/hostile/mimic/copy(LA.loc, LA)
qdel(LA)
else
RA.droplimb(0,DROPLIMB_EDGE)
new /mob/living/simple_animal/hostile/mimic/copy(RA.loc, RA)
qdel(RA)
return 0
return 1
obj/item/weapon/gun/energy/staff/focus
name = "mental focus"
desc = "An artefact that channels the will of the user into destructive bolts of force. If you aren't careful with it, you might poke someone's brain out."
icon = 'icons/obj/wizard.dmi'
icon_state = "focus"
item_state = "focus"
slot_flags = SLOT_BACK
projectile_type = /obj/item/projectile/forcebolt
obj/item/weapon/gun/energy/staff/focus/special_check(var/mob/user)
if(HULK in user.mutations)
user << "<span class='danger'>In your rage you momentarily forget the operation of this stave!</span>"
return 0
if(!(user.mind.assigned_role == "Space Wizard"))
if(istype(user, /mob/living/carbon/human))
//Save the users active hand
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/LA = H.get_organ("l_arm")
var/obj/item/organ/external/RA = H.get_organ("r_arm")
var/active_hand = H.hand
playsound(user, 'sound/magic/lightningbolt.ogg', 40, 1)
user << "\red Coruscating waves of energy wreathe around your arm...hot...so <b>hot</b>!"
user.show_message("<b>[user]</b> screams!",2)
user.drop_item()
if(active_hand)
LA.droplimb(0,DROPLIMB_BURN)
else
RA.droplimb(0,DROPLIMB_BURN)
return 0
return 1
obj/item/weapon/gun/energy/staff/focus/attack_self(mob/living/user as mob)
if(projectile_type == /obj/item/projectile/forcebolt)
charge_cost = 400
user << "<span class='warning'>The [src.name] will now strike a small area.</span>"
projectile_type = /obj/item/projectile/forcebolt/strong
else
charge_cost = 200
user << "<span class='warning'>The [src.name] will now strike only a single person.</span>"
projectile_type = /obj/item/projectile/forcebolt
@@ -171,3 +171,41 @@
nodamage = 1
damage_type = HALLOSS
muzzle_type = /obj/effect/projectile/bullet/muzzle
//magic
/obj/item/projectile/magic
name = "bolt of nothing"
icon = 'icons/obj/projectiles.dmi'
icon_state = "spell"
damage = 0
check_armour = "energy"
embed = 0
damage_type = HALLOSS
/obj/item/projectile/magic/fireball
name = "fireball"
icon_state = "fireball"
damage = 20
damage_type = BURN
/obj/item/projectile/magic/fireball/on_impact(var/atom/A)
explosion(A, 0, 0, 4)
..()
/obj/item/projectile/magic/teleport //literaly bluespace crystal code, because i am lazy and it seems to work
name = "bolt of teleportation"
icon = 'icons/obj/projectiles.dmi'
icon_state = "energy2"
var/blink_range = 8
/obj/item/projectile/magic/teleport/on_hit(var/atom/hit_atom)
var/turf/T = get_turf(hit_atom)
single_spark(T)
playsound(src.loc, "sparks", 50, 1)
if(isliving(hit_atom))
blink_mob(hit_atom)
return ..()
/obj/item/projectile/magic/teleport/proc/blink_mob(mob/living/L)
do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg')
+11 -1
View File
@@ -1,7 +1,7 @@
/spell/aoe_turf/blink
name = "Blink"
desc = "This spell randomly teleports you a short distance."
feedback = "BL"
school = "abjuration"
charge_max = 20
spell_flags = Z2NOCAST | IGNOREDENSE | IGNORESPACE
@@ -9,6 +9,9 @@
invocation_type = SpI_NONE
range = 7
inner_radius = 1
cast_sound = 'sound/magic/blink.ogg'
level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 4)
cooldown_min = 5 //4 deciseconds reduction per rank
hud_state = "wiz_blink"
@@ -32,3 +35,10 @@
smoke.start()
return
/spell/aoe_turf/blink/empower_spell()
if(!..())
return 0
inner_radius += 1
return "You've increased the inner range of [src]."
+12 -12
View File
@@ -1,7 +1,6 @@
/spell/aoe_turf/charge
name = "Charge"
desc = "This spell can be used to charge up spent magical artifacts, among other things."
school = "transmutation"
charge_max = 600
spell_flags = 0
@@ -9,7 +8,8 @@
invocation_type = SpI_WHISPER
range = 0
cooldown_min = 400 //50 deciseconds reduction per rank
cast_sound = 'sound/magic/Charge.ogg'
hud_state = "wiz_charge"
/spell/aoe_turf/charge/cast(var/list/targets, mob/user)
@@ -44,15 +44,6 @@
var/mob/M = G.affecting
charged_item = mob_charge(M)
if(istype(target, /obj/item/weapon/spellbook/oneuse))
var/obj/item/weapon/spellbook/oneuse/I = target
if(prob(50))
I.visible_message("<span class='warning'>[I] catches fire!</span>")
qdel(I)
else
I.used = 0
charged_item = I
if(istype(target, /obj/item/weapon/cell/))
var/obj/item/weapon/cell/C = target
if(prob(80))
@@ -66,4 +57,13 @@
return 0
else
charged_item.visible_message("<span class='notice'>[charged_item] suddenly sparks with energy!</span>")
return 1
return 1
/spell/aoe_turf/charge/blood
name = "blood charge"
desc = "This spell charges things around it using the lifeforce gained by sacrificed blood."
charge_type = Sp_HOLDVAR
holder_var_type = "bruteloss"
holder_var_amount = 30
@@ -25,7 +25,6 @@ How they spawn stuff is decided by behaviour vars, which are explained below
cast_sound = 'sound/items/welder.ogg'
/spell/aoe_turf/conjure/cast(list/targets, mob/user)
playsound(get_turf(user), cast_sound, 50, 1)
for(var/i=1,i <= summon_amt,i++)
if(!targets.len)
@@ -59,6 +58,10 @@ How they spawn stuff is decided by behaviour vars, which are explained below
animation.layer = 3
animation.master = summoned_object
if(istype(summoned_object,/mob)) //we want them to NOT attack us.
var/mob/M = summoned_object
M.faction = user.faction
for(var/varName in newVars)
if(varName in summoned_object.vars)
summoned_object.vars[varName] = newVars[varName]
@@ -71,4 +74,4 @@ How they spawn stuff is decided by behaviour vars, which are explained below
return
/spell/aoe_turf/conjure/proc/conjure_animation(var/atom/movable/overlay/animation, var/turf/target)
qdel(animation)
qdel(animation)
@@ -0,0 +1,109 @@
/spell/aoe_turf/conjure/summon
var/name_summon = 0
cast_sound = 'sound/weapons/wave.ogg'
/spell/aoe_turf/conjure/summon/before_cast()
..()
if(name_summon)
var/newName = sanitize(input("Would you like to name your summon?") as null|text, MAX_NAME_LEN)
if(newName)
newVars["name"] = newName
/spell/aoe_turf/conjure/summon/conjure_animation(var/atom/movable/overlay/animation, var/turf/target)
animation.icon_state = "shield2"
flick("shield2",animation)
sleep(10)
..()
/spell/aoe_turf/conjure/summon/bats
name = "Summon Space Bats"
desc = "This spell summons a flock of spooky space bats."
feedback = "SB"
charge_max = 1200 //2 minutes
spell_flags = NEEDSCLOTHES
invocation = "Bla'yo daya!"
invocation_type = SpI_SHOUT
level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 3)
cooldown_min = 600
range = 1
summon_amt = 1
summon_type = list(/mob/living/simple_animal/hostile/scarybat)
hud_state = "wiz_bats"
/spell/aoe_turf/conjure/summon/bats/empower_spell()
if(!..())
return 0
newVars = list("maxHealth" = 20 + spell_levels[Sp_POWER]*5, "health" = 20 + spell_levels[Sp_POWER]*5, "melee_damage_lower" = 10 + spell_levels[Sp_POWER], "melee_damage_upper" = 10 + spell_levels[Sp_POWER]*2)
return "Your bats are now stronger."
/spell/aoe_turf/conjure/summon/bear
name = "Summon Bear"
desc = "This spell summons a permanent bear companion that will follow your orders."
feedback = "BR"
charge_max = 3000
spell_flags = NEEDSCLOTHES
invocation = "REA'YO GOR DAYA!"
invocation_type = SpI_SHOUT
level_max = list(Sp_TOTAL = 4, Sp_SPEED = 0, Sp_POWER = 4)
range = 0
name_summon = 1
summon_amt = 1
summon_type = list(/mob/living/simple_animal/hostile/commanded/bear)
newVars = list("maxHealth" = 15,
"health" = 15,
"melee_damage_lower" = 10,
"melee_damage_upper" = 10
)
hud_state = "wiz_bear"
/spell/aoe_turf/conjure/summon/bear/before_cast()
..()
newVars["master"] = holder //why not do this in the beginning? MIND SWITCHING.
/spell/aoe_turf/conjure/summon/bear/empower_spell()
if(!..())
return 0
switch(spell_levels[Sp_POWER])
if(1)
newVars = list("maxHealth" = 30,
"health" = 30,
"melee_damage_lower" = 15,
"melee_damage_upper" = 15
)
return "Your bear has been upgraded from a cub to a whelp."
if(2)
newVars = list("maxHealth" = 45,
"health" = 45,
"melee_damage_lower" = 20,
"melee_damage_upper" = 20,
"color" = "#d9d9d9" //basically we want them to look different enough that people can recognize it.
)
return "Your bear has been upgraded from a whelp to an adult."
if(3)
newVars = list("maxHealth" = 60,
"health" = 60,
"melee_damage_lower" = 25,
"melee_damage_upper" = 25,
"color" = "#8c8c8c"
)
return "Your bear has been upgraded from an adult to an alpha."
if(4)
newVars = list("maxHealth" = 75,
"health" = 75,
"melee_damage_lower" = 35,
"melee_damage_upper" = 35,
"resistance" = 3,
"color" = "#0099ff"
)
return "Your bear is now worshiped as a god amongst bears."
@@ -1,13 +1,15 @@
/spell/aoe_turf/conjure/forcewall
name = "Forcewall"
desc = "Create a wall of pure energy at your location."
feedback = "FW"
summon_type = list(/obj/effect/forcefield)
duration = 300
charge_max = 100
spell_flags = 0
range = 0
cast_sound = null
cast_sound = 'sound/magic/ForceWall.ogg'
hud_state = "wiz_shield"
/spell/aoe_turf/conjure/forcewall/mime
@@ -0,0 +1,75 @@
/spell/aoe_turf/conjure/grove
name = "Grove"
desc = "Creates a sanctuary of nature around the wizard as well as creating a healing plant."
spell_flags = IGNOREDENSE | IGNORESPACE | NEEDSCLOTHES | Z2NOCAST | IGNOREPREV
charge_max = 1200
school = "conjuration"
cast_sound = 'sound/species/diona/gestalt_grow.ogg'
range = 1
cooldown_min = 600
level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 1)
summon_amt = 47
summon_type = list(/turf/simulated/floor/grass)
var/spread = 0
var/datum/seed/seed
var/seed_type = /datum/seed/merlin_tear
/spell/aoe_turf/conjure/grove/New()
..()
if(seed_type)
seed = new seed_type()
else
seed = plant_controller.create_random_seed(1)
/spell/aoe_turf/conjure/grove/before_cast()
var/turf/T = get_turf(holder)
var/obj/effect/plant/P = new(T,seed)
P.spread_chance = spread
/spell/aoe_turf/conjure/grove/sanctuary
name = "Sanctuary"
desc = "Creates a sanctuary of nature around the wizard as well as creating a healing plant."
feedback = "SY"
invocation = "Bo k'itan"
invocation_type = SpI_SHOUT
spell_flags = IGNOREDENSE | IGNORESPACE | NEEDSCLOTHES | Z2NOCAST | IGNOREPREV
cooldown_min = 600
cast_sound = 'sound/species/diona/gestalt_grow.ogg'
level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 1)
seed_type = /datum/seed/merlin_tear
newVars = list("name" = "sanctuary", "desc" = "This grass makes you feel comfortable. Peaceful.","blessed" = 1)
hud_state = "wiz_grove"
/spell/aoe_turf/conjure/grove/sanctuary/empower_spell()
if(!..())
return 0
seed.set_trait(TRAIT_SPREAD,2) //make it grow.
spread = 40
return "Your sanctuary will now grow beyond that of the grassy perimeter."
/datum/seed/merlin_tear
name = "merlin tears"
seed_name = "merlin tears"
display_name = "merlin tears"
chems = list("bicaridine" = list(3,7), "dermaline" = list(3,7), "anti_toxin" = list(3,7), "tricordrazine" = list(3,7), "alkysine" = list(1,2), "imidazoline" = list(1,2), "peridaxon" = list(4,5))
kitchen_tag = "berries"
/datum/seed/merlin_tear/New()
..()
set_trait(TRAIT_PLANT_ICON,"bush5")
set_trait(TRAIT_PRODUCT_ICON,"berry")
set_trait(TRAIT_PRODUCT_COLOUR,"#4d4dff")
set_trait(TRAIT_PLANT_COLOUR, "#ff6600")
set_trait(TRAIT_YIELD,4)
set_trait(TRAIT_MATURATION,6)
set_trait(TRAIT_PRODUCTION,6)
set_trait(TRAIT_POTENCY,10)
set_trait(TRAIT_HARVEST_REPEAT,1)
set_trait(TRAIT_IMMUTABLE,1)
+14 -4
View File
@@ -1,6 +1,7 @@
/spell/aoe_turf/disable_tech
name = "Disable Tech"
desc = "This spell disables all weapons, cameras and most other technology in range."
feedback = "DT"
charge_max = 400
spell_flags = NEEDSCLOTHES
invocation = "NEC CANTIO"
@@ -8,11 +9,12 @@
selection_type = "range"
range = 0
inner_radius = -1
cast_sound = 'sound/magic/Disable_Tech.ogg'
cooldown_min = 200 //50 deciseconds reduction per rank
var/emp_heavy = 6
var/emp_light = 10
var/emp_heavy = 3
var/emp_light = 5
hud_state = "wiz_tech"
@@ -20,4 +22,12 @@
for(var/turf/target in targets)
empulse(get_turf(target), emp_heavy, emp_light)
return
return
/spell/aoe_turf/disable_tech/empower_spell()
if(!..())
return 0
emp_heavy += 2
emp_light += 2
return "You've increased the range of [src]."
+9 -2
View File
@@ -1,7 +1,7 @@
/spell/aoe_turf/knock
name = "Knock"
desc = "This spell opens nearby doors and does not require wizard garb."
feedback = "KN"
school = "transmutation"
charge_max = 100
spell_flags = 0
@@ -9,6 +9,7 @@
invocation_type = SpI_WHISPER
range = 3
cooldown_min = 20 //20 deciseconds reduction per rank
cast_sound = 'sound/magic/Knock.ogg'
hud_state = "wiz_knock"
@@ -22,6 +23,12 @@
door.open()
return
/spell/aoe_turf/knock/empower_spell()
if(!..())
return 0
range *= 2
return "You've doubled the range of [src]."
//Construct version
/spell/aoe_turf/knock/harvester
@@ -61,4 +68,4 @@
spawn(10)
qdel(animation)
T.cultify()
return
return
+9 -1
View File
@@ -1,7 +1,7 @@
/spell/aoe_turf/smoke
name = "Smoke"
desc = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb."
feedback = "SM"
school = "conjuration"
charge_max = 120
spell_flags = 0
@@ -10,8 +10,16 @@
range = 1
inner_radius = -1
cooldown_min = 20 //25 deciseconds reduction per rank
cast_sound = 'sound/magic/Smoke.ogg'
smoke_spread = 2
smoke_amt = 5
hud_state = "wiz_smoke"
/spell/aoe_turf/smoke/empower_spell()
if(!..())
return 0
smoke_amt += 2
return "[src] will now create more smoke."
+41 -4
View File
@@ -12,22 +12,30 @@
/spell/aoe_turf/conjure/carp
name = "Summon Carp"
desc = "This spell conjures a simple carp."
feedback = "CA"
school = "conjuration"
charge_max = 1200
spell_flags = NEEDSCLOTHES
invocation = "NOUK FHUNMM SACP RISSKA"
invocation_type = SpI_SHOUT
range = 1
cast_sound = 'sound/magic/Summon_Karp.ogg'
summon_type = list(/mob/living/simple_animal/hostile/carp)
hud_state = "wiz_carp"
/spell/aoe_turf/conjure/carp/empower_spell()
if(!..())
return 0
summon_amt++
return "You now summon [summon_amt] carps per spellcast."
/spell/aoe_turf/conjure/creature
name = "Summon Creature Swarm"
desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth"
cast_sound = 'sound/magic/Summon_Karp.ogg'
school = "conjuration"
charge_max = 1200
spell_flags = 0
@@ -38,4 +46,33 @@
summon_type = list(/mob/living/simple_animal/hostile/creature)
hud_state = "wiz_creature"
hud_state = "wiz_creature"
/spell/aoe_turf/conjure/mirage
name = "Summon Mirage"
desc = "This spell summons a harmless carp mirage for a few seconds."
feedback = "MR"
school = "illusion"
charge_max = 1200
spell_flags = NEEDSCLOTHES
invocation = "NOUK FHUNNM SACP RISSKA"
invocation_type = SpI_SHOUT
range = 1
duration = 600
cooldown_min = 600
level_max = list(Sp_TOTAL = 4, Sp_SPEED = 2, Sp_POWER = 3)
cast_sound = 'sound/magic/Summon_Karp.ogg'
summon_type = list(/mob/living/simple_animal/hostile/carp)
hud_state = "wiz_carp"
newVars = list("melee_damage_lower" = 0, "melee_damage_upper" = 0, "break_stuff_probability" = 0)
/spell/aoe_turf/conjure/mirage/empower_spell()
if(!..())
return 0
summon_amt++
return "You now summon [summon_amt] mirages per spellcast."
+93 -1
View File
@@ -13,7 +13,7 @@
hitsound = 'sound/items/welder2.ogg'
/obj/item/weapon/scrying/attack_self(mob/user as mob)
if(!(user.mind.assigned_role == "Space Wizard"))
if(!(user.faction == "Space Wizard"))
if(istype(user, /mob/living/carbon/human))
//Save the users active hand
var/mob/living/carbon/human/H = user
@@ -38,3 +38,95 @@
user.teleop = user.ghostize(1)
announce_ghost_joinleave(user.teleop, 1, "You feel that they used a powerful artifact to [pick("invade","disturb","disrupt","infest","taint","spoil","blight")] this place with their presence.")
return
/obj/item/weapon/melee/energy/wizard
name = "rune sword"
desc = "A large sword engraved with arcane markings, it seems to reverberate with unearthly powers."
icon = 'icons/obj/sword.dmi'
icon_state = "runesword0"
item_state = "runesword0"
contained_sprite = 1
active_force = 40
active_throwforce = 40
active_w_class = 5
force = 20
throwforce = 30
throw_speed = 5
throw_range = 10
w_class = 5
flags = NOBLOODY
origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 8)
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
sharp = 1
edge = 1
slot_flags = SLOT_BELT
/obj/item/weapon/melee/energy/wizard/activate(mob/living/user)
..()
icon_state = "runesword1"
item_state = "runesword1"
user << "<span class='notice'>The [src] surges to life!.</span>"
/obj/item/weapon/melee/energy/wizard/deactivate(mob/living/user)
..()
icon_state = "runesword0"
item_state = "runesword0"
user << "<span class='notice'>The [src] slowly dies out.</span>"
/obj/item/weapon/melee/energy/wizard/attack(mob/living/M, mob/living/user, var/target_zone)
if(user.faction == "Space Wizard")
return ..()
var/zone = (user.hand ? "l_arm":"r_arm")
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/affecting = H.get_organ(zone)
user << "<span class='danger'>The sword refuses you as its true wielder, slashing your [affecting.name] instead!</span>"
user.apply_damage(active_force, BRUTE, zone, 0, sharp=1, edge=1)
user.drop_from_inventory(src)
return 1
/* //commented until issues with sparks and sword blocking updates are merged
/obj/item/weapon/melee/energy/wizard/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(active && default_parry_check(user, attacker, damage_source) && prob(50))
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, user.loc)
spark_system.start()
playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1)
return 1
return 0
*/
//skeleton weapons and armor
/obj/item/clothing/suit/bone
name = "bone armor"
desc = "A rudimentary armor made of bones of several creatures."
icon = 'icons/obj/necromancer.dmi'
icon_state = "bonearmor"
item_state = "bonearmor"
contained_sprite = 1
species_restricted = list("Skeleton")
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
armor = list(melee = 50, bullet = 40, laser = 50, energy = 25, bomb = 30, bio = 0, rad = 0)
/obj/item/clothing/head/helmet/bone
name = "bone helmet"
desc = "A rudimentary helmet made of some dead creature."
icon = 'icons/obj/necromancer.dmi'
icon_state = "skull"
item_state = "skull"
contained_sprite = 1
species_restricted = list("Skeleton")
armor = list(melee = 50, bullet = 40, laser = 50, energy = 25, bomb = 30, bio = 0, rad = 0)
/obj/item/weapon/material/twohanded/spear/bone
desc = "A spear crafted with bones of some long forgotten creature."
default_material = "cursed bone"
+150
View File
@@ -0,0 +1,150 @@
/obj/item/weapon/contract
name = "contract"
desc = "written in the blood of some unfortunate fellow."
icon = 'icons/mob/screen_spells.dmi'
icon_state = "master_open"
var/contract_master = null
var/list/contract_spells = list(/spell/contract/reward,/spell/contract/punish,/spell/contract/return_master)
/obj/item/weapon/contract/attack_self(mob/user as mob)
if(contract_master == null)
user << "<span class='notice'>You bind the contract to your soul, making you the recipient of whatever poor fool's soul that decides to contract with you.</span>"
contract_master = user
return
if(contract_master == user)
user << "You can't contract with yourself!"
return
var/ans = alert(user,"The contract clearly states that signing this contract will bind your soul to \the [contract_master]. Are you sure you want to continue?","[src]","Yes","No")
if(ans == "Yes")
user.visible_message("\The [user] signs the contract, their body glowing a deep yellow.")
if(!src.contract_effect(user))
user.visible_message("\The [src] visibly rejects \the [user], erasing their signature from the line.")
return
user.visible_message("\The [src] disappears with a flash of light.")
if(contract_spells.len && istype(contract_master,/mob/living)) //if it aint text its probably a mob or another user
var/mob/living/M = contract_master
for(var/spell_type in contract_spells)
M.add_spell(new spell_type(user), "const_spell_ready")
log_and_message_admins("signed their soul over to \the [contract_master] using \the [src].", user)
user.drop_from_inventory(src)
qdel(src)
/obj/item/weapon/contract/proc/contract_effect(mob/user as mob)
user << "<span class='warning'>You've signed your soul over to \the [contract_master] and with that your unbreakable vow of servitude begins.</span>"
return 1
/obj/item/weapon/contract/apprentice
name = "apprentice wizarding contract"
desc = "a wizarding school contract for those who want to sign their soul for a piece of the magic pie."
color = "#993300"
/obj/item/weapon/contract/apprentice/contract_effect(mob/user as mob)
if(user.mind.special_role == "apprentice")
user << "<span class='warning'>You are already a wizarding apprentice!</span>"
return 0
if(wizards.add_antagonist_mind(user.mind,1,"apprentice","<b>You are an apprentice! Your job is to learn the wizarding arts!</b>"))
user << "<span class='notice'>With the signing of this paper you agree to become \the [contract_master]'s apprentice in the art of wizardry.</span>"
user.faction = "Space Wizard"
return 1
return 0
/obj/item/weapon/contract/wizard //contracts that involve making a deal with the Wizard Acadamy (or NON PLAYERS)
contract_master = "\improper Wizard Academy"
/obj/item/weapon/contract/wizard/xray
name = "xray vision contract"
desc = "This contract is almost see-through..."
color = "#339900"
/obj/item/weapon/contract/wizard/xray/contract_effect(mob/user as mob)
..()
if (!(XRAY in user.mutations))
user.mutations.Add(XRAY)
user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
user.see_in_dark = 8
user.see_invisible = SEE_INVISIBLE_LEVEL_TWO
user << "<span class='notice'>The walls suddenly disappear.</span>"
return 1
return 0
/obj/item/weapon/contract/wizard/tk
name = "telekinesis contract"
desc = "This contract makes your mind buzz. It promises to give you the ability to move things with your mind. At a price."
color = "#990033"
/obj/item/weapon/contract/wizard/tk/contract_effect(mob/user as mob)
..()
if(!(TK in user.mutations))
user.mutations.Add(TK)
user << "<span class='notice'>You feel your mind expanding!</span>"
return 1
return 0
/obj/item/weapon/contract/boon
name = "boon contract"
desc = "this contract grants you a boon for signing it."
var/path
/obj/item/weapon/contract/boon/New(var/newloc, var/new_path)
..(newloc)
if(new_path)
path = new_path
var/item_name = ""
if(ispath(path,/obj))
var/obj/O = path
item_name = initial(O.name)
else if(ispath(path,/spell))
var/spell/S = path
item_name = initial(S.name)
name = "[item_name] contract"
/obj/item/weapon/contract/boon/contract_effect(mob/user as mob)
..()
if(ispath(path,/spell))
user.add_spell(new path)
return 1
else if(ispath(path,/obj))
new path(get_turf(user.loc))
playsound(get_turf(usr),'sound/effects/phasein.ogg',50,1)
return 1
/obj/item/weapon/contract/boon/wizard
contract_master = "\improper Wizard Academy"
/obj/item/weapon/contract/boon/wizard/artificer
path = /spell/aoe_turf/conjure/construct
desc = "This contract has a passage dedicated to an entity known as 'Nar-Sie'"
/obj/item/weapon/contract/boon/wizard/fireball
path = /spell/targeted/projectile/dumbfire/fireball
desc = "This contract feels warm to the touch."
/obj/item/weapon/contract/boon/wizard/smoke
path = /spell/aoe_turf/smoke
desc = "This contract smells as dank as they come."
/obj/item/weapon/contract/boon/wizard/mindswap
path = /spell/targeted/mind_transfer
desc = "This contract looks ragged and torn."
/obj/item/weapon/contract/boon/wizard/forcewall
path = /spell/aoe_turf/conjure/forcewall
contract_master = "\improper Mime Federation"
desc = "This contract has a dedication to mimes everywhere at the top."
/obj/item/weapon/contract/boon/wizard/knock
path = /spell/aoe_turf/knock
desc = "This contract is hard to hold still."
/obj/item/weapon/contract/boon/wizard/horsemask
path = /spell/targeted/equip_item/horsemask
desc = "This contract is more horse than your mind has room for."
/obj/item/weapon/contract/boon/wizard/charge
path = /spell/aoe_turf/charge
desc = "This contract is made of 100% post-consumer wizard."
+1 -1
View File
@@ -1,7 +1,7 @@
/spell/area_teleport
name = "Teleport"
desc = "This spell teleports you to a type of area of your selection."
feedback = "TP"
school = "abjuration"
charge_max = 600
spell_flags = NEEDSCLOTHES
@@ -0,0 +1,67 @@
//These spells are given to the owner of a contract when a victim signs it.
//As such they are REALLY REALLY powerful (because the victim is rewarded for signing it, and signing contracts is completely voluntary)
/spell/contract
name = "Contract Spell"
desc = "A spell perfecting the techniques of keeping a servant happy and obedient."
school = "transmutation"
spell_flags = 0
invocation = "none"
invocation_type = SpI_NONE
var/mob/subject
/spell/contract/New(var/mob/M)
..()
subject = M
name += " ([M.real_name])"
/spell/contract/choose_targets()
return list(subject)
/spell/contract/cast(mob/target,mob/user)
if(!subject)
usr << "This spell was not properly given a target. Contact a coder."
return null
if(istype(target,/list))
target = target[1]
return target
/spell/contract/reward
name = "Reward Contractee"
desc = "A spell that makes your contracted victim feel better."
charge_max = 300
cooldown_min = 100
hud_state = "wiz_jaunt_old"
/spell/contract/reward/cast(mob/living/target,mob/user)
target = ..(target,user)
if(!target)
return
target << "<span class='notice'>You feel great!</span>"
target.ExtinguishMob()
/spell/contract/punish
name = "Punish Contractee"
desc = "A spell that sets your contracted victim ablaze."
charge_max = 300
cooldown_min = 100
hud_state = "gen_immolate"
/spell/contract/punish/cast(mob/living/target,mob/user)
target = ..(target,user)
if(!target)
return
target << "<span class='danger'>You feel punished!</span>"
target.fire_stacks += 15
target.IgniteMob()
@@ -0,0 +1,83 @@
/spell/mark_recall
name = "Mark and Recall"
desc = "This spell was created so wizards could get home from the bar without driving."
feedback = "MK"
school = "abjuration"
charge_max = 600
spell_flags = Z2NOCAST
invocation = "RE ALKI R'NATHA"
invocation_type = SpI_WHISPER
cooldown_min = 300
smoke_amt = 1
smoke_spread = 5
level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 1)
cast_sound = 'sound/effects/teleport.ogg'
hud_state = "wiz_mark"
var/mark = null
/spell/mark_recall/choose_targets()
if(!mark)
return list("magical fairy dust") //because why not
else
return list(mark)
/spell/mark_recall/cast(var/list/targets,mob/user)
if(!targets.len)
return 0
var/target = targets[1]
if(istext(target))
mark = new /obj/effect/cleanable/wizard_mark(get_turf(user),src)
return 1
if(!istype(target,/obj)) //something went wrong
return 0
var/turf/T = get_turf(target)
if(!T)
return 0
user.forceMove(T)
..()
/spell/mark_recall/empower_spell()
if(!..())
return 0
spell_flags = STATALLOWED
return "You no longer have to be conscious to activate this spell."
/obj/effect/cleanable/wizard_mark
name = "\improper Mark of the Wizard"
desc = "A strange rune, probably someone playing with crayons again."
icon = 'icons/obj/rune.dmi'
icon_state = "wizard_mark"
anchored = 1
unacidable = 1
layer = TURF_LAYER
var/spell/mark_recall/spell
/obj/effect/cleanable/wizard_mark/New(var/newloc,var/mrspell)
..()
spell = mrspell
/obj/effect/cleanable/wizard_mark/Destroy()
spell.mark = null //dereference pls.
spell = null
..()
/obj/effect/cleanable/wizard_mark/attack_hand(var/mob/user)
if(user == spell.holder)
user.visible_message("\The [user] mutters an incantation and \the [src] disappears!")
qdel(src)
..()
/obj/effect/cleanable/wizard_mark/attackby(var/obj/item/I, var/mob/user)
if(istype(I, /obj/item/weapon/nullrod) || istype(I, /obj/item/weapon/spellbook))
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
src.visible_message("\The [src] fades away!")
qdel(src)
return
..()
@@ -0,0 +1,23 @@
/spell/contract/return_master
name = "Return to Master"
desc = "Teleport back to your master"
school = "abjuration"
charge_max = 600
spell_flags = 0
invocation = "none"
invocation_type = SpI_NONE
cooldown_min = 200
smoke_spread = 1
smoke_amt = 5
hud_state = "wiz_tele"
/spell/contract/return_master/cast(mob/target,mob/user)
target = ..(target,user)
if(!target)
return
user.forceMove(get_turf(target))
+33
View File
@@ -0,0 +1,33 @@
/spell/hand
var/min_range = 0
var/list/compatible_targets = list()
var/casts = 1
var/spell_delay = 5
var/move_delay
var/click_delay
var/hand_state = "magic"
/spell/hand/choose_targets(mob/user = usr)
return list(user)
/spell/hand/cast(list/targets, mob/user)
for(var/mob/M in targets)
if(M.get_active_hand())
user << "<span class='warning'>You need an empty hand to cast this spell.</span>"
return
var/obj/item/magic_hand/H = new(src)
if(!M.put_in_active_hand(H))
qdel(H)
return
user << "You ready the [name] spell ([casts]/[casts] charges)."
/spell/hand/proc/valid_target(var/atom/a,var/mob/user) //we use seperate procs for our target checking for the hand spells.
var/distance = get_dist(a,user)
if((min_range && distance < min_range) || (range && distance > range))
return 0
if(!is_type_in_list(a,compatible_targets))
return 0
return 1
/spell/hand/proc/cast_hand(var/atom/a,var/mob/user) //same for casting.
return 1
+56
View File
@@ -0,0 +1,56 @@
/*much like grab this item is used primarily for the utility it provides.
Basically: I can use it to target things where I click. I can then pass these targets to a spell and target things not using a list.
*/
/obj/item/magic_hand
name = "Magic Hand"
icon = 'icons/mob/screen1.dmi'
flags = 0
abstract = 1
w_class = 5.0
icon_state = "spell"
var/next_spell_time = 0
var/spell/hand/hand_spell
var/casts = 0
/obj/item/magic_hand/New(var/spell/hand/S)
hand_spell = S
name = "[name] ([S.name])"
casts = S.casts
icon_state = S.hand_state
/obj/item/magic_hand/attack() //can't be used to actually bludgeon things
return 1
/obj/item/magic_hand/afterattack(atom/A, mob/living/user)
if(!hand_spell) //no spell? Die.
user.drop_from_inventory(src)
if(!hand_spell.valid_target(A,user))
return
if(world.time < next_spell_time)
user << "<span class='warning'>The spell isn't ready yet!</span>"
return
if(hand_spell.cast_hand(A,user))
next_spell_time = world.time + hand_spell.spell_delay
casts--
if(hand_spell.move_delay)
user.setMoveCooldown(hand_spell.move_delay)
if(hand_spell.click_delay)
user.setClickCooldown(hand_spell.move_delay)
if(!casts)
user.drop_from_inventory(src)
return
user << "[casts]/[hand_spell.casts] charges left."
/obj/item/magic_hand/throw_at() //no throwing pls
usr.drop_from_inventory(src)
/obj/item/magic_hand/dropped() //gets deleted on drop
loc = null
qdel(src)
/obj/item/magic_hand/Destroy() //better save than sorry.
hand_spell = null
..()
+97
View File
@@ -0,0 +1,97 @@
/obj/item/weapon/monster_manual
name = "bestiarum"
desc = "A book detailing various magical creatures."
icon = 'icons/obj/library.dmi'
icon_state = "bookHacking"
throw_speed = 1
throw_range = 5
w_class = 2
var/uses = 1
var/temp = null
var/list/monster = list(/mob/living/simple_animal/familiar/pet/cat,
/mob/living/simple_animal/familiar/pet/mouse,
/mob/living/simple_animal/familiar/carcinus,
/mob/living/simple_animal/familiar/horror,
/mob/living/simple_animal/familiar/goat,
/mob/living/simple_animal/familiar/pike
)
var/list/monster_info = list( "It is well known that the blackest of cats make good familiars.",
"Mice are full of mischief and magic. A simple animal, yes, but one of the wizard's finest.",
"A mortal decendant of the original Carcinus, it is said their shells are near impenetrable and their claws as sharp as knives.",
"A creature from other plane, its very own presence is enough to shatter the sanity of men.",
"A magical goat known for its healing powers and nearly-pacifist ways.",
"The more carnivorous and knowledge hungry cousin of the space carp. Keep away from books."
)
/obj/item/weapon/monster_manual/attack_self(mob/user as mob)
if(!user)
return
if(!(user.faction == "Space Wizard"))
user <<"<span class='warning'>When you try to open the book, horrors pours out from among the pages!</span>"
new /mob/living/simple_animal/hostile/creature(user.loc)
playsound(user, 'sound/magic/Summon_Karp.ogg', 100, 1)
return
else
user.set_machine(src)
interact(user)
/obj/item/weapon/monster_manual/interact(mob/user as mob)
var/dat
if(temp)
dat = "[temp]<br><a href='byond://?src=\ref[src];temp=1'>Return</a>"
else
dat = "<center><h3>bestiarum</h3>You have [uses] uses left.</center>"
for(var/i=1;i<=monster_info.len;i++)
var/mob/M = monster[i]
var/name = capitalize(initial(M.name))
dat += "<BR><a href='byond://?src=\ref[src];path=[monster[i]]'>[name]</a> - [monster_info[i]]</BR>"
user << browse(dat,"window=monstermanual")
onclose(user,"monstermanual")
/obj/item/weapon/monster_manual/Topic(href, href_list)
..()
if(!Adjacent(usr))
usr << browse(null,"window=monstermanual")
return
if(href_list["temp"])
temp = null
if(href_list["path"])
if(uses == 0)
usr << "This book is out of uses."
return
var/client/C = get_player()
if(!C)
usr << "There are no souls willing to become a familiar."
return
var path = text2path(href_list["path"])
if(!ispath(path))
usr << "Invalid mob path in [src]. Contact a coder."
return
var/mob/living/simple_animal/familiar/F = new path(get_turf(src))
F.ckey = C.ckey
F.faction = usr.faction
F.add_spell(new /spell/contract/return_master(usr),"const_spell_ready")
if(C.mob && C.mob.mind)
C.mob.mind.transfer_to(F)
F << "<B>You are [F], a familiar to [usr]. He is your master and your friend. Aid him in his wizarding duties to the best of your ability.</B>"
var/newname = input(F,"Please choose a name. Leaving it blank or canceling will choose the default.", "Name",F.name) as null|text
if(newname)
F.name = newname
temp = "You have summoned \the [F]"
uses--
if(Adjacent(usr))
src.interact(usr)
else
usr << browse(null,"window=monstermanual")
/obj/item/weapon/monster_manual/proc/get_player()
for(var/mob/O in dead_mob_list)
if(O.client)
var/getResponse = alert(O,"A wizard is requesting a familiar. Would you like to play as one?", "Wizard familiar summons","Yes","No")
if(getResponse == "Yes")
return O.client
return null
+2 -2
View File
@@ -1,5 +1,5 @@
/spell/noclothes
name = "No Clothes"
desc = "This is a placeholder for knowing if you dont need clothes for any spell."
desc = "Learn the ways of robeless spell casting."
feedback = "NC"
spell_flags = NO_BUTTON
+29 -8
View File
@@ -3,6 +3,7 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
/spell
var/name = "Spell"
var/desc = "A spell"
var/feedback = "" //what gets sent if this spell gets chosen by the spellbook.
parent_type = /datum
var/panel = "Spells"//What panel the proc holder needs to go on.
@@ -15,6 +16,7 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
var/still_recharging_msg = "<span class='notice'>The spell is still recharging.</span>"
var/silenced = 0 //not a binary - the length of time we can't cast this for
var/processing = 0 //are we processing already? Mainly used so that silencing a spell doesn't call process() again. (and inadvertedly making it run twice as fast)
var/holder_var_type = "bruteloss" //only used if charge_type equals to "holder_var"
var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used
@@ -65,9 +67,20 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
charge_counter = charge_max
/spell/proc/process()
spawn while(charge_counter < charge_max)
charge_counter++
sleep(1)
if(processing)
return
processing = 1
spawn(0)
while(charge_counter < charge_max || silenced > 0)
charge_counter = min(charge_max,charge_counter+1)
silenced = max(0,silenced-1)
sleep(1)
if(connected_button)
var/obj/screen/spell/S = connected_button
if(!istype(S))
return
S.update_charge(1)
processing = 0
return
/////////////////
@@ -85,7 +98,7 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
if(cast_delay && !spell_do_after(user, cast_delay))
return
var/list/targets = choose_targets(user)
if(targets && targets.len)
if(targets && targets.len && cast_check(1,user))
invocation(user, targets)
take_charge(user, skipcharge)
@@ -94,6 +107,7 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
if(prob(critfailchance))
critfail(targets, user)
else
playsound(get_turf(user), cast_sound, 50, 1)
cast(targets, user)
after_cast(targets) //generates the sparks, smoke, target messages etc.
@@ -114,6 +128,8 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
target.adjustToxLoss(amount)
if("oxyloss")
target.adjustOxyLoss(amount)
if("brainloss")
target.adjustBrainLoss(amount)
if("stunned")
target.AdjustStunned(amount)
if("weakened")
@@ -277,14 +293,19 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
if(level_max[Sp_TOTAL] <= ( spell_levels[Sp_SPEED] + spell_levels[Sp_POWER] )) //too many levels, can't do it
return 0
if(upgrade_type && upgrade_type in spell_levels && upgrade_type in level_max)
if(spell_levels[upgrade_type] >= level_max[upgrade_type])
return 0
//if(upgrade_type && spell_levels[upgrade_type] && level_max[upgrade_type])
if(upgrade_type && spell_levels[upgrade_type] >= level_max[upgrade_type])
return 0
return 1
/spell/proc/empower_spell()
return
if(!can_improve(Sp_POWER))
return 0
spell_levels[Sp_POWER]++
return 1
/spell/proc/quicken_spell()
if(!can_improve(Sp_SPEED))
+10
View File
@@ -0,0 +1,10 @@
/mob/proc/cast_spell(var/spell/spell in spell_list)
set category = "IC"
set name = "Cast"
set desc = "Cast a spell"
if(!spell_list.len)
src.verbs -= /mob/proc/cast_spell
return
spell.perform(usr)
+183 -429
View File
@@ -1,27 +1,56 @@
#define LOCKED 2
#define CAN_MAKE_CONTRACTS 4
var/list/artefact_feedback = list(/obj/structure/closet/wizard/armor = "HS",
/obj/item/weapon/gun/energy/staff/focus = "MF",
/obj/item/weapon/monster_manual = "MA",
/obj/item/weapon/contract/apprentice = "CP",
/obj/structure/closet/wizard/souls = "SS",
/obj/item/weapon/contract/wizard/tk = "TK",
/obj/structure/closet/wizard/scrying = "SO",
/obj/item/weapon/teleportation_scroll = "TS",
/obj/item/weapon/gun/energy/staff = "ST",
/obj/item/weapon/gun/energy/staff/animate = "SA",
/obj/item/weapon/melee/energy/wizard = "WS",
/obj/item/weapon/gun/energy/staff/chaos = "SC",
/obj/item/weapon/storage/belt/wands/full = "WB")
/obj/item/weapon/spellbook
name = "spell book"
name = "master spell book"
desc = "The legendary book of spells of the wizard."
icon = 'icons/obj/library.dmi'
icon_state ="spellbook"
icon_state = "spellbook"
throw_speed = 1
throw_range = 5
w_class = 2
var/uses = 5
var/uses = 1
var/temp = null
var/max_uses = 5
var/op = 1
var/datum/spellbook/spellbook
var/spellbook_type = /datum/spellbook/ //for spawning specific spellbooks.
/obj/item/weapon/spellbook/New()
..()
set_spellbook(spellbook_type)
/obj/item/weapon/spellbook/proc/set_spellbook(var/type)
if(spellbook)
qdel(spellbook)
spellbook = new type()
uses = spellbook.max_uses
name = spellbook.name
desc = spellbook.desc
/obj/item/weapon/spellbook/attack_self(mob/user as mob)
if(!user)
return
if(!(user.mind.assigned_role == "Space Wizard"))
if(!(user.faction == "Space Wizard"))
if(istype(user, /mob/living/carbon/human))
//Save the users active hand
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/LA = H.get_organ("l_arm")
var/obj/item/organ/external/RA = H.get_organ("r_arm")
var/active_hand = H.hand
user << "\red You feel unimaginable agony as your eyes pour over millenia of forbidden knowledge!"
user <<"<span class='warning'>You feel unimaginable agony as your eyes pour over millenia of forbidden knowledge!</span>"
user.show_message("<b>[user]</b> screams in horror!",2)
H.adjust_fire_stacks(2)
H.IgniteMob()
@@ -35,445 +64,170 @@
RA.droplimb(0,DROPLIMB_BURN)
return
else
user.set_machine(src)
var/dat
if(temp)
dat = "[temp]<BR><BR><A href='byond://?src=\ref[src];temp=1'>Clear</A>"
else
interact(user)
// AUTOFIXED BY fix_string_idiocy.py
dat = {"<B>The Book of Spells:</B><BR>
Spells left to memorize: [uses]<BR>
<HR>
<B>Memorize which spell:</B><BR>
<I>The number after the spell name is the cooldown time.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=magicmissile'>Magic Missile</A> (10)<BR>
<I>This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=fireball'>Fireball</A> (10)<BR>
<I>This spell fires a fireball in the direction you're facing and does not require wizard garb. Be careful not to fire it at people that are standing next to you.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=disabletech'>Disable Technology</A> (60)<BR>
<I>This spell disables all weapons, cameras and most other technology in range.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=smoke'>Smoke</A> (10)<BR>
<I>This spell spawns a cloud of choking smoke at your location and does not require wizard garb.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=blind'>Blind</A> (30)<BR>
<I>This spell temporarly blinds a single person and does not require wizard garb.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=subjugation'>Subjugation</A> (30)<BR>
<I>This spell temporarily subjugates a target's mind and does not require wizard garb.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=mindswap'>Mind Transfer</A> (60)<BR>
<I>This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=forcewall'>Forcewall</A> (10)<BR>
<I>This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=blink'>Blink</A> (2)<BR>
<I>This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=teleport'>Teleport</A> (60)<BR>
<I>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.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=mutate'>Mutate</A> (60)<BR>
<I>This spell causes you to turn into a hulk and gain telekinesis for a short while.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=etherealjaunt'>Ethereal Jaunt</A> (60)<BR>
<I>This spell creates your ethereal form, temporarily making you invisible and able to pass through walls.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=knock'>Knock</A> (10)<BR>
<I>This spell opens nearby doors and does not require wizard garb.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=horseman'>Curse of the Horseman</A> (15)<BR>
<I>This spell will curse a person to wear an unremovable horse mask (it has glue on the inside) and speak like a horse. It does not require wizard garb.</I><BR>
<CITE>A reversal spell offered for free, upon purchase.</CITE><BR>
<A href='byond://?src=\ref[src];spell_choice=noclothes'>Remove Clothes Requirement</A> <b>Warning: this takes away 2 spell choices.</b><BR>
<HR>
<B>Artefacts:</B><BR>
Powerful items imbued with eldritch magics. Summoning one will count towards your maximum number of spells.<BR>
It is recommended that only experienced wizards attempt to wield such artefacts.<BR>
<HR>
<A href='byond://?src=\ref[src];spell_choice=staffchange'>Staff of Change</A><BR>
<I>An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself.</I><BR>
<HR>
<A href='byond://?src=\ref[src];spell_choice=mentalfocus'>Mental Focus</A><BR>
<I>An artefact that channels the will of the user into destructive bolts of force.</I><BR>
<HR>
<A href='byond://?src=\ref[src];spell_choice=soulstone'>Six Soul Stone Shards and the spell Artificer</A><BR>
<I>Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot.</I><BR>
<HR>
<A href='byond://?src=\ref[src];spell_choice=armor'>Mastercrafted Armor Set</A><BR>
<I>An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space.</I><BR>
<HR>
<A href='byond://?src=\ref[src];spell_choice=staffanimation'>Staff of Animation</A><BR>
<I>An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines.</I><BR>
<HR>
<A href='byond://?src=\ref[src];spell_choice=scrying'>Scrying Orb</A><BR>
<I>An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision.</I><BR>
<HR>"}
// END AUTOFIX
if(op)
dat += "<A href='byond://?src=\ref[src];spell_choice=rememorize'>Re-memorize Spells</A><BR>"
user << browse(dat, "window=radio")
onclose(user, "radio")
return
/obj/item/weapon/spellbook/Topic(href, href_list)
/obj/item/weapon/spellbook/interact(mob/user as mob)
var/dat = null
if(temp)
dat = "[temp]<br><a href='byond://?src=\ref[src];temp=1'>Return</a>"
else
dat = "<center><h3>[spellbook.title]</h3><i>[spellbook.title_desc]</i><br>You have [uses] spell slot[uses > 1 ? "s" : ""] left.</center><br>"
dat += "<center><font color='#ff33cc'>Requires Wizard Garb</font><br><font color='#ff6600'>Selectable Target</font><br><font color='#33cc33'>Spell Charge Type: Recharge, Sacrifice, Charges</font></center><br>"
for(var/i in 1 to spellbook.spells.len)
var/name = "" //name of target
var/desc = "" //description of target
var/info = "" //additional information
if(ispath(spellbook.spells[i],/datum/spellbook))
var/datum/spellbook/S = spellbook.spells[i]
name = initial(S.name)
desc = initial(S.book_desc)
info = "<font color='#ff33cc'>[initial(S.max_uses)] Spell Slots</font>"
else if(ispath(spellbook.spells[i],/obj))
var/obj/O = spellbook.spells[i]
name = "Artefact: [capitalize(initial(O.name))]" //because 99.99% of objects dont have capitals in them and it makes it look weird.
desc = initial(O.desc)
else if(ispath(spellbook.spells[i],/spell))
var/spell/S = spellbook.spells[i]
name = initial(S.name)
desc = initial(S.desc)
var/testing = initial(S.spell_flags)
if(testing & NEEDSCLOTHES)
info = "<font color='#ff33cc'>W</font>"
var/type = ""
switch(initial(S.charge_type))
if(Sp_RECHARGE)
type = "R"
if(Sp_HOLDVAR)
type = "S"
if(Sp_CHARGES)
type = "C"
info += "<font color='#33cc33'>[type]</font>"
dat += "<A href='byond://?src=\ref[src];path=[spellbook.spells[i]]'>[name]</a>"
if(length(info))
dat += " ([info])"
dat += " ([spellbook.spells[spellbook.spells[i]]] spell slot[spellbook.spells[spellbook.spells[i]] > 1 ? "s" : "" ])"
if(spellbook.book_flags & CAN_MAKE_CONTRACTS)
dat += " <A href='byond://?src=\ref[src];path=[spellbook.spells[i]];contract=1;'>Make Contract</a>"
dat += "<br><i>[desc]</i><br>"
dat += "<center><A href='byond://?src=\ref[src];reset=1'>Re-memorize your spellbook.</a></center>"
dat += "<center><A href='byond://?src=\ref[src];lock=1'>[spellbook.book_flags & LOCKED ? "Unlock" : "Lock"] the spellbook.</a></center>"
user << browse(dat,"window=spellbook")
/obj/item/weapon/spellbook/Topic(href,href_list)
..()
var/mob/living/carbon/human/H = usr
if(H.stat || H.restrained())
return
if(!istype(H, /mob/living/carbon/human))
return 1
if(H.mind.special_role == "apprentice")
temp = "If you got caught sneaking a peak from your teacher's spellbook, you'd likely be expelled from the Wizard Academy. Better not."
if(!istype(H))
return
if(loc == H || (in_range(src, H) && istype(loc, /turf)))
H.set_machine(src)
if(href_list["spell_choice"])
if(href_list["spell_choice"] == "rememorize")
var/area/wizard_station/A = locate()
if(usr in A.contents)
uses = max_uses
H.spellremove()
temp = "All spells have been removed. You may now memorize a new set of spells."
feedback_add_details("wizard_spell_learned","UM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
else
temp = "You may only re-memorize spells whilst located inside the wizard sanctuary."
else if(uses >= 1 && max_uses >=1)
if(href_list["spell_choice"] == "noclothes")
if(uses < 2)
return
uses--
/*
*/
var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", subjugation = "Subjugation", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", removehorseman = "Remove Curse of the Horseman", staffchange = "Staff of Change", mentalfocus = "Mental Focus", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", noclothes = "No Clothes")
var/already_knows = 0
for(var/spell/aspell in H.spell_list)
if(available_spells[href_list["spell_choice"]] == initial(aspell.name))
already_knows = 1
if(!aspell.can_improve())
temp = "This spell cannot be improved further."
uses++
break
else
if(aspell.can_improve("speed") && aspell.can_improve("power"))
switch(alert(src, "Do you want to upgrade this spell's speed or power?", "Select Upgrade", "Speed", "Power", "Cancel"))
if("Speed")
temp = aspell.quicken_spell()
if("Power")
temp = aspell.empower_spell()
else
uses++
break
else if (aspell.can_improve("speed"))
temp = aspell.quicken_spell()
else if (aspell.can_improve("power"))
temp = aspell.empower_spell()
/*
*/
if(!already_knows)
switch(href_list["spell_choice"])
if("noclothes")
feedback_add_details("wizard_spell_learned","NC")
H.add_spell(new/spell/noclothes)
temp = "This teaches you how to use your spells without your magical garb, truely you are the wizardest."
uses--
if("magicmissile")
feedback_add_details("wizard_spell_learned","MM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.add_spell(new/spell/targeted/projectile/magic_missile)
temp = "You have learned magic missile."
if("fireball")
feedback_add_details("wizard_spell_learned","FB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.add_spell(new/spell/targeted/projectile/dumbfire/fireball)
temp = "You have learned fireball."
if("disabletech")
feedback_add_details("wizard_spell_learned","DT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.add_spell(new/spell/aoe_turf/disable_tech)
temp = "You have learned disable technology."
if("smoke")
feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.add_spell(new/spell/aoe_turf/smoke)
temp = "You have learned smoke."
if("blind")
feedback_add_details("wizard_spell_learned","BD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.add_spell(new/spell/targeted/genetic/blind)
temp = "You have learned blind."
if("subjugation")
feedback_add_details("wizard_spell_learned","SJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.add_spell(new/spell/targeted/subjugation)
temp = "You have learned subjugate."
if("mindswap")
feedback_add_details("wizard_spell_learned","MT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.add_spell(new/spell/targeted/mind_transfer)
temp = "You have learned mindswap."
if("forcewall")
feedback_add_details("wizard_spell_learned","FW") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.add_spell(new/spell/aoe_turf/conjure/forcewall)
temp = "You have learned forcewall."
if("blink")
feedback_add_details("wizard_spell_learned","BL") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.add_spell(new/spell/aoe_turf/blink)
temp = "You have learned blink."
if("teleport")
feedback_add_details("wizard_spell_learned","TP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.add_spell(new/spell/area_teleport)
temp = "You have learned teleport."
if("mutate")
feedback_add_details("wizard_spell_learned","MU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.add_spell(new/spell/targeted/genetic/mutate)
temp = "You have learned mutate."
if("etherealjaunt")
feedback_add_details("wizard_spell_learned","EJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.add_spell(new/spell/targeted/ethereal_jaunt)
temp = "You have learned ethereal jaunt."
if("knock")
feedback_add_details("wizard_spell_learned","KN") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.add_spell(new/spell/aoe_turf/knock)
temp = "You have learned knock."
if("horseman")
feedback_add_details("wizard_spell_learned","HH") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.add_spell(new/spell/targeted/equip_item/horsemask)
if (alert("Do you want a spell that can lift this curse, too? (Does not cost a spellpoint.)",,"Yes","No") == "Yes")
feedback_add_details("wizard_spell_learned","RH")
H.add_spell(new/spell/targeted/equip_item/remove_horsemask)
temp = "You have learned curse of the horseman."
if("removehorseman")
feedback_add_details("wizard_spell_learned", "RH")
H.add_spell(new/spell/targeted/equip_item/remove_horsemask)
temp = "You have learned remove curse of the horseman."
uses++ //no point it making it cost points
if("staffchange")
feedback_add_details("wizard_spell_learned","ST") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/gun/energy/staff(get_turf(H))
temp = "You have purchased a staff of change."
max_uses--
if("mentalfocus")
feedback_add_details("wizard_spell_learned","MF") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/gun/energy/staff/focus(get_turf(H))
temp = "An artefact that channels the will of the user into destructive bolts of force."
max_uses--
if("soulstone")
feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/storage/belt/soulstone/full(get_turf(H))
H.add_spell(new/spell/aoe_turf/conjure/construct)
temp = "You have purchased a belt full of soulstones and have learned the artificer spell."
max_uses--
if("armor")
feedback_add_details("wizard_spell_learned","HS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/clothing/shoes/sandal(get_turf(H)) //In case they've lost them.
new /obj/item/clothing/gloves/purple(get_turf(H))//To complete the outfit
new /obj/item/clothing/suit/space/void/wizard(get_turf(H))
new /obj/item/clothing/head/helmet/space/void/wizard(get_turf(H))
temp = "You have purchased a suit of wizard armor."
max_uses--
if("staffanimation")
feedback_add_details("wizard_spell_learned","SA") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/gun/energy/staff/animate(get_turf(H))
temp = "You have purchased a staff of animation."
max_uses--
if("scrying")
feedback_add_details("wizard_spell_learned","SO") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/scrying(get_turf(H))
if (!(XRAY in H.mutations))
H.mutations.Add(XRAY)
H.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
H.see_in_dark = 8
H.see_invisible = SEE_INVISIBLE_LEVEL_TWO
H << "<span class='notice'>The walls suddenly disappear.</span>"
temp = "You have purchased a scrying orb, and gained x-ray vision."
max_uses--
if(H.mind && spellbook.book_flags & LOCKED && H.mind.special_role == "apprentice") //make sure no scrubs get behind the lock
return
if(!H.contents.Find(src))
H << browse(null,"window=spellbook")
return
if(href_list["lock"])
if(spellbook.book_flags & LOCKED)
spellbook.book_flags &= ~LOCKED
else
if(href_list["temp"])
temp = null
attack_self()
spellbook.book_flags |= LOCKED
return
if(href_list["temp"])
temp = null
//Single Use Spellbooks//
/obj/item/weapon/spellbook/oneuse
var/spell = /spell/targeted/projectile/magic_missile //just a placeholder to avoid runtimes if someone spawned the generic
var/spellname = "sandbox"
var/used = 0
name = "spellbook of "
uses = 1
max_uses = 1
desc = "This template spellbook was never meant for the eyes of man..."
/obj/item/weapon/spellbook/oneuse/New()
..()
name += spellname
/obj/item/weapon/spellbook/oneuse/attack_self(mob/user as mob)
var/spell/S = new spell(user)
for(var/spell/knownspell in user.spell_list)
if(knownspell.type == S.type)
if(user.mind)
// TODO: Update to new antagonist system.
if(user.mind.special_role == "apprentice" || user.mind.special_role == "Wizard")
user <<"<span class='notice'>You're already far more versed in this spell than this flimsy how-to book can provide.</span>"
else
user <<"<span class='notice'>You've already read this one.</span>"
if(href_list["path"])
var/path = text2path(href_list["path"])
if(uses < spellbook.spells[path])
usr << "<span class='notice'>You do not have enough spell slots to purchase this.</span>"
return
if(used)
recoil(user)
else
user.add_spell(S)
user <<"<span class='notice'>you rapidly read through the arcane book. Suddenly you realize you understand [spellname]!</span>"
user.attack_log += text("\[[time_stamp()]\] <font color='orange'>[user.real_name] ([user.ckey]) learned the spell [spellname] ([S]).</font>")
onlearned(user)
uses -= spellbook.spells[path]
send_feedback(path) //feedback stuff
if(ispath(path,/datum/spellbook))
src.set_spellbook(path)
temp = "You have chosen a new spellbook."
else
if(href_list["contract"])
if(!(spellbook.book_flags & CAN_MAKE_CONTRACTS))
return //no
spellbook.max_uses -= spellbook.spells[path] //no basksies
var/obj/O = new /obj/item/weapon/contract/boon(get_turf(usr),path)
temp = "You have purchased \the [O]."
else
if(ispath(path,/spell))
temp = src.add_spell(usr,path)
else
var/obj/O = new path(get_turf(usr))
temp = "You have purchased \a [O]."
spellbook.max_uses -= spellbook.spells[path]
//finally give it a bit of an oomf
playsound(get_turf(usr),'sound/effects/phasein.ogg',50,1)
if(href_list["reset"])
var/area/wizard_station/A = locate()
if(usr in A.contents)
uses = spellbook.max_uses
H.spellremove()
temp = "All spells have been removed. You may now memorize a new set of spells."
feedback_add_details("wizard_spell_learned","UM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
else
usr << "<span class='warning'>You must be in the wizard academy to re-memorize your spells.</span>"
/obj/item/weapon/spellbook/oneuse/proc/recoil(mob/user as mob)
user.visible_message("<span class='warning'>[src] glows in a black light!</span>")
/obj/item/weapon/spellbook/oneuse/proc/onlearned(mob/user as mob)
used = 1
user.visible_message("<span class='caution'>[src] glows dark for a second!</span>")
/obj/item/weapon/spellbook/oneuse/attackby()
return
/obj/item/weapon/spellbook/oneuse/fireball
spell = /spell/targeted/projectile/dumbfire/fireball
spellname = "fireball"
icon_state ="bookfireball"
desc = "This book feels warm to the touch."
/obj/item/weapon/spellbook/oneuse/fireball/recoil(mob/user as mob)
..()
explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2)
qdel(src)
/obj/item/weapon/spellbook/oneuse/smoke
spell = /spell/aoe_turf/smoke
spellname = "smoke"
icon_state ="booksmoke"
desc = "This book is overflowing with the dank arts."
/obj/item/weapon/spellbook/oneuse/smoke/recoil(mob/user as mob)
..()
user <<"<span class='caution'>Your stomach rumbles...</span>"
if(user.nutrition)
user.nutrition -= 200
if(user.nutrition <= 0)
user.nutrition = 0
/obj/item/weapon/spellbook/oneuse/blind
spell = /spell/targeted/genetic/blind
spellname = "blind"
icon_state ="bookblind"
desc = "This book looks blurry, no matter how you look at it."
/obj/item/weapon/spellbook/oneuse/blind/recoil(mob/user as mob)
..()
user <<"<span class='warning'>You go blind!</span>"
user.eye_blind = 10
/obj/item/weapon/spellbook/oneuse/mindswap
spell = /spell/targeted/mind_transfer
spellname = "mindswap"
icon_state ="bookmindswap"
desc = "This book's cover is pristine, though its pages look ragged and torn."
var/mob/stored_swap = null //Used in used book recoils to store an identity for mindswaps
/obj/item/weapon/spellbook/oneuse/mindswap/onlearned()
spellname = pick("fireball","smoke","blind","forcewall","knock","horses","charge")
icon_state = "book[spellname]"
name = "spellbook of [spellname]" //Note, desc doesn't change by design
..()
/obj/item/weapon/spellbook/oneuse/mindswap/recoil(mob/user as mob)
..()
if(stored_swap in dead_mob_list)
stored_swap = null
if(!stored_swap)
stored_swap = user
user <<"<span class='warning'>For a moment you feel like you don't even know who you are anymore.</span>"
return
if(stored_swap == user)
user <<"<span class='notice'>You stare at the book some more, but there doesn't seem to be anything else to learn...</span>"
return
if(user.mind.special_verbs.len)
for(var/V in user.mind.special_verbs)
user.verbs -= V
if(stored_swap.mind.special_verbs.len)
for(var/V in stored_swap.mind.special_verbs)
stored_swap.verbs -= V
var/mob/dead/observer/ghost = stored_swap.ghostize(0)
ghost.spell_list = stored_swap.spell_list
user.mind.transfer_to(stored_swap)
stored_swap.spell_list = user.spell_list
if(stored_swap.mind.special_verbs.len)
for(var/V in user.mind.special_verbs)
user.verbs += V
ghost.mind.transfer_to(user)
user.key = ghost.key
user.spell_list = ghost.spell_list
if(user.mind.special_verbs.len)
for(var/V in user.mind.special_verbs)
user.verbs += V
stored_swap <<"<span class='warning'>You're suddenly somewhere else... and someone else?!</span>"
user <<"<span class='warning'>Suddenly you're staring at [src] again... where are you, who are you?!</span>"
stored_swap = null
/obj/item/weapon/spellbook/oneuse/forcewall
spell = /spell/aoe_turf/conjure/forcewall
spellname = "forcewall"
icon_state ="bookforcewall"
desc = "This book has a dedication to mimes everywhere inside the front cover."
/obj/item/weapon/spellbook/oneuse/forcewall/recoil(mob/user as mob)
..()
user <<"<span class='warning'>You suddenly feel very solid!</span>"
var/obj/structure/closet/statue/S = new /obj/structure/closet/statue(user.loc, user)
S.timer = 30
user.drop_item()
src.interact(usr)
/obj/item/weapon/spellbook/oneuse/knock
spell = /spell/aoe_turf/knock
spellname = "knock"
icon_state ="bookknock"
desc = "This book is hard to hold closed properly."
/obj/item/weapon/spellbook/proc/send_feedback(var/path)
if(ispath(path,/datum/spellbook))
var/datum/spellbook/S = path
feedback_add_details("wizard_spell_learned","[initial(S.feedback)]")
else if(ispath(path,/spell))
var/spell/S = path
feedback_add_details("wizard_spell_learned","[initial(S.feedback)]")
else if(ispath(path,/obj))
feedback_add_details("wizard_spell_learned","[artefact_feedback[path]]")
/obj/item/weapon/spellbook/oneuse/knock/recoil(mob/user as mob)
..()
user <<"<span class='warning'>You're knocked down!</span>"
user.Weaken(20)
/obj/item/weapon/spellbook/oneuse/horsemask
spell = /spell/targeted/equip_item/horsemask
spellname = "horses"
icon_state ="bookhorses"
desc = "This book is more horse than your mind has room for."
/obj/item/weapon/spellbook/proc/add_spell(var/mob/user, var/spell_path)
for(var/spell/S in user.spell_list)
if(istype(S,spell_path))
if(!S.can_improve())
uses += spellbook.spells[spell_path]
return "You cannot improve the spell [S] further."
if(S.can_improve(Sp_SPEED) && S.can_improve(Sp_POWER))
switch(alert(user, "Do you want to upgrade this spell's speed or power?", "Spell upgrade", "Speed", "Power", "Cancel"))
if("Speed")
return S.quicken_spell()
if("Power")
return S.empower_spell()
else
uses += spellbook.spells[spell_path]
return
else if(S.can_improve(Sp_POWER))
return S.empower_spell()
else if(S.can_improve(Sp_SPEED))
return S.quicken_spell()
/obj/item/weapon/spellbook/oneuse/remove_horsemask
spell = /spell/targeted/equip_item/remove_horsemask
spellname = "remove horsehead"
icon_state ="bookhorses"
desc = "This book is less horse than your mind has room for."
var/spell/S = new spell_path()
user.add_spell(S)
return "You learn the spell [S]"
/obj/item/weapon/spellbook/oneuse/horsemask/recoil(mob/living/carbon/user as mob)
if(istype(user, /mob/living/carbon/human))
user <<"<font size='15' color='red'><b>HOR-SIE HAS RISEN</b></font>"
var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead
magichead.canremove = 0 //curses!
magichead.flags_inv = null //so you can still see their face
magichead.voicechange = 1 //NEEEEIIGHH
user.drop_from_inventory(user.wear_mask)
user.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1)
qdel(src)
else
user <<"<span class='notice'>I say thee neigh</span>"
/obj/item/weapon/spellbook/oneuse/charge
spell = /spell/aoe_turf/charge
spellname = "charging"
icon_state ="bookcharge"
desc = "This book is made of 100% post-consumer wizard."
/obj/item/weapon/spellbook/oneuse/charge/recoil(mob/user as mob)
..()
user <<"<span class='warning'>[src] suddenly feels very warm!</span>"
empulse(src, 1, 1)
/datum/spellbook
var/name = "\improper book of tomes"
var/desc = "The legendary book of spells of the wizard."
var/book_desc = "Holds information on the various tomes available to a wizard"
var/feedback = "" //doesn't need one.
var/book_flags = 0
var/max_uses = 1
var/title = "Book of Tomes"
var/title_desc = "This tome marks down all the available tomes for use. Choose wisely, there are no refunds."
var/list/spells = list(/datum/spellbook/standard = 1,
/datum/spellbook/cleric = 1,
/datum/spellbook/battlemage = 1,
/datum/spellbook/spatial = 1,
/datum/spellbook/druid = 1,
/datum/spellbook/necromancer = 1,
/datum/spellbook/student = 1
) //spell's path = cost of spell
@@ -0,0 +1,34 @@
/obj/item/weapon/spellbook/battlemage
spellbook_type = /datum/spellbook/battlemage
/datum/spellbook/battlemage
name = "\improper battlemage's bible"
feedback = "BM"
desc = "A treatise on the use of magic in combat situation."
book_desc = "Mix physical with the mystical in head to head combat."
title = "The Art of Magical Combat"
title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent."
book_flags = CAN_MAKE_CONTRACTS
max_uses = 5
spells = list(/spell/targeted/projectile/dumbfire/passage = 1,
/spell/targeted/equip_item/shield = 1,
/spell/targeted/projectile/dumbfire/fireball = 1,
/spell/targeted/projectile/magic_missile = 1,
/spell/targeted/torment = 1,
/spell/targeted/heal_target = 2,
/spell/targeted/genetic/mutate = 1,
/spell/targeted/mind_transfer = 2,
/spell/targeted/projectile/dumbfire/stuncuff = 2,
/spell/aoe_turf/conjure/mirage = 1,
/spell/targeted/shapeshift/corrupt_form = 1,
/spell/noclothes = 1,
/obj/structure/closet/wizard/armor = 1,
/obj/item/weapon/gun/energy/staff/focus = 1,
/obj/item/weapon/gun/energy/staff/chaos = 1,
/obj/item/weapon/storage/belt/wands/full = 2,
/obj/item/weapon/melee/energy/wizard = 2,
/obj/item/weapon/monster_manual = 2,
/obj/item/weapon/contract/apprentice = 1
)
+30
View File
@@ -0,0 +1,30 @@
/obj/item/weapon/spellbook/cleric
spellbook_type = /datum/spellbook/cleric
/datum/spellbook/cleric
name = "\improper cleric's tome"
feedback = "CR"
desc = "For those who do not harm, or at least feel sorry about it."
book_desc = "All about healing. Mobility and offense comes at a higher price but not impossible."
title = "Cleric's Tome of Healing"
title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent."
book_flags = CAN_MAKE_CONTRACTS
max_uses = 6
spells = list(/spell/targeted/heal_target = 1,
/spell/targeted/heal_target/major = 1,
/spell/targeted/heal_target/area = 1,
/spell/targeted/heal_target/sacrifice = 1,
/spell/targeted/genetic/blind = 1,
/spell/targeted/shapeshift/baleful_polymorph = 1,
/spell/targeted/projectile/dumbfire/stuncuff = 1,
/spell/targeted/ethereal_jaunt = 2,
/spell/aoe_turf/knock = 1,
/spell/targeted/equip_item/holy_relic = 1,
/spell/aoe_turf/conjure/grove/sanctuary = 1,
/spell/targeted/projectile/dumbfire/fireball = 2,
/spell/aoe_turf/conjure/forcewall = 1,
/obj/item/weapon/gun/energy/staff/focus = 2,
/obj/item/weapon/storage/belt/wands/full = 2,
/obj/item/weapon/contract/apprentice = 1
)
+28
View File
@@ -0,0 +1,28 @@
/obj/item/weapon/spellbook/druid
spellbook_type = /datum/spellbook/druid
/datum/spellbook/druid
name = "\improper druid's leaflet"
feedback = "DL"
desc = "It smells like an air freshener."
book_desc = "Summons, nature, and a bit o' healin."
title = "Druidic Guide on how to be smug about nature"
title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent."
book_flags = CAN_MAKE_CONTRACTS
max_uses = 5
spells = list(/spell/targeted/heal_target = 1,
/spell/targeted/heal_target/sacrifice = 1,
/spell/aoe_turf/conjure/mirage = 1,
/spell/aoe_turf/conjure/summon/bats = 1,
/spell/aoe_turf/conjure/summon/bear = 1,
/spell/targeted/equip_item/party_hardy = 1,
/spell/targeted/equip_item/seed = 1,
/spell/aoe_turf/disable_tech = 1,
/spell/targeted/entangle = 1,
/spell/aoe_turf/conjure/grove/sanctuary = 1,
/spell/aoe_turf/knock = 1,
/obj/structure/closet/wizard/souls = 1,
/obj/item/weapon/monster_manual = 1,
/obj/item/weapon/contract/apprentice = 1
)
@@ -0,0 +1,31 @@
/obj/item/weapon/spellbook/necromancer
spellbook_type = /datum/spellbook/necromancer
/datum/spellbook/necromancer
name = "\improper necromancer's grimoire"
feedback = "NG"
desc = "A grimoire full of spells dealing with the death and the afterlife."
book_desc = "A spellbook full of dark magic dealing mostly with the afterlife."
title = "The Art of Necromancy"
title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent."
book_flags = CAN_MAKE_CONTRACTS
max_uses = 5
spells = list(/spell/targeted/projectile/dumbfire/fireball = 1,
/spell/targeted/torment = 1,
/spell/mark_recall = 1,
/spell/targeted/subjugation = 1,
/spell/targeted/lichdom = 2,
/spell/aoe_turf/conjure/mirage = 1,
/spell/aoe_turf/conjure/summon/bats = 1,
/spell/targeted/shapeshift/corrupt_form = 1,
/spell/targeted/life_steal = 1,
/spell/targeted/raise_dead = 1,
/spell/shadow_shroud = 1,
/spell/noclothes = 1,
/obj/structure/closet/wizard/armor = 1,
/obj/structure/closet/wizard/scrying = 2,
/obj/structure/closet/wizard/souls = 1,
/obj/item/weapon/contract/apprentice = 1
)
+30
View File
@@ -0,0 +1,30 @@
/obj/item/weapon/spellbook/spatial
spellbook_type = /datum/spellbook/spatial
/datum/spellbook/spatial
name = "\improper spatial manual"
feedback = "SP"
desc = "You feel like this might disappear from out of under you."
book_desc = "Movement and teleportation. Run from your problems!"
title = "Manual of Spatial Transportation"
title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent."
book_flags = CAN_MAKE_CONTRACTS
max_uses = 10
spells = list(/spell/targeted/ethereal_jaunt = 1,
/spell/aoe_turf/blink = 1,
/spell/area_teleport = 1,
/spell/targeted/projectile/dumbfire/passage = 1,
/spell/mark_recall = 1,
/spell/targeted/swap = 1,
/spell/targeted/shapeshift/avian = 1,
/spell/targeted/projectile/magic_missile = 2,
/spell/aoe_turf/conjure/forcewall = 1,
/spell/aoe_turf/smoke = 1,
/spell/aoe_turf/conjure/summon/bats = 3,
/obj/item/weapon/contract/wizard/tk = 5,
/obj/structure/closet/wizard/scrying = 2,
/obj/item/weapon/storage/belt/wands/full = 4,
/obj/item/weapon/teleportation_scroll = 1,
/obj/item/weapon/contract/apprentice = 1
)
+35
View File
@@ -0,0 +1,35 @@
/obj/item/weapon/spellbook/standard
spellbook_type = /datum/spellbook/standard
/datum/spellbook/standard
name = "\improper standard spellbook"
feedback = "SB"
title = "Book of Spells and Artefacts"
title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent."
book_desc = "A general wizard's spellbook. All its spells are easy to use but hard to master."
book_flags = CAN_MAKE_CONTRACTS
max_uses = 5
spells = list(/spell/targeted/projectile/magic_missile = 1,
/spell/targeted/projectile/dumbfire/fireball = 1,
/spell/aoe_turf/disable_tech = 1,
/spell/aoe_turf/smoke = 1,
/spell/targeted/genetic/blind = 1,
/spell/targeted/subjugation = 1,
/spell/targeted/mind_transfer = 1,
/spell/aoe_turf/conjure/forcewall = 1,
/spell/aoe_turf/blink = 1,
/spell/area_teleport = 1,
/spell/targeted/genetic/mutate = 1,
/spell/targeted/ethereal_jaunt = 1,
/spell/aoe_turf/knock = 1,
/spell/noclothes = 2,
/obj/item/weapon/gun/energy/staff = 1,
/obj/item/weapon/gun/energy/staff/focus = 1,
/obj/structure/closet/wizard/souls = 1,
/obj/structure/closet/wizard/armor = 1,
/obj/item/weapon/gun/energy/staff/animate = 1,
/obj/structure/closet/wizard/scrying = 1,
/obj/item/weapon/monster_manual = 2,
/obj/item/weapon/contract/apprentice = 1
)
+28
View File
@@ -0,0 +1,28 @@
/obj/item/weapon/spellbook/student
spellbook_type = /datum/spellbook/student
/datum/spellbook/student
name = "\improper student's spellbook"
feedback = "ST"
desc = "This spell book has a sticker on it that says, 'certified for children 5 and older'."
book_desc = "This spellbook is dedicated to teaching neophytes in the ways of magic."
title = "Book of Spells and Education"
title_desc = "Hello. Congratulations on becoming a wizard. You may be asking yourself: What? A wizard? Already? Of course! \
Anybody can become a wizard! Learning to be a good one is the hard part.<br>Without further adue, let us begin by learning the three concepts of wizardry, 'Spell slots', 'Spells', and \
'Artifacts'.<br>Firstly lets try to understand the 'spell slot'. A spell slot is the measurable amount of spells and artifacts one tome can give. Most spells will only take up a singular spell slot, however more \
powerful spells/artifacts can take up more.<br>Spells are spells. They can have requirements, such as wizard garb, and most can be upgraded by purchasing additional spell slots for them. \
Most upgrades fall into two categories, 'Speed' and 'Power'. Speed upgrades decrease the time you have to spend recharging your spell. \
Power increases the potency of your spells. Spells are also special in that they can be refunded while inside the Wizard Acadamy, so if you want to test a spell out before moving out into the field, feel free to do that in the comfort of our \
home.<br>Artifacts, or 'Artefacts' as we call them, are powerful wizard tools or items made specially for wizards everywhere. Extremely potent, they cannot be refunded like spells, and some of them can be used by non-wizards, \
so be careful!<br>Knowing these three concepts puts you in a league above most wizards, however knowledge of spells is just as important so we've included a list of spells below made specifically for the beginning wizard. Take all of them, or mix and match, \
remember being creative is half of being a wizard!"
book_flags = CAN_MAKE_CONTRACTS
max_uses = 5
spells = list(/spell/aoe_turf/knock = 1,
/spell/targeted/ethereal_jaunt = 1,
/spell/targeted/projectile/magic_missile = 1,
/obj/item/weapon/gun/energy/staff/focus = 1,
/obj/item/weapon/storage/belt/wands/full = 2,
/obj/item/weapon/contract/wizard/xray = 1
)
+42
View File
@@ -0,0 +1,42 @@
/obj/structure/closet/wizard
name = "artifact closet"
desc = "a special lead lined closet used to hold artifacts of immense power."
icon = 'icons/obj/closet.dmi'
icon_state = "acloset"
icon_closed = "acloset"
icon_opened = "aclosetopen"
/obj/structure/closet/wizard/New()
..()
var/obj/structure/bigDelivery/package = new /obj/structure/bigDelivery(get_turf(src))
package.wrapped = src
package.examtext = "Imported straight from the Wizard Academy. Do not lose the contents or suffer a demerit."
src.forceMove(package)
package.update_icon()
/obj/structure/closet/wizard/armor
name = "mastercrafted armor set"
desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space."
/obj/structure/closet/wizard/armor/New()
..()
new /obj/item/clothing/suit/space/void/wizard(src)
new /obj/item/clothing/head/helmet/space/void/wizard(src)
/obj/structure/closet/wizard/scrying
name = "scrying orb"
desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision."
/obj/structure/closet/wizard/scrying/New()
..()
new /obj/item/weapon/scrying(src)
new /obj/item/weapon/contract/wizard/xray(src)
/obj/structure/closet/wizard/souls
name = "soul shard belt"
desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot. This also includes the spell Artificer, used to create the shells used in construct creation."
/obj/structure/closet/wizard/souls/New()
..()
new /obj/item/weapon/contract/boon/wizard/artificer(src)
new /obj/item/weapon/storage/belt/soulstone/full(src)
@@ -0,0 +1,112 @@
/spell/targeted/heal_target
name = "Cure Light Wounds"
desc = "a rudimentary spell used mainly by wizards to heal papercuts."
feedback = "CL"
school = "cleric"
charge_max = 200
spell_flags = INCLUDEUSER | SELECTABLE
invocation = "Di'Nath"
invocation_type = SpI_SHOUT
range = 2
max_targets = 1
level_max = list(Sp_TOTAL = 2, Sp_SPEED = 1, Sp_POWER = 2)
cooldown_reduc = 50
hud_state = "heal_minor"
amt_dam_brute = -3
amt_dam_fire = -1
message = "You feel a pleasant rush of heat move through your body."
/spell/targeted/heal_target/empower_spell()
if(!..())
return 0
amt_dam_brute -= 3
amt_dam_fire -= 3
return "[src] will now heal more."
/spell/targeted/heal_target/major
name = "Cure Major Wounds"
desc = "A spell used to fix others that cannot be fixed with regular medicine."
feedback = "CM"
charge_max = 300
spell_flags = SELECTABLE | NEEDSCLOTHES
invocation = "Borv Di'Nath"
range = 1
level_max = list(Sp_TOTAL = 2, Sp_SPEED = 1, Sp_POWER = 1)
cooldown_reduc = 100
hud_state = "heal_major"
amt_dam_brute = -15
amt_dam_fire = -5
message = "Your body feels like a furnace."
/spell/targeted/heal_target/major/empower_spell()
if(!..())
return 0
amt_dam_tox = -10
amt_dam_oxy = -7
return "[src] now heals oxygen loss and toxic damage."
/spell/targeted/heal_target/area
name = "Cure Area"
desc = "This spell heals everyone in an area."
feedback = "HA"
charge_max = 600
spell_flags = INCLUDEUSER
invocation = "Nal Di'Nath"
range = 2
max_targets = 0
level_max = list(Sp_TOTAL = 1, Sp_SPEED = 1, Sp_POWER = 1)
cooldown_reduc = 300
hud_state = "heal_area"
amt_dam_brute = -5
amt_dam_fire = -5
/spell/targeted/heal_target/area/empower_spell()
if(!..())
return 0
amt_dam_brute -= 3
amt_dam_fire -= 3
range += 2
return "[src] now heals more in a wider area."
/spell/targeted/heal_target/sacrifice
name = "Sacrifice"
desc = "This spell heals immensily. For a price."
feedback = "SF"
spell_flags = SELECTABLE
invocation = "Ei'Nath Borv Di'Nath"
charge_type = Sp_HOLDVAR
holder_var_type = "bruteloss"
holder_var_amount = 75
level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1)
amt_dam_brute = -50
amt_dam_fire = -50
amt_dam_oxy = -50
amt_dam_tox = -50
hud_state = "gen_dissolve"
/spell/targeted/heal_target/sacrifice/empower_spell()
if(!..())
return 0
holder_var_amount *= 2
amt_dam_brute *= 2
amt_dam_fire *= 2
amt_dam_oxy *= 2
amt_dam_tox *= 2
return "You will now heal twice as much, but take twice as much damage. It will probably kill you."
+51
View File
@@ -0,0 +1,51 @@
/spell/targeted/entangle
name = "Entangle"
desc = "This spell creates vines that immediately entangle a nearby victim."
feedback = "ET"
school = "conjuration"
charge_max = 600
spell_flags = NEEDSCLOTHES | SELECTABLE | IGNOREPREV
invocation = "BU EKEL 'INAS"
invocation_type = SpI_SHOUT
range = 3
max_targets = 1
cast_sound = 'sound/species/diona/gestalt_split.ogg'
level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2)
cooldown_min = 300
duration = 30
hud_state = "wiz_entangle"
var/datum/seed/seed
/spell/targeted/entangle/New()
..()
seed = new()
seed.set_trait(TRAIT_PLANT_ICON,"flower")
seed.set_trait(TRAIT_PRODUCT_ICON,"flower2")
seed.set_trait(TRAIT_PRODUCT_COLOUR,"#4d4dff")
seed.set_trait(TRAIT_SPREAD,2)
seed.name = "heirlooms"
seed.seed_name = "heirloom"
seed.display_name = "vines"
seed.chems = list("nutriment" = list(1,20))
/spell/targeted/entangle/cast(var/list/targets)
for(var/mob/M in targets)
var/turf/T = get_turf(M)
var/obj/effect/plant/single/P = new(T,seed)
P.can_buckle = 1
P.health = P.max_health
P.mature_time = 0
P.process()
P.buckle_mob(M)
M.set_dir(pick(cardinal))
M.visible_message("<span class='danger'>[P] appear from the floor, spinning around \the [M] tightly!</span>")
/spell/targeted/entangle/empower_spell()
if(!..())
return 0
max_targets++
return "This spell will now entangle [max_targets] people at the same time."
+8 -16
View File
@@ -5,8 +5,6 @@
var/list/equipped_summons = list() //assoc list of text ids and paths to spawn
var/list/remove_equipped = list() //assoc list of text ids and paths to remove
var/list/summoned_items = list() //list of items we summoned and will dispose when the spell runs out
var/delete_old = 1 //if the item previously in the slot is deleted - otherwise, it's dropped
@@ -14,20 +12,14 @@
/spell/targeted/equip_item/cast(list/targets, mob/user = usr)
..()
for(var/mob/living/L in targets)
for(var/slot_id in remove_equipped)
slot_id = text2num(slot_id)
if (istype(L.get_equipped_item(slot_id), /obj/item/clothing/mask/horsehead))
var/obj/item/old_item = L.get_equipped_item(slot_id)
L.remove_from_mob(old_item)
if (prob(40))
if(delete_old)
qdel(old_item)
else
old_item.loc = L.loc
for(var/slot_id in equipped_summons)
var/to_create = equipped_summons[slot_id]
slot_id = text2num(slot_id) //because the index is text, we access this instead
if(cmptext(slot_id,"active hand"))
slot_id = (user.hand ? slot_l_hand : slot_r_hand)
else if(cmptext(slot_id, "off hand"))
slot_id = (user.hand ? slot_r_hand : slot_l_hand)
else
slot_id = text2num(slot_id) //because the index is text, we access this instead
var/obj/item/new_item = summon_item(to_create)
var/obj/item/old_item = L.get_equipped_item(slot_id)
L.equip_to_slot(new_item, slot_id)
@@ -47,7 +39,7 @@
if(istype(to_remove.loc, /mob))
var/mob/M = to_remove.loc
M.remove_from_mob(to_remove)
qdel(to_remove)
qdel(to_remove)
/spell/targeted/equip_item/proc/summon_item(var/newtype)
return new newtype
return new newtype
@@ -0,0 +1,34 @@
/spell/targeted/equip_item/holy_relic
name = "Summon Holy Relic"
desc = "This spell summons a relic of purity into your hand for a short while."
feedback = "SR"
school = "transmutation"
charge_type = Sp_RECHARGE
charge_max = 600
spell_flags = NEEDSCLOTHES | INCLUDEUSER
invocation = "YEE' RO SU!"
invocation_type = SpI_SHOUT
range = -1
max_targets = 1
level_max = list(Sp_TOTAL = 2, Sp_SPEED = 1, Sp_POWER = 1)
duration = 250
cooldown_min = 350
delete_old = 0
compatible_mobs = list(/mob/living/carbon/human)
hud_state = "purge1"
equipped_summons = list("active hand" = /obj/item/weapon/nullrod)
/spell/targeted/equip_item/holy_relic/cast(list/targets, mob/user = usr)
..()
for(var/mob/M in targets)
M.visible_message("A rod of metal appears in \the [M]'s hand!")
/spell/targeted/equip_item/holy_relic/empower_spell()
if(!..())
return 0
duration += 50
return "The holy relic now lasts for [duration/10] seconds."
@@ -31,7 +31,7 @@
/spell/targeted/equip_item/horsemask/summon_item(var/new_type)
var/obj/item/new_item = new new_type
new_item.canremove = 0 //curses!
new_item.unacidable = 1
// new_item.unacidable = 1
if(istype(new_item, /obj/item/clothing/mask/horsehead))
var/obj/item/clothing/mask/horsehead/magichead = new_item
magichead.flags_inv = null //so you can still see their face
@@ -0,0 +1,36 @@
/spell/targeted/equip_item/party_hardy
name = "Summon Party"
desc = "This spell was invented for the sole purpose of getting crunked at 11am on a Tuesday."
feedback = "PY"
school = "transmutation"
charge_type = Sp_RECHARGE
charge_max = 900
cooldown_min = 600
spell_flags = INCLUDEUSER
invocation = "LSET SU G'ET RUCKEND!"
invocation_type = SpI_SHOUT
range = 6
max_targets = 0
level_max = list(Sp_TOTAL = 3, Sp_SPEED = 1, Sp_POWER = 2)
delete_old = 0
hud_state = "wiz_party"
compatible_mobs = list(/mob/living/carbon/human)
equipped_summons = list("active hand" = /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer)
/spell/targeted/equip_item/party_hardy/empower_spell()
if(!..())
return 0
switch(spell_levels[Sp_POWER])
if(1)
equipped_summons = list("active hand" = /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
"off hand" = /obj/item/weapon/reagent_containers/food/snacks/poppypretzel)
return "The spell will now give everybody a preztel as well."
if(2)
equipped_summons = list("active hand" = /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe,
"off hand" = /obj/item/weapon/reagent_containers/food/snacks/poppypretzel,
"[slot_head]" = /obj/item/clothing/head/collectable/wizard)
return "Woo! Now everybody gets a cool wizard hat and MORE BOOZE!"
return 0
@@ -0,0 +1,21 @@
/spell/targeted/equip_item/seed
name = "Summon Seed"
desc = "This spell summons a random seed into the hand of the wizard."
feedback = "SE"
delete_old = 0
spell_flags = INCLUDEUSER | NEEDSCLOTHES
invocation_type = SpI_WHISPER
invocation = "Ria'li akta"
equipped_summons = list("active hand" = /obj/item/seeds/random)
compatible_mobs = list(/mob/living/carbon/human)
charge_max = 600 //1 minute
cooldown_min = 200 //20 seconds
level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 0)
range = -1
max_targets = 1
hud_state = "wiz_seed"
@@ -0,0 +1,41 @@
/spell/targeted/equip_item/shield
name = "Summon Shield"
desc = "Summons the most holy of shields, the riot shield. Commonly used during wizard riots."
feedback = "SH"
school = "evocation"
invocation = "Sia helda!"
invocation_type = SpI_SHOUT
spell_flags = INCLUDEUSER | NEEDSCLOTHES
range = -1
max_targets = 1
compatible_mobs = list(/mob/living/carbon/human)
level_max = list(Sp_TOTAL = 3, Sp_SPEED = 2, Sp_POWER = 1)
charge_type = Sp_RECHARGE
charge_max = 900
cooldown_min = 300
equipped_summons = list("off hand" = /obj/item/weapon/shield/)
duration = 300
delete_old = 0
var/item_color = "#6666ff"
var/block_chance = 30
hud_state = "wiz_shield"
/spell/targeted/equip_item/shield/summon_item(var/new_type)
var/obj/item/weapon/shield/I = new new_type()
I.icon_state = "buckler"
I.color = item_color
I.name = "Wizard's Shield"
I.base_block_chance = block_chance
return I
/spell/targeted/equip_item/shield/empower_spell()
if(!..())
return 0
item_color = "#6600ff"
block_chance = 60
return "Your summoned shields will now block more often."
+10 -2
View File
@@ -1,7 +1,7 @@
/spell/targeted/ethereal_jaunt
name = "Ethereal Jaunt"
desc = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls."
feedback = "EJ"
school = "transmutation"
charge_max = 300
spell_flags = Z2NOCAST | NEEDSCLOTHES | INCLUDEUSER
@@ -11,6 +11,7 @@
max_targets = 1
cooldown_min = 100 //50 deciseconds reduction per rank
duration = 50 //in deciseconds
cast_sound = 'sound/magic/Ethereal_Enter.ogg'
hud_state = "wiz_jaunt"
@@ -55,6 +56,13 @@
qdel(animation)
qdel(holder)
/spell/targeted/ethereal_jaunt/empower_spell()
if(!..())
return 0
duration += 20
return "[src] now lasts longer."
/spell/targeted/ethereal_jaunt/proc/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target)
animation.icon_state = "liquify"
flick("liquify",animation)
@@ -103,4 +111,4 @@
/obj/effect/dummy/spell_jaunt/ex_act(blah)
return
/obj/effect/dummy/spell_jaunt/bullet_act(blah)
return
return
+16 -2
View File
@@ -29,8 +29,11 @@ code\game\dna\genes\goon_powers.dm
/spell/targeted/genetic/blind
name = "Blind"
desc = "This spell inflicts a target with temporary blindness."
feedback = "BD"
disabilities = 1
duration = 300
cast_sound = 'sound/magic/Blind.ogg'
charge_max = 300
@@ -38,6 +41,7 @@ code\game\dna\genes\goon_powers.dm
invocation = "STI KALY"
invocation_type = SpI_WHISPER
message = "<span class='danger'>Your eyes cry out in pain!</span>"
level_max = list(Sp_TOTAL = 3, Sp_SPEED = 1, Sp_POWER = 3)
cooldown_min = 50
range = 7
@@ -48,10 +52,17 @@ code\game\dna\genes\goon_powers.dm
hud_state = "wiz_blind"
/spell/targeted/genetic/blind/empower_spell()
if(!..())
return 0
duration += 100
return "[src] will now blind for a longer period of time."
/spell/targeted/genetic/mutate
name = "Mutate"
desc = "This spell causes you to turn into a hulk and gain laser vision for a short while."
feedback = "MU"
school = "transmutation"
charge_max = 400
spell_flags = Z2NOCAST | NEEDSCLOTHES | INCLUDEUSER
@@ -60,9 +71,12 @@ code\game\dna\genes\goon_powers.dm
message = "<span class='notice'>You feel strong! You feel a pressure building behind your eyes!</span>"
range = 0
max_targets = 1
cast_sound = 'sound/magic/Mutate.ogg'
mutations = list(LASER, HULK)
duration = 300
cooldown_min = 300 //25 deciseconds reduction per rank
level_max = list(Sp_TOTAL = 1, Sp_SPEED = 1, Sp_POWER = 0)
cooldown_min = 300
hud_state = "wiz_hulk"
+11 -4
View File
@@ -1,7 +1,7 @@
/spell/targeted/mind_transfer
name = "Mind Transfer"
desc = "This spell allows the user to switch bodies with a target."
feedback = "MT"
school = "transmutation"
charge_max = 600
spell_flags = 0
@@ -9,8 +9,10 @@
invocation_type = SpI_WHISPER
max_targets = 1
range = 1
level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 2)
cooldown_min = 200 //100 deciseconds reduction per rank
compatible_mobs = list(/mob/living/carbon/human) //which types of mobs are affected by the spell. NOTE: change at your own risk
cast_sound = 'sound/magic/MandSwap.ogg'
// TODO: Update to new antagonist system.
var/list/protected_roles = list("Wizard","Changeling","Cultist", "Vampire") //which roles are immune to the spell
@@ -51,12 +53,12 @@
ghost.spell_list += victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob.
caster.mind.transfer_to(victim)
for(var/spell/S in victim.spell_list) //get rid of spells the new way
victim.remove_spell(S) //This will make it so that players will not get the HUD and all that spell bugginess that caused copies of spells and stuff of that nature.
for(var/spell/S in victim.spell_list)
victim.remove_spell(S) //Doing it this way will allow the spell master to update accordingly and not cause bugs.
for(var/spell/S in caster.spell_list)
victim.add_spell(S) //Now they are inside the victim's body - this also generates the HUD
caster.remove_spell(S) //remove the spells from the caster
caster.remove_spell(S)
if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster.
for(var/V in caster.mind.special_verbs)//Not too important but could come into play.
@@ -79,3 +81,8 @@
//After a certain amount of time the victim gets a message about being in a different body.
spawn(msg_wait)
caster << "<span class='danger'>You feel woozy and lightheaded. Your body doesn't seem like your own.</span>"
/spell/targeted/mind_transfer/empower_spell()
range++
return "You have increased the range of [src]."
@@ -0,0 +1,157 @@
/spell/shadow_shroud
name = "Shadow Shroud"
desc = "This spell causes darkness at the point of the caster for a duration of time."
feedback = "SS"
school = "abjuration"
spell_flags = 0
invocation_type = SpI_EMOTE
invocation = "mutters a chant, the light around them darkening."
charge_max = 300 //30 seconds
range = 5
duration = 150 //15 seconds
cast_sound = 'sound/effects/bamf.ogg'
hud_state = "wiz_tajaran"
/spell/shadow_shroud/choose_targets()
return list(get_turf(holder))
/spell/shadow_shroud/cast(var/list/targets, mob/user)
var/turf/T = targets[1]
if(!istype(T))
return
var/obj/O = new /obj(T)
O.set_light(range, -10, "#FFFFFF")
spawn(duration)
qdel(O)
/spell/targeted/life_steal
name = "Siphon Life"
desc = "This spell steals the life essence of a target, healing the caster."
feedback = "SL"
school = "necromancy"
charge_max = 300
spell_flags = SELECTABLE
invocation = "UMATHAR UF'KAL THENAR!"
invocation_type = SpI_SHOUT
range = 5
max_targets = 1
compatible_mobs = list(/mob/living/carbon/human)
hud_state = "wiz_vampire"
cast_sound = 'sound/magic/enter_blood.ogg'
amt_dam_brute = 15
amt_dam_fire = 15
message = "You feel a sickening feeling as your body weakens."
/spell/targeted/life_steal/cast(var/list/targets, var/mob/living/carbon/human/caster)
for(var/mob/M in targets)
if(!(M.stat == DEAD))
user << "There is no left life to steal."
return
if(isipc(target))
user << "There is no life to steal."
return
M.visible_message("<span class='danger'>Blood flows from \the [M] into \the [caster]!</span>")
caster.adjustBruteLoss(-15)
caster.adjustFireLoss(-15)
..()
/spell/targeted/raise_dead
name = "Raise Dead"
desc = "This spell turns a body into a skeleton servant."
feedback = "RD"
school = "necromancy"
charge_max = 1000
spell_flags = NEEDSCLOTHES | SELECTABLE
invocation = "RY'SY FROH YER G'RVE!"
invocation_type = SpI_SHOUT
range = 3
max_targets = 1
compatible_mobs = list(/mob/living/carbon/human)
hud_state = "wiz_skeleton"
/spell/targeted/raise_dead/cast(list/targets, mob/user)
..()
for(var/mob/living/target in targets)
if(!(target.stat == DEAD))
user << "This spell can't affect the living."
return
if(isskeleton(target))
user << "This spell can't affect the undead."
return
if(islesserform(target))
user << "This spell can't affect this lesser creature."
return
if(isipc(target))
user << "This spell can't affect non-organics."
return
var/mob/living/carbon/human/skeleton/F = new(get_turf(target))
target.visible_message("<span class='cult'>\The [target] explodes in a shower of gore, a skeleton emerges from the remains!</span>")
target.gib()
var/client/C = get_player()
F.ckey = C.ckey
F.faction = usr.faction
if(C.mob && C.mob.mind)
C.mob.mind.transfer_to(F)
F << "<B>You are skeleton minion to [usr], he is your master. Aid your master don't matter what, you have no free will.</B>"
//equips the skeleton war gear
F.equip_to_slot_or_del(new /obj/item/clothing/under/gladiator(F), slot_w_uniform)
F.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(F), slot_shoes)
F.equip_to_slot_or_del(new /obj/item/weapon/material/twohanded/spear/bone(F), slot_back)
F.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/bone(F), slot_head)
F.equip_to_slot_or_del(new /obj/item/clothing/suit/bone(F), slot_wear_suit)
/spell/targeted/raise_dead/proc/get_player()
for(var/mob/O in dead_mob_list)
if(O.client)
var/getResponse = alert(O,"A wizard is requesting a skeleton minion. Would you like to play as one?", "Skeleton minion summons","Yes","No")
if(getResponse == "Yes")
return O.client
return null
/spell/targeted/lichdom
name = "Lichdom"
desc = "Trade your life and soul for immortality and power."
feedback = "LID"
range = 0
school = "necromancy"
charge_max = 10000
spell_flags = Z2NOCAST | NEEDSCLOTHES | INCLUDEUSER
invocation_type = SpI_EMOTE
invocation = "entones an obscure chant..."
max_targets = 1
hud_state = "wiz_lich"
/spell/targeted/lichdom/cast(mob/target,var/mob/living/carbon/human/user as mob)
if(isskeleton(target))
user << "You have no soul or life to offer."
return
user.visible_message("<span class='cult'>\The [user]'s skin sloughs off bone, their blood boils and guts turn to dust!</span>")
new /obj/effect/gibspawner/human
user.verbs += /mob/living/carbon/proc/immortality
user.set_species("Skeleton")
user.unEquip(user.wear_suit)
user.unEquip(user.head)
user.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(user), slot_wear_suit)
user.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(user), slot_head)
@@ -11,6 +11,7 @@
invocation_type = SpI_SHOUT
range = 20
cooldown_min = 20 //10 deciseconds reduction per rank
cast_sound = 'sound/magic/Fireball.ogg'
spell_flags = 0
@@ -36,4 +37,4 @@
/obj/item/projectile/spell_projectile/fireball
name = "fireball"
icon_state = "fireball"
icon_state = "fireball"
@@ -1,7 +1,7 @@
/spell/targeted/projectile/magic_missile
name = "Magic Missile"
desc = "This spell fires several, slow moving, magic projectiles at nearby targets."
feedback = "MM"
school = "evocation"
charge_max = 300
spell_flags = NEEDSCLOTHES
@@ -9,6 +9,7 @@
invocation_type = SpI_SHOUT
range = 7
cooldown_min = 150 //15 deciseconds reduction per rank
cast_sound = 'sound/magic/MAGIC_MISSILE.ogg'
max_targets = 0
@@ -28,6 +29,18 @@
for(var/mob/living/M in targets)
apply_spell_damage(M)
return
/spell/targeted/projectile/magic_missile/empower_spell()
if(!..())
return 0
if(spell_levels[Sp_POWER] == level_max[Sp_POWER])
amt_paralysis += 2
amt_stunned += 2
return "[src] will now stun people for a longer duration."
amt_dam_fire += 5
return "[src] does more damage now."
//PROJECTILE
@@ -0,0 +1,47 @@
/spell/targeted/projectile/dumbfire/passage
name = "Passage"
desc = "throw a spell towards an area and teleport to it."
feedback = "PA"
proj_type = /obj/item/projectile/spell_projectile/passage
school = "abjuration"
charge_max = 250
spell_flags = 0
invocation = "A'YASAMA"
invocation_type = SpI_SHOUT
range = 15
level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1)
spell_flags = NEEDSCLOTHES
duration = 15
proj_step_delay = 1
hud_state = "gen_project"
/spell/targeted/projectile/dumbfire/passage/prox_cast(var/list/targets, atom/spell_holder)
for(var/mob/living/L in targets)
apply_spell_damage(L)
var/turf/T = get_turf(spell_holder)
holder.forceMove(T)
var/datum/effect/effect/system/smoke_spread/S = new /datum/effect/effect/system/smoke_spread()
S.set_up(3,0,T)
S.start()
/spell/targeted/projectile/dumbfire/passage/empower_spell()
if(!..())
return 0
amt_stunned += 3
return "[src] now stuns those who get hit by it."
/obj/item/projectile/spell_projectile/passage
name = "spell"
icon_state = "energy2"
@@ -0,0 +1,48 @@
/spell/targeted/projectile/dumbfire/stuncuff
name = "Stun Cuff"
desc = "This spell fires out a small curse that stuns and cuffs the target."
feedback = "SC"
proj_type = /obj/item/projectile/spell_projectile/stuncuff
charge_type = Sp_CHARGES
charge_max = 6
charge_counter = 6
spell_flags = 0
invocation = "Fu'Reai Diakan"
invocation_type = SpI_SHOUT
range = 20
level_max = list(Sp_TOTAL = 0, Sp_SPEED = 0, Sp_POWER = 0)
duration = 20
proj_step_delay = 1
amt_stunned = 6
hud_state = "wiz_cuff"
/spell/targeted/projectile/dumbfire/stuncuff/prox_cast(var/list/targets, spell_holder)
for(var/mob/living/M in targets)
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/obj/item/weapon/handcuffs/wizard/cuffs = new()
cuffs.forceMove(H)
H.handcuffed = cuffs
H.update_inv_handcuffed()
H.visible_message("Beams of light form around \the [H]'s hands!")
apply_spell_damage(M)
/obj/item/weapon/handcuffs/wizard
name = "beams of light"
desc = "Undescribable and unpenetrable. Or so they say."
breakouttime = 300 //30 seconds
/obj/item/weapon/handcuffs/wizard/dropped(var/mob/user)
..()
qdel(src)
/obj/item/projectile/spell_projectile/stuncuff
name = "stuncuff"
icon_state = "spell"
+151
View File
@@ -0,0 +1,151 @@
//basic transformation spell. Should work for most simple_animals
/spell/targeted/shapeshift
name = "Shapeshift"
desc = "This spell transforms the target into something else for a short while."
school = "transmutation"
charge_type = Sp_RECHARGE
charge_max = 600
duration = 0 //set to 0 for permanent.
var/list/possible_transformations = list()
var/list/newVars = list() //what the variables of the new created thing will be.
cast_sound = 'sound/weapons/emitter2.ogg'
var/revert_sound = 'sound/weapons/emitter.ogg' //the sound that plays when something gets turned back.
var/share_damage = 1 //do we want the damage we take from our new form to move onto our real one? (Only counts for finite duration)
var/drop_items = 1 //do we want to drop all our items when we transform?
/spell/targeted/shapeshift/cast(var/list/targets, mob/user)
for(var/mob/living/M in targets)
if(M.stat == DEAD)
user << "[name] can only transform living targets."
continue
var/new_mob = pick(possible_transformations)
var/mob/living/trans = new new_mob(get_turf(M))
for(var/varName in newVars) //stolen shamelessly from Conjure
if(varName in trans.vars)
trans.vars[varName] = newVars[varName]
trans.name = "[trans.name] ([M])"
if(istype(M,/mob/living/carbon/human) && drop_items)
for(var/obj/item/I in M.contents)
if(istype(I,/obj/item/organ))
continue
M.drop_from_inventory(I)
if(M.mind)
M.mind.transfer_to(trans)
else
trans.key = M.key
var/atom/movable/overlay/effect = new /atom/movable/overlay(get_turf(M))
effect.density = 0
effect.anchored = 1
effect.icon = 'icons/effects/effects.dmi'
effect.layer = 3
flick("summoning",effect)
spawn(10)
qdel(effect)
if(!duration)
qdel(M)
else
M.forceMove(trans) //move inside the new dude to hide him.
M.status_flags |= GODMODE //dont want him to die or breathe or do ANYTHING
spawn(duration)
M.status_flags &= ~GODMODE //no more godmode.
var/ratio = trans.health/trans.maxHealth
if(ratio <= 0) //if he dead dont bother transforming them.
qdel(M)
return
if(share_damage)
M.adjustBruteLoss(M.maxHealth - round(M.maxHealth*(trans.health/trans.maxHealth))) //basically I want the % hp to be the same afterwards
if(trans.mind)
trans.mind.transfer_to(M)
else
M.key = trans.key
playsound(get_turf(M),revert_sound,50,1)
M.forceMove(get_turf(trans))
qdel(trans)
/spell/targeted/shapeshift/baleful_polymorph
name = "Baleful Polymorth"
desc = "This spell transforms its target into a small, furry animal."
feedback = "BP"
possible_transformations = list(/mob/living/simple_animal/lizard,/mob/living/simple_animal/mouse,/mob/living/simple_animal/corgi)
invocation = "Yo'balada!"
invocation_type = SpI_SHOUT
spell_flags = NEEDSCLOTHES | SELECTABLE
range = 3
duration = 150 //15 seconds.
cooldown_min = 300 //30 seconds
level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2)
hud_state = "wiz_poly"
/spell/targeted/shapeshift/baleful_polymorph/empower_spell()
if(!..())
return 0
duration += 50
return "Your target will now stay in their polymorphed form for [duration/10] seconds."
/spell/targeted/shapeshift/avian
name = "Avian Form"
desc = "This spell transforms the wizard into the common parrot."
feedback = "AV"
possible_transformations = list(/mob/living/simple_animal/parrot)
invocation = "Poli'crakata!"
invocation_type = SpI_SHOUT
spell_flags = INCLUDEUSER
range = -1
duration = 150
charge_max = 600
cooldown_min = 300
level_max = list(Sp_TOTAL = 1, Sp_SPEED = 1, Sp_POWER = 0)
hud_state = "wiz_parrot"
/spell/targeted/shapeshift/corrupt_form
name = "Corrupt Form"
desc = "This spell shapes the wizard into a terrible, terrible beast."
feedback = "CF"
possible_transformations = list(/mob/living/simple_animal/hostile/faithless)
invocation = "mutters something dark and twisted as their form begins to twist..."
invocation_type = SpI_EMOTE
spell_flags = INCLUDEUSER
range = -1
duration = 100
charge_max = 1200
cooldown_min = 600
level_max = list(Sp_TOTAL = 3, Sp_SPEED = 2, Sp_POWER = 2)
newVars = list("name" = "corrupted soul")
hud_state = "wiz_corrupt"
/spell/targeted/shapeshift/corrupt_form/empower_spell()
if(!..())
return 0
switch(spell_levels[Sp_POWER])
if(1)
duration += 100
return "You will now stay corrupted for [duration/10] seconds."
if(2)
newVars = list("name" = "\proper corruption incarnate",
"melee_damage_upper" = 25,
"resistance" = 6,
"health" = 125,
"maxHealth" = 125)
duration = 0
return "You revel in the corruption. There is no turning back."
+42
View File
@@ -0,0 +1,42 @@
/spell/targeted/swap
name = "Swap"
desc = "This spell swaps the positions of the wizard and a target. Causes brain damage."
feedback = "SW"
school = "abjuration"
charge_type = Sp_HOLDVAR
holder_var_type = "brainloss"
holder_var_amount = 10
invocation = "joyo!"
invocation_type = SpI_WHISPER
level_max = list(Sp_TOTAL = 2, Sp_SPEED = 0, Sp_POWER = 2)
spell_flags = Z2NOCAST
range = 6
max_targets = 1
compatible_mobs = list(/mob/living)
hud_state = "wiz_swap"
cast_sound = 'sound/effects/bamf.ogg'
/spell/targeted/swap/cast(var/list/targets, mob/user)
for(var/mob/T in targets)
var/turf/aT = get_turf(T)
var/turf/bT = get_turf(user)
T.forceMove(bT)
user.forceMove(aT)
apply_spell_damage(T)
/spell/targeted/swap/empower_spell()
if(!..())
return 0
amt_eye_blind += 2
amt_weakened += 5
return "This spell will now weaken and blind the target for a longer period of time."
+34
View File
@@ -0,0 +1,34 @@
/spell/targeted/torment
name = "Torment"
desc = "this spell causes pain to all those in its radius."
feedback = "TM"
school = "evocation"
charge_max = 150
spell_flags = 0
invocation = "RAI DI KAAL"
invocation_type = SpI_SHOUT
range = 5
level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1)
cooldown_min = 50
message = "<span class='danger'>So much pain! All you can hear is screaming!</span>"
max_targets = 0
compatible_mobs = list(/mob/living/carbon/human)
var/loss = 30
hud_state = "wiz_horse"
/spell/targeted/torment/cast(var/list/targets, var/mob/user)
gibs(user.loc)
for(var/mob/living/carbon/human/H in targets)
H.adjustHalLoss(loss)
/spell/targeted/torment/empower_spell()
if(!..())
return 0
loss += 30
return "[src] will now cause more pain."