diff --git a/code/datums/spells/mime.dm b/code/datums/spells/mime.dm index 19b30674bf6..e1071315bcf 100644 --- a/code/datums/spells/mime.dm +++ b/code/datums/spells/mime.dm @@ -1,5 +1,5 @@ /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall - name = "Invisible wall" + name = "Invisible Wall" desc = "The mime's performance transmutates into physical reality." school = "mime" panel = "Mime" @@ -12,7 +12,7 @@ range = 0 cast_sound = null human_req = 1 - + action_icon_state = "mime" action_background_icon_state = "bg_mime" @@ -60,3 +60,108 @@ to_chat(H, "You make a vow of silence.") else to_chat(H, "You break your vow of silence.") + +//Advanced Mimery traitor item spells + +/obj/effect/proc_holder/spell/targeted/forcewall/mime + name = "Invisible Greater Wall" + desc = "Form an invisible three tile wide blockade." + school = "mime" + panel = "Mime" + wall_type = /obj/effect/forcefield/mime/advanced + invocation_type = "emote" + invocation_emote_self = "You form a blockade in front of yourself." + charge_max = 600 + sound = null + clothes_req = FALSE + range = -1 + include_user = TRUE + + action_icon_state = "mime" + action_background_icon_state = "bg_mime" + +/obj/effect/proc_holder/spell/targeted/forcewall/mime/Click() + if(usr && usr.mind) + if(!usr.mind.miming) + to_chat(usr, "You must dedicate yourself to silence first.") + return + invocation = "[usr.real_name] looks as if a blockade is in front of [usr.p_them()]." + else + invocation_type ="none" + ..() + +/obj/effect/proc_holder/spell/targeted/mime/fingergun + name = "Finger Gun" + desc = "Shoot stunning, invisible bullets out of your fingers! 6 bullets available per cast." + school = "mime" + panel = "Mime" + clothes_req = 0 + charge_max = 600 + range = -1 + include_user = 1 + human_req = 1 + + action_icon_state = "fingergun" + action_background_icon_state = "bg_mime" + var/gun = /obj/item/gun/projectile/revolver/fingergun + +/obj/effect/proc_holder/spell/targeted/mime/fingergun/cast(list/targets, mob/user = usr) + for(var/mob/living/carbon/human/C in targets) + if(!istype(C.get_active_hand(), gun) && !istype(C.get_inactive_hand(), gun)) + to_chat(user, "You draw your fingers!") + C.drop_item() + C.put_in_hands(new gun) + else + to_chat(user, "Holster your fingers first.") + revert_cast(user) + +/obj/effect/proc_holder/spell/targeted/mime/fingergun/fake + desc = "Pretend you're shooting bullets out of your fingers! 6 bullets available per cast." + gun = /obj/item/gun/projectile/revolver/fingergun/fake + +/obj/item/spellbook/oneuse/mime + spell = /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall + spellname = "Invisible Wall" + name = "Miming Manual : " + desc = "It contains various pictures of mimes mid-performance, aswell as some illustrated tutorials." + icon_state = "bookmime" + +/obj/item/spellbook/oneuse/mime/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) + to_chat(user, "You've already read this one.") + return + if(used) + recoil(user) + else + user.mind.AddSpell(S) + to_chat(user, "You flip through the pages. Your understanding of the boundaries of reality increases. You can cast [spellname]!") + user.create_attack_log("[key_name(user)] learned the spell [spellname] ([S]).") + onlearned(user) + +/obj/item/spellbook/oneuse/mime/recoil(mob/user) + to_chat(user, "You flip through the pages. Nothing of interest to you.") + +/obj/item/spellbook/oneuse/mime/onlearned(mob/user) + used = 1 + var/obj/effect/proc_holder/spell/S = new /obj/effect/proc_holder/spell/targeted/mime/speak + for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) + if(knownspell.type == S.type) + return + user.mind.AddSpell(S) //add vow of silence if not known by user + to_chat(user, "You have learned how to use silence to improve your performance.") + +/obj/item/spellbook/oneuse/mime/fingergun + spell = /obj/effect/proc_holder/spell/targeted/mime/fingergun + spellname = "Finger Gun" + desc = "It contains illustrations of guns and how to mime them." + +/obj/item/spellbook/oneuse/mime/fingergun/fake + spell = /obj/effect/proc_holder/spell/targeted/mime/fingergun/fake + +/obj/item/spellbook/oneuse/mime/greaterwall + spell = /obj/effect/proc_holder/spell/targeted/forcewall/mime + spellname = "Invisible Greater Wall" + desc = "It contains illustrations of the great walls of human history." \ No newline at end of file diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm index 0816659e414..dffde794d51 100644 --- a/code/datums/spells/wizard.dm +++ b/code/datums/spells/wizard.dm @@ -166,6 +166,32 @@ action_icon_state = "shield" cast_sound = 'sound/magic/ForceWall.ogg' +/obj/effect/proc_holder/spell/targeted/forcewall + name = "Greater Forcewall" + desc = "Create a magical barrier that only you can pass through." + + school = "transmutation" + charge_max = 100 + clothes_req = FALSE + invocation = "TARCOL MINTI ZHERI" + invocation_type = "shout" + sound = 'sound/magic/ForceWall.ogg' + action_icon_state = "shield" + range = -1 + include_user = TRUE + cooldown_min = 50 //12 deciseconds reduction per rank + var/wall_type = /obj/effect/forcefield/wizard + +/obj/effect/proc_holder/spell/targeted/forcewall/cast(list/targets,mob/user = usr) + new wall_type(get_turf(user),user) + if(user.dir == SOUTH || user.dir == NORTH) + new wall_type(get_step(user, EAST),user) + new wall_type(get_step(user, WEST),user) + else + new wall_type(get_step(user, NORTH),user) + new wall_type(get_step(user, SOUTH),user) + + /obj/effect/proc_holder/spell/aoe_turf/conjure/timestop name = "Stop Time" desc = "This spell stops time for everyone except for you, allowing you to move freely while your enemies and even projectiles are frozen." diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 8e69face174..ca54cf14f9d 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -146,6 +146,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 10 job = list("Mime") +/datum/uplink_item/jobspecific/mimery + name = "Guide to Advanced Mimery Series" + desc = "Contains two manuals to teach you advanced Mime skills. You will be able to shoot stunning bullets out of your fingers, and creates large walls that can block an entire hallway!" + reference = "AM" + item = /obj/item/storage/box/syndie_kit/mimery + cost = 10 + job = list("Mime") + //Chef /datum/uplink_item/jobspecific/specialsauce name = "Chef Excellence's Special Sauce" diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index 2305e33249e..71219b44d16 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -11,6 +11,18 @@ /obj/effect/forcefield/CanAtmosPass(turf/T) return !density +/obj/effect/forcefield/wizard + var/mob/wizard + +/obj/effect/forcefield/wizard/Initialize(mapload, mob/summoner) + . = ..() + wizard = summoner + +/obj/effect/forcefield/wizard/CanPass(atom/movable/mover, turf/target) + if(mover == wizard) + return TRUE + return FALSE + ///////////Mimewalls/////////// /obj/effect/forcefield/mime @@ -22,4 +34,9 @@ /obj/effect/forcefield/mime/New() ..() if(lifetime) - QDEL_IN(src, lifetime) \ No newline at end of file + QDEL_IN(src, lifetime) + +/obj/effect/forcefield/mime/advanced + name = "invisible blockade" + desc = "You might be here a while." + lifetime = 60 SECONDS \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 3a821264822..85a12e69505 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -215,6 +215,13 @@ new /obj/item/ammo_casing/shotgun/dart/assassination(src) new /obj/item/gun/projectile/revolver/doublebarrel/improvised/cane(src) +/obj/item/storage/box/syndie_kit/mimery + name = "mimery kit" + +/obj/item/storage/box/syndie_kit/mimery/New() + ..() + new /obj/item/spellbook/oneuse/mime/greaterwall(src) + new /obj/item/spellbook/oneuse/mime/fingergun(src) /obj/item/storage/box/syndie_kit/atmosgasgrenades name = "Atmos Grenades" diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm index 7d8e90068c6..51356569af9 100644 --- a/code/modules/arcade/prize_datums.dm +++ b/code/modules/arcade/prize_datums.dm @@ -222,6 +222,12 @@ var/global/datum/prizes/global_prizes = new typepath = /obj/item/spellbook/oneuse/fake_gib cost = 100 +/datum/prize_item/fakefingergun + name = "Miming Manual : Finger Gun" + desc = "..." + typepath = /obj/item/spellbook/oneuse/mime/fingergun/fake + cost = 100 + /datum/prize_item/magic_conch name = "Magic Conch Shell" desc = "All hail the magic conch!" diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 43112467f33..c525ef92ee1 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -29,6 +29,12 @@ icon_state = "r-casing" projectile_type = /obj/item/projectile/bullet/weakbullet2 +/obj/item/ammo_casing/c38/invisible + projectile_type = /obj/item/projectile/bullet/weakbullet2/invisible + +/obj/item/ammo_casing/c38/invisible/fake + projectile_type = /obj/item/projectile/bullet/weakbullet2/invisible/fake + /obj/item/ammo_casing/c10mm desc = "A 10mm bullet casing." caliber = "10mm" diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index e621b1906b4..6d6e28092c1 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -61,6 +61,14 @@ caliber = "38" max_ammo = 6 +/obj/item/ammo_box/magazine/internal/cylinder/rev38/invisible + name = "finger gun cylinder" + desc = "Wait, what?" + ammo_type = /obj/item/ammo_casing/c38/invisible + +/obj/item/ammo_box/magazine/internal/cylinder/rev38/invisible/fake + ammo_type = /obj/item/ammo_casing/c38/invisible/fake + /obj/item/ammo_box/magazine/internal/cylinder/rev762 name = "nagant revolver cylinder" ammo_type = /obj/item/ammo_casing/n762 diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index c4c6f76a963..7a11c9a3eb8 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -142,6 +142,48 @@ desc = initial(desc) to_chat(user, "You remove the modifications on [src]. Now it will fire .38 rounds.") +/obj/item/gun/projectile/revolver/fingergun //Summoned by the Finger Gun spell, from advanced mimery traitor item + name = "\improper finger gun" + desc = "Bang bang bang!" + icon_state = "fingergun" + mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38/invisible + origin_tech = "" + flags = ABSTRACT | NODROP | DROPDEL + slot_flags = null + fire_sound = null + fire_sound_text = null + lefthand_file = null + righthand_file = null + clumsy_check = 0 //Stole your uplink! Honk! + needs_permit = 0 //go away beepsky + +/obj/item/gun/projectile/revolver/fingergun/fake + desc = "Pew pew pew!" + mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38/invisible/fake + +/obj/item/gun/projectile/revolver/fingergun/New() + ..() + verbs -= /obj/item/gun/projectile/revolver/verb/spin + +/obj/item/gun/projectile/revolver/fingergun/shoot_with_empty_chamber(/*mob/living/user as mob|obj*/) + to_chat(usr, "You are out of ammo! You holster your fingers.") + qdel(src) + return + +/obj/item/gun/projectile/revolver/fingergun/afterattack(atom/target, mob/living/user, flag, params) + if(!user.mind.miming) + to_chat(usr, "You must dedicate yourself to silence first.") + return + ..() + +/obj/item/gun/projectile/revolver/fingergun/attackby(obj/item/A, mob/user, params) + return + +/obj/item/gun/projectile/revolver/fingergun/attack_self(mob/living/user) + to_chat(usr, "You holster your fingers. Another time.") + qdel(src) + return + /obj/item/gun/projectile/revolver/mateba name = "\improper Unica 6 auto-revolver" desc = "A retro high-powered autorevolver typically used by officers of the New Russia military. Uses .357 ammo." //>10mm hole >.357 diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index c4d9fe2c39f..c55f367d8c3 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -37,6 +37,18 @@ stamina = 60 icon_state = "bullet-r" +/obj/item/projectile/bullet/weakbullet2/invisible //finger gun bullets + name = "invisible bullet" + damage = 0 + icon_state = null + hitsound_wall = null + +/obj/item/projectile/bullet/weakbullet2/invisible/fake + weaken = 0 + stamina = 0 + nodamage = 1 + log_override = TRUE + /obj/item/projectile/bullet/weakbullet3 damage = 20 diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index 5dd923111e6..c9b8c890586 100644 Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index e86a39361da..614bac4094b 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 20588d3617c..e6076c4e5ab 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ