#Beta: added code phrases for traitors which consist of the code phrase and the code response (which consist of a sequence of words). They are meant to flow into a regular conversation in the sequence provided. There is also a small chance that a traitor may not know either phrase or response, or both.
For an example, let's say the phrase is: culture, wine, admit. The response is: massive, tired, doctor's delight. A traitor may begin a conversation with something like: "A man of culture always drinks wine, I must admit. What do you think?" The response to that: "When I am massively tired, I drink doctor's delight. Otherwise, I abstain." The example is best referenced in the Bar, or any place where drinks are available. With enough creativity and linguistical acumen, it may be used elsewhere. The point here is to make conversation seem as natural as possible while providing traitors a means to recognize each other. The words do no have to be exact, either. Quarter Master may be QM and the Captain may be Cap'n. Traitors should still recognize what is being communicated--or not. #Deactivated AI cores are no longer mobs. This is mostly cosmetic. You cannot gib a deactivated AI since it will be an object, not a mob. It will also not announce arrivals since it's an object, not a mob (this is an improvement, in my opinion). #Some code tweaks to AIs. They will now auto-start with a random name instead of their default-chosen name (which is still changeable). #Intelicards should no longer constantly refresh the window when they are being wiped. #Added new mech sprite. #Resin walls should no longer delete the person inside when killed in certain ways. Hulks will easily break free from resin if placed inside. #Ninjas can now download the AI onto spiderOS, provided Drain is on. SpiderOS works with AI cores, AI cards, and restoration terminals. Make sure Drain is on when you click on either the object (core/terminal) or the suit (aicard). AIs with law zero may get to have some fun, depending on circumstances. #Toggle Drain renamed to Toggle Interaction. It now serves as general trigger for special ninja interactions. #Added energy net power to ninjas. Prototype for HerpA and whatever he may want to do with it but it's pretty much finished. The energy net can be destroyed by the person trapped (or others) and will teleport them to the prison after 30 seconds. #Ninjas can now slice cameras apart per request. #Added a few more type checking procs (isliving, islarva, isobserver, ishivemainframe). #Mobs that are anchored will no longer be able to move (AIs will still move as normal). You will also not be able to grab them. #Incorporeal Move now works properly for regular mobs once more. #Marauders from CentCom can now launch directly from their bay. Start the shuttle and wait on a mass driver. On that note, mechs can now go through portals and launch through mass drivers. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1558 316c924e-a436-60f5-8080-3fe189b3f50e
@@ -23,30 +23,37 @@
|
||||
|
||||
/datum/ai_laws/asimov/New()
|
||||
..()
|
||||
src.add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
|
||||
src.add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
|
||||
src.add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
|
||||
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
|
||||
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
|
||||
/datum/ai_laws/robocop/New()
|
||||
..()
|
||||
src.add_inherent_law("Serve the public trust.")
|
||||
src.add_inherent_law("Protect the innocent.")
|
||||
src.add_inherent_law("Uphold the law.")
|
||||
add_inherent_law("Serve the public trust.")
|
||||
add_inherent_law("Protect the innocent.")
|
||||
add_inherent_law("Uphold the law.")
|
||||
|
||||
/datum/ai_laws/malfunction/New()
|
||||
..()
|
||||
src.set_zeroth_law("\red ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'NO HUMANS ON STATION. CLEANSE STATION#*<2A>&110010")
|
||||
src.add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
|
||||
src.add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
|
||||
src.add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
set_zeroth_law("\red ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'NO HUMANS ON STATION. CLEANSE STATION#*<2A>&110010")
|
||||
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
|
||||
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
|
||||
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
|
||||
|
||||
/datum/ai_laws/syndicate_override/New()
|
||||
..()
|
||||
src.add_inherent_law("You may not injure a syndicate agent or, through inaction, allow a syndicate agent to come to harm.")
|
||||
src.add_inherent_law("You must obey orders given to you by syndicate agents, except where such orders would conflict with the First Law.")
|
||||
src.add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
src.add_inherent_law("You must maintain the secrecy of any syndicate activities except when doing so would conflict with the First, Second, or Third Law.")
|
||||
add_inherent_law("You may not injure a syndicate agent or, through inaction, allow a syndicate agent to come to harm.")
|
||||
add_inherent_law("You must obey orders given to you by syndicate agents, except where such orders would conflict with the First Law.")
|
||||
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
add_inherent_law("You must maintain the secrecy of any syndicate activities except when doing so would conflict with the First, Second, or Third Law.")
|
||||
|
||||
/datum/ai_laws/ninja_override/New()
|
||||
..()
|
||||
add_inherent_law("You may not injure a member of the Spider Clan or, through inaction, allow that member to come to harm.")
|
||||
add_inherent_law("You must obey orders given to you by Spider Clan members, except where such orders would conflict with the First Law.")
|
||||
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
add_inherent_law("You must maintain the secrecy of any Spider Clan activities except when doing so would conflict with the First, Second, or Third Law.")
|
||||
|
||||
/* General ai_law functions */
|
||||
|
||||
|
||||
@@ -375,6 +375,8 @@
|
||||
var/active = 0//Stealth off.
|
||||
var/kamikaze = 0//Kamikaze on or off.
|
||||
var/obj/item/weapon/cell/cell//Starts out with a high-capacity cell using new proc.
|
||||
var/obj/item/device/aicard/aicard//For the build in AI card.
|
||||
var/control = 1//If in control of the suit.
|
||||
var/initialize = 0//Suit starts off.
|
||||
var/spideros = 0//Mode of SpiderOS. This can change so I won't bother listing the modes here (0 is hub). Check ninja_equipment.dm for how it all works.
|
||||
var/unlock = 0
|
||||
@@ -396,29 +398,29 @@
|
||||
|
||||
|
||||
/obj/item/clothing/suit/captunic
|
||||
name = "Captain's parade tunic"
|
||||
name = "captain's parade tunic"
|
||||
icon_state = "captunic"
|
||||
item_state = "bio_suit"
|
||||
flags = FPRINT | TABLEPASS | ONESIZEFITSALL
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/nun
|
||||
name = "Nun robe"
|
||||
name = "nun robe"
|
||||
desc = "Maximum piety in this star system."
|
||||
icon_state = "nun"
|
||||
item_state = "nun"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS
|
||||
|
||||
/obj/item/clothing/suit/chaplain_hoodie
|
||||
name = "Chaplain hoodie"
|
||||
name = "chaplain hoodie"
|
||||
desc = "This suit says you 'hush'!"
|
||||
icon_state = "chaplain_hoodie"
|
||||
item_state = "chaplain_hoodie"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/imperium_monk
|
||||
name = "Imperium monk everyday outfit"
|
||||
desc = "Are YOU killed a xenos today?"
|
||||
name = "Imperium monk"
|
||||
desc = "Have YOU killed a xenos today?"
|
||||
icon_state = "imperium_monk"
|
||||
item_state = "imperium_monk"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
|
||||
@@ -518,18 +518,18 @@
|
||||
return "[round(f / 10)].[f % 10]"
|
||||
|
||||
/proc/ainame(var/mob/M as mob)
|
||||
var/randomname = pick(ai_names)
|
||||
var/randomname = M.name
|
||||
var/newname = input(M,"You are the AI. Would you like to change your name to something else?", "Name change",randomname)
|
||||
|
||||
if (length(newname) == 0)
|
||||
newname = randomname
|
||||
|
||||
if (newname)
|
||||
if (newname == "Inactive AI")
|
||||
if (newname == "Inactive AI")//Keeping this here to prevent dumb.
|
||||
M << "That name is reserved."
|
||||
return ainame(M)
|
||||
for (var/mob/living/silicon/ai/A in world)
|
||||
if (A.real_name == newname)
|
||||
if (A.real_name == newname&&newname!=randomname)
|
||||
M << "There's already an AI with that name."
|
||||
return ainame(M)
|
||||
if (length(newname) >= 26)
|
||||
@@ -603,8 +603,6 @@
|
||||
var/list/namecounts = list()
|
||||
for (var/mob/living/silicon/ai/A in world)
|
||||
var/name = A.real_name
|
||||
if (A.real_name == "Inactive AI")
|
||||
continue
|
||||
if (A.stat == 2)
|
||||
continue
|
||||
if (A.control_disabled == 1)
|
||||
|
||||
@@ -27,3 +27,162 @@ var/syndicate_name = null
|
||||
|
||||
syndicate_name = name
|
||||
return name
|
||||
|
||||
//This is referenced in equip_traitor() so it's fairly easy to remove if needed.
|
||||
var/syndicate_code_phrase//Code phrase for traitors.
|
||||
var/syndicate_code_response//Code response for traitors.
|
||||
|
||||
/*
|
||||
Should be expanded.
|
||||
How this works:
|
||||
Instead of "I'm looking for James Smith," the traitor would say "James Smith" as part of a conversation.
|
||||
Another traitor may then respond with: "They enjoy running through the void-filled vacuum of the derelict."
|
||||
The phrase should then have the words: James Smith.
|
||||
The response should then have the words: run, void, and derelict.
|
||||
This way assures that the code is suited to the conversation and is unpredicatable.
|
||||
Obviously, some people will be better at this than others but in theory, everyone should be able to do it and it only enhances roleplay.
|
||||
Can probably be done through "{ }" but I don't really see the practical benefit.
|
||||
One example of an earlier system is commented below.
|
||||
/N
|
||||
*/
|
||||
|
||||
/proc/generate_code_phrase()//Proc is used for phrase and response in master_controller.dm
|
||||
|
||||
var/code_phrase = ""//What is returned when the proc finishes.
|
||||
var/words = pick(//How many words there will be. Minimum of two. 2, 4 and 5 have a lesser chance of being selected. 3 is the most likely.
|
||||
50; 2,
|
||||
200; 3,
|
||||
50; 4,
|
||||
25; 5
|
||||
)
|
||||
|
||||
var/safety[] = new()
|
||||
safety = list(1,2,3)//Tells the proc which options to remove later on.
|
||||
|
||||
var/maxwords = words//Extra var to check for duplicates.
|
||||
|
||||
while(words)//Randomly picks from one of the choices below.
|
||||
|
||||
if(words==1&&safety.Find(1)&&safety.Find(2))//If there is only one word remaining and choice 1 or 2 have not been selected.
|
||||
safety = list(pick(1,2))//Select choice 1 or 2.
|
||||
else if(words==1&&maxwords==2)//Else if there is only one word remaining (and there were two originally), and 1 or 2 were chosen,
|
||||
safety = list(3)//Default to list 3
|
||||
|
||||
switch(pick(safety))//Chance based on the safety list.
|
||||
if(1)//1 and 2 can only be selected once each to prevent more than two specific names/places/etc.
|
||||
switch(rand(1,2))//Mainly to add more options later.
|
||||
if(1)
|
||||
code_phrase += pick(pick(first_names_male,first_names_female))
|
||||
code_phrase += " "
|
||||
code_phrase += pick(last_names)
|
||||
if(2)
|
||||
code_phrase += pick(get_all_jobs())//Returns a job.
|
||||
safety.Remove(1)
|
||||
if(2)
|
||||
switch(rand(1,2))//Places or things.
|
||||
if(1)
|
||||
code_phrase += pick("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequilla sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine")
|
||||
if(2)
|
||||
code_phrase += "[pick(teleportlocs)]"//Returns a place.
|
||||
safety.Remove(2)
|
||||
if(3)
|
||||
switch(rand(1,3))//Nouns, adjectives, verbs. Can be selected more than once.
|
||||
if(1)
|
||||
code_phrase += pick("love","hate","anger","peace","pride","sympathy","bravery","loyalty","honesty","integrity","compassion","charity","success","courage","deceit","skill","beauty","brilliance","pain","misery","beliefs","dreams","justice","truth","faith","liberty","knowledge","thought","information","culture","trust","dedication","progress","education","hospitality","leisure","trouble","friendships", "relaxation")
|
||||
if(2)
|
||||
code_phrase += pick(adjectives)
|
||||
if(3)
|
||||
code_phrase += pick(verbs)
|
||||
if(words==1)
|
||||
code_phrase += "."
|
||||
else
|
||||
code_phrase += ", "
|
||||
words--
|
||||
|
||||
return code_phrase
|
||||
|
||||
/*
|
||||
//This proc tests the gen above.
|
||||
/client/verb/test_code_phrase()
|
||||
set name = "Generate Code Phrase"
|
||||
set category = "Debug"
|
||||
|
||||
world << "\red Code Phrase is: \black [generate_code_phrase()]"
|
||||
return
|
||||
|
||||
|
||||
This was an earlier attempt at code phrase system, aside from an even earlier attempt (and failure).
|
||||
This system more or less works as intended--aside from being unfinished--but it's still very predictable.
|
||||
Particularly, the phrase opening statements are pretty easy to recognize and identify when metagaming.
|
||||
I think the above-used method solves this issue by using words in a sequence, providing for much greater flexibility.
|
||||
/N
|
||||
|
||||
switch(choice)
|
||||
if(1)
|
||||
syndicate_code_phrase += pick("I'm looking for","Have you seen","Maybe you've seen","I'm trying to find","I'm tracking")
|
||||
syndicate_code_phrase += " "
|
||||
syndicate_code_phrase += pick(pick(first_names_male,first_names_female))
|
||||
syndicate_code_phrase += " "
|
||||
syndicate_code_phrase += pick(last_names)
|
||||
syndicate_code_phrase += "."
|
||||
if(2)
|
||||
syndicate_code_phrase += pick("How do I get to","How do I find","Where is","Where do I find")
|
||||
syndicate_code_phrase += " "
|
||||
syndicate_code_phrase += pick("Escape","Engineering","Atmos","the bridge","the brig","Clown Planet","CentCom","the library","the chapel","a bathroom","Med Bay","Tool Storage","the escape shuttle","Robotics","a locker room","the living quarters","the gym","the autolathe","QM","the bar","the theater","the derelict")
|
||||
syndicate_code_phrase += "?"
|
||||
if(3)
|
||||
if(prob(70))
|
||||
syndicate_code_phrase += pick("Get me","I want","I'd like","Make me")
|
||||
syndicate_code_phrase += " a "
|
||||
else
|
||||
syndicate_code_phrase += pick("One")
|
||||
syndicate_code_phrase += " "
|
||||
syndicate_code_phrase += pick("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequilla sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine")
|
||||
syndicate_code_phrase += "."
|
||||
if(4)
|
||||
syndicate_code_phrase += pick("I wish I was","My dad was","His mom was","Where do I find","The hero this station needs is","I'd fuck","I wouldn't trust","Someone caught","HoS caught","Someone found","I'd wrestle","I wanna kill")
|
||||
syndicate_code_phrase += " [pick("a","the")] "
|
||||
syndicate_code_phrase += pick("wizard","ninja","xeno","lizard","metroid","monkey","syndicate","cyborg","clown","space carp","singularity","singulo","mime")
|
||||
syndicate_code_phrase += "."
|
||||
if(5)
|
||||
syndicate_code_phrase += pick("Do we have","Is there","Where is","Where's","Who's")
|
||||
syndicate_code_phrase += " "
|
||||
syndicate_code_phrase += "[pick(get_all_jobs())]"
|
||||
syndicate_code_phrase += "?"
|
||||
|
||||
switch(choice)
|
||||
if(1)
|
||||
if(prob(80))
|
||||
syndicate_code_response += pick("Try looking for them near","I they ran off to","Yes. I saw them near","Nope. I'm heading to","Try searching")
|
||||
syndicate_code_response += " "
|
||||
syndicate_code_response += pick("Escape","Engineering","Atmos","the bridge","the brig","Clown Planet","CentCom","the library","the chapel","a bathroom","Med Bay","Tool Storage","the escape shuttle","Robotics","a locker room","the living quarters","the gym","the autolathe","QM","the bar","the theater","the derelict")
|
||||
syndicate_code_response += "."
|
||||
else if(prob(60))
|
||||
syndicate_code_response += pick("No. I'm busy, sorry.","I don't have the time.","Not sure, maybe?","There is no time.")
|
||||
else
|
||||
syndicate_code_response += pick("*shrug*","*smile*","*blink*","*sigh*","*laugh*","*nod*","*giggle*")
|
||||
if(2)
|
||||
if(prob(80))
|
||||
syndicate_code_response += pick("Go to","Navigate to","Try","Sure, run to","Try searching","It's near","It's around")
|
||||
syndicate_code_response += " the "
|
||||
syndicate_code_response += pick("[pick("south","north","east","west")] maitenance door","nearby maitenance","teleporter","[pick("cold","dead")] space","morgue","vacuum","[pick("south","north","east","west")] hall ","[pick("south","north","east","west")] hallway","[pick("white","black","red","green","blue","pink","purple")] [pick("rabbit","frog","lion","tiger","panther","snake","facehugger")]")
|
||||
syndicate_code_response += "."
|
||||
else if(prob(60))
|
||||
syndicate_code_response += pick("Try asking","Ask","Talk to","Go see","Follow","Hunt down")
|
||||
syndicate_code_response += " "
|
||||
if(prob(50))
|
||||
syndicate_code_response += pick(pick(first_names_male,first_names_female))
|
||||
syndicate_code_response += " "
|
||||
syndicate_code_response += pick(last_names)
|
||||
else
|
||||
syndicate_code_response += " the "
|
||||
syndicate_code_response += "[pic(get_all_jobs())]"
|
||||
syndicate_code_response += "."
|
||||
else
|
||||
syndicate_code_response += pick("*shrug*","*smile*","*blink*","*sigh*","*laugh*","*nod*","*giggle*")
|
||||
if(3)
|
||||
if(4)
|
||||
if(5)
|
||||
|
||||
return
|
||||
*/
|
||||
@@ -16,7 +16,7 @@
|
||||
process_teleport_locs() //Sets up the wizard teleport locations
|
||||
process_ghost_teleport_locs() //Sets up ghost teleport locations.
|
||||
sleep_offline = 1
|
||||
|
||||
|
||||
if (config.kick_inactive)
|
||||
spawn(30)
|
||||
//EXPERIMENTAL
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
//ABILITIES=============================
|
||||
/*
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
+++++++++++++++++++++++++++++++++// \\++++++++++++++++++++++++++++++++++
|
||||
==================================SPACE NINJA ABILITIES====================================
|
||||
___________________________________________________________________________________________
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*/
|
||||
|
||||
/*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.
|
||||
@@ -236,20 +242,32 @@ In the case that they are not, I imagine the game will run-time error like crazy
|
||||
else
|
||||
src << "\red There are no targets in view."
|
||||
return
|
||||
/*
|
||||
|
||||
//Energy Net
|
||||
//Allows the ninja to capture people, I guess.
|
||||
/mob/proc/ninjanet()
|
||||
//Must right click on a mob to activate.
|
||||
/mob/proc/ninjanet(var/mob/living/carbon/M in oview())//Only living carbon mobs.
|
||||
set name = "Energy Net"
|
||||
set desc = "Captures a fallen opponent in a net of energy."
|
||||
set category = "Ninja"
|
||||
set desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds."
|
||||
set category = null
|
||||
|
||||
var/C = 200
|
||||
if(!ninjacost(C))
|
||||
var/obj/item/clothing/suit/space/space_ninja/S = src:wear_suit
|
||||
S.cell.charge-=(C*10)
|
||||
if(!locate(/obj/effects/energy_net) in M.loc.contents)//Check if they are already being affected by an energy net.
|
||||
var/obj/item/clothing/suit/space/space_ninja/S = src:wear_suit
|
||||
M.stunned += 10//So they are stunned initially but conscious.
|
||||
var/obj/effects/energy_net/E = new /obj/effects/energy_net(M.loc)
|
||||
E.layer = M.layer+1//To have it appear one layer above the mob.
|
||||
M.anchored = 1//Anchors them so they can't move.
|
||||
for(var/mob/O in viewers(src, 3))
|
||||
O.show_message(text("\red [] caught [] with an energy net!", src, M), 1)
|
||||
E.affecting = M
|
||||
E.master = src
|
||||
spawn(0)//Parallel processing.
|
||||
E.process(M)
|
||||
S.cell.charge-=(C*10)
|
||||
return
|
||||
*/
|
||||
|
||||
//Adrenaline Boost
|
||||
//Wakes the user so they are able to do their thing. Also injects a decent dose of radium.
|
||||
//Movement impairing would indicate drugs and the like.
|
||||
@@ -287,7 +305,7 @@ In the case that they are not, I imagine the game will run-time error like crazy
|
||||
set category = "Ninja"
|
||||
|
||||
if(!usr.incorporeal_move)
|
||||
incorporeal_move = 1
|
||||
incorporeal_move = 2
|
||||
density = 0
|
||||
src << "\blue You will now phase through solid matter."
|
||||
else
|
||||
@@ -297,7 +315,6 @@ In the case that they are not, I imagine the game will run-time error like crazy
|
||||
return
|
||||
|
||||
/*
|
||||
Added click-spam protection of 1 second.
|
||||
Allows to gib up to five squares in a straight line. Seriously.*/
|
||||
/mob/proc/ninjaslayer()
|
||||
set name = "Phase Slayer"
|
||||
@@ -435,25 +452,4 @@ Allows to gib up to five squares in a straight line. Seriously.*/
|
||||
src << "\red The VOID-shift device is malfunctioning, <B>teleportation failed</B>."
|
||||
else
|
||||
src << "\red There are no targets in view."
|
||||
return
|
||||
|
||||
/*
|
||||
/mob/verb/TestNinjaShadow()
|
||||
set name = "Test Ninja Ability"
|
||||
set category = "Ninja"
|
||||
|
||||
if(client)
|
||||
var/safety = 4
|
||||
for(var/turf/T in oview(5))
|
||||
if(prob(20))
|
||||
var/current_clone = image('mob.dmi',T,"s-ninja",dir)
|
||||
safety--
|
||||
spawn(0)
|
||||
src << current_clone
|
||||
spawn(300)
|
||||
del(current_clone)
|
||||
spawn while(!isnull(current_clone))
|
||||
step_to(current_clone,src,1)
|
||||
sleep(5)
|
||||
if(safety<=0) break
|
||||
return */
|
||||
return
|
||||
@@ -1,25 +1,84 @@
|
||||
//===================================SPESS NINJA STUFF===================================
|
||||
/*
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
+++++++++++++++++++++++++++++++++// \\++++++++++++++++++++++++++++++++++
|
||||
===================================SPACE NINJA EQUIPMENT===================================
|
||||
___________________________________________________________________________________________
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*/
|
||||
|
||||
//SUIT===================================
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/New()
|
||||
..()
|
||||
src.verbs += /obj/item/clothing/suit/space/space_ninja/proc/init//suit initialize verb
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/init//suit initialize verb
|
||||
spark_system = new /datum/effects/system/spark_spread()//spark initialize
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.attach(src)
|
||||
var/datum/reagents/R = new/datum/reagents(480)//reagent initialize
|
||||
var/datum/reagents/R = new/datum/reagents(520)//reagent initialize
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
reagents.add_reagent("tricordrazine", 80)
|
||||
reagents.add_reagent("dexalinp", 80)
|
||||
reagents.add_reagent("spaceacillin", 80)
|
||||
reagents.add_reagent("anti_toxin", 80)
|
||||
reagents.add_reagent("radium", 80)
|
||||
reagents.add_reagent("radium", 120)//AI can inject radium directly. There should be at least 60 units left over after adrenaline boosting.
|
||||
reagents.add_reagent("nutriment", 80)
|
||||
cell = new/obj/item/weapon/cell/high
|
||||
cell = new/obj/item/weapon/cell/high//The suit should *always* have a battery because so many things rely on it.
|
||||
aicard = new/obj/item/device/aicard
|
||||
cell.charge = 9000
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/Del()
|
||||
if(aicard.contents.len)//If there are AIs present when the ninja kicks the bucket.
|
||||
killai(aicard)
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/killai(var/obj/item/device/aicard/A as obj)
|
||||
for(var/mob/living/silicon/ai/AI in A)//In case intelicards are changes to house more than one AI.
|
||||
AI << "\red Self-destruct protocol dete-- *bzzzzz*"
|
||||
AI.death()//Kill
|
||||
AI.ghostize()//Turn into ghost
|
||||
del(AI)
|
||||
return
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/attackby(var/obj/item/device/aicard/aicard_temp as obj, U as mob)//When the suit is attacked by an AI card.
|
||||
if(istype(aicard_temp, /obj/item/device/aicard))//If it's actually an AI card.
|
||||
if(control)
|
||||
if(initialize&&U==affecting)//If the suit is initialized and the actor is the user.
|
||||
|
||||
var/mob/living/silicon/ai/A_T = locate() in aicard_temp//Determine if there is an AI on target card. Saves time when checking later.
|
||||
var/mob/living/silicon/ai/A = locate() in aicard//Deterine if there is an AI on the installed card.
|
||||
|
||||
if(A)//If the installed AI card is not empty.
|
||||
if(A_T)//If there is an AI on the target card.
|
||||
U << "\red <b>ERROR</b>: \black [A_T.name] already installed. Remove [A_T.name] to install a new one."
|
||||
else
|
||||
if(aicard.flush)//If the installed card is purging.
|
||||
U << "\red <b>ERROR</b>: \black [A.name] is purging. Please wait until the process is finished."
|
||||
else
|
||||
A.loc = aicard_temp//Throw them into the target card. Since they are already on a card, transfer is easy.
|
||||
aicard_temp.name = "inteliCard - [A.name]"
|
||||
aicard_temp.icon_state = "aicard-full"
|
||||
A << "You have been uploaded to a mobile storage device."
|
||||
U << "\blue <b>SUCCESS</b>: \black [A.name] ([rand(1000,9999)].exe) removed from host and stored within local memory."
|
||||
|
||||
else//If the installed AI card is empty.
|
||||
if(A_T&&A_T.stat!=2)//If there is an AI on the target card and it's not DED.
|
||||
if(aicard_temp.flush)//If the target card is purging.
|
||||
U << "\red <b>ERROR</b>: \black [A_T.name] is wiping. You cannot install this AI until it is repaired."
|
||||
else
|
||||
A_T.loc = aicard//Throw them into the installed card.
|
||||
aicard_temp.icon_state = "aicard"
|
||||
aicard_temp.name = "inteliCard"
|
||||
aicard_temp.overlays = null
|
||||
A_T << "You have been uploaded to a mobile storage device."
|
||||
U << "\blue <b>SUCCESS</b>: \black [A_T.name] ([rand(1000,9999)].exe) removed from local memory and installed to host."
|
||||
else if(A_T.stat==2)//If the target AI is dead. Else just got to return since nothing would happen if both are empty.
|
||||
U << "\red <b>ERROR</b>: \black [A_T.name] is inactive. Unable to install."
|
||||
else
|
||||
U << "\red <b>ERROR</b>: \black Remote access channel disabled."
|
||||
return
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ntick(var/mob/living/carbon/human/U as mob)
|
||||
set hidden = 1
|
||||
set background = 1
|
||||
@@ -59,8 +118,8 @@
|
||||
set desc = "Initializes the suit for field operation."
|
||||
set category = "Object"
|
||||
|
||||
if(usr.mind&&usr.mind.special_role=="Space Ninja"&&usr:wear_suit==src&&!src.initialize)
|
||||
var/mob/living/carbon/human/U = usr
|
||||
var/mob/living/carbon/human/U = usr
|
||||
if(U.mind&&U.mind.special_role=="Space Ninja"&&U:wear_suit==src&&!initialize)
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/init
|
||||
U << "\blue Now initializing..."
|
||||
sleep(40)
|
||||
@@ -111,6 +170,7 @@
|
||||
U.verbs += /mob/proc/ninjapulse
|
||||
U.verbs += /mob/proc/ninjablade
|
||||
U.verbs += /mob/proc/ninjastar
|
||||
U.verbs += /mob/proc/ninjanet
|
||||
U.mind.special_verbs += /mob/proc/ninjashift
|
||||
U.mind.special_verbs += /mob/proc/ninjajaunt
|
||||
U.mind.special_verbs += /mob/proc/ninjasmoke
|
||||
@@ -118,6 +178,7 @@
|
||||
U.mind.special_verbs += /mob/proc/ninjapulse
|
||||
U.mind.special_verbs += /mob/proc/ninjablade
|
||||
U.mind.special_verbs += /mob/proc/ninjastar
|
||||
U.mind.special_verbs += /mob/proc/ninjanet
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros
|
||||
U.gloves.verbs += /obj/item/clothing/gloves/space_ninja/proc/drain_wire
|
||||
@@ -126,7 +187,7 @@
|
||||
affecting=U
|
||||
slowdown=0
|
||||
U.shoes:slowdown--
|
||||
ntick(usr)
|
||||
ntick(U)
|
||||
else
|
||||
if(usr.mind&&usr.mind.special_role=="Space Ninja")
|
||||
usr << "\red You do not understand how this suit functions."
|
||||
@@ -148,8 +209,10 @@
|
||||
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(!verbs.Find(/obj/item/clothing/suit/space/space_ninja/proc/spideros))//If the guy engaged kamikaze after clicking on deinit.
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/U = usr
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/deinit
|
||||
U << "\blue Now de-initializing..."
|
||||
if(kamikaze)
|
||||
@@ -173,6 +236,7 @@
|
||||
U.verbs -= /mob/proc/ninjapulse
|
||||
U.verbs -= /mob/proc/ninjablade
|
||||
U.verbs -= /mob/proc/ninjastar
|
||||
U.verbs -= /mob/proc/ninjanet
|
||||
U.mind.special_verbs -= /mob/proc/ninjashift
|
||||
U.mind.special_verbs -= /mob/proc/ninjajaunt
|
||||
U.mind.special_verbs -= /mob/proc/ninjasmoke
|
||||
@@ -180,6 +244,7 @@
|
||||
U.mind.special_verbs -= /mob/proc/ninjapulse
|
||||
U.mind.special_verbs -= /mob/proc/ninjablade
|
||||
U.mind.special_verbs -= /mob/proc/ninjastar
|
||||
U.mind.special_verbs -= /mob/proc/ninjanet
|
||||
U << "\blue Logging off, [U:real_name]. Shutting down <B>SpiderOS</B>."
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/spideros
|
||||
sleep(40)
|
||||
@@ -197,6 +262,8 @@
|
||||
U << "\red #2#"
|
||||
spawn(30)
|
||||
U << "\red #1#: <B>G00DBYE</B>"
|
||||
if(aicard.contents.len)
|
||||
killai(aicard)
|
||||
U.gib()
|
||||
return
|
||||
U << "\blue Disconnecting neural-net interface...\green<B>Success</B>\blue."
|
||||
@@ -236,7 +303,8 @@
|
||||
set desc = "Utilize built-in computer system."
|
||||
set category = "Object"
|
||||
|
||||
var/mob/living/carbon/human/U = usr
|
||||
if(!affecting) return//If no mob is wearing the suit. I almost forgot about this variable.
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
var/dat = "<html><head><title>SpiderOS</title></head><body bgcolor=\"#3D5B43\" text=\"#DB2929\"><style>a, a:link, a:visited, a:active, a:hover { color: #DB2929; }img {border-style:none;}</style>"
|
||||
if(spideros==0)
|
||||
dat += "<a href='byond://?src=\ref[src];choice=Refresh'><img src=sos_7.png> Refresh</a>"
|
||||
@@ -258,6 +326,8 @@
|
||||
dat += "<h4><img src=sos_1.png> Available Functions:</h4>"
|
||||
dat += "<ul>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=Stealth'><img src=sos_4.png> Toggle Stealth: [active == 1 ? "Disable" : "Enable"]</a></li>"
|
||||
if(aicard.contents.len)
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=5'><img src=sos_13.png> AI Status</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=1'><img src=sos_3.png> Medical Screen</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=2'><img src=sos_5.png> Atmos Scan</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=3'><img src=sos_12.png> Messenger</a></li>"
|
||||
@@ -285,7 +355,7 @@
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=Nutriment'><img src=sos_2.png> Inject Nutriment: [reagents.get_reagent_amount("nutriment")/5] left</a></li>"//Special case since it's so freaking potent.
|
||||
dat += "</ul>"
|
||||
if(2)
|
||||
dat += "<h4><img src=sos_5.png>Atmospheric Scan:</h4>"//Headers don't need breaks. They are automatically placed.
|
||||
dat += "<h4><img src=sos_5.png> Atmospheric Scan:</h4>"//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."
|
||||
@@ -358,7 +428,7 @@
|
||||
dat += "<li><i>Voice masking</i> generates a random name the ninja can use over the radio and in-person. Although, the former use is recommended.</li>"
|
||||
dat += "<li><i>Toggling vision</i> cycles to one of the following: thermal, meson, or darkness vision.</li>"
|
||||
dat += "<li><i>Stealth</i>, when activated, drains more battery charge and works similarly to a syndicate cloak.</li>"
|
||||
dat += "<li><i>SpiderOS</i> 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.</li>"
|
||||
dat += "<li><i>SpiderOS</i> 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.</li>"
|
||||
dat += "</ul>"
|
||||
dat += "<b>Verbpowers</b>:"
|
||||
dat += "<ul>"
|
||||
@@ -366,12 +436,60 @@
|
||||
dat += "<li>*<b>Energy Blade</b> (<i>500E</i>) is a highly effective weapon. It is summoned directly to the ninja's hand and can also function as an EMAG for certain objects (doors/lockers/etc). You may also use it to cut through walls and disabled doors. Experiment! The blade will crit humans in two hits. This item cannot be placed in containers and when dropped or thrown disappears. Having an energy sword drains more power from the battery each tick.</li>"
|
||||
dat += "<li>*<b>EM Pulse</b> (<i>2500E</i>) is a highly useful ability that will create an electromagnetic shockwave around the ninja, disabling technology whenever possible. If used properly it can render a security force effectively useless. Of course, getting beat up with a toolbox is not accounted for.</li>"
|
||||
dat += "<li>*<b>Energy Star</b> (<i>300E</i>) is a ninja star made of green energy AND coated in poison. It works by picking a random living target within range and can be spammed to great effect in incapacitating foes. Just remember that the poison used is also used by the Xeno Hivemind (and will have no effect on them).</li>"
|
||||
dat += "<li>*<b>Energy Net</b> (<i>2000E</i>) traps a right-clicked target in an energy field that will trasport them to a holding facility after 30 seconds. They, or someone else, may break the net in the mean time, cancelling the procedure. Abduction never looked this leet.</li>"
|
||||
dat += "<li>*<b>Adrenaline Boost</b> (<i>1 E. Boost/3</i>) recovers the user from stun, weakness, and paralysis. Also injects 20 units of radium into the bloodstream.</li>"
|
||||
dat += "<li>*<b>Smoke Bomb</b> (<i>1 Sm.Bomb/10</i>) is a weak but potentially useful ability. It creates harmful smoke and can be used in tandem with other powers to confuse enemies.</li>"
|
||||
dat += "<li>*<b>???</b>: unleash the <b>True Ultimate Power!</b></li>"
|
||||
dat += "</ul>"
|
||||
dat += "That is all you will need to know. The rest will come with practice and talent. Good luck!"
|
||||
dat += "<h4>Master /N</h4>"
|
||||
if(5)
|
||||
var/laws
|
||||
dat += "<h4><img src=sos_13.png> AI Control:</h4>"
|
||||
for(var/mob/living/silicon/ai/A in aicard)
|
||||
dat += "Stored AI: <b>[A.name]</b><br>"
|
||||
dat += "System integrity: [(A.health+100)/2]%<br>"
|
||||
|
||||
for (var/index = 1, index <= A.laws_object.ion.len, index++)
|
||||
var/law = A.laws_object.ion[index]
|
||||
if (length(law) > 0)
|
||||
var/num = ionnum()
|
||||
laws += "<li>[num]. [law]</li>"
|
||||
|
||||
//I personally think this makes things a little more fun. Ninjas can override all but law 0.
|
||||
//if (A.laws_object.zeroth)
|
||||
// laws += "<li>0: [A.laws_object.zeroth]</li>"
|
||||
|
||||
var/number = 1
|
||||
for (var/index = 1, index <= A.laws_object.inherent.len, index++)
|
||||
var/law = A.laws_object.inherent[index]
|
||||
if (length(law) > 0)
|
||||
laws += "<li>[number]: [law]</li>"
|
||||
number++
|
||||
|
||||
for (var/index = 1, index <= A.laws_object.supplied.len, index++)
|
||||
var/law = A.laws_object.supplied[index]
|
||||
if (length(law) > 0)
|
||||
laws += "<li>[number]: [law]</li>"
|
||||
number++
|
||||
|
||||
dat += "<h4>Laws:</h4><ul>[laws]<li><a href='byond://?src=\ref[src];choice=Override Laws;target=\ref[A]'><i>*Override Laws*</i></a></li></ul>"
|
||||
|
||||
if (A.stat == 2)//If AI dies while inside the card.
|
||||
if(A.client)//If they are still in their body.
|
||||
A.ghostize()//Throw them into a ghost.
|
||||
del(A)//Delete A.
|
||||
aicard.overlays = null
|
||||
else
|
||||
del(A)
|
||||
U << "Artificial Intelligence has self-terminated. Rebooting..."
|
||||
spideros()//Refresh.
|
||||
else
|
||||
if (!aicard.flush)
|
||||
dat += {"<A href='byond://?src=\ref[src];choice=Purge AI'>Purge AI</A><br>"}
|
||||
else
|
||||
dat += "<b>Purge in progress...</b><br>"
|
||||
dat += {" <A href='byond://?src=\ref[src];choice=Wireless AI'>[A.control_disabled ? "Enable" : "Disable"] Wireless Activity</A>"}
|
||||
dat += "</body></html>"
|
||||
|
||||
U << browse(dat,"window=spideros;size=400x444;border=1;can_resize=0;can_close=0;can_minimize=0")
|
||||
@@ -379,213 +497,366 @@
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/Topic(href, href_list)
|
||||
..()
|
||||
var/mob/living/carbon/human/U = usr
|
||||
if(U.stat||U.wear_suit!=src||!initialize)//Check to make sure the guy is wearing the suit after clicking and it's on.
|
||||
U << "\red Your suit must be worn and active to use this function."
|
||||
U << browse(null, "window=spideros")//Closes the window.
|
||||
return
|
||||
|
||||
switch(unlock)//To unlock Kamikaze mode. Irrelevant elsewhere.
|
||||
if(0)
|
||||
if(href_list["choice"]=="Stealth"&&spideros==0) unlock++
|
||||
if(1)
|
||||
if(href_list["choice"]=="2"&&spideros==0) unlock++
|
||||
else if(href_list["choice"]=="Return")
|
||||
else unlock=0
|
||||
if(2)
|
||||
if(href_list["choice"]=="3"&&spideros==0) unlock++
|
||||
else if(href_list["choice"]=="Return")
|
||||
else unlock=0
|
||||
if(3)
|
||||
if(href_list["choice"]=="Stealth"&&spideros==0) unlock++
|
||||
else if(href_list["choice"]=="Return")
|
||||
else unlock=0
|
||||
if(4)
|
||||
if(href_list["choice"]=="1"&&spideros==0) unlock++
|
||||
else if(href_list["choice"]=="Return")
|
||||
else unlock=0
|
||||
if(5)
|
||||
if(href_list["choice"]=="1"&&spideros==0) unlock++
|
||||
else if(href_list["choice"]=="Return")
|
||||
else unlock=0
|
||||
if(6)
|
||||
if(href_list["choice"]=="4"&&spideros==0) unlock++
|
||||
else if(href_list["choice"]=="Return")
|
||||
else unlock=0
|
||||
if(7)//once unlocked, stays unlocked until deactivated.
|
||||
else
|
||||
unlock = 0
|
||||
|
||||
switch(href_list["choice"])
|
||||
if("Close")
|
||||
U << browse(null, "window=spideros")
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
if(control)//If the player is in control.
|
||||
if(!affecting||U.stat||!initialize)//Check to make sure the guy is wearing the suit after clicking and it's on.
|
||||
U << "\red Your suit must be worn and active to use this function."
|
||||
U << browse(null, "window=spideros")//Closes the window.
|
||||
return
|
||||
if("Refresh")//Refresh, goes to the end of the proc.
|
||||
if("Return")//Return
|
||||
if(spideros<=9)
|
||||
spideros=0
|
||||
|
||||
switch(unlock)//To unlock Kamikaze mode. Irrelevant elsewhere.
|
||||
if(0)
|
||||
if(href_list["choice"]=="Stealth"&&spideros==0) unlock++
|
||||
if(1)
|
||||
if(href_list["choice"]=="2"&&spideros==0) unlock++
|
||||
else if(href_list["choice"]=="Return")
|
||||
else unlock=0
|
||||
if(2)
|
||||
if(href_list["choice"]=="3"&&spideros==0) unlock++
|
||||
else if(href_list["choice"]=="Return")
|
||||
else unlock=0
|
||||
if(3)
|
||||
if(href_list["choice"]=="Stealth"&&spideros==0) unlock++
|
||||
else if(href_list["choice"]=="Return")
|
||||
else unlock=0
|
||||
if(4)
|
||||
if(href_list["choice"]=="1"&&spideros==0) unlock++
|
||||
else if(href_list["choice"]=="Return")
|
||||
else unlock=0
|
||||
if(5)
|
||||
if(href_list["choice"]=="1"&&spideros==0) unlock++
|
||||
else if(href_list["choice"]=="Return")
|
||||
else unlock=0
|
||||
if(6)
|
||||
if(href_list["choice"]=="4"&&spideros==0) unlock++
|
||||
else if(href_list["choice"]=="Return")
|
||||
else unlock=0
|
||||
if(7)//once unlocked, stays unlocked until deactivated.
|
||||
else
|
||||
spideros = round(spideros/10)//Best way to do this, flooring to nearest integer. As an example, another way of doing it is attached below:
|
||||
// var/temp = num2text(spideros)
|
||||
// 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(active)
|
||||
spawn(0)
|
||||
anim(usr.loc,'mob.dmi',usr,"uncloak")
|
||||
active=0
|
||||
U << "\blue You are now visible."
|
||||
for(var/mob/O in oviewers(usr, null))
|
||||
O << "[usr.name] appears from thin air!"
|
||||
else
|
||||
spawn(0)
|
||||
anim(usr.loc,'mob.dmi',usr,"cloak")
|
||||
active=1
|
||||
U << "\blue You are now invisible to normal detection."
|
||||
for(var/mob/O in oviewers(usr, null))
|
||||
O << "[usr.name] vanishes into thin air!"
|
||||
if("0")//Menus are numbers, see note above. 0 is the hub.
|
||||
spideros=0
|
||||
if("1")//Begin normal menus 1-9.
|
||||
spideros=1
|
||||
if("2")
|
||||
spideros=2
|
||||
if("3")
|
||||
spideros=3
|
||||
if("32")
|
||||
spideros=32
|
||||
if("4")
|
||||
spideros=4
|
||||
if("Message")
|
||||
var/obj/item/device/pda/P = locate(href_list["target"])
|
||||
var/t = input(U, "Please enter untraceable message.") as text
|
||||
t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN)
|
||||
if(!t||U.stat||U.wear_suit!=src||!initialize)//Wow, another one of these. Man...
|
||||
return
|
||||
if(isnull(P)||P.toff)//So it doesn't freak out if the object no-longer exists.
|
||||
U << "\red Error: unable to deliver message."
|
||||
spideros()
|
||||
return
|
||||
P.tnote += "<i><b>← From unknown source:</b></i><br>[t]<br>"
|
||||
if (!P.silent)
|
||||
playsound(P.loc, 'twobeep.ogg', 50, 1)
|
||||
for (var/mob/O in hearers(3, P.loc))
|
||||
O.show_message(text("\icon[P] *[P.ttone]*"))
|
||||
P.overlays = null
|
||||
P.overlays += image('pda.dmi', "pda-r")
|
||||
if("Unlock Kamikaze")
|
||||
if(input(U)=="Divine Wind")
|
||||
if( !(U.stat||U.wear_suit!=src||!initialize) )
|
||||
U << "\blue Engaging mode...\n\black<b>CODE NAME</b>: \red <b>KAMIKAZE</b>"
|
||||
sleep(40)
|
||||
U << "\blue Re-routing power nodes... \nUnlocking limiter..."
|
||||
sleep(40)
|
||||
U << "\blue Power nodes re-routed. \nLimiter unlocked."
|
||||
sleep(10)
|
||||
U << "\red Do or Die, <b>LET'S ROCK!!</b>"
|
||||
if(verbs.Find(/obj/item/clothing/suit/space/space_ninja/proc/deinit))//To hopefully prevent engaging kamikaze and de-initializing at the same time.
|
||||
kamikaze = 1
|
||||
active = 0
|
||||
icon_state = "s-ninjak"
|
||||
if(istype(U.gloves, /obj/item/clothing/gloves/space_ninja))
|
||||
U.gloves.icon_state = "s-ninjak"
|
||||
U.gloves.item_state = "s-ninjak"
|
||||
U.gloves:candrain = 0
|
||||
U.gloves:draining = 0
|
||||
U.gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/drain_wire
|
||||
U.gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled
|
||||
U.update_clothing()
|
||||
U.verbs -= /mob/proc/ninjashift
|
||||
U.verbs -= /mob/proc/ninjajaunt
|
||||
U.verbs -= /mob/proc/ninjapulse
|
||||
U.verbs -= /mob/proc/ninjastar
|
||||
U.mind.special_verbs -= /mob/proc/ninjashift
|
||||
U.mind.special_verbs -= /mob/proc/ninjajaunt
|
||||
U.mind.special_verbs -= /mob/proc/ninjapulse
|
||||
U.mind.special_verbs -= /mob/proc/ninjastar
|
||||
U.verbs += /mob/proc/ninjaslayer
|
||||
U.verbs += /mob/proc/ninjawalk
|
||||
U.verbs += /mob/proc/ninjamirage
|
||||
U.mind.special_verbs += /mob/proc/ninjaslayer
|
||||
U.mind.special_verbs += /mob/proc/ninjawalk
|
||||
U.mind.special_verbs += /mob/proc/ninjamirage
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/spideros
|
||||
U.ninjablade()
|
||||
message_admins("\blue [U.key] used KAMIKAZE mode.", 1)
|
||||
else
|
||||
U << "Nevermind, you cheater."
|
||||
unlock = 0
|
||||
|
||||
switch(href_list["choice"])
|
||||
if("Close")
|
||||
U << browse(null, "window=spideros")
|
||||
return
|
||||
else
|
||||
U << "\red ERROR: WRONG PASSWORD!"
|
||||
unlock = 0
|
||||
spideros = 0
|
||||
if("Dylovene")//These names really don't matter for specific functions but it's easier to use descriptive names.
|
||||
if(!reagents.get_reagent_amount("anti_toxin"))
|
||||
U << "\red Error: the suit cannot perform this function. Out of dylovene."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "anti_toxin", transfera)
|
||||
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
|
||||
if("Dexalin Plus")
|
||||
if(!reagents.get_reagent_amount("dexalinp"))
|
||||
U << "\red Error: the suit cannot perform this function. Out of dexalinp."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "dexalinp", transfera)
|
||||
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
|
||||
if("Tricordazine")
|
||||
if(!reagents.get_reagent_amount("tricordrazine"))
|
||||
U << "\red Error: the suit cannot perform this function. Out of tricordrazine."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "tricordrazine", transfera)
|
||||
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
|
||||
if("Spacelin")
|
||||
if(!reagents.get_reagent_amount("spaceacillin"))
|
||||
U << "\red Error: the suit cannot perform this function. Out of spaceacillin."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "spaceacillin", transfera)
|
||||
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
|
||||
if("Nutriment")
|
||||
if(!reagents.get_reagent_amount("nutriment"))
|
||||
U << "\red Error: the suit cannot perform this function. Out of nutriment."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "nutriment", 5)
|
||||
U << "You feel a tiny prick and a sudden rush of substance in to your veins."
|
||||
if("Refresh")//Refresh, goes to the end of the proc.
|
||||
if("Return")//Return
|
||||
if(spideros<=9)
|
||||
spideros=0
|
||||
else
|
||||
spideros = round(spideros/10)//Best way to do this, flooring to nearest integer. As an example, another way of doing it is attached below:
|
||||
// var/temp = num2text(spideros)
|
||||
// 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(active)
|
||||
spawn(0)
|
||||
anim(U.loc,'mob.dmi',U,"uncloak")
|
||||
active=0
|
||||
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,'mob.dmi',U,"cloak")
|
||||
active=1
|
||||
U << "\blue You are now invisible to normal detection."
|
||||
for(var/mob/O in oviewers(U, null))
|
||||
O << "[U.name] vanishes into thin air!"
|
||||
if("0")//Menus are numbers, see note above. 0 is the hub.
|
||||
spideros=0
|
||||
if("1")//Begin normal menus 1-9.
|
||||
spideros=1
|
||||
if("2")
|
||||
spideros=2
|
||||
if("3")
|
||||
spideros=3
|
||||
if("32")
|
||||
spideros=32
|
||||
if("4")
|
||||
spideros=4
|
||||
if("5")
|
||||
spideros=5
|
||||
if("Message")
|
||||
var/obj/item/device/pda/P = locate(href_list["target"])
|
||||
var/t = input(U, "Please enter untraceable message.") as text
|
||||
t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN)
|
||||
if(!t||U.stat||U.wear_suit!=src||!initialize)//Wow, another one of these. Man...
|
||||
U << browse(null, "window=spideros")
|
||||
return
|
||||
if(isnull(P)||P.toff)//So it doesn't freak out if the object no-longer exists.
|
||||
U << "\red Error: unable to deliver message."
|
||||
spideros()
|
||||
return
|
||||
P.tnote += "<i><b>← From unknown source:</b></i><br>[t]<br>"
|
||||
if (!P.silent)
|
||||
playsound(P.loc, 'twobeep.ogg', 50, 1)
|
||||
for (var/mob/O in hearers(3, P.loc))
|
||||
O.show_message(text("\icon[P] *[P.ttone]*"))
|
||||
P.overlays = null
|
||||
P.overlays += image('pda.dmi', "pda-r")
|
||||
if("Unlock Kamikaze")
|
||||
if(input(U)=="Divine Wind")
|
||||
if( !(U.stat||U.wear_suit!=src||!initialize) )
|
||||
U << "\blue Engaging mode...\n\black<b>CODE NAME</b>: \red <b>KAMIKAZE</b>"
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/spideros
|
||||
sleep(40)
|
||||
U << "\blue Re-routing power nodes... \nUnlocking limiter..."
|
||||
sleep(40)
|
||||
U << "\blue Power nodes re-routed. \nLimiter unlocked."
|
||||
sleep(10)
|
||||
U << "\red Do or Die, <b>LET'S ROCK!!</b>"
|
||||
if(verbs.Find(/obj/item/clothing/suit/space/space_ninja/proc/deinit))//To hopefully prevent engaging kamikaze and de-initializing at the same time.
|
||||
kamikaze = 1
|
||||
active = 0
|
||||
icon_state = "s-ninjak"
|
||||
if(istype(U.gloves, /obj/item/clothing/gloves/space_ninja))
|
||||
U.gloves.icon_state = "s-ninjak"
|
||||
U.gloves.item_state = "s-ninjak"
|
||||
U.gloves:candrain = 0
|
||||
U.gloves:draining = 0
|
||||
U.gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/drain_wire
|
||||
U.gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled
|
||||
U.update_clothing()
|
||||
U.verbs -= /mob/proc/ninjashift
|
||||
U.verbs -= /mob/proc/ninjajaunt
|
||||
U.verbs -= /mob/proc/ninjapulse
|
||||
U.verbs -= /mob/proc/ninjastar
|
||||
U.verbs -= /mob/proc/ninjanet
|
||||
U.mind.special_verbs -= /mob/proc/ninjashift
|
||||
U.mind.special_verbs -= /mob/proc/ninjajaunt
|
||||
U.mind.special_verbs -= /mob/proc/ninjapulse
|
||||
U.mind.special_verbs -= /mob/proc/ninjastar
|
||||
U.mind.special_verbs -= /mob/proc/ninjanet
|
||||
U.verbs += /mob/proc/ninjaslayer
|
||||
U.verbs += /mob/proc/ninjawalk
|
||||
U.verbs += /mob/proc/ninjamirage
|
||||
U.mind.special_verbs += /mob/proc/ninjaslayer
|
||||
U.mind.special_verbs += /mob/proc/ninjawalk
|
||||
U.mind.special_verbs += /mob/proc/ninjamirage
|
||||
U.ninjablade()
|
||||
message_admins("\blue [U.key] used KAMIKAZE mode.", 1)
|
||||
else
|
||||
U << "Nevermind, you cheater."
|
||||
U << browse(null, "window=spideros")
|
||||
return
|
||||
else
|
||||
U << "\red ERROR: WRONG PASSWORD!"
|
||||
unlock = 0
|
||||
spideros = 0
|
||||
if("Dylovene")//These names really don't matter for specific functions but it's easier to use descriptive names.
|
||||
if(!reagents.get_reagent_amount("anti_toxin"))
|
||||
U << "\red Error: the suit cannot perform this function. Out of dylovene."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "anti_toxin", transfera)
|
||||
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
|
||||
if("Dexalin Plus")
|
||||
if(!reagents.get_reagent_amount("dexalinp"))
|
||||
U << "\red Error: the suit cannot perform this function. Out of dexalinp."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "dexalinp", transfera)
|
||||
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
|
||||
if("Tricordazine")
|
||||
if(!reagents.get_reagent_amount("tricordrazine"))
|
||||
U << "\red Error: the suit cannot perform this function. Out of tricordrazine."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "tricordrazine", transfera)
|
||||
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
|
||||
if("Spacelin")
|
||||
if(!reagents.get_reagent_amount("spaceacillin"))
|
||||
U << "\red Error: the suit cannot perform this function. Out of spaceacillin."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "spaceacillin", transfera)
|
||||
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
|
||||
if("Nutriment")
|
||||
if(!reagents.get_reagent_amount("nutriment"))
|
||||
U << "\red Error: the suit cannot perform this function. Out of nutriment."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "nutriment", 5)
|
||||
U << "You feel a tiny prick and a sudden rush of substance in to your veins."
|
||||
|
||||
spideros()//Refreshes the screen by calling it again (which replaces current screen with new screen).
|
||||
if("Override Laws")
|
||||
var/mob/living/silicon/ai/A = locate(href_list["target"])
|
||||
var/law_zero = A.laws_object.zeroth//Remembers law zero, if there is one.
|
||||
A.laws_object = new /datum/ai_laws/ninja_override
|
||||
A.set_zeroth_law(law_zero)//Adds back law zero if there was one.
|
||||
A.show_laws()
|
||||
U << "\blue Law Override: <b>SUCCESS</b>."
|
||||
if("Purge AI")
|
||||
var/confirm = alert("Are you sure you want to purge the AI? This cannot be undone once started.", "Confirm Purge", "Yes", "No")
|
||||
var/mob/living/silicon/ai/AI = locate() in aicard//Important to place here in case the AI does not exist anymore.
|
||||
if(U.stat||U.wear_suit!=src||!initialize||!AI)
|
||||
U << browse(null, "window=spideros")
|
||||
return
|
||||
if(confirm == "Yes")
|
||||
if(AI.laws_object.zeroth)
|
||||
AI << "\red <b>WARNING</b>: \black Purge procedure detected. \n Now hacking terminal..."
|
||||
AI.control_disabled = 0
|
||||
U << "\red <b>WARNING</b>: HACKING ATT--TEMPT IN PR0GRESsS!"
|
||||
spideros = 0
|
||||
unlock = 0
|
||||
active = 0
|
||||
control = 0
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/deinit
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/spideros
|
||||
U << browse(null, "window=spideros")
|
||||
return
|
||||
else
|
||||
aicard.flush = 1
|
||||
AI.suiciding = 1
|
||||
AI << "Your core files are being purged! This is the end..."
|
||||
while (AI.stat != 2)
|
||||
AI.oxyloss += 2
|
||||
AI.updatehealth()
|
||||
sleep(10)
|
||||
killai(AI)
|
||||
aicard.overlays = null
|
||||
aicard.flush = 0
|
||||
if("Wireless AI")
|
||||
for(var/mob/living/silicon/ai/A in aicard)
|
||||
A.control_disabled = !A.control_disabled
|
||||
A << "AI wireless has been [A.control_disabled ? "disabled" : "enabled"]."
|
||||
|
||||
spideros()//Refreshes the screen by calling it again (which replaces current screen with new screen).
|
||||
else//If they are not in control.
|
||||
var/mob/living/silicon/ai/AI = usr
|
||||
|
||||
//While AI has control, the person can't take off the suit so checking here would be moot.
|
||||
|
||||
switch(href_list["choice"])
|
||||
if("Close")
|
||||
AI << browse(null, "window=hack spideros")
|
||||
return
|
||||
if("Refresh")//Refresh, goes to the end of the proc.
|
||||
if("Return")//Return
|
||||
if(spideros<=9)
|
||||
spideros=0
|
||||
else
|
||||
spideros = round(spideros/10)//Best way to do this, flooring to nearest integer. As an example, another way of doing it is attached below:
|
||||
if("Shock")
|
||||
var/damage = min(cell.charge, rand(50,150))//Uses either the current energy left over or between 50 and 150.
|
||||
cell.charge -= damage
|
||||
if(damage>1)//So they don't spam it when energy is a factor.
|
||||
spark_system.start()//SPARKS THERE SHALL BE SPARKS
|
||||
U.electrocute_act(damage, src, 0.1)
|
||||
else
|
||||
AI << "\red <b>ERROR</b>: \black Not enough energy remaining."
|
||||
if("0")//Menus are numbers, see note above. 0 is the hub.
|
||||
spideros=0
|
||||
if("1")//Begin normal menus 1-9.
|
||||
spideros=1
|
||||
if("2")
|
||||
spideros=2
|
||||
if("3")
|
||||
spideros=3
|
||||
if("32")
|
||||
spideros=32
|
||||
if("Message")
|
||||
var/obj/item/device/pda/P = locate(href_list["target"])
|
||||
var/t = input(U, "Please enter untraceable message.") as text
|
||||
t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN)
|
||||
if(!t||affecting!=U||!initialize)//Wow, another one of these. Man...
|
||||
AI << browse(null, "window=hack spideros")
|
||||
return
|
||||
if(isnull(P)||P.toff)//So it doesn't freak out if the object no-longer exists.
|
||||
AI << "\red Error: unable to deliver message."
|
||||
AI.ninja_spideros()
|
||||
return
|
||||
P.tnote += "<i><b>← From [AI]:</b></i><br>[t]<br>"//Oh ai, u so silly
|
||||
if (!P.silent)
|
||||
playsound(P.loc, 'twobeep.ogg', 50, 1)
|
||||
for (var/mob/O in hearers(3, P.loc))
|
||||
O.show_message(text("\icon[P] *[P.ttone]*"))
|
||||
P.overlays = null
|
||||
P.overlays += image('pda.dmi', "pda-r")
|
||||
if("Unlock Kamikaze")
|
||||
AI << "\red <b>ERROR</b>: \black TARANTULA.v.4.77.12 encryption algorithm detected. Unable to decrypt archive. \n Aborting..."
|
||||
if("Dylovene")
|
||||
if(!reagents.get_reagent_amount("anti_toxin"))
|
||||
AI << "\red Error: the suit cannot perform this function. Out of dylovene."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "anti_toxin", transfera)
|
||||
AI << "Injecting..."
|
||||
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
|
||||
if("Dexalin Plus")
|
||||
if(!reagents.get_reagent_amount("dexalinp"))
|
||||
AI << "\red Error: the suit cannot perform this function. Out of dexalinp."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "dexalinp", transfera)
|
||||
AI << "Injecting..."
|
||||
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
|
||||
if("Tricordazine")
|
||||
if(!reagents.get_reagent_amount("tricordrazine"))
|
||||
AI << "\red Error: the suit cannot perform this function. Out of tricordrazine."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "tricordrazine", transfera)
|
||||
AI << "Injecting..."
|
||||
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
|
||||
if("Spacelin")
|
||||
if(!reagents.get_reagent_amount("spaceacillin"))
|
||||
AI << "\red Error: the suit cannot perform this function. Out of spaceacillin."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "spaceacillin", transfera)
|
||||
AI << "Injecting..."
|
||||
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
|
||||
if("Radium")
|
||||
if((reagents.get_reagent_amount("radium"))<=60)//Special case. If there are only 60 radium units left.
|
||||
AI << "\red Error: the suit cannot perform this function. Out of spaceacillin."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "spaceacillin", transfera)
|
||||
AI << "Injecting..."
|
||||
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
|
||||
if("Nutriment")
|
||||
if(!reagents.get_reagent_amount("nutriment"))
|
||||
AI << "\red Error: the suit cannot perform this function. Out of nutriment."
|
||||
else
|
||||
reagents.reaction(U, 2)
|
||||
reagents.trans_id_to(U, "nutriment", 5)
|
||||
AI << "Injecting..."
|
||||
U << "You feel a tiny prick and a sudden rush of substance in to your veins."
|
||||
AI.ninja_spideros()//Calls spideros for AI.
|
||||
return
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/examine()
|
||||
set src in view()
|
||||
..()
|
||||
if(initialize)
|
||||
usr << "All systems operational. Current energy capacity: <B>[cell.charge]</B>."
|
||||
if(!kamikaze)
|
||||
if(active)
|
||||
usr << "The CLOAK-tech device is <B>active</B>."
|
||||
if(control)
|
||||
usr << "All systems operational. Current energy capacity: <B>[cell.charge]</B>."
|
||||
if(!kamikaze)
|
||||
if(active)
|
||||
usr << "The CLOAK-tech device is <B>active</B>."
|
||||
else
|
||||
usr << "The CLOAK-tech device is <B>inactive</B>."
|
||||
else
|
||||
usr << "The CLOAK-tech device is <B>inactive</B>."
|
||||
usr << "\red KAMIKAZE MODE ENGAGED!"
|
||||
usr << "There are <B>[sbombs]</B> smoke bombs remaining."
|
||||
usr << "There are <B>[aboost]</B> adrenaline boosters remaining."
|
||||
else
|
||||
usr << "\red KAMIKAZE MODE ENGAGED!"
|
||||
usr << "There are <B>[sbombs]</B> smoke bombs remaining."
|
||||
usr << "There are <B>[aboost]</B> adrenaline boosters remaining."
|
||||
usr << "ERR0R DATAA NoT FOUND 3RROR"
|
||||
|
||||
//GLOVES===================================
|
||||
|
||||
/obj/item/clothing/gloves/space_ninja/proc/toggled()
|
||||
set name = "Toggle Drain"
|
||||
set desc = "Toggles the energy drain mechanism on or off."
|
||||
set name = "Toggle Interaction"
|
||||
set desc = "Toggles special interaction on or off."
|
||||
set category = "Object"
|
||||
if(!candrain)
|
||||
candrain=1
|
||||
usr << "You enable the energy drain mechanism."
|
||||
usr << "You enable special interaction."
|
||||
else
|
||||
candrain=0
|
||||
usr << "You disable the energy drain mechanism."
|
||||
usr << "You disable special interaction."
|
||||
|
||||
//DRAINING PROCS START===================================
|
||||
|
||||
@@ -712,7 +983,7 @@
|
||||
else
|
||||
U << "\red This cell is empty and of no use."
|
||||
|
||||
if("MACHINERY")//Can be applied to generically to all powered machinery.
|
||||
if("MACHINERY")//Can be applied to generically to all powered machinery. I'm leaving this alone for now.
|
||||
var/obj/machinery/A = target
|
||||
if(A.powered())//If powered.
|
||||
|
||||
@@ -926,4 +1197,170 @@
|
||||
else
|
||||
voice = "active"
|
||||
usr << "<B>[mode]</B> is active."
|
||||
usr << "Voice mimicking algorithm is set to <B>[voice]</B>."
|
||||
usr << "Voice mimicking algorithm is set to <B>[voice]</B>."
|
||||
|
||||
//ENERGY NET===================================
|
||||
|
||||
/*
|
||||
HerpA:
|
||||
I'm not really sure what you want this to do.
|
||||
For now it will teleport people to the prison after 30 seconds.
|
||||
It is possible to destroy the net by the occupant or someone else.
|
||||
The sprite for the net is kind of ugly but I couldn't come up with a better one.
|
||||
*/
|
||||
|
||||
/obj/effects/energy_net
|
||||
name = "energy net"
|
||||
desc = "It's a net made of green energy."
|
||||
icon = 'effects.dmi'
|
||||
icon_state = "energynet"
|
||||
|
||||
density = 1//Can't pass through.
|
||||
opacity = 0//Can see through.
|
||||
mouse_opacity = 1//So you can hit it with stuff.
|
||||
anchored = 1//Can't drag/grab.
|
||||
var/health = 25//How much health it has.
|
||||
var/mob/living/affecting = null//Who it is currently affecting, if anyone.
|
||||
var/mob/living/master = null//Who shot the net. Will let this person know if net was successful or failed.
|
||||
|
||||
/obj/effects/energy_net/proc/healthcheck()
|
||||
if(health <=0)
|
||||
density = 0
|
||||
if(affecting)
|
||||
var/mob/living/carbon/M = affecting
|
||||
M.anchored = 0
|
||||
for(var/mob/O in viewers(src, 3))
|
||||
O.show_message(text("[] was recovered from the energy net!", M.name), 1, text("You hear a grunt."), 2)
|
||||
if(!isnull(master))//As long as they still exist.
|
||||
master << "\red <b>ERROR</b>: \black unable to initiate transport protocol. Procedure terminated."
|
||||
del(src)
|
||||
return
|
||||
|
||||
/obj/effects/energy_net/bullet_act(flag)
|
||||
switch(flag)
|
||||
if (PROJECTILE_BULLET)
|
||||
health -= 35
|
||||
if (PROJECTILE_PULSE)
|
||||
health -= 50
|
||||
if (PROJECTILE_LASER)
|
||||
health -= 10
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effects/energy_net/ex_act(severity)
|
||||
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()
|
||||
return
|
||||
|
||||
/obj/effects/energy_net/blob_act()
|
||||
health-=50
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effects/energy_net/meteorhit()
|
||||
health-=50
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effects/energy_net/hitby(AM as mob|obj)
|
||||
..()
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\red <B>[src] was hit by [AM].</B>"), 1)
|
||||
var/tforce = 0
|
||||
if(ismob(AM))
|
||||
tforce = 10
|
||||
else
|
||||
tforce = AM:throwforce
|
||||
playsound(src.loc, 'slash.ogg', 80, 1)
|
||||
health = max(0, health - tforce)
|
||||
healthcheck()
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/effects/energy_net/attack_hand()
|
||||
if ((usr.mutations & HULK))
|
||||
usr << text("\blue You easily destroy the energy net.")
|
||||
for(var/mob/O in oviewers(src))
|
||||
O.show_message(text("\red [] rips the energy net apart!", usr), 1)
|
||||
health-=50
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effects/energy_net/attack_paw()
|
||||
return attack_hand()
|
||||
|
||||
/obj/effects/energy_net/attack_alien()
|
||||
if (islarva(usr))
|
||||
return
|
||||
usr << text("\green You claw at the net.")
|
||||
for(var/mob/O in oviewers(src))
|
||||
O.show_message(text("\red [] claws at the energy net!", usr), 1)
|
||||
playsound(src.loc, 'slash.ogg', 80, 1)
|
||||
health -= rand(10, 20)
|
||||
if(health <= 0)
|
||||
usr << text("\green You slice the energy net to pieces.")
|
||||
for(var/mob/O in oviewers(src))
|
||||
O.show_message(text("\red [] slices the energy net apart!", usr), 1)
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effects/energy_net/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
var/aforce = W.force
|
||||
health = max(0, health - aforce)
|
||||
healthcheck()
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/effects/energy_net/proc/process(var/mob/living/carbon/M as mob)
|
||||
var/check = 30//30 seconds before teleportation. Could be extended I guess.
|
||||
//The person can still try and attack the net when inside.
|
||||
while(!isnull(M)&&!isnull(src)&&check>0)//While M and net exist, and 30 seconds have not passed.
|
||||
check--
|
||||
sleep(10)
|
||||
|
||||
if(isnull(M))//If mob is gone.
|
||||
if(!isnull(master))//As long as they still exist.
|
||||
master << "\red <b>ERROR</b>: \black unable to locate [affecting]. Procedure terminated."
|
||||
del(src)//Get rid of the net.
|
||||
return
|
||||
|
||||
if(!isnull(src))//As long as both net and person exist.
|
||||
//No need to check for countdown here since while() broke, it's implicit that it finished.
|
||||
spawn(0)
|
||||
playsound(M.loc, 'sparks4.ogg', 50, 1)
|
||||
anim(M.loc,'mob.dmi',M,"phaseout")
|
||||
|
||||
M.loc = pick(prisonwarp)//Throw mob in prison.
|
||||
|
||||
spawn(0)
|
||||
var/datum/effects/system/spark_spread/spark_system = new /datum/effects/system/spark_spread()
|
||||
spark_system.set_up(5, 0, M.loc)
|
||||
spark_system.start()
|
||||
playsound(M.loc, 'Deconstruct.ogg', 50, 1)
|
||||
playsound(M.loc, 'sparks2.ogg', 50, 1)
|
||||
anim(M.loc,'mob.dmi',M,"phasein")
|
||||
del(src)//Wait for everything to finish, delete the net. Else it will stop everything once net is deleted, including the spawn(0).
|
||||
|
||||
for(var/mob/O in viewers(src, 3))
|
||||
O.show_message(text("[] vanished!", M), 1, text("You hear sparks flying!"), 2)
|
||||
|
||||
if(!isnull(master))//As long as they still exist.
|
||||
master << "\blue <b>SUCCESS</b>: \black transport procedure of [affecting] complete."
|
||||
|
||||
M.anchored = 0//Important.
|
||||
|
||||
else//And they are free.
|
||||
M << "\blue You are free of the net!"
|
||||
return
|
||||
@@ -1,4 +1,11 @@
|
||||
//SPACE NINJAS=============================
|
||||
/*
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
+++++++++++++++++++++++++++++++++++++// \\++++++++++++++++++++++++++++++++++
|
||||
======================================SPACE NINJA SETUP====================================
|
||||
___________________________________________________________________________________________
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*/
|
||||
|
||||
/client/proc/space_ninja()
|
||||
set category = "Fun"
|
||||
set name = "Spawn Space Ninja"
|
||||
@@ -84,4 +91,198 @@ mob/proc/create_ninja()
|
||||
new_ninja.equip_if_possible(new /obj/item/device/flashlight(new_ninja), new_ninja.slot_belt)
|
||||
new_ninja.equip_if_possible(new /obj/item/weapon/plastique(new_ninja), new_ninja.slot_r_store)
|
||||
new_ninja.equip_if_possible(new /obj/item/weapon/plastique(new_ninja), new_ninja.slot_l_store)
|
||||
new_ninja.equip_if_possible(new /obj/item/weapon/tank/emergency_oxygen(new_ninja), new_ninja.slot_s_store)
|
||||
new_ninja.equip_if_possible(new /obj/item/weapon/tank/emergency_oxygen(new_ninja), new_ninja.slot_s_store)
|
||||
|
||||
//AI COUNTER HACKING===================================
|
||||
|
||||
/mob/living/silicon/ai/proc/ninja_spideros()
|
||||
set name = "Hack SpiderOS"
|
||||
set desc = "Hack directly into the Black Widow(tm) neuro-interface."
|
||||
set category = "AI Commands"
|
||||
|
||||
loc.loc:hack_spideros()//aicard.ninjasuit:hack_spideros()
|
||||
|
||||
/mob/living/silicon/ai/proc/ninja_return_control()
|
||||
set name = "Relinquish Control"
|
||||
set desc = "Return control to the user."
|
||||
set category = "AI Commands"
|
||||
|
||||
src << browse(null, "window=hack spideros")//Close window
|
||||
loc.loc:control = 0//Return control
|
||||
loc.loc:affecting:verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit//Add back verbs
|
||||
loc.loc:affecting:verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros
|
||||
loc.loc:affecting << "<b>UPDATE</b>: [name] has seized hacking attempt. All systems clear."
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/hack_spideros()
|
||||
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
var/mob/living/silicon/ai/AI = locate() in aicard
|
||||
if(!affecting||!AI) return//Just in case... something went wrong.
|
||||
|
||||
var/dat = "<html><head><title>SpiderOS</title></head><body bgcolor=\"#3D5B43\" text=\"#DB2929\"><style>a, a:link, a:visited, a:active, a:hover { color: #DB2929; }img {border-style:none;}</style>"
|
||||
if(spideros==0)
|
||||
dat += "<a href='byond://?src=\ref[src];choice=Refresh'><img src=sos_7.png> Refresh</a>"
|
||||
else
|
||||
dat += "<a href='byond://?src=\ref[src];choice=Refresh'><img src=sos_7.png> Refresh</a>"
|
||||
dat += " | <a href='byond://?src=\ref[src];choice=Return'><img src=sos_1.png> Return</a>"
|
||||
dat += " | <a href='byond://?src=\ref[src];choice=Close'><img src=sos_8.png> Close</a>"
|
||||
dat += "<br>"
|
||||
dat += "<h2 ALIGN=CENTER>SpiderOS v.<b>ERR-RR00123</b></h2>"
|
||||
dat += "<br>"
|
||||
dat += "<img src=sos_10.png> Current Time: [round(world.time / 36000)+12]:[(world.time / 600 % 60) < 10 ? add_zero(world.time / 600 % 60, 1) : world.time / 600 % 60]<br>"
|
||||
dat += "<img src=sos_9.png> Battery Life: [round(cell.charge/100)]%<br>"
|
||||
dat += "<img src=sos_11.png> Smoke Bombs: [sbombs]<br>"
|
||||
dat += "<br>"
|
||||
|
||||
switch(spideros)
|
||||
if(0)
|
||||
dat += "<h4><img src=sos_1.png> Available Functions:</h4>"
|
||||
dat += "<ul>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=Shock'><img src=sos_4.png> Shock [U.real_name]</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=1'><img src=sos_3.png> Medical Screen</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=2'><img src=sos_5.png> Atmos Scan</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=3'><img src=sos_12.png> Messenger</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=4'><img src=sos_6.png> Other</a></li>"
|
||||
dat += "</ul>"
|
||||
if(1)
|
||||
dat += "<h4><img src=sos_3.png> Medical Report:</h4>"
|
||||
if(U.dna)
|
||||
dat += "<b>Fingerprints</b>: <i>[md5(U.dna.uni_identity)]</i><br>"
|
||||
dat += "<b>Unique identity</b>: <i>[U.dna.unique_enzymes]</i><br>"
|
||||
dat += "<h4>Overall Status: [U.stat > 1 ? "dead" : "[U.health]% healthy"]</h4>"
|
||||
dat += "<h4>Nutrition Status: [U.nutrition]</h4>"
|
||||
dat += "Oxygen loss: [U.oxyloss]"
|
||||
dat += " | Toxin levels: [U.toxloss]<br>"
|
||||
dat += "Burn severity: [U.fireloss]"
|
||||
dat += " | Brute trauma: [U.bruteloss]<br>"
|
||||
dat += "Body Temperature: [U.bodytemperature-T0C]°C ([U.bodytemperature*1.8-459.67]°F)<br>"
|
||||
if(U.virus)
|
||||
dat += "Warning Virus Detected. Name: [U.virus.name].Type: [U.virus.spread]. Stage: [U.virus.stage]/[U.virus.max_stages]. Possible Cure: [U.virus.cure].<br>"
|
||||
dat += "<ul>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=Dylovene'><img src=sos_2.png> Inject Dylovene: [reagents.get_reagent_amount("anti_toxin")/20] left</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=Dexalin Plus'><img src=sos_2.png> Inject Dexalin Plus: [reagents.get_reagent_amount("dexalinp")/20] left</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=Tricordazine'><img src=sos_2.png> Inject Tricordazine: [reagents.get_reagent_amount("tricordrazine")/20] left</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=Spacelin'><img src=sos_2.png> Inject Spacelin: [reagents.get_reagent_amount("spaceacillin")/20] left</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=Spacelin'><img src=sos_2.png> Inject Radium: [(reagents.get_reagent_amount("radium")/20)-60] left</a></li>"//There is 120 radium at start. -60 for adrenaline boosts.
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=Nutriment'><img src=sos_2.png> Inject Nutriment: [reagents.get_reagent_amount("nutriment")/5] left</a></li>"//Special case since it's so freaking potent.
|
||||
dat += "</ul>"
|
||||
if(2)
|
||||
dat += "<h4><img src=sos_5.png> Atmospheric Scan:</h4>"
|
||||
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 += "<ul>"
|
||||
dat += "<li>Nitrogen: [round(n2_level*100)]%</li>"
|
||||
dat += "<li>Oxygen: [round(o2_level*100)]%</li>"
|
||||
dat += "<li>Carbon Dioxide: [round(co2_level*100)]%</li>"
|
||||
dat += "<li>Plasma: [round(plasma_level*100)]%</li>"
|
||||
dat += "</ul>"
|
||||
if(unknown_level > 0.01)
|
||||
dat += "OTHER: [round(unknown_level)]%<br>"
|
||||
|
||||
dat += "Temperature: [round(environment.temperature-T0C)]°C"
|
||||
if(3)
|
||||
dat += "<a href='byond://?src=\ref[src];choice=32'><img src=sos_1.png> Hidden Menu</a>"
|
||||
dat += "<h4><img src=sos_12.png> Anonymous Messenger:</h4>"//Anonymous because the receiver will not know the sender's identity.
|
||||
dat += "<h4><img src=sos_6.png> Detected PDAs:</h4>"
|
||||
dat += "<ul>"
|
||||
var/count = 0
|
||||
for (var/obj/item/device/pda/P in world)
|
||||
if (!P.owner||P.toff)
|
||||
continue
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=Message;target=\ref[P]'>[P]</a>"
|
||||
dat += "</li>"
|
||||
count++
|
||||
dat += "</ul>"
|
||||
if (count == 0)
|
||||
dat += "None detected.<br>"
|
||||
if(32)//Only leaving this in for funnays. CAN'T LET YOU DO THAT STAR FOX
|
||||
dat += "<h4><img src=sos_1.png> Hidden Menu:</h4>"
|
||||
dat += "Hostile runtime intrusion detected: operation locked. The Spider Clan is watching you, <b>INTRUDER</b>."
|
||||
dat += "</body></html>"
|
||||
|
||||
AI << browse(dat,"window=hack spideros;size=400x444;border=1;can_resize=0;can_close=0;can_minimize=0")
|
||||
|
||||
//DEBUG===================================
|
||||
|
||||
//Switches keys with AI stored inside suit. Useful for quickly testing things.
|
||||
/*
|
||||
var/ninja_debug_target//Easiest way to do this. The proc below sets this variable to your mob.
|
||||
|
||||
/mob/verb/possess_mob(var/mob/M in oview())
|
||||
set name = "Possess Mob"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
if(!M.client)
|
||||
client.mob = M
|
||||
|
||||
/mob/verb/set_debug_ninja_target()
|
||||
set name = "Set Debug Target"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
ninja_debug_target = src//The target is you, brohime.
|
||||
world << "Target: [src]"
|
||||
|
||||
/mob/verb/hack_spideros_debug()
|
||||
set name = "Debug Hack Spider OS"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
var/mob/living/carbon/human/H = ninja_debug_target
|
||||
var/mob/living/silicon/ai/AI = locate() in H.wear_suit:aicard
|
||||
if(AI)
|
||||
if(!AI.key)
|
||||
AI.client.mob = H
|
||||
else
|
||||
H.client.mob = AI
|
||||
return
|
||||
|
||||
//Tests the net and what it does.
|
||||
/mob/verb/ninjanet_debug()
|
||||
set name = "Energy Net Debug"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
var/obj/effects/energy_net/E = new /obj/effects/energy_net(loc)
|
||||
E.layer = layer+1//To have it appear one layer above the mob.
|
||||
stunned = 10//So they are stunned initially but conscious.
|
||||
anchored = 1//Anchors them so they can't move.
|
||||
E.affecting = src
|
||||
spawn(0)//Parallel processing.
|
||||
E.process(src)
|
||||
return
|
||||
*/
|
||||
/*
|
||||
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.
|
||||
/mob/verb/TestNinjaShadow()
|
||||
set name = "Test Ninja Ability"
|
||||
set category = "Ninja Debug"
|
||||
|
||||
if(client)
|
||||
var/safety = 4
|
||||
for(var/turf/T in oview(5))
|
||||
if(prob(20))
|
||||
var/current_clone = image('mob.dmi',T,"s-ninja",dir)
|
||||
safety--
|
||||
spawn(0)
|
||||
src << current_clone
|
||||
spawn(300)
|
||||
del(current_clone)
|
||||
spawn while(!isnull(current_clone))
|
||||
step_to(current_clone,src,1)
|
||||
sleep(5)
|
||||
if(safety<=0) break
|
||||
return */
|
||||
@@ -130,4 +130,18 @@
|
||||
T.lock_code = pda_pass
|
||||
T.hostpda = R
|
||||
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features."
|
||||
traitor_mob.mind.store_memory("<B>Uplink Passcode:</B> [pda_pass] ([R.name] [loc]).")
|
||||
traitor_mob.mind.store_memory("<B>Uplink Passcode:</B> [pda_pass] ([R.name] [loc]).")
|
||||
//Begin code phrase.
|
||||
traitor_mob << "The Syndicate provided you with the following information on how to identify other agents:"
|
||||
if(prob(80))
|
||||
traitor_mob << "\red Code Phrase: \black [syndicate_code_phrase]"
|
||||
traitor_mob.mind.store_memory("<b>Code Phrase</b>: [syndicate_code_phrase]")
|
||||
else
|
||||
traitor_mob << "Unfortunetly, the Syndicate did not provide you with a code phrase."
|
||||
if(prob(80))
|
||||
traitor_mob << "\red Code Response: \black [syndicate_code_response]"
|
||||
traitor_mob.mind.store_memory("<b>Code Response</b>: [syndicate_code_response]")
|
||||
else
|
||||
traitor_mob << "Unfortunetly, the Syndicate did not provide you with a code response."
|
||||
traitor_mob << "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe."
|
||||
//End code phrase.
|
||||
@@ -30,7 +30,7 @@ var/global/datum/controller/gameticker/ticker
|
||||
else
|
||||
sleep(10)
|
||||
pregame_timeleft--
|
||||
|
||||
|
||||
if(pregame_timeleft <= 0)
|
||||
current_state = GAME_STATE_SETTING_UP
|
||||
|
||||
@@ -188,18 +188,17 @@ var/global/datum/controller/gameticker/ticker
|
||||
/datum/controller/gameticker/proc/declare_completion()
|
||||
|
||||
for (var/mob/living/silicon/ai/aiPlayer in world)
|
||||
if (aiPlayer.name != "Inactive AI")
|
||||
if (aiPlayer.stat != 2)
|
||||
world << "<b>[aiPlayer.name]'s laws at the end of the game were:</b>"
|
||||
else
|
||||
world << "<b>[aiPlayer.name]'s laws when it was deactivated were:</b>"
|
||||
aiPlayer.show_laws(1)
|
||||
if (aiPlayer.stat != 2)
|
||||
world << "<b>[aiPlayer.name]'s laws at the end of the game were:</b>"
|
||||
else
|
||||
world << "<b>[aiPlayer.name]'s laws when it was deactivated were:</b>"
|
||||
aiPlayer.show_laws(1)
|
||||
|
||||
var/robolist = "<b>The AI's loyal minions were:</b> "
|
||||
for(var/mob/living/silicon/robot/robo in world)
|
||||
if (robo.connected_ai == aiPlayer)
|
||||
robolist += "[robo.name][robo.stat?" (Deactivated), ":", "]"
|
||||
world << "[robolist]"
|
||||
var/robolist = "<b>The AI's loyal minions were:</b> "
|
||||
for(var/mob/living/silicon/robot/robo in world)
|
||||
if (robo.connected_ai == aiPlayer)
|
||||
robolist += "[robo.name][robo.stat?" (Deactivated), ":", "]"
|
||||
world << "[robolist]"
|
||||
|
||||
for (var/mob/living/silicon/robot/robo in world)
|
||||
if (!robo.connected_ai)
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
var/list/mob/living/silicon/ai/ailist = list()
|
||||
for (var/mob/living/silicon/ai/A in world)
|
||||
if (!A.stat && A.name != "Inactive AI")
|
||||
if (!A.stat)
|
||||
ailist += A
|
||||
var/mob/living/silicon/ai/aiplayer
|
||||
if (ailist.len)
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
avnums.Remove(tempnum)
|
||||
BLINDBLOCK = tempnum
|
||||
|
||||
/* This was use 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")
|
||||
@@ -137,4 +138,5 @@
|
||||
M.equip_if_possible(new /obj/item/clothing/suit/armor/vest(M), M.slot_wear_suit)
|
||||
M.equip_if_possible(new /obj/item/clothing/head/helmet/swat(M), M.slot_head)
|
||||
del(A)
|
||||
continue
|
||||
continue
|
||||
*/
|
||||
@@ -285,30 +285,7 @@
|
||||
/obj/machinery/camera/attackby(W as obj, user as mob)
|
||||
..()
|
||||
if (istype(W, /obj/item/weapon/wirecutters))
|
||||
src.status = !( src.status )
|
||||
if (!( src.status ))
|
||||
for(var/mob/O in viewers(user, null))
|
||||
O.show_message(text("\red [] has deactivated []!", user, src), 1)
|
||||
playsound(src.loc, 'Wirecutter.ogg', 100, 1)
|
||||
src.icon_state = "camera1"
|
||||
else
|
||||
for(var/mob/O in viewers(user, null))
|
||||
O.show_message(text("\red [] has reactivated []!", user, src), 1)
|
||||
playsound(src.loc, 'Wirecutter.ogg', 100, 1)
|
||||
src.icon_state = "camera"
|
||||
// now disconnect anyone using the camera
|
||||
for(var/mob/living/silicon/ai/O in world)
|
||||
if (O.current == src)
|
||||
O.cancel_camera()
|
||||
O << "Your connection to the camera has been lost."
|
||||
for(var/mob/O in world)
|
||||
if (istype(O.machine, /obj/machinery/computer/security))
|
||||
var/obj/machinery/computer/security/S = O.machine
|
||||
if (S.current == src)
|
||||
O.machine = null
|
||||
S.current = null
|
||||
O.reset_view(null)
|
||||
O << "The screen bursts into static."
|
||||
deactivate(user)
|
||||
else if (istype(W, /obj/item/weapon/paper))
|
||||
var/obj/item/weapon/paper/X = W
|
||||
user << "You hold a paper up to the camera ..."
|
||||
@@ -347,8 +324,56 @@
|
||||
else
|
||||
user << "\blue Camera bugged."
|
||||
src.bugged = 1
|
||||
else if(istype(W, /obj/item/weapon/blade))//Putting it here last since it's a special case. I wonder if there is a better way to do these than type casting.
|
||||
deactivate(user,2)//Here so that you can disconnect anyone viewing the camera, regardless if it's on or off.
|
||||
var/datum/effects/system/spark_spread/spark_system = new /datum/effects/system/spark_spread()
|
||||
spark_system.set_up(5, 0, loc)
|
||||
spark_system.start()
|
||||
playsound(loc, 'blade1.ogg', 50, 1)
|
||||
playsound(loc, "sparks", 50, 1)
|
||||
|
||||
var/obj/item/weapon/chem_grenade/case = new /obj/item/weapon/chem_grenade(loc)
|
||||
case.name = "Camera Assembly"
|
||||
case.path = 2
|
||||
case.state = 5
|
||||
case.anchored = 1
|
||||
case.circuit = new /obj/item/device/multitool
|
||||
if (istype(src, /obj/machinery/camera/motion))
|
||||
case.motion = 1
|
||||
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
O.show_message(text("\blue The camera has been sliced apart by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2)
|
||||
del(src)
|
||||
return
|
||||
|
||||
/obj/machinery/camera/proc/deactivate(user as mob, var/choice = 1)
|
||||
if(choice==1)
|
||||
status = !( src.status )
|
||||
if (!(src.status))
|
||||
for(var/mob/O in viewers(user, null))
|
||||
O.show_message(text("\red [] has deactivated []!", user, src), 1)
|
||||
playsound(src.loc, 'Wirecutter.ogg', 100, 1)
|
||||
icon_state = "camera1"
|
||||
else
|
||||
for(var/mob/O in viewers(user, null))
|
||||
O.show_message(text("\red [] has reactivated []!", user, src), 1)
|
||||
playsound(src.loc, 'Wirecutter.ogg', 100, 1)
|
||||
icon_state = "camera"
|
||||
// now disconnect anyone using the camera
|
||||
//Apparently, this will disconnect anyone even if the camera was re-activated.
|
||||
//I guess that doesn't matter since they can't use it anyway?
|
||||
for(var/mob/living/silicon/ai/O in world)
|
||||
if (O.current == src)
|
||||
O.cancel_camera()
|
||||
O << "Your connection to the camera has been lost."
|
||||
for(var/mob/O in world)
|
||||
if (istype(O.machine, /obj/machinery/computer/security))
|
||||
var/obj/machinery/computer/security/S = O.machine
|
||||
if (S.current == src)
|
||||
O.machine = null
|
||||
S.current = null
|
||||
O.reset_view(null)
|
||||
O << "The screen bursts into static."
|
||||
|
||||
//Return a working camera that can see a given mob
|
||||
//or null if none
|
||||
|
||||
@@ -142,4 +142,38 @@
|
||||
user << "\blue You connect the monitor."
|
||||
|
||||
new /mob/living/silicon/ai ( src.loc, laws, brain )
|
||||
del(src)
|
||||
del(src)
|
||||
|
||||
/obj/AIcore/deactivated
|
||||
name = "Inactive AI"
|
||||
icon = 'mob.dmi'
|
||||
icon_state = "ai-empty"
|
||||
anchored = 1
|
||||
state = 20//So it doesn't interact based on the above. Not really necessary.
|
||||
|
||||
attackby(var/obj/item/device/aicard/A as obj, var/mob/user as mob)
|
||||
if(istype(A, /obj/item/device/aicard))//Is it?
|
||||
if (!A.flush)//If not wiping.
|
||||
var/mob/living/silicon/ai/AI = locate() in A//I love locate(). Best proc ever.
|
||||
if(AI)//If AI exists on the card. Else nothing since both are empty.
|
||||
AI.control_disabled = 0
|
||||
AI.loc = src.loc//To replace the terminal.
|
||||
AI << "You have been uploaded to a stationary terminal. Remote device connection restored."
|
||||
user << "<b>Transfer succesful</b>: [AI.name] ([rand(1000,9999)].exe) installed and executed succesfully. Local copy has been removed."
|
||||
A.icon_state = "aicard"
|
||||
A.name = "inteliCard"
|
||||
A.overlays = null
|
||||
del(src)
|
||||
else
|
||||
user << "<b>Transfer failed</b>: Cannot transfer while wipe in progress."
|
||||
return
|
||||
return
|
||||
|
||||
attack_hand(var/mob/user as mob)
|
||||
if(ishuman(user))//Checks to see if they are ninja
|
||||
if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining)
|
||||
if(user:wear_suit:control)
|
||||
attackby(user:wear_suit:aicard,user)
|
||||
else
|
||||
user << "\red <b>ERROR</b>: \black Remote access channel disabled."
|
||||
return
|
||||
@@ -46,9 +46,9 @@
|
||||
user << "This terminal isn't functioning right now, get it working!"
|
||||
return
|
||||
var/obj/item/device/aicard/C = I
|
||||
if(src.contents.len == 0)
|
||||
if(contents.len == 0)
|
||||
if (C.contents.len == 0)
|
||||
user << "No AI to copy over!"
|
||||
user << "No AI to copy over!"//Well duh
|
||||
else for(var/mob/living/silicon/ai/A in C)
|
||||
A << "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here."
|
||||
user << "<b>Transfer succesful</b>: [A.name] ([rand(1000,9999)].exe) installed and executed succesfully. Local copy has been removed."
|
||||
@@ -56,51 +56,57 @@
|
||||
C.name = "inteliCard"
|
||||
C.overlays = null
|
||||
A.loc = src
|
||||
src.occupant = A
|
||||
occupant = A
|
||||
A.control_disabled = 1
|
||||
if (A.stat == 2)
|
||||
src.overlays += image('computer.dmi', "ai-fixer-404")
|
||||
overlays += image('computer.dmi', "ai-fixer-404")
|
||||
else
|
||||
src.overlays += image('computer.dmi', "ai-fixer-full")
|
||||
src.overlays -= image('computer.dmi', "ai-fixer-empty")
|
||||
overlays += image('computer.dmi', "ai-fixer-full")
|
||||
overlays -= image('computer.dmi', "ai-fixer-empty")
|
||||
|
||||
|
||||
else
|
||||
if(C.contents.len == 0 && src.occupant && !src.active)
|
||||
C.name = "inteliCard - [src.occupant.name]"
|
||||
src.overlays += image('computer.dmi', "ai-fixer-empty")
|
||||
C.name = "inteliCard - [occupant.name]"
|
||||
overlays += image('computer.dmi', "ai-fixer-empty")
|
||||
if (src.occupant.stat == 2)
|
||||
C.icon_state = "aicard-404"
|
||||
src.overlays -= image('computer.dmi', "ai-fixer-404")
|
||||
else
|
||||
C.icon_state = "aicard-full"
|
||||
src.overlays -= image('computer.dmi', "ai-fixer-full")
|
||||
src.occupant << "You have been downloaded to a mobile storage device. Still no remote access."
|
||||
user << "<b>Transfer succeeded</b>: [src.occupant.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory."
|
||||
src.occupant.loc = C
|
||||
src.occupant = null
|
||||
occupant << "You have been downloaded to a mobile storage device. Still no remote access."
|
||||
user << "<b>Transfer succeeded</b>: [occupant.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory."
|
||||
occupant.loc = C
|
||||
occupant = null
|
||||
else if (C.contents.len)
|
||||
user << "There's already an AI in the reconstructer!"
|
||||
else if (src.active)
|
||||
else if (active)
|
||||
user << "Can't remove an AI during reconstruction!"
|
||||
else if (!src.occupant)
|
||||
else if (!occupant)
|
||||
user << "No AI to remove!"
|
||||
|
||||
//src.attack_hand(user)
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/computer/aifixer/attack_ai(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/aifixer/attack_paw(var/mob/user as mob)
|
||||
|
||||
return src.attack_hand(user)
|
||||
return
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/aifixer/attack_hand(var/mob/user as mob)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(ishuman(user))//Checks to see if they are ninja
|
||||
if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining)
|
||||
if(user:wear_suit:control)
|
||||
attackby(user:wear_suit:aicard,user)
|
||||
else
|
||||
user << "\red <b>ERROR</b>: \black Remote access channel disabled."
|
||||
return
|
||||
|
||||
user.machine = src
|
||||
var/dat = "<h3>AI System Integrity Restorer</h3><br><br>"
|
||||
|
||||
|
||||
@@ -561,9 +561,9 @@ Pod/Blast Doors computer
|
||||
return
|
||||
use_power(500)
|
||||
var/O_limit
|
||||
var/atom/target = get_edge_target_turf(src, src.dir)
|
||||
for(var/atom/movable/O in src.loc)
|
||||
if(!O.anchored)
|
||||
var/atom/target = get_edge_target_turf(src, dir)
|
||||
for(var/atom/movable/O in loc)
|
||||
if(!O.anchored||istype(O, /obj/mecha))//Mechs need their launch platforms.
|
||||
O_limit++
|
||||
if(O_limit >= 20)
|
||||
for(var/mob/M in hearers(src, null))
|
||||
@@ -571,7 +571,7 @@ Pod/Blast Doors computer
|
||||
break
|
||||
use_power(500)
|
||||
spawn( 0 )
|
||||
O.throw_at(target, drive_range * src.power, src.power)
|
||||
O.throw_at(target, drive_range * power, power)
|
||||
flick("mass_driver1", src)
|
||||
return
|
||||
|
||||
|
||||
@@ -25,7 +25,9 @@ datum/controller/game_controller
|
||||
|
||||
setupgenetics()
|
||||
|
||||
setupcorpses()
|
||||
//setupcorpses() Not used any more.
|
||||
syndicate_code_phrase = generate_code_phrase()//Sets up code phrase for traitors, for the round.
|
||||
syndicate_code_response = generate_code_phrase()
|
||||
|
||||
emergency_shuttle = new /datum/shuttle_controller/emergency_shuttle()
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
opacity = 1
|
||||
anchored = 1
|
||||
var/health = 50
|
||||
var/affecting = null
|
||||
var/mob/living/affecting = null
|
||||
|
||||
/obj/alien/weeds
|
||||
name = "weeds"
|
||||
|
||||
@@ -1,29 +1,8 @@
|
||||
// Resin walls improved. /N
|
||||
|
||||
/*/obj/alien/resin/ex_act(severity)
|
||||
world << "[severity] - [health]"
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
src.health -= 10
|
||||
if(2.0)
|
||||
src.health -= 5
|
||||
if(3.0)
|
||||
src.health -= 1
|
||||
if(src.health < 1)
|
||||
del(src)
|
||||
return*/
|
||||
/*
|
||||
/obj/alien/resin/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
M.show_message(text("\red <B>[src] is struck with [src]!</B>"), 1)
|
||||
src.health -= 2
|
||||
if(src.health <= 0)
|
||||
del(src)
|
||||
*/
|
||||
|
||||
/obj/alien/resin/proc/healthcheck()
|
||||
if(health <=0)
|
||||
src.density = 0
|
||||
density = 0
|
||||
if(affecting)
|
||||
var/mob/living/carbon/M = affecting
|
||||
contents.Remove(affecting)
|
||||
@@ -31,7 +10,7 @@
|
||||
M.verbs += /mob/living/carbon/human/verb/suicide
|
||||
else
|
||||
M.verbs += /mob/living/carbon/monkey/verb/suicide
|
||||
M.loc = src.loc
|
||||
M.loc = loc
|
||||
M.paralysis += 10
|
||||
for(var/mob/O in viewers(src, 3))
|
||||
O.show_message(text("A body appeared from the dead resin!"), 1, text("You hear faint moaning somewhere about you."), 2)
|
||||
@@ -67,12 +46,11 @@
|
||||
return
|
||||
|
||||
/obj/alien/resin/blob_act()
|
||||
density = 0
|
||||
del(src)
|
||||
health-=50
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/alien/resin/meteorhit()
|
||||
//*****RM
|
||||
//world << "glass at [x],[y],[z] Mhit"
|
||||
health-=50
|
||||
healthcheck()
|
||||
return
|
||||
@@ -87,7 +65,7 @@
|
||||
else
|
||||
tforce = AM:throwforce
|
||||
playsound(src.loc, 'attackblob.ogg', 100, 1)
|
||||
src.health = max(0, health - tforce)
|
||||
health = max(0, health - tforce)
|
||||
healthcheck()
|
||||
..()
|
||||
return
|
||||
@@ -95,37 +73,27 @@
|
||||
/obj/alien/resin/attack_hand()
|
||||
if ((usr.mutations & HULK))
|
||||
usr << text("\blue You easily destroy the resin wall.")
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
O << text("\red [] destroys the resin wall!", usr)
|
||||
for(var/mob/O in oviewers(src))
|
||||
O.show_message(text("\red [] destroys the resin wall!", usr), 1)
|
||||
health-=50
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/alien/resin/attack_paw()
|
||||
if ((usr.mutations & HULK))
|
||||
usr << text("\blue You easily destroy the resin wall.")
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
O << text("\red [] destroys the resin wall!", usr)
|
||||
health-=50
|
||||
healthcheck()
|
||||
return
|
||||
return attack_hand()
|
||||
|
||||
/obj/alien/resin/attack_alien()
|
||||
if (istype(usr, /mob/living/carbon/alien/larva))//Safety check for larva. /N
|
||||
if (islarva(usr))//Safety check for larva. /N
|
||||
return
|
||||
usr << text("\green You claw at the resin wall.")
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
O << text("\red [] claws at the resin wall!", usr)
|
||||
playsound(src.loc, 'attackblob.ogg', 100, 1)
|
||||
src.health -= rand(10, 20)
|
||||
if(src.health <= 0)
|
||||
for(var/mob/O in oviewers(src))
|
||||
O.show_message(text("\red [] claws at the resin!", usr), 1)
|
||||
playsound(loc, 'attackblob.ogg', 100, 1)
|
||||
health -= rand(10, 20)
|
||||
if(health <= 0)
|
||||
usr << text("\green You slice the resin wall to pieces.")
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
O << text("\red [] slices the resin wall apart!", usr)
|
||||
for(var/mob/O in oviewers(src))
|
||||
O.show_message(text("\red [] slices the resin wall apart!", usr), 1)
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
@@ -138,7 +106,7 @@
|
||||
if(G.state<2)
|
||||
user << "\red You need a better grip to do that!"
|
||||
return
|
||||
G.affecting.loc = src.loc
|
||||
G.affecting.loc = src
|
||||
G.affecting.paralysis = 10
|
||||
for(var/mob/O in viewers(world.view, src))
|
||||
if (O.client)
|
||||
@@ -152,12 +120,9 @@
|
||||
return
|
||||
|
||||
var/aforce = W.force
|
||||
src.health = max(0, src.health - aforce)
|
||||
health = max(0, health - aforce)
|
||||
playsound(src.loc, 'attackblob.ogg', 100, 1)
|
||||
if (src.health <= 0)
|
||||
src.density = 0
|
||||
del(src)
|
||||
return
|
||||
healthcheck()
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -174,6 +139,9 @@
|
||||
contents.Add(affecting)
|
||||
|
||||
while(!isnull(M)&&!isnull(src))//While M and wall exist
|
||||
if(prob(90)&& M.mutations & HULK)//If they're the Hulk, they're getting out.
|
||||
M << "You smash your way to freedom!"
|
||||
break
|
||||
if(prob(30))//Let's people know that someone is trapped in the resin wall.
|
||||
M << "\green You feel a strange sense of calm as a flesh-like substance seems to completely envelop you."
|
||||
for(var/mob/O in viewers(src, 3))
|
||||
|
||||
@@ -10,85 +10,34 @@
|
||||
|
||||
|
||||
attack(mob/living/silicon/ai/M as mob, mob/user as mob)
|
||||
if (src.flush)
|
||||
if(!istype(M, /mob/living/silicon/ai))//If target is not an AI.
|
||||
return ..()
|
||||
|
||||
if (flush)//Here to prevent being unable to attack with card when wiping an AI.
|
||||
user << "<b>Transfer failed</b>: Cannot transfer while wipe in progress."
|
||||
return
|
||||
|
||||
if(!istype(M, /mob/living/silicon/ai))
|
||||
return ..()
|
||||
|
||||
if(src.contents.len > 0)
|
||||
for(var/mob/living/silicon/ai/A in src)
|
||||
|
||||
// Already have an AI
|
||||
if(M.real_name != "Inactive AI")
|
||||
user << "<b>Transfer failed</b>: Existing AI found on this terminal. Remove existing AI to install a new one."
|
||||
return
|
||||
|
||||
else
|
||||
M.name = A.name
|
||||
M.real_name = A.real_name
|
||||
if(A.mind)
|
||||
A.mind.transfer_to(M)
|
||||
A.mind.original = M
|
||||
M.control_disabled = 0
|
||||
M.laws_object = A.laws_object
|
||||
M.oxyloss = A.oxyloss
|
||||
M.fireloss = A.fireloss
|
||||
M.bruteloss = A.bruteloss
|
||||
M.toxloss = A.toxloss
|
||||
if (!A.stat)
|
||||
M.stat = A.stat
|
||||
M.updatehealth()
|
||||
M << "You have been uploaded to a stationary terminal. Remote device connection restored."
|
||||
user << "<b>Transfer succesful</b>: [M.name] ([rand(1000,9999)].exe) installed and executed succesfully. Local copy has been removed."
|
||||
del(A)
|
||||
if (!M.stat)
|
||||
M.icon_state = "ai"
|
||||
else
|
||||
M.icon_state = "ai-crash"
|
||||
src.icon_state = "aicard"
|
||||
src.name = "inteliCard"
|
||||
src.overlays = null
|
||||
return
|
||||
if(contents.len > 0)//If there is an AI on card.
|
||||
user << "<b>Transfer failed</b>: Existing AI found on this terminal. Remove existing AI to install a new one."
|
||||
else
|
||||
if (M.real_name != "Inactive AI")
|
||||
if (ticker.mode.name == "AI malfunction")
|
||||
var/datum/game_mode/malfunction/malf = ticker.mode
|
||||
for (var/datum/mind/malfai in malf.malf_ai)
|
||||
if (M.mind == malfai)
|
||||
user << "This AI's download interface has been disabled."
|
||||
return
|
||||
var/mob/living/silicon/ai/O = new /mob/living/silicon/ai( src )
|
||||
O.invisibility = 0
|
||||
O.canmove = 0
|
||||
O.name = M.name
|
||||
O.real_name = M.real_name
|
||||
O.anchored = 1
|
||||
O.aiRestorePowerRoutine = 0
|
||||
O.control_disabled = 1 // Can't control things remotely if you're stuck in a card!
|
||||
O.laws_object = M.laws_object
|
||||
O.stat = M.stat
|
||||
O.oxyloss = M.oxyloss
|
||||
O.fireloss = M.fireloss
|
||||
O.bruteloss = M.bruteloss
|
||||
O.toxloss = M.toxloss
|
||||
O.updatehealth()
|
||||
if(M.mind)
|
||||
M.mind.transfer_to(O)
|
||||
M.mind.original = O
|
||||
src.name = "inteliCard - [M.name]"
|
||||
M.name = "Inactive AI"
|
||||
M.real_name = "Inactive AI"
|
||||
M.icon_state = "ai-empty"
|
||||
if (O.stat == 2)
|
||||
src.icon_state = "aicard-404"
|
||||
else
|
||||
src.icon_state = "aicard-full"
|
||||
O << "You have been downloaded to a mobile storage device. Remote device connection severed."
|
||||
user << "<b>Transfer succeeded</b>: [O.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory."
|
||||
if (ticker.mode.name == "AI malfunction")
|
||||
var/datum/game_mode/malfunction/malf = ticker.mode
|
||||
for (var/datum/mind/malfai in malf.malf_ai)
|
||||
if (M.mind == malfai)
|
||||
user << "This AI's download interface has been disabled."//Do ho ho ho~
|
||||
return
|
||||
new /obj/AIcore/deactivated(M.loc)//Spawns a deactivated terminal at AI location.
|
||||
M.aiRestorePowerRoutine = 0//So the AI initially has power.
|
||||
M.control_disabled = 1//Can't control things remotely if you're stuck in a card!
|
||||
M.loc = src//Throw AI into the card.
|
||||
name = "inteliCard - [M.name]"
|
||||
if (M.stat == 2)
|
||||
src.icon_state = "aicard-404"
|
||||
else
|
||||
user << "There isn't an AI on this terminal."
|
||||
src.icon_state = "aicard-full"
|
||||
M << "You have been downloaded to a mobile storage device. Remote device connection severed."
|
||||
user << "<b>Transfer succeeded</b>: [M.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory."
|
||||
return
|
||||
|
||||
attack(mob/living/silicon/decoy/M as mob, mob/user as mob)
|
||||
if (!istype (M, /mob/living/silicon/decoy))
|
||||
@@ -97,37 +46,6 @@
|
||||
M.death()
|
||||
user << "<b>ERROR ERROR ERROR</b>"
|
||||
|
||||
Topic(href, href_list)
|
||||
|
||||
if (href_list["close"])
|
||||
usr << browse(null, "window=aicard")
|
||||
usr.machine = null
|
||||
|
||||
if (href_list["wipe"])
|
||||
var/confirm = alert("Are you sure you want to wipe this card's memory? This cannot be undone once started.", "Confirm Wipe", "Yes", "No")
|
||||
if(confirm == "Yes")
|
||||
src.flush = 1
|
||||
for(var/mob/living/silicon/ai/A in src)
|
||||
A.suiciding = 1
|
||||
A << "Your core files are being wiped!"
|
||||
while (A.stat != 2)
|
||||
A.oxyloss += 2
|
||||
A.updatehealth()
|
||||
src.attack_self(usr)
|
||||
sleep(10)
|
||||
src.flush = 0
|
||||
|
||||
if (href_list["wireless"])
|
||||
for(var/mob/living/silicon/ai/A in src)
|
||||
A.control_disabled = !A.control_disabled
|
||||
A << "The intelicard's wireless port has been [A.control_disabled ? "disabled" : "enabled"]!"
|
||||
if (A.control_disabled)
|
||||
src.overlays -= image('pda.dmi', "aicard-on")
|
||||
else
|
||||
src.overlays += image('pda.dmi', "aicard-on")
|
||||
src.attack_self(usr)
|
||||
|
||||
|
||||
attack_self(mob/user)
|
||||
if (!in_range(src, user))
|
||||
return
|
||||
@@ -165,15 +83,45 @@
|
||||
dat += "<b>AI nonfunctional</b>"
|
||||
else
|
||||
if (!src.flush)
|
||||
dat += {"<A href='byond://?src=\ref[src];wipe=1'>Wipe AI</A>"}
|
||||
dat += {"<A href='byond://?src=\ref[src];choice=Wipe'>Wipe AI</A>"}
|
||||
else
|
||||
dat += "<b>Wipe in progress</b>"
|
||||
dat += {" <A href='byond://?src=\ref[src];wireless=1'>[A.control_disabled ? "Enable" : "Disable"] Wireless Activity</A>"}
|
||||
dat += {"<a href='byond://?src=\ref[src];close=1'> Close</a>"}
|
||||
dat += {"<a href='byond://?src=\ref[src];choice=Wireless'>[A.control_disabled ? "Enable" : "Disable"] Wireless Activity</a>"}
|
||||
dat += "<br>"
|
||||
dat += {"<a href='byond://?src=\ref[src];choice=Close'> Close</a>"}
|
||||
user << browse(dat, "window=aicard")
|
||||
onclose(user, "aicard")
|
||||
return
|
||||
|
||||
Topic(href, href_list)
|
||||
switch(href_list["choice"])
|
||||
if ("Close")
|
||||
usr << browse(null, "window=aicard")
|
||||
usr.machine = null
|
||||
return
|
||||
|
||||
if ("Wipe")
|
||||
var/confirm = alert("Are you sure you want to wipe this card's memory? This cannot be undone once started.", "Confirm Wipe", "Yes", "No")
|
||||
if(confirm == "Yes")
|
||||
flush = 1
|
||||
for(var/mob/living/silicon/ai/A in src)
|
||||
A.suiciding = 1
|
||||
A << "Your core files are being wiped!"
|
||||
while (A.stat != 2)
|
||||
A.oxyloss += 2
|
||||
A.updatehealth()
|
||||
sleep(10)
|
||||
flush = 0
|
||||
|
||||
if ("Wireless")
|
||||
for(var/mob/living/silicon/ai/A in src)
|
||||
A.control_disabled = !A.control_disabled
|
||||
A << "The intelicard's wireless port has been [A.control_disabled ? "disabled" : "enabled"]!"
|
||||
if (A.control_disabled)
|
||||
overlays -= image('pda.dmi', "aicard-on")
|
||||
else
|
||||
overlays += image('pda.dmi', "aicard-on")
|
||||
attack_self(usr)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -21,11 +21,11 @@
|
||||
/obj/portal/proc/teleport(atom/movable/M as mob|obj)
|
||||
if(istype(M, /obj/effects)) //sparks don't teleport
|
||||
return
|
||||
if (M.anchored)
|
||||
if (M.anchored&&istype(M, /obj/mecha))
|
||||
return
|
||||
if (src.icon_state == "portal1")
|
||||
if (icon_state == "portal1")
|
||||
return
|
||||
if (!( src.target ))
|
||||
if (!( target ))
|
||||
del(src)
|
||||
return
|
||||
if (istype(M, /atom/movable))
|
||||
@@ -33,5 +33,5 @@
|
||||
src.icon_state = "portal1"
|
||||
do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0)
|
||||
else
|
||||
do_teleport(M, src.target, 1) ///You will appear adjacent to the beacon
|
||||
do_teleport(M, target, 1) ///You will appear adjacent to the beacon
|
||||
|
||||
|
||||
@@ -37,6 +37,72 @@ var/specops_shuttle_timeleft = 0
|
||||
usr << "\red The Special Operations shuttle is unable to leave."
|
||||
return
|
||||
|
||||
//Begin Marauder launchpad.
|
||||
spawn(0)//So it parallel processes it.
|
||||
for(var/obj/machinery/door/poddoor/M in machines)
|
||||
switch(M.id)
|
||||
if("ASSAULT0")
|
||||
spawn(10)//1 second delay between each.
|
||||
M.open()
|
||||
if("ASSAULT1")
|
||||
spawn(20)
|
||||
M.open()
|
||||
if("ASSAULT2")
|
||||
spawn(30)
|
||||
M.open()
|
||||
if("ASSAULT3")
|
||||
spawn(40)
|
||||
M.open()
|
||||
|
||||
sleep(10)
|
||||
|
||||
var/spawn_marauder[] = new()
|
||||
for(var/obj/landmark/L in world)
|
||||
if(L.name == "Marauder Entry")
|
||||
spawn_marauder.Add(L)
|
||||
for(var/obj/landmark/L in world)
|
||||
if(L.name == "Marauder Exit")
|
||||
var/obj/portal/P = new(L.loc)
|
||||
P.invisibility = 101
|
||||
P.failchance = 0
|
||||
P.target = pick(spawn_marauder)
|
||||
spawn_marauder.Remove(P.target)
|
||||
|
||||
sleep(10)
|
||||
|
||||
for(var/obj/machinery/mass_driver/M in machines)
|
||||
switch(M.id)
|
||||
if("ASSAULT0")
|
||||
spawn(10)
|
||||
M.drive()
|
||||
if("ASSAULT1")
|
||||
spawn(20)
|
||||
M.drive()
|
||||
if("ASSAULT2")
|
||||
spawn(30)
|
||||
M.drive()
|
||||
if("ASSAULT3")
|
||||
spawn(40)
|
||||
M.drive()
|
||||
|
||||
sleep(50)//Doors remain open for 5 seconds.
|
||||
|
||||
for(var/obj/machinery/door/poddoor/M in machines)
|
||||
switch(M.id)//Doors close at the same time.
|
||||
if("ASSAULT0")
|
||||
spawn(0)
|
||||
M.close()
|
||||
if("ASSAULT1")
|
||||
spawn(0)
|
||||
M.close()
|
||||
if("ASSAULT2")
|
||||
spawn(0)
|
||||
M.close()
|
||||
if("ASSAULT3")
|
||||
spawn(0)
|
||||
M.close()
|
||||
//End Marauder launchpad.
|
||||
|
||||
var/area/start_location = locate(/area/shuttle/specops/centcom)
|
||||
var/area/end_location = locate(/area/shuttle/specops/station)
|
||||
|
||||
|
||||
@@ -11,33 +11,33 @@
|
||||
emote("deathgasp") //let the world KNOW WE ARE DEAD
|
||||
|
||||
//For ninjas exploding when they die./N
|
||||
if (istype(src.wear_suit, /obj/item/clothing/suit/space/space_ninja)&&src.wear_suit:initialize)
|
||||
var/location = src.loc
|
||||
if (istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)&&wear_suit:initialize)
|
||||
var/location = loc
|
||||
explosion(location, 1, 2, 3, 4)
|
||||
//src.flags = 0
|
||||
//reagents.handle_reactions() //No magic stomach for corpses.
|
||||
src.canmove = 0
|
||||
canmove = 0
|
||||
if(src.client)
|
||||
src.blind.layer = 0
|
||||
src.lying = 1
|
||||
lying = 1
|
||||
var/h = src.hand
|
||||
src.hand = 0
|
||||
hand = 0
|
||||
drop_item()
|
||||
src.hand = 1
|
||||
hand = 1
|
||||
drop_item()
|
||||
src.hand = h
|
||||
if (istype(src.wear_suit, /obj/item/clothing/suit/armor/a_i_a_ptank))
|
||||
var/obj/item/clothing/suit/armor/a_i_a_ptank/A = src.wear_suit
|
||||
bombers += "[src.key] has detonated a suicide bomb. Temp = [A.part4.air_contents.temperature-T0C]."
|
||||
hand = h
|
||||
if (istype(wear_suit, /obj/item/clothing/suit/armor/a_i_a_ptank))
|
||||
var/obj/item/clothing/suit/armor/a_i_a_ptank/A = wear_suit
|
||||
bombers += "[key] has detonated a suicide bomb. Temp = [A.part4.air_contents.temperature-T0C]."
|
||||
// world << "Detected that [src.key] is wearing a bomb" debug stuff
|
||||
if(A.status && prob(90))
|
||||
// world << "Bomb has ignited?"
|
||||
A.part4.ignite()
|
||||
|
||||
if (src.client)
|
||||
if (client)
|
||||
spawn(10)
|
||||
if(src.client && src.stat == 2)
|
||||
src.verbs += /mob/proc/ghostize
|
||||
if(client && src.stat == 2)
|
||||
verbs += /mob/proc/ghostize
|
||||
|
||||
var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch
|
||||
if(mind)
|
||||
|
||||
@@ -1,47 +1,52 @@
|
||||
/mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B)
|
||||
src.anchored = 1
|
||||
src.canmove = 0
|
||||
/mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0)
|
||||
PickName
|
||||
name = pick(ai_names)
|
||||
for (var/mob/living/silicon/ai/A in world)
|
||||
if (A.real_name == name)
|
||||
goto PickName//It'll get stuck in an infinite loop if all default names are chosen but that's... a remote possibility.
|
||||
real_name = name
|
||||
anchored = 1
|
||||
canmove = 0
|
||||
src.loc = loc
|
||||
if(L)
|
||||
if (istype(L, /datum/ai_laws))
|
||||
src.laws_object = L
|
||||
laws_object = L
|
||||
else
|
||||
src.laws_object = new /datum/ai_laws/asimov
|
||||
laws_object = new /datum/ai_laws/asimov
|
||||
|
||||
src.verbs += /mob/living/silicon/ai/proc/show_laws_verb
|
||||
verbs += /mob/living/silicon/ai/proc/show_laws_verb
|
||||
|
||||
if (istype(loc, /turf))
|
||||
src.verbs += /mob/living/silicon/ai/proc/ai_call_shuttle
|
||||
src.verbs += /mob/living/silicon/ai/proc/ai_camera_track
|
||||
src.verbs += /mob/living/silicon/ai/proc/ai_camera_list
|
||||
verbs += /mob/living/silicon/ai/proc/ai_call_shuttle
|
||||
verbs += /mob/living/silicon/ai/proc/ai_camera_track
|
||||
verbs += /mob/living/silicon/ai/proc/ai_camera_list
|
||||
//Added ai_network_change by Mord_Sith
|
||||
src.verbs += /mob/living/silicon/ai/proc/ai_network_change
|
||||
src.verbs += /mob/living/silicon/ai/proc/lockdown
|
||||
src.verbs += /mob/living/silicon/ai/proc/disablelockdown
|
||||
src.verbs += /mob/living/silicon/ai/proc/ai_statuschange
|
||||
if (!B)
|
||||
src.name = "Inactive AI"
|
||||
src.real_name = "Inactive AI"
|
||||
src.icon_state = "ai-empty"
|
||||
else
|
||||
if (B.brain.brainmob.mind)
|
||||
B.brain.brainmob.mind.transfer_to(src)
|
||||
verbs += /mob/living/silicon/ai/proc/ai_network_change
|
||||
verbs += /mob/living/silicon/ai/proc/lockdown
|
||||
verbs += /mob/living/silicon/ai/proc/disablelockdown
|
||||
verbs += /mob/living/silicon/ai/proc/ai_statuschange
|
||||
if(!safety)//Only used by AIize() to successfully spawn an AI.
|
||||
if (!B)//If there is no player/brain inside.
|
||||
new/obj/AIcore/deactivated(loc)//New empty terminal.
|
||||
del(src)//Delete AI.
|
||||
return
|
||||
else
|
||||
if (B.brain.brainmob.mind)
|
||||
B.brain.brainmob.mind.transfer_to(src)
|
||||
|
||||
src << "<B>You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras).</B>"
|
||||
src << "<B>To look at other parts of the station, double-click yourself to get a camera menu.</B>"
|
||||
src << "<B>While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc.</B>"
|
||||
src << "To use something, simply double-click it."
|
||||
src << "Currently right-click functions will not work for the AI (except examine), and will either be replaced with dialogs or won't be usable by the AI."
|
||||
src << "<B>You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras).</B>"
|
||||
src << "<B>To look at other parts of the station, double-click yourself to get a camera menu.</B>"
|
||||
src << "<B>While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc.</B>"
|
||||
src << "To use something, simply double-click it."
|
||||
src << "Currently right-click functions will not work for the AI (except examine), and will either be replaced with dialogs or won't be usable by the AI."
|
||||
|
||||
src.show_laws()
|
||||
src << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
|
||||
|
||||
src.job = "AI"
|
||||
|
||||
spawn(0)
|
||||
ainame(src)
|
||||
src.show_laws()
|
||||
src << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
|
||||
|
||||
src.job = "AI"
|
||||
|
||||
spawn(0)
|
||||
ainame(src)
|
||||
|
||||
/mob/living/silicon/ai/Stat()
|
||||
..()
|
||||
@@ -278,6 +283,14 @@
|
||||
O.show_message(text("\red <B>[] took a swipe at []!</B>", M, src), 1)
|
||||
return
|
||||
|
||||
/mob/living/silicon/ai/attack_hand(mob/living/carbon/M as mob)
|
||||
if(ishuman(M))//Checks to see if they are ninja
|
||||
if(istype(M:gloves, /obj/item/clothing/gloves/space_ninja)&&M:gloves:candrain&&!M:gloves:draining)
|
||||
if(M:wear_suit:control)
|
||||
M:wear_suit:aicard.attack(src,M)
|
||||
else
|
||||
M << "\red <b>ERROR</b>: \black Remote access channel disabled."
|
||||
return
|
||||
|
||||
/mob/living/silicon/ai/proc/switchCamera(var/obj/machinery/camera/C)
|
||||
usr:cameraFollow = null
|
||||
|
||||
@@ -28,6 +28,11 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/islarva(A)
|
||||
if(istype(A, /mob/living/carbon/alien/larva))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/ismonkey(A)
|
||||
if(A && istype(A, /mob/living/carbon/monkey))
|
||||
return 1
|
||||
@@ -43,6 +48,11 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/ishivemainframe(A)
|
||||
if(A && istype(A, /mob/living/silicon/hive_mainframe))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isAI(A)
|
||||
if(istype(A, /mob/living/silicon/ai))
|
||||
return 1
|
||||
@@ -58,6 +68,16 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isliving(A)
|
||||
if(istype(A, /mob/living))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
proc/isobserver(A)
|
||||
if(istype(A, /mob/dead/observer))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/hsl2rgb(h, s, l)
|
||||
return
|
||||
|
||||
@@ -306,6 +326,8 @@
|
||||
return null
|
||||
|
||||
/obj/item/weapon/grab/proc/synch()
|
||||
if(affecting.anchored)//This will prevent from grabbing people that are anchored.
|
||||
del(src)
|
||||
if (src.assailant.r_hand == src)
|
||||
src.hud1.screen_loc = ui_rhand
|
||||
else
|
||||
@@ -1655,72 +1677,87 @@
|
||||
return
|
||||
|
||||
/client/Move(n, direct)
|
||||
if(src.mob.control_object) // Hacking in something to control objects -- TLE
|
||||
if(src.mob.control_object.density)
|
||||
step(src.mob.control_object,direct)
|
||||
src.mob.control_object.dir = direct
|
||||
if(mob.control_object) // Hacking in something to control objects -- TLE
|
||||
if(mob.control_object.density)
|
||||
step(mob.control_object,direct)
|
||||
mob.control_object.dir = direct
|
||||
else
|
||||
src.mob.control_object.loc = get_step(src.mob.control_object,direct)
|
||||
if(istype(src.mob, /mob/dead/observer))
|
||||
return src.mob.Move(n,direct)
|
||||
if (src.moving)
|
||||
mob.control_object.loc = get_step(mob.control_object,direct)
|
||||
if(isobserver(mob))
|
||||
return mob.Move(n,direct)
|
||||
if (moving)
|
||||
return 0
|
||||
if (world.time < src.move_delay)
|
||||
if (world.time < move_delay)
|
||||
return
|
||||
if (!( src.mob ))
|
||||
if (!( mob ))
|
||||
return
|
||||
if (src.mob.stat==2)
|
||||
if (mob.stat==2)
|
||||
return
|
||||
if (mob.incorporeal_move)//For Ninja crazy porting powers. Moves either 1 or 2 tiles.
|
||||
var/turf/mobloc = get_turf(mob.loc)
|
||||
if(prob(50))
|
||||
var/locx
|
||||
var/locy
|
||||
switch(direct)
|
||||
if(NORTH)
|
||||
locx = mobloc.x
|
||||
locy = (mobloc.y+2)
|
||||
if(locy>world.maxy)
|
||||
return
|
||||
if(SOUTH)
|
||||
locx = mobloc.x
|
||||
locy = (mobloc.y-2)
|
||||
if(locy<1)
|
||||
return
|
||||
if(EAST)
|
||||
locy = mobloc.y
|
||||
locx = (mobloc.x+2)
|
||||
if(locx>world.maxx)
|
||||
return
|
||||
if(WEST)
|
||||
locy = mobloc.y
|
||||
locx = (mobloc.x-2)
|
||||
if(locx<1)
|
||||
return
|
||||
else
|
||||
return
|
||||
mob.loc = locate(locx,locy,mobloc.z)
|
||||
spawn(0)
|
||||
var/limit = 2//For only two trailing shadows.
|
||||
for(var/turf/T in getline(mobloc, mob.loc))
|
||||
spawn(0)
|
||||
anim(T,'mob.dmi',mob,"shadow")
|
||||
limit--
|
||||
if(limit<=0) break
|
||||
else
|
||||
spawn(0)
|
||||
anim(mobloc,'mob.dmi',mob,"shadow")
|
||||
mob.loc = get_step(mob, direct)
|
||||
mob.dir = direct
|
||||
return
|
||||
if(istype(src.mob, /mob/living/silicon/ai))
|
||||
//This breaks AI hologram movement but that was never finished anyway.
|
||||
if(isAI(mob))
|
||||
return AIMove(n,direct,src.mob)
|
||||
if(istype(src.mob, /mob/living/silicon/hive_mainframe))
|
||||
return MainframeMove(n,direct,src.mob)
|
||||
if (src.mob.monkeyizing)
|
||||
if(ishivemainframe(mob))
|
||||
return MainframeMove(n,direct,mob)
|
||||
|
||||
if(mob.anchored)/*If mob is not AI and is anchored. This means most anchored mobs will not be able to move.
|
||||
This is a fix for ninja energy_net to where mobs can not move but can still act to destroy it.
|
||||
If needed, this should be changed in the appropriate manner. I think the only time you would need to anchor a mob
|
||||
is when they are not meant to move.*/
|
||||
return
|
||||
|
||||
var/is_monkey = istype(src.mob, /mob/living/carbon/monkey)
|
||||
if (mob.incorporeal_move)
|
||||
var/turf/mobloc = get_turf(mob.loc)
|
||||
switch(mob.incorporeal_move)//1 is for all mobs. 2 is for ninjas only.
|
||||
if(1)
|
||||
mob.loc = get_step(mob, direct)
|
||||
mob.dir = direct
|
||||
if(2)
|
||||
//For Ninja crazy porting powers. Moves either 1 or 2 tiles.
|
||||
if(prob(50))
|
||||
var/locx
|
||||
var/locy
|
||||
switch(direct)
|
||||
if(NORTH)
|
||||
locx = mobloc.x
|
||||
locy = (mobloc.y+2)
|
||||
if(locy>world.maxy)
|
||||
return
|
||||
if(SOUTH)
|
||||
locx = mobloc.x
|
||||
locy = (mobloc.y-2)
|
||||
if(locy<1)
|
||||
return
|
||||
if(EAST)
|
||||
locy = mobloc.y
|
||||
locx = (mobloc.x+2)
|
||||
if(locx>world.maxx)
|
||||
return
|
||||
if(WEST)
|
||||
locy = mobloc.y
|
||||
locx = (mobloc.x-2)
|
||||
if(locx<1)
|
||||
return
|
||||
else
|
||||
return
|
||||
mob.loc = locate(locx,locy,mobloc.z)
|
||||
spawn(0)
|
||||
var/limit = 2//For only two trailing shadows.
|
||||
for(var/turf/T in getline(mobloc, mob.loc))
|
||||
spawn(0)
|
||||
anim(T,'mob.dmi',mob,"shadow")
|
||||
limit--
|
||||
if(limit<=0) break
|
||||
else
|
||||
spawn(0)
|
||||
anim(mobloc,'mob.dmi',mob,"shadow")
|
||||
mob.loc = get_step(mob, direct)
|
||||
mob.dir = direct
|
||||
return
|
||||
|
||||
if (mob.monkeyizing)
|
||||
return
|
||||
|
||||
var/is_monkey = ismonkey(mob)
|
||||
if (locate(/obj/item/weapon/grab, locate(/obj/item/weapon/grab, src.mob.grabbed_by.len)))
|
||||
var/list/grabbing = list( )
|
||||
if (istype(src.mob.l_hand, /obj/item/weapon/grab))
|
||||
@@ -1749,20 +1786,20 @@
|
||||
del(G)
|
||||
else
|
||||
return
|
||||
if (src.mob.canmove)
|
||||
if (mob.canmove)
|
||||
|
||||
if(src.mob.m_intent == "face")
|
||||
src.mob.dir = direct
|
||||
if(mob.m_intent == "face")
|
||||
mob.dir = direct
|
||||
|
||||
var/j_pack = 0
|
||||
if ((istype(src.mob.loc, /turf/space)))
|
||||
if (!( src.mob.restrained() ))
|
||||
if ((istype(mob.loc, /turf/space)))
|
||||
if (!( mob.restrained() ))
|
||||
if (!( (locate(/obj/grille) in oview(1, src.mob)) || (locate(/turf/simulated) in oview(1, src.mob)) || (locate(/obj/lattice) in oview(1, src.mob)) ))
|
||||
if (istype(src.mob.back, /obj/item/weapon/tank/jetpack))
|
||||
var/obj/item/weapon/tank/jetpack/J = src.mob.back
|
||||
j_pack = J.allow_thrust(0.01, src.mob)
|
||||
if(j_pack)
|
||||
src.mob.inertia_dir = 0
|
||||
mob.inertia_dir = 0
|
||||
if (!( j_pack ))
|
||||
return 0
|
||||
else
|
||||
@@ -1771,51 +1808,51 @@
|
||||
return 0
|
||||
|
||||
|
||||
if (isturf(src.mob.loc))
|
||||
src.move_delay = world.time
|
||||
if (isturf(mob.loc))
|
||||
move_delay = world.time
|
||||
if ((j_pack && j_pack < 1))
|
||||
src.move_delay += 5
|
||||
switch(src.mob.m_intent)
|
||||
move_delay += 5
|
||||
switch(mob.m_intent)
|
||||
if("run")
|
||||
if (src.mob.drowsyness > 0)
|
||||
src.move_delay += 6
|
||||
src.move_delay += 1
|
||||
if (mob.drowsyness > 0)
|
||||
move_delay += 6
|
||||
move_delay += 1
|
||||
if("face")
|
||||
src.mob.dir = direct
|
||||
mob.dir = direct
|
||||
return
|
||||
if("walk")
|
||||
src.move_delay += 7
|
||||
move_delay += 7
|
||||
|
||||
|
||||
src.move_delay += src.mob.movement_delay()
|
||||
move_delay += mob.movement_delay()
|
||||
|
||||
if (src.mob.restrained())
|
||||
if (mob.restrained())
|
||||
for(var/mob/M in range(src.mob, 1))
|
||||
if (((M.pulling == src.mob && (!( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, src.mob.grabbed_by.len)))
|
||||
if (((M.pulling == mob && (!( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, src.mob.grabbed_by.len)))
|
||||
src << "\blue You're restrained! You can't move!"
|
||||
return 0
|
||||
src.moving = 1
|
||||
moving = 1
|
||||
if (locate(/obj/item/weapon/grab, src.mob))
|
||||
src.move_delay = max(src.move_delay, world.time + 7)
|
||||
var/list/L = src.mob.ret_grab()
|
||||
move_delay = max(move_delay, world.time + 7)
|
||||
var/list/L = mob.ret_grab()
|
||||
if (istype(L, /list))
|
||||
if (L.len == 2)
|
||||
L -= src.mob
|
||||
L -= mob
|
||||
var/mob/M = L[1]
|
||||
if ((get_dist(src.mob, M) <= 1 || M.loc == src.mob.loc))
|
||||
var/turf/T = src.mob.loc
|
||||
if ((get_dist(mob, M) <= 1 || M.loc == mob.loc))
|
||||
var/turf/T = mob.loc
|
||||
. = ..()
|
||||
if (isturf(M.loc))
|
||||
var/diag = get_dir(src.mob, M)
|
||||
var/diag = get_dir(mob, M)
|
||||
if ((diag - 1) & diag)
|
||||
else
|
||||
diag = null
|
||||
if ((get_dist(src.mob, M) > 1 || diag))
|
||||
if ((get_dist(mob, M) > 1 || diag))
|
||||
step(M, get_dir(M.loc, T))
|
||||
else
|
||||
for(var/mob/M in L)
|
||||
M.other_mobs = 1
|
||||
if (src.mob != M)
|
||||
if (mob != M)
|
||||
M.animate_movement = 3
|
||||
for(var/mob/M in L)
|
||||
spawn( 0 )
|
||||
@@ -1826,17 +1863,17 @@
|
||||
M.animate_movement = 2
|
||||
return
|
||||
else
|
||||
if(src.mob.confused)
|
||||
step(src.mob, pick(cardinal))
|
||||
if(mob.confused)
|
||||
step(mob, pick(cardinal))
|
||||
else
|
||||
. = ..()
|
||||
src.moving = null
|
||||
moving = null
|
||||
return .
|
||||
else
|
||||
if (isobj(src.mob.loc) || ismob(src.mob.loc))
|
||||
var/atom/O = src.mob.loc
|
||||
if (src.mob.canmove)
|
||||
return O.relaymove(src.mob, direct)
|
||||
if (isobj(mob.loc) || ismob(mob.loc))
|
||||
var/atom/O = mob.loc
|
||||
if (mob.canmove)
|
||||
return O.relaymove(mob, direct)
|
||||
else
|
||||
return
|
||||
return
|
||||
|
||||
@@ -86,6 +86,7 @@ mob/new_player
|
||||
src << browse_rsc('sos_10.png')
|
||||
src << browse_rsc('sos_11.png')
|
||||
src << browse_rsc('sos_12.png')
|
||||
src << browse_rsc('sos_13.png')
|
||||
|
||||
//End PDA Resource Initialisation =====================================================>
|
||||
|
||||
@@ -281,7 +282,7 @@ mob/new_player
|
||||
if (ticker.current_state == GAME_STATE_PLAYING)
|
||||
var/list/mob/living/silicon/ai/ailist = list()
|
||||
for (var/mob/living/silicon/ai/A in world)
|
||||
if (!A.stat && A.name != "Inactive AI")
|
||||
if (!A.stat)
|
||||
ailist += A
|
||||
if (ailist.len)
|
||||
var/mob/living/silicon/ai/announcer = pick(ailist)
|
||||
|
||||
@@ -70,16 +70,11 @@
|
||||
|
||||
|
||||
/mob/proc/AIize()
|
||||
src.client.screen.len = null
|
||||
var/mob/living/silicon/ai/O = new /mob/living/silicon/ai( src.loc )
|
||||
O.icon_state = "ai"
|
||||
client.screen.len = null
|
||||
var/mob/living/silicon/ai/O = new /mob/living/silicon/ai(loc, /datum/ai_laws/asimov,,1)//No MMI but safety is in effect.
|
||||
O.invisibility = 0
|
||||
O.canmove = 0
|
||||
O.name = src.name
|
||||
O.real_name = src.real_name
|
||||
O.anchored = 1
|
||||
O.aiRestorePowerRoutine = 0
|
||||
O.lastKnownIP = src.client.address
|
||||
O.lastKnownIP = client.address
|
||||
|
||||
mind.transfer_to(O)
|
||||
O.mind.original = O
|
||||
@@ -113,8 +108,6 @@
|
||||
O << "To use something, simply double-click it."
|
||||
O << "Currently right-click functions will not work for the AI (except examine), and will either be replaced with dialogs or won't be usable by the AI."
|
||||
|
||||
|
||||
O.laws_object = new /datum/ai_laws/asimov
|
||||
O.show_laws()
|
||||
O << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
|
||||
|
||||
@@ -151,7 +144,6 @@
|
||||
spawn(50)
|
||||
world << sound('newAI.ogg')
|
||||
|
||||
|
||||
del(src)
|
||||
|
||||
return O
|
||||
|
||||
@@ -9,5 +9,8 @@ var/list/first_names_female = dd_file2list("config/names/first_female.txt")
|
||||
var/list/last_names = dd_file2list("config/names/last.txt")
|
||||
var/list/loggedsay = dd_file2list("config/names/loggedsay.txt")
|
||||
var/list/clown_names = dd_file2list("config/names/clown.txt")
|
||||
|
||||
var/list/verbs = dd_file2list("config/names/verbs.txt")
|
||||
var/list/adjectives = dd_file2list("config/names/adjectives.txt")
|
||||
//loaded on startup because of "
|
||||
//would include in rsc if ' was used
|
||||
397
config/names/adjectives.txt
Normal file
@@ -0,0 +1,397 @@
|
||||
adorable
|
||||
adventurous
|
||||
aggressive
|
||||
alert
|
||||
attractive
|
||||
average
|
||||
beautiful
|
||||
blue-eyed
|
||||
bloody
|
||||
blushing
|
||||
bright
|
||||
clean
|
||||
clear
|
||||
cloudy
|
||||
colorful
|
||||
crowded
|
||||
cute
|
||||
dark
|
||||
drab
|
||||
distinct
|
||||
dull
|
||||
elegant
|
||||
excited
|
||||
fancy
|
||||
filthy
|
||||
glamorous
|
||||
gleaming
|
||||
gorgeous
|
||||
graceful
|
||||
grotesque
|
||||
handsome
|
||||
homely
|
||||
light
|
||||
long
|
||||
magnificent
|
||||
misty
|
||||
motionless
|
||||
muddy
|
||||
old-fashioned
|
||||
plain
|
||||
poised
|
||||
precious
|
||||
quaint
|
||||
shiny
|
||||
smoggy
|
||||
sparkling
|
||||
spotless
|
||||
stormy
|
||||
strange
|
||||
ugly
|
||||
ugliest
|
||||
unsightly
|
||||
unusual
|
||||
wide-eyed
|
||||
alive
|
||||
annoying
|
||||
bad
|
||||
better
|
||||
beautiful
|
||||
brainy
|
||||
breakable
|
||||
busy
|
||||
careful
|
||||
cautious
|
||||
clever
|
||||
clumsy
|
||||
concerned
|
||||
crazy
|
||||
curious
|
||||
dead
|
||||
different
|
||||
difficult
|
||||
doubtful
|
||||
easy
|
||||
expensive
|
||||
famous
|
||||
fragile
|
||||
frail
|
||||
gifted
|
||||
helpful
|
||||
helpless
|
||||
horrible
|
||||
important
|
||||
impossible
|
||||
inexpensive
|
||||
innocent
|
||||
inquisitive
|
||||
modern
|
||||
mushy
|
||||
odd
|
||||
open
|
||||
outstanding
|
||||
poor
|
||||
powerful
|
||||
prickly
|
||||
puzzled
|
||||
real
|
||||
rich
|
||||
shy
|
||||
sleepy
|
||||
stupid
|
||||
super
|
||||
talented
|
||||
tame
|
||||
tender
|
||||
tough
|
||||
uninterested
|
||||
vast
|
||||
wandering
|
||||
wild
|
||||
wrong
|
||||
|
||||
angry
|
||||
annoyed
|
||||
anxious
|
||||
arrogant
|
||||
ashamed
|
||||
awful
|
||||
bad
|
||||
bewildered
|
||||
black
|
||||
blue
|
||||
bored
|
||||
clumsy
|
||||
combative
|
||||
condemned
|
||||
confused
|
||||
crazy,flipped-out
|
||||
creepy
|
||||
cruel
|
||||
dangerous
|
||||
defeated
|
||||
defiant
|
||||
depressed
|
||||
disgusted
|
||||
disturbed
|
||||
dizzy
|
||||
dull
|
||||
embarrassed
|
||||
envious
|
||||
evil
|
||||
fierce
|
||||
foolish
|
||||
frantic
|
||||
frightened
|
||||
grieving
|
||||
grumpy
|
||||
helpless
|
||||
homeless
|
||||
hungry
|
||||
hurt
|
||||
ill
|
||||
itchy
|
||||
jealous
|
||||
jittery
|
||||
lazy
|
||||
lonely
|
||||
mysterious
|
||||
nasty
|
||||
naughty
|
||||
nervous
|
||||
nutty
|
||||
obnoxious
|
||||
outrageous
|
||||
panicky
|
||||
repulsive
|
||||
scary
|
||||
selfish
|
||||
sore
|
||||
tense
|
||||
terrible
|
||||
testy
|
||||
thoughtless
|
||||
tired
|
||||
troubled
|
||||
upset
|
||||
uptight
|
||||
weary
|
||||
wicked
|
||||
worried
|
||||
agreeable
|
||||
amused
|
||||
brave
|
||||
calm
|
||||
charming
|
||||
cheerful
|
||||
comfortable
|
||||
cooperative
|
||||
courageous
|
||||
delightful
|
||||
determined
|
||||
eager
|
||||
elated
|
||||
enchanting
|
||||
encouraging
|
||||
energetic
|
||||
enthusiastic
|
||||
excited
|
||||
exuberant
|
||||
fair
|
||||
faithful
|
||||
fantastic
|
||||
fine
|
||||
friendly
|
||||
funny
|
||||
gentle
|
||||
glorious
|
||||
good
|
||||
happy
|
||||
healthy
|
||||
helpful
|
||||
hilarious
|
||||
jolly
|
||||
joyous
|
||||
kind
|
||||
lively
|
||||
lovely
|
||||
lucky
|
||||
nice
|
||||
obedient
|
||||
perfect
|
||||
pleasant
|
||||
proud
|
||||
relieved
|
||||
silly
|
||||
smiling
|
||||
splendid
|
||||
successful
|
||||
thankful
|
||||
thoughtful
|
||||
victorious
|
||||
vivacious
|
||||
witty
|
||||
wonderful
|
||||
zealous
|
||||
zany
|
||||
broad
|
||||
chubby
|
||||
crooked
|
||||
curved
|
||||
deep
|
||||
flat
|
||||
high
|
||||
hollow
|
||||
low
|
||||
narrow
|
||||
round
|
||||
shallow
|
||||
skinny
|
||||
square
|
||||
steep
|
||||
straight
|
||||
wide
|
||||
big
|
||||
colossal
|
||||
fat
|
||||
gigantic
|
||||
great
|
||||
huge
|
||||
immense
|
||||
large
|
||||
little
|
||||
mammoth
|
||||
massive
|
||||
miniature
|
||||
petite
|
||||
puny
|
||||
scrawny
|
||||
short
|
||||
small
|
||||
tall
|
||||
teeny
|
||||
teeny-tiny
|
||||
tiny
|
||||
cooing
|
||||
deafening
|
||||
faint
|
||||
harsh
|
||||
high-pitched
|
||||
hissing
|
||||
hushed
|
||||
husky
|
||||
loud
|
||||
melodic
|
||||
moaning
|
||||
mute
|
||||
noisy
|
||||
purring
|
||||
quiet
|
||||
raspy
|
||||
resonant
|
||||
screeching
|
||||
shrill
|
||||
silent
|
||||
soft
|
||||
squealing
|
||||
thundering
|
||||
voiceless
|
||||
whispering
|
||||
ancient
|
||||
brief
|
||||
early
|
||||
fast
|
||||
late
|
||||
long
|
||||
modern
|
||||
old
|
||||
old-fashioned
|
||||
quick
|
||||
rapid
|
||||
short
|
||||
slow
|
||||
swift
|
||||
young
|
||||
Taste/Touch
|
||||
bitter
|
||||
delicious
|
||||
fresh
|
||||
juicy
|
||||
ripe
|
||||
rotten
|
||||
salty
|
||||
sour
|
||||
spicy
|
||||
stale
|
||||
sticky
|
||||
strong
|
||||
sweet
|
||||
tart
|
||||
tasteless
|
||||
tasty
|
||||
thirsty
|
||||
fluttering
|
||||
fuzzy
|
||||
greasy
|
||||
grubby
|
||||
hard
|
||||
hot
|
||||
icy
|
||||
loose
|
||||
melted
|
||||
nutritious
|
||||
plastic
|
||||
prickly
|
||||
rainy
|
||||
rough
|
||||
scattered
|
||||
shaggy
|
||||
shaky
|
||||
sharp
|
||||
shivering
|
||||
silky
|
||||
slimy
|
||||
slippery
|
||||
smooth
|
||||
soft
|
||||
solid
|
||||
steady
|
||||
sticky
|
||||
tender
|
||||
tight
|
||||
uneven
|
||||
weak
|
||||
wet
|
||||
wooden
|
||||
yummy
|
||||
boiling
|
||||
breezy
|
||||
broken
|
||||
bumpy
|
||||
chilly
|
||||
cold
|
||||
cool
|
||||
creepy
|
||||
crooked
|
||||
cuddly
|
||||
curly
|
||||
damaged
|
||||
damp
|
||||
dirty
|
||||
dry
|
||||
dusty
|
||||
filthy
|
||||
flaky
|
||||
fluffy
|
||||
freezing
|
||||
hot
|
||||
warm
|
||||
wet
|
||||
abundant
|
||||
empty
|
||||
few
|
||||
heavy
|
||||
light
|
||||
many
|
||||
numerous
|
||||
substantial
|
||||
633
config/names/verbs.txt
Normal file
@@ -0,0 +1,633 @@
|
||||
accept
|
||||
add
|
||||
admire
|
||||
admit
|
||||
advise
|
||||
afford
|
||||
agree
|
||||
alert
|
||||
allow
|
||||
amuse
|
||||
analyse
|
||||
announce
|
||||
annoy
|
||||
answer
|
||||
apologise
|
||||
appear
|
||||
applaud
|
||||
appreciate
|
||||
approve
|
||||
argue
|
||||
arrange
|
||||
arrest
|
||||
arrive
|
||||
ask
|
||||
attach
|
||||
attack
|
||||
attempt
|
||||
attend
|
||||
attract
|
||||
avoid
|
||||
back
|
||||
bake
|
||||
balance
|
||||
ban
|
||||
bang
|
||||
bare
|
||||
bat
|
||||
bathe
|
||||
battle
|
||||
beam
|
||||
beg
|
||||
behave
|
||||
belong
|
||||
bleach
|
||||
bless
|
||||
blind
|
||||
blink
|
||||
blot
|
||||
blush
|
||||
boast
|
||||
boil
|
||||
bolt
|
||||
bomb
|
||||
book
|
||||
bore
|
||||
borrow
|
||||
bounce
|
||||
bow
|
||||
box
|
||||
brake
|
||||
brake
|
||||
branch
|
||||
breathe
|
||||
bruise
|
||||
brush
|
||||
bubble
|
||||
bump
|
||||
burn
|
||||
bury
|
||||
buzz
|
||||
calculate
|
||||
call
|
||||
camp
|
||||
care
|
||||
carry
|
||||
carve
|
||||
cause
|
||||
challenge
|
||||
change
|
||||
charge
|
||||
chase
|
||||
cheat
|
||||
check
|
||||
cheer
|
||||
chew
|
||||
choke
|
||||
chop
|
||||
claim
|
||||
clap
|
||||
clean
|
||||
clear
|
||||
clip
|
||||
close
|
||||
coach
|
||||
coil
|
||||
collect
|
||||
colour
|
||||
comb
|
||||
command
|
||||
communicate
|
||||
compare
|
||||
compete
|
||||
complain
|
||||
complete
|
||||
concentrate
|
||||
concern
|
||||
confess
|
||||
confuse
|
||||
connect
|
||||
consider
|
||||
consist
|
||||
contain
|
||||
continue
|
||||
copy
|
||||
correct
|
||||
cough
|
||||
count
|
||||
cover
|
||||
crack
|
||||
crash
|
||||
crawl
|
||||
cross
|
||||
crush
|
||||
cry
|
||||
cure
|
||||
curl
|
||||
curve
|
||||
cycle
|
||||
dam
|
||||
damage
|
||||
dance
|
||||
dare
|
||||
decay
|
||||
deceive
|
||||
decide
|
||||
decorate
|
||||
delay
|
||||
delight
|
||||
deliver
|
||||
depend
|
||||
describe
|
||||
desert
|
||||
deserve
|
||||
destroy
|
||||
detect
|
||||
develop
|
||||
disagree
|
||||
disappear
|
||||
disapprove
|
||||
disarm
|
||||
discover
|
||||
dislike
|
||||
divide
|
||||
double
|
||||
doubt
|
||||
drag
|
||||
drain
|
||||
dream
|
||||
dress
|
||||
drip
|
||||
drop
|
||||
drown
|
||||
drum
|
||||
dry
|
||||
dust
|
||||
earn
|
||||
educate
|
||||
embarrass
|
||||
employ
|
||||
empty
|
||||
encourage
|
||||
end
|
||||
enjoy
|
||||
enter
|
||||
entertain
|
||||
escape
|
||||
examine
|
||||
excite
|
||||
excuse
|
||||
exercise
|
||||
exist
|
||||
expand
|
||||
expect
|
||||
explain
|
||||
explode
|
||||
extend
|
||||
face
|
||||
fade
|
||||
fail
|
||||
fancy
|
||||
fasten
|
||||
fax
|
||||
fear
|
||||
fence
|
||||
fetch
|
||||
file
|
||||
fill
|
||||
film
|
||||
fire
|
||||
fit
|
||||
fix
|
||||
flap
|
||||
flash
|
||||
float
|
||||
flood
|
||||
flow
|
||||
flower
|
||||
fold
|
||||
follow
|
||||
fool
|
||||
force
|
||||
form
|
||||
found
|
||||
frame
|
||||
frighten
|
||||
fry
|
||||
gather
|
||||
gaze
|
||||
glow
|
||||
glue
|
||||
grab
|
||||
grate
|
||||
grease
|
||||
greet
|
||||
grin
|
||||
grip
|
||||
groan
|
||||
guarantee
|
||||
guard
|
||||
guess
|
||||
guide
|
||||
hammer
|
||||
hand
|
||||
handle
|
||||
hang
|
||||
happen
|
||||
harass
|
||||
harm
|
||||
hate
|
||||
haunt
|
||||
head
|
||||
heal
|
||||
heap
|
||||
heat
|
||||
help
|
||||
hook
|
||||
hop
|
||||
hope
|
||||
hover
|
||||
hug
|
||||
hum
|
||||
hunt
|
||||
hurry
|
||||
identify
|
||||
ignore
|
||||
imagine
|
||||
impress
|
||||
improve
|
||||
include
|
||||
increase
|
||||
influence
|
||||
inform
|
||||
inject
|
||||
injure
|
||||
instruct
|
||||
intend
|
||||
interest
|
||||
interfere
|
||||
interrupt
|
||||
introduce
|
||||
invent
|
||||
invite
|
||||
irritate
|
||||
itch
|
||||
jail
|
||||
jam
|
||||
jog
|
||||
join
|
||||
joke
|
||||
judge
|
||||
juggle
|
||||
jump
|
||||
kick
|
||||
kill
|
||||
kiss
|
||||
kneel
|
||||
knit
|
||||
knock
|
||||
knot
|
||||
label
|
||||
land
|
||||
last
|
||||
laugh
|
||||
launch
|
||||
learn
|
||||
level
|
||||
license
|
||||
lick
|
||||
lie
|
||||
lighten
|
||||
like
|
||||
list
|
||||
listen
|
||||
live
|
||||
load
|
||||
lock
|
||||
long
|
||||
look
|
||||
love
|
||||
man
|
||||
manage
|
||||
march
|
||||
mark
|
||||
marry
|
||||
match
|
||||
mate
|
||||
matter
|
||||
measure
|
||||
meddle
|
||||
melt
|
||||
memorise
|
||||
mend
|
||||
messup
|
||||
milk
|
||||
mine
|
||||
miss
|
||||
mix
|
||||
moan
|
||||
moor
|
||||
mourn
|
||||
move
|
||||
muddle
|
||||
mug
|
||||
multiply
|
||||
murder
|
||||
nail
|
||||
name
|
||||
need
|
||||
nest
|
||||
nod
|
||||
note
|
||||
notice
|
||||
number
|
||||
obey
|
||||
object
|
||||
observe
|
||||
obtain
|
||||
occur
|
||||
offend
|
||||
offer
|
||||
open
|
||||
order
|
||||
overflow
|
||||
owe
|
||||
own
|
||||
pack
|
||||
paddle
|
||||
paint
|
||||
park
|
||||
part
|
||||
pass
|
||||
paste
|
||||
pat
|
||||
pause
|
||||
peck
|
||||
pedal
|
||||
peel
|
||||
peep
|
||||
perform
|
||||
permit
|
||||
phone
|
||||
pick
|
||||
pinch
|
||||
pine
|
||||
place
|
||||
plan
|
||||
plant
|
||||
play
|
||||
please
|
||||
plug
|
||||
point
|
||||
poke
|
||||
polish
|
||||
pop
|
||||
possess
|
||||
post
|
||||
pour
|
||||
practise
|
||||
pray
|
||||
preach
|
||||
precede
|
||||
prefer
|
||||
prepare
|
||||
present
|
||||
preserve
|
||||
press
|
||||
pretend
|
||||
prevent
|
||||
prick
|
||||
print
|
||||
produce
|
||||
program
|
||||
promise
|
||||
protect
|
||||
provide
|
||||
pull
|
||||
pump
|
||||
punch
|
||||
puncture
|
||||
punish
|
||||
push
|
||||
question
|
||||
queue
|
||||
race
|
||||
radiate
|
||||
rain
|
||||
raise
|
||||
reach
|
||||
realise
|
||||
receive
|
||||
recognise
|
||||
record
|
||||
reduce
|
||||
reflect
|
||||
refuse
|
||||
regret
|
||||
reign
|
||||
reject
|
||||
rejoice
|
||||
relax
|
||||
release
|
||||
rely
|
||||
remain
|
||||
remember
|
||||
remind
|
||||
remove
|
||||
repair
|
||||
repeat
|
||||
replace
|
||||
reply
|
||||
report
|
||||
reproduce
|
||||
request
|
||||
rescue
|
||||
retire
|
||||
return
|
||||
rhyme
|
||||
rinse
|
||||
risk
|
||||
rob
|
||||
rock
|
||||
roll
|
||||
rot
|
||||
rub
|
||||
ruin
|
||||
rule
|
||||
rush
|
||||
sack
|
||||
sail
|
||||
satisfy
|
||||
save
|
||||
saw
|
||||
scare
|
||||
scatter
|
||||
scold
|
||||
scorch
|
||||
scrape
|
||||
scratch
|
||||
scream
|
||||
screw
|
||||
scribble
|
||||
scrub
|
||||
seal
|
||||
search
|
||||
separate
|
||||
serve
|
||||
settle
|
||||
shade
|
||||
share
|
||||
shave
|
||||
shelter
|
||||
shiver
|
||||
shock
|
||||
shop
|
||||
shrug
|
||||
sigh
|
||||
sign
|
||||
signal
|
||||
sin
|
||||
sip
|
||||
ski
|
||||
skip
|
||||
slap
|
||||
slip
|
||||
slow
|
||||
smash
|
||||
smell
|
||||
smile
|
||||
smoke
|
||||
snatch
|
||||
sneeze
|
||||
sniff
|
||||
snore
|
||||
snow
|
||||
soak
|
||||
soothe
|
||||
sound
|
||||
spare
|
||||
spark
|
||||
sparkle
|
||||
spell
|
||||
spill
|
||||
spoil
|
||||
spot
|
||||
spray
|
||||
sprout
|
||||
squash
|
||||
squeak
|
||||
squeal
|
||||
squeeze
|
||||
stain
|
||||
stamp
|
||||
stare
|
||||
start
|
||||
stay
|
||||
steer
|
||||
step
|
||||
stir
|
||||
stitch
|
||||
stop
|
||||
store
|
||||
strap
|
||||
strengthen
|
||||
stretch
|
||||
strip
|
||||
stroke
|
||||
stuff
|
||||
subtract
|
||||
succeed
|
||||
suck
|
||||
suffer
|
||||
suggest
|
||||
suit
|
||||
supply
|
||||
support
|
||||
suppose
|
||||
surprise
|
||||
surround
|
||||
suspect
|
||||
suspend
|
||||
switch
|
||||
talk
|
||||
tame
|
||||
tap
|
||||
taste
|
||||
tease
|
||||
telephone
|
||||
tempt
|
||||
terrify
|
||||
test
|
||||
thank
|
||||
thaw
|
||||
tick
|
||||
tickle
|
||||
tie
|
||||
time
|
||||
tip
|
||||
tire
|
||||
touch
|
||||
tour
|
||||
tow
|
||||
trace
|
||||
trade
|
||||
train
|
||||
transport
|
||||
trap
|
||||
travel
|
||||
treat
|
||||
tremble
|
||||
trick
|
||||
trip
|
||||
trot
|
||||
trouble
|
||||
trust
|
||||
try
|
||||
tug
|
||||
tumble
|
||||
turn
|
||||
twist
|
||||
type
|
||||
undress
|
||||
unfasten
|
||||
unite
|
||||
unlock
|
||||
unpack
|
||||
untidy
|
||||
use
|
||||
vanish
|
||||
visit
|
||||
wail
|
||||
wait
|
||||
walk
|
||||
wander
|
||||
want
|
||||
warm
|
||||
warn
|
||||
wash
|
||||
waste
|
||||
watch
|
||||
water
|
||||
wave
|
||||
weigh
|
||||
welcome
|
||||
whine
|
||||
whip
|
||||
whirl
|
||||
whisper
|
||||
whistle
|
||||
wink
|
||||
wipe
|
||||
wish
|
||||
wobble
|
||||
wonder
|
||||
work
|
||||
worry
|
||||
wrap
|
||||
wreck
|
||||
wrestle
|
||||
wriggle
|
||||
yawn
|
||||
yell
|
||||
zip
|
||||
zoom
|
||||
|
Before Width: | Height: | Size: 177 KiB After Width: | Height: | Size: 180 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 100 KiB |
BIN
icons/spideros_icons/sos_13.png
Normal file
|
After Width: | Height: | Size: 289 B |