diff --git a/_maps/shuttles/emergency_arena.dmm b/_maps/shuttles/emergency_arena.dmm index 1314b8a732..2ba9206830 100644 --- a/_maps/shuttles/emergency_arena.dmm +++ b/_maps/shuttles/emergency_arena.dmm @@ -43,7 +43,7 @@ }, /area/shuttle/escape/arena) "l" = ( -/obj/structure/closet/crate/necropolis/tendril, +/obj/structure/closet/crate/necropolis/tendril/magic, /turf/open/indestructible/necropolis/air, /area/shuttle/escape/arena) "m" = ( @@ -65,10 +65,18 @@ /obj/structure/healingfountain, /turf/open/indestructible/necropolis/air, /area/shuttle/escape/arena) +"t" = ( +/obj/structure/closet/crate/necropolis/tendril/misc, +/turf/open/indestructible/necropolis/air, +/area/shuttle/escape/arena) "z" = ( /obj/effect/landmark/shuttle_arena_safe, /turf/open/indestructible/necropolis/air, /area/shuttle/escape/arena) +"H" = ( +/obj/structure/closet/crate/necropolis/tendril/weapon_armor, +/turf/open/indestructible/necropolis/air, +/area/shuttle/escape/arena) (1,1,1) = {" a @@ -264,16 +272,16 @@ m l j m -l +H j k -l +H j m -l +t j m -j +t j p g @@ -524,16 +532,16 @@ m l j m -l +H j m -l +H j m -l +t j m -j +t j p g diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 653e95c21e..3f2dc2506a 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -237,6 +237,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/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm index 2911babd83..edc4f0c91f 100644 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -10,6 +10,7 @@ max_mobs = 3 max_integrity = 250 mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril) + var/loot_type = /obj/structure/closet/crate/necropolis/tendril/all move_resist=INFINITY // just killing it tears a massive hole in the ground, let's not move it anchored = TRUE @@ -41,7 +42,7 @@ GLOBAL_LIST_INIT(tendrils, list()) /obj/structure/spawner/lavaland/deconstruct(disassembled) new /obj/effect/collapse(loc) - new /obj/structure/closet/crate/necropolis/tendril(loc) + new loot_type(loc) return ..() diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 80ce2522ff..a4d88158e2 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 27259ce812..31ee37c3b0 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 runes. 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 819b005b43..72e52176bb 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -7,78 +7,202 @@ icon_state = "necrocrate" resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF +/obj/structure/closet/crate/necropolis/tendril/random + name = "necropolis crate" + desc = "A chest for a chest, a head for a head." + +/obj/structure/closet/crate/necropolis/tendril/random/PopulateContents() + var/loot = rand(1,3) + switch(loot) + if(1) + new /obj/structure/closet/crate/necropolis/tendril/magic(src) + if(2) + new /obj/structure/closet/crate/necropolis/tendril/weapon_armor(src) + if(3) + new /obj/structure/closet/crate/necropolis/tendril/misc(src) + /obj/structure/closet/crate/necropolis/tendril desc = "It's watching you suspiciously." -/obj/structure/closet/crate/necropolis/tendril/PopulateContents() - var/loot = rand(1,29) +/obj/structure/closet/crate/necropolis/tendril/magic + name = "relic necropolis chest" + +/obj/structure/closet/crate/necropolis/tendril/weapon_armor + name = "armament necropolis chest" + +/obj/structure/closet/crate/necropolis/tendril/misc + +/obj/structure/closet/crate/necropolis/tendril/all + desc = "It's watching you suspiciously." + +/obj/structure/closet/crate/necropolis/tendril/magic/PopulateContents() + var/loot = rand(1,10) switch(loot) if(1) - new /obj/item/shared_storage/red(src) - if(2) - new /obj/item/clothing/suit/space/hardsuit/cult(src) - if(3) new /obj/item/soulstone/anybody(src) + if(2) + new /obj/item/rod_of_asclepius(src) + if(3) + new /obj/item/organ/heart/cursed/wizard(src) if(4) - new /obj/item/katana/cursed(src) + new /obj/item/book/granter/spell/summonitem(src) if(5) - new /obj/item/clothing/glasses/godeye(src) + new /obj/item/borg/upgrade/modkit/lifesteal(src) + new /obj/item/bedsheet/cult(src) if(6) - new /obj/item/reagent_containers/glass/bottle/potion/flight(src) + new /obj/item/clothing/neck/necklace/memento_mori(src) if(7) - new /obj/item/pickaxe/diamond(src) + 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,11) + switch(loot) + if(1) + new /obj/item/clothing/suit/space/hardsuit/cult(src) + if(2) + new /obj/item/katana/lavaland(src) + if(3) if(prob(50)) new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src) else new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src) - if(9) - new /obj/item/rod_of_asclepius(src) - if(10) - new /obj/item/organ/heart/cursed/wizard(src) - if(11) - new /obj/item/ship_in_a_bottle(src) - if(12) + if(4) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/old(src) - if(13) - new /obj/item/jacobs_ladder(src) - if(14) + if(5) new /obj/item/nullrod/scythe/talking(src) - if(15) + if(6) new /obj/item/nullrod/armblade(src) - if(16) - new /obj/item/guardiancreator(src) - if(17) + if(7) + new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src) + 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,11) + switch(loot) + if(1) + new /obj/item/shared_storage/red(src) + if(2) + new /obj/item/reagent_containers/glass/bottle/potion/flight(src) + if(3) + new /obj/item/ship_in_a_bottle(src) + if(4) + new /obj/item/voodoo(src) + if(5) + new /obj/item/book_of_babel(src) + if(6) + new /obj/item/jacobs_ladder(src) + if(7) if(prob(50)) new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) else new /obj/item/disk/design_disk/modkit_disc/bounty(src) - if(18) - new /obj/item/warp_cube/red(src) - if(19) + if(8) new /obj/item/wisp_lantern(src) - if(20) - new /obj/item/immortality_talisman(src) - if(21) - new /obj/item/gun/magic/hook(src) - if(22) + if(9) + new /obj/item/pickaxe/rosegold(src) + if(10) + new /obj/item/bedsheet/cosmos(src) + new /obj/item/melee/skateboard/hoverboard(src) + if(11) + if(prob(50)) + new /obj/item/malf_upgrade + else + new /obj/item/disk/tech_disk/illegal + if(12) + new /obj/item/clothing/suit/space/hardsuit/cult(src) + if(13) + new /obj/item/katana/lavaland(src) + if(14) + if(prob(50)) + new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src) + else + new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src) + +/obj/structure/closet/crate/necropolis/tendril/all/PopulateContents() + var/loot = rand(1,31) + switch(loot) + if(1) + new /obj/item/shared_storage/red(src) + if(2) + new /obj/item/reagent_containers/glass/bottle/potion/flight(src) + if(3) + new /obj/item/ship_in_a_bottle(src) + if(4) new /obj/item/voodoo(src) - if(23) - new /obj/item/grenade/clusterbuster/inferno(src) - if(24) + if(5) + new /obj/item/book_of_babel(src) + if(6) + new /obj/item/jacobs_ladder(src) + if(7) + if(prob(50)) + new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) + else + 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) + if(11) + new /obj/item/disk/tech_disk/illegal + if(15) + new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/old(src) + if(16) + new /obj/item/nullrod/scythe/talking(src) + if(17) + new /obj/item/nullrod/armblade(src) + if(18) new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/old(src) + if(19) + new /obj/item/grenade/clusterbuster/inferno(src) + if(20) + new /obj/item/gun/magic/wand/book/shock(src) + if(21) + new /obj/item/gun/magic/wand/book/page(src) + if(22) + new /obj/item/gun/magic/wand/book/spark(src) + if(23) + new /obj/item/soulstone/anybody(src) + if(24) + new /obj/item/rod_of_asclepius(src) if(25) - new /obj/item/book/granter/spell/summonitem(src) + new /obj/item/organ/heart/cursed/wizard(src) if(26) - new /obj/item/book_of_babel(src) + new /obj/item/book/granter/spell/summonitem(src) if(27) new /obj/item/borg/upgrade/modkit/lifesteal(src) new /obj/item/bedsheet/cult(src) if(28) new /obj/item/clothing/neck/necklace/memento_mori(src) + if(28) + new /obj/item/warp_cube/red(src) if(29) - new /obj/item/disk/tech_disk/illegal(src) + new /obj/item/immortality_talisman(src) + if(30) + new /obj/item/gun/magic/wand/book/healing(src) + if(31) + 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) //KA modkit design discs /obj/item/disk/design_disk/modkit_disc @@ -744,7 +868,7 @@ new /obj/item/lava_staff(src) if(3) new /obj/item/book/granter/spell/sacredflame(src) - new /obj/item/gun/magic/wand/fireball(src) + new /obj/item/gun/magic/hook(src) if(4) new /obj/item/dragons_blood(src) @@ -983,7 +1107,7 @@ if(2) new /obj/item/gun/ballistic/revolver/doublebarrel/super(src) if(3) - new /obj/item/gun/magic/staff/spellblade(src) + new /obj/item/guardiancreator(src) /obj/structure/closet/crate/necropolis/bubblegum/crusher name = "bloody bubblegum chest" @@ -1072,6 +1196,7 @@ var/random_crystal = pick(choices) new random_crystal(src) new /obj/item/organ/vocal_cords/colossus(src) + new /obj/item/clothing/glasses/godeye(src) /obj/structure/closet/crate/necropolis/colossus/crusher name = "angelic colossus chest" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 795184bad5..3de4c8b41b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -141,7 +141,7 @@ Difficulty: Medium loot = list(/obj/item/staff/storm) elimination = 0 else if(prob(20)) - loot = list(/obj/structure/closet/crate/necropolis/tendril) + loot = list(/obj/structure/closet/crate/necropolis/tendril/random) //This one spawns a chest that could be any of the three types ..() /obj/item/gps/internal/legion diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index e3edd171c0..e347056924 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -25,6 +25,7 @@ var/list/attack_action_types = list() var/can_talk = FALSE var/obj/loot_drop = null + var/crate_type = /obj/structure/closet/crate/necropolis/tendril var/owner //Gives player-controlled variants the ability to swap attacks @@ -182,7 +183,7 @@ While using this makes the system rely on OnFire, it still gives options for tim activator = null -obj/structure/elite_tumor/proc/spawn_elite(var/mob/dead/observer/elitemind) +/obj/structure/elite_tumor/proc/spawn_elite(var/mob/dead/observer/elitemind) var/selectedspawn = pick(potentialspawns) mychild = new selectedspawn(loc) visible_message("[mychild] emerges from [src]!") @@ -193,7 +194,7 @@ obj/structure/elite_tumor/proc/spawn_elite(var/mob/dead/observer/elitemind) icon_state = "tumor_popped" INVOKE_ASYNC(src, .proc/arena_checks) -obj/structure/elite_tumor/proc/return_elite() +/obj/structure/elite_tumor/proc/return_elite() mychild.forceMove(loc) visible_message("[mychild] emerges from [src]!") playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) @@ -271,11 +272,11 @@ obj/structure/elite_tumor/proc/return_elite() visible_message("[mychild] suddenly reappears above [src]!") playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) -obj/structure/elite_tumor/proc/onEliteLoss() +/obj/structure/elite_tumor/proc/onEliteLoss() playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, 0, 50, TRUE, TRUE) visible_message("[src] begins to convulse violently before beginning to dissipate.") visible_message("As [src] closes, something is forced up from down below.") - var/obj/structure/closet/crate/necropolis/tendril/lootbox = new /obj/structure/closet/crate/necropolis/tendril(loc) + var/obj/structure/closet/crate/necropolis/tendril/lootbox = new mychild.crate_type(loc) if(!boosted) mychild = null activator = null @@ -290,7 +291,7 @@ obj/structure/elite_tumor/proc/onEliteLoss() activator = null qdel(src) -obj/structure/elite_tumor/proc/onEliteWon() +/obj/structure/elite_tumor/proc/onEliteWon() activity = TUMOR_PASSIVE activator = null mychild.revive(full_heal = TRUE, admin_revive = TRUE) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm index d9f3cfba3d..4e8f4f6160 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm @@ -40,6 +40,7 @@ mouse_opacity = MOUSE_OPACITY_ICON deathmessage = "explodes into gore!" loot_drop = /obj/item/crusher_trophy/broodmother_tongue + crate_type = /obj/structure/closet/crate/necropolis/tendril/weapon_armor attack_action_types = list(/datum/action/innate/elite_attack/tentacle_patch, /datum/action/innate/elite_attack/spawn_children, diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index fce5b636e4..032bc2d60d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -38,7 +38,7 @@ deathsound = 'sound/magic/demon_dies.ogg' deathmessage = "begins to shudder as it becomes transparent..." loot_drop = /obj/item/clothing/neck/cloak/herald_cloak - + crate_type = /obj/structure/closet/crate/necropolis/tendril/magic can_talk = 1 attack_action_types = list(/datum/action/innate/elite_attack/herald_trishot, diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm index 15ed0135fe..6c13bb903e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm @@ -38,7 +38,7 @@ deathsound = 'sound/magic/curse.ogg' deathmessage = "'s arms reach out before it falls apart onto the floor, lifeless." loot_drop = /obj/item/crusher_trophy/legionnaire_spine - + crate_type = /obj/structure/closet/crate/necropolis/tendril/misc attack_action_types = list(/datum/action/innate/elite_attack/legionnaire_charge, /datum/action/innate/elite_attack/head_detach, /datum/action/innate/elite_attack/bonfire_teleport, diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm index 7995e4d20f..b3300a86bb 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm @@ -38,7 +38,7 @@ deathsound = 'sound/magic/repulse.ogg' deathmessage = "'s lights flicker, before its top part falls down." loot_drop = /obj/item/clothing/accessory/pandora_hope - + crate_type = /obj/structure/closet/crate/necropolis/tendril/magic attack_action_types = list(/datum/action/innate/elite_attack/singular_shot, /datum/action/innate/elite_attack/magic_box, /datum/action/innate/elite_attack/pandora_teleport, @@ -190,4 +190,4 @@ /obj/item/clothing/accessory/pandora_hope/on_uniform_dropped(obj/item/clothing/under/U, user) var/mob/living/L = user if(L && L.mind) - SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "hope_lavaland") + SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "hope_lavaland") \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm index cc039c5f2b..8380bf82e9 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 + 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..752a6ae5ac --- /dev/null +++ b/code/modules/projectiles/guns/magic/spell_book.dm @@ -0,0 +1,66 @@ +/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 + +/obj/item/gun/magic/wand/book/zap_self(mob/living/user) + to_chat(user, "The book has [charges] pages\s remaining.") + +/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!") + +////////////////////// +//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 + 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/projectile/magic/spellcard.dm b/code/modules/projectiles/projectile/magic/spellcard.dm index 1b8f326573..5015a97e78 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(ismob(target)) + if(M.anti_magic_check()) + M.visible_message("[src] vanishes on contact with [target]!") + return BULLET_ACT_BLOCK + + if(iscarbon(target)) + 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 + nodamage = TRUE + +/obj/item/projectile/magic/spellcard/book/heal/on_hit(atom/target, blocked = FALSE) + . = ..() + var/mob/living/carbon/M = target + if(ismob(target)) + if(M.anti_magic_check()) + M.visible_message("[src] vanishes on contact with [target]!") + return BULLET_ACT_BLOCK + if(iscarbon(target)) + 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 diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 5c01fd8cf6..86f8b341d9 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2220,6 +2220,7 @@ color = "#f7685e" metabolization_rate = REAGENTS_METABOLISM * 0.25 + /datum/reagent/wittel name = "Wittel" description = "An extremely rare metallic-white substance only found on demon-class planets." @@ -2281,6 +2282,7 @@ /datum/reagent/gravitum/on_mob_end_metabolize(mob/living/L) L.RemoveElement(/datum/element/forced_gravity, 0) + //body bluids /datum/reagent/consumable/semen name = "Semen" @@ -2457,3 +2459,56 @@ datum/reagent/eldritch return ..() +/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) + ..() + diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 20abcf847f..2cd0a76a4b 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -416,3 +416,20 @@ /obj/item/reagent_containers/glass/bottle/bromine 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) \ No newline at end of file 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 e7063b71db..400c5bdfa0 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/tgstation.dme b/tgstation.dme index aeb3ba1d54..c3e51d49cc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3026,6 +3026,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"