diff --git a/code/defines/mob/mob.dm b/code/defines/mob/mob.dm index 0f9d728919d..2df25dc0807 100644 --- a/code/defines/mob/mob.dm +++ b/code/defines/mob/mob.dm @@ -169,9 +169,18 @@ var/say_message = null // When you are understood by others. Currently only used by aliens and monkeys in their say_quote procs //Generic list for proc holders. Only way I can see to enable certain verbs/procs. Should be modified if needed. - var/proc_holder_list[] = list()//Right now only displays for the AI. + var/proc_holder_list[] = list()//Right now unused. //Also unlike the spell list, this would only store the object in contents, not an object in itself. + /* Add this line to whatever stat module you need in order to use the proc holder list. + Unlike the object spell system, it's also possible to attach verb procs from these objects to right-click menus. + This requires creating a verb for the object proc holder. + + if (proc_holder_list.len)//Generic list for proc_holder objects. + for(var/obj/proc_holder/P in proc_holder_list) + statpanel("[P.panel]","",P) + */ + //Wizard mode, but can be used in other modes thanks to the brand new "Give Spell" badmin button var/obj/proc_holder/spell/list/spell_list = list() diff --git a/code/game/gamemodes/extra/ninja_abilities.dm b/code/game/gamemodes/extra/ninja_abilities.dm index e2cb156e799..f625421639c 100644 --- a/code/game/gamemodes/extra/ninja_abilities.dm +++ b/code/game/gamemodes/extra/ninja_abilities.dm @@ -23,9 +23,7 @@ In the case that they are not, I imagine the game will run-time error like crazy return 1 switch(X) if(1) - if(s_active) - U << "\red You must deactivate the CLOAK-tech device prior to using this ability." - return 1 + cancel_stealth()//Get rid of it. if(2) if(s_bombs<=0) U << "\red There are no more smoke bombs remaining." @@ -84,7 +82,7 @@ In the case that they are not, I imagine the game will run-time error like crazy spawn(0) spark_system.start() - playsound(U.loc, 'Deconstruct.ogg', 50, 1) + playsound(U.loc, 'phasein.ogg', 25, 1) playsound(U.loc, "sparks", 50, 1) anim(U.loc,U,'mob.dmi',,"phasein") @@ -123,7 +121,7 @@ In the case that they are not, I imagine the game will run-time error like crazy spawn(0) spark_system.start() - playsound(U.loc, 'Deconstruct.ogg', 50, 1) + playsound(U.loc, 'phasein.ogg', 25, 1) playsound(U.loc, 'sparks2.ogg', 50, 1) anim(U.loc,U,'mob.dmi',,"phasein") @@ -336,7 +334,7 @@ Allows to gib up to five squares in a straight line. Seriously.*/ spawn(0) spark_system.start() - playsound(U.loc, 'Deconstruct.ogg', 50, 1) + playsound(U.loc, 'phasein.ogg', 25, 1) playsound(U.loc, "sparks", 50, 1) anim(U.loc,U,'mob.dmi',,"phasein") s_coold = 1 @@ -408,7 +406,7 @@ Allows to gib up to five squares in a straight line. Seriously.*/ spawn(0) spark_system.start() - playsound(U.loc, 'Deconstruct.ogg', 50, 1) + playsound(U.loc, 'phasein.ogg', 25, 1) playsound(U.loc, "sparks", 50, 1) anim(U.loc,U,'mob.dmi',,"phasein") s_coold = 1 diff --git a/code/game/gamemodes/extra/ninja_equipment.dm b/code/game/gamemodes/extra/ninja_equipment.dm index 60d487a3407..b27dcb1b28d 100644 --- a/code/game/gamemodes/extra/ninja_equipment.dm +++ b/code/game/gamemodes/extra/ninja_equipment.dm @@ -34,9 +34,16 @@ ________________________________________________________________________________ ..() return +/obj/item/clothing/suit/space/space_ninja/proc/terminate() +//Simply deletes all the attachments and self, killing all related procs. + del(n_hood) + del(n_gloves) + del(n_shoes) + del(src) + /obj/item/clothing/suit/space/space_ninja/proc/killai(var/mob/living/silicon/ai/A as mob) if(A.client) - A << "\red Self-destruct protocol dete-- *bzzzzz*" + A << "\red Self-erase protocol dete-- *bzzzzz*" A << browse(null, "window=hack spideros") AI = null A.death(1)//Kill @@ -51,11 +58,63 @@ ________________________________________________________________________________ U << "\red ERROR: \black Remote access channel disabled." 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" + + toggle_stealth() + return + +/obj/item/clothing/suit/space/space_ninja/proc/toggle_stealth() + var/mob/living/carbon/human/U = affecting + + /* This was a test for a new cloaking system. WIP. + if(!s_active) + spawn(0) + anim(U.loc,U,'mob.dmi',,"cloak") + var/image/I = image('mob.dmi',affecting,"ninjatest2") + for(var/mob/O in oviewers(U, null)) + O << "[U.name] vanishes into thin air!" + I.override = 1 + affecting << I + s_active = !s_active + else + spawn(0) + anim(U.loc,U,'mob.dmi',,"uncloak") + for(var/mob/O in oviewers(U, null)) + O << "[U.name] appears from thin air!" + s_active = !s_active + */ + + if(s_active) + cancel_stealth() + else + spawn(0) + anim(U.loc,U,'mob.dmi',,"cloak") + s_active=!s_active + U << "\blue You are now invisible to normal detection." + for(var/mob/O in oviewers(U)) + O.show_message("[U.name] vanishes into thin air!",1) + return + +/obj/item/clothing/suit/space/space_ninja/proc/cancel_stealth() + var/mob/living/carbon/human/U = affecting + if(s_active) + spawn(0) + anim(U.loc,U,'mob.dmi',,"uncloak") + s_active=!s_active + U << "\blue You are now visible." + for(var/mob/O in oviewers(U)) + O.show_message("[U.name] appears from thin air!",1) + return 1 + return 0 + /obj/item/clothing/suit/space/space_ninja/proc/ntick(var/mob/living/carbon/human/U as mob) set background = 1 spawn while(cell.charge>=0)//Runs in the background while the suit is initialized. - if(affecting.monkeyizing) terminate()//Kills the suit and attached objects. + if(affecting&&affecting.monkeyizing) terminate()//Kills the suit and attached objects. if(!s_initialized) return//When turned off the proc stops. if(s_coold) s_coold--//Checks for ability s_cooldown. var/A = 5//Energy cost each tick. @@ -69,15 +128,13 @@ ________________________________________________________________________________ U.swap_hand()//swap hand U.drop_item()//drop sword else A += 20 - if(s_active) + if(s_active)//If stealth is active. A += 25 else if(prob(25)) U.bruteloss += 1 A = 200 cell.charge-=A - if(U.stat)//If the ninja gets paralyzed, they can still try and jaunt away (since they can adrenaline boost and then jaunt). - s_active=0 if(cell.charge<=0) if(kamikaze) U.say("I DIE TO LIVE AGAIN!") @@ -85,16 +142,9 @@ ________________________________________________________________________________ U.death() return cell.charge=0 - s_active=0 + cancel_stealth() sleep(10)//Checks every second. -/obj/item/clothing/suit/space/space_ninja/proc/terminate() -//Simply deletes all the attachments and self. - del(n_hood) - del(n_gloves) - del(n_shoes) - del(src) - /obj/item/clothing/suit/space/space_ninja/proc/init() set name = "Initialize Suit" set desc = "Initializes the suit for field operation." @@ -140,7 +190,10 @@ ________________________________________________________________________________ canremove=1 verbs += /obj/item/clothing/suit/space/space_ninja/proc/init return - icon_state = "s-ninjan" + if(U.gender==FEMALE) + icon_state = "s-ninjanf" + else + icon_state = "s-ninjan" U.gloves.icon_state = "s-ninjan" U.gloves.item_state = "s-ninjan" U.update_clothing() @@ -154,6 +207,7 @@ ________________________________________________________________________________ grant_ninja_verbs() verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros + verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth n_gloves.verbs += /obj/item/clothing/gloves/space_ninja/proc/drain_wire n_gloves.verbs += /obj/item/clothing/gloves/space_ninja/proc/toggled affecting=U @@ -200,7 +254,7 @@ ________________________________________________________________________________ sleep(40) U << "\blue VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE." if(s_active)//Shutdowns stealth. - s_active=!s_active + cancel_stealth() sleep(40) if(U.stat||U.health<=0) U << "\red FATAL ERROR: 412--GG##&77 BRAIN WAV3 PATT$RN RED\nI-I-INITIATING S-SELf DeStrCuCCCT%$#@@!!$^#!..." @@ -235,6 +289,7 @@ ________________________________________________________________________________ affecting=null slowdown=1 verbs += /obj/item/clothing/suit/space/space_ninja/proc/init + verbs -= /obj/item/clothing/suit/space/space_ninja/proc/stealth icon_state = "s-ninja" U.update_clothing() @@ -376,7 +431,7 @@ ________________________________________________________________________________ dat += "" @@ -432,8 +487,7 @@ ________________________________________________________________________________ dat += "

Laws:

" if (A.stat == 2)//If AI dies while inside the card, such as suiciding. - AI = null - del(A)//Delete A. + killai(A) U << "Artificial Intelligence has self-terminated. Rebooting..." spideros()//Refresh. else @@ -501,20 +555,8 @@ ________________________________________________________________________________ // var/return_to = copytext(temp, 1, (length(temp)))//length has to be to the length of the thing because by default it's length+1 // spideros = text2num(return_to)//Maximum length here is 6. Use (return_to, X) to specify larger strings if needed. if("Stealth") - if(s_active) - spawn(0) - anim(U.loc,U,'mob.dmi',,"uncloak") - s_active=!s_active - U << "\blue You are now visible." - for(var/mob/O in oviewers(U, null)) - O << "[U.name] appears from thin air!" - else - spawn(0) - anim(U.loc,U,'mob.dmi',,"cloak") - s_active=!s_active - U << "\blue You are now invisible to normal detection." - for(var/mob/O in oviewers(U, null)) - O << "[U.name] vanishes into thin air!" + toggle_stealth() + if("0")//Menus are numbers, see note above. 0 is the hub. spideros=0 if("1")//Begin normal menus 1-9. @@ -560,7 +602,10 @@ ________________________________________________________________________________ U << "\red Do or Die, LET'S ROCK!!" if(verbs.Find(/obj/item/clothing/suit/space/space_ninja/proc/deinit))//To hopefully prevent engaging kamikaze and de-initializing at the same time. grant_kamikaze_verbs() - icon_state = "s-ninjak" + if(U.gender==FEMALE) + icon_state = "s-ninjakf" + else + icon_state = "s-ninjak" if(n_gloves) n_gloves.icon_state = "s-ninjak" n_gloves.item_state = "s-ninjak" @@ -642,11 +687,12 @@ ________________________________________________________________________________ U << "\red WARNING: PRO0GRE--S 2&3%" verbs -= /obj/item/clothing/suit/space/space_ninja/proc/deinit verbs -= /obj/item/clothing/suit/space/space_ninja/proc/spideros + verbs -= /obj/item/clothing/suit/space/space_ninja/proc/stealth sleep(40) if(AI==A) A << "Shutting down external protocol..." U << "\red WARNING: PPPFRRROGrESS 677^%" - s_active = 0 + cancel_stealth() sleep(40) if(AI==A) A << "Connecting to kernel..." @@ -685,9 +731,6 @@ ________________________________________________________________________________ A << browse(null, "window=hack spideros") return - //Remove this if verbs work. - var/obj/proc_holder/ai_hack_ninja/ninja_spideros = locate() in A//What is the object granting access to proc? Find it. - switch(href_list["choice"]) if("Close") A << browse(null, "window=hack spideros") @@ -729,9 +772,7 @@ ________________________________________________________________________________ return if(isnull(P)||P.toff)//So it doesn't freak out if the object no-longer exists. A << "\red Error: unable to deliver message." - //hack_spideros() - //Remove this if verbs work. - ninja_spideros.Click() + hack_spideros() return P.tnote += "← From [A]:
[t]
"//Oh ai, u so silly if (!P.silent) @@ -837,9 +878,7 @@ ________________________________________________________________________________ U << "[href_list["choice"]] suddenly triggered!" ninjaboost() - //hack_spideros()//Calls spideros for AI. - //Remove this if verbs work. - ninja_spideros.Click() + hack_spideros() return /obj/item/clothing/suit/space/space_ninja/examine() @@ -1246,8 +1285,8 @@ ________________________________________________________________________________ set src in view() ..() - var/mode = "Night Vision" - var/voice = "inactive" + var/mode + var/voice switch(mode) if(0) mode = "Scouter" @@ -1316,17 +1355,14 @@ The sprite for the net is kind of ugly but I couldn't come up with a better one. switch(severity) if(1.0) health-=50 - healthcheck() if(2.0) health-=50 - healthcheck() if(3.0) if (prob(50)) health-=50 - healthcheck() else health-=25 - healthcheck() + healthcheck() return /obj/effects/energy_net/blob_act() diff --git a/code/game/gamemodes/extra/space_ninja.dm b/code/game/gamemodes/extra/space_ninja.dm index 830ed937729..4a3efe76e2b 100644 --- a/code/game/gamemodes/extra/space_ninja.dm +++ b/code/game/gamemodes/extra/space_ninja.dm @@ -6,7 +6,35 @@ ________________________________________________________________________________ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -/client/proc/space_ninja() +/proc/space_ninja_arrival()//This is the random event proc. WIP + /* + var/datum/game_mode/current_mode = ticker.mode + switch (current_mode.config_tag) + if ("revolution") + + + if ("cult") + if (src in current_mode:cult) + + + if ("wizard") + if (current_mode:wizard && src == current_mode:wizard) + + + if ("changeling") + if (src in current_mode:changelings) + + + if ("malfunction") + if (src in current_mode:malf_ai) + + + if ("nuclear") + if(src in current_mode:syndicates) + */ + return + +/client/proc/space_ninja()//This is the admin button. set category = "Fun" set name = "Spawn Space Ninja" set desc = "Spawns a space ninja for when you need a teenager with an attitude." @@ -19,31 +47,31 @@ ________________________________________________________________________________ if(alert("Are you sure you want to send in a space ninja?",,"Yes","No")=="No") return - var/input = null + var/input while(!input) input = input(src, "Please specify which mission the space ninja shall undertake.", "Specify Mission", "") if(!input) if(alert("Error, no mission set. Do you want to exit the setup process?",,"Yes","No")=="Yes") return - var/list/locList = list() + var/list/spawn_list = list() for(var/obj/landmark/X in world) if (X.name == "carpspawn") - locList.Add(X) - if(!locList.len) + spawn_list.Add(X) + if(!spawn_list.len) alert("No spawn location could be found. Aborting.") return var/admin_name = src - var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(locList)) + var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(spawn_list)) var/mob/dead/observer/G var/list/candidates = list() for(G in world) - if(G.client) //Was restricted to non-admins before. Removed the admin check, as it is retarded. -- Urist - //if(((G.client.inactivity/10)/60) <= 5) //Again, removed a check. Usually when an admin makes a ninja, they ask that person first, so the check is redundant. - //I've also got reports of even non-admins that asked for ninjaification being exempt from the ninja list, which I believe that check is responsible for. - candidates.Add(G) + if(G.client&&!G.client.holder) + //if(G.client)//Good for testing. Admins can spawn ninja equipment if they want to. + if(((G.client.inactivity/10)/60) <= 5) + candidates.Add(G) if(candidates.len) G = input("Pick character to spawn as the Space Ninja", "Active Players", G) in candidates//It will auto-pick a person when there is only one candidate. new_ninja.mind.key = G.key @@ -134,8 +162,10 @@ client/proc/create_space_ninja(obj/spawn_point) verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjawalk verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjamirage + verbs -= /obj/item/clothing/suit/space/space_ninja/proc/stealth + kamikaze = 1 - s_active = 0 + cancel_stealth() /obj/item/clothing/suit/space/space_ninja/proc/remove_kamikaze_verbs() verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift @@ -148,16 +178,17 @@ client/proc/create_space_ninja(obj/spawn_point) verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjawalk verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjamirage + verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth + kamikaze = 0 k_unlock = 0 -/*Commented out due to BYOND bugs. Workaround used instead for the time being. - /obj/item/clothing/suit/space/space_ninja/proc/grant_AI_verbs() verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_hack_ninja verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_return_control verbs -= /obj/item/clothing/suit/space/space_ninja/proc/deinit verbs -= /obj/item/clothing/suit/space/space_ninja/proc/spideros + verbs -= /obj/item/clothing/suit/space/space_ninja/proc/stealth s_control = 0 @@ -166,33 +197,7 @@ client/proc/create_space_ninja(obj/spawn_point) verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_return_control verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros - - s_control = 1 -*/ - -/obj/item/clothing/suit/space/space_ninja/proc/grant_AI_verbs() - var/obj/proc_holder/ai_return_control/A_C = new(AI) - var/obj/proc_holder/ai_hack_ninja/B_C = new(AI) - var/obj/proc_holder/ai_instruction/C_C = new(AI) - new/obj/proc_holder/ai_holo_clear(AI) - AI.proc_holder_list += A_C - AI.proc_holder_list += B_C - AI.proc_holder_list += C_C - - s_control = 0 - -/obj/item/clothing/suit/space/space_ninja/proc/remove_AI_verbs() - var/obj/proc_holder/ai_return_control/A_C = locate() in AI - var/obj/proc_holder/ai_hack_ninja/B_C = locate() in AI - var/obj/proc_holder/ai_instruction/C_C = locate() in AI - var/obj/proc_holder/ai_holo_clear/D_C = locate() in AI - del(A_C) - del(B_C) - del(C_C) - del(D_C) - AI.proc_holder_list = list() - verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit - verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros + verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth s_control = 1 @@ -215,9 +220,7 @@ client/proc/create_space_ninja(obj/spawn_point) affecting << I affecting << "An image flicks to life nearby. It appears visible to you only." - var/obj/proc_holder/ai_holo_clear/D_C = locate() in AI - AI.proc_holder_list += D_C - //verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_holo_clear + verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_holo_clear ai_holo_process()//Move to initialize else @@ -234,22 +237,10 @@ client/proc/create_space_ninja(obj/spawn_point) del(hologram.i_attached) del(hologram) - if(!s_control)//Meant to be used all the time but for now this'll do. - var/obj/proc_holder/ai_holo_clear/D_C = locate() in AI - AI.proc_holder_list -= D_C - //verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_holo_clear - + verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_holo_clear return sleep(10)//Checks every second. - -/*I've tried a lot of stuff but adding verbs to the AI while inside an object, inside another object, did not want to work properly. -This is the best work-around I could come up with. Uses objects to then display to panel, based on the object spell system. -Can be added on to pretty easily. -Leaving this commented out until BYOND fixes the verb panel bug. - -It would be better to switch to this (from proc_holder) if the bug does get fixed. - /obj/item/clothing/suit/space/space_ninja/proc/ai_instruction()//Let's the AI know what they can do. set name = "Instructions" set desc = "Displays a list of helpful information." @@ -289,64 +280,7 @@ It would be better to switch to this (from proc_holder) if the bug does get fixe AI << "You have seized your hacking attempt. [affecting] has regained control." affecting << "UPDATE: [AI.real_name] has ceased hacking attempt. All systems clear." - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_holo_clear - - return -*/ - -//Workaround -/obj/proc_holder/ai_holo_clear - name = "Clear Hologram" - desc = "Stops projecting the current holographic image." - panel = "AI Ninja Equip" - density = 0 - opacity = 0 - - -/obj/proc_holder/ai_holo_clear/Click() - var/obj/item/clothing/suit/space/space_ninja/S = loc.loc//This is so stupid but makes sure certain things work. AI.SUIT - del(S.hologram.i_attached) - del(S.hologram) - var/obj/proc_holder/ai_holo_clear/D_C = locate() in S.AI - S.AI.proc_holder_list -= D_C - return - -/obj/proc_holder/ai_instruction//Let's the AI know what they can do. - name = "Instructions" - desc = "Displays a list of helpful information." - panel = "AI Ninja Equip" - density = 0 - opacity = 0 - -/obj/proc_holder/ai_instruction/Click() - loc << "The menu you are seeing will contain other commands if they become available.\nRight click a nearby turf to display an AI Hologram. It will only be visible to you and your host. You can move it freely using normal movement keys--it will disappear if placed too far away." - -/obj/proc_holder/ai_hack_ninja//Generic proc holder to make sure the two verbs below work propely. - name = "Hack SpiderOS" - desc = "Hack directly into the Black Widow(tm) neuro-interface." - panel = "AI Ninja Equip" - density = 0 - opacity = 0 - -/obj/proc_holder/ai_hack_ninja/Click()//When you click on it. - var/obj/item/clothing/suit/space/space_ninja/S = loc.loc - S.hack_spideros() - return - -/obj/proc_holder/ai_return_control - name = "Relinquish Control" - desc = "Return control to the user." - panel = "AI Ninja Equip" - density = 0 - opacity = 0 - -/obj/proc_holder/ai_return_control/Click() - var/mob/living/silicon/ai/A = loc - var/obj/item/clothing/suit/space/space_ninja/S = A.loc - A << browse(null, "window=hack spideros")//Close window - A << "You have seized your hacking attempt. [S.affecting] has regained control." - S.affecting << "UPDATE: [A.real_name] has ceased hacking attempt. All systems clear." - S.remove_AI_verbs() + verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_return_control return /obj/item/clothing/suit/space/space_ninja/proc/hack_spideros() @@ -466,6 +400,99 @@ It would be better to switch to this (from proc_holder) if the bug does get fixe A << browse(dat,"window=hack spideros;size=400x444;border=1;can_resize=0;can_close=0;can_minimize=0") + +//OLD & UNUSED=================================== + +/* +I've tried a lot of stuff but adding verbs to the AI while inside an object, inside another object, did not want to work properly. +This was the best work-around I could come up with at the time. Uses objects to then display to panel, based on the object spell system. +Can be added on to pretty easily. + +BYOND fixed the verb bugs so this is no longer necessary. I prefer verb panels. + +/obj/item/clothing/suit/space/space_ninja/proc/grant_AI_verbs() + var/obj/proc_holder/ai_return_control/A_C = new(AI) + var/obj/proc_holder/ai_hack_ninja/B_C = new(AI) + var/obj/proc_holder/ai_instruction/C_C = new(AI) + new/obj/proc_holder/ai_holo_clear(AI) + AI.proc_holder_list += A_C + AI.proc_holder_list += B_C + AI.proc_holder_list += C_C + + s_control = 0 + +/obj/item/clothing/suit/space/space_ninja/proc/remove_AI_verbs() + var/obj/proc_holder/ai_return_control/A_C = locate() in AI + var/obj/proc_holder/ai_hack_ninja/B_C = locate() in AI + var/obj/proc_holder/ai_instruction/C_C = locate() in AI + var/obj/proc_holder/ai_holo_clear/D_C = locate() in AI + del(A_C) + del(B_C) + del(C_C) + del(D_C) + AI.proc_holder_list = list() + verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit + verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros + verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth + + s_control = 1 + +//Workaround +/obj/proc_holder/ai_holo_clear + name = "Clear Hologram" + desc = "Stops projecting the current holographic image." + panel = "AI Ninja Equip" + density = 0 + opacity = 0 + + +/obj/proc_holder/ai_holo_clear/Click() + var/obj/item/clothing/suit/space/space_ninja/S = loc.loc//This is so stupid but makes sure certain things work. AI.SUIT + del(S.hologram.i_attached) + del(S.hologram) + var/obj/proc_holder/ai_holo_clear/D_C = locate() in S.AI + S.AI.proc_holder_list -= D_C + return + +/obj/proc_holder/ai_instruction//Let's the AI know what they can do. + name = "Instructions" + desc = "Displays a list of helpful information." + panel = "AI Ninja Equip" + density = 0 + opacity = 0 + +/obj/proc_holder/ai_instruction/Click() + loc << "The menu you are seeing will contain other commands if they become available.\nRight click a nearby turf to display an AI Hologram. It will only be visible to you and your host. You can move it freely using normal movement keys--it will disappear if placed too far away." + +/obj/proc_holder/ai_hack_ninja//Generic proc holder to make sure the two verbs below work propely. + name = "Hack SpiderOS" + desc = "Hack directly into the Black Widow(tm) neuro-interface." + panel = "AI Ninja Equip" + density = 0 + opacity = 0 + +/obj/proc_holder/ai_hack_ninja/Click()//When you click on it. + var/obj/item/clothing/suit/space/space_ninja/S = loc.loc + S.hack_spideros() + return + +/obj/proc_holder/ai_return_control + name = "Relinquish Control" + desc = "Return control to the user." + panel = "AI Ninja Equip" + density = 0 + opacity = 0 + +/obj/proc_holder/ai_return_control/Click() + var/mob/living/silicon/ai/A = loc + var/obj/item/clothing/suit/space/space_ninja/S = A.loc + A << browse(null, "window=hack spideros")//Close window + A << "You have seized your hacking attempt. [S.affecting] has regained control." + S.affecting << "UPDATE: [A.real_name] has ceased hacking attempt. All systems clear." + S.remove_AI_verbs() + return +*/ + //DEBUG=================================== /* @@ -590,7 +617,7 @@ mob/verb/remove_object_panel() I made this as a test for a possible ninja ability (or perhaps more) for a certain mob to see hallucinations. The thing here is that these guys have to be coded to do stuff as they are simply images that you can't even click on. -Their movement is also awkward and overlaps. +That is why you attached them to objects. /mob/verb/TestNinjaShadow() set name = "Test Ninja Ability" set category = "Ninja Debug" @@ -599,7 +626,7 @@ Their movement is also awkward and overlaps. var/safety = 4 for(var/turf/T in oview(5)) if(prob(20)) - var/current_clone = image('mob.dmi',T,"s-ninja",dir) + var/current_clone = image('mob.dmi',T,"s-ninja") safety-- spawn(0) src << current_clone diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index 31c3c44805e..e5fb93f5865 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -42,7 +42,7 @@ avnums.Remove(tempnum) BLINDBLOCK = tempnum -/* This was use for something before, I think, but is not worth the effort to process now. +/* This was used for something before, I think, but is not worth the effort to process now. /proc/setupcorpses() for (var/obj/landmark/A in world) if (A.name == "Corpse") diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 3c8a5b9d7b5..0c8b5a3639f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1353,8 +1353,6 @@ l_hand.screen_loc = ui_lhand - - var/shielded = 0 for (var/obj/item/device/shield/S in src) if (S.active) @@ -1366,10 +1364,8 @@ shielded = 2 break - for (var/obj/item/clothing/suit/space/space_ninja/S in src)//Same as a regular cloaking device but more ninja./N - if (S.s_active) - shielded = 2 - break + if(istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)&&wear_suit:s_active) + shielded = 2 if (shielded == 2) invisibility = 2 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index e5f609acb51..1e3f2eefc63 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -78,10 +78,6 @@ else stat(null, text("Systems nonfunctional")) - if (proc_holder_list.len)//Generic list for proc_holder objects. - for(var/obj/proc_holder/P in proc_holder_list) - statpanel("[P.panel]","",P) - /mob/living/silicon/ai/proc/ai_alerts() set category = "AI Commands" set name = "Show Alerts" diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index cf40ec5e6c3..72f43059fef 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 53b05c89522..245c5b998ff 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/sound/effects/phasein.ogg b/sound/effects/phasein.ogg new file mode 100644 index 00000000000..9bb4d443f0d Binary files /dev/null and b/sound/effects/phasein.ogg differ