From b8a9c902a1b3e2767dc0befebc8df5fcda376b40 Mon Sep 17 00:00:00 2001 From: SamCroswell Date: Mon, 2 Mar 2015 19:05:44 -0500 Subject: [PATCH 1/8] Removes Space Ninjas --- code/datums/datumvars.dm | 12 - code/datums/mind.dm | 40 - code/game/gamemodes/events/ninja_abilities.dm | 447 ----- code/game/gamemodes/events/ninja_equipment.dm | 1590 ----------------- code/game/gamemodes/events/space_ninja.dm | 1087 ----------- code/game/gamemodes/newobjective.dm | 45 +- code/game/gamemodes/ninja/ninja.dm | 182 -- code/game/gamemodes/objective.dm | 46 +- code/game/machinery/camera/tracking.dm | 6 - code/game/machinery/computer/ai_core.dm | 24 +- code/game/mecha/mecha.dm | 4 - code/game/objects/items/flag.dm | 5 - .../objects/items/weapons/ninja_manuscript.dm | 29 - .../structures/crates_lockers/largecrate.dm | 14 - code/modules/admin/admin.dm | 18 +- code/modules/admin/admin_verbs.dm | 3 - code/modules/admin/player_panel.dm | 4 +- code/modules/admin/secrets.dm | 1 - code/modules/admin/verbs/one_click_antag.dm | 10 +- code/modules/admin/verbs/randomverbs.dm | 15 - code/modules/clothing/gloves/ninja.dm | 126 -- code/modules/clothing/masks/voice.dm | 30 +- code/modules/clothing/shoes/miscellaneous.dm | 15 - code/modules/clothing/spacesuits/ninja.dm | 66 - code/modules/computer3/component.dm | 12 +- code/modules/events/event.dm | 4 +- code/modules/events/event_container.dm | 2 +- code/modules/events/event_dynamic.dm | 4 +- code/modules/events/space_ninja.dm | 2 - code/modules/mob/living/carbon/human/human.dm | 2 - code/modules/mob/living/carbon/human/life.dm | 25 +- .../mob/living/carbon/human/whisper.dm | 4 +- code/modules/mob/living/silicon/ai/ai.dm | 3 - .../modules/mob/living/silicon/mommi/mommi.dm | 5 +- code/modules/mob/living/silicon/pai/pai.dm | 11 +- code/modules/mob/mob_helpers.dm | 35 +- code/modules/power/apc.dm | 32 +- code/modules/power/cell.dm | 7 - .../reagents/reagent_containers/drugs.dm | 2 - .../reagents/reagent_containers/glass.dm | 8 +- .../xenoarchaeology/artifact/artifact.dm | 3 +- maps/cyberiad.dmm | 10 +- paradise.dme | 8 - 43 files changed, 68 insertions(+), 3930 deletions(-) delete mode 100644 code/game/gamemodes/events/ninja_abilities.dm delete mode 100644 code/game/gamemodes/events/ninja_equipment.dm delete mode 100644 code/game/gamemodes/events/space_ninja.dm delete mode 100644 code/game/gamemodes/ninja/ninja.dm delete mode 100644 code/game/objects/items/weapons/ninja_manuscript.dm delete mode 100644 code/modules/clothing/gloves/ninja.dm delete mode 100644 code/modules/clothing/spacesuits/ninja.dm delete mode 100644 code/modules/events/space_ninja.dm diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index f3062199ec7..f6a415912dc 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -249,7 +249,6 @@ client body += "" body += "" - body += "" body += "" body += "" @@ -526,17 +525,6 @@ client src.give_disease2(M) href_list["datumrefresh"] = href_list["give_spell"] - else if(href_list["ninja"]) - if(!check_rights(R_SPAWN)) return - - var/mob/M = locate(href_list["ninja"]) - if(!istype(M)) - 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["godmode"]) if(!check_rights(R_REJUVINATE)) return diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 905d47d36b8..d99824a9cf1 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -242,26 +242,6 @@ datum/mind sections["changeling"] = text - /** NINJA ***/ - text = "ninja" - if (ticker.mode.config_tag=="ninja") - text = uppertext(text) - text = "[text]: " - if (src in ticker.mode.ninjas) - text += "YES|no" - text += "
To outpost, undress, dress up." - //if (objectives.len==0) - //text += "
Objectives are empty! Randomize!" - else - text += "yes|NO" - - if(current && current.client && current.client.prefs.be_special & BE_NINJA) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["ninja"] = text - /** VAMPIRE ***/ text = "vampire" if (ticker.mode.config_tag=="vampire") @@ -822,26 +802,6 @@ datum/mind ticker.mode.forge_wizard_objectives(src) usr << "\blue The objectives for wizard [key] have been generated. You can edit them and anounce manually." - else if (href_list["ninja"]) - current.hud_updateflag |= (1 << SPECIALROLE_HUD) - - switch(href_list["ninja"]) - if("clear") - if(src in ticker.mode.ninjas) - ticker.mode.ninjas -= src - special_role = null - current << "\red You have been brainwashed! You are no longer a Ninja!" - log_admin("[key_name_admin(usr)] has de-ninja'ed [current].") - if("ninja") - if(!(src in ticker.mode.ninjas)) - ticker.mode.ninjas += src - special_role = "Ninja" - current << "\blue Your mind awakens, your true potential is realized! You are a Space Ninja!" - log_admin("[key_name_admin(usr)] has ninja'ed [current].") - if("outpost") - current.loc = pick(ninjastart) - if("dressup") - current:equip_space_ninja() else if (href_list["changeling"]) current.hud_updateflag |= (1 << SPECIALROLE_HUD) diff --git a/code/game/gamemodes/events/ninja_abilities.dm b/code/game/gamemodes/events/ninja_abilities.dm deleted file mode 100644 index f5df54cf304..00000000000 --- a/code/game/gamemodes/events/ninja_abilities.dm +++ /dev/null @@ -1,447 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+++++++++++++++++++++++++++++++++// //++++++++++++++++++++++++++++++++++ -==================================SPACE NINJA ABILITIES==================================== -___________________________________________________________________________________________ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -//=======//SAFETY CHECK//=======// -/* -X is optional, tells the proc to check for specific stuff. C is also optional. -All the procs here assume that the character is wearing the ninja suit if they are using the procs. -They should, as I have made every effort for that to be the case. -In the case that they are not, I imagine the game will run-time error like crazy. -s_cooldown ticks off each second based on the suit recharge proc, in seconds. Default of 1 seconds. Some abilities have no cool down. -*/ -/obj/item/clothing/suit/space/space_ninja/proc/ninjacost(C = 0,X = 0) - var/mob/living/carbon/human/U = affecting - if( (U.stat||U.incorporeal_move)&&X!=3 )//Will not return if user is using an adrenaline booster since you can use them when stat==1. - U << "\red You must be conscious and solid to do this."//It's not a problem of stat==2 since the ninja will explode anyway if they die. - return 1 - else if(cell.charge[s_bombs] smoke bombs remaining." - var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread() - smoke.set_up(10, 0, U.loc) - smoke.start() - playsound(U.loc, 'sound/effects/bamf.ogg', 50, 2) - s_bombs-- - s_coold = 1 - return - -//=======//9-8 TILE TELEPORT//=======// - //Click to to teleport 9-10 tiles in direction facing. -/obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt() - set name = "Phase Jaunt (750E)" - set desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing." - set category = "Ninja Ability" - set popup_menu = 0 - - var/C = 750 - if(!ninjacost(C,1)) - var/mob/living/carbon/human/U = affecting - var/turf/destination = get_teleport_loc(U.loc,U,9,1,3,1,0,1) - var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below. - if(mobloc.loc.name != "\improper SpiderClan Outpost") - if(destination&&istype(mobloc, /turf))//The turf check prevents unusual behavior. Like teleporting out of cryo pods, cloners, mechs, etc. - spawn(0) - playsound(U.loc, "sparks", 50, 1) - anim(mobloc,src,'icons/mob/mob.dmi',,"phaseout",,U.dir) - - handle_teleport_grab(destination, U) - U.loc = destination - - spawn(0) - spark_system.start() - playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1) - playsound(U.loc, "sparks", 50, 1) - anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir) - - //spawn(0) - //destination.kill_creatures(U)//Any living mobs in teleport area are gibbed. Check turf procs for how it does it. - s_coold = 1 - cell.charge-=(C) - else - U << "\red The VOID-shift device is malfunctioning, teleportation failed." - else - U<< "\red Your NINJA HONOR prevents you from teleporting here!" - return - - - -//=======//RIGHT CLICK TELEPORT//=======// -//Right click to teleport somewhere, almost exactly like admin jump to turf. -/obj/item/clothing/suit/space/space_ninja/proc/ninjashift(turf/T in oview()) - set name = "Phase Shift (1500E)" - set desc = "Utilizes the internal VOID-shift device to rapidly transit to a destination in view." - set category = null//So it does not show up on the panel but can still be right-clicked. - set src = usr.contents//Fixes verbs not attaching properly for objects. Praise the DM reference guide! - - var/C = 1500 - if(!ninjacost(C,1)) - var/mob/living/carbon/human/U = affecting - var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below. - if(mobloc.loc.name != "\improper SpiderClan Outpost") - if((!T.density)&&istype(mobloc, /turf)) - spawn(0) - playsound(U.loc, 'sound/effects/sparks4.ogg', 50, 1) - anim(mobloc,src,'icons/mob/mob.dmi',,"phaseout",,U.dir) - - handle_teleport_grab(T, U) - U.loc = T - - spawn(0) - spark_system.start() - playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1) - playsound(U.loc, 'sound/effects/sparks2.ogg', 50, 1) - anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir) - - //spawn(0) // Commented out for now, possible implementation in a later upgrade tree. - //T.kill_creatures(U) - s_coold = 1 - cell.charge-=(C) - else - U << "\red You cannot teleport into solid walls or from solid matter" - else - U<< "\red Your NINJA HONOR prevents you from teleporting here!" - return - -//=======//EM PULSE//=======// -//Disables nearby tech equipment. -/obj/item/clothing/suit/space/space_ninja/proc/ninjapulse() - set name = "EM Burst (2,000E)" - set desc = "Disable any nearby technology with a electro-magnetic pulse." - set category = "Ninja Ability" - set popup_menu = 0 - - var/C = 2000 - if(!ninjacost(C, 1)) - var/mob/living/carbon/human/U = affecting - playsound(U.loc, 'sound/effects/EMPulse.ogg', 60, 2) - emp_proof = 1 // This is a pretty crappy workaround, but the alternative was creating a special EMPulse proc just for Ninjas that doesn't trigger the act on their suits. - Dave - empulse(U, 4, 6) //Procs sure are nice. Slightly weaker than wizard's disable tch. - s_coold = 2 - cell.charge-=(C) - - spawn(3) - emp_proof = 0 - return - -//=======//ENERGY BLADE//=======// -//Summons a blade of energy in active hand. -/obj/item/clothing/suit/space/space_ninja/proc/ninjablade() - set name = "Energy Blade (500E)" - set desc = "Create a focused beam of energy in your active hand." - set category = "Ninja Ability" - set popup_menu = 0 - - var/C = 500 - if(!ninjacost(C, 1)) - var/mob/living/carbon/human/U = affecting - if(!kamikaze) - if(!U.get_active_hand()&&!istype(U.get_inactive_hand(), /obj/item/weapon/melee/energy/blade)) - var/obj/item/weapon/melee/energy/blade/W = new() - spark_system.start() - playsound(U.loc, "sparks", 50, 1) - U.put_in_hands(W) - cell.charge-=C - else - U << "\red You can only summon one blade. Try dropping an item first." - else//Else you can run around with TWO energy blades. I don't know why you'd want to but cool factor remains. - if(!U.get_active_hand()) - var/obj/item/weapon/melee/energy/blade/W = new() - U.put_in_hands(W) - if(!U.get_inactive_hand()) - var/obj/item/weapon/melee/energy/blade/W = new() - U.put_in_inactive_hand(W) - spark_system.start() - playsound(U.loc, "sparks", 50, 1) - s_coold = 1 - return - -//=======//NINJA STARS//=======// -/*Shoots ninja stars at random people. -This could be a lot better but I'm too tired atm.*/ -/obj/item/clothing/suit/space/space_ninja/proc/ninjastar() - set name = "Energy Star (500E)" - set desc = "Launches an energy star at a random living target." - set category = "Ninja Ability" - set popup_menu = 0 - - var/C = 500 - if(!ninjacost(C, 1)) - var/mob/living/carbon/human/U = affecting - var/targets[] = list()//So yo can shoot while yo throw dawg - for(var/mob/living/M in oview(loc)) - if(M.stat) continue//Doesn't target corpses or paralyzed persons. - targets.Add(M) - if(targets.len) - var/mob/living/target=pick(targets)//The point here is to pick a random, living mob in oview to shoot stuff at. - - var/turf/curloc = U.loc - var/atom/targloc = get_turf(target) - if (!targloc || !istype(targloc, /turf) || !curloc) - return - if (targloc == curloc) - return - var/obj/item/projectile/energy/dart/A = new /obj/item/projectile/energy/dart(U.loc) - A.current = curloc - A.yo = targloc.y - curloc.y - A.xo = targloc.x - curloc.x - cell.charge-=(C) - A.process() - else - U << "\red There are no targets in view." - return - -//=======//ENERGY NET//=======// -/*Allows the ninja to capture people, I guess. -Must right click on a mob to activate.*/ -/obj/item/clothing/suit/space/space_ninja/proc/ninjanet(mob/living/carbon/M in oview())//Only living carbon mobs. - set name = "Energy Net (2,500E)" - 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 - - var/C = 2500 - if(!ninjacost(C,1)&&iscarbon(M)) // Nets now cost 8,000 - var/mob/living/carbon/human/U = affecting - if(M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame. - //if(M)//DEBUG - if(!locate(/obj/effect/energy_net) in M.loc)//Check if they are already being affected by an energy net. - for(var/turf/T in getline(U.loc, M.loc)) - if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy. - U << "You may not use an energy net through solid obstacles!" - return - spawn(0) - U.Beam(M,"n_beam",,15) - M.anchored = 1//Anchors them so they can't move. - var/obj/effect/stop/S - S = new /obj/effect/stop - S.victim = M - S.loc = M.loc - - var/obj/effect/energy_net/E = new /obj/effect/energy_net(M.loc) - E.layer = M.layer+1//To have it appear one layer above the mob. - for(var/mob/O in viewers(U, 3)) - O.show_message(text("\red [] caught [] with an energy net!", U, M), 1) - E.affecting = M - E.master = U - spawn(0)//Parallel processing. - E.process(M) - cell.charge-=(C) - else - U << "They are already trapped inside an energy net." - else - U << "They will bring no honor to your Clan!" - return - -//=======//ADRENALINE BOOST//=======// -/*Wakes the user so they are able to do their thing. Also injects a decent dose of uranium. -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(,3))//Have to make sure stat is not counted for this ability. - var/mob/living/carbon/human/U = affecting - //Wouldn't need to track adrenaline boosters if there was a miracle injection to get rid of paralysis and the like instantly. - //For now, adrenaline boosters ARE the miracle injection. Well, uranium, really. - U.SetParalysis(0) - U.SetStunned(0) - U.SetWeakened(0) - /* - Due to lag, it was possible to adrenaline boost but remain helpless while life.dm resets player stat. - This lead to me and others spamming adrenaline boosters because they failed to kick in on time. - It's technically possible to come back from crit with this but it is very temporary. - Life.dm will kick the player back into unconsciosness the next process loop. - */ - U.stat = 0//At least now you should be able to teleport away or shoot ninja stars. - if(U.said_last_words) - U.said_last_words=0 - spawn(30)//Slight delay so the enemy does not immedietly know the ability was used. Due to lag, this often came before waking up. - U.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!")) - spawn(70) - reagents.reaction(U, 2) - reagents.trans_id_to(U, "uranium", a_transfer) - U << "\red You are beginning to feel the after-effect of the injection." - a_boost-- - s_coold = 3 - return - -/* -=================================================================================== -<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -=================================================================================== -Or otherwise known as anime mode. Which also happens to be ridiculously powerful. -*/ - -//=======//NINJA MOVEMENT//=======// -//Also makes you move like you're on crack. -/obj/item/clothing/suit/space/space_ninja/proc/ninjawalk() - set name = "Shadow Walk" - set desc = "Combines the VOID-shift and CLOAK-tech devices to freely move between solid matter. Toggle on or off." - set category = "Ninja Ability" - set popup_menu = 0 - - var/mob/living/carbon/human/U = affecting - if(!U.incorporeal_move) - U.incorporeal_move = 2 - U << "\blue You will now phase through solid matter." - else - U.incorporeal_move = 0 - U << "\blue You will no-longer phase through solid matter." - return - -//=======//5 TILE TELEPORT/GIB//=======// -//Allows to gib up to five squares in a straight line. Seriously. -/obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer() - set name = "Phase Slayer" - set desc = "Utilizes the internal VOID-shift device to mutilate creatures in a straight line." - set category = "Ninja Ability" - set popup_menu = 0 - if(!ninjacost()) - var/mob/living/carbon/human/U = affecting - var/turf/destination = get_teleport_loc(U.loc,U,5) - var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below. - - if(destination&&istype(mobloc, /turf)) - U.say("Ai Satsugai!") - spawn(0) - playsound(U.loc, "sparks", 50, 1) - anim(mobloc,U,'icons/mob/mob.dmi',,"phaseout",,U.dir) - - spawn(0) - for(var/turf/T in getline(mobloc, destination)) - spawn(0) - T.kill_creatures(U) - if(T==mobloc||T==destination) continue - spawn(0) - anim(T,U,'icons/mob/mob.dmi',,"phasein",,U.dir) - - handle_teleport_grab(destination, U) - U.loc = destination - - spawn(0) - spark_system.start() - playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1) - playsound(U.loc, "sparks", 50, 1) - anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir) - s_coold = 1 - else - U << "\red The VOID-shift device is malfunctioning, teleportation failed." - return - -//=======//TELEPORT BEHIND MOB//=======// -/*Appear behind a randomly chosen mob while a few decoy teleports appear. -This is so anime it hurts. But that's the point.*/ -/obj/item/clothing/suit/space/space_ninja/proc/ninjamirage() - set name = "Spider Mirage" - set desc = "Utilizes the internal VOID-shift device to create decoys and teleport behind a random target." - set category = "Ninja Ability" - set popup_menu = 0 - - if(!ninjacost())//Simply checks for stat. - var/mob/living/carbon/human/U = affecting - var/targets[] - targets = new() - for(var/mob/living/M in oview(6)) - if(M.stat) continue//Doesn't target corpses or paralyzed people. - targets.Add(M) - if(targets.len) - var/mob/living/target=pick(targets) - var/locx - var/locy - var/turf/mobloc = get_turf(target.loc) - var/safety = 0 - switch(target.dir) - if(NORTH) - locx = mobloc.x - locy = (mobloc.y-1) - if(locy<1) - safety = 1 - if(SOUTH) - locx = mobloc.x - locy = (mobloc.y+1) - if(locy>world.maxy) - safety = 1 - if(EAST) - locy = mobloc.y - locx = (mobloc.x-1) - if(locx<1) - safety = 1 - if(WEST) - locy = mobloc.y - locx = (mobloc.x+1) - if(locx>world.maxx) - safety = 1 - else safety=1 - if(!safety&&istype(mobloc, /turf)) - U.say("Kumo no Shinkiro!") - var/turf/picked = locate(locx,locy,mobloc.z) - spawn(0) - playsound(U.loc, "sparks", 50, 1) - anim(mobloc,U,'icons/mob/mob.dmi',,"phaseout",,U.dir) - - spawn(0) - var/limit = 4 - for(var/turf/T in oview(5)) - if(prob(20)) - spawn(0) - anim(T,U,'icons/mob/mob.dmi',,"phasein",,U.dir) - limit-- - if(limit<=0) break - - handle_teleport_grab(picked, U) - U.loc = picked - U.dir = target.dir - - spawn(0) - spark_system.start() - playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1) - playsound(U.loc, "sparks", 50, 1) - anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir) - s_coold = 1 - else - U << "\red The VOID-shift device is malfunctioning, teleportation failed." - else - U << "\red There are no targets in view." - return diff --git a/code/game/gamemodes/events/ninja_equipment.dm b/code/game/gamemodes/events/ninja_equipment.dm deleted file mode 100644 index 03bdc2ab943..00000000000 --- a/code/game/gamemodes/events/ninja_equipment.dm +++ /dev/null @@ -1,1590 +0,0 @@ -//For the love of god,space out your code! This is a nightmare to read. - -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+++++++++++++++++++++++++++++++++// //++++++++++++++++++++++++++++++++++ -===================================SPACE NINJA EQUIPMENT=================================== -___________________________________________________________________________________________ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -/* -=================================================================================== -<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -=================================================================================== -*/ - -//=======//NEW AND DEL//=======// - -/obj/item/clothing/suit/space/space_ninja/New() - ..() - verbs += /obj/item/clothing/suit/space/space_ninja/proc/init//suit initialize verb - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_instruction//for AIs - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_holo - //verbs += /obj/item/clothing/suit/space/space_ninja/proc/display_verb_procs//DEBUG. Doesn't work. - spark_system = new()//spark initialize - spark_system.set_up(5, 0, src) - spark_system.attach(src) - stored_research = new()//Stolen research initialize. - for(var/T in typesof(/datum/tech) - /datum/tech)//Store up on research. - stored_research += new T(src) - var/reagent_amount//reagent initialize - for(var/reagent_id in reagent_list) - reagent_amount += reagent_id == "uranium" ? r_maxamount+(a_boost*a_transfer) : r_maxamount//AI can inject uranium directly. - reagents = new(reagent_amount) - reagents.my_atom = src - for(var/reagent_id in reagent_list) - reagent_id == "uranium" ? reagents.add_reagent(reagent_id, r_maxamount+(a_boost*a_transfer)) : reagents.add_reagent(reagent_id, r_maxamount)//It will take into account uranium used for adrenaline boosting. - cell = new/obj/item/weapon/stock_parts/cell/high//The suit should *always* have a battery because so many things rely on it. - cell.charge = 9990//Starting charge should not be higher than maximum charge. It leads to problems with recharging. - cell.maxcharge = 10000 // Due to Ponies' overhaul Ninjas began starting with a 15000 energy cell. This should fix that issue. - - /*switch(s_rank) In preparation for Ninja overhaul, differeing starting charge levels for each rank of Ninja. - if("Initiate") - cell.charge = 7490 - cell.maxcharge = 7500 - if("Assassin") - cell.charge = 9990 - cell.maxcharge = 10000 - if("Master") - cell.maxcharge = 15000 - cell.charge = 14990*/ - -/obj/item/clothing/suit/space/space_ninja/Destroy() - if(affecting)//To make sure the window is closed. - affecting << browse(null, "window=hack spideros") - if(AI)//If there are AIs present when the ninja kicks the bucket. - killai() - if(hologram)//If there is a hologram - del(hologram.i_attached)//Delete it and the attached image. - del(hologram) - ..() - return - -//Simply deletes all the attachments and self, killing all related procs. -/obj/item/clothing/suit/space/space_ninja/proc/terminate() - del(n_hood) - del(n_gloves) - del(n_shoes) - del(src) - -/obj/item/clothing/suit/space/space_ninja/proc/killai(mob/living/silicon/ai/A = AI) - if(A.client) - A << "\red Self-erase protocol dete-- *bzzzzz*" - A << browse(null, "window=hack spideros") - AI = null - A.death(1)//Kill, deleting mob. - del(A) - return - -//=======//SUIT VERBS//=======// -//Verbs link to procs because verb-like procs have a bug which prevents their use if the arguments are not readily referenced. - -/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() - return - -/obj/item/clothing/suit/space/space_ninja/proc/deinit() - set name = "De-Initialize Suit" - set desc = "Begins procedure to remove the suit." - set category = "Ninja Equip" - - if(s_control&&!s_busy) - deinitialize() - else - affecting << "\red The function did not trigger!" - return - -/obj/item/clothing/suit/space/space_ninja/proc/spideros() - set name = "Display SpiderOS" - set desc = "Utilize built-in computer system." - set category = "Ninja Equip" - - if(s_control&&!s_busy&&!kamikaze) - display_spideros() - else - affecting << "\red The interface is locked!" - return - -/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_control&&!s_busy) - toggle_stealth() - else - affecting << "\red Stealth does not appear to work!" - return - -//=======//PROCESS PROCS//=======// - -/obj/item/clothing/suit/space/space_ninja/proc/ntick(mob/living/carbon/human/U = affecting) - //set background = 1 - - //Runs in the background while the suit is initialized. - spawn while(cell.charge>=0) - - //Let's check for some safeties. - if(s_initialized&&!affecting) terminate()//Kills the suit and attached objects. - if(!s_initialized) return//When turned off the proc stops. - if(AI&&AI.stat==2)//If there is an AI and it's ded. Shouldn't happen without purging, could happen. - if(!s_control) - ai_return_control()//Return control to ninja if the AI was previously in control. - killai()//Delete AI. - - //Now let's do the normal processing. - if(s_coold) s_coold--//Checks for ability s_cooldown first. - var/A = 0 - s_regen//s_regen is the default energy regen each ntick, usually 5. - - if(U.stat == 2) - U << browse(null, "window=spideros") - explosion(U.loc, 0, 1, 3, 4) - del(n_gloves) - del(n_shoes) - del(n_mask) - del(n_hood) - U.gib() - return - if(!kamikaze) - if(blade_check(U))//If there is a blade held in hand. - A += s_cost - if(s_active)//If stealth is active. - A += s_cost - - else - if(prob(s_delay))//Suit delay is used as probability. May change later. - U.adjustBruteLoss(k_damage)//Default damage done, usually 1. - A = k_cost//kamikaze cost. - - cell.charge-=A - - if(src.cell.maxcharge < src.cell.charge) - src.cell.charge = src.cell.maxcharge - - if(cell.charge<=0) - if(kamikaze) - U.say("I DIE TO LIVE AGAIN!") - U << browse(null, "window=spideros")//Just in case. - explosion(U.loc, 1, 2, 3, 4) - del(n_gloves) - del(n_shoes) - del(n_mask) - del(n_hood) - U.gib() - return - cell.charge=0 - cancel_stealth() - sleep(10)//Checks every second. - -//=======//INITIALIZE//=======// - -/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=="MODE" && !s_initialized && !s_busy)//Shouldn't be busy... but anything is possible I guess. - s_busy = 1 - for(var/i,i<7,i++) - switch(i) - if(0) - U << "\blue Now initializing..." - if(1) - if(!lock_suit(U))//To lock the suit onto wearer. - break - U << "\blue Securing external locking mechanism...\nNeural-net established." - if(2) - U << "\blue Extending neural-net interface...\nNow monitoring brain wave pattern..." - if(3) - if(U.stat==2||U.health<=0) - U << "\red 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.hud_used.human_hud('icons/mob/screen1_NinjaHUD.dmi',"#ffffff",255) - U.regenerate_icons() - U << "\blue Linking neural-net interface...\nPattern \green GREEN\blue, continuing operation." - if(4) - U << "\blue VOID-shift device status: ONLINE.\nCLOAK-tech device status: ONLINE." - if(5) - U << "\blue Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [cell.maxcharge]." - if(6) - U << "\blue 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!="MODE")//Your run of the mill persons shouldn't know what it is. Or how to turn it on. - U << "You do not understand how this suit functions. Where the heck did it even come from?" - else if(s_initialized) - U << "\red The suit is already functioning. \black Please report this bug." - else - U << "\red ERROR: \black You cannot use this function at this time." - return - -//=======//DEINITIALIZE//=======// - -/obj/item/clothing/suit/space/space_ninja/proc/deinitialize(delay = s_delay) - if(affecting==loc&&!s_busy) - var/mob/living/carbon/human/U = affecting - if(!s_initialized) - U << "\red The suit is not initialized. \black 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||flush) - U << "\red ERROR: \black You cannot use this function at this time." - return - s_busy = 1 - for(var/i = 0,i<7,i++) - switch(i) - if(0) - U << "\blue Now de-initializing..." - remove_kamikaze(U)//Shutdowns kamikaze. - spideros = 0//Spideros resets. - if(1) - U << "\blue Logging off, [U:real_name]. Shutting down SpiderOS." - remove_ninja_verbs() - if(2) - U << "\blue Primary system status: OFFLINE.\nBackup system status: OFFLINE." - if(3) - U << "\blue VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE." - cancel_stealth()//Shutdowns stealth. - if(4) - U << "\blue Disconnecting neural-net interface...\greenSuccess\blue." - U.hud_used.instantiate() - U.regenerate_icons() - if(5) - U << "\blue Disengaging neural-net interface...\greenSuccess\blue." - if(6) - U << "\blue Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED." - blade_check(U,2) - remove_equip_verbs() - unlock_suit() - U.regenerate_icons() - sleep(delay) - s_busy = 0 - return - -//=======//SPIDEROS PROC//=======// - -/obj/item/clothing/suit/space/space_ninja/proc/display_spideros() - if(!affecting) return//If no mob is wearing the suit. I almost forgot about this variable. - var/mob/living/carbon/human/U = affecting - var/mob/living/silicon/ai/A = AI - var/display_to = s_control ? U : A//Who do we want to display certain messages to? - - var/dat = "SpiderOS" - dat += " Refresh" - if(spideros) - dat += " | Return" - dat += " | Close" - dat += "
" - if(s_control) - dat += "

SpiderOS v.1.337

" - dat += "Welcome, [U.real_name].
" - else - dat += "

SpiderOS v.ERR-RR00123

" - dat += "
" - dat += " Current Time: [worldtime2text()]
" - dat += " Battery Life: [round(cell.charge)] ([round(cell.charge/100)]%)
" - dat += " Smoke Bombs: \Roman [s_bombs]
" - dat += " pai Device: " - if(pai) - dat += "Configure" - dat += " | " - dat += "Eject" - else - dat += "None Detected" - dat += "

" - - switch(spideros) - if(0) - dat += "

Available Functions:

" - dat += "" - if(3) - dat += "

Medical Report:

" - if(U.dna) - dat += "Fingerprints: [md5(U.dna.uni_identity)]
" - dat += "Unique identity: [U.dna.unique_enzymes]
" - dat += "

Overall Status: [U.stat > 1 ? "dead" : "[U.health]% healthy"]

" - dat += "

Nutrition Status: [U.nutrition]

" - dat += "Oxygen loss: [U.getOxyLoss()]" - dat += " | Toxin levels: [U.getToxLoss()]
" - dat += "Burn severity: [U.getFireLoss()]" - dat += " | Brute trauma: [U.getBruteLoss()]
" - dat += "Radiation Level: [U.radiation] rad
" - dat += "Body Temperature: [U.bodytemperature-T0C]°C ([U.bodytemperature*1.8-459.67]°F)
" - - dat += "" - if(1) - dat += "

Atmospheric Scan:

"//Headers don't need breaks. They are automatically placed. - var/turf/T = get_turf_or_move(U.loc) - if (isnull(T)) - dat += "Unable to obtain a reading." - else - var/datum/gas_mixture/environment = T.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles() - - dat += "Air Pressure: [round(pressure,0.1)] kPa" - - if (total_moles) - var/o2_level = environment.oxygen/total_moles - var/n2_level = environment.nitrogen/total_moles - var/co2_level = environment.carbon_dioxide/total_moles - var/plasma_level = environment.toxins/total_moles - var/unknown_level = 1-(o2_level+n2_level+co2_level+plasma_level) - dat += "
    " - dat += "
  • Nitrogen: [round(n2_level*100)]%
  • " - dat += "
  • Oxygen: [round(o2_level*100)]%
  • " - dat += "
  • Carbon Dioxide: [round(co2_level*100)]%
  • " - dat += "
  • Plasma: [round(plasma_level*100)]%
  • " - dat += "
" - if(unknown_level > 0.01) - dat += "OTHER: [round(unknown_level)]%
" - - dat += "Temperature: [round(environment.temperature-T0C)]°C" - if(2) - if(k_unlock==7||!s_control) - dat += " Hidden Menu" - dat += "

Anonymous Messenger:

"//Anonymous because the receiver will not know the sender's identity. - dat += "

Detected PDAs:

" - dat += "
    " - var/count = 0 - for (var/obj/item/device/pda/P in world) - if (!P.owner||P.toff) - continue - dat += "
  • [P]" - dat += "
  • " - count++ - dat += "
" - if (count == 0) - dat += "None detected.
" - if(32) - dat += "

Hidden Menu:

" - if(s_control) - dat += "Please input password: " - dat += "HERE
" - dat += "
" - dat += "Remember, you will not be able to recharge energy during this function. If energy runs out, the suit will auto self-destruct.
" - dat += "Use with caution. De-initialize the suit when energy is low." - else - //Only leaving this in for funnays. CAN'T LET YOU DO THAT STAR FOX - dat += "WARNING: Hostile runtime intrusion detected: operation locked. The Spider Clan is watching you, INTRUDER." - dat += "ERROR: TARANTULA.v.4.77.12 encryption algorithm detected. Unable to decrypt archive.
" - if(4) - dat += {" -

Ninja Manual:

-
Who they are:
- Space ninjas are a special type of ninja, specifically one of the space-faring type. The vast majority of space ninjas belong to the Spider Clan, a cult-like sect, which has existed for several hundred years. The Spider Clan practice a sort of augmentation of human flesh in order to achieve a more perfect state of being and follow Postmodern Space Bushido. They also kill people for money. Their leaders are chosen from the oldest of the grand-masters, people that have lived a lot longer than any mortal man should.
Being a sect of technology-loving fanatics, the Spider Clan have the very best to choose from in terms of hardware--cybernetic implants, exoskeleton rigs, hyper-capacity batteries, and you get the idea. Some believe that much of the Spider Clan equipment is based on reverse-engineered alien technology while others doubt such claims.
Whatever the case, their technology is absolutely superb. -
How they relate to other SS13 organizations:
-
    -
  • *Nanotrasen and the Syndicate are two sides of the same coin and that coin is valuable.
  • -
  • *The Space Wizard Federation is a problem, mainly because they are an extremely dangerous group of unpredictable individuals--not to mention the wizards hate technology and are in direct opposition of the Spider Clan. Best avoided or left well-enough alone. How to battle: wizards possess several powerful abilities to steer clear off. Blind in particular is a nasty spell--jaunt away if you are blinded and never approach a wizard in melee. Stealth may also work if the wizard is not wearing thermal scanners--don't count on this. Run away if you feel threatened and await a better opportunity.
  • -
  • *Changeling Hivemind: extremely dangerous and to be killed on sight. How to battle: they will likely try to absorb you. Adrenaline boost, then phase shift into them. If you get stung, use SpiderOS to inject counter-agents. Stealth may also work but detecting a changeling is the real battle.
  • -
  • *Xeno Hivemind: their skulls make interesting kitchen decorations and are challenging to best, especially in larger nests. How to battle: they can see through your stealth guise and energy stars will not work on them. Best killed with a Phase Shift or at range. If you happen on a projectile stun weapon, use it and then close in to melee.
  • -
-
The reason they (you) are here:
- Space ninjas are renowned throughout the known controlled space as fearless spies, infiltrators, and assassins. They are sent on missions of varying nature by Nanotrasen, the Syndicate, and other shady organizations and people. To hire a space ninja means serious business. -
Their playstyle:
- A mix of traitor, changeling, and wizard. Ninjas rely on energy, or electricity to be precise, to keep their suits running (when out of energy, a suit hibernates). Suits gain energy from objects or creatures that contain electrical charge. APCs, cell batteries, rechargers, SMES batteries, cyborgs, mechs, and exposed wires are currently supported. Through energy ninjas gain access to special powers--while all powers are tied to the ninja suit, the most useful of them are verb activated--to help them in their mission.
It is a constant struggle for a ninja to remain hidden long enough to recharge the suit and accomplish their objective; despite their arsenal of abilities, ninjas can die like any other. Unlike wizards, ninjas do not possess good crowd control and are typically forced to play more subdued in order to achieve their goals. Some of their abilities are specifically designed to confuse and disorient others.
With that said, it should be perfectly possible to completely flip the fuck out and rampage as a ninja. -
Their powers:
- There are two primary types: Equipment and Abilties. Passive effect are always on. Active effect must be turned on and remain active only when there is energy to do so. Ability costs are listed next to them. - Equipment: cannot be tracked by AI (passive), faster speed (passive), stealth (active), vision switch (passive if toggled), voice masking (passive), SpiderOS (passive if toggled), energy drain (passive if toggled). -
    -
  • Voice masking generates a random name the ninja can use over the radio and in-person. Although, the former use is recommended.
  • -
  • Toggling vision cycles to one of the following: thermal, meson, or darkness vision. The starting mode allows one to scout the identity of those in view, revealing their role. Traitors, revolutionaries, wizards, and other such people will be made known to you.
  • -
  • Stealth, when activated, drains more battery charge and works similarly to a syndicate cloak. The cloak will deactivate when most Abilities are utilized.
  • -
  • On-board AI: The suit is able to download an AI much like an intelicard. Check with SpiderOS for details once downloaded.
  • -
  • SpiderOS is a specialized, PDA-like screen that allows for a small variety of functions, such as injecting healing chemicals directly from the suit. You are using it now, if that was not already obvious. You may also download AI modules directly to the OS.
  • -
- Abilities: -