New mime uplink spell: Invisible Un-wall (#29706)

* Basis of spell

* Spellbook and uplink entry

* Only mimes can read it

* Spell rework

* Indent fix

* Table hotfix

* Checks to prevent players breaking some maps and whatnot

* Reimplementation as requested

* Movables...

* Further reimplementation

* Typo

* Duration handle fix

* Documenting spell

* Duration has to be defined itself

* Description fix

* Allowing turfs to be targeted

* Trying this to include turfs

* Annoying workaround but it'll do

* Removing from bundle

* New recoil

* Fix

* Fix

* Works better in uncross

* Here too

* Oh wow

* Performance tweak

* This is redundant

* Requested fixes

Co-authored-by: kanef <kanef9x@protonmail.com>
This commit is contained in:
kane-f
2021-06-24 16:11:27 +01:00
committed by GitHub
parent 82f1e8b517
commit c49d69431a
10 changed files with 126 additions and 10 deletions

View File

@@ -998,6 +998,13 @@ var/list/uplink_items = list()
cost = 12 cost = 12
jobs_exclusive = list("Mime") jobs_exclusive = list("Mime")
/datum/uplink_item/jobspecific/clown_mime/unwall_spell
name = "Invisible Un-Wall Spellbook"
desc = "Grants the user the ability to conjure a strange wall allowing the passage of anything through a space regardless of the objects in place. Only real Mimes are capable of learning from this forbidden tome."
item = /obj/item/weapon/spellbook/oneuse/unwall
cost = 12
jobs_exclusive = list("Mime")
/datum/uplink_item/jobspecific/clown_mime/punchline /datum/uplink_item/jobspecific/clown_mime/punchline
name = "Punchline" name = "Punchline"
desc = "A high risk high reward abomination combining experimental phazon and bananium technologies. Wind-up Punchline to charge it. Enough charge and your targets will slip through reality. Warning: Forcing wind-ups beyond the limiter may reverse the prototype phazite honkpacitors and disrupt reality around the user." desc = "A high risk high reward abomination combining experimental phazon and bananium technologies. Wind-up Punchline to charge it. Enough charge and your targets will slip through reality. Warning: Forcing wind-ups beyond the limiter may reverse the prototype phazite honkpacitors and disrupt reality around the user."

View File

@@ -17,7 +17,7 @@
..() ..()
name += spellname name += spellname
/obj/item/weapon/spellbook/oneuse/attack_self(mob/user as mob) /obj/item/weapon/spellbook/oneuse/attack_self(mob/user)
var/spell/S = new spell(user) var/spell/S = new spell(user)
for(var/spell/knownspell in user.spell_list) for(var/spell/knownspell in user.spell_list)
if(knownspell.type == S.type) if(knownspell.type == S.type)
@@ -36,10 +36,10 @@
user.attack_log += text("\[[time_stamp()]\] <font color='orange'>[user.real_name] ([user.ckey]) learned the spell [spellname] ([S]).</font>") user.attack_log += text("\[[time_stamp()]\] <font color='orange'>[user.real_name] ([user.ckey]) learned the spell [spellname] ([S]).</font>")
onlearned(user) onlearned(user)
/obj/item/weapon/spellbook/oneuse/proc/recoil(mob/user as mob) /obj/item/weapon/spellbook/oneuse/proc/recoil(mob/user)
user.visible_message("<span class='warning'>[src] glows in a black light!</span>") user.visible_message("<span class='warning'>[src] glows in a black light!</span>")
/obj/item/weapon/spellbook/oneuse/proc/onlearned(mob/user as mob) /obj/item/weapon/spellbook/oneuse/proc/onlearned(mob/user)
used = 1 used = 1
user.visible_message("<span class='caution'>[src] glows dark for a second!</span>") user.visible_message("<span class='caution'>[src] glows dark for a second!</span>")
@@ -52,7 +52,7 @@
icon_state ="bookfireball" icon_state ="bookfireball"
desc = "This book feels warm to the touch." desc = "This book feels warm to the touch."
/obj/item/weapon/spellbook/oneuse/fireball/recoil(mob/user as mob) /obj/item/weapon/spellbook/oneuse/fireball/recoil(mob/user)
..() ..()
explosion(user.loc, -1, 0, 2, 3, 0) explosion(user.loc, -1, 0, 2, 3, 0)
qdel(src) qdel(src)
@@ -75,7 +75,7 @@
icon_state ="bookblind" icon_state ="bookblind"
desc = "This book looks blurry, no matter how you look at it." desc = "This book looks blurry, no matter how you look at it."
/obj/item/weapon/spellbook/oneuse/blind/recoil(mob/user as mob) /obj/item/weapon/spellbook/oneuse/blind/recoil(mob/user)
..() ..()
to_chat(user, "<span class='warning'>You go blind!</span>") to_chat(user, "<span class='warning'>You go blind!</span>")
user.eye_blind = 10 user.eye_blind = 10
@@ -103,13 +103,36 @@
icon_state ="bookforcewall" icon_state ="bookforcewall"
desc = "This book has a dedication to mimes everywhere inside the front cover." desc = "This book has a dedication to mimes everywhere inside the front cover."
/obj/item/weapon/spellbook/oneuse/forcewall/recoil(mob/user as mob) /obj/item/weapon/spellbook/oneuse/forcewall/recoil(mob/user)
..() ..()
to_chat(user, "<span class='warning'>You suddenly feel very solid!</span>") to_chat(user, "<span class='warning'>You suddenly feel very solid!</span>")
var/obj/structure/closet/statue/S = new /obj/structure/closet/statue(user.loc, user) var/obj/structure/closet/statue/S = new /obj/structure/closet/statue(user.loc, user)
S.timer = 30 S.timer = 30
user.drop_item() user.drop_item()
/obj/item/weapon/spellbook/oneuse/unwall
spell = /spell/targeted/mime_unwall
spellname = "unwall"
icon_state ="bookforcewall"
desc = "This book has a dedication to finger gun-toting mimes everywhere inside the front cover."
disabled_from_bundle = 1
/obj/item/weapon/spellbook/oneuse/unwall/attack_self(mob/user)
if(ishuman(user))
var/mob/living/carbon/human/M = user
if(!issilent(M))
recoil(user)
else
recoil(user)
..()
/obj/item/weapon/spellbook/oneuse/unwall/recoil(mob/user)
..()
to_chat(user, "<span class='warning'>You suddenly feel very silent!</span>")
if(ishuman(user))
var/mob/living/carbon/human/M = user
M.flash_eyes(visual = 1)
user.mind.miming = MIMING_OUT_OF_CURSE
/obj/item/weapon/spellbook/oneuse/knock /obj/item/weapon/spellbook/oneuse/knock
spell = /spell/aoe_turf/knock spell = /spell/aoe_turf/knock
@@ -117,7 +140,7 @@
icon_state ="bookknock" icon_state ="bookknock"
desc = "This book is hard to hold closed properly." desc = "This book is hard to hold closed properly."
/obj/item/weapon/spellbook/oneuse/knock/recoil(mob/user as mob) /obj/item/weapon/spellbook/oneuse/knock/recoil(mob/user)
..() ..()
to_chat(user, "<span class='warning'>You're knocked down!</span>") to_chat(user, "<span class='warning'>You're knocked down!</span>")
user.Knockdown(20) user.Knockdown(20)
@@ -128,7 +151,7 @@
icon_state ="bookhangman" icon_state ="bookhangman"
desc = "This book has some letters blanked out in the words." desc = "This book has some letters blanked out in the words."
/obj/item/weapon/spellbook/oneuse/hangman/recoil(mob/user as mob) /obj/item/weapon/spellbook/oneuse/hangman/recoil(mob/user)
..() ..()
if(ishuman(user)) if(ishuman(user))
var/mob/living/carbon/human/H = user var/mob/living/carbon/human/H = user
@@ -160,7 +183,7 @@
desc = "This book is made of 100% post-consumer wizard." desc = "This book is made of 100% post-consumer wizard."
disabled_from_bundle = 1 disabled_from_bundle = 1
/obj/item/weapon/spellbook/oneuse/charge/recoil(mob/user as mob) /obj/item/weapon/spellbook/oneuse/charge/recoil(mob/user)
..() ..()
to_chat(user, "<span class='warning'>[src] suddenly feels very warm!</span>") to_chat(user, "<span class='warning'>[src] suddenly feels very warm!</span>")
empulse(src, 1, 1) empulse(src, 1, 1)

View File

@@ -1368,6 +1368,8 @@ About the new airlock wires panel:
wires.SignalIndex(AIRLOCK_WIRE_ONOPEN) wires.SignalIndex(AIRLOCK_WIRE_ONOPEN)
/obj/machinery/door/airlock/Uncross(atom/movable/mover) /obj/machinery/door/airlock/Uncross(atom/movable/mover)
if(locate(/obj/effect/unwall_field) in loc) //Annoying workaround for this, especially because of that thing below -kanef
return 1
if(density && ismob(mover) && !(mover.checkpass(PASSGLASS) && !opacity) && !(mover.checkpass(PASSDOOR)) && !(istype(mover,/mob/living/simple_animal/shade)))//REEEEEEE if(density && ismob(mover) && !(mover.checkpass(PASSGLASS) && !opacity) && !(mover.checkpass(PASSDOOR)) && !(istype(mover,/mob/living/simple_animal/shade)))//REEEEEEE
to_chat(mover, "You are pinned inside the closed airlock; you can't move!") to_chat(mover, "You are pinned inside the closed airlock; you can't move!")
return 0 return 0

View File

@@ -603,6 +603,8 @@ var/global/list/alert_overlays_global = list()
flow_flags = ON_BORDER flow_flags = ON_BORDER
/obj/machinery/door/firedoor/border_only/Cross(atom/movable/mover, turf/target, height=1.5, air_group = 0) /obj/machinery/door/firedoor/border_only/Cross(atom/movable/mover, turf/target, height=1.5, air_group = 0)
if(locate(/obj/effect/unwall_field) in loc) //Annoying workaround for this -kanef
return 1
if(istype(mover) && (mover.checkpass(PASSDOOR|PASSGLASS))) if(istype(mover) && (mover.checkpass(PASSDOOR|PASSGLASS)))
return 1 return 1
if(get_dir(loc, target) == dir || get_dir(loc, mover) == dir) if(get_dir(loc, target) == dir || get_dir(loc, mover) == dir)
@@ -620,6 +622,8 @@ var/global/list/alert_overlays_global = list()
close() close()
/obj/machinery/door/firedoor/border_only/Uncross(atom/movable/mover as mob|obj, turf/target as turf) /obj/machinery/door/firedoor/border_only/Uncross(atom/movable/mover as mob|obj, turf/target as turf)
if(locate(/obj/effect/unwall_field) in loc) //Annoying workaround for this -kanef
return 1
if(istype(mover) && (mover.checkpass(PASSDOOR|PASSGLASS))) if(istype(mover) && (mover.checkpass(PASSDOOR|PASSGLASS)))
return 1 return 1
if(flow_flags & ON_BORDER) if(flow_flags & ON_BORDER)

View File

@@ -105,6 +105,8 @@
close() close()
/obj/machinery/door/window/Cross(atom/movable/mover, turf/target, height=1.5, air_group = 0) /obj/machinery/door/window/Cross(atom/movable/mover, turf/target, height=1.5, air_group = 0)
if(locate(/obj/effect/unwall_field) in loc) //Annoying workaround for this -kanef
return 1
if(istype(mover) && (mover.checkpass(PASSDOOR|PASSGLASS))) if(istype(mover) && (mover.checkpass(PASSDOOR|PASSGLASS)))
return TRUE return TRUE
if(get_dir(loc, target) == dir || get_dir(loc, mover) == dir) if(get_dir(loc, target) == dir || get_dir(loc, mover) == dir)
@@ -119,6 +121,8 @@
return !density || (dir != to_dir) || check_access(ID) return !density || (dir != to_dir) || check_access(ID)
/obj/machinery/door/window/Uncross(atom/movable/mover, turf/target) /obj/machinery/door/window/Uncross(atom/movable/mover, turf/target)
if(locate(/obj/effect/unwall_field) in loc) //Annoying workaround for this -kanef
return 1
if(istype(mover) && (mover.checkpass(PASSDOOR|PASSGLASS))) if(istype(mover) && (mover.checkpass(PASSDOOR|PASSGLASS)))
return TRUE return TRUE
if(flow_flags & ON_BORDER) //but it will always be on border tho if(flow_flags & ON_BORDER) //but it will always be on border tho

View File

@@ -26,7 +26,6 @@
return 1 return 1
/obj/structure/window/full/Cross(atom/movable/mover, turf/target, height = 1.5, air_group = 0) /obj/structure/window/full/Cross(atom/movable/mover, turf/target, height = 1.5, air_group = 0)
if(istype(mover) && mover.checkpass(PASSGLASS)) if(istype(mover) && mover.checkpass(PASSGLASS))
dim_beam(mover) dim_beam(mover)
return 1 return 1

View File

@@ -301,6 +301,8 @@
return return
/obj/structure/table/Cross(atom/movable/mover, turf/target, height=1.5, air_group = 0) /obj/structure/table/Cross(atom/movable/mover, turf/target, height=1.5, air_group = 0)
if(locate(/obj/effect/unwall_field) in loc) //Annoying workaround for this -kanef
return 1
if(air_group || (height==0)) if(air_group || (height==0))
return 1 return 1
if(istype(mover,/obj/item/projectile)) if(istype(mover,/obj/item/projectile))
@@ -346,6 +348,8 @@
return 1 return 1
/obj/structure/table/Uncross(atom/movable/mover as mob|obj, target as turf) /obj/structure/table/Uncross(atom/movable/mover as mob|obj, target as turf)
if(locate(/obj/effect/unwall_field) in loc) //Annoying workaround for this -kanef
return 1
if(istype(mover) && mover.checkpass(PASSTABLE)) if(istype(mover) && mover.checkpass(PASSTABLE))
return 1 return 1
if(flow_flags & ON_BORDER) if(flow_flags & ON_BORDER)

View File

@@ -173,6 +173,8 @@ var/list/one_way_windows
healthcheck() healthcheck()
/obj/structure/window/Uncross(var/atom/movable/mover, var/turf/target) /obj/structure/window/Uncross(var/atom/movable/mover, var/turf/target)
if(locate(/obj/effect/unwall_field) in loc) //Annoying workaround for this -kanef
return 1
if(istype(mover) && mover.checkpass(PASSGLASS)) if(istype(mover) && mover.checkpass(PASSGLASS))
return 1 return 1
if(flow_flags & ON_BORDER) if(flow_flags & ON_BORDER)
@@ -186,6 +188,8 @@ var/list/one_way_windows
return 1 return 1
/obj/structure/window/Cross(atom/movable/mover, turf/target, height = 0) /obj/structure/window/Cross(atom/movable/mover, turf/target, height = 0)
if(locate(/obj/effect/unwall_field) in loc) //Annoying workaround for this -kanef
return 1
if(istype(mover) && mover.checkpass(PASSGLASS))//checking for beam dispersion both in and out, since beams do not trigger Uncross. if(istype(mover) && mover.checkpass(PASSGLASS))//checking for beam dispersion both in and out, since beams do not trigger Uncross.
if((get_dir(loc, target) & dir) || (get_dir(loc, mover) & dir) || (get_dir(loc, target) & reverse_direction(dir)) || (get_dir(loc, mover) & reverse_direction(dir))) if((get_dir(loc, target) & dir) || (get_dir(loc, mover) & dir) || (get_dir(loc, target) & reverse_direction(dir)) || (get_dir(loc, mover) & reverse_direction(dir)))
dim_beam(mover) dim_beam(mover)

View File

@@ -83,6 +83,8 @@
to_chat(runner,"<span class='warning'>You're exhausted! You can't run anymore!</span>") to_chat(runner,"<span class='warning'>You're exhausted! You can't run anymore!</span>")
/obj/machinery/power/treadmill/Uncross(var/atom/movable/mover, var/turf/target) /obj/machinery/power/treadmill/Uncross(var/atom/movable/mover, var/turf/target)
if(locate(/obj/effect/unwall_field) in loc) //Annoying workaround for this -kanef
return 1
if(istype(mover) && mover.checkpass(PASSGLASS)) if(istype(mover) && mover.checkpass(PASSGLASS))
return 1 return 1
if((flow_flags & ON_BORDER) && (mover.dir == dir)) if((flow_flags & ON_BORDER) && (mover.dir == dir))
@@ -91,6 +93,8 @@
return 1 return 1
/obj/machinery/power/treadmill/Cross(atom/movable/mover, turf/target, height=1.5, air_group = 0) /obj/machinery/power/treadmill/Cross(atom/movable/mover, turf/target, height=1.5, air_group = 0)
if(locate(/obj/effect/unwall_field) in loc) //Annoying workaround for this -kanef
return 1
if(istype(mover) && mover.checkpass(PASSGLASS)) if(istype(mover) && mover.checkpass(PASSGLASS))
return 1 return 1
if(get_dir(loc, target) == dir || get_dir(loc, mover) == dir) if(get_dir(loc, target) == dir || get_dir(loc, mover) == dir)

View File

@@ -32,6 +32,40 @@
override_base = "grey" override_base = "grey"
hud_state = "mime_wall" hud_state = "mime_wall"
/*
Unwall spell, sadly has to be targeted to be any fun to use
-kanef
*/
/spell/targeted/mime_unwall
name = "Invisible un-wall"
desc = "Create an invisible un-wall on a targeted location, an anomaly allowing the passage of all objects through anything on it."
school = "mime"
abbreviation = "FW"
user_type = USER_TYPE_OTHER
panel = "Mime"
specialization = SSOFFENSIVE
school = "mime"
charge_max = 300
cast_sound = null
cooldown_min = 2 SECONDS
spell_flags = WAIT_FOR_CLICK
range = 1
max_targets = 1
invocation_type = SpI_EMOTE
invocation = "mimes placing their hands on a flat surface, and pushing against it."
override_base = "grey"
hud_state = "mime_wall"
/spell/targeted/mime_unwall/cast(var/list/targets, mob/user)
..()
for(var/atom/target in targets)
if(isturf(target))
new /obj/effect/unwall_field(target)
else
new /obj/effect/unwall_field(target.loc)
/obj/effect/forcefield /obj/effect/forcefield
desc = "A space wizard's magic wall." desc = "A space wizard's magic wall."
name = "FORCEWALL" name = "FORCEWALL"
@@ -69,3 +103,34 @@
new /obj/effect/forcefield/cult(get_turf(src)) new /obj/effect/forcefield/cult(get_turf(src))
qdel(src) qdel(src)
return return
/*
Unwall fields
-kanef
*/
/obj/effect/unwall_field
icon = 'icons/effects/effects.dmi'
icon_state = "fuel"
name = "invisible un-wall"
desc = "You have a REALLY bad feeling about this."
anchored = 1.0
opacity = 0
var/duration = 300 // How long the wall lasts, in ticks
var/static/list/forbidden_passes = list(/turf/unsimulated/wall,/turf/simulated/wall/invulnerable,/obj/structure/grille/invulnerable) // To stop people breaking maps like centcomm or lamprey stuff
/obj/effect/unwall_field/permanent // For future mapping or bus shenanigans
duration = 0 // Forever
/obj/effect/unwall_field/New()
..()
if(duration) // Wait the duration if any and delete it, if zero, don't
spawn(duration)
qdel(src)
/obj/effect/unwall_field/to_bump(atom/movable/A)
if(is_type_in_list(src.loc,forbidden_passes))
return
for(var/atom/B in src.loc) // Go through everything, discount passing through forbidden stuff
if(is_type_in_list(B,forbidden_passes))
return
A.forceMove(src.loc)