@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
RestrainedClickOn(A)
|
||||
else
|
||||
*/
|
||||
A.add_hiddenprint(src)
|
||||
A.attack_ai(src)
|
||||
|
||||
/*
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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]'"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(..())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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//=======//
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -86,6 +86,7 @@
|
||||
else if(stat & NOPOWER)
|
||||
icon_state = initial(icon_state)
|
||||
icon_state += "0"
|
||||
luminosity = 0
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>"
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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."
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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!
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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--
|
||||
|
||||
@@ -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--
|
||||
|
||||
@@ -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."
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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>
|
||||
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 161 KiB After Width: | Height: | Size: 158 KiB |
|
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 155 KiB |
|
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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}°K ({2}°C)</div>",~dangerToClass(air.danger.temperature),~precisionRound(air.temperature,2),~precisionRound(air.temperature_c,2))}}
|
||||
{{:~string("<div class='statusValue {0}'>{1}°K ({2}°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>
|
||||
|
||||