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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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&¤t_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&¤t_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&¤t_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&¤t_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&¤t_mind.current.stat!=2)
|
||||
antagonist_list += current_mind
|
||||
|
||||
if ("wizard")
|
||||
for(current_mind in current_mode.wizards)
|
||||
if(current_mind.current&¤t_mind.current.stat!=2)
|
||||
antagonist_list += current_mind
|
||||
|
||||
if ("changeling")
|
||||
for(current_mind in current_mode.changelings)
|
||||
if(current_mind.current&¤t_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&¤t_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"&¤t_mind.current&¤t_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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
*/
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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) )
|
||||
|
||||
@@ -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()
|
||||
@@ -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> | ")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 24 KiB |
@@ -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"
|
||||
|
||||