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"