diff --git a/baystation12.dme b/baystation12.dme index 1da6e16ab99..62204e566d4 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -791,6 +791,7 @@ #include "code\js\byjax.dm" #include "code\js\menus.dm" #include "code\modules\admin\admin.dm" +#include "code\modules\admin\admin_investigate.dm" #include "code\modules\admin\admin_memo.dm" #include "code\modules\admin\admin_verbs.dm" #include "code\modules\admin\banjob.dm" @@ -1082,6 +1083,7 @@ #include "code\modules\power\singularity\emitter.dm" #include "code\modules\power\singularity\field_generator.dm" #include "code\modules\power\singularity\generator.dm" +#include "code\modules\power\singularity\investigate.dm" #include "code\modules\power\singularity\singularity.dm" #include "code\modules\power\singularity\particle_accelerator\particle.dm" #include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" diff --git a/code/game/cellautomata.dm b/code/game/cellautomata.dm index 71b46fe5bf5..3e7bc8a0977 100644 --- a/code/game/cellautomata.dm +++ b/code/game/cellautomata.dm @@ -85,13 +85,13 @@ src.load_motd() src.load_rules() src.load_admins() + investigate_reset() if (config.usealienwhitelist) load_alienwhitelist() if (config.usewhitelist) load_whitelist() LoadBansjob() src.update_status() - makepowernets() sun = new /datum/sun() @@ -196,4 +196,4 @@ /obj/effect/decal/point/point() set src in oview() set hidden = 1 - return + return \ No newline at end of file diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index c744d9fd1e3..42ae74c5cae 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -79,7 +79,7 @@ /obj/machinery/nuclearbomb/Topic(href, href_list) ..() - if (usr.stat || usr.restrained()) + if (!usr.canmove || usr.stat || usr.restrained()) return if (!ishuman(usr)) usr << "\red You don't have the dexterity to do this!" diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 20323f858ea..53365eea928 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -44,7 +44,7 @@ /obj/machinery/pipedispenser/Topic(href, href_list) if(..()) return - if(unwrenched) + if(unwrenched || !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) usr << browse(null, "window=pipedispenser") return usr.machine = src @@ -135,6 +135,9 @@ usr.machine = src src.add_fingerprint(usr) if(href_list["dmake"]) + if(unwrenched || !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + usr << browse(null, "window=pipedispenser") + return if(!wait) var/p_type = text2num(href_list["dmake"]) var/obj/structure/disposalconstruct/C = new (src.loc) diff --git a/code/game/objects/storage/backpack.dm b/code/game/objects/storage/backpack.dm index a6eb10e6fe7..7e5b3ff895f 100644 --- a/code/game/objects/storage/backpack.dm +++ b/code/game/objects/storage/backpack.dm @@ -47,6 +47,7 @@ return /* Remove these comments to re-enable BoH BoH Singuloths.-Hawk. if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail) + investigate_log("has become a singularity. Caused by [user.key]","singulo") user << "\red The Bluespace interfaces of the two devices catastrophically malfunction!" del(W) var/obj/machinery/singularity/singulo = new /obj/machinery/singularity (get_turf(src)) diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm new file mode 100644 index 00000000000..4f2956cf9bf --- /dev/null +++ b/code/modules/admin/admin_investigate.dm @@ -0,0 +1,43 @@ +//By Carnwennan + +//This system was made as an alternative to all the in-game lists and variables used to log stuff in-game. +//lists and variables are great. However, they have several major flaws: +//Firstly, they use memory. TGstation has one of the highest memory usage of all the ss13 branches. +//Secondly, they are usually stored in an object. This means that they aren't centralised. It also means that +//the data is lost when the object is deleted! This is especially annoying for things like the singulo engine! +#define INVESTIGATE_DIR "data/investigate/" + +//SYSTEM +/proc/investigate_subject2file(var/subject) + switch(subject) + if("singulo") + return file("[INVESTIGATE_DIR]singulo.html") + if("silicon") + return file("[INVESTIGATE_DIR]silicon.html") + else + return + +/proc/investigate_reset() + if(fdel(INVESTIGATE_DIR)) return 1 + return 0 + +/atom/proc/investigate_log(var/message, var/subject) + if(!message) return + var/F = investigate_subject2file(subject) + if(!F) return + F << "[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z]) || [src] [message]
" + + + +//ADMINVERBS +/client/proc/investigate_show( subject in list("singulo","silicon") ) + set name = "Investigate" + set category = "Admin" + if(!holder) return + var/F = investigate_subject2file(subject) + if(!F) + src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." + return + src << browse(F,"window=investigate;size=800x300") + + diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 733d6c1bccf..bc32786d082 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -105,6 +105,7 @@ //Admin Observer if (holder.level >= -1) + verbs += /client/proc/investigate_show verbs += /client/proc/cmd_admin_say verbs += /client/proc/cmd_admin_gib_self verbs += /client/proc/deadmin_self @@ -423,10 +424,11 @@ verbs -= /client/proc/deadmin_self verbs -= /client/proc/jumptocoord verbs -= /client/proc/everyone_random - verbs -= /client/proc/giveruntimelog //used by coders to retrieve runtime logs + verbs -= /client/proc/giveruntimelog //used by coders to retrieve runtime logs verbs -= /client/proc/getserverlog verbs -= /client/proc/cinematic //show a cinematic sequence verbs -= /client/proc/admin_memo + verbs -= /client/proc/investigate_show verbs -= /client/proc/cmd_admin_change_custom_event verbs -= /client/proc/admin_invis verbs -= /client/proc/callprocgen diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 8a4514cfee7..a00d1940f41 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -9,16 +9,16 @@ directwired = 1 req_access = list(access_engine) // use_power = 0 - var - obj/item/weapon/tank/plasma/P = null - last_power = 0 - active = 0 - locked = 0 - drainratio = 1 + var/obj/item/weapon/tank/plasma/P = null + var/last_power = 0 + var/active = 0 + var/locked = 0 + var/drainratio = 1 process() if(P) if(P.air_contents.toxins <= 0) + investigate_log("out of fuel.","singulo") P.air_contents.toxins = 0 eject() else @@ -32,6 +32,7 @@ toggle_power() user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \ "You turn the [src.name] [active? "on":"off"].") + investigate_log("turned [active?"on":"off"] by [user.key]. [P?"Fuel: [round(P.air_contents.toxins/0.29)]%":"It is empty"].","singulo") return else user << "\red The controls are locked!" @@ -96,48 +97,47 @@ return ..() - proc - eject() - var/obj/item/weapon/tank/plasma/Z = src.P - if (!Z) - return - Z.loc = get_turf(src) - Z.layer = initial(Z.layer) - src.P = null - if(active) - toggle_power() - else - updateicon() - - receive_pulse(var/pulse_strength) - if(P && active) - var/power_produced = 0 - power_produced = P.air_contents.toxins*pulse_strength*20 - add_avail(power_produced) - last_power = power_produced - return + proc/eject() + locked = 0 + var/obj/item/weapon/tank/plasma/Z = src.P + if (!Z) return - - - updateicon() - overlays = null - if(P) - overlays += image('singularity.dmi', "ptank") - if(stat & (NOPOWER|BROKEN)) - return - if(active) - overlays += image('singularity.dmi', "on") - - - toggle_power() - active = !active - if(active) - icon_state = "ca_on" - flick("ca_active", src) - - else - icon_state = "ca" - flick("ca_deactive", src) + Z.loc = get_turf(src) + Z.layer = initial(Z.layer) + src.P = null + if(active) + toggle_power() + else updateicon() - return + + proc/receive_pulse(var/pulse_strength) + if(P && active) + var/power_produced = 0 + power_produced = P.air_contents.toxins*pulse_strength*20 + add_avail(power_produced) + last_power = power_produced + return + return + + + proc/updateicon() + overlays = null + if(P) + overlays += image('singularity.dmi', "ptank") + if(stat & (NOPOWER|BROKEN)) + return + if(active) + overlays += image('singularity.dmi', "on") + + + proc/toggle_power() + active = !active + if(active) + icon_state = "ca_on" + flick("ca_active", src) + else + icon_state = "ca" + flick("ca_deactive", src) + updateicon() + return diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index e8ce8d4a364..cb11bdeb6b5 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -11,16 +11,15 @@ idle_power_usage = 10 active_power_usage = 300 - var - frequency = 1 - active = 0 - fire_delay = 100 - last_shot = 0 - shot_number = 0 - state = 0 - locked = 0 - energy = 0 - mega_energy = 0 + var/frequency = 1 + var/active = 0 + var/fire_delay = 100 + var/last_shot = 0 + var/shot_number = 0 + var/state = 0 + var/locked = 0 + var/energy = 0 + var/mega_energy = 0 verb/rotate() @@ -39,6 +38,9 @@ ..() return + Del() + investigate_log("deleted at ([x],[y],[z])","singulo") + ..() update_icon() if (active && !(stat & (NOPOWER|BROKEN))) @@ -55,12 +57,14 @@ src.active = 0 user << "You turn off the [src]." src.use_power = 1 + investigate_log("turned off by [user.key]","singulo") else src.active = 1 user << "You turn on the [src]." src.shot_number = 0 src.fire_delay = 100 src.use_power = 2 + investigate_log("turned on by [user.key]","singulo") update_icon() else user << "\red The controls are locked!" @@ -207,4 +211,4 @@ power_change() ..() update_icon() - return \ No newline at end of file + return diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index ccefe0cf57a..39ef5212feb 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -20,17 +20,16 @@ field_generator power level display anchored = 0 density = 1 use_power = 0 - var - const/num_power_levels = 6 // Total number of power level icon has - Varedit_start = 0 - Varpower = 0 - active = 0 - power = 20 // Current amount of power - state = 0 - warming_up = 0 - list/obj/machinery/containment_field/fields - list/obj/machinery/field_generator/connected_gens - clean_up = 0 + var/const/num_power_levels = 6 // Total number of power level icon has + var/Varedit_start = 0 + var/Varpower = 0 + var/active = 0 + var/power = 20 // Current amount of power + var/state = 0 + var/warming_up = 0 + var/list/obj/machinery/containment_field/fields + var/list/obj/machinery/field_generator/connected_gens + var/clean_up = 0 update_icon() @@ -87,6 +86,8 @@ field_generator power level display "You turn on the [src.name].", \ "You hear heavy droning") turn_on() + investigate_log("activated by [user.key].","singulo") + src.add_fingerprint(user) else user << "The [src] needs to be firmly secured to the floor first." @@ -214,6 +215,7 @@ field_generator power level display for(var/mob/M in viewers(src)) M.show_message("\red The [src.name] shuts down!") turn_off() + investigate_log("ran out of power and deactivated","singulo") src.power = 0 return 0 diff --git a/code/modules/power/singularity/investigate.dm b/code/modules/power/singularity/investigate.dm new file mode 100644 index 00000000000..6389f10707c --- /dev/null +++ b/code/modules/power/singularity/investigate.dm @@ -0,0 +1,4 @@ +/area/engine/engineering/poweralert(var/state, var/source) + if (state != poweralm) + investigate_log("has a power alarm!","singulo") + ..() \ No newline at end of file diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index ed1f0b3e193..fe50a6cec32 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -62,13 +62,12 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin icon_state = "none" anchored = 0 density = 1 - var - obj/machinery/particle_accelerator/control_box/master = null - construction_state = 0 - reference = null - powered = 0 - strength = null - desc_holder = null + var/obj/machinery/particle_accelerator/control_box/master = null + var/construction_state = 0 + var/reference = null + var/powered = 0 + var/strength = null + var/desc_holder = null end_cap name = "Alpha Particle Generation Array" @@ -151,6 +150,12 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin return + Move() + ..() + if(master && master.active) + master.toggle_power() + investigate_log("was moved whilst active; it powered down.","singulo") + ex_act(severity) switch(severity) if(1.0) @@ -181,9 +186,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin update_icon() switch(construction_state) - if(0) - icon_state="[reference]" - if(1) + if(0,1) icon_state="[reference]" if(2) icon_state="[reference]w" @@ -291,13 +294,12 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin use_power = 0 idle_power_usage = 0 active_power_usage = 0 - var - construction_state = 0 - active = 0 - reference = null - powered = null - strength = 0 - desc_holder = null + var/construction_state = 0 + var/active = 0 + var/reference = null + var/powered = null + var/strength = 0 + var/desc_holder = null verb/rotate() @@ -376,7 +378,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin del(src) return - proc update_state() return 0 @@ -440,4 +441,4 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin use_power = 1 update_icon() return 1 - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 758a27eb4ac..05db10ef9dc 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -11,10 +11,9 @@ active_power_usage = 10000 construction_state = 0 active = 0 - var - list/obj/structure/particle_accelerator/connected_parts - assembled = 0 - parts = null + var/list/obj/structure/particle_accelerator/connected_parts + var/assembled = 0 + var/parts = null New() @@ -48,7 +47,6 @@ if(use_power) icon_state = "[reference]p" else - icon_state = "[reference]c" switch(construction_state) if(0) icon_state = "[reference]" @@ -56,7 +54,7 @@ icon_state = "[reference]" if(2) icon_state = "[reference]w" - if(3) + else icon_state = "[reference]c" return @@ -78,34 +76,34 @@ return if(href_list["togglep"]) src.toggle_power() + investigate_log("turned [active?"ON":"OFF"] by [usr.key]","singulo") message_admins("[usr] toggled particle accelerator power to [active ? "on" : "off"].") log_admin("[usr] toggled particle accelerator power to [active ? "on" : "off"].") - if(href_list["scan"]) + else if(href_list["scan"]) src.part_scan() - if(href_list["strengthup"]) - src.strength++ + else if(href_list["strengthup"]) + strength++ + if(strength > 2) + strength = 2 + else + investigate_log("increased to [strength] by [usr.key]","singulo") + message_admins("[usr] increased particle accelerator power to [strength].") + log_admin("[usr] increased particle accelerator power to [strength].") for(var/obj/structure/particle_accelerator/part in connected_parts) - part.strength++ + part.strength = strength part.update_icon() - if(src.strength > 2) - src.strength = 2 - for(var/obj/structure/particle_accelerator/part in connected_parts) - part.strength = 2 - part.update_icon() - message_admins("[usr] increased particle accelerator power to [strength].") - log_admin("[usr] increased particle accelerator power to [strength].") - if(href_list["strengthdown"]) - src.strength-- + + else if(href_list["strengthdown"]) + strength-- + if(strength < 0) + strength = 0 + else + message_admins("[usr] decreased particle accelerator power to [strength].") + log_admin("[usr] decreased particle accelerator power to [strength].") + investigate_log("decreased to [strength] by [usr.key]","singulo") for(var/obj/structure/particle_accelerator/part in connected_parts) - part.strength-- + part.strength = strength part.update_icon() - if(src.strength < 0) - src.strength = 0 - for(var/obj/structure/particle_accelerator/part in connected_parts) - part.strength = 0 - part.update_icon() - message_admins("[usr] decreased particle accelerator power to [strength].") - log_admin("[usr] decreased particle accelerator power to [strength].") src.updateDialog() src.update_icon() return @@ -123,14 +121,15 @@ process() if(src.active) + //a part is missing! + if( length(connected_parts) < 6 ) + investigate_log("lost a connected part; It powered down.","singulo") + src.toggle_power() + return + //emit some particles for(var/obj/structure/particle_accelerator/particle_emitter/PE in connected_parts) if(PE) PE.emit_particle(src.strength) -// for(var/obj/structure/particle_accelerator/fuel_chamber/PF in connected_parts) -// PF.doshit() -// for(var/obj/structure/particle_accelerator/power_box/PB in connected_parts) -// PB.doshit() - //finish up putting the fuel run and power use things in here return diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 668b969d3f2..4c57ccfec07 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -15,23 +15,22 @@ var/global/list/uneatable = list( layer = 6 unacidable = 1 //Don't comment this out. use_power = 0 - var - current_size = 1 - allowed_size = 1 - contained = 1 //Are we going to move around? - energy = 100 //How strong are we? - dissipate = 1 //Do we lose energy over time? - dissipate_delay = 10 - dissipate_track = 0 - dissipate_strength = 1 //How much energy do we lose? - move_self = 1 //Do we move on our own? - grav_pull = 4 //How many tiles out do we pull? - consume_range = 0 //How many tiles out do we eat - event_chance = 15 //Prob for event each tick - target = null //its target. moves towards the target if it has one - last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing - teleport_del = 0 - last_warning + var/current_size = 1 + var/allowed_size = 1 + var/contained = 1 //Are we going to move around? + var/energy = 100 //How strong are we? + var/dissipate = 1 //Do we lose energy over time? + var/dissipate_delay = 10 + var/dissipate_track = 0 + var/dissipate_strength = 1 //How much energy do we lose? + var/move_self = 1 //Do we move on our own? + var/grav_pull = 4 //How many tiles out do we pull? + var/consume_range = 0 //How many tiles out do we eat + var/event_chance = 15 //Prob for event each tick + var/target = null //its target. moves towards the target if it has one + var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing + var/teleport_del = 0 + var/last_warning New(loc, var/starting_energy = 50, var/temp = 0) //CARN: admin-alert for chuckle-fuckery. @@ -41,6 +40,7 @@ var/global/list/uneatable = list( count = 1 break if(!count) message_admins("A singulo has been created without containment fields active ([x],[y],[z])",1) + investigate_log("was created. [count?"":"No containment fields were active"]","singulo") src.energy = starting_energy if(temp) @@ -93,17 +93,16 @@ var/global/list/uneatable = list( process() - spawn(0) - eat() - dissipate() - check_energy() - if(current_size >= 3) - move() - if(current_size <= 7) - pulse() - if(current_size >= 5) - if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit - event() + eat() + dissipate() + check_energy() + if(current_size >= 3) + move() + if(current_size <= 7) + pulse() + if(current_size >= 5) + if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit + event() return @@ -183,6 +182,7 @@ var/global/list/uneatable = list( consume_range = 4 dissipate = 0 //It cant go smaller due to e loss if(current_size == allowed_size) + investigate_log("grew to size [current_size]","singulo") return 1 else if(current_size < (--temp_allowed_size)) expand(temp_allowed_size) @@ -552,4 +552,4 @@ var/global/list/uneatable = list( consume(X) if(defer_powernet_rebuild != 2) defer_powernet_rebuild = 0 - return \ No newline at end of file + return diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index fa4b1988f3c..6e4ffec7ed1 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -294,7 +294,7 @@ output += d output = max(0, min(SMESMAXOUTPUT, output)) // clamp to range - + investigate_log("input/output; [chargelevel>output?"":""][chargelevel]/[output] | Output-mode: [online?"on":"off"] | Input-mode: [chargemode?"auto":"off"] by [usr.key]","singulo") src.updateUsrDialog() else diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index a309ea13b39..3fac4a86564 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -32,18 +32,17 @@ won't update every console in existence) but it's more of a hassle to do. Also, /obj/machinery/computer/rdconsole name = "R&D Console" icon_state = "rdcomp" - var - datum/research/files //Stores all the collected research data. - obj/item/weapon/disk/tech_disk/t_disk = null //Stores the technology disk. - obj/item/weapon/disk/design_disk/d_disk = null //Stores the design disk. + var/datum/research/files //Stores all the collected research data. + var/obj/item/weapon/disk/tech_disk/t_disk = null //Stores the technology disk. + var/obj/item/weapon/disk/design_disk/d_disk = null //Stores the design disk. - obj/machinery/r_n_d/destructive_analyzer/linked_destroy = null //Linked Destructive Analyzer - obj/machinery/r_n_d/protolathe/linked_lathe = null //Linked Protolathe - obj/machinery/r_n_d/circuit_imprinter/linked_imprinter = null //Linked Circuit Imprinter + var/obj/machinery/r_n_d/destructive_analyzer/linked_destroy = null //Linked Destructive Analyzer + var/obj/machinery/r_n_d/protolathe/linked_lathe = null //Linked Protolathe + var/obj/machinery/r_n_d/circuit_imprinter/linked_imprinter = null //Linked Circuit Imprinter - screen = 1.0 //Which screen is currently showing. - id = 0 //ID of the computer (for server restrictions). - sync = 1 //If sync = 0, it doesn't show up on Server Control Console + var/screen = 1.0 //Which screen is currently showing. + var/id = 0 //ID of the computer (for server restrictions). + var/sync = 1 //If sync = 0, it doesn't show up on Server Control Console req_access = list(access_tox) //Data and setting manipulation requires scientist access. @@ -351,6 +350,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, screen = 0.3 linked_lathe.busy = 1 flick("protolathe_n",linked_lathe) + var/key = usr.key //so we don't lose the info during the spawn delay spawn(16) use_power(power) spawn(16) @@ -379,6 +379,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(being_built.build_path) var/obj/new_item = new being_built.build_path(src) + if( new_item.type == /obj/item/weapon/storage/backpack/holding ) + new_item.investigate_log("built by [key]","singulo") new_item.reliability = being_built.reliability if(linked_lathe.hacked) being_built.reliability = max((reliability / 2), 0) if(being_built.locked) diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 7c834f10c98..79e2ea2368a 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ