Fixed some typos in traitorchan (lol).

Adjusted ninja random event to go with the new mode changes.
Due to inclusion of monkey mode, added back monkey ability to vent crawl. Identical to larva.
Brains can now suicide.
Warden now starts out with a special hat. Welcome to Hat Station 13.
Holograms should no longer be draggable by space wind.
Slight change to pulse rifle so it looks like the older sprite.
Added deathsquad armor to admin equip list.
Added tunnel clown gear to admin equip list.
Fixed minor announcement bug with respawn_character.
PDAs now redirect to Notekeeper when the code is used again with an unlocked uplink.
Added a note for built AIs to adjust camera network. Camera movement doesn't always work right without adjusting the network first.
Ninjas can now hold an extra battery in their hat and suit slots.
C4s now give a message when planted on people and are recorded in the attack log.
Fixed spelling on messaging server.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1735 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
noisomehollow@lycos.com
2011-06-26 21:28:23 +00:00
parent 532e8ef65d
commit 449e0b765a
33 changed files with 277 additions and 193 deletions
+1 -1
View File
@@ -44,7 +44,7 @@
/obj/machinery/message_server
icon = 'stationobjs.dmi'
icon_state = "server"
name = "Messanging Server"
name = "Messaging Server"
density = 1
anchored = 1.0
use_power = 1
+17 -15
View File
@@ -61,15 +61,15 @@ datum/mind
if (ticker.mode.config_tag=="revolution")
text = uppertext(text)
text = "<i><b>[text]</b></i>: "
if (src.assigned_role in head_positions)
if (assigned_role in head_positions)
text += "<b>HEAD</b>|officer|employee|headrev|rev"
else if (src.assigned_role in list("Security Officer", "Detective", "Warden"))
else if (assigned_role in list("Security Officer", "Detective", "Warden"))
text += "head|<b>OFFICER</b>|employee|headre|rev"
else if (src in ticker.mode.head_revolutionaries)
text = "head|officer|<a href='?src=\ref[src];revolution=clear'>employee</a>|<b>HEADREV</b>|<a href='?src=\ref[src];revolution=rev'>rev</a>"
text += "<br>Flash: <a href='?src=\ref[src];revolution=flash'>give</a>"
var/list/L = src.current.get_contents()
var/list/L = current.get_contents()
var/obj/item/device/flash/flash = locate() in L
if (flash)
if (flash.status)
@@ -93,9 +93,9 @@ datum/mind
if (ticker.mode.config_tag=="cult")
text = uppertext(text)
text = "<i><b>[text]</b></i>: "
if (src.assigned_role in head_positions)
if (assigned_role in head_positions)
text += "<b>HEAD</b>|officer|employee|cultist"
else if (src.assigned_role in list("Security Officer", "Detective", "Warden"))
else if (assigned_role in list("Security Officer", "Detective", "Warden"))
text += "head|<b>OFFICER</b>|employee|cultist"
else if (src in ticker.mode.cult)
text += "head|officer|<a href='?src=\ref[src];cult=clear'>employee</a>|<b>CULTIST</b>"
@@ -167,7 +167,7 @@ datum/mind
if (src in ticker.mode.traitors)
text += "<b>TRAITOR</b>|<a href='?src=\ref[src];traitor=clear'>loyal</a>"
if (objectives.len==0)
text += "<br>Objectives are empty! <a href='?src=\ref[src];traitor=autoobjectives'>Randomize!</a>."
text += "<br>Objectives are empty! <a href='?src=\ref[src];traitor=autoobjectives'>Randomize</a>!"
else
text += "<a href='?src=\ref[src];traitor=traitor'>traitor</a>|<b>LOYAL</b>"
sections["traitor"] = text
@@ -466,14 +466,14 @@ datum/mind
usr << "\red Spawning flash failed!"
if("takeflash")
var/list/L = src.current.get_contents()
var/list/L = current.get_contents()
var/obj/item/device/flash/flash = locate() in L
if (!flash)
usr << "\red Deleting flash failed!"
del(flash)
if("repairflash")
var/list/L = src.current.get_contents()
var/list/L = current.get_contents()
var/obj/item/device/flash/flash = locate() in L
if (!flash)
usr << "\red Repairing flash failed!"
@@ -481,7 +481,7 @@ datum/mind
flash.status = 1
if("reequip")
var/list/L = src.current.get_contents()
var/list/L = current.get_contents()
var/obj/item/device/flash/flash = locate() in L
del(flash)
take_uplink()
@@ -532,7 +532,7 @@ datum/mind
H << "A tome, a message from your new master, appears in your [where]."
if("amulet")
if (!ticker.mode.equip_cultist(src.current))
if (!ticker.mode.equip_cultist(current))
usr << "\red Spawning amulet failed!"
else if (href_list["wizard"])
@@ -542,7 +542,7 @@ datum/mind
ticker.mode.wizards -= src
special_role = null
current.spellremove(current, config.feature_object_spell_system? "object":"verb")
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a wizard!</B></FONT>"
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a wizard!</B></FONT>"
if("wizard")
if(!(src in ticker.mode.wizards))
ticker.mode.wizards += src
@@ -647,7 +647,8 @@ datum/mind
if(src in ticker.mode.traitors)
ticker.mode.traitors -= src
special_role = null
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a traitor!</B></FONT>"
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a traitor!</B></FONT>"
if("traitor")
if(!(src in ticker.mode.traitors))
ticker.mode.traitors += src
@@ -785,6 +786,7 @@ datum/mind
current.drop_from_slot(W)
if("takeuplink")
take_uplink()
memory = null//Remove any memory they may have had.
if("crystals")
if (usr.client.holder.level >= 3)
var/obj/item/weapon/syndicate_uplink/suplink = find_syndicate_uplink()
@@ -846,7 +848,7 @@ datum/mind
proc/find_syndicate_uplink()
var/obj/item/weapon/syndicate_uplink/uplink = null
var/list/L = src.current.get_contents()
var/list/L = current.get_contents()
for (var/obj/item/device/radio/radio in L)
uplink = radio.traitorradio
if (uplink)
@@ -857,7 +859,7 @@ datum/mind
proc/find_integrated_uplink()
//world << "DEBUG: find_integrated_uplink()"
var/obj/item/weapon/integrated_uplink/uplink = null
var/list/L = src.current.get_contents()
var/list/L = current.get_contents()
for (var/obj/item/device/pda/pda in L)
uplink = pda.uplink
if (uplink)
@@ -865,7 +867,7 @@ datum/mind
return uplink
proc/take_uplink() //assuming only one uplink because I am tired of all this uplink shit --rastaf0
var/list/L = src.current.get_contents()
var/list/L = current.get_contents()
var/obj/item/weapon/syndicate_uplink/suplink = null
var/obj/item/weapon/integrated_uplink/iuplink = null
for (var/obj/item/device/radio/radio in L)
-6
View File
@@ -264,12 +264,6 @@
item_state = "b_suit"
color = "police"
/obj/item/clothing/head/helmet/bobby
name = "Custodian Helmet"
desc = "Heh. Lookit dat fukken helmet."
icon_state = "policehelm"
item_state = "helmet"
/obj/item/clothing/head/flatcap
name = "flat cap"
desc = "A working man's cap."
+9 -1
View File
@@ -257,6 +257,7 @@
item_state = "s-ninja_mask"
radiation_protection = 0.25
see_face = 1
allowed = list(/obj/item/weapon/cell)
armor = list(melee = 60, bullet = 50, laser = 30, taser = 15, bomb = 30, bio = 30, rad = 30)
/obj/item/clothing/head/helmet/swat
@@ -297,12 +298,19 @@
armor = list(melee = 10, bullet = 10, laser = 10, taser = 5, bomb = 10, bio = 5, rad = 10)
/obj/item/clothing/head/helmet/HoS
name = "HoS helmet"
name = "HoS Hat"
icon_state = "hoscap"
desc = "A hat that shows the security grunts who's in charge!"
flags = FPRINT | TABLEPASS | SUITSPACE | HEADCOVERSEYES
armor = list(melee = 80, bullet = 60, laser = 50, taser = 10, bomb = 25, bio = 10, rad = 0)
/obj/item/clothing/head/helmet/warden
name = "Warden Hat"
desc = "Stop right there, criminal scum!"
icon_state = "policehelm"
flags = FPRINT | TABLEPASS | SUITSPACE | HEADCOVERSEYES
armor = list(melee = 70, bullet = 50, laser = 40, taser = 10, bomb = 25, bio = 10, rad = 0)
/obj/item/clothing/head/helmet/that
name = "Sturdy Top hat"
desc = "An amish looking helmet"
+1 -1
View File
@@ -478,7 +478,7 @@
desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins."
icon_state = "s-ninja"
item_state = "s-ninja_suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/cell)
radiation_protection = 0.75
slowdown = 1
armor = list(melee = 60, bullet = 50, laser = 30, taser = 15, bomb = 30, bio = 30, rad = 30)
+2
View File
@@ -797,6 +797,8 @@ Turf and target are seperate in case you want to teleport some distance from a t
mob_list.Add(M)
for(var/mob/living/carbon/human/M in world)
mob_list.Add(M)
for(var/mob/living/carbon/brain/M in world)
mob_list.Add(M)
for(var/mob/living/carbon/alien/M in world)
mob_list.Add(M)
for(var/mob/dead/observer/M in world)
@@ -5,7 +5,7 @@
/datum/game_mode/traitor/changeling/announce()
world << "<B>The current game mode is - Traitor+Changeling!</B>"
world << "<B>There is an alien changeling on the station. Also there are traitors pursuing tyeir own interests. Do not let the changeling and the traitors succeed!</B>"
world << "<B>There is an alien creature on the station along with some syndicate operatives out for their own gain! Do not let the changeling and the traitors succeed!</B>"
/datum/game_mode/traitor/changeling/can_start()
var/count = 0
@@ -717,6 +717,7 @@ ________________________________________________________________________________
if(!hologram)//If there is not already a hologram.
hologram = new(T)//Spawn a blank effect at the location.
hologram.invisibility = 101//So that it doesn't show up, ever. This also means one could attach a number of images to a single obj and display them differently to differnet people.
hologram.anchored = 1//So it cannot be dragged by space wind and the like.
hologram.dir = get_dir(T,affecting.loc)
var/image/I = image('mob.dmi',hologram,"ai-holo")//Attach an image to object.
hologram.i_attached = I//To attach the image in order to later reference.
@@ -820,7 +821,7 @@ ________________________________________________________________________________
U << "Replenished a total of [total_reagent_transfer ? total_reagent_transfer : "zero"] chemical units."//Let the player know how much total volume was added.
return
else if(istype(I, /obj/item/weapon/cell))
if(I:maxcharge>cell.maxcharge)
if(I:maxcharge>cell.maxcharge&&n_gloves&&n_gloves.candrain)
U << "\blue Higher maximum capacity detected.\nUpgrading..."
if (n_gloves&&n_gloves.candrain&&do_after(U,s_delay))
U.drop_item()
+35 -86
View File
@@ -72,7 +72,7 @@ ________________________________________________________________________________
Suit Upgrade
Unsure
Instead of losing energy each second, the suit would regain the same amount of energy.
This would not count in activating stealth and smiliar.
This would not count in activating stealth and similar.
Extended Battery Life:
Suit Upgrade
Battery of higher capacity
@@ -81,7 +81,6 @@ ________________________________________________________________________________
Suit Upgrade
Syndicate Cloaking Device?
Remove cloak failure rate.
*/
//=======//RANDOM EVENT//=======//
@@ -97,76 +96,40 @@ When I already created about 4 new objectives, this doesn't seem terribly import
/proc/space_ninja_arrival()
var/datum/game_mode/current_mode = ticker.mode
var/datum/mind/current_mind = new()
var/datum/mind/current_mind
/*Is the ninja playing for the good or bad guys? Is the ninja helping or hurting the station?
Their directives also influence behavior. At least in theory.*/
var/side = pick("face","heel")
var/antagonist_list[] = list()//The main bad guys. Evil minds that plot destruction.
var/sec_antagonist_list[] = current_mode.traitors//The OTHER bad guys. Mostly admin made.
var/ter_antagonist_list[] = list()//The bad guys no-one really cares about. For now just revs.
var/living_heads_of_staff[] = current_mode.get_living_heads()
var/protagonist_list[] = current_mode.get_living_heads()//The good guys. Mostly Heads. Who are alive.
var/xeno_list[] = list()//Aliens.
var/commando_list[] = list()//Commandos.
//First we determine what mode it is and add the bad guys approprietly.
switch (current_mode.config_tag)
if("traitor")
for(current_mind in current_mode:traitors)//For traitor minds in in the traitors list.
if(current_mind.current&&current_mind.current.stat!=2)//If the traitor mob exists and they are not dead.
antagonist_list += current_mind//Add them to the list.
//We want the ninja to appear only in certain modes.
var/acceptable_modes_list[] = list("traitor","revolution","cult","wizard","changeling","traitorchan","nuclear","malfunction","monkey")
if((!current_mode.config_tag) in acceptable_modes_list)
return
if ("revolution")//Rev is divided into regular and heads. There are also heads of staff to consider.
for(current_mind in current_mode:head_revolutionaries)
if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind
/*No longer need to determine what mode it is since bad guys are basically universal.
And there is now a mode with two types of bad guys.*/
for(current_mind in current_mode:revolutionaries)
if(current_mind.current&&current_mind.current.stat!=2)
ter_antagonist_list += current_mind
var/possible_bad_dudes[] = list(current_mode.traitors,current_mode.head_revolutionaries,current_mode.head_revolutionaries,
current_mode.cult,current_mode.wizards,current_mode.changelings,current_mode.syndicates)
for(var/list in possible_bad_dudes)//For every possible antagonist type.
for(current_mind in list)//For each mind in that list.
if(current_mind.current&&current_mind.current.stat!=2)//If they are not destroyed and not dead.
antagonist_list += current_mind//Add them.
protagonist_list |= living_heads_of_staff
/* seems unused or infinished --rastaf0
var/heads_list[] = list()//Now we manually override the list made prior. Target Heads take priority.
if(heads_list.len)//Or not, if there are none.
protagonist_list = heads_list
*/
if ("cult")//Always a few of these around.
for(current_mind in current_mode.cult)
if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind
if ("wizard")
for(current_mind in current_mode.wizards)
if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind
if ("changeling")
for(current_mind in current_mode.changelings)
if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind
if(protagonist_list.len)//If the mind is both a protagonist and antagonist.
for(current_mind in protagonist_list)
if(current_mind in antagonist_list)
protagonist_list -= current_mind//We only want it in one list.
/*
I originally intended for space ninjas to appear in Malfunction but after some consideration
this is not worth the trouble. Particularly with how objective mind completion is tracked.
Not to mention that Malfunction does not use declare_completion (at least, not in the way the other modes do).
With that said, a ninja on the side of the station would murder the AI very quickly--and the rounds usually
last long enough for the ninja to appear, too.
//not only one anymore. --rastaf0
if ("malfunction")
if(current_mode:malf_ai)
antagonist_list += current_mode:malf_ai
Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective completion. Only humans are added.
*/
if ("nuclear")//Can be a few of these guys.
for(current_mind in current_mode:syndicates)
if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind
else
return//Don't want to summon a ninja during meteor or extended, or something.
//Here we pick a location and spawn the ninja.
var/list/spawn_list = list()
@@ -222,9 +185,9 @@ last long enough for the ninja to appear, too.
ninja_mind.objectives += ninja_objective
mission_set = 1
if(sent_strike_team&&side=="heel")//If a strike team was sent, murder them all like a champ.
for(current_mind in ticker.minds)//Search and destroy.
if(current_mind.special_role=="Death Commando"&&current_mind.current&&current_mind.current.stat!=2)
if(sent_strike_team&&side=="heel"&&antagonist_list.len)//If a strike team was sent, murder them all like a champ.
for(current_mind in antagonist_list)//Search and destroy. Since we already have an antagonist list, they should appear there.
if(current_mind.special_role=="Death Commando")
commando_list += current_mind
if(commando_list.len)//If there are living commandos still in play.
for(var/mob/living/carbon/human/commando in commando_list)
@@ -241,36 +204,22 @@ In either case, it's a good idea to spawn the ninja with a semi-random set of ob
*/
if(!mission_set)//If mission was not set.
//To pick a person for each list.
var/datum/mind/antagonist_target
if(antagonist_list.len)
antagonist_target = pick(antagonist_list)
var/datum/mind/secondary_target
if(sec_antagonist_list.len)
secondary_target = pick(sec_antagonist_list)
var/datum/mind/tertiary_target
if(ter_antagonist_list.len)
tertiary_target = pick(ter_antagonist_list)
var/datum/mind/protagonist_target
if(protagonist_list.len)
protagonist_target = pick(protagonist_list)
var/current_minds[]//List being looked on in the following code.
var/side_list = side=="face" ? 2 : 1//For logic gating.
var/hostile_targets[] = list()//The guys actually picked for the assassination or whatever.
var/friendly_targets[] = list()//The guys the ninja must protect.
if(side=="face")
friendly_targets += protagonist_target//Will add null if the variable is empty.
hostile_targets += antagonist_target
hostile_targets += secondary_target
hostile_targets += tertiary_target
else
hostile_targets += protagonist_target
friendly_targets += antagonist_target
friendly_targets += secondary_target
friendly_targets += tertiary_target
for(var/i=2,i>0,i--)//Two lists.
current_minds = i==2 ? antagonist_list : protagonist_list//Which list are we looking at?
for(var/t=3,(current_minds.len&&t>0),t--)//While the list is not empty and targets remain. Also, 3 targets is good.
current_mind = pick(current_minds)//Pick a random person.
/*I'm creating a logic gate here based on the ninja affiliation that compares the list being
looked at to the affiliation. Affiliation is just a number used to compare. Meaning comes from the logic involved.
If the list being looked at is equal to the ninja's affiliation, add the mind to hostiles.
If not, add the mind to friendlies. Since it can't be both, it will be added only to one or the other.*/
hostile_targets += i==side_list ? current_mind : null//Adding null doesn't add anything.
friendly_targets += i!=side_list ? current_mind : null
current_minds -= current_mind//Remove the mind so it's not picked again.
var/objective_list[] = list(1,2,3,4,5,6)//To remove later.
for(var/i=rand(1,3),i>0,i--)//Want to get a few random objectives. Currently up to 3.
+1 -1
View File
@@ -427,7 +427,7 @@
src.equip_if_possible(new /obj/item/device/pda/security(src), slot_belt)
src.equip_if_possible(new /obj/item/clothing/under/rank/warden(src), slot_w_uniform)
src.equip_if_possible(new /obj/item/clothing/suit/armor/vest(src), slot_wear_suit)
src.equip_if_possible(new /obj/item/clothing/head/helmet(src), slot_head)
src.equip_if_possible(new /obj/item/clothing/head/helmet/warden(src), slot_head)
src.equip_if_possible(new /obj/item/clothing/shoes/black(src), slot_shoes)
src.equip_if_possible(new /obj/item/clothing/gloves/black(src), slot_gloves)
src.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(src), slot_glasses)
+1 -1
View File
@@ -185,7 +185,7 @@
var/list/D = list()
D["Cancel"] = "Cancel"
for (var/obj/machinery/camera/C in L)
if (C.network == src.network)
if (C.network == network)
D[text("[][]", C.c_tag, (C.status ? null : " (Deactivated)"))] = C
var/t = input(user, "Which camera should you change to?") as null|anything in D
+29 -5
View File
@@ -11,7 +11,7 @@ Possible to do for anyone motivated enough:
Give an AI variable for different hologram icons.
Itegrate EMP effects to disable the unit.
*/
/obj/machinery/holopad/attack_ai(var/mob/living/silicon/ai/user as mob)
/obj/machinery/holopad/attack_ai(mob/living/silicon/ai/user)
if (!istype(user))
return
/*There are pretty much only three ways to interact here.
@@ -26,7 +26,7 @@ Possible to do for anyone motivated enough:
clear_holo()
return
/obj/machinery/holopad/proc/activate_holo(var/mob/living/silicon/ai/user as mob)
/obj/machinery/holopad/proc/activate_holo(mob/living/silicon/ai/user)
if(!(stat & NOPOWER)&&user.client.eye==src)//If the projector has power and client eye is on it.
if(!hologram)//If there is not already a hologram.
create_holo(user)//Create one.
@@ -40,7 +40,7 @@ Possible to do for anyone motivated enough:
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
For the other part of the code, check silicon say.dm. Particularly robot talk.*/
/obj/machinery/holopad/hear_talk(mob/M as mob, text)
/obj/machinery/holopad/hear_talk(mob/M, text)
if(M&&hologram&&master)//Master is mostly a safety in case lag hits or something.
if(!master.say_understands(M))//The AI will be able to understand most mobs talking through the holopad.
text = stars(text)
@@ -52,13 +52,14 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
master.show_message(rendered, 2)
return
/obj/machinery/holopad/proc/create_holo(var/mob/living/silicon/ai/A, var/turf/T = loc)
/obj/machinery/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc)
hologram = new(T)//Spawn a blank effect at the location.
hologram.icon = 'mob.dmi'
hologram.icon_state = "ai-holo"
hologram.mouse_opacity = 0//So you can't click on it.
hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
hologram.sd_SetLuminosity(1)//To make it glowy.
hologram.anchored = 1//So space wind cannot drag it.
sd_SetLuminosity(1)//To make the pad glowy.
icon_state = "holopad1"
master = A//AI is the master.
@@ -112,4 +113,27 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
/obj/machinery/holopad/Del()
if(hologram)
clear_holo()
..()
..()
/*
Holographic project of everything else.
/obj/machinery/holoprojector/attack_hand()
/obj/machinery/holoprojector/create_holo(turf/T = loc, mob/living/M)
hologram = new(T)//Spawn a blank effect at the location.
//Here we don't want to actually change icon directly. We're looking to create an image.
var/flat_image = getFlatIcon(M,2)//Get the flat icon facing south. Respect cache.
hologram.overlay += flat_image
hologram.mouse_opacity = 0//So you can't click on it.
hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
hologram.sd_SetLuminosity(1)//To make it glowy.
sd_SetLuminosity(1)//To make the pad glowy.
icon_state = "holopad1"
use_power = 2//Active power usage.
return 1
/obj/machinery/holoprojector/clear_holo()
*/
+2 -2
View File
@@ -425,8 +425,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
// usr << browse(null, "window=tank")
attack(mob/living/M as mob, mob/living/user as mob)
M.attack_log += text("<font color='orange'>[world.time] - has has had the [src.name] used on him by [user.name] ([user.ckey])</font>")
user.attack_log += text("<font color='red'>[world.time] - has used [src.name] on [M.name] ([M.ckey])</font>")
M.attack_log += text("<font color='orange'>[world.time] - has had the [name] used on him by [user.name] ([user.ckey])</font>")
user.attack_log += text("<font color='red'>[world.time] - has used [name] on [M.name] ([M.ckey])</font>")
if(istype(M,/mob/dead))
M.invisibility = 0
+8 -4
View File
@@ -210,7 +210,7 @@
if (1)
dat += "<h4><img src=pda_notes.png> Notekeeper V2.1</h4>"
if ((!isnull(uplink)) && (uplink.active))
if ((!isnull(uplink)) && uplink.active)
dat += "<a href='byond://?src=\ref[src];choice=Lock'> Lock</a><br>"
else
dat += "<a href='byond://?src=\ref[src];choice=Edit'> Edit</a><br>"
@@ -411,9 +411,13 @@
var/t = input(U, "Please enter new ringtone", name, ttone) as text
if (in_range(src, U) && loc == U)
if (t)
if ((uplink) && (cmptext(t,uplink.lock_code)) && (!uplink.active))
U << "The PDA softly beeps."
uplink.unlock()
if ((uplink) && (cmptext(t,uplink.lock_code)))
if(uplink.active)
U << "The PDA uplink is already unlocked."
mode = 1
else
U << "The PDA softly beeps."
uplink.unlock()
else
t = copytext(sanitize(t), 1, 20)
ttone = t
+18 -12
View File
@@ -1,7 +1,7 @@
/obj/item/weapon/plastique/attack_self(mob/user as mob)
var/newtime = input(usr, "Please set the timer.", "Timer", 10)
src.timer = newtime
user << "Timer set for [src.timer] seconds."
timer = newtime
user << "Timer set for [timer] seconds."
/obj/item/weapon/plastique/afterattack(atom/target as obj|turf, mob/user as mob, flag)
if (!flag)
@@ -9,23 +9,29 @@
if (istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle))
return
user << "Planting explosives..."
if(do_after(user, 50) && get_dist(user, target) <= 1)
if(ismob(target))
user.attack_log += "<font color='red'>[world.time] - [user.real_name] tried planting [name] on [target:real_name] ([target:ckey])</font>"
user.visible_message("\red [user.name] is trying to plant some kind of explosive on [target.name]!")
if(do_after(user, 50) && in_range(user, target))
user.drop_item()
src.target = target
src.loc = null
target = target
loc = null
var/location
if (isturf(target)) location = target
if (isobj(target)) location = target.loc
if (ismob(target))
target:attack_log += "<font color='orange'>[world.time] - had the [name] planted on them by [user.real_name] ([user.ckey])</font>"
user.visible_message("\red [user.name] finished planting an explosive on [target.name]!")
target.overlays += image('assemblies.dmi', "plastic-explosive2")
user << "Bomb has been planted. Timer counting down from [src.timer]."
spawn(src.timer*10)
user << "Bomb has been planted. Timer counting down from [timer]."
spawn(timer*10)
if(target)
explosion(location, -1, -1, 2, 3)
if (istype(src.target, /turf/simulated/wall)) src.target:dismantle_wall(1)
else src.target.ex_act(1)
if (isobj(src.target))
if (src.target)
del(src.target)
if (istype(target, /turf/simulated/wall)) target:dismantle_wall(1)
else target.ex_act(1)
if (isobj(target))
if (target)
del(target)
if (src)
del(src)
+3 -3
View File
@@ -8,12 +8,12 @@
/obj/item/weapon/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons.
src.icon_state = text("fireaxe[]",src.wielded)
icon_state = text("fireaxe[]",wielded)
return
/obj/item/weapon/fireaxe/pickup(mob/user)
src.wielded = 0
src.name = "Fire Axe (Unwielded)"
wielded = 0
name = "Fire Axe (Unwielded)"
/obj/item/weapon/fireaxe/attack_self(mob/user as mob)
if( istype(user,/mob/living/carbon/monkey) )
+59 -18
View File
@@ -3,7 +3,7 @@
/mob/living/carbon/human/verb/suicide()
set hidden = 1
if (src.stat == 2)
if (stat == 2)
src << "You're already dead!"
return
@@ -21,15 +21,40 @@
suiciding = 1
//instead of killing them instantly, just put them at -175 health and let 'em gasp for a while
viewers(src) << "\red <b>[src] is holding \his breath. It looks like \he's trying to commit suicide.</b>"
src.oxyloss = max(175 - src.toxloss - src.fireloss - src.bruteloss, src.oxyloss)
src.updatehealth()
oxyloss = max(175 - toxloss - fireloss - bruteloss, oxyloss)
updatehealth()
spawn(200) //in case they get revived by cryo chamber or something stupid like that, let them suicide again in 20 seconds
src.suiciding = 0
suiciding = 0
/mob/living/carbon/brain/verb/suicide()
set hidden = 1
if (stat == 2)
src << "You're already dead!"
return
if (!ticker)
src << "You can't commit suicide before the game starts!"
return
if (suiciding)
src << "You're already committing suicide! Be patient!"
return
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
if(confirm == "Yes")
suiciding = 1
viewers(loc) << "\red <b>[src]'s brain is growing dull and lifeless. It looks like it's trying to commit suicide. Somehow.</b>"
oxyloss = max(175 - toxloss - fireloss - bruteloss, oxyloss)
updatehealth()
spawn(200)
suiciding = 0
/mob/living/carbon/monkey/verb/suicide()
set hidden = 1
if (src.stat == 2)
if (stat == 2)
src << "You're already dead!"
return
@@ -47,15 +72,15 @@
suiciding = 1
//instead of killing them instantly, just put them at -175 health and let 'em gasp for a while
viewers(src) << "\red <b>[src] is holding \his breath. It looks like \he's trying to commit suicide.</b>"
src.oxyloss = max(175 - src.toxloss - src.fireloss - src.bruteloss, src.oxyloss)
src.updatehealth()
oxyloss = max(175 - toxloss - fireloss - bruteloss, oxyloss)
updatehealth()
spawn(200) //in case they get revived by cryo chamber or something stupid like that, let them suicide again in 20 seconds
src.suiciding = 0
suiciding = 0
/mob/living/silicon/ai/verb/suicide()
set hidden = 1
if (src.stat == 2)
if (stat == 2)
src << "You're already dead!"
return
@@ -69,12 +94,13 @@
suiciding = 1
viewers(src) << "\red <b>[src] is powering down. It looks like \he's trying to commit suicide.</b>"
//put em at -175
src.oxyloss = max(175 - src.toxloss - src.fireloss - src.bruteloss, src.oxyloss)
src.updatehealth()
oxyloss = max(175 - toxloss - fireloss - bruteloss, oxyloss)
updatehealth()
/mob/living/silicon/robot/verb/suicide()
set hidden = 1
if (src.stat == 2)
if (stat == 2)
src << "You're already dead!"
return
@@ -88,13 +114,28 @@
suiciding = 1
viewers(src) << "\red <b>[src] is powering down. It looks like \he's trying to commit suicide.</b>"
//put em at -175
src.oxyloss = max(475 - src.toxloss - src.fireloss - src.bruteloss, src.oxyloss)
src.updatehealth()
oxyloss = max(475 - toxloss - fireloss - bruteloss, oxyloss)
updatehealth()
/mob/living/silicon/pai/verb/suicide()
set category = "pAI Commands"
set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)"
set name = "pAI Suicide"
var/answer = input("REALLY kill yourself? This action can't be undone.", "Suicide", "No") in list ("Yes", "No")
if(answer == "Yes")
var/obj/item/device/paicard/card = loc
card.pai = null
var/turf/T = get_turf_or_move(card.loc)
for (var/mob/M in viewers(T))
M.show_message("\blue [src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "\blue [src] bleeps electronically.", 2)
death(0)
else
src << "Aborting suicide attempt."
/mob/living/carbon/alien/humanoid/verb/suicide()
set hidden = 1
if (src.stat == 2)
if (stat == 2)
src << "You're already dead!"
return
@@ -106,7 +147,7 @@
if(confirm == "Yes")
suiciding = 1
viewers(src) << "\red <b>[src] is holding his breath. It looks like \he's trying to commit suicide.</b>"
viewers(src) << "\red <b>[src] is thrashing wildly! It looks like \he's trying to commit suicide.</b>"
//put em at -175
src.oxyloss = max(100 - src.fireloss - src.bruteloss, src.oxyloss)
src.updatehealth()
oxyloss = max(100 - fireloss - bruteloss, oxyloss)
updatehealth()
+1 -1
View File
@@ -1517,7 +1517,7 @@ var/showadminmessages = 1
else if(ishuman(M))
foo += text("<A HREF='?src=\ref[src];makeai=\ref[M]'>Make AI</A> | ")
foo += text("<A HREF='?src=\ref[src];makerobot=\ref[M]'>Make Robot</A> | ")
foo += text("<A HREF='?src=\ref[src];makealien=\ref[M]'>Make Alium</A> | ")
foo += text("<A HREF='?src=\ref[src];makealien=\ref[M]'>Make Alien</A> | ")
foo += text("<A HREF='?src=\ref[src];tdome1=\ref[M]'>Thunderdome 1</A> | ")
foo += text("<A HREF='?src=\ref[src];tdome2=\ref[M]'>Thunderdome 2</A> | ")
foo += text("<A HREF='?src=\ref[src];tdomeadmin=\ref[M]'>Thunderdome Admin</A> | ")
+25 -7
View File
@@ -1,15 +1,15 @@
/client/proc/Debug2()
set category = "Debug"
set name = "Debug-Game"
if(!src.authenticated || !src.holder)
if(!authenticated || !holder)
src << "Only administrators may use this command."
return
if(src.holder.rank == "Game Admin")
if(holder.rank == "Game Admin")
Debug2 = !Debug2
world << "Debugging [Debug2 ? "On" : "Off"]"
log_admin("[key_name(src)] toggled debugging to [Debug2]")
else if(src.holder.rank == "Game Master")
else if(holder.rank == "Game Master")
Debug2 = !Debug2
world << "Debugging [Debug2 ? "On" : "Off"]"
@@ -32,7 +32,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/callproc()
set category = "Debug"
set name = "Advanced ProcCall"
if(!src.authenticated || !src.holder)
if(!authenticated || !holder)
src << "Only administrators may use this command."
return
var/target = null
@@ -120,9 +120,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/Cell()
set category = "Debug"
set name = "Air Status in Location"
if(!src.mob)
if(!mob)
return
var/turf/T = src.mob.loc
var/turf/T = mob.loc
if (!( istype(T, /turf) ))
return
@@ -351,6 +351,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
"pirate",
"space pirate",
//"soviet soldier",
"tunnel clown",
"death commando",
)
var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in dresspacks
if (isnull(dresscode))
@@ -429,7 +431,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_if_possible(new /obj/item/clothing/shoes/brown(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/head/bandana(M), M.slot_head)
M.equip_if_possible(new /obj/item/clothing/glasses/eyepatch(M), M.slot_glasses)
M.equip_if_possible(new /obj/item/weapon/sword/pirate(M), M.slot_r_hand)
if ("space pirate")
@@ -447,5 +448,22 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_if_possible(new /obj/item/clothing/head/ushanka(M), M.slot_head)
*/
if("tunnel clown")//Tunnel clowns rule!
M.equip_if_possible(new /obj/item/clothing/under/rank/clown(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/clown_shoes(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/mask/gas/clown_hat(M), M.slot_wear_mask)
M.equip_if_possible(new /obj/item/clothing/head/chaplain_hood(M), M.slot_head)
M.equip_if_possible(new /obj/item/clothing/suit/chaplain_hoodie(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(M), M.slot_l_store)
M.equip_if_possible(new /obj/item/weapon/bikehorn(M), M.slot_r_store)
M.equip_if_possible(new /obj/item/device/pda/clown(M), M.slot_belt)
var/obj/item/weapon/fireaxe/fire_axe = new(M)
fire_axe.name = "Fire Axe (Unwielded)"
M.equip_if_possible(fire_axe, M.slot_r_hand)
if("death commando")//Was looking to add this for a while.
M.equip_death_commando()
M.update_clothing()
return
+7 -3
View File
@@ -363,15 +363,19 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/mob/living/carbon/human/new_character = new(src)//The mob being spawned.
//Second, we check if they are an alien or monkey.
var/adj_name = copytext(G_found.name,1,7)//What is their name?
var/adj_name = copytext(G_found.real_name,1,7)//What is their name?
if(G_found.mind&&G_found.mind.special_role=="Alien")//If they have a mind, are they an alien?
adj_name="alien "
if( adj_name==("alien "||"monkey"))
if(alert("This character appears to either be an an alien or monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes")//If you do.
switch(adj_name)//Let's check based on adjusted name.
if("monkey")//A monkey. Monkeys don't have a mind, so we can safely spawn them here if needed.
//TO DO: Monkeys may have a mind now. May need retooling.
var/mob/living/carbon/monkey/M = new(pick(latejoin))//Spawn a monkey at latejoin.
M.key = G_found.key//They are now a monkey. Nothing else needs doing.
M.mind = G_found.mind
if(M.mind)//If the mind is not null.
M.mind.current = M
M.key = G_found.key//They are now a monkey. Nothing else needs doing.
if("alien ")//An alien. Aliens can have a mind which can be used to determine a few things.
if(G_found.mind)
var/turf/location = xeno_spawn.len ? pick(xeno_spawn) : pick(latejoin)//Location where they will be spawned.
@@ -544,7 +548,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
call(/mob/new_player/proc/ManifestLateSpawn)(new_character)
if(alert(new_character,"Would you like an active AI to announce this character?",,"No","Yes")=="Yes")
call(/mob/new_player/proc/AnnounceArrival)(new_character)
call(/mob/new_player/proc/AnnounceArrival)(new_character, new_character.mind.assigned_role)
message_admins("\blue [admin] has respawned [player_key] as [new_character.real_name].", 1)
+2 -4
View File
@@ -95,7 +95,7 @@ var/global/sent_strike_team = 0
//Spawns the rest of the commando gear.
for (var/obj/landmark/L)
if (L.name == "Commando_Manual")
new /obj/item/weapon/gun/energy/pulse_rifle(L.loc)
//new /obj/item/weapon/gun/energy/pulse_rifle(L.loc)
var/obj/item/weapon/paper/P = new(L.loc)
P.info = "<p><b>Good morning soldier!</b>. This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow:<br>#1 Work as a team.<br>#2 Accomplish your objective at all costs.<br>#3 Leave no witnesses.<br>You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets.<br>If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.</p><p>In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a Nanotrasen Nuclear Device. Your operations <b>LEADER</b> is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.</p><p>Hello and thank you for choosing Nanotrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class Nanotrasen made Nuclear Device.<br>First and foremost, <b>DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.</b> Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible.<br>To make the device functional:<br>#1 Place bomb in designated detonation zone<br> #2 Extend and anchor bomb (attack with hand).<br>#3 Insert Nuclear Auth. Disk into slot.<br>#4 Type numeric code into keypad ([nuke_code]).<br>Note: If you make a mistake press R to reset the device.<br>#5 Press the E button to log onto the device.<br>You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option.<br>Note: Toggle off the <b>SAFETY</b>.<br>Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.<br>Note: <b>THE BOMB IS STILL SET AND WILL DETONATE</b><br>Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.</p><p>The nuclear authorization code is: <b>[nuke_code ? nuke_code : "None provided"]</b></p><p><b>Good luck, soldier!</b></p>"
P.name = "Spec. Ops. Manual"
@@ -174,9 +174,7 @@ var/global/sent_strike_team = 0
equip_if_possible(new /obj/item/weapon/tank/emergency_oxygen(src), slot_s_store)
equip_if_possible(new /obj/item/weapon/gun/projectile/mateba(src), slot_belt)
//equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle(src), slot_l_hand)
/*Commented out because Commandos now have their rifles spawn in front of them, along with operation manuals.
Useful for copy pasta since I'm lazy.*/
equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle(src), slot_r_hand)
var/obj/item/weapon/card/id/W = new(src)
W.name = "[real_name]'s ID Card"
@@ -123,7 +123,7 @@ I kind of like the right click only--the window version can get a little confusi
/mob/living/carbon/alien/humanoid/verb/ventcrawl() // -- TLE
set name = "Crawl through Vent"
set desc = "Enter an air vent and appear at a random one"
set desc = "Enter an air vent and crawl through the pipes."
set category = "Alien"
// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
// return
@@ -1,6 +1,6 @@
/mob/living/carbon/alien/larva/verb/ventcrawl() // -- TLE
set name = "Crawl through Vent"
set desc = "Enter an air vent and appear at a random one."
set desc = "Enter an air vent and crawl through the pipe system."
set category = "Alien"
// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
@@ -31,5 +31,6 @@
if (key)
spawn(50)
if(key && stat == 2)
src << "You are now dead. If you cannot ghost at this point, relog into the game."
verbs += /mob/proc/ghost
return ..(gibbed)
@@ -0,0 +1,46 @@
/mob/living/carbon/monkey/verb/ventcrawl()
set name = "Crawl through Vent"
set desc = "Enter an air vent and crawl through the pipe system."
set category = "Monkey"
// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
// return
if(!stat)
var/obj/machinery/atmospherics/unary/vent_pump/vent_found
for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
if(!v.welded)
vent_found = v
else
src << "\red That vent is welded."
if(vent_found)
if(vent_found.network&&vent_found.network.normal_members.len)
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
if(temp_vent.loc == loc)
continue
vents.Add(temp_vent)
var/list/choices = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
if(vent.loc.z != loc.z)
continue
var/atom/a = get_turf_loc(vent)
choices.Add(a.loc)
var/turf/startloc = loc
var/obj/selection = input("Select a destination.", "Duct System") in choices
var/selection_position = choices.Find(selection)
if(loc==startloc)
var/obj/target_vent = vents[selection_position]
if(target_vent)
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O.show_message(text("<B>[src] scrambles into the ventillation ducts!</B>"), 1)
loc = target_vent.loc
else
src << "You need to remain still while entering a vent."
else
src << "This vent is not connected to anything."
else
src << "You must be standing on or beside an air vent to enter it."
else
src << "You must be conscious to do this!"
return
+1
View File
@@ -48,6 +48,7 @@
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 << "Remember to <b>adjust your camera network</b> if you are having difficulty navigating the camera networks with the arrow keys or clicking on certain objects."
if (!(ticker && ticker.mode && (mind in ticker.mode.malf_ai)))
show_laws()
src << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
@@ -200,22 +200,6 @@
src.machine = null
src:cameraFollow = null
/mob/living/silicon/pai/verb/seppuku()
set category = "pAI Commands"
set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)"
set name = "pAI Suicide"
var/answer = input("REALLY kill yourself? This action can't be undone.", "Suicide", "No") in list ("Yes", "No")
if(answer == "Yes")
var/obj/item/device/paicard/card = src.loc
card.pai = null
var/turf/T = get_turf_or_move(card.loc)
for (var/mob/M in viewers(T))
M.show_message("\blue [src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "\blue [src] bleeps electronically.", 2)
src.death(0)
else
src << "Aborting suicide attempt."
//Addition by Mord_Sith to define AI's network change ability
/*
/mob/living/silicon/pai/proc/pai_network_change()
+1 -1
View File
@@ -70,7 +70,7 @@
/mob/proc/AIize()
if(client)
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.
var/mob/living/silicon/ai/O = new (loc, /datum/ai_laws/asimov,,1)//No MMI but safety is in effect.
O.invisibility = 0
O.aiRestorePowerRoutine = 0
O.lastKnownIP = client.address
Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 17 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 24 KiB

+2 -1
View File
@@ -41,7 +41,6 @@
#define FILE_DIR "code/game/gamemodes/revolution"
#define FILE_DIR "code/game/gamemodes/sandbox"
#define FILE_DIR "code/game/gamemodes/traitor"
#define FILE_DIR "code/game/gamemodes/traitor_pair"
#define FILE_DIR "code/game/gamemodes/wizard"
#define FILE_DIR "code/game/jobs"
#define FILE_DIR "code/game/machinery"
@@ -130,6 +129,7 @@
#define FILE_DIR "icons/turf"
#define FILE_DIR "interface"
#define FILE_DIR "maps"
#define FILE_DIR "maps/backup"
#define FILE_DIR "sound"
#define FILE_DIR "sound/ambience"
#define FILE_DIR "sound/announcer"
@@ -708,6 +708,7 @@
#include "code\modules\mob\living\carbon\monkey\life.dm"
#include "code\modules\mob\living\carbon\monkey\login.dm"
#include "code\modules\mob\living\carbon\monkey\monkey.dm"
#include "code\modules\mob\living\carbon\monkey\powers.dm"
#include "code\modules\mob\living\carbon\monkey\say.dm"
#include "code\modules\mob\living\silicon\say.dm"
#include "code\modules\mob\living\silicon\silicon.dm"