diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm index 743583885e..4f001e6b5b 100644 --- a/_maps/RandomZLevels/Academy.dmm +++ b/_maps/RandomZLevels/Academy.dmm @@ -3673,7 +3673,7 @@ /area/awaymission/academy/academyengine) "mj" = ( /obj/structure/rack, -/obj/item/spellbook/oneuse/summonitem, +/obj/item/book/granter/spell/summonitem, /obj/item/pen/fourcolor, /turf/open/floor/vault, /area/awaymission/academy/academyengine) diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 60c940a36e..ddd441486b 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -188,7 +188,7 @@ amount = 25 }, /obj/item/coin/antagtoken, -/obj/item/spellbook/oneuse/summonitem{ +/obj/item/book/granter/spell/summonitem{ name = "an extremely flamboyant book" }, /turf/open/floor/engine/cult{ @@ -356,7 +356,7 @@ /area/awaymission/caves/BMP_asteroid/level_four) "ba" = ( /obj/structure/destructible/cult/talisman, -/obj/item/plasma_fist_scroll, +/obj/item/book/granter/martial/plasma_fist, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=23;o2=14" }, diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm index a31612f32b..fe9080c8d5 100644 --- a/_maps/RandomZLevels/research.dmm +++ b/_maps/RandomZLevels/research.dmm @@ -4259,7 +4259,7 @@ /area/space/nearstation) "nb" = ( /obj/structure/table/wood, -/obj/item/spellbook/oneuse/random, +/obj/item/book/granter/spell/random, /turf/open/floor/mineral/plasma, /area/space/nearstation) "nc" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index f8f1fe3d35..899ee7350a 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -99119,7 +99119,7 @@ /area/maintenance/port/aft) "edm" = ( /obj/structure/table/wood/fancy, -/obj/item/spellbook/oneuse/smoke/lesser, +/obj/item/book/granter/spell/smoke/lesser, /obj/item/nullrod, /obj/item/organ/heart, /obj/item/reagent_containers/food/drinks/bottle/holywater, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 16224128f0..c3479900a3 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -67860,7 +67860,7 @@ /area/chapel/office) "cMa" = ( /obj/structure/table/wood, -/obj/item/spellbook/oneuse/smoke/lesser{ +/obj/item/book/granter/spell/smoke/lesser{ name = "mysterious old book of " }, /obj/item/reagent_containers/food/drinks/bottle/holywater{ diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 660e629272..edf3a70129 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -28451,7 +28451,7 @@ /area/chapel/main) "bgC" = ( /obj/structure/table/wood/fancy, -/obj/item/spellbook/oneuse/smoke, +/obj/item/book/granter/spell/smoke, /obj/item/nullrod, /obj/item/organ/heart, /obj/item/reagent_containers/food/drinks/bottle/holywater, diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index db7c538c47..cbf4292a80 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -194,21 +194,5 @@ to_chat(usr, "Restrain: Grab Grab. Locks opponents into a restraining position, disarm to knock them out with a choke hold.") to_chat(usr, "Pressure: Disarm Grab. Decent stamina damage.") to_chat(usr, "Consecutive CQC: Disarm Disarm Harm. Mainly offensive move, huge damage and decent stamina damage.") - + to_chat(usr, "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter attacks done to you.") - -/obj/item/cqc_manual - name = "old manual" - desc = "A small, black manual. There are drawn instructions of tactical hand-to-hand combat." - icon = 'icons/obj/library.dmi' - icon_state ="cqcmanual" - -/obj/item/cqc_manual/attack_self(mob/living/carbon/human/user) - if(!istype(user) || !user) - return - to_chat(user, "You remember the basics of CQC.") - var/datum/martial_art/cqc/D = new(null) - D.teach(user) - visible_message("[src] beeps ominously, and a moment later it bursts up in flames.") - qdel(src) - new /obj/effect/decal/cleanable/ash(user.drop_location()) diff --git a/code/datums/martial/mushpunch.dm b/code/datums/martial/mushpunch.dm index d771f2f948..b68d1f1b2b 100644 --- a/code/datums/martial/mushpunch.dm +++ b/code/datums/martial/mushpunch.dm @@ -21,7 +21,7 @@ return TRUE /obj/item/mushpunch - name = "mysterious mushroom" + name = "odd mushroom" desc = "Sapienza Ophioglossoides:An odd mushroom from the flesh of a mushroom person. it has apparently retained some innate power of it's owner, as it quivers with barely-contained POWER!" icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' icon_state = "mycelium-angel" diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm index ef36719032..0150a3695d 100644 --- a/code/datums/martial/plasma_fist.dm +++ b/code/datums/martial/plasma_fist.dm @@ -92,23 +92,3 @@ to_chat(usr, "Tornado Sweep: Harm Harm Disarm. Repulses target and everyone back.") to_chat(usr, "Throwback: Disarm Harm Disarm. Throws the target and an item at them.") to_chat(usr, "The Plasma Fist: Harm Disarm Disarm Disarm Harm. Knocks the brain out of the opponent and gibs their body.") - -/obj/item/plasma_fist_scroll - name = "frayed scroll" - desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism." - icon = 'icons/obj/wizard.dmi' - icon_state ="scroll2" - var/used = 0 - -/obj/item/plasma_fist_scroll/attack_self(mob/user) - if(!ishuman(user)) - return - if(!used) - var/mob/living/carbon/human/H = user - var/datum/martial_art/plasma_fist/F = new/datum/martial_art/plasma_fist(null) - F.teach(H) - to_chat(H, "You have learned the ancient martial art of Plasma Fist.") - used = 1 - desc = "It's completely blank." - name = "empty scroll" - icon_state = "blankscroll" diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 743738e9a9..845a7507bd 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -156,24 +156,6 @@ to_chat(usr, "Head Kick: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand.") to_chat(usr, "Elbow Drop: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition.") -/obj/item/sleeping_carp_scroll - name = "mysterious scroll" - desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art." - icon = 'icons/obj/wizard.dmi' - icon_state = "scroll2" - -/obj/item/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user) - if(!istype(user) || !user) - return - var/message = "You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \ - directed toward you. However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab." - to_chat(user, message) - var/datum/martial_art/the_sleeping_carp/theSleepingCarp = new(null) - theSleepingCarp.teach(user) - qdel(src) - visible_message("[src] lights up in fire and quickly burns to ash.") - new /obj/effect/decal/cleanable/ash(user.drop_location()) - /obj/item/twohanded/bostaff name = "bo staff" desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate." diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm new file mode 100644 index 0000000000..7c90f07115 --- /dev/null +++ b/code/game/objects/items/granters.dm @@ -0,0 +1,394 @@ + +///books that teach things (intrinsic actions like bar flinging, spells like fireball or smoke, or martial arts)/// + +/obj/item/book/granter + due_date = 0 // Game time in deciseconds + unique = 1 // 0 Normal book, 1 Should not be treated as normal book, unable to be copied, unable to be modified + var/list/remarks = list() //things to read about while learning. + var/pages_to_mastery = 3 //Essentially controls how long a mob must keep the book in his hand to actually successfully learn + 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 + +/obj/item/book/granter/proc/turn_page(mob/user) + playsound(user, pick('sound/effects/pageturn1.ogg','sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg'), 30, 1) + if(do_after(user,50, user)) + to_chat(user, "[pick(remarks)]") + return TRUE + return FALSE + +/obj/item/book/granter/proc/recoil(mob/user) //nothing so some books can just return + +/obj/item/book/granter/proc/onlearned(mob/user) + used = TRUE + +/obj/item/book/granter/attack_self(mob/user) + if(reading == TRUE) + to_chat(user, "You're already reading this!") + return FALSE + return TRUE + +///ACTION BUTTONS/// + +/obj/item/book/granter/action + var/granted_action + var/actionname = "catching bugs" //might not seem needed but this makes it so you can safely name aciton buttons toggle this or that without it fucking up the granter, also caps + +/obj/item/book/granter/action/attack_self(mob/user) + . = ..() + if(!.) + return + if(!granted_action) + return + var/datum/action/G = new granted_action + for(var/datum/action/A in user.actions) + if(A.type == G.type) + to_chat(user, "You already know all about [actionname].") + qdel(G) + return + if(used == TRUE && oneuse == TRUE) + recoil(user) + else + to_chat(user, "You start reading about [actionname]...") + reading = TRUE + for(var/i=1, i<=pages_to_mastery, i++) + if(!turn_page(user)) + to_chat(user, "You stop reading...") + reading = FALSE + qdel(G) + return + if(do_after(user,50, user)) + to_chat(user, "You feel like you've got a good handle on [actionname]!") + reading = FALSE + G.Grant(user) + +/obj/item/book/granter/action/drink_fling + granted_action = /datum/action/innate/drink_fling + name = "Tapper: This One's For You" + desc = "A seminal work on the dying art of booze sliding." + icon_state = "barbook" + actionname = "drink flinging" + oneuse = FALSE + remarks = list("The trick is keeping a low center of gravity it seems...", "The viscosity of the liquid is important...", "Accounting for crosswinds... really?", "Drag coefficients of various popular drinking glasses...", "What the heck is laminar flow and why does it matter here?", "Greasing the bar seems like it'd be cheating...", "I don't think I'll be working with superfluids...") + +/datum/action/innate/drink_fling + name = "Drink Flinging" + desc = "Toggles your ability to satifyingly throw glasses without spilling them." + button_icon_state = "drinkfling_off" + check_flags = 0 + +/datum/action/innate/drink_fling/Activate() + button_icon_state = "drinkfling_on" + active = TRUE + UpdateButtonIcon() + +/datum/action/innate/drink_fling/Deactivate() + button_icon_state = "drinkfling_off" + active = FALSE + UpdateButtonIcon() + +///SPELLS/// + +/obj/item/book/granter/spell + var/spell + var/spellname = "conjure bugs" + +/obj/item/book/granter/spell/attack_self(mob/user) + . = ..() + if(!.) + return + if(!spell) + return + var/obj/effect/proc_holder/spell/S = new spell + for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) + if(knownspell.type == S.type) + if(user.mind) + if(iswizard(user)) + to_chat(user,"You're already far more versed in this spell than this flimsy howto book can provide.") + else + to_chat(user,"You've already read this one.") + return + if(used == TRUE && oneuse == TRUE) + recoil(user) + else + to_chat(user, "You start reading about casting [spellname]...") + reading = TRUE + for(var/i=1, i<=pages_to_mastery, i++) + if(!turn_page(user)) + to_chat(user, "You stop reading...") + reading = FALSE + qdel(S) + return + if(do_after(user,50, user)) + to_chat(user, "You feel like you've experienced enough to cast [spellname]!") + reading = FALSE + user.mind.AddSpell(S) + user.log_message("learned the spell [spellname] ([S]).", INDIVIDUAL_ATTACK_LOG) + onlearned(user) + +/obj/item/book/granter/spell/recoil(mob/user) + user.visible_message("[src] glows in a black light!") + +/obj/item/book/granter/spell/onlearned(mob/user) + ..() + if(oneuse) + user.visible_message("[src] glows dark for a second!") + +/obj/item/book/granter/spell/fireball + spell = /obj/effect/proc_holder/spell/aimed/fireball + spellname = "fireball" + icon_state ="bookfireball" + desc = "This book feels warm to the touch." + remarks = list("Aim...AIM, FOOL!", "Just catching them on fire won't do...", "Accounting for crosswinds... really?", "I think I just burned my hand...", "Why the dumb stance? It's just a flick of the hand...", "OMEE... ONI... Ugh...", "What's the difference between a fireball and a pyroblast...") + +/obj/item/book/granter/spell/fireball/recoil(mob/user) + ..() + explosion(user.loc, 1, 0, 2, 3, FALSE, FALSE, 2) + qdel(src) + +/obj/item/book/granter/spell/sacredflame + spell = /obj/effect/proc_holder/spell/targeted/sacred_flame + spellname = "sacred flame" + icon_state ="booksacredflame" + desc = "Become one with the flames that burn within... and invite others to do so as well." + remarks = list("Well, it's one way to stop an attacker...", "I'm gonna need some good gear to stop myself from burning to death...", "Keep a fire extingusher handy, got it...", "I think I just burned my hand...", "Apply flame directly to chest for proper ignition...", "No pain, no gain...", "One with the flame...") + +/obj/item/book/granter/spell/smoke + spell = /obj/effect/proc_holder/spell/targeted/smoke + spellname = "smoke" + icon_state ="booksmoke" + desc = "This book is overflowing with the dank arts." + remarks = list("Smoke Bomb! Heh...", "Smoke bomb would do just fine too...", "Wait, there's a machine that does the same thing in chemistry?", "This book smells awful...", "Why all these weed jokes? Just tell me how to cast it...", "Wind will ruin the whole spell, good thing we're in space... Right?", "So this is how the spider clan does it...") + +/obj/item/book/granter/spell/smoke/lesser //Chaplain smoke book + spell = /obj/effect/proc_holder/spell/targeted/smoke/lesser + +/obj/item/book/granter/spell/smoke/recoil(mob/user) + ..() + to_chat(user,"Your stomach rumbles...") + if(user.nutrition) + user.nutrition = 200 + if(user.nutrition <= 0) + user.nutrition = 0 + +/obj/item/book/granter/spell/blind + spell = /obj/effect/proc_holder/spell/targeted/trigger/blind + spellname = "blind" + icon_state ="bookblind" + desc = "This book looks blurry, no matter how you look at it." + remarks = list("Well I can't learn anything if I can't read the damn thing!", "Why would you use a dark font on a dark background...", "Ah, I can't see an Oh, I'm fine...", "I can't see my hand...!", "I'm manually blinking, damn you book...", "I can't read this page, but somehow I feel like I learned something from it...", "Hey, who turned off the lights?") + +/obj/item/book/granter/spell/blind/recoil(mob/user) + ..() + to_chat(user,"You go blind!") + user.blind_eyes(10) + +/obj/item/book/granter/spell/mindswap + spell = /obj/effect/proc_holder/spell/targeted/mind_transfer + spellname = "mindswap" + icon_state ="bookmindswap" + desc = "This book's cover is pristine, though its pages look ragged and torn." + var/mob/stored_swap //Used in used book recoils to store an identity for mindswaps + remarks = list("If you mindswap from a mouse, they will be helpless when you recover...", "Wait, where am I...?", "This book is giving me a horrible headache...", "This page is blank, but I feel words popping into my head...", "GYNU... GYRO... Ugh...", "The voices in my head need to stop, I'm trying to read here...", "I don't think anyone will be happy when I cast this spell...") + +/obj/item/book/granter/spell/mindswap/onlearned() + spellname = pick("fireball","smoke","blind","forcewall","knock","barnyard","charge") + icon_state = "book[spellname]" + name = "spellbook of [spellname]" //Note, desc doesn't change by design + ..() + +/obj/item/book/granter/spell/mindswap/recoil(mob/user) + ..() + if(stored_swap in GLOB.dead_mob_list) + stored_swap = null + if(!stored_swap) + stored_swap = user + to_chat(user,"For a moment you feel like you don't even know who you are anymore.") + return + if(stored_swap == user) + to_chat(user,"You stare at the book some more, but there doesn't seem to be anything else to learn...") + return + + var/obj/effect/proc_holder/spell/targeted/mind_transfer/swapper = new + swapper.cast(user, stored_swap, TRUE) + + to_chat(stored_swap,"You're suddenly somewhere else... and someone else?!") + to_chat(user,"Suddenly you're staring at [src] again... where are you, who are you?!") + stored_swap = null + +/obj/item/book/granter/spell/forcewall + spell = /obj/effect/proc_holder/spell/targeted/forcewall + spellname = "forcewall" + icon_state ="bookforcewall" + desc = "This book has a dedication to mimes everywhere inside the front cover." + remarks = list("I can go through the wall! Neat.", "Why are there so many mime references...?", "This would cause much grief in a hallway...", "This is some suprisingly strong magic to create a wall nobody can pass through...", "Why the dumb stance? It's just a flick of the hand...", "Why are the pages so hard to turn, is this even paper?", "I can't mo Oh, i'm fine...") + +/obj/item/book/granter/spell/forcewall/recoil(mob/living/user) + ..() + to_chat(user,"You suddenly feel very solid!") + user.Stun(40, ignore_canstun = TRUE) + user.petrify(30) + +/obj/item/book/granter/spell/knock + spell = /obj/effect/proc_holder/spell/aoe_turf/knock + spellname = "knock" + icon_state ="bookknock" + desc = "This book is hard to hold closed properly." + remarks = list("Open Sesame!", "So THAT'S the magic password!", "Slow down, book. I still haven't finished this page...", "The book won't stop moving!", "I think this is hurting the spine of the book...", "I can't get to the next page, it's stuck t I'm good, it just turned to the next page on it's own.", "Yeah, staff of doors does the same thing. Go figure...") + +/obj/item/book/granter/spell/knock/recoil(mob/living/user) + ..() + to_chat(user,"You're knocked down!") + user.Knockdown(40) + +/obj/item/book/granter/spell/barnyard + spell = /obj/effect/proc_holder/spell/targeted/barnyardcurse + spellname = "barnyard" + icon_state ="bookhorses" + desc = "This book is more horse than your mind has room for." + remarks = list("Moooooooo!","Moo!","Moooo!", "NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!", "Oink!", "Squeeeeeeee!", "Oink Oink!", "Ree!!", "Reee!!", "REEE!!", "REEEEE!!") + +/obj/item/book/granter/spell/barnyard/recoil(mob/living/carbon/user) + if(ishuman(user)) + to_chat(user,"HORSIE HAS RISEN") + var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead + magichead.flags_1 |= NODROP_1 //curses! + magichead.flags_inv &= ~HIDEFACE //so you can still see their face + magichead.voicechange = TRUE //NEEEEIIGHH + if(!user.dropItemToGround(user.wear_mask)) + qdel(user.wear_mask) + user.equip_to_slot_if_possible(magichead, slot_wear_mask, TRUE, TRUE) + qdel(src) + else + to_chat(user,"I say thee neigh") //It still lives here + +/obj/item/book/granter/spell/charge + spell = /obj/effect/proc_holder/spell/targeted/charge + spellname = "charge" + icon_state ="bookcharge" + desc = "This book is made of 100% postconsumer wizard." + remarks = list("I feel ALIVE!", "I CAN TASTE THE MANA!", "What a RUSH!", "I'm FLYING through these pages!", "THIS GENIUS IS MAKING IT!", "This book is ACTION PAcKED!", "HE'S DONE IT", "LETS GOOOOOOOOOOOO") + +/obj/item/book/granter/spell/charge/recoil(mob/user) + ..() + to_chat(user,"[src] suddenly feels very warm!") + empulse(src, 1, 1) + +/obj/item/book/granter/spell/summonitem + spell = /obj/effect/proc_holder/spell/targeted/summonitem + spellname = "instant summons" + icon_state ="booksummons" + desc = "This book is bright and garish, very hard to miss." + remarks = list("I can't look away from the book!", "The words seem to pop around the page...", "I just need to focus on one item...", "Make sure to have a good grip on it when casting...", "Slow down, book. I still haven't finished this page...", "Sounds pretty great with some other magical artifacts...", "Magicians must love this one.") + +/obj/item/book/granter/spell/summonitem/recoil(mob/user) + ..() + to_chat(user,"[src] suddenly vanishes!") + qdel(src) + +/obj/item/book/granter/spell/random + icon_state = "random_book" + +/obj/item/book/granter/spell/random/Initialize() + . = ..() + var/static/banned_spells = list(/obj/item/book/granter/spell/mimery_blockade, /obj/item/book/granter/spell/mimery_guns) + var/real_type = pick(subtypesof(/obj/item/book/granter/spell) - banned_spells) + new real_type(loc) + return INITIALIZE_HINT_QDEL + +///MARTIAL ARTS/// + +/obj/item/book/granter/martial + var/martial + var/martialname = "bug jitsu" + var/greet = "You feel like you have mastered the art in breaking code. Nice work, jackass." + +/obj/item/book/granter/martial/attack_self(mob/user) + . = ..() + if(!.) + return + if(!martial) + return + var/datum/martial_art/MA = new martial + if(user.mind.martial_art) + for(var/datum/martial_art/knownmartial in user.mind.martial_art) + if(knownmartial.type == MA.type) + to_chat(user,"You already know [martialname]!") + return + if(used == TRUE && oneuse == TRUE) + recoil(user) + else + to_chat(user, "You start reading about [martialname]...") + reading = TRUE + for(var/i=1, i<=pages_to_mastery, i++) + if(!turn_page(user)) + to_chat(user, "You stop reading...") + reading = FALSE + qdel(MA) + return + if(do_after(user,50, user)) + to_chat(user, "[greet]") + reading = FALSE + MA.teach(user) + user.log_message("learned the martial art [martialname] ([MA]).", INDIVIDUAL_ATTACK_LOG) + onlearned(user) + +/obj/item/book/granter/martial/cqc + martial = /datum/martial_art/cqc + name = "old manual" + martialname = "close quarters combat" + desc = "A small, black manual. There are drawn instructions of tactical hand-to-hand combat." + greet = "You've mastered the basics of CQC." + icon_state = "cqcmanual" + remarks = list("Kick... Slam...", "Lock... Kick...", "Strike their abdomen, neck and back for critical damage...", "Slam... Lock...", "I could probably combine this with some other martial arts!", "Words that kill...", "The last and final moment is yours...") + +/obj/item/book/granter/martial/cqc/onlearned(mob/living/carbon/user) + ..() + if(oneuse == TRUE) + to_chat(user, "[src] beeps ominously...") + +/obj/item/book/granter/martial/cqc/recoil(mob/living/carbon/user) + to_chat(user, "[src] explodes!") + playsound(src,'sound/effects/explosion1.ogg',40,1) + user.flash_act(1, 1) + user.adjustBruteLoss(6) + user.adjustFireLoss(6) + qdel(src) + +/obj/item/book/granter/martial/carp + martial = /datum/martial_art/the_sleeping_carp + name = "mysterious scroll" + martialname = "sleeping carp" + desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art." + greet = "You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \ + directed toward you. However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab." + icon = 'icons/obj/wizard.dmi' + icon_state = "scroll2" + remarks = list("I must prove myself worthy to the masters of the sleeping carp...", "Stance means everything...", "Focus... And you'll be able to incapacitate any foe in seconds...", "I must pierce armor for maximum damage...", "I don't think this would combine with other martial arts...", "Grab them first so they don't retaliate...", "I must prove myself worthy of this power...") + +/obj/item/book/granter/martial/carp/onlearned(mob/living/carbon/user) + ..() + if(oneuse == TRUE) + desc = "It's completely blank." + name = "empty scroll" + icon_state = "blankscroll" + +/obj/item/book/granter/martial/plasma_fist + martial = /datum/martial_art/plasma_fist + name = "frayed scroll" + martialname = "plasma fist" + desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism." + greet = "You have learned the ancient martial art of Plasma Fist. Your combos are extremely hard to pull off, but include some of the most deadly moves ever seen including \ + the plasma fist, which when pulled off will make someone violently explode." + icon = 'icons/obj/wizard.dmi' + icon_state ="scroll2" + remarks = list("Balance...", "Power...", "Control...", "Mastery...", "Vigilance...", "Skill...") + +/obj/item/book/granter/martial/plasma_fist/onlearned(mob/living/carbon/user) + ..() + if(oneuse == TRUE) + desc = "It's completely blank." + name = "empty scroll" + icon_state = "blankscroll" + +// I did not include mushpunch's grant, it is not a book and the item does it just fine. diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index d1d9e16b4c..9d47efe862 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -957,60 +957,3 @@ author = "Engineering Encyclopedia" title = "Hacking" page_link = "Hacking" - -///Reusable books that grant actions (knowledge is power) -/obj/item/book/action_granting - due_date = 0 // Game time in 1/10th seconds - unique = 1 // 0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified - var/datum/action/granted_action = null - var/list/remarks = list() //things to read about while learning. - var/pages_to_mastery = 3 //Essentially controls how long a mob must keep the book in his hand to actually successfully learn - -/obj/item/book/action_granting/attack_self(mob/user) - if(!granted_action) - return - var/datum/action/G = new granted_action - for(var/datum/action/A in user.actions) - if(A.type == G.type) - to_chat(user, "You already know all about [G.name].") - qdel(G) - return - to_chat(user, "You start reading about [G.name]...") - for(var/i=1, i<=pages_to_mastery, i++) - if(!turn_page(user)) - to_chat(user, "You stop reading...") - qdel(G) - return - if(do_after(user,50, user)) - to_chat(user, "You feel like you've got a good handle on [G.name]!") - G.Grant(user) - -/obj/item/book/action_granting/proc/turn_page(mob/user) - playsound(user, pick('sound/effects/pageturn1.ogg','sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg'), 30, 1) - if(do_after(user,50, user)) - to_chat(user, "[pick(remarks)]") - return 1 - return 0 - -/obj/item/book/action_granting/drink_fling - name = "Tapper: This One's For You" - desc = "A seminal work on the dying art of booze sliding." - icon_state = "barbook" - granted_action = /datum/action/innate/drink_fling - remarks = list("The trick is keeping a low center of gravity it seems...", "The viscosity of the liquid is important...", "Accounting for crosswinds... really?", "Drag coefficients of various popular drinking glasses...", "What the heck is laminar flow and why does it matter here?", "Greasing the bar seems like it'd be cheating...", "I don't think I'll be working with superfluids...") - -/datum/action/innate/drink_fling - name = "Drink Flinging" - desc = "Toggles your ability to satifyingly throw glasses without spilling them." - button_icon_state = "drinkfling_off" - check_flags = 0 - -/datum/action/innate/drink_fling/Activate() - button_icon_state = "drinkfling_on" - active = TRUE - UpdateButtonIcon() - -/datum/action/innate/drink_fling/Deactivate() - button_icon_state = "drinkfling_off" - active = FALSE - UpdateButtonIcon() \ No newline at end of file diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index e4bcbd8527..62aebeda12 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -97,7 +97,7 @@ new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) new /obj/item/card/id/syndicate(src) new /obj/item/clothing/shoes/chameleon/noslip(src) //because slipping while being a dark lord sucks - new /obj/item/spellbook/oneuse/summonitem(src) + new /obj/item/book/granter/spell/summonitem(src) if("sniper") //This shit is unique so can't really balance it around tc, also no silencer because getting killed without ANY indicator on what killed you sucks new /obj/item/gun/ballistic/automatic/sniper_rifle(src) // 12 tc @@ -303,8 +303,8 @@ new /obj/item/gun/ballistic/revolver/reverse(src) /obj/item/storage/box/syndie_kit/mimery/PopulateContents() - new /obj/item/spellbook/oneuse/mimery_blockade(src) - new /obj/item/spellbook/oneuse/mimery_guns(src) + new /obj/item/book/granter/spell/mimery_blockade(src) + new /obj/item/book/granter/spell/mimery_guns(src) /obj/item/storage/box/syndie_kit/imp_radio/PopulateContents() new /obj/item/implanter/radio/syndicate(src) diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 55795afd82..518d2a04b7 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -535,7 +535,6 @@ throw_speed = 2 throw_range = 5 w_class = WEIGHT_CLASS_TINY - persistence_replacement = /obj/item/spellbook/oneuse/random var/uses = 10 var/temp = null var/tab = null @@ -715,198 +714,3 @@ tab = sanitize(href_list["page"]) attack_self(H) return - -//Single Use Spellbooks// - -/obj/item/spellbook/oneuse - var/spell = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile //just a placeholder to avoid runtimes if someone spawned the generic - var/spellname = "sandbox" - var/used = 0 - name = "spellbook of " - uses = 1 - desc = "This template spellbook was never meant for the eyes of man..." - persistence_replacement = null - -/obj/item/spellbook/oneuse/prepare_spells() - name += spellname - -/obj/item/spellbook/oneuse/attack_self(mob/user) - var/obj/effect/proc_holder/spell/S = new spell - for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) - if(knownspell.type == S.type) - if(user.mind) - if(iswizard(user)) - to_chat(user,"You're already far more versed in this spell than this flimsy how-to book can provide.") - else - to_chat(user,"You've already read this one.") - return - if(used) - recoil(user) - else - user.mind.AddSpell(S) - to_chat(user,"You rapidly read through the arcane book. Suddenly you realize you understand [spellname]!") - user.log_message("learned the spell [spellname] ([S]).", INDIVIDUAL_ATTACK_LOG) - onlearned(user) - -/obj/item/spellbook/oneuse/proc/recoil(mob/user) - user.visible_message("[src] glows in a black light!") - -/obj/item/spellbook/oneuse/proc/onlearned(mob/user) - used = 1 - user.visible_message("[src] glows dark for a second!") - -/obj/item/spellbook/oneuse/attackby() - return - -/obj/item/spellbook/oneuse/fireball - spell = /obj/effect/proc_holder/spell/aimed/fireball - spellname = "fireball" - icon_state ="bookfireball" - desc = "This book feels warm to the touch." - -/obj/item/spellbook/oneuse/fireball/recoil(mob/user) - ..() - explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2) - qdel(src) - -/obj/item/spellbook/oneuse/smoke - spell = /obj/effect/proc_holder/spell/targeted/smoke - spellname = "smoke" - icon_state ="booksmoke" - desc = "This book is overflowing with the dank arts." - -/obj/item/spellbook/oneuse/smoke/lesser //Chaplain smoke book - spell = /obj/effect/proc_holder/spell/targeted/smoke/lesser - -/obj/item/spellbook/oneuse/smoke/recoil(mob/user) - ..() - to_chat(user,"Your stomach rumbles...") - if(user.nutrition) - user.nutrition -= 200 - if(user.nutrition <= 0) - user.nutrition = 0 - - -/obj/item/spellbook/oneuse/blind - spell = /obj/effect/proc_holder/spell/targeted/trigger/blind - spellname = "blind" - icon_state ="bookblind" - desc = "This book looks blurry, no matter how you look at it." - -/obj/item/spellbook/oneuse/blind/recoil(mob/user) - ..() - to_chat(user,"You go blind!") - user.blind_eyes(10) - -/obj/item/spellbook/oneuse/mindswap - spell = /obj/effect/proc_holder/spell/targeted/mind_transfer - spellname = "mindswap" - icon_state ="bookmindswap" - desc = "This book's cover is pristine, though its pages look ragged and torn." - var/mob/stored_swap = null //Used in used book recoils to store an identity for mindswaps - -/obj/item/spellbook/oneuse/mindswap/onlearned() - spellname = pick("fireball","smoke","blind","forcewall","knock","barnyard","charge") - icon_state = "book[spellname]" - name = "spellbook of [spellname]" //Note, desc doesn't change by design - ..() - -/obj/item/spellbook/oneuse/mindswap/recoil(mob/user) - ..() - if(stored_swap in GLOB.dead_mob_list) - stored_swap = null - if(!stored_swap) - stored_swap = user - to_chat(user,"For a moment you feel like you don't even know who you are anymore.") - return - if(stored_swap == user) - to_chat(user,"You stare at the book some more, but there doesn't seem to be anything else to learn...") - return - - var/obj/effect/proc_holder/spell/targeted/mind_transfer/swapper = new - swapper.cast(user, stored_swap, 1) - - to_chat(stored_swap,"You're suddenly somewhere else... and someone else?!") - to_chat(user,"Suddenly you're staring at [src] again... where are you, who are you?!") - stored_swap = null - -/obj/item/spellbook/oneuse/forcewall - spell = /obj/effect/proc_holder/spell/targeted/forcewall - spellname = "forcewall" - icon_state ="bookforcewall" - desc = "This book has a dedication to mimes everywhere inside the front cover." - -/obj/item/spellbook/oneuse/forcewall/recoil(mob/living/user) - ..() - to_chat(user,"You suddenly feel very solid!") - user.Stun(40, ignore_canstun = TRUE) - user.petrify(30) - -/obj/item/spellbook/oneuse/knock - spell = /obj/effect/proc_holder/spell/aoe_turf/knock - spellname = "knock" - icon_state ="bookknock" - desc = "This book is hard to hold closed properly." - -/obj/item/spellbook/oneuse/knock/recoil(mob/living/user) - ..() - to_chat(user,"You're knocked down!") - user.Knockdown(40) - -/obj/item/spellbook/oneuse/barnyard - spell = /obj/effect/proc_holder/spell/targeted/barnyardcurse - spellname = "barnyard" - icon_state ="bookhorses" - desc = "This book is more horse than your mind has room for." - -/obj/item/spellbook/oneuse/barnyard/recoil(mob/living/carbon/user) - if(ishuman(user)) - to_chat(user,"HOR-SIE HAS RISEN") - var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead - magichead.flags_1 |= NODROP_1 //curses! - magichead.flags_inv &= ~HIDEFACE //so you can still see their face - magichead.voicechange = 1 //NEEEEIIGHH - if(!user.dropItemToGround(user.wear_mask)) - qdel(user.wear_mask) - user.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1) - qdel(src) - else - to_chat(user,"I say thee neigh") //It still lives here - -/obj/item/spellbook/oneuse/charge - spell = /obj/effect/proc_holder/spell/targeted/charge - spellname = "charging" - icon_state ="bookcharge" - desc = "This book is made of 100% post-consumer wizard." - -/obj/item/spellbook/oneuse/charge/recoil(mob/user) - ..() - to_chat(user,"[src] suddenly feels very warm!") - empulse(src, 1, 1) - -/obj/item/spellbook/oneuse/summonitem - spell = /obj/effect/proc_holder/spell/targeted/summonitem - spellname = "instant summons" - icon_state ="booksummons" - desc = "This book is bright and garish, very hard to miss." - -/obj/item/spellbook/oneuse/summonitem/recoil(mob/user) - ..() - to_chat(user,"[src] suddenly vanishes!") - qdel(src) - -/obj/item/spellbook/oneuse/random - icon_state = "random_book" - -/obj/item/spellbook/oneuse/random/Initialize() - ..() - var/static/banned_spells = list(/obj/item/spellbook/oneuse/mimery_blockade, /obj/item/spellbook/oneuse/mimery_guns) - var/real_type = pick(subtypesof(/obj/item/spellbook/oneuse) - banned_spells) - new real_type(loc) - return INITIALIZE_HINT_QDEL - -/obj/item/spellbook/oneuse/sacredflame - spell = /obj/effect/proc_holder/spell/targeted/sacred_flame - spellname = "sacred flame" - icon_state ="booksacredflame" - desc = "Become one with the flames that burn within... and invite others to do so as well." diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 4fc3aaf55a..ae119db9e7 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -260,7 +260,7 @@ new /obj/item/gun/ballistic/revolver/mateba(drop_location()) if(15) //Random One-use spellbook - new /obj/item/spellbook/oneuse/random(drop_location()) + new /obj/item/book/granter/spell/random(drop_location()) if(16) //Servant & Servant Summon var/mob/living/carbon/human/H = new(drop_location()) diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 7205f9cda4..52fa9454ff 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -477,8 +477,8 @@ name = "dungeon lite" loot = list(/obj/item/melee/classic_baton = 11, /obj/item/melee/classic_baton/telescopic = 12, - /obj/item/spellbook/oneuse/smoke = 10, - /obj/item/spellbook/oneuse/blind = 10, + /obj/item/book/granter/spell/smoke = 10, + /obj/item/book/granter/spell/blind = 10, /obj/item/storage/firstaid/regular = 45, /obj/item/storage/firstaid/toxin = 35, /obj/item/storage/firstaid/brute = 27, @@ -501,9 +501,9 @@ /obj/item/gun/magic/wand/fireball/inert = 3, /obj/item/pneumatic_cannon = 15, /obj/item/melee/transforming/energy/sword = 7, - /obj/item/spellbook/oneuse/knock = 15, - /obj/item/spellbook/oneuse/summonitem = 20, - /obj/item/spellbook/oneuse/forcewall = 17, + /obj/item/book/granter/spell/knock = 15, + /obj/item/book/granter/spell/summonitem = 20, + /obj/item/book/granter/spell/forcewall = 17, /obj/item/storage/backpack/holding = 12, /obj/item/grenade/spawnergrenade/manhacks = 6, /obj/item/grenade/spawnergrenade/spesscarp = 7, @@ -512,7 +512,7 @@ /obj/item/stack/sheet/mineral/uranium{amount = 15} = 10, /obj/item/stack/sheet/mineral/plasma{amount = 15} = 10, /obj/item/stack/sheet/mineral/gold{amount = 15} = 10, - /obj/item/spellbook/oneuse/barnyard = 4, + /obj/item/book/granter/spell/barnyard = 4, /obj/item/pickaxe/drill/diamonddrill = 6, /obj/item/borg/upgrade/vtec = 7, /obj/item/borg/upgrade/disablercooler = 7) @@ -530,9 +530,9 @@ /obj/item/gun/magic/wand/resurrection/inert = 15, /obj/item/gun/magic/wand/resurrection = 10, /obj/item/device/radio/uplink/old = 2, - /obj/item/spellbook/oneuse/charge = 12, + /obj/item/book/granter/spell/charge = 12, /obj/item/grenade/clusterbuster/spawner_manhacks = 15, - /obj/item/spellbook/oneuse/fireball = 10, + /obj/item/book/granter/spell/fireball = 10, /obj/item/pickaxe/drill/jackhammer = 30, /obj/item/borg/upgrade/syndicate = 13, /obj/item/borg/upgrade/selfrepair = 17) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 856e85ef0b..8885f6e2c5 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1532,7 +1532,7 @@ /obj/item/vending_refill/coffee, /obj/item/vending_refill/coffee, /obj/item/vending_refill/coffee, - /obj/item/book/action_granting/drink_fling) + /obj/item/book/granter/action/drink_fling) crate_name = "bartending supply crate" /datum/supply_pack/organic/vending/cigarette diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm index a2c6fd62e5..5c761cec25 100644 --- a/code/modules/jobs/job_types/cargo_service.dm +++ b/code/modules/jobs/job_types/cargo_service.dm @@ -167,7 +167,7 @@ Bartender ears = /obj/item/device/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/bartender suit = /obj/item/clothing/suit/armor/vest - backpack_contents = list(/obj/item/storage/box/beanbag=1,/obj/item/book/action_granting/drink_fling=1) + backpack_contents = list(/obj/item/storage/box/beanbag=1,/obj/item/book/granter/action/drink_fling=1) shoes = /obj/item/clothing/shoes/laceup /* diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 632c9e1cba..7ff07d1637 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -274,7 +274,7 @@ icon_state = "x2" var/possible = list(/obj/item/ship_in_a_bottle, /obj/item/gun/energy/pulse, - /obj/item/sleeping_carp_scroll, + /obj/item/book/granter/martial/carp, /obj/item/melee/supermatter_sword, /obj/item/shield/changeling, /obj/item/lava_staff, diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index f9c3fdd43d..330c0cbf2a 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -69,7 +69,7 @@ new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src) if(25) - new /obj/item/spellbook/oneuse/summonitem(src) + new /obj/item/book/granter/spell/summonitem(src) if(26) new /obj/item/book_of_babel(src) if(27) @@ -693,7 +693,7 @@ if(2) new /obj/item/lava_staff(src) if(3) - new /obj/item/spellbook/oneuse/sacredflame(src) + new /obj/item/book/granter/spell/sacredflame(src) new /obj/item/gun/magic/wand/fireball(src) if(4) new /obj/item/dragons_blood(src) diff --git a/code/modules/spells/spell_types/charge.dm b/code/modules/spells/spell_types/charge.dm index f89f5fd4ab..d2513097ea 100644 --- a/code/modules/spells/spell_types/charge.dm +++ b/code/modules/spells/spell_types/charge.dm @@ -16,7 +16,7 @@ for(var/mob/living/L in targets) var/list/hand_items = list(L.get_active_held_item(),L.get_inactive_held_item()) var/charged_item = null - var/burnt_out = 0 + var/burnt_out = FALSE if(L.pulling && isliving(L.pulling)) var/mob/living/M = L.pulling @@ -34,26 +34,30 @@ break for(var/obj/item in hand_items) if(istype(item, /obj/item/spellbook)) - if(istype(item, /obj/item/spellbook/oneuse)) - var/obj/item/spellbook/oneuse/I = item - if(prob(80)) - L.visible_message("[I] catches fire!") - qdel(I) - else - I.used = 0 - charged_item = I - break + to_chat(L, "Glowing red letters appear on the front cover...") + to_chat(L, "[pick("NICE TRY BUT NO!","CLEVER BUT NOT CLEVER ENOUGH!", "SUCH FLAGRANT CHEESING IS WHY WE ACCEPTED YOUR APPLICATION!", "CUTE! VERY CUTE!", "YOU DIDN'T THINK IT'D BE THAT EASY, DID YOU?")]") + burnt_out = TRUE + else if(istype(item, /obj/item/book/granter/spell)) + var/obj/item/book/granter/spell/I = item + if(!I.oneuse) + to_chat(L, "This book is infinite use and can't be recharged, yet the magic has improved the book somehow...") + burnt_out = TRUE + I.pages_to_mastery-- + break + if(prob(80)) + L.visible_message("[I] catches fire!") + qdel(I) else - to_chat(L, "Glowing red letters appear on the front cover...") - to_chat(L, "[pick("NICE TRY BUT NO!","CLEVER BUT NOT CLEVER ENOUGH!", "SUCH FLAGRANT CHEESING IS WHY WE ACCEPTED YOUR APPLICATION!", "CUTE! VERY CUTE!", "YOU DIDN'T THINK IT'D BE THAT EASY, DID YOU?")]") - burnt_out = 1 + I.used = FALSE + charged_item = I + break else if(istype(item, /obj/item/gun/magic)) var/obj/item/gun/magic/I = item if(prob(80) && !I.can_charge) I.max_charges-- if(I.max_charges <= 0) I.max_charges = 0 - burnt_out = 1 + burnt_out = TRUE I.charges = I.max_charges if(istype(item, /obj/item/gun/magic/wand) && I.max_charges != 0) var/obj/item/gun/magic/W = item @@ -61,14 +65,14 @@ I.recharge_newshot() charged_item = I break - else if(istype(item, /obj/item/stock_parts/cell/)) + else if(istype(item, /obj/item/stock_parts/cell)) var/obj/item/stock_parts/cell/C = item if(!C.self_recharge) if(prob(80)) C.maxcharge -= 200 if(C.maxcharge <= 1) //Div by 0 protection C.maxcharge = 1 - burnt_out = 1 + burnt_out = TRUE C.charge = C.maxcharge charged_item = C break @@ -82,7 +86,7 @@ C.maxcharge -= 200 if(C.maxcharge <= 1) //Div by 0 protection C.maxcharge = 1 - burnt_out = 1 + burnt_out = TRUE C.charge = C.maxcharge if(istype(C.loc, /obj/item/gun)) var/obj/item/gun/G = C.loc diff --git a/code/modules/spells/spell_types/mime.dm b/code/modules/spells/spell_types/mime.dm index f6b1921e6c..855844473d 100644 --- a/code/modules/spells/spell_types/mime.dm +++ b/code/modules/spells/spell_types/mime.dm @@ -127,16 +127,19 @@ ..() -/obj/item/spellbook/oneuse/mimery_blockade +/obj/item/book/granter/spell/mimery_blockade spell = /obj/effect/proc_holder/spell/targeted/forcewall/mime spellname = "" name = "Guide to Advanced Mimery Vol 1" desc = "The pages don't make any sound when turned." icon_state ="bookmime" + remarks = list("...") -/obj/item/spellbook/oneuse/mimery_guns + +/obj/item/book/granter/spell/mimery_guns spell = /obj/effect/proc_holder/spell/aimed/finger_guns spellname = "" name = "Guide to Advanced Mimery Vol 2" desc = "There aren't any words written..." icon_state ="bookmime" + remarks = list("...") diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index c69b9b1e86..e68629467a 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -47,15 +47,15 @@ GLOBAL_LIST_INIT(summoned_guns, list( /obj/item/gun/energy/gravity_gun)) GLOBAL_LIST_INIT(summoned_magic, list( - /obj/item/spellbook/oneuse/fireball, - /obj/item/spellbook/oneuse/smoke, - /obj/item/spellbook/oneuse/blind, - /obj/item/spellbook/oneuse/mindswap, - /obj/item/spellbook/oneuse/forcewall, - /obj/item/spellbook/oneuse/knock, - /obj/item/spellbook/oneuse/barnyard, - /obj/item/spellbook/oneuse/charge, - /obj/item/spellbook/oneuse/summonitem, + /obj/item/book/granter/spell/fireball, + /obj/item/book/granter/spell/smoke, + /obj/item/book/granter/spell/blind, + /obj/item/book/granter/spell/mindswap, + /obj/item/book/granter/spell/forcewall, + /obj/item/book/granter/spell/knock, + /obj/item/book/granter/spell/barnyard, + /obj/item/book/granter/spell/charge, + /obj/item/book/granter/spell/summonitem, /obj/item/gun/magic/wand, /obj/item/gun/magic/wand/death, /obj/item/gun/magic/wand/resurrection, diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index cc1d1d2a47..1607fcc969 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -630,7 +630,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) name = "Martial Arts Scroll" desc = "This scroll contains the secrets of an ancient martial arts technique. You will master unarmed combat, \ deflecting all ranged weapon fire, but you also refuse to use dishonorable ranged weaponry." - item = /obj/item/sleeping_carp_scroll + item = /obj/item/book/granter/martial/carp cost = 17 surplus = 0 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) @@ -638,7 +638,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_weapons/cqc name = "CQC Manual" desc = "A manual that teaches a single user tactical Close-Quarters Combat before self-destructing." - item = /obj/item/cqc_manual + item = /obj/item/book/granter/martial/cqc include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) cost = 13 surplus = 0 diff --git a/tgstation.dme b/tgstation.dme index 8ed4f92375..e37dfe1958 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -741,6 +741,7 @@ #include "code\game\objects\items\extinguisher.dm" #include "code\game\objects\items\flamethrower.dm" #include "code\game\objects\items\gift.dm" +#include "code\game\objects\items\granters.dm" #include "code\game\objects\items\handcuffs.dm" #include "code\game\objects\items\his_grace.dm" #include "code\game\objects\items\holosign_creator.dm"