Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Arcane Spellcasting Pt.2.5 (Spellbooks/Craft/Learn) #56

Closed
wants to merge 63 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
2de3f49
+learnable spell var
tioluko Sep 4, 2024
3d70f4d
+get learnable spell list
tioluko Sep 4, 2024
f85a008
+get learnable spells process
tioluko Sep 4, 2024
c8a5f67
spellbooks added
tioluko Sep 4, 2024
e16fd36
added the spellbook crafting system
tioluko Sep 4, 2024
e675618
the dank magic feather!
tioluko Sep 4, 2024
4223ba1
added magic feather crafting formula
tioluko Sep 4, 2024
992ff7a
added a necessary var for spell learning
tioluko Sep 4, 2024
2820d69
just putting the learning var on each of them
tioluko Sep 4, 2024
e3fff8d
Update global_lists.dm
tioluko Sep 5, 2024
0af2220
Merge branch 'russ-money:main' into spellbooks-(craft-and-learn)
tioluko Sep 5, 2024
05a8921
Merge pull request #1 from tioluko/main
tioluko Sep 5, 2024
3c26c9f
shit was busted
tioluko Sep 6, 2024
cee1ee9
Merge branch 'russ-money:main' into spellbooks-craft-and-learn
tioluko Sep 7, 2024
85a2042
Merge branch 'russ-money:main' into spellbooks-craft-and-learn
tioluko Sep 7, 2024
e5aee21
small touches
tioluko Sep 9, 2024
ea486d0
adjust
tioluko Sep 9, 2024
8de134d
nerf
tioluko Sep 9, 2024
820a0a2
Update smokescreen.dm
tioluko Sep 9, 2024
5bf9c10
Create decay.dm
tioluko Sep 9, 2024
6163cd5
Create web.dm
tioluko Sep 9, 2024
f7847c3
Update ignite.dm
tioluko Sep 9, 2024
94db3d9
Update fireball.dm
tioluko Sep 9, 2024
fad2847
Update books.dm
tioluko Sep 9, 2024
05711dd
Update granters.dm
tioluko Sep 9, 2024
4ac9328
Update granters.dm
tioluko Sep 9, 2024
836520d
Update telepathy.dm
tioluko Sep 9, 2024
20c5bed
Update invisibility.dm
tioluko Sep 9, 2024
59a5e72
Update sorceress.dm
tioluko Sep 9, 2024
73b0c4c
Update mage.dm
tioluko Sep 9, 2024
12b3969
Update magician.dm
tioluko Sep 9, 2024
a496687
Update mage_apprentice.dm
tioluko Sep 9, 2024
738da04
Update roguetown.dme
tioluko Sep 10, 2024
f7c8315
Add files via upload
tioluko Sep 10, 2024
3f05d8d
Add files via upload
tioluko Sep 10, 2024
a19b174
Update granters.dm
tioluko Sep 10, 2024
532e2c4
Add files via upload
tioluko Sep 10, 2024
5a17811
Update arcane.dm
tioluko Sep 10, 2024
53269f9
Update magician.dm
tioluko Sep 10, 2024
04d2f3a
Update mage_apprentice.dm
tioluko Sep 10, 2024
1f9d857
Update books.dm
tioluko Sep 10, 2024
c7cbe00
Update global_lists.dm
tioluko Sep 10, 2024
37a1434
Update roguetown.dme
tioluko Sep 10, 2024
28563fd
Update books.dm
tioluko Sep 10, 2024
2c4d32d
WHY WAS THE " 's " BREAKING IT????? wtf byond
tioluko Sep 10, 2024
fee568c
Update jobs.dm
tioluko Sep 10, 2024
e9c9468
Update landmarks.dm
tioluko Sep 10, 2024
8f206b7
Update keyrings.dm
tioluko Sep 10, 2024
56bc22f
WHY WAS THE " 's " BREAKING IT????? wtf byond
tioluko Sep 10, 2024
1910c1a
Update mage_apprentice.dm
tioluko Sep 10, 2024
bdb7720
Update mage_apprentice.dm
tioluko Sep 10, 2024
740ca7c
Update roguebuff.dm
tioluko Sep 13, 2024
b0fb0bb
Add files via upload
tioluko Sep 13, 2024
a55db7d
Add files via upload
tioluko Sep 13, 2024
ec70c7f
Add files via upload
tioluko Sep 13, 2024
5ae90a3
Add files via upload
tioluko Sep 13, 2024
605e607
Add files via upload
tioluko Sep 13, 2024
6fb9a44
Update mage_apprentice.dm
tioluko Sep 13, 2024
a32dbc4
Update magician.dm
tioluko Sep 13, 2024
314cba4
Update roguetown.dme
tioluko Sep 13, 2024
58f54a5
Update magician.dm
tioluko Sep 13, 2024
3db91aa
Update chains.dm
tioluko Sep 13, 2024
03973ff
Update roguetown.dme
tioluko Sep 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions code/__DEFINES/roguetown.dm
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,8 @@ GLOBAL_LIST_EMPTY(job_respawn_delays)
#define TRIUMPH_CAT_CHARACTER "CHARACTER"
#define TRIUMPH_CAT_MISC "MISC!"
#define TRIUMPH_CAT_ACTIVE_DATUMS "ACTIVE"

/*
Learnable arcane spell books
*/
GLOBAL_LIST_INIT(learnables, list())
3 changes: 3 additions & 0 deletions code/__HELPERS/global_lists.dm
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@
if(patron.preference_accessible)
GLOB.preference_patrons[path] = patron

// Learnable Arcane Spells
GLOB.learnables = Get_Learnable_Spells()

//creates every subtype of prototype (excluding prototype) and adds it to list L.
//if no list/L is provided, one is created.
/proc/init_subtypes(prototype, list/L)
Expand Down
9 changes: 9 additions & 0 deletions code/__HELPERS/unsorted.dm
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,15 @@
else if(x<0)
.+=360

//Get the all the damn arcane spells
/proc/Get_Learnable_Spells()
var/ret = list()
for(var/S in GLOB.spells)
var/obj/effect/proc_holder/spell/arcane/spell = S
if(spell.learnable)
ret += spell
return ret

//Returns location. Returns null if no location was found.
/proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = FALSE, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0)
/*
Expand Down
22 changes: 22 additions & 0 deletions code/datums/status_effects/rogue/roguebuff.dm
Original file line number Diff line number Diff line change
Expand Up @@ -146,3 +146,25 @@
name = "Dazed"
desc = ""
icon_state = "weed"

/atom/movable/screen/alert/status_effect/buff/feather
name = "Featherweight"
desc = "My body is light, I can jump higher and falling from heights is not painful."
icon_state = "buff"

/datum/status_effect/buff/feather
id = "feather"
alert_type = /atom/movable/screen/alert/status_effect/buff/feather
duration = 1 MINUTES

/datum/status_effect/buff/feather/on_apply()
. = ..()
to_chat(owner, span_warning("I feel lighter."))
ADD_TRAIT(owner, TRAIT_NOFALLDAMAGE1, MAGIC_TRAIT)
ADD_TRAIT(owner, TRAIT_ZJUMP, MAGIC_TRAIT)

/datum/status_effect/buff/feather/on_remove()
. = ..()
to_chat(owner, span_warning("The feeling of lightness fades."))
REMOVE_TRAIT(owner, TRAIT_NOFALLDAMAGE1, MAGIC_TRAIT)
REMOVE_TRAIT(owner, TRAIT_ZJUMP, MAGIC_TRAIT)
2 changes: 1 addition & 1 deletion code/game/objects/effects/landmarks.dm
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark)
icon_state = "arrow"

/obj/effect/landmark/start/wapprentice
name = "Magician's Apprentice"
name = "Magician Apprentice"
icon_state = "arrow"

/obj/effect/landmark/start/servant
Expand Down
111 changes: 111 additions & 0 deletions code/game/objects/items/granters.dm
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
var/reading = FALSE //sanity
var/oneuse = TRUE //default this is true, but admins can var this to 0 if we wanna all have a pass around of the rod form book
var/used = FALSE //only really matters if oneuse but it might be nice to know if someone's used it for admin investigations perhaps
var/open = FALSE

/obj/item/book/granter/proc/turn_page(mob/user)
playsound(user, pick('sound/blank.ogg'), 30, TRUE)
Expand Down Expand Up @@ -124,6 +125,7 @@
var/spell
var/spellname = "conjure bugs"

/*
/obj/item/book/granter/spell/already_known(mob/user)
if(!spell)
return TRUE
Expand Down Expand Up @@ -154,6 +156,7 @@
..()
if(oneuse)
user.visible_message(span_warning("[src] glows dark for a second!"))
*/

/obj/item/book/granter/spell/fireball
spell = /obj/effect/proc_holder/spell/aimed/fireball
Expand Down Expand Up @@ -508,3 +511,111 @@
spellname = "Bone Chill"
icon_state ="scrolldarkred"
remarks = list("Mediolanum ventis..", "Sana damnatorum..", "Frigidus ossa mortuorum..")

//! --SPELL BOOKS-- !/

/obj/item/book/granter/spell/generic
name = "Spellbook"
desc = "A book of potential known only to those that can decipher its secrets."
icon = 'icons/roguetown/items/books.dmi'
icon_state = "spell_book_0"
var/base_icon_state = "spell_book"
oneuse = TRUE
dropshrink = 0.6
drop_sound = 'sound/foley/dropsound/paper_drop.ogg'
pickup_sound = 'sound/blank.ogg'
force = 6
bookfile = "spellbook.json"
var/obj/effect/proc_holder/spell/arcane/target = null

/obj/item/book/granter/spell/generic/Initialize(loc)
. = ..()
target = pick(GLOB.learnables)
var/obj/effect/proc_holder/spell/arcane/S = new target
spellname = S.name
name = "Tome of [spellname]"
//----------------------------------------------

/obj/item/book/granter/spell/generic/attack_self(mob/user)
if(!open)
attack_right(user)
return
..()
user.update_inv_hands()

/obj/item/book/rogue/rmb_self(mob/user)
attack_right(user)
return

/obj/item/book/rogue/read(mob/user)
if(!open)
to_chat(user, span_info("Open me first."))
return FALSE
. = ..()

/obj/item/book/granter/spell/generic/attackby(obj/item/I, mob/user, params)
return

/obj/item/book/granter/spell/generic/attack_right(mob/user)
if(!open)
slot_flags &= ~ITEM_SLOT_HIP
open = TRUE
playsound(loc, 'sound/items/book_open.ogg', 100, FALSE, -1)
/* if(user.mind.get_skill_level(/datum/skill/magic/arcane) >= 1 && user.mind.get_skill_level(/datum/skill/misc/reading) >= 3)//
to_chat(user, "<span class='notice'>You can grasp the arcane knowledge within this tome...</span>")//
playsound(loc, 'sound/magic/churn.ogg', 100, FALSE, -1)//
if(user.ranged_ability == !null)//
user.ranged_ability.deactivate(user.ranged_ability)//
user.ranged_ability = target//
user.ranged_ability.active = TRUE//
user.mmb_intent_change(QINTENT_SPELL)//
Was trying to make so you can cast the spell holding the open book but I failed miserably...*/
else
slot_flags |= ITEM_SLOT_HIP
open = FALSE
playsound(loc, 'sound/items/book_close.ogg', 100, FALSE, -1)
// if (user.ranged_ability == target)//
// user.mmb_intent_change(null)//
curpage = 1
update_icon()
user.update_inv_hands()

/obj/item/book/granter/spell/generic/update_icon()
icon_state = "[base_icon_state]_[open]"

//----------------------------------------------
/obj/item/book/granter/spell/generic/already_known(mob/user)
if(!target)
return TRUE
for(var/obj/effect/proc_holder/spell/arcane/knownspell in user.mind.spell_list)
if(knownspell.type == target)
to_chat(user,"<span class='warning'>You already know this one!</span>")
return TRUE
return FALSE

/obj/item/book/granter/spell/generic/on_reading_start(mob/user)
to_chat(user, "<span class='notice'>I start reading about [spellname]...</span>")

/obj/item/book/granter/spell/generic/on_reading_finished(mob/user)
. = ..()
var/learnedspells = 0
for(var/obj/effect/proc_holder/spell/arcane/knownspell in user.mind.spell_list)
learnedspells += 1
if(learnedspells == 0)
to_chat(user, "<span class='notice'>...You can't make sense of the sprawling runes...</span>")
return
else if(learnedspells >= (1 + user.mind.get_skill_level(/datum/skill/magic/arcane)))
to_chat(user, "<span class='notice'>You tried hard to grasp it, unfortunately you are at the limit of your current arcane power...</span>")
return
if(oneuse)
name = "Siphoned Tome"
desc = "A book once inscribed with magical scripture. The surface is now barren of knowledge, siphoned by someone else. It's utterly useless."
user.visible_message("<span class='warning'>[src] has had its magic ink ripped from the book!</span>")
icon_state = "used_spell_book_[open]"
base_icon_state = "used_spell_book"
to_chat(user, "<span class='notice'>Your knowledge expands, you understand how to cast [spellname]!</span>")
var/S = new target
user.mind.AddSpell(S)
//user.mind.adjust_experience(/datum/skill/misc/reading, user.STAINT) //cant find the user's STAINT here for some cursed reason...
user.log_message("learned the spell [target.name] ([target])", LOG_ATTACK, color="orange")
onlearned(user)
51 changes: 48 additions & 3 deletions code/game/objects/items/rogueitems/books.dm
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@
bookfile = "law.json"

/obj/item/book/rogue/cooking
name = "Tastes Fit For The Lord"
name = "Tastes Fit For The Lord"
desc = ""
icon_state ="book_0"
base_icon_state = "book"
Expand Down Expand Up @@ -392,14 +392,14 @@
icon_state = "basic_book_0"
base_icon_state = "basic_book"
override_find_book = TRUE

/obj/item/book/rogue/playerbook/Initialize(loc, in_round_player_generated, var/mob/living/in_round_player_mob, text)
. = ..()
is_in_round_player_generated = in_round_player_generated
if(is_in_round_player_generated)
player_book_text = text
while(!player_book_author_ckey) // doesn't have to be this, but better than defining a bool.
player_book_title = dd_limittext(capitalize(sanitize_hear_message(input(in_round_player_mob, "What title do you want to give the book? (max 42 characters)", "Title", "Unknown"))), MAX_NAME_LEN)
player_book_title = dd_limittext(capitalize(sanitize_hear_message(input(in_round_player_mob, "What title do you want to give the book? (max 42 characters)", "Title", "Unknown"))), MAX_NAME_LEN)
player_book_author = "[dd_limittext(sanitize_hear_message(input(in_round_player_mob, "What do you want the author text to be? (max 42 characters)", "Author", "")), MAX_NAME_LEN)]"
player_book_icon = book_icons[input(in_round_player_mob, "Choose a book style", "Book Style") as anything in book_icons]
player_book_author_ckey = in_round_player_mob.ckey
Expand Down Expand Up @@ -437,6 +437,51 @@
var/qdel_source = FALSE

/obj/item/manuscript/attackby(obj/item/I, mob/living/user)
if(resistance_flags & ON_FIRE)
return ..()

if(istype(I, /obj/item/natural/feather/magic))
if(src.number_of_pages <= 4)
to_chat(user, "This manuscript does not have enough pages to write an entire spellbook in it...")
return

var/obj/item/natural/feather/magic/F = I
var/arcane_score = 0
var/total_score = 0
// var/crafttime = 0 The crafting is currently instantaneous so no need for this shit (yet)

// Make is so you can't write spellbooks if you are below Journeyman.
for(var/i in 1 to user.mind.get_skill_level(/datum/skill/magic/arcane))
arcane_score += 1
if(arcane_score <= 2)
to_chat(user, "You do not have enough arcane knowledge to inscribe a spellbook...")
return

// The math here is so it is borderline impossible to get a 100% success chance, those are supposed to be hard to make
total_score += (arcane_score * 6) + (user.STAINT * 2)
// crafttime = 10 - arcane_score
// for(var/i in 1 to user.mind.get_skill_level(/datum/skill/misc/reading))
// total_score += 4
if(prob(total_score))
var/obj/item/book/granter/spell/generic/SB = new /obj/item/book/granter/spell/generic(get_turf(I.loc), pick(GLOB.learnables))
if(user.Adjacent(SB))
SB.add_fingerprint(user)
user.put_in_hands(SB)
user.mind.adjust_experience(/datum/skill/magic/arcane, user.STAINT*3)
to_chat(user, "As you finish writing, the feather glows and envelops the manuscript, becoming a new spellbook.")
qdel(src)
else
to_chat(user, "As you write, the feather glows but the magic gets out of control and the manuscript can not contain it, imploding it into dust.")
var/obj/O = new /obj/item/ash(get_turf(src.loc))
qdel(src)
explosion(O.loc,0,0,0,1,FALSE,,1,,TRUE)
// else something here about the feather not being able to write a spellbook
if(F.uses >= F.max_uses)
to_chat(user, "The feather's magic glows dimly, and then it turns into dust.")
new /obj/item/ash(get_turf(user.loc))
qdel(F)
return

// why is a book crafting kit using the craft system, but crafting a book isn't? Well the crafting system for *some reason* is made in such a way as to make reworking it to allow you to put reqs vars in the crafted item near *impossible.*
if(istype(I, /obj/item/book_crafting_kit))
qdel(I)
Expand Down
3 changes: 3 additions & 0 deletions code/game/objects/items/rogueitems/keyrings.dm
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,9 @@
/obj/item/keyring/mage
keys = list(/obj/item/roguekey/manor, /obj/item/roguekey/tower, /obj/item/roguekey/mage)

/obj/item/keyring/mageapprentice
keys = list(/obj/item/roguekey/tower, /obj/item/roguekey/mage)

/obj/item/keyring/innkeep
keys = list(/obj/item/roguekey/tavern, /obj/item/roguekey/roomiv, /obj/item/roguekey/roomiii, /obj/item/roguekey/roomii, /obj/item/roguekey/roomi)

Expand Down
9 changes: 8 additions & 1 deletion code/game/objects/items/rogueitems/natural/feather.dm
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,11 @@
max_integrity = 20
muteinmouth = TRUE
spitoutmouth = FALSE
w_class = WEIGHT_CLASS_TINY
w_class = WEIGHT_CLASS_TINY

/obj/item/natural/feather/magic
name = "magic feather"
color = "#ffee00"
desc = "A fluffy feather enveloped with magical aura."
var/uses = 0
var/max_uses = 3 // Maybe balance this more?
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
if(H.mind)
to_chat(H, span_warning("Magic is often times refered to as an art. At times it is treated as a primordial beast, chaos incarnate. To more learned men it is a precise science, to be studied and examined. In the end, magic is all three of the above. It is Art, Chaos, and Science: a blessing, a curse, and progress. It all depends on who calls upon it, and for what purpose."))
H.mind.adjust_skillrank(/datum/skill/combat/polearms, 1, TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/bows, 1, TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/wrestling, pick(0,1,2), TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/unarmed, pick(0,1,2), TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/swimming, 1, TRUE)
Expand Down Expand Up @@ -64,7 +63,15 @@
"/obj/effect/proc_holder/spell/arcane/smokescreen",
"/obj/effect/proc_holder/spell/arcane/blindness",
"/obj/effect/proc_holder/spell/arcane/invisibility",
"/obj/effect/proc_holder/spell/arcane/projectile/fetch"
"/obj/effect/proc_holder/spell/arcane/projectile/fetch",
"/obj/effect/proc_holder/spell/arcane/mist",
"/obj/effect/proc_holder/spell/arcane/web",
"/obj/effect/proc_holder/spell/arcane/feather",
"/obj/effect/proc_holder/spell/arcane/magicwall",
"/obj/effect/proc_holder/spell/arcane/ensnare",
"/obj/effect/proc_holder/spell/arcane/repulse",
"/obj/effect/proc_holder/spell/arcane/unlock",
"/obj/effect/proc_holder/spell/arcane/light"
)
H.mind.AddSpell(pick(new /obj/effect/proc_holder/spell/arcane/projectile/fireball,new /obj/effect/proc_holder/spell/arcane/projectile/lightningbolt))
for(var/i=2,i>0,i--)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,23 @@
r_hand = /obj/item/rogueweapon/woodstaff
if(H.mind)
H.mind.adjust_skillrank(/datum/skill/combat/polearms, 1, TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/wrestling, pick(0,1,1), TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/unarmed, pick(0,1,1), TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/wrestling, pick(0,1,2), TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/unarmed, pick(0,1,2), TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/swimming, 1, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/climbing, pick(0,1), TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/athletics, 1, TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/knives, pick(0,1,1,2), TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/swords, pick(0,1), TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/knives, pick(0,1,2), TRUE)
H.mind.adjust_skillrank(/datum/skill/craft/crafting, pick(0,1), TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/reading, 4, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/alchemy, 3, TRUE)
H.mind.adjust_skillrank(/datum/skill/magic/arcane, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/medicine, 1, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/medicine, pick(0,1), TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/riding, 1, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/reading, pick(2,3), TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/alchemy, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/magic/arcane, 4, TRUE)
if(H.age == AGE_OLD)
H.mind.adjust_skillrank(/datum/skill/magic/arcane, pick(2,3,3), TRUE)
H.mind.adjust_skillrank(/datum/skill/magic/arcane, pick(3,4,4), TRUE)
H.change_stat("intelligence", 5)
H.change_stat("strength", -2)
H.change_stat("strength", -1)
H.change_stat("intelligence", 4)
H.change_stat("speed", 1)
Expand All @@ -55,7 +59,15 @@
"/obj/effect/proc_holder/spell/arcane/smokescreen",
"/obj/effect/proc_holder/spell/arcane/blindness",
"/obj/effect/proc_holder/spell/arcane/invisibility",
"/obj/effect/proc_holder/spell/arcane/projectile/fetch"
"/obj/effect/proc_holder/spell/arcane/projectile/fetch",
"/obj/effect/proc_holder/spell/arcane/mist",
"/obj/effect/proc_holder/spell/arcane/web",
"/obj/effect/proc_holder/spell/arcane/feather",
"/obj/effect/proc_holder/spell/arcane/magicwall",
"/obj/effect/proc_holder/spell/arcane/ensnare",
"/obj/effect/proc_holder/spell/arcane/repulse",
"/obj/effect/proc_holder/spell/arcane/unlock",
"/obj/effect/proc_holder/spell/arcane/light"
)
H.mind.AddSpell(pick(new /obj/effect/proc_holder/spell/arcane/projectile/fireball,new /obj/effect/proc_holder/spell/arcane/projectile/lightningbolt))
for(var/i=2,i>0,i--)
Expand Down
Loading
Loading