mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-21 03:55:05 +01:00
Merge branch 'master' into admin-additions
This commit is contained in:
@@ -146,7 +146,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
|
||||
|
||||
if(kickbannedckey)
|
||||
if(banned_mob && banned_mob.client && banned_mob.client.ckey == banckey)
|
||||
del(banned_mob.client)
|
||||
qdel(banned_mob.client)
|
||||
|
||||
if(isjobban)
|
||||
jobban_client_fullban(ckey, job)
|
||||
@@ -211,7 +211,7 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "")
|
||||
query.Execute()
|
||||
while(query.NextRow())
|
||||
ban_id = query.item[1]
|
||||
ban_number++;
|
||||
ban_number++
|
||||
|
||||
if(ban_number == 0)
|
||||
to_chat(usr, "<span class='warning'>Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin.</span>")
|
||||
@@ -314,7 +314,7 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
|
||||
query.Execute()
|
||||
while(query.NextRow())
|
||||
pckey = query.item[1]
|
||||
ban_number++;
|
||||
ban_number++
|
||||
|
||||
if(ban_number == 0)
|
||||
to_chat(usr, "<span class='warning'>Database update failed due to a ban id not being present in the database.</span>")
|
||||
|
||||
@@ -72,7 +72,7 @@ GLOBAL_VAR_INIT(nologevent, 0)
|
||||
body += "\[<A href='?_src_=holder;editrights=rank;ckey=[M.ckey]'>[M.client.holder ? M.client.holder.rank : "Player"]</A>\] "
|
||||
body += "\[<A href='?_src_=holder;getplaytimewindow=[M.UID()]'>" + M.client.get_exp_type(EXP_TYPE_CREW) + " as [EXP_TYPE_CREW]</a>\]"
|
||||
|
||||
if(istype(M, /mob/new_player))
|
||||
if(isnewplayer(M))
|
||||
body += " <B>Hasn't Entered Game</B> "
|
||||
else
|
||||
body += " \[<A href='?_src_=holder;revive=[M.UID()]'>Heal</A>\] "
|
||||
@@ -148,7 +148,7 @@ GLOBAL_VAR_INIT(nologevent, 0)
|
||||
body += {" | <A href='?_src_=holder;cryossd=[M.UID()]'>Cryo</A> "}
|
||||
|
||||
if(M.client)
|
||||
if(!istype(M, /mob/new_player))
|
||||
if(!isnewplayer(M))
|
||||
body += "<br><br>"
|
||||
body += "<b>Transformation:</b>"
|
||||
body += "<br>"
|
||||
@@ -1005,13 +1005,13 @@ GLOBAL_VAR_INIT(gamma_ship_location, 1) // 0 = station , 1 = space
|
||||
/proc/kick_clients_in_lobby(message, kick_only_afk = 0)
|
||||
var/list/kicked_client_names = list()
|
||||
for(var/client/C in GLOB.clients)
|
||||
if(istype(C.mob, /mob/new_player))
|
||||
if(isnewplayer(C.mob))
|
||||
if(kick_only_afk && !C.is_afk()) //Ignore clients who are not afk
|
||||
continue
|
||||
if(message)
|
||||
to_chat(C, message)
|
||||
kicked_client_names.Add("[C.ckey]")
|
||||
del(C)
|
||||
qdel(C)
|
||||
return kicked_client_names
|
||||
|
||||
//returns 1 to let the dragdrop code know we are trapping this event
|
||||
|
||||
@@ -61,6 +61,11 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons
|
||||
return 1
|
||||
|
||||
/proc/load_admins()
|
||||
if(IsAdminAdvancedProcCall())
|
||||
to_chat(usr, "<span class='boldannounce'>Admin reload blocked: Advanced ProcCall detected.</span>")
|
||||
message_admins("[key_name(usr)] attempted to reload admins via advanced proc-call")
|
||||
log_admin("[key_name(usr)] attempted to reload admins via advanced proc-call")
|
||||
return
|
||||
//clear the datums references
|
||||
GLOB.admin_datums.Cut()
|
||||
for(var/client/C in GLOB.admins)
|
||||
@@ -68,6 +73,10 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons
|
||||
C.holder = null
|
||||
GLOB.admins.Cut()
|
||||
|
||||
// Remove all profiler access
|
||||
for(var/A in world.GetConfig("admin"))
|
||||
world.SetConfig("APP/admin", A, null)
|
||||
|
||||
if(config.admin_legacy_system)
|
||||
load_admin_ranks()
|
||||
|
||||
@@ -98,6 +107,9 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons
|
||||
//create the admin datum and store it for later use
|
||||
var/datum/admins/D = new /datum/admins(rank, rights, ckey)
|
||||
|
||||
if(D.rights & R_DEBUG || D.rights & R_VIEWRUNTIMES) // Grants profiler access to anyone with R_DEBUG or R_VIEWRUNTIMES
|
||||
world.SetConfig("APP/admin", ckey, "role=admin")
|
||||
|
||||
//find the client for a ckey if they are connected and associate them with the new admin datum
|
||||
D.associate(GLOB.directory[ckey])
|
||||
|
||||
@@ -122,6 +134,9 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons
|
||||
if(istext(rights)) rights = text2num(rights)
|
||||
var/datum/admins/D = new /datum/admins(rank, rights, ckey)
|
||||
|
||||
if(D.rights & R_DEBUG || D.rights & R_VIEWRUNTIMES) // Grants profiler access to anyone with R_DEBUG or R_VIEWRUNTIMES
|
||||
world.SetConfig("APP/admin", ckey, "role=admin")
|
||||
|
||||
//find the client for a ckey if they are connected and associate them with the new admin datum
|
||||
D.associate(GLOB.directory[ckey])
|
||||
if(!GLOB.admin_datums)
|
||||
|
||||
@@ -249,6 +249,8 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list(
|
||||
verbs += GLOB.admin_verbs_server
|
||||
if(holder.rights & R_DEBUG)
|
||||
verbs += GLOB.admin_verbs_debug
|
||||
spawn(1)
|
||||
control_freak = 0 // Setting control_freak to 0 allows you to use the Profiler and other client-side tools
|
||||
if(holder.rights & R_POSSESS)
|
||||
verbs += GLOB.admin_verbs_possess
|
||||
if(holder.rights & R_PERMISSIONS)
|
||||
@@ -269,6 +271,9 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list(
|
||||
verbs += GLOB.admin_verbs_proccall
|
||||
if(holder.rights & R_VIEWRUNTIMES)
|
||||
verbs += /client/proc/view_runtimes
|
||||
spawn(1) // This setting exposes the profiler for people with R_VIEWRUNTIMES. They must still have it set in cfg/admin.txt
|
||||
control_freak = 0
|
||||
|
||||
|
||||
/client/proc/remove_admin_verbs()
|
||||
verbs.Remove(
|
||||
@@ -334,7 +339,7 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list(
|
||||
ghost.reenter_corpse()
|
||||
log_admin("[key_name(usr)] re-entered their body")
|
||||
feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
else if(istype(mob,/mob/new_player))
|
||||
else if(isnewplayer(mob))
|
||||
to_chat(src, "<font color='red'>Error: Aghost: Can't admin-ghost whilst in the lobby. Join or observe first.</font>")
|
||||
else
|
||||
//ghostize
|
||||
@@ -539,7 +544,7 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list(
|
||||
message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban")
|
||||
log_admin("[key_name(src)] has warned [key_name(C)] resulting in a [AUTOBANTIME] minute ban")
|
||||
to_chat(C, "<font color='red'><BIG><B>You have been autobanned due to a warning by [ckey].</B></BIG><br>This is a temporary ban, it will be removed in [AUTOBANTIME] minutes.")
|
||||
del(C)
|
||||
qdel(C)
|
||||
else
|
||||
message_admins("[key_name_admin(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban")
|
||||
log_admin("[key_name(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban")
|
||||
|
||||
@@ -16,6 +16,11 @@ GLOBAL_PROTECT(admin_datums) // This is protected because we dont want people ma
|
||||
var/admincaster_signature //What you'll sign the newsfeeds as
|
||||
|
||||
/datum/admins/New(initial_rank = "Temporary Admin", initial_rights = 0, ckey)
|
||||
if(IsAdminAdvancedProcCall())
|
||||
to_chat(usr, "<span class='boldannounce'>Admin rank creation blocked: Advanced ProcCall detected.</span>")
|
||||
message_admins("[key_name(usr)] attempted to create a new admin rank via advanced proc-call")
|
||||
log_admin("[key_name(usr)] attempted to edit feedback a new admin rank via advanced proc-call")
|
||||
return
|
||||
if(!ckey)
|
||||
error("Admin datum created without a ckey argument. Datum has been deleted")
|
||||
qdel(src)
|
||||
@@ -26,10 +31,20 @@ GLOBAL_PROTECT(admin_datums) // This is protected because we dont want people ma
|
||||
GLOB.admin_datums[ckey] = src
|
||||
|
||||
/datum/admins/Destroy()
|
||||
if(IsAdminAdvancedProcCall())
|
||||
to_chat(usr, "<span class='boldannounce'>Admin rank deletion blocked: Advanced ProcCall detected.</span>")
|
||||
message_admins("[key_name(usr)] attempted to delete an admin rank via advanced proc-call")
|
||||
log_admin("[key_name(usr)] attempted to delete an admin rank via advanced proc-call")
|
||||
return
|
||||
..()
|
||||
return QDEL_HINT_HARDDEL_NOW
|
||||
|
||||
/datum/admins/proc/associate(client/C)
|
||||
if(IsAdminAdvancedProcCall())
|
||||
to_chat(usr, "<span class='boldannounce'>Rank association blocked: Advanced ProcCall detected.</span>")
|
||||
message_admins("[key_name(usr)] attempted to associate an admin rank to a new client via advanced proc-call")
|
||||
log_admin("[key_name(usr)] attempted to associate an admin rank to a new client via advanced proc-call")
|
||||
return
|
||||
if(istype(C))
|
||||
owner = C
|
||||
owner.holder = src
|
||||
@@ -39,6 +54,11 @@ GLOBAL_PROTECT(admin_datums) // This is protected because we dont want people ma
|
||||
GLOB.admins |= C
|
||||
|
||||
/datum/admins/proc/disassociate()
|
||||
if(IsAdminAdvancedProcCall())
|
||||
to_chat(usr, "<span class='boldannounce'>Rank disassociation blocked: Advanced ProcCall detected.</span>")
|
||||
message_admins("[key_name(usr)] attempted to disassociate an admin rank from a client via advanced proc-call")
|
||||
log_admin("[key_name(usr)] attempted to disassociate an admin rank from a client via advanced proc-call")
|
||||
return
|
||||
if(owner)
|
||||
GLOB.admins -= owner
|
||||
owner.remove_admin_verbs()
|
||||
@@ -88,6 +108,11 @@ you will have to do something like if(client.holder.rights & R_ADMIN) yourself.
|
||||
return 0
|
||||
|
||||
/client/proc/deadmin()
|
||||
if(IsAdminAdvancedProcCall())
|
||||
to_chat(usr, "<span class='boldannounce'>Deadmin blocked: Advanced ProcCall detected.</span>")
|
||||
message_admins("[key_name(usr)] attempted to de-admin a client via advanced proc-call")
|
||||
log_admin("[key_name(usr)] attempted to de-admin a client via advanced proc-call")
|
||||
return
|
||||
GLOB.admin_datums -= ckey
|
||||
if(holder)
|
||||
holder.disassociate()
|
||||
|
||||
@@ -102,6 +102,11 @@
|
||||
to_chat(usr, "<span class='notice'>Admin rank changed.</span>")
|
||||
|
||||
/datum/admins/proc/log_admin_permission_modification(var/adm_ckey, var/new_permission)
|
||||
if(IsAdminAdvancedProcCall())
|
||||
to_chat(usr, "<span class='boldannounce'>Admin edit blocked: Advanced ProcCall detected.</span>")
|
||||
message_admins("[key_name(usr)] attempted to edit admin ranks via advanced proc-call")
|
||||
log_admin("[key_name(usr)] attempted to edit admin ranks via advanced proc-call")
|
||||
return
|
||||
if(config.admin_legacy_system)
|
||||
return
|
||||
|
||||
|
||||
@@ -268,7 +268,7 @@
|
||||
else
|
||||
M_job = "Living"
|
||||
|
||||
else if(istype(M,/mob/new_player))
|
||||
else if(isnewplayer(M))
|
||||
M_job = "New player"
|
||||
|
||||
else if(isobserver(M))
|
||||
@@ -356,7 +356,7 @@
|
||||
dat += "<td>[M.real_name]</td>"
|
||||
else if(istype(M, /mob/living/silicon/pai))
|
||||
dat += "<td>pAI</td>"
|
||||
else if(istype(M, /mob/new_player))
|
||||
else if(isnewplayer(M))
|
||||
dat += "<td>New Player</td>"
|
||||
else if(isobserver(M))
|
||||
dat += "<td>Ghost</td>"
|
||||
@@ -490,6 +490,9 @@
|
||||
if(SSticker.mode.wizards.len)
|
||||
dat += check_role_table("Wizards", SSticker.mode.wizards)
|
||||
|
||||
if(SSticker.mode.apprentices.len)
|
||||
dat += check_role_table("Apprentices", SSticker.mode.apprentices)
|
||||
|
||||
if(SSticker.mode.raiders.len)
|
||||
dat += check_role_table("Raiders", SSticker.mode.raiders)
|
||||
|
||||
|
||||
@@ -186,9 +186,13 @@
|
||||
var/err = query_list_notes.ErrorMsg()
|
||||
log_game("SQL ERROR obtaining ckey from notes table. Error : \[[err]\]\n")
|
||||
return
|
||||
to_chat(usr, "<span class='notice'>Started regex note search for [search]. Please wait for results...</span>")
|
||||
message_admins("[usr.ckey] has started a note search with the following regex: [search] | CPU usage may be higher.")
|
||||
while(query_list_notes.NextRow())
|
||||
index_ckey = query_list_notes.item[1]
|
||||
output += "<a href='?_src_=holder;shownoteckey=[index_ckey]'>[index_ckey]</a><br>"
|
||||
CHECK_TICK
|
||||
message_admins("The note search started by [usr.ckey] has complete. CPU should return to normal.")
|
||||
else
|
||||
output += "<center><a href='?_src_=holder;addnoteempty=1'>\[Add Note\]</a></center>"
|
||||
output += ruler
|
||||
|
||||
@@ -909,7 +909,7 @@
|
||||
log_admin("[key_name(usr)] booted [key_name(M)].")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] booted [key_name_admin(M)].</span>", 1)
|
||||
//M.client = null
|
||||
del(M.client)
|
||||
qdel(M.client)
|
||||
|
||||
//Player Notes
|
||||
else if(href_list["addnote"])
|
||||
@@ -1011,8 +1011,7 @@
|
||||
log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.</span>")
|
||||
|
||||
del(M.client)
|
||||
//qdel(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends.
|
||||
qdel(M.client)
|
||||
if("No")
|
||||
var/reason = input(usr,"Please state the reason","Reason") as message|null
|
||||
if(!reason)
|
||||
@@ -1032,8 +1031,7 @@
|
||||
feedback_inc("ban_perma",1)
|
||||
DB_ban_record(BANTYPE_PERMA, M, -1, reason)
|
||||
|
||||
del(M.client)
|
||||
//qdel(M)
|
||||
qdel(M.client)
|
||||
if("Cancel")
|
||||
return
|
||||
|
||||
@@ -1567,7 +1565,7 @@
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
var/mob/M = locateUID(href_list["makeanimal"])
|
||||
if(istype(M, /mob/new_player))
|
||||
if(isnewplayer(M))
|
||||
to_chat(usr, "<span class='warning'>This cannot be used on instances of type /mob/new_player</span>")
|
||||
return
|
||||
if(alert(usr, "Confirm make animal?",, "Yes", "No") != "Yes")
|
||||
|
||||
@@ -430,7 +430,7 @@
|
||||
else if(expression[start + 1] == "\[" && islist(v))
|
||||
var/list/L = v
|
||||
var/index = SDQL_expression(source, expression[start + 2])
|
||||
if(isnum(index) && (!IsInteger(index) || L.len < index))
|
||||
if(isnum(index) && (!ISINTEGER(index) || L.len < index))
|
||||
to_chat(world, "<span class='danger'>Invalid list index: [index]</span>")
|
||||
return null
|
||||
return L[index]
|
||||
@@ -444,9 +444,9 @@
|
||||
|
||||
if(object == world) // Global proc.
|
||||
procname = "/proc/[procname]"
|
||||
return call(procname)(arglist(new_args))
|
||||
return (WrapAdminProcCall(GLOBAL_PROC, procname, new_args))
|
||||
|
||||
return call(object, procname)(arglist(new_args))
|
||||
return (WrapAdminProcCall(object, procname, new_args))
|
||||
|
||||
/proc/SDQL2_tokenize(query_text)
|
||||
|
||||
|
||||
@@ -165,7 +165,7 @@ GLOBAL_LIST_INIT(adminhelp_ignored_words, list("unknown","the","a","an","of","mo
|
||||
var/admin_number_ignored = 0 //Holds the number of admins without +BAN (so admins who are not really admins)
|
||||
var/admin_number_decrease = 0 //Holds the number of admins with are afk, ignored or both
|
||||
for(var/client/X in GLOB.admins)
|
||||
admin_number_total++;
|
||||
admin_number_total++
|
||||
var/invalid = 0
|
||||
if(requiredflags != 0 && !check_rights_for(X, requiredflags))
|
||||
admin_number_ignored++
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
var/list/client/targets[0]
|
||||
for(var/client/T)
|
||||
if(T.mob)
|
||||
if(istype(T.mob, /mob/new_player))
|
||||
if(isnewplayer(T.mob))
|
||||
targets["(New Player) - [T]"] = T
|
||||
else if(istype(T.mob, /mob/dead/observer))
|
||||
targets["[T.mob.name](Ghost) - [T]"] = T
|
||||
@@ -42,7 +42,7 @@
|
||||
var/list/client/targets[0]
|
||||
for(var/client/T)
|
||||
if(T.mob)
|
||||
if(istype(T.mob, /mob/new_player))
|
||||
if(isnewplayer(T.mob))
|
||||
targets["[T] - (New Player)"] = T
|
||||
else if(istype(T.mob, /mob/dead/observer))
|
||||
targets["[T] - [T.mob.name](Ghost)"] = T
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/client/proc/atmosscan()
|
||||
set category = "Mapping"
|
||||
set name = "Check Piping"
|
||||
set background = 1
|
||||
if(!src.holder)
|
||||
to_chat(src, "Only administrators may use this command.")
|
||||
return
|
||||
@@ -12,17 +11,18 @@
|
||||
|
||||
to_chat(usr, "Checking for disconnected pipes...")
|
||||
//all plumbing - yes, some things might get stated twice, doesn't matter.
|
||||
for(var/obj/machinery/atmospherics/plumbing in world)
|
||||
for(var/thing in SSair.atmos_machinery)
|
||||
var/obj/machinery/atmospherics/plumbing = thing
|
||||
if(plumbing.nodealert)
|
||||
to_chat(usr, "Unconnected [plumbing.name] located at [plumbing.x],[plumbing.y],[plumbing.z] ([get_area(plumbing.loc)])")
|
||||
|
||||
//Manifolds
|
||||
for(var/obj/machinery/atmospherics/pipe/manifold/pipe in world)
|
||||
for(var/obj/machinery/atmospherics/pipe/manifold/pipe in SSair.atmos_machinery)
|
||||
if(!pipe.node1 || !pipe.node2 || !pipe.node3)
|
||||
to_chat(usr, "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])")
|
||||
|
||||
//Pipes
|
||||
for(var/obj/machinery/atmospherics/pipe/simple/pipe in world)
|
||||
for(var/obj/machinery/atmospherics/pipe/simple/pipe in SSair.atmos_machinery)
|
||||
if(!pipe.node1 || !pipe.node2)
|
||||
to_chat(usr, "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])")
|
||||
|
||||
|
||||
@@ -85,18 +85,80 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
return
|
||||
message_admins("[key_name_admin(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
|
||||
log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
|
||||
returnval = call(target,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
|
||||
returnval = WrapAdminProcCall(target, procname, lst) // Pass the lst as an argument list to the proc
|
||||
else
|
||||
//this currently has no hascall protection. wasn't able to get it working.
|
||||
message_admins("[key_name_admin(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
|
||||
log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
|
||||
returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc
|
||||
returnval = WrapAdminProcCall(GLOBAL_PROC, procname, lst) // Pass the lst as an argument list to the proc
|
||||
|
||||
to_chat(usr, "<font color='blue'>[procname] returned: [!isnull(returnval) ? returnval : "null"]</font>")
|
||||
feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
// All these vars are related to proc call protection
|
||||
// If you add more of these, for the love of fuck, protect them
|
||||
|
||||
/// Who is currently calling procs
|
||||
GLOBAL_VAR(AdminProcCaller)
|
||||
GLOBAL_PROTECT(AdminProcCaller)
|
||||
/// How many procs have been called
|
||||
GLOBAL_VAR_INIT(AdminProcCallCount, 0)
|
||||
GLOBAL_PROTECT(AdminProcCallCount)
|
||||
/// UID of the admin who last called
|
||||
GLOBAL_VAR(LastAdminCalledTargetUID)
|
||||
GLOBAL_PROTECT(LastAdminCalledTargetUID)
|
||||
/// Last target to have a proc called on it
|
||||
GLOBAL_VAR(LastAdminCalledTarget)
|
||||
GLOBAL_PROTECT(LastAdminCalledTarget)
|
||||
/// Last proc called
|
||||
GLOBAL_VAR(LastAdminCalledProc)
|
||||
GLOBAL_PROTECT(LastAdminCalledProc)
|
||||
/// List to handle proc call spam prevention
|
||||
GLOBAL_LIST_EMPTY(AdminProcCallSpamPrevention)
|
||||
GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
|
||||
|
||||
// Wrapper for proccalls where the datum is flagged as vareditted
|
||||
/proc/WrapAdminProcCall(datum/target, procname, list/arguments)
|
||||
if(target && procname == "Del")
|
||||
to_chat(usr, "Calling Del() is not allowed")
|
||||
return
|
||||
|
||||
if(target != GLOBAL_PROC && !target.CanProcCall(procname))
|
||||
to_chat(usr, "Proccall on [target.type]/proc/[procname] is disallowed!")
|
||||
return
|
||||
var/current_caller = GLOB.AdminProcCaller
|
||||
var/ckey = usr ? usr.client.ckey : GLOB.AdminProcCaller
|
||||
if(!ckey)
|
||||
CRASH("WrapAdminProcCall with no ckey: [target] [procname] [english_list(arguments)]")
|
||||
if(current_caller && current_caller != ckey)
|
||||
if(!GLOB.AdminProcCallSpamPrevention[ckey])
|
||||
to_chat(usr, "<span class='adminnotice'>Another set of admin called procs are still running, your proc will be run after theirs finish.</span>")
|
||||
GLOB.AdminProcCallSpamPrevention[ckey] = TRUE
|
||||
UNTIL(!GLOB.AdminProcCaller)
|
||||
to_chat(usr, "<span class='adminnotice'>Running your proc</span>")
|
||||
GLOB.AdminProcCallSpamPrevention -= ckey
|
||||
else
|
||||
UNTIL(!GLOB.AdminProcCaller)
|
||||
GLOB.LastAdminCalledProc = procname
|
||||
if(target != GLOBAL_PROC)
|
||||
GLOB.LastAdminCalledTargetUID = target.UID()
|
||||
GLOB.AdminProcCaller = ckey //if this runtimes, too bad for you
|
||||
++GLOB.AdminProcCallCount
|
||||
. = world.WrapAdminProcCall(target, procname, arguments)
|
||||
if(--GLOB.AdminProcCallCount == 0)
|
||||
GLOB.AdminProcCaller = null
|
||||
|
||||
//adv proc call this, ya nerds
|
||||
/world/proc/WrapAdminProcCall(datum/target, procname, list/arguments)
|
||||
if(target == GLOBAL_PROC)
|
||||
return call(procname)(arglist(arguments))
|
||||
else if(target != world)
|
||||
return call(target, procname)(arglist(arguments))
|
||||
else
|
||||
to_chat(usr, "<span class='boldannounce'>Call to world/proc/[procname] blocked: Advanced ProcCall detected.</span>")
|
||||
message_admins("[key_name(usr)] attempted to call world/proc/[procname] with arguments: [english_list(arguments)]")
|
||||
log_admin("[key_name(usr)] attempted to call world/proc/[procname] with arguments: [english_list(arguments)]l")
|
||||
|
||||
/proc/IsAdminAdvancedProcCall()
|
||||
#ifdef TESTING
|
||||
@@ -131,7 +193,7 @@ GLOBAL_PROTECT(AdminProcCaller)
|
||||
log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
|
||||
|
||||
spawn()
|
||||
var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
|
||||
var/returnval = WrapAdminProcCall(A, procname, lst) // Pass the lst as an argument list to the proc
|
||||
to_chat(src, "<span class='notice'>[procname] returned: [!isnull(returnval) ? returnval : "null"]</span>")
|
||||
|
||||
feedback_add_details("admin_verb","DPC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -251,7 +313,7 @@ GLOBAL_PROTECT(AdminProcCaller)
|
||||
alert("That mob doesn't seem to exist, close the panel and try again.")
|
||||
return
|
||||
|
||||
if(istype(M, /mob/new_player))
|
||||
if(isnewplayer(M))
|
||||
alert("The mob must not be a new_player.")
|
||||
return
|
||||
|
||||
@@ -382,7 +444,7 @@ GLOBAL_PROTECT(AdminProcCaller)
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
|
||||
//This gets a confirmation check because it's way easier to accidentally hit this and delete things than it is with del-all
|
||||
//This gets a confirmation check because it's way easier to accidentally hit this and delete things than it is with qdel-all
|
||||
var/confirm = alert("This will delete ALL Singularities and Tesla orbs except for any that are on away mission z-levels or the centcomm z-level. Are you sure you want to delete them?", "Confirm Panic Button", "Yes", "No")
|
||||
if(confirm != "Yes")
|
||||
return
|
||||
@@ -428,7 +490,7 @@ GLOBAL_PROTECT(AdminProcCaller)
|
||||
id.icon_state = "gold"
|
||||
id:access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access()
|
||||
else
|
||||
var/obj/item/card/id/id = new/obj/item/card/id(M);
|
||||
var/obj/item/card/id/id = new/obj/item/card/id(M)
|
||||
id.icon_state = "gold"
|
||||
id:access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access()
|
||||
id.registered_name = H.real_name
|
||||
@@ -487,7 +549,8 @@ GLOBAL_PROTECT(AdminProcCaller)
|
||||
for(var/area/A in world)
|
||||
areas_all |= A.type
|
||||
|
||||
for(var/obj/machinery/power/apc/APC in world)
|
||||
for(var/thing in GLOB.apcs)
|
||||
var/obj/machinery/power/apc/APC = thing
|
||||
var/area/A = get_area(APC)
|
||||
if(!A)
|
||||
continue
|
||||
@@ -496,7 +559,8 @@ GLOBAL_PROTECT(AdminProcCaller)
|
||||
else
|
||||
areas_with_multiple_APCs |= A.type
|
||||
|
||||
for(var/obj/machinery/alarm/alarm in world)
|
||||
for(var/thing in GLOB.air_alarms)
|
||||
var/obj/machinery/alarm/alarm = thing
|
||||
var/area/A = get_area(alarm)
|
||||
if(!A)
|
||||
continue
|
||||
@@ -505,31 +569,31 @@ GLOBAL_PROTECT(AdminProcCaller)
|
||||
else
|
||||
areas_with_multiple_air_alarms |= A.type
|
||||
|
||||
for(var/obj/machinery/requests_console/RC in world)
|
||||
for(var/obj/machinery/requests_console/RC in GLOB.machines)
|
||||
var/area/A = get_area(RC)
|
||||
if(!A)
|
||||
continue
|
||||
areas_with_RC |= A.type
|
||||
|
||||
for(var/obj/machinery/light/L in world)
|
||||
for(var/obj/machinery/light/L in GLOB.machines)
|
||||
var/area/A = get_area(L)
|
||||
if(!A)
|
||||
continue
|
||||
areas_with_light |= A.type
|
||||
|
||||
for(var/obj/machinery/light_switch/LS in world)
|
||||
for(var/obj/machinery/light_switch/LS in GLOB.machines)
|
||||
var/area/A = get_area(LS)
|
||||
if(!A)
|
||||
continue
|
||||
areas_with_LS |= A.type
|
||||
|
||||
for(var/obj/item/radio/intercom/I in world)
|
||||
for(var/obj/item/radio/intercom/I in GLOB.global_radios)
|
||||
var/area/A = get_area(I)
|
||||
if(!A)
|
||||
continue
|
||||
areas_with_intercom |= A.type
|
||||
|
||||
for(var/obj/machinery/camera/C in world)
|
||||
for(var/obj/machinery/camera/C in GLOB.machines)
|
||||
var/area/A = get_area(C)
|
||||
if(!A)
|
||||
continue
|
||||
@@ -814,21 +878,6 @@ GLOBAL_PROTECT(AdminProcCaller)
|
||||
else
|
||||
alert("Invalid mob")
|
||||
|
||||
/client/proc/reload_nanoui_resources()
|
||||
set category = "Debug"
|
||||
set name = "Reload NanoUI Resources"
|
||||
set desc = "Force the client to redownload NanoUI Resources"
|
||||
|
||||
// Close open NanoUIs.
|
||||
SSnanoui.close_user_uis(usr)
|
||||
|
||||
// Re-load the assets.
|
||||
var/datum/asset/assets = get_asset_datum(/datum/asset/nanoui)
|
||||
assets.register()
|
||||
|
||||
// Clear the user's cache so they get resent.
|
||||
usr.client.cache = list()
|
||||
|
||||
/client/proc/view_runtimes()
|
||||
set category = "Debug"
|
||||
set name = "View Runtimes"
|
||||
|
||||
@@ -15,9 +15,7 @@
|
||||
if(T.active_hotspot)
|
||||
burning = 1
|
||||
|
||||
to_chat(usr, "<span class='notice'>@[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("<span class='warning'>BURNING</span>"):(null)]</span>")
|
||||
for(var/datum/gas/trace_gas in GM.trace_gases)
|
||||
to_chat(usr, "[trace_gas.type]: [trace_gas.moles]")
|
||||
to_chat(usr, "<span class='notice'>@[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] N2O: [GM.sleeping_agent] Agent B: [GM.agent_b] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("<span class='warning'>BURNING</span>"):(null)]</span>")
|
||||
|
||||
message_admins("[key_name_admin(usr)] has checked the air status of [target]")
|
||||
log_admin("[key_name(usr)] has checked the air status of [target]")
|
||||
|
||||
@@ -48,7 +48,8 @@ GLOBAL_VAR_INIT(sent_honksquad, 0)
|
||||
commandos += candidate//Add their ghost to commandos.
|
||||
|
||||
//Spawns HONKsquad and equips them.
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/L = thing
|
||||
if(honksquad_number<=0) break
|
||||
if(L.name == "HONKsquad")
|
||||
honk_leader_selected = honksquad_number == 1?1:0
|
||||
|
||||
@@ -66,7 +66,8 @@ GLOBAL_VAR_INIT(sent_syndicate_infiltration_team, 0)
|
||||
var/list/sit_spawns = list()
|
||||
var/list/sit_spawns_leader = list()
|
||||
var/list/sit_spawns_mgmt = list()
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/L = thing
|
||||
if(L.name == "Syndicate-Infiltrator")
|
||||
sit_spawns += L
|
||||
if(L.name == "Syndicate-Infiltrator-Leader")
|
||||
|
||||
@@ -118,7 +118,7 @@ GLOBAL_VAR_INIT(intercom_range_display_status, 0)
|
||||
qdel(M)
|
||||
|
||||
if(GLOB.intercom_range_display_status)
|
||||
for(var/obj/item/radio/intercom/I in world)
|
||||
for(var/obj/item/radio/intercom/I in GLOB.global_radios)
|
||||
for(var/turf/T in orange(7,I))
|
||||
var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T)
|
||||
if(!(F in view(7,I.loc)))
|
||||
|
||||
@@ -627,6 +627,7 @@ GLOBAL_LIST_INIT(VVpixelmovement, list("step_x", "step_y", "step_size", "bound_h
|
||||
if(!O.vv_edit_var(variable, var_new))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
return
|
||||
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_VAR_EDIT, args)
|
||||
log_world("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_new]")]")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [variable] to [var_new]")
|
||||
var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] to [var_new]"
|
||||
|
||||
@@ -267,7 +267,7 @@ client/proc/one_click_antag()
|
||||
var/I = image('icons/mob/mob.dmi', loc = synd_mind_1.current, icon_state = "synd")
|
||||
synd_mind.current.client.images += I
|
||||
|
||||
for(var/obj/machinery/nuclearbomb/bomb in world)
|
||||
for(var/obj/machinery/nuclearbomb/bomb in GLOB.machines)
|
||||
bomb.r_code = nuke_code // All the nukes are set to this code.
|
||||
return 1
|
||||
|
||||
@@ -455,7 +455,8 @@ client/proc/one_click_antag()
|
||||
if(candidates.len)
|
||||
var/raiders = min(antnum, candidates.len)
|
||||
//Spawns vox raiders and equips them.
|
||||
for(var/obj/effect/landmark/L in world)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/L = thing
|
||||
if(L.name == "voxstart")
|
||||
if(raiders<=0)
|
||||
break
|
||||
@@ -583,7 +584,8 @@ client/proc/one_click_antag()
|
||||
var/teamOneMembers = 5
|
||||
var/teamTwoMembers = 5
|
||||
var/datum/preferences/A = new()
|
||||
for(var/obj/effect/landmark/L in world)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/L = thing
|
||||
if(L.name == "tdome1")
|
||||
if(teamOneMembers<=0)
|
||||
break
|
||||
|
||||
@@ -73,9 +73,11 @@
|
||||
..()
|
||||
if((ishuman(hit_atom)))
|
||||
var/mob/living/carbon/human/H = hit_atom
|
||||
if(H.r_hand == src) return
|
||||
if(H.l_hand == src) return
|
||||
var/mob/A = H.LAssailant
|
||||
if(H.r_hand == src)
|
||||
return
|
||||
if(H.l_hand == src)
|
||||
return
|
||||
var/mob/A = thrownby
|
||||
if((H in GLOB.team_alpha) && (A in GLOB.team_alpha))
|
||||
to_chat(A, "<span class='warning'>He's on your team!</span>")
|
||||
return
|
||||
@@ -89,4 +91,3 @@
|
||||
playsound(src, 'sound/items/dodgeball.ogg', 50, 1)
|
||||
visible_message("<span class='danger'>[H] HAS BEEN ELIMINATED!</span>")
|
||||
H.melt()
|
||||
return
|
||||
|
||||
@@ -53,7 +53,7 @@ GLOBAL_LIST_EMPTY(sounds_cache)
|
||||
set name = "Play Server Sound"
|
||||
if(!check_rights(R_SOUNDS)) return
|
||||
|
||||
var/list/sounds = file2list("sound/serversound_list.txt");
|
||||
var/list/sounds = file2list("sound/serversound_list.txt")
|
||||
sounds += GLOB.sounds_cache
|
||||
|
||||
var/melody = input("Select a sound from the server to play", "Server sound list") as null|anything in sounds
|
||||
@@ -71,7 +71,7 @@ GLOBAL_LIST_EMPTY(sounds_cache)
|
||||
var/A = alert("This will play a sound at every intercomm, are you sure you want to continue? This works best with short sounds, beware.","Warning","Yep","Nope")
|
||||
if(A != "Yep") return
|
||||
|
||||
var/list/sounds = file2list("sound/serversound_list.txt");
|
||||
var/list/sounds = file2list("sound/serversound_list.txt")
|
||||
sounds += GLOB.sounds_cache
|
||||
|
||||
var/melody = input("Select a sound from the server to play", "Server sound list") as null|anything in sounds
|
||||
|
||||
@@ -627,7 +627,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
print_command_report(input, "[command_name()] Update")
|
||||
if("No")
|
||||
//same thing as the blob stuff - it's not public, so it's classified, dammit
|
||||
GLOB.command_announcer.autosay("A classified message has been printed out at all communication consoles.");
|
||||
GLOB.command_announcer.autosay("A classified message has been printed out at all communication consoles.")
|
||||
print_command_report(input, "Classified [command_name()] Update")
|
||||
else
|
||||
return
|
||||
|
||||
@@ -30,7 +30,7 @@ GLOBAL_VAR_INIT(sent_strike_team, 0)
|
||||
// Find the nuclear auth code
|
||||
var/nuke_code
|
||||
var/temp_code
|
||||
for(var/obj/machinery/nuclearbomb/N in world)
|
||||
for(var/obj/machinery/nuclearbomb/N in GLOB.machines)
|
||||
temp_code = text2num(N.r_code)
|
||||
if(temp_code)//if it's actually a number. It won't convert any non-numericals.
|
||||
nuke_code = N.r_code
|
||||
@@ -48,7 +48,8 @@ GLOBAL_VAR_INIT(sent_strike_team, 0)
|
||||
var/commando_number = COMMANDOS_POSSIBLE //for selecting a leader
|
||||
var/is_leader = TRUE // set to FALSE after leader is spawned
|
||||
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/L = thing
|
||||
|
||||
if(commando_number <= 0)
|
||||
break
|
||||
@@ -109,7 +110,8 @@ GLOBAL_VAR_INIT(sent_strike_team, 0)
|
||||
commando_number--
|
||||
|
||||
//Spawns the rest of the commando gear.
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/L = thing
|
||||
if(L.name == "Commando_Manual")
|
||||
//new /obj/item/gun/energy/pulse_rifle(L.loc)
|
||||
var/obj/item/paper/P = new(L.loc)
|
||||
@@ -120,7 +122,8 @@ GLOBAL_VAR_INIT(sent_strike_team, 0)
|
||||
P.stamp(stamp)
|
||||
qdel(stamp)
|
||||
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/L = thing
|
||||
if(L.name == "Commando-Bomb")
|
||||
new /obj/effect/spawner/newbomb/timer/syndicate(L.loc)
|
||||
qdel(L)
|
||||
|
||||
@@ -38,7 +38,7 @@ GLOBAL_VAR_INIT(sent_syndicate_strike_team, 0)
|
||||
// Find the nuclear auth code
|
||||
var/nuke_code
|
||||
var/temp_code
|
||||
for(var/obj/machinery/nuclearbomb/N in world)
|
||||
for(var/obj/machinery/nuclearbomb/N in GLOB.machines)
|
||||
temp_code = text2num(N.r_code)
|
||||
if(temp_code)//if it's actually a number. It won't convert any non-numericals.
|
||||
nuke_code = N.r_code
|
||||
@@ -53,7 +53,8 @@ GLOBAL_VAR_INIT(sent_syndicate_strike_team, 0)
|
||||
GLOB.sent_syndicate_strike_team = 1
|
||||
|
||||
//Spawns commandos and equips them.
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/L = thing
|
||||
|
||||
if(syndicate_commando_number <= 0)
|
||||
break
|
||||
|
||||
@@ -18,7 +18,6 @@ GLOBAL_LIST_INIT(admin_verbs_show_debug_verbs, list(
|
||||
/client/proc/print_jobban_old_filter,
|
||||
/client/proc/forceEvent,
|
||||
/client/proc/nanomapgen_DumpImage,
|
||||
/client/proc/reload_nanoui_resources,
|
||||
/client/proc/admin_redo_space_transitions,
|
||||
/client/proc/make_turf_space_map,
|
||||
/client/proc/vv_by_ref
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
sources_assoc[source] = AS
|
||||
// Currently only non-0 durations can be altered (normal alarms VS EMP blasts)
|
||||
if(AS.duration)
|
||||
duration = SecondsToTicks(duration)
|
||||
duration = duration SECONDS
|
||||
AS.duration = duration
|
||||
AS.severity = severity
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/eject_card(override = 0)
|
||||
if(!override)
|
||||
if(ready && SSmob_hunt.battle_turn != team)
|
||||
audible_message("You can't recall on your rival's turn!", null, 2)
|
||||
atom_say("You can't recall on your rival's turn!")
|
||||
return
|
||||
card.mob_data = mob_info
|
||||
mob_info = null
|
||||
@@ -202,7 +202,7 @@
|
||||
start_battle()
|
||||
else if(option == 2)
|
||||
ready = 0
|
||||
audible_message("[team] Player cancels their battle challenge.", null, 5)
|
||||
atom_say("[team] Player cancels their battle challenge.")
|
||||
|
||||
updateUsrDialog()
|
||||
|
||||
@@ -246,7 +246,7 @@
|
||||
var/message = "[mob_info.mob_name] attacks!"
|
||||
if(mob_info.nickname)
|
||||
message = "[mob_info.nickname] attacks!"
|
||||
audible_message(message, null, 5)
|
||||
atom_say(message)
|
||||
SSmob_hunt.launch_attack(team, mob_info.get_raw_damage(), mob_info.get_attack_type())
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/start_battle()
|
||||
@@ -255,7 +255,7 @@
|
||||
if(!card) //don't do anything if there isn't a card inserted
|
||||
return
|
||||
ready = 1
|
||||
audible_message("[team] Player is ready for battle! Waiting for rival...", null, 5)
|
||||
atom_say("[team] Player is ready for battle! Waiting for rival...")
|
||||
SSmob_hunt.start_check()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/receive_attack(raw_damage, datum/mob_type/attack_type)
|
||||
@@ -268,7 +268,7 @@
|
||||
SSmob_hunt.end_turn()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/surrender()
|
||||
audible_message("[team] Player surrenders the battle!", null, 5)
|
||||
atom_say("[team] Player surrenders the battle!")
|
||||
SSmob_hunt.end_battle(team, 1)
|
||||
|
||||
//////////////////////////////
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
var/datum/data/pda/app/mob_hunter_game/client = P.current_app
|
||||
var/total_catch_mod = client.catch_mod + catch_mod //negative values decrease the chance of the mob running, positive values makes it more likely to flee
|
||||
if(!client.connected) //must be connected to attempt captures
|
||||
P.audible_message("[bicon(P)] No server connection. Capture aborted.", null, 4)
|
||||
P.atom_say("No server connection. Capture aborted.")
|
||||
return
|
||||
|
||||
if(mob_info.is_trap) //traps work even if you ran into them before, which is why this is before the clients_encountered check
|
||||
@@ -79,7 +79,7 @@
|
||||
return
|
||||
else //deal with the new hunter by either running away or getting caught
|
||||
clients_encountered += client
|
||||
var/message = "[bicon(P)] "
|
||||
var/message = null
|
||||
var/effective_run_chance = mob_info.run_chance + total_catch_mod
|
||||
if((effective_run_chance > 0) && prob(effective_run_chance))
|
||||
message += "Capture failed! [name] escaped [P.owner ? "from [P.owner]" : "from this hunter"]!"
|
||||
@@ -91,7 +91,7 @@
|
||||
else
|
||||
message += "Capture error! Try again."
|
||||
clients_encountered -= client //if the capture registration failed somehow, let them have another chance with this mob
|
||||
P.audible_message(message, null, 4)
|
||||
P.atom_say(message)
|
||||
|
||||
/obj/effect/nanomob/proc/despawn()
|
||||
if(SSmob_hunt)
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
for(var/areapath in typesof(A))
|
||||
possible_areas[areapath] -= 2
|
||||
//removes "bad areas" which shouldn't be on-station but are subtypes of station areas. probably should the unused ones and consider repathing the rest
|
||||
var/list/bad_areas = list(subtypesof(/area/construction), /area/solar/derelict_starboard, /area/solar/derelict_aft, /area/solar/constructionsite)
|
||||
var/list/bad_areas = list(subtypesof(/area/construction), /area/solar/derelict_starboard, /area/solar/derelict_aft)
|
||||
for(var/A in bad_areas)
|
||||
possible_areas -= A
|
||||
//weight check, remove negative or zero weight areas from the list, then return the list.
|
||||
|
||||
@@ -59,8 +59,7 @@
|
||||
cooldown--
|
||||
if(cooldown <= 0)
|
||||
return FALSE
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/Destroy()
|
||||
@@ -94,8 +93,7 @@
|
||||
if(!secured || cooldown > 0)
|
||||
return FALSE
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/toggle_secure()
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
health_scan = M.health
|
||||
if(health_scan <= alarm_health)
|
||||
pulse()
|
||||
audible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
|
||||
audible_message("[bicon(src)] *beep* *beep*")
|
||||
toggle_scan()
|
||||
return
|
||||
return
|
||||
|
||||
@@ -127,13 +127,12 @@
|
||||
/obj/item/assembly/infra/proc/trigger_beam()
|
||||
if(!secured || !on || cooldown > 0)
|
||||
return FALSE
|
||||
pulse(0)
|
||||
audible_message("[bicon(src)] *beep* *beep*", null, 3)
|
||||
cooldown = 2
|
||||
pulse(FALSE)
|
||||
audible_message("[bicon(src)] *beep* *beep*", hearing_distance = 3)
|
||||
if(first)
|
||||
qdel(first)
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
|
||||
|
||||
/obj/item/assembly/infra/interact(mob/user)//TODO: change this this to the wire control panel
|
||||
if(!secured) return
|
||||
|
||||
@@ -47,11 +47,10 @@
|
||||
/obj/item/assembly/prox_sensor/proc/sense()
|
||||
if(!secured || !scanning || cooldown > 0)
|
||||
return FALSE
|
||||
pulse(0)
|
||||
visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
pulse(FALSE)
|
||||
visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
|
||||
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
|
||||
|
||||
/obj/item/assembly/prox_sensor/process()
|
||||
if(timing && (time >= 0))
|
||||
|
||||
@@ -41,8 +41,7 @@
|
||||
if(cooldown > 0)
|
||||
return FALSE
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
|
||||
|
||||
signal()
|
||||
return TRUE
|
||||
|
||||
@@ -39,12 +39,11 @@
|
||||
/obj/item/assembly/timer/proc/timer_end()
|
||||
if(!secured || cooldown > 0)
|
||||
return FALSE
|
||||
pulse(0)
|
||||
cooldown = 2
|
||||
pulse(FALSE)
|
||||
if(loc)
|
||||
loc.visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
|
||||
|
||||
/obj/item/assembly/timer/process()
|
||||
if(timing && (time > 0))
|
||||
|
||||
@@ -1,454 +0,0 @@
|
||||
/obj/machinery/computer/general_air_control/atmos_automation
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_screen = "area_atmos"
|
||||
icon_keyboard = "atmos_key"
|
||||
circuit = /obj/item/circuitboard/atmos_automation
|
||||
req_one_access_txt = "24;10"
|
||||
Mtoollink = 1
|
||||
|
||||
show_sensors = 0
|
||||
var/on = 0
|
||||
|
||||
name = "Atmospherics Automations Console"
|
||||
|
||||
var/list/datum/automation/automations = list()
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.encryption) return
|
||||
|
||||
var/id_tag = signal.data["tag"]
|
||||
if(!id_tag)
|
||||
return
|
||||
|
||||
sensor_information[id_tag] = signal.data
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/process()
|
||||
if(on)
|
||||
for(var/datum/automation/A in automations)
|
||||
A.process()
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/update_icon()
|
||||
icon_state = initial(icon_state)
|
||||
// Broken
|
||||
if(stat & BROKEN)
|
||||
icon_state += "b"
|
||||
|
||||
// Powered
|
||||
else if(stat & NOPOWER)
|
||||
icon_state = initial(icon_state)
|
||||
icon_state += "0"
|
||||
else if(on)
|
||||
icon_state += "_active"
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/request_device_refresh(device)
|
||||
send_signal(list("tag"=device, "status"))
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/send_signal(list/data, filter = RADIO_ATMOSIA)//filter's here so the AAC can cross communicate to things like vents, which have a different filter
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.source = src
|
||||
signal.data=data
|
||||
signal.data["sigtype"]="command"
|
||||
signal.data["advcontrol"]=1//AAC balancing, you need to manually get up to the machine to make it listen to this
|
||||
radio_connection.post_signal(src, signal, range = 8, filter = filter)
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/selectValidChildFor(datum/automation/parent, mob/user, list/valid_returntypes)
|
||||
var/list/choices=list()
|
||||
for(var/childtype in GLOB.automation_types)
|
||||
var/datum/automation/A = new childtype(src)
|
||||
if(A.returntype == null)
|
||||
continue
|
||||
if(!(A.returntype in valid_returntypes))
|
||||
continue
|
||||
choices[A.name]=A
|
||||
if(choices.len==0)
|
||||
testing("Unable to find automations with returntype in [english_list(valid_returntypes)]!")
|
||||
return 0
|
||||
var/label=input(user, "Select new automation:", "Automations", "Cancel") as null|anything in choices
|
||||
if(!label)
|
||||
return 0
|
||||
return choices[label]
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/return_text()
|
||||
var/out=..()
|
||||
|
||||
if(on)
|
||||
out += "<a href=\"?src=[UID()];on=1\" style=\"font-size:large;font-weight:bold;color:red;\">RUNNING</a>"
|
||||
else
|
||||
out += "<a href=\"?src=[UID()];on=1\" style=\"font-size:large;font-weight:bold;color:green;\">STOPPED</a>"
|
||||
|
||||
out += {"
|
||||
<h2>Automations</h2>
|
||||
<p>\[
|
||||
<a href="?src=[UID()];add=1">
|
||||
Add
|
||||
</a>
|
||||
|
|
||||
<a href="?src=[UID()];reset=*">
|
||||
Reset All
|
||||
</a>
|
||||
|
|
||||
<a href="?src=[UID()];remove=*">
|
||||
Clear
|
||||
</a>
|
||||
\]</p>
|
||||
<p>\[
|
||||
<a href="?src=[UID()];dump=1">
|
||||
Export
|
||||
</a>
|
||||
|
|
||||
<a href="?src=[UID()];read=1">
|
||||
Import
|
||||
</a>
|
||||
\]</p>"}
|
||||
if(automations.len==0)
|
||||
out += "<i>No automations present.</i>"
|
||||
else
|
||||
for(var/datum/automation/A in automations)
|
||||
out += {"
|
||||
<fieldset>
|
||||
<legend>
|
||||
<a href="?src=[UID()];label=\ref[A]">[A.label]</a>
|
||||
(<a href="?src=[UID()];reset=\ref[A]">Reset</a> |
|
||||
<a href="?src=[UID()];remove=\ref[A]">×</a>)
|
||||
</legend>
|
||||
[A.GetText()]
|
||||
</fieldset>
|
||||
"}
|
||||
return out
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/Topic(href,href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
if(href_list["on"])
|
||||
on = !on
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
if(href_list["add"])
|
||||
var/new_child=selectValidChildFor(null,usr,list(0))
|
||||
if(!new_child)
|
||||
return 1
|
||||
automations += new_child
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["label"])
|
||||
var/datum/automation/A=locate(href_list["label"])
|
||||
if(!A) return 1
|
||||
var/nl=input(usr, "Please enter a label for this automation task.") as text|null
|
||||
if(!nl) return 1
|
||||
nl = copytext(sanitize(nl), 1, 50)
|
||||
A.label=nl
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["reset"])
|
||||
if(href_list["reset"]=="*")
|
||||
for(var/datum/automation/A in automations)
|
||||
if(!A) continue
|
||||
A.OnReset()
|
||||
else
|
||||
var/datum/automation/A=locate(href_list["reset"])
|
||||
if(!A) return 1
|
||||
A.OnReset()
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["remove"])
|
||||
if(href_list["remove"]=="*")
|
||||
var/confirm=alert("Are you sure you want to remove ALL automations?","Automations","Yes","No")
|
||||
if(confirm == "No") return 0
|
||||
for(var/datum/automation/A in automations)
|
||||
if(!A) continue
|
||||
A.OnRemove()
|
||||
automations.Remove(A)
|
||||
else
|
||||
var/datum/automation/A=locate(href_list["remove"])
|
||||
if(!A) return 1
|
||||
A.OnRemove()
|
||||
automations.Remove(A)
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["read"])
|
||||
var/code = input("Input exported AAC code.","Automations","") as message|null
|
||||
if(!code) return 0
|
||||
ReadCode(code)
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["dump"])
|
||||
input("Exported AAC code:","Automations",DumpCode()) as message|null
|
||||
return 0
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/MakeCompare(datum/automation/a, datum/automation/b, comparetype)
|
||||
var/datum/automation/compare/compare=new(src)
|
||||
compare.comparator = comparetype
|
||||
compare.children[1] = a
|
||||
compare.children[2] = b
|
||||
return compare
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/MakeNumber(value)
|
||||
var/datum/automation/static_value/val = new(src)
|
||||
val.value=value
|
||||
return val
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/MakeGetSensorData(sns_tag,field)
|
||||
var/datum/automation/get_sensor_data/sensor=new(src)
|
||||
sensor.sensor=sns_tag
|
||||
sensor.field=field
|
||||
return sensor
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/DumpCode()
|
||||
var/list/json[0]
|
||||
for(var/datum/automation/A in automations)
|
||||
json += list(A.Export())
|
||||
return json_encode(json)
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/proc/ReadCode(jsonStr)
|
||||
automations.Cut()
|
||||
var/list/json = json_decode(jsonStr)
|
||||
if(json.len>0)
|
||||
for(var/list/cData in json)
|
||||
if(isnull(cData) || !("type" in cData))
|
||||
testing("AAC: Null cData in root JS array.")
|
||||
continue
|
||||
var/Atype=text2path(cData["type"])
|
||||
if(!(Atype in GLOB.automation_types))
|
||||
testing("AAC: Unrecognized Atype [Atype].")
|
||||
continue
|
||||
var/datum/automation/A = new Atype(src)
|
||||
A.Import(cData)
|
||||
automations += A
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/burnchamber
|
||||
var/injector_tag="inc_in"
|
||||
var/output_tag="inc_out"
|
||||
var/sensor_tag="inc_sensor"
|
||||
frequency=AIRLOCK_FREQ
|
||||
var/temperature=1000
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/burnchamber/New()
|
||||
..()
|
||||
|
||||
// On State
|
||||
// Pretty much this:
|
||||
/*
|
||||
if(get_sensor("inc_sensor","temperature") < 200)
|
||||
set_injector_state("inc_in",1)
|
||||
set_vent_pump_power("inc_out",0)
|
||||
else
|
||||
set_vent_pump_power("inc_out",1
|
||||
*/
|
||||
|
||||
var/datum/automation/get_sensor_data/sensor=new(src)
|
||||
sensor.sensor=sensor_tag
|
||||
sensor.field="temperature"
|
||||
|
||||
var/datum/automation/static_value/val = new(src)
|
||||
val.value=temperature - 800
|
||||
|
||||
var/datum/automation/compare/compare=new(src)
|
||||
compare.comparator = "Less Than"
|
||||
compare.children[1] = sensor
|
||||
compare.children[2] = val
|
||||
|
||||
var/datum/automation/set_injector_power/inj_on=new(src)
|
||||
inj_on.injector=injector_tag
|
||||
inj_on.state=1
|
||||
|
||||
var/datum/automation/set_vent_pump_power/vp_on=new(src)
|
||||
vp_on.vent_pump=output_tag
|
||||
vp_on.state=1
|
||||
|
||||
var/datum/automation/set_vent_pump_power/vp_off=new(src)
|
||||
vp_off.vent_pump=output_tag
|
||||
vp_off.state=0
|
||||
|
||||
var/datum/automation/if_statement/i = new (src)
|
||||
i.label = "Fuel Injector On"
|
||||
i.condition = compare
|
||||
i.children_then.Add(inj_on)
|
||||
i.children_then.Add(vp_off)
|
||||
i.children_else.Add(vp_on)
|
||||
|
||||
automations += i
|
||||
|
||||
// Off state
|
||||
/*
|
||||
if(get_sensor("inc_sensor","temperature") > 1000)
|
||||
set_injector_state("inc_in",0)
|
||||
*/
|
||||
sensor=new(src)
|
||||
sensor.sensor=sensor_tag
|
||||
sensor.field="temperature"
|
||||
|
||||
val = new(src)
|
||||
val.value=temperature
|
||||
|
||||
compare=new(src)
|
||||
compare.comparator = "Greater Than"
|
||||
compare.children[1] = sensor
|
||||
compare.children[2] = val
|
||||
|
||||
var/datum/automation/set_injector_power/inj_off=new(src)
|
||||
inj_off.injector=injector_tag
|
||||
inj_off.state=0
|
||||
|
||||
i = new (src)
|
||||
i.label = "Fuel Injector Off"
|
||||
i.condition = compare
|
||||
i.children_then.Add(inj_off)
|
||||
|
||||
automations += i
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/air_mixing
|
||||
var/n2_injector_tag="air_n2_in"
|
||||
var/o2_injector_tag="air_o2_in"
|
||||
var/output_tag="air_out"
|
||||
var/sensor_tag="air_sensor"
|
||||
frequency=ATMOS_DISTRO_FREQ
|
||||
var/temperature=1000
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/air_mixing/New()
|
||||
..()
|
||||
buildO2()
|
||||
buildN2()
|
||||
buildOutletVent()
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/air_mixing/proc/buildO2()
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Oxygen Injection
|
||||
///////////////////////////////////////////////////////////////
|
||||
|
||||
var/datum/automation/set_injector_power/inj_on=new(src)
|
||||
inj_on.injector=o2_injector_tag
|
||||
inj_on.state=1
|
||||
|
||||
var/datum/automation/set_injector_power/inj_off=new(src)
|
||||
inj_off.injector=o2_injector_tag
|
||||
inj_off.state=0
|
||||
|
||||
var/datum/automation/if_statement/i = new (src)
|
||||
i.label = "Oxygen Injection"
|
||||
i.condition = MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"oxygen"),
|
||||
MakeNumber(20),
|
||||
"Less Than or Equal to"
|
||||
)
|
||||
i.children_then.Add(inj_on)
|
||||
i.children_else.Add(inj_off)
|
||||
|
||||
automations += i
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/air_mixing/proc/buildN2()
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Nitrogen Injection
|
||||
///////////////////////////////////////////////////////////////
|
||||
/*
|
||||
if(get_sensor_data("pressure") < 100)
|
||||
injector_on()
|
||||
else
|
||||
if(get_sensor_data("pressure") > 5000)
|
||||
injector_off()
|
||||
*/
|
||||
|
||||
var/datum/automation/set_injector_power/inj_on=new(src)
|
||||
inj_on.injector=n2_injector_tag
|
||||
inj_on.state=1
|
||||
|
||||
var/datum/automation/set_injector_power/inj_off=new(src)
|
||||
inj_off.injector=n2_injector_tag
|
||||
inj_off.state=0
|
||||
|
||||
var/datum/automation/if_statement/if_on = new (src)
|
||||
if_on.label = "Nitrogen Injection"
|
||||
if_on.condition = MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"pressure"),
|
||||
MakeNumber(100),
|
||||
"Less Than"
|
||||
)
|
||||
if_on.children_then.Add(inj_on)
|
||||
|
||||
|
||||
var/datum/automation/if_statement/if_off=new(src)
|
||||
if_off.condition=MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"pressure"),
|
||||
MakeNumber(5000),
|
||||
"Greater Than"
|
||||
)
|
||||
if_off.children_then.Add(inj_off)
|
||||
|
||||
if_on.children_else.Add(if_off)
|
||||
|
||||
automations += if_on
|
||||
|
||||
/obj/machinery/computer/general_air_control/atmos_automation/air_mixing/proc/buildOutletVent()
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Outlet Management
|
||||
///////////////////////////////////////////////////////////////
|
||||
/*
|
||||
if(get_sensor_data("pressure") >= 5000 && get_sensor_data("oxygen") >= 20)
|
||||
vent_on()
|
||||
else
|
||||
if(get_sensor_data("oxygen") < 20 || get_sensor_data("pressure") < 100)
|
||||
vent_off()
|
||||
*/
|
||||
|
||||
var/datum/automation/set_vent_pump_power/vp_on=new(src)
|
||||
vp_on.vent_pump=output_tag
|
||||
vp_on.state=1
|
||||
|
||||
var/datum/automation/set_vent_pump_power/vp_off=new(src)
|
||||
vp_off.vent_pump=output_tag
|
||||
vp_off.state=0
|
||||
|
||||
var/datum/automation/if_statement/if_on=new(src)
|
||||
if_on.label="Air Output"
|
||||
|
||||
var/datum/automation/and/and_on=new(src)
|
||||
and_on.children.Add(
|
||||
MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"pressure"),
|
||||
MakeNumber(5000),
|
||||
"Greater Than or Equal to"
|
||||
)
|
||||
)
|
||||
and_on.children.Add(
|
||||
MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"oxygen"),
|
||||
MakeNumber(20),
|
||||
"Greater Than or Equal to"
|
||||
)
|
||||
)
|
||||
if_on.condition=and_on
|
||||
if_on.children_then.Add(vp_on)
|
||||
|
||||
//////////////////////////////
|
||||
|
||||
var/datum/automation/if_statement/if_off=new(src)
|
||||
|
||||
var/datum/automation/or/or_off=new(src)
|
||||
or_off.children.Add(
|
||||
MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"pressure"),
|
||||
MakeNumber(100),
|
||||
"Less Than"
|
||||
)
|
||||
)
|
||||
or_off.children.Add(
|
||||
MakeCompare(
|
||||
MakeGetSensorData(sensor_tag,"oxygen"),
|
||||
MakeNumber(20),
|
||||
"Less Than"
|
||||
)
|
||||
)
|
||||
if_off.condition=or_off
|
||||
if_off.children_then.Add(vp_off)
|
||||
|
||||
if_on.children_else.Add(if_off)
|
||||
|
||||
automations += if_on
|
||||
@@ -1,44 +0,0 @@
|
||||
|
||||
|
||||
/datum/automation/set_valve_state
|
||||
name = "Digital Valve: Set Open/Closed"
|
||||
var/valve=null
|
||||
var/state=0
|
||||
|
||||
Export()
|
||||
var/list/json = ..()
|
||||
json["valve"]=valve
|
||||
json["state"]=state
|
||||
return json
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
valve = json["valve"]
|
||||
state = text2num(json["state"])
|
||||
|
||||
process()
|
||||
if(valve)
|
||||
parent.send_signal(list ("tag" = valve, "command"="valve_set","valve_set"=state))
|
||||
return 0
|
||||
|
||||
GetText()
|
||||
return "Set digital valve <a href=\"?src=[UID()];set_subject=1\">[fmtString(valve)]</a> to <a href=\"?src=[UID()];set_state=1\">[state?"open":"closed"]</a>."
|
||||
|
||||
Topic(href,href_list)
|
||||
if(..())
|
||||
return 1
|
||||
if(href_list["set_state"])
|
||||
state=!state
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
if(href_list["set_subject"])
|
||||
var/list/valves=list()
|
||||
for(var/obj/machinery/atmospherics/binary/valve/digital/V in world)
|
||||
if(!isnull(V.id_tag) && V.frequency == parent.frequency)
|
||||
valves|=V.id_tag
|
||||
if(valves.len==0)
|
||||
to_chat(usr, "<span class='warning'>Unable to find any digital valves on this frequency.</span>")
|
||||
return
|
||||
valve = input("Select a valve:", "Sensor Data", valve) as null|anything in valves
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
@@ -1,42 +0,0 @@
|
||||
/datum/automation/set_emitter_power
|
||||
name = "Emitter: Set Power"
|
||||
var/emitter=null
|
||||
var/on=0
|
||||
|
||||
Export()
|
||||
var/list/json = ..()
|
||||
json["emitter"]=emitter
|
||||
json["on"]=on
|
||||
return json
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
emitter = json["emitter"]
|
||||
on = text2num(json["on"])
|
||||
|
||||
process()
|
||||
if(emitter)
|
||||
parent.send_signal(list("tag" = emitter, "command"="set", "state" = on, "hiddenprints" = parent.fingerprintshidden))
|
||||
return 0
|
||||
|
||||
GetText()
|
||||
return "Set emitter <a href=\"?src=[UID()];set_subject=1\">[fmtString(emitter)]</a> to <a href=\"?src=[UID()];set_power=1\">[on?"on":"off"]</a>."
|
||||
|
||||
Topic(href,href_list)
|
||||
if(..())
|
||||
return 1
|
||||
if(href_list["set_power"])
|
||||
on=!on
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
if(href_list["set_subject"])
|
||||
var/list/emitters=list()
|
||||
for(var/obj/machinery/power/emitter/E in GLOB.machines)
|
||||
if(!isnull(E.id_tag) && E.frequency == parent.frequency)
|
||||
emitters|=E.id_tag
|
||||
if(emitters.len==0)
|
||||
to_chat(usr, "<span class='warning'>Unable to find any emitters on this frequency.</span>")
|
||||
return
|
||||
emitter = input("Select an emitter:", "Emitter", emitter) as null|anything in emitters
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
@@ -1,83 +0,0 @@
|
||||
|
||||
////////////////////////////////////////////
|
||||
// Injector
|
||||
////////////////////////////////////////////
|
||||
/datum/automation/set_injector_power
|
||||
name = "Injector: Power"
|
||||
var/injector=null
|
||||
var/state=0
|
||||
|
||||
Export()
|
||||
var/list/json = ..()
|
||||
json["injector"]=injector
|
||||
json["state"]=state
|
||||
return json
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
injector = json["injector"]
|
||||
state = text2num(json["state"])
|
||||
|
||||
process()
|
||||
if(injector)
|
||||
parent.send_signal(list ("tag" = injector, "power"=state))
|
||||
return 0
|
||||
|
||||
GetText()
|
||||
return "Set injector <a href=\"?src=[UID()];set_injector=1\">[fmtString(injector)]</a> power to <a href=\"?src=[UID()];toggle_state=1\">[state ? "on" : "off"]</a>."
|
||||
|
||||
Topic(href,href_list)
|
||||
if(..())
|
||||
return 1
|
||||
if(href_list["toggle_state"])
|
||||
state = !state
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
if(href_list["set_injector"])
|
||||
var/list/injector_names=list()
|
||||
for(var/obj/machinery/atmospherics/unary/outlet_injector/I in GLOB.machines)
|
||||
if(!isnull(I.id_tag) && I.frequency == parent.frequency)
|
||||
injector_names|=I.id_tag
|
||||
injector = input("Select an injector:", "Sensor Data", injector) as null|anything in injector_names
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
/datum/automation/set_injector_rate
|
||||
name = "Injector: Rate"
|
||||
var/injector = null
|
||||
var/rate = 0
|
||||
|
||||
Export()
|
||||
var/list/json = ..()
|
||||
json["injector"] = injector
|
||||
json["rate"] = rate
|
||||
return json
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
injector = json["injector"]
|
||||
rate = text2num(json["rate"])
|
||||
|
||||
process()
|
||||
if(injector)
|
||||
parent.send_signal(list ("tag" = injector, "set_volume_rate"=rate))
|
||||
return 0
|
||||
|
||||
GetText()
|
||||
return "Set injector <a href=\"?src=[UID()];set_injector=1\">[fmtString(injector)]</a> transfer rate to <a href=\"?src=[UID()];set_rate=1\">[rate]</a> L/s."
|
||||
|
||||
Topic(href,href_list)
|
||||
if(..())
|
||||
return 1
|
||||
if(href_list["set_rate"])
|
||||
rate = input("Set rate in L/s.", "Rate", rate) as num
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
if(href_list["set_injector"])
|
||||
var/list/injector_names=list()
|
||||
for(var/obj/machinery/atmospherics/unary/outlet_injector/I in GLOB.machines)
|
||||
if(!isnull(I.id_tag) && I.frequency == parent.frequency)
|
||||
injector_names|=I.id_tag
|
||||
injector = input("Select an injector:", "Sensor Data", injector) as null|anything in injector_names
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
@@ -1,153 +0,0 @@
|
||||
/datum/automation/set_scrubber_mode
|
||||
name="Scrubber: Mode"
|
||||
|
||||
var/scrubber=null
|
||||
var/mode=1
|
||||
|
||||
Export()
|
||||
var/list/json = ..()
|
||||
json["scrubber"]=scrubber
|
||||
json["mode"]=mode
|
||||
return json
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
scrubber = json["scrubber"]
|
||||
mode = text2num(json["mode"])
|
||||
|
||||
New(var/obj/machinery/computer/general_air_control/atmos_automation/aa)
|
||||
..(aa)
|
||||
children=list(null)
|
||||
|
||||
process()
|
||||
if(scrubber)
|
||||
parent.send_signal(list ("tag" = scrubber, "sigtype"="command", "scrubbing"=mode),filter = RADIO_FROM_AIRALARM)
|
||||
return 0
|
||||
|
||||
GetText()
|
||||
return "Set Scrubber <a href=\"?src=[UID()];set_scrubber=1\">[fmtString(scrubber)]</a> mode to <a href=\"?src=[UID()];set_mode=1\">[mode?"Scrubbing":"Syphoning"]</a>."
|
||||
|
||||
Topic(href,href_list)
|
||||
if(..()) return
|
||||
if(href_list["set_mode"])
|
||||
mode=!mode
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
if(href_list["set_scrubber"])
|
||||
var/list/injector_names=list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_scrubber/S in GLOB.machines)
|
||||
if(!isnull(S.id_tag) && S.frequency == parent.frequency)
|
||||
injector_names|=S.id_tag
|
||||
scrubber = input("Select a scrubber:", "Scrubbers", scrubber) as null|anything in injector_names
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
/datum/automation/set_scrubber_power
|
||||
name="Scrubber: Power"
|
||||
|
||||
var/scrubber=null
|
||||
var/state=0
|
||||
|
||||
Export()
|
||||
var/list/json = ..()
|
||||
json["scrubber"]=scrubber
|
||||
json["state"]=state
|
||||
return json
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
scrubber = json["scrubber"]
|
||||
state = text2num(json["state"])
|
||||
|
||||
New(var/obj/machinery/computer/general_air_control/atmos_automation/aa)
|
||||
..(aa)
|
||||
|
||||
process()
|
||||
if(scrubber)
|
||||
parent.send_signal(list ("tag" = scrubber, "sigtype"="command", "power"=state),filter = RADIO_FROM_AIRALARM)
|
||||
|
||||
GetText()
|
||||
return "Set Scrubber <a href=\"?src=[UID()];set_scrubber=1\">[fmtString(scrubber)]</a> power to <a href=\"?src=[UID()];set_power=1\">[state ? "on" : "off"]</a>."
|
||||
|
||||
Topic(href,href_list)
|
||||
if(..()) return
|
||||
if(href_list["set_power"])
|
||||
state = !state
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
if(href_list["set_scrubber"])
|
||||
var/list/injector_names=list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_scrubber/S in GLOB.machines)
|
||||
if(!isnull(S.id_tag) && S.frequency == parent.frequency)
|
||||
injector_names|=S.id_tag
|
||||
scrubber = input("Select a scrubber:", "Scrubbers", scrubber) as null|anything in injector_names
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
GLOBAL_LIST_INIT(gas_labels, list(
|
||||
"co2" = "CO<sub>2</sub>",
|
||||
"tox" = "Plasma",
|
||||
"n2o" = "N<sub>2</sub>O",
|
||||
"o2" = "O<sub>2</sub>",
|
||||
"n2" = "N<sub>2</sub>"
|
||||
))
|
||||
/datum/automation/set_scrubber_gasses
|
||||
name="Scrubber: Gasses"
|
||||
|
||||
var/scrubber=null
|
||||
var/list/gasses=list(
|
||||
"co2" = 1,
|
||||
"tox" = 0,
|
||||
"n2o" = 0,
|
||||
"o2" = 0,
|
||||
"n2" = 0
|
||||
)
|
||||
|
||||
Export()
|
||||
var/list/json = ..()
|
||||
json["scrubber"]=scrubber
|
||||
json["gasses"]=gasses
|
||||
return json
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
scrubber = json["scrubber"]
|
||||
|
||||
var/list/newgasses=json["gasses"]
|
||||
for(var/key in newgasses)
|
||||
gasses[key]=newgasses[key]
|
||||
|
||||
|
||||
New(var/obj/machinery/computer/general_air_control/atmos_automation/aa)
|
||||
..(aa)
|
||||
|
||||
process()
|
||||
if(scrubber)
|
||||
var/list/data = list ("tag" = scrubber, "sigtype"="command")
|
||||
for(var/gas in gasses)
|
||||
data[gas+"_scrub"]=gasses[gas]
|
||||
parent.send_signal(data,filter = RADIO_FROM_AIRALARM)
|
||||
|
||||
GetText()
|
||||
var/txt = "Set Scrubber <a href=\"?src=[UID()];set_scrubber=1\">[fmtString(scrubber)]</a> to scrub "
|
||||
for(var/gas in gasses)
|
||||
txt += " [GLOB.gas_labels[gas]] (<a href=\"?src=[UID()];tog_gas=[gas]\">[gasses[gas] ? "on" : "off"]</a>),"
|
||||
return txt
|
||||
|
||||
Topic(href,href_list)
|
||||
if(..()) return
|
||||
if(href_list["tog_gas"])
|
||||
var/gas = href_list["tog_gas"]
|
||||
if(!(gas in gasses))
|
||||
return
|
||||
gasses[gas] = !gasses[gas]
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
if(href_list["set_scrubber"])
|
||||
var/list/injector_names=list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_scrubber/S in GLOB.machines)
|
||||
if(!isnull(S.id_tag) && S.frequency == parent.frequency)
|
||||
injector_names|=S.id_tag
|
||||
scrubber = input("Select a scrubber:", "Scrubbers", scrubber) as null|anything in injector_names
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
@@ -1,56 +0,0 @@
|
||||
|
||||
///////////////////////////////////////////
|
||||
// sensor data
|
||||
///////////////////////////////////////////
|
||||
|
||||
/datum/automation/get_sensor_data
|
||||
name = "Sensor: Get Data"
|
||||
var/field="temperature"
|
||||
var/sensor=null
|
||||
|
||||
returntype=AUTOM_RT_NUM
|
||||
|
||||
Export()
|
||||
var/list/json = ..()
|
||||
json["sensor"]=sensor
|
||||
json["field"]=field
|
||||
return json
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
sensor = json["sensor"]
|
||||
field = json["field"]
|
||||
|
||||
Evaluate()
|
||||
if(sensor && field && (sensor in parent.sensor_information))
|
||||
return parent.sensor_information[sensor][field]
|
||||
return 0
|
||||
|
||||
GetText()
|
||||
return "<a href=\"?src=[UID()];set_field=1\">[fmtString(field)]</a> from sensor <a href=\"?src=[UID()];set_sensor=1\">[fmtString(sensor)]</a>"
|
||||
|
||||
Topic(href,href_list)
|
||||
if(..())
|
||||
return 1
|
||||
if(href_list["set_field"])
|
||||
field = input("Select a sensor output:", "Sensor Data", field) as null|anything in list(
|
||||
"temperature",
|
||||
"pressure",
|
||||
"oxygen",
|
||||
"toxins",
|
||||
"nitrogen",
|
||||
"carbon_dioxide"
|
||||
)
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
if(href_list["set_sensor"])
|
||||
var/list/sensor_list = list()
|
||||
for(var/obj/machinery/air_sensor/G in GLOB.machines)
|
||||
if(!isnull(G.id_tag) && G.frequency == parent.frequency)
|
||||
sensor_list|=G.id_tag
|
||||
for(var/obj/machinery/meter/M in GLOB.machines)
|
||||
if(!isnull(M.id_tag) && M.frequency == parent.frequency)
|
||||
sensor_list|=M.id_tag
|
||||
sensor = input("Select a sensor:", "Sensor Data", field) as null|anything in sensor_list
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
@@ -1,314 +0,0 @@
|
||||
/datum/automation/set_vent_pump_mode
|
||||
name="Vent Pump: Mode"
|
||||
|
||||
var/vent_pump = null
|
||||
var/mode = "stabilize"
|
||||
var/vent_type = 0//0 for unary vents, 1 for DP vents
|
||||
|
||||
var/list/modes = list("stabilize","purge")
|
||||
|
||||
Export()
|
||||
var/list/json = ..()
|
||||
json["vent_pump"] = vent_pump
|
||||
json["mode"] = mode
|
||||
json["vent_type"] = vent_type
|
||||
return json
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
vent_pump = json["vent_pump"]
|
||||
mode = json["mode"]
|
||||
vent_type = text2num(json["vent_type"])
|
||||
|
||||
process()
|
||||
if(vent_pump)
|
||||
var/dirvalue = (mode == "stabilize" ? 1 : mode == "purge" ? 0 : 1)
|
||||
parent.send_signal(list("tag" = vent_pump, "direction" = dirvalue), filter = (vent_type ? RADIO_ATMOSIA : RADIO_FROM_AIRALARM))
|
||||
return 0
|
||||
|
||||
GetText()
|
||||
return "Set <a href=\"?src=[UID()];toggle_type=1\">[vent_type ? "Dual-Port" : "Unary"]</a> vent pump <a href=\"?src=[UID()];set_vent_pump=1\">[fmtString(vent_pump)]</a> mode to <a href=\"?src=[UID()];set_mode=1\">[mode]</a>."
|
||||
|
||||
Topic(href,href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
if(href_list["set_mode"])
|
||||
mode = input("Select a mode to put this pump into.",mode) in modes
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["set_vent_pump"])
|
||||
var/list/injector_names = list()
|
||||
if(!vent_type)
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/I in GLOB.machines)
|
||||
if(!isnull(I.id_tag) && I.frequency == parent.frequency)
|
||||
injector_names |= I.id_tag
|
||||
else
|
||||
for(var/obj/machinery/atmospherics/binary/dp_vent_pump/I in world)
|
||||
// to_chat(world, "test")
|
||||
if(!isnull(I.id_tag) && I.frequency == parent.frequency)
|
||||
injector_names |= I.id_tag
|
||||
|
||||
vent_pump = input("Select a vent:", "Vent Pumps", vent_pump) as null|anything in injector_names
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["toggle_type"])
|
||||
vent_type = !vent_type
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
/datum/automation/set_vent_pump_power
|
||||
name="Vent Pump: Power"
|
||||
|
||||
var/vent_pump = null
|
||||
var/state = 0
|
||||
var/mode = 0//0 for unary vents, 1 for DP vents.
|
||||
|
||||
Export()
|
||||
var/list/json = ..()
|
||||
json["vent_pump"] = vent_pump
|
||||
json["state"] = state
|
||||
json["mode"] = mode
|
||||
return json
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
vent_pump = json["vent_pump"]
|
||||
state = text2num(json["state"])
|
||||
mode = text2num(json["mode"])
|
||||
|
||||
process()
|
||||
if(vent_pump)
|
||||
parent.send_signal(list ("tag" = vent_pump, "power" = state), filter = (mode ? RADIO_ATMOSIA : RADIO_FROM_AIRALARM))
|
||||
|
||||
GetText()
|
||||
return "Set <a href=\"?src=[UID()];toggle_mode=1\">[mode ? "Dual-Port" : "Unary"]</a> vent pump <a href=\"?src=[UID()];set_vent_pump=1\">[fmtString(vent_pump)]</a> power to <a href=\"?src=[UID()];set_power=1\">[state ? "on" : "off"]</a>."
|
||||
|
||||
Topic(href,href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
if(href_list["set_power"])
|
||||
state = !state
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["set_vent_pump"])
|
||||
var/list/injector_names=list()
|
||||
if(!mode)
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/I in GLOB.machines)
|
||||
if(!isnull(I.id_tag) && I.frequency == parent.frequency)
|
||||
injector_names|=I.id_tag
|
||||
else
|
||||
for(var/obj/machinery/atmospherics/binary/dp_vent_pump/I in world)
|
||||
if(!isnull(I.id_tag) && I.frequency == parent.frequency)
|
||||
injector_names|=I.id_tag
|
||||
vent_pump = input("Select a vent:", "Vent Pumps", vent_pump) as null|anything in injector_names
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["toggle_mode"])
|
||||
mode = !mode
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
/datum/automation/set_vent_pump_pressure//controls the internal/external pressure bounds of a vent pump.
|
||||
name = "Vent Pump: Pressure Settings"
|
||||
|
||||
var/vent_pump = null
|
||||
var/intpressureout = 0//these 2 are for DP vents, if it's a unary vent you're sending to it will take intpressureout as var
|
||||
var/intpressurein = 0
|
||||
var/extpressure = 0
|
||||
var/mode = 0//0 for unary vents, 1 for DP vents.
|
||||
|
||||
Export()
|
||||
var/list/json = ..()
|
||||
json["vent_pump"] = vent_pump
|
||||
json["intpressureout"] = intpressureout
|
||||
json["intpressurein"] = intpressurein
|
||||
json["extpressure"] = extpressure
|
||||
json["mode"] = mode
|
||||
return json
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
vent_pump = json["vent_pump"]
|
||||
intpressureout = text2num(json["intpressureout"])
|
||||
intpressurein = text2num(json["intpressurein"])
|
||||
extpressure = text2num(json["extpressure"])
|
||||
mode = text2num(json["mode"])
|
||||
|
||||
New(var/obj/machinery/computer/general_air_control/atmos_automation/aa)
|
||||
..(aa)
|
||||
|
||||
process()
|
||||
if(vent_pump)
|
||||
var/list/data = list( \
|
||||
"tag" = vent_pump, \
|
||||
)
|
||||
var/filter = RADIO_ATMOSIA
|
||||
if(mode)//it's a DP vent
|
||||
if(intpressurein)
|
||||
data.Add(list("set_input_pressure" = intpressurein))
|
||||
if(intpressureout)
|
||||
data.Add(list("set_output_pressure" = intpressureout))
|
||||
if(extpressure)
|
||||
data.Add(list("set_external_pressure" = extpressure))
|
||||
|
||||
else
|
||||
if(intpressureout)
|
||||
data.Add(list("set_internal_pressure" = intpressureout))
|
||||
if(extpressure)
|
||||
data.Add(list("set_external_pressure" = extpressure))
|
||||
filter = RADIO_FROM_AIRALARM
|
||||
|
||||
parent.send_signal(data, filter)
|
||||
|
||||
GetText()
|
||||
if(mode)//DP vent
|
||||
return {"Set <a href=\"?src=[UID()];swap_modes=1\">dual-port</a> vent pump <a href=\"?src=[UID()];set_vent_pump=1\">[fmtString(vent_pump)]</a>
|
||||
pressure bounds: internal outwards: <a href=\"?src=[UID()];set_intpressure_out=1">[fmtString(intpressureout)]</a>
|
||||
internal inwards: <a href=\"?src=[UID()];set_intpressure_in=1">[fmtString(intpressurein)]</a>
|
||||
external: <a href=\"?src=[UID()];set_external=1">[fmtString(extpressure)]</a>
|
||||
"}//well that was a lot to type
|
||||
else
|
||||
return {"Set <a href=\"?src=[UID()];swap_modes=1\">unary</a> vent pump <a href=\"?src=[UID()];set_vent_pump=1\">[fmtString(vent_pump)]</a>
|
||||
pressure bounds: internal: <a href=\"?src=[UID()];set_intpressure_out=1">[fmtString(intpressureout)]</a>
|
||||
external: <a href=\"?src=[UID()];set_external=1">[fmtString(extpressure)]</a>
|
||||
"}//copy paste FTW
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
if(href_list["set_vent_pump"])
|
||||
var/list/injector_names=list()
|
||||
if(mode)//DP vent selection
|
||||
for(var/obj/machinery/atmospherics/binary/dp_vent_pump/I in world)
|
||||
if(!isnull(I.id_tag) && I.frequency == parent.frequency)
|
||||
injector_names|=I.id_tag
|
||||
else
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/I in GLOB.machines)
|
||||
if(!isnull(I.id_tag) && I.frequency == parent.frequency)
|
||||
injector_names|=I.id_tag
|
||||
vent_pump = input("Select a vent:", "Vent Pumps", vent_pump) as null|anything in injector_names
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["set_intpressure_out"])
|
||||
var/response = input("Set new pressure, in kPa. \[0-[50*ONE_ATMOSPHERE]\]") as num
|
||||
intpressureout = text2num(response)
|
||||
intpressureout = between(0, intpressureout, 50*ONE_ATMOSPHERE)
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["set_intpressure_in"])
|
||||
var/response = input("Set new pressure, in kPa. \[0-[50*ONE_ATMOSPHERE]\]") as num
|
||||
intpressurein = text2num(response)
|
||||
intpressurein = between(0, intpressurein, 50*ONE_ATMOSPHERE)
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["set_external"])
|
||||
var/response = input(usr,"Set new pressure, in kPa. \[0-[50*ONE_ATMOSPHERE]\]") as num
|
||||
extpressure = text2num(response)
|
||||
extpressure = between(0, extpressure, 50*ONE_ATMOSPHERE)
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["swap_modes"])
|
||||
mode = !mode
|
||||
vent_pump = null//if we don't clear this is could get glitchy, by which I mean not at all, whatever, stay clean
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
/datum/automation/set_vent_pressure_checks
|
||||
name = "Vent Pump: Pressure Checks"
|
||||
|
||||
var/vent_pump = null
|
||||
var/checks = 1
|
||||
var/mode = 0//1 for DP vent, 0 for unary vent
|
||||
/*
|
||||
checks bitflags
|
||||
1 = external
|
||||
2 = internal in (regular internal for unaries)
|
||||
4 = internal out (ignored by unaries)
|
||||
*/
|
||||
|
||||
|
||||
Export()
|
||||
var/list/json = ..()
|
||||
json["vent_pump"] = vent_pump
|
||||
json["checks"] = checks
|
||||
json["mode"] = mode
|
||||
return json
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
vent_pump = json["vent_pump"]
|
||||
checks = text2num(json["checks"])
|
||||
mode = text2num(json["mode"])
|
||||
|
||||
New(var/obj/machinery/computer/general_air_control/atmos_automation/aa)
|
||||
..(aa)
|
||||
|
||||
process()
|
||||
if(vent_pump)
|
||||
parent.send_signal(list("tag" = vent_pump, "checks" = checks), filter = (mode ? RADIO_ATMOSIA : RADIO_FROM_AIRALARM))//not gonna bother with a sanity check here, there *should* not be any problems
|
||||
|
||||
GetText()
|
||||
if(mode)
|
||||
return {"Set <a href=\"?src=[UID()];swap_modes=1\">dual-port</a> vent pump <a href=\"?src=[UID()];set_vent_pump=1\">[fmtString(vent_pump)]</a> pressure checks to:
|
||||
external <a href=\"?src=[UID()];togglecheck=1\">[checks&1 ? "Enabled" : "Disabled"]</a>
|
||||
internal inwards <a href=\"?src=[UID()];togglecheck=2\">[checks&2 ? "Enabled" : "Disabled"]</a>
|
||||
internal outwards <a href=\"?src=[UID()];togglecheck=4\">[checks&4 ? "Enabled" : "Disabled"]</a>
|
||||
"}
|
||||
else
|
||||
return {"Set <a href=\"?src=[UID()];swap_modes=1\">unary</a> vent pump <a href=\"?src=[UID()];set_vent_pump=1\">[fmtString(vent_pump)]</a> pressure checks to:
|
||||
external: <a href=\"?src=[UID()];togglecheck=1\">[checks&1 ? "Enabled" : "Disabled"]</a>,
|
||||
internal: <a href=\"?src=[UID()];togglecheck=2\">[checks&2 ? "Enabled" : "Disabled"]</a>
|
||||
"}
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
if(href_list["set_vent_pump"])
|
||||
var/list/injector_names=list()
|
||||
if(mode)//DP vent selection
|
||||
for(var/obj/machinery/atmospherics/binary/dp_vent_pump/I in world)
|
||||
if(!isnull(I.id_tag) && I.frequency == parent.frequency)
|
||||
injector_names|=I.id_tag
|
||||
else
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/I in GLOB.machines)
|
||||
if(!isnull(I.id_tag) && I.frequency == parent.frequency)
|
||||
injector_names|=I.id_tag
|
||||
vent_pump = input("Select a vent:", "Vent Pumps", vent_pump) as null|anything in injector_names
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["swap_modes"])
|
||||
mode = !mode
|
||||
vent_pump = null//if we don't clear this is could get glitchy, by which I mean not at all, whatever, stay clean
|
||||
if(!mode && checks&4)//disable this bitflag since we're switching to unaries
|
||||
checks &= ~4
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["togglecheck"])
|
||||
var/bitflagvalue = text2num(href_list["togglecheck"])
|
||||
if(mode)
|
||||
if(!(bitflagvalue in list(1, 2, 4)))
|
||||
return 0
|
||||
else if(!(bitflagvalue in list(1, 2)))
|
||||
return 0
|
||||
|
||||
if(checks&bitflagvalue)//the bitflag is on ATM
|
||||
checks &= ~bitflagvalue
|
||||
else//can't not be off
|
||||
checks |= bitflagvalue
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
@@ -1,457 +0,0 @@
|
||||
GLOBAL_LIST_INIT(automation_types, subtypesof(/datum/automation))
|
||||
|
||||
#define AUTOM_RT_NULL 0
|
||||
#define AUTOM_RT_NUM 1
|
||||
#define AUTOM_RT_STRING 2
|
||||
/datum/automation
|
||||
// Name of the Automation
|
||||
var/name="Base Automation"
|
||||
|
||||
// For labelling what shit does on the AAC.
|
||||
var/label="Unnamed Script"
|
||||
var/desc ="No Description."
|
||||
|
||||
var/obj/machinery/computer/general_air_control/atmos_automation/parent
|
||||
var/list/valid_child_returntypes=list()
|
||||
var/list/datum/automation/children=list()
|
||||
|
||||
var/returntype=AUTOM_RT_NULL
|
||||
|
||||
/datum/automation/New(var/obj/machinery/computer/general_air_control/atmos_automation/aa)
|
||||
parent=aa
|
||||
|
||||
/datum/automation/proc/GetText()
|
||||
return "[type] doesn't override GetText()!"
|
||||
|
||||
/datum/automation/proc/OnReset()
|
||||
return
|
||||
|
||||
/datum/automation/proc/OnRemove()
|
||||
return
|
||||
|
||||
/datum/automation/process()
|
||||
return
|
||||
|
||||
/datum/automation/proc/Evaluate()
|
||||
return 0
|
||||
|
||||
/datum/automation/proc/Export()
|
||||
var/list/R = list("type"=type)
|
||||
|
||||
if(initial(label)!=label)
|
||||
R["label"]=label
|
||||
|
||||
if(initial(desc)!=desc)
|
||||
R["desc"]=desc
|
||||
|
||||
if(children.len>0)
|
||||
var/list/C=list()
|
||||
for(var/datum/automation/A in children)
|
||||
C += list(A.Export())
|
||||
R["children"]=C
|
||||
|
||||
return R
|
||||
|
||||
/datum/automation/proc/unpackChild(var/list/cData)
|
||||
if(isnull(cData) || !("type" in cData))
|
||||
return null
|
||||
var/Atype=text2path(cData["type"])
|
||||
if(!(Atype in GLOB.automation_types))
|
||||
return null
|
||||
var/datum/automation/A = new Atype(parent)
|
||||
A.Import(cData)
|
||||
return A
|
||||
|
||||
/datum/automation/proc/unpackChildren(var/list/childList)
|
||||
. = list()
|
||||
if(childList.len>0)
|
||||
for(var/list/cData in childList)
|
||||
if(isnull(cData) || !("type" in cData))
|
||||
. += null
|
||||
continue
|
||||
var/Atype=text2path(cData["type"])
|
||||
if(!(Atype in GLOB.automation_types))
|
||||
continue
|
||||
var/datum/automation/A = new Atype(parent)
|
||||
A.Import(cData)
|
||||
. += A
|
||||
|
||||
/datum/automation/proc/packChildren(var/list/childList)
|
||||
. = list()
|
||||
if(childList.len>0)
|
||||
for(var/datum/automation/A in childList)
|
||||
if(isnull(A) || !istype(A))
|
||||
. += null
|
||||
continue
|
||||
. += list(A.Export())
|
||||
|
||||
/datum/automation/proc/Import(var/list/json)
|
||||
if("label" in json)
|
||||
label = json["label"]
|
||||
|
||||
if("desc" in json)
|
||||
desc = json["desc"]
|
||||
|
||||
if("children" in json)
|
||||
children = unpackChildren(json["children"])
|
||||
|
||||
/datum/automation/proc/fmtString(var/str)
|
||||
if(str==null || str == "")
|
||||
return "-----"
|
||||
return str
|
||||
|
||||
/datum/automation/Topic(href,href_list)
|
||||
if(parent.Topic("src=[parent.UID()]", list("src" = parent)))//dumb hack to check sanity, empty topic shouldn't trigger a 1 on anything but sanity checks
|
||||
return 1
|
||||
|
||||
if(href_list["add"])
|
||||
var/new_child=selectValidChildFor(usr)
|
||||
if(!new_child) return 1
|
||||
children += new_child
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["remove"])
|
||||
if(href_list["remove"]=="*")
|
||||
var/confirm=alert("Are you sure you want to remove ALL automations?","Automations","Yes","No")
|
||||
if(confirm == "No") return 0
|
||||
for(var/datum/automation/A in children)
|
||||
A.OnRemove()
|
||||
children.Remove(A)
|
||||
else
|
||||
var/datum/automation/A=locate(href_list["remove"])
|
||||
if(!A) return 1
|
||||
var/confirm=alert("Are you sure you want to remove this automation?","Automations","Yes","No")
|
||||
if(confirm == "No") return 0
|
||||
A.OnRemove()
|
||||
children.Remove(A)
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
if(href_list["reset"])
|
||||
if(href_list["reset"]=="*")
|
||||
for(var/datum/automation/A in children)
|
||||
A.OnReset()
|
||||
else
|
||||
var/datum/automation/A=locate(href_list["reset"])
|
||||
if(!A) return 1
|
||||
A.OnReset()
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
return 0 // 1 if handled
|
||||
|
||||
/datum/automation/proc/selectValidChildFor(var/mob/user, var/list/returntypes=valid_child_returntypes)
|
||||
return parent.selectValidChildFor(src, user, returntypes)
|
||||
|
||||
///////////////////////////////////////////
|
||||
// AND
|
||||
///////////////////////////////////////////
|
||||
/datum/automation/and
|
||||
name = "AND statement"
|
||||
returntype=AUTOM_RT_NUM
|
||||
valid_child_returntypes=list(AUTOM_RT_NUM)
|
||||
|
||||
Evaluate()
|
||||
if(children.len==0) return 0
|
||||
for(var/datum/automation/stmt in children)
|
||||
if(!stmt.Evaluate())
|
||||
return 0
|
||||
return 1
|
||||
|
||||
GetText()
|
||||
var/out="AND (<a href=\"?src=[UID()];add=1\">Add</a>)"
|
||||
if(children.len>0)
|
||||
out += "<ul>"
|
||||
for(var/datum/automation/stmt in children)
|
||||
out += {"<li>
|
||||
\[<a href="?src=[UID()];reset=\ref[stmt]">Reset</a> |
|
||||
<a href="?src=[UID()];remove=\ref[stmt]">×</a>\]
|
||||
[stmt.GetText()]
|
||||
</li>"}
|
||||
out += "</ul>"
|
||||
else
|
||||
out += "<blockquote><i>No statements to evaluate.</i></blockquote>"
|
||||
return out
|
||||
|
||||
///////////////////////////////////////////
|
||||
// OR
|
||||
///////////////////////////////////////////
|
||||
|
||||
/datum/automation/or
|
||||
name = "OR statement"
|
||||
returntype=AUTOM_RT_NUM
|
||||
valid_child_returntypes=list(AUTOM_RT_NUM)
|
||||
|
||||
Evaluate()
|
||||
if(children.len==0) return 0
|
||||
for(var/datum/automation/stmt in children)
|
||||
if(stmt.Evaluate())
|
||||
return 1
|
||||
return 0
|
||||
|
||||
GetText()
|
||||
var/out="OR (<a href=\"?src=[UID()];add=1\">Add</a>)"
|
||||
if(children.len>0)
|
||||
out += "<ul>"
|
||||
for(var/datum/automation/stmt in children)
|
||||
out += {"<li>
|
||||
\[<a href="?src=[UID()];reset=\ref[stmt]">Reset</a> |
|
||||
<a href="?src=[UID()];remove=\ref[stmt]">×</a>\]
|
||||
[stmt.GetText()]
|
||||
</li>"}
|
||||
out += "</ul>"
|
||||
else
|
||||
out += "<blockquote><i>No statements to evaluate.</i></blockquote>"
|
||||
return out
|
||||
|
||||
///////////////////////////////////////////
|
||||
// if .. then
|
||||
///////////////////////////////////////////
|
||||
|
||||
/datum/automation/if_statement
|
||||
name = "IF statement"
|
||||
var/datum/automation/condition=null
|
||||
valid_child_returntypes=list(AUTOM_RT_NULL)
|
||||
var/list/valid_conditions=list(AUTOM_RT_NUM)
|
||||
|
||||
var/list/children_then=list()
|
||||
var/list/children_else=list()
|
||||
|
||||
Export()
|
||||
var/list/R = ..()
|
||||
|
||||
if(children_then.len>0)
|
||||
R["then"]=packChildren(children_then)
|
||||
|
||||
if(children_else.len>0)
|
||||
R["else"]=packChildren(children_else)
|
||||
|
||||
if(condition)
|
||||
R["condition"]=condition.Export()
|
||||
|
||||
return R
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
|
||||
if("then" in json)
|
||||
children_then = unpackChildren(json["then"])
|
||||
|
||||
if("else" in json)
|
||||
children_else = unpackChildren(json["else"])
|
||||
|
||||
if("condition" in json)
|
||||
condition = unpackChild(json["condition"])
|
||||
|
||||
GetText()
|
||||
var/out="<b>IF</b> (<a href=\"?src=[UID()];set_condition=1\">SET</a>):<blockquote>"
|
||||
if(condition)
|
||||
out += condition.GetText()
|
||||
else
|
||||
out += "<i>Not set</i>"
|
||||
out += "</blockquote>"
|
||||
out += "<b>THEN:</b> (<a href=\"?src=[UID()];add=then\">Add</a>)"
|
||||
if(children_then.len>0)
|
||||
out += "<ul>"
|
||||
for(var/datum/automation/stmt in children_then)
|
||||
out += {"<li>
|
||||
\[<a href="?src=[UID()];reset=\ref[stmt];context=then">Reset</a> |
|
||||
<a href="?src=[UID()];remove=\ref[stmt];context=then">×</a>\]
|
||||
[stmt.GetText()]
|
||||
</li>"}
|
||||
out += "</ul>"
|
||||
else
|
||||
out += "<blockquote><i>(No statements to run)</i></blockquote>"
|
||||
out += "<b>ELSE:</b> (<a href=\"?src=[UID()];add=else\">Add</a>)"
|
||||
if(children_then.len>0)
|
||||
out += "<ul>"
|
||||
for(var/datum/automation/stmt in children_else)
|
||||
out += {"<li>
|
||||
\[<a href="?src=[UID()];reset=\ref[stmt];context=else">Reset</a> |
|
||||
<a href="?src=[UID()];remove=\ref[stmt];context=else">×</a>\]
|
||||
[stmt.GetText()]
|
||||
</li>"}
|
||||
out += "</ul>"
|
||||
else
|
||||
out += "<blockquote><i>(No statements to run)</i></blockquote>"
|
||||
return out
|
||||
|
||||
Topic(href,href_list)
|
||||
if(href_list["add"])
|
||||
var/new_child=selectValidChildFor(usr)
|
||||
if(!new_child) return 1
|
||||
switch(href_list["add"])
|
||||
if("then")
|
||||
children_then += new_child
|
||||
if("else")
|
||||
children_else += new_child
|
||||
else
|
||||
warning("Unknown add value given to [type]/Topic():[__LINE__]: [href]")
|
||||
return 1
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
if(href_list["remove"])
|
||||
if(href_list["remove"]=="*")
|
||||
var/confirm=input("Are you sure you want to remove ALL automations?","Automations","No") in list("Yes","No")
|
||||
if(confirm == "No") return 0
|
||||
for(var/datum/automation/A in children_then)
|
||||
A.OnRemove()
|
||||
children_then.Remove(A)
|
||||
for(var/datum/automation/A in children_else)
|
||||
A.OnRemove()
|
||||
children_else.Remove(A)
|
||||
else
|
||||
var/datum/automation/A=locate(href_list["remove"])
|
||||
if(!A) return 1
|
||||
var/confirm=input("Are you sure you want to remove this automation?","Automations","No") in list("Yes","No")
|
||||
if(confirm == "No") return 0
|
||||
A.OnRemove()
|
||||
switch(href_list["context"])
|
||||
if("then")
|
||||
children_then.Remove(A)
|
||||
if("else")
|
||||
children_else.Remove(A)
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
if(href_list["reset"])
|
||||
if(href_list["reset"]=="*")
|
||||
for(var/datum/automation/A in children_then)
|
||||
A.OnReset()
|
||||
for(var/datum/automation/A in children_else)
|
||||
A.OnReset()
|
||||
else
|
||||
var/datum/automation/A=locate(href_list["reset"])
|
||||
if(!A) return 1
|
||||
A.OnReset()
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
if(href_list["set_condition"])
|
||||
var/new_condition = selectValidChildFor(usr,valid_conditions)
|
||||
testing("Selected condition: [new_condition]")
|
||||
if(!new_condition)
|
||||
return 1
|
||||
condition = new_condition
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
process()
|
||||
if(condition)
|
||||
if(condition.Evaluate())
|
||||
for(var/datum/automation/stmt in children_then)
|
||||
stmt.process()
|
||||
else
|
||||
for(var/datum/automation/stmt in children_else)
|
||||
stmt.process()
|
||||
|
||||
///////////////////////////////////////////
|
||||
// compare
|
||||
///////////////////////////////////////////
|
||||
|
||||
/datum/automation/compare
|
||||
name = "comparison"
|
||||
var/comparator="Greater Than"
|
||||
returntype=AUTOM_RT_NUM
|
||||
valid_child_returntypes=list(AUTOM_RT_NUM)
|
||||
|
||||
New(var/obj/machinery/computer/general_air_control/atmos_automation/aa)
|
||||
..(aa)
|
||||
children=list(null,null)
|
||||
|
||||
Export()
|
||||
var/list/json = ..()
|
||||
json["cmp"]=comparator
|
||||
return json
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
comparator = json["cmp"]
|
||||
|
||||
Evaluate()
|
||||
if(children.len<2)
|
||||
return 0
|
||||
var/datum/automation/d_left =children[1]
|
||||
var/datum/automation/d_right=children[2]
|
||||
if(!d_left || !d_right)
|
||||
return 0
|
||||
var/left=d_left.Evaluate()
|
||||
var/right=d_right.Evaluate()
|
||||
switch(comparator)
|
||||
if("Greater Than")
|
||||
return left>right
|
||||
if("Greater Than or Equal to")
|
||||
return left>=right
|
||||
if("Less Than")
|
||||
return left<right
|
||||
if("Less Than or Equal to")
|
||||
return left<=right
|
||||
if("Equal to")
|
||||
return left==right
|
||||
if("NOT Equal To")
|
||||
return left!=right
|
||||
else
|
||||
return 0
|
||||
|
||||
GetText()
|
||||
var/datum/automation/left =children[1]
|
||||
var/datum/automation/right=children[2]
|
||||
|
||||
var/out = "<a href=\"?src=[UID()];set_field=1\">(Set Left)</a> ("
|
||||
if(left==null)
|
||||
out += "-----"
|
||||
else
|
||||
out += left.GetText()
|
||||
|
||||
out += ") is <a href=\"?src=[UID()];set_comparator=left\">[comparator]</a>: <a href=\"?src=[UID()];set_field=2\">(Set Right)</a> ("
|
||||
|
||||
if(right==null)
|
||||
out += "-----"
|
||||
else
|
||||
out += right.GetText()
|
||||
out +=")"
|
||||
return out
|
||||
|
||||
Topic(href,href_list)
|
||||
if(href_list["set_comparator"])
|
||||
comparator = input("Select a comparison operator:", "Compare", "Greater Than") in list("Greater Than","Greater Than or Equal to","Less Than","Less Than or Equal to","Equal to","NOT Equal To")
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
if(href_list["set_field"])
|
||||
var/idx = text2num(href_list["set_field"])
|
||||
var/new_child = selectValidChildFor(usr)
|
||||
if(!new_child)
|
||||
return 1
|
||||
children[idx] = new_child
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
///////////////////////////////////////////
|
||||
// static value
|
||||
///////////////////////////////////////////
|
||||
|
||||
/datum/automation/static_value
|
||||
name = "Number"
|
||||
|
||||
var/value=0
|
||||
|
||||
returntype=AUTOM_RT_NUM
|
||||
|
||||
Evaluate()
|
||||
return value
|
||||
|
||||
Export()
|
||||
var/list/json = ..()
|
||||
json["value"]=value
|
||||
return json
|
||||
|
||||
Import(var/list/json)
|
||||
..(json)
|
||||
value = text2num(json["value"])
|
||||
|
||||
GetText()
|
||||
return "<a href=\"?src=[UID()];set_value=1\">[value]</a>"
|
||||
|
||||
Topic(href,href_list)
|
||||
if(href_list["set_value"])
|
||||
value = input("Set a value:", "Static Value", value) as num
|
||||
parent.updateUsrDialog()
|
||||
return 1
|
||||
@@ -48,7 +48,7 @@ GLOBAL_DATUM_INIT(the_gateway, /obj/machinery/gateway/centerstation, null)
|
||||
..()
|
||||
update_icon()
|
||||
wait = world.time + config.gateway_delay //+ thirty minutes default
|
||||
awaygate = locate(/obj/machinery/gateway/centeraway) in world
|
||||
awaygate = locate(/obj/machinery/gateway/centeraway) in GLOB.machines
|
||||
|
||||
/obj/machinery/gateway/centerstation/update_density_from_dir()
|
||||
return
|
||||
@@ -103,7 +103,7 @@ GLOBAL_DATUM_INIT(the_gateway, /obj/machinery/gateway/centerstation, null)
|
||||
if(!powered())
|
||||
return
|
||||
if(!awaygate)
|
||||
awaygate = locate(/obj/machinery/gateway/centeraway) in world
|
||||
awaygate = locate(/obj/machinery/gateway/centeraway) in GLOB.machines
|
||||
if(!awaygate)
|
||||
to_chat(user, "<span class='notice'>Error: No destination found.</span>")
|
||||
return
|
||||
@@ -180,7 +180,7 @@ GLOBAL_DATUM_INIT(the_gateway, /obj/machinery/gateway/centerstation, null)
|
||||
/obj/machinery/gateway/centeraway/Initialize()
|
||||
..()
|
||||
update_icon()
|
||||
stationgate = locate(/obj/machinery/gateway/centerstation) in world
|
||||
stationgate = locate(/obj/machinery/gateway/centerstation) in GLOB.machines
|
||||
|
||||
|
||||
/obj/machinery/gateway/centeraway/update_density_from_dir()
|
||||
@@ -219,7 +219,7 @@ GLOBAL_DATUM_INIT(the_gateway, /obj/machinery/gateway/centerstation, null)
|
||||
if(linked.len != 8)
|
||||
return
|
||||
if(!stationgate)
|
||||
stationgate = locate(/obj/machinery/gateway/centerstation) in world
|
||||
stationgate = locate(/obj/machinery/gateway/centerstation) in GLOB.machines
|
||||
if(!stationgate)
|
||||
to_chat(user, "<span class='notice'>Error: No destination found.</span>")
|
||||
return
|
||||
|
||||
@@ -191,26 +191,27 @@
|
||||
origin_tech = null
|
||||
selfcharge = 1
|
||||
can_charge = 0
|
||||
var/inawaymission = 1
|
||||
// Selfcharge is enabled and disabled, and used as the away mission tracker
|
||||
selfcharge = TRUE
|
||||
|
||||
/obj/item/gun/energy/laser/awaymission_aeg/process()
|
||||
var/turf/my_loc = get_turf(src)
|
||||
if(is_away_level(my_loc.z))
|
||||
if(inawaymission)
|
||||
return ..()
|
||||
/obj/item/gun/energy/laser/awaymission_aeg/Initialize(mapload)
|
||||
. = ..()
|
||||
// Force update it incase it spawns outside an away mission and shouldnt be charged
|
||||
onTransitZ(new_z = loc.z)
|
||||
|
||||
/obj/item/gun/energy/laser/awaymission_aeg/onTransitZ(old_z, new_z)
|
||||
if(is_away_level(new_z))
|
||||
if(ismob(loc))
|
||||
to_chat(loc, "<span class='notice'>Your [src] activates, starting to draw power from a nearby wireless power source.</span>")
|
||||
inawaymission = 1
|
||||
selfcharge = TRUE
|
||||
else
|
||||
if(inawaymission)
|
||||
if(selfcharge)
|
||||
if(ismob(loc))
|
||||
to_chat(loc, "<span class='danger'>Your [src] deactivates, as it is out of range from its power source.</span>")
|
||||
cell.charge = 0
|
||||
inawaymission = 0
|
||||
selfcharge = FALSE
|
||||
update_icon()
|
||||
|
||||
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/terror_black_toxin
|
||||
name = "beaker 'Black Terror Venom'"
|
||||
|
||||
|
||||
@@ -7,32 +7,32 @@
|
||||
|
||||
/area/awaymission/centcomAway/general
|
||||
name = "XCC-P5831"
|
||||
music = "music/ambigen3.ogg"
|
||||
ambientsounds = list('sound/ambience/ambigen3.ogg')
|
||||
|
||||
/area/awaymission/centcomAway/maint
|
||||
name = "XCC-P5831 Maintenance"
|
||||
icon_state = "away1"
|
||||
music = "music/ambisin1.ogg"
|
||||
ambientsounds = list('sound/ambience/ambisin1.ogg')
|
||||
|
||||
/area/awaymission/centcomAway/thunderdome
|
||||
name = "XCC-P5831 Thunderdome"
|
||||
icon_state = "away2"
|
||||
music = "music/ambisin2.ogg"
|
||||
ambientsounds = list('sound/ambience/ambisin2.ogg')
|
||||
|
||||
/area/awaymission/centcomAway/cafe
|
||||
name = "XCC-P5831 Kitchen Arena"
|
||||
icon_state = "away3"
|
||||
music = "music/ambisin3.ogg"
|
||||
ambientsounds = list('sound/ambience/ambisin3.ogg')
|
||||
|
||||
/area/awaymission/centcomAway/courtroom
|
||||
name = "XCC-P5831 Courtroom"
|
||||
icon_state = "away4"
|
||||
music = "music/ambisin4.ogg"
|
||||
ambientsounds = list('sound/ambience/ambisin4.ogg')
|
||||
|
||||
/area/awaymission/centcomAway/hangar
|
||||
name = "XCC-P5831 Hangars"
|
||||
icon_state = "away4"
|
||||
music = "music/ambigen5.ogg"
|
||||
ambientsounds = list('sound/ambience/ambigen5.ogg')
|
||||
|
||||
//centcomAway items
|
||||
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/damagereport
|
||||
name = "Damage Report"
|
||||
info = "<b>*Damage Report*</b><br><br><b>Alpha Station</b> - Destroyed<br><br><b>Beta Station</b> - Catastrophic Damage. Medical, destroyed. Atmospherics, partially destroyed. Engine Core, destroyed.<br><br><b>Charlie Station</b> - Intact. Loss of oxygen to eastern side of main corridor.<br><br><b>Delta Station</b> - Intact. <b>WARNING</b>: Unknown force occupying Delta Station. Intent unknown. Species unknown. Numbers unknown.<br><br>Recommendation - Reestablish station powernet via solar array. Reestablish station atmospherics system to restore air."
|
||||
info = "<b>*Damage Report*</b><br><br><b>Alpha Station</b> - Destroyed<br><br><b>Beta Station</b> - Catastrophic Damage. Medical, destroyed. Atmospherics, partially destroyed. Engine Core, destroyed.<br><br><b>Charlie Station</b> - Intact. Loss of oxygen to eastern side of main corridor.<br><br><b>Theta Station</b> - Intact. <b>WARNING</b>: Unknown force occupying Theta Station. Intent unknown. Species unknown. Numbers unknown.<br><br>Recommendation - Reestablish station powernet via solar array. Reestablish station atmospherics system to restore air."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/protosuit
|
||||
name = "B01-RIG Hardsuit Report"
|
||||
@@ -145,7 +145,7 @@
|
||||
info = "Artificial Program's report to surviving crewmembers.<br><br>Crew were placed into cryostasis on March 10th, 2445.<br><br>Crew were awoken from cryostasis around June, 2557.<br><br> \
|
||||
<b>SIGNIFICANT EVENTS OF NOTE</b><br>1: The primary radiation detectors were taken offline after 112 years due to power failure, secondary radiation detectors showed no residual \
|
||||
radiation on station. Deduction, primarily detector was malfunctioning and was producing a radiation signal when there was none.<br><br>2: A data burst from a nearby Nanotrasen Space \
|
||||
Station was received, this data burst contained research data that has been uploaded to our RnD labs.<br><br>3: Unknown invasion force has occupied Delta station."
|
||||
Station was received, this data burst contained research data that has been uploaded to our RnD labs.<br><br>3: Unknown invasion force has occupied Theta station."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/generator_manual
|
||||
name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator manual"
|
||||
@@ -321,6 +321,7 @@
|
||||
name = "Beta Station Atmospherics"
|
||||
icon_state = "red"
|
||||
has_gravity = FALSE
|
||||
ambientsounds = ENGINEERING_SOUNDS
|
||||
|
||||
/area/ruin/space/ancientstation/betanorth
|
||||
name = "Beta Station North Corridor"
|
||||
@@ -333,6 +334,7 @@
|
||||
/area/ruin/space/ancientstation/engi
|
||||
name = "Charlie Station Engineering"
|
||||
icon_state = "engine"
|
||||
ambientsounds = ENGINEERING_SOUNDS
|
||||
|
||||
/area/ruin/space/ancientstation/comm
|
||||
name = "Charlie Station Command"
|
||||
@@ -350,16 +352,16 @@
|
||||
name = "Charlie Station Security"
|
||||
icon_state = "red"
|
||||
|
||||
/area/ruin/space/ancientstation/deltacorridor
|
||||
name = "Delta Station Main Corridor"
|
||||
/area/ruin/space/ancientstation/thetacorridor
|
||||
name = "Theta Station Main Corridor"
|
||||
icon_state = "green"
|
||||
|
||||
/area/ruin/space/ancientstation/proto
|
||||
name = "Delta Station Prototype Lab"
|
||||
name = "Theta Station Prototype Lab"
|
||||
icon_state = "toxlab"
|
||||
|
||||
/area/ruin/space/ancientstation/rnd
|
||||
name = "Delta Station Research and Development"
|
||||
name = "Theta Station Research and Development"
|
||||
icon_state = "toxlab"
|
||||
|
||||
/area/ruin/space/ancientstation/hivebot
|
||||
|
||||
@@ -117,10 +117,8 @@
|
||||
if("Peace")
|
||||
to_chat(user, "<B>Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.</B>")
|
||||
to_chat(user, "You feel as if you just narrowly avoided a terrible fate...")
|
||||
for(var/mob/living/simple_animal/hostile/faithless/F in world)
|
||||
F.health = -10
|
||||
F.stat = 2
|
||||
F.icon_state = "faithless_dead"
|
||||
for(var/mob/living/simple_animal/hostile/faithless/F in GLOB.mob_living_list)
|
||||
F.death()
|
||||
|
||||
|
||||
///////////////Meatgrinder//////////////
|
||||
@@ -220,7 +218,8 @@
|
||||
to_chat(user, "<span class='warning'>The communicator buzzes, and you hear the voice again: 'Really? I think not. Get them!'</span>")
|
||||
if(option_threat)
|
||||
to_chat(user, "<span class='warning'>The communicator buzzes, and you hear the voice again: 'Oh really now?' You hear a clicking sound. 'Team, get back here. We have trouble'. Then the line goes dead.</span>")
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/L = thing
|
||||
if(L.name == "wildwest_syndipod")
|
||||
var/obj/spacepod/syndi/P = new /obj/spacepod/syndi(get_turf(L))
|
||||
P.name = "Syndi Recon Pod"
|
||||
|
||||
@@ -56,7 +56,8 @@ GLOBAL_LIST_INIT(potentialRandomZlevels, generateMapList(filename = "config/away
|
||||
GLOB.space_manager.remove_dirt(zlev)
|
||||
log_world(" Away mission loaded: [map]")
|
||||
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/L = thing
|
||||
if(L.name != "awaystart")
|
||||
continue
|
||||
GLOB.awaydestinations.Add(L)
|
||||
@@ -89,7 +90,8 @@ GLOBAL_LIST_INIT(potentialRandomZlevels, generateMapList(filename = "config/away
|
||||
|
||||
//map_transition_config.Add(AWAY_MISSION_LIST)
|
||||
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/L = thing
|
||||
if(L.name != "awaystart")
|
||||
continue
|
||||
GLOB.awaydestinations.Add(L)
|
||||
|
||||
@@ -28,8 +28,8 @@
|
||||
return "buildmode_[key]"
|
||||
|
||||
/datum/buildmode_mode/proc/show_help(mob/user)
|
||||
CRASH("No help defined, yell at a coder")
|
||||
to_chat(user, "<span class='warning'>There is no help defined for this mode, this is a bug.</span>")
|
||||
CRASH("No help defined, yell at a coder")
|
||||
|
||||
/datum/buildmode_mode/proc/change_settings(mob/user)
|
||||
to_chat(user, "<span class='warning'>There is no configuration available for this mode</span>")
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
var/matrix/mat = matrix()
|
||||
mat.Translate(0, 16)
|
||||
mat.Scale(1, sqrt((x_offset * x_offset) + (y_offset * y_offset)) / 32)
|
||||
mat.Turn(90 - Atan2(x_offset, y_offset)) // So... You pass coords in order x,y to this version of atan2. It should be called acsc2.
|
||||
mat.Turn(90 - ATAN2(x_offset, y_offset)) // So... You pass coords in order x,y to this version of atan2. It should be called acsc2.
|
||||
mat.Translate(atom_a.pixel_x, atom_a.pixel_y)
|
||||
|
||||
transform = mat
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
var/plasma = 0
|
||||
var/cdiox = 0
|
||||
var/nitrox = 0
|
||||
var/agentbx = 0
|
||||
|
||||
|
||||
/datum/buildmode_mode/atmos/show_help(mob/user)
|
||||
@@ -29,6 +30,7 @@
|
||||
plasma = input(user, "Plasma ratio", "Input", 0) as num|null
|
||||
cdiox = input(user, "CO2 ratio", "Input", 0) as num|null
|
||||
nitrox = input(user, "N2O ratio", "Input", 0) as num|null
|
||||
agentbx = input(user, "Agent B ratio", "Input", 0) as num|null
|
||||
|
||||
/datum/buildmode_mode/atmos/proc/ppratio_to_moles(ppratio)
|
||||
// ideal gas equation: Pressure * Volume = Moles * r * Temperature
|
||||
@@ -52,11 +54,8 @@
|
||||
S.air.nitrogen = ppratio_to_moles(nitrogen)
|
||||
S.air.toxins = ppratio_to_moles(plasma)
|
||||
S.air.carbon_dioxide = ppratio_to_moles(cdiox)
|
||||
S.air.trace_gases.Cut()
|
||||
if(nitrox)
|
||||
var/datum/gas/TG = new /datum/gas/sleeping_agent
|
||||
TG.moles = ppratio_to_moles(nitrox)
|
||||
S.air.trace_gases += TG
|
||||
S.air.sleeping_agent = ppratio_to_moles(nitrox)
|
||||
S.air.agent_b = ppratio_to_moles(agentbx)
|
||||
S.update_visuals()
|
||||
S.air_update_turf()
|
||||
else if(ctrl_click) // overwrite "default" unsimulated air
|
||||
@@ -65,7 +64,8 @@
|
||||
T.nitrogen = ppratio_to_moles(nitrogen)
|
||||
T.toxins = ppratio_to_moles(plasma)
|
||||
T.carbon_dioxide = ppratio_to_moles(cdiox)
|
||||
// no interface for trace gases on unsim turfs
|
||||
T.sleeping_agent = ppratio_to_moles(nitrox)
|
||||
T.agent_b = ppratio_to_moles(agentbx)
|
||||
T.air_update_turf()
|
||||
|
||||
// admin log
|
||||
|
||||
@@ -22,6 +22,6 @@
|
||||
if(stored)
|
||||
DuplicateObject(stored, perfectcopy=1, sameloc=0,newloc=T)
|
||||
else if(right_click)
|
||||
if(ismovableatom(object)) // No copying turfs for now.
|
||||
if(ismovable(object)) // No copying turfs for now.
|
||||
to_chat(user, "<span class='notice'>[object] set as template.</span>")
|
||||
stored = object
|
||||
|
||||
@@ -177,6 +177,12 @@ GLOBAL_LIST_EMPTY(asset_datums)
|
||||
|
||||
|
||||
//DEFINITIONS FOR ASSET DATUMS START HERE.
|
||||
/datum/asset/simple/tgui
|
||||
assets = list(
|
||||
"tgui.bundle.js" = 'tgui/packages/tgui/public/tgui.bundle.js',
|
||||
"tgui.bundle.css" = 'tgui/packages/tgui/public/tgui.bundle.css'
|
||||
)
|
||||
|
||||
/datum/asset/simple/paper
|
||||
assets = list(
|
||||
"large_stamp-clown.png" = 'icons/paper_icons/large_stamp-clown.png',
|
||||
@@ -344,3 +350,15 @@ GLOBAL_LIST_EMPTY(asset_datums)
|
||||
|
||||
/datum/asset/mob_hunt/send(client)
|
||||
send_asset_list(client, assets, verify)
|
||||
|
||||
// Fontawesome
|
||||
/datum/asset/simple/fontawesome
|
||||
verify = FALSE
|
||||
assets = list(
|
||||
"fa-regular-400.eot" = 'html/font-awesome/webfonts/fa-regular-400.eot',
|
||||
"fa-regular-400.woff" = 'html/font-awesome/webfonts/fa-regular-400.woff',
|
||||
"fa-solid-900.eot" = 'html/font-awesome/webfonts/fa-solid-900.eot',
|
||||
"fa-solid-900.woff" = 'html/font-awesome/webfonts/fa-solid-900.woff',
|
||||
"font-awesome.css" = 'html/font-awesome/css/all.min.css',
|
||||
"v4shim.css" = 'html/font-awesome/css/v4-shims.min.css'
|
||||
)
|
||||
|
||||
@@ -59,10 +59,6 @@
|
||||
var/karma = 0
|
||||
var/karma_spent = 0
|
||||
var/karma_tab = 0
|
||||
/////////////////////////////////////////////
|
||||
// /vg/: MEDIAAAAAAAA
|
||||
// Set on login.
|
||||
var/datum/media_manager/media = null
|
||||
|
||||
var/topic_debugging = 0 //if set to true, allows client to see nanoUI errors -- yes i realize this is messy but it'll make live testing infinitely easier
|
||||
|
||||
@@ -85,10 +81,10 @@
|
||||
// If set to true, this client can interact with atoms such as buttons and doors on top of regular machinery interaction
|
||||
var/advanced_admin_interaction = FALSE
|
||||
|
||||
// Has the client been varedited by an admin? [Inherits from datum now]
|
||||
// var/var_edited = FALSE
|
||||
|
||||
var/client_keysend_amount = 0
|
||||
var/next_keysend_reset = 0
|
||||
var/next_keysend_trip_reset = 0
|
||||
var/keysend_tripped = FALSE
|
||||
|
||||
// Last world.time that the player tried to request their resources.
|
||||
var/last_ui_resource_send = 0
|
||||
|
||||
@@ -432,7 +432,13 @@
|
||||
//////////////
|
||||
//DISCONNECT//
|
||||
//////////////
|
||||
|
||||
/client/Del()
|
||||
if(!gc_destroyed)
|
||||
Destroy() //Clean up signals and timers.
|
||||
return ..()
|
||||
|
||||
/client/Destroy()
|
||||
if(holder)
|
||||
holder.owner = null
|
||||
GLOB.admins -= src
|
||||
@@ -442,7 +448,8 @@
|
||||
movingmob.client_mobs_in_contents -= mob
|
||||
UNSETEMPTY(movingmob.client_mobs_in_contents)
|
||||
Master.UpdateTickRate()
|
||||
return ..()
|
||||
..() //Even though we're going to be hard deleted there are still some things that want to know the destroy is happening
|
||||
return QDEL_HINT_HARDDEL_NOW
|
||||
|
||||
|
||||
/client/proc/donator_check()
|
||||
@@ -556,7 +563,7 @@
|
||||
if(GLOB.panic_bunker_enabled)
|
||||
var/threshold = config.panic_bunker_threshold
|
||||
src << "Server is not accepting connections from never-before-seen players until player count is less than [threshold]. Please try again later."
|
||||
del(src)
|
||||
qdel(src)
|
||||
return // Dont insert or they can just go in again
|
||||
|
||||
var/DBQuery/query_insert = GLOB.dbcon.NewQuery("INSERT INTO [format_table_name("player")] (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')")
|
||||
@@ -906,3 +913,35 @@
|
||||
return TRUE
|
||||
|
||||
#undef SSD_WARNING_TIMER
|
||||
|
||||
/client/verb/resend_ui_resources()
|
||||
set name = "Reload UI Resources"
|
||||
set desc = "Reload your UI assets if they are not working"
|
||||
set category = "Special Verbs"
|
||||
|
||||
if(last_ui_resource_send > world.time)
|
||||
to_chat(usr, "<span class='warning'>You requested your UI resource files too quickly. Please try again in [(last_ui_resource_send - world.time)/10] seconds.</span>")
|
||||
return
|
||||
|
||||
var/choice = alert(usr, "This will reload your NanoUI and TGUI resources. If you have any open UIs this may break them. Are you sure?", "Resource Reloading", "Yes", "No")
|
||||
if(choice == "Yes")
|
||||
// 600 deciseconds = 1 minute
|
||||
last_ui_resource_send = world.time + 60 SECONDS
|
||||
|
||||
// Close their open UIs
|
||||
SSnanoui.close_user_uis(usr)
|
||||
SStgui.close_user_uis(usr)
|
||||
|
||||
// Resend the resources
|
||||
var/datum/asset/nano_assets = get_asset_datum(/datum/asset/nanoui)
|
||||
nano_assets.register()
|
||||
|
||||
var/datum/asset/tgui_assets = get_asset_datum(/datum/asset/simple/tgui)
|
||||
tgui_assets.register()
|
||||
|
||||
// Clear the user's cache so they get resent.
|
||||
// This is not fully clearing their BYOND cache, just their assets sent from the server this round
|
||||
cache = list()
|
||||
|
||||
to_chat(usr, "<span class='notice'>UI resource files resent successfully. If you are still having issues, please try manually clearing your BYOND cache. <b>This can be achieved by opening your BYOND launcher, pressing the cog in the top right, selecting preferences, going to the Games tab, and pressing 'Clear Cache'.</b></span>")
|
||||
|
||||
|
||||
@@ -54,7 +54,6 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
return C.player_age
|
||||
else
|
||||
return max(0, days - C.player_age)
|
||||
return 0
|
||||
|
||||
#define MAX_SAVE_SLOTS 30 // Save slots for regular players
|
||||
#define MAX_SAVE_SLOTS_MEMBER 30 // Save slots for BYOND members
|
||||
@@ -624,6 +623,9 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
if(job.admin_only)
|
||||
continue
|
||||
|
||||
if(job.hidden_from_job_prefs)
|
||||
continue
|
||||
|
||||
index += 1
|
||||
if((index >= limit) || (job.title in splitJobs))
|
||||
if((index < limit) && (lastJob != null))
|
||||
@@ -2001,6 +2003,11 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
windowflashing = !windowflashing
|
||||
|
||||
if("afk_watch")
|
||||
if(!afk_watch)
|
||||
to_chat(user, "<span class='info'>You will now get put into cryo dorms after [config.auto_cryo_afk] minutes. \
|
||||
Then after [config.auto_despawn_afk] minutes you will be fully despawned. You will receive a visual and auditory warning before you will be put into cryodorms.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='info'>Automatic cryoing turned off.</span>")
|
||||
afk_watch = !afk_watch
|
||||
|
||||
if("UIcolor")
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
UI_style_alpha='[UI_style_alpha]',
|
||||
be_role='[sanitizeSQL(list2params(be_special))]',
|
||||
default_slot='[default_slot]',
|
||||
toggles='[num2text(toggles, Ceiling(log(10, (TOGGLES_TOTAL))))]',
|
||||
toggles='[num2text(toggles, CEILING(log(10, (TOGGLES_TOTAL)), 1))]',
|
||||
atklog='[atklog]',
|
||||
sound='[sound]',
|
||||
randomslot='[randomslot]',
|
||||
@@ -320,6 +320,10 @@
|
||||
if(!rlimb_data) src.rlimb_data = list()
|
||||
if(!loadout_gear) loadout_gear = list()
|
||||
|
||||
// Check if the current body accessory exists
|
||||
if(!GLOB.body_accessory_by_name[body_accessory])
|
||||
body_accessory = null
|
||||
|
||||
return 1
|
||||
|
||||
/datum/preferences/proc/save_character(client/C)
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
..()
|
||||
initialize_outfits()
|
||||
|
||||
/datum/action/chameleon_outfit/Destroy()
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
return ..()
|
||||
|
||||
/datum/action/chameleon_outfit/proc/initialize_outfits()
|
||||
var/static/list/standard_outfit_options
|
||||
if(!standard_outfit_options)
|
||||
@@ -140,29 +144,29 @@
|
||||
UpdateButtonIcon()
|
||||
|
||||
/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item)
|
||||
// Species-related variables are lists, which can not be retrieved using initial(). As such, we need to instantiate the picked item.
|
||||
var/obj/item/P = new picked_item(null)
|
||||
|
||||
target.name = P.name
|
||||
target.desc = P.desc
|
||||
target.icon_state = P.icon_state
|
||||
target.name = initial(picked_item.name)
|
||||
target.desc = initial(picked_item.desc)
|
||||
target.icon_state = initial(picked_item.icon_state)
|
||||
|
||||
if(isitem(target))
|
||||
var/obj/item/I = target
|
||||
|
||||
I.item_state = P.item_state
|
||||
I.item_color = P.item_color
|
||||
I.item_state = initial(picked_item.item_state)
|
||||
I.item_color = initial(picked_item.item_color)
|
||||
|
||||
I.icon_override = P.icon_override
|
||||
I.sprite_sheets = P.sprite_sheets
|
||||
I.icon_override = initial(picked_item.icon_override)
|
||||
if(initial(picked_item.sprite_sheets))
|
||||
// Species-related variables are lists, which can not be retrieved using initial(). As such, we need to instantiate the picked item.
|
||||
var/obj/item/P = new picked_item(null)
|
||||
I.sprite_sheets = P.sprite_sheets
|
||||
qdel(P)
|
||||
|
||||
if(istype(I, /obj/item/clothing) && istype(P, /obj/item/clothing))
|
||||
if(istype(I, /obj/item/clothing) && istype(initial(picked_item), /obj/item/clothing))
|
||||
var/obj/item/clothing/CL = I
|
||||
var/obj/item/clothing/PCL = P
|
||||
CL.flags_cover = PCL.flags_cover
|
||||
var/obj/item/clothing/PCL = picked_item
|
||||
CL.flags_cover = initial(PCL.flags_cover)
|
||||
|
||||
target.icon = P.icon
|
||||
qdel(P)
|
||||
target.icon = initial(picked_item.icon)
|
||||
|
||||
/datum/action/item_action/chameleon/change/Trigger()
|
||||
if(!IsAvailable())
|
||||
@@ -198,7 +202,7 @@
|
||||
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/clothing/under/chameleon/Initialize()
|
||||
/obj/item/clothing/under/chameleon/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/clothing/under
|
||||
@@ -206,11 +210,15 @@
|
||||
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/under, /obj/item/clothing/under/color, /obj/item/clothing/under/rank), only_root_path = TRUE)
|
||||
chameleon_action.initialize_disguises()
|
||||
|
||||
/obj/item/clothing/under/chameleon/Destroy()
|
||||
QDEL_NULL(chameleon_action)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/under/chameleon/emp_act(severity)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise()
|
||||
|
||||
/obj/item/clothing/under/chameleon/broken/Initialize()
|
||||
/obj/item/clothing/under/chameleon/broken/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
@@ -229,7 +237,7 @@
|
||||
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/clothing/suit/chameleon/Initialize()
|
||||
/obj/item/clothing/suit/chameleon/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/clothing/suit
|
||||
@@ -237,11 +245,15 @@
|
||||
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor), only_root_path = TRUE)
|
||||
chameleon_action.initialize_disguises()
|
||||
|
||||
/obj/item/clothing/suit/chameleon/Destroy()
|
||||
QDEL_NULL(chameleon_action)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/suit/chameleon/emp_act(severity)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise()
|
||||
|
||||
/obj/item/clothing/suit/chameleon/broken/Initialize()
|
||||
/obj/item/clothing/suit/chameleon/broken/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
@@ -261,7 +273,7 @@
|
||||
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/clothing/glasses/chameleon/Initialize()
|
||||
/obj/item/clothing/glasses/chameleon/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/clothing/glasses
|
||||
@@ -269,11 +281,15 @@
|
||||
chameleon_action.chameleon_blacklist = list()
|
||||
chameleon_action.initialize_disguises()
|
||||
|
||||
/obj/item/clothing/glasses/chameleon/Destroy()
|
||||
QDEL_NULL(chameleon_action)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/glasses/chameleon/emp_act(severity)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise()
|
||||
|
||||
/obj/item/clothing/glasses/chameleon/broken/Initialize()
|
||||
/obj/item/clothing/glasses/chameleon/broken/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
@@ -289,7 +305,7 @@
|
||||
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/chameleon/Initialize()
|
||||
/obj/item/clothing/glasses/hud/security/chameleon/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/clothing/glasses
|
||||
@@ -297,11 +313,15 @@
|
||||
chameleon_action.chameleon_blacklist = list()
|
||||
chameleon_action.initialize_disguises()
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/chameleon/Destroy()
|
||||
QDEL_NULL(chameleon_action)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/chameleon/emp_act(severity)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise()
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/chameleon/broken/Initialize()
|
||||
/obj/item/clothing/glasses/hud/security/chameleon/broken/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
@@ -316,7 +336,7 @@
|
||||
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/clothing/gloves/chameleon/Initialize()
|
||||
/obj/item/clothing/gloves/chameleon/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/clothing/gloves
|
||||
@@ -324,11 +344,15 @@
|
||||
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/gloves, /obj/item/clothing/gloves/color), only_root_path = TRUE)
|
||||
chameleon_action.initialize_disguises()
|
||||
|
||||
/obj/item/clothing/gloves/chameleon/Destroy()
|
||||
QDEL_NULL(chameleon_action)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/gloves/chameleon/emp_act(severity)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise()
|
||||
|
||||
/obj/item/clothing/gloves/chameleon/broken/Initialize()
|
||||
/obj/item/clothing/gloves/chameleon/broken/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
@@ -347,7 +371,7 @@
|
||||
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/clothing/head/chameleon/Initialize()
|
||||
/obj/item/clothing/head/chameleon/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/clothing/head
|
||||
@@ -355,11 +379,15 @@
|
||||
chameleon_action.chameleon_blacklist = list()
|
||||
chameleon_action.initialize_disguises()
|
||||
|
||||
/obj/item/clothing/head/chameleon/Destroy()
|
||||
QDEL_NULL(chameleon_action)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/head/chameleon/emp_act(severity)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise()
|
||||
|
||||
/obj/item/clothing/head/chameleon/broken/Initialize()
|
||||
/obj/item/clothing/head/chameleon/broken/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
@@ -389,7 +417,7 @@
|
||||
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/clothing/mask/chameleon/Initialize()
|
||||
/obj/item/clothing/mask/chameleon/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
chameleon_action = new(src)
|
||||
@@ -402,13 +430,14 @@
|
||||
|
||||
/obj/item/clothing/mask/chameleon/Destroy()
|
||||
QDEL_NULL(voice_changer)
|
||||
QDEL_NULL(chameleon_action)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/mask/chameleon/emp_act(severity)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise()
|
||||
|
||||
/obj/item/clothing/mask/chameleon/broken/Initialize()
|
||||
/obj/item/clothing/mask/chameleon/broken/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
@@ -423,7 +452,7 @@
|
||||
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/clothing/shoes/chameleon/Initialize()
|
||||
/obj/item/clothing/shoes/chameleon/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/clothing/shoes
|
||||
@@ -431,6 +460,10 @@
|
||||
chameleon_action.chameleon_blacklist = list()
|
||||
chameleon_action.initialize_disguises()
|
||||
|
||||
/obj/item/clothing/shoes/chameleon/Destroy()
|
||||
QDEL_NULL(chameleon_action)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/shoes/chameleon/emp_act(severity)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise()
|
||||
@@ -442,7 +475,7 @@
|
||||
desc = "A pair of black shoes."
|
||||
flags = NOSLIP
|
||||
|
||||
/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize()
|
||||
/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
@@ -455,18 +488,22 @@
|
||||
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/storage/backpack/chameleon/Initialize()
|
||||
/obj/item/storage/backpack/chameleon/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/storage/backpack
|
||||
chameleon_action.chameleon_name = "Backpack"
|
||||
chameleon_action.initialize_disguises()
|
||||
|
||||
/obj/item/storage/backpack/chameleon/Destroy()
|
||||
QDEL_NULL(chameleon_action)
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/backpack/chameleon/emp_act(severity)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise()
|
||||
|
||||
/obj/item/storage/backpack/chameleon/broken/Initialize()
|
||||
/obj/item/storage/backpack/chameleon/broken/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
@@ -475,7 +512,7 @@
|
||||
desc = "Holds tools."
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/storage/belt/chameleon/Initialize()
|
||||
/obj/item/storage/belt/chameleon/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
chameleon_action = new(src)
|
||||
@@ -483,11 +520,15 @@
|
||||
chameleon_action.chameleon_name = "Belt"
|
||||
chameleon_action.initialize_disguises()
|
||||
|
||||
/obj/item/storage/belt/chameleon/Destroy()
|
||||
QDEL_NULL(chameleon_action)
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/belt/chameleon/emp_act(severity)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise()
|
||||
|
||||
/obj/item/storage/belt/chameleon/broken/Initialize()
|
||||
/obj/item/storage/belt/chameleon/broken/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
@@ -495,18 +536,22 @@
|
||||
name = "radio headset"
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/radio/headset/chameleon/Initialize()
|
||||
/obj/item/radio/headset/chameleon/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/radio/headset
|
||||
chameleon_action.chameleon_name = "Headset"
|
||||
chameleon_action.initialize_disguises()
|
||||
|
||||
/obj/item/radio/headset/chameleon/Destroy()
|
||||
QDEL_NULL(chameleon_action)
|
||||
return ..()
|
||||
|
||||
/obj/item/radio/headset/chameleon/emp_act(severity)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise()
|
||||
|
||||
/obj/item/radio/headset/chameleon/broken/Initialize()
|
||||
/obj/item/radio/headset/chameleon/broken/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
@@ -514,7 +559,7 @@
|
||||
name = "PDA"
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/pda/chameleon/Initialize()
|
||||
/obj/item/pda/chameleon/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/pda
|
||||
@@ -522,24 +567,32 @@
|
||||
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/pda/heads), only_root_path = TRUE)
|
||||
chameleon_action.initialize_disguises()
|
||||
|
||||
/obj/item/pda/chameleon/Destroy()
|
||||
QDEL_NULL(chameleon_action)
|
||||
return ..()
|
||||
|
||||
/obj/item/pda/chameleon/emp_act(severity)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise()
|
||||
|
||||
/obj/item/pda/chameleon/broken/Initialize()
|
||||
/obj/item/pda/chameleon/broken/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
/obj/item/stamp/chameleon
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/stamp/chameleon/Initialize()
|
||||
/obj/item/stamp/chameleon/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/stamp
|
||||
chameleon_action.chameleon_name = "Stamp"
|
||||
chameleon_action.initialize_disguises()
|
||||
|
||||
/obj/item/stamp/chameleon/broken/Initialize()
|
||||
/obj/item/stamp/chameleon/Destroy()
|
||||
QDEL_NULL(chameleon_action)
|
||||
return ..()
|
||||
|
||||
/obj/item/stamp/chameleon/broken/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
@@ -113,7 +113,7 @@
|
||||
|
||||
/obj/item/clothing/head/soft/sec/corp
|
||||
name = "corporate security cap"
|
||||
desc = "It's baseball hat in corpotate colours."
|
||||
desc = "It's a baseball hat in corporate colours."
|
||||
icon_state = "corpsoft"
|
||||
item_color = "corp"
|
||||
|
||||
|
||||
@@ -86,21 +86,25 @@
|
||||
name = "orange shoes"
|
||||
icon_state = "orange"
|
||||
item_color = "orange"
|
||||
var/obj/item/restraints/handcuffs/shackles
|
||||
|
||||
/obj/item/clothing/shoes/orange/attack_self(mob/user as mob)
|
||||
if(src.chained)
|
||||
src.chained = null
|
||||
src.slowdown = SHOES_SLOWDOWN
|
||||
new /obj/item/restraints/handcuffs( user.loc )
|
||||
src.icon_state = "orange"
|
||||
return
|
||||
/obj/item/clothing/shoes/orange/Destroy()
|
||||
QDEL_NULL(shackles)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/shoes/orange/attackby(obj/H, loc, params)
|
||||
..()
|
||||
if(istype(H, /obj/item/restraints/handcuffs) && !chained && !(H.flags & NODROP))
|
||||
if(src.icon_state != "orange") return
|
||||
qdel(H)
|
||||
src.chained = 1
|
||||
src.slowdown = 15
|
||||
src.icon_state = "orange1"
|
||||
return
|
||||
/obj/item/clothing/shoes/orange/attack_self(mob/user)
|
||||
if(shackles)
|
||||
user.put_in_hands(shackles)
|
||||
shackles = null
|
||||
slowdown = SHOES_SLOWDOWN
|
||||
icon_state = "orange"
|
||||
|
||||
/obj/item/clothing/shoes/orange/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/restraints/handcuffs) && !shackles)
|
||||
if(user.drop_item())
|
||||
I.forceMove(src)
|
||||
shackles = I
|
||||
slowdown = 15
|
||||
icon_state = "orange1"
|
||||
return
|
||||
return ..()
|
||||
|
||||
@@ -73,16 +73,15 @@ obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team
|
||||
shoe_sound = "clownstep"
|
||||
origin_tech = "magnets=4;syndicate=2"
|
||||
var/enabled_waddle = TRUE
|
||||
var/datum/component/waddle
|
||||
|
||||
/obj/item/clothing/shoes/magboots/clown/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(slot == slot_shoes && enabled_waddle)
|
||||
waddle = user.AddComponent(/datum/component/waddling)
|
||||
user.AddElement(/datum/element/waddling)
|
||||
|
||||
/obj/item/clothing/shoes/magboots/clown/dropped(mob/user)
|
||||
. = ..()
|
||||
QDEL_NULL(waddle)
|
||||
user.RemoveElement(/datum/element/waddling)
|
||||
|
||||
/obj/item/clothing/shoes/magboots/clown/CtrlClick(mob/living/user)
|
||||
if(!isliving(user))
|
||||
|
||||
@@ -71,16 +71,15 @@
|
||||
var/footstep = 1 //used for squeeks whilst walking
|
||||
shoe_sound = "clownstep"
|
||||
var/enabled_waddle = TRUE
|
||||
var/datum/component/waddle
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(slot == slot_shoes && enabled_waddle)
|
||||
waddle = user.AddComponent(/datum/component/waddling)
|
||||
user.AddElement(/datum/element/waddling)
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/dropped(mob/user)
|
||||
. = ..()
|
||||
QDEL_NULL(waddle)
|
||||
user.RemoveElement(/datum/element/waddling)
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/CtrlClick(mob/living/user)
|
||||
if(!isliving(user))
|
||||
|
||||
@@ -531,7 +531,7 @@
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/process()
|
||||
if(world.time > recharge_cooldown && current_charges < max_charges)
|
||||
current_charges = Clamp((current_charges + recharge_rate), 0, max_charges)
|
||||
current_charges = clamp((current_charges + recharge_rate), 0, max_charges)
|
||||
playsound(loc, 'sound/magic/charge.ogg', 50, TRUE)
|
||||
if(current_charges == max_charges)
|
||||
playsound(loc, 'sound/machines/ding.ogg', 50, TRUE)
|
||||
|
||||
@@ -155,9 +155,8 @@
|
||||
if(piece.siemens_coefficient > siemens_coefficient) //So that insulated gloves keep their insulation.
|
||||
piece.siemens_coefficient = siemens_coefficient
|
||||
piece.permeability_coefficient = permeability_coefficient
|
||||
if(islist(armor))
|
||||
var/list/L = armor
|
||||
piece.armor = L.Copy()
|
||||
if(armor)
|
||||
piece.armor = armor
|
||||
|
||||
update_icon(1)
|
||||
|
||||
@@ -286,7 +285,7 @@
|
||||
if(helmet)
|
||||
helmet.update_light(wearer)
|
||||
|
||||
correct_piece.armor["bio"] = 100
|
||||
correct_piece.armor = correct_piece.armor.setRating(bio_value = 100)
|
||||
|
||||
sealing = FALSE
|
||||
|
||||
@@ -389,7 +388,7 @@
|
||||
if(helmet)
|
||||
helmet.update_light(wearer)
|
||||
|
||||
correct_piece.armor["bio"] = armor["bio"]
|
||||
correct_piece.armor = correct_piece.armor.setRating(bio_value = armor.getRating("bio"))
|
||||
|
||||
sealing = FALSE
|
||||
|
||||
@@ -553,7 +552,7 @@
|
||||
|
||||
data["charge"] = cell ? round(cell.charge,1) : 0
|
||||
data["maxcharge"] = cell ? cell.maxcharge : 0
|
||||
data["chargestatus"] = cell ? Floor((cell.charge/cell.maxcharge)*50) : 0
|
||||
data["chargestatus"] = cell ? FLOOR((cell.charge/cell.maxcharge)*50, 1) : 0
|
||||
|
||||
data["emagged"] = subverted
|
||||
data["coverlock"] = locked
|
||||
|
||||
@@ -9,13 +9,22 @@
|
||||
multi *= (100 - chest.damage) / 100 //If we have some breaches, lower the armor value.
|
||||
|
||||
//TODO check for other armor mods, likely modules, which need to be coded.
|
||||
if(!armor) //Did we even give them some armor, if this is the case, the list should be initialized from New()
|
||||
return
|
||||
|
||||
var/datum/armor/A = armor
|
||||
for(var/obj/item/piece in list(gloves, helmet, boots, chest))
|
||||
if(!istype(piece)) //Do we have the piece
|
||||
continue
|
||||
if(islist(armor)) //Did we even give them some armor, if this is the case, the list should be initialized from New()
|
||||
var/list/L = armor
|
||||
for(var/armortype in L)
|
||||
piece.armor[armortype] = L[armortype]*multi
|
||||
|
||||
piece.armor = piece.armor.setRating(melee_value = A.getRating("melee") * multi,
|
||||
bullet_value = A.getRating("bullet") * multi,
|
||||
laser_value = A.getRating("laser") * multi,
|
||||
energy_value = A.getRating("energy") * multi,
|
||||
bomb_value = A.getRating("bomb") * multi,
|
||||
bio_value = A.getRating("bio") * multi,
|
||||
rad_value = A.getRating("rad") * multi,
|
||||
fire_value = A.getRating("fire") * multi,
|
||||
acid_value = A.getRating("acidd") * multi)
|
||||
|
||||
//Perfect place to also add something like shield modules, or any other hit_reaction modules check.
|
||||
|
||||
@@ -37,8 +37,13 @@
|
||||
var/mob/M = has_suit.loc
|
||||
A.Grant(M)
|
||||
|
||||
for(var/armor_type in armor)
|
||||
has_suit.armor[armor_type] += armor[armor_type]
|
||||
if (islist(has_suit.armor) || isnull(has_suit.armor)) // This proc can run before /obj/Initialize has run for U and src,
|
||||
has_suit.armor = getArmor(arglist(has_suit.armor)) // we have to check that the armor list has been transformed into a datum before we try to call a proc on it
|
||||
// This is safe to do as /obj/Initialize only handles setting up the datum if actually needed.
|
||||
if (islist(armor) || isnull(armor))
|
||||
armor = getArmor(arglist(armor))
|
||||
|
||||
has_suit.armor = has_suit.armor.attachArmor(armor)
|
||||
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>You attach [src] to [has_suit].</span>")
|
||||
@@ -56,8 +61,7 @@
|
||||
var/mob/M = has_suit.loc
|
||||
A.Remove(M)
|
||||
|
||||
for(var/armor_type in armor)
|
||||
has_suit.armor[armor_type] -= armor[armor_type]
|
||||
has_suit.armor = has_suit.armor.detachArmor(armor)
|
||||
|
||||
has_suit = null
|
||||
if(user)
|
||||
@@ -314,6 +318,36 @@
|
||||
if(isliving(user))
|
||||
user.visible_message("<span class='warning'>[user] invades [M]'s personal space, thrusting [src] into [M.p_their()] face insistently.</span>","<span class='warning'>You invade [M]'s personal space, thrusting [src] into [M.p_their()] face insistently. You are the law.</span>")
|
||||
|
||||
//////////////
|
||||
//OBJECTION!//
|
||||
//////////////
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge
|
||||
name = "attorney's badge"
|
||||
desc = "Fills you with the conviction of JUSTICE. Lawyers tend to want to show it to everyone they meet."
|
||||
icon_state = "lawyerbadge"
|
||||
item_state = "lawyerbadge"
|
||||
item_color = "lawyerbadge"
|
||||
var/cached_bubble_icon = null
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge/attack_self(mob/user)
|
||||
if(prob(1))
|
||||
user.say("The testimony contradicts the evidence!")
|
||||
user.visible_message("<span class='notice'>[user] shows [user.p_their()] attorney's badge.</span>", "<span class='notice'>You show your attorney's badge.</span>")
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge/on_attached(obj/item/clothing/under/S, mob/user)
|
||||
..()
|
||||
if(has_suit && ismob(has_suit.loc))
|
||||
var/mob/M = has_suit.loc
|
||||
cached_bubble_icon = M.bubble_icon
|
||||
M.bubble_icon = "lawyer"
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge/on_removed(mob/user)
|
||||
if(has_suit && ismob(has_suit.loc))
|
||||
var/mob/M = has_suit.loc
|
||||
M.bubble_icon = cached_bubble_icon
|
||||
..()
|
||||
|
||||
///////////
|
||||
//SCARVES//
|
||||
///////////
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
continue main_loop
|
||||
return FALSE
|
||||
for(var/obj/item/T in tools_used)
|
||||
if(!T.tool_start_check(user, 0)) //Check if all our tools are valid for their use
|
||||
if(!T.tool_start_check(null, user, 0)) //Check if all our tools are valid for their use
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
var/mob/living/carbon/human/target = M
|
||||
|
||||
if(ismachine(target))
|
||||
if(ismachineperson(target))
|
||||
to_chat(user, "<span class= 'notice'>[target] has no skin, how do you expect to tattoo [target.p_them()]?</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
amount_per_transfer_from_this = 5
|
||||
possible_transfer_amounts = list(5)
|
||||
volume = 5
|
||||
can_be_placed_into = null
|
||||
flags = NOBLUDGEON
|
||||
container_type = OPENCONTAINER
|
||||
has_lid = FALSE
|
||||
|
||||
@@ -159,7 +159,7 @@ GLOBAL_VAR(current_date_string)
|
||||
var/account_name = href_list["holder_name"]
|
||||
var/starting_funds = max(text2num(href_list["starting_funds"]), 0)
|
||||
|
||||
starting_funds = Clamp(starting_funds, 0, GLOB.station_account.money) // Not authorized to put the station in debt.
|
||||
starting_funds = clamp(starting_funds, 0, GLOB.station_account.money) // Not authorized to put the station in debt.
|
||||
starting_funds = min(starting_funds, fund_cap) // Not authorized to give more than the fund cap.
|
||||
|
||||
var/datum/money_account/M = create_account(account_name, starting_funds, src)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
////////////////////////
|
||||
|
||||
/proc/get_money_account(var/account_number, var/from_z=-1)
|
||||
for(var/obj/machinery/computer/account_database/DB in world)
|
||||
for(var/obj/machinery/computer/account_database/DB in GLOB.machines)
|
||||
if(from_z > -1 && DB.z != from_z) continue
|
||||
if((DB.stat & NOPOWER) || !DB.activated ) continue
|
||||
var/datum/money_account/acct = DB.get_account(account_number)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
playercount = length(GLOB.clients)//grab playercount when event starts not when game starts
|
||||
if(playercount >= highpop_trigger) //spawn with 4 if highpop
|
||||
spawncount = 4
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in SSair.atmos_machinery)
|
||||
if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
|
||||
if(temp_vent.parent.other_atmosmch.len > 50) //Stops Aliens getting stuck in small networks. See: Security, Virology
|
||||
vents += temp_vent
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
// Calculate new position (searches through beacons in world)
|
||||
var/obj/item/radio/beacon/chosen
|
||||
var/list/possible = list()
|
||||
for(var/obj/item/radio/beacon/W in world)
|
||||
for(var/obj/item/radio/beacon/W in GLOB.global_radios)
|
||||
if(!is_station_level(W.z))
|
||||
continue
|
||||
possible += W
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
if(!newAnomaly)
|
||||
kill()
|
||||
return
|
||||
if(IsMultiple(activeFor, 5))
|
||||
if(ISMULTIPLE(activeFor, 5))
|
||||
newAnomaly.anomalyEffect()
|
||||
|
||||
/datum/event/anomaly/anomaly_pyro/end()
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
#define APC_BREAK_PROBABILITY 25 // the probability that a given APC will be broken
|
||||
|
||||
/datum/event/apc_overload
|
||||
var/const/announce_after_mc_ticks = 5
|
||||
var/const/delayed = FALSE
|
||||
var/const/event_max_duration_mc_ticks = announce_after_mc_ticks * 2
|
||||
var/const/event_min_duration_mc_ticks = announce_after_mc_ticks
|
||||
|
||||
announceWhen = announce_after_mc_ticks
|
||||
|
||||
/datum/event/apc_overload/setup()
|
||||
endWhen = rand(event_min_duration_mc_ticks, event_max_duration_mc_ticks)
|
||||
|
||||
/datum/event/apc_overload/start()
|
||||
apc_overload_failure(announce=delayed)
|
||||
var/sound/S = sound('sound/effects/powerloss.ogg')
|
||||
for(var/mob/living/M in GLOB.player_list)
|
||||
var/turf/T = get_turf(M)
|
||||
if(!M.client || !is_station_level(T.z))
|
||||
continue
|
||||
SEND_SOUND(M, S)
|
||||
|
||||
/datum/event/apc_overload/announce()
|
||||
GLOB.event_announcement.Announce("Overload detected in [station_name()]'s powernet. Engineering, please check all underfloor APC terminals.", "Critical Power Failure", new_sound = 'sound/AI/apc_overload.ogg')
|
||||
|
||||
/datum/event/apc_overload/end()
|
||||
return TRUE
|
||||
|
||||
/proc/apc_overload_failure(announce=TRUE)
|
||||
var/list/skipped_areas_apc = list(
|
||||
/area/engine/engineering,
|
||||
/area/turret_protected/ai)
|
||||
|
||||
if(announce)
|
||||
GLOB.event_announcement.Announce("Overload detected in [station_name()]'s powernet. Engineering, please check all underfloor APC terminals.", "Critical Power Failure", new_sound = 'sound/AI/apc_overload.ogg')
|
||||
|
||||
// break APC_BREAK_PROBABILITY% of all of the APCs on the station
|
||||
var/affected_apc_count = 0
|
||||
for(var/thing in GLOB.apcs)
|
||||
var/obj/machinery/power/apc/C = thing
|
||||
// skip any APCs that are too critical to break
|
||||
var/area/current_area = get_area(C)
|
||||
if((current_area.type in skipped_areas_apc) || !is_station_level(C.z))
|
||||
continue
|
||||
// if we are going to break this one
|
||||
if(prob(APC_BREAK_PROBABILITY))
|
||||
// if it has a cell, drain all the charge from the cell
|
||||
if(C.cell)
|
||||
C.cell.charge = 0
|
||||
// if it has a terminal, disconnect and delete the terminal
|
||||
if(C.terminal)
|
||||
var/obj/machinery/power/terminal/T = C.terminal
|
||||
C.terminal.master = null
|
||||
C.terminal = null
|
||||
qdel(T)
|
||||
// if it was operating, toggle off the breaker
|
||||
if(C.operating)
|
||||
C.toggle_breaker()
|
||||
// no matter what, ensure the area knows something happened to the power
|
||||
current_area.power_change()
|
||||
affected_apc_count++
|
||||
log_and_message_admins("APC Overload event deleted [affected_apc_count] underfloor APC terminals.")
|
||||
|
||||
#undef APC_BREAK_PROBABILITY
|
||||
@@ -0,0 +1,79 @@
|
||||
#define APC_BREAK_PROBABILITY 25 // the probability that a given APC will be disabled
|
||||
|
||||
/datum/event/apc_short
|
||||
var/const/announce_after_mc_ticks = 5
|
||||
var/const/delayed = FALSE
|
||||
var/const/event_max_duration_mc_ticks = announce_after_mc_ticks * 2
|
||||
var/const/event_min_duration_mc_ticks = announce_after_mc_ticks
|
||||
|
||||
announceWhen = announce_after_mc_ticks
|
||||
|
||||
/datum/event/apc_short/setup()
|
||||
endWhen = rand(event_min_duration_mc_ticks, event_max_duration_mc_ticks)
|
||||
|
||||
/datum/event/apc_short/start()
|
||||
power_failure(announce=delayed)
|
||||
var/sound/S = sound('sound/effects/powerloss.ogg')
|
||||
for(var/mob/living/M in GLOB.player_list)
|
||||
var/turf/T = get_turf(M)
|
||||
if(!M.client || !is_station_level(T.z))
|
||||
continue
|
||||
SEND_SOUND(M, S)
|
||||
|
||||
/datum/event/apc_short/announce()
|
||||
GLOB.event_announcement.Announce("Overload detected in [station_name()]'s powernet. Engineering, please repair shorted APCs.", "Systems Power Failure", new_sound = 'sound/AI/apc_short.ogg')
|
||||
|
||||
/datum/event/apc_short/end()
|
||||
return TRUE
|
||||
|
||||
/proc/power_failure(announce=TRUE)
|
||||
var/list/skipped_areas_apc = list(
|
||||
/area/engine/engineering,
|
||||
/area/turret_protected/ai)
|
||||
|
||||
if(announce)
|
||||
GLOB.event_announcement.Announce("Overload detected in [station_name()]'s powernet. Engineering, please repair shorted APCs.", "Systems Power Failure", new_sound = 'sound/AI/apc_short.ogg')
|
||||
|
||||
// break APC_BREAK_PROBABILITY% of all of the APCs on the station
|
||||
var/affected_apc_count = 0
|
||||
for(var/thing in GLOB.apcs)
|
||||
var/obj/machinery/power/apc/C = thing
|
||||
// skip any APCs that are too critical to disable
|
||||
var/area/current_area = get_area(C)
|
||||
if((current_area.type in skipped_areas_apc) || !is_station_level(C.z))
|
||||
continue
|
||||
// if we are going to break this one
|
||||
if(prob(APC_BREAK_PROBABILITY))
|
||||
// if it has internal wires, cut the power wires
|
||||
if(C.wires)
|
||||
if(!C.wires.IsIndexCut(APC_WIRE_MAIN_POWER1))
|
||||
C.wires.CutWireIndex(APC_WIRE_MAIN_POWER1)
|
||||
if(!C.wires.IsIndexCut(APC_WIRE_MAIN_POWER2))
|
||||
C.wires.CutWireIndex(APC_WIRE_MAIN_POWER2)
|
||||
// if it was operating, toggle off the breaker
|
||||
if(C.operating)
|
||||
C.toggle_breaker()
|
||||
// no matter what, ensure the area knows something happened to the power
|
||||
current_area.power_change()
|
||||
affected_apc_count++
|
||||
log_and_message_admins("APC Short event shorted out [affected_apc_count] APCs.")
|
||||
|
||||
/proc/power_restore(announce=TRUE)
|
||||
power_restore_quick(announce)
|
||||
|
||||
/proc/power_restore_quick(announce=TRUE)
|
||||
if(announce)
|
||||
GLOB.event_announcement.Announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
|
||||
|
||||
// fix all of the SMESs
|
||||
for(var/obj/machinery/power/smes/S in GLOB.machines)
|
||||
if(!is_station_level(S.z))
|
||||
continue
|
||||
S.charge = S.capacity
|
||||
S.output_level = S.output_level_max
|
||||
S.output_attempt = 1
|
||||
S.input_attempt = 1
|
||||
S.update_icon()
|
||||
S.power_change()
|
||||
|
||||
#undef APC_BREAK_PROBABILITY
|
||||
@@ -55,12 +55,12 @@
|
||||
kill()
|
||||
return
|
||||
|
||||
if(IsMultiple(activeFor, 4))
|
||||
if(ISMULTIPLE(activeFor, 4))
|
||||
var/obj/machinery/vending/rebel = pick(vendingMachines)
|
||||
vendingMachines.Remove(rebel)
|
||||
infectedMachines.Add(rebel)
|
||||
rebel.shut_up = 0
|
||||
rebel.shoot_inventory = 1
|
||||
|
||||
if(IsMultiple(activeFor, 8))
|
||||
if(ISMULTIPLE(activeFor, 8))
|
||||
originMachine.speak(pick(rampant_speeches))
|
||||
|
||||
@@ -30,7 +30,8 @@
|
||||
/datum/event/carp_migration/proc/spawn_fish(num_groups, group_size_min = 3, group_size_max = 5)
|
||||
var/list/spawn_locations = list()
|
||||
|
||||
for(var/obj/effect/landmark/C in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/C = thing
|
||||
if(C.name == "carpspawn")
|
||||
spawn_locations.Add(C.loc)
|
||||
spawn_locations = shuffle(spawn_locations)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
/datum/event/communications_blackout/start()
|
||||
// This only affects the cores, relays should be unaffected imo
|
||||
for(var/obj/machinery/tcomms/core/T in GLOB.tcomms_machines)
|
||||
T.disable_machine()
|
||||
T.start_ion()
|
||||
// Bring it back sometime between 3-5 minutes. This uses deciseconds, so 1800 and 3000 respecticely.
|
||||
// Note that because this is a strict enable not a toggle, the crew or AI can re-enable the machine themselves
|
||||
addtimer(CALLBACK(T, /obj/machinery/tcomms.proc/enable_machine), rand(1800, 3000))
|
||||
// The AI cannot disable this, it must be waited for
|
||||
addtimer(CALLBACK(T, /obj/machinery/tcomms.proc/end_ion), rand(1800, 3000))
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
density = 1
|
||||
anchored = 1
|
||||
var/strength = 2 //ex_act severity number
|
||||
var/life = 2 //how many things we hit before del(src)
|
||||
var/life = 2 //how many things we hit before qdel(src)
|
||||
var/atom/goal = null
|
||||
|
||||
/obj/effect/space_dust/weak
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
|
||||
for(var/i=1, i <= lightsoutAmount, i++)
|
||||
var/list/possibleEpicentres = list()
|
||||
for(var/obj/effect/landmark/newEpicentre in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/newEpicentre = thing
|
||||
if(newEpicentre.name == "lightsout" && !(newEpicentre in epicentreList))
|
||||
possibleEpicentres += newEpicentre
|
||||
if(possibleEpicentres.len)
|
||||
@@ -21,7 +22,8 @@
|
||||
if(!epicentreList.len)
|
||||
return
|
||||
|
||||
for(var/obj/effect/landmark/epicentre in epicentreList)
|
||||
for(var/obj/machinery/power/apc/apc in range(epicentre,lightsoutRange))
|
||||
for(var/thing in epicentreList)
|
||||
var/obj/effect/landmark/epicentre = thing
|
||||
for(var/obj/machinery/power/apc/apc in range(epicentre, lightsoutRange))
|
||||
apc.overload_lighting()
|
||||
|
||||
|
||||
@@ -128,7 +128,7 @@ GLOBAL_LIST_EMPTY(event_last_fired)
|
||||
/datum/event_container/mundane
|
||||
severity = EVENT_LEVEL_MUNDANE
|
||||
available_events = list(
|
||||
// Severity level, event name, even type, base weight, role weights, one shot, min weight, max weight. Last two only used if set and non-zero
|
||||
// Severity level, event name, event type, base weight, role weights, one shot, min weight, max weight. Last two only used if set and non-zero
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 1100),
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 0, 25, 50),
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15),
|
||||
@@ -157,7 +157,7 @@ GLOBAL_LIST_EMPTY(event_last_fired)
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 100)),
|
||||
//new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100)),
|
||||
//new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 60)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "APC Short", /datum/event/apc_short, 200, list(ASSIGNMENT_ENGINEER = 60)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 250, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 150)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 25, list(ASSIGNMENT_MEDICAL = 50), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 30), 1),
|
||||
@@ -191,6 +191,7 @@ GLOBAL_LIST_EMPTY(event_last_fired)
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 1320),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 3), 1),
|
||||
//new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station, 0, list(ASSIGNMENT_ANY = 5)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "APC Overload", /datum/event/apc_overload, 0),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 0, list(ASSIGNMENT_ENGINEER = 30), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 5), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Abductor Visit", /datum/event/abductor, 80, is_one_shot = 1),
|
||||
|
||||
@@ -1,82 +0,0 @@
|
||||
/datum/event/grid_check //NOTE: Times are measured in master controller ticks!
|
||||
announceWhen = 5
|
||||
|
||||
/datum/event/grid_check/setup()
|
||||
endWhen = rand(30,120)
|
||||
|
||||
/datum/event/grid_check/start()
|
||||
power_failure(0)
|
||||
var/sound/S = sound('sound/effects/powerloss.ogg')
|
||||
for(var/mob/living/M in GLOB.player_list)
|
||||
var/turf/T = get_turf(M)
|
||||
if(!M.client || !is_station_level(T.z))
|
||||
continue
|
||||
SEND_SOUND(M, S)
|
||||
|
||||
/datum/event/grid_check/announce()
|
||||
GLOB.event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg')
|
||||
|
||||
/datum/event/grid_check/end()
|
||||
power_restore()
|
||||
|
||||
/proc/power_failure(var/announce = 1)
|
||||
if(announce)
|
||||
GLOB.event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg')
|
||||
|
||||
var/list/skipped_areas = list(/area/turret_protected/ai)
|
||||
var/list/skipped_areas_apc = list(/area/engine/engineering)
|
||||
|
||||
for(var/obj/machinery/power/smes/S in GLOB.machines)
|
||||
var/area/current_area = get_area(S)
|
||||
if((current_area.type in skipped_areas) || !is_station_level(S.z))
|
||||
continue
|
||||
S.last_charge = S.charge
|
||||
S.last_output_attempt = S.output_attempt
|
||||
S.last_input_attempt = S.input_attempt
|
||||
S.charge = 0
|
||||
S.inputting(0)
|
||||
S.outputting(0)
|
||||
S.update_icon()
|
||||
S.power_change()
|
||||
|
||||
for(var/obj/machinery/power/apc/C in GLOB.apcs)
|
||||
var/area/current_area = get_area(C)
|
||||
if((current_area.type in skipped_areas_apc) || !is_station_level(C.z))
|
||||
continue
|
||||
if(C.cell)
|
||||
C.cell.charge = 0
|
||||
|
||||
/proc/power_restore(var/announce = 1)
|
||||
var/list/skipped_areas = list(/area/turret_protected/ai)
|
||||
var/list/skipped_areas_apc = list(/area/engine/engineering)
|
||||
|
||||
if(announce)
|
||||
GLOB.event_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
|
||||
for(var/obj/machinery/power/apc/C in GLOB.apcs)
|
||||
var/area/current_area = get_area(C)
|
||||
if((current_area.type in skipped_areas_apc) || !is_station_level(C.z))
|
||||
continue
|
||||
if(C.cell)
|
||||
C.cell.charge = C.cell.maxcharge
|
||||
for(var/obj/machinery/power/smes/S in GLOB.machines)
|
||||
var/area/current_area = get_area(S)
|
||||
if((current_area.type in skipped_areas) || !is_station_level(S.z))
|
||||
continue
|
||||
S.charge = S.last_charge
|
||||
S.output_attempt = S.last_output_attempt
|
||||
S.input_attempt = S.last_input_attempt
|
||||
S.update_icon()
|
||||
S.power_change()
|
||||
|
||||
/proc/power_restore_quick(var/announce = 1)
|
||||
if(announce)
|
||||
GLOB.event_announcement.Announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
|
||||
for(var/obj/machinery/power/smes/S in GLOB.machines)
|
||||
if(!is_station_level(S.z))
|
||||
continue
|
||||
S.charge = S.capacity
|
||||
S.output_level = S.output_level_max
|
||||
S.output_attempt = 1
|
||||
S.input_attempt = 1
|
||||
S.update_icon()
|
||||
S.power_change()
|
||||
@@ -493,7 +493,7 @@
|
||||
/proc/generate_static_ion_law()
|
||||
var/list/players = list()
|
||||
for(var/mob/living/carbon/human/player in GLOB.player_list)
|
||||
if( !player.mind || player.mind.assigned_role == player.mind.special_role || player.client.inactivity > MinutesToTicks(10))
|
||||
if( !player.mind || player.mind.assigned_role == player.mind.special_role || player.client.inactivity > 10 MINUTES)
|
||||
continue
|
||||
players += player.real_name
|
||||
var/random_player = "The Captain"
|
||||
|
||||
@@ -23,7 +23,7 @@ GLOBAL_VAR_INIT(account_hack_attempted, 0)
|
||||
Notifications will be sent as updates occur.<br>"
|
||||
var/my_department = "[station_name()] firewall subroutines"
|
||||
|
||||
for(var/obj/machinery/message_server/MS in world)
|
||||
for(var/obj/machinery/message_server/MS in GLOB.machines)
|
||||
if(!MS.active) continue
|
||||
MS.send_rc_message("Head of Personnel's Desk", my_department, message, "", "", 2)
|
||||
|
||||
@@ -38,7 +38,7 @@ GLOBAL_VAR_INIT(account_hack_attempted, 0)
|
||||
if(!isnull(affected_account) && !affected_account.suspended)
|
||||
message = "The hack attempt has succeeded."
|
||||
|
||||
var/lost = affected_account.money * (MINIMUM_PERCENTAGE_LOSS + rand(0,VARIABLE_LOSS) / 10);
|
||||
var/lost = affected_account.money * (MINIMUM_PERCENTAGE_LOSS + rand(0,VARIABLE_LOSS) / 10)
|
||||
|
||||
affected_account.phantom_charge(lost)
|
||||
|
||||
@@ -64,7 +64,7 @@ GLOBAL_VAR_INIT(account_hack_attempted, 0)
|
||||
|
||||
var/my_department = "[station_name()] firewall subroutines"
|
||||
|
||||
for(var/obj/machinery/message_server/MS in world)
|
||||
for(var/obj/machinery/message_server/MS in GLOB.machines)
|
||||
if(!MS.active) continue
|
||||
MS.send_rc_message("Head of Personnel's Desk", my_department, message, "", "", 2)
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
if(areas && areas.len > 0)
|
||||
var/my_department = "[station_name()] firewall subroutines"
|
||||
var/rc_message = "An unknown malicious program has been detected in the [english_list(areaName)] lighting and airlock control systems at [station_time_timestamp()]. Systems will be fully compromised within approximately three minutes. Direct intervention is required immediately.<br>"
|
||||
for(var/obj/machinery/message_server/MS in world)
|
||||
for(var/obj/machinery/message_server/MS in GLOB.machines)
|
||||
MS.send_rc_message("Engineering", my_department, rc_message, "", "", 2)
|
||||
for(var/mob/living/silicon/ai/A in GLOB.player_list)
|
||||
to_chat(A, "<span class='danger'>Malicious program detected in the [english_list(areaName)] lighting and airlock control systems by [my_department].</span>")
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
/datum/event/rogue_drone/start()
|
||||
//spawn them at the same place as carp
|
||||
var/list/possible_spawns = list()
|
||||
for(var/obj/effect/landmark/C in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/C = thing
|
||||
if(C.name == "carpspawn")
|
||||
possible_spawns.Add(C)
|
||||
|
||||
|
||||
@@ -16,13 +16,15 @@
|
||||
var/datum/mind/player_mind = new /datum/mind(key_of_slaughter)
|
||||
player_mind.active = 1
|
||||
var/list/spawn_locs = list()
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/L = thing
|
||||
if(isturf(L.loc))
|
||||
switch(L.name)
|
||||
if("revenantspawn")
|
||||
spawn_locs += L.loc
|
||||
if(!spawn_locs) //If we can't find any revenant spawns, try the carp spawns
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/L = thing
|
||||
if(isturf(L.loc))
|
||||
switch(L.name)
|
||||
if("carpspawn")
|
||||
|
||||
@@ -15,7 +15,7 @@ GLOBAL_VAR_INIT(sent_spiders_to_station, 0)
|
||||
/datum/event/spider_infestation/start()
|
||||
|
||||
var/list/vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in SSair.atmos_machinery)
|
||||
if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
|
||||
if(temp_vent.parent.other_atmosmch.len > 50)
|
||||
vents += temp_vent
|
||||
|
||||
@@ -24,7 +24,8 @@ GLOBAL_LIST_INIT(unused_trade_stations, list("sol"))
|
||||
return
|
||||
|
||||
var/list/spawnlocs = list()
|
||||
for(var/obj/effect/landmark/landmark in GLOB.landmarks_list)
|
||||
for(var/thing in GLOB.landmarks_list)
|
||||
var/obj/effect/landmark/landmark = thing
|
||||
if(landmark.name == "traderstart_[station]")
|
||||
spawnlocs += get_turf(landmark)
|
||||
if(!spawnlocs.len)
|
||||
|
||||
@@ -82,7 +82,6 @@
|
||||
else //If it doesn't qualify in the above checks, we don't want it. Inform the person so they (ideally) stop trying to put the nuke disc in.
|
||||
to_chat(user, "<span class='warning'>You aren't sure this is able to be processed by the machine.</span>")
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/obj/machinery/bottler/wrench_act(mob/user, obj/item/I)
|
||||
. = TRUE
|
||||
|
||||
@@ -72,8 +72,8 @@
|
||||
if(istype(H.head, /obj/item/clothing/head) && affecting == "head")
|
||||
|
||||
// If their head has an armor value, assign headarmor to it, else give it 0.
|
||||
if(H.head.armor["melee"])
|
||||
headarmor = H.head.armor["melee"]
|
||||
if(H.head.armor.getRating("melee"))
|
||||
headarmor = H.head.armor.getRating("melee")
|
||||
else
|
||||
headarmor = 0
|
||||
else
|
||||
@@ -115,7 +115,7 @@
|
||||
//The reagents in the bottle splash all over the target, thanks for the idea Nodrak
|
||||
SplashReagents(target)
|
||||
|
||||
//Finally, smash the bottle. This kills (del) the bottle.
|
||||
//Finally, smash the bottle. This kills (qdel) the bottle.
|
||||
smash(target, user)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/proc/SplashReagents(mob/M)
|
||||
|
||||
@@ -166,6 +166,15 @@
|
||||
list_reagents = list("nutriment" = 2, "vitamin" = 2)
|
||||
tastes = list("bread" = 2)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/toast
|
||||
name = "Toast"
|
||||
desc = "Yeah! Toast!"
|
||||
icon_state = "toast"
|
||||
filling_color = "#B2580E"
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 3)
|
||||
tastes = list("toast" = 2)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/jelliedtoast
|
||||
name = "Jellied Toast"
|
||||
desc = "A slice of bread covered with delicious jam."
|
||||
@@ -198,3 +207,5 @@
|
||||
trash = /obj/item/trash/waffles
|
||||
filling_color = "#E6DEB5"
|
||||
list_reagents = list("nutriment" = 8, "vitamin" = 1)
|
||||
|
||||
|
||||
|
||||
@@ -17,10 +17,10 @@
|
||||
update_icon()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/icecream/update_icon()
|
||||
overlays.Cut()
|
||||
var/image/filling = image('icons/obj/kitchen.dmi', src, "icecream_color")
|
||||
filling.icon += mix_color_from_reagents(reagents.reagent_list)
|
||||
overlays += filling
|
||||
cut_overlays()
|
||||
var/mutable_appearance/filling = mutable_appearance('icons/obj/kitchen.dmi', "icecream_color")
|
||||
filling.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
add_overlay(filling)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/icecream/icecreamcone
|
||||
name = "ice cream cone"
|
||||
|
||||
@@ -129,7 +129,7 @@
|
||||
tastes = list("shrimp" = 1, "batter" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Ebi_maki
|
||||
name = "ebi makiroll"
|
||||
name = "ebi maki roll"
|
||||
desc = "A large unsliced roll of Ebi Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Ebi_maki"
|
||||
@@ -149,7 +149,7 @@
|
||||
tastes = list("shrimp" = 1, "rice" = 1, "seaweed" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Ikura_maki
|
||||
name = "ikura makiroll"
|
||||
name = "ikura maki roll"
|
||||
desc = "A large unsliced roll of Ikura Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Ikura_maki"
|
||||
@@ -169,7 +169,7 @@
|
||||
tastes = list("salmon roe" = 1, "rice" = 1, "seaweed" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Sake_maki
|
||||
name = "sake makiroll"
|
||||
name = "sake maki roll"
|
||||
desc = "A large unsliced roll of Sake Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Sake_maki"
|
||||
@@ -189,7 +189,7 @@
|
||||
tastes = list("raw salmon" = 1, "rice" = 1, "seaweed" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/SmokedSalmon_maki
|
||||
name = "smoked salmon makiroll"
|
||||
name = "smoked salmon maki roll"
|
||||
desc = "A large unsliced roll of Smoked Salmon Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "SmokedSalmon_maki"
|
||||
@@ -209,7 +209,7 @@
|
||||
tastes = list("smoked salmon" = 1, "rice" = 1, "seaweed" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Tamago_maki
|
||||
name = "tamago makiroll"
|
||||
name = "tamago maki roll"
|
||||
desc = "A large unsliced roll of Tamago Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Tamago_maki"
|
||||
@@ -229,7 +229,7 @@
|
||||
tastes = list("egg" = 1, "rice" = 1, "seaweed" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Inari_maki
|
||||
name = "inari makiroll"
|
||||
name = "inari maki roll"
|
||||
desc = "A large unsliced roll of Inari Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Inari_maki"
|
||||
@@ -249,7 +249,7 @@
|
||||
tastes = list("fried tofu" = 1, "rice" = 1, "seaweed" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Masago_maki
|
||||
name = "masago makiroll"
|
||||
name = "masago maki roll"
|
||||
desc = "A large unsliced roll of Masago Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Masago_maki"
|
||||
@@ -269,7 +269,7 @@
|
||||
tastes = list("goldfish roe" = 1, "rice" = 1, "seaweed" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Tobiko_maki
|
||||
name = "tobiko makiroll"
|
||||
name = "tobiko maki roll"
|
||||
desc = "A large unsliced roll of Tobkio Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Tobiko_maki"
|
||||
@@ -289,7 +289,7 @@
|
||||
tastes = list("shark roe" = 1, "rice" = 1, "seaweed" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/TobikoEgg_maki
|
||||
name = "tobiko and egg makiroll"
|
||||
name = "tobiko and egg maki roll"
|
||||
desc = "A large unsliced roll of Tobkio and Egg Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "TobikoEgg_maki"
|
||||
@@ -309,7 +309,7 @@
|
||||
tastes = list("shark roe" = 1, "rice" = 1, "egg" = 1, "seaweed" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/Tai_maki
|
||||
name = "tai makiroll"
|
||||
name = "tai maki roll"
|
||||
desc = "A large unsliced roll of Tai Sushi."
|
||||
icon = 'icons/obj/food/seafood.dmi'
|
||||
icon_state = "Tai_maki"
|
||||
|
||||
@@ -278,11 +278,6 @@
|
||||
if(!UserOverride)
|
||||
add_attack_logs(user, occupant, "Gibbed in [src]", !!occupant.ckey ? ATKLOG_FEW : ATKLOG_ALL)
|
||||
|
||||
if(!iscarbon(user))
|
||||
occupant.LAssailant = null
|
||||
else
|
||||
occupant.LAssailant = user
|
||||
|
||||
else //this looks ugly but it's better than a copy-pasted startgibbing proc override
|
||||
occupant.create_attack_log("Was gibbed by <b>an autogibber (\the [src])</b>")
|
||||
add_attack_logs(src, occupant, "gibbed")
|
||||
|
||||
@@ -43,10 +43,9 @@
|
||||
return
|
||||
if(istype(I, /obj/item/reagent_containers/food/snacks/icecream))
|
||||
if(!I.reagents.has_reagent("sprinkles"))
|
||||
if(I.reagents.total_volume > 29) I.reagents.remove_any(1)
|
||||
I.reagents.add_reagent("sprinkles",1)
|
||||
var/image/sprinkles = image('icons/obj/kitchen.dmi', src, "sprinkles")
|
||||
I.overlays += sprinkles
|
||||
if(I.reagents.total_volume > 29)
|
||||
I.reagents.remove_any(1)
|
||||
I.reagents.add_reagent("sprinkles", 1)
|
||||
I.name += " with sprinkles"
|
||||
I.desc += ". This also has sprinkles."
|
||||
else
|
||||
|
||||
@@ -1,256 +0,0 @@
|
||||
#define ICECREAM_VANILLA 1
|
||||
#define FLAVOUR_CHOCOLATE 2
|
||||
#define FLAVOUR_STRAWBERRY 3
|
||||
#define FLAVOUR_BLUE 4
|
||||
#define CONE_WAFFLE 5
|
||||
#define CONE_CHOC 6
|
||||
#define INGR_MILK 7
|
||||
#define INGR_FLOUR 8
|
||||
#define INGR_SUGAR 9
|
||||
#define INGR_ICE 10
|
||||
#define MUCK 11
|
||||
|
||||
GLOBAL_LIST_INIT(ingredients_source, list(
|
||||
"berryjuice" = FLAVOUR_STRAWBERRY,\
|
||||
"cocoa" = FLAVOUR_CHOCOLATE,\
|
||||
"singulo" = FLAVOUR_BLUE,\
|
||||
"milk" = INGR_MILK,\
|
||||
"soymilk" = INGR_MILK,\
|
||||
"ice" = INGR_ICE,\
|
||||
"flour" = INGR_FLOUR,\
|
||||
"sugar" = INGR_SUGAR,\
|
||||
))
|
||||
|
||||
/proc/get_icecream_flavour_string(var/flavour_type)
|
||||
switch(flavour_type)
|
||||
if(FLAVOUR_CHOCOLATE)
|
||||
return "chocolate"
|
||||
if(FLAVOUR_STRAWBERRY)
|
||||
return "strawberry"
|
||||
if(FLAVOUR_BLUE)
|
||||
return "blue"
|
||||
if(CONE_WAFFLE)
|
||||
return "waffle"
|
||||
if(CONE_CHOC)
|
||||
return "chocolate"
|
||||
if(INGR_MILK)
|
||||
return "milk"
|
||||
if(INGR_FLOUR)
|
||||
return "flour"
|
||||
if(INGR_SUGAR)
|
||||
return "sugar"
|
||||
if(INGR_ICE)
|
||||
return "ice"
|
||||
if(MUCK)
|
||||
return "muck"
|
||||
else
|
||||
return "vanilla"
|
||||
|
||||
/obj/machinery/icecream_vat
|
||||
name = "icecream vat"
|
||||
desc = "Ding-aling ding dong. Get your Nanotrasen-approved ice cream!"
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "icecream_vat"
|
||||
density = 1
|
||||
anchored = 0
|
||||
max_integrity = 300
|
||||
var/list/ingredients = list()
|
||||
var/dispense_flavour = 1
|
||||
var/obj/item/reagent_containers/glass/held_container
|
||||
|
||||
/obj/machinery/icecream_vat/New()
|
||||
..()
|
||||
create_reagents(50)
|
||||
while(ingredients.len < 11)
|
||||
ingredients.Add(5)
|
||||
|
||||
/obj/machinery/icecream_vat/attack_hand(mob/user)
|
||||
user.set_machine(src)
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/icecream_vat/interact(mob/user)
|
||||
var/dat
|
||||
dat += "<a href='?src=[UID()];dispense=[ICECREAM_VANILLA]'><b>Dispense vanilla icecream</b></a> There is [ingredients[ICECREAM_VANILLA]] scoops of vanilla icecream left (made from milk and ice).<br>"
|
||||
dat += "<a href='?src=[UID()];dispense=[FLAVOUR_STRAWBERRY]'><b>Dispense strawberry icecream</b></a> There is [ingredients[FLAVOUR_STRAWBERRY]] dollops of strawberry flavouring left (obtained from berry juice.<br>"
|
||||
dat += "<a href='?src=[UID()];dispense=[FLAVOUR_CHOCOLATE]'><b>Dispense chocolate icecream</b></a> There is [ingredients[FLAVOUR_CHOCOLATE]] dollops of chocolate flavouring left (obtained from cocoa powder).<br>"
|
||||
dat += "<a href='?src=[UID()];dispense=[FLAVOUR_BLUE]'><b>Dispense blue icecream</b></a> There is [ingredients[FLAVOUR_BLUE]] dollops of blue flavouring left (obtained from bluespace tomato singulo).<br>"
|
||||
dat += "<br>"
|
||||
dat += "<a href='?src=[UID()];cone=[CONE_WAFFLE]'><b>Dispense waffle cones</b></a> There are [ingredients[CONE_WAFFLE]] waffle cones left. <br>"
|
||||
dat += "<a href='?src=[UID()];cone=[CONE_CHOC]'><b>Dispense chocolate cones</b></a> There are [ingredients[CONE_CHOC]] chocolate cones left.<br>"
|
||||
dat += "<br>"
|
||||
dat += "<a href='?src=[UID()];make=[CONE_WAFFLE]'><b>Make waffle cones</b></a> There is [ingredients[INGR_FLOUR]]/[ingredients[INGR_SUGAR]] of flour and sugar left.<br>"
|
||||
dat += "<a href='?src=[UID()];make=[CONE_CHOC]'><b>Make chocolate cones</b></a> There is [ingredients[FLAVOUR_CHOCOLATE]]/[ingredients[CONE_WAFFLE]] of chocolate flavouring and waffle cones left.<br>"
|
||||
dat += "<a href='?src=[UID()];make=[ICECREAM_VANILLA]'><b>Make vanilla icecream</b></a> There is [ingredients[INGR_MILK]]/[ingredients[INGR_ICE]] of milk and ice left.<br>"
|
||||
dat += "<br>"
|
||||
if(held_container)
|
||||
dat += "<a href='?src=[UID()];eject=1'>Eject [held_container]</a> "
|
||||
else
|
||||
dat += "No beaker inserted. "
|
||||
dat += "<a href='?src=[UID()];refresh=1'>Refresh</a> <a href='?src=[UID()];close=1'>Close</a>"
|
||||
|
||||
var/datum/browser/popup = new(user, "icecreamvat", name, 600, 400)
|
||||
popup.set_content(dat)
|
||||
popup.open(0)
|
||||
|
||||
/obj/machinery/icecream_vat/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item/reagent_containers))
|
||||
if(istype(O, /obj/item/reagent_containers/food/snacks/icecream))
|
||||
var/obj/item/reagent_containers/food/snacks/icecream/I = O
|
||||
if(!I.ice_creamed)
|
||||
if(ingredients[ICECREAM_VANILLA] > 0)
|
||||
var/flavour_name = get_icecream_flavour_string(dispense_flavour)
|
||||
if(dispense_flavour < 11 && ingredients[dispense_flavour] > 0)
|
||||
visible_message("[bicon(src)] <span class='info'>[user] scoops delicious [flavour_name] flavoured icecream into [I].</span>")
|
||||
ingredients[dispense_flavour] -= 1
|
||||
ingredients[ICECREAM_VANILLA] -= 1
|
||||
|
||||
I.add_ice_cream(dispense_flavour)
|
||||
if(held_container)
|
||||
held_container.reagents.trans_to(I, 10)
|
||||
if(I.reagents.total_volume < 10)
|
||||
I.reagents.add_reagent("sugar", 10 - I.reagents.total_volume)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>There is not enough [flavour_name] flavouring left! Insert more of the required ingredients.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>There is not enough icecream left! Insert more milk and ice.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[O] already has icecream in it.</span>")
|
||||
else if(istype(O, /obj/item/reagent_containers/glass))
|
||||
if(held_container)
|
||||
to_chat(user, "<span class='notice'>You must remove [held_container] from [src] first.</span>")
|
||||
else
|
||||
if(!user.drop_item())
|
||||
to_chat(user, "<span class='warning'>\The [O] is stuck to your hand!</span>")
|
||||
return
|
||||
O.forceMove(src)
|
||||
to_chat(user, "<span class='info'>You insert [O] into [src].</span>")
|
||||
held_container = O
|
||||
else
|
||||
var/obj/item/reagent_containers/R = O
|
||||
if(R.reagents)
|
||||
visible_message("<span class='info'>[user] has emptied all of [R] into [src].</span>")
|
||||
for(var/datum/reagent/current_reagent in R.reagents.reagent_list)
|
||||
if(GLOB.ingredients_source[current_reagent.id])
|
||||
add(GLOB.ingredients_source[current_reagent.id], current_reagent.volume / 2)
|
||||
else
|
||||
add(MUCK, current_reagent.volume / 5)
|
||||
R.reagents.clear_reagents()
|
||||
return 1
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/icecream_vat/proc/add(var/add_type, var/amount)
|
||||
if(add_type <= ingredients.len)
|
||||
ingredients[add_type] += amount
|
||||
updateDialog()
|
||||
|
||||
/obj/machinery/icecream_vat/proc/make(var/mob/user, var/make_type)
|
||||
switch(make_type)
|
||||
if(CONE_WAFFLE)
|
||||
if(ingredients[INGR_FLOUR] > 0 && ingredients[INGR_SUGAR] > 0)
|
||||
var/amount = max( min(ingredients[INGR_FLOUR], ingredients[INGR_SUGAR]), 5)
|
||||
ingredients[INGR_FLOUR] -= amount
|
||||
ingredients[INGR_SUGAR] -= amount
|
||||
ingredients[CONE_WAFFLE] += amount
|
||||
visible_message("<span class='info'>[user] cooks up some waffle cones.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You require sugar and flour to make waffle cones.</span>")
|
||||
if(CONE_CHOC)
|
||||
if(ingredients[FLAVOUR_CHOCOLATE] > 0 && ingredients[CONE_WAFFLE] > 0)
|
||||
var/amount = min(ingredients[CONE_WAFFLE], ingredients[FLAVOUR_CHOCOLATE])
|
||||
ingredients[CONE_WAFFLE] -= amount
|
||||
ingredients[FLAVOUR_CHOCOLATE] -= amount
|
||||
ingredients[CONE_CHOC] += amount
|
||||
visible_message("<span class='info'>[user] cooks up some chocolate cones.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You require waffle cones and chocolate flavouring to make chocolate cones.</span>")
|
||||
if(ICECREAM_VANILLA)
|
||||
if(ingredients[INGR_ICE] > 0 && ingredients[INGR_MILK] > 0)
|
||||
var/amount = min(ingredients[INGR_ICE], ingredients[INGR_MILK])
|
||||
ingredients[INGR_ICE] -= amount
|
||||
ingredients[INGR_MILK] -= amount
|
||||
ingredients[ICECREAM_VANILLA] += amount
|
||||
visible_message("<span class='info'>[user] whips up some vanilla icecream.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You require milk and ice to make vanilla icecream.</span>")
|
||||
updateDialog()
|
||||
|
||||
/obj/machinery/icecream_vat/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
if(href_list["dispense"])
|
||||
dispense_flavour = text2num(href_list["dispense"])
|
||||
visible_message("<span class='notice'>[usr] sets [src] to dispense [get_icecream_flavour_string(dispense_flavour)] flavoured icecream.</span>")
|
||||
|
||||
if(href_list["cone"])
|
||||
var/dispense_cone = text2num(href_list["cone"])
|
||||
if(ingredients[dispense_cone] <= ingredients.len)
|
||||
var/cone_name = get_icecream_flavour_string(dispense_cone)
|
||||
if(ingredients[dispense_cone] >= 1)
|
||||
ingredients[dispense_cone] -= 1
|
||||
var/obj/item/reagent_containers/food/snacks/icecream/I = new(loc)
|
||||
I.cone_type = cone_name
|
||||
I.icon_state = "icecream_cone_[cone_name]"
|
||||
I.desc = "Delicious [cone_name] cone, but no ice cream."
|
||||
visible_message("<span class='info'>[usr] dispenses a crunchy [cone_name] cone from [src].</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>There are no [cone_name] cones left!</span>")
|
||||
updateDialog()
|
||||
|
||||
if(href_list["make"])
|
||||
make( usr, text2num(href_list["make"]) )
|
||||
updateDialog()
|
||||
|
||||
if(href_list["eject"])
|
||||
if(held_container)
|
||||
held_container.forceMove(loc)
|
||||
held_container = null
|
||||
updateDialog()
|
||||
|
||||
if(href_list["refresh"])
|
||||
updateDialog()
|
||||
|
||||
if(href_list["close"])
|
||||
usr.unset_machine()
|
||||
usr << browse(null,"window=icecreamvat")
|
||||
return
|
||||
|
||||
/obj/machinery/icecream_vat/deconstruct(disassembled = TRUE)
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
new /obj/item/stack/sheet/metal(loc, 4)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/icecream
|
||||
name = "ice cream cone"
|
||||
desc = "Delicious waffle cone, but no ice cream."
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "icecream_cone"
|
||||
layer = 3.1
|
||||
var/ice_creamed = 0
|
||||
var/cone_type
|
||||
bitesize = 3
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/icecream/New()
|
||||
..()
|
||||
create_reagents(20)
|
||||
reagents.add_reagent("nutriment", 5)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/icecream/proc/add_ice_cream(var/flavour)
|
||||
var/flavour_name = get_icecream_flavour_string(flavour)
|
||||
name = "[flavour_name] icecream"
|
||||
overlays += "icecream_[flavour_name]"
|
||||
desc = "Delicious [cone_type] cone with a dollop of [flavour_name] ice cream."
|
||||
ice_creamed = 1
|
||||
|
||||
#undef ICECREAM_VANILLA
|
||||
#undef FLAVOUR_CHOCOLATE
|
||||
#undef FLAVOUR_STRAWBERRY
|
||||
#undef FLAVOUR_BLUE
|
||||
#undef CONE_WAFFLE
|
||||
#undef CONE_CHOC
|
||||
#undef INGR_MILK
|
||||
#undef INGR_FLOUR
|
||||
#undef INGR_SUGAR
|
||||
#undef INGR_ICE
|
||||
#undef MUCK
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user