initial commit - cross reference with 5th port - obviously has compile errors

This commit is contained in:
LetterJay
2016-07-03 02:17:19 -05:00
commit 35a1723e98
4355 changed files with 2221257 additions and 0 deletions
+87
View File
@@ -0,0 +1,87 @@
/*
Dear ninja gloves
This isn't because I like you
this is because your father is a bastard
...
I guess you're a little cool.
-Sayu
see ninjaDrainAct.dm for ninjadrain_act()
Touch() simply calls this on it's target now
Ninja's electricuting people when?
-Remie
*/
/obj/item/clothing/gloves/space_ninja
desc = "These nano-enhanced gloves insulate from electricity and provide fire resistance."
name = "ninja gloves"
icon_state = "s-ninja"
item_state = "s-ninja"
siemens_coefficient = 0
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
strip_delay = 120
var/draining = 0
var/candrain = 0
var/mindrain = 200
var/maxdrain = 400
/obj/item/clothing/gloves/space_ninja/Touch(atom/A,proximity)
if(!candrain || draining)
return 0
if(!istype(loc, /mob/living/carbon/human))
return 0 //Only works while worn
var/mob/living/carbon/human/H = loc
var/obj/item/clothing/suit/space/space_ninja/suit = H.wear_suit
if(!istype(suit))
return 0
if(isturf(A))
return 0
if(!proximity)
return 0
A.add_fingerprint(H)
draining = 1
var/drained = A.ninjadrain_act(suit,H,src)
draining = 0
if(isnum(drained)) //Numerical values of drained handle their feedback here, Alpha values handle it themselves (Research hacking)
if(drained)
H << "<span class='notice'>Gained <B>[drained]</B> energy from \the [A].</span>"
else
H << "<span class='danger'>\The [A] has run dry of power, you must find another source!</span>"
else
drained = 0 //as to not cancel attack_hand()
return drained
/obj/item/clothing/gloves/space_ninja/proc/toggled()
set name = "Toggle Interaction"
set desc = "Toggles special interaction on or off."
set category = "Ninja Equip"
var/mob/living/carbon/human/U = loc
U << "You <b>[candrain?"disable":"enable"]</b> special interaction."
candrain=!candrain
/obj/item/clothing/gloves/space_ninja/examine(mob/user)
..()
if(flags & NODROP)
user << "The energy drain mechanism is: <B>[candrain?"active":"inactive"]</B>."
+11
View File
@@ -0,0 +1,11 @@
/obj/item/clothing/head/helmet/space/space_ninja
desc = "What may appear to be a simple black garment is in fact a highly sophisticated nano-weave helmet. Standard issue ninja gear."
name = "ninja hood"
icon_state = "s-ninja"
item_state = "s-ninja_mask"
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 25)
strip_delay = 12
unacidable = 1
blockTracking = 1//Roughly the only unique thing about this helmet.
+18
View File
@@ -0,0 +1,18 @@
/*
Contents:
- The Ninja Space Mask
- Ninja Space Mask speech modification
*/
/obj/item/clothing/mask/gas/space_ninja
name = "ninja mask"
desc = "A close-fitting mask that acts both as an air filter and a post-modern fashion statement."
icon_state = "s-ninja"
item_state = "s-ninja_mask"
strip_delay = 120
@@ -0,0 +1,166 @@
/*
It will teleport people to a holding facility after 30 seconds. (Check the process() proc to change where teleport goes)
It is possible to destroy the net by the occupant or someone else.
*/
/obj/effect/energy_net
name = "energy net"
desc = "It's a net made of green energy."
icon = 'icons/effects/effects.dmi'
icon_state = "energynet"
density = 1//Can't pass through.
opacity = 0//Can see through.
mouse_opacity = 1//So you can hit it with stuff.
anchored = 1//Can't drag/grab the trapped mob.
layer = ABOVE_ALL_MOB_LAYER
var/health = 25//How much health it has.
var/mob/living/affecting = null//Who it is currently affecting, if anyone.
var/mob/living/master = null//Who shot web. Will let this person know if the net was successful or failed.
/obj/effect/energy_net/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
switch(damage_type)
if(BRUTE)
if(sound_effect)
playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
if(BURN)
if(sound_effect)
playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
else
return
health -= damage
if(health <=0)
qdel(src)
/obj/effect/energy_net/Destroy()
if(affecting)
var/mob/living/carbon/M = affecting
M.anchored = 0
for(var/mob/O in viewers(src, 3))
O.show_message("[M.name] was recovered from the energy net!", 1, "<span class='italics'>You hear a grunt.</span>", 2)
if(master)//As long as they still exist.
master << "<span class='userdanger'>ERROR</span>: unable to initiate transport protocol. Procedure terminated."
return ..()
/obj/effect/energy_net/process(mob/living/carbon/M)
var/check = 30//30 seconds before teleportation. Could be extended I guess.
var/mob_name = affecting.name//Since they will report as null if terminated before teleport.
//The person can still try and attack the net when inside.
M.notransform = 1 //No moving for you!
while(!isnull(M)&&!isnull(src)&&check>0)//While M and net exist, and 30 seconds have not passed.
check--
sleep(10)
if(isnull(M)||M.loc!=loc)//If mob is gone or not at the location.
if(!isnull(master))//As long as they still exist.
master << "<span class='userdanger'>ERROR</span>: unable to locate \the [mob_name]. Procedure terminated."
qdel(src)//Get rid of the net.
M.notransform = 0
return
if(!isnull(src))//As long as both net and person exist.
//No need to check for countdown here since while() broke, it's implicit that it finished.
density = 0//Make the net pass-through.
invisibility = INVISIBILITY_ABSTRACT//Make the net invisible so all the animations can play out.
health = INFINITY//Make the net invincible so that an explosion/something else won't kill it while, spawn() is running.
for(var/obj/item/W in M)
if(istype(M,/mob/living/carbon/human))
if(W==M:w_uniform)
continue//So all they're left with are shoes and uniform.
if(W==M:shoes)
continue
M.unEquip(W)
spawn(0)
playsound(M.loc, 'sound/effects/sparks4.ogg', 50, 1)
anim(M.loc,M,'icons/mob/mob.dmi',,"phaseout",,M.dir)
M.loc = pick(holdingfacility)//Throw mob in to the holding facility.
M << "<span class='danger'>You appear in a strange place!</span>"
spawn(0)
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, M.loc)
spark_system.start()
playsound(M.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(M.loc, 'sound/effects/sparks2.ogg', 50, 1)
anim(M.loc,M,'icons/mob/mob.dmi',,"phasein",,M.dir)
qdel(src)//Wait for everything to finish, delete the net. Else it will stop everything once net is deleted, including the spawn(0).
for(var/mob/O in viewers(src, 3))
O.show_message("[M] vanishes!", 1, "<span class='italics'>You hear sparks flying!</span>", 2)
if(!isnull(master))//As long as they still exist.
master << "<span class='notice'><b>SUCCESS</b>: transport procedure of \the [affecting] complete.</span>"
M.notransform = 0
else//And they are free.
M << "<span class='notice'>You are free of the net!</span>"
M.notransform = 0
return
/obj/effect/energy_net/bullet_act(obj/item/projectile/Proj)
. = ..()
take_damage(Proj.damage, Proj.damage_type)
/obj/effect/energy_net/ex_act(severity, target)
switch(severity)
if(1)
qdel(src)
if(2)
qdel(src)
if(3)
take_damage(rand(10,25), BRUTE, 0)
/obj/effect/energy_net/blob_act(obj/effect/blob/B)
qdel(src)
/obj/effect/energy_net/hitby(atom/movable/AM)
..()
var/tforce = 0
if(ismob(AM))
tforce = 10
else if(isobj(AM))
var/obj/O = AM
tforce = O.throwforce
take_damage(tforce)
/obj/effect/energy_net/attack_hulk(mob/living/carbon/human/user)
..(user, 1)
user.visible_message("<span class='danger'>[user] rips the energy net apart!</span>", \
"<span class='notice'>You easily destroy the energy net.</span>")
qdel(src)
/obj/effect/energy_net/attack_paw(mob/user)
return attack_hand()
/obj/effect/energy_net/attack_alien(mob/living/user)
user.do_attack_animation(src)
user.changeNext_move(CLICK_CD_MELEE)
playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
user.visible_message("<span class='danger'>[user] slices the energy net apart!</span>", \
"\green You slice the energy net to pieces.")
qdel(src)
/obj/effect/energy_net/attacked_by(obj/item/weapon/W, mob/user)
..()
take_damage(W.force, W.damtype)
@@ -0,0 +1,27 @@
//Wakes the user so they are able to do their thing. Also injects a decent dose of radium.
//Movement impairing would indicate drugs and the like.
/obj/item/clothing/suit/space/space_ninja/proc/ninjaboost()
set name = "Adrenaline Boost"
set desc = "Inject a secret chemical that will counteract all movement-impairing effect."
set category = "Ninja Ability"
set popup_menu = 0
if(!ninjacost(0,N_ADRENALINE))//Have to make sure stat is not counted for this ability.
var/mob/living/carbon/human/H = affecting
H.SetParalysis(0)
H.SetStunned(0)
H.SetWeakened(0)
spawn(30)//Slight delay so the enemy does not immedietly know the ability was used. Due to lag, this often came before waking up.
H.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"))
spawn(70)
if(reagents.total_volume)
var/fraction = min(a_transfer/reagents.total_volume, 1)
reagents.reaction(H, INJECT, fraction)
reagents.trans_id_to(H, "radium", a_transfer)
H << "<span class='danger'>You are beginning to feel the after-effect of the injection.</span>"
a_boost--
s_coold = 3
return
@@ -0,0 +1,29 @@
//Cost function for suit Procs/Verbs/Abilities
/obj/item/clothing/suit/space/space_ninja/proc/ninjacost(cost = 0, specificCheck = 0)
var/mob/living/carbon/human/H = affecting
if((H.stat || H.incorporeal_move) && (specificCheck != N_ADRENALINE))//Will not return if user is using an adrenaline booster since you can use them when stat==1.
H << "<span class='danger'>You must be conscious and solid to do this.</span>"//It's not a problem of stat==2 since the ninja will explode anyway if they die.
return 1
var/actualCost = cost*10
if(cost && cell.charge < actualCost)
H << "<span class='danger'>Not enough energy.</span>"
return 1
else
//This shit used to be handled individually on every proc.. why even bother with a universal check proc then?
cell.charge-=(actualCost)
switch(specificCheck)
if(N_STEALTH_CANCEL)
cancel_stealth()//Get rid of it.
if(N_SMOKE_BOMB)
if(!s_bombs)
H << "<span class='danger'>There are no more smoke bombs remaining.</span>"
return 1
if(N_ADRENALINE)
if(!a_boost)
H << "<span class='danger'>You do not have any more adrenaline boosters.</span>"
return 1
return (s_coold)//Returns the value of the variable which counts down to zero.
@@ -0,0 +1,15 @@
//Disables nearby tech equipment.
/obj/item/clothing/suit/space/space_ninja/proc/ninjapulse()
set name = "EM Burst (25E)"
set desc = "Disable any nearby technology with a electro-magnetic pulse."
set category = "Ninja Ability"
set popup_menu = 0
if(!ninjacost(250,N_STEALTH_CANCEL))
var/mob/living/carbon/human/H = affecting
playsound(H.loc, 'sound/effects/EMPulse.ogg', 60, 2)
empulse(H, 4, 6) //Procs sure are nice. Slightly weaker than wizard's disable tch.
s_coold = 2
return
@@ -0,0 +1,30 @@
//Allows the ninja to kidnap people
/obj/item/clothing/suit/space/space_ninja/proc/ninjanet(mob/living/carbon/C in oview())//Only living carbon mobs.
set name = "Energy Net (20E)"
set desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds."
set category = null
set src = usr.contents
if(!ninjacost(200,N_STEALTH_CANCEL) && iscarbon(C))
var/mob/living/carbon/human/H = affecting
if(C.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
if(!locate(/obj/effect/energy_net) in C.loc)//Check if they are already being affected by an energy net.
for(var/turf/T in getline(H.loc, C.loc))
if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
H << "<span class='warning'>You may not use an energy net through solid obstacles!</span>"
return
spawn(0)
H.Beam(C,"n_beam",,15)
H.say("Get over here!")
var/obj/effect/energy_net/E = new /obj/effect/energy_net(C.loc)
H.visible_message("<span class='danger'>[H] caught [C] with an energy net!</span>","<span class='notice'>You caught [C] with an energy net!</span>")
E.affecting = C
E.master = H
spawn(0)//Parallel processing.
E.process(C)
else
H << "<span class='warning'>They are already trapped inside an energy net!</span>"
else
H << "<span class='warning'>They will bring no honor to your Clan!</span>"
return
@@ -0,0 +1,19 @@
//Smoke bomb
/obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke()
set name = "Smoke Bomb"
set desc = "Blind your enemies momentarily with a well-placed smoke bomb."
set category = "Ninja Ability"
set popup_menu = 0//Will not see it when right clicking.
if(!ninjacost(0,N_SMOKE_BOMB))
var/mob/living/carbon/human/H = affecting
var/datum/effect_system/smoke_spread/bad/smoke = new
smoke.set_up(4, H.loc)
smoke.start()
playsound(H.loc, 'sound/effects/bamf.ogg', 50, 2)
s_bombs--
H << "<span class='notice'>There are <B>[s_bombs]</B> smoke bombs remaining.</span>"
s_coold = 1
return
@@ -0,0 +1,23 @@
//Creates a throwing star
/obj/item/clothing/suit/space/space_ninja/proc/ninjastar()
set name = "Create Throwing Stars (1E)"
set desc = "Creates some throwing stars"
set category = "Ninja Ability"
set popup_menu = 0
if(!ninjacost(10))
var/mob/living/carbon/human/H = affecting
var/slot = H.hand ? slot_l_hand : slot_r_hand
if(H.equip_to_slot_or_del(new /obj/item/weapon/throwing_star/ninja(H), slot))
H << "<span class='notice'>A throwing star has been created in your hand!</span>"
H.throw_mode_on() //So they can quickly throw it.
/obj/item/weapon/throwing_star/ninja
name = "ninja throwing star"
throwforce = 30
embedded_pain_multiplier = 6
@@ -0,0 +1,49 @@
/*
Contents:
- Stealth Verbs
*/
/obj/item/clothing/suit/space/space_ninja/proc/toggle_stealth()
var/mob/living/carbon/human/U = affecting
if(!U)
return
if(s_active)
cancel_stealth()
else
if(cell.charge <= 0)
U << "<span class='warning'>You don't have enough power to enable Stealth!</span>"
return
s_active=!s_active
animate(U, alpha = 0,time = 15)
U.visible_message("<span class='warning'>[U.name] vanishes into thin air!</span>", \
"<span class='notice'>You are now invisible to normal detection.</span>")
return
/obj/item/clothing/suit/space/space_ninja/proc/cancel_stealth()
var/mob/living/carbon/human/U = affecting
if(!U)
return 0
if(s_active)
s_active=!s_active
animate(U, alpha = 255, time = 15)
U.visible_message("<span class='warning'>[U.name] appears from thin air!</span>", \
"<span class='notice'>You are now visible.</span>")
return 1
return 0
/obj/item/clothing/suit/space/space_ninja/proc/stealth()
set name = "Toggle Stealth"
set desc = "Utilize the internal CLOAK-tech device to activate or deactivate stealth-camo."
set category = "Ninja Equip"
if(!s_busy)
toggle_stealth()
else
affecting << "<span class='danger'>Stealth does not appear to work!</span>"
@@ -0,0 +1,48 @@
/obj/item/clothing/suit/space/space_ninja/proc/ninja_sword_recall()
set name = "Recall Energy Katana (Variable Cost)"
set desc = "Teleports the Energy Katana linked to this suit to it's wearer, cost based on distance."
set category = "Ninja Ability"
set popup_menu = 0
var/mob/living/carbon/human/H = affecting
var/cost = 0
var/inview = 1
if(!energyKatana)
H << "<span class='warning'>Could not locate Energy Katana!</span>"
return
if(energyKatana in H)
return
var/distance = get_dist(H,energyKatana)
if(!(energyKatana in view(H)))
cost = distance //Actual cost is cost x 10, so 5 turfs is 50 cost.
inview = 0
if(!ninjacost(cost))
if(istype(energyKatana.loc, /mob/living/carbon))
var/mob/living/carbon/C = energyKatana.loc
C.unEquip(energyKatana)
//Somebody swollowed my sword, probably the clown doing a circus act.
if(energyKatana in C.stomach_contents)
C.stomach_contents -= energyKatana
if(energyKatana in C.internal_organs)
C.internal_organs -= energyKatana
energyKatana.loc = get_turf(energyKatana)
if(inview) //If we can see the katana, throw it towards ourselves, damaging people as we go.
energyKatana.spark_system.start()
playsound(H, "sparks", 50, 1)
H.visible_message("<span class='danger'>\the [energyKatana] flies towards [H]!</span>","<span class='warning'>You hold out your hand and \the [energyKatana] flies towards you!</span>")
energyKatana.throw_at(H, distance+1, energyKatana.throw_speed,H)
else //Else just TP it to us.
energyKatana.returnToOwner(H,1)
@@ -0,0 +1,87 @@
/*
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 && (istype(H.pulling, /mob/living)))
var/mob/living/victim = H.pulling
if(!victim.anchored)
victim.forceMove(locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z))
return
//Jaunt
/obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt()
set name = "Phase Jaunt (10E)"
set desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing."
set category = "Ninja Ability"
set popup_menu = 0
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&&istype(mobloc, /turf))//So we don't teleport out of containers
spawn(0)
playsound(H.loc, "sparks", 50, 1)
anim(mobloc,src,'icons/mob/mob.dmi',,"phaseout",,H.dir)
handle_teleport_grab(destination, H)
H.loc = destination
spawn(0)
spark_system.start()
playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(H.loc, "sparks", 50, 1)
anim(H.loc,H,'icons/mob/mob.dmi',,"phasein",,H.dir)
spawn(0)
destination.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf
s_coold = 1
else
H << "<span class='danger'>The VOID-shift device is malfunctioning, <B>teleportation failed</B>.</span>"
return
//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)&&istype(mobloc, /turf))
spawn(0)
playsound(H.loc, 'sound/effects/sparks4.ogg', 50, 1)
anim(mobloc,src,'icons/mob/mob.dmi',,"phaseout",,H.dir)
handle_teleport_grab(T, H)
H.loc = T
spawn(0)
spark_system.start()
playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1)
anim(H.loc,H,'icons/mob/mob.dmi',,"phasein",,H.dir)
spawn(0)//Any living mobs in teleport area are gibbed.
T.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf
s_coold = 1
else
H << "<span class='danger'>You cannot teleport into solid walls or from solid matter</span>"
return
+285
View File
@@ -0,0 +1,285 @@
/*
Contents:
- Assorted ninjadrain_act() procs
- What is Object Oriented Programming
They *could* go in their appropriate files, but this is supposed to be modular
*/
//Needs to return the amount drained from the atom, if no drain on a power object, return 0, otherwise, return a define.
/atom/proc/ninjadrain_act()
return INVALID_DRAIN
//APC//
/obj/machinery/power/apc/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
var/maxcapacity = 0 //Safety check for batteries
var/drain = 0 //Drain amount from batteries
. = 0
if(cell && cell.charge)
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, loc)
while(G.candrain && cell.charge> 0 && !maxcapacity)
drain = rand(G.mindrain, G.maxdrain)
if(cell.charge < drain)
drain = cell.charge
if(S.cell.charge + drain > S.cell.maxcharge)
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1//Reached maximum battery capacity.
if (do_after(H,10, target = src))
spark_system.start()
playsound(loc, "sparks", 50, 1)
cell.charge -= drain
S.cell.charge += drain
. += drain
else
break
if(!emagged)
flick("apc-spark", G)
emagged = 1
locked = 0
update_icon()
//SMES//
/obj/machinery/power/smes/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
var/maxcapacity = 0 //Safety check for batteries
var/drain = 0 //Drain amount from batteries
. = 0
if(charge)
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, loc)
while(G.candrain && charge > 0 && !maxcapacity)
drain = rand(G.mindrain, G.maxdrain)
if(charge < drain)
drain = charge
if(S.cell.charge + drain > S.cell.maxcharge)
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1
if (do_after(H,10, target = src))
spark_system.start()
playsound(loc, "sparks", 50, 1)
charge -= drain
S.cell.charge += drain
. += drain
else
break
//CELL//
/obj/item/weapon/stock_parts/cell/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
. = 0
if(charge)
if(G.candrain && do_after(H,30, target = src))
. = charge
if(S.cell.charge + charge > S.cell.maxcharge)
S.cell.charge = S.cell.maxcharge
else
S.cell.charge += charge
charge = 0
corrupt()
updateicon()
//RDCONSOLE//
/obj/machinery/computer/rdconsole/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
. = DRAIN_RD_HACK_FAILED
H << "<span class='notice'>Hacking \the [src]...</span>"
spawn(0)
var/turf/location = get_turf(H)
for(var/mob/living/silicon/ai/AI in player_list)
AI << "<span class='userdanger'>Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]</span>."
if(files && files.known_tech.len)
for(var/datum/tech/current_data in S.stored_research)
H << "<span class='notice'>Checking \the [current_data.name] database.</span>"
if(do_after(H, S.s_delay, target = src) && G.candrain && src)
for(var/datum/tech/analyzing_data in files.known_tech)
if(current_data.id == analyzing_data.id)
if(analyzing_data.level > current_data.level)
H << "<span class='notice'>Database:</span> <b>UPDATED</b>."
current_data.level = analyzing_data.level
. = DRAIN_RD_HACKED
break//Move on to next.
else
break//Otherwise, quit processing.
H << "<span class='notice'>Data analyzed. Process finished.</span>"
//RD SERVER//
//Shamelessly copypasted from above, since these two used to be the same proc, but with MANY colon operators
/obj/machinery/r_n_d/server/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
. = DRAIN_RD_HACK_FAILED
H << "<span class='notice'>Hacking \the [src]...</span>"
spawn(0)
var/turf/location = get_turf(H)
for(var/mob/living/silicon/ai/AI in player_list)
AI << "<span class='userdanger'>Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]</span>."
if(files && files.known_tech.len)
for(var/datum/tech/current_data in S.stored_research)
H << "<span class='notice'>Checking \the [current_data.name] database.</span>"
if(do_after(H, S.s_delay, target = src) && G.candrain && src)
for(var/datum/tech/analyzing_data in files.known_tech)
if(current_data.id == analyzing_data.id)
if(analyzing_data.level > current_data.level)
H << "<span class='notice'>Database:</span> <b>UPDATED</b>."
current_data.level = analyzing_data.level
. = DRAIN_RD_HACKED
break//Move on to next.
else
break//Otherwise, quit processing.
H << "<span class='notice'>Data analyzed. Process finished.</span>"
//WIRE//
/obj/structure/cable/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
var/maxcapacity = 0 //Safety check
var/drain = 0 //Drain amount
. = 0
var/datum/powernet/PN = powernet
while(G.candrain && !maxcapacity && src)
drain = (round((rand(G.mindrain, G.maxdrain))/2))
var/drained = 0
if(PN && do_after(H,10, target = src))
drained = min(drain, PN.avail)
PN.load += drained
if(drained < drain)//if no power on net, drain apcs
for(var/obj/machinery/power/terminal/T in PN.nodes)
if(istype(T.master, /obj/machinery/power/apc))
var/obj/machinery/power/apc/AP = T.master
if(AP.operating && AP.cell && AP.cell.charge > 0)
AP.cell.charge = max(0, AP.cell.charge - 5)
drained += 5
else
break
S.cell.charge += drained
if(S.cell.charge > S.cell.maxcharge)
. += (drained-(S.cell.charge - S.cell.maxcharge))
S.cell.charge = S.cell.maxcharge
maxcapacity = 1
else
. += drained
S.spark_system.start()
//MECH//
/obj/mecha/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
var/maxcapacity = 0 //Safety check
var/drain = 0 //Drain amount
. = 0
occupant_message("<span class='danger'>Warning: Unauthorized access through sub-route 4, block H, detected.</span>")
if(get_charge())
while(G.candrain && cell.charge > 0 && !maxcapacity)
drain = rand(G.mindrain,G.maxdrain)
if(cell.charge < drain)
drain = cell.charge
if(S.cell.charge + drain > S.cell.maxcharge)
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1
if (do_after(H,10, target = src))
spark_system.start()
playsound(loc, "sparks", 50, 1)
cell.use(drain)
S.cell.charge += drain
. += drain
else
break
//BORG//
/mob/living/silicon/robot/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
var/maxcapacity = 0 //Safety check
var/drain = 0 //Drain amount
. = 0
src << "<span class='danger'>Warning: Unauthorized access through sub-route 12, block C, detected.</span>"
if(cell && cell.charge)
while(G.candrain && cell.charge > 0 && !maxcapacity)
drain = rand(G.mindrain,G.maxdrain)
if(cell.charge < drain)
drain = cell.charge
if(S.cell.charge+drain > S.cell.maxcharge)
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1
if (do_after(H,10))
spark_system.start()
playsound(loc, "sparks", 50, 1)
cell.charge -= drain
S.cell.charge += drain
. += drain
else
break
//CARBON MOBS//
/mob/living/carbon/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/S, mob/living/carbon/human/H, obj/item/clothing/gloves/space_ninja/G)
if(!S || !H || !G)
return INVALID_DRAIN
. = DRAIN_MOB_SHOCK_FAILED
//Default cell = 10,000 charge, 10,000/1000 = 10 uses without charging/upgrading
if(S.cell && S.cell.charge && S.cell.use(1000))
. = DRAIN_MOB_SHOCK
//Got that electric touch
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, loc)
playsound(src, "sparks", 50, 1)
visible_message("<span class='danger'>[H] electrocutes [src] with their touch!</span>", "<span class='userdanger'>[H] electrocutes you with their touch!</span>")
electrocute_act(25, H)
+14
View File
@@ -0,0 +1,14 @@
/obj/item/clothing/shoes/space_ninja
name = "ninja shoes"
desc = "A pair of running shoes. Excellent for running and even better for smashing skulls."
icon_state = "s-ninja"
item_state = "secshoes"
permeability_coefficient = 0.01
flags = NOSLIP
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
strip_delay = 120
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
heat_protection = FEET
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
+174
View File
@@ -0,0 +1,174 @@
/*
Contents:
- The Ninja Space Suit
- Ninja Space Suit Procs
*/
// /obj/item/clothing/suit/space/space_ninja
/obj/item/clothing/suit/space/space_ninja
name = "ninja suit"
desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins."
icon_state = "s-ninja"
item_state = "s-ninja_suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/stock_parts/cell)
slowdown = 0
unacidable = 1
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
strip_delay = 12
//Important parts of the suit.
var/mob/living/carbon/human/affecting = null
var/obj/item/weapon/stock_parts/cell/cell
var/datum/effect_system/spark_spread/spark_system
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)
//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
var/obj/item/clothing/shoes/space_ninja/n_shoes
var/obj/item/clothing/gloves/space_ninja/n_gloves
//Main function variables.
var/s_initialized = 0//Suit starts off.
var/s_coold = 0//If the suit is on cooldown. Can be used to attach different cooldowns to abilities. Ticks down every second based on suit ntick().
var/s_cost = 5//Base energy cost each ntick.
var/s_acost = 25//Additional cost for additional powers active.
var/s_delay = 40//How fast the suit does certain things, lower is faster. Can be overridden in specific procs. Also determines adverse probability.
var/a_transfer = 20//How much reagent is transferred when injecting.
var/r_maxamount = 80//How much reagent in total there is.
//Support function variables.
var/spideros = 0//Mode of SpiderOS. This can change so I won't bother listing the modes here (0 is hub). Check ninja_equipment.dm for how it all works.
var/s_active = 0//Stealth off.
var/s_busy = 0//Is the suit busy with a process? Like AI hacking. Used for safety functions.
//Ability function variables.
var/s_bombs = 10//Number of starting ninja smoke bombs.
var/a_boost = 3//Number of adrenaline boosters.
/obj/item/clothing/suit/space/space_ninja/New()
..()
verbs += /obj/item/clothing/suit/space/space_ninja/proc/init//suit initialize verb
//Spark Init
spark_system = new()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
//Research Init
stored_research = new()
for(var/T in subtypesof(/datum/tech))//Store up on research.
stored_research += new T(src)
//Reagent Init
var/reagent_amount
for(var/reagent_id in reagent_list)
reagent_amount += reagent_id == "radium" ? r_maxamount+(a_boost*a_transfer) : r_maxamount
reagents = new(reagent_amount)
reagents.my_atom = src
for(var/reagent_id in reagent_list)
reagent_id == "radium" ? reagents.add_reagent(reagent_id, r_maxamount+(a_boost*a_transfer)) : reagents.add_reagent(reagent_id, r_maxamount)//It will take into account radium used for adrenaline boosting.
//Cell Init
cell = new/obj/item/weapon/stock_parts/cell/high
cell.charge = 9000
cell.name = "black power cell"
cell.icon_state = "bscell"
/obj/item/clothing/suit/space/space_ninja/Destroy()
if(affecting)
affecting << browse(null, "window=hack spideros")
return ..()
//Simply deletes all the attachments and self, killing all related procs.
/obj/item/clothing/suit/space/space_ninja/proc/terminate()
qdel(n_hood)
qdel(n_gloves)
qdel(n_shoes)
qdel(src)
//Randomizes suit parameters.
/obj/item/clothing/suit/space/space_ninja/proc/randomize_param()
s_cost = rand(1,20)
s_acost = rand(20,100)
s_delay = rand(10,100)
s_bombs = rand(5,20)
a_boost = rand(1,7)
//This proc prevents the suit from being taken off.
/obj/item/clothing/suit/space/space_ninja/proc/lock_suit(mob/living/carbon/human/H, checkIcons = 0)
if(!istype(H))
return 0
if(checkIcons)
icon_state = H.gender==FEMALE ? "s-ninjanf" : "s-ninjan"
H.gloves.icon_state = "s-ninjan"
H.gloves.item_state = "s-ninjan"
else
if(H.mind.special_role!="Space Ninja")
H << "\red <B>fÄTaL ÈÈRRoR</B>: 382200-*#00CÖDE <B>RED</B>\nUNAU†HORIZED USÈ DETÈC†††eD\nCoMMÈNCING SUB-R0U†IN3 13...\nTÈRMInATING U-U-USÈR..."
H.gib()
return 0
if(!istype(H.head, /obj/item/clothing/head/helmet/space/space_ninja))
H << "<span class='userdanger'>ERROR</span>: 100113 UNABLE TO LOCATE HEAD GEAR\nABORTING..."
return 0
if(!istype(H.shoes, /obj/item/clothing/shoes/space_ninja))
H << "<span class='userdanger'>ERROR</span>: 122011 UNABLE TO LOCATE FOOT GEAR\nABORTING..."
return 0
if(!istype(H.gloves, /obj/item/clothing/gloves/space_ninja))
H << "<span class='userdanger'>ERROR</span>: 110223 UNABLE TO LOCATE HAND GEAR\nABORTING..."
return 0
affecting = H
flags |= NODROP //colons make me go all |=
slowdown = 0
n_hood = H.head
n_hood.flags |= NODROP
n_shoes = H.shoes
n_shoes.flags |= NODROP
n_shoes.slowdown--
n_gloves = H.gloves
n_gloves.flags |= NODROP
return 1
//This proc allows the suit to be taken off.
/obj/item/clothing/suit/space/space_ninja/proc/unlock_suit()
affecting = null
flags &= ~NODROP
slowdown = 1
icon_state = "s-ninja"
if(n_hood)//Should be attached, might not be attached.
n_hood.flags &= ~NODROP
if(n_shoes)
n_shoes.flags &= ~NODROP
n_shoes.slowdown++
if(n_gloves)
n_gloves.icon_state = "s-ninja"
n_gloves.item_state = "s-ninja"
n_gloves.flags &= ~NODROP
n_gloves.candrain=0
n_gloves.draining=0
/obj/item/clothing/suit/space/space_ninja/examine(mob/user)
..()
if(s_initialized)
if(user == affecting)
user << "All systems operational. Current energy capacity: <B>[cell.charge]</B>."
user << "The CLOAK-tech device is <B>[s_active?"active":"inactive"]</B>."
user << "There are <B>[s_bombs]</B> smoke bomb\s remaining."
user << "There are <B>[a_boost]</B> adrenaline booster\s remaining."
+61
View File
@@ -0,0 +1,61 @@
/obj/item/clothing/suit/space/space_ninja/attackby(obj/item/I, mob/U, params)
if(U==affecting)//Safety, in case you try doing this without wearing the suit/being the person with the suit.
if(istype(I, /obj/item/weapon/reagent_containers/glass))//If it's a glass beaker.
var/total_reagent_transfer//Keep track of this stuff.
for(var/reagent_id in reagent_list)
var/datum/reagent/R = I.reagents.has_reagent(reagent_id)//Mostly to pull up the name of the reagent after calculating. Also easier to use than writing long proc paths.
if(R&&reagents.get_reagent_amount(reagent_id)<r_maxamount+(reagent_id == "radium"?(a_boost*a_transfer):0)&&R.volume>=a_transfer)//Radium is always special.
//Here we determine how much reagent will actually transfer if there is enough to transfer or there is a need of transfer. Minimum of max amount available (using a_transfer) or amount needed.
var/amount_to_transfer = min( (r_maxamount+(reagent_id == "radium"?(a_boost*a_transfer):0)-reagents.get_reagent_amount(reagent_id)) ,(round(R.volume/a_transfer))*a_transfer)//In the end here, we round the amount available, then multiply it again.
R.volume -= amount_to_transfer//Remove from reagent volume. Don't want to delete the reagent now since we need to perserve the name.
reagents.add_reagent(reagent_id, amount_to_transfer)//Add to suit. Reactions are not important.
total_reagent_transfer += amount_to_transfer//Add to total reagent trans.
U << "Added [amount_to_transfer] units of [R.name]."//Reports on the specific reagent added.
I.reagents.update_total()//Now we manually update the total to make sure everything is properly shoved under the rug.
U << "Replenished a total of [total_reagent_transfer ? total_reagent_transfer : "zero"] chemical units."//Let the player know how much total volume was added.
return
else if(istype(I, /obj/item/weapon/stock_parts/cell))
var/obj/item/weapon/stock_parts/cell/CELL = I
if(CELL.maxcharge > cell.maxcharge && n_gloves && n_gloves.candrain)
U << "<span class='notice'>Higher maximum capacity detected.\nUpgrading...</span>"
if (n_gloves && n_gloves.candrain && do_after(U,s_delay, target = src))
U.drop_item()
CELL.loc = src
CELL.charge = min(CELL.charge+cell.charge, CELL.maxcharge)
var/obj/item/weapon/stock_parts/cell/old_cell = cell
old_cell.charge = 0
U.put_in_hands(old_cell)
old_cell.add_fingerprint(U)
old_cell.corrupt()
old_cell.updateicon()
cell = CELL
U << "<span class='notice'>Upgrade complete. Maximum capacity: <b>[round(cell.maxcharge/100)]</b>%</span>"
else
U << "<span class='danger'>Procedure interrupted. Protocol terminated.</span>"
return
else if(istype(I, /obj/item/weapon/disk/tech_disk))//If it's a data disk, we want to copy the research on to the suit.
var/obj/item/weapon/disk/tech_disk/TD = I
if(TD.stored)//If it has something on it.
U << "Research information detected, processing..."
if(do_after(U,s_delay, target = src))
for(var/datum/tech/current_data in stored_research)
if(current_data.id==TD.stored.id)
if(current_data.level<TD.stored.level)
current_data.level=TD.stored.level
break
TD.stored = null
U << "<span class='notice'>Data analyzed and updated. Disk erased.</span>"
else
U << "<span class='userdanger'>ERROR</span>: Procedure interrupted. Process terminated."
else
I.loc = src
t_disk = I
U << "<span class='notice'>You slot \the [I] into \the [src].</span>"
return
..()
@@ -0,0 +1,102 @@
//Verbs link to procs because verb-like procs have a bug which prevents their use if the arguments are not readily referenced.
//^ Old coder words may be false these days, Not taking the risk for now.
/obj/item/clothing/suit/space/space_ninja/proc/init()
set name = "Initialize Suit"
set desc = "Initializes the suit for field operation."
set category = "Ninja Equip"
ninitialize()
/obj/item/clothing/suit/space/space_ninja/proc/deinit()
set name = "De-Initialize Suit"
set desc = "Begins procedure to remove the suit."
set category = "Ninja Equip"
if(!s_busy)
deinitialize()
else
affecting << "<span class='danger'>The function did not trigger!</span>"
/obj/item/clothing/suit/space/space_ninja/proc/ninitialize(delay = s_delay, mob/living/carbon/human/U = loc)
if(U.mind && U.mind.assigned_role==U.mind.special_role && !s_initialized && !s_busy)//Shouldn't be busy... but anything is possible I guess.
s_busy = 1
for(var/i,i<7,i++)
switch(i)
if(0)
U << "<span class='notice'>Now initializing...</span>"
if(1)
if(!lock_suit(U))//To lock the suit onto wearer.
break
U << "<span class='notice'>Securing external locking mechanism...\nNeural-net established.</span>"
if(2)
U << "<span class='notice'>Extending neural-net interface...\nNow monitoring brain wave pattern...</span>"
if(3)
if(U.stat==2||U.health<=0)
U << "<span class='danger'><B>FĆAL �Rr�R</B>: 344--93#�&&21 BR��N |/|/aV� PATT$RN <B>RED</B>\nA-A-aB�rT�NG...</span>"
unlock_suit()
break
lock_suit(U,1)//Check for icons.
U.regenerate_icons()
U << "<span class='notice'>Linking neural-net interface...\nPattern</span>\green <B>GREEN</B><span class='notice'>, continuing operation.</span>"
if(4)
U << "<span class='notice'>VOID-shift device status: <B>ONLINE</B>.\nCLOAK-tech device status: <B>ONLINE</B>.</span>"
if(5)
U << "<span class='notice'>Primary system status: <B>ONLINE</B>.\nBackup system status: <B>ONLINE</B>.\nCurrent energy capacity: <B>[cell.charge]</B>.</span>"
if(6)
U << "<span class='notice'>All systems operational. Welcome to <B>SpiderOS</B>, [U.real_name].</span>"
grant_ninja_verbs()
grant_equip_verbs()
ntick()
sleep(delay)
s_busy = 0
else
if(!U.mind||U.mind.assigned_role!=U.mind.special_role)//Your run of the mill persons shouldn't know what it is. Or how to turn it on.
U << "You do not understand how this suit functions. Where the heck did it even come from?"
else if(s_initialized)
U << "<span class='danger'>The suit is already functioning.</span> Please report this bug."
else
U << "<span class='userdanger'>ERROR</span>: You cannot use this function at this time."
return
/obj/item/clothing/suit/space/space_ninja/proc/deinitialize(delay = s_delay)
if(affecting==loc&&!s_busy)
var/mob/living/carbon/human/U = affecting
if(!s_initialized)
U << "<span class='danger'>The suit is not initialized.</span> Please report this bug."
return
if(alert("Are you certain you wish to remove the suit? This will take time and remove all abilities.",,"Yes","No")=="No")
return
if(s_busy)
U << "<span class='userdanger'>ERROR</span>: You cannot use this function at this time."
return
s_busy = 1
for(var/i = 0,i<7,i++)
switch(i)
if(0)
U << "<span class='notice'>Now de-initializing...</span>"
spideros = 0//Spideros resets.
if(1)
U << "<span class='notice'>Logging off, [U:real_name]. Shutting down <B>SpiderOS</B>.</span>"
remove_ninja_verbs()
if(2)
U << "<span class='notice'>Primary system status: <B>OFFLINE</B>.\nBackup system status: <B>OFFLINE</B>.</span>"
if(3)
U << "<span class='notice'>VOID-shift device status: <B>OFFLINE</B>.\nCLOAK-tech device status: <B>OFFLINE</B>.</span>"
cancel_stealth()//Shutdowns stealth.
if(4)
U << "<span class='notice'>Disconnecting neural-net interface...</span>\green<B>Success</B><span class='notice'>.</span>"
if(5)
U << "<span class='notice'>Disengaging neural-net interface...</span>\green<B>Success</B><span class='notice'>.</span>"
if(6)
U << "<span class='notice'>Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: <B>FINISHED</B>.</span>"
remove_equip_verbs()
unlock_suit()
U.regenerate_icons()
sleep(delay)
s_busy = 0
return
+24
View File
@@ -0,0 +1,24 @@
/obj/item/clothing/suit/space/space_ninja/proc/ntick(mob/living/carbon/human/U = affecting)
set background = BACKGROUND_ENABLED
//Runs in the background while the suit is initialized.
//Requires charge or stealth to process.
spawn while(s_initialized)
if(!affecting)
terminate()//Kills the suit and attached objects.
else if(cell.charge > 0)
if(s_coold)
s_coold--//Checks for ability s_cooldown first.
cell.charge -= s_cost//s_cost is the default energy cost each ntick, usually 5.
if(s_active)//If stealth is active.
cell.charge -= s_acost
else
cell.charge = 0
cancel_stealth()
sleep(10)//Checks every second.
@@ -0,0 +1,52 @@
/*
Contents:
- Procs that add ninja verbs to ninjas
- Procs that remove ninja verbs from ninjas
- Procs that add ninjasuit verbs to ninjas
- Procs that remove ninjasuit verbs from ninjas
*/
/obj/item/clothing/suit/space/space_ninja/proc/grant_equip_verbs()
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/init
verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit
verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth
n_gloves.verbs += /obj/item/clothing/gloves/space_ninja/proc/toggled
s_initialized = 1
/obj/item/clothing/suit/space/space_ninja/proc/remove_equip_verbs()
verbs += /obj/item/clothing/suit/space/space_ninja/proc/init
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/deinit
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/stealth
if(n_gloves)
n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled
s_initialized = 0
/obj/item/clothing/suit/space/space_ninja/proc/grant_ninja_verbs()
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninja_sword_recall
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
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninja_sword_recall