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 += "
"
dat += "- Voice masking generates a random name the ninja can use over the radio and in-person. Although, the former use is recommended.
"
dat += "- 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.
"
- dat += "- Stealth, when activated, drains more battery charge and works similarly to a syndicate cloak.
"
+ dat += "- Stealth, when activated, drains more battery charge and works similarly to a syndicate cloak. The cloak will deactivate when most Abilities are utilized.
"
dat += "- On-board AI: The suit is able to download an AI much like an intelicard. Check with SpiderOS for details once downloaded.
"
dat += "- 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.
"
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