mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-21 03:51:49 +01:00
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:
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
@@ -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')
|
||||
|
||||
@@ -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]."
|
||||
|
||||
@@ -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)
|
||||
@@ -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]."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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,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))
|
||||
@@ -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
|
||||
@@ -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
|
||||
..()
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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))
|
||||
|
||||
@@ -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
@@ -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
|
||||
)
|
||||
@@ -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
|
||||
)
|
||||
@@ -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
|
||||
)
|
||||
@@ -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
|
||||
)
|
||||
@@ -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
|
||||
)
|
||||
@@ -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
|
||||
)
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
Reference in New Issue
Block a user