diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 1bb4579176..671d01f130 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -235,6 +235,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
resistance_flags = FIRE_PROOF
total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
+/obj/item/katana/lavaland
+ desc = "Woefully underpowered in Lavaland."
+ block_chance = 30
+ force = 25 //Like a fireaxe but one handed and can block!
+
/obj/item/katana/cursed
slot_flags = null
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 89fa3ac6cf..ed9fc6d67f 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -22,7 +22,7 @@
max_integrity = 200
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
var/state = 0
- var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/book) //Things allowed in the bookcase
+ var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/book, /obj/item/gun/magic/wand/book) //Things allowed in the bookcase
/obj/structure/bookcase/examine(mob/user)
. = ..()
@@ -192,7 +192,7 @@
desc = "Crack it open, inhale the musk of its pages, and learn something new."
throw_speed = 1
throw_range = 5
- w_class = WEIGHT_CLASS_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever)
+ w_class = WEIGHT_CLASS_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever)
attack_verb = list("bashed", "whacked", "educated")
resistance_flags = FLAMMABLE
var/dat //Actual page content
diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm
index 50a3dec9dd..4cdf1d35d6 100644
--- a/code/modules/mining/equipment/mining_tools.dm
+++ b/code/modules/mining/equipment/mining_tools.dm
@@ -66,6 +66,16 @@
force = 19
custom_materials = list(/datum/material/diamond=4000)
+/obj/item/pickaxe/rosegold
+ name = "rose gold pickaxe"
+ icon_state = "rgpickaxe"
+ item_state = "rgpickaxe"
+ toolspeed = 0.1
+ desc = "A pickaxe with a light rose gold head and some red glowing ruins. Extremely robust at cracking rock walls and digging up dirt."
+ force = 19
+ custom_materials = list(/datum/material/gold=4000)
+ digrange = 3
+
/obj/item/pickaxe/plasteel
name = "plasteel-tipped pickaxe"
icon_state = "titaxe"
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 2f5b9dd185..1dedb0042d 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -19,7 +19,7 @@
/obj/structure/closet/crate/necropolis/tendril/misc
/obj/structure/closet/crate/necropolis/tendril/magic/PopulateContents()
- var/loot = rand(1,8)
+ var/loot = rand(1,10)
switch(loot)
if(1)
new /obj/item/soulstone/anybody(src)
@@ -38,14 +38,20 @@
new /obj/item/warp_cube/red(src)
if(8)
new /obj/item/immortality_talisman(src)
+ if(9)
+ new /obj/item/gun/magic/wand/book/healing(src)
+ if(10)
+ new /obj/item/reagent_containers/glass/bottle/ichor/red(src)
+ new /obj/item/reagent_containers/glass/bottle/ichor/blue(src)
+ new /obj/item/reagent_containers/glass/bottle/ichor/green(src)
/obj/structure/closet/crate/necropolis/tendril/weapon_armor/PopulateContents()
- var/loot = rand(1,8)
+ var/loot = rand(1,11)
switch(loot)
if(1)
new /obj/item/clothing/suit/space/hardsuit/cult(src)
if(2)
- new /obj/item/katana/cursed(src)
+ new /obj/item/katana/lavaland(src)
if(3)
if(prob(50))
new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src)
@@ -62,9 +68,15 @@
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/old(src)
if(8)
new /obj/item/grenade/clusterbuster/inferno(src)
+ if(9)
+ new /obj/item/gun/magic/wand/book/shock(src)
+ if(10)
+ new /obj/item/gun/magic/wand/book/page(src)
+ if(11)
+ new /obj/item/gun/magic/wand/book/spark(src)
/obj/structure/closet/crate/necropolis/tendril/misc/PopulateContents()
- var/loot = rand(1,8)
+ var/loot = rand(1,10)
switch(loot)
if(1)
new /obj/item/shared_storage/red(src)
@@ -85,6 +97,12 @@
new /obj/item/disk/design_disk/modkit_disc/bounty(src)
if(8)
new /obj/item/wisp_lantern(src)
+ if(9)
+ new /obj/item/pickaxe/rosegold(src)
+ if(10)
+ new /obj/item/bedsheet/cosmos(src)
+ new /obj/item/melee/skateboard/hoverboard(src)
+
//KA modkit design discs
/obj/item/disk/design_disk/modkit_disc
diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm
index cc039c5f2b..bea51efc24 100644
--- a/code/modules/projectiles/ammunition/special/magic.dm
+++ b/code/modules/projectiles/ammunition/special/magic.dm
@@ -43,3 +43,17 @@
/obj/item/ammo_casing/magic/locker
projectile_type = /obj/item/projectile/magic/locker
+
+//Spell book ammo casing
+/obj/item/ammo_casing/magic/book/book
+ projectile_type = /obj/item/projectile/magic/spellcard/book
+
+/obj/item/ammo_casing/magic/book/spark
+ projectile_type = /obj/item/projectile/magic/spellcard/book/spark
+
+/obj/item/ammo_casing/magic/book/heal
+ projectile_type = /obj/item/projectile/magic/spellcard/book/heal
+ harmful = FALSE
+
+/obj/item/ammo_casing/magic/book/shock
+ projectile_type = /obj/item/projectile/magic/spellcard/book/shock
diff --git a/code/modules/projectiles/guns/magic/spell_book.dm b/code/modules/projectiles/guns/magic/spell_book.dm
new file mode 100644
index 0000000000..1577b7b024
--- /dev/null
+++ b/code/modules/projectiles/guns/magic/spell_book.dm
@@ -0,0 +1,84 @@
+/obj/item/gun/magic/wand/book
+ name = "blank spellbook"
+ desc = "It's not just a book, it's a SPELL book!"
+ ammo_type = /obj/item/ammo_casing/magic
+ icon = 'icons/obj/library.dmi'
+ icon_state = "book"
+ w_class = WEIGHT_CLASS_NORMAL
+ charges = 10 //We start with max pages
+ max_charges = 10
+ variable_charges = FALSE
+ self_attack = FALSE
+
+/obj/item/gun/magic/wand/book/examine(mob/user)
+ . = ..()
+ . += "Has [charges] pages\s remaining."
+
+/obj/item/gun/magic/wand/book/attack(atom/target, mob/living/user)
+ if(target == user)
+ return
+ ..()
+
+/obj/item/gun/magic/wand/book/afterattack(atom/target, mob/living/user)
+ if(charges == 0)
+ shoot_with_empty_chamber(user)
+ return
+ if(target == user)
+ to_chat(user, "The book has [charges] pages\s remaining.")
+ else
+ . = ..()
+ update_icon()
+
+/obj/item/gun/magic/wand/book/attackby(obj/item/S, mob/living/user, params)
+ if(!istype(S, /obj/item/paper))
+ return
+ if(charges < max_charges)
+ charges++
+ recharge_newshot()
+ to_chat(user, "You add a new page to [src].")
+ qdel(S)
+ update_icon()
+ process()
+ else
+ to_chat(user, "The [src] has no more room for pages!")
+ return
+
+//////////////////////
+//Spell Book - SPARK//
+//////////////////////
+
+/obj/item/gun/magic/wand/book/spark
+ name = "Spell Book of Spark"
+ desc = "A spell book that fires burn pages to set the target ablaze!"
+ ammo_type = /obj/item/ammo_casing/magic/book/spark
+ icon_state = "spellbook_spark"
+
+//////////////////////
+//Spell Book - PAGE///
+//////////////////////
+
+/obj/item/gun/magic/wand/book/page
+ name = "Spell Book of Throw"
+ desc = "A spell book that throws pages at its target!"
+ ammo_type = /obj/item/ammo_casing/magic/book/book
+ icon_state = "spellbook_page"
+
+//////////////////////
+//Spell Book - SHOCK//
+//////////////////////
+
+/obj/item/gun/magic/wand/book/shock
+ name = "Spell Book of Shock"
+ desc = "A spell book that uses its pages to capture energy in the air and send it in a bolt at its target!"
+ ammo_type = /obj/item/ammo_casing/magic/book/shock
+ icon_state = "spellbook_shock"
+
+////////////////////////
+//Spell Book - HEALING//
+////////////////////////
+
+/obj/item/gun/magic/wand/book/healing
+ name = "Spell Book of Mending"
+ desc = "A spell book that uses its pages to heal and repair the target! The back of the book lists what it works on, and it seems to only be of flesh and of metal beings..."
+ ammo_type = /obj/item/ammo_casing/magic/book/heal
+ icon_state = "spellbook_healing"
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index f48020aeb5..8703b8325c 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -8,6 +8,7 @@
can_charge = 0
max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths)
var/variable_charges = 1
+ var/self_attack = TRUE
/obj/item/gun/magic/wand/Initialize()
if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges
@@ -33,7 +34,7 @@
if(!charges)
shoot_with_empty_chamber(user)
return
- if(target == user)
+ if(target == user && self_attack == TRUE)
if(no_den_usage)
var/area/A = get_area(user)
if(istype(A, /area/wizard_station))
diff --git a/code/modules/projectiles/projectile/magic/spellcard.dm b/code/modules/projectiles/projectile/magic/spellcard.dm
index 1b8f326573..7acf52d878 100644
--- a/code/modules/projectiles/projectile/magic/spellcard.dm
+++ b/code/modules/projectiles/projectile/magic/spellcard.dm
@@ -4,3 +4,60 @@
icon_state = "spellcard"
damage_type = BURN
damage = 2
+
+/obj/item/projectile/magic/spellcard/book
+ nodamage = FALSE
+ name = "enchanted page"
+ desc = "A piece of paper enchanted to give it extreme durability and stiffness, along with a very hot burn to anyone unfortunate enough to get hit by a charged one."
+ icon_state = "spellcard"
+ damage_type = BURN
+ damage = 12
+ flag = "magic"
+
+/obj/item/projectile/magic/spellcard/book/spark
+ damage = 4
+ var/fire_stacks = 4
+
+/obj/item/projectile/magic/spellcard/book/spark/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ var/mob/living/carbon/M = target
+ if(iscarbon(target))
+ if(M.anti_magic_check())
+ M.visible_message("[src] vanishes on contact with [target]!")
+ return BULLET_ACT_BLOCK
+ else
+ M.adjust_fire_stacks(fire_stacks)
+ M.IgniteMob()
+ return
+ else
+ damage = 20 //If we are a simplemob we deal 5x damage
+
+/obj/item/projectile/magic/spellcard/book/shock
+ damage = 0
+ stamina = 11
+ stutter = 5
+ jitter = 20
+ knockdown = 10
+
+/obj/item/projectile/magic/spellcard/book/heal
+ damage = 0
+
+/obj/item/projectile/magic/spellcard/book/heal/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ var/mob/living/carbon/M = target
+ if(iscarbon(target))
+ if(M.anti_magic_check())
+ M.visible_message("[src] vanishes on contact with [target]!")
+ return BULLET_ACT_BLOCK
+ else
+ M.visible_message("[src] mends [target]!")
+ M.adjustBruteLoss(-5) //HEALS
+ M.adjustOxyLoss(-5)
+ M.adjustBruteLoss(-5)
+ M.adjustFireLoss(-5)
+ M.adjustToxLoss(-5, TRUE) //heals TOXINLOVERs
+ M.adjustCloneLoss(-5)
+ M.adjustStaminaLoss(-5)
+ return
+ else
+ return
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index d3ac8fa506..5e55bbaeb6 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -2195,6 +2195,58 @@
color = "#f7685e"
metabolization_rate = REAGENTS_METABOLISM * 0.25
+/datum/reagent/red_ichor
+ name = "Red Ichor"
+ can_synth = FALSE
+ description = "A unknown red liquid, linked to healing of most moral wounds."
+ color = "#c10000"
+ metabolization_rate = REAGENTS_METABOLISM * 2.5
+
+/datum/reagent/red_ichor/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-50)
+ M.adjustOxyLoss(-50)
+ M.adjustBruteLoss(-50)
+ M.adjustFireLoss(-50)
+ M.adjustToxLoss(-50, TRUE) //heals TOXINLOVERs
+ M.adjustCloneLoss(-50)
+ M.adjustStaminaLoss(-50)
+ ..()
+
+/datum/reagent/green_ichor
+ name = "Green Ichor"
+ can_synth = FALSE
+ description = "A unknown green liquid, linked to healing of most internal wounds."
+ color = "#158c00"
+ metabolization_rate = REAGENTS_METABOLISM * 2.5
+
+/datum/reagent/green_ichor/on_mob_life(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -100)
+ M.adjustOrganLoss(ORGAN_SLOT_HEART, -100)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, -100)
+ M.adjustOrganLoss(ORGAN_SLOT_EARS, -100)
+ M.adjustOrganLoss(ORGAN_SLOT_STOMACH, -100)
+ M.adjustOrganLoss(ORGAN_SLOT_TONGUE, -100)
+ M.adjustOrganLoss(ORGAN_SLOT_EYES, -100)
+ ..()
+
+/datum/reagent/blue_ichor
+ name = "Blue Ichor"
+ can_synth = FALSE
+ description = "A unknown blue liquid, linked to healing the mind."
+ color = "#0914e0"
+ metabolization_rate = REAGENTS_METABOLISM * 2.5
+
+/datum/reagent/blue_ichor/on_mob_life(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -100)
+ M.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC)
+ M.hallucination = 0
+ M.dizziness = 0
+ M.disgust = 0
+ M.drowsyness = 0
+ M.stuttering = 0
+ M.confused = 0
+ M.SetSleeping(0, 0)
+ ..()
//body bluids
/datum/reagent/consumable/semen
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index cc1cd21bac..84100bea8c 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -8,7 +8,6 @@
possible_transfer_amounts = list(5,10,15,25,30)
volume = 30
-
/obj/item/reagent_containers/glass/bottle/Initialize()
. = ..()
if(!icon_state)
@@ -412,6 +411,23 @@
name = "bromine bottle"
list_reagents = list(/datum/reagent/bromine = 30)
+//Ichors
+/obj/item/reagent_containers/glass/bottle/ichor
+ possible_transfer_amounts = list(1)
+ volume = 1
+
+/obj/item/reagent_containers/glass/bottle/ichor/red
+ name = "healing potion"
+ list_reagents = list(/datum/reagent/red_ichor = 1)
+
+/obj/item/reagent_containers/glass/bottle/ichor/blue
+ name = "blue potion"
+ list_reagents = list(/datum/reagent/blue_ichor = 1)
+
+/obj/item/reagent_containers/glass/bottle/ichor/green
+ name = "green potion"
+ list_reagents = list(/datum/reagent/green_ichor = 1)
+
//Lewd Stuff
/obj/item/reagent_containers/glass/bottle/crocin
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index 727d69b1e3..6e14c4c6ca 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 43bc9c48aa..f31844782d 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index b7f998e7e4..9603b56b9a 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2868,6 +2868,7 @@
#include "code\modules\projectiles\guns\energy\pulse.dm"
#include "code\modules\projectiles\guns\energy\special.dm"
#include "code\modules\projectiles\guns\energy\stun.dm"
+#include "code\modules\projectiles\guns\magic\spell_book.dm"
#include "code\modules\projectiles\guns\magic\staff.dm"
#include "code\modules\projectiles\guns\magic\wand.dm"
#include "code\modules\projectiles\guns\misc\beam_rifle.dm"