From 74d1c3600efa7f12073d7e643bfbbdf90c8b9840 Mon Sep 17 00:00:00 2001 From: "noisomehollow@lycos.com" Date: Tue, 12 Apr 2011 04:26:29 +0000 Subject: [PATCH] #Fixed swat armor from previous commit, oops. #Added effects and sounds to ninja powers. #Energy blade will no longer cut through r-walls. Regular walls take seven seconds to cut through. #Added a bare-bones startup and power-down system to the ninja suit (and accessories). It will need to initialize before granting powers. It should be very possible to give anyone the suit and turn them into a space ninja. Just make sure to edit their special_role to "Space Ninja" #This also means that ninja items are now removable before they are initialized (or after de-initializing). Suit and mask are still not examinable due to a mysterious bug with obj verbs. #fixed a few misc bugs. #Updated turrets a tad. You can now destroy them by bashing them with stuff when they pop out. If someone feels up to it, death commandos need a cool helmet to go with their new suits. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1437 316c924e-a436-60f5-8080-3fe189b3f50e --- code/defines/obj/clothing/gloves.dm | 1 - code/defines/obj/clothing/head.dm | 1 - code/defines/obj/clothing/shoes.dm | 3 +- code/defines/obj/clothing/suit.dm | 10 +- code/defines/obj/weapon.dm | 3 +- code/game/machinery/doors/door.dm | 11 +- code/game/machinery/turrets.dm | 24 ++- code/game/objects/items/clothing.dm | 171 +++++++++++++++--- .../objects/items/weapons/swords_axes_etc.dm | 7 +- code/game/objects/secstorage/secstorage.dm | 5 + code/game/objects/secure_closets.dm | 5 + code/game/objects/storage/crates.dm | 2 +- code/game/objects/tables_racks.dm | 10 + code/game/turf.dm | 25 +-- code/modules/admin/verbs/striketeam.dm | 33 ++-- code/modules/mob/living/carbon/human/death.dm | 2 +- sound/weapons/blade1.ogg | Bin 0 -> 22099 bytes 17 files changed, 244 insertions(+), 69 deletions(-) create mode 100644 sound/weapons/blade1.ogg diff --git a/code/defines/obj/clothing/gloves.dm b/code/defines/obj/clothing/gloves.dm index 11dde80f14..b0a349e241 100644 --- a/code/defines/obj/clothing/gloves.dm +++ b/code/defines/obj/clothing/gloves.dm @@ -60,7 +60,6 @@ siemens_coefficient = 0 protective_temperature = 1100 heat_transfer_coefficient = 0.05 - canremove = 0 /obj/item/clothing/gloves/stungloves/ name = "Stungloves" diff --git a/code/defines/obj/clothing/head.dm b/code/defines/obj/clothing/head.dm index a90b606c3d..55cea8a97d 100644 --- a/code/defines/obj/clothing/head.dm +++ b/code/defines/obj/clothing/head.dm @@ -188,7 +188,6 @@ icon_state = "s-ninja" item_state = "s-ninja_mask" radiation_protection = 0.25 - canremove = 0 see_face = 1 /obj/item/clothing/head/helmet/swat diff --git a/code/defines/obj/clothing/shoes.dm b/code/defines/obj/clothing/shoes.dm index e41652e9c8..7e44948ff2 100644 --- a/code/defines/obj/clothing/shoes.dm +++ b/code/defines/obj/clothing/shoes.dm @@ -33,11 +33,10 @@ name = "ninja shoes" desc = "A pair of running shoes, excellent for running and even better for smashing skulls." icon_state = "s-ninja" - slowdown = -1 + slowdown = 0 protective_temperature = 700 permeability_coefficient = 0.01 flags = NOSLIP - canremove = 0 /obj/item/clothing/shoes/white name = "White Shoes" diff --git a/code/defines/obj/clothing/suit.dm b/code/defines/obj/clothing/suit.dm index 9d03dc4d3b..59271a796b 100644 --- a/code/defines/obj/clothing/suit.dm +++ b/code/defines/obj/clothing/suit.dm @@ -248,10 +248,10 @@ /obj/item/clothing/suit/armor/swat name = "swat suit" desc = "A heavily armored suit that protects against moderate damage. Used in special operations." - icon_state = "deathcommando" + icon_state = "deathsquad" item_state = "swat_suit" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - slowdown = 0.5 + slowdown = 1 allowed = list(/obj/item/weapon/gun,/obj/item/weapon/ammo,/obj/item/weapon/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen) // FIRE SUITS @@ -360,12 +360,14 @@ icon_state = "s-ninja" item_state = "s-ninja_suit" allowed = list(/obj/item/weapon/gun,/obj/item/weapon/ammo,/obj/item/weapon/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen) - slowdown = 0 + slowdown = 1 radiation_protection = 0.75 - canremove = 0 + var/affecting = null var/active = 0 var/charge = 10000.0 var/maxcharge = 10000.0//Super high capacity charge but abilities eat a chunk of it./N + var/initialize = 0 + var/sbombs = 10.0 /obj/item/clothing/suit/space/pirate name = "pirate coat" diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index f67d70cd1f..8ddbfdf1f8 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -1259,9 +1259,10 @@ Total SMES charging rate should not exceed total power generation rate, or an ov throwforce = 1//Throwing or dropping the item deletes it. throw_speed = 1 throw_range = 1 - w_class = 4.0//So you can't hide in your pocket or some such. + w_class = 4.0//So you can't hide it in your pocket or some such. flags = FPRINT | TABLEPASS | NOSHIELD var/affecting = null + var/datum/effects/system/spark_spread/spark_system /obj/item/weapon/table_parts name = "table parts" diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index a024601203..468d0f704d 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -128,6 +128,13 @@ src.operating = -1 if(istype(I, /obj/item/weapon/blade)) if(istype(src, /obj/machinery/door/airlock)) + var/datum/effects/system/spark_spread/spark_system = new /datum/effects/system/spark_spread() + spark_system.set_up(5, 0, src.loc) + spark_system.start() + playsound(src.loc, 'blade1.ogg', 50, 1) + playsound(src.loc, "sparks", 50, 1) + for(var/mob/O in viewers(user, 3)) + O.show_message(text("\blue The door has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) if((!src:arePowerSystemsOn()) || (stat & NOPOWER) || src:isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) var/obj/door_assembly/temp var/failsafe=0 @@ -145,16 +152,12 @@ temp.anchored=0 step_away(temp,usr,15) else del(temp) - for(var/mob/O in viewers(user, 3)) - O.show_message(text("\blue The door has been sliced open by [] with an energy blade and kicked out of the way!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) del(src) return else src:welded = 0 src:locked = 0 update_icon() - for(var/mob/O in viewers(user, 3)) - O.show_message(text("\blue The door has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) flick("door_spark", src) sleep(6) open() diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index 82bf9d2001..542a848076 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -57,16 +57,23 @@ invisibility = 2 density = 1 var/lasers = 0 - var/health = 18 + var/health = 40 var/obj/machinery/turretcover/cover = null var/popping = 0 var/wasvalid = 0 var/lastfired = 0 var/shot_delay = 30 //3 seconds between shots + var/datum/effects/system/spark_spread/spark_system use_power = 1 idle_power_usage = 50 active_power_usage = 300 +/obj/machinery/turret/New() + src.spark_system = new /datum/effects/system/spark_spread + spark_system.set_up(5, 0, src) + spark_system.attach(src) + ..() + /obj/machinery/turretcover name = "pop-up turret cover" icon = 'turrets.dmi' @@ -275,14 +282,23 @@ /obj/machinery/turret/bullet_act(flag) if (flag == PROJECTILE_BULLET) - src.health -= 4 + src.health -= 17 else if (flag == PROJECTILE_TASER) //taser src.health -= 1 else if(flag == PROJECTILE_PULSE) - src.health -= 10 + src.health -= 30 else src.health -= 2 + src.spark_system.start() + if (src.health <= 0) + src.die() + return +/obj/machinery/turret/attackby(obj/item/weapon/W, mob/user)//I can't believe no one added this before/N + ..() + playsound(src.loc, 'smash.ogg', 60, 1) + src.spark_system.start() + src.health -= W.force * 0.5 if (src.health <= 0) src.die() return @@ -377,7 +393,7 @@ for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) O.show_message(text("\red [] has slashed at []!", M, src), 1) - src.health -= 4 + src.health -= 15 if (src.health <= 0) src.die() else diff --git a/code/game/objects/items/clothing.dm b/code/game/objects/items/clothing.dm index 6a4ea6ce39..19a7bc4298 100644 --- a/code/game/objects/items/clothing.dm +++ b/code/game/objects/items/clothing.dm @@ -294,21 +294,148 @@ NINJA MASK ..() //SPESS NINJA STUFF -/obj/item/clothing/suit/space/space_ninja/verb/toggle() + +/obj/item/clothing/suit/space/space_ninja/New() +//Fix for the examine issue mentioned below. Followup: this doesn't fix anything. I'll need to take a look at how examine works. + src.verbs += /obj/item/clothing/suit/space/space_ninja/proc/init + +/obj/item/clothing/suit/space/space_ninja/proc/init() + set name = "Initialize Suit" + set desc = "Initializes the suit for field operation." + set category = "Object" + + if(usr.mind&&usr.mind.special_role=="Space Ninja"&&usr:wear_suit==src&&!src.initialize) + var/mob/living/carbon/human/U = usr + U << "\blue Now initializing..." + sleep(40) + if(!istype(U.head, /obj/item/clothing/head/helmet/space/space_ninja)) + U << "\red ERROR: 100113 UNABLE TO LOCATE HEAD GEAR\nABORTING..." + return + if(!istype(U.shoes, /obj/item/clothing/shoes/space_ninja)) + U << "\red ERROR: 122011 UNABLE TO LOCATE FOOT GEAR\nABORTING..." + return + if(!istype(U.gloves, /obj/item/clothing/gloves/space_ninja)) + U << "\red ERROR: 110223 UNABLE TO LOCATE HAND GEAR\nABORTING..." + return + U << "\blue Securing external locking mechanism...\nNeural-net established." + U.head:canremove=0 + U.shoes:canremove=0 + U.gloves:canremove=0 + src.canremove=0 + sleep(40) + U << "\blue Extending neural-net interface...\nNow monitoring brain wave pattern..." + sleep(40) + if(U.stat==2) + U << "\red FATAL ERROR: 344--93#&&21 BRAIN WAV3 PATT$RN RED\nA-A-AB0RTING..." + return + U << "\blue Linking neural-net interface...\nPattern \green GREEN\blue, continuing operation." + sleep(40) + U << "\blue VOID-shift device status: ONLINE.\nCLOAK-tech device status: ONLINE." + sleep(40) + U << "\blue Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [src.charge]." + sleep(40) + U << "\blue All systems operational. Welcome to SpiderOS, [U.real_name]." + U.verbs += /mob/proc/ninjashift + U.verbs += /mob/proc/ninjajaunt + U.verbs += /mob/proc/ninjasmoke + U.verbs += /mob/proc/ninjapulse + U.verbs += /mob/proc/ninjablade + U.mind.special_verbs += /mob/proc/ninjashift + U.mind.special_verbs += /mob/proc/ninjajaunt + U.mind.special_verbs += /mob/proc/ninjasmoke + U.mind.special_verbs += /mob/proc/ninjapulse + U.mind.special_verbs += /mob/proc/ninjablade + src.verbs -= /obj/item/clothing/suit/space/space_ninja/proc/init + src.verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit + src.verbs += /obj/item/clothing/suit/space/space_ninja/proc/toggle + src.initialize=1 + src.affecting=U + src.slowdown=0 + U.shoes:slowdown-- + else + if(usr.mind&&usr.mind.special_role=="Space Ninja") + usr << "\red You do not understand how this suit functions." + else if(usr:wear_suit!=src) + usr << "\red You must be wearing the suit to use this function." + else if(src.initialize) + usr << "\red The suit is already functioning." + else + usr << "\red You cannot use this function at this time." + return + +/obj/item/clothing/suit/space/space_ninja/proc/deinit() + set name = "De-Initialize Suit" + set desc = "Begins procedure to remove the suit." + set category = "Object" + + if(!src.initialize) + usr << "\red The suit is not initialized." + return + if(alert("Are you certain you wish to remove the suit? This will take time and remove all abilities.",,"Yes","No")=="No") + return + + var/mob/living/carbon/human/U = usr + + U << "\blue Now de-initializing..." + sleep(40) + U.verbs -= /mob/proc/ninjashift + U.verbs -= /mob/proc/ninjajaunt + U.verbs -= /mob/proc/ninjasmoke + U.verbs -= /mob/proc/ninjapulse + U.verbs -= /mob/proc/ninjablade + U.mind.special_verbs -= /mob/proc/ninjashift + U.mind.special_verbs -= /mob/proc/ninjajaunt + U.mind.special_verbs -= /mob/proc/ninjasmoke + U.mind.special_verbs -= /mob/proc/ninjapulse + U.mind.special_verbs -= /mob/proc/ninjablade + U << "\blue Logging off, [U:real_name]. Shutting down SpiderOS." + sleep(40) + U << "\blue Primary system status: OFFLINE.\nBackup system status: OFFLINE." + sleep(40) + U << "\blue VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE." + sleep(40) + if(U.stat==2||U.health<=0) + U << "\red FATAL ERROR: 412--GG##&77 BRAIN WAV3 PATT$RN RED\nI-I-INITIATING S-SELf DeStrCuCCCT%$#@@!!$^#!..." + spawn(10) + U << "\red #3#" + spawn(20) + U << "\red #2#" + spawn(30) + U << "\red #1#: G00DBYE" + U.gib() + return + U << "\blue Disconnecting neural-net interface...\greenSuccess\blue." + sleep(40) + U << "\blue Disengaging neural-net interface...\greenSuccess\blue." + sleep(40) + if(istype(U.head, /obj/item/clothing/head/helmet/space/space_ninja)) + U.head.canremove=1 + if(istype(U.shoes, /obj/item/clothing/shoes/space_ninja)) + U.shoes:canremove=1 + U.shoes:slowdown++ + if(istype(U.gloves, /obj/item/clothing/gloves/space_ninja)) + U.gloves:canremove=1 + src.canremove=1 + U << "\blue Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED." + src.verbs += /obj/item/clothing/suit/space/space_ninja/proc/init + src.verbs -= /obj/item/clothing/suit/space/space_ninja/proc/deinit + src.verbs -= /obj/item/clothing/suit/space/space_ninja/proc/toggle + src.initialize=0 + src.affecting=null + src.slowdown=1 + return + +/obj/item/clothing/suit/space/space_ninja/proc/toggle() set name = "Toggle Stealth" set desc = "Toggles the internal CLOAK-tech on or off." set category = "Object" + if(usr:wear_suit!=src||!src.initialize) + usr << "\red You suit must be worn and active to use this function." + return if(src.active) spawn(0) - var/atom/movable/overlay/animation = new(usr.loc) - animation.icon = 'mob.dmi' - animation.icon_state = "blank" - animation.layer = usr.layer + 1 - animation.master = usr - flick("uncloak", animation) - sleep(15) - del(animation) + anim(usr.loc,'mob.dmi',usr,"uncloak") src.active=0 usr << "\blue You are now visible." for(var/mob/O in oviewers(usr, null)) @@ -316,14 +443,7 @@ NINJA MASK else spawn(0) - var/atom/movable/overlay/animation = new(usr.loc) - animation.icon = 'mob.dmi' - animation.icon_state = "blank" - animation.layer = usr.layer + 1 - animation.master = usr - flick("cloak", animation) - sleep(15) - del(animation) + anim(usr.loc,'mob.dmi',usr,"cloak") src.active=1 usr << "\blue You are now invisible to normal detection." for(var/mob/O in oviewers(usr, null)) @@ -335,13 +455,18 @@ NINJA MASK //Doesn't really make any sense /obj/item/clothing/suit/space/space_ninja/examine() ..() - if(src.active) - usr << "The CLOAK-tech device is active." - else - usr << "The CLOAK-tech device is offline." + if(src.initialize) + usr << "All systems operational. Current energy capacity: [src.charge]." + if(src.active) + usr << "The CLOAK-tech device is active." + else + usr << "The CLOAK-tech device is offline." +/obj/item/clothing/mask/gas/space_ninja/New() + src.verbs += /obj/item/clothing/mask/gas/space_ninja/proc/togglev + src.verbs += /obj/item/clothing/mask/gas/space_ninja/proc/switchm -/obj/item/clothing/mask/gas/space_ninja/verb/togglev() +/obj/item/clothing/mask/gas/space_ninja/proc/togglev() set name = "Toggle Voice" set desc = "Toggles the voice synthesizer on or off." set category = "Object" @@ -385,7 +510,7 @@ NINJA MASK usr << "The voice synthesizer is already deactivated." return -/obj/item/clothing/mask/gas/space_ninja/verb/switchm() +/obj/item/clothing/mask/gas/space_ninja/proc/switchm() set name = "Switch Mode" set desc = "Switches between Night Vision, Meson, or Thermal vision modes." set category = "Object" diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index b413f96b3e..f5d400425f 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -53,9 +53,14 @@ STUN BATON // BLADE -//Two procs to delete the item if dropped or thrown. //Most of the other special functions are handled in their own files. +/obj/item/weapon/blade/New() + src.spark_system = new /datum/effects/system/spark_spread + spark_system.set_up(5, 0, src) + spark_system.attach(src) + return + /obj/item/weapon/blade/dropped() del(src) return diff --git a/code/game/objects/secstorage/secstorage.dm b/code/game/objects/secstorage/secstorage.dm index 6681038558..686c20bbea 100644 --- a/code/game/objects/secstorage/secstorage.dm +++ b/code/game/objects/secstorage/secstorage.dm @@ -102,6 +102,11 @@ overlays += image('storage.dmi', icon_locking) locked = 0 if(istype(W, /obj/item/weapon/blade)) + var/datum/effects/system/spark_spread/spark_system = new /datum/effects/system/spark_spread() + spark_system.set_up(5, 0, src.loc) + spark_system.start() + playsound(src.loc, 'blade1.ogg', 50, 1) + playsound(src.loc, "sparks", 50, 1) user << "You slice through the lock on [src]." else user << "You short out the lock on [src]." diff --git a/code/game/objects/secure_closets.dm b/code/game/objects/secure_closets.dm index fb24cd56a9..169baa0bb7 100644 --- a/code/game/objects/secure_closets.dm +++ b/code/game/objects/secure_closets.dm @@ -172,6 +172,11 @@ src.locked = 0 src.icon_state = src.icon_broken if(istype(W, /obj/item/weapon/blade)) + var/datum/effects/system/spark_spread/spark_system = new /datum/effects/system/spark_spread() + spark_system.set_up(5, 0, src.loc) + spark_system.start() + playsound(src.loc, 'blade1.ogg', 50, 1) + playsound(src.loc, "sparks", 50, 1) for(var/mob/O in viewers(user, 3)) O.show_message(text("\blue The locker has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) else diff --git a/code/game/objects/storage/crates.dm b/code/game/objects/storage/crates.dm index f8961aa204..472c8459fe 100644 --- a/code/game/objects/storage/crates.dm +++ b/code/game/objects/storage/crates.dm @@ -252,7 +252,7 @@ overlays += emag overlays += sparks spawn(6) overlays -= sparks //Tried lots of stuff but nothing works right. so i have to use this *sadface* - playsound(src.loc, 'sparks4.ogg', 75, 1) + playsound(src.loc, "sparks", 60, 1) src.locked = 0 src.broken = 1 user << "\blue You unlock the [src]." diff --git a/code/game/objects/tables_racks.dm b/code/game/objects/tables_racks.dm index 3cf15f3c85..d03232cdc8 100644 --- a/code/game/objects/tables_racks.dm +++ b/code/game/objects/tables_racks.dm @@ -126,6 +126,11 @@ return if(istype(W, /obj/item/weapon/blade)) + var/datum/effects/system/spark_spread/spark_system = new /datum/effects/system/spark_spread() + spark_system.set_up(5, 0, src.loc) + spark_system.start() + playsound(src.loc, 'blade1.ogg', 50, 1) + playsound(src.loc, "sparks", 50, 1) for(var/mob/O in viewers(user, 4)) O.show_message(text("\blue The table was sliced apart by []!", user), 1, text("\red You hear metal coming apart."), 2) new /obj/item/weapon/table_parts( src.loc ) @@ -189,6 +194,11 @@ return if(istype(W, /obj/item/weapon/blade)) + var/datum/effects/system/spark_spread/spark_system = new /datum/effects/system/spark_spread() + spark_system.set_up(5, 0, src.loc) + spark_system.start() + playsound(src.loc, 'blade1.ogg', 50, 1) + playsound(src.loc, "sparks", 50, 1) for(var/mob/O in viewers(user, 4)) O.show_message(text("\blue The reinforced table was sliced apart by []!", user), 1, text("\red You hear metal coming apart."), 2) new /obj/item/weapon/table_parts/reinforced( src.loc ) diff --git a/code/game/turf.dm b/code/game/turf.dm index b0d5a380fe..39b70d042e 100644 --- a/code/game/turf.dm +++ b/code/game/turf.dm @@ -361,9 +361,18 @@ return else if(istype(W, /obj/item/weapon/blade)) - dismantle_wall(1) - for(var/mob/O in viewers(user, 5)) - O.show_message(text("\blue The wall was sliced through by []!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) + var/turf/T = user.loc + user << "\blue Now slicing through wall." + W:spark_system.start() + playsound(src.loc, "sparks", 50, 1) + sleep(70) + if ((user.loc == T && user.equipped() == W)) + W:spark_system.start() + playsound(src.loc, 'blade1.ogg', 50, 1) + playsound(src.loc, "sparks", 50, 1) + dismantle_wall(1) + for(var/mob/O in viewers(user, 5)) + O.show_message(text("\blue The wall was sliced apart by []!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) return else if(istype(W,/obj/item/apc_frame)) @@ -424,14 +433,8 @@ user << "\blue You removed the support rods." W:welding = 1 - if(istype(W, /obj/item/weapon/blade)) - var/turf/T = user.loc - user << "\blue Slicing through reinforced wall." - sleep(100) - if ((user.loc == T && user.equipped() == W)) - dismantle_wall(1) - for(var/mob/O in viewers(user, 5)) - O.show_message(text("\blue The reinforced wall was sliced through by []!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) + else if(istype(W, /obj/item/weapon/blade)) + user << "\blue This wall is too thick to slice through. You will need to find a different path." return else if (istype(W, /obj/item/weapon/wrench)) diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index 395dc6abff..1dc8b88160 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -176,7 +176,7 @@ Useful for copy pasta since I'm lazy.*/ set category = "Fun" set name = "Spawn Space Ninja" - set desc = "Spawns a space ninja for when you just need a teenager with attitude." + set desc = "Spawns a space ninja for when you need a teenager with attitude." if(!src.authenticated || !src.holder) src << "Only administrators may use this command." return @@ -249,24 +249,12 @@ Useful for copy pasta since I'm lazy.*/ new_ninja.internal = OXYTANK //So the poor ninja has something to breath when they spawn in spess. new_ninja.internals.icon_state = "internal1" - new_ninja << "\blue \nYou are an elite mercenary assassin of the Spider Clan. The dreaded \red SPACE NINJA!\blue You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor. Remember your training! \nYour current mission is: \red [input]" - - new_ninja.verbs += /mob/proc/ninjashift - new_ninja.verbs += /mob/proc/ninjajaunt - new_ninja.verbs += /mob/proc/ninjasmoke - new_ninja.verbs += /mob/proc/ninjapulse - new_ninja.verbs += /mob/proc/ninjablade - new_ninja.mind.special_verbs += /mob/proc/ninjashift - new_ninja.mind.special_verbs += /mob/proc/ninjajaunt - new_ninja.mind.special_verbs += /mob/proc/ninjasmoke - new_ninja.mind.special_verbs += /mob/proc/ninjapulse - new_ninja.mind.special_verbs += /mob/proc/ninjablade + new_ninja << "\blue \nYou are an elite mercenary assassin of the Spider Clan, [new_ninja.real_name]. The dreaded \red SPACE NINJA!\blue You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor. Remember your training (initialize your suit by right clicking on it)! \nYour current mission is: \red [input]" message_admins("\blue [admin_name] has spawned [new_ninja.key] as a Space Ninja. Hide yo children!", 1) log_admin("[admin_name] used Spawn Space Ninja.") - //SPACE NINJA ABILITIES /* @@ -306,6 +294,7 @@ Useful for copy pasta since I'm lazy.*/ var/datum/effects/system/bad_smoke_spread/smoke = new /datum/effects/system/bad_smoke_spread() smoke.set_up(10, 0, src.loc) smoke.start() + playsound(src.loc, 'bamf.ogg', 50, 2) //subtract cost(5) @@ -369,11 +358,17 @@ Useful for copy pasta since I'm lazy.*/ return picked = pick(turfs) spawn(0) + playsound(src.loc, "sparks", 50, 1) anim(mobloc,'mob.dmi',src,"phaseout") src.loc = picked spawn(0) + var/datum/effects/system/spark_spread/spark_system = new /datum/effects/system/spark_spread() + spark_system.set_up(5, 0, src.loc) + spark_system.start() + playsound(src.loc, 'Deconstruct.ogg', 50, 1) + playsound(src.loc, "sparks", 50, 1) anim(src.loc,'mob.dmi',src,"phasein") spawn(0) //Any living mobs in teleport area are gibbed. @@ -387,7 +382,7 @@ Useful for copy pasta since I'm lazy.*/ /mob/proc/ninjashift(var/turf/T in oview()) set name = "Phase Shift" 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 can still be right-clicked. + set category = null//So it does not show up on the panel but can still be right-clicked. if(src.stat) src << "\red You must be conscious to do this." @@ -401,11 +396,17 @@ Useful for copy pasta since I'm lazy.*/ var/turf/mobloc = get_turf(src.loc) spawn(0) + playsound(src.loc, 'sparks4.ogg', 50, 1) anim(mobloc,'mob.dmi',src,"phaseout") src.loc = T spawn(0) + var/datum/effects/system/spark_spread/spark_system = new /datum/effects/system/spark_spread() + spark_system.set_up(5, 0, src.loc) + spark_system.start() + playsound(src.loc, 'Deconstruct.ogg', 50, 1) + playsound(src.loc, 'sparks2.ogg', 50, 1) anim(src.loc,'mob.dmi',src,"phasein") spawn(0) //Any living mobs in teleport area are gibbed. @@ -447,6 +448,8 @@ Useful for copy pasta since I'm lazy.*/ if(!src.get_active_hand()&&!istype(src.get_inactive_hand(), /obj/item/weapon/blade)) var/obj/item/weapon/blade/W = new() + W.spark_system.start() + playsound(src.loc, "sparks", 50, 1) src.put_in_hand(W) /* /mob/proc/ninjastar(var/mob/living/M in oview()) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index c3aad767a4..90811f1409 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -11,7 +11,7 @@ emote("deathgasp") //let the world KNOW WE ARE DEAD //For ninjas exploding when they die./N - if (src.mind&&src.mind.special_role == "Space Ninja") + if (istype(src.wear_suit, /obj/item/clothing/suit/space/space_ninja)&&src.wear_suit:initialize) var/location = src.loc explosion(location, 1, 2, 3, 4) diff --git a/sound/weapons/blade1.ogg b/sound/weapons/blade1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b590ffc9fd176892bdd8c1f32127762324374120 GIT binary patch literal 22099 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�KmYDBfPaH_y!rc?uUeoRVYpncOHm3)Bx-vA1D@D(rzuBC(OLtHIe9P|NGr3J( z@6(~nu|Ge)IU;^9Z*hw6eJ|I~Q9a);JA6r7w^dSRQ`c~_kWXwn~wO8$*9RU_} z&k3h8ch_X?pFyZ9>t0WJK`90LN$DLWGFtTc$k{h>^v>pVv^n6NXNF%S6y-#@_NgJ; zd8p);%P`|%Zqt3G()|zjGcib!{j}6%N2|(m;bixKAj2NuG0*NGg7`Q92mqXf%h<9I zqSR-{kpTcBVQ{FG<7+_H`n(vF0tp}(Ac3rdY=8ks1pvNkd;|F$r4fqGHXnGTB^mvw1F(sfy7y_jlNSs6*snl$P2xaj4A@9 zqk~MG^b1X0&M3(Ec;yu%DH%C!fC|G7mjdzz7@|z1QaiTU1T&YJdL+OFZ^(*+j_{h6 z(Gx`xp5ZXC000JQpbF;9BNDku#YI_lH^$8MxZOV;+GI3$%v$_D>*qKUNZ+-wmpx>u z5C*^w{Qw1~^1zk98Z4m_x-myF?ySH_j=UJLmKI0AYQr4|*P=uO1C0VchSYbgy98Xy zBE%LdvE5;0D+x}ZJpo)G6;Ae3c-Yura-SW(wHbu`P^(J<000qa?rs0~u&!+1{JgE~-K}D5XT8n(p3#Rb_U4)n$#|s6HuX9qxm`F%{F(V`s5H}G zCwJjIav%w)2XJu9EMpkbi3Y?9khEo59?_$egF<>Qn}LR=-PDjU()(Q{N(WKNEF9hO zLXtU@qLO9$vt(Ae1$50yVX{U}I$>I*i#tuUb?T(2tz(sN2IKUi7>7r_ITtd%)>sLM z^6=BFq#qqjTa{o9tOJ+vs|L__v&*xS3F2&36l*x_4~g~U?_W=6XHx(LJ*EHv00000 zBq;y@2LJ#7cct1913dpg?*>FsBK0y-oS8B*lFDTmlm-kK9RtK$jCkN<>aC{9R8Ntq z-Cku8Q6Rwl)t!!tFakUA@q+;X45S(ao`ozAptl53gqOXyO^V5W7PFAzfj{Tip;pHL006LX!@1e(;Cr@b-E9 zScUF9OvyBJl7XyQRyC-aRre$SkuHo_2BOPT4OvuraaLLb8GyxrR5VLUsMm45s;V@r z6fWt8Jg;hGnFi=pOl80Ht_0G}^hB{TCTsHEx<9%nxE;k=c}8T!+hHzG6{#E`XNeQe z^z_Jpl|>XM006+-%vOx+rRjU$db0Xxh>FJF|9$uIR5n_l4HbnNDn09OW>}^y00#ho islx|vK3cdHE>?#@4GJR*umEJ*1{4NX3CLImKt=|DJH#^p literal 0 HcmV?d00001