From 0c79d3ff8e8abb9c9617a9520896183fcad2f17a Mon Sep 17 00:00:00 2001 From: Mike Long Date: Thu, 18 May 2017 12:21:26 -0400 Subject: [PATCH] Ninja Refactor (#27316) * Begins converting Ninjas into the new antagonist datum system. Does not compile. Work in progress. * More work towards datumizing ninjas. Still not finished. Now compiles. * Adds ninja to traitor panel. * Add objectives now takes an arg for number of objectives. * Event now actually ninjas the ninja. * Ninja suit initialization now works. * Cleans up the suit initialization code some. * Suit initialization is now action rather than verb based. * Now properly adds objectives and memories to the mind upon gaining datum. * Starts to replace ninja verbs with actions. * Hooks ninja abilities up to action buttons. * Whoops, missed a verb. Gloves are next. * Adds toggle ineraction type action button. * Changes icons as per ChanglingRain's suggestions. * Second round of changes for ChanglingRain * Replaces sleeps with addtimers. It's ugly, but more CPU efficient. * Fixes compile errors. * Fixes compile error, again. --- code/__DEFINES/antagonists.dm | 3 + code/datums/action.dm | 53 ++++++ code/datums/antagonists/ninja.dm | 153 +++++++++++++++ code/datums/datumvars.dm | 12 -- code/datums/mind.dm | 46 ++++- code/modules/admin/admin_verbs.dm | 2 - code/modules/admin/verbs/randomverbs.dm | 5 +- code/modules/ninja/admin_ninja_verbs.dm | 64 ------- code/modules/ninja/ninja_event.dm | 116 +----------- code/modules/ninja/suit/gloves.dm | 19 +- .../suit/n_suit_verbs/ninja_adrenaline.dm | 7 - .../suit/n_suit_verbs/ninja_cost_check.dm | 2 +- .../ninja/suit/n_suit_verbs/ninja_empulse.dm | 5 - .../ninja/suit/n_suit_verbs/ninja_net.dm | 5 - .../ninja/suit/n_suit_verbs/ninja_smoke.dm | 5 - .../ninja/suit/n_suit_verbs/ninja_stars.dm | 5 - .../ninja/suit/n_suit_verbs/ninja_stealth.dm | 6 - .../suit/n_suit_verbs/ninja_sword_recall.dm | 6 - .../suit/n_suit_verbs/ninja_teleporting.dm | 10 - code/modules/ninja/suit/suit.dm | 99 ++++++---- .../modules/ninja/suit/suit_initialisation.dm | 178 +++++++++--------- code/modules/ninja/suit/suit_process.dm | 2 - .../modules/ninja/suit/suit_verbs_handlers.dm | 24 +-- icons/mob/actions.dmi | Bin 192645 -> 193459 bytes tgstation.dme | 2 +- 25 files changed, 421 insertions(+), 408 deletions(-) create mode 100644 code/datums/antagonists/ninja.dm delete mode 100644 code/modules/ninja/admin_ninja_verbs.dm diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 26c0b8c984e..165690571f1 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -3,3 +3,6 @@ #define ANTAG_DATUM_CLOCKCULT /datum/antagonist/clockcult #define ANTAG_DATUM_CLOCKCULT_SILENT /datum/antagonist/clockcult/silent #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/ diff --git a/code/datums/action.dm b/code/datums/action.dm index 5a397fe3bda..ba3dc04f567 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 00000000000..d3b6da5b19c --- /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 3ba7efb4c98..35bc4bc33a0 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 241f34a4d41..04bec0a7a43 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") diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 728db7372cb..bbc65277118 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -78,7 +78,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, @@ -193,7 +192,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 b9c36ef79ad..67951fc26ae 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -386,9 +386,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 7338d9bb0be..00000000000 --- 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 e83f3a17e2e..8ff36523676 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 d26e4cbd363..e9a350eae31 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 30085fdac54..e1c378f9f3d 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 977279082e3..1d728084b34 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 8cfc6b89370..48e3cf69a97 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 481c4d46b5f..18682e87eb9 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 3596976e9b0..3c19162048c 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 bed0eafd599..336b061a6f2 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 12e80d5c098..8103fa24152 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 4183e83fbfc..73c7082eec6 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 27197086758..74dcec12ce8 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 827047c93ea..d5811e32c93 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\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)) - 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\nUNAU†HORIZED USÈ DETÈC†††eD\nCoMMÈNCING SUB-R0U†IN3 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 6851eb9b483..f26912df24d 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 4b341c91980..99f801ed76a 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 24797a272b0..7c887da1d2a 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 321f7dccd066f5d21790fcb19b6acd2790cd7a6e..7f6f85b00444e2ae944120c4857c1e3bb1a4d923 100644 GIT binary patch delta 12986 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 Z8vf%+J+F!x1r#0tsVHd3m&lp={SOmE&!YeU diff --git a/tgstation.dme b/tgstation.dme index a5f05bce3c6..b87d020eb14 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -235,6 +235,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" @@ -1761,7 +1762,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"