diff --git a/code/datums/antagonists/ninja.dm b/code/datums/antagonists/ninja.dm
index d3b6da5b19c..69487406872 100644
--- a/code/datums/antagonists/ninja.dm
+++ b/code/datums/antagonists/ninja.dm
@@ -29,7 +29,7 @@
qdel(H.gloves)
var/obj/item/clothing/suit/space/space_ninja/theSuit = new(H)
- var/obj/item/weapon/katana/energy/EK = new(H)
+ var/obj/item/weapon/dash/energy_katana/EK = new(H)
theSuit.energyKatana = EK
H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_ears)
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index a13d5a11de0..96c7cbf6feb 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -307,7 +307,7 @@
/obj/item/weapon/melee/supermatter_sword,
/obj/item/weapon/shield/changeling,
/obj/item/weapon/lava_staff,
- /obj/item/weapon/katana/energy,
+ /obj/item/weapon/dash/energy_katana,
/obj/item/weapon/hierophant_club,
/obj/item/weapon/his_grace,
/obj/item/weapon/gun/ballistic/minigun,
diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm
index 6d522c5f54d..951a0d6353d 100644
--- a/code/modules/ninja/energy_katana.dm
+++ b/code/modules/ninja/energy_katana.dm
@@ -1,30 +1,93 @@
-/obj/item/weapon/katana/energy
+/obj/item/weapon/dash
+ name = "abstract dash weapon"
+ var/max_charges = 3
+ var/current_charges = 3
+ var/charge_rate = 30 //In deciseconds
+ var/dash_toggled = TRUE
+
+ var/bypass_density = FALSE //Can we beam past windows/airlocks/etc
+
+ var/start_effect_type = /obj/effect/temp_visual/dir_setting/ninja/phase/out
+ var/end_effect_type = /obj/effect/temp_visual/dir_setting/ninja/phase
+ var/beam_icon_state = "blur"
+ var/dash_beam_type = /obj/effect/ebeam
+
+/obj/item/weapon/dash/proc/charge()
+ current_charges = Clamp(current_charges + 1, 0, max_charges)
+ if(istype(loc, /mob/living))
+ to_chat(loc, "[src] now has [current_charges]/[max_charges] charges.")
+
+/obj/item/weapon/dash/attack_self(mob/user)
+ dash_toggled = !dash_toggled
+ to_chat(user, "You [dash_toggled ? "enable" : "disable"] the dash function on [src].")
+
+/obj/item/weapon/dash/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ if(dash_toggled)
+ dash(user, target)
+ return
+
+/obj/item/weapon/dash/proc/dash(mob/user, atom/target)
+ if(!current_charges)
+ return
+
+ if(Adjacent(target))
+ return
+
+ if(target.density)
+ return
+
+ var/turf/T = get_turf(target)
+
+ if(!bypass_density)
+ for(var/turf/turf in getline(get_turf(user),T))
+ for(var/atom/A in turf)
+ if(A.density)
+ return
+
+ if(target in view(user.client.view, get_turf(user)))
+ var/obj/spot1 = new start_effect_type(T, user.dir)
+ user.forceMove(T)
+ playsound(T, 'sound/magic/blink.ogg', 25, 1)
+ playsound(T, "sparks", 50, 1)
+ var/obj/spot2 = new end_effect_type(get_turf(user), user.dir)
+ spot1.Beam(spot2, beam_icon_state,time = 2, maxdistance = 20, beam_type = dash_beam_type)
+ current_charges--
+ addtimer(CALLBACK(src, .proc/charge), charge_rate)
+
+/obj/item/weapon/dash/energy_katana
name = "energy katana"
desc = "A katana infused with strong energy."
icon_state = "energy_katana"
item_state = "energy_katana"
force = 40
throwforce = 20
+ block_chance = 50
armour_penetration = 50
+ w_class = WEIGHT_CLASS_NORMAL
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ block_chance = 50
+ sharpness = IS_SHARP
+ obj_integrity = 200
+ max_integrity = 200
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ bypass_density = TRUE
var/datum/effect_system/spark_spread/spark_system
-/obj/item/weapon/katana/energy/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
- if(!user || !target)
- return
-
- if(proximity_flag)
- if(isobj(target) || issilicon(target))
- spark_system.start()
- playsound(user, "sparks", 50, 1)
- playsound(user, 'sound/weapons/blade1.ogg', 50, 1)
- target.emag_act(user)
+/obj/item/weapon/dash/energy_katana/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ if(dash_toggled)
+ return ..()
+ if(proximity_flag && (isobj(target) || issilicon(target)))
+ spark_system.start()
+ playsound(user, "sparks", 50, 1)
+ playsound(user, 'sound/weapons/blade1.ogg', 50, 1)
+ target.emag_act(user)
//If we hit the Ninja who owns this Katana, they catch it.
//Works for if the Ninja throws it or it throws itself or someone tries
//To throw it at the ninja
-/obj/item/weapon/katana/energy/throw_impact(atom/hit_atom)
+/obj/item/weapon/dash/energy_katana/throw_impact(atom/hit_atom)
if(ishuman(hit_atom))
var/mob/living/carbon/human/H = hit_atom
if(istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja))
@@ -35,7 +98,7 @@
..()
-/obj/item/weapon/katana/energy/proc/returnToOwner(mob/living/carbon/human/user, doSpark = 1, caught = 0)
+/obj/item/weapon/dash/energy_katana/proc/returnToOwner(mob/living/carbon/human/user, doSpark = 1, caught = 0)
if(!istype(user))
return
forceMove(get_turf(user))
@@ -62,13 +125,12 @@
if(msg)
to_chat(user, "[msg]")
-/obj/item/weapon/katana/energy/New()
- ..()
+/obj/item/weapon/dash/energy_katana/Initialize()
+ . = ..()
spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
-/obj/item/weapon/katana/energy/Destroy()
- qdel(spark_system)
- spark_system = null
- return ..()
\ No newline at end of file
+/obj/item/weapon/dash/energy_katana/Destroy()
+ QDEL_NULL(spark_system)
+ return ..()
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
deleted file mode 100644
index cc865e473ec..00000000000
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-/*
-
-Contents:
-- Proc for handling teleporting while grabbing someone
-- Telport Ability
-- Right-Click Teleport Ability
-
-*/
-
-
-//Handles elporting while grabbing someone
-/obj/item/clothing/suit/space/space_ninja/proc/handle_teleport_grab(turf/T, mob/living/H)
- if(H.pulling && (isliving(H.pulling)))
- var/mob/living/victim = H.pulling
- if(!victim.anchored)
- victim.forceMove(locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z))
-
-
-//Jaunt
-/obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt()
- if(!ninjacost(100,N_STEALTH_CANCEL))
- var/mob/living/carbon/human/H = affecting
- var/turf/destination = get_teleport_loc(H.loc,H,9,1,3,1,0,1)
- var/turf/mobloc = get_turf(H.loc)//Safety
-
- if(destination && isturf(mobloc))//So we don't teleport out of containers
- playsound(H.loc, "sparks", 50, 1)
- new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(H), H.dir)
-
- handle_teleport_grab(destination, H)
- H.loc = destination
-
- spark_system.start()
- playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
- playsound(H.loc, "sparks", 50, 1)
- new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(H), H.dir)
-
- destination.phase_damage_creatures(20,H)//Stun and damage mobs and mechas on the turf
- s_coold = 1
- else
- to_chat(H, "The VOID-shift device is malfunctioning, teleportation failed.")
-
-
-//Right-Click teleport: It's basically admin "jump to turf"
-/obj/item/clothing/suit/space/space_ninja/proc/ninjashift(turf/T in oview())
- set name = "Phase Shift (20E)"
- set desc = "Utilizes the internal VOID-shift device to rapidly transit to a destination in view."
- set category = null//So it does not show up on the panel but can still be right-clicked.
- set src = usr.contents//Fixes verbs not attaching properly for objects. Praise the DM reference guide!
-
- if(!ninjacost(200,N_STEALTH_CANCEL))
- var/mob/living/carbon/human/H = affecting
- var/turf/mobloc = get_turf(H.loc)//To make sure that certain things work properly below.
- if(!T.density && isturf(mobloc))
- playsound(H.loc, "sparks", 50, 1)
- new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(H), H.dir)
-
- handle_teleport_grab(T, H)
- H.forceMove(T)
-
- spark_system.start()
- playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
- playsound(H.loc, "sparks", 50, 1)
- new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(H), H.dir)
-
- T.phase_damage_creatures(20,H)//Stun and damage mobs and mechas on the turf
- s_coold = 1
- else
- to_chat(H, "You cannot teleport into solid walls or from solid matter")
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index 2f3c64ca8f8..102b6bc8040 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -22,7 +22,7 @@ Contents:
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 100, acid = 100)
strip_delay = 12
- actions_types = list(/datum/action/item_action/initialize_ninja_suit, /datum/action/item_action/ninjajaunt, /datum/action/item_action/ninjasmoke, /datum/action/item_action/ninjaboost, /datum/action/item_action/ninjapulse, /datum/action/item_action/ninjastar, /datum/action/item_action/ninjanet, /datum/action/item_action/ninja_sword_recall, /datum/action/item_action/ninja_stealth, /datum/action/item_action/toggle_glove)
+ actions_types = list(/datum/action/item_action/initialize_ninja_suit, /datum/action/item_action/ninjasmoke, /datum/action/item_action/ninjaboost, /datum/action/item_action/ninjapulse, /datum/action/item_action/ninjastar, /datum/action/item_action/ninjanet, /datum/action/item_action/ninja_sword_recall, /datum/action/item_action/ninja_stealth, /datum/action/item_action/toggle_glove)
//Important parts of the suit.
var/mob/living/carbon/human/affecting = null
@@ -31,7 +31,7 @@ Contents:
var/list/reagent_list = list("omnizine","salbutamol","spaceacillin","charcoal","nutriment","radium","potass_iodide")//The reagents ids which are added to the suit at New().
var/list/stored_research = list()//For stealing station research.
var/obj/item/weapon/disk/tech_disk/t_disk//To copy design onto disk.
- var/obj/item/weapon/katana/energy/energyKatana //For teleporting the katana back to the ninja (It's an ability)
+ var/obj/item/weapon/dash/energy_katana/energyKatana //For teleporting the katana back to the ninja (It's an ability)
//Other articles of ninja gear worn together, used to easily reference them after initializing.
var/obj/item/clothing/head/helmet/space/space_ninja/n_hood
@@ -182,9 +182,6 @@ Contents:
if(!s_initialized)
to_chat(user, "ERROR: suit offline. Please activate suit.")
return FALSE
- if(istype(action, /datum/action/item_action/ninjajaunt))
- ninjajaunt()
- return TRUE
if(istype(action, /datum/action/item_action/ninjasmoke))
ninjasmoke()
return TRUE
diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm
index f26912df24d..b723ade3819 100644
--- a/code/modules/ninja/suit/suit_initialisation.dm
+++ b/code/modules/ninja/suit/suit_initialisation.dm
@@ -71,7 +71,6 @@
/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_three(delay, mob/living/carbon/human/U)
to_chat(U, "Logging off, [U:real_name]. Shutting down SpiderOS.")
- remove_ninja_verbs()
addtimer(CALLBACK(src, .proc/deinitialize_four, delay, U), delay)
/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_four(delay, mob/living/carbon/human/U)
diff --git a/code/modules/ninja/suit/suit_verbs_handlers.dm b/code/modules/ninja/suit/suit_verbs_handlers.dm
index 7c887da1d2a..35070a52dd0 100644
--- a/code/modules/ninja/suit/suit_verbs_handlers.dm
+++ b/code/modules/ninja/suit/suit_verbs_handlers.dm
@@ -22,11 +22,5 @@ Contents:
/obj/item/clothing/suit/space/space_ninja/proc/grant_ninja_verbs()
- verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
-
s_initialized=1
- slowdown=0
-
-
-/obj/item/clothing/suit/space/space_ninja/proc/remove_ninja_verbs()
- verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
+ slowdown=0
\ No newline at end of file
diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi
index 98bb0c7395e..2ae375b9270 100644
Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index fbfa4b80019..df37f4e76a3 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1825,7 +1825,6 @@
#include "code\modules\ninja\suit\n_suit_verbs\ninja_stars.dm"
#include "code\modules\ninja\suit\n_suit_verbs\ninja_stealth.dm"
#include "code\modules\ninja\suit\n_suit_verbs\ninja_sword_recall.dm"
-#include "code\modules\ninja\suit\n_suit_verbs\ninja_teleporting.dm"
#include "code\modules\orbit\orbit.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\contract.dm"