#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
This commit is contained in:
noisomehollow@lycos.com
2011-05-09 09:45:56 +00:00
parent 6b3ff55761
commit ab87c76da1
35 changed files with 9737 additions and 7789 deletions

View File

@@ -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 */

View File

@@ -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

View File

@@ -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)

View File

@@ -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
*/

View File

@@ -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

View File

@@ -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

View File

@@ -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>&larr; 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>&larr; 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>&larr; 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

View File

@@ -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]&deg;C ([U.bodytemperature*1.8-459.67]&deg;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)]&deg;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 */

View File

@@ -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.

View File

@@ -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)

View File

@@ -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)

View File

@@ -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
*/

View File

@@ -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

View File

@@ -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

View File

@@ -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>"

View File

@@ -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

View File

@@ -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()

View File

@@ -39,7 +39,7 @@
opacity = 1
anchored = 1
var/health = 50
var/affecting = null
var/mob/living/affecting = null
/obj/alien/weeds
name = "weeds"

View File

@@ -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))

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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
View 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
View 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 KiB

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

File diff suppressed because it is too large Load Diff