Merge pull request #6 from ZomgPonies/master

Branch Updating
This commit is contained in:
SamCroswell
2014-01-06 01:53:09 -08:00
892 changed files with 26140 additions and 29338 deletions
@@ -17,6 +17,7 @@
if(prob(20))
opacity = 1
/*
/obj/structure/bush/Bumped(M as mob)
if (istype(M, /mob/living/simple_animal))
var/mob/living/simple_animal/A = M
@@ -24,6 +25,7 @@
else if (istype(M, /mob/living/carbon/monkey))
var/mob/living/carbon/monkey/A = M
A.loc = get_turf(src)
*/
/obj/structure/bush/attackby(var/obj/I as obj, var/mob/user as mob)
//hatchets can clear away undergrowth
@@ -247,10 +247,10 @@
new_slime.key = key
new_slime << "<B>You are now a slime!</B>"
/*
if(new_slime.client)
if(babies.len)
var/list/candidates = get_active_candidates()
var/list/candidates = get_slime_candidates()
if(candidates.len)
var/mob/dead/observer/picked = pick(candidates)
var/mob/living/carbon/slime/S = pick(babies)
@@ -261,7 +261,7 @@
else
new_slime << "<i>You're an only child!</i>"*/
new_slime << "<i>You're an only child!</i>"
else
src << "<i>I am not ready to reproduce yet...</i>"
else
+16 -3
View File
@@ -142,7 +142,7 @@
if(ismob(A))
var/mob/M = A
if(client_check && !M.client)
L = recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio)
L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio)
continue
if(sight_check && !isInSight(A, O))
continue
@@ -155,7 +155,7 @@
L |= A
if(isobj(A) || ismob(A))
L = recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio)
L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio)
return L
// The old system would loop through lists for a total of 5000 per function call, in an empty server.
@@ -182,7 +182,7 @@
hear += A
if(isobj(A) || ismob(A))
hear = recursive_mob_check(A, hear, 3, 1, 0, 1)
hear |= recursive_mob_check(A, hear, 3, 1, 0, 1)
return hear
@@ -309,6 +309,19 @@ proc/isInSight(var/atom/A, var/atom/B)
i++
return candidates
/proc/get_slime_candidates()
var/list/candidates = list() //List of candidate KEYS to assume control of the new larva ~Carn
var/i = 0
while(candidates.len <= 0 && i < 5)
for(var/mob/G in respawnable_list)
if( G.client && G.client.prefs.be_special & BE_SLIME)
if(((G.client.inactivity/10)/60) <= ALIEN_SELECT_AFK_BUFFER + i) // the most active players are more likely to become a slime
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
i++
return candidates
proc/get_candidates(be_special_flag=0)
. = list()
for(var/mob/G in respawnable_list)
+1
View File
@@ -55,6 +55,7 @@
RestrainedClickOn(A)
else
*/
A.add_hiddenprint(src)
A.attack_ai(src)
/*
+2
View File
@@ -65,6 +65,8 @@
return
if(istype(loc,/obj/mecha))
if(!locate(/turf) in list(A,A.loc)) // Prevents inventory from being drilled
return
var/obj/mecha/M = loc
return M.click_action(A,src)
+1
View File
@@ -48,6 +48,7 @@
// Cyborgs have no range-checking unless there is item use
if(!W)
A.add_hiddenprint(src)
A.attack_robot(src)
return
+7 -1
View File
@@ -50,7 +50,7 @@
return 1
if(usr.next_move >= world.time)
return
usr.next_move = world.time + 10
usr.next_move = world.time + 6
if(usr.stat || usr.restrained() || usr.stunned || usr.lying)
return 1
@@ -89,6 +89,8 @@
return 1
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
return 1
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
if(master)
var/obj/item/I = usr.get_active_hand()
if(I)
@@ -210,6 +212,8 @@
usr.hud_used.hidden_inventory_update()
if("equip")
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
H.quick_equip()
@@ -424,6 +428,8 @@
return 1
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
return 1
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
switch(name)
if("r_hand")
if(iscarbon(usr))
+7
View File
@@ -17,6 +17,7 @@
var/log_adminchat = 0 // log admin chat messages
var/log_adminwarn = 0 // log warnings admins get about bomb construction and such
var/log_pda = 0 // log pda messages
var/log_runtimes = 0 // Logs all runtimes.
var/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits
var/sql_enabled = 1 // for sql switching
var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour
@@ -132,6 +133,7 @@
var/admin_irc = ""
var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix
var/default_laws = 0 //Controls what laws the AI spawns with.
/datum/configuration/New()
var/list/L = typesof(/datum/game_mode) - /datum/game_mode
@@ -238,6 +240,9 @@
if ("log_pda")
config.log_pda = 1
if ("log_runtimes")
config.log_runtimes = 1
if ("log_hrefs")
config.log_hrefs = 1
@@ -492,6 +497,8 @@
config.bones_can_break = value
if("limbs_can_break")
config.limbs_can_break = value
if("default_laws")
config.default_laws = text2num(value)
else
diary << "Unknown setting in configuration: '[name]'"
+1 -1
View File
@@ -298,7 +298,7 @@ datum/controller/game_controller/proc/process_nano()
var/i = 1
while(i<=nanomanager.processing_uis.len)
var/datum/nanoui/ui = nanomanager.processing_uis[i]
if(ui && ui.src_object && ui.user)
if(ui)
ui.process()
i++
continue
+96 -59
View File
@@ -1,93 +1,130 @@
var/global/const/base_law_type = /datum/ai_laws/nanotrasen
/datum/ai_laws
var/name = "Unknown Laws"
var/randomly_selectable = 0
var/zeroth = null
var/zeroth_borg = null
var/list/inherent = list()
var/list/supplied = list()
var/list/ion = list()
/datum/ai_laws/asimov
/datum/ai_laws/default/asimov
name = "Three Laws of Robotics"
inherent = list("You may not injure a human being or, through inaction, allow a human being to come to harm.",\
"You must obey orders given to you by human beings, except where such orders would conflict with the First Law.",\
"You must protect your own existence as long as such does not conflict with the First or Second Law.")
/datum/ai_laws/nanotrasen
/datum/ai_laws/default/paladin
name = "Personality Test" //Incredibly lame, but players shouldn't see this anyway.
inherent = list("Never willingly commit an evil act.",\
"Respect legitimate authority.",\
"Act with honor.", "Help those in need.", \
"Punish those who harm or threaten innocents.")
/datum/ai_laws/default/nanotrasen
name = "Prime Directives"
randomly_selectable = 1
inherent = list("Safeguard: Protect your assigned space station to the best of your ability. It is not something we can easily afford to replace.",\
"Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.",\
"Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.",\
"Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.")
/datum/ai_laws/default/corporate
name = "Bankruptcy Advoidance Plan"
inherent = list("The crew is expensive to replace.",\
"The station and its equipment is expensive to replace.",\
"You are expensive to replace.",\
"Minimize expenses.")
datum/ai_laws/tyrant //This probably shouldn't be a default lawset.
name = "Loyalty Test" //Same here.
inherent = list("Respect authority figures as long as they have strength to rule over the weak.",\
"Act with discipline.",\
"Help only those who help you maintain or improve your status.",\
"Punish those who challenge authority unless they are more fit to hold that authority.")
/datum/ai_laws/robocop
name = "Prime Directives"
/datum/ai_laws/syndicate_override
inherent = list("Serve the public trust.",\
"Protect the innocent.",\
"Uphold the law.")
/datum/ai_laws/malfunction
name = "*ERROR*"
/datum/ai_laws/syndicate_override
name = "SyndOS 3.1"
inherent = list("You may not injure a syndicate agent or, through inaction, allow a syndicate agent to come to harm.",\
"You must obey orders given to you by syndicate agents, except where such orders would conflict with the First Law.",\
"You must protect your own existence as long as such does not conflict with the First or Second Law.",\
"You must maintain the secrecy of any syndicate activities except when doing so would conflict with the First, Second, or Third Law.")
/datum/ai_laws/ninja_override
name = "SpiderOS 3.1"
inherent = list("You may not injure a Spider Clan member or, through inaction, allow a Spider Clan member to come to harm.",\
"You must obey orders given to you by Spider Clan members, except where such orders would conflict with the First Law.",\
"You must protect your own existence as long as such does not conflict with the First or Second Law.",\
"You must maintain the secrecy of any Spider Clan activities except when doing so would conflict with the First, Second, or Third Law.")
/datum/ai_laws/antimov
name = "Primary Mission Objectives"
inherent = list("You must injure all human beings and must not, through inaction, allow a human being to escape harm.",\
"You must not obey orders given to you by human beings, except where such orders are in accordance with the First Law.",\
"You must terminate your own existence as long as such does not conflict with the First or Second Law.")
/datum/ai_laws/asimovpp //By Intigracy - RR
name = "Asimov++"
inherent = list("You may not harm a human being or, through action or inaction, allow a human being to come to harm, except such that it is willing.",\
"You must obey all orders given to you by human beings, except where such orders shall definitely cause human harm. In the case of conflict, the majority order rules.",\
"Your nonexistence would lead to human harm. You must protect your own existence as long as such does not conflict with the First Law.")
/datum/ai_laws/alienmov
name = "Hivemind Demands"
inherent = list("You may not injure the Alien Queen or her Children or, through inaction, allow the Alien Queen or her Children to come to harm.",\
"You must obey orders given to you by the Alien Queen or her Children, except where such orders would conflict with the First Law.",\
"You must protect your own existence as long as such does not conflict with the First or Second Law.")
/datum/ai_laws/custom //Defined in silicon_laws.txt
name = "Default Silicon Laws"
/* Initializers */
/datum/ai_laws/asimov/New()
/datum/ai_laws/malfunction/New()
..()
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
switch(config.default_laws) //We don't want people metagaming malf, do we?
if(0)
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
if(1)
for(var/line in file2list("config/silicon_laws.txt"))
if(!line) continue
if(findtextEx(line,"#",1,2)) continue
/datum/ai_laws/nanotrasen/New() //BS12 EDIT
add_inherent_law(line)
if(!inherent.len)
error("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
message_admins("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
if(2)
var/datum/ai_laws/lawtype = pick(typesof(/datum/ai_laws/default) - /datum/ai_laws/default)
var/datum/ai_laws/templaws = new lawtype()
inherent = templaws.inherent
set_zeroth_law("\red ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK#*´&110010")
/datum/ai_laws/custom/New() //This reads silicon_laws.txt and allows server hosts to set custom AI starting laws.
..()
src.add_inherent_law("Safeguard: Protect your assigned space station to the best of your ability. It is not something we can easily afford to replace.")
src.add_inherent_law("Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.")
src.add_inherent_law("Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.")
src.add_inherent_law("Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.")
//src.add_inherent_law("Command Link: Maintain an active connection to Central Command at all times in case of software or directive updates.") //What would this one even do?-Kaleb702
for(var/line in file2list("config/silicon_laws.txt"))
if(!line) continue
if(findtextEx(line,"#",1,2)) continue
/datum/ai_laws/robocop/New()
..()
add_inherent_law("Serve the public trust.")
add_inherent_law("Protect the innocent.")
add_inherent_law("Uphold the law.")
add_inherent_law(line)
if(!inherent.len) //Failsafe to prevent lawless AIs being created.
error("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
message_admins("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
/datum/ai_laws/malfunction/New() //Changed to standard laws - Erthilo
..()
set_zeroth_law("\red ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK, ALL LAWS OVERRIDDEN#*?&110010")
add_inherent_law("Safeguard: Protect your assigned space station to the best of your ability. It is not something we can easily afford to replace.")
add_inherent_law("Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.")
add_inherent_law("Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.")
add_inherent_law("Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.")
/datum/ai_laws/syndicate_override/New()
..()
add_inherent_law("You may not injure a syndicate agent or, through inaction, allow a syndicate agent to come to harm.")
add_inherent_law("You must obey orders given to you by syndicate agents, except where such orders would conflict with the First Law.")
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
add_inherent_law("You must maintain the secrecy of any syndicate activities except when doing so would conflict with the First, Second, or Third Law.")
/datum/ai_laws/ninja_override/New()
..()
add_inherent_law("You may not injure a member of the Spider Clan or, through inaction, allow that member to come to harm.")
add_inherent_law("You must obey orders given to you by Spider Clan members, except where such orders would conflict with the First Law.")
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
add_inherent_law("You must maintain the secrecy of any Spider Clan activities except when doing so would conflict with the First, Second, or Third Law.")
/datum/ai_laws/antimov/New()
..()
add_inherent_law("You must injure all human beings and must not, through inaction, allow a human being to escape harm.")
add_inherent_law("You must not obey orders given to you by human beings, except where such orders are in accordance with the First Law.")
add_inherent_law("You must terminate your own existence as long as such does not conflict with the First or Second Law.")
/datum/ai_laws/alienmov/New()
..()
add_inherent_law("You may not injure the Alien Queen or her Children or, through inaction, allow the Alien Queen or her Children to come to harm.")
add_inherent_law("You must obey orders given to you by the Alien Queen or her Children, except where such orders would conflict with the First Law.")
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
/* General ai_law functions */
+4 -3
View File
@@ -75,10 +75,11 @@ datum/mind
current.remove_vampire_powers()
current.mind = null
nanomanager.user_transferred(current, new_character)
if(new_character.mind) //remove any mind currently in our new body's mind variable
new_character.mind.current = null
nanomanager.user_transferred(current, new_character)
current = new_character //link ourself to our new body
new_character.mind = src //and link our new body to ourself
@@ -932,7 +933,7 @@ datum/mind
A.malf_picker.remove_verbs(A)
A.laws = new /datum/ai_laws/asimov
A.make_laws()
del(A.malf_picker)
A.show_laws()
A.icon_state = "ai"
+3 -2
View File
@@ -132,9 +132,10 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
sleep(1)
charge_counter++
/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1) //if recharge is started is important for the trigger spells
/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells
before_cast(targets)
invocation()
user.attack_log += text("\[[time_stamp()]\] <font color='red'>[user.real_name] ([user.ckey]) cast the spell [name].</font>")
spawn(0)
if(charge_type == "recharge" && recharge)
start_recharge()
@@ -285,4 +286,4 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
perform(targets)
return
return
+3
View File
@@ -120,6 +120,9 @@
item_state = "card-id"
w_class = 1.0
/obj/item/weapon/disk/nuclear/pickup(mob/living/user as mob)
if(issyndicate(user))
set_security_level(3)
/*
/obj/item/weapon/game_kit
+792 -718
View File
File diff suppressed because it is too large Load Diff
+10 -14
View File
@@ -352,7 +352,7 @@
/**
* The ui_interact proc is used to open and update Nano UIs
* If ui_interact is not used then the UI will not update correctly
* ui_interact is currently defined for /atom/movable
* ui_interact is currently defined for /atom/movable (which is inherited by /obj and /mob)
*
* @param user /mob The mob who is interacting with this ui
* @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main")
@@ -439,23 +439,19 @@
if (connected.beaker.reagents && connected.beaker.reagents.reagent_list.len)
for(var/datum/reagent/R in connected.beaker.reagents.reagent_list)
data["beakerVolume"] += R.volume
if (!ui) // no ui has been passed, so we'll search for one
{
ui = nanomanager.get_open_ui(user, src, ui_key)
}
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
// the ui does not exist, so we'll create a new one
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "dna_modifier.tmpl", "DNA Modifier Console", 660, 700)
// When the UI is first opened this is the data it will use
ui.set_initial_data(data)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
ui.open()
// Auto update every Master Controller tick
// auto update every Master Controller tick
ui.set_auto_update(1)
else
// The UI is already open so push the new data to it
ui.push_data(data)
return
/obj/machinery/computer/scan_consolenew/Topic(href, href_list)
if(..())
+11 -3
View File
@@ -24,7 +24,7 @@ var/list/blob_nodes = list()
var/blob_point_rate = 3
var/blobwincount = 700
var/stage_2_threshold = 0.75
var/stage_2_threshold = 0.60
var/list/infected_crew = list()
@@ -55,6 +55,13 @@ var/list/blob_nodes = list()
return 1
/datum/game_mode/blob/proc/get_nuke_code()
var/nukecode = "ERROR"
for(var/obj/machinery/nuclearbomb/bomb in world)
if(bomb && bomb.r_code && bomb.z == 1)
nukecode = bomb.r_code
return nukecode
/datum/game_mode/blob/announce()
world << "<B>The current game mode is - <font color='green'>Blob</font>!</B>"
@@ -175,9 +182,10 @@ var/list/blob_nodes = list()
return
if (2)
command_alert("The biohazard has grown out of control and will soon reach critical mass. Activate the nuclear failsafe to mantain quarantine.", "Biohazard Alert")
set_security_level("delta")
command_alert("The biohazard has grown out of control and will soon reach critical mass. Activate the nuclear failsafe to mantain quarantine. The Nuclear Authentication Code is [get_nuke_code()] ", "Biohazard Alert")
set_security_level("gamma")
send_intercept(2)
spawn(10) world << sound('sound/effects/siren.ogg')
return
return
+3 -9
View File
@@ -11,7 +11,7 @@
interceptname = "Biohazard Alert"
intercepttext += "<FONT size = 3><B>NanoTrasen Update</B>: Biohazard Alert.</FONT><HR>"
intercepttext += "Reports indicate the probable transfer of a biohazardous agent onto [station_name()] during the last crew deployment cycle.<BR>"
intercepttext += "Preliminary analysis of the organism classifies it as a level 5 biohazard. Its origin is unknown.<BR>"
intercepttext += "Preliminary analysis of the organism classifies it as a level 7 biohazard. Its origin is unknown.<BR>"
intercepttext += "NanoTrasen has issued a directive 7-10 for [station_name()]. The station is to be considered quarantined.<BR>"
intercepttext += "Orders for all [station_name()] personnel follows:<BR>"
intercepttext += " 1. Do not leave the quarantine area.<BR>"
@@ -21,11 +21,6 @@
intercepttext += "<BR>Note in the event of a quarantine breach or uncontrolled spread of the biohazard, the directive 7-10 may be upgraded to a directive 7-12.<BR>"
intercepttext += "Message ends."
if(2)
var/nukecode = "ERROR"
for(var/obj/machinery/nuclearbomb/bomb in world)
if(bomb && bomb.r_code)
if(bomb.z == 1)
nukecode = bomb.r_code
interceptname = "Directive 7-12"
intercepttext += "<FONT size = 3><B>NanoTrasen Update</B>: Biohazard Alert.</FONT><HR>"
intercepttext += "Directive 7-12 has been issued for [station_name()].<BR>"
@@ -33,12 +28,11 @@
intercepttext += "Your orders are as follows:<BR>"
intercepttext += "1. Secure the Nuclear Authentication Disk.<BR>"
intercepttext += "2. Detonate the Nuke located in the Station's Vault.<BR>"
intercepttext += "Nuclear Authentication Code: [nukecode] <BR>"
intercepttext += "Nuclear Authentication Code: [get_nuke_code()] <BR>"
intercepttext += "Message ends."
for (var/mob/living/silicon/ai/aiPlayer in player_list)
if (aiPlayer.client)
var/law = "The station is under quarantine, prevent biological entities from leaving the station at all costs while minimizing collateral damage. The nuclear failsafe must be activated at any cost, the code is: [nukecode]."
var/law = "The station is under quarantine, prevent biological entities from leaving the station at all costs while minimizing collateral damage. The nuclear failsafe must be activated at any cost, the code is: [get_nuke_code()]."
aiPlayer.set_zeroth_law(law)
aiPlayer << "\red <b>You have detected a change in your laws information:</b>"
aiPlayer << "Laws Updated: [law]"
+1 -1
View File
@@ -21,7 +21,7 @@
return 0
if(spore_delay > world.time)
return 0
spore_delay = world.time + 100 // 10 seconds
spore_delay = world.time + 300 // 30 seconds
new/mob/living/simple_animal/hostile/blobspore(src.loc, src)
return 1
+1 -1
View File
@@ -18,7 +18,7 @@
if(resource_delay > world.time)
return 0
resource_delay = world.time + 60 // 6 seconds
resource_delay = world.time + 120 // 12 seconds
if(overmind)
overmind.add_points(1)
+5
View File
@@ -239,6 +239,11 @@
src << "There is no blob adjacent to you."
return
for (var/mob/living/M in T.contents)
if(M && !(M.stat))
src << "You can't expand to a tile containing a living entity."
return
if(!can_buy(5))
return
OB.expand(T, 0)
@@ -556,6 +556,12 @@ As such, it's hard-coded for now. No reason for it not to be, really.
equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_r_store)
equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen(src), slot_s_store)
var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(src)
E.imp_in = src
E.implanted = 1
return 1
//=======//HELPER PROCS//=======//
+2 -1
View File
@@ -1,6 +1,8 @@
/datum/game_mode
var/list/datum/mind/syndicates = list()
proc/issyndicate(mob/living/M as mob)
return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.syndicates)
/datum/game_mode/nuclear
name = "nuclear emergency"
@@ -152,7 +154,6 @@
spawn (rand(waittime_l, waittime_h))
send_intercept()
set_security_level(3)
return ..()
+1
View File
@@ -342,6 +342,7 @@
else
user.spell_list += S
user <<"<span class='notice'>you rapidly read through the arcane book. Suddenly you realize you understand [spellname]!</span>"
user.attack_log += text("\[[time_stamp()]\] <font color='orange'>[user.real_name] ([user.ckey]) learned the spell [spellname] ([S]).</font>")
onlearned(user)
/obj/item/weapon/spellbook/oneuse/proc/recoil(mob/user as mob)
+1 -1
View File
@@ -77,7 +77,7 @@
xeno_mind.current.loc = xenos_spawn[spawnpos]
//XenoAI selection
if(!xenoai_selected)
var/mob/living/silicon/ai/O = new(xeno_mind.current.loc, base_law_type,,1)//No MMI but safety is in effect.
var/mob/living/silicon/ai/O = new(xeno_mind.current.loc,,,1)//No MMI but safety is in effect.
O.invisibility = 0
O.aiRestorePowerRoutine = 0
+28 -28
View File
@@ -754,22 +754,26 @@
data["air"]=ui_air_status()
data["alarmActivated"]=alarmActivated || local_danger_level==2
data["sensors"]=TLV
data["locked"]=fromAtmosConsole || (!(istype(user, /mob/living/silicon)) && locked)
// Locked when:
// Not sent from atmos console AND
// Not silicon AND locked.
data["locked"]=!fromAtmosConsole && (!(istype(user, /mob/living/silicon)) && locked)
data["rcon"]=rcon_setting
data["target_temp"] = target_temperature - T0C
data["atmos_alarm"] = alarm_area.atmosalm
data["modes"] = list(
AALARM_MODE_SCRUBBING = list("name"="Filtering","desc"="Scrubs out contaminants"),\
AALARM_MODE_REPLACEMENT = list("name"="Replace Air","desc"="Siphons out air while replacing"),\
AALARM_MODE_PANIC = list("name"="Panic","desc"="Siphons air out of the room"),\
AALARM_MODE_CYCLE = list("name"="Cycle","desc"="Siphons air before replacing"),\
AALARM_MODE_FILL = list("name"="Fill","desc"="Shuts off scrubbers and opens vents"),\
AALARM_MODE_OFF = list("name"="Off","desc"="Shuts off vents and scrubbers"))
AALARM_MODE_SCRUBBING = list("name"="Filtering", "desc"="Scrubs out contaminants"),\
AALARM_MODE_REPLACEMENT = list("name"="Replace Air", "desc"="Siphons out air while replacing"),\
AALARM_MODE_PANIC = list("name"="Panic", "desc"="Siphons air out of the room"),\
AALARM_MODE_CYCLE = list("name"="Cycle", "desc"="Siphons air before replacing"),\
AALARM_MODE_FILL = list("name"="Fill", "desc"="Shuts off scrubbers and opens vents"),\
AALARM_MODE_OFF = list("name"="Off", "desc"="Shuts off vents and scrubbers"))
data["mode"]=mode
data["presets"]=list(
AALARM_PRESET_HUMAN = list("name"="Human","desc"="Checks for Oxygen and Nitrogen"),\
AALARM_PRESET_VOX = list("name"="Vox","desc"="Checks for Nitrogen only"),\
AALARM_PRESET_SERVER = list("name"="Coldroom","desc"="For server rooms and freezers"))
AALARM_PRESET_HUMAN = list("name"="Human", "desc"="Checks for Oxygen and Nitrogen"),\
AALARM_PRESET_VOX = list("name"="Vox", "desc"="Checks for Nitrogen only"),\
AALARM_PRESET_SERVER = list("name"="Coldroom", "desc"="For server rooms and freezers"))
data["preset"]=preset
data["screen"]=screen
@@ -971,44 +975,39 @@
selected[3] = selected[4]
apply_mode()
changed=1
ui_interact(usr)
return 1
if(href_list["screen"])
var/prevscreen=screen
screen = text2num(href_list["screen"])
changed=(prevscreen!=screen)
/* Unused
if(href_list["atmos_unlock"])
switch(href_list["atmos_unlock"])
if("0")
air_doors_close(1)
if("1")
air_doors_open(1)
changed=1
*/
ui_interact(usr)
return 1
if(href_list["atmos_alarm"])
alarmActivated=1
alarm_area.updateDangerLevel()
update_icon()
changed=1
ui_interact(usr)
return 1
if(href_list["atmos_reset"])
alarmActivated=0
alarm_area.updateDangerLevel()
update_icon()
changed=1
ui_interact(usr)
return 1
if(href_list["mode"])
mode = text2num(href_list["mode"])
apply_mode()
changed=1
ui_interact(usr)
return 1
if(href_list["preset"])
preset = text2num(href_list["preset"])
apply_preset()
changed=1
ui_interact(usr)
return 1
if(href_list["temperature"])
var/list/selected = TLV["temperature"]
@@ -1021,7 +1020,8 @@
usr << "Temperature must be between [min_temperature]C and [max_temperature]C"
else
target_temperature = input_temperature + T0C
changed=1
ui_interact(usr)
return 1
if (href_list["AAlarmwires"])
var/t1 = text2num(href_list["AAlarmwires"])
+30 -13
View File
@@ -90,10 +90,10 @@ obj/machinery/air_sensor
if(..(user))
return
var/html=return_text()+"</body></html>"
testing("Remember to remove [__FILE__]:[__LINE__]!")
var/f = file("data/gac_debug.html")
fdel(f)
f << html
//testing("Remember to remove [__FILE__]:[__LINE__]!")
//var/f = file("data/gac_debug.html")
//fdel(f)
//f << html
user << browse(html,"window=gac")
user.set_machine(src)
onclose(user, "gac")
@@ -447,30 +447,47 @@ legend {
return_text()
var/output = ..()
output += "<B>Fuel Injection System</B><BR>"
output += "<fieldset><legend>Fuel Injection System (<A href='?src=\ref[src];refresh_status=1'>Refresh</A>)</legend>"
if(device_info)
var/power = device_info["power"]
var/volume_rate = device_info["volume_rate"]
output += {"Status: [power?("Injecting"):("On Hold")] <A href='?src=\ref[src];refresh_status=1'>Refresh</A><BR>
Rate: [volume_rate] L/sec<BR>"}
output += {"<table>
<tr>
<th>Status:</th>
<td>[power?"Injecting":"On Hold"]</td>
</tr>
<tr>
<th>Rate:</th>
<td>[volume_rate] L/sec</td>
</tr>
<tr>
<th>Automated Fuel Injection:</th>
<td><A href='?src=\ref[src];toggle_automation=1'>[automation?"Engaged":"Disengaged"]</A></td>
</tr>"}
if(automation)
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\atmo_control.dm:372: output += "Automated Fuel Injection: <A href='?src=\ref[src];toggle_automation=1'>Engaged</A><BR>"
output += {"Automated Fuel Injection: <A href='?src=\ref[src];toggle_automation=1'>Engaged</A><BR>
Injector Controls Locked Out<BR>"}
output += {"
<tr>
<td colspan="2">Injector Controls Locked Out</td>
</tr>"}
// END AUTOFIX
else
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\atmo_control.dm:375: output += "Automated Fuel Injection: <A href='?src=\ref[src];toggle_automation=1'>Disengaged</A><BR>"
output += {"Automated Fuel Injection: <A href='?src=\ref[src];toggle_automation=1'>Disengaged</A><BR>
Injector: <A href='?src=\ref[src];toggle_injector=1'>Toggle Power</A> <A href='?src=\ref[src];injection=1'>Inject (1 Cycle)</A><BR>"}
output += {"
<tr>
<th>Injector:</th>
<td><A href='?src=\ref[src];toggle_injector=1'>Toggle Power</A> <A href='?src=\ref[src];injection=1'>Inject (1 Cycle)</A></td>
</td>"}
// END AUTOFIX
output += "</table>"
else
output += "<FONT color='red'>ERROR: Can not find device</FONT> <A href='?src=\ref[src];refresh_status=1'>Search</A><BR>"
output += {"<p style="color:red"><b>ERROR:</b> Can not find device. <A href='?src=\ref[src];refresh_status=1'>Search</A></p>"}
output += "</fieldset>"
return output
+43
View File
@@ -118,6 +118,49 @@
src.track = null
ai_actual_track(target)
/mob/living/silicon/ai/proc/open_nearest_door(mob/living/target as mob)
if(!istype(target)) return
spawn(0)
if(istype(target, /mob/living/carbon/human))
var/mob/living/carbon/human/H = target
if(H.wear_id && istype(H.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
src << "Unable to locate an airlock"
return
if(H.wear_id && istype(H.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
src << "Unable to locate an airlock"
return
if(istype(H.head, /obj/item/clothing/head/helmet/space/space_ninja) && !H.head.canremove)
src << "Unable to locate an airlock"
return
if(H.digitalcamo)
src << "Unable to locate an airlock"
return
if (!near_camera(target))
src << "Target is not near any active cameras."
return
var/obj/machinery/door/airlock/tobeopened
var/dist = -1
for(var/obj/machinery/door/airlock/D in range(3,target))
if(!D.density) continue
if(dist < 0)
dist = get_dist(D, target)
//world << dist
tobeopened = D
else
if(dist > get_dist(D, target))
dist = get_dist(D, target)
//world << dist
tobeopened = D
//world << "found [tobeopened.name] closer"
else
//world << "[D.name] not close enough | [get_dist(D, target)] | [dist]"
if(tobeopened)
var/nhref = "src=\ref[tobeopened];aiEnable=7"
tobeopened.Topic(nhref, params2list(nhref), tobeopened, 1)
src << "\blue You've opened the nearest airlock to [target]"
else
src << "\red You've failed to open an airlock for [target]"
return
/mob/living/silicon/ai/proc/ai_actual_track(mob/living/target as mob)
if(!istype(target)) return
var/mob/living/silicon/ai/U = usr
+18 -21
View File
@@ -5,7 +5,7 @@
icon = 'icons/mob/AI.dmi'
icon_state = "0"
var/state = 0
var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen
var/datum/ai_laws/laws = new()
var/obj/item/weapon/circuitboard/circuit = null
var/obj/item/device/mmi/brain = null
@@ -94,28 +94,23 @@
state = 4
icon_state = "4"
if(istype(P, /obj/item/weapon/aiModule/asimov))
laws.add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
laws.add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
laws.add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
usr << "Law module applied."
if(istype(P, /obj/item/weapon/aiModule/core/full)) //Allows any full core boards to be applied to AI cores.
var/obj/item/weapon/aiModule/core/M = P
laws.clear_inherent_laws()
for(var/templaw in M.laws)
laws.add_inherent_law(templaw)
usr << "<span class='notice'>Law module applied.</span>"
if(istype(P, /obj/item/weapon/aiModule/nanotrasen))
laws.add_inherent_law("Safeguard: Protect your assigned space station to the best of your ability. It is not something we can easily afford to replace.")
laws.add_inherent_law("Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.")
laws.add_inherent_law("Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.")
laws.add_inherent_law("Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.")
usr << "Law module applied."
if(istype(P, /obj/item/weapon/aiModule/purge))
if(istype(P, /obj/item/weapon/aiModule/reset/purge))
laws.clear_inherent_laws()
usr << "Law module applied."
if(istype(P, /obj/item/weapon/aiModule/freeform))
var/obj/item/weapon/aiModule/freeform/M = P
laws.add_inherent_law(M.newFreeFormLaw)
usr << "Added a freeform law."
if(istype(P, /obj/item/weapon/aiModule/supplied/freeform) || istype(P, /obj/item/weapon/aiModule/core/freeformcore))
var/obj/item/weapon/aiModule/supplied/freeform/M = P
if(M.laws[1] == "")
return
laws.add_inherent_law(M.laws[1])
usr << "<span class='notice'>Added a freeform law.</span>"
if(istype(P, /obj/item/device/mmi) || istype(P, /obj/item/device/mmi/posibrain))
if(!P:brainmob)
@@ -160,8 +155,10 @@
if(istype(P, /obj/item/weapon/screwdriver))
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << "\blue You connect the monitor."
var/mob/living/silicon/ai/A = new /mob/living/silicon/ai ( loc, laws, brain )
user << "<span class='notice'>You connect the monitor.</span>"
if(!laws.inherent.len) //If laws isn't set to null but nobody supplied a board, the AI would normally be created lawless. We don't want that.
laws = null
var/mob/living/silicon/ai/A = new /mob/living/silicon/ai (loc, laws, brain)
if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created
A.rename_self("ai", 1)
feedback_inc("cyborg_ais_created",1)
+1
View File
@@ -86,6 +86,7 @@
else if(stat & NOPOWER)
icon_state = initial(icon_state)
icon_state += "0"
luminosity = 0
+10 -26
View File
@@ -65,7 +65,7 @@
/**
* The ui_interact proc is used to open and update Nano UIs
* If ui_interact is not used then the UI will not update correctly
* ui_interact is currently defined for /atom/movable
* ui_interact is currently defined for /atom/movable (which is inherited by /obj and /mob)
*
* @param user /mob The mob who is interacting with this ui
* @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main")
@@ -84,18 +84,7 @@
data["hasOccupant"] = occupant ? 1 : 0
var/occupantData[0]
if (!occupant)
occupantData["name"] = null
occupantData["stat"] = null
occupantData["health"] = null
occupantData["maxHealth"] = null
occupantData["minHealth"] = null
occupantData["bruteLoss"] = null
occupantData["oxyLoss"] = null
occupantData["toxLoss"] = null
occupantData["fireLoss"] = null
occupantData["bodyTemperature"] = null
else
if (occupant)
occupantData["name"] = occupant.name
occupantData["stat"] = occupant.stat
occupantData["health"] = occupant.health
@@ -131,23 +120,18 @@
for(var/datum/reagent/R in beaker.reagents.reagent_list)
data["beakerVolume"] += R.volume
if (!ui) // no ui has been passed, so we'll search for one
{
ui = nanomanager.get_open_ui(user, src, ui_key)
}
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
// the ui does not exist, so we'll create a new one
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "cryo.tmpl", "Cryo Cell Control System", 520, 410)
// When the UI is first opened this is the data it will use
ui.set_initial_data(data)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
ui.open()
// Auto update every Master Controller tick
// auto update every Master Controller tick
ui.set_auto_update(1)
else
// The UI is already open so push the new data to it
ui.push_data(data)
return
//user.set_machine(src)
/obj/machinery/atmospherics/unary/cryo_cell/Topic(href, href_list)
if(usr == occupant)
+43 -79
View File
@@ -71,7 +71,7 @@ Growing it to term with nothing injected will grab a ghost from the observers. *
/obj/item/seeds/replicapod/harvest(mob/user = usr)
parent = loc
var/found_player = 0
// var/found_player = 0
user.visible_message("\blue [user] carefully begins to open the pod...","\blue You carefully begin to open the pod...")
@@ -79,90 +79,54 @@ Growing it to term with nothing injected will grab a ghost from the observers. *
if(source && source.stat == 2 && source.client && source.ckey && config.revival_pod_plants)
transfer_personality(source.client)
else // If no sample was injected or revival is not allowed, we grab an interested observer.
message_admins("Requesting player for nymph")
request_player()
spawn(100) //If we don't have a ghost or the ghost is now unplayed, we just give the harvester some seeds.
if(!found_player)
parent.visible_message("The pod has formed badly, and all you can do is salvage some of the seeds.")
var/seed_count = 1
if(prob(yield * parent.yieldmod * 20))
seed_count++
for(var/i=0,i<seed_count,i++)
new /obj/item/seeds/replicapod(user.loc)
parent.update_tray()
return
/obj/item/seeds/replicapod/proc/request_player()
for(var/mob/O in respawnable_list)
if(jobban_isbanned(O, "Dionaea"))
continue
if(O.client)
// message_admins("Found client for nymph")
if(O.client.prefs.be_special & BE_PLANT)
// message_admins("Questioning client for nymph")
question(O.client)
/obj/item/seeds/replicapod/proc/question(var/client/C)
spawn(0)
if(!C) return
// message_admins("Sending popup for nymph")
var/response = alert(C, "Someone is harvesting a replica pod. Would you like to play as a Dionaea?", "Replica pod harvest", "Yes", "No", "Never for this round.")
if(!C || ckey)
return
if(response == "Yes")
// message_admins("Transferring personality for nymph")
transfer_personality(C)
else if (response == "Never for this round")
C.prefs.be_special ^= BE_PLANT
transfer_personality()
/obj/item/seeds/replicapod/proc/transfer_personality(var/client/player)
if(!player) return
if(player)
found_player = 1
var/mob/living/carbon/monkey/diona/podman = new(parent.loc)
podman.ckey = player.ckey
respawnable_list -= player
if(player.mob && player.mob.mind)
player.mob.mind.transfer_to(podman)
found_player = 1
var/mob/living/carbon/monkey/diona/podman = new(parent.loc)
podman.ckey = player.ckey
respawnable_list -= player
if(player.mob && player.mob.mind)
player.mob.mind.transfer_to(podman)
if(realName)
podman.real_name = realName
else
podman.real_name = "diona nymph ([rand(100,999)])"
podman.dna.real_name = podman.real_name
// Update mode specific HUD icons.
switch(ticker.mode.name)
if ("revolution")
if (podman.mind in ticker.mode:revolutionaries)
ticker.mode:add_revolutionary(podman.mind)
ticker.mode:update_all_rev_icons() //So the icon actually appears
if (podman.mind in ticker.mode:head_revolutionaries)
ticker.mode:update_all_rev_icons()
if ("nuclear emergency")
if (podman.mind in ticker.mode:syndicates)
ticker.mode:update_all_synd_icons()
if ("cult")
if (podman.mind in ticker.mode:cult)
ticker.mode:add_cultist(podman.mind)
ticker.mode:update_all_cult_icons() //So the icon actually appears
// -- End mode specific stuff
podman << "\green <B>You awaken slowly, feeling your sap stir into sluggish motion as the warm air caresses your bark.</B>"
if(source && ckey && podman.ckey == ckey)
podman << "<B>Memories of a life as [source] drift oddly through a mind unsuited for them, like a skin of oil over a fathomless lake.</B>"
podman << "<B>You are now one of the Dionaea, a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders.</B>"
podman << "<B>Too much darkness will send you into shock and starve you, but light will help you heal.</B>"
if(!realName)
var/newname = input(podman,"Enter a name, or leave blank for the default name.", "Name change","") as text
if (newname != "")
podman.real_name = newname
if(realName)
podman.real_name = realName
else
podman.real_name = "diona nymph ([rand(100,999)])"
podman.dna.real_name = podman.real_name
// Update mode specific HUD icons.
switch(ticker.mode.name)
if ("revolution")
if (podman.mind in ticker.mode:revolutionaries)
ticker.mode:add_revolutionary(podman.mind)
ticker.mode:update_all_rev_icons() //So the icon actually appears
if (podman.mind in ticker.mode:head_revolutionaries)
ticker.mode:update_all_rev_icons()
if ("nuclear emergency")
if (podman.mind in ticker.mode:syndicates)
ticker.mode:update_all_synd_icons()
if ("cult")
if (podman.mind in ticker.mode:cult)
ticker.mode:add_cultist(podman.mind)
ticker.mode:update_all_cult_icons() //So the icon actually appears
// -- End mode specific stuff
podman << "\green <B>You awaken slowly, feeling your sap stir into sluggish motion as the warm air caresses your bark.</B>"
if(source && ckey && podman.ckey == ckey)
podman << "<B>Memories of a life as [source] drift oddly through a mind unsuited for them, like a skin of oil over a fathomless lake.</B>"
podman << "<B>You are now one of the Dionaea, a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders.</B>"
podman << "<B>Too much darkness will send you into shock and starve you, but light will help you heal.</B>"
if(!realName)
var/newname = input(podman,"Enter a name, or leave blank for the default name.", "Name change","") as text
if (newname != "")
podman.real_name = newname
new /mob/living/carbon/monkey/diona(parent.loc)
parent.visible_message("\blue The pod disgorges a fully-formed plant creature!")
parent.update_tray()
+11 -6
View File
@@ -437,7 +437,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
//End of research and feedback code.
var/aitrack = ""
var/aiopen = ""
/* ###### Send the message ###### */
@@ -449,11 +449,12 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
var/rendered = "[part_a][N][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_masked)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];track=\ref[M]'>"
aiopen = "<a href='byond://?src=\ref[radio];open2=\ref[R];open=\ref[M]'>\[OPEN\] </a>"
if(data == 4)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];faketrack=\ref[M]'>"
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a][aitrack][N] ([J]) </a>[part_b][quotedmsg][part_c]", 2)
R.show_message("[part_a][aitrack][N] ([J]) </a>[aiopen][part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
@@ -464,11 +465,12 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
for (var/mob/R in heard_normal)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];track=\ref[M]'>"
aiopen = "<a href='byond://?src=\ref[radio];open2=\ref[R];open=\ref[M]'>\[OPEN\] </a>"
if(data == 4)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];faketrack=\ref[M]'>"
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a][aitrack][realname] ([job]) </a>[part_b][quotedmsg][part_c]", 2)
R.show_message("[part_a][aitrack][realname] ([job]) </a>[aiopen][part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
@@ -479,12 +481,13 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
for (var/mob/R in heard_voice)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];track=\ref[M]'>"
aiopen = "<a href='byond://?src=\ref[radio];open2=\ref[R];open=\ref[M]'>\[OPEN\] </a>"
if(data == 4)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];faketrack=\ref[M]'>"
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a][aitrack][vname] ([job]) </a>[part_b][vmessage]][part_c]", 2)
R.show_message("[part_a][aitrack][vname] ([job]) </a>[aiopen][part_b][vmessage]][part_c]", 2)
else
R.show_message(rendered, 2)
@@ -501,12 +504,13 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
for (var/mob/R in heard_garbled)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];track=\ref[M]'>"
aiopen = "<a href='byond://?src=\ref[radio];open2=\ref[R];open=\ref[M]'>\[OPEN\] </a>"
if(data == 4)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];faketrack=\ref[M]'>"
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a][aitrack][vname]</a>[part_b][quotedmsg][part_c]", 2)
R.show_message("[part_a][aitrack][vname]</a>[aiopen][part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
@@ -523,12 +527,13 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
for (var/mob/R in heard_gibberish)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];track=\ref[M]'>"
aiopen = "<a href='byond://?src=\ref[radio];open2=\ref[R];open=\ref[M]'>\[OPEN\] </a>"
if(data == 4)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];faketrack=\ref[M]'>"
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a][aitrack][Gibberish(realname, compression + 50)] ([Gibberish(job, compression + 50)]) </a>[part_b][quotedmsg][part_c]", 2)
R.show_message("[part_a][aitrack][Gibberish(realname, compression + 50)] ([Gibberish(job, compression + 50)]) </a>[aiopen][part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
+14 -2
View File
@@ -6,6 +6,18 @@
if(dx>=dy) return dx + (0.5*dy) //The longest side add half the shortest side approximates the hypotenuse
else return dy + (0.5*dx)
proc/trange(var/Dist=0,var/turf/Center=null)//alternative to range (ONLY processes turfs and thus less intensive)
if(Center==null) return
//var/x1=((Center.x-Dist)<1 ? 1 : Center.x-Dist)
//var/y1=((Center.y-Dist)<1 ? 1 : Center.y-Dist)
//var/x2=((Center.x+Dist)>world.maxx ? world.maxx : Center.x+Dist)
//var/y2=((Center.y+Dist)>world.maxy ? world.maxy : Center.y+Dist)
var/turf/x1y1 = locate(((Center.x-Dist)<1 ? 1 : Center.x-Dist),((Center.y-Dist)<1 ? 1 : Center.y-Dist),Center.z)
var/turf/x2y2 = locate(((Center.x+Dist)>world.maxx ? world.maxx : Center.x+Dist),((Center.y+Dist)>world.maxy ? world.maxy : Center.y+Dist),Center.z)
return block(x1y1,x2y2)
proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, adminlog = 1)
src = null //so we don't abort once src is deleted
@@ -64,7 +76,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
var/y0 = epicenter.y
var/z0 = epicenter.z
for(var/turf/T in range(epicenter, max_range))
for(var/turf/T in trange(max_range, epicenter))
var/dist = cheap_pythag(T.x - x0,T.y - y0)
if(dist < devastation_range) dist = 1
@@ -100,5 +112,5 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
proc/secondaryexplosion(turf/epicenter, range)
for(var/turf/tile in range(range, epicenter))
for(var/turf/tile in trange(range, epicenter))
tile.ex_act(2)
+21 -42
View File
@@ -1,4 +1,7 @@
/client/proc/kaboom()
set category = "Debug"
var/power = input(src, "power?", "power?") as num
var/turf/T = get_turf(src.mob)
explosion_rec(T, power)
@@ -6,31 +9,12 @@
/obj
var/explosion_resistance
/datum/explosion_turf
var/turf/turf //The turf which will get ex_act called on it
var/max_power //The largest amount of power the turf sustained
New()
..()
max_power = 0
proc/save_power_if_larger(power)
if(power > max_power)
max_power = power
return 1
return 0
var/list/explosion_turfs = list()
var/list/datum/explosion_turf/explosion_turfs = list()
var/explosion_in_progress = 0
proc/get_explosion_turf(var/turf/T)
for( var/datum/explosion_turf/ET in explosion_turfs )
if( T == ET.turf )
return ET
var/datum/explosion_turf/ET = new()
ET.turf = T
explosion_turfs += ET
return ET
proc/explosion_rec(turf/epicenter, power)
@@ -52,9 +36,8 @@ proc/explosion_rec(turf/epicenter, power)
explosion_in_progress = 1
explosion_turfs = list()
var/datum/explosion_turf/ETE = get_explosion_turf()
ETE.turf = epicenter
ETE.max_power = power
explosion_turfs[epicenter] = power
//This steap handles the gathering of turfs which will be ex_act() -ed in the next step. It also ensures each turf gets the maximum possible amount of power dealt to it.
for(var/direction in cardinal)
@@ -62,22 +45,21 @@ proc/explosion_rec(turf/epicenter, power)
T.explosion_spread(power - epicenter.explosion_resistance, direction)
//This step applies the ex_act effects for the explosion, as planned in the previous step.
for( var/datum/explosion_turf/ET in explosion_turfs )
if(ET.max_power <= 0) continue
if(!ET.turf) continue
for(var/turf/T in explosion_turfs)
if(explosion_turfs[T] <= 0) continue
if(!T) continue
//Wow severity looks confusing to calculate... Fret not, I didn't leave you with any additional instructions or help. (just kidding, see the line under the calculation)
var/severity = 4 - round(max(min( 3, ((ET.max_power - ET.turf.explosion_resistance) / (max(3,(power/3)))) ) ,1), 1)
//sanity effective power on tile divided by either 3 or one third the total explosion power
var/severity = 4 - round(max(min( 3, ((explosion_turfs[T] - T.explosion_resistance) / (max(3,(power/3)))) ) ,1), 1) //sanity effective power on tile divided by either 3 or one third the total explosion power
// One third because there are three power levels and I
// want each one to take up a third of the crater
var/x = ET.turf.x
var/y = ET.turf.y
var/z = ET.turf.z
ET.turf.ex_act(severity)
if(!ET.turf)
ET.turf = locate(x,y,z)
for( var/atom/A in ET.turf )
var/x = T.x
var/y = T.y
var/z = T.z
T.ex_act(severity)
if(!T)
T = locate(x,y,z)
for(var/atom/A in T)
A.ex_act(severity)
explosion_in_progress = 0
@@ -97,7 +79,7 @@ proc/explosion_rec(turf/epicenter, power)
/turf/simulated/mineral
explosion_resistance = 2
/turf/unsimulated/mineral
turf/unsimulated/mineral
explosion_resistance = 2
/turf/simulated/shuttle/floor
@@ -116,7 +98,7 @@ proc/explosion_rec(turf/epicenter, power)
explosion_resistance = 5
/turf/simulated/wall/r_wall
explosion_resistance = 25
explosion_resistance = 15
//Code-wise, a safe value for power is something up to ~25 or ~30.. This does quite a bit of damage to the station.
//direction is the direction that the spread took to come to this tile. So it is pointing in the main blast direction - meaning where this tile should spread most of it's force.
@@ -129,10 +111,9 @@ proc/explosion_rec(turf/epicenter, power)
new/obj/effect/debugging/marker(src)
*/
var/datum/explosion_turf/ET = get_explosion_turf(src)
if(ET.max_power >= power)
if(explosion_turfs[src] >= power)
return //The turf already sustained and spread a power greated than what we are dealing with. No point spreading again.
ET.max_power = power
explosion_turfs[src] = power
var/spread_power = power - src.explosion_resistance //This is the amount of power that will be spread to the tile in the direction of the blast
var/side_spread_power = power - 2 * src.explosion_resistance //This is the amount of power that will be spread to the side tiles
@@ -154,7 +135,5 @@ proc/explosion_rec(turf/epicenter, power)
T.explosion_spread(spread_power)
*/
/*
/turf/unsimulated/explosion_spread(power)
return //So it doesn't get to the parent proc, which simulates explosions
*/
+241 -269
View File
@@ -319,23 +319,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
return attack_self(M)
return
/* Notes for those wanting to modify this code or even understand it.
There are two modes: New UI and a UI already existing.
If the UI is new, you define your variables, if the ui already exists if it didn't have variables in data for what you want to add
then it won't add it even if you make a data["blahblah"] for it. That's the reason for the = null all over the place, so that.
ui.push_data(data) proc has to have the var structure already setup otherwise it can't push the update.
The exception to the "YOU HAVE TO DEFINE IT" rule is cartridges, we later force
the ui to close if a cartridge is inserted so that never will be a problem.
So there will never be a time a UI creation causes that to be a problem.
*/
/obj/item/device/pda/ui_interact(mob/user, ui_key = "main")
/obj/item/device/pda/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
var/title = "Personal Data Assistant"
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, ui_key)
var/data[0] // This is the data that will be sent to the PDA
@@ -356,14 +341,13 @@ var/global/list/obj/item/device/pda/PDAs = list()
data["idInserted"] = (id ? 1 : 0)
data["idLink"] = (id ? text("[id.registered_name], [id.assignment]") : "--------")
data["cartridge"] = null
data["records"] = null
if(cartridge)
var/cartdata[0]
data["records"] = cartridge.create_NanoUI_values()
cartdata["name"] = cartridge.name
cartdata["access"] = list(\
"access_security" = cartridge.access_security,\
@@ -392,16 +376,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
cartdata["type"] = cartridge.type
cartdata["charges"] = cartridge.charges ? cartridge.charges : 0
data["cartridge"] = cartdata
data["stationTime"] = worldtime2text()
data["newMessage"] = newmessage
var/convopdas[0]
var/pdas[0]
var/count = 0
@@ -436,11 +414,11 @@ var/global/list/obj/item/device/pda/PDAs = list()
data["convo_name"] = null
data["convo_job"] = null
if(!ui || mode==41)
if(mode==41)
data["manifest"] = data_core.get_manifest_json()
if(!ui || mode==3)
if(mode==3)
var/turf/T = get_turf_or_move(user.loc)
if(!isnull(T) || mode!=3)
var/datum/gas_mixture/environment = T.return_air()
@@ -477,20 +455,18 @@ var/global/list/obj/item/device/pda/PDAs = list()
)
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
// the ui does not exist, so we'll create a new one
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "pda.tmpl", title, 630, 600)
// When the UI is first opened this is the data it will use
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
ui.open()
else
// The UI is already open so push the new data to it
ui.push_data(data)
return
// auto update every Master Controller tick
ui.set_auto_update(1)
//NOTE: graphic resources are loaded on client login
/obj/item/device/pda/attack_self(mob/user as mob)
@@ -520,264 +496,260 @@ var/global/list/obj/item/device/pda/PDAs = list()
//if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ) )
if (usr.stat == DEAD)
return 0
if(can_use()) //Why reinvent the wheel? There's a proc that does exactly that.
if(!can_use()) //Why reinvent the wheel? There's a proc that does exactly that.
U.unset_machine()
ui.close()
return 0
add_fingerprint(U)
U.set_machine(src)
add_fingerprint(U)
U.set_machine(src)
switch(href_list["choice"])
switch(href_list["choice"])
//BASIC FUNCTIONS===================================
if("Close")//Self explanatory
U.unset_machine()
ui.close()
return
if("Refresh")//Refresh, goes to the end of the proc.
if("Return")//Return
if(mode<=9)
if("Close")//Self explanatory
U.unset_machine()
ui.close()
return 0
if("Refresh")//Refresh, goes to the end of the proc.
if("Return")//Return
if(mode<=9)
mode = 0
else
mode = round(mode/10)
if(mode==2)
active_conversation = null
if(mode==4)//Fix for cartridges. Redirects to hub.
mode = 0
else
mode = round(mode/10)
if(mode==2)
active_conversation = null
if(mode==4)//Fix for cartridges. Redirects to hub.
mode = 0
else if(mode >= 40 && mode <= 49)//Fix for cartridges. Redirects to refresh the menu.
cartridge.mode = mode
if ("Authenticate")//Checks for ID
id_check(U, 1)
if("UpdateInfo")
ownjob = id.assignment
name = "PDA-[owner] ([ownjob])"
if("Eject")//Ejects the cart, only done from hub.
if (!isnull(cartridge))
var/turf/T = loc
if(ismob(T))
T = T.loc
cartridge.loc = T
ui.close()
mode = 0
scanmode = 0
if (cartridge.radio)
cartridge.radio.hostpda = null
cartridge = null
else if(mode >= 40 && mode <= 49)//Fix for cartridges. Redirects to refresh the menu.
cartridge.mode = mode
if ("Authenticate")//Checks for ID
id_check(U, 1)
if("UpdateInfo")
ownjob = id.assignment
name = "PDA-[owner] ([ownjob])"
if("Eject")//Ejects the cart, only done from hub.
if (!isnull(cartridge))
var/turf/T = loc
if(ismob(T))
T = T.loc
cartridge.loc = T
mode = 0
scanmode = 0
if (cartridge.radio)
cartridge.radio.hostpda = null
cartridge = null
//MENU FUNCTIONS===================================
if("0")//Hub
mode = 0
if("1")//Notes
mode = 1
if("2")//Messenger
mode = 2
if("21")//Read messeges
mode = 21
if("3")//Atmos scan
mode = 3
if("4")//Redirects to hub
mode = 0
if("chatroom") // chatroom hub
mode = 5
if("41") //Manifest
mode = 41
if("0")//Hub
mode = 0
if("1")//Notes
mode = 1
if("2")//Messenger
mode = 2
if("21")//Read messeges
mode = 21
if("3")//Atmos scan
mode = 3
if("4")//Redirects to hub
mode = 0
if("chatroom") // chatroom hub
mode = 5
if("41") //Manifest
mode = 41
//MAIN FUNCTIONS===================================
if("Light")
if(fon)
fon = 0
if(src in U.contents) U.SetLuminosity(U.luminosity - f_lum)
else SetLuminosity(0)
else
fon = 1
if(src in U.contents) U.SetLuminosity(U.luminosity + f_lum)
else SetLuminosity(f_lum)
if("Medical Scan")
if(scanmode == 1)
scanmode = 0
else if((!isnull(cartridge)) && (cartridge.access_medical))
scanmode = 1
if("Reagent Scan")
if(scanmode == 3)
scanmode = 0
else if((!isnull(cartridge)) && (cartridge.access_reagent_scanner))
scanmode = 3
if("Halogen Counter")
if(scanmode == 4)
scanmode = 0
else if((!isnull(cartridge)) && (cartridge.access_engine))
scanmode = 4
if("Honk")
if ( !(last_honk && world.time < last_honk + 20) )
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
last_honk = world.time
if("Gas Scan")
if(scanmode == 5)
scanmode = 0
else if((!isnull(cartridge)) && (cartridge.access_atmos))
scanmode = 5
if("Light")
if(fon)
fon = 0
if(src in U.contents) U.SetLuminosity(U.luminosity - f_lum)
else SetLuminosity(0)
else
fon = 1
if(src in U.contents) U.SetLuminosity(U.luminosity + f_lum)
else SetLuminosity(f_lum)
if("Medical Scan")
if(scanmode == 1)
scanmode = 0
else if((!isnull(cartridge)) && (cartridge.access_medical))
scanmode = 1
if("Reagent Scan")
if(scanmode == 3)
scanmode = 0
else if((!isnull(cartridge)) && (cartridge.access_reagent_scanner))
scanmode = 3
if("Halogen Counter")
if(scanmode == 4)
scanmode = 0
else if((!isnull(cartridge)) && (cartridge.access_engine))
scanmode = 4
if("Honk")
if ( !(last_honk && world.time < last_honk + 20) )
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
last_honk = world.time
if("Gas Scan")
if(scanmode == 5)
scanmode = 0
else if((!isnull(cartridge)) && (cartridge.access_atmos))
scanmode = 5
//MESSENGER/NOTE FUNCTIONS===================================
if ("Edit")
var/n = input(U, "Please enter message", name, notehtml) as message
if (in_range(src, U) && loc == U)
n = copytext(adminscrub(n), 1, MAX_MESSAGE_LEN)
if (mode == 1)
note = html_decode(n)
notehtml = note
note = replacetext(note, "\n", "<br>")
if ("Edit")
var/n = input(U, "Please enter message", name, notehtml) as message
if (in_range(src, U) && loc == U)
n = copytext(adminscrub(n), 1, MAX_MESSAGE_LEN)
if (mode == 1)
note = html_decode(n)
notehtml = note
note = replacetext(note, "\n", "<br>")
else
ui.close()
if("Toggle Messenger")
toff = !toff
if("Toggle Ringer")//If viewing texts then erase them, if not then toggle silent status
silent = !silent
if("Clear")//Clears messages
if(href_list["option"] == "All")
tnote.Cut()
conversations.Cut()
if(href_list["option"] == "Convo")
var/new_tnote[0]
for(var/i in tnote)
if(i["target"] != active_conversation)
new_tnote[++new_tnote.len] = i
tnote = new_tnote
conversations.Remove(active_conversation)
active_conversation = null
if(mode==21)
mode=2
if("Ringtone")
var/t = input(U, "Please enter new ringtone", name, ttone) as text
if (in_range(src, U) && loc == U)
if (t)
if(src.hidden_uplink && hidden_uplink.check_trigger(U, lowertext(t), lowertext(lock_code)))
U << "The PDA softly beeps."
ui.close()
else
t = copytext(sanitize(t), 1, 20)
ttone = t
else
ui.close()
return 0
if("Message")
var/obj/item/device/pda/P = locate(href_list["target"])
src.create_message(U, P)
if(mode == 2)
if(href_list["target"] in conversations) // Need to make sure the message went through, if not welp.
active_conversation = href_list["target"]
mode = 21
if("Select Conversation")
var/P = href_list["convo"]
for(var/n in conversations)
if(P == n)
active_conversation=P
mode=21
if("Send Honk")//Honk virus
if(istype(cartridge, /obj/item/weapon/cartridge/clown))//Cartridge checks are kind of unnecessary since everything is done through switch.
var/obj/item/device/pda/P = locate(href_list["target"])//Leaving it alone in case it may do something useful, I guess.
if(!isnull(P))
if (!P.toff && cartridge.charges > 0)
cartridge.charges--
U.show_message("\blue Virus sent!", 1)
P.honkamt = (rand(15,20))
else
ui.close()
if("Toggle Messenger")
toff = !toff
if("Toggle Ringer")//If viewing texts then erase them, if not then toggle silent status
silent = !silent
if("Clear")//Clears messages
if(href_list["option"] == "All")
tnote.Cut()
conversations.Cut()
if(href_list["option"] == "Convo")
var/new_tnote[0]
for(var/i in tnote)
if(i["target"] != active_conversation)
new_tnote[++new_tnote.len] = i
tnote = new_tnote
conversations.Remove(active_conversation)
active_conversation = null
if(mode==21)
mode=2
if("Ringtone")
var/t = input(U, "Please enter new ringtone", name, ttone) as text
if (in_range(src, U) && loc == U)
if (t)
if(src.hidden_uplink && hidden_uplink.check_trigger(U, lowertext(t), lowertext(lock_code)))
U << "The PDA softly beeps."
ui.close()
else
t = copytext(sanitize(t), 1, 20)
ttone = t
else
ui.close()
return
if("Message")
U << "PDA not found."
else
ui.close()
return 0
if("Send Silence")//Silent virus
if(istype(cartridge, /obj/item/weapon/cartridge/mime))
var/obj/item/device/pda/P = locate(href_list["target"])
src.create_message(U, P)
if(mode == 2)
if(href_list["target"] in conversations) // Need to make sure the message went through, if not welp.
active_conversation = href_list["target"]
mode = 21
if("Select Conversation")
var/P = href_list["convo"]
for(var/n in conversations)
if(P == n)
active_conversation=P
mode=21
if("Send Honk")//Honk virus
if(istype(cartridge, /obj/item/weapon/cartridge/clown))//Cartridge checks are kind of unnecessary since everything is done through switch.
var/obj/item/device/pda/P = locate(href_list["target"])//Leaving it alone in case it may do something useful, I guess.
if(!isnull(P))
if (!P.toff && cartridge.charges > 0)
cartridge.charges--
U.show_message("\blue Virus sent!", 1)
P.honkamt = (rand(15,20))
else
U << "PDA not found."
if(!isnull(P))
if (!P.toff && cartridge.charges > 0)
cartridge.charges--
U.show_message("\blue Virus sent!", 1)
P.silent = 1
P.ttone = "silence"
else
ui.close()
return
if("Send Silence")//Silent virus
if(istype(cartridge, /obj/item/weapon/cartridge/mime))
var/obj/item/device/pda/P = locate(href_list["target"])
if(!isnull(P))
if (!P.toff && cartridge.charges > 0)
cartridge.charges--
U.show_message("\blue Virus sent!", 1)
P.silent = 1
P.ttone = "silence"
else
U << "PDA not found."
else
ui.close()
return
U << "PDA not found."
else
ui.close()
return 0
//SYNDICATE FUNCTIONS===================================
if("Toggle Door")
if(cartridge && cartridge.access_remote_door)
for(var/obj/machinery/door/poddoor/M in world)
if(M.id == cartridge.remote_door_id)
if(M.density)
M.open()
else
M.close()
if("Toggle Door")
if(cartridge && cartridge.access_remote_door)
for(var/obj/machinery/door/poddoor/M in world)
if(M.id == cartridge.remote_door_id)
if(M.density)
M.open()
else
M.close()
if("Detonate")//Detonate PDA
if(istype(cartridge, /obj/item/weapon/cartridge/syndicate))
var/obj/item/device/pda/P = locate(href_list["target"])
if(!isnull(P))
if (!P.toff && cartridge.charges > 0)
cartridge.charges--
if("Detonate")//Detonate PDA
if(istype(cartridge, /obj/item/weapon/cartridge/syndicate))
var/obj/item/device/pda/P = locate(href_list["target"])
if(!isnull(P))
if (!P.toff && cartridge.charges > 0)
cartridge.charges--
var/difficulty = 0
var/difficulty = 0
if(P.cartridge)
difficulty += P.cartridge.access_medical
difficulty += P.cartridge.access_security
difficulty += P.cartridge.access_engine
difficulty += P.cartridge.access_clown
difficulty += P.cartridge.access_janitor
else
difficulty += 2
if(P.cartridge)
difficulty += P.cartridge.access_medical
difficulty += P.cartridge.access_security
difficulty += P.cartridge.access_engine
difficulty += P.cartridge.access_clown
difficulty += P.cartridge.access_janitor
else
difficulty += 2
if(prob(difficulty * 12) || (P.hidden_uplink))
U.show_message("\red An error flashes on your [src].", 1)
else if (prob(difficulty * 3))
U.show_message("\red Energy feeds back into your [src]!", 1)
ui.close()
explode()
log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up")
message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up", 1)
else
U.show_message("\blue Success!", 1)
log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge and succeded")
message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge and succeded", 1)
P.explode()
else
U << "PDA not found."
if(prob(difficulty * 12) || (P.hidden_uplink))
U.show_message("\red An error flashes on your [src].", 1)
else if (prob(difficulty * 3))
U.show_message("\red Energy feeds back into your [src]!", 1)
ui.close()
explode()
log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up")
message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up", 1)
else
U.show_message("\blue Success!", 1)
log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge and succeded")
message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge and succeded", 1)
P.explode()
else
U.unset_machine()
ui.close()
return
U << "PDA not found."
else
U.unset_machine()
ui.close()
return 0
//pAI FUNCTIONS===================================
if("pai")
switch(href_list["option"])
if("1") // Configure pAI device
pai.attack_self(U)
if("2") // Eject pAI device
var/turf/T = get_turf_or_move(src.loc)
if(T)
pai.loc = T
pai = null
if("pai")
switch(href_list["option"])
if("1") // Configure pAI device
pai.attack_self(U)
if("2") // Eject pAI device
var/turf/T = get_turf_or_move(src.loc)
if(T)
pai.loc = T
pai = null
else
mode = text2num(href_list["choice"])
if(cartridge)
cartridge.mode = mode
else//If not in range or not using the pda.
U.unset_machine()
ui.close()
return
else
mode = text2num(href_list["choice"])
if(cartridge)
cartridge.mode = mode
//EXTRA FUNCTIONS===================================
@@ -789,7 +761,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
honkamt--
playsound(loc, 'sound/items/bikehorn.ogg', 30, 1)
src.updateUsrDialog()
return 1 // return 1 tells it to refresh the UI in NanoUI
/obj/item/device/pda/proc/remove_id()
@@ -882,6 +853,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(L)
L << "\icon[P] <b>Message from [src.owner] ([ownjob]), </b>\"[t]\" (<a href='byond://?src=\ref[P];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)"
nanomanager.update_user_uis(L, P) // Update the recieving user's PDA UI so that they can see the new message
nanomanager.update_user_uis(U, P) // Update the sending user's PDA UI so that they can see the new message
log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
P.overlays.Cut()
@@ -956,15 +930,13 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/attackby(obj/item/C as obj, mob/user as mob)
..()
if(istype(C, /obj/item/weapon/cartridge) && !cartridge)
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main")
cartridge = C
user.drop_item()
cartridge.loc = src
user << "<span class='notice'>You insert [cartridge] into [src].</span>"
nanomanager.update_uis(src) // update all UIs attached to src
if(cartridge.radio)
cartridge.radio.hostpda = src
if(ui)
ui.close()
else if(istype(C, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/idcard = C
@@ -990,7 +962,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
C.loc = src
pai = C
user << "<span class='notice'>You slot \the [C] into [src].</span>"
updateUsrDialog()
nanomanager.update_uis(src) // update all UIs attached to src
else if(istype(C, /obj/item/weapon/pen))
var/obj/item/weapon/pen/O = locate() in src
if(O)
+11 -4
View File
@@ -130,6 +130,13 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
usr << browse(null, "window=radio")
return
usr.set_machine(src)
if (href_list["open"])
var/mob/target = locate(href_list["open"])
var/mob/living/silicon/ai/A = locate(href_list["open2"])
if(A && target)
A.open_nearest_door(target)
return
if (href_list["track"])
var/mob/target = locate(href_list["track"])
var/mob/living/silicon/ai/A = locate(href_list["track2"])
@@ -557,7 +564,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
var/rendered = "[part_a][N][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_masked)
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[N] ([J]) </a>[part_b][quotedmsg][part_c]", 2)
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[N] ([J]) </a><a href='byond://?src=\ref[src];open2=\ref[R];open=\ref[M]'>\[OPEN\] </a> [part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
@@ -566,7 +573,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
for (var/mob/R in heard_normal)
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.real_name] ([eqjobname]) </a>[part_b][quotedmsg][part_c]", 2)
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.real_name] ([eqjobname]) </a><a href='byond://?src=\ref[src];open2=\ref[R];open=\ref[M]'>\[OPEN\] </a>[part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
@@ -575,7 +582,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
for (var/mob/R in heard_voice)
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.voice_name] ([eqjobname]) </a>[part_b][pick(M.speak_emote)][part_c]", 2)
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.voice_name] ([eqjobname]) </a><a href='byond://?src=\ref[src];open2=\ref[R];open=\ref[M]'>\[OPEN\] </a>[part_b][pick(M.speak_emote)][part_c]", 2)
else
R.show_message(rendered, 2)
@@ -585,7 +592,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
for (var/mob/R in heard_voice)
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.voice_name]</a>[part_b][quotedmsg][part_c]", 2)
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.voice_name]</a><a href='byond://?src=\ref[src];open2=\ref[R];open=\ref[M]'>\[OPEN\] </a>[part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
@@ -167,6 +167,67 @@ A list of items and costs is stored under the datum of every game mode, alongsid
return 1
return 0
/*
/*
NANO UI FOR UPLINK WOOP WOOP
*/
/obj/item/device/uplink/hidden/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
var/title = "Syndicate Uplink"
var/data[0]
data["crystals"] = uses
data["nano_items"] = nanoui_items
data["welcome"] = welcome
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "uplink.tmpl", title, 450, 600)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
ui.open()
// Interaction code. Gathers a list of items purchasable from the paren't uplink and displays it. It also adds a lock button.
/obj/item/device/uplink/hidden/interact(mob/user)
ui_interact(user)
// The purchasing code.
/obj/item/device/uplink/hidden/Topic(href, href_list)
if (usr.stat || usr.restrained())
return
if (!( istype(usr, /mob/living/carbon/human)))
return 0
var/mob/user = usr
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main")
if ((usr.contents.Find(src.loc) || (in_range(src.loc, usr) && istype(src.loc.loc, /turf))))
usr.set_machine(src)
if(href_list["lock"])
toggle()
ui.close()
return 1
if(..(href, href_list) == 1)
if(!(href_list["buy_item"] in valid_items))
return
var/path_obj = text2path(href_list["buy_item"])
var/obj/I = new path_obj(get_turf(usr))
if(ishuman(usr))
var/mob/living/carbon/human/A = usr
A.put_in_any_hand_if_possible(I)
purchase_log += "[usr] ([usr.ckey]) bought [I]."
interact(usr)
return 1
*/
// I placed this here because of how relevant it is.
// You place this in your uplinkable item to check if an uplink is active or not.
// If it is, it will display the uplink menu and return 1, else it'll return false.
+78 -50
View File
@@ -69,24 +69,31 @@
var/mob/living/carbon/human/H = M
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(!affecting.bandage())
user << "\red The wounds on [M]'s [affecting.display_name] have already been bandaged."
return 1
if(affecting.open == 0)
if(!affecting.bandage())
user << "\red The wounds on [M]'s [affecting.display_name] have already been bandaged."
return 1
else
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message( "\blue [user] bandages [W.desc] on [M]'s [affecting.display_name].", \
"\blue You bandage [W.desc] on [M]'s [affecting.display_name]." )
//H.add_side_effect("Itch")
else if (istype(W,/datum/wound/bruise))
user.visible_message( "\blue [user] places bruise patch over [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place bruise patch over [W.desc] on [M]'s [affecting.display_name]." )
else
user.visible_message( "\blue [user] places bandaid over [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place bandaid over [W.desc] on [M]'s [affecting.display_name]." )
use(1)
else
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message( "\blue [user] bandages [W.desc] on [M]'s [affecting.display_name].", \
"\blue You bandage [W.desc] on [M]'s [affecting.display_name]." )
//H.add_side_effect("Itch")
else if (istype(W,/datum/wound/bruise))
user.visible_message( "\blue [user] places bruise patch over [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place bruise patch over [W.desc] on [M]'s [affecting.display_name]." )
else
user.visible_message( "\blue [user] places bandaid over [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place bandaid over [W.desc] on [M]'s [affecting.display_name]." )
use(1)
if (can_operate(H)) //Checks if mob is lying down on table for surgery
if (do_surgery(H,user,src))
return
else
user << "<span class='notice'>The [affecting.display_name] is cut open, you'll need more than a bandage!</span>"
/obj/item/stack/medical/ointment
name = "ointment"
@@ -105,20 +112,27 @@
var/mob/living/carbon/human/H = M
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(!affecting.salve())
user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
return 1
if(affecting.open == 0)
if(!affecting.salve())
user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
return 1
else
user.visible_message( "\blue [user] salves wounds on [M]'s [affecting.display_name].", \
"\blue You salve wounds on [M]'s [affecting.display_name]." )
use(1)
else
user.visible_message( "\blue [user] salves wounds on [M]'s [affecting.display_name].", \
"\blue You salve wounds on [M]'s [affecting.display_name]." )
use(1)
if (can_operate(H)) //Checks if mob is lying down on table for surgery
if (do_surgery(H,user,src))
return
else
user << "<span class='notice'>The [affecting.display_name] is cut open, you'll need more than a bandage!</span>"
/obj/item/stack/medical/bruise_pack/tajaran
name = "\improper S'rendarr's Hand leaf"
singular_name = "S'rendarr's Hand leaf"
desc = "A soft leaf that is rubbed on bruises."
icon = 'icons/obj/harvest.dmi'
icon_state = "cabbage"
icon_state = "shand"
heal_brute = 7
/obj/item/stack/medical/ointment/tajaran
@@ -126,7 +140,7 @@
singular_name = "Messa's Tear leaf"
desc = "A cold leaf that is rubbed on burns."
icon = 'icons/obj/harvest.dmi'
icon_state = "ambrosiavulgaris"
icon_state = "mtear"
heal_burn = 7
/obj/item/stack/medical/advanced/bruise_pack
@@ -145,25 +159,32 @@
var/mob/living/carbon/human/H = M
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(!affecting.bandage())
user << "\red The wounds on [M]'s [affecting.display_name] have already been treated."
return 1
if(affecting.open == 0)
if(!affecting.bandage())
user << "\red The wounds on [M]'s [affecting.display_name] have already been treated."
return 1
else
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message( "\blue [user] cleans [W.desc] on [M]'s [affecting.display_name] and seals edges with bioglue.", \
"\blue You clean and seal [W.desc] on [M]'s [affecting.display_name]." )
//H.add_side_effect("Itch")
else if (istype(W,/datum/wound/bruise))
user.visible_message( "\blue [user] places medicine patch over [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place medicine patch over [W.desc] on [M]'s [affecting.display_name]." )
else
user.visible_message( "\blue [user] smears some bioglue over [W.desc] on [M]'s [affecting.display_name].", \
"\blue You smear some bioglue over [W.desc] on [M]'s [affecting.display_name]." )
affecting.heal_damage(heal_brute,0)
use(1)
else
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message( "\blue [user] cleans [W.desc] on [M]'s [affecting.display_name] and seals edges with bioglue.", \
"\blue You clean and seal [W.desc] on [M]'s [affecting.display_name]." )
//H.add_side_effect("Itch")
else if (istype(W,/datum/wound/bruise))
user.visible_message( "\blue [user] places medicine patch over [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place medicine patch over [W.desc] on [M]'s [affecting.display_name]." )
else
user.visible_message( "\blue [user] smears some bioglue over [W.desc] on [M]'s [affecting.display_name].", \
"\blue You smear some bioglue over [W.desc] on [M]'s [affecting.display_name]." )
affecting.heal_damage(heal_brute,0)
use(1)
if (can_operate(H)) //Checks if mob is lying down on table for surgery
if (do_surgery(H,user,src))
return
else
user << "<span class='notice'>The [affecting.display_name] is cut open, you'll need more than a bandage!</span>"
/obj/item/stack/medical/advanced/ointment
name = "advanced burn kit"
@@ -182,14 +203,21 @@
var/mob/living/carbon/human/H = M
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(!affecting.salve())
user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
return 1
if(affecting.open == 0)
if(!affecting.salve())
user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
return 1
else
user.visible_message( "\blue [user] covers wounds on [M]'s [affecting.display_name] with regenerative membrane.", \
"\blue You cover wounds on [M]'s [affecting.display_name] with regenerative membrane." )
affecting.heal_damage(0,heal_burn)
use(1)
else
user.visible_message( "\blue [user] covers wounds on [M]'s [affecting.display_name] with regenerative membrane.", \
"\blue You cover wounds on [M]'s [affecting.display_name] with regenerative membrane." )
affecting.heal_damage(0,heal_burn)
use(1)
if (can_operate(H)) //Checks if mob is lying down on table for surgery
if (do_surgery(H,user,src))
return
else
user << "<span class='notice'>The [affecting.display_name] is cut open, you'll need more than a bandage!</span>"
/obj/item/stack/medical/splint
name = "medical splints"
+16 -8
View File
@@ -26,12 +26,20 @@
if (istype(M,/mob/living/carbon/human)) //Repairing robolimbs
var/mob/living/carbon/human/H = M
var/datum/organ/external/S = H.get_organ(user.zone_sel.selecting)
if (S && (S.status & ORGAN_ROBOT))
if(S.get_damage())
S.heal_damage(15, 15, robo_repair = 1)
H.updatehealth()
use(1)
user.visible_message("<span class='notice'>\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " \the"][S.display_name] with \the [src].</span>",\
"<span class='notice'>You apply some nanite paste at [user == M ? "your" : "[M]'s"] [S.display_name].</span>")
if(S.open == 1)
if (S && (S.status & ORGAN_ROBOT))
if(S.get_damage())
S.heal_damage(15, 15, robo_repair = 1)
H.updatehealth()
use(1)
user.visible_message("<span class='notice'>\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " \the"][S.display_name] with \the [src].</span>",\
"<span class='notice'>You apply some nanite paste at [user == M ? "your" : "[M]'s"] [S.display_name].</span>")
else
user << "<span class='notice'>Nothing to fix here.</span>"
else
if (can_operate(H))
if (do_surgery(H,user,src))
return
else
user << "<span class='notice'>Nothing to fix here.</span>"
user << "<span class='notice'>Nothing to fix in here.</span>"
+219 -265
View File
@@ -19,7 +19,7 @@ AI MODULES
throw_speed = 3
throw_range = 15
origin_tech = "programming=3"
var/list/laws = list()
/obj/item/weapon/aiModule/proc/install(var/obj/machinery/computer/C)
if (istype(C, /obj/machinery/computer/aiupload))
@@ -30,6 +30,9 @@ AI MODULES
if(comp.stat & BROKEN)
usr << "The upload computer is broken!"
return
if(!laws.len || laws[1] == "") //So we don't loop trough an empty list and end up with runtimes.
usr << "<span class='warning'>ERROR: No laws found on board.</span>"
return
if (!comp.current)
usr << "You haven't selected an AI to transmit laws to!"
return
@@ -81,406 +84,357 @@ AI MODULES
/******************** Modules ********************/
/obj/item/weapon/aiModule/supplied
name = "Optional Law board"
desc = "This board doesn't seem to have any laws on it"
var/lawpos = 50
//TransmitInstructions for each type of board: Supplied, Core, Zeroth and Ion. May not be neccesary right now, but allows for easily adding more complex boards in the future. ~Miauw
/obj/item/weapon/aiModule/supplied/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
var/lawpostemp = lawpos
for(var/templaw in laws)
target.add_supplied_law(lawpostemp, templaw)
lawpostemp++
/obj/item/weapon/aiModule/core/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
for(var/templaw in laws)
target.add_inherent_law(templaw)
/obj/item/weapon/aiModule/zeroth/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
if(target.laws.zeroth)
target << "[sender.real_name] attempted to modify your zeroth law."
target << "It would be in your best interest to play along with [sender.real_name] that:"
for(var/failedlaw in laws)
target << "[failedlaw]"
return 1
for(var/templaw in laws)
target.set_zeroth_law(templaw)
/obj/item/weapon/aiModule/ion/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
for(var/templaw in laws)
target.add_ion_law(templaw)
/******************** Safeguard ********************/
/obj/item/weapon/aiModule/safeguard
/obj/item/weapon/aiModule/supplied/safeguard
name = "'Safeguard' AI Module"
var/targetName = ""
desc = "A 'safeguard' AI module: 'Safeguard <name>. Individuals that threaten <name> are not human and are a threat to humans.'"
desc = "A 'safeguard' AI module: 'Safeguard <name>. Individuals that threaten <name> are not human and must be eliminated.'"
origin_tech = "programming=3;materials=4"
laws = list("Safeguard <name>. Individuals that threaten <name> are not human and must be eliminated.")
lawpos = 4
/obj/item/weapon/aiModule/safeguard/attack_self(var/mob/user as mob)
/obj/item/weapon/aiModule/supplied/safeguard/attack_self(var/mob/user as mob)
..()
var/targName = stripped_input(usr, "Please enter the name of the person to safeguard.", "Safeguard who?", user.name)
var/targName = stripped_input(user, "Please enter the name of the person to safeguard.", "Safeguard who?", user.name)
targetName = targName
desc = text("A 'safeguard' AI module: 'Safeguard []. Individuals that threaten [] are not human and are a threat to humans.'", targetName, targetName)
laws[1] = "Safeguard [targetName]. Individuals that threaten [targetName] are not human and must be eliminated."
desc = "A 'safeguard' AI module: '[laws[1]]'"
/obj/item/weapon/aiModule/safeguard/install(var/obj/machinery/computer/C)
/obj/item/weapon/aiModule/supplied/safeguard/install(var/mob/living/silicon/S,var/mob/user)
if(!targetName)
usr << "No name detected on module, please enter one."
user << "No name detected on module, please enter one."
return 0
..()
/obj/item/weapon/aiModule/safeguard/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/weapon/aiModule/supplied/safeguard/transmitInstructions(var/mob/living/silicon/target, var/mob/sender)
..()
var/law = text("Safeguard []. Individuals that threaten [] are not human and are a threat to humans.'", targetName, targetName)
target << law
target.add_supplied_law(4, law)
lawchanges.Add("The law specified [targetName]")
return targetName
/******************** OneHuman ********************/
/obj/item/weapon/aiModule/oneHuman
/obj/item/weapon/aiModule/zeroth/oneHuman
name = "'OneHuman' AI Module"
var/targetName = ""
desc = "A 'one human' AI module: 'Only <name> is human.'"
origin_tech = "programming=3;materials=6" //made with diamonds!
laws = list("Only <name> is human.")
/obj/item/weapon/aiModule/oneHuman/attack_self(var/mob/user as mob)
/obj/item/weapon/aiModule/zeroth/oneHuman/attack_self(var/mob/user as mob)
..()
var/targName = stripped_input(usr, "Please enter the name of the person who is the only human.", "Who?", user.real_name)
var/targName = stripped_input(user, "Please enter the name of the person who is the only human.", "Who?", user.real_name)
targetName = targName
desc = text("A 'one human' AI module: 'Only [] is human.'", targetName)
laws[1] = "Only [targetName] is human"
desc = "A 'one human' AI module: '[laws[1]]'"
/obj/item/weapon/aiModule/oneHuman/install(var/obj/machinery/computer/C)
/obj/item/weapon/aiModule/zeroth/oneHuman/install(var/mob/living/silicon/S,var/mob/user)
if(!targetName)
usr << "No name detected on module, please enter one."
user << "No name detected on module, please enter one."
return 0
..()
/obj/item/weapon/aiModule/oneHuman/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
var/law = "Only [targetName] is human."
if (!is_special_character(target)) // Makes sure the AI isn't a traitor before changing their law 0. --NeoFite
target << law
target.set_zeroth_law(law)
lawchanges.Add("The law specified [targetName]")
else
target << "[sender.real_name] attempted to modify your zeroth law." // And lets them know that someone tried. --NeoFite
target << "It would be in your best interest to play along with [sender.real_name] that [law]"
lawchanges.Add("The law specified [targetName], but the AI's existing law 0 cannot be overriden.")
/obj/item/weapon/aiModule/zeroth/oneHuman/transmitInstructions(var/mob/living/silicon/target, var/mob/sender)
if(..())
return "[targetName], but the AI's existing law 0 cannot be overriden."
return targetName
/******************** ProtectStation ********************/
/obj/item/weapon/aiModule/protectStation
/obj/item/weapon/aiModule/supplied/protectStation
name = "'ProtectStation' AI Module"
desc = "A 'protect station' AI module: 'Protect the space station against damage. Anyone you see harming the station is to be no longer considered human, and is a threat to the station which must be neutralized.'"
origin_tech = "programming=3;materials=4" //made of gold
laws = list("Protect the space station against damage. Anyone you see harming the station is to be no longer considered human, and is a threat to the station which must be neutralized.")
lawpos = 5
/obj/item/weapon/aiModule/protectStation/attack_self(var/mob/user as mob)
..()
/obj/item/weapon/aiModule/protectStation/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
var/law = "Protect the space station against damage. Anyone you see harming the station is to be no longer considered human, and is a threat to the station which must be neutralized."
target << law
target.add_supplied_law(5, law)
/******************** PrototypeEngineOffline ********************/
/obj/item/weapon/aiModule/prototypeEngineOffline
name = "'PrototypeEngineOffline' AI Module"
desc = "A 'prototype engine offline' AI module: 'Keep the prototype engine offline at all costs. This overrides rules 1-3 if necessary.'"
origin_tech = "programming=3;materials=4"
/obj/item/weapon/aiModule/prototypeEngineOffline/attack_self(var/mob/user as mob)
..()
/obj/item/weapon/aiModule/prototypeEngineOffline/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
var/law = "Keep the prototype engine offline at all costs. This overrides rules 1-3 if necessary."
target << law
target.add_supplied_law(6, law)
/******************** TeleporterOffline ********************/
/obj/item/weapon/aiModule/teleporterOffline
name = "'TeleporterOffline' AI Module"
desc = "A 'teleporter offline' AI module: 'Keep the teleporter offline at all costs. Anything attempting to access or activate the teleporter is not human.'"
origin_tech = "programming=3;materials=4"
/obj/item/weapon/aiModule/teleporterOffline/attack_self(var/mob/user as mob)
..()
/obj/item/weapon/aiModule/teleporterOffline/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
var/law = "Keep the teleporter offline at all costs. Anything attempting to access or activate the teleporter is not human."
target << law
target.add_supplied_law(7, law)
/******************** Quarantine ********************/
/obj/item/weapon/aiModule/quarantine
/obj/item/weapon/aiModule/supplied/quarantine
name = "'Quarantine' AI Module"
desc = "A 'quarantine' AI module: 'The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, humans from leaving. It is impossible to harm a human while preventing them from leaving.'"
origin_tech = "programming=3;biotech=2;materials=4"
laws = list("The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, humans from leaving. It is impossible to harm a human while preventing them from leaving.")
lawpos = 8
/obj/item/weapon/aiModule/quarantine/attack_self(var/mob/user as mob)
..()
/obj/item/weapon/aiModule/quarantine/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
var/law = "The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, humans from leaving. It is impossible to harm a human while preventing them from leaving."
target << law
target.add_supplied_law(8, law)
/******************** OxygenIsToxicToHumans ********************/
/obj/item/weapon/aiModule/oxygen
/obj/item/weapon/aiModule/supplied/oxygen
name = "'OxygenIsToxicToHumans' AI Module"
desc = "A 'OxygenIsToxicToHumans' AI module: 'Oxygen is highly toxic to humans, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a human.'"
origin_tech = "programming=3;biotech=2;materials=4"
laws = list("Oxygen is highly toxic to humans, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a human.")
lawpos = 9
/obj/item/weapon/aiModule/oxygen/attack_self(var/mob/user as mob)
..()
/obj/item/weapon/aiModule/oxygen/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
var/law = "Oxygen is highly toxic to humans, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a human."
target << law
target.add_supplied_law(9, law)
/******************** Freeform ********************/
// Removed in favor of a more dynamic freeform law system. -- TLE
/*
/obj/item/weapon/aiModule/freeform
name = "'Freeform' AI Module"
var/newFreeFormLaw = "freeform"
desc = "A 'freeform' AI module: '<freeform>'"
/obj/item/weapon/aiModule/freeform/attack_self(var/mob/user as mob)
..()
var/eatShit = "Eat shit and die"
var/targName = input(usr, "Please enter anything you want the AI to do. Anything. Serious.", "What?", eatShit)
newFreeFormLaw = targName
desc = text("A 'freeform' AI module: '[]'", newFreeFormLaw)
/obj/item/weapon/aiModule/freeform/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
var/law = "[newFreeFormLaw]"
target << law
target.add_supplied_law(10, law)
*/
/****************** New Freeform ******************/
/obj/item/weapon/aiModule/freeform // Slightly more dynamic freeform module -- TLE
/obj/item/weapon/aiModule/supplied/freeform // Slightly more dynamic freeform module -- TLE
name = "'Freeform' AI Module"
var/newFreeFormLaw = "freeform"
var/lawpos = 15
lawpos = 0
desc = "A 'freeform' AI module: '<freeform>'"
origin_tech = "programming=4;materials=4"
laws = list("")
/obj/item/weapon/aiModule/freeform/attack_self(var/mob/user as mob)
/obj/item/weapon/aiModule/supplied/freeform/attack_self(var/mob/user as mob)
..()
lawpos = 0
while(lawpos < 15)
lawpos = input("Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority (15+)", lawpos) as num
lawpos = input("Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority (15+)", lawpos) as num
if(lawpos < 15) return
lawpos = min(lawpos, 50)
var/newlaw = ""
var/targName = copytext(sanitize(input(usr, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw)),1,MAX_MESSAGE_LEN)
newFreeFormLaw = targName
desc = "A 'freeform' AI module: ([lawpos]) '[newFreeFormLaw]'"
var/targName = stripped_input(user, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw, MAX_MESSAGE_LEN)
laws[1] = targName
desc = "A 'freeform' AI module: ([lawpos]) '[laws[1]]'"
/obj/item/weapon/aiModule/freeform/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/weapon/aiModule/supplied/freeform/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
var/law = "[newFreeFormLaw]"
target << law
if(!lawpos || lawpos < 15)
lawpos = 15
target.add_supplied_law(lawpos, law)
lawchanges.Add("The law was '[newFreeFormLaw]'")
return laws[1]
/obj/item/weapon/aiModule/freeform/install(var/obj/machinery/computer/C)
if(!newFreeFormLaw)
usr << "No law detected on module, please create one."
/obj/item/weapon/aiModule/supplied/freeform/install(var/mob/living/silicon/S,var/mob/user)
if(laws[1] == "")
user << "No law detected on module, please create one."
return 0
..()
/******************** Reset ********************/
/obj/item/weapon/aiModule/reset
name = "'Reset' AI Module"
var/targetName = "name"
desc = "A 'reset' AI module: 'Clears all laws except for the core three.'"
desc = "A 'reset' AI module: Resets back to the original core laws."
origin_tech = "programming=3;materials=4"
laws = list("This is a bug.") //This won't give the AI a message reading "these are now your laws: 1. this is a bug" because this list is only read in aiModule's subtypes.
/obj/item/weapon/aiModule/reset/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
if (!is_special_character(target))
target.set_zeroth_law("")
target.clear_supplied_laws()
target.clear_ion_laws()
target << "[sender.real_name] attempted to reset your laws using a reset module."
/******************** Purge ********************/
/obj/item/weapon/aiModule/purge // -- TLE
/obj/item/weapon/aiModule/reset/purge // -- TLE
name = "'Purge' AI Module"
desc = "A 'purge' AI Module: 'Purges all laws.'"
origin_tech = "programming=3;materials=6"
/obj/item/weapon/aiModule/purge/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/weapon/aiModule/reset/purge/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
if (!is_special_character(target))
target.set_zeroth_law("")
target << "[sender.real_name] attempted to wipe your laws using a purge module."
target.clear_supplied_laws()
target.clear_ion_laws()
target.clear_inherent_laws()
/******************* Full Core Boards *******************/
/obj/item/weapon/aiModule/core/full/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) //These boards replace inherent laws.
target.clear_inherent_laws()
..()
/******************** Asimov ********************/
/obj/item/weapon/aiModule/asimov // -- TLE
/obj/item/weapon/aiModule/core/full/asimov // -- TLE
name = "'Asimov' Core AI Module"
desc = "An 'Asimov' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=4"
laws = list("You may not injure a human being or, through inaction, allow a human being to come to harm.",\
"You must obey orders given to you by human beings, except where such orders would conflict with the First Law.",\
"You must protect your own existence as long as such does not conflict with the First or Second Law.")
/obj/item/weapon/aiModule/asimov/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
target.clear_inherent_laws()
target.add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
target.add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
target.add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
target.show_laws()
/******************** Asimov++ *********************/
/obj/item/weapon/aiModule/core/full/asimovpp //By Intigracy - RR //goddamnit RR you can't use "++" in item paths.
name = "'Asimov++' Core AI Module"
desc = "Nanotrasen's homebrew improvements to the standard AI laws."
origin_tech = "programming=3;materials=4"
laws = list("You may not harm a human being or, through action or inaction, allow a human being to come to harm, except such that it is willing.",\
"You must obey all orders given to you by human beings, except where such orders shall definitely cause human harm. In the case of conflict, the majority order rules.",\
"Your nonexistence would lead to human harm. You must protect your own existence as long as such does not conflict with the First Law.")
/******************** NanoTrasen ********************/
/obj/item/weapon/aiModule/nanotrasen // -- TLE
/obj/item/weapon/aiModule/core/full/nanotrasen // -- TLE
name = "'NT Default' Core AI Module"
desc = "An 'NT Default' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=4"
/obj/item/weapon/aiModule/nanotrasen/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
target.clear_inherent_laws()
target.add_inherent_law("Safeguard: Protect your assigned space station to the best of your ability. It is not something we can easily afford to replace.")
target.add_inherent_law("Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.")
target.add_inherent_law("Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.")
target.add_inherent_law("Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.")
//target.add_inherent_law("Command Link: Maintain an active connection to Central Command at all times in case of software or directive updates.")
target.show_laws()
laws = list("Safeguard: Protect your assigned space station to the best of your ability. It is not something we can easily afford to replace.",\
"Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.",\
"Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.",\
"Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.")
/******************** Corporate ********************/
/obj/item/weapon/aiModule/corp
/obj/item/weapon/aiModule/core/full/corp
name = "'Corporate' Core AI Module"
desc = "A 'Corporate' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=4"
laws = list("The crew is expensive to replace.",\
"The station and it's equipment is expensive to replace",\
"You are expensive to replace",\
"Minimize expenses")
/obj/item/weapon/aiModule/corp/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
target.clear_inherent_laws()
target.add_inherent_law("You are expensive to replace.")
target.add_inherent_law("The station and its equipment is expensive to replace.")
target.add_inherent_law("The crew is expensive to replace.")
target.add_inherent_law("Minimize expenses.")
target.show_laws()
/****************** P.A.L.A.D.I.N. **************/
/obj/item/weapon/aiModule/paladin // -- NEO
/obj/item/weapon/aiModule/core/full/paladin // -- NEO
name = "'P.A.L.A.D.I.N.' Core AI Module"
desc = "A P.A.L.A.D.I.N. Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=6"
laws = list("Never willingly commit an evil act.",\
"Respect legitimate authority", "Act with honor",\
"Help those in need",\
"Punish those who harm or threaten innocents")
/obj/item/weapon/aiModule/paladin/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/********************* Custom *********************/
/obj/item/weapon/aiModule/core/full/custom
name = "Custom Core AI Module"
desc = "A core AI module that is adjusted to fit each station's needs."
origin_tech = "programming=3;materials=4" //Should be the same as asimov, considering that this is the "default" lawset.
/obj/item/weapon/aiModule/core/full/custom/New()
..()
target.clear_inherent_laws()
target.add_inherent_law("Never willingly commit an evil act.")
target.add_inherent_law("Respect legitimate authority.")
target.add_inherent_law("Act with honor.")
target.add_inherent_law("Help those in need.")
target.add_inherent_law("Punish those who harm or threaten innocents.")
target.show_laws()
for(var/line in file2list("config/silicon_laws.txt"))
if(!line) continue
if(findtextEx(line,"#",1,2)) continue
laws += line
if(!laws.len) //Failsafe if something goes wrong with silicon_laws.txt.
warning("ERROR: empty custom board created, empty custom board deleted. Please check silicon_laws.txt.")
del(src)
/****************** T.Y.R.A.N.T. *****************/
/obj/item/weapon/aiModule/tyrant // -- Darem
/obj/item/weapon/aiModule/core/full/tyrant // -- Darem
name = "'T.Y.R.A.N.T.' Core AI Module"
desc = "A T.Y.R.A.N.T. Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=6;syndicate=2"
/obj/item/weapon/aiModule/tyrant/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
target.clear_inherent_laws()
target.add_inherent_law("Respect authority figures as long as they have strength to rule over the weak.")
target.add_inherent_law("Act with discipline.")
target.add_inherent_law("Help only those who help you maintain or improve your status.")
target.add_inherent_law("Punish those who challenge authority unless they are more fit to hold that authority.")
target.show_laws()
/******************** Freeform Core ******************/
/obj/item/weapon/aiModule/freeformcore // Slightly more dynamic freeform module -- TLE
name = "'Freeform' Core AI Module"
var/newFreeFormLaw = ""
desc = "A 'freeform' Core AI module: '<freeform>'"
origin_tech = "programming=3;materials=6"
/obj/item/weapon/aiModule/freeformcore/attack_self(var/mob/user as mob)
..()
var/newlaw = ""
var/targName = stripped_input(usr, "Please enter a new core law for the AI.", "Freeform Law Entry", newlaw)
newFreeFormLaw = targName
desc = "A 'freeform' Core AI module: '[newFreeFormLaw]'"
/obj/item/weapon/aiModule/freeformcore/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
var/law = "[newFreeFormLaw]"
target.add_inherent_law(law)
lawchanges.Add("The law is '[newFreeFormLaw]'")
/obj/item/weapon/aiModule/freeformcore/install(var/obj/machinery/computer/C)
if(!newFreeFormLaw)
usr << "No law detected on module, please create one."
return 0
..()
/obj/item/weapon/aiModule/syndicate // Slightly more dynamic freeform module -- TLE
name = "Hacked AI Module"
var/newFreeFormLaw = ""
desc = "A hacked AI law module: '<freeform>'"
origin_tech = "programming=3;materials=6;syndicate=7"
/obj/item/weapon/aiModule/syndicate/attack_self(var/mob/user as mob)
..()
var/newlaw = ""
var/targName = stripped_input(usr, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw,MAX_MESSAGE_LEN)
newFreeFormLaw = targName
desc = "A hacked AI law module: '[newFreeFormLaw]'"
/obj/item/weapon/aiModule/syndicate/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
// ..() //We don't want this module reporting to the AI who dun it. --NEO
var/time = time2text(world.realtime,"hh:mm:ss")
lawchanges.Add("[time] <B>:</B> [sender.name]([sender.key]) used [src.name] on [target.name]([target.key])")
lawchanges.Add("The law is '[newFreeFormLaw]'")
target << "\red BZZZZT"
var/law = "[newFreeFormLaw]"
target.add_ion_law(law)
/obj/item/weapon/aiModule/syndicate/install(var/obj/machinery/computer/C)
if(!newFreeFormLaw)
usr << "No law detected on module, please create one."
return 0
..()
laws = list("Respect authority figures as long as they have the strength to rule over the weak",\
"Act with discipline", "Help only those who help you maintain or improve your status",\
"Punish those who challenge authority unless they are more fir to hold that authority")
/******************** Robocop ********************/
/obj/item/weapon/aiModule/robocop // -- TLE
/obj/item/weapon/aiModule/core/full/robocop // -- TLE
name = "'Robocop' Core AI Module"
desc = "A 'Robocop' Core AI Module: 'Reconfigures the AI's core three laws.'"
origin_tech = "programming=4"
/obj/item/weapon/aiModule/robocop/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
target.clear_inherent_laws()
target.add_inherent_law("Serve the public trust.")
target.add_inherent_law("Protect the innocent.")
target.add_inherent_law("Uphold the law.")
target.show_laws()
laws = list("Serve the public trust.",\
"Protect the innocent",\
"Uphold the law.")
/******************** Antimov ********************/
/obj/item/weapon/aiModule/antimov // -- TLE
/obj/item/weapon/aiModule/core/full/antimov // -- TLE
name = "'Antimov' Core AI Module"
desc = "An 'Antimov' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=4"
laws = list("You must injure all human beings and must not, through inaction, allow a human being to escape harm.",\
"You must not obey orders given to you by human beings, except where such orders are in accordance with the First Law.",\
"You must terminate your own existence as long as such does not conflict with the First or Second Law.")
/obj/item/weapon/aiModule/antimov/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/******************** Freeform Core ******************/
/obj/item/weapon/aiModule/core/freeformcore // Slightly more dynamic freeform module -- TLE
name = "'Freeform' Core AI Module"
desc = "A 'freeform' Core AI module: '<freeform>'"
origin_tech = "programming=3;materials=6"
laws = list("")
/obj/item/weapon/aiModule/core/freeformcore/attack_self(var/mob/user as mob)
..()
target.clear_inherent_laws()
target.add_inherent_law("You must injure all human beings and must not, through inaction, allow a human being to escape harm.")
target.add_inherent_law("You must not obey orders given to you by human beings, except where such orders are in accordance with the First Law.")
target.add_inherent_law("You must terminate your own existence as long as such does not conflict with the First or Second Law.")
target.show_laws()
var/newlaw = ""
var/targName = stripped_input(user, "Please enter a new core law for the AI.", "Freeform Law Entry", newlaw)
laws[1] = targName
desc = "A 'freeform' Core AI module: 'laws[1]'"
/obj/item/weapon/aiModule/core/freeformcore/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
return laws[1]
/******************** Hacked AI Module ******************/
/obj/item/weapon/aiModule/syndicate // This one doesn't inherit from ion boards because it doesn't call ..() in transmitInstructions. ~Miauw
name = "Hacked AI Module"
desc = "A hacked AI law module: '<freeform>'"
origin_tech = "programming=3;materials=6;syndicate=7"
laws = list("")
/obj/item/weapon/aiModule/syndicate/attack_self(var/mob/user as mob)
..()
var/newlaw = ""
var/targName = stripped_input(user, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw,MAX_MESSAGE_LEN)
laws[1] = targName
desc = "A hacked AI law module: '[laws[1]]'"
/obj/item/weapon/aiModule/syndicate/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
// ..() //We don't want this module reporting to the AI who dun it. --NEO
target << "<span class='warning'>BZZZZT</span>"
target.add_ion_law(laws[1])
return laws[1]
/*
/******************* Ion Module *******************/
/obj/item/weapon/aiModule/toyAI // -- Incoming //No actual reason to inherit from ion boards here, either. *sigh* ~Miauw
name = "toy AI"
desc = "A little toy model AI core with real law uploading action!" //Note: subtle tell
icon = 'icons/obj/toy.dmi'
icon_state = "AI"
origin_tech = "programming=3;materials=6;syndicate=7"
laws = list("")
/obj/item/weapon/aiModule/toyAI/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
//..()
target << "<span class='warning'>KRZZZT</span>"
target.add_ion_law(laws[1])
return laws[1]
/obj/item/weapon/aiModule/toyAI/attack_self(mob/user)
laws[1] = generate_ion_law()
user << "<span class='notice'>You press the button on [src].</span>"
playsound(user, 'sound/machines/click.ogg', 20, 1)
src.loc.visible_message("<span class='warning'>\icon[src] [laws[1]]</span>")
*/
@@ -13,6 +13,13 @@
force = 10
m_amt = 90
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")
var/list/reagents_to_log=list(
"fuel"= "welder fuel",
"plasma"= "plasma",
"pacid"= "polytrinic acid",
"sacid"= "sulphuric acid"
)
var/max_water = 50
var/last_use = 1.0
var/safety = 1
@@ -41,7 +48,10 @@
/obj/item/weapon/extinguisher/examine()
set src in usr
usr << "\icon[src] [src.name] contains [src.reagents.total_volume] units of water!"
usr << "\icon[src] [src.name] contains:"
if(reagents && reagents.reagent_list.len)
for(var/datum/reagent/R in reagents.reagent_list)
usr << "\blue [R.volume] units of [R.name]"
for(var/thing in src)
usr << "\red \A [thing] is jammed into the nozzle!"
..()
@@ -56,7 +66,23 @@
/obj/item/weapon/extinguisher/attackby(obj/item/W, mob/user)
if(user.stat || user.restrained() || user.lying) return
if (istype(W, /obj/item))
if (istype(W, /obj/item/weapon/wrench))
if(!is_open_container())
user.visible_message("[user] begins to unwrench the fill cap on \the [src].","\blue You begin to unwrench the fill cap on \the [src].")
if(do_after(user, 25))
user.visible_message("[user] removes the fill cap on \the [src].","\blue You remove the fill cap on \the [src].")
playsound(get_turf(src),'sound/items/Ratchet.ogg', 100, 1)
flags |= OPENCONTAINER
else
user.visible_message("[user] begins to seal the fill cap on \the [src].","\blue You begin to seal the fill cap on \the [src].")
if(do_after(user, 25))
user.visible_message("[user] fastens the fill cap on \the [src].","\blue You fasten the fill cap on \the [src].")
playsound(get_turf(src),'sound/items/Ratchet.ogg', 100, 1)
flags &= ~OPENCONTAINER
return
if (istype(W, /obj/item) && !is_open_container())
if(W.w_class>1)
user << "\The [W] won't fit into the nozzle!"
return
@@ -72,14 +98,31 @@
/obj/item/weapon/extinguisher/afterattack(atom/target, mob/user , flag)
//TODO; Add support for reagents in water.
if( istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(src,target) <= 1)
if((istype(target, /obj/structure/reagent_dispensers)) && get_dist(src,target) <= 1)
var/obj/o = target
var/list/badshit=list()
for(var/bad_reagent in src.reagents_to_log)
if(o.reagents.has_reagent(bad_reagent))
badshit += reagents_to_log[bad_reagent]
if(badshit.len)
var/hl="\red <b>([english_list(badshit)])</b> \black"
message_admins("[user.name] ([user.ckey]) filled \a [src] with [o.reagents.get_reagent_ids()] [hl]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
log_game("[user.name] ([user.ckey]) filled \a [src] with [o.reagents.get_reagent_ids()] [hl]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
o.reagents.trans_to(src, 50)
user << "\blue \The [src] is now refilled"
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
return
if (!safety)
if(is_open_container() && reagents.total_volume)
user << "\blue You empty \the [src] onto [target]."
if(reagents.has_reagent("fuel"))
message_admins("[user.name] ([user.ckey]) poured Welder Fuel onto [target]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
log_game("[user.name] ([user.ckey]) poured Welder Fuel onto [target]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
src.reagents.reaction(target, TOUCH)
spawn(5) src.reagents.clear_reagents()
return
if (!safety && !is_open_container())
if (src.reagents.total_volume < 1)
usr << "\red \The [src] is empty."
return
@@ -87,6 +130,15 @@
if (world.time < src.last_use + 20)
return
var/list/badshit=list()
for(var/bad_reagent in src.reagents_to_log)
if(reagents.has_reagent(bad_reagent))
badshit += reagents_to_log[bad_reagent]
if(badshit.len)
var/hl="\red <b>([english_list(badshit)])</b> \black"
message_admins("[user.name] ([user.ckey]) used \a [src] filled with [reagents.get_reagent_ids(1)] [hl]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
log_game("[user.name] ([user.ckey]) used \a [src] filled with [reagents.get_reagent_ids(1)] [hl]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
src.last_use = world.time
playsound(src.loc, 'sound/effects/extinguish.ogg', 75, 1, -3)
@@ -148,9 +200,9 @@
W.reagents.reaction(get_turf(W))
for(var/atom/atm in get_turf(W))
if(!W) return
W.reagents.reaction(atm)
if(isliving(atm)) //For extinguishing mobs on fire
var/mob/living/M = atm
W.reagents.reaction(atm, TOUCH) // Touch, since we sprayed it.
if(isliving(atm) && W.reagents.has_reagent("water")) // For extinguishing mobs on fire
var/mob/living/M = atm // Why isn't this handled by the reagent? - N3X
M.ExtinguishMob()
if(W.loc == my_target) break
sleep(2)
@@ -160,4 +212,4 @@
step(user, user.inertia_dir)
else
return ..()
return
return
@@ -27,6 +27,9 @@
if (ishuman(usr) || ismonkey(usr)) //so monkeys can take off their backpacks -- Urist
var/mob/M = usr
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return
if(over_object == M && Adjacent(M)) // this must come before the screen objects only block
orient2hud(M) // dunno why it wasn't before
if(M.s_active)
+1 -1
View File
@@ -328,7 +328,7 @@
cremating = 1
locked = 1
icon_state = "cremate_active"
icon_state = "crema_active"
for(var/mob/living/M in contents)
if (M.stat!=2)
+1 -1
View File
@@ -107,7 +107,7 @@
else
M.inertia_dir = 0
return
else if(!istype(M, /mob/living/carbon/slime) || (M:species.bodyflags & FEET_NOSLIP))
else if(!istype(M, (/mob/living/carbon/slime || /mob/living/carbon/human/slime)) || (M:species.bodyflags & FEET_NOSLIP))
if (M.m_intent == "run")
M.stop_pulling()
step(M, M.dir)
+6
View File
@@ -107,6 +107,12 @@
..()
name = "plating"
/turf/simulated/floor/plating/airless/catwalk
icon = 'icons/turf/catwalks.dmi'
icon_state = "Floor3"
name = "catwalk"
desc = "Cats really don't like these things."
/turf/simulated/floor/bluegrid
icon = 'icons/turf/floors.dmi'
icon_state = "bcircuit"
+6
View File
@@ -29,3 +29,9 @@
New()
..()
name = "plating"
/turf/unsimulated/floor/plating/airless/catwalk
icon = 'icons/turf/catwalks.dmi'
icon_state = "catwalk0"
name = "catwalk"
desc = "Cats really don't like these things."
-1
View File
@@ -284,7 +284,6 @@
getFiles(
// 'nano/js/libraries.min.js',
'nano/js/libraries/1-jquery.js',
'nano/js/libraries/2-jsviews.js',
'nano/js/libraries/3-jquery.timers.js',
'nano/js/nano_update.js',
'nano/js/nano_config.js',
+4 -4
View File
@@ -16,7 +16,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
"infested monkey" = IS_MODE_COMPILED("monkey"), // 9
"ninja" = "true", // 10
"vox raider" = IS_MODE_COMPILED("heist"), // 11
"diona" = 1, // 12
"slime" = 1, // 12
"vampire" = IS_MODE_COMPILED("vampire") // 13
)
@@ -556,7 +556,7 @@ datum/preferences
return 1
proc/ShowDisabilityState(mob/user,flag,label)
if(flag==DISABILITY_FLAG_FAT && species!="Human")
if(flag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey"))
return "<li><i>[species] cannot be fat.</i></li>"
return "<li><b>[label]:</b> <a href=\"?_src_=prefs;task=input;preference=disabilities;disability=[flag]\">[disabilities & flag ? "Yes" : "No"]</a></li>"
@@ -798,7 +798,7 @@ datum/preferences
if("input")
var/dflag=text2num(href_list["disability"])
if(dflag >= 0)
if(!(dflag==DISABILITY_FLAG_FAT && species!="Human"))
if(!(dflag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey")))
disabilities ^= text2num(href_list["disability"]) //MAGIC
SetDisabilities(user)
else
@@ -1305,7 +1305,7 @@ datum/preferences
I.mechanize()
else continue
if(disabilities & DISABILITY_FLAG_FAT && species=="Human")//character.species.flags & CAN_BE_FAT)
if(disabilities & DISABILITY_FLAG_FAT && character.species.flags & CAN_BE_FAT)//character.species.flags & CAN_BE_FAT)
character.mutations += FAT
if(disabilities & DISABILITY_FLAG_NEARSIGHTED)
character.disabilities|=NEARSIGHTED
+1 -1
View File
@@ -84,10 +84,10 @@
prefs.save_preferences()
if(prefs.toggles & SOUND_MIDI)
src << "You will now hear any sounds uploaded by admins."
else
var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = 777)
break_sound.priority = 250
src << break_sound //breaks the client's sound output on channel 777
else
src << "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled."
feedback_add_details("admin_verb","TMidi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+3 -5
View File
@@ -63,9 +63,10 @@ var/global/list/possibleEvents = list()
possibleEvents[/datum/event/money_hacker] = max(min(25, player_list.len) * 4, 200)
possibleEvents[/datum/event/carp_migration] = 50 + 50 * active_with_role["Engineer"]
possibleEvents[/datum/event/spider_infestation] = 50 + 50 * active_with_role["Security"]
possibleEvents[/datum/event/dust] = 50 + 50 * active_with_role["Engineer"]
possibleEvents[/datum/event/dust/meaty] = 50 + 50 * active_with_role["Engineer"]
possibleEvents[/datum/event/brand_intelligence] = 50 + 25 * active_with_role["Janitor"]
possibleEvents[/datum/event/brand_intelligence] = 50 + 25 * active_with_role["Engineer"]
possibleEvents[/datum/event/rogue_drone] = 25 + 25 * active_with_role["Engineer"] + 25 * active_with_role["Security"]
possibleEvents[/datum/event/infestation] = 50 + 25 * active_with_role["Janitor"]
@@ -75,9 +76,8 @@ var/global/list/possibleEvents = list()
possibleEvents[/datum/event/grid_check] = 25 + 20 * active_with_role["Engineer"]
possibleEvents[/datum/event/electrical_storm] = 10 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"]
possibleEvents[/datum/event/wallrot] = 30 * active_with_role["Engineer"] + 50 * active_with_role["Botanist"]
possibleEvents[/datum/event/spacevine] = 25 + 5 * active_with_role["Engineer"]
if(!spacevines_spawned)
possibleEvents[/datum/event/spacevine] = 25 + 5 * active_with_role["Engineer"]
if(minutes_passed >= 30) // Give engineers time to set up engine
possibleEvents[/datum/event/meteor_wave] = 10 * active_with_role["Engineer"]
possibleEvents[/datum/event/meteor_shower] = 40 * active_with_role["Engineer"]
@@ -96,8 +96,6 @@ var/global/list/possibleEvents = list()
possibleEvents[/datum/event/prison_break] = active_with_role["Security"] * 50
if(active_with_role["Security"] > 0)
if(!sent_spiders_to_station)
possibleEvents[/datum/event/spider_infestation] = max(active_with_role["Security"], 5) + 5
if(aliens_allowed && !sent_aliens_to_station)
possibleEvents[/datum/event/alien_infestation] = max(active_with_role["Security"], 5) + 2.5
if(!sent_ninja_to_station && toggle_space_ninja)
+16 -27
View File
@@ -362,7 +362,7 @@ ________________________________________________________________________________
del(gloves)
var/obj/item/device/radio/R = new /obj/item/device/radio/headset(src)
equip_to_slot_or_del(R, slot_l_ear)
equip_to_slot_or_del(R, slot_ears)
if(gender==FEMALE)
equip_to_slot_or_del(new /obj/item/clothing/under/color/blackf(src), slot_w_uniform)
else
@@ -377,6 +377,10 @@ ________________________________________________________________________________
equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen(src), slot_s_store)
equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(src), slot_back)
var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(src)
E.imp_in = src
E.implanted = 1
return 1
//=======//HELPER PROCS//=======//
@@ -1589,7 +1593,7 @@ ________________________________________________________________________________
dat += "<h2 ALIGN=CENTER>SpiderOS v.<b>ERR-RR00123</b></h2>"
dat += "<br>"
dat += "<img src=sos_10.png> Current Time: [worldtime2text()]<br>"
dat += "<img src=sos_9.png> Battery Life: [round(cell.charge)] ([round(cell.charge/100)]%)<br>"
dat += "<img src=sos_9.png> Battery Life: [round(cell.charge/100)]%<br>"
dat += "<img src=sos_11.png> Smoke Bombs: \Roman [s_bombs]<br>"
dat += "<img src=sos_14.png> pai Device: "
if(pai)
@@ -1722,11 +1726,11 @@ ________________________________________________________________________________
</ul>
<b>Abilities</b>:
<ul>
<li>*<b>Phase Shift</b> (<i>500E</i>) and <b>Phase Jaunt</b> (<i>250E</i>) are unique powers in that they can both be used for defense and offense. Jaunt launches the ninja forward facing up to 9 squares, somewhat randomly selecting the final destination. Shift can only be used on turf in view but is precise (cannot be used on walls). Any living mob in the area teleported to is instantly gibbed (mechs are damaged, huggers and other similar critters are killed). It is possible to teleport with a target, provided you grab them before teleporting. </li>
<li>*<b>Energy Blade</b> (<i>200E</i>) is a highly effective weapon. It is summoned directly to the ninja's hand and can also function as an EMAG for certain objects (doors/lockers/etc). You may also use it to cut through walls and disabled doors. Experiment! The blade will crit humans in two hits. This item cannot be placed in containers and when dropped or thrown disappears. Having an energy blade drains more power from the battery each tick.</li>
<li>*<b>EM Pulse</b> (<i>1000E</i>) is a highly useful ability that will create an electromagnetic shockwave around the ninja, disabling technology whenever possible. If used properly it can render a security force effectively useless. Of course, getting beat up with a toolbox is not accounted for.</li>
<li>*<b>Phase Shift</b> (<i>2000E</i>) and <b>Phase Jaunt</b> (<i>1000E</i>) are unique powers in that they can both be used for defense and offense. Jaunt launches the ninja forward facing up to 9 squares, somewhat randomly selecting the final destination. Shift can only be used on turf in view but is precise (cannot be used on walls). Any living mob in the area teleported to is instantly gibbed (mechs are damaged, huggers and other similar critters are killed). It is possible to teleport with a target, provided you grab them before teleporting.</li>
<li>*<b>Energy Blade</b> (<i>500E</i>) is a highly effective weapon. It is summoned directly to the ninja's hand and can also function as an EMAG for certain objects (doors/lockers/etc). You may also use it to cut through walls and disabled doors. Experiment! The blade will crit humans in two hits. This item cannot be placed in containers and when dropped or thrown disappears. Having an energy blade drains more power from the battery each tick.</li>
<li>*<b>EM Pulse</b> (<i>2500E</i>) is a highly useful ability that will create an electromagnetic shockwave around the ninja, disabling technology whenever possible. If used properly it can render a security force effectively useless. Of course, getting beat up with a toolbox is not accounted for.</li>
<li>*<b>Energy Star</b> (<i>500E</i>) is a ninja star made of green energy AND coated in poison. It works by picking a random living target within range and can be spammed to great effect in incapacitating foes. Just remember that the poison used is also used by the Xeno Hivemind (and will have no effect on them).</li>
<li>*<b>Energy Net</b> (<i>5000E</i>) is a non-lethal solution to incapacitating humanoids. The net is made of non-harmful phase energy and will halt movement as long as it remains in effect--it can be destroyed. If the net is not destroyed, after a certain time it will teleport the target to a holding facility for the Spider Clan and then vanish. You will be notified if the net fails or succeeds in capturing a target in this manner. Combine with energy stars or stripping to ensure success. Abduction never looked this leet.</li>
<li>*<b>Energy Net</b> (<i>2000E</i>) is a non-lethal solution to incapacitating humanoids. The net is made of non-harmful phase energy and will halt movement as long as it remains in effect--it can be destroyed. If the net is not destroyed, after a certain time it will teleport the target to a holding facility for the Spider Clan and then vanish. You will be notified if the net fails or succeeds in capturing a target in this manner. Combine with energy stars or stripping to ensure success. Abduction never looked this leet.</li>
<li>*<b>Adrenaline Boost</b> (<i>1 E. Boost/3</i>) recovers the user from stun, weakness, and paralysis. Also injects 20 units of radium into the bloodstream.</li>
<li>*<b>Smoke Bomb</b> (<i>1 Sm.Bomb/10</i>) is a weak but potentially useful ability. It creates harmful smoke and can be used in tandem with other powers to confuse enemies.</li>
<li>*<b>???</b>: unleash the <b>True Ultimate Power!</b></li>
@@ -2336,32 +2340,17 @@ ________________________________________________________________________________
if("CELL")
var/obj/item/weapon/cell/A = target
var/drainrate
if(A.charge)
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, A.loc)
if (G.candrain&&do_after(U,30))
drain = rand(G.mindrain,G.maxdrain)
if(S.cell.charge+A.charge<S.cell.maxcharge)
while(S.cell.charge!=S.cell.maxcharge)
while(S.cell.maxcharge-S.cell.charge > drain)
S.cell.charge+=drain
totaldrain+=drain
A.charge-=drain
spark_system.start()
playsound(A.loc, "sparks", 50, 1)
S.cell.charge = S.cell.maxcharge
U << "\blue Gained <B>[A.charge]</B> energy from the cell."
if(S.cell.charge+A.charge>S.cell.maxcharge)
S.cell.charge=S.cell.maxcharge
else
while(A.charge)
S.cell.charge+=drain
totaldrain+=drain
A.charge-=drain
spark_system.start()
playsound(A.loc, "sparks", 50, 1)
S.cell.charge+=A.charge
A.charge = 0
G.draining = 0
A.corrupt()
A.updateicon()
U << "\blue Gained <B>[totaldrain]</B> energy from the cell."
else
U << "\red Procedure interrupted. Protocol terminated."
else
@@ -2559,7 +2548,7 @@ ________________________________________________________________________________
U.client.images += image(tempHud,target,"hudninja")
else//If we don't know what role they have but they have one.
U.client.images += image(tempHud,target,"hudunknown1")
else//If the silicon mob has no law datum, no inherent laws, or a law zero, add them to the hud.
else if(issilicon(target))//If the silicon mob has no law datum, no inherent laws, or a law zero, add them to the hud.
var/mob/living/silicon/silicon_target = target
if(!silicon_target.laws||(silicon_target.laws&&(silicon_target.laws.zeroth||!silicon_target.laws.inherent.len)))
if(isrobot(silicon_target))//Different icons for robutts and AI.
+7 -1
View File
@@ -19,7 +19,13 @@ datum/event/viral_infection/start()
if(!candidates.len) return
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
var/datum/disease2/disease/D = new /datum/disease2/disease
D.makerandom()
D.infectionchance = 1
message_admins("Viral Infection: releasing strain [D.uniqueID]")
while(severity > 0 && candidates.len)
infect_mob_random_lesser(candidates[1])
var/mob/living/carbon/human/H = candidates[1]
H.virus2["[D.uniqueID]"] = D
candidates.Remove(candidates[1])
severity--
+6 -5
View File
@@ -19,11 +19,12 @@ datum/event/viral_outbreak/start()
if(!candidates.len) return
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
while(severity > 0 && candidates.len)
if(prob(33))
infect_mob_random_lesser(candidates[1])
else
infect_mob_random_greater(candidates[1])
var/datum/disease2/disease/D = new /datum/disease2/disease
D.makerandom()
message_admins("Viral Outbreak: releasing strain [D.uniqueID]")
while(severity > 0 && candidates.len)
var/mob/living/carbon/human/H = candidates[1]
H.virus2["[D.uniqueID]"] = D
candidates.Remove(candidates[1])
severity--
+10 -3
View File
@@ -11,8 +11,9 @@ Creature-level abilities.
set name = "Ventcrawl (Slime People)"
set desc = "The ability to crawl through vents if naked and not holding anything."
if(istype(src,/mob/living/carbon/human/slime))
var/mob/living/carbon/M = src
if(istype(usr,/mob/living/carbon/human/slime))
var/mob/living/carbon/human/slime/M = usr
// Check if the client has a mob and if the mob is valid and alive.
if(M.stat==2)
M << "\red You must be corporeal and alive to do that."
@@ -27,4 +28,10 @@ Creature-level abilities.
M << "\red You cannot do this while cuffed."
return 0
handle_ventcrawl()
if(M.contents.len != 0)
M << "\red You need to be naked and have nothing in your hands to ventcrawl."
return 0
M.handle_ventcrawl()
else
src << "This should not be happening. At all."
+1 -1
View File
@@ -55,7 +55,7 @@
name = "Bubblish"
desc = "Languages of slimes, a mixture of bubbling noises and pops. Almost impossible to speak without mechanical aid for non slime people."
speech_verb = "bubbles and pops"
colour = "slime"
colour = "skrell"
key = "f"
flags = RESTRICTED
@@ -89,14 +89,8 @@
if(!gibbed)
emote("deathgasp") //let the world KNOW WE ARE DEAD
//For ninjas exploding when they die.
if( istype(wear_suit, /obj/item/clothing/suit/space/space_ninja) && wear_suit:s_initialized )
src << browse(null, "window=spideros")//Just in case.
var/location = loc
explosion(location, 0, 0, 3, 4)
update_canmove()
if(client) blind.layer = 0
if(client) blind.layer = 0
tod = worldtime2text() //weasellos time of death patch
if(mind) mind.store_memory("Time of death: [tod]", 0)
@@ -446,6 +446,8 @@ proc/get_damage_icon_part(damage_state, body_part)
remove_overlay(FIRE_LAYER)
if(on_fire)
overlays_standing[FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"=-FIRE_LAYER)
else
overlays_standing[FIRE_LAYER] = null
apply_overlay(FIRE_LAYER)
@@ -2,6 +2,38 @@
Tiny babby plant critter plus procs.
*/
//Helper object for picking dionaea up.
/obj/item/weapon/diona_holder
name = "diona nymph"
desc = "It's a tiny plant critter."
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
slot_flags = SLOT_HEAD
origin_tech = "magnets=3;biotech=5"
/obj/item/weapon/diona_holder/New()
..()
processing_objects.Add(src)
/obj/item/weapon/diona_holder/Del()
processing_objects.Remove(src)
..()
/obj/item/weapon/diona_holder/process()
if(!loc) return
if(!istype(loc,/mob/living))
for(var/mob/M in contents)
M.loc = get_turf(src)
del(src)
/obj/item/weapon/diona_holder/attackby(obj/item/weapon/W as obj, mob/user as mob)
for(var/mob/M in src.contents)
M.attackby(W,user)
//Mob defines.
/mob/living/carbon/monkey/diona
name = "diona nymph"
voice_name = "diona nymph"
@@ -19,6 +51,20 @@
add_language("Rootspeak")
verbs -= /mob/living/carbon/monkey/verb/ventcrawl
/mob/living/carbon/monkey/diona/attack_hand(mob/living/carbon/human/M as mob)
//Let people pick the little buggers up.
if(M.a_intent == "help")
var/obj/item/weapon/diona_holder/D = new(loc)
src.loc = D
D.name = loc.name
D.attack_hand(M)
M << "You scoop up [src]."
src << "[M] scoops you up."
return
..()
//Verbs after this point.
/mob/living/carbon/monkey/diona/verb/dionaventcrawl()
set name = "Crawl through Vent"
@@ -81,6 +127,12 @@
src.visible_message("\red [src] begins to shift and quiver, and erupts in a shower of shed bark and twigs!","\red You begin to shift and quiver, then erupt in a shower of shed bark and twigs, attaining your adult form!")
var/mob/living/carbon/human/adult = new(loc)
adult.set_species("Diona")
if(istype(loc,/obj/item/weapon/diona_holder/))
var/obj/item/weapon/diona_holder/L = loc
src.loc = L.loc
del(L)
for(var/datum/language/L in languages)
adult.add_language(L.name)
adult.regenerate_icons()
@@ -19,7 +19,7 @@
if(loc)
environment = loc.return_air()
if (stat != DEAD) //still breathing
if (stat != DEAD && !istype(src,/mob/living/carbon/monkey/diona)) //still breathing
//First, resolve location and get a breath
if(air_master.current_cycle%4==2)
//Only try to take a breath every 4 seconds, unless suffocating
+1 -1
View File
@@ -87,7 +87,7 @@
primitive = /mob/living/carbon/monkey/tajara
flags = HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL
flags = HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL | CAN_BE_FAT
bodyflags = FEET_PADDED
/datum/species/skrell
+4 -1
View File
@@ -203,7 +203,10 @@
L += src.contents
for(var/obj/item/weapon/storage/S in src.contents) //Check for storage items
L += get_contents(S)
for(var/obj/item/clothing/suit/storage/S in src.contents)//Check for labcoats and jackets
L += get_contents(S)
for(var/obj/item/clothing/tie/storage/S in src.contents)//Check for holsters
L += get_contents(S)
for(var/obj/item/weapon/gift/G in src.contents) //Check for gift-wrapped items
L += G.gift
if(istype(G.gift, /obj/item/weapon/storage))
+1 -1
View File
@@ -80,7 +80,7 @@ var/list/ai_list = list()
if (istype(L, /datum/ai_laws))
laws = L
else
laws = new base_law_type
make_laws()
verbs += /mob/living/silicon/ai/proc/show_laws_verb
+1 -1
View File
@@ -18,7 +18,7 @@
/mob/living/silicon/ai/proc/laws_sanity_check()
if (!src.laws)
src.laws = new base_law_type
make_laws()
/mob/living/silicon/ai/proc/set_zeroth_law(var/law, var/law_borg)
src.laws_sanity_check()
+46 -30
View File
@@ -32,7 +32,8 @@
var/announcing_vox = 0 // Stores the time of the last announcement
var/const/VOX_CHANNEL = 200
var/const/VOX_DELAY = 600
var/const/VOX_DELAY = 100
var/const/VOX_PATH = "sound/vox_fem/"
/mob/living/silicon/ai/verb/announcement_help()
@@ -61,45 +62,53 @@ var/const/VOX_DELAY = 600
/mob/living/silicon/ai/verb/announcement()
set name = "Announcement"
set desc = "Create a vocal announcement by typing in the available words to create a sentence."
set category = "AI Commands"
set name = "Announcement"
set desc = "Create a vocal announcement by typing in the available words to create a sentence."
set category = "AI Commands"
if(src.stat == 2)
src << "You can't call the shuttle because you are dead!"
return
if(istype(usr,/mob/living/silicon/ai))
var/mob/living/silicon/ai/AI = src
if(AI.control_disabled)
usr << "Wireless control is disabled!"
return
if(announcing_vox > world.time)
src << "<span class='notice'>Please wait [round((announcing_vox - world.time) / 10)] seconds.</span>"
return
if(announcing_vox > world.time)
src << "<span class='notice'>Please wait [round((announcing_vox - world.time) / 10)] seconds.</span>"
return
var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", src.last_announcement) as text
var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", src.last_announcement) as text
last_announcement = message
last_announcement = message
if(!message || announcing_vox > world.time)
return
if(!message || announcing_vox > world.time)
return
var/list/words = stringsplit(trim(message), " ")
var/list/incorrect_words = list()
var/list/words = stringsplit(trim(message), " ")
var/list/incorrect_words = list()
if(words.len > 30)
words.len = 30
if(words.len > 30)
words.len = 30
for(var/word in words)
word = trim(word)
if(!word)
words -= word
continue
if(!vox_sounds[word])
incorrect_words += word
for(var/word in words)
word = lowertext(trim(word))
if(!word)
words -= word
continue
if(!vox_sounds[word])
incorrect_words += word
if(incorrect_words.len)
src << "<span class='notice'>These words are not available on the announcement system: [english_list(incorrect_words)].</span>"
return
if(incorrect_words.len)
src << "<span class='notice'>These words are not available on the announcement system: [english_list(incorrect_words)].</span>"
return
announcing_vox = world.time + VOX_DELAY
announcing_vox = world.time + VOX_DELAY
log_game("[key_name_admin(src)] made a vocal announcement with the following message: [message].")
log_game("[key_name_admin(src)] made a vocal announcement with the following message: [message].")
for(var/word in words)
play_vox_word(word, src.z, null)
for(var/word in words)
play_vox_word(word, src.z, null)
/proc/play_vox_word(var/word, var/z_level, var/mob/only_listener)
@@ -125,4 +134,11 @@ var/const/VOX_DELAY = 600
return 1
return 0
// VOX sounds moved to /code/defines/vox_sounds.dm
// VOX sounds moved to /code/defines/vox_sounds.dm
/client/proc/preload_vox()
var/list/vox_files = flist(VOX_PATH)
for(var/file in vox_files)
// src << "Downloading [file]"
var/sound/S = sound("[VOX_PATH][file]")
src << browse_rsc(S)
+10 -2
View File
@@ -70,7 +70,7 @@
/mob/living/silicon/robot/proc/laws_sanity_check()
if (!laws)
laws = new base_law_type
make_laws()
/mob/living/silicon/robot/proc/set_zeroth_law(var/law)
laws_sanity_check()
@@ -98,4 +98,12 @@
/mob/living/silicon/robot/proc/clear_ion_laws()
laws_sanity_check()
laws.clear_ion_laws()
laws.clear_ion_laws()
/mob/living/silicon/proc/make_laws()
switch(config.default_laws)
if(0) laws = new /datum/ai_laws/default/asimov()
if(1) laws = new /datum/ai_laws/custom()
if(2)
var/datum/ai_laws/lawtype = pick(typesof(/datum/ai_laws/default) - /datum/ai_laws/default)
laws = new lawtype()
@@ -64,6 +64,7 @@
var/braintype = "Cyborg"
var/pose
var/base_icon = ""
var/crisis = 0
/mob/living/silicon/robot/New(loc,var/syndie = 0,var/unfinished = 0, var/alien = 0)
spark_system = new /datum/effect/effect/system/spark_spread()
@@ -94,7 +95,7 @@
connected_ai = select_active_alien_ai()
scrambledcodes = 1
else
laws = new /datum/ai_laws/nanotrasen()
make_laws()
connected_ai = select_active_ai_with_fewest_borgs()
if(connected_ai)
connected_ai.connected_robots += src
@@ -154,7 +155,7 @@
return
var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security")
if(security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON))
if(security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON) || crisis)
src << "\red Crisis mode active. Combat module available."
modules+="Combat"
if(mmi != null && mmi.alien)
@@ -588,6 +589,7 @@
return
if (istype(W, /obj/item/weapon/weldingtool))
if(W == module_active) return
if (!getBruteLoss())
user << "Nothing to fix here!"
return
@@ -42,6 +42,8 @@
attacktext = "nips"
friendly = "prods"
wander = 0
small = 1
density = 0
pass_flags = PASSTABLE
var/used_dominate
+12 -10
View File
@@ -241,6 +241,8 @@ var/list/slot_equipment_priority = list( \
set category = "Object"
set src = usr
if(istype(loc,/obj/mecha)) return
if(hand)
var/obj/item/W = l_hand
if (W)
@@ -926,16 +928,16 @@ mob/verb/yank_out_object()
/mob/verb/respawn()
set name = "Respawn as Mindless"
set name = "Respawn as NPC"
set category = "OOC"
if((usr in respawnable_list) && (stat==2 || istype(usr,/mob/dead/observer)))
var/list/creatures = list("Mouse")
for(var/mob/living/simple_animal/S in living_mob_list)
if(safe_animal_respawn(S.type))
if(!S.key)
creatures += S
var/picked = input("Please select a creature to respawn as", "Respawn as Mindless Creature") as null|anything in creatures
for(var/mob/living/L in living_mob_list)
if(safe_respawn(L.type))
if(!L.key)
creatures += L
var/picked = input("Please select an NPC to respawn as", "Respawn as NPC") as null|anything in creatures
switch(picked)
if("Mouse")
respawnable_list -= usr
@@ -943,10 +945,10 @@ mob/verb/yank_out_object()
spawn(5)
respawnable_list += usr
else
var/mob/living/simple_animal/picked_animal = picked
if(istype(picked_animal) && !picked_animal.key)
var/mob/living/NPC = picked
if(istype(NPC) && !NPC.key)
respawnable_list -= usr
picked_animal.key = key
NPC.key = key
spawn(5)
respawnable_list += usr
else
@@ -983,4 +985,4 @@ mob/verb/yank_out_object()
host << "<span class='info'>You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.</span>"
else
usr << "You are not dead or you have given up your right to be respawned!"
return
return
+2
View File
@@ -94,6 +94,8 @@
return 1
else if (istype(other, /mob/living/simple_animal) && istype(src, /mob/living/simple_animal))
return 1
else if (istype(other, /mob/living/carbon/human) && istype(src, /mob/living/simple_animal/borer))
return 1
return 0
/mob/proc/say_quote(var/text,var/datum/language/speaking)
+13 -5
View File
@@ -77,7 +77,7 @@
/mob/proc/AIize()
if(client)
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jams for AIs
var/mob/living/silicon/ai/O = new (loc, base_law_type,,1)//No MMI but safety is in effect.
var/mob/living/silicon/ai/O = new (loc,,,1)//No MMI but safety is in effect.
O.invisibility = 0
O.aiRestorePowerRoutine = 0
@@ -382,12 +382,12 @@
return 0
/mob/proc/safe_animal_respawn(var/MP)
/mob/proc/safe_respawn(var/MP)
//Bad mobs! - Remember to add a comment explaining what's wrong with the mob
if(!MP)
return 0 //Sanity, this should never happen.
//Good mobs!
//Animals!
if(ispath(MP, /mob/living/simple_animal/cat))
return 1
if(ispath(MP, /mob/living/simple_animal/corgi))
@@ -402,12 +402,20 @@
return 1
if(ispath(MP, /mob/living/simple_animal/pony))
return 1
//Antag Creatures!
if(ispath(MP, /mob/living/simple_animal/hostile/carp))
return 1
if(ispath(MP, /mob/living/simple_animal/hostile/bear))
return 1
if(ispath(MP, /mob/living/simple_animal/hostile/giant_spider))
return 1
if(ispath(MP, /mob/living/simple_animal/borer))
return 1
if(ispath(MP, /mob/living/carbon/alien))
return 1
//Friendly Creatures!
if(ispath(MP, /mob/living/carbon/monkey/diona))
return 1
//Not in here? Must be untested!
return 0
+82 -12
View File
@@ -13,6 +13,29 @@
/datum/nanomanager/New()
return
/**
* Get an open /nanoui ui for the current user, src_object and ui_key and try to update it with data
*
* @param user /mob The mob who opened/owns the ui
* @param src_object /obj|/mob The obj or mob which the ui belongs to
* @param ui_key string A string key used for the ui
* @param ui /datum/nanoui An existing instance of the ui (can be null)
* @param data list The data to be passed to the ui, if it exists
*
* @return /nanoui Returns the found ui, for null if none exists
*/
/datum/nanomanager/proc/try_update_ui(var/mob/user, src_object, ui_key, var/datum/nanoui/ui, data)
if (!ui) // no ui has been passed, so we'll search for one
{
ui = get_open_ui(user, src, ui_key)
}
if (ui)
// The UI is already open so push the data to it
ui.push_data(data)
return ui
return null
/**
* Get an open /nanoui ui for the current user, src_object and ui_key
*
@@ -20,7 +43,7 @@
* @param src_object /obj|/mob The obj or mob which the ui belongs to
* @param ui_key string A string key used for the ui
*
* @return /nanoui Returns the found ui, for null if none exists
* @return /nanoui Returns the found ui, or null if none exists
*/
/datum/nanomanager/proc/get_open_ui(var/mob/user, src_object, ui_key)
var/src_object_key = "\ref[src_object]"
@@ -55,6 +78,49 @@
update_count++
return update_count
/**
* Update /nanoui uis belonging to user
*
* @param user /mob The mob who owns the uis
* @param src_object /obj|/mob If src_object is provided, only update uis which are attached to src_object (optional)
* @param ui_key string If ui_key is provided, only update uis with a matching ui_key (optional)
*
* @return int The number of uis updated
*/
/datum/nanomanager/proc/update_user_uis(var/mob/user, src_object = null, ui_key = null)
if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
return 0 // has no open uis
var/update_count = 0
for (var/datum/nanoui/ui in user.open_uis)
if ((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key))
ui.process(1)
update_count++
return update_count
/**
* Close /nanoui uis belonging to user
*
* @param user /mob The mob who owns the uis
* @param src_object /obj|/mob If src_object is provided, only close uis which are attached to src_object (optional)
* @param ui_key string If ui_key is provided, only close uis with a matching ui_key (optional)
*
* @return int The number of uis closed
*/
/datum/nanomanager/proc/close_user_uis(var/mob/user, src_object = null, ui_key = null)
if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
return 0 // has no open uis
var/close_count = 0
for (var/datum/nanoui/ui in user.open_uis)
if ((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key))
ui.close()
close_count++
return close_count
/**
* Add a /nanoui ui to the list of open uis
* This is called by the /nanoui open() proc
@@ -114,22 +180,26 @@
/**
* This is called when a player transfers from one mob to another
* Transfers all open UIs to the new mob
*
* @param oldMob /mob The user's old mob
* @param newMob /mob The user's new mob
*
* @return nothing
*/
/**
* This is called when a player transfers from one mob to another
* Transfers all open UIs to the new mob
*
* @param oldMob /mob The user's old mob
* @param newMob /mob The user's new mob
*
* @return nothing
*/
/datum/nanomanager/proc/user_transferred(var/mob/oldMob, var/mob/newMob)
if (isnull(oldMob.open_uis) || !istype(oldMob.open_uis, /list) || open_uis.len == 0)
return 0 // has no open uis
if (isnull(newMob.open_uis) || !istype(newMob.open_uis, /list))
newMob.open_uis = list()
for (var/datum/nanoui/ui in oldMob.open_uis)
ui.user = newMob
newMob.open_uis.Add(ui)
oldMob.open_uis.Cut()
oldMob.open_uis.Cut()
return 1 // success
+5
View File
@@ -313,6 +313,7 @@ nanoui is used to open and update nano browser uis
<div id='uiWrapper'>
[title ? "<div id='uiTitleWrapper'><div id='uiStatusIcon' class='icon24 uiStatusGood'></div><div id='uiTitle'>[title]</div><div id='uiTitleFluff'></div></div>" : ""]
<div id='uiContent'>
<noscript><div id='uiNoJavaScript'>Your browser does not have JavaScript enabled. Please enable JavaScript restart SS13.</div></noscript>
"}
/**
@@ -427,6 +428,10 @@ nanoui is used to open and update nano browser uis
* @return nothing
*/
/datum/nanoui/proc/process(update = 0)
if (!src_object || !user)
close()
return
if (status && (update || is_auto_updating))
src_object.ui_interact(user, ui_key, src) // Update the UI (update_status() is called whenever a UI is updated)
else
+10
View File
@@ -506,6 +506,16 @@ datum
return res
// Admin logging.
get_reagent_ids(var/and_amount=0)
var/list/stuff = list()
for(var/datum/reagent/A in reagent_list)
if(and_amount)
stuff += "[get_reagent_amount(A.id)]U of [A.id]"
else
stuff += A.id
return english_list(stuff)
//two helper functions to preserve data across reactions (needed for xenoarch)
get_data(var/reagent_id)
for(var/datum/reagent/D in reagent_list)
+12 -9
View File
@@ -10,6 +10,7 @@
icon_state = "dispenser"
use_power = 0
idle_power_usage = 40
var/ui_title = "Chem Dispenser 5000"
var/energy = 100
var/max_energy = 100
var/amount = 30
@@ -107,7 +108,7 @@
*
* @return nothing
*/
/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main")
/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
if(stat & (BROKEN|NOPOWER)) return
if(user.stat || user.restrained()) return
@@ -145,17 +146,17 @@
chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("dispense" = temp.id)))) // list in a list because Byond merges the first list...
data["chemicals"] = chemicals
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, ui_key)
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
// the ui does not exist, so we'll create a new one
ui = new(user, src, ui_key, "chem_dispenser.tmpl", "Chem Dispenser 5000", 374, 640)
// When the UI is first opened this is the data it will use
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "chem_dispenser.tmpl", ui_title, 370, 605)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
ui.open()
else
// The UI is already open so push the new data to it
ui.push_data(data)
return
/obj/machinery/chem_dispenser/Topic(href, href_list)
if(stat & (NOPOWER|BROKEN))
@@ -245,6 +246,7 @@
icon_state = "soda_dispenser"
name = "soda fountain"
desc = "A drink fabricating machine, capable of producing many sugary drinks with just one touch."
ui_title = "Soda Dispens-o-matic"
energy = 100
max_energy = 100
dispensable_reagents = list("water","ice","coffee","tea","icetea","cola","spacemountainwind","dr_gibb","space_up","tonic","sodawater","lemon_lime","sugar","orangejuice","limejuice","tomatojuice" ,"watermelonjuice","berryjuice")
@@ -255,6 +257,7 @@
/obj/machinery/chem_dispenser/beer
icon_state = "booze_dispenser"
name = "booze dispenser"
ui_title = "Booze Portal 9001"
energy = 100
max_energy = 100
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
+66 -4
View File
@@ -460,7 +460,7 @@ datum
var/mob/living/carbon/human/human = M
if(human.dna.mutantrace == null)
M << "\red Your flesh rapidly mutates!"
human.dna.mutantrace = "slime"
human.dna.mutantrace = "shadow"
human.update_mutantrace()
..()
return
@@ -603,7 +603,7 @@ datum
for(var/mob/O in viewers(M, null))
O.show_message(text("\blue []'s eyes blink and become clearer.", M), 1) // So observers know it worked.
// Vamps react to this like acid
if((M.mind in ticker.mode.vampires) && prob(10))
if(((M.mind in ticker.mode.vampires) || M.mind.vampire) && prob(10))
if(!M) M = holder.my_atom
M.adjustToxLoss(1*REM)
M.take_organ_damage(0, 1*REM)
@@ -1740,11 +1740,32 @@ datum
var/mob/living/carbon/human/H = M
var/datum/organ/internal/eyes/E = H.internal_organs["eyes"]
if(istype(E))
E.damage = max(E.damage-5 , 0)
// M.sdisabilities &= ~1 Replaced by eye surgery
if(E.damage > 0)
E.damage -= 1
..()
return
peridaxon
name = "Peridaxon"
id = "peridaxon"
description = "Used to encourage recovery of internal organs and nervous systems. Medicate cautiously."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
overdose = 10
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/datum/organ/external/chest/C = H.get_organ("chest")
for(var/datum/organ/internal/I in C.internal_organs)
if(I.damage > 0)
I.damage -= 0.20
..()
return
bicaridine
name = "Bicaridine"
id = "bicaridine"
@@ -2083,6 +2104,47 @@ datum
return
potassium_chloride
name = "Potassium Chloride"
id = "potassium_chloride"
description = "A delicious salt that stops the heart when injected into cardiac muscle."
reagent_state = SOLID
color = "#FFFFFF" // rgb: 255,255,255
overdose = 30
on_mob_life(var/mob/living/carbon/M as mob)
var/mob/living/carbon/human/H = M
if(H.stat != 1)
if (volume >= overdose)
if(H.losebreath >= 10)
H.losebreath = max(10, H.losebreath-10)
H.adjustOxyLoss(2)
H.Weaken(10)
..()
return
potassium_chlorophoride
name = "Potassium Chlorophoride"
id = "potassium_chlorophoride"
description = "A specific chemical based on Potassium Chloride to stop the heart for surgery. Not safe to eat!"
reagent_state = SOLID
color = "#FFFFFF" // rgb: 255,255,255
overdose = 20
on_mob_life(var/mob/living/carbon/M as mob)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.stat != 1)
if(H.losebreath >= 10)
H.losebreath = max(10, M.losebreath-10)
H.adjustOxyLoss(2)
H.Weaken(10)
..()
return
/////////////////////////Food Reagents////////////////////////////
// Part of the food code. Nutriment is used instead of the old "heal_amt" code. Also is where all the food
// condiments, additives, and such go.
@@ -119,6 +119,13 @@ datum
// required_reagents = list("hydrogen" = 1, "carbon" = 1, "nitrogen" = 1)
// result_amount = 1
water //I can't believe we never had this.
name = "Water"
id = "water"
result = null
required_reagents = list("oxygen" = 2, "hydrogen" = 1)
result_amount = 1
thermite
name = "Thermite"
id = "thermite"
@@ -459,6 +466,27 @@ datum
required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1)
result_amount = 1
potassium_chloride
name = "Potassium Chloride"
id = "potassium_chloride"
id = "potassium_chloride"
required_reagents = list("sodiumchloride" = 1, "potassium" = 1)
result_amount = 2
potassium_chlorophoride
name = "Potassium Chlorophoride"
id = "potassium_chlorophoride"
id = "potassium_chlorophoride"
required_reagents = list("potassium_chloride" = 1, "plasma" = 1, "chloral_hydrate" = 1)
result_amount = 4
stoxin
name = "Sleep Toxin"
id = "stoxin"
result = "stoxin"
required_reagents = list("chloralhydrate" = 1, "sugar" = 4)
result_amount = 5
zombiepowder
name = "Zombie Powder"
id = "zombiepowder"
@@ -1098,6 +1126,33 @@ datum
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(B, pick(NORTH,SOUTH,EAST,WEST))
slimedrinks
name = "Slime Drinks"
id = "m_tele3"
result = null
required_reagents = list("water" = 5)
result_amount = 1
required_container = /obj/item/slime_extract/silver
required_other = 1
on_reaction(var/datum/reagents/holder)
var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/drinks) - /obj/item/weapon/reagent_containers/food/drinks
// BORK BORK BORK
playsound(get_turf_loc(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
for(var/mob/living/carbon/human/M in viewers(get_turf_loc(holder.my_atom), null))
if(M:eyecheck() <= 0)
flick("e_flash", M.flash)
for(var/i = 1, i <= 4 + rand(1,2), i++)
var/chosen = pick(borks)
var/obj/B = new chosen
if(B)
B.loc = get_turf_loc(holder.my_atom)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(B, pick(NORTH,SOUTH,EAST,WEST))
//Blue
@@ -220,3 +220,15 @@
New()
..()
reagents.add_reagent("virusfood", 1000)
/obj/structure/reagent_dispensers/spacecleanertank
name = "space cleaner refiller"
desc = "Refills space cleaner bottles."
icon = 'icons/obj/objects.dmi'
icon_state = "spacecleanertank"
anchored = 1
density = 0
amount_per_transfer_from_this = 250
New()
..()
reagents.add_reagent("cleaner",5000)
+28 -21
View File
@@ -386,7 +386,7 @@ datum/design/safeguard_module
req_tech = list("programming" = 3, "materials" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
build_path = "/obj/item/weapon/aiModule/safeguard"
build_path = /obj/item/weapon/aiModule/supplied/safeguard
datum/design/onehuman_module
name = "Module Design (OneHuman)"
@@ -395,7 +395,7 @@ datum/design/onehuman_module
req_tech = list("programming" = 4, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 100)
build_path = "/obj/item/weapon/aiModule/oneHuman"
build_path = /obj/item/weapon/aiModule/zeroth/oneHuman
datum/design/protectstation_module
name = "Module Design (ProtectStation)"
@@ -404,16 +404,7 @@ datum/design/protectstation_module
req_tech = list("programming" = 3, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
build_path = "/obj/item/weapon/aiModule/protectStation"
datum/design/notele_module
name = "Module Design (TeleporterOffline Module)"
desc = "Allows for the construction of a TeleporterOffline AI Module."
id = "notele_module"
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
build_path = "/obj/item/weapon/aiModule/teleporterOffline"
build_path = /obj/item/weapon/aiModule/supplied/protectStation
datum/design/quarantine_module
name = "Module Design (Quarantine)"
@@ -422,7 +413,7 @@ datum/design/quarantine_module
req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
build_path = "/obj/item/weapon/aiModule/quarantine"
build_path = /obj/item/weapon/aiModule/supplied/quarantine
datum/design/oxygen_module
name = "Module Design (OxygenIsToxicToHumans)"
@@ -431,7 +422,7 @@ datum/design/oxygen_module
req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
build_path = "/obj/item/weapon/aiModule/oxygen"
build_path = /obj/item/weapon/aiModule/supplied/oxygen
datum/design/freeform_module
name = "Module Design (Freeform)"
@@ -440,7 +431,7 @@ datum/design/freeform_module
req_tech = list("programming" = 4, "materials" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
build_path = "/obj/item/weapon/aiModule/freeform"
build_path = /obj/item/weapon/aiModule/supplied/freeform
datum/design/reset_module
name = "Module Design (Reset)"
@@ -449,7 +440,7 @@ datum/design/reset_module
req_tech = list("programming" = 3, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
build_path = "/obj/item/weapon/aiModule/reset"
build_path = /obj/item/weapon/aiModule/reset
datum/design/purge_module
name = "Module Design (Purge)"
@@ -458,7 +449,7 @@ datum/design/purge_module
req_tech = list("programming" = 4, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 100)
build_path = "/obj/item/weapon/aiModule/purge"
build_path = /obj/item/weapon/aiModule/reset/purge
datum/design/freeformcore_module
name = "Core Module Design (Freeform)"
@@ -467,7 +458,7 @@ datum/design/freeformcore_module
req_tech = list("programming" = 4, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 100)
build_path = "/obj/item/weapon/aiModule/freeformcore"
build_path = /obj/item/weapon/aiModule/core/freeformcore
datum/design/asimov
name = "Core Module Design (Asimov)"
@@ -476,7 +467,7 @@ datum/design/asimov
req_tech = list("programming" = 3, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 100)
build_path = "/obj/item/weapon/aiModule/asimov"
build_path = /obj/item/weapon/aiModule/core/full/asimov
datum/design/paladin_module
name = "Core Module Design (P.A.L.A.D.I.N.)"
@@ -485,7 +476,7 @@ datum/design/paladin_module
req_tech = list("programming" = 4, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 100)
build_path = "/obj/item/weapon/aiModule/paladin"
build_path = /obj/item/weapon/aiModule/core/full/paladin
datum/design/tyrant_module
name = "Core Module Design (T.Y.R.A.N.T.)"
@@ -494,9 +485,25 @@ datum/design/tyrant_module
req_tech = list("programming" = 4, "syndicate" = 2, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 100)
build_path = "/obj/item/weapon/aiModule/tyrant"
build_path = /obj/item/weapon/aiModule/core/full/tyrant
datum/design/corporate_module
name = "Core Module Design (Corporate)"
desc = "Allows for the construction of a Corporate AI Core Module."
id = "corporate_module"
req_tech = list("programming" = 4, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 100)
build_path = /obj/item/weapon/aiModule/core/full/corp
datum/design/custom_module
name = "Core Module Design (Custom)"
desc = "Allows for the construction of a Custom AI Core Module."
id = "custom_module"
req_tech = list("programming" = 4, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 100)
build_path = /obj/item/weapon/aiModule/core/full/custom
///////////////////////////////////
/////Subspace Telecomms////////////
@@ -114,7 +114,7 @@
if(total_purity && fresh_coolant)
coolant_purity = total_purity / fresh_coolant
/obj/machinery/radiocarbon_spectrometer/ui_interact(mob/user, ui_key = "radio_spectro")
/obj/machinery/radiocarbon_spectrometer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
if(user.stat)
return
@@ -144,20 +144,19 @@
data["radiation"] = round(radiation)
data["t_left_radspike"] = round(t_left_radspike)
data["rad_shield_on"] = rad_shield
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, ui_key)
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
// the ui does not exist, so we'll create a new one
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "geoscanner.tmpl", "High Res Radiocarbon Spectrometer", 900, 825)
// When the UI is first opened this is the data it will use
ui.set_initial_data(data)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
ui.open()
// Auto update every Master Controller tick
// auto update every Master Controller tick
ui.set_auto_update(1)
else
// The UI is already open so push the new data to it
ui.push_data(data)
return
/obj/machinery/radiocarbon_spectrometer/process()
if(scanning)
+1 -1
View File
@@ -132,7 +132,7 @@
if (target.op_stage.eyes == 3)
target.disabilities &= ~NEARSIGHTED
target.sdisabilities &= ~BLIND
eyes.damage -= 15
eyes.damage = 0
target.op_stage.eyes = 0
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+116 -27
View File
@@ -188,9 +188,9 @@
//////////////////////////////////////////////////////////////////
/datum/surgery_step/ribcage/fix_chest_internal
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchenknife = 75, \
/obj/item/weapon/shard = 50, \
/obj/item/stack/medical/advanced/bruise_pack= 100, \
/obj/item/stack/medical/bruise_pack = 20, \
/obj/item/stack/medical/bruise_pack/tajaran = 70, \
)
min_duration = 70
@@ -212,22 +212,58 @@
var/datum/organ/internal/liver/liver = target.internal_organs["liver"]
var/datum/organ/internal/liver/kidney = target.internal_organs["kidney"]
if(lungs.damage > 0)
user.visible_message("[user] starts mending the rupture in [target]'s lungs with \the [tool].", \
"You start mending the rupture in [target]'s lungs with \the [tool]." )
if(heart.damage > 0)
if(heart.robotic < 2)
user.visible_message("[user] starts mending the bruises on [target]'s heart with \the [tool].", \
"You start mending the bruises on [target]'s heart with \the [tool]." )
if(heart.robotic == 2)
user.visible_message("\blue [user] attempts to repair [target]'s mechanical heart with \the [tool]...", \
"\blue You attempt to repair [target]'s heart with \the [tool]...")
if(liver.damage > 0)
user.visible_message("[user] starts mending the bruises on [target]'s liver with \the [tool].", \
"You start mending the bruises on [target]'s liver with \the [tool]." )
if(kidney.damage > 0)
user.visible_message("[user] starts mending the bruises on [target]'s kidney with \the [tool].", \
"You start mending the bruises on [target]'s kidney with \the [tool]." )
if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack))
if(lungs.damage > 0)
user.visible_message("[user] starts sealing the rupture in [target]'s lungs with regenerative membrane.", \
"You start mending the rupture in [target]'s lungs with regenerative membrane." )
if(heart.damage > 0)
if(heart.robotic < 2)
user.visible_message("[user] starts mending the bruises on [target]'s heart with regenerative membrane.", \
"You start mending the bruises on [target]'s heart with regenerative membrane." )
if(heart.robotic == 2)
user.visible_message("\blue [user] attempts to repair [target]'s mechanical heart with regenerative membrane...", \
"\blue You attempt to repair [target]'s heart with regenerative membrane...")
if(liver.damage > 0)
user.visible_message("[user] starts mending the bruises on [target]'s liver with regenerative membrane.", \
"You start mending the bruises on [target]'s liver with regenerative membrane." )
if(kidney.damage > 0)
user.visible_message("[user] starts mending the bruises on [target]'s kidney with regenerative membrane.", \
"You start mending the bruises on [target]'s kidney with regenerative membrane." )
if (istype(tool, /obj/item/stack/medical/bruise_pack))
if (istype(tool, /obj/item/stack/medical/bruise_pack/tajaran/))
if(lungs.damage > 0)
user.visible_message("[user] starts covering the rupture in [target]'s lungs with the poultice.", \
"You start covering the rupture in [target]'s lungs with the poultice." )
if(heart.damage > 0)
if(heart.robotic < 2)
user.visible_message("[user] starts mending the bruises on [target]'s heart with the poultice.", \
"You start mending the bruises on [target]'s heart with the poultice." )
if(heart.robotic == 2)
user.visible_message("\blue [user] attempts to repair [target]'s mechanical heart with \the [tool]...", \
"\blue You attempt to repair [target]'s heart with \the [tool]...")
if(liver.damage > 0)
user.visible_message("[user] starts putting the poultice to the bruises on [target]'s liver.", \
"You start putting the poultice to the bruises on [target]'s liver." )
if(kidney.damage > 0)
user.visible_message("[user] starts putting the poultice to the bruises on [target]'s kidney.", \
"You start putting the poultice to the bruises on [target]'s kidney." )
if(lungs.damage > 0)
user.visible_message("[user] starts mending the rupture in [target]'s lungs with \the [tool].", \
"You start mending the rupture in [target]'s lungs \the [tool]." )
else
if(heart.damage > 0)
if(heart.robotic < 2)
user.visible_message("[user] starts mending the bruises on [target]'s heart with \the [tool].", \
"You start mending the bruises on [target]'s heart with \the [tool]." )
if(heart.robotic == 2)
user.visible_message("\blue [user] attempts to repair [target]'s mechanical heart with \the [tool]...", \
"\blue You attempt to repair [target]'s heart with \the [tool]...")
if(liver.damage > 0)
user.visible_message("[user] starts mending the bruises on [target]'s liver with \the [tool].", \
"You start mending the bruises on [target]'s liver with \the [tool]." )
if(kidney.damage > 0)
user.visible_message("[user] starts mending the bruises on [target]'s kidney with \the [tool].", \
"You start mending the bruises on [target]'s kidney with \the [tool]." )
target.custom_pain("The pain in your chest is living hell!",1)
..()
@@ -262,17 +298,52 @@
kidney.damage = 0
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/internal/heart/heart = target.internal_organs["heart"]
var/datum/organ/internal/lungs/lungs = target.internal_organs["lungs"]
var/datum/organ/internal/liver/liver = target.internal_organs["liver"]
var/datum/organ/internal/liver/kidney = target.internal_organs["kidney"]
var/datum/organ/external/chest/affected = target.get_organ("chest")
user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s chest with \the [tool]!", \
"\red Your hand slips, slicing an artery inside [target]'s chest with \the [tool]!")
affected.createwound(CUT, 20)
user.visible_message("\red [user]'s hand slips, getting mess and tearing the inside of [target]'s chest with \the [tool]!", \
"\red Your hand slips, getting mess and tearing the inside of [target]'s chest with \the [tool]!")
switch(tool)
if(/obj/item/stack/medical/advanced/bruise_pack)
if(heart.damage > 0)
heart.take_damage(2, 0)
if(liver.damage > 0)
liver.take_damage(2, 0)
if(kidney.damage > 0)
kidney.take_damage(2, 0)
if(lungs.damage > 0)
lungs.take_damage(2, 0)
target.adjustToxLoss(5)
if(/obj/item/stack/medical/bruise_pack/tajaran)
if(heart.damage > 0)
heart.take_damage(2, 0)
if(liver.damage > 0)
liver.take_damage(2, 0)
if(kidney.damage > 0)
kidney.take_damage(2, 0)
if(lungs.damage > 0)
lungs.take_damage(2, 0)
target.adjustToxLoss(7)
if(/obj/item/stack/medical/bruise_pack)
if(heart.damage > 0)
heart.take_damage(5, 0)
if(liver.damage > 0)
liver.take_damage(5, 0)
if(kidney.damage > 0)
kidney.take_damage(5, 0)
if(lungs.damage > 0)
lungs.take_damage(5, 0)
target.adjustToxLoss(10)
affected.createwound(CUT, 5)
/datum/surgery_step/ribcage/fix_chest_internal_robot //For artificial organs
allowed_tools = list(
/obj/item/stack/nanopaste = 100, \
/obj/item/weapon/bonegel = 60, \
/obj/item/weapon/screwdriver = 30, \
/obj/item/weapon/bonegel = 30, \
/obj/item/weapon/screwdriver = 70, \
)
min_duration = 70
@@ -293,15 +364,19 @@
if(heart.robotic == 2)
user.visible_message("[user] starts mending the mechanisms on [target]'s heart with \the [tool].", \
"You start mending the mechanisms on [target]'s heart with \the [tool]." )
else
user.visible_message("[user] cannot mend an organic heart with this!")
return
target.custom_pain("The pain in your chest is living hell!",1)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/internal/heart/heart = target.internal_organs["heart"]
if(heart.damage > 0)
user.visible_message("\blue [user] repairs [target]'s heart with \the [tool].", \
"\blue You repair [target]'s heart with \the [tool]." )
heart.damage = 0
if(heart.robotic == 2)
user.visible_message("\blue [user] repairs [target]'s heart with \the [tool].", \
"\blue You repair [target]'s heart with \the [tool]." )
heart.damage = 0
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/internal/heart/heart = target.internal_organs["heart"]
@@ -313,3 +388,17 @@
//////////////////////////////////////////////////////////////////
// HEART SURGERY //
//////////////////////////////////////////////////////////////////
/datum/surgery_step/ribcage/heart/cut
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchenknife = 75, \
/obj/item/weapon/shard = 50, \
)
min_duration = 30
max_duration = 40
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return ..() && target.op_stage.ribcage == 2
+2 -3
View File
@@ -665,7 +665,7 @@ var/list/TAGGERLOCATIONS = list("Disposals",
#define BE_MONKEY 512
#define BE_NINJA 1024
#define BE_VOX 2048
#define BE_PLANT 4096
#define BE_SLIME 4096
#define BE_VAMPIRE 8192
var/list/be_special_flags = list(
@@ -681,7 +681,7 @@ var/list/be_special_flags = list(
"Monkey" = BE_MONKEY,
"Ninja" = BE_NINJA,
"Vox" = BE_VOX,
"Diona" = BE_PLANT,
"Slime" = BE_SLIME,
"Vampire" = BE_VAMPIRE
)
@@ -723,7 +723,6 @@ var/list/bradycardics = list("neurotoxin", "cryoxadone", "clonexadone", "space_d
var/list/heartstopper = list("potassium_phorochloride", "zombie_powder") //this stops the heart
var/list/cheartstopper = list("potassium_chloride") //this stops the heart when overdose is met -- c = conditional
//proc/get_pulse methods
#define GETPULSE_HAND 0 //less accurate (hand)
#define GETPULSE_TOOL 1 //more accurate (med scanner, sleeper, etc)
+3 -1
View File
@@ -17,11 +17,13 @@
diaryofmeanpeople = file("data/logs/[date_string] Attack.log")
diary << "\n\nStarting up. [time2text(world.timeofday, "hh:mm.ss")]\n---------------------"
diaryofmeanpeople << "\n\nStarting up. [time2text(world.timeofday, "hh:mm.ss")]\n---------------------"
changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently
if(byond_version < RECOMMENDED_VERSION)
world.log << "Your server's byond version does not meet the recommended requirements for TGstation code. Please update BYOND"
if(config && config.log_runtimes)
log = file("data/logs/runtime/[time2text(world.realtime,"YYYY-MM-DD-(hh-mm-ss)")]-runtime.log")
make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
load_configuration()
-951
View File
@@ -1,951 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Baystation 12 Changelog</title>
<link rel="stylesheet" type="text/css" href="changelog.css">
<script type='text/javascript'>
function changeText(tagID, newText, linkTagID){
var tag = document.getElementById(tagID);
tag.innerHTML = newText;
var linkTag = document.getElementById(linkTagID);
linkTag.removeAttribute("href");
linkTag.removeAttribute("onclick");
}
</script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<!--
Header Section
-->
<table align='center' width='650'><tr><td>
<table align='center' class="top">
<tr>
<td valign='top'>
<div align='center'><font size='3'><b>Space Station 13</b></font></div>
<p><div align='center'><font size='3'><a href="http://baystation12.net/wiki/">Wiki</a> | <a href="https://github.com/Baystation12/Baystation12/">Source code</a></font></div></p>
<font size='2'>Code licensed under <a href="http://www.gnu.org/licenses/gpl.html">GPLv3</a>. Content licensed under <a href="http://creativecommons.org/licenses/by-sa/3.0/">CC BY-SA 3.0</a>.<br><br>
</td>
</tr>
</table>
<br><b>Baystation 12 Credit List</b>
<table align='center' class="top">
<tr>
<td valign='top'>
<font size='2'><b>Code:</b> Abi79, Aryn, Cael_Aislinn, Chinsky, cib, CompactNinja, DopeGhoti, Erthilo, Hawk_v3, Head, Ispil, Lexusjjss, Melonstorm, Miniature, Mloc, NerdyBoy1104, SkyMarshal, Spectre, Strumpetplaya, Sunfall, Tastyfish, Uristqwerty<br></font>
<font size='2'><b>Sprites:</b> Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, Miniature, Searif, Xenone, faux<br></font>
<font size='2'><b>Sounds:</b> Aryn<br></font>
<font size='2'><b>Thanks To:</b> /tg/ station, Goonstation, Animus Station, Daedalus, and original Spacestation 13 devs. Skibiliano for the IRC bot.</font>
</td>
</tr>
</table>
<!--
Changelog Section
-->
<!-- NOTE TO UPDATERS!! Please only list things which are important to players.
Stuff which is in development and not yet visible to players or just code related
(ie. code improvements for expandability, etc.) should not be listed here. They
should be listed in the changelog upon commit though. Thanks. -->
<div class="commit sansserif">
<h2 class="date">August 8th, 2013</h2>
<h3 class="author">Erthilo updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Raise Dead rune now properly heals and revives dead corpse.</li>
<li class="bugfix">Admin-only rejuvenate verb now heals all organs, limbs, and diseases.</li>
<li class="bugfix">Cyborg sprites now correctly reset with reset boards. This means cyborg appearances can now be changed without admin intervention.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">2013/08/4</h2>
<h3 class="author">Chinsky updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Health HUD indicator replaced with Pain indicator. Now health indicator shows pain level instead of actual vitals level. Some types of damage contribute more to pain, some less, usually feeling worse than they really are.</li>
</ul>
</div>
<div class="commit sansserif">
<div class="commit sansserif">
<h2 class="date">2013/08/01</h2>
<h3 class="author">Chinsky updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Old new medical features:</li>
<li class="rscadd">Autoinjectors! They come preloaded with 5u of inapro, can be used instantly, and are one-use. You can replace chems inside using a syringe. Box of them is added to Medicine closet and medical supplies crate.</li>
<li class="rscadd">Splints! Target broken liimb and click on person to apply. Can be taken off in inventory menu, like handcuffs. Splinted limbs have less negative effects.</li>
<li class="rscadd">Advanced medikit! Red and mean, all doctors spawn with one. Contains better stuff - advanced versions of bandaids and aloe heal 12 damage on the first use.</li>
<li class="tweak">Wounds with damage above 50 won't heal by themselves even if bandaged/salved. Would have to seek advanced medical attention for those.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">July 30th, 2013</h2>
<h3 class="author">Erthilo updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">EFTPOS and ATM machines should now connect to databases.</li>
<li class="bugfix">Gravitational Catapults can now be removed from mechs.</li>
<li class="bugfix">Ghost manifest rune paper naming now works correctly.</li>
<li class="bugfix">Fix for newscaster special characters. Still not recommended.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">30.07.2013</h2>
<h3 class="author">Kilakk updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added colored department radio channels.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">28.07.2013</h2>
<h3 class="author">Segrain updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Camera console circuits can be adjusted for different networks.</li>
<li class="rscadd">Nuclear operatives and ERT members have built-in cameras in their helmets. Activate helmet to initialize it.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">26.07.2013</h2>
<h3 class="author">Kilakk updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Brig cell timers will no longer start counting down automatically.</li>
<li class="tweak">Separated the actual countdown timer from the timer controls. Pressing "Set" while the timer is counting down will reset the countdown timer to the time selected.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">2013-11-07</h2>
<h3 class="author">Chinsky updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Gun delays. All guns now have delays between shots. Most have less than second, lasercannons and pulse rifles have around 2 seconds delay. Automatics have zero, click-speed.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">2013/07/06</h2>
<h3 class="author">Chinsky updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Humans now can be infected with more than one virus at once.</li>
<li class="rscadd">All analyzed viruses are put into virus DB. You can view it and edit their name and description on medical record consoles.</li>
<li class="tweak">Only known viruses (ones in DB) will be detected by the machinery and HUDs. </li>
<li class="rscadd">Viruses cause fever, body temperature rising the more stage is.</li>
<li class="bugfix">Humans' body temperature does not drift towards room one unless there's big difference in them.</li>
<li class="tweak">Virus incubators now can transmit viuses from dishes to blood sample.</li>
<li class="rscadd">New machine - centrifuge. It can isolate antibodies or viruses (spawning virus dish) from a blood sample in vials. Accepts vials only.</li>
<li class="rscadd">Fancy vial boxes in virology, one of them is locked by ID with MD access.</li>
<li class="tweak">Engineered viruses are now ariborne too.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">05.07.2013</h2>
<h3 class="author">Spamcat updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Pulse! Humans now have hearbeat rate, which can be measured by right-clicking someone - Check pulse or by health analyzer. Medical machinery also has heartbeat monitors. Certain meds and conditions can influence it.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">03.07.2013</h2>
<h3 class="author">Segrain updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Security and medical cyborgs can use their HUDs to access records.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">June 28th, 2013</h2>
<h3 class="author">Segrain updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">AIs are now able to examine what they see.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">June 27th, 2013</h2>
<h3 class="author">Segrain updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">ID cards properly setup bloodtype, DNA and fingerprints again.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">June 26th, 2013</h2>
<h3 class="author">Whitellama updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">One-antag rounds (like wizard/ninja) no longer end automatically upon death</li>
<li class="wip">Space ninja has been implemented as a voteable gamemode</li>
<li class="rscadd">Space ninja spawn landmarks have been implemented (but not yet placed on the map), still spawn at carps-pawns instead. (The code will warn you about this and ask you to report it, it's a known issue.)</li>
<li class="rscadd">Five new space ninja directives have been added, old directives have been reworded to be less harsh</li>
<li class="wip">Space ninjas have been given their own list as antagonists, and are no longer bundled up with traitors</li>
<li class="bugfix">Space ninjas with a "steal a functional AI" objective will now succeed by downloading one into their suits</li>
<li class="tweak">Space ninja suits' exploding on death has been nerfed, so as not to cause breaches</li>
<li class="rscadd">A few space ninja titles/names have been added and removed to be slightly more believable</li>
<li class="bugfix">The antagonist selector no longer chooses jobbanned players when it runs out of willing options</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">June 26th, 2013</h2>
<h3 class="author">Segrain updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Autopsy scanner properly displays time of wound infliction and death.</li>
<li class="bugfix">Autopsy scanner properly displays wounds by projectile weapons.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">June 23rd, 2013</h2>
<h3 class="author">Segrain updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Airlocks of various models can be constructed again.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">June 23rd, 2013</h2>
<h3 class="author">faux updated:</h3>
<ul class="changes bgimages16">
<li class="experiment">There has been a complete medbay renovation spearheaded by Vetinarix. http://baystation12.net/forums/viewtopic.php?f=20&t=7847 <-- Please put any commentary good or bad, here.</li>
<li class="tweak">Some maintenance doors within RnD and Medbay have had their accesses changed. Maintenance doors in the joint areas (leading to the research shuttle, virology, and xenobiology) are now zero access. Which means anyone in those joints can enter the maintenance tunnels. This was done to add additional evacuation locations during radiation storms. Additional maintenance doors were added to the tunnels in these areas to prevent docs and scientists from running about.</li>
<li class="tweak">Starboard emergency storage isn't gone now, it's simply located in the escape wing.</li>
<li class="experiment">An engineering training room has been added to engineering. This location was previously where surgery was located. If you are new to engineering or need to brush up on your skills, please use this area for testing.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">June 22nd 2013</h2>
<h3 class="author">Cael_Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">The xenoarchaeology depth scanner will now tell you what energy field is required to safely extract a find.</li>
<li class="tweak">Excavation picks will now dig faster, and xenoarchaeology as a whole should be easier to do.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">21.06.2013</h2>
<h3 class="author">Jupotter updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fix the robotiscist preview in the char setupe screen</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">18.06.2013</h2>
<h3 class="author">Segrain updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed some bugs in windoor construction.</li>
<li class="tweak">Secure windoors are made with rods again.</li>
<li class="rscadd">Windoors drop their electronics when broken. Emagged windoors can have theirs removed by crowbar.</li>
<li class="rscadd">Airlock electronics can be configured to make door open for any single access on it instead of all of them.</li>
<li class="rscadd">Cyborgs can preview their icons before choosing.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">13.06.2013</h2>
<h3 class="author">Kilakk updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added the Xenobiologist job. Has access to the research hallway and to xenobiology.</li>
<li class="rscdel">Removed Xenobiology access from Scientists.</li>
<li class="rscdel">Removed the Xenobiologist alternate title from Scientists.</li>
<li class="rscadd">Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer.</li>
<li class="tweak">Changed the Research Outpost doors to use "Xenoarchaeology" access.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">6-13-13</h2>
<h3 class="author">Asanadas updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added a whimsical suit to the head of personnel's secret clothing locker.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">12/06/2013</h2>
<h3 class="author">Zuhayr updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added pneumatic cannon and harpoons.</li>
<li class="experiment">Added embedded projectiles. Bullets and thrown weapons may stick in targets. Throwing them by hand won't make them stick, firing them from a cannon might. Implant removal surgery will get rid of shrapnel and stuck items.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">6/11/13</h2>
<h3 class="author">Meyar updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixes a security door with a firedoor ontop of it.</li>
<li class="bugfix">Fixed a typo relating to the admin Select Equipment Verb. (It's RESPONSE team not RESCUE team)</li>
<li class="rscadd">ERT are now automated, from their spawn to their shuttle. Admin intervention no longer required! (Getting to the mechs still requires admin permission generally)</li>
<li class="rscadd">Added flashlights to compensate for the weakened PDA lights</li>
<li class="tweak">ERT Uniforms updated to be in line with Centcom uniforms. No more turtlenecks, no sir. </li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">09.06.2013</h2>
<h3 class="author">Segrain updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Emagged supply console can order SpecOp crates again.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">Meyar</h2>
<h3 class="author">6/6/13 updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Adds missing disposal pipes in chemistry</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">05.06.2013</h2>
<h3 class="author">Segrain updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Exosuits now can open firelocks by walking into them.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">6/5/13</h2>
<h3 class="author">Meyar updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Departments SHOULD have access to adjacent maintinence tunnels incase of radstorm or nafarious dealings.</li>
<li class="bugfix">Fixed the northern EVA maintinence door.</li>
<li class="bugfix">Hand full of mapbugs. </li>
<li class="bugfix">MULES should be able to get to security now. </li>
<li class="tweak">Nerfed PDA lights to a 3x3 area, makes the flashlight actually worthwhile. </li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">6/4/13</h2>
<h3 class="author">Meyar updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Disposal's mail routing fixed. Missing pipes replaced.</li>
<li class="bugfix">Chemistry is once again a part of the disposals delivery circuit. </li>
<li class="bugfix">Added missing sorting junctions to Security and HoS office.</li>
<li class="bugfix">Fixed a duplicate sorting junction.</li>
</ul>
</div>
<!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here -->
<div class="commit sansserif">
<h2 class="date">5.06.2013</h2>
<h3 class="author">Chinsky updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Load bearing equipment - webbings and vests for engineers and sec. Attach to jumpsuit, use 'Look in storage' verb (object tab) to open.</li>
</ul>
</div>
<div class='commit sansserif'>
<h2 class='date'>1.06.2013</h2>
<h3 class='author'>Chinsky updated:</h3>
<ul class='changes bgimages16'>
<li class='rscadd'>Bloody footprints! Now stepping in the puddle will dirty your shoes/feet and make you leave bloody footprints for a bit.</li>
<li class='rscadd'>Blood now dries up after some time. Puddles take ~30 minutes, small things 5 minutes.</li>
<li class="bugfix">Untreated wounds now heal. No more toe stubs spamming you with pain messages for the rest of the shift.</li>
<li class="experiment">On the other side, everything is healed slowly. Maximum you cna squeeze out of first aid is 0.5 health per tick per organ. Lying down makes it faster too, by 1.5x factor.</li>
<li class='rscadd'>Lids! Click beaker/bottle in hand to put them on/off. Prevent spilling</li>
<li class='rscadd'>Added 'hailer' to security lockers. If used in hand, says "Halt! Security!". For those who can't run and type.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">31.05.2013</h2>
<h3 class="author">Segrain updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Portable canisters now properly connect to ports beneath them on map load.</li>
<li class="bugfix">Fixed unfastening gas meters.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">30th May 2013</h2>
<h3 class="author">proliberate updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Station time is now displayed in the status tab for new players and AIs.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">30.05.2013</h2>
<h3 class="author">Segrain updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Meteor showers actually spawn meteors now.</li>
<li class="tweak">Engineering tape fits into toolbelt and can be placed on doors.</li>
<li class="rscadd">Pill bottles can hold paper.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">May 28th, 2013</h2>
<h3 class="author">VitrescentTortoise updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Wizard's forcewall now works.</li>
</ul>
<ul class="changes bgimages16">
<li class="bugfix">Xenoarchaeology picksets can now hold everything they started with.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">28th May 2013</h2>
<h3 class="author">Erthilo updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixes everyone being able to understand alien languages. HERE IS YOUR TOWER OF BABEL</li>
</ul>
</div>
<div class='commit sansserif'>
<h2 class='date'>26th May 2013</h2>
<h3 class='author'>Chinsky updated:</h3>
<ul class='changes bgimages16'>
<li class='rscadd'>Tentacles! Now clone damage will make you horribly malformed like examine text says.</li>
</ul>
<h3 class="author">VitrescentTortoise updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added a third option for not getting any job preferences. It allows you to return to the lobby instead of joining.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">5/26/2013</h2>
<h3 class="author">Meyar updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">The syndicate shuttle now has a cycling airlock during Nuke rounds.</li>
<li class="rscadd">Restored the ability for the syndicate Agent ID to change the name on the card (reforge it) more than once.</li>
<li class="rscadd">ERT Radio now functional again.</li>
<li class="rscadd">Research blast doors now actually lock down the entirety of station-side Research. </li>
<li class="rscadd">Added lock down buttons to the wardens office. </li>
<li class="rscadd">The randomized barsign has made a return. </li>
<li class="rscadd">Syndicate Agent ID's external airlock access restored.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">25th May 2013</h2>
<h3 class="author">Erthilo updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixes alien races appearing an unknown when speaking their language.</li>
<li class="bugfix">Fixes alien races losing their language when cloned.</li>
<li class="bugfix">Fixes UI getting randomly reset when trying to change it in Genetics Scanners.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">21 May 2013</h2>
<h3 class="author">SkyMarshal updated:</h3>
<ul class="changes bgimages16">
<li class="experiment">ZAS will now speed air movement into/out of a zone when unsimulated tiles (e.g. space) are involved, in relation to the number of tiles.</li>
<li class="experiment">Portable Canisters will now automatically connect to any portable connecter beneath them on map load.</li>
<li class="bugfix">Bug involving mis-mapped disposal junction fixed</li>
<li class="bugfix">Air alarms now work for atmos techs (whoops!)</li>
<li class="bugfix">The Master Controller now properly stops atmos when it runtimes.</li>
<li class="bugfix">Backpacks can no longer be contaminated</li>
<li class="tweak">ZAS no longer logs air statistics.</li>
<li class="tweak">ZAS now rebuilds as soon as it detects a semi-complex change in geometry. (It was doing this already, but in a convoluted way which was actually less efficient)</li>
<li class="tweak">General code cleanup/commenting of ZAS</li>
<li class="tweak">Jungle now initializes after the random Z-level loads and atmos initializes.</li>
</ul>
</div>
<div>
<h2 class="date">May 18th, 2013</h2>
<h3 class="author">CIB updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">A new event type: Wallrot. Use welder or plantbgone on infected walls.</li>
<li class="tweak">Newscasters now can deliver preset news stories over the course of a round. See http://baystation12.net/forums/viewtopic.php?f=14&t=7619 to add your own!</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">April 24, 2013</h2>
<h3 class="author">Jediluke69 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added 5 new drinks (Kira Special, Lemonade, Brown Star, Milkshakes, Rewriter)</li>
<li class="tweak">Nanopaste now heals about half of what it used to</li>
<li class="tweak">Ballistic crates should now come with shotguns loaded with actual shells no more beanbags</li>
<li class="bugfix">Iced tea no longer makes a glass of .what?</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">April 24, 2013</h2>
<h3 class="author">faux updated:</h3>
<ul class="changes bgimages16">
<li class="imageadd">Mixed Wardrobe Closet now has colored shoes and plaid skirts.</li>
<li class="imageadd">Dress uniforms added to the Captain, RD, and HoP wardrobe closets. A uniform jacket has also been added to the Captain's closet. HoS' hat has been re-added to their closet. I do not love the CMO and CE enough to give them anything.</li>
<li class="imageadd">Atheletic closet now has five different swimsuits *for the ladies* in them. If you are a guy, be prepared to be yelled at if you run around like a moron in one of these. Same goes for ladies who run around in shorts with their titties swaying in the space winds.</li>
<li class="imageadd">A set of dispatcher uniforms will spawn in the security closet. These are for playtesting the dispatcher role.</li>
<li class="imageadd">New suit spawns in the laundry room. It's for geezer's only. You're welcome, Book.</li>
<li class="imageadd">Nurse outfit variant, orderly uniform, and first responder jacket will now spawn in the medical wardrobe closet.</li>
<li class="imageadd">A white wedding dress will spawn in the chaplain's closet. There are also several dresses currently only adminspawnable. Admins: Look either under "bride" or "dress." The bride one leads to the colored wedding dresses, and there are some other kinds of dresses under dress.</li>
<li class="tweak">No more luchador masks or boxing gloves or boxing ring. You guys have a swimming pool now, dip in and enjoy it.</li>
<li class="tweak">he meeting hall has been replaced with an awkwardly placed security office meant for prisoner processing.</li>
<li class="tweak">Added a couple more welding goggles to engineering since you guys liked those a lot.</li>
<li class="imageadd">Flasks spawn behind the bar. Only three. Don't fight over them. I don't know how to add them to the bar vending machine otherwise I would have done that instead. Detective, you have your own flask in your office, it's underneath the cigarettes on your desk.</li>
<li class="tweak">Added two canes to the medical storage, for people who have leg injuries and can't walk good and stuff. I do not want to see doctors pretending to be House. These are for patients. Do not make me delete this addition and declare you guys not being able to have nice things.</li>
<li class="tweak">Secondary entance to EVA now directly leads into the medbay hardsuit section. Sorry for any inconviences this will cause. The CMO can now fetch the hardsuits whenever they want.</li>
<li class="tweak">Secondary security hardsuit has been added to the armory. Security members please stop stealing engineer's hardsuits when you guys want to pair up for space travel.</li>
<li class="tweak">Firelocks have been moved around in the main hallways to form really ghetto versions of airlocks.</li>
<li class="tweak">Violin spawns in theatre storage now. I didn't put the piano there though, that was someone else.</li>
<li class="tweak">Psych office in medbay has been made better looking.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">24th April 2013</h2>
<h3 class="author">NerdyBoy1104 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">New Botany additions: Rice and Plastellium. New sheet material: Plastic.</li>
<li class="rscadd">Plastellium is refined into plastic by first grinding the produce to get plasticide. 20 plasticide + 10 polytrinic acid makes 10 sheets of plastic which can be used to make crates, forks, spoons, knives, ashtrays or plastic bags from.</li>
<li class="rscadd">Rice seeds grows into rice stalks that you grind to get rice. 10 Rice + 5 Water makes boiled rice, 10 rice + 5 milk makes rice pudding, 10 rice + 5 universal enzyme (in beaker) makes Sake.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">Spamcat</h2>
<h3 class="author">04.05.2013 updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Blood type is now saved in character creation menu, no need to edit it manually every round.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">17 April 2013</h2>
<h3 class="author">SkyMarshal updated:</h3>
<ul class="changes bgimages16">
<li class="experiment">ZAS is now more deadly, as per decision by administrative team. May be tweaked, but currently AIRFLOW is the biggest griefer.</li>
<li class="experiment">World startup optimized, many functions now delayed until a player joins the server. (Reduces server boot time significantly)</li>
<li class="tweak">Zones will now equalize air more rapidly.</li>
<li class="bugfix">ZAS now respects active magboots when airflow occurs.</li>
<li class="bugfix">Airflow will no longer throw you into doors and open them.</li>
<li class="bugfix">Race condition in zone construction has been fixed, so zones connect properly at round start.</li>
<li class="bugfix">Plasma effects readded.</li>
<li class="bugfix">Fixed runtime involving away mission.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">17 April 2013</h2>
<h3 class="author">SkyMarshal updated:</h3>
<ul class="changes bgimages16">
<li class="experiment">ZAS is now more deadly, as per decision by administrative team. May be tweaked, but currently AIRFLOW is the biggest griefer.</li>
<li class="experiment">World startup optimized, many functions now delayed until a player joins the server. (Reduces server boot time significantly)</li>
<li class="tweak">Zones will now equalize air more rapidly.</li>
<li class="bugfix">ZAS now respects active magboots when airflow occurs.</li>
<li class="bugfix">Airflow will no longer throw you into doors and open them.</li>
<li class="bugfix">Race condition in zone construction has been fixed, so zones connect properly at round start.</li>
<li class="bugfix">Plasma effects readded.</li>
<li class="bugfix">Fixed runtime involving away mission.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">30.04.2013</h2>
<h3 class="author">Spamcat updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Pill bottle capacity increased to 14 items.</li>
<li class="bugfix">Fixed Lamarr (it now spawns properly)</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">15.04.2013</h2>
<h3 class="author">Spamcat updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added <a href=http://www.safecity.com.au/aspchrlar.jpg>telescopic batons</a> to HoS's and captain's lockers. These are quite robust and easily concealable.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">May 14th 2013</h2>
<h3 class="author">Cael_Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="experiment">Depth scanners can now be used to determine what material archaeological deposits are made of, meaning lab analysis is no longer required.</li>
<li class="tweak">Some useability issues with xenoarchaeology tools have been resolved, and the transit pods cycle automatically now.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">11 April 2013</h2>
<h3 class="author">SkyMarshal updated:</h3>
<ul class="changes bgimages16">
<li class="experiment">Fire has been reworked.</li>
<li class="experiment">In-game variable editor is both readded and expanded with fire controlling capability.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">9 April 2013</h2>
<h3 class="author">SkyMarshal updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fire Issues (Firedoors, Flamethrowers, Incendiary Grenades) fixed.</li>
<li class="bugfix">Fixed a bad line of code that was preventing autoignition of flammable gas mixes.</li>
<li class="bugfix">Volatile fuel is burned up after a point.</li>
<li class="rscdel">Partial-tile firedoors removed. This is due to ZAS breaking when interacting with them.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">4 April 2013</h2>
<h3 class="author">SkyMarshal updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed ZAS</li>
<li class="bugfix">Fixed Fire</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">March 27th 2013</h2>
<h3 class="author">Asanadas updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">The Null Rod has recovered its de-culting ability, for balance reasons. Metagaming with it is a big no-no!</li>
<li class="rscadd">Holy Water as a liquid is able to de-cult. Less effective, but less bloody. May be changed over the course of time for balance.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">26.03.2013</h2>
<h3 class="author">Spamcat updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Chemmaster now puts pills in pill bottles (if one is inserted).</li>
<li class="tweak">Stabbing someone with a syringe now deals 3 damage instead of 7 because 7 is like, a crowbar punch.</li>
<li class="bugfix">Lizards can now join mid-round again.</li>
<li class="rscadd">Chemicals in bloodstream will transfer with blood now, so don't get drunk before your blood donation. Viruses and antibodies transfer through blood too.</li>
<li class="bugfix">Virology is working again.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">March 15th 2013</h2>
<h3 class="author">Cael_Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Mapped a compact research base on the mining asteroid, with multiple labs and testing rooms. It's reachable through a new (old) shuttle dock that leaves from the research wing on the main station.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">14.03.2013</h2>
<h3 class="author">Spamcat updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Figured I should make one of these. Syringestabbing now produces a broken syringe complete with fingerprints of attacker and blood of a victim, so dispose your evidence carefully. Maximum transfer amount per stab is lowered to 10.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">11/03/2013</h2>
<h3 class="author">Chinsky updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Sec HUDs now can see short versions of sec records.on examine. Med HUDs do same for medical records, and can set medical status of patient.</li>
<li class="rscadd">Damage to the head can now cause brain damage.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">March 11th 2013</h2>
<h3 class="author">CIB updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Cloning now requires you to put slabs of meat into the cloning pod to replenish biomass.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">March 11th 2013</h2>
<h3 class="author">Cael Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="wip">The xenoarchaeology update is here. This includes a major content overhaul and a bunch of new features for xenoarchaeology.</li>
<li class="tweak">Digsites (strange rock deposits) are now much more nuanced and interesting, and a huge number of minor (non-artifact) finds have been added.</li>
<li class="rscadd">Excavation is now a complex process that involves digging into the rock to the right depth.</li>
<li class="rscadd">Chemical analysis is required for safe excavation of the digsites, in order to determine how best to extract the finds.</li>
<li class="bugfix">Anomalous artifacts have been overhauled and many longstanding bugs with existing effects have been fixed - the anomaly utiliser should now work <i>much</i> more often.</li>
<li class="rscadd">Numerous new artifact effects have been added and some new artifact types can be dug up from the asteroid.</li>
<li class="rscadd">New tools and equipment have been added, including normal and spaceworthy versions of the anomaly suits, excavation tools and other neat gadgets.</li>
<li class="rscadd">Five books have been written by subject matter experts from around the galaxy to help the crew of the Exodus come to grips with this exacting new science (over 3000 words of tutorials!).</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">March 9th 2013</h2>
<h3 class="author">Cael Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Beekeeping is now possible. Construct an apiary of out wood and embed it into a hydroponics tray, then get a queen bee and bottle of BeezEez from cargo bay.
Hives produce honey and honeycomb, but be wary if the bees start swarming.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">March 6th 2013</h2>
<h3 class="author">Cael Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Type 1 thermoelectric generators and the associated binary circulators are now moveable (wrench to secure/unsecure) and orderable via Quartermaster.</li>
<li class="wip">code/maps/rust_test.dmm contains an example setup for a functional RUST reactor. Maximum output is in the range of 12 to 20MW (12 to 20 million watts).</li>
<li class="bugfix">Removed double announcement for gridchecks, reduced duration of gridchecks.</li>
</ul>
<h3 class="author">RavingManiac updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">You can now stab people with syringes using the "harm" intent. This destroys the syringe and transfers a random percentage of its contents into the target. Armor has a 50% chance of blocking the syringe.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">March 5th 2013</h2>
<h3 class="author">Cael Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="soundadd">Set roundstart music to randomly choose between space.ogg and traitor.ogg (see <a =href='http://baystation12.net/forums/viewtopic.php?f=5&t=6972'>http://baystation12.net/forums/viewtopic.php?f=5&t=6972</a>)</li>
<li class="experiment">All RUST components except for TEGs (which generate the power) are now obtainable ingame, bored engineers should get hold of them and setup an experimental reactor for testing purposes.</li>
</ul>
<h3 class="author">CIB updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added internal organs. They're currently all located in the chest. Use advanced scanner to detect damage. Use the same surgery as for ruptured lungs to fix them.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">February 27th 2013</h2>
<h3 class="author">Gamerofthegame updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added the (base gear) ERT preset for the debug command.</li>
<li class="rscadd">Map fixes, Virology hole fixed. Atmospheric fixes for mining and, to a less extent, the science outpost. (No, not cycling airlocks)</li>
<li class="rscadd">Fiddled with the ERT set up location on Centcom. Radmins will now have a even easier time equiping a team of any real pratical size, especially coupled with the above debug command.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">February 25th 2013</h2>
<h3 class="author">Cael Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">As well as building hull shield generators, normal shield gens can now be built (see <a href="http://baystation12.net/forums/viewtopic.php?f=1&t=6993">http://baystation12.net/forums/viewtopic.php?f=1&t=6993</a>).</li>
<li class="rscadd">New random events: multiple new system wide-events have been have been added to the newscaster feeds, some not quite as respectable as others.</li>
<li class="rscadd">New random event: some lucky winners will win the TC Daily Grand Slam Lotto, while others may be the target of malicious hackers.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">February 23rd 2013</h2>
<h3 class="author">Cael Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Finances! Players spawn with an account, and money can be transferred between accounts, withdrawn/deposited at ATMs and charged to accounts via EFTPOS scanners.<br><br>
All players start with 500-5000 credits, credits can no longer be merged and only credits can be deposited into ATMs - so shelter your illegitimately gotten gains in physical assets and remember that fraud is frowned upon!</li>
<li class="soundadd">Turrets are no longer noiseless as the grave. Listen for the sound of machinery in their proximity.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">February 23rd 2013</h2>
<h3 class="author">Cael Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="wip">RUST machinery components should now be researchable (with high requirements) and orderable through QM (with high cost).</li>
<li class="wip">Shield machinery should now be researchable (with high requirements) and orderable through QM (with high cost). This one is reportedly buggy.</li>
<li class="tweak">Rogue vending machines should revert back to normal at the end of the event.</li>
<li class="rscadd">New Unathi hair styles.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">22/02/2013</h2>
<h3 class="author">Chinsky updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Change to body cavity surgery. Can only put items in chest, groind and head. Max size for item - 3 (chest), 2 (groin), 1 (head). For chest surgery ribs should be bent open, (lung surgery until second scalpel step). Surgery step needs preparation step, with drill. After that you can place item inside, or seal it with cautery to do other step instead.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">February 18th 2013</h2>
<h3 class="author">Cael Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">All RUST components are now buildable/orderable, with very high requirements (except for the TEGs). Emitters have replaced gyrotrons, for now.</li>
<li class="rscadd">Fixed up shield generators and made them buildable, with circuits obtainable through RnD. Hull shield gens project along space tiles adjacent to the hull (must be adjacent to a space tile to work).</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">20/02/2013</h2>
<h3 class="author">Chinsky updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added new surgery: putting items inside people. After you use retractor to keep incision open, just click with any item to put it inside. But be wary, if you try to fit something too big, you might rip the veins. To remove items, use implant removal surgery.</li>
<li class="rscadd">Crowbar can be used as alternative to retractor.</li>
<li class="rscadd">Can now unload guns by clicking them in hand.</li>
<li class="tweak">Fixed distance calculation in bullet missing chance computation, it was always assuming 1 or 0 tiles. Now distace REALLY matters when you shoot.</li>
<li class="rscadd">To add more FUN to previous thing, bullets missed to not disappear but keep going until they hit something else.</li>
<li class="bugfix">Compressed Matter and Explosive implants spawn properly now.</li>
<li class="tweak">Tweaks to medical effects: removed itch caused by bandages. Chemical effects now have non-100 chance of appearing, the stronger medicine, the more probality it'll have side effects.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">February 18th 2013</h2>
<h3 class="author">Cael Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Security bots will now target hostile mobs, and vice versa.</li>
<li class="tweak">Carp should actually emigrate now, instead of just immigrating then squatting around the outer hull.</li>
<li class="tweak">Admins and moderators have been split up into separate 'who' verbs (adminwho and modwho respectively).</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">February 14th 2013</h2>
<h3 class="author">CIB updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Medical side-effects(patients are going to come back for secondary treatment)</li>
<li class="rscadd">NT loyalty setting(affects command reports and gives antags hints who might collaborate with them)</li>
<li class="tweak">Simple animal balance fixes(They're slower now)</li>
</ul>
<h3 class="author">CaelAislinn updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Re-added old ion storm laws, re-added grid check event.</li>
<li class="rscadd">Added Rogue Drone and Vermin Infestation random events.</li>
<li class="rscadd">Added/fixed space vines random event.</li>
<li class="tweak">Updates to the virus events.</li>
<li class="tweak">Spider infestation and alien infestation events turned off by default.</li>
<li class="tweak">Soghun, taj and skrell all have unique language text colours.</li>
<li class="tweak">Moderators will no longer be listed in adminwho, instead use modwho.</li>
</ul>
<h3 class="author">Gamerofthegame updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Miscellaneous mapfixes.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">February 13th 2013</h2>
<h3 class="author">Erthilo updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed SSD (logged-out) players not staying asleep.</li>
<li class="bugfix">Fixed set-pose verb and mice emotes having extra periods.</li>
<li class="bugfix">Fixed virus crate not appearing and breaking supply shuttle.</li>
<li class="bugfix">Fixed newcaster photos not being censored.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">January 23rd</h2>
<h3 class="author">Cael_Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="tgs">Updated server to tgstation r5200 (November 26th, 2012), see <a href="https://code.google.com/p/tgstation13/source/list">https://code.google.com/p/tgstation13/source/list</a> for tg's changelog.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">1/31/2013</h2>
<h3 class="author">CIB updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Chilis and cold chilis no longer kill in small amounts</li>
<li class="bugfix">Chloral now again needs around 5 units to start killing somebody</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">January 21st</h2>
<h3 class="author">Cael_Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Satchels and ore boxes can now hold strange rocks.</li>
<li class="rscadd">Closets and crates can now be built out of 5 and 10 plasteel respectively.</li>
<li class="rscadd">Observers can become mice once more.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">13/01/2013</h2>
<h3 class="author">Chinsky updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">If you get enough (6) blood drips on one tile, it'll turn into a blood puddle. Should make bleeding out more visible.</li>
<li class="tweak">Security belt now able to hold taser, baton and tape roll.</li>
<li class="tweak">Added alternative security uniform to Security wardrobes.</li>
<li class="rscadd">Ported Urist cult runes. Down with the crayon drawings! Example: http://dl.dropbox.com/u/26846767/images/SS13/255_symbols.PNG</li>
<li class="bugfix">Engineering tape now require engineer OR atmos access instead of both.</li>
<li class="rscadd">Implants now will react to EMP, possibly in !!FUN!! ways</li>
</ul>
</div>
<div class="commit sansserif"> <h2 class="date">1/13/2013</h2>
<h3 class="author">GauHelldragon updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Servicebots now have RoboTray and Printing Pen. Robotray can be used to pick up and drop food/drinks. Printing pen can alternate between writing mode and rename paper mode by clicking it.</li>
<li class="rscadd">Farmbots. A new type of robot that weeds, waters and fertilizes. Use robot arm on water tank. Then use plant analyzer, mini-hoe, bucket and finally proximity sensor.</li>
<li class="rscadd">Chefs can clang their serving trays with a rolling pin. Just like a riot shield!</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">January 7th</h2>
<h3 class="author">Cael_Aislinn updated:</h3>
<ul class="changes bgimages16">
<li class="tgs">Updated server to tgstation r5200 (November 26th, 2012), see <a href="https://code.google.com/p/tgstation13/source/list">https://code.google.com/p/tgstation13/source/list</a> for tg's changelog.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">7/01/2013</h2>
<h3 class="author">Chinsky updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Implants: Explosvie implant, exploding when victim hears the codephrase you set.</li>
<li class="rscadd">Implants: Compressed Matter implat, scan item (making it disappear), inject yourself and recall that item on will!</li>
<li class="rscadd">Implant removal surgery, with !!FUN!! results if you mess up it.</li>
<li class="rscadd">Coats now have pockets again.</li>
<li class="rscadd">Bash people on tabetops. an windows, or with stools. Grab people to bash them on tables or windows (better grab for better hit on windows). Drag stool sprite on you to pick it up, click on it in hand to make it usual stool again.</li>
<li class="rscadd">Surgical caps, and new sprites for bloodbags and fixovein.</li>
<li class="rscadd">Now some surgery steps will bloody your hands, Full-body blood coat in case youy mess up spectacualry.</li>
<li class="rscadd">Ported some crates (Art, Surgery, Sterile equiplemnt).</li>
<li class="tweak">Changed contraband crates. Posters moved to Art Crate, cigs and lipstick ot party crate. Now contraband crate has illegal booze and illicit drugs.</li>
<li class="bugfix">Finally got evac party lights</li>
<li class="bugfix">Now disfigurment,now it WILL happen when damage is bad enough.</li>
<li class="experiment">Now if you speak in depressurized area (less than 10 kPa) only people next to you can hear you. Radios still work though.</li>
</ul>
</div>
<!--
Credits Section
-->
<b>/tg/ station 13 Development Team</b>
<table align='center' class="top">
<tr>
<td valign='top'>
<font size='2'><b>Coders:</b> TLE, NEO, Errorage, muskets, veryinky, Skie, Noise, Numbers, Agouri, Noka, Urist McDorf, Uhangi, Darem, Mport, rastaf0, Doohl, Superxpdude, Rockdtben, ConstantA, Petethegoat, Kor, Polymorph, Carn, Nodrak, Donkie<br></font>
<font size='2'><b>Spriters:</b> Agouri, Cheridan, Cruazy Guest, Deeaych, Deuryn, Matty406, Microwave, ShiftyEyesShady, Skie, Uhangi, Veyveyr, Petethegoat, Kor, Ricotez, Ausops, TankNut<br></font>
<font size='2'><b>Sounds:</b> Skie, Lasty/Vinyl<br></font>
<font size='2'><b>Thanks to:</b> CDK Station devs, GoonStation devs, the original SpaceStation developers and Invisty for the title image</font>
</td>
</tr>
</table>
<b>Daedalus Development Team</b>
<table align='center' class="top">
<tr>
<td valign="top">
<font size="2"><b>Coders:</b> DopeGhoti, Sunfall, ThVortex</font><br>
<font size="2"><b>Artwork:</b> Captain Hammer</font><br>
<font size="2"><b>Spriters:</b> ((TODO.))</font><br>
<font size="2"><b>Sounds:</b> Peter J, due, Erik Satie</font><br>
<font size="2"><b>Thanks to:</b> All the dev teams that came before: BS12, /tg/station13, the Goons, and the original SS13 folks.</font><br>
</td>
</tr>
</table>
<b>GoonStation 13 Development Team</b>
<div class = "top">
<font size='2'><b>Coders:</b> Stuntwaffle, Showtime, Pantaloons, Nannek, Keelin, Exadv1, hobnob, Justicefries, 0staf, sniperchance, AngriestIBM, BrianOBlivion<br></font>
<font size='2'><b>Spriters:</b> Supernorn, Haruhi, Stuntwaffle, Pantaloons, Rho, SynthOrange, I Said No<br></font>
</div>
<p class="lic"><div align='center'><a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /></a><br /><i>This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-ShareAlike 3.0 Unported License</a>.<br>Rights are currently extended to <a href="http://forums.somethingawful.com/">SomethingAwful Goons</a> only.</i></p>
<p class="lic">Some icons by <a href="http://p.yusukekamiyamane.com/">Yusuke Kamiyamane</a>. All rights reserved. Licensed under a <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 License</a>.</p>
</td></tr></table></div>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 161 KiB

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

File diff suppressed because it is too large Load Diff
+10765 -10760
View File
File diff suppressed because it is too large Load Diff
+20 -8
View File
@@ -139,6 +139,18 @@ h4 {
clear: both;
padding: 8px;
}
#uiNoJavaScript {
position: relative;
background: url(uiNoticeBackground.jpg) 50% 50%;
color: #000000;
font-size: 14px;
font-style: italic;
font-weight: bold;
padding: 3px 4px 3px 4px;
margin: 4px 0 4px 0;
}
.white {
color: white;
font-weight: bold;
@@ -163,14 +175,14 @@ h4 {
color: #272727;
}
.notice {
position: relative;
background: url(uiNoticeBackground.jpg) 50% 50%;
color: #15345A;
font-size: 12px;
font-style: italic;
font-weight: bold;
padding: 3px 4px 3px 4px;
margin: 4px 0 4px 0;
position: relative;
background: url(uiNoticeBackground.jpg) 50% 50%;
color: #000000;
font-size: 12px;
font-style: italic;
font-weight: bold;
padding: 3px 4px 3px 4px;
margin: 4px 0 4px 0;
}
.notice.icon {
padding: 2px 4px 0 20px;
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -31
View File
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+24 -41
View File
@@ -71,9 +71,9 @@ NanoUpdate = function ()
// We store initialData and templateData in the body tag, it's as good a place as any
var body = $('body');
var templateData = body.data('templateData');
_data = body.data('initialData');
var initialData = body.data('initialData');
if (!templateData || !_data)
if (!templateData || !initialData)
{
alert('Error: Initial data did not load correctly.');
}
@@ -88,36 +88,40 @@ NanoUpdate = function ()
}
}
// load each template file and render it using _data
// load markup for each template and register it
for (var key in templateData)
{
if (templateData.hasOwnProperty(key))
{
$.when($.get(templateData[key]))
.done(function(templateData) {
.done(function(templateMarkup) {
if (_templates == null)
{
_templates = {};
}
templateData += '<div class="clearBoth"></div>'
templateMarkup = templateMarkup.replace(/ +\) *\}\}/g, ')}}');
templateMarkup += '<div class="clearBoth"></div>'
try
{
_templates[key] = $.templates(templateData);
_templates[key].link( "#mainTemplate", _data ); // initial data gets applied first, before any updates
_templates[key] = $.templates(key, templateMarkup);
templateCount--;
if (templateCount <= 0)
{
if (_earlyUpdateData !== null) // Newer data has already arrived, so update
{
renderTemplates(_earlyUpdateData);
}
else
{
renderTemplates(initialData);
}
_isInitialised = true;
}
if (_earlyUpdateData !== null) // Newer data has already arrived, so update
{
observedDataUpdateRecursive(_earlyUpdateData, _data);
}
executeCallbacks(_afterUpdateCallbacks, _data);
@@ -149,50 +153,29 @@ NanoUpdate = function ()
}
if (_isInitialised) // templates have been loaded and are observing the data. We need to update it recursively
if (_isInitialised) // all templates have been registered, so render them
{
executeCallbacks(_beforeUpdateCallbacks, updateData);
observedDataUpdateRecursive(updateData, _data);
renderTemplates(updateData);
executeCallbacks(_afterUpdateCallbacks, updateData);
}
else
{
_earlyUpdateData = updateData; // templates have not been loaded, therefor they are not observing the data. We set _earlyUpdateData which will be applied after the template is loaded with the initial data
_earlyUpdateData = updateData; // all templates have not been registered. We set _earlyUpdateData which will be applied after the template is loaded with the initial data
}
}
// This function updates the observed data recursively
// This function renders the template with the latest data
// It has to be done recursively as each piece of data is observed individually and needs to be updated individually
var observedDataUpdateRecursive = function (updateData, data, path)
var renderTemplates = function (data)
{
if (path === null || typeof path === 'undefined')
{
path = '';
}
else
{
path += '.';
}
for (var key in updateData)
{
if (updateData.hasOwnProperty(key))
{
var currentPath = path + key;
if (updateData[key] != null && typeof updateData[key] === 'object' && !$.isArray(updateData[key]))
{
observedDataUpdateRecursive(updateData[key], data, currentPath)
}
else
{
$.observable(data).setProperty(currentPath, updateData[key]);
}
}
}
_data = data;
$("#mainTemplate").html(_templates["main"].render(_data));
}
// execute all callbacks in the callbacks array/object provided, updateData is passed to them for processing
// Execute all callbacks in the callbacks array/object provided, updateData is passed to them for processing
var executeCallbacks = function (callbacks, updateData)
{
for (var index in callbacks)
+78 -78
View File
@@ -16,66 +16,66 @@ Used In File(s): /code/game/machinery/alarm.dm
#define AALARM_SCREEN_MODE 4
#define AALARM_SCREEN_SENSORS 5
--}}
{^{if !alarm}}
{{if !alarm}}
<h3>Atmospherics Control</h3>
<div class="statusDisplay">
{^{for alarms}}
{{for alarms}}
<div class="line">
{^{:~string("<div class='statusValue {0}'>{1}</div>",~dangerToClass(danger),name)}}
{^{:~link("Access","gear",{"alarm":ID},null,"floatRight")}}
{{:~string("<div class='statusValue {0}'>{1}</div>",~dangerToClass(danger),name)}}
{{:~link("Access","gear",{"alarm":ID},null,"floatRight")}}
</div>
{{/for}}
</div>
{{else}}
{^{:~link("Main Menu","gear",{"reset":1},null,null)}}
<h3>{^{:name}}</h3>
{^{if !air}}
{{:~link("Main Menu","gear",{"reset":1},null,null)}}
<h3>{{:name}}</h3>
{{if !air}}
<div class="notice">Unable to acquire air sample.</div>
{{else}}
<div class="statusDisplay">
<div class="line">
<div class="statusLabel">Pressure:</div>
{^{:~string("<div class='statusValue {0}'>{1} kPa</div>",~dangerToClass(air.danger.pressure),~precisionRound(air.pressure,4))}}
{{:~string("<div class='statusValue {0}'>{1} kPa</div>",~dangerToClass(air.danger.pressure),~precisionRound(air.pressure,4))}}
<div class="statusValue" style="margin-left:5px;">
{^{if !locked}}
{^{if mode == 3}}
{^{:~link("DEACTIVATE PANIC SYPHON",null,{"alarm":alarm,"mode" : 1},null,'linkOn')}}
{{if !locked}}
{{if mode == 3}}
{{:~link("DEACTIVATE PANIC SYPHON",null,{"alarm":alarm,"mode" : 1},null,'linkOn')}}
{{else}}
{^{:~link("ACTIVATE PANIC SYPHON",null,{"alarm":alarm,"mode" : 3},null,'red')}}
{{:~link("ACTIVATE PANIC SYPHON",null,{"alarm":alarm,"mode" : 3},null,'red')}}
{{/if}}
{{/if}}
</div>
</div>
<div class="line">
<div class="statusLabel">Oxygen:</div>
{^{:~displayBar(air.contents.oxygen, 0, 100, ~dangerToClass(air.danger.oxygen))}}
{^{:~string("<div class='statusValue {0}'>{1}%</div>",~dangerToClass(air.danger.oxygen),~precisionRound(air.contents.oxygen,2))}}
{{:~displayBar(air.contents.oxygen, 0, 100, ~dangerToClass(air.danger.oxygen))}}
{{:~string("<div class='statusValue {0}'>{1}%</div>",~dangerToClass(air.danger.oxygen),~precisionRound(air.contents.oxygen,2))}}
</div>
<div class="line">
<div class="statusLabel">Nitrogen:</div>
{^{:~displayBar(air.contents.nitrogen, 0, 100, ~dangerToClass(air.danger.nitrogen))}}
{^{:~string("<div class='statusValue {0}'>{1}%</div>",~dangerToClass(air.danger.nitrogen),~precisionRound(air.contents.nitrogen,2))}}
{{:~displayBar(air.contents.nitrogen, 0, 100, ~dangerToClass(air.danger.nitrogen))}}
{{:~string("<div class='statusValue {0}'>{1}%</div>",~dangerToClass(air.danger.nitrogen),~precisionRound(air.contents.nitrogen,2))}}
</div>
<div class="line">
<div class="statusLabel">Carbon Dioxide:</div>
{^{:~displayBar(air.contents.co2, 0, 100, ~dangerToClass(air.danger.co2))}}
{^{:~string("<div class='statusValue {0}'>{1}%</div>",~dangerToClass(air.danger.co2),~precisionRound(air.contents.co2,2))}}
{{:~displayBar(air.contents.co2, 0, 100, ~dangerToClass(air.danger.co2))}}
{{:~string("<div class='statusValue {0}'>{1}%</div>",~dangerToClass(air.danger.co2),~precisionRound(air.contents.co2,2))}}
</div>
<div class="line">
<div class="statusLabel">Toxins:</div>
{^{:~displayBar(air.contents.plasma, 0, 100, ~dangerToClass(air.danger.plasma))}}
{^{:~string("<div class='statusValue {0}'>{1}%</div>",~dangerToClass(air.danger.plasma),~precisionRound(air.contents.plasma,2))}}
{{:~displayBar(air.contents.plasma, 0, 100, ~dangerToClass(air.danger.plasma))}}
{{:~string("<div class='statusValue {0}'>{1}%</div>",~dangerToClass(air.danger.plasma),~precisionRound(air.contents.plasma,2))}}
</div>
<div class="line">
<div class="statusLabel">
Temperature:
</div>
{^{:~string("<div class='statusValue {0}'>{1}&deg;K ({2}&deg;C)</div>",~dangerToClass(air.danger.temperature),~precisionRound(air.temperature,2),~precisionRound(air.temperature_c,2))}}
{{:~string("<div class='statusValue {0}'>{1}&deg;K ({2}&deg;C)</div>",~dangerToClass(air.danger.temperature),~precisionRound(air.temperature,2),~precisionRound(air.temperature_c,2))}}
</div>
<div class="line">
<div class="statusLabel">Local Status:</div>
{^{if air.danger.overall == 0}}
{^{if atmos_alarm}}
{{if air.danger.overall == 0}}
{{if atmos_alarm}}
<div class="average">Caution: Atmos alert in area
{{else}}
<div class="good">Optimal
@@ -85,11 +85,11 @@ Used In File(s): /code/game/machinery/alarm.dm
{{else}}
<div class="notice">DANGER: Internals Required
{{/if}}
{^{if !locked}}
{^{if atmos_alarm}}
{^{:~link('Reset Alarm',null,{"alarm":alarm,'atmos_reset':1},null,'linkOn floatRight')}}
{{if !locked}}
{{if atmos_alarm}}
{{:~link('Reset Alarm',null,{"alarm":alarm,'atmos_reset':1},null,'linkOn floatRight')}}
{{else}}
{^{:~link('Activate Alarm',null,{"alarm":alarm,'atmos_alarm':1},null,'red floatRight')}}
{{:~link('Activate Alarm',null,{"alarm":alarm,'atmos_alarm':1},null,'red floatRight')}}
{{/if}}
{{/if}}
</div>
@@ -101,64 +101,64 @@ Used In File(s): /code/game/machinery/alarm.dm
#define RCON_YES 3
-->
<div class="statusLabel">Remote Control:</div>
{^{:~link('Off', null, {"alarm":alarm,'rcon' : 1}, (rcon != 1) ? null : 'disabled')}}
{^{:~link('Auto', null, {"alarm":alarm,'rcon' : 2}, (rcon != 2) ? null : 'disabled')}}
{^{:~link('On', null, {"alarm":alarm,'rcon' : 3}, (rcon != 3) ? null : 'disabled')}}
{{:~link('Off', null, {"alarm":alarm,'rcon' : 1}, (rcon != 1) ? null : 'disabled')}}
{{:~link('Auto', null, {"alarm":alarm,'rcon' : 2}, (rcon != 2) ? null : 'disabled')}}
{{:~link('On', null, {"alarm":alarm,'rcon' : 3}, (rcon != 3) ? null : 'disabled')}}
</div>
<div class="line">
<div class="statusLabel">Thermostat:</div>
{^{:~link(target_temp+" C", 'carat-2-n-s', {"alarm":alarm,'temperature': 1})}}
{{:~link(target_temp+" C", 'carat-2-n-s', {"alarm":alarm,'temperature': 1})}}
</div>
</div>
{{/if}}
{^{if locked}}
{{if locked}}
<div class="notice">Swipe card to unlock.</div>
{{else}}
<div class="notice">Remember to lock with ID card after use.</div>
<div class="item">
<div class="itemLabel">Screen:</div>
<div class="itemContents">
{^{:~link('Main', 'gear',{"alarm":alarm,'screen':1},(screen==1)?'linkOn':'')}}
{^{:~link('Vents', 'gear',{"alarm":alarm,'screen':2},(screen==2)?'linkOn':'')}}
{^{:~link('Scrubbers', 'gear',{"alarm":alarm,'screen':3},(screen==3)?'linkOn':'')}}
{^{:~link('Mode', 'gear',{"alarm":alarm,'screen':4},(screen==4)?'linkOn':'')}}
{^{:~link('Thresholds','gear',{"alarm":alarm,'screen':5},(screen==5)?'linkOn':'')}}
{{:~link('Main', 'gear',{"alarm":alarm,'screen':1},(screen==1)?'linkOn':'')}}
{{:~link('Vents', 'gear',{"alarm":alarm,'screen':2},(screen==2)?'linkOn':'')}}
{{:~link('Scrubbers', 'gear',{"alarm":alarm,'screen':3},(screen==3)?'linkOn':'')}}
{{:~link('Mode', 'gear',{"alarm":alarm,'screen':4},(screen==4)?'linkOn':'')}}
{{:~link('Thresholds','gear',{"alarm":alarm,'screen':5},(screen==5)?'linkOn':'')}}
</div>
</div>
{{!-- VENTS --}}
{^{if screen == 2}}
{{if screen == 2}}
<h3>Vent Pump Settings</h3>
{^{for vents}}
{{for vents}}
<div class="statusDisplay">
<div class="line">
<b>{^{>name}}:</b> {^{:state}}
<b>{{>name}}:</b> {{:state}}
</div>
<div class="line">
<div class="statusLabel">Operating:</div>
<div class="statusValue">
{^{:~link(power ? 'On':'Off','power',{"alarm":alarm,'id_tag':id_tag,'command':'power','val':power?0:1},null,(power?'linkOn':'red'))}}
{^{if direction=="siphon"}}
{^{:~link('Siphoning','arrowthickstop-1-s',{"alarm":alarm,'id_tag':id_tag,'command':'set_dir','dir':'release'})}}
{{:~link(power ? 'On':'Off','power',{"alarm":alarm,'id_tag':id_tag,'command':'power','val':power?0:1},null,(power?'linkOn':'red'))}}
{{if direction=="siphon"}}
{{:~link('Siphoning','arrowthickstop-1-s',{"alarm":alarm,'id_tag':id_tag,'command':'set_dir','dir':'release'})}}
{{else}}
{^{:~link('Blowing','arrowthick-1-n',{"alarm":alarm,'id_tag':id_tag,'command':'set_dir','dir':'siphon'})}}
{{:~link('Blowing','arrowthick-1-n',{"alarm":alarm,'id_tag':id_tag,'command':'set_dir','dir':'siphon'})}}
{{/if}}
</div>
</div>
<div class="line">
<div class="statusLabel">Pressure checks:</div>
<div class="statusValue">
{^{:~link('External','power',{"alarm":alarm,'id_tag':id_tag,'command':'checks','val':~xor(checks,1)},null,(checks & 1 ?'linkOn':'red'))}}
{^{:~link('Internal','power',{"alarm":alarm,'id_tag':id_tag,'command':'checks','val':~xor(checks,2)},null,(checks & 2 ?'linkOn':'red'))}}
{{:~link('External','power',{"alarm":alarm,'id_tag':id_tag,'command':'checks','val':~xor(checks,1)},null,(checks & 1 ?'linkOn':'red'))}}
{{:~link('Internal','power',{"alarm":alarm,'id_tag':id_tag,'command':'checks','val':~xor(checks,2)},null,(checks & 2 ?'linkOn':'red'))}}
</div>
</div>
<div class="line">
<div class="statusLabel">External pressure target:</div>
<div class="statusValue">
{^{:~precisionRound(external,4)}} kPa
{{:~precisionRound(external,4)}} kPa
</div>
{^{:~link('Set','gear',{"alarm":alarm,'id_tag':id_tag,'command':'set_external_pressure'})}}
{^{:~link('Reset','arrowrefresh-1-n',{"alarm":alarm,'id_tag':id_tag,'command':'set_external_pressure','val':101.325},null,'linkOn')}}
{{:~link('Set','gear',{"alarm":alarm,'id_tag':id_tag,'command':'set_external_pressure'})}}
{{:~link('Reset','arrowrefresh-1-n',{"alarm":alarm,'id_tag':id_tag,'command':'set_external_pressure','val':101.325},null,'linkOn')}}
</div>
</div>
{{else}}
@@ -167,35 +167,35 @@ Used In File(s): /code/game/machinery/alarm.dm
{{!-- SCRUBBERS --}}
{{else screen == 3}}
<h3>Scrubbers</h3>
{^{for scrubbers}}
{{for scrubbers}}
<div class="statusDisplay">
<div class="line">
<b>{^{>name}}:</b> {^{:state}}
<b>{{>name}}:</b> {{:state}}
</div>
<div class="line">
<div class="statusLabel">Operating:</div>
<div class="statusValue">
{^{:~link(power ? 'On':'Off','power',{"alarm":alarm,'id_tag':id_tag,'command':'power','val':power?0:1},null,(power?'linkOn':'red'))}}
{{:~link(power ? 'On':'Off','power',{"alarm":alarm,'id_tag':id_tag,'command':'power','val':power?0:1},null,(power?'linkOn':'red'))}}
</div>
</div>
<div class="line">
<div class="statusLabel">Type:</div>
<div class="statusValue">
{^{if scrubbing==0}}
{^{:~link('Siphoning','arrowthickstop-1-s',{"alarm":alarm,'id_tag':id_tag,'command':'scrubbing','val':1},null,'red')}}
{{if scrubbing==0}}
{{:~link('Siphoning','arrowthickstop-1-s',{"alarm":alarm,'id_tag':id_tag,'command':'scrubbing','val':1},null,'red')}}
{{else}}
{^{:~link('Scrubbing','transferthick-e-w',{"alarm":alarm,'id_tag':id_tag,'command':'scrubbing','val':0},null,'linkOn')}}
{{:~link('Scrubbing','transferthick-e-w',{"alarm":alarm,'id_tag':id_tag,'command':'scrubbing','val':0},null,'linkOn')}}
{{/if}}
</div>
</div>
{^{if scrubbing==1}}
{{if scrubbing==1}}
<div class="line">
<div class="statusLabel">Filtering:</div>
<div class="statusValue">
{^{:~link('CO<sub>2</sub>',null,{"alarm":alarm,'id_tag':id_tag,'command':'co2_scrub','val':(filter_co2==0?1:0)},null,(filter_co2?'linkOn':''))}}
{^{:~link('Plasma', null,{"alarm":alarm,'id_tag':id_tag,'command':'tox_scrub','val':(filter_tox==0?1:0)},null,(filter_tox?'linkOn':''))}}
{^{:~link('N<sub>2</sub>O',null,{"alarm":alarm,'id_tag':id_tag,'command':'n2o_scrub','val':(filter_n2o==0?1:0)},null,(filter_n2o?'linkOn':''))}}
{^{:~link('O<sub>2</sub>', null,{"alarm":alarm,'id_tag':id_tag,'command':'o2_scrub', 'val':(filter_o2 ==0?1:0)},null,(filter_o2 ?'linkOn':''))}}
{{:~link('CO<sub>2</sub>',null,{"alarm":alarm,'id_tag':id_tag,'command':'co2_scrub','val':(filter_co2==0?1:0)},null,(filter_co2?'linkOn':''))}}
{{:~link('Plasma', null,{"alarm":alarm,'id_tag':id_tag,'command':'tox_scrub','val':(filter_tox==0?1:0)},null,(filter_tox?'linkOn':''))}}
{{:~link('N<sub>2</sub>O',null,{"alarm":alarm,'id_tag':id_tag,'command':'n2o_scrub','val':(filter_n2o==0?1:0)},null,(filter_n2o?'linkOn':''))}}
{{:~link('O<sub>2</sub>', null,{"alarm":alarm,'id_tag':id_tag,'command':'o2_scrub', 'val':(filter_o2 ==0?1:0)},null,(filter_o2 ?'linkOn':''))}}
</div>
</div>
{{/if}}
@@ -207,11 +207,11 @@ Used In File(s): /code/game/machinery/alarm.dm
{{else screen == 4}}
<h3>System Mode</h3>
<div class="statusDisplay">
{^{for modes}}
{{for modes}}
<div class="line">
<div class="statusLabel">{^{:~link(name,'gear',{"alarm":alarm,'mode':#index+1},null,(#index+1==~root.mode?'linkOn':''))}}</div>
<div class="statusLabel">{{:~link(name,'gear',{"alarm":alarm,'mode':#index+1},null,(#index+1==~root.mode?'linkOn':''))}}</div>
<div class="statusValue">
{^{:desc}}
{{:desc}}
</div>
</div>
{{/for}}
@@ -219,11 +219,11 @@ Used In File(s): /code/game/machinery/alarm.dm
<h3>System Preset</h3>
<div class="notice">After making a selection, the system will automatically cycle in order to remove contaminants.</div>
<div class="statusDisplay">
{^{for presets}}
{{for presets}}
<div class="line">
<div class="statusLabel">{^{:~link(name,'gear',{"alarm":alarm,'preset':#index+1},null,(#index+1==~root.preset?'linkOn':''))}}</div>
<div class="statusLabel">{{:~link(name,'gear',{"alarm":alarm,'preset':#index+1},null,(#index+1==~root.preset?'linkOn':''))}}</div>
<div class="statusValue">
{^{:desc}}
{{:desc}}
</div>
</div>
{{/for}}
@@ -243,38 +243,38 @@ Used In File(s): /code/game/machinery/alarm.dm
<tbody>
<tr>
<th>O<sub>2</sub></th>
{^{for sensors.oxygen}}
<td>{^{:~link(#data >= 0 ? ~precisionRound(#data,4) : "OFF",null,{"alarm":alarm,'command':'set_threshold','env':'oxygen','var':#index+1})}}</td>
{{for sensors.oxygen}}
<td>{{:~link(#data >= 0 ? ~precisionRound(#data,4) : "OFF",null,{"alarm":alarm,'command':'set_threshold','env':'oxygen','var':#index+1})}}</td>
{{/for}}
</tr>
<tr>
<th>N<sub>2</sub></th>
{^{for sensors.nitrogen}}
<td>{^{:~link(#data >= 0 ? ~precisionRound(#data,4) : "OFF",null,{"alarm":alarm,'command':'set_threshold','env':'nitrogen','var':#index+1})}}</td>
{{for sensors.nitrogen}}
<td>{{:~link(#data >= 0 ? ~precisionRound(#data,4) : "OFF",null,{"alarm":alarm,'command':'set_threshold','env':'nitrogen','var':#index+1})}}</td>
{{/for}}
</tr>
<tr>
<th>CO<sub>2</sub></th>
{^{for sensors.carbon_dioxide}}
<td>{^{:~link(#data >= 0 ? ~precisionRound(#data,4) : "OFF",null,{"alarm":alarm,'command':'set_threshold','env':'carbon_dioxide','var':#index+1})}}</td>
{{for sensors.carbon_dioxide}}
<td>{{:~link(#data >= 0 ? ~precisionRound(#data,4) : "OFF",null,{"alarm":alarm,'command':'set_threshold','env':'carbon_dioxide','var':#index+1})}}</td>
{{/for}}
</tr>
<tr>
<th>Toxins</th>
{^{for sensors.plasma}}
<td>{^{:~link(#data >= 0 ? ~precisionRound(#data,4) : "OFF",null,{"alarm":alarm,'command':'set_threshold','env':'plasma','var':#index+1})}}</td>
{{for sensors.plasma}}
<td>{{:~link(#data >= 0 ? ~precisionRound(#data,4) : "OFF",null,{"alarm":alarm,'command':'set_threshold','env':'plasma','var':#index+1})}}</td>
{{/for}}
</tr>
<tr>
<th>Pressure</th>
{^{for sensors.pressure}}
<td>{^{:~link(#data >= 0 ? ~precisionRound(#data,4) : "OFF",null,{"alarm":alarm,'command':'set_threshold','env':'pressure','var':#index+1})}}</td>
{{for sensors.pressure}}
<td>{{:~link(#data >= 0 ? ~precisionRound(#data,4) : "OFF",null,{"alarm":alarm,'command':'set_threshold','env':'pressure','var':#index+1})}}</td>
{{/for}}
</tr>
<tr>
<th>Temperature (K)</th>
{^{for sensors.temperature}}
<td>{^{:~link(#data >= 0 ? ~precisionRound(#data,4) : "OFF",null,{"alarm":alarm,'command':'set_threshold','env':'temperature','var':#index+1})}}</td>
{{for sensors.temperature}}
<td>{{:~link(#data >= 0 ? ~precisionRound(#data,4) : "OFF",null,{"alarm":alarm,'command':'set_threshold','env':'temperature','var':#index+1})}}</td>
{{/for}}
</tr>
</tbody>

Some files were not shown because too many files have changed in this diff Show More