#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
+1 -1
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"
+23 -55
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))
+56 -108
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)
+4 -4
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