diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
index d8d5484ff5..b29d933866 100644
--- a/code/__DEFINES/antagonists.dm
+++ b/code/__DEFINES/antagonists.dm
@@ -2,4 +2,7 @@
#define ANTAG_DATUM_CULT_MASTER /datum/antagonist/cult/master
#define ANTAG_DATUM_CLOCKCULT /datum/antagonist/clockcult
#define ANTAG_DATUM_CLOCKCULT_SILENT /datum/antagonist/clockcult/silent
-#define ANTAG_DATUM_DEVIL /datum/antagonist/devil
\ No newline at end of file
+#define ANTAG_DATUM_DEVIL /datum/antagonist/devil
+#define ANTAG_DATUM_NINJA /datum/antagonist/ninja
+#define ANTAG_DATUM_NINJA_FRIENDLY /datum/antagonist/ninja/friendly
+#define ANTAG_DATUM_NINJA_RANDOM /datum/antagonist/ninja/randomAllegiance/
\ No newline at end of file
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 5a397fe3bd..ba3dc04f56 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -358,6 +358,59 @@
active = FALSE
..()
+/datum/action/item_action/initialize_ninja_suit
+ name = "Toggle ninja suit"
+
+/datum/action/item_action/ninjajaunt
+ name = "Phase Jaunt (10E)"
+ desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing."
+ button_icon_state = "ninja_phase"
+
+/datum/action/item_action/ninjasmoke
+ name = "Smoke Bomb"
+ desc = "Blind your enemies momentarily with a well-placed smoke bomb."
+ button_icon_state = "smoke"
+
+/datum/action/item_action/ninjaboost
+ name = "Adrenaline Boost"
+ desc = "Inject a secret chemical that will counteract all movement-impairing effect."
+ button_icon_state = "repulse"
+
+/datum/action/item_action/ninjapulse
+ name = "EM Burst (25E)"
+ desc = "Disable any nearby technology with a electro-magnetic pulse."
+ button_icon_state = "emp"
+
+/datum/action/item_action/ninjastar
+ name = "Create Throwing Stars (1E)"
+ desc = "Creates some throwing stars"
+ button_icon_state = "throwingstar"
+ icon_icon = 'icons/obj/weapons.dmi'
+
+/datum/action/item_action/ninjanet
+ name = "Energy Net (20E)"
+ desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds."
+ button_icon_state = "energynet"
+ icon_icon = 'icons/effects/effects.dmi'
+
+/datum/action/item_action/ninja_sword_recall
+ name = "Recall Energy Katana (Variable Cost)"
+ desc = "Teleports the Energy Katana linked to this suit to its wearer, cost based on distance."
+ button_icon_state = "energy_katana"
+ icon_icon = 'icons/obj/weapons.dmi'
+
+/datum/action/item_action/ninja_stealth
+ name = "Toggle Stealth"
+ desc = "Toggles stealth mode on and off."
+ button_icon_state = "ninja_cloak"
+
+/datum/action/item_action/toggle_glove
+ name = "Toggle interaction"
+ desc = "Switch between normal interaction and drain mode."
+ button_icon_state = "s-ninjan"
+ icon_icon = 'icons/obj/clothing/gloves.dmi'
+
+
/datum/action/item_action/organ_action
check_flags = AB_CHECK_CONSCIOUS
diff --git a/code/datums/antagonists/ninja.dm b/code/datums/antagonists/ninja.dm
new file mode 100644
index 0000000000..d3b6da5b19
--- /dev/null
+++ b/code/datums/antagonists/ninja.dm
@@ -0,0 +1,153 @@
+/datum/antagonist/ninja
+ name = "Ninja"
+ var/team
+ var/helping_station = 0
+ var/give_objectives = TRUE
+
+/datum/antagonist/ninja/friendly
+ helping_station = 1
+
+/datum/antagonist/ninja/friendly/noobjective
+ give_objectives = FALSE
+
+/datum/antagonist/ninja/New(datum/mind/new_owner)
+ if(new_owner && !ishuman(new_owner.current))//It's fine if we aren't passed a mind, but if we are, they have to be human.
+ throw EXCEPTION("Only humans and/or humanoids may be ninja'ed")
+ ..(new_owner)
+
+/datum/antagonist/ninja/randomAllegiance/New(datum/mind/new_owner)
+ ..(new_owner)
+ helping_station = rand(0,1)
+
+/datum/antagonist/ninja/proc/equip_space_ninja(mob/living/carbon/human/H = owner.current, safety=0)//Safety in case you need to unequip stuff for existing characters.
+ if(safety)
+ qdel(H.w_uniform)
+ qdel(H.wear_suit)
+ qdel(H.wear_mask)
+ qdel(H.head)
+ qdel(H.shoes)
+ qdel(H.gloves)
+
+ var/obj/item/clothing/suit/space/space_ninja/theSuit = new(H)
+ var/obj/item/weapon/katana/energy/EK = new(H)
+ theSuit.energyKatana = EK
+
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_ears)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/space_ninja(H), slot_shoes)
+ H.equip_to_slot_or_del(theSuit, slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/gloves/space_ninja(H), slot_gloves)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/space_ninja(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/space_ninja(H), slot_wear_mask)
+ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(H), slot_glasses)
+ H.equip_to_slot_or_del(EK, slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/device/flashlight(H), slot_r_store)
+ H.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(H), slot_l_store)
+ H.equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(H), slot_s_store)
+ H.equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(H), slot_back)
+ theSuit.randomize_param()
+
+ var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(H)
+ E.implant(H)
+ return 1
+
+/datum/antagonist/ninja/proc/addMemories()
+ owner.store_memory("I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!")
+ owner.store_memory("Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!")
+ owner.store_memory("Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.")
+
+/datum/antagonist/ninja/proc/addObjectives(quantity = 6)
+ var/list/possible_targets = list()
+ for(var/datum/mind/M in SSticker.minds)
+ if(M.current && M.current.stat != DEAD)
+ if(ishuman(M.current))
+ if(M.special_role)
+ possible_targets[M] = 0 //bad-guy
+ else if(M.assigned_role in GLOB.command_positions)
+ possible_targets[M] = 1 //good-guy
+
+ var/list/objectives = list(1,2,3,4)
+ while(owner.objectives.len < quantity)
+ switch(pick_n_take(objectives))
+ if(1) //research
+ var/datum/objective/download/O = new /datum/objective/download()
+ O.owner = owner
+ O.gen_amount_goal()
+ owner.objectives += O
+
+ if(2) //steal
+ var/datum/objective/steal/special/O = new /datum/objective/steal/special()
+ O.owner = owner
+ owner.objectives += O
+
+ if(3) //protect/kill
+ if(!possible_targets.len) continue
+ var/index = rand(1,possible_targets.len)
+ var/datum/mind/M = possible_targets[index]
+ var/is_bad_guy = possible_targets[M]
+ possible_targets.Cut(index,index+1)
+
+ if(is_bad_guy ^ helping_station) //kill (good-ninja + bad-guy or bad-ninja + good-guy)
+ var/datum/objective/assassinate/O = new /datum/objective/assassinate()
+ O.owner = owner
+ O.target = M
+ O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]."
+ owner.objectives += O
+ else //protect
+ var/datum/objective/protect/O = new /datum/objective/protect()
+ O.owner = owner
+ O.target = M
+ O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm."
+ owner.objectives += O
+ if(4) //debrain/capture
+ if(!possible_targets.len) continue
+ var/selected = rand(1,possible_targets.len)
+ var/datum/mind/M = possible_targets[selected]
+ var/is_bad_guy = possible_targets[M]
+ possible_targets.Cut(selected,selected+1)
+
+ if(is_bad_guy ^ helping_station) //debrain (good-ninja + bad-guy or bad-ninja + good-guy)
+ var/datum/objective/debrain/O = new /datum/objective/debrain()
+ O.owner = owner
+ O.target = M
+ O.explanation_text = "Steal the brain of [M.current.real_name]."
+ owner.objectives += O
+ else //capture
+ var/datum/objective/capture/O = new /datum/objective/capture()
+ O.owner = owner
+ O.gen_amount_goal()
+ owner.objectives += O
+ else
+ break
+ var/datum/objective/O = new /datum/objective/survive()
+ O.owner = owner
+ owner.objectives += O
+
+
+/proc/remove_ninja(mob/living/L)
+ if(!L || !L.mind)
+ return FALSE
+ var/datum/antagonist/datum = L.mind.has_antag_datum(ANTAG_DATUM_NINJA)
+ datum.on_removal()
+ return TRUE
+
+/proc/add_ninja(mob/living/carbon/human/H, type = ANTAG_DATUM_NINJA_RANDOM)
+ if(!H || !H.mind)
+ return FALSE
+ return H.mind.add_antag_datum(type)
+
+/proc/is_ninja(mob/living/M)
+ return M && M.mind && M.mind.has_antag_datum(ANTAG_DATUM_NINJA)
+
+
+/datum/antagonist/ninja/greet()
+ owner.current << sound('sound/effects/ninja_greeting.ogg')
+ to_chat(owner.current, "I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!")
+ to_chat(owner.current, "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!")
+ to_chat(owner.current, "Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.")
+ return
+
+/datum/antagonist/ninja/on_gain()
+ if(give_objectives)
+ addObjectives()
+ addMemories()
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index fbbf97a6ca..eacbdd4d81 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -737,18 +737,6 @@
src.give_disease(M)
href_list["datumrefresh"] = href_list["give_spell"]
- else if(href_list["ninja"])
- if(!check_rights(R_FUN))
- return
-
- var/mob/M = locate(href_list["ninja"])
- if(!istype(M))
- to_chat(usr, "This can only be used on instances of type /mob")
- return
-
- src.cmd_admin_ninjafy(M)
- href_list["datumrefresh"] = href_list["ninja"]
-
else if(href_list["gib"])
if(!check_rights(R_FUN))
return
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index dd7a7ba38a..04bec0a7a4 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -326,7 +326,8 @@
"traitor", // "traitorchan",
"monkey",
"clockcult",
- "devil"
+ "devil",
+ "ninja"
)
var/text = ""
@@ -614,9 +615,27 @@
text += "|Disabled in Prefs"
sections["devil"] = text
+/** NINJA ***/
+ text = "ninja"
+ if(SSticker.mode.config_tag == "ninja")
+ text = uppertext(text)
+ text = "[text]: "
+ var/datum/antagonist/ninja/ninjainfo = has_antag_datum(ANTAG_DATUM_NINJA)
+ if(ninjainfo)
+ if(ninjainfo.helping_station)
+ text += "employee | syndicate | NANOTRASEN | EQUIP"
+ else
+ text += "employee | SYNDICATE | nanotrasen | EQUIP"
+ else
+ text += "EMPLOYEE | syndicate | nanotrasen | random allegiance"
+ if(current && current.client && (ROLE_NINJA in current.client.prefs.be_special))
+ text += " | Enabled in Prefs"
+ else
+ text += " | Disabled in Prefs"
+ sections["ninja"] = text
- /** SILICON ***/
+/** SILICON ***/
if(issilicon(current))
text = "silicon"
var/mob/living/silicon/robot/robot = current
@@ -1202,7 +1221,28 @@
else
to_chat(usr, "This only works on humans!")
return
-
+ else if(href_list["ninja"])
+ var/datum/antagonist/ninja/ninjainfo = has_antag_datum(ANTAG_DATUM_NINJA)
+ switch(href_list["ninja"])
+ if("clear")
+ remove_ninja(current)
+ message_admins("[key_name_admin(usr)] has de-ninja'ed [current].")
+ log_admin("[key_name(usr)] has de-ninja'ed [current].")
+ if("equip")
+ ninjainfo.equip_space_ninja()
+ return
+ if("nanotrasen")
+ add_ninja(current, ANTAG_DATUM_NINJA_FRIENDLY)
+ message_admins("[key_name_admin(usr)] has friendly ninja'ed [current].")
+ log_admin("[key_name(usr)] has friendly ninja'ed [current].")
+ if("syndicate")
+ add_ninja(current, ANTAG_DATUM_NINJA)
+ message_admins("[key_name_admin(usr)] has syndie ninja'ed [current].")
+ log_admin("[key_name(usr)] has syndie ninja'ed [current].")
+ if("random")
+ add_ninja(current)
+ message_admins("[key_name_admin(usr)] has random ninja'ed [current].")
+ log_admin("[key_name(usr)] has random ninja'ed [current].")
else if(href_list["abductor"])
switch(href_list["abductor"])
if("clear")
@@ -1615,4 +1655,4 @@
/mob/living/silicon/pai/mind_initialize()
..()
mind.assigned_role = "pAI"
- mind.special_role = ""
\ No newline at end of file
+ mind.special_role = ""
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index e5f8360527..cdfee917c2 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -81,7 +81,6 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/drop_dynex_bomb,
/client/proc/cinematic,
/client/proc/one_click_antag,
- /client/proc/send_space_ninja,
/client/proc/cmd_admin_add_freeform_ai_law,
/client/proc/object_say,
/client/proc/toggle_random_events,
@@ -200,7 +199,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/get_dynex_power,
/client/proc/set_dynex_scale,
/client/proc/cinematic,
- /client/proc/send_space_ninja,
/client/proc/cmd_admin_add_freeform_ai_law,
/client/proc/cmd_admin_create_centcom_report,
/client/proc/cmd_change_command_name,
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 757721daa3..b82d1f65e2 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -387,9 +387,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
if(L.name=="carpspawn")
ninja_spawn += L
- new_character.equip_space_ninja()
- new_character.internal = new_character.s_store
- new_character.update_internals_hud_icon(1)
+ var/datum/antagonist/ninja/ninjadatum = new_character.mind.has_antag_datum(ANTAG_DATUM_NINJA)
+ ninjadatum.equip_space_ninja()
if(ninja_spawn.len)
var/obj/effect/landmark/ninja_spawn_here = pick(ninja_spawn)
new_character.loc = ninja_spawn_here.loc
diff --git a/code/modules/ninja/admin_ninja_verbs.dm b/code/modules/ninja/admin_ninja_verbs.dm
deleted file mode 100644
index 7338d9bb0b..0000000000
--- a/code/modules/ninja/admin_ninja_verbs.dm
+++ /dev/null
@@ -1,64 +0,0 @@
-
-/*
-
-Contents:
-- Admin procs that make ninjas
-
-*/
-
-
-//ADMIN CREATE NINJA (From Player)
-/client/proc/cmd_admin_ninjafy(mob/living/carbon/human/H in GLOB.player_list)
- set category = null
- set name = "Make Space Ninja"
-
- if (!SSticker.mode)
- alert("Wait until the game starts")
- return
-
- if(!istype(H))
- return
-
- if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes")
- return
-
- log_admin("[key_name(src)] turned [H.key] into a Space Ninja.")
- H.mind = create_ninja_mind(H.key)
- H.mind_initialize()
- H.equip_space_ninja(1)
- if(istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja))
- H.wear_suit:randomize_param()
- spawn(0)
- H.wear_suit:ninitialize(10,H)
- SSticker.mode.update_ninja_icons_added(H)
-
-
-//ADMIN CREATE NINJA (From Ghost)
-/client/proc/send_space_ninja()
- set category = "Fun"
- set name = "Spawn Space Ninja"
- set desc = "Spawns a space ninja for when you need a teenager with attitude."
- set popup_menu = 0
-
- if(!holder)
- to_chat(src, "Only administrators may use this command.")
- return
- if(!SSticker.mode)
- alert("The game hasn't started yet!")
- return
- if(alert("Are you sure you want to send in a space ninja?",,"Yes","No")=="No")
- return
-
- var/client/C = input("Pick character to spawn as the Space Ninja", "Key", "") as null|anything in GLOB.clients
- if(!C)
- return
-
- // passing FALSE means the event doesn't start immediately
- var/datum/round_event/ghost_role/ninja/E = new(FALSE)
- E.priority_candidates += C
- E.processing = TRUE
-
- message_admins("[key_name_admin(key)] has spawned [key_name_admin(C.key)] as a Space Ninja.")
- log_admin("[key] used Spawn Space Ninja.")
-
- return
diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm
index e83f3a17e2..8ff3652367 100644
--- a/code/modules/ninja/ninja_event.dm
+++ b/code/modules/ninja/ninja_event.dm
@@ -63,98 +63,21 @@ Contents:
Mind.active = 1
//generate objectives - You'll generally get 6 objectives (Ninja is meant to be hardmode!)
- var/list/possible_targets = list()
- for(var/datum/mind/M in SSticker.minds)
- if(M.current && M.current.stat != DEAD)
- if(ishuman(M.current))
- if(M.special_role)
- possible_targets[M] = 0 //bad-guy
- else if(M.assigned_role in GLOB.command_positions)
- possible_targets[M] = 1 //good-guy
- var/list/objectives = list(1,2,3,4)
- while(give_objectives && Mind.objectives.len < 6)
- switch(pick_n_take(objectives))
- if(1) //research
- var/datum/objective/download/O = new /datum/objective/download()
- O.owner = Mind
- O.gen_amount_goal()
- Mind.objectives += O
-
- if(2) //steal
- var/datum/objective/steal/special/O = new /datum/objective/steal/special()
- O.owner = Mind
- Mind.objectives += O
-
- if(3) //protect/kill
- if(!possible_targets.len) continue
- var/index = rand(1,possible_targets.len)
- var/datum/mind/M = possible_targets[index]
- var/is_bad_guy = possible_targets[M]
- possible_targets.Cut(index,index+1)
-
- if(is_bad_guy ^ helping_station) //kill (good-ninja + bad-guy or bad-ninja + good-guy)
- var/datum/objective/assassinate/O = new /datum/objective/assassinate()
- O.owner = Mind
- O.target = M
- O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]."
- Mind.objectives += O
- else //protect
- var/datum/objective/protect/O = new /datum/objective/protect()
- O.owner = Mind
- O.target = M
- O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm."
- Mind.objectives += O
- if(4) //debrain/capture
- if(!possible_targets.len) continue
- var/selected = rand(1,possible_targets.len)
- var/datum/mind/M = possible_targets[selected]
- var/is_bad_guy = possible_targets[M]
- possible_targets.Cut(selected,selected+1)
-
- if(is_bad_guy ^ helping_station) //debrain (good-ninja + bad-guy or bad-ninja + good-guy)
- var/datum/objective/debrain/O = new /datum/objective/debrain()
- O.owner = Mind
- O.target = M
- O.explanation_text = "Steal the brain of [M.current.real_name]."
- Mind.objectives += O
- else //capture
- var/datum/objective/capture/O = new /datum/objective/capture()
- O.owner = Mind
- O.gen_amount_goal()
- Mind.objectives += O
- else
- break
-
- //Add a survival objective since it's usually broad enough for any round type.
- if(give_objectives)
- var/datum/objective/O = new /datum/objective/survive()
- O.owner = Mind
- Mind.objectives += O
-
- //add some RP-fluff
- Mind.store_memory("I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!")
- Mind.store_memory("Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!")
- Mind.store_memory("Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.")
//spawn the ninja and assign the candidate
var/mob/living/carbon/human/Ninja = create_space_ninja(spawn_loc)
Mind.transfer_to(Ninja)
-
- //initialise equipment
- if(istype(Ninja.wear_suit,/obj/item/clothing/suit/space/space_ninja))
- //Should be true but we have to check these things.
- var/obj/item/clothing/suit/space/space_ninja/N = Ninja.wear_suit
- N.randomize_param()
+ var/datum/antagonist/ninja/ninjadatum = add_ninja(Ninja)
+ ninjadatum.equip_space_ninja()
Ninja.internal = Ninja.s_store
Ninja.update_internals_hud_icon(1)
if(Ninja.mind != Mind) //something has gone wrong!
throw EXCEPTION("Ninja created with incorrect mind")
- return
- Ninja << sound('sound/effects/ninja_greeting.ogg') //so ninja you probably wouldn't even know if you were made one
+
SSticker.mode.update_ninja_icons_added(Ninja)
spawned_mobs += Ninja
message_admins("[key_name_admin(Ninja)] has been made into a ninja by an event.")
@@ -171,7 +94,6 @@ Contents:
A.real_name = "[pick(GLOB.ninja_titles)] [pick(GLOB.ninja_names)]"
A.copy_to(new_ninja)
new_ninja.dna.update_dna_identity()
- new_ninja.equip_space_ninja()
return new_ninja
@@ -183,38 +105,6 @@ Contents:
return Mind
-/mob/living/carbon/human/proc/equip_space_ninja(safety=0)//Safety in case you need to unequip stuff for existing characters.
- if(safety)
- qdel(w_uniform)
- qdel(wear_suit)
- qdel(wear_mask)
- qdel(head)
- qdel(shoes)
- qdel(gloves)
-
- var/obj/item/device/radio/R = new /obj/item/device/radio/headset(src)
- var/obj/item/clothing/suit/space/space_ninja/theSuit = new(src)
- var/obj/item/weapon/katana/energy/EK = new(src)
- theSuit.energyKatana = EK
-
- equip_to_slot_or_del(R, slot_ears)
- equip_to_slot_or_del(new /obj/item/clothing/under/color/black(src), slot_w_uniform)
- equip_to_slot_or_del(new /obj/item/clothing/shoes/space_ninja(src), slot_shoes)
- equip_to_slot_or_del(theSuit, slot_wear_suit)
- equip_to_slot_or_del(new /obj/item/clothing/gloves/space_ninja(src), slot_gloves)
- equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/space_ninja(src), slot_head)
- equip_to_slot_or_del(new /obj/item/clothing/mask/gas/space_ninja(src), slot_wear_mask)
- equip_to_slot_or_del(new /obj/item/clothing/glasses/night(src), slot_glasses)
- equip_to_slot_or_del(EK, slot_belt)
- equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_r_store)
- equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(src), slot_l_store)
- equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(src), slot_s_store)
- equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(src), slot_back)
-
- var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(src)
- E.implant(src)
- return 1
-
/datum/game_mode/proc/update_ninja_icons_added(var/mob/living/carbon/human/ninja)
var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA]
ninjahud.join_hud(ninja)
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index d26e4cbd36..e9a350eae3 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -58,30 +58,23 @@
A.add_fingerprint(H)
draining = 1
- var/drained = A.ninjadrain_act(suit,H,src)
+ . = 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)
- to_chat(H, "Gained [drained] energy from \the [A].")
+ if(isnum(.)) //Numerical values of drained handle their feedback here, Alpha values handle it themselves (Research hacking)
+ if(.)
+ to_chat(H, "Gained [.] energy from \the [A].")
else
to_chat(H, "\The [A] has run dry of power, you must find another source!")
else
- drained = 0 //as to not cancel attack_hand()
-
- return drained
+ . = 0 //as to not cancel attack_hand()
-/obj/item/clothing/gloves/space_ninja/proc/toggled()
- set name = "Toggle Interaction"
- set desc = "Toggles special interaction on or off."
- set category = "Ninja Equip"
-
+/obj/item/clothing/gloves/space_ninja/proc/toggledrain()
var/mob/living/carbon/human/U = loc
to_chat(U, "You [candrain?"disable":"enable"] special interaction.")
candrain=!candrain
-
/obj/item/clothing/gloves/space_ninja/examine(mob/user)
..()
if(flags & NODROP)
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
index 30085fdac5..e1c378f9f3 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
@@ -1,12 +1,6 @@
-
-
//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
@@ -25,4 +19,3 @@
a_boost--
to_chat(H, "There are [a_boost] adrenaline boosts remaining.")
s_coold = 3
- return
\ No newline at end of file
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_cost_check.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_cost_check.dm
index 977279082e..1d728084b3 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_cost_check.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_cost_check.dm
@@ -26,4 +26,4 @@
if(!a_boost)
to_chat(H, "You do not have any more adrenaline boosters.")
return 1
- return (s_coold)//Returns the value of the variable which counts down to zero.
\ No newline at end of file
+ return (s_coold)//Returns the value of the variable which counts down to zero.
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm
index 8cfc6b8937..48e3cf69a9 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm
@@ -2,14 +2,9 @@
//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
\ No newline at end of file
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
index 481c4d46b5..18682e87eb 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
@@ -1,10 +1,6 @@
//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
@@ -26,4 +22,3 @@
to_chat(H, "[C.p_they(TRUE)] are already trapped inside an energy net!")
else
to_chat(H, "[C.p_they(TRUE)] will bring no honor to your Clan!")
- return
\ No newline at end of file
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm
index 3596976e9b..3c19162048 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm
@@ -2,10 +2,6 @@
//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
@@ -16,4 +12,3 @@
s_bombs--
to_chat(H, "There are [s_bombs] smoke bombs remaining.")
s_coold = 1
- return
\ No newline at end of file
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
index bed0eafd59..336b061a6f 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
@@ -2,11 +2,6 @@
//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/obj/item/weapon/throwing_star/ninja/N = new(H)
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm
index 12e80d5c09..8103fa2415 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm
@@ -21,7 +21,6 @@ Contents:
animate(U, alpha = 50,time = 15)
U.visible_message("[U.name] vanishes into thin air!", \
"You are now mostly invisible to normal detection.")
- return
/obj/item/clothing/suit/space/space_ninja/proc/cancel_stealth()
@@ -38,12 +37,7 @@ Contents:
/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
to_chat(affecting, "Stealth does not appear to work!")
-
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm
index 4183e83fbf..73c7082eec 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm
@@ -1,10 +1,5 @@
/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 its wearer, cost based on distance."
- set category = "Ninja Ability"
- set popup_menu = 0
-
var/mob/living/carbon/human/H = affecting
var/cost = 0
@@ -42,4 +37,3 @@
else //Else just TP it to us.
energyKatana.returnToOwner(H,1)
-
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
index 339b0b2857..42f1af6c0e 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
@@ -16,16 +16,10 @@ Contents:
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)
@@ -47,7 +41,6 @@ Contents:
s_coold = 1
else
to_chat(H, "The VOID-shift device is malfunctioning, teleportation failed.")
- return
//Right-Click teleport: It's basically admin "jump to turf"
@@ -76,6 +69,3 @@ Contents:
s_coold = 1
else
to_chat(H, "You cannot teleport into solid walls or from solid matter")
- return
-
-
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index 827047c93e..d5811e32c9 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -22,6 +22,8 @@ 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)
+
//Important parts of the suit.
var/mob/living/carbon/human/affecting = null
var/obj/item/weapon/stock_parts/cell/cell
@@ -57,7 +59,6 @@ Contents:
/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()
@@ -109,40 +110,38 @@ Contents:
//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)
+/obj/item/clothing/suit/space/space_ninja/proc/lock_suit(mob/living/carbon/human/H)
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")
- to_chat(H, "\red fÄTaL ÈÈRRoR: 382200-*#00CÖDE RED\nUNAUHORIZED USÈ DETÈCeD\nCoMMÈNCING SUB-R0UIN3 13...\nTÈRMInATING U-U-USÈR...")
- H.gib()
- return 0
- if(!istype(H.head, /obj/item/clothing/head/helmet/space/space_ninja))
- to_chat(H, "ERROR: 100113 UNABLE TO LOCATE HEAD GEAR\nABORTING...")
- return 0
- if(!istype(H.shoes, /obj/item/clothing/shoes/space_ninja))
- to_chat(H, "ERROR: 122011 UNABLE TO LOCATE FOOT GEAR\nABORTING...")
- return 0
- if(!istype(H.gloves, /obj/item/clothing/gloves/space_ninja))
- to_chat(H, "ERROR: 110223 UNABLE TO LOCATE HAND GEAR\nABORTING...")
- return 0
+ if(!is_ninja(H))
+ to_chat(H, "\red fÄTaL ÈÈRRoR: 382200-*#00CÖDE RED\nUNAUHORIZED USÈ DETÈCeD\nCoMMÈNCING SUB-R0UIN3 13...\nTÈRMInATING U-U-USÈR...")
+ H.gib()
+ return FALSE
+ if(!istype(H.head, /obj/item/clothing/head/helmet/space/space_ninja))
+ to_chat(H, "ERROR: 100113 UNABLE TO LOCATE HEAD GEAR\nABORTING...")
+ return FALSE
+ if(!istype(H.shoes, /obj/item/clothing/shoes/space_ninja))
+ to_chat(H, "ERROR: 122011 UNABLE TO LOCATE FOOT GEAR\nABORTING...")
+ return FALSE
+ if(!istype(H.gloves, /obj/item/clothing/gloves/space_ninja))
+ to_chat(H, "ERROR: 110223 UNABLE TO LOCATE HAND GEAR\nABORTING...")
+ return FALSE
+ affecting = H
+ flags |= NODROP //colons make me go all |=
+ slowdown = FALSE
+ 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 TRUE
- 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
+/obj/item/clothing/suit/space/space_ninja/proc/lockIcons(mob/living/carbon/human/H)
+ icon_state = H.gender==FEMALE ? "s-ninjanf" : "s-ninjan"
+ H.gloves.icon_state = "s-ninjan"
+ H.gloves.item_state = "s-ninjan"
//This proc allows the suit to be taken off.
@@ -172,3 +171,39 @@ Contents:
to_chat(user, "The CLOAK-tech device is [s_active?"active":"inactive"].")
to_chat(user, "There are [s_bombs] smoke bomb\s remaining.")
to_chat(user, "There are [a_boost] adrenaline booster\s remaining.")
+
+/obj/item/clothing/suit/space/space_ninja/ui_action_click(mob/user, action)
+ if(istype(action, /datum/action/item_action/initialize_ninja_suit))
+ toggle_on_off()
+ return TRUE
+ 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
+ if(istype(action, /datum/action/item_action/ninjaboost))
+ ninjaboost()
+ return TRUE
+ if(istype(action, /datum/action/item_action/ninjapulse))
+ ninjapulse()
+ return TRUE
+ if(istype(action, /datum/action/item_action/ninjastar))
+ ninjastar()
+ return TRUE
+ if(istype(action, /datum/action/item_action/ninjanet))
+ ninjanet()
+ return TRUE
+ if(istype(action, /datum/action/item_action/ninja_sword_recall))
+ ninja_sword_recall()
+ return TRUE
+ if(istype(action, /datum/action/item_action/ninja_stealth))
+ stealth()
+ return TRUE
+ if(istype(action, /datum/action/item_action/toggle_glove))
+ n_gloves.toggledrain()
+ return TRUE
+ return FALSE
diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm
index 6851eb9b48..f26912df24 100644
--- a/code/modules/ninja/suit/suit_initialisation.dm
+++ b/code/modules/ninja/suit/suit_initialisation.dm
@@ -1,102 +1,98 @@
-
-//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)
+/obj/item/clothing/suit/space/space_ninja/proc/toggle_on_off()
+ if(s_busy)
+ to_chat(loc, "ERROR: You cannot use this function at this time.")
+ return FALSE
+ if(s_initialized)
deinitialize()
else
- to_chat(affecting, "The function did not trigger!")
-
+ ninitialize()
+ . = TRUE
/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)
- to_chat(U, "Now initializing...")
- if(1)
- if(!lock_suit(U))//To lock the suit onto wearer.
- break
- to_chat(U, "Securing external locking mechanism...\nNeural-net established.")
- if(2)
- to_chat(U, "Extending neural-net interface...\nNow monitoring brain wave pattern...")
- if(3)
- if(U.stat==2||U.health<=0)
- to_chat(U, "FÄAL �Rr�R: 344--93#�&&21 BR��N |/|/aV� PATT$RN RED\nA-A-aB�rT�NG...")
- unlock_suit()
- break
- lock_suit(U,1)//Check for icons.
- U.regenerate_icons()
- to_chat(U, "Linking neural-net interface...\nPattern\green GREEN, continuing operation.")
- if(4)
- to_chat(U, "VOID-shift device status: ONLINE.\nCLOAK-tech device status: ONLINE.")
- if(5)
- to_chat(U, "Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [cell.charge].")
- if(6)
- to_chat(U, "All systems operational. Welcome to SpiderOS, [U.real_name].")
- 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.
- to_chat(U, "You do not understand how this suit functions. Where the heck did it even come from?")
- else if(s_initialized)
- to_chat(U, "The suit is already functioning. Please report this bug.")
- else
- to_chat(U, "ERROR: You cannot use this function at this time.")
- return
+ if(!U.mind)
+ return //Not sure how this could happen.
+ if(!is_ninja(U))
+ to_chat(U, "You do not understand how this suit functions. Where the heck did it even come from?")
+ return
+ s_busy = TRUE
+ to_chat(U, "Now initializing...")
+ addtimer(CALLBACK(src, .proc/ninitialize_two, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_two(delay, mob/living/carbon/human/U)
+ if(!lock_suit(U))//To lock the suit onto wearer.
+ s_busy = FALSE
+ return
+ to_chat(U, "Securing external locking mechanism...\nNeural-net established.")
+ addtimer(CALLBACK(src, .proc/ninitialize_three, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_three(delay, mob/living/carbon/human/U)
+ to_chat(U, "Extending neural-net interface...\nNow monitoring brain wave pattern...")
+ addtimer(CALLBACK(src, .proc/ninitialize_four, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_four(delay, mob/living/carbon/human/U)
+ if(U.stat==2||U.health<=0)
+ to_chat(U, "FÄAL �Rr�R: 344--93#�&&21 BR��N |/|/aV� PATT$RN RED\nA-A-aB�rT�NG...")
+ unlock_suit()
+ return
+ lockIcons(U)//Check for icons.
+ U.regenerate_icons()
+ to_chat(U, "Linking neural-net interface...\nPattern\green GREEN, continuing operation.")
+ addtimer(CALLBACK(src, .proc/ninitialize_five, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_five(delay, mob/living/carbon/human/U)
+ to_chat(U, "VOID-shift device status: ONLINE.\nCLOAK-tech device status: ONLINE.")
+ addtimer(CALLBACK(src, .proc/ninitialize_six, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_six(delay, mob/living/carbon/human/U)
+ to_chat(U, "Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [cell.charge].")
+ addtimer(CALLBACK(src, .proc/ninitialize_seven, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_seven(delay, mob/living/carbon/human/U)
+ to_chat(U, "All systems operational. Welcome to SpiderOS, [U.real_name].")
+ grant_ninja_verbs()
+ grant_equip_verbs()
+ ntick()
+ s_busy = FALSE
/obj/item/clothing/suit/space/space_ninja/proc/deinitialize(delay = s_delay)
- if(affecting==loc&&!s_busy)
+ if(affecting==loc)
var/mob/living/carbon/human/U = affecting
- if(!s_initialized)
- to_chat(U, "The suit is not initialized. 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)
- to_chat(U, "ERROR: You cannot use this function at this time.")
- return
- s_busy = 1
- for(var/i = 0,i<7,i++)
- switch(i)
- if(0)
- to_chat(U, "Now de-initializing...")
- spideros = 0//Spideros resets.
- if(1)
- to_chat(U, "Logging off, [U:real_name]. Shutting down SpiderOS.")
- remove_ninja_verbs()
- if(2)
- to_chat(U, "Primary system status: OFFLINE.\nBackup system status: OFFLINE.")
- if(3)
- to_chat(U, "VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE.")
- cancel_stealth()//Shutdowns stealth.
- if(4)
- to_chat(U, "Disconnecting neural-net interface...\greenSuccess.")
- if(5)
- to_chat(U, "Disengaging neural-net interface...\greenSuccess.")
- if(6)
- to_chat(U, "Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED.")
- remove_equip_verbs()
- unlock_suit()
- U.regenerate_icons()
- sleep(delay)
- s_busy = 0
- return
\ No newline at end of file
+ s_busy = TRUE
+ addtimer(CALLBACK(src, .proc/deinitialize_two, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_two(delay, mob/living/carbon/human/U)
+ to_chat(U, "Now de-initializing...")
+ spideros = 0//Spideros resets.
+ addtimer(CALLBACK(src, .proc/deinitialize_three, delay, U), delay)
+
+/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)
+ to_chat(U, "Primary system status: OFFLINE.\nBackup system status: OFFLINE.")
+ addtimer(CALLBACK(src, .proc/deinitialize_five, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_five(delay, mob/living/carbon/human/U)
+ to_chat(U, "VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE.")
+ cancel_stealth()//Shutdowns stealth.
+ addtimer(CALLBACK(src, .proc/deinitialize_six, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_six(delay, mob/living/carbon/human/U)
+ to_chat(U, "Disconnecting neural-net interface...\greenSuccess.")
+ addtimer(CALLBACK(src, .proc/deinitialize_seven, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_seven(delay, mob/living/carbon/human/U)
+ to_chat(U, "Disengaging neural-net interface...\greenSuccess.")
+ addtimer(CALLBACK(src, .proc/deinitialize_eight, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_eight(delay, mob/living/carbon/human/U)
+ to_chat(U, "Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED.")
+ remove_equip_verbs()
+ U.regenerate_icons()
+ s_busy = FALSE
diff --git a/code/modules/ninja/suit/suit_process.dm b/code/modules/ninja/suit/suit_process.dm
index 4b341c9198..99f801ed76 100644
--- a/code/modules/ninja/suit/suit_process.dm
+++ b/code/modules/ninja/suit/suit_process.dm
@@ -20,5 +20,3 @@
cancel_stealth()
sleep(10)//Checks every second.
-
-
diff --git a/code/modules/ninja/suit/suit_verbs_handlers.dm b/code/modules/ninja/suit/suit_verbs_handlers.dm
index 24797a272b..7c887da1d2 100644
--- a/code/modules/ninja/suit/suit_verbs_handlers.dm
+++ b/code/modules/ninja/suit/suit_verbs_handlers.dm
@@ -9,33 +9,20 @@ Contents:
*/
/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
+ n_gloves.verbs += /obj/item/clothing/gloves/space_ninja/proc/toggledrain
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
+ n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggledrain
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
@@ -43,10 +30,3 @@ Contents:
/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
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 36bf21cf76..7f6f85b004 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index b9f0293318..ad998e8286 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -266,6 +266,7 @@
#include "code\datums\antagonists\antag_datum.dm"
#include "code\datums\antagonists\datum_clockcult.dm"
#include "code\datums\antagonists\datum_cult.dm"
+#include "code\datums\antagonists\ninja.dm"
#include "code\datums\diseases\_disease.dm"
#include "code\datums\diseases\_MobProcs.dm"
#include "code\datums\diseases\anxiety.dm"
@@ -712,10 +713,10 @@
#include "code\game\objects\effects\decals\decal.dm"
#include "code\game\objects\effects\decals\misc.dm"
#include "code\game\objects\effects\decals\remains.dm"
-#include "code\game\objects\effects\decals\Cleanable\aliens.dm"
-#include "code\game\objects\effects\decals\Cleanable\humans.dm"
-#include "code\game\objects\effects\decals\Cleanable\misc.dm"
-#include "code\game\objects\effects\decals\Cleanable\robots.dm"
+#include "code\game\objects\effects\decals\cleanable\aliens.dm"
+#include "code\game\objects\effects\decals\cleanable\humans.dm"
+#include "code\game\objects\effects\decals\cleanable\misc.dm"
+#include "code\game\objects\effects\decals\cleanable\robots.dm"
#include "code\game\objects\effects\effect_system\effect_system.dm"
#include "code\game\objects\effects\effect_system\effects_explosion.dm"
#include "code\game\objects\effects\effect_system\effects_foam.dm"
@@ -1816,7 +1817,6 @@
#include "code\modules\modular_computers\NTNet\NTNet_relay.dm"
#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm"
#include "code\modules\ninja\__ninjaDefines.dm"
-#include "code\modules\ninja\admin_ninja_verbs.dm"
#include "code\modules\ninja\energy_katana.dm"
#include "code\modules\ninja\ninja_event.dm"
#include "code\modules\ninja\Ninja_Readme.dm"