diff --git a/code/datums/spells/charge.dm b/code/datums/spells/charge.dm
index e7225997815..36e253f8e91 100644
--- a/code/datums/spells/charge.dm
+++ b/code/datums/spells/charge.dm
@@ -1,6 +1,6 @@
/obj/effect/proc_holder/spell/targeted/charge
name = "Charge"
- desc = "This spell can be used to charge up spent magical artifacts, among other things."
+ desc = "This spell can be used to recharge a variety of things in your hands, from magical artifacts to electrical components. A creative wizard can even use it to grant magical power to a fellow magic user."
school = "transmutation"
charge_max = 600
@@ -8,38 +8,45 @@
invocation = "DIRI CEL"
invocation_type = "whisper"
range = -1
-// cooldown_min = 400 //50 deciseconds reduction per rank
+ cooldown_min = 400 //50 deciseconds reduction per rank
include_user = 1
-/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets)
- for(var/mob/living/user in targets)
- var/list/hand_items = list(user.get_active_hand(),user.get_inactive_hand())
+/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets,mob/user = usr)
+ for(var/mob/living/L in targets)
+ var/list/hand_items = list(L.get_active_hand(),L.get_inactive_hand())
var/charged_item = null
var/burnt_out = 0
+
+ if(L.pulling && (istype(L.pulling, /mob/living)))
+ var/mob/living/M = L.pulling
+ if(M.spell_list.len != 0 || (M.mind && M.mind.spell_list.len != 0))
+ for(var/obj/effect/proc_holder/spell/S in M.spell_list)
+ S.charge_counter = S.charge_max
+ if(M.mind)
+ for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list)
+ S.charge_counter = S.charge_max
+ M <<"you feel raw magic flowing through you, it feels good!"
+ else
+ M <<"you feel very strange for a moment, but then it passes."
+ burnt_out = 1
+ charged_item = M
+ break
for(var/obj/item in hand_items)
- if(istype(item, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = item
- if(G.affecting)
- var/mob/M = G.affecting
- if(M.spell_list.len != 0)
- for(var/obj/effect/proc_holder/spell/S in M.spell_list)
- S.charge_counter = S.charge_max
- M <<"you feel raw magic flowing through you, it feels good!"
+ if(istype(item, /obj/item/weapon/spellbook))
+ if(istype(item, /obj/item/weapon/spellbook/oneuse))
+ var/obj/item/weapon/spellbook/oneuse/I = item
+ if(prob(80))
+ L.visible_message("[I] catches fire!")
+ qdel(I)
else
- M <<"you feel very strange for a moment, but then it passes."
- burnt_out = 1
- charged_item = M
- break
- else if(istype(item, /obj/item/weapon/spellbook/oneuse))
- var/obj/item/weapon/spellbook/oneuse/I = item
- if(prob(80))
- user.visible_message("[I] catches fire!")
- qdel(I)
+ I.used = 0
+ charged_item = I
+ break
else
- I.used = 0
- charged_item = I
- break
+ L << "Glowing red letters appear on the front cover..."
+ L << "[pick("NICE TRY BUT NO!","CLEVER BUT NOT CLEVER ENOUGH!", "SUCH FLAGRANT CHEESING IS WHY WE ACCEPTED YOUR APPLICATION!", "CUTE!", "YOU DIDN'T THINK IT'D BE THAT EASY, DID YOU?")]"
+ burnt_out = 1
else if(istype(item, /obj/item/weapon/gun/magic))
var/obj/item/weapon/gun/magic/I = item
if(prob(80) && !I.can_charge)
@@ -78,8 +85,8 @@
charged_item = item
break
if(!charged_item)
- user << "you feel magical power surging to your hands, but the feeling rapidly fades..."
+ L << "you feel magical power surging to your hands, but the feeling rapidly fades..."
else if(burnt_out)
- user << "[charged_item] doesn't seem to be reacting to the spell..."
+ L << "[charged_item] doesn't seem to be reacting to the spell..."
else
- user << "[charged_item] suddenly feels very warm!"
+ L << "[charged_item] suddenly feels very warm!"
\ No newline at end of file
diff --git a/code/datums/spells/genetic.dm b/code/datums/spells/genetic.dm
index 07d8c55f059..d4a9d1d1d8e 100644
--- a/code/datums/spells/genetic.dm
+++ b/code/datums/spells/genetic.dm
@@ -2,7 +2,7 @@
name = "Genetic"
desc = "This spell inflicts a set of mutations and disabilities upon the target."
- var/disabilities = 0 //bits
+ var/sdisabilities = 0 //bits
var/list/mutations = list() //mutation strings
var/duration = 100 //deciseconds
/*
@@ -22,11 +22,11 @@
target.mutations.Add(x)
/* if(x == HULK && ishuman(target))
target:hulk_time=world.time + duration */
- target.disabilities |= disabilities
+ target.sdisabilities |= sdisabilities
target.update_mutations() //update target's mutation overlays
spawn(duration)
target.mutations.Remove(mutations)
- target.disabilities &= ~disabilities
+ target.sdisabilities &= ~sdisabilities
target.update_mutations()
return
\ No newline at end of file
diff --git a/code/datums/spells/infinite_guns.dm b/code/datums/spells/infinite_guns.dm
new file mode 100644
index 00000000000..10b8612c858
--- /dev/null
+++ b/code/datums/spells/infinite_guns.dm
@@ -0,0 +1,22 @@
+/obj/effect/proc_holder/spell/targeted/infinite_guns
+ name = "Lesser Summon Guns"
+ desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles. Requires both hands free to use."
+ invocation_type = "none"
+ include_user = 1
+ range = -1
+
+ school = "conjuration"
+ charge_max = 750
+ clothes_req = 1
+ cooldown_min = 10 //Gun wizard
+ action_icon_state = "bolt_action"
+
+
+
+/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr)
+ for(var/mob/living/carbon/C in targets)
+ C.drop_item()
+ C.swap_hand()
+ C.drop_item()
+ var/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/GUN = new
+ C.put_in_hands(GUN)
diff --git a/code/datums/spells/knock.dm b/code/datums/spells/knock.dm
index cd02d85c90b..e2be52fb7db 100644
--- a/code/datums/spells/knock.dm
+++ b/code/datums/spells/knock.dm
@@ -22,4 +22,11 @@
var/obj/machinery/door/airlock/A = door
A.unlock(1) //forced because it's magic!
door.open()
+ for(var/obj/structure/closet/C in T.contents)
+ spawn(1)
+ if(istype(C, /obj/structure/closet/secure_closet))
+ var/obj/structure/closet/secure_closet/SC = C
+ SC.locked = 0
+ C.open()
+
return
\ No newline at end of file
diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm
new file mode 100644
index 00000000000..31c09813863
--- /dev/null
+++ b/code/datums/spells/lichdom.dm
@@ -0,0 +1,130 @@
+/obj/effect/proc_holder/spell/targeted/lichdom
+ name = "Bind Soul"
+ desc = "A dark necromantic pact that can forever bind your soul to an item of your choosing. So long as both your body and the item remain intact and on the same plane you can revive from death, though the time between reincarnations grows steadily with use."
+ school = "necromancy"
+ charge_max = 10
+ clothes_req = 0
+ centcom_cancast = 0
+ invocation = "NECREM IMORTIUM!"
+ invocation_type = "shout"
+ range = -1
+ level_max = 0 //cannot be improved
+ cooldown_min = 10
+ include_user = 1
+
+ var/obj/marked_item
+ var/mob/living/current_body
+ var/resurrections = 0
+ var/existence_stops_round_end = 0
+
+ action_icon_state = "skeleton"
+
+/obj/effect/proc_holder/spell/targeted/lichdom/New()
+ if(!config.continous_rounds)
+ existence_stops_round_end = 1
+ config.continous_rounds = 1
+ ..()
+
+/obj/effect/proc_holder/spell/targeted/lichdom/Destroy()
+ for(var/datum/mind/M in ticker.mode.wizards) //Make sure no other bones are about
+ for(var/obj/effect/proc_holder/spell/S in M.spell_list)
+ if(istype(S,/obj/effect/proc_holder/spell/targeted/lichdom) && S != src)
+ return ..()
+ if(existence_stops_round_end)
+ config.continous_rounds = 0
+ return ..()
+
+/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets,mob/user = usr)
+ for(var/mob/M in targets)
+ var/list/hand_items = list()
+ if(iscarbon(M))
+ hand_items = list(M.get_active_hand(),M.get_inactive_hand())
+
+ if(marked_item && !stat_allowed) //sanity, shouldn't happen without badminry
+ marked_item = null
+ return
+
+ if(stat_allowed) //Death is not my end!
+ if(M.stat == CONSCIOUS && iscarbon(M))
+ M << "You aren't dead enough to revive!" //Usually a good problem to have
+ charge_counter = charge_max
+ return
+
+ if(!marked_item || qdeleted(marked_item)) //Wait nevermind
+ M << "Your phylactery is gone!"
+ return
+
+ var/turf/user_turf = get_turf(M)
+ var/turf/item_turf = get_turf(marked_item)
+
+ if(user_turf.z != item_turf.z)
+ M << "Your phylactery is out of range!"
+ return
+
+ if(isobserver(M))
+ var/mob/dead/observer/O = M
+ O.reenter_corpse()
+
+ var/mob/living/carbon/human/lich = new /mob/living/carbon/human(item_turf)
+
+ lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(lich), slot_shoes)
+ lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), slot_w_uniform)
+ lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), slot_wear_suit)
+ lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), slot_head)
+
+ lich.real_name = M.mind.name
+ M.mind.transfer_to(lich)
+ lich.set_species("Skeleton")
+ lich << "Your bones clatter and shutter as they're pulled back into this world!"
+ charge_max += 600
+ var/mob/old_body = current_body
+ var/turf/body_turf = get_turf(old_body)
+ current_body = lich
+ lich.Weaken(10+10*resurrections)
+ ++resurrections
+ if(old_body && old_body.loc)
+ if(iscarbon(old_body))
+ var/mob/living/carbon/C = old_body
+ for(var/obj/item/W in C)
+ C.unEquip(W)
+ var/wheres_wizdo = dir2text(get_dir(body_turf, item_turf))
+ if(wheres_wizdo)
+ old_body.visible_message("Suddenly [old_body.name]'s corpse falls to pieces! You see a strange energy rise from the remains, and speed off towards the [wheres_wizdo]!")
+ body_turf.Beam(item_turf,icon_state="lichbeam",icon='icons/effects/effects.dmi',time=10+10*resurrections,maxdistance=INFINITY)
+ old_body.dust()
+
+ if(!marked_item) //linking item to the spell
+ message = ""
+ for(var/obj/item in hand_items)
+ if(ABSTRACT in item.flags || NODROP in item.flags)
+ continue
+ marked_item = item
+ M << "You begin to focus your very being into the [item.name]..."
+ break
+
+ if(!marked_item)
+ M << "You must hold an item you wish to make your phylactery..."
+ return
+
+ spawn(50)
+ if(marked_item.loc != M) //I changed my mind I don't want to put my soul in a cheeseburger!
+ M << "Your soul snaps back to your body as you drop the [marked_item.name]!"
+ marked_item = null
+ return
+ name = "RISE!"
+ desc = "Rise from the dead! You will reform at the location of your phylactery and your old body will crumble away."
+ charge_max = 1800 //3 minute cooldown, if you rise in sight of someone and killed again, you're probably screwed.
+ charge_counter = 1800
+ stat_allowed = 1
+ marked_item.name = "Ensouled [marked_item.name]"
+ marked_item.desc = "A terrible aura surrounds this item, its very existence is offensive to life itself..."
+ marked_item.color = "#003300"
+ M << "With a hideous feeling of emptiness you watch in horrified fascination as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! As your organs crumble to dust in your fleshless chest you come to terms with your choice. You're a lich!"
+ current_body = M.mind.current
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.set_species("Skeleton")
+ H.unEquip(H.wear_suit)
+ H.unEquip(H.head)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), slot_head)
diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm
index 438be56b522..e813ec0ffda 100644
--- a/code/datums/spells/summonitem.dm
+++ b/code/datums/spells/summonitem.dm
@@ -7,7 +7,7 @@
invocation = "GAR YOK"
invocation_type = "whisper"
range = -1
- level_max = 1 //cannot be improved
+ level_max = 0 //cannot be improved
cooldown_min = 100
include_user = 1
diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm
index 03aa46653a9..904b7d54e63 100644
--- a/code/datums/spells/wizard.dm
+++ b/code/datums/spells/wizard.dm
@@ -3,12 +3,12 @@
desc = "This spell fires several, slow moving, magic projectiles at nearby targets."
school = "evocation"
- charge_max = 150
+ charge_max = 200
clothes_req = 1
invocation = "FORTI GY AMA"
invocation_type = "shout"
range = 7
- cooldown_min = 90 //15 deciseconds reduction per rank
+ cooldown_min = 60 //35 deciseconds reduction per rank
max_targets = 0
@@ -28,7 +28,6 @@
/obj/effect/proc_holder/spell/targeted/inflict_handler/magic_missile
amt_weakened = 3
- amt_dam_fire = 10
/obj/effect/proc_holder/spell/noclothes
name = "No Clothes"
@@ -225,7 +224,7 @@
amt_eye_blurry = 20
/obj/effect/proc_holder/spell/targeted/genetic/blind
- disabilities = 1
+ sdisabilities = BLIND
duration = 300
/obj/effect/proc_holder/spell/dumbfire/fireball
@@ -261,6 +260,7 @@
ex_severe = -1
ex_heavy = -1
ex_light = 2
+ ex_flash = 5
/obj/effect/proc_holder/spell/aoe_turf/repulse
name = "Repulse"
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index c8d64fb1b27..1f91e489934 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -3,9 +3,9 @@
var/spell_type = null
var/desc = ""
- var/category = "Offensive Spells"
+ var/category = "Offensive"
var/log_name = "XX" //What it shows up as in logs
- var/cost = 1
+ var/cost = 2
var/refundable = 1
var/surplus = -1 // -1 for infinite, not used by anything atm
var/obj/effect/proc_holder/spell/S = null //Since spellbooks can be used by only one person anyway we can track the actual spell
@@ -99,6 +99,7 @@
name = "Remove Clothes Requirement"
spell_type = /obj/effect/proc_holder/spell/noclothes
log_name = "NC"
+ category = "Defensive"
/datum/spellbook_entry/fireball
name = "Fireball"
@@ -109,6 +110,7 @@
name = "Magic Missile"
spell_type = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile
log_name = "MM"
+ category = "Defensive"
/datum/spellbook_entry/disintegrate
name = "Disintegrate"
@@ -119,12 +121,14 @@
name = "Disable Tech"
spell_type = /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech
log_name = "DT"
- category = "Utility Spells"
+ category = "Defensive"
+ cost = 1
/datum/spellbook_entry/repulse
name = "Repulse"
spell_type = /obj/effect/proc_holder/spell/aoe_turf/repulse
log_name = "RP"
+ category = "Defensive"
/datum/spellbook_entry/timestop
name = "Time Stop"
@@ -136,59 +140,57 @@
name = "Smoke"
spell_type = /obj/effect/proc_holder/spell/targeted/smoke
log_name = "SM"
- category = "Utility Spells"
+ category = "Defensive"
+ cost = 1
/datum/spellbook_entry/blind
name = "Blind"
spell_type = /obj/effect/proc_holder/spell/targeted/trigger/blind
log_name = "BD"
+ cost = 1
/datum/spellbook_entry/mindswap
name = "Mindswap"
spell_type = /obj/effect/proc_holder/spell/targeted/mind_transfer
log_name = "MT"
- category = "Utility Spells"
+ category = "Mobility"
/datum/spellbook_entry/forcewall
name = "Force Wall"
spell_type = /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall
log_name = "FW"
- category = "Utility Spells"
+ category = "Defensive"
+ cost = 1
/datum/spellbook_entry/blink
name = "Blink"
spell_type = /obj/effect/proc_holder/spell/targeted/turf_teleport/blink
log_name = "BL"
- category = "Utility Spells"
+ category = "Mobility"
/datum/spellbook_entry/teleport
name = "Teleport"
spell_type = /obj/effect/proc_holder/spell/targeted/area_teleport/teleport
log_name = "TP"
- category = "Utility Spells"
+ category = "Mobility"
/datum/spellbook_entry/mutate
name = "Mutate"
spell_type = /obj/effect/proc_holder/spell/targeted/genetic/mutate
log_name = "MU"
- category = "Utility Spells"
/datum/spellbook_entry/jaunt
name = "Ethereal Jaunt"
spell_type = /obj/effect/proc_holder/spell/targeted/ethereal_jaunt
log_name = "EJ"
- category = "Utility Spells"
+ category = "Mobility"
/datum/spellbook_entry/knock
name = "Knock"
spell_type = /obj/effect/proc_holder/spell/aoe_turf/knock
log_name = "KN"
- category = "Utility Spells"
-
-/datum/spellbook_entry/horseman
- name = "Curse of The Horseman"
- spell_type = /obj/effect/proc_holder/spell/targeted/horsemask
- log_name = "HH"
+ category = "Mobility"
+ cost = 1
/datum/spellbook_entry/fleshtostone
name = "Flesh to Stone"
@@ -199,20 +201,45 @@
name = "Summon Item"
spell_type = /obj/effect/proc_holder/spell/targeted/summonitem
log_name = "IS"
- category = "Utility Spells"
+ category = "Assistance"
+ cost = 1
+
+/datum/spellbook_entry/lichdom
+ name = "Bind Soul"
+ spell_type = /obj/effect/proc_holder/spell/targeted/lichdom
+ log_name = "LD"
+ category = "Defensive"
/datum/spellbook_entry/lightningbolt
name = "Lightning Bolt"
spell_type = /obj/effect/proc_holder/spell/targeted/lightning
log_name = "LB"
+/datum/spellbook_entry/infinite_guns
+ name = "Lesser Summon Guns"
+ spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns
+ log_name = "IG"
+ cost = 4
+
+/datum/spellbook_entry/horseman
+ name = "Curse of The Horseman"
+ spell_type = /obj/effect/proc_holder/spell/targeted/horsemask
+ log_name = "HH"
+
+/datum/spellbook_entry/charge
+ name = "Charge"
+ spell_type = /obj/effect/proc_holder/spell/targeted/charge
+ log_name = "CH"
+ category = "Assistance"
+ cost = 1
+
/datum/spellbook_entry/item
name = "Buy Item"
- category = "Artifacts"
refundable = 0
buy_word = "Summon"
var/item_path= null
+
/datum/spellbook_entry/item/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
new item_path(get_turf(user))
feedback_add_details("wizard_spell_learned",log_name)
@@ -238,6 +265,7 @@
desc = "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines."
item_path = /obj/item/weapon/gun/magic/staff/animate
log_name = "SA"
+ category = "Assistance"
/datum/spellbook_entry/item/staffchaos
name = "Staff of Chaos"
@@ -250,26 +278,23 @@
desc = "A particular staff that can mold solid metal into ornate wooden doors. Useful for getting around in the absence of other transportation. Does not work on glass."
item_path = /obj/item/weapon/gun/magic/staff/door
log_name = "SD"
+ cost = 1
+ category = "Mobility"
+
+/datum/spellbook_entry/item/staffhealing
+ name = "Staff of Healing"
+ desc = "An altruistic staff that can heal the lame and raise the dead."
+ item_path = /obj/item/weapon/gun/magic/staff/healing
+ log_name = "SH"
+ cost = 1
+ category = "Defensive"
/datum/spellbook_entry/item/scryingorb
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."
item_path = /obj/item/weapon/scrying
log_name = "SO"
-
-/datum/spellbook_entry/item/bloodbottle
- name = "Bottle of Blood"
- desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim."
- item_path = /obj/item/weapon/antag_spawner/slaughter_demon
- log_name = "BB"
- limit = 3
-
-/datum/spellbook_entry/item/tarotdeck
- name = "Tarot Deck"
- desc = "A deck of tarot cards that can be used to summon a spirit companion for the wizard."
- item_path = /obj/item/weapon/guardiancreator
- log_name = "TD"
- limit = 1
+ category = "Defensive"
/datum/spellbook_entry/item/scryingorb/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
if(..())
@@ -287,6 +312,7 @@
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."
item_path = /obj/item/weapon/storage/belt/soulstone/full
log_name = "SS"
+ category = "Assistance"
/datum/spellbook_entry/item/soulstones/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
. =..()
@@ -299,18 +325,21 @@
desc = "A Necromantic stone is able to resurrect three dead individuals as skeletal thralls for you to command."
item_path = /obj/item/device/necromantic_stone
log_name = "NS"
+ category = "Assistance"
/datum/spellbook_entry/item/wands
name = "Wand Assortment"
desc = "A collection of wands that allow for a wide variety of utility. Wands do not recharge, so be conservative in use. Comes in a handy belt."
item_path = /obj/item/weapon/storage/belt/wands/full
log_name = "WA"
+ category = "Defensive"
/datum/spellbook_entry/item/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."
item_path = /obj/item/clothing/suit/space/rig/wizard
log_name = "HS"
+ category = "Defensive"
/datum/spellbook_entry/item/armor/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
. = ..()
@@ -324,6 +353,35 @@
desc = "A magical contract binding an apprentice wizard to your service, using it will summon them to your side."
item_path = /obj/item/weapon/contract
log_name = "CT"
+ category = "Assistance"
+
+/datum/spellbook_entry/item/bloodbottle
+ name = "Bottle of Blood"
+ desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim."
+ item_path = /obj/item/weapon/antag_spawner/slaughter_demon
+ log_name = "BB"
+ limit = 3
+ category = "Assistance"
+
+/datum/spellbook_entry/item/tarotdeck
+ name = "Tarot Deck"
+ desc = "A deck of tarot cards that can be used to summon a spirit companion for the wizard."
+ item_path = /obj/item/weapon/guardiancreator
+ log_name = "TD"
+ limit = 1
+ category = "Assistance"
+
+/datum/spellbook_entry/item/mjolnir
+ name = "Mjolnir"
+ desc = "A mighty hammer on loan from Thor, God of Thunder. It crackles with barely contained power."
+ item_path = /obj/item/weapon/twohanded/mjollnir
+ log_name = "MJ"
+
+/datum/spellbook_entry/item/singularity_hammer
+ name = "Singularity Hammer"
+ desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everthing nearby to the point of impact."
+ item_path = /obj/item/weapon/twohanded/singularityhammer
+ log_name = "SI"
/datum/spellbook_entry/summon
name = "Summon Stuff"
@@ -349,7 +407,7 @@
/datum/spellbook_entry/summon/guns
name = "Summon Guns"
- category = "Challenges"
+ category = "Rituals"
desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!"
cost = 0
log_name = "SG"
@@ -384,8 +442,8 @@
icon_state ="book"
throw_speed = 2
throw_range = 5
- w_class = 1.0
- var/uses = 5
+ w_class = 1
+ var/uses = 10
var/temp = null
var/op = 1
var/tab = null
@@ -429,17 +487,26 @@
/obj/item/weapon/spellbook/proc/GetCategoryHeader(var/category)
var/dat = ""
switch(category)
- if("Offensive Spells")
- dat += "Spells that can be reused endlessly.
"
- dat += "The number after the spell name is the cooldown time.
"
+ if("Offensive")
+ dat += "Spells and items geared towards debilitating and destroying.
"
+ dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
"
+ dat += "For spells: the number after the spell name is the cooldown time.
"
dat += "You can reduce this number by spending more points on the spell.
"
- if("Utility Spells")
- dat += "Spells that can be reused endlessly.
"
- dat += "The number after the spell name is the cooldown time.
"
+ if("Defensive")
+ dat += "Spells and items geared towards improving your survivabilty or reducing foes ability to attack.
"
+ dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
"
+ dat += "For spells: the number after the spell name is the cooldown time.
"
+ dat += "You can reduce this number by spending more points on the spell.
"
+ if("Mobility")
+ dat += "Spells and items geared towards improving your ability to move. It is a good idea to take at least one.
"
+ dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
"
+ dat += "For spells: the number after the spell name is the cooldown time.
"
+ dat += "You can reduce this number by spending more points on the spell.
"
+ if("Assistance")
+ dat += "Spells and items geared towards bringing in outside forces to aid you or improving upon your other items and abilties.
"
+ dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
"
+ dat += "For spells: the number after the spell name is the cooldown time.
"
dat += "You can reduce this number by spending more points on the spell.
"
- if("Artifacts")
- dat += "Powerful items imbued with eldritch magics. Summoning one will count towards your maximum number of uses.
"
- dat += "These items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
"
if("Challenges")
dat += "The Wizard Federation typically has hard limits on the potency and number of spells brought to the station based on risk.
"
dat += "Arming the station against you will increases the risk, but will grant you one more charge for your spellbook.
"
@@ -484,7 +551,7 @@
cat_dat[category] = "
"
dat += "[category]"
- dat += "Uses remaining : [uses]"
+ dat += "Points remaining : [uses]"
dat += ""
var/datum/spellbook_entry/E
@@ -508,7 +575,7 @@
dat += cat_dat[category]
dat += ""
- user << browse(wrap(dat), "window=spellbook;size=700x300")
+ user << browse(wrap(dat), "window=spellbook;size=700x500")
onclose(user, "spellbook")
return
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index 2d690cdbb17..2f34c567dd3 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -292,10 +292,12 @@
//OTHER PROCS
//To batch-remove wizard spells. Linked to mind.dm.
-/mob/proc/spellremove(var/mob/M as mob, var/removeallspells=1)
- for(var/obj/effect/proc_holder/spell/spell_to_remove in src.spell_list)
- if (spell_to_remove.name == "Artificer" && !removeallspells) continue
+/mob/proc/spellremove(mob/M)
+ if(!mind)
+ return
+ for(var/obj/effect/proc_holder/spell/spell_to_remove in src.mind.spell_list)
qdel(spell_to_remove)
+ mind.spell_list -= spell_to_remove
/datum/mind/proc/remove_spell(var/obj/effect/proc_holder/spell/spell) //To remove a specific spell from a mind
if(!spell) return
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 2cc2f739dcc..61164a45298 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -466,7 +466,7 @@
vortex(target,user)
/obj/item/weapon/twohanded/mjollnir
- name = "Mjollnir"
+ name = "Mjolnir"
desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy."
icon_state = "mjollnir0"
flags = CONDUCT
@@ -474,7 +474,7 @@
no_embed = 1
force = 5
force_unwielded = 5
- force_wielded = 20
+ force_wielded = 25
throwforce = 30
throw_range = 7
w_class = 5
@@ -485,25 +485,30 @@
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread()
s.set_up(5, 1, target.loc)
s.start()
- target.take_organ_damage(0,30)
target.visible_message("[target.name] was shocked by the [src.name]!", \
"You feel a powerful shock course through your body sending you flying!", \
- "You hear a heavy electrical crack.")
+ "You hear a heavy electrical crack!")
var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src)))
target.throw_at(throw_target, 200, 4)
return
/obj/item/weapon/twohanded/mjollnir/attack(mob/M as mob, mob/user as mob)
..()
- spawn(0)
if(wielded)
//if(charged == 5)
//charged = 0
playsound(src.loc, "sparks", 50, 1)
if(istype(M, /mob/living))
- M.Stun(10)
+ M.Stun(3)
shock(M)
+/obj/item/weapon/twohanded/mjollnir/throw_impact(atom/target)
+ . = ..()
+ if(istype(target, /mob/living))
+ var/mob/living/L = target
+ L.Stun(3)
+ shock(L)
+
/obj/item/weapon/twohanded/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "mjollnir[wielded]"
return
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index 8b204b399a6..c36a3f3ecea 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -15,6 +15,12 @@
desc = "Strange-looking, red, hat-wear that most certainly belongs to a real magic user."
icon_state = "redwizard"
+/obj/item/clothing/head/wizard/black
+ name = "black wizard hat"
+ desc = "Strange-looking black hat-wear that most certainly belongs to a real skeleton. Spooky."
+ icon_state = "blackwizard"
+
+
/obj/item/clothing/head/wizard/clown
name = "purple wizard hat"
desc = "Strange-looking purple hat-wear that most certainly belongs to a real magic user."
@@ -66,6 +72,12 @@
icon_state = "redwizard"
item_state = "redwizrobe"
+/obj/item/clothing/suit/wizrobe/black
+ name = "black wizard robe"
+ desc = "An unnerving black gem-lined robe that reeks of death and decay."
+ icon_state = "blackwizard"
+ item_state = "blackwizrobe"
+
/obj/item/clothing/suit/wizrobe/clown
name = "Clown Robe"
desc = "A set of armoured robes that seem to radiate a dark power. That, and bad fashion decisions."
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 09791623e51..0701b394113 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -26,6 +26,7 @@ mob/living
qdel(guts)
for(var/atom/movable/food in stomach_contents)
qdel(food)
+ remove_from_all_data_huds()
return ..()
/mob/living/carbon/blob_act()
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index d73f7ffee1a..8e057695b3a 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -125,6 +125,38 @@
..(user)
user << "The bolt is [bolt_open ? "open" : "closed"]."
+/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted
+ name = "enchanted bolt action rifle"
+ desc = "Careful not to lose your head."
+ var/guns_left = 30
+ mag_type = "/obj/item/ammo_box/magazine/internal/boltaction/enchanted"
+
+/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/New()
+ ..()
+ bolt_open = 1
+ pump()
+
+/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/dropped()
+ guns_left = 0
+
+/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/Fire(atom/target as mob|obj|turf|area, mob/living/carbon/user as mob|obj, params, reflex = 0)
+ ..()
+ if(guns_left)
+ var/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/GUN = new
+ GUN.guns_left = src.guns_left - 1
+ user.drop_item()
+ user.swap_hand()
+ user.put_in_hands(GUN)
+ else
+ user.drop_item()
+ spawn(0)
+ throw_at(pick(oview(7,get_turf(user))),1,1)
+ user.visible_message("[user] tosses aside the spent rifle!")
+
+
+/obj/item/ammo_box/magazine/internal/boltaction/enchanted
+ max_ammo =1
+
/////////////////////////////
// DOUBLE BARRELED SHOTGUN //
/////////////////////////////
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 8b9f2af61ae..7d87c3d7557 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 8b1add2756b..57d17caaa46 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 67f9603ece6..185168a1933 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index a30a79e335d..0ac8cffa837 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index a7cc00338f5..7b7e657e629 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 1bb43439df7..988f0153964 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 9de3d4ce5d5..e31271b9e11 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -215,8 +215,10 @@
#include "code\datums\spells\fake_gib.dm"
#include "code\datums\spells\genetic.dm"
#include "code\datums\spells\horsemask.dm"
+#include "code\datums\spells\infinite_guns.dm"
#include "code\datums\spells\inflict_handler.dm"
#include "code\datums\spells\knock.dm"
+#include "code\datums\spells\lichdom.dm"
#include "code\datums\spells\lightning.dm"
#include "code\datums\spells\magnet.dm"
#include "code\datums\spells\mind_transfer.dm"