From 0f1aa3c0cad76c049c0b67fc4d3cd54b8dfbd7a3 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Wed, 22 Jul 2020 10:49:56 +1000 Subject: [PATCH 01/84] 'lolman? did you test your code?' no i did not ms. kevinz --- code/__DEFINES/dcs/signals.dm | 1 + code/__DEFINES/plumbing.dm | 9 + code/__DEFINES/reagents.dm | 4 + code/controllers/subsystem/fluid.dm | 5 + code/datums/components/plumbing/_plumbing.dm | 215 ++++++++++ .../plumbing/chemical_acclimator.dm | 21 + code/datums/components/plumbing/filter.dm | 59 +++ .../components/plumbing/reaction_chamber.dm | 44 +++ code/datums/components/plumbing/splitter.dm | 45 +++ code/datums/ductnet.dm | 60 +++ code/game/machinery/_machinery.dm | 2 + code/game/objects/items/RCD.dm | 75 ++++ code/game/objects/items/RPD.dm | 69 +++- .../items/stacks/sheets/sheet_types.dm | 1 + code/game/objects/objs.dm | 3 + code/game/objects/structures/geyser.dm | 74 ++++ code/modules/asset_cache/asset_list_items.dm | 3 +- code/modules/plumbing/ducts.dm | 371 ++++++++++++++++++ .../plumbing/plumbers/_plumb_machinery.dm | 97 +++++ code/modules/plumbing/plumbers/acclimator.dm | 105 +++++ code/modules/plumbing/plumbers/bottler.dm | 79 ++++ code/modules/plumbing/plumbers/destroyer.dm | 21 + code/modules/plumbing/plumbers/fermenter.dm | 52 +++ code/modules/plumbing/plumbers/filter.dm | 74 ++++ .../plumbing/plumbers/grinder_chemical.dm | 58 +++ code/modules/plumbing/plumbers/pill_press.dm | 107 +++++ code/modules/plumbing/plumbers/pumps.dm | 83 ++++ .../plumbing/plumbers/reaction_chamber.dm | 63 +++ code/modules/plumbing/plumbers/splitters.dm | 50 +++ code/modules/plumbing/plumbers/synthesizer.dm | 111 ++++++ code/modules/reagents/chemistry/holder.dm | 6 + code/modules/reagents/chemistry/reagents.dm | 2 +- code/modules/reagents/reagent_dispenser.dm | 37 +- .../research/designs/medical_designs.dm | 155 ++++++++ .../research/techweb/nodes/medical_nodes.dm | 17 + icons/obj/watercloset.dmi | Bin 23715 -> 16012 bytes 36 files changed, 2171 insertions(+), 7 deletions(-) create mode 100644 code/__DEFINES/plumbing.dm create mode 100644 code/controllers/subsystem/fluid.dm create mode 100644 code/datums/components/plumbing/_plumbing.dm create mode 100644 code/datums/components/plumbing/chemical_acclimator.dm create mode 100644 code/datums/components/plumbing/filter.dm create mode 100644 code/datums/components/plumbing/reaction_chamber.dm create mode 100644 code/datums/components/plumbing/splitter.dm create mode 100644 code/datums/ductnet.dm create mode 100644 code/game/objects/structures/geyser.dm create mode 100644 code/modules/plumbing/ducts.dm create mode 100644 code/modules/plumbing/plumbers/_plumb_machinery.dm create mode 100644 code/modules/plumbing/plumbers/acclimator.dm create mode 100644 code/modules/plumbing/plumbers/bottler.dm create mode 100644 code/modules/plumbing/plumbers/destroyer.dm create mode 100644 code/modules/plumbing/plumbers/fermenter.dm create mode 100644 code/modules/plumbing/plumbers/filter.dm create mode 100644 code/modules/plumbing/plumbers/grinder_chemical.dm create mode 100644 code/modules/plumbing/plumbers/pill_press.dm create mode 100644 code/modules/plumbing/plumbers/pumps.dm create mode 100644 code/modules/plumbing/plumbers/reaction_chamber.dm create mode 100644 code/modules/plumbing/plumbers/splitters.dm create mode 100644 code/modules/plumbing/plumbers/synthesizer.dm diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 1882effe38..cfd1906e82 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -270,6 +270,7 @@ #define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled) #define COMSIG_OBJ_BREAK "obj_break" //from base of /obj/obj_break(): (damage_flag) #define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value) +#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench" //called exclusively in plumbing, for now #define COMSIG_OBJ_ATTACK_GENERIC "obj_attack_generic" //from base of atom/animal_attack(): (/mob/user) #define COMPONENT_STOP_GENERIC_ATTACK 1 diff --git a/code/__DEFINES/plumbing.dm b/code/__DEFINES/plumbing.dm new file mode 100644 index 0000000000..5ea7c46b42 --- /dev/null +++ b/code/__DEFINES/plumbing.dm @@ -0,0 +1,9 @@ +#define FIRST_DUCT_LAYER 1 +#define SECOND_DUCT_LAYER 2 +#define THIRD_DUCT_LAYER 4 +#define FOURTH_DUCT_LAYER 8 +#define FIFTH_DUCT_LAYER 16 + +#define DUCT_LAYER_DEFAULT THIRD_DUCT_LAYER + +#define MACHINE_REAGENT_TRANSFER 10 diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index f4beef7ee8..44e97ef345 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -57,6 +57,10 @@ #define ADD_REAGENT 2 // reagent added #define REM_REAGENT 3 // reagent removed (may still exist) + +#define PILL_STYLE_COUNT 22 //Update this if you add more pill icons or you die (literally, we'll toss a nuke at whever your ip turns up) +#define RANDOM_PILL_STYLE 22 //Dont change this one though + #define THRESHOLD_UNHUSK 50 // health threshold for synthflesh/rezadone to unhusk someone //reagent bitflags, used for altering how they works diff --git a/code/controllers/subsystem/fluid.dm b/code/controllers/subsystem/fluid.dm new file mode 100644 index 0000000000..c4fa13d693 --- /dev/null +++ b/code/controllers/subsystem/fluid.dm @@ -0,0 +1,5 @@ +PROCESSING_SUBSYSTEM_DEF(fluids) + name = "Fluids" + wait = 20 + stat_tag = "FD" //its actually Fluid Ducts + flags = SS_NO_INIT | SS_TICKER diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm new file mode 100644 index 0000000000..22b8bafde5 --- /dev/null +++ b/code/datums/components/plumbing/_plumbing.dm @@ -0,0 +1,215 @@ +/datum/component/plumbing + ///Index with "1" = /datum/ductnet/theductpointingnorth etc. "1" being the num2text from NORTH define + var/list/datum/ductnet/ducts = list() + ///shortcut to our parents' reagent holder + var/datum/reagents/reagents + ///TRUE if we wanna add proper pipe outless under our parent object. this is pretty good if i may so so myself + var/use_overlays = TRUE + ///We can't just cut all of the parents' overlays, so we'll track them here + var/list/image/ducterlays + ///directions in wich we act as a supplier + var/supply_connects + ///direction in wich we act as a demander + var/demand_connects + ///FALSE to pretty much just not exist in the plumbing world so we can be moved, TRUE to go plumbo mode + var/active = FALSE + ///if TRUE connects will spin with the parent object visually and codually, so you can have it work in any direction. FALSE if you want it to be static + var/turn_connects = TRUE + +/datum/component/plumbing/Initialize(start=TRUE, _turn_connects=TRUE) //turn_connects for wheter or not we spin with the object to change our pipes + if(parent && !ismovableatom(parent)) + return COMPONENT_INCOMPATIBLE + var/atom/movable/AM = parent + if(!AM.reagents) + return COMPONENT_INCOMPATIBLE + reagents = AM.reagents + turn_connects = _turn_connects + + RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED,COMSIG_PARENT_PREQDELETED), .proc/disable) + RegisterSignal(parent, list(COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH), .proc/toggle_active) + + if(start) + enable() + + if(use_overlays) + create_overlays() + +/datum/component/plumbing/process() + if(!demand_connects || !reagents) + STOP_PROCESSING(SSfluids, src) + return + if(reagents.total_volume < reagents.maximum_volume) + for(var/D in GLOB.cardinals) + if(D & demand_connects) + send_request(D) +///Can we be added to the ductnet? +/datum/component/plumbing/proc/can_add(datum/ductnet/D, dir) + if(!active) + return + if(!dir || !D) + return FALSE + if(num2text(dir) in ducts) + return FALSE + + return TRUE +///called from in process(). only calls process_request(), but can be overwritten for children with special behaviour +/datum/component/plumbing/proc/send_request(dir) + process_request(amount = MACHINE_REAGENT_TRANSFER, reagent = null, dir = dir) +///check who can give us what we want, and how many each of them will give us +/datum/component/plumbing/proc/process_request(amount, reagent, dir) + var/list/valid_suppliers = list() + var/datum/ductnet/net + if(!ducts.Find(num2text(dir))) + return + net = ducts[num2text(dir)] + for(var/A in net.suppliers) + var/datum/component/plumbing/supplier = A + if(supplier.can_give(amount, reagent, net)) + valid_suppliers += supplier + for(var/A in valid_suppliers) + var/datum/component/plumbing/give = A + give.transfer_to(src, amount / valid_suppliers.len, reagent, net) +///returns TRUE when they can give the specified amount and reagent. called by process request +/datum/component/plumbing/proc/can_give(amount, reagent, datum/ductnet/net) + if(amount <= 0) + return + + if(reagent) //only asked for one type of reagent + for(var/A in reagents.reagent_list) + var/datum/reagent/R = A + if(R.id == reagent) + return TRUE + else if(reagents.total_volume > 0) //take whatever + return TRUE +///this is where the reagent is actually transferred and is thus the finish point of our process() +/datum/component/plumbing/proc/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) + if(!reagents || !target || !target.reagents) + return FALSE + if(reagent) + reagents.trans_id_to(target.parent, reagent, amount) + else + reagents.trans_to(target.parent, amount) +///We create our luxurious piping overlays/underlays, to indicate where we do what. only called once if use_overlays = TRUE in Initialize() +/datum/component/plumbing/proc/create_overlays() + var/atom/movable/AM = parent + for(var/image/I in ducterlays) + AM.overlays.Remove(I) + qdel(I) + ducterlays = list() + for(var/D in GLOB.cardinals) + var/color + var/direction + if(D & demand_connects) + color = "red" //red because red is mean and it takes + else if(D & supply_connects) + color = "blue" //blue is nice and gives + else + continue + var/image/I + if(turn_connects) + switch(D) + if(NORTH) + direction = "north" + if(SOUTH) + direction = "south" + if(EAST) + direction = "east" + if(WEST) + direction = "west" + I = image('icons/obj/plumbing/plumbers.dmi', "[direction]-[color]", layer = AM.layer - 1) + else + I = image('icons/obj/plumbing/plumbers.dmi', color, layer = AM.layer - 1) //color is not color as in the var, it's just the name + I.dir = D + AM.add_overlay(I) + ducterlays += I +///we stop acting like a plumbing thing and disconnect if we are, so we can safely be moved and stuff +/datum/component/plumbing/proc/disable() + if(!active) + return + STOP_PROCESSING(SSfluids, src) + for(var/A in ducts) + var/datum/ductnet/D = ducts[A] + D.remove_plumber(src) + active = FALSE + for(var/D in GLOB.cardinals) + if(D & (demand_connects | supply_connects)) + for(var/obj/machinery/duct/duct in get_step(parent, D)) + duct.attempt_connect() + +///settle wherever we are, and start behaving like a piece of plumbing +/datum/component/plumbing/proc/enable() + if(active) + return + update_dir() + active = TRUE + var/atom/movable/AM = parent + for(var/obj/machinery/duct/D in AM.loc) //Destroy any ducts under us. Ducts also self destruct if placed under a plumbing machine. machines disable when they get moved + if(D.anchored) //that should cover everything + D.disconnect_duct() + + if(demand_connects) + START_PROCESSING(SSfluids, src) + + for(var/D in GLOB.cardinals) + if(D & (demand_connects | supply_connects)) + for(var/atom/movable/A in get_step(parent, D)) + if(istype(A, /obj/machinery/duct)) + var/obj/machinery/duct/duct = A + duct.attempt_connect() + else + var/datum/component/plumbing/P = A.GetComponent(/datum/component/plumbing) + if(P) + direct_connect(P, D) + +/// Toggle our machinery on or off. This is called by a hook from default_unfasten_wrench with anchored as only param, so we dont have to copypaste this on every object that can move +/datum/component/plumbing/proc/toggle_active(obj/O, new_state) + if(new_state) + enable() + else + disable() +/** We update our connects only when we settle down by taking our current and original direction to find our new connects +* If someone wants it to fucking spin while connected to something go actually knock yourself out +*/ +/datum/component/plumbing/proc/update_dir() + if(!turn_connects) + return + var/atom/movable/AM = parent + var/new_demand_connects + var/new_supply_connects + var/new_dir = AM.dir + var/angle = 180 - dir2angle(new_dir) + if(new_dir == SOUTH) + demand_connects = initial(demand_connects) + supply_connects = initial(supply_connects) + else + for(var/D in GLOB.cardinals) + if(D & initial(demand_connects)) + new_demand_connects += turn(D, angle) + if(D & initial(supply_connects)) + new_supply_connects += turn(D, angle) + demand_connects = new_demand_connects + supply_connects = new_supply_connects +///Give the direction of a pipe, and it'll return wich direction it originally was when it's object pointed SOUTH +/datum/component/plumbing/proc/get_original_direction(dir) + var/atom/movable/AM = parent + return turn(dir, dir2angle(AM.dir) - 180) +//special case in-case we want to connect directly with another machine without a duct +/datum/component/plumbing/proc/direct_connect(datum/component/plumbing/P, dir) + if(!P.active) + return + var/opposite_dir = turn(dir, 180) + if(P.demand_connects & opposite_dir && supply_connects & dir || P.supply_connects & opposite_dir && demand_connects & dir) //make sure we arent connecting two supplies or demands + var/datum/ductnet/net = new() + net.add_plumber(src, dir) + net.add_plumber(P, opposite_dir) + +///has one pipe input that only takes, example is manual output pipe +/datum/component/plumbing/simple_demand + demand_connects = NORTH +///has one pipe output that only supplies. example is liquid pump and manual input pipe +/datum/component/plumbing/simple_supply + supply_connects = NORTH +///input and output, like a holding tank +/datum/component/plumbing/tank + demand_connects = WEST + supply_connects = EAST diff --git a/code/datums/components/plumbing/chemical_acclimator.dm b/code/datums/components/plumbing/chemical_acclimator.dm new file mode 100644 index 0000000000..44a1396c6d --- /dev/null +++ b/code/datums/components/plumbing/chemical_acclimator.dm @@ -0,0 +1,21 @@ +v/datum/component/plumbing/acclimator + demand_connects = WEST + supply_connects = EAST + var/obj/machinery/plumbing/acclimator/AC + +/datum/component/plumbing/acclimator/Initialize(start=TRUE, _turn_connects=TRUE) + . = ..() + if(!istype(parent, /obj/machinery/plumbing/acclimator)) + return COMPONENT_INCOMPATIBLE + AC = parent + +/datum/component/plumbing/acclimator/can_give(amount, reagent) + . = ..() + if(. && AC.emptying) + return TRUE + return FALSE +///We're overriding process and not send_request, because all process does is do the requests, so we might aswell cut out the middle man and save some code from running +/datum/component/plumbing/acclimator/process() + if(AC.emptying) + return + . = ..() diff --git a/code/datums/components/plumbing/filter.dm b/code/datums/components/plumbing/filter.dm new file mode 100644 index 0000000000..cfbfb641da --- /dev/null +++ b/code/datums/components/plumbing/filter.dm @@ -0,0 +1,59 @@ +///The magical plumbing component used by the chemical filters. The different supply connects behave differently depending on the filters set on the chemical filter +/datum/component/plumbing/filter + demand_connects = NORTH + supply_connects = SOUTH | EAST | WEST //SOUTH is straight, EAST is left and WEST is right. We look from the perspective of the insert + +/datum/component/plumbing/filter/Initialize() + . = ..() + if(!istype(parent, /obj/machinery/plumbing/filter)) + return COMPONENT_INCOMPATIBLE + +/datum/component/plumbing/filter/can_give(amount, reagent, datum/ductnet/net) + . = ..() + if(.) + var/direction + for(var/A in ducts) + if(ducts[A] == net) + direction = get_original_direction(text2num(A)) //we need it relative to the direction, so filters don't change when we turn the filter + break + if(!direction) + return FALSE + if(reagent) + if(!can_give_in_direction(direction, reagent)) + return FALSE + +/datum/component/plumbing/filter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) + if(!reagents || !target || !target.reagents) + return FALSE + var/direction + for(var/A in ducts) + if(ducts[A] == net) + direction = get_original_direction(text2num(A)) + break + if(reagent) + reagents.trans_id_to(target.parent, reagent, amount) + else + for(var/A in reagents.reagent_list) + var/datum/reagent/R = A + if(!can_give_in_direction(direction, R.id)) + continue + var/new_amount + if(R.volume < amount) + new_amount = amount - R.volume + reagents.trans_id_to(target.parent, R.id, amount) + amount = new_amount + if(amount <= 0) + break +///We check if the direction and reagent are valid to give. Needed for filters since different outputs have different behaviours +/datum/component/plumbing/filter/proc/can_give_in_direction(dir, reagent) + var/obj/machinery/plumbing/filter/F = parent + switch(dir) + if(SOUTH) //straight + if(!F.left.Find(reagent) && !F.right.Find(reagent)) + return TRUE + if(WEST) //right + if(F.right.Find(reagent)) + return TRUE + if(EAST) //left + if(F.left.Find(reagent)) + return TRUE diff --git a/code/datums/components/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm new file mode 100644 index 0000000000..d0a9416e34 --- /dev/null +++ b/code/datums/components/plumbing/reaction_chamber.dm @@ -0,0 +1,44 @@ +/datum/component/plumbing/reaction_chamber + demand_connects = WEST + supply_connects = EAST + +/datum/component/plumbing/reaction_chamber/Initialize(start=TRUE, _turn_connects=TRUE) + . = ..() + if(!istype(parent, /obj/machinery/plumbing/reaction_chamber)) + return COMPONENT_INCOMPATIBLE + +/datum/component/plumbing/reaction_chamber/can_give(amount, reagent) + . = ..() + var/obj/machinery/plumbing/reaction_chamber/RC = parent + if(!. || !RC.emptying) + return FALSE + +/datum/component/plumbing/reaction_chamber/send_request(dir) + var/obj/machinery/plumbing/reaction_chamber/RC = parent + if(RC.emptying || !LAZYLEN(RC.required_reagents)) + return + for(var/RTid in RC.required_reagents) + var/has_reagent = FALSE + for(var/A in reagents.reagent_list) + var/datum/reagent/RD = A + if(RTid == RD.id) + has_reagent = TRUE + if(RD.volume < RC.required_reagents[RTid]) + process_request(min(RC.required_reagents[RTid] - RD.volume, MACHINE_REAGENT_TRANSFER) , RTid, dir) + return + if(!has_reagent) + process_request(min(RC.required_reagents[RTid], MACHINE_REAGENT_TRANSFER), RTid, dir) + return + + RC.reagent_flags &= ~NO_REACT + reagents.handle_reactions() + Add when everything works: + if(reagents.fermiIsReacting) + return + RC.emptying = TRUE + +/datum/component/plumbing/reaction_chamber/can_give(amount, reagent, datum/ductnet/net) + . = ..() + var/obj/machinery/plumbing/reaction_chamber/RC = parent + if(!. || !RC.emptying) + return FALSE diff --git a/code/datums/components/plumbing/splitter.dm b/code/datums/components/plumbing/splitter.dm new file mode 100644 index 0000000000..7194e8803b --- /dev/null +++ b/code/datums/components/plumbing/splitter.dm @@ -0,0 +1,45 @@ +/datum/component/plumbing/splitter + demand_connects = NORTH + supply_connects = SOUTH | EAST + +/datum/component/plumbing/splitter/Initialize() + . = ..() + if(. && !istype(parent, /obj/machinery/plumbing/splitter)) + return FALSE + +/datum/component/plumbing/splitter/can_give(amount, reagent, datum/ductnet/net) + . = ..() + if(!.) + return + . = FALSE + var/direction + for(var/A in ducts) + if(ducts[A] == net) + direction = get_original_direction(text2num(A)) + break + var/obj/machinery/plumbing/splitter/S = parent + switch(direction) + if(SOUTH) + if(S.turn_straight && S.transfer_straight <= amount) + S.turn_straight = FALSE + return TRUE + if(EAST) + if(!S.turn_straight && S.transfer_side <= amount) + S.turn_straight = TRUE + return TRUE + +/datum/component/plumbing/splitter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) + var/direction + for(var/A in ducts) + if(ducts[A] == net) + direction = get_original_direction(text2num(A)) + break + var/obj/machinery/plumbing/splitter/S = parent + switch(direction) + if(SOUTH) + if(amount >= S.transfer_straight) + amount = S.transfer_straight + if(EAST) + if(amount >= S.transfer_side) + amount = S.transfer_side + . = ..() diff --git a/code/datums/ductnet.dm b/code/datums/ductnet.dm new file mode 100644 index 0000000000..f81e9e608c --- /dev/null +++ b/code/datums/ductnet.dm @@ -0,0 +1,60 @@ +/datum/ductnet + var/list/suppliers = list() + var/list/demanders = list() + var/list/obj/machinery/duct/ducts = list() + + var/capacity + +/datum/ductnet/proc/add_duct(obj/machinery/duct/D) + if(!D || D in ducts) + return + ducts += D + D.duct = src + +/datum/ductnet/proc/remove_duct(obj/machinery/duct/ducting) + destroy_network(FALSE) + for(var/A in ducting.neighbours) + var/obj/machinery/duct/D = A + D.attempt_connect() //we destroyed the network, so now we tell the disconnected ducts neighbours they can start making a new ductnet + qdel(src) + +/datum/ductnet/proc/add_plumber(datum/component/plumbing/P, dir) + if(!P.can_add(src, dir)) + return + P.ducts[num2text(dir)] = src + if(dir & P.supply_connects) + suppliers += P + else if(dir & P.demand_connects) + demanders += P + +/datum/ductnet/proc/remove_plumber(datum/component/plumbing/P) + suppliers.Remove(P) //we're probably only in one of these, but Remove() is inherently sane so this is fine + demanders.Remove(P) + + for(var/dir in P.ducts) + if(P.ducts[dir] == src) + P.ducts -= dir + +/datum/ductnet/proc/assimilate(datum/ductnet/D) + ducts.Add(D.ducts) + suppliers.Add(D.suppliers) + demanders.Add(D.demanders) + for(var/A in D.suppliers + D.demanders) + var/datum/component/plumbing/P = A + for(var/s in P.ducts) + if(P.ducts[s] != D) + continue + P.ducts[s] = src //all your ducts are belong to us + for(var/A in D.ducts) + var/obj/machinery/duct/M = A + M.duct = src //forget your old master + qdel(D) + +/datum/ductnet/proc/destroy_network(delete=TRUE) + for(var/A in suppliers + demanders) + remove_plumber(A) + for(var/A in ducts) + var/obj/machinery/duct/D = A + D.duct = null + if(delete) //I don't want code to run with qdeleted objects because that can never be good, so keep this in-case the ductnet has some business left to attend to before commiting suicide + qdel(src) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 6ef13ac36f..2ed39a21a8 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -116,6 +116,7 @@ Class Procs: var/new_occupant_dir = SOUTH //The direction the occupant will be set to look at when entering the machine. var/speed_process = FALSE // Process as fast as possible? var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created + var/wire_compatible = FALSE // For storing and overriding ui id and dimensions var/tgui_id // ID of TGUI interface var/ui_style // ID of custom TGUI style (optional) @@ -432,6 +433,7 @@ Class Procs: to_chat(user, "You [anchored ? "un" : ""]secure [src].") setAnchored(!anchored) playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + SEND_SIGNAL(src, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, anchored) return SUCCESSFUL_UNFASTEN return FAILED_UNFASTEN return CANT_UNFASTEN diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 2fbb45173b..29a04237ea 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -856,6 +856,81 @@ RLD desc = "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells." upgrade = RCD_UPGRADE_SIMPLE_CIRCUITS +/obj/item/construction/plumbing + name = "Plumbing Constructor" + desc = "An expertly modified RCD outfitted to construct plumbing machinery. Reload with compressed matter cartridges." + icon_state = "arcd" + item_state = "oldrcd" + has_ammobar = FALSE + matter = 200 + max_matter = 200 + + ///type of the plumbing machine + var/blueprint = null + ///index, used in the attack self to get the type. stored here since it doesnt change + var/list/choices = list() + ///index, used in the attack self to get the type. stored here since it doesnt change + var/list/name_to_type = list() + /// + var/list/machinery_data = list("cost" = list(), "delay" = list()) + +/obj/item/construction/plumbing/attack_self(mob/user) + ..() + if(!choices.len) + for(var/A in subtypesof(/obj/machinery/plumbing)) + var/obj/machinery/plumbing/M = A + if(initial(M.rcd_constructable)) + choices += list(initial(M.name) = image(icon = initial(M.icon), icon_state = initial(M.icon_state))) + name_to_type[initial(M.name)] = M + machinery_data["cost"][A] = initial(M.rcd_cost) + machinery_data["delay"][A] = initial(M.rcd_delay) + + var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) + if(!check_menu(user)) + return + + blueprint = name_to_type[choice] + playsound(src, 'sound/effects/pop.ogg', 50, FALSE) + to_chat(user, "You change [name]s blueprint to '[choice]'.") + +///pretty much rcd_create, but named differently to make myself feel less bad for copypasting from a sibling-type +/obj/item/construction/plumbing/proc/create_machine(atom/A, mob/user) + if(!machinery_data || !isopenturf(A)) + return FALSE + + if(checkResource(machinery_data["cost"][blueprint], user) && blueprint) + if(do_after(user, machinery_data["delay"][blueprint], target = A)) + if(checkResource(machinery_data["cost"][blueprint], user) && canPlace(A)) + useResource(machinery_data["cost"][blueprint], user) + activate() + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + new blueprint (A, FALSE, FALSE) + return TRUE + +/obj/item/construction/plumbing/proc/canPlace(turf/T) + if(!isopenturf(T)) + return FALSE + . = TRUE + for(var/obj/O in T.contents) + if(O.density) //let's not built ontop of dense stuff, like big machines and other obstacles, it kills my immershion + return FALSE + +/obj/item/construction/plumbing/afterattack(atom/A, mob/user, proximity) + . = ..() + if(!prox_check(proximity)) + return + if(istype(A, /obj/machinery/plumbing)) + var/obj/machinery/plumbing/P = A + if(P.anchored) + to_chat(user, "The [P.name] needs to be unanchored!") + return + if(do_after(user, 20, target = P)) + P.deconstruct() //Let's not substract matter + playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) //this is just such a great sound effect + else + create_machine(A, user) + + #undef GLOW_MODE #undef LIGHT_MODE #undef REMOVE_MODE diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index 93d73b2b5f..2c8acf5a28 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -6,6 +6,7 @@ RPD #define ATMOS_CATEGORY 0 #define DISPOSALS_CATEGORY 1 #define TRANSIT_CATEGORY 2 +#define PLUMBING_CATEGORY 3 #define BUILD_MODE (1<<0) #define WRENCH_MODE (1<<1) @@ -75,6 +76,13 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( ) )) +GLOBAL_LIST_INIT(fluid_duct_recipes, list( + "Fluid Ducts" = list( + new /datum/pipe_info/plumbing("Duct", /obj/machinery/duct, PIPE_ONEDIR), + new /datum/pipe_info/plumbing/multilayer("Duct Layer-Manifold",/obj/machinery/duct/multilayered, PIPE_STRAIGHT) + ) +)) + /datum/pipe_info var/name var/icon_state @@ -175,6 +183,15 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( if(dt == PIPE_UNARY_FLIPPABLE) icon_state = "[icon_state]_preview" +/datum/pipe_info/plumbing/New(label, obj/path, dt=PIPE_UNARY) + name = label + id = path + icon_state = initial(path.icon_state) + dirtype = dt + +/datum/pipe_info/plumbing/multilayer //exists as identifier so we can see the difference between multi_layer and just ducts properly later on + + /obj/item/pipe_dispenser name = "Rapid Piping Device (RPD)" desc = "A device used to rapidly pipe things." @@ -200,15 +217,19 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( var/atmos_build_speed = 5 //deciseconds (500ms) var/disposal_build_speed = 5 var/transit_build_speed = 5 + var/plumbing_build_speed = 5 var/destroy_speed = 5 var/paint_speed = 5 var/category = ATMOS_CATEGORY var/piping_layer = PIPING_LAYER_DEFAULT + var/ducting_layer = DUCT_LAYER_DEFAULT var/datum/pipe_info/recipe var/static/datum/pipe_info/first_atmos var/static/datum/pipe_info/first_disposal var/static/datum/pipe_info/first_transit var/mode = BUILD_MODE | DESTROY_MODE | WRENCH_MODE + var/static/datum/pipe_info/first_plumbing + var/locked = FALSE //wheter we can change categories. Useful for the plumber /obj/item/pipe_dispenser/New() . = ..() @@ -256,11 +277,13 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( var/list/data = list( "category" = category, "piping_layer" = piping_layer, + "ducting_layer" = ducting_layer, "preview_rows" = recipe.get_preview(p_dir), "categories" = list(), "selected_color" = paint_color, "paint_colors" = GLOB.pipe_paint_colors, "mode" = mode + "locked" = locked ) var/list/recipes @@ -271,6 +294,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( recipes = GLOB.disposal_pipe_recipes if(TRANSIT_CATEGORY) recipes = GLOB.transit_tube_recipes + if(PLUMBING_CATEGORY) + recipes = GLOB.fluid_duct_recipes for(var/c in recipes) var/list/cat = recipes[c] var/list/r = list() @@ -299,6 +324,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( recipe = first_atmos if(TRANSIT_CATEGORY) recipe = first_transit + if(PLUMBING_CATEGORY) + recipe = first_plumbing p_dir = NORTH playeffect = FALSE if("piping_layer") @@ -469,16 +496,56 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( if(mode & WRENCH_MODE) tube.wrench_act(user, src) return - + if(PLUMBING_CATEGORY) //Plumbing. + if(!can_make_pipe) + return ..() + A = get_turf(A) + if(isclosedturf(A)) + to_chat(user, "[src]'s error light flickers; there's something in the way!") + return + to_chat(user, "You start building a fluid duct...") + playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) + if(do_after(user, plumbing_build_speed, target = A)) + var/obj/machinery/duct/D + if(recipe.type == /datum/pipe_info/plumbing/multilayer) + var/temp_connects = NORTH + SOUTH + if(queued_p_dir == EAST) + temp_connects = EAST + WEST + D = new queued_p_type (A, TRUE, GLOB.pipe_paint_colors[paint_color], ducting_layer, temp_connects) + else + D = new queued_p_type (A, TRUE, GLOB.pipe_paint_colors[paint_color], ducting_layer) + D.add_fingerprint(usr) + if(mode & WRENCH_MODE) + D.wrench_act(user, src) else return ..() /obj/item/pipe_dispenser/proc/activate() playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1) +/obj/item/pipe_dispenser/plumbing + name = "Plumberinator" + desc = "A crude device to rapidly plumb things." + icon_state = "plumberer" + category = PLUMBING_CATEGORY + locked = TRUE + +/obj/item/pipe_dispenser/plumbing/Initialize() + . = ..() + spark_system = new + spark_system.set_up(5, 0, src) + spark_system.attach(src) + if(!first_plumbing) + first_plumbing = GLOB.fluid_duct_recipes[GLOB.fluid_duct_recipes[1]][1] + + recipe = first_plumbing + + + #undef ATMOS_CATEGORY #undef DISPOSALS_CATEGORY #undef TRANSIT_CATEGORY +#undef PLUMBING_CATEGORY #undef BUILD_MODE #undef DESTROY_MODE diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 0383c3f1ee..4e5ffab1e0 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -773,6 +773,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list( new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \ new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \ new /datum/stack_recipe("shower curtain", /obj/structure/curtain, 10, time = 10, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("duct", /obj/item/stack/ducts,1), \ new /datum/stack_recipe("laser pointer case", /obj/item/glasswork/glass_base/laserpointer_shell, 30), \ new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2))) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index fb3b1535ed..85f0066e3f 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -324,3 +324,6 @@ . = ..() if(. && ricochet_damage_mod) take_damage(P.damage * ricochet_damage_mod, P.damage_type, P.flag, 0, turn(P.dir, 180), P.armour_penetration) // pass along ricochet_damage_mod damage to the structure for the ricochet + +/obj/proc/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) + return diff --git a/code/game/objects/structures/geyser.dm b/code/game/objects/structures/geyser.dm new file mode 100644 index 0000000000..1d77a3c4f8 --- /dev/null +++ b/code/game/objects/structures/geyser.dm @@ -0,0 +1,74 @@ +//If you look at the "geyser_soup" overlay icon_state, you'll see that the first frame has 25 ticks. +//That's because the first 18~ ticks are completely skipped for some ungodly weird fucking byond reason + +/obj/structure/geyser + name = "geyser" + icon = 'icons/obj/lavaland/terrain.dmi' + icon_state = "geyser" + anchored = TRUE + var/decay = 0 //reagents/tick removed + var/erupting_state = null //set to null to get it greyscaled from "[icon_state]_soup". Not very usable with the whole random thing, but more types can be added if you change the spawn prob + var/activated = FALSE //whether we are active and generating chems + var/reagent_id = "oil" + var/potency = 2 //how much reagents we add every process (2 seconds) + var/max_volume = 500 + var/start_volume = 50 + +/obj/structure/geyser/proc/start_chemming() + activated = TRUE + create_reagents(max_volume, DRAINABLE) + reagents.add_reagent(reagent_id, start_volume) + START_PROCESSING(SSfluids, src) //It's main function is to be plumbed, so use SSfluids + if(erupting_state) + icon_state = erupting_state + else + var/mutable_appearance/I = mutable_appearance('icons/obj/lavaland/terrain.dmi', "[icon_state]_soup") + I.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(I) + +/obj/structure/geyser/process() + if(activated && reagents.total_volume <= reagents.maximum_volume) //this is also evaluated in add_reagent, but from my understanding proc calls are expensive and should be avoided in continous + reagents.add_reagent(reagent_id, potency) //processes + if(potency > 0) + potency =- decay //decaying! + +/obj/structure/geyser/plunger_act(obj/item/plunger/P, mob/living/user, _reinforced) + if(!_reinforced) + to_chat(user, "The [P.name] isn't strong enough!") + return + if(activated) + to_chat(user, "The [name] is already active!") + return + + to_chat(user, "You start vigorously plunging [src]!") + if(do_after(user, 50*P.plunge_mod, target = src) && !activated) + start_chemming() + +/obj/structure/geyser/random + erupting_state = null + var/list/options = list("oil" = 2, "clf3" = 1) //formerly crudeoil, 2,1 +/obj/structure/geyser/random/Initialize() + . = ..() + reagent_id = pickweight(options) + +/obj/item/plunger + name = "plunger" + desc = "It's a plunger for plunging." + icon = 'icons/obj/watercloset.dmi' + icon_state = "plunger" + slot_flags = ITEM_SLOT_MASK + + var/plunge_mod = 1 //time*plunge_mod = total time we take to plunge an object + var/reinforced = FALSE //whether we do heavy duty stuff like geysers + +/obj/item/plunger/attack_obj(obj/O, mob/living/user) + if(!O.plunger_act(src, user, reinforced)) + return ..() + +/obj/item/plunger/reinforced + name = "reinforced plunger" + desc = " It's an M. 7 Reinforced Plunger for heavy duty plunging." + icon_state = "reinforced_plunger" + + reinforced = TRUE + plunge_mod = 0.8 diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 57d8e55e07..e44c5e2a3f 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -266,7 +266,7 @@ name = "pipes" /datum/asset/spritesheet/pipes/register() - for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi')) + for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi', 'icons/obj/plumbing/fluid_ducts.dmi')) InsertAll("", each, GLOB.alldirs) ..() @@ -378,4 +378,3 @@ assets = list( "ghost.png" = 'html/ghost.png' ) - diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm new file mode 100644 index 0000000000..735526511f --- /dev/null +++ b/code/modules/plumbing/ducts.dm @@ -0,0 +1,371 @@ +/* +All the important duct code: +/code/datums/components/plumbing/plumbing.dm +/code/datums/ductnet.dm +*/ +/obj/machinery/duct + name = "fluid duct" + icon = 'icons/obj/plumbing/fluid_ducts.dmi' + icon_state = "nduct" + level = 1 + ///bitfield with the directions we're connected in + var/connects + ///set to TRUE to disable smart cable behaviour + var/dumb = FALSE + ///wheter we allow our connects to be changed after initialization or not + var/lock_connects = FALSE + ///our ductnet, wich tracks what we're connected to + var/datum/ductnet/duct + ///amount we can transfer per process. note that the ductnet can carry as much as the lowest capacity duct + var/capacity = 10 + + ///the color of our duct + var/duct_color = null + ///TRUE to ignore colors, so yeah we also connect with other colors without issue + var/ignore_colors = FALSE + ///1,2,4,8,16 + var/duct_layer = DUCT_LAYER_DEFAULT + ///whether we allow our layers to be altered + var/lock_layers = FALSE + ///TRUE to let colors connect when forced with a wrench, false to just not do that at all + var/color_to_color_support = TRUE + ///wheter to even bother with plumbing code or not + var/active = TRUE + ///track ducts we're connected to. Mainly for ducts we connect to that we normally wouldn't, like different layers and colors, for when we regenerate the ducts + var/list/neighbours = list() + ///wheter we just unanchored or drop whatever is in the variable. either is safe + var/drop_on_wrench = /obj/item/stack/ducts + +/obj/machinery/duct/Initialize(mapload, no_anchor, color_of_duct, layer_of_duct = DUCT_LAYER_DEFAULT, force_connects) + . = ..() + if(no_anchor) + active = FALSE + anchored = FALSE + else if(!can_anchor()) + CRASH("Overlapping ducts detected") + qdel(src) + if(force_connects) + connects = force_connects //skip change_connects() because we're still initializing and we need to set our connects at one point + if(!lock_layers) + duct_layer = layer_of_duct + if(!ignore_colors) + duct_color = color_of_duct + if(duct_color) + add_atom_colour(duct_color, FIXED_COLOUR_PRIORITY) + handle_layer() + for(var/obj/machinery/duct/D in loc) + if(D == src) + continue + if(D.duct_layer & duct_layer) + disconnect_duct() + if(active) + attempt_connect() +///start looking around us for stuff to connect to +/obj/machinery/duct/proc/attempt_connect() + reset_connects() //All connects are gathered here again eitherway, we might aswell reset it so they properly update when reconnecting + + for(var/atom/movable/AM in loc) + var/datum/component/plumbing/P = AM.GetComponent(/datum/component/plumbing) + if(P?.active) + disconnect_duct() //let's not built under plumbing machinery + return + for(var/D in GLOB.cardinals) + if(dumb && !(D & connects)) + continue + for(var/atom/movable/AM in get_step(src, D)) + if(connect_network(AM, D)) + add_connects(D) + update_icon() +///see if whatever we found can be connected to +/obj/machinery/duct/proc/connect_network(atom/movable/AM, direction, ignore_color) + if(istype(AM, /obj/machinery/duct)) + return connect_duct(AM, direction, ignore_color) + + var/plumber = AM.GetComponent(/datum/component/plumbing) + if(!plumber) + return + return connect_plumber(plumber, direction) +///connect to a duct +/obj/machinery/duct/proc/connect_duct(obj/machinery/duct/D, direction, ignore_color) + var/opposite_dir = turn(direction, 180) + if(!active || !D.active) + return + + if(!dumb && D.dumb && !(opposite_dir & D.connects)) + return + if(dumb && D.dumb && !(connects & D.connects)) //we eliminated a few more scenario in attempt connect + return + + if((duct == D.duct) && duct)//check if we're not just comparing two null values + add_neighbour(D) + + D.add_connects(opposite_dir) + D.update_icon() + return TRUE //tell the current pipe to also update it's sprite + if(!(D in neighbours)) //we cool + if((duct_color != D.duct_color) && !(ignore_colors || D.ignore_colors)) + return + if(!(duct_layer & D.duct_layer)) + return + + if(D.duct) + if(duct) + duct.assimilate(D.duct) + else + D.duct.add_duct(src) + else + if(duct) + duct.add_duct(D) + else + create_duct() + duct.add_duct(D) + add_neighbour(D) + D.attempt_connect()//tell our buddy its time to pass on the torch of connecting to pipes. This shouldn't ever infinitely loop since it only works on pipes that havent been inductrinated + return TRUE +///connect to a plumbing object +/obj/machinery/duct/proc/connect_plumber(datum/component/plumbing/P, direction) + var/opposite_dir = turn(direction, 180) + if(duct_layer != DUCT_LAYER_DEFAULT) //plumbing devices don't support multilayering. 3 is the default layer so we only use that. We can change this later + return FALSE + + if(!P.active) + return + + var/comp_directions = P.supply_connects + P.demand_connects //they should never, ever have supply and demand connects overlap or catastrophic failure + if(opposite_dir & comp_directions) + if(!duct) + create_duct() + duct.add_plumber(P, opposite_dir) + return TRUE +///we disconnect ourself from our neighbours. we also destroy our ductnet and tell our neighbours to make a new one +/obj/machinery/duct/proc/disconnect_duct() + anchored = FALSE + active = FALSE + if(duct) + duct.remove_duct(src) + lose_neighbours() + reset_connects(0) + update_icon() + if(ispath(drop_on_wrench) && !QDELING(src)) + new drop_on_wrench(drop_location()) + qdel(src) + +///create a new duct datum +/obj/machinery/duct/proc/create_duct() + duct = new() + duct.add_duct(src) +///add a duct as neighbour. this means we're connected and will connect again if we ever regenerate +/obj/machinery/duct/proc/add_neighbour(obj/machinery/duct/D) + if(!(D in neighbours)) + neighbours += D + if(!(src in D.neighbours)) + D.neighbours += src +///remove all our neighbours, and remove us from our neighbours aswell +/obj/machinery/duct/proc/lose_neighbours() + for(var/A in neighbours) + var/obj/machinery/duct/D = A + D.neighbours.Remove(src) + neighbours = list() +///add a connect direction +/obj/machinery/duct/proc/add_connects(new_connects) //make this a define to cut proc calls? + if(!lock_connects) + connects |= new_connects +///remove our connects +/obj/machinery/duct/proc/reset_connects() + if(!lock_connects) + connects = 0 +///get a list of the ducts we can connect to if we are dumb +/obj/machinery/duct/proc/get_adjacent_ducts() + var/list/adjacents = list() + for(var/A in GLOB.cardinals) + if(A & connects) + for(var/obj/machinery/duct/D in get_step(src, A)) + if((turn(A, 180) & D.connects) && D.active) + adjacents += D + return adjacents + +/obj/machinery/duct/update_icon() //setting connects isnt a parameter because sometimes we make more than one change, overwrite it completely or just add it to the bitfield + var/temp_icon = initial(icon_state) + for(var/D in GLOB.cardinals) + if(D & connects) + if(D == NORTH) + temp_icon += "_n" + if(D == SOUTH) + temp_icon += "_s" + if(D == EAST) + temp_icon += "_e" + if(D == WEST) + temp_icon += "_w" + icon_state = temp_icon +///update the layer we are on +/obj/machinery/duct/proc/handle_layer() + var/offset + switch(duct_layer)//it's a bitfield, but it's fine because it only works when there's one layer, and multiple layers should be handled differently + if(FIRST_DUCT_LAYER) + offset = -10 + if(SECOND_DUCT_LAYER) + offset = -5 + if(THIRD_DUCT_LAYER) + offset = 0 + if(FOURTH_DUCT_LAYER) + offset = 5 + if(FIFTH_DUCT_LAYER) + offset = 10 + pixel_x = offset + pixel_y = offset + + +/obj/machinery/duct/wrench_act(mob/living/user, obj/item/I) //I can also be the RPD + ..() + add_fingerprint(user) + I.play_tool_sound(src) + if(anchored) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "You unfasten \the [src].", \ + "You hear ratcheting.") + disconnect_duct() + else if(can_anchor()) + anchored = TRUE + active = TRUE + user.visible_message( \ + "[user] fastens \the [src].", \ + "You fasten \the [src].", \ + "You hear ratcheting.") + attempt_connect() + return TRUE +///collection of all the sanity checks to prevent us from stacking ducts that shouldnt be stacked +/obj/machinery/duct/proc/can_anchor(turf/T) + if(!T) + T = get_turf(src) + for(var/obj/machinery/duct/D in T) + if(!anchored) + continue + for(var/A in GLOB.cardinals) + if(A & connects && A & D.connects) + return FALSE + return TRUE + +/obj/machinery/duct/doMove(destination) + . = ..() + disconnect_duct() + anchored = FALSE + +/obj/machinery/duct/Destroy() + disconnect_duct() + return ..() + +/obj/machinery/duct/MouseDrop_T(atom/A, mob/living/user) + if(!istype(A, /obj/machinery/duct)) + return + var/obj/machinery/duct/D = A + var/obj/item/I = user.get_active_held_item() + if(I?.tool_behaviour != TOOL_WRENCH) + to_chat(user, "You need to be holding a wrench in your active hand to do that!") + return + if(get_dist(src, D) != 1) + return + var/direction = get_dir(src, D) + if(!(direction in GLOB.cardinals)) + return + if(duct_layer != D.duct_layer) + return + + add_connects(direction) //the connect of the other duct is handled in connect_network, but do this here for the parent duct because it's not necessary in normal cases + add_neighbour(D) + connect_network(D, direction, TRUE) + update_icon() +///has a total of 5 layers and doesnt give a shit about color. its also dumb so doesnt autoconnect. +/obj/machinery/duct/multilayered + name = "duct layer-manifold" + icon = 'icons/obj/2x2.dmi' + icon_state = "multiduct" + pixel_x = -15 + pixel_y = -15 + + color_to_color_support = FALSE + duct_layer = FIRST_DUCT_LAYER | SECOND_DUCT_LAYER | THIRD_DUCT_LAYER | FOURTH_DUCT_LAYER | FIFTH_DUCT_LAYER + drop_on_wrench = null + + lock_connects = TRUE + lock_layers = TRUE + ignore_colors = TRUE + dumb = TRUE + + active = FALSE + anchored = FALSE + +/obj/machinery/duct/multilayered/Initialize(mapload, no_anchor, color_of_duct, layer_of_duct = DUCT_LAYER_DEFAULT, force_connects) + . = ..() + update_connects() + +/obj/machinery/duct/multilayered/update_icon() + return + +/obj/machinery/duct/multilayered/wrench_act(mob/living/user, obj/item/I) + . = ..() + update_connects() + +/obj/machinery/duct/multilayered/proc/update_connects() + if(dir & NORTH || dir & SOUTH) + connects = NORTH | SOUTH + else + connects = EAST | WEST + +///don't connect to other multilayered stuff because honestly it shouldnt be done and I dont wanna deal with it +/obj/machinery/duct/multilayered/connect_duct(obj/machinery/duct/D, direction, ignore_color) + if(istype(D, /obj/machinery/duct/multilayered)) + return + return ..() + +/obj/machinery/duct/multilayered/handle_layer() + return + +/obj/item/stack/ducts + name = "stack of duct" + desc = "A stack of fluid ducts." + singular_name = "duct" + icon = 'icons/obj/plumbing/fluid_ducts.dmi' + icon_state = "ducts" + w_class = WEIGHT_CLASS_TINY + novariants = FALSE + max_amount = 50 + item_flags = NOBLUDGEON + merge_type = /obj/item/stack/ducts + ///Color of our duct + var/duct_color = "grey" + ///Default layer of our duct + var/duct_layer = "Default Layer" + ///Assoc index with all the available layers. yes five might be a bit much. Colors uses a global by the way + var/list/layers = list("First Layer" = FIRST_DUCT_LAYER, "Second Layer" = SECOND_DUCT_LAYER, "Default Layer" = DUCT_LAYER_DEFAULT, + "Fourth Layer" = FOURTH_DUCT_LAYER, "Fifth Layer" = FIFTH_DUCT_LAYER) + +/obj/item/stack/ducts/examine(mob/user) + . = ..() + . += "It's current color and layer are [duct_color] and [duct_layer]. Use in-hand to change." + +/obj/item/stack/ducts/attack_self(mob/user) + var/new_layer = input("Select a layer", "Layer") as null|anything in layers + if(new_layer) + duct_layer = new_layer + var/new_color = input("Select a color", "Color") as null|anything in GLOB.pipe_paint_colors + if(new_color) + duct_color = new_color + add_atom_colour(GLOB.pipe_paint_colors[new_color], FIXED_COLOUR_PRIORITY) + +/obj/item/stack/ducts/afterattack(atom/A, user, proximity) + . = ..() + if(!proximity) + return + if(istype(A, /obj/machinery/duct)) + var/obj/machinery/duct/D = A + if(!D.anchored) + add(1) + qdel(D) + if(istype(A, /turf/open) && use(1)) + var/turf/open/OT = A + new /obj/machinery/duct(OT, FALSE, GLOB.pipe_paint_colors[duct_color], layers[duct_layer]) + playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) + +/obj/item/stack/ducts/fifty + amount = 50 diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm new file mode 100644 index 0000000000..1ea7ab56b1 --- /dev/null +++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm @@ -0,0 +1,97 @@ +/**Basic plumbing object. +* It doesn't really hold anything special, YET. +* Objects that are plumbing but not a subtype are as of writing liquid pumps and the reagent_dispenser tank +* Also please note that the plumbing component is toggled on and off by the component using a signal from default_unfasten_wrench, so dont worry about it +*/ +/obj/machinery/plumbing + name = "pipe thing" + icon = 'icons/obj/plumbing/plumbers.dmi' + icon_state = "pump" + density = TRUE + active_power_usage = 30 + use_power = ACTIVE_POWER_USE + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + ///Plumbing machinery is always gonna need reagents, so we might aswell put it here + var/buffer = 50 + ///Flags for reagents, like INJECTABLE, TRANSPARENT bla bla everything thats in DEFINES/reagents.dm + var/reagent_flags = TRANSPARENT + ///wheter we partake in rcd construction or not + var/rcd_constructable = TRUE + ///cost of the plumbing rcd construction + var/rcd_cost = 15 + ///delay of constructing it throught the plumbing rcd + var/rcd_delay = 10 + +/obj/machinery/plumbing/Initialize(mapload, bolt = TRUE) + . = ..() + anchored = bolt + create_reagents(buffer, reagent_flags) + AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ) + +/obj/machinery/plumbing/proc/can_be_rotated(mob/user,rotation_type) + return TRUE + +/obj/machinery/plumbing/examine(mob/user) + . = ..() + . += "The maximum volume display reads: [reagents.maximum_volume] units." + +/obj/machinery/plumbing/wrench_act(mob/living/user, obj/item/I) + ..() + default_unfasten_wrench(user, I) + return TRUE + +/obj/machinery/plumbing/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) + to_chat(user, "You start furiously plunging [name].") + if(do_after(user, 30, target = src)) + to_chat(user, "You finish plunging the [name].") + reagents.reaction(get_turf(src), TOUCH) //splash on the floor + reagents.clear_reagents() + +/obj/machinery/plumbing/welder_act(mob/living/user, obj/item/I) + . = ..() + if(anchored) + to_chat(user, "The [name] needs to be unbolted to do that!You start slicing the [name] apart.You slice the [name] apart. target_temperature && acclimate_state != COOLING) + acclimate_state = COOLING + update_icon() + if(!emptying) + if(reagents.chem_temp >= target_temperature && target_temperature + allowed_temperature_difference >= reagents.chem_temp) //cooling here + emptying = TRUE + if(reagents.chem_temp <= target_temperature && target_temperature - allowed_temperature_difference <= reagents.chem_temp) //heating here + emptying = TRUE + + reagents.adjust_thermal_energy((target_temperature - reagents.chem_temp) * heater_coefficient * SPECIFIC_HEAT_DEFAULT * reagents.total_volume) //keep constant with chem heater + reagents.handle_reactions() + +/obj/machinery/plumbing/acclimator/update_icon() + icon_state = initial(icon_state) + switch(acclimate_state) + if(COOLING) + icon_state += "_cold" + if(HEATING) + icon_state += "_hot" + +/obj/machinery/plumbing/acclimator/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ChemAcclimator", name) + ui.open() + +/obj/machinery/plumbing/acclimator/ui_data(mob/user) + var/list/data = list() + + data["enabled"] = enabled + data["chem_temp"] = reagents.chem_temp + data["target_temperature"] = target_temperature + data["allowed_temperature_difference"] = allowed_temperature_difference + data["acclimate_state"] = acclimate_state + data["max_volume"] = reagents.maximum_volume + data["reagent_volume"] = reagents.total_volume + data["emptying"] = emptying + return data + +/obj/machinery/plumbing/acclimator/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("set_target_temperature") + var/target = text2num(params["temperature"]) + target_temperature = clamp(target, 0, 1000) + if("set_allowed_temperature_difference") + var/target = text2num(params["temperature"]) + allowed_temperature_difference = clamp(target, 0, 1000) + if("toggle_power") + enabled = !enabled + if("change_volume") + var/target = text2num(params["volume"]) + reagents.maximum_volume = clamp(round(target), 1, buffer) + +#undef COOLING +#undef HEATING +#undef NEUTRAL diff --git a/code/modules/plumbing/plumbers/bottler.dm b/code/modules/plumbing/plumbers/bottler.dm new file mode 100644 index 0000000000..c6595fc397 --- /dev/null +++ b/code/modules/plumbing/plumbers/bottler.dm @@ -0,0 +1,79 @@ +/obj/machinery/plumbing/bottler + name = "chemical bottler" + desc = "Puts reagents into containers, like bottles and beakers." + icon_state = "bottler" + layer = ABOVE_ALL_MOB_LAYER + reagent_flags = TRANSPARENT | DRAINABLE + rcd_cost = 50 + rcd_delay = 50 + buffer = 100 + ///how much do we fill + var/wanted_amount = 10 + ///where things are sent + var/turf/goodspot = null + ///where things are taken + var/turf/inputspot = null + ///where beakers that are already full will be sent + var/turf/badspot = null + +/obj/machinery/plumbing/bottler/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/simple_demand, bolt) + setDir(dir) + +/obj/machinery/plumbing/bottler/can_be_rotated(mob/user, rotation_type) + if(anchored) + to_chat(user, "It is fastened to the floor!") + return FALSE + return TRUE + +///changes the tile array +/obj/machinery/plumbing/bottler/setDir(newdir) + . = ..() + switch(dir) + if(NORTH) + goodspot = get_step(get_turf(src), NORTH) + inputspot = get_step(get_turf(src), SOUTH) + badspot = get_step(get_turf(src), EAST) + if(SOUTH) + goodspot = get_step(get_turf(src), SOUTH) + inputspot = get_step(get_turf(src), NORTH) + badspot = get_step(get_turf(src), WEST) + if(WEST) + goodspot = get_step(get_turf(src), WEST) + inputspot = get_step(get_turf(src), EAST) + badspot = get_step(get_turf(src), NORTH) + if(EAST) + goodspot = get_step(get_turf(src), EAST) + inputspot = get_step(get_turf(src), WEST) + badspot = get_step(get_turf(src), SOUTH) + +///changing input ammount with a window +/obj/machinery/plumbing/bottler/interact(mob/user) + . = ..() + wanted_amount = clamp(round(input(user,"maximum is 100u","set ammount to fill with") as num|null, 1), 1, 100) + reagents.clear_reagents() + to_chat(user, " The [src] will now fill for [wanted_amount]u.") + +/obj/machinery/plumbing/bottler/process() + if(machine_stat & NOPOWER) + return + ///see if machine has enough to fill + if(reagents.total_volume >= wanted_amount && anchored) + var/obj/AM = pick(inputspot.contents)///pick a reagent_container that could be used + if(istype(AM, /obj/item/reagent_containers) && (!istype(AM, /obj/item/reagent_containers/hypospray/medipen))) + var/obj/item/reagent_containers/B = AM + ///see if it would overflow else inject + if((B.reagents.total_volume + wanted_amount) <= B.reagents.maximum_volume) + reagents.trans_to(B, wanted_amount, transfered_by = src) + B.forceMove(goodspot) + return + ///glass was full so we move it away + AM.forceMove(badspot) + if(istype(AM, /obj/item/slime_extract)) ///slime extracts need inject + AM.forceMove(goodspot) + reagents.trans_to(AM, wanted_amount, transfered_by = src, method = INJECT) + return + if(istype(AM, /obj/item/slimecross/industrial)) ///no need to move slimecross industrial things + reagents.trans_to(AM, wanted_amount, transfered_by = src, method = INJECT) + return diff --git a/code/modules/plumbing/plumbers/destroyer.dm b/code/modules/plumbing/plumbers/destroyer.dm new file mode 100644 index 0000000000..b61383ea4a --- /dev/null +++ b/code/modules/plumbing/plumbers/destroyer.dm @@ -0,0 +1,21 @@ +/obj/machinery/plumbing/disposer + name = "chemical disposer" + desc = "Breaks down chemicals and annihilates them." + icon_state = "disposal" + ///we remove 10 reagents per second + var/disposal_rate = 10 + +/obj/machinery/plumbing/disposer/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/simple_demand, bolt) + +/obj/machinery/plumbing/disposer/process() + if(stat & NOPOWER) + return + if(reagents.total_volume) + if(icon_state != initial(icon_state) + "_working") //threw it here instead of update icon since it only has two states + icon_state = initial(icon_state) + "_working" + reagents.remove_any(disposal_rate) + else + if(icon_state != initial(icon_state)) + icon_state = initial(icon_state) diff --git a/code/modules/plumbing/plumbers/fermenter.dm b/code/modules/plumbing/plumbers/fermenter.dm new file mode 100644 index 0000000000..e13ae3feff --- /dev/null +++ b/code/modules/plumbing/plumbers/fermenter.dm @@ -0,0 +1,52 @@ +/obj/machinery/plumbing/fermenter //FULLY AUTOMATIC BEER BREWING. TRULY, THE FUTURE. + name = "chemical fermenter" + desc = "Turns plants into various types of booze." + icon_state = "fermenter" + layer = ABOVE_ALL_MOB_LAYER + reagent_flags = TRANSPARENT | DRAINABLE + rcd_cost = 30 + rcd_delay = 30 + buffer = 400 + ///input dir + var/eat_dir = SOUTH + +/obj/machinery/plumbing/fermenter/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/simple_supply, bolt) + +/obj/machinery/plumbing/grinder_chemical/can_be_rotated(mob/user, rotation_type) + if(anchored) + to_chat(user, "It is fastened to the floor!") + return FALSE + return TRUE + +/obj/machinery/plumbing/fermenter/setDir(newdir) + . = ..() + eat_dir = newdir + +/obj/machinery/plumbing/fermenter/CanAllowThrough(atom/movable/AM) + . = ..() + if(!anchored) + return + var/move_dir = get_dir(loc, AM.loc) + if(move_dir == eat_dir) + return TRUE + +/obj/machinery/plumbing/fermenter/Crossed(atom/movable/AM) + . = ..() + ferment(AM) + +/// uses fermentation proc similar to fermentation barrels +/obj/machinery/plumbing/fermenter/proc/ferment(atom/AM) + if(machine_stat & NOPOWER) + return + if(reagents.holder_full()) + return + if(!isitem(AM)) + return + if(istype(AM, /obj/item/reagent_containers/food/snacks/grown)) + var/obj/item/reagent_containers/food/snacks/grown/G = AM + if(G.distill_reagent) + var/amount = G.seed.potency * 0.25 + reagents.add_reagent(G.distill_reagent, amount) + qdel(G) diff --git a/code/modules/plumbing/plumbers/filter.dm b/code/modules/plumbing/plumbers/filter.dm new file mode 100644 index 0000000000..3058120b9d --- /dev/null +++ b/code/modules/plumbing/plumbers/filter.dm @@ -0,0 +1,74 @@ +///chemical plumbing filter. If it's not filtered by left and right, it goes straight. +/obj/machinery/plumbing/filter + name = "chemical filter" + desc = "A chemical filter for filtering chemicals. The left and right outputs appear to be from the perspective of the input port." + icon_state = "filter" + density = FALSE + ///whitelist of chems id's that go to the left side. Empty to disable port + var/list/left = list() + ///whitelist of chem id's that go to the right side. Empty to disable port + var/list/right = list() + ///whitelist of chems but their name instead of path + var/list/english_left = list() + ///whitelist of chems but their name instead of path + var/list/english_right = list() + var/ui_x = 320 + var/ui_y = 310 + + +/obj/machinery/plumbing/filter/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/filter, bolt) + +/obj/machinery/plumbing/filter/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + + if(!ui) + ui = new(user, src, ui_key, "chemical_filter", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/machinery/plumbing/filter/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ChemFilter", name) + ui.open() + +/obj/machinery/plumbing/filter/ui_data(mob/user) + var/list/data = list() + data["left"] = english_left + data["right"] = english_right + return data + +/obj/machinery/plumbing/filter/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("add") + var/new_chem_name = params["name"] + var/chem_id = get_chem_id(new_chem_name) + if(chem_id) + switch(params["which"]) + if("left") + if(!left.Find(chem_id)) + english_left += new_chem_name + left += chem_id + if("right") + if(!right.Find(chem_id)) + english_right += new_chem_name + right += chem_id + else + to_chat(usr, "No such known reagent exists!") + + if("remove") + var/chem_name = params["reagent"] + var/chem_id = get_chem_id(chem_name) + switch(params["which"]) + if("left") + if(english_left.Find(chem_name)) + english_left -= chem_name + left -= chem_id + if("right") + if(english_right.Find(chem_name)) + english_right -= chem_name + right -= chem_id diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm new file mode 100644 index 0000000000..4fa0d9e2cc --- /dev/null +++ b/code/modules/plumbing/plumbers/grinder_chemical.dm @@ -0,0 +1,58 @@ +/obj/machinery/plumbing/grinder_chemical + name = "chemical grinder" + desc = "chemical grinder." + icon_state = "grinder_chemical" + layer = ABOVE_ALL_MOB_LAYER + reagent_flags = TRANSPARENT | DRAINABLE + rcd_cost = 30 + rcd_delay = 30 + buffer = 400 + var/eat_dir = SOUTH + +/obj/machinery/plumbing/grinder_chemical/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/simple_supply, bolt) + +/obj/machinery/plumbing/grinder_chemical/can_be_rotated(mob/user, rotation_type) + if(anchored) + to_chat(user, "It is fastened to the floor!") + return FALSE + return TRUE + +/obj/machinery/plumbing/grinder_chemical/setDir(newdir) + . = ..() + eat_dir = newdir + +/obj/machinery/plumbing/grinder_chemical/CanAllowThrough(atom/movable/AM) + . = ..() + if(!anchored) + return + var/move_dir = get_dir(loc, AM.loc) + if(move_dir == eat_dir) + return TRUE + +/obj/machinery/plumbing/grinder_chemical/Crossed(atom/movable/AM) + . = ..() + grind(AM) + +/obj/machinery/plumbing/grinder_chemical/proc/grind(atom/AM) + if(machine_stat & NOPOWER) + return + if(reagents.holder_full()) + return + if(!isitem(AM)) + return + var/obj/item/I = AM + if(I.juice_results || I.grind_results) + if(I.juice_results) + I.on_juice() + reagents.add_reagent_list(I.juice_results) + if(I.reagents) + I.reagents.trans_to(src, I.reagents.total_volume, transfered_by = src) + qdel(I) + return + I.on_grind() + reagents.add_reagent_list(I.grind_results) + if(I.reagents) + I.reagents.trans_to(src, I.reagents.total_volume, transfered_by = src) + qdel(I) diff --git a/code/modules/plumbing/plumbers/pill_press.dm b/code/modules/plumbing/plumbers/pill_press.dm new file mode 100644 index 0000000000..9c2505661c --- /dev/null +++ b/code/modules/plumbing/plumbers/pill_press.dm @@ -0,0 +1,107 @@ +///We take a constant input of reagents, and produce a pill once a set volume is reached +/obj/machinery/plumbing/pill_press + name = "pill press" + desc = "A press that presses pills." + icon_state = "pill_press" + ///the minimum size a pill can be + var/minimum_pill = 5 + ///the maximum size a pill can be + var/maximum_pill = 50 + ///the size of the pill + var/pill_size = 10 + ///pill name + var/pill_name = "factory pill" + ///the icon_state number for the pill. + var/pill_number = RANDOM_PILL_STYLE + ///list of id's and icons for the pill selection of the ui + var/list/pill_styles + ///list of pills stored in the machine, so we dont have 610 pills on one tile + var/list/stored_pills = list() + ///max amount of pills allowed on our tile before we start storing them instead + var/max_floor_pills = 10 + +/obj/machinery/plumbing/pill_press/examine(mob/user) + . = ..() + . += "The [name] currently has [stored_pills.len] stored. There needs to be less than [max_floor_pills] on the floor to continue dispensing." + +/obj/machinery/plumbing/pill_press/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/simple_demand, bolt) + + //expertly copypasted from chemmasters + var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/pills) + pill_styles = list() + for (var/x in 1 to PILL_STYLE_COUNT) + var/list/SL = list() + SL["id"] = x + SL["htmltag"] = assets.icon_tag("pill[x]") + pill_styles += list(SL) + +/obj/machinery/plumbing/pill_press/process() + if(stat & NOPOWER) + return + if(reagents.total_volume >= pill_size) + var/obj/item/reagent_containers/pill/P = new(src) + reagents.trans_to(P, pill_size) + P.name = pill_name + stored_pills += P + if(pill_number == RANDOM_PILL_STYLE) + P.icon_state = "pill[rand(1,21)]" + else + P.icon_state = "pill[pill_number]" + if(P.icon_state == "pill4") //mirrored from chem masters + P.desc = "A tablet or capsule, but not just any, a red one, one taken by the ones not scared of knowledge, freedom, uncertainty and the brutal truths of reality." + if(stored_pills.len) + var/pill_amount = 0 + for(var/obj/item/reagent_containers/pill/P in loc) + pill_amount++ + if(pill_amount >= max_floor_pills) //too much so just stop + break + if(pill_amount < max_floor_pills) + var/atom/movable/AM = stored_pills[1] //AM because forceMove is all we need + stored_pills -= AM + AM.forceMove(drop_location()) + + +/obj/machinery/plumbing/pill_press/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/simple/pills), + ) + +/obj/machinery/plumbing/pill_press/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ChemPress", name) + ui.open() + +/obj/machinery/plumbing/pill_press/ui_data(mob/user) + var/list/data = list() + data["pill_style"] = pill_number + data["current_volume"] = current_volume + data["product_name"] = product_name + data["pill_styles"] = pill_styles + data["product"] = product + data["min_volume"] = min_volume + data["max_volume"] = max_volume + return data + +/obj/machinery/plumbing/pill_press/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("change_pill_style") + pill_number = clamp(text2num(params["id"]), 1 , PILL_STYLE_COUNT) + if("change_current_volume") + current_volume = clamp(text2num(params["volume"]), min_volume, max_volume) + if("change_product_name") + product_name = html_encode(params["name"]) + if("change_product") + product = params["product"] + if (product == "pill") + max_volume = max_pill_volume + else if (product == "patch") + max_volume = max_patch_volume + else if (product == "bottle") + max_volume = max_bottle_volume + current_volume = clamp(current_volume, min_volume, max_volume) diff --git a/code/modules/plumbing/plumbers/pumps.dm b/code/modules/plumbing/plumbers/pumps.dm new file mode 100644 index 0000000000..aeec8c9994 --- /dev/null +++ b/code/modules/plumbing/plumbers/pumps.dm @@ -0,0 +1,83 @@ +///We pump liquids from activated(plungerated) geysers to a plumbing outlet. We need to be wired. +/obj/machinery/power/liquid_pump + name = "liquid pump" + desc = "Pump up those sweet liquids from under the surface." + icon = 'icons/obj/plumbing/plumbers.dmi' + icon_state = "pump" + anchored = FALSE + density = TRUE + idle_power_usage = 10 + active_power_usage = 1000 + ///Are we powered? + var/powered = FALSE + ///units we pump per process (2 seconds) + var/pump_power = 2 + ///set to true if the loop couldnt find a geyser in process, so it remembers and stops checking every loop until moved. more accurate name would be absolutely_no_geyser_under_me_so_dont_try + var/geyserless = FALSE + ///The geyser object + var/obj/structure/geyser/geyser + ///volume of our internal buffer + var/volume = 200 + +/obj/machinery/power/liquid_pump/Initialize() + . = ..() + create_reagents(volume) + AddComponent(/datum/component/plumbing/simple_supply, TRUE) + +/obj/machinery/power/liquid_pump/attackby(obj/item/W, mob/user, params) + if(!powered) + if(!anchored) + if(default_deconstruction_screwdriver(user, "[initial(icon_state)]_open", "[initial(icon_state)]",W)) + return + if(default_deconstruction_crowbar(W)) + return + return ..() + +/obj/machinery/power/liquid_pump/wrench_act(mob/living/user, obj/item/I) + ..() + default_unfasten_wrench(user, I) + return TRUE +///please note that the component has a hook in the parent call, wich handles activating and deactivating +/obj/machinery/power/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20) + . = ..() + if(. == SUCCESSFUL_UNFASTEN) + geyser = null + update_icon() + powered = FALSE + geyserless = FALSE //we switched state, so lets just set this back aswell + +/obj/machinery/power/liquid_pump/process() + if(!anchored || panel_open) + return + if(!geyser && !geyserless) + for(var/obj/structure/geyser/G in loc.contents) + geyser = G + if(!geyser) //we didnt find one, abort + anchored = FALSE + geyserless = TRUE + visible_message("The [name] makes a sad beep!") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50) + return + + if(avail(active_power_usage)) + if(!powered) //we werent powered before this tick so update our sprite + powered = TRUE + update_icon() + add_load(active_power_usage) + pump() + else if(powered) //we were powered, but now we arent + powered = FALSE + update_icon() +///pump up that sweet geyser nectar +/obj/machinery/power/liquid_pump/proc/pump() + if(!geyser || !geyser.reagents) + return + geyser.reagents.trans_to(src, pump_power) + +/obj/machinery/power/liquid_pump/update_icon() + if(powered) + icon_state = initial(icon_state) + "-on" + else if(panel_open) + icon_state = initial(icon_state) + "-open" + else + icon_state = initial(icon_state) diff --git a/code/modules/plumbing/plumbers/reaction_chamber.dm b/code/modules/plumbing/plumbers/reaction_chamber.dm new file mode 100644 index 0000000000..33fc5c8f0c --- /dev/null +++ b/code/modules/plumbing/plumbers/reaction_chamber.dm @@ -0,0 +1,63 @@ +///a reaction chamber for plumbing. pretty much everything can react, but this one keeps the reagents seperated and only reacts under your given terms +/obj/machinery/plumbing/reaction_chamber + name = "reaction chamber" + desc = "Keeps chemicals seperated until given conditions are met." + icon_state = "reaction_chamber" + + buffer = 200 + reagent_flags = TRANSPARENT | NO_REACT + /**list of set reagents that the reaction_chamber allows in, and must all be present before mixing is enabled. + * example: list(/datum/reagent/water = 20, /datum/reagent/fuel/oil = 50) + */ + var/list/required_reagents = list() + ///our reagent goal has been reached, so now we lock our inputs and start emptying + var/emptying = FALSE + +/obj/machinery/plumbing/reaction_chamber/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/reaction_chamber, bolt) + +/obj/machinery/plumbing/reaction_chamber/on_reagent_change() + if(reagents.total_volume == 0 && emptying) //we were emptying, but now we aren't + emptying = FALSE + reagent_flags |= NO_REACT + +/obj/machinery/plumbing/reaction_chamber/power_change() + . = ..() + if(use_power != NO_POWER_USE) + icon_state = initial(icon_state) + "_on" + else + icon_state = initial(icon_state) + +/obj/machinery/plumbing/reaction_chamber/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ChemReactionChamber", name) + ui.open() + +/obj/machinery/plumbing/reaction_chamber/ui_data(mob/user) + var/list/data = list() + var/list/text_reagents = list() + for(var/A in required_reagents) //make a list where the key is text, because that looks alot better in the ui than a typepath + var/datum/reagent/R = A + text_reagents[initial(R.name)] = required_reagents[R] + + data["reagents"] = text_reagents + data["emptying"] = emptying + return data + +/obj/machinery/plumbing/reaction_chamber/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("remove") + var/reagent = get_chem_id(params["chem"]) + if(reagent) + required_reagents.Remove(reagent) + if("add") + var/input_reagent = get_chem_id(params["chem"]) + if(input_reagent && !required_reagents.Find(input_reagent)) + var/input_amount = text2num(params["amount"]) + if(input_amount) + required_reagents[input_reagent] = input_amount diff --git a/code/modules/plumbing/plumbers/splitters.dm b/code/modules/plumbing/plumbers/splitters.dm new file mode 100644 index 0000000000..a26813486c --- /dev/null +++ b/code/modules/plumbing/plumbers/splitters.dm @@ -0,0 +1,50 @@ +///it splits the reagents however you want. So you can "every 60 units, 45 goes left and 15 goes straight". The side direction is EAST, you can change this in the component +/obj/machinery/plumbing/splitter + name = "Chemical Splitter" + desc = "A chemical splitter for smart chemical factorization. Waits till a set of conditions is met and then stops all input and splits the buffer evenly or other in two ducts." + icon_state = "splitter" + buffer = 100 + density = FALSE + + ///constantly switches between TRUE and FALSE. TRUE means the batch tick goes straight, FALSE means the next batch goes in the side duct. + var/turn_straight = TRUE + ///how much we must transfer straight. note input can be as high as 10 reagents per process, usually + var/transfer_straight = 5 + ///how much we must transfer to the side + var/transfer_side = 5 + //the maximum you can set the transfer to + var/max_transfer = 9 + + +/obj/machinery/plumbing/splitter/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/splitter, bolt) + +/obj/machinery/plumbing/splitter/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ChemSplitter", name) + ui.open() + +/obj/machinery/plumbing/splitter/ui_data(mob/user) + var/list/data = list() + data["straight"] = transfer_straight + data["side"] = transfer_side + data["max_transfer"] = max_transfer + return data + +/obj/machinery/plumbing/splitter/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("set_amount") + var/direction = params["target"] + var/value = clamp(text2num(params["amount"]), 1, max_transfer) + switch(direction) + if("straight") + transfer_straight = value + if("side") + transfer_side = value + else + return FALSE diff --git a/code/modules/plumbing/plumbers/synthesizer.dm b/code/modules/plumbing/plumbers/synthesizer.dm new file mode 100644 index 0000000000..2d782e9d3e --- /dev/null +++ b/code/modules/plumbing/plumbers/synthesizer.dm @@ -0,0 +1,111 @@ +///A single machine that produces a single chem. Can be placed in unison with others through plumbing to create chemical factories +/obj/machinery/plumbing/synthesizer + name = "chemical synthesizer" + desc = "Produces a single chemical at a given volume. Must be plumbed. Most effective when working in unison with other chemical synthesizers, heaters and filters." + + icon_state = "synthesizer" + icon = 'icons/obj/plumbing/plumbers.dmi' + rcd_cost = 25 + rcd_delay = 15 + + ///Amount we produce for every process. Ideally keep under 5 since thats currently the standard duct capacity + var/amount = 1 + ///The maximum we can produce for every process + buffer = 5 + ///I track them here because I have no idea how I'd make tgui loop like that + var/static/list/possible_amounts = list(0,1,2,3,4,5) + ///The reagent we are producing. We are a typepath, but are also typecast because there's several occations where we need to use initial. + var/datum/reagent/reagent_id = null + ///straight up copied from chem dispenser. Being a subtype would be extremely tedious and making it global would restrict potential subtypes using different dispensable_reagents + var/list/dispensable_reagents = list( + /datum/reagent/aluminium, + /datum/reagent/bromine, + /datum/reagent/carbon, + /datum/reagent/chlorine, + /datum/reagent/copper, + /datum/reagent/consumable/ethanol, + /datum/reagent/fluorine, + /datum/reagent/hydrogen, + /datum/reagent/iodine, + /datum/reagent/iron, + /datum/reagent/lithium, + /datum/reagent/mercury, + /datum/reagent/nitrogen, + /datum/reagent/oxygen, + /datum/reagent/phosphorus, + /datum/reagent/potassium, + /datum/reagent/uranium/radium, + /datum/reagent/silicon, + /datum/reagent/silver, + /datum/reagent/sodium, + /datum/reagent/stable_plasma, + /datum/reagent/consumable/sugar, + /datum/reagent/sulfur, + /datum/reagent/toxin/acid, + /datum/reagent/water, + /datum/reagent/fuel, + ) + +/obj/machinery/plumbing/synthesizer/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/simple_supply, bolt) + +/obj/machinery/plumbing/synthesizer/process() + if(machine_stat & NOPOWER || !reagent_id || !amount) + return + if(reagents.total_volume >= amount) //otherwise we get leftovers, and we need this to be precise + return + reagents.add_reagent(reagent_id, amount) + +/obj/machinery/plumbing/synthesizer/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ChemSynthesizer", name) + ui.open() + +/obj/machinery/plumbing/synthesizer/ui_data(mob/user) + var/list/data = list() + + var/is_hallucinating = user.hallucinating() + var/list/chemicals = list() + + for(var/A in dispensable_reagents) + var/datum/reagent/R = GLOB.chemical_reagents_list[A] + if(R) + var/chemname = R.name + if(is_hallucinating && prob(5)) + chemname = "[pick_list_replacements("hallucination.json", "chemicals")]" + chemicals.Add(list(list("title" = chemname, "id" = ckey(R.name)))) + data["chemicals"] = chemicals + data["amount"] = amount + data["possible_amounts"] = possible_amounts + + data["current_reagent"] = ckey(initial(reagent_id.name)) + return data + +/obj/machinery/plumbing/synthesizer/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("amount") + var/new_amount = text2num(params["target"]) + if(new_amount in possible_amounts) + amount = new_amount + . = TRUE + if("select") + var/new_reagent = GLOB.name2reagent[params["reagent"]] + if(new_reagent in dispensable_reagents) + reagent_id = new_reagent + . = TRUE + update_icon() + reagents.clear_reagents() + +/obj/machinery/plumbing/synthesizer/update_overlays() + . = ..() + var/mutable_appearance/r_overlay = mutable_appearance(icon, "[icon_state]_overlay") + if(reagent_id) + r_overlay.color = initial(reagent_id.color) + else + r_overlay.color = "#FFFFFF" + . += r_overlay diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index c2662a8342..c489edf88e 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -1165,3 +1165,9 @@ random_reagents += R var/picked_reagent = pick(random_reagents) return picked_reagent + +/proc/get_chem_id(chem_name) + for(var/X in GLOB.chemical_reagents_list) + var/datum/reagent/R = GLOB.chemical_reagents_list[X] + if(ckey(chem_name) == ckey(lowertext(R.name))) + return X diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index a85ac8b085..cdda9d0469 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -8,6 +8,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) if (length(initial(R.name))) .[ckey(initial(R.name))] = t + //Various reagents //Toxin & acid reagents //Hydroponics stuff @@ -220,4 +221,3 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) bloodsuckerdatum.handle_eat_human_food(disgust, blood_puke, force) if(blood_change) bloodsuckerdatum.AddBloodVolume(blood_change) - diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 0131e6d028..077c8331ae 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -24,7 +24,8 @@ /obj/structure/reagent_dispensers/Initialize() create_reagents(tank_volume, DRAINABLE | AMOUNT_VISIBLE) - reagents.add_reagent(reagent_id, tank_volume) + if(reagent_id) + reagents.add_reagent(reagent_id, tank_volume) . = ..() /obj/structure/reagent_dispensers/proc/boom() @@ -91,6 +92,38 @@ user.put_in_hands(S) paper_cups-- +/obj/structure/reagent_dispensers/plumbed + name = "stationairy water tank" + anchored = TRUE + icon_state = "water_stationairy" + desc = "A stationairy, plumbed, water tank." + +/obj/structure/reagent_dispensers/plumbed/wrench_act(mob/living/user, obj/item/I) + default_unfasten_wrench(user, I) + return TRUE + +/obj/structure/reagent_dispensers/plumbed/default_unfasten_wrench(mob/user, obj/item/I, time = 20) + . = ..() + if(. == SUCCESSFUL_UNFASTEN) + user.visible_message("[user.name] [anchored ? "fasten" : "unfasten"] [src]", \ + "You [anchored ? "fasten" : "unfasten"] [src]") + var/datum/component/plumbing/CP = GetComponent(/datum/component/plumbing) + if(anchored) + CP.enable() + else + CP.disable() + +/obj/structure/reagent_dispensers/plumbed/ComponentInitialize() + AddComponent(/datum/component/plumbing/simple_supply) + +/obj/structure/reagent_dispensers/plumbed/storage + name = "stationairy storage tank" + icon_state = "tank_stationairy" + reagent_id = null //start empty + +/obj/structure/reagent_dispensers/plumbed/storage/ComponentInitialize() + AddComponent(/datum/component/plumbing/tank) + ////////////// //Fuel Tanks// ////////////// @@ -284,5 +317,3 @@ icon_state = "bluekeg" reagent_id = /datum/reagent/consumable/ethanol/neurotoxin tank_volume = 100 //2.5x less than the other kegs because it's harder to get - - diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index e1e55f3476..0598ebf9ab 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -961,3 +961,158 @@ build_path = /obj/item/bodypart/r_arm/robot/surplus_upgraded category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + + +/datum/design/acclimator + name = "Plumbing Acclimator" + desc = "A heating and cooling device for pipes!" + id = "acclimator" + build_type = PROTOLATHE + materials = list(MAT_METAL = 1000, MAT_GLASS = 500) + construction_time = 75 + build_path = /obj/machinery/plumbing/acclimator + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/disposer + name = "Plumbing Disposer" + desc = "Using the power of SCIENCE, dissolves reagents into nothing (almost)." + id = "disposer" + build_type = PROTOLATHE + materials = list(MAT_METAL = 500, MAT_GLASS = 100) + construction_time = 75 + build_path = /obj/machinery/plumbing/disposer + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_filter + name = "Plumbing Filter" + desc = "Filters out chemicals by their NTDB ID." + id = "plumb_filter" + build_type = PROTOLATHE + materials = list(MAT_METAL = 1000, MAT_GLASS = 500) + construction_time = 75 + build_path = /obj/machinery/plumbing/filter + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_synth + name = "Plumbing Synthesizer" + desc = "Using standard mass-energy dynamic autoconverters, generates reagents from power and puts them in a pipe." + id = "plumb_synth" + build_type = PROTOLATHE + materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_PLASTIC = 1000) + construction_time = 75 + build_path = /obj/machinery/plumbing/synthesizer + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_grinder + name = "Plumbing-Linked Autogrinder" + desc = "Automatically extracts reagents from an item by grinding it. Think of the possibilities! Note: does not grind people." + id = "plumb_grinder" + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_GLASS = 1500) + construction_time = 75 + build_path = /obj/machinery/plumbing/grinder_chemical + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/reaction_chamber + name = "Plumbing Reaction Chamber" + desc = "You can set a list of allowed reagents and amounts. Once the chamber has these reagents, will let the products through." + id = "reaction_chamber" + build_type = PROTOLATHE + materials = list(MAT_METAL = 1000, MAT_GLASS = 500) + construction_time = 75 + build_path = /obj/machinery/plumbing/reaction_chamber + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/duct_print + name = "Plumbing Ducts" + desc = "Ducts for plumbing! Now lathed for efficiency." + id = "duct_print" + build_type = PROTOLATHE + materials = list(MAT_PLASTIC = 400) + construction_time = 5 + build_path = /obj/item/stack/ducts + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_splitter + name = "Plumbing Chemical Splitter" + desc = "A splitter. Has 2 outputs. Can be configured to allow a certain amount through each side." + id = "plumb_splitter" + build_type = PROTOLATHE + materials = list(MAT_METAL = 750, MAT_GLASS = 250) + construction_time = 75 + build_path = /obj/machinery/plumbing/splitter + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/pill_press + name = "Plumbing Automatic Pill Former" + desc = "Automatically forms pills to the required parameters with piped reagents! A good replacement for those lazy, useless chemists." + id = "pill_press" + build_type = PROTOLATHE + materials = list(MAT_METAL = 1000, MAT_GLASS = 500) + construction_time = 75 + build_path = /obj/machinery/plumbing/pill_press + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_pump + name = "Liquid Extraction Pump" + desc = "Use it for extracting liquids from lavaland's geysers!" + id = "plumb_pump" + build_type = PROTOLATHE + materials = list(MAT_METAL = 1000, MAT_GLASS = 500) + construction_time = 75 + build_path = /obj/machinery/power/liquid_pump + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_in + name = "Plumbing Input Device" + desc = "A big piped funnel for putting stuff in the pipe network." + id = "plumb_in" + build_type = PROTOLATHE + materials = list(MAT_METAL = 400, MAT_GLASS = 400) + construction_time = 75 + build_path = /obj/machinery/plumbing/input + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_out + name = "Plumbing Output Device" + desc = "A big piped funnel for taking stuff out of the pipe network." + id = "plumb_out" + build_type = PROTOLATHE + materials = list(MAT_METAL = 400, MAT_GLASS = 400) + construction_time = 75 + build_path = /obj/machinery/plumbing/output + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_tank + name = "Plumbed Storage Tank" + desc = "A tank for storing plumbed reagents." + id = "plumb_tank" + build_type = PROTOLATHE + materials = list(MAT_METAL = 10000, MAT_GLASS = 10000, MAT_PLASTIC = 4000) + construction_time = 75 + build_path = /obj/machinery/plumbing/tank + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_rcd + name = "Plumbed Autoconstruction Device" + desc = "A RCD for plumbing machines! Cannot make ducts." + id = "plumb_rcd" + build_type = PROTOLATHE + materials = list(MAT_METAL = 20000, MAT_GLASS = 10000, MAT_PLASTIC = 20000, MAT_PLASMA = 6000, MAT_DIAMOND = 5000, MAT_BLUESPACE = 5000, MAT_GOLD = 5000, MAT_SILVER = 5000) + construction_time = 150 + build_path = /obj/item/construction/plumbing + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCEs diff --git a/code/modules/research/techweb/nodes/medical_nodes.dm b/code/modules/research/techweb/nodes/medical_nodes.dm index 71dd7c943c..43fe941ab2 100644 --- a/code/modules/research/techweb/nodes/medical_nodes.dm +++ b/code/modules/research/techweb/nodes/medical_nodes.dm @@ -24,6 +24,23 @@ design_ids = list("defib_decay", "defib_shock", "defib_heal", "defib_speed") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) +/datum/techweb_node/plumbing + id = "plumbing" + display_name = "Reagent Plumbing Technology" + description = "Plastic tubes, and machinery used for manipulating things in them." + prereq_ids = list("base") + design_ids = list("acclimator", "disposer", "plumb_filter", "plumb_synth", "plumb_grinder", "reaction_chamber", "duct_print", "plumb_splitter", "pill_press", "plumb_pump", "plumb_in", "plumb_out", "plumb_tank") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + + +/datum/techweb_node/advplumbing + id = "advplumbing" + display_name = "Advanced Plumbing Technology" + description = "Plumbing RCD." + prereq_ids = list("plumbing", "adv_engi", "adv_biotech") + design_ids = list("plumb_rcd") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) + //////////////////////Cybernetics///////////////////// /datum/techweb_node/surplus_limbs diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 4a299f29ddb16c596e251c00890f4f016c630ece..94ea415ed7cf406fb49befddd17426bccf1fd3c2 100644 GIT binary patch literal 16012 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 literal 23715 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 From 661b9920fc1a9a06c894d539c687c454cdcca781 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Wed, 22 Jul 2020 10:59:21 +1000 Subject: [PATCH 02/84] luh mayo --- code/game/objects/items/RPD.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index 2c8acf5a28..85a594d7d1 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -282,7 +282,7 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( "categories" = list(), "selected_color" = paint_color, "paint_colors" = GLOB.pipe_paint_colors, - "mode" = mode + "mode" = mode, "locked" = locked ) From c07e5d544ba31479fb7a38a29fd0112fb3ec78bb Mon Sep 17 00:00:00 2001 From: lolman360 Date: Wed, 22 Jul 2020 11:27:26 +1000 Subject: [PATCH 03/84] wweeee --- .../circuitboards/machine_circuitboards.dm | 4 ++ code/modules/hydroponics/hydroponics.dm | 15 +++--- code/modules/plumbing/plumbers/autohydro.dm | 54 +++++++++++++++++++ .../machine_designs_service.dm | 8 +++ .../research/techweb/nodes/medical_nodes.dm | 2 +- 5 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 code/modules/plumbing/plumbers/autohydro.dm diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 56eb25f953..8a8aba50a3 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -512,6 +512,10 @@ /obj/item/stack/sheet/glass = 1) needs_anchored = FALSE +/obj/item/circuitboard/machine/hydroponics/automagic + name = "Automatic Hydroponics Tray (Machine Board)" + build_path = /obj/machinery/hydroponics/constructable/automagic + /obj/item/circuitboard/machine/seed_extractor name = "Seed Extractor (Machine Board)" build_path = /obj/machinery/seed_extractor diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index b673937c9c..14c510a2d2 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -30,7 +30,7 @@ var/self_sufficiency_req = 20 //Required total dose to make a self-sufficient hydro tray. 1:1 with earthsblood. var/self_sufficiency_progress = 0 var/self_sustaining = FALSE //If the tray generates nutrients and water on its own - + var/canirrigate = TRUE //tin /obj/machinery/hydroponics/constructable name = "hydroponics tray" @@ -847,12 +847,13 @@ if (!anchored) to_chat(user, "Anchor the tray first!") return - using_irrigation = !using_irrigation - O.play_tool_sound(src) - user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.", \ - "You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.") - for(var/obj/machinery/hydroponics/h in range(1,src)) - h.update_icon() + if(canirrigate) + using_irrigation = !using_irrigation + O.play_tool_sound(src) + user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.", \ + "You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.") + for(var/obj/machinery/hydroponics/h in range(1,src)) + h.update_icon() else if(istype(O, /obj/item/shovel/spade)) if(!myseed && !weedlevel) diff --git a/code/modules/plumbing/plumbers/autohydro.dm b/code/modules/plumbing/plumbers/autohydro.dm new file mode 100644 index 0000000000..4ea1d70aaf --- /dev/null +++ b/code/modules/plumbing/plumbers/autohydro.dm @@ -0,0 +1,54 @@ +/obj/machinery/hydroponics/constructable/automagic + name = "automated hydroponics system" + desc = "The bane of botanists everywhere. Accepts chemical reagents via plumbing, automatically harvests and removes dead plants." + obj_flags = CAN_BE_HIT | UNIQUE_RENAME + circuit = /obj/item/circuitboard/machine/hydroponics/automagic + self_sufficiency_req = 400 //automating hydroponics makes gaia sad so she needs more drugs to turn they tray godly. + canirrigate = FALSE + + +/obj/machinery/hydroponics/attackby(obj/item/O, mob/user, params) + if(istype(O, /obj/item/reagent_containers) ) + return FALSE //avoid fucky wuckies + ..() + +/obj/machinery/hydroponics/constructable/automagic/default_unfasten_wrench(mob/user, obj/item/I, time = 20) + . = ..() + if(. == SUCCESSFUL_UNFASTEN) + user.visible_message("[user.name] [anchored ? "fasten" : "unfasten"] [src]", \ + "You [anchored ? "fasten" : "unfasten"] [src]") + var/datum/component/plumbing/CP = GetComponent(/datum/component/plumbing) + if(anchored) + CP.enable() + else + CP.disable() + +/obj/machinery/hydroponics/constructable/automagic/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/simple_demand, bolt) + create_reagents(100 , AMOUNT_VISIBLE) + + +/obj/machinery/hydroponics/constructable/automagic/process() + if(reagents) + applyChemicals(reagents) + reagents.clear_reagents() + if(dead) + dead = 0 + qdel(myseed) + myseed = null + update_icon() + name = initial(name) + desc = initial(desc) + if(harvest) + myseed.harvest() + harvest = 0 + lastproduce = age + if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest)) + qdel(myseed) + myseed = null + dead = 0 + name = initial(name) + desc = initial(desc) + update_icon() + ..() diff --git a/code/modules/research/designs/machine_desings/machine_designs_service.dm b/code/modules/research/designs/machine_desings/machine_designs_service.dm index 5cbff1c66a..af4f650793 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_service.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_service.dm @@ -81,6 +81,14 @@ category = list ("Hydroponics Machinery") departmental_flags = DEPARTMENTAL_FLAG_SERVICE +/datum/design/board/hydroponics/auto + name = "Machine Design (Automatic Hydroponics Tray Board)" + desc = "The circuit board for an automatic hydroponics tray. GIVE ME THE PLANT, CAPTAIN." + id = "autohydrotray" + build_path = /obj/machinery/hydroponics/constructable/automagic + category = list ("Hydroponics Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_MEDICAL + /datum/design/board/monkey_recycler name = "Machine Design (Monkey Recycler Board)" desc = "The circuit board for a monkey recycler." diff --git a/code/modules/research/techweb/nodes/medical_nodes.dm b/code/modules/research/techweb/nodes/medical_nodes.dm index 43fe941ab2..a2fba1741a 100644 --- a/code/modules/research/techweb/nodes/medical_nodes.dm +++ b/code/modules/research/techweb/nodes/medical_nodes.dm @@ -38,7 +38,7 @@ display_name = "Advanced Plumbing Technology" description = "Plumbing RCD." prereq_ids = list("plumbing", "adv_engi", "adv_biotech") - design_ids = list("plumb_rcd") + design_ids = list("plumb_rcd", "autohydrotray") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) //////////////////////Cybernetics///////////////////// From f33487e972fc85cf1724588efc63ce39e57c1609 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Wed, 22 Jul 2020 11:36:50 +1000 Subject: [PATCH 04/84] complie --- .../components/plumbing/reaction_chamber.dm | 1 - icons/obj/plumbing/fluid_ducts.dmi | Bin 0 -> 979 bytes icons/obj/plumbing/plumbers.dmi | Bin 0 -> 16528 bytes tgstation.dme | 23 ++++++++++++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 icons/obj/plumbing/fluid_ducts.dmi create mode 100644 icons/obj/plumbing/plumbers.dmi diff --git a/code/datums/components/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm index d0a9416e34..6435d11ae6 100644 --- a/code/datums/components/plumbing/reaction_chamber.dm +++ b/code/datums/components/plumbing/reaction_chamber.dm @@ -32,7 +32,6 @@ RC.reagent_flags &= ~NO_REACT reagents.handle_reactions() - Add when everything works: if(reagents.fermiIsReacting) return RC.emptying = TRUE diff --git a/icons/obj/plumbing/fluid_ducts.dmi b/icons/obj/plumbing/fluid_ducts.dmi new file mode 100644 index 0000000000000000000000000000000000000000..87d9d2233b43ec1fe08f2f0d529166c3c74131d0 GIT binary patch literal 979 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 HZ`5_WK4d- zgK3xKPT`?liAP0eGyala%(Vl)^gC!MxV0f%je;+c762X2E8xC_Xon_M+^DSHlseh@ z1FJ8$olJH7sd&%o{5)^kcGTvT!6Pc%&X~BEn6(tMf3mzBV+-yVEmcH<7_`6uf)okd zR*|SH(2qt(5{b$RJGqUPwXg0bOFvdIw5Q^IWvp#XN_IL8`j~)9Pc-7{J!%>b)f(IUIUbHeV30hmIpJx}`Nh zll~{&@yiF(@wh*7>IdCo-92ez?e|lC4Wn;Sw^f+3@J`(l`KTN~;rUhstkt{zIq+6x zml8F|K1%1}^Kdt7-AbLnkjBT0&5X1s2z)rBU*#cR`s1_$^7@3^SX1d0}V)prRQ%tEv;Wz?G|}& zQZf_|x_R0;JpE+uXJ8Y%zbcvc12Zoa{?*V4Vq0hgE6%k(Ur0!t#D0qbYYI~oJIz|( z|5B7?$$Waq{+`k}8p+3u>=L95iGr(XAKQuo!jBsi?Bi)u9j#~9Ui*R~R5V4{9->~$ zT&pw!Lj_{Q)j#z`g1!V6CulrbM4$t=Yyaf7ZPB0+=OlgOO`^a$B3PG&4@19X_}AMj z->}mmHj=pb$(B}b{1VeIXENb0dIXIa$2(cucFAQYLxY)KF_J!wT+ABtcAGMJl-#+T rX$TS(C~FEO&j^hd5RUC2(OfYe(THM}i3WdZ0MNN@sPR$F_WAz<->$Gj literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 2c5d30e2b7..f6e46312d0 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -79,6 +79,7 @@ #include "code\__DEFINES\networks.dm" #include "code\__DEFINES\pinpointers.dm" #include "code\__DEFINES\pipe_construction.dm" +#include "code\__DEFINES\plumbing.dm" #include "code\__DEFINES\pool.dm" #include "code\__DEFINES\power.dm" #include "code\__DEFINES\preferences.dm" @@ -289,6 +290,7 @@ #include "code\controllers\subsystem\events.dm" #include "code\controllers\subsystem\fail2topic.dm" #include "code\controllers\subsystem\fire_burning.dm" +#include "code\controllers\subsystem\fluid.dm" #include "code\controllers\subsystem\garbage.dm" #include "code\controllers\subsystem\holodeck.dm" #include "code\controllers\subsystem\icon_smooth.dm" @@ -362,6 +364,7 @@ #include "code\datums\datumvars.dm" #include "code\datums\dna.dm" #include "code\datums\dog_fashion.dm" +#include "code\datums\ductnet.dm" #include "code\datums\emotes.dm" #include "code\datums\ert.dm" #include "code\datums\explosion.dm" @@ -472,6 +475,11 @@ #include "code\datums\components\fantasy\affix.dm" #include "code\datums\components\fantasy\prefixes.dm" #include "code\datums\components\fantasy\suffixes.dm" +#include "code\datums\components\plumbing\_plumbing.dm" +#include "code\datums\components\plumbing\chemical_acclimator.dm" +#include "code\datums\components\plumbing\filter.dm" +#include "code\datums\components\plumbing\reaction_chamber.dm" +#include "code\datums\components\plumbing\splitter.dm" #include "code\datums\components\storage\storage.dm" #include "code\datums\components\storage\ui.dm" #include "code\datums\components\storage\concrete\_concrete.dm" @@ -1181,6 +1189,7 @@ #include "code\game\objects\structures\flora.dm" #include "code\game\objects\structures\fluff.dm" #include "code\game\objects\structures\fugitive_role_spawners.dm" +#include "code\game\objects\structures\geyser.dm" #include "code\game\objects\structures\ghost_role_spawners.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\grille.dm" @@ -2797,6 +2806,20 @@ #include "code\modules\photography\photos\album.dm" #include "code\modules\photography\photos\frame.dm" #include "code\modules\photography\photos\photo.dm" +#include "code\modules\plumbing\ducts.dm" +#include "code\modules\plumbing\plumbers\_plumb_machinery.dm" +#include "code\modules\plumbing\plumbers\acclimator.dm" +#include "code\modules\plumbing\plumbers\autohydro.dm" +#include "code\modules\plumbing\plumbers\bottler.dm" +#include "code\modules\plumbing\plumbers\destroyer.dm" +#include "code\modules\plumbing\plumbers\fermenter.dm" +#include "code\modules\plumbing\plumbers\filter.dm" +#include "code\modules\plumbing\plumbers\grinder_chemical.dm" +#include "code\modules\plumbing\plumbers\pill_press.dm" +#include "code\modules\plumbing\plumbers\pumps.dm" +#include "code\modules\plumbing\plumbers\reaction_chamber.dm" +#include "code\modules\plumbing\plumbers\splitters.dm" +#include "code\modules\plumbing\plumbers\synthesizer.dm" #include "code\modules\pool\pool_controller.dm" #include "code\modules\pool\pool_drain.dm" #include "code\modules\pool\pool_effects.dm" From 17d1fd0692a568984c90e7df2641c3facb7c4150 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Wed, 22 Jul 2020 12:42:46 +1000 Subject: [PATCH 05/84] fixes --- code/datums/components/plumbing/_plumbing.dm | 4 +- .../plumbing/chemical_acclimator.dm | 2 +- code/datums/components/plumbing/filter.dm | 4 +- .../components/plumbing/reaction_chamber.dm | 10 +-- code/game/objects/items/RCD.dm | 19 +++-- code/game/objects/structures/geyser.dm | 74 ---------------- .../turfs/simulated/floor/plating/asteroid.dm | 11 +++ code/modules/asset_cache/asset_list_items.dm | 2 +- .../plumbing/plumbers/_plumb_machinery.dm | 3 +- code/modules/plumbing/plumbers/acclimator.dm | 4 +- code/modules/plumbing/plumbers/bottler.dm | 2 +- code/modules/plumbing/plumbers/fermenter.dm | 25 ++++-- code/modules/plumbing/plumbers/filter.dm | 4 +- .../plumbing/plumbers/grinder_chemical.dm | 28 +++--- code/modules/plumbing/plumbers/pill_press.dm | 80 +++++++++++------- code/modules/plumbing/plumbers/pumps.dm | 59 +++++-------- code/modules/plumbing/plumbers/synthesizer.dm | 4 +- code/modules/reagents/chemistry/reagents.dm | 8 ++ .../chemistry/reagents/medicine_reagents.dm | 16 ++-- .../chemistry/reagents/other_reagents.dm | 16 +++- .../chemistry/reagents/toxin_reagents.dm | 1 + .../reagents/chemistry/recipes/medicine.dm | 8 +- .../reagents/chemistry/recipes/others.dm | 35 +++++++- .../research/designs/medical_designs.dm | 2 +- code/modules/vending/medical.dm | 3 +- icons/obj/lavaland/terrain.dmi | Bin 0 -> 771 bytes tgstation.dme | 1 - 27 files changed, 222 insertions(+), 203 deletions(-) delete mode 100644 code/game/objects/structures/geyser.dm create mode 100644 icons/obj/lavaland/terrain.dmi diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm index 22b8bafde5..6592e41103 100644 --- a/code/datums/components/plumbing/_plumbing.dm +++ b/code/datums/components/plumbing/_plumbing.dm @@ -17,7 +17,7 @@ var/turn_connects = TRUE /datum/component/plumbing/Initialize(start=TRUE, _turn_connects=TRUE) //turn_connects for wheter or not we spin with the object to change our pipes - if(parent && !ismovableatom(parent)) + if(parent && !istype(parent, /atom/movable)) return COMPONENT_INCOMPATIBLE var/atom/movable/AM = parent if(!AM.reagents) @@ -77,7 +77,7 @@ if(reagent) //only asked for one type of reagent for(var/A in reagents.reagent_list) var/datum/reagent/R = A - if(R.id == reagent) + if(R.type == reagent) return TRUE else if(reagents.total_volume > 0) //take whatever return TRUE diff --git a/code/datums/components/plumbing/chemical_acclimator.dm b/code/datums/components/plumbing/chemical_acclimator.dm index 44a1396c6d..1cbe6ff017 100644 --- a/code/datums/components/plumbing/chemical_acclimator.dm +++ b/code/datums/components/plumbing/chemical_acclimator.dm @@ -1,4 +1,4 @@ -v/datum/component/plumbing/acclimator +/datum/component/plumbing/acclimator demand_connects = WEST supply_connects = EAST var/obj/machinery/plumbing/acclimator/AC diff --git a/code/datums/components/plumbing/filter.dm b/code/datums/components/plumbing/filter.dm index cfbfb641da..55647a353b 100644 --- a/code/datums/components/plumbing/filter.dm +++ b/code/datums/components/plumbing/filter.dm @@ -35,12 +35,12 @@ else for(var/A in reagents.reagent_list) var/datum/reagent/R = A - if(!can_give_in_direction(direction, R.id)) + if(!can_give_in_direction(direction, R)) continue var/new_amount if(R.volume < amount) new_amount = amount - R.volume - reagents.trans_id_to(target.parent, R.id, amount) + reagents.trans_id_to(target.parent, R, amount) amount = new_amount if(amount <= 0) break diff --git a/code/datums/components/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm index 6435d11ae6..705611ed1a 100644 --- a/code/datums/components/plumbing/reaction_chamber.dm +++ b/code/datums/components/plumbing/reaction_chamber.dm @@ -17,17 +17,17 @@ var/obj/machinery/plumbing/reaction_chamber/RC = parent if(RC.emptying || !LAZYLEN(RC.required_reagents)) return - for(var/RTid in RC.required_reagents) + for(var/RT in RC.required_reagents) var/has_reagent = FALSE for(var/A in reagents.reagent_list) var/datum/reagent/RD = A - if(RTid == RD.id) + if(RT == RD) has_reagent = TRUE - if(RD.volume < RC.required_reagents[RTid]) - process_request(min(RC.required_reagents[RTid] - RD.volume, MACHINE_REAGENT_TRANSFER) , RTid, dir) + if(RD.volume < RC.required_reagents[RT]) + process_request(min(RC.required_reagents[RT] - RD.volume, MACHINE_REAGENT_TRANSFER) , RT, dir) return if(!has_reagent) - process_request(min(RC.required_reagents[RTid], MACHINE_REAGENT_TRANSFER), RTid, dir) + process_request(min(RC.required_reagents[RT], MACHINE_REAGENT_TRANSFER), RT, dir) return RC.reagent_flags &= ~NO_REACT diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 29a04237ea..3ec0da70c5 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -135,6 +135,14 @@ RLD flick("[icon_state]_empty", src) //somewhat hacky thing to make RCDs with ammo counters actually have a blinking yellow light return . + +/obj/item/construction/proc/check_menu(mob/living/user) + if(!istype(user)) + return FALSE + if(user.incapacitated() || !user.Adjacent(src)) + return FALSE + return TRUE + /obj/item/construction/proc/range_check(atom/A, mob/user) if(!(A in range(custom_range, get_turf(user)))) to_chat(user, "The \'Out of Range\' light on [src] blinks red.") @@ -276,13 +284,6 @@ RLD //Not scaling these down to button size because they look horrible then, instead just bumping up radius. return MA -/obj/item/construction/rcd/proc/check_menu(mob/living/user) - if(!istype(user)) - return FALSE - if(user.incapacitated() || !user.Adjacent(src)) - return FALSE - return TRUE - /obj/item/construction/rcd/proc/change_computer_dir(mob/user) if(!user) return @@ -915,9 +916,9 @@ RLD if(O.density) //let's not built ontop of dense stuff, like big machines and other obstacles, it kills my immershion return FALSE -/obj/item/construction/plumbing/afterattack(atom/A, mob/user, proximity) +/obj/item/construction/plumbing/afterattack(atom/A, mob/user) . = ..() - if(!prox_check(proximity)) + if(!range_check(A, user)) return if(istype(A, /obj/machinery/plumbing)) var/obj/machinery/plumbing/P = A diff --git a/code/game/objects/structures/geyser.dm b/code/game/objects/structures/geyser.dm deleted file mode 100644 index 1d77a3c4f8..0000000000 --- a/code/game/objects/structures/geyser.dm +++ /dev/null @@ -1,74 +0,0 @@ -//If you look at the "geyser_soup" overlay icon_state, you'll see that the first frame has 25 ticks. -//That's because the first 18~ ticks are completely skipped for some ungodly weird fucking byond reason - -/obj/structure/geyser - name = "geyser" - icon = 'icons/obj/lavaland/terrain.dmi' - icon_state = "geyser" - anchored = TRUE - var/decay = 0 //reagents/tick removed - var/erupting_state = null //set to null to get it greyscaled from "[icon_state]_soup". Not very usable with the whole random thing, but more types can be added if you change the spawn prob - var/activated = FALSE //whether we are active and generating chems - var/reagent_id = "oil" - var/potency = 2 //how much reagents we add every process (2 seconds) - var/max_volume = 500 - var/start_volume = 50 - -/obj/structure/geyser/proc/start_chemming() - activated = TRUE - create_reagents(max_volume, DRAINABLE) - reagents.add_reagent(reagent_id, start_volume) - START_PROCESSING(SSfluids, src) //It's main function is to be plumbed, so use SSfluids - if(erupting_state) - icon_state = erupting_state - else - var/mutable_appearance/I = mutable_appearance('icons/obj/lavaland/terrain.dmi', "[icon_state]_soup") - I.color = mix_color_from_reagents(reagents.reagent_list) - add_overlay(I) - -/obj/structure/geyser/process() - if(activated && reagents.total_volume <= reagents.maximum_volume) //this is also evaluated in add_reagent, but from my understanding proc calls are expensive and should be avoided in continous - reagents.add_reagent(reagent_id, potency) //processes - if(potency > 0) - potency =- decay //decaying! - -/obj/structure/geyser/plunger_act(obj/item/plunger/P, mob/living/user, _reinforced) - if(!_reinforced) - to_chat(user, "The [P.name] isn't strong enough!") - return - if(activated) - to_chat(user, "The [name] is already active!") - return - - to_chat(user, "You start vigorously plunging [src]!") - if(do_after(user, 50*P.plunge_mod, target = src) && !activated) - start_chemming() - -/obj/structure/geyser/random - erupting_state = null - var/list/options = list("oil" = 2, "clf3" = 1) //formerly crudeoil, 2,1 -/obj/structure/geyser/random/Initialize() - . = ..() - reagent_id = pickweight(options) - -/obj/item/plunger - name = "plunger" - desc = "It's a plunger for plunging." - icon = 'icons/obj/watercloset.dmi' - icon_state = "plunger" - slot_flags = ITEM_SLOT_MASK - - var/plunge_mod = 1 //time*plunge_mod = total time we take to plunge an object - var/reinforced = FALSE //whether we do heavy duty stuff like geysers - -/obj/item/plunger/attack_obj(obj/O, mob/living/user) - if(!O.plunger_act(src, user, reinforced)) - return ..() - -/obj/item/plunger/reinforced - name = "reinforced plunger" - desc = " It's an M. 7 Reinforced Plunger for heavy duty plunging." - icon_state = "reinforced_plunger" - - reinforced = TRUE - plunge_mod = 0.8 diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index 1fbeee7523..f862a314a7 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -334,8 +334,19 @@ spawned_flora = SpawnFlora(T) if(!spawned_flora) // no rocks beneath mob spawners / mobs. SpawnMonster(T) + SpawnTerrain(T) T.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR) +/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnTerrain(turf/T) + if(prob(1)) + if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored)) + return + var/randumb = pickweight(terrain_spawn_list) + for(var/obj/structure/geyser/F in range(7, T)) + if(istype(F, randumb)) + return + new randumb(T) + /// Spawns a random mob or megafauna in the tunnel /turf/open/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T) if(!isarea(loc)) diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index e44c5e2a3f..febf3a84e5 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -266,7 +266,7 @@ name = "pipes" /datum/asset/spritesheet/pipes/register() - for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi', 'icons/obj/plumbing/fluid_ducts.dmi')) + for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi', 'icons/obj/plumbing/fluid_ducts.dmi')) InsertAll("", each, GLOB.alldirs) ..() diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm index 1ea7ab56b1..0566945e3b 100644 --- a/code/modules/plumbing/plumbers/_plumb_machinery.dm +++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm @@ -26,11 +26,12 @@ . = ..() anchored = bolt create_reagents(buffer, reagent_flags) - AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ) + AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated)) /obj/machinery/plumbing/proc/can_be_rotated(mob/user,rotation_type) return TRUE + /obj/machinery/plumbing/examine(mob/user) . = ..() . += "The maximum volume display reads: [reagents.maximum_volume] units." diff --git a/code/modules/plumbing/plumbers/acclimator.dm b/code/modules/plumbing/plumbers/acclimator.dm index 475614c421..1b4ebe8808 100644 --- a/code/modules/plumbing/plumbers/acclimator.dm +++ b/code/modules/plumbing/plumbers/acclimator.dm @@ -25,8 +25,8 @@ and you get nasty leftovers */ var/emptying = FALSE - var/ui_x = 320 - var/ui_y = 310 + ui_x = 320 + ui_y = 310 /obj/machinery/plumbing/acclimator/Initialize(mapload, bolt) . = ..() diff --git a/code/modules/plumbing/plumbers/bottler.dm b/code/modules/plumbing/plumbers/bottler.dm index c6595fc397..57233a5873 100644 --- a/code/modules/plumbing/plumbers/bottler.dm +++ b/code/modules/plumbing/plumbers/bottler.dm @@ -56,7 +56,7 @@ to_chat(user, " The [src] will now fill for [wanted_amount]u.") /obj/machinery/plumbing/bottler/process() - if(machine_stat & NOPOWER) + if(stat & NOPOWER) return ///see if machine has enough to fill if(reagents.total_volume >= wanted_amount && anchored) diff --git a/code/modules/plumbing/plumbers/fermenter.dm b/code/modules/plumbing/plumbers/fermenter.dm index e13ae3feff..b1e1e4b676 100644 --- a/code/modules/plumbing/plumbers/fermenter.dm +++ b/code/modules/plumbing/plumbers/fermenter.dm @@ -14,17 +14,25 @@ . = ..() AddComponent(/datum/component/plumbing/simple_supply, bolt) -/obj/machinery/plumbing/grinder_chemical/can_be_rotated(mob/user, rotation_type) +/obj/machinery/plumbing/fermenter/can_be_rotated(mob/user,rotation_type) if(anchored) to_chat(user, "It is fastened to the floor!") return FALSE - return TRUE + switch(eat_dir) + if(WEST) + eat_dir = NORTH + return TRUE + if(EAST) + eat_dir = SOUTH + return TRUE + if(NORTH) + eat_dir = EAST + return TRUE + if(SOUTH) + eat_dir = WEST + return TRUE -/obj/machinery/plumbing/fermenter/setDir(newdir) - . = ..() - eat_dir = newdir - -/obj/machinery/plumbing/fermenter/CanAllowThrough(atom/movable/AM) +/obj/machinery/plumbing/fermenter/CanPass(atom/movable/AM) . = ..() if(!anchored) return @@ -36,9 +44,8 @@ . = ..() ferment(AM) -/// uses fermentation proc similar to fermentation barrels /obj/machinery/plumbing/fermenter/proc/ferment(atom/AM) - if(machine_stat & NOPOWER) + if(stat & NOPOWER) return if(reagents.holder_full()) return diff --git a/code/modules/plumbing/plumbers/filter.dm b/code/modules/plumbing/plumbers/filter.dm index 3058120b9d..b748c576e7 100644 --- a/code/modules/plumbing/plumbers/filter.dm +++ b/code/modules/plumbing/plumbers/filter.dm @@ -12,8 +12,8 @@ var/list/english_left = list() ///whitelist of chems but their name instead of path var/list/english_right = list() - var/ui_x = 320 - var/ui_y = 310 + ui_x = 320 + ui_y = 310 /obj/machinery/plumbing/filter/Initialize(mapload, bolt) diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm index 4fa0d9e2cc..d080bd7c8f 100644 --- a/code/modules/plumbing/plumbers/grinder_chemical.dm +++ b/code/modules/plumbing/plumbers/grinder_chemical.dm @@ -7,23 +7,31 @@ rcd_cost = 30 rcd_delay = 30 buffer = 400 - var/eat_dir = SOUTH + var/eat_dir = NORTH /obj/machinery/plumbing/grinder_chemical/Initialize(mapload, bolt) . = ..() AddComponent(/datum/component/plumbing/simple_supply, bolt) -/obj/machinery/plumbing/grinder_chemical/can_be_rotated(mob/user, rotation_type) +/obj/machinery/plumbing/grinder_chemical/can_be_rotated(mob/user,rotation_type) if(anchored) to_chat(user, "It is fastened to the floor!") return FALSE - return TRUE + switch(eat_dir) + if(WEST) + eat_dir = NORTH + return TRUE + if(EAST) + eat_dir = SOUTH + return TRUE + if(NORTH) + eat_dir = EAST + return TRUE + if(SOUTH) + eat_dir = WEST + return TRUE -/obj/machinery/plumbing/grinder_chemical/setDir(newdir) - . = ..() - eat_dir = newdir - -/obj/machinery/plumbing/grinder_chemical/CanAllowThrough(atom/movable/AM) +/obj/machinery/plumbing/grinder_chemical/CanPass(atom/movable/AM) . = ..() if(!anchored) return @@ -36,7 +44,7 @@ grind(AM) /obj/machinery/plumbing/grinder_chemical/proc/grind(atom/AM) - if(machine_stat & NOPOWER) + if(stat & NOPOWER) return if(reagents.holder_full()) return @@ -53,6 +61,4 @@ return I.on_grind() reagents.add_reagent_list(I.grind_results) - if(I.reagents) - I.reagents.trans_to(src, I.reagents.total_volume, transfered_by = src) qdel(I) diff --git a/code/modules/plumbing/plumbers/pill_press.dm b/code/modules/plumbing/plumbers/pill_press.dm index 9c2505661c..56510fac87 100644 --- a/code/modules/plumbing/plumbers/pill_press.dm +++ b/code/modules/plumbing/plumbers/pill_press.dm @@ -1,28 +1,36 @@ ///We take a constant input of reagents, and produce a pill once a set volume is reached /obj/machinery/plumbing/pill_press - name = "pill press" - desc = "A press that presses pills." + name = "chemical press" + desc = "A press that makes pills, patches and bottles." icon_state = "pill_press" - ///the minimum size a pill can be - var/minimum_pill = 5 - ///the maximum size a pill can be - var/maximum_pill = 50 - ///the size of the pill - var/pill_size = 10 - ///pill name - var/pill_name = "factory pill" + ///maximum size of a pill + var/max_pill_volume = 50 + ///maximum size of a patch + var/max_patch_volume = 40 + ///maximum size of a bottle + var/max_bottle_volume = 30 + ///current operating product (pills or patches) + var/product = "pill" + ///the minimum size a pill or patch can be + var/min_volume = 5 + ///the maximum size a pill or patch can be + var/max_volume = 50 + ///selected size of the product + var/current_volume = 10 + ///prefix for the product name + var/product_name = "factory" ///the icon_state number for the pill. var/pill_number = RANDOM_PILL_STYLE ///list of id's and icons for the pill selection of the ui var/list/pill_styles - ///list of pills stored in the machine, so we dont have 610 pills on one tile - var/list/stored_pills = list() + ///list of products stored in the machine, so we dont have 610 pills on one tile + var/list/stored_products = list() ///max amount of pills allowed on our tile before we start storing them instead - var/max_floor_pills = 10 + var/max_floor_products = 50 //haha massive pill piles /obj/machinery/plumbing/pill_press/examine(mob/user) . = ..() - . += "The [name] currently has [stored_pills.len] stored. There needs to be less than [max_floor_pills] on the floor to continue dispensing." + . += "The [name] currently has [stored_products.len] stored. There needs to be less than [max_floor_products ] on the floor to continue dispensing." /obj/machinery/plumbing/pill_press/Initialize(mapload, bolt) . = ..() @@ -37,29 +45,41 @@ SL["htmltag"] = assets.icon_tag("pill[x]") pill_styles += list(SL) + /obj/machinery/plumbing/pill_press/process() if(stat & NOPOWER) return - if(reagents.total_volume >= pill_size) - var/obj/item/reagent_containers/pill/P = new(src) - reagents.trans_to(P, pill_size) - P.name = pill_name - stored_pills += P - if(pill_number == RANDOM_PILL_STYLE) - P.icon_state = "pill[rand(1,21)]" - else - P.icon_state = "pill[pill_number]" - if(P.icon_state == "pill4") //mirrored from chem masters - P.desc = "A tablet or capsule, but not just any, a red one, one taken by the ones not scared of knowledge, freedom, uncertainty and the brutal truths of reality." - if(stored_pills.len) + if(reagents.total_volume >= current_volume) + if (product == "pill") + var/obj/item/reagent_containers/pill/P = new(src) + reagents.trans_to(P, current_volume) + P.name = trim("[product_name] pill") + stored_products += P + if(pill_number == RANDOM_PILL_STYLE) + P.icon_state = "pill[rand(1,21)]" + else + P.icon_state = "pill[pill_number]" + if(P.icon_state == "pill4") //mirrored from chem masters + P.desc = "A tablet or capsule, but not just any, a red one, one taken by the ones not scared of knowledge, freedom, uncertainty and the brutal truths of reality." + else if (product == "patch") + var/obj/item/reagent_containers/pill/patch/P = new(src) + reagents.trans_to(P, current_volume) + P.name = trim("[product_name] patch") + stored_products += P + else if (product == "bottle") + var/obj/item/reagent_containers/glass/bottle/P = new(src) + reagents.trans_to(P, current_volume) + P.name = trim("[product_name] bottle") + stored_products += P + if(stored_products.len) var/pill_amount = 0 for(var/obj/item/reagent_containers/pill/P in loc) pill_amount++ - if(pill_amount >= max_floor_pills) //too much so just stop + if(pill_amount >= max_floor_products) //too much so just stop break - if(pill_amount < max_floor_pills) - var/atom/movable/AM = stored_pills[1] //AM because forceMove is all we need - stored_pills -= AM + if(pill_amount < max_floor_products) + var/atom/movable/AM = stored_products[1] //AM because forceMove is all we need + stored_products -= AM AM.forceMove(drop_location()) diff --git a/code/modules/plumbing/plumbers/pumps.dm b/code/modules/plumbing/plumbers/pumps.dm index aeec8c9994..c24e48098d 100644 --- a/code/modules/plumbing/plumbers/pumps.dm +++ b/code/modules/plumbing/plumbers/pumps.dm @@ -1,15 +1,17 @@ -///We pump liquids from activated(plungerated) geysers to a plumbing outlet. We need to be wired. -/obj/machinery/power/liquid_pump +///We pump liquids from activated(plungerated) geysers to a plumbing outlet. We don't need to be wired. +/obj/machinery/plumbing/liquid_pump name = "liquid pump" - desc = "Pump up those sweet liquids from under the surface." + desc = "Pump up those sweet liquids from under the surface. Uses thermal energy from geysers to power itself." //better than placing 200 cables, because it wasnt fun icon = 'icons/obj/plumbing/plumbers.dmi' icon_state = "pump" anchored = FALSE density = TRUE idle_power_usage = 10 active_power_usage = 1000 - ///Are we powered? - var/powered = FALSE + + rcd_cost = 30 + rcd_delay = 40 + ///units we pump per process (2 seconds) var/pump_power = 2 ///set to true if the loop couldnt find a geyser in process, so it remembers and stops checking every loop until moved. more accurate name would be absolutely_no_geyser_under_me_so_dont_try @@ -19,63 +21,42 @@ ///volume of our internal buffer var/volume = 200 -/obj/machinery/power/liquid_pump/Initialize() +/obj/machinery/plumbing/liquid_pump/Initialize(mapload, bolt) . = ..() - create_reagents(volume) - AddComponent(/datum/component/plumbing/simple_supply, TRUE) + AddComponent(/datum/component/plumbing/simple_supply, bolt) -/obj/machinery/power/liquid_pump/attackby(obj/item/W, mob/user, params) - if(!powered) - if(!anchored) - if(default_deconstruction_screwdriver(user, "[initial(icon_state)]_open", "[initial(icon_state)]",W)) - return - if(default_deconstruction_crowbar(W)) - return - return ..() - -/obj/machinery/power/liquid_pump/wrench_act(mob/living/user, obj/item/I) - ..() - default_unfasten_wrench(user, I) - return TRUE ///please note that the component has a hook in the parent call, wich handles activating and deactivating -/obj/machinery/power/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20) +/obj/machinery/plumbing/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20) . = ..() if(. == SUCCESSFUL_UNFASTEN) geyser = null update_icon() - powered = FALSE geyserless = FALSE //we switched state, so lets just set this back aswell -/obj/machinery/power/liquid_pump/process() - if(!anchored || panel_open) +/obj/machinery/plumbing/liquid_pump/process() + if(!anchored || panel_open || geyserless) return - if(!geyser && !geyserless) + + if(!geyser) for(var/obj/structure/geyser/G in loc.contents) geyser = G + update_icon() if(!geyser) //we didnt find one, abort - anchored = FALSE geyserless = TRUE visible_message("The [name] makes a sad beep!") playsound(src, 'sound/machines/buzz-sigh.ogg', 50) return - if(avail(active_power_usage)) - if(!powered) //we werent powered before this tick so update our sprite - powered = TRUE - update_icon() - add_load(active_power_usage) - pump() - else if(powered) //we were powered, but now we arent - powered = FALSE - update_icon() + pump() + ///pump up that sweet geyser nectar -/obj/machinery/power/liquid_pump/proc/pump() +/obj/machinery/plumbing/liquid_pump/proc/pump() if(!geyser || !geyser.reagents) return geyser.reagents.trans_to(src, pump_power) -/obj/machinery/power/liquid_pump/update_icon() - if(powered) +/obj/machinery/plumbing/liquid_pump/update_icon_state() + if(geyser) icon_state = initial(icon_state) + "-on" else if(panel_open) icon_state = initial(icon_state) + "-open" diff --git a/code/modules/plumbing/plumbers/synthesizer.dm b/code/modules/plumbing/plumbers/synthesizer.dm index 2d782e9d3e..c2bc3439ff 100644 --- a/code/modules/plumbing/plumbers/synthesizer.dm +++ b/code/modules/plumbing/plumbers/synthesizer.dm @@ -34,7 +34,7 @@ /datum/reagent/oxygen, /datum/reagent/phosphorus, /datum/reagent/potassium, - /datum/reagent/uranium/radium, + /datum/reagent/radium, /datum/reagent/silicon, /datum/reagent/silver, /datum/reagent/sodium, @@ -51,7 +51,7 @@ AddComponent(/datum/component/plumbing/simple_supply, bolt) /obj/machinery/plumbing/synthesizer/process() - if(machine_stat & NOPOWER || !reagent_id || !amount) + if(stat & NOPOWER || !reagent_id || !amount) return if(reagents.total_volume >= amount) //otherwise we get leftovers, and we need this to be precise return diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index cdda9d0469..f2add0bd4f 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -53,6 +53,14 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/metabolizing = FALSE var/chemical_flags // See fermi/readme.dm REAGENT_DEAD_PROCESS, REAGENT_DONOTSPLIT, REAGENT_ONLYINVERSE, REAGENT_ONMOBMERGE, REAGENT_INVISIBLE, REAGENT_FORCEONNEW, REAGENT_SNEAKYNAME var/value = REAGENT_VALUE_NONE //How much does it sell for in cargo? + var/datum/material/material //are we made of material? + +/datum/reagent/New() + . = ..() + + if(material) + material = getmaterialref(material) + /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index b9da8271ab..b173df3282 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -505,12 +505,13 @@ overdose_threshold = 30 pH = 2 value = REAGENT_VALUE_UNCOMMON + var/healing = 0.5 /datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M) - M.adjustToxLoss(-0.5*REM, 0) - M.adjustOxyLoss(-0.5*REM, 0) - M.adjustBruteLoss(-0.5*REM, 0) - M.adjustFireLoss(-0.5*REM, 0) + M.adjustToxLoss(-healing*REM, 0) + M.adjustOxyLoss(-healing*REM, 0) + M.adjustBruteLoss(-healing*REM, 0) + M.adjustFireLoss(-healing*REM, 0) ..() . = 1 @@ -522,6 +523,12 @@ ..() . = 1 +/datum/reagent/medicine/omnizine/protozine + name = "Protozine" + description = "A less environmentally friendly and somewhat weaker variant of omnizine." + color = "#d8c7b7" + healing = 0.2 + /datum/reagent/medicine/calomel name = "Calomel" description = "Quickly purges the body of all chemicals. Toxin damage is dealt if the patient is in good condition." @@ -1587,4 +1594,3 @@ if(prob(3)) to_chat(C, "[pick(GLOB.wisdoms)]") //give them a random wisdom ..() - diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 4c66b0e51e..b249310d7e 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -308,6 +308,13 @@ metabolization_rate = 45 * REAGENTS_METABOLISM . = 1 +/datum/reagent/water/hollowwater + name = "Hollow Water" + description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen, but it looks kinda hollow." + color = "#88878777" + taste_description = "emptyiness" + + /datum/reagent/water/holywater name = "Holy Water" description = "Water blessed by some deity." @@ -943,6 +950,7 @@ color = "#1C1300" // rgb: 30, 20, 0 taste_description = "sour chalk" pH = 5 + material = /datum/material/diamond /datum/reagent/carbon/reaction_turf(turf/T, reac_volume) if(!isspaceturf(T)) @@ -1065,6 +1073,7 @@ pH = 6 overdose_threshold = 30 color = "#c2391d" + material = /datum/material/iron /datum/reagent/iron/on_mob_life(mob/living/carbon/C) if((HAS_TRAIT(C, TRAIT_NOMARROW))) @@ -1096,6 +1105,7 @@ reagent_state = SOLID color = "#F7C430" // rgb: 247, 196, 48 taste_description = "expensive metal" + material = /datum/material/gold /datum/reagent/silver name = "Silver" @@ -1103,6 +1113,7 @@ reagent_state = SOLID color = "#D0D0D0" // rgb: 208, 208, 208 taste_description = "expensive yet reasonable metal" + material = /datum/material/silver /datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(M.has_bane(BANE_SILVER)) @@ -1116,6 +1127,7 @@ color = "#B8B8C0" // rgb: 184, 184, 192 taste_description = "the inside of a reactor" pH = 4 + material = /datum/material/uranium /datum/reagent/uranium/on_mob_life(mob/living/carbon/M) M.apply_effect(1/M.metabolism_efficiency,EFFECT_IRRADIATE,0) @@ -1137,6 +1149,7 @@ taste_description = "fizzling blue" pH = 12 value = REAGENT_VALUE_RARE + material = /datum/material/bluespace /datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) @@ -1175,6 +1188,7 @@ color = "#A8A8A8" // rgb: 168, 168, 168 taste_mult = 0 pH = 10 + material = /datum/material/glass /datum/reagent/fuel name = "Welding fuel" @@ -2301,4 +2315,4 @@ description = "A crystaline polydextrose polymer, plants swear by this stuff." reagent_state = SOLID color = "#E6E6DA" - taste_mult = 0 \ No newline at end of file + taste_mult = 0 diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index c7add16fcf..704895b8d4 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -64,6 +64,7 @@ toxpwr = 3 pH = 4 value = REAGENT_VALUE_RARE //sheets are worth more + material = /datum/material/plasma /datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C) if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index e591daeb8e..663d232bb8 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -207,6 +207,12 @@ results = list(/datum/reagent/medicine/strange_reagent = 3) required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) +/datum/chemical_reaction/strange_reagent/alt + name = "Strange Reagent" + id = /datum/reagent/medicine/strange_reagent + results = list(/datum/reagent/medicine/strange_reagent = 2) + required_reagents = list(/datum/reagent/medicine/omnizine/protozine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) + /datum/chemical_reaction/mannitol name = "Mannitol" id = /datum/reagent/medicine/mannitol @@ -333,4 +339,4 @@ /datum/chemical_reaction/medmesh/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) - new /obj/item/stack/medical/mesh/advanced(location) \ No newline at end of file + new /obj/item/stack/medical/mesh/advanced(location) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index f32bc708d0..ddf38749c9 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -1,3 +1,34 @@ +/datum/chemical_reaction/metalgen + name = "metalgen" + id = /datum/reagent/metalgen + required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/bluespace = 1, /datum/reagent/toxin/mutagen = 1) + results = list(/datum/reagent/metalgen = 1) + +/datum/chemical_reaction/metalgen_imprint + name = "metalgen imprint" + id = /datum/reagent/metalgen + required_reagents = list(/datum/reagent/metalgen = 1, /datum/reagent/liquid_dark_matter = 1) + results = list(/datum/reagent/metalgen = 1) + +/datum/chemical_reaction/holywater + name = "Holy Water" + id = /datum/reagent/water/holywater + results = list(/datum/reagent/water/holywater = 1) + required_reagents = list(/datum/reagent/water/hollowwater = 1) + required_catalysts = list(/datum/reagent/water/holywater = 1) + +/datum/chemical_reaction/metalgen_imprint/on_reaction(datum/reagents/holder, created_volume) + var/datum/reagent/metalgen/MM = holder.get_reagent(/datum/reagent/metalgen) + for(var/datum/reagent/R in holder.reagent_list) + if(R.material && R.volume >= 40) + MM.data["material"] = R.material + holder.remove_reagent(R.type, 40) + +/datum/chemical_reaction/gravitum + name = "gravitum" + id = /datum/reagent/gravitum + required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/sorium = 10) + results = list(/datum/reagent/gravitum = 10) /datum/chemical_reaction/sterilizine name = "Sterilizine" @@ -711,7 +742,7 @@ /datum/chemical_reaction/slime_extractification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) new /obj/item/slime_extract/grey(location) - + // Liquid Carpets /datum/chemical_reaction/carpet @@ -837,4 +868,4 @@ /datum/chemical_reaction/cellulose_carbonization results = list(/datum/reagent/carbon = 1) required_reagents = list(/datum/reagent/cellulose = 1) - required_temp = 512 \ No newline at end of file + required_temp = 512 diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 0598ebf9ab..7d4950cee5 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -1115,4 +1115,4 @@ construction_time = 150 build_path = /obj/item/construction/plumbing category = list("Misc","Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCEs + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index fbd9a10bf2..2cdc7891c7 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -41,7 +41,8 @@ /obj/item/wrench/medical = 1, /obj/item/storage/belt/medolier/full = 2, /obj/item/gun/syringe/dart = 2, - /obj/item/storage/briefcase/medical = 2) + /obj/item/storage/briefcase/medical = 2, + /obj/item/plunger/reinforced = 2) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF diff --git a/icons/obj/lavaland/terrain.dmi b/icons/obj/lavaland/terrain.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4db51145eeef144f90f9f37f1065da9be3d46aa6 GIT binary patch literal 771 zcmV+e1N{7nP)QvN*L!iHkEOv#1y-V93RpR+N~V3Spxui%(3> zOu??!6eyaSlUNC2>Oi0c(EgnK`~rx|qSW%tycDda7U!21U^mqaVX6_#SRh0)S6RW; z&jsvr07@rD&a+2(_y7O_;Ymb6RA_=|4*pM5!Shep-&-+suPf$?DsA%qY@2qE;Ao4Ky*O!Doi zJtE@HcrO-9)yxZo5bNQ}neWpyP0XHcMdbRT;DbMvKUAlm%b%&y%wO;1JH`|^z00!H z{j59r<5^6b-ELQ86pi=y$KK2@C<=oxSX1td_g!x{-ei0o5GUG3S9m6hEb~KJMU;iP zJK5|VeF@3`mQn6;ZzY_mW=!}YkBL5z7et|Wm~451JTTZ>ZEU(1bCJ3_p$jO%9 zK^%Ix+6W!zxzz48Fv9`M8sZtvKu2UIW3 zuWF$GvE2jGejm_$xTC7n16b2E!-@JHApO)jiC%y6{sFW-z%Q1alYG>7JnjJtWgqw| zop5^Gj(G&rKJYAkci0DPnf8H&^!s)nuyuJKSStH~^@L0Nz^%FuSWmF-1GcaaAcPP? z2qA?2@9MvEUC%APdDZ$JFxmPZ(0M=J-5xMpn76J*yM3sa)0dhzs_NFY(cLv>^t^Lz z^2IJ3(3m``T02y?wf*s*O}3@~cFMhNwZ-V4_8UJGANA)W?9KoH002ovPDHLkV1kyO Bc`*P0 literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index f6e46312d0..2fea4eef9c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1189,7 +1189,6 @@ #include "code\game\objects\structures\flora.dm" #include "code\game\objects\structures\fluff.dm" #include "code\game\objects\structures\fugitive_role_spawners.dm" -#include "code\game\objects\structures\geyser.dm" #include "code\game\objects\structures\ghost_role_spawners.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\grille.dm" From 08547027621707de1b6792c3c1935eafa7b11b48 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Wed, 22 Jul 2020 12:45:42 +1000 Subject: [PATCH 06/84] whoops --- .../chemistry/reagents/other_reagents.dm | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index b249310d7e..e0632a9199 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2220,6 +2220,66 @@ color = "#f7685e" metabolization_rate = REAGENTS_METABOLISM * 0.25 +/datum/reagent/wittel + name = "Wittel" + description = "An extremely rare metallic-white substance only found on demon-class planets." + color = "#FFFFFF" // rgb: 255, 255, 255 + taste_mult = 0 // oderless and tasteless + +/datum/reagent/metalgen + name = "Metalgen" + data = list("material"=null) + description = "A purple metal morphic liquid, said to impose it's metallic properties on whatever it touches." + color = "#b000aa" + taste_mult = 0 // oderless and tasteless + var/applied_material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR + var/minumum_material_amount = 100 + +/datum/reagent/metalgen/reaction_obj(obj/O, volume) + metal_morph(O) + return + +/datum/reagent/metalgen/reaction_turf(turf/T, volume) + metal_morph(T) + return + +///turn an object into a special material +/datum/reagent/metalgen/proc/metal_morph(atom/A) + var/metal_ref = data["material"] + if(!metal_ref) + return + var/metal_amount = 0 + + for(var/B in A.custom_materials) //list with what they're made of + metal_amount += A.custom_materials[B] + + if(!metal_amount) + metal_amount = minumum_material_amount //some stuff doesn't have materials at all. To still give them properties, we give them a material. Basically doesnt exist + + var/list/metal_dat = list() + metal_dat[metal_ref] = metal_amount //if we pass the list directly, byond turns metal_ref into "metal_ref" kjewrg8fwcyvf + + A.material_flags = applied_material_flags + A.set_custom_materials(metal_dat) + +/datum/reagent/gravitum + name = "Gravitum" + description = "A rare kind of null fluid, capable of temporalily removing all weight of whatever it touches." //i dont even + color = "#050096" // rgb: 5, 0, 150 + taste_mult = 0 // oderless and tasteless + metabolization_rate = 0.1 * REAGENTS_METABOLISM //20 times as long, so it's actually viable to use + var/time_multiplier = 1 MINUTES //1 minute per unit of gravitum on objects. Seems overpowered, but the whole thing is very niche + +/datum/reagent/gravitum/reaction_obj(obj/O, volume) + O.AddElement(/datum/element/forced_gravity, 0) + + addtimer(CALLBACK(O, .proc/RemoveElement, /datum/element/forced_gravity, 0), volume * time_multiplier) + +/datum/reagent/gravitum/on_mob_add(mob/living/L) + L.AddElement(/datum/element/forced_gravity, 0) //0 is the gravity, and in this case weightless + +/datum/reagent/gravitum/on_mob_end_metabolize(mob/living/L) + L.RemoveElement(/datum/element/forced_gravity, 0) //body bluids /datum/reagent/consumable/semen From 4affcfcdd718fb8772a4aa230c3b5fed99bf2b27 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Wed, 22 Jul 2020 22:14:49 +1000 Subject: [PATCH 07/84] Update tgstation.dme --- tgstation.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/tgstation.dme b/tgstation.dme index 2fea4eef9c..017ee5bec8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1262,6 +1262,7 @@ #include "code\game\objects\structures\crates_lockers\crates\secure.dm" #include "code\game\objects\structures\crates_lockers\crates\wooden.dm" #include "code\game\objects\structures\icemoon\cave_entrance.dm" +#include "code\game\objects\structures\lavaland\geyser.dm" #include "code\game\objects\structures\lavaland\necropolis_tendril.dm" #include "code\game\objects\structures\signs\_signs.dm" #include "code\game\objects\structures\signs\signs_departments.dm" From 6b23138b3171a4aa81465f67fb6a940ef625c180 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Wed, 22 Jul 2020 22:20:42 +1000 Subject: [PATCH 08/84] l --- code/modules/hydroponics/hydroponics.dm | 9 +++++--- code/modules/hydroponics/seeds.dm | 24 +++++++++++++++++++++ code/modules/plumbing/plumbers/autohydro.dm | 2 +- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 14c510a2d2..efe965e8ea 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -914,11 +914,14 @@ harvest = 0 lastproduce = age if(istype(myseed, /obj/item/seeds/replicapod)) - to_chat(user, "You harvest from the [myseed.plantname].") + if(user)//runtimes + to_chat(user, "You harvest from the [myseed.plantname].") else if(myseed.getYield() <= 0) - to_chat(user, "You fail to harvest anything useful!") + if(user) + to_chat(user, "You fail to harvest anything useful!") else - to_chat(user, "You harvest [myseed.getYield()] items from the [myseed.plantname].") + if(user) + to_chat(user, "You harvest [myseed.getYield()] items from the [myseed.plantname].") if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest)) qdel(myseed) myseed = null diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 5e49a32a23..69b36c58ce 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -190,6 +190,30 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) parent.update_tray(user) return result +/obj/item/seeds/proc/harvest_userless() + var/obj/machinery/hydroponics/parent = loc //for ease of access + var/t_amount = 0 + var/list/result = list() + var/output_loc = parent.loc + while(t_amount < getYield()) + var/obj/item/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, src) + if(parent.myseed.plantname != initial(parent.myseed.plantname)) + t_prod.name = lowertext(parent.myseed.plantname) + if(productdesc) + t_prod.desc = productdesc + t_prod.seed.name = parent.myseed.name + t_prod.seed.desc = parent.myseed.desc + t_prod.seed.plantname = parent.myseed.plantname + result.Add(t_prod) // User gets a consumable + if(!t_prod) + return + t_amount++ + product_name = parent.myseed.plantname + if(getYield() >= 1) + SSblackbox.record_feedback("tally", "food_harvested", getYield(), product_name) + parent.investigate_log("autmoatic harvest of [getYield()] of [src], with seed traits [english_list(genes)] and reagents_add [english_list(reagents_add)] and potency [potency].", INVESTIGATE_BOTANY) + parent.update_tray() + return result /obj/item/seeds/proc/prepare_result(var/obj/item/reagent_containers/food/snacks/grown/T) if(!T.reagents) diff --git a/code/modules/plumbing/plumbers/autohydro.dm b/code/modules/plumbing/plumbers/autohydro.dm index 4ea1d70aaf..7085548885 100644 --- a/code/modules/plumbing/plumbers/autohydro.dm +++ b/code/modules/plumbing/plumbers/autohydro.dm @@ -41,7 +41,7 @@ name = initial(name) desc = initial(desc) if(harvest) - myseed.harvest() + myseed.harvest_userless() harvest = 0 lastproduce = age if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest)) From fee304fb19c94e295de7450cdcfa5080da6833a1 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Sun, 9 Aug 2020 22:55:10 +1000 Subject: [PATCH 09/84] Update medical_designs.dm --- code/modules/research/designs/medical_designs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 7d4950cee5..fbe805af41 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -1069,7 +1069,7 @@ build_type = PROTOLATHE materials = list(MAT_METAL = 1000, MAT_GLASS = 500) construction_time = 75 - build_path = /obj/machinery/power/liquid_pump + build_path = /obj/machinery/liquid_pump category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE From 6c57dce54eb409848324394ca33e2e75a61d24a5 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sun, 9 Aug 2020 23:52:21 +1000 Subject: [PATCH 10/84] WX --- code/game/objects/structures/lavaland/geyser.dm | 2 +- code/game/turfs/simulated/floor/plating/asteroid.dm | 5 ++++- code/modules/hydroponics/seeds.dm | 1 + code/modules/reagents/chemistry/reagents.dm | 2 +- code/modules/reagents/chemistry/reagents/other_reagents.dm | 2 +- code/modules/research/designs/medical_designs.dm | 2 +- 6 files changed, 9 insertions(+), 5 deletions(-) diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index 4f6256e9c4..2379513d03 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -9,7 +9,7 @@ var/erupting_state = null //set to null to get it greyscaled from "[icon_state]_soup". Not very usable with the whole random thing, but more types can be added if you change the spawn prob var/activated = FALSE //whether we are active and generating chems - var/reagent_id = /datum/reagent/fuel/oil + var/reagent_id = /datum/reagent/oil var/potency = 2 //how much reagents we add every process (2 seconds) var/max_volume = 500 var/start_volume = 50 diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index f862a314a7..6e7dbaf904 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -149,6 +149,8 @@ var/list/megafauna_spawn_list /// Flora that can spawn in the tunnel, weighted list var/list/flora_spawn_list + //terrain to spawn weighted list + var/list/terrain_spawn_list /// Turf type to choose when spawning in tunnel at 1% chance, weighted list var/list/choose_turf_type /// if the tunnel should keep being created @@ -230,7 +232,8 @@ megafauna_spawn_list = list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = SPAWN_BUBBLEGUM) if (!flora_spawn_list) flora_spawn_list = list(/obj/structure/flora/ash/leaf_shroom = 2 , /obj/structure/flora/ash/cap_shroom = 2 , /obj/structure/flora/ash/stem_shroom = 2 , /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/tall_shroom = 2) - + if(!terrain_spawn_list) + terrain_spawn_list = list(/obj/structure/geyser/random = 1) . = ..() if(!has_data) produce_tunnel_from_data() diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 69b36c58ce..c7314bf180 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -195,6 +195,7 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) var/t_amount = 0 var/list/result = list() var/output_loc = parent.loc + var/product_name while(t_amount < getYield()) var/obj/item/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, src) if(parent.myseed.plantname != initial(parent.myseed.plantname)) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index f2add0bd4f..672127cb11 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) . = ..() if(material) - material = getmaterialref(material) + material = SSmaterials.GetMaterialRef(material) /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index ea9dbd5a9d..75e65a14d3 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2273,7 +2273,7 @@ /datum/reagent/gravitum/reaction_obj(obj/O, volume) O.AddElement(/datum/element/forced_gravity, 0) - addtimer(CALLBACK(O, .proc/RemoveElement, /datum/element/forced_gravity, 0), volume * time_multiplier) + addtimer(CALLBACK(O, .proc/_RemoveElement, /datum/element/forced_gravity, 0), volume * time_multiplier) /datum/reagent/gravitum/on_mob_add(mob/living/L) L.AddElement(/datum/element/forced_gravity, 0) //0 is the gravity, and in this case weightless diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index fbe805af41..04ef917b00 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -1069,7 +1069,7 @@ build_type = PROTOLATHE materials = list(MAT_METAL = 1000, MAT_GLASS = 500) construction_time = 75 - build_path = /obj/machinery/liquid_pump + build_path = /obj/machinery/plumbing/liquid_pump category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE From cbe783023d54d345fb3916f8d0814cbbef35945a Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Sun, 9 Aug 2020 23:55:06 +1000 Subject: [PATCH 11/84] Update autohydro.dm --- code/modules/plumbing/plumbers/autohydro.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/plumbing/plumbers/autohydro.dm b/code/modules/plumbing/plumbers/autohydro.dm index 7085548885..0f0e3008f0 100644 --- a/code/modules/plumbing/plumbers/autohydro.dm +++ b/code/modules/plumbing/plumbers/autohydro.dm @@ -33,7 +33,7 @@ if(reagents) applyChemicals(reagents) reagents.clear_reagents() - if(dead) + if(dead) dead = 0 qdel(myseed) myseed = null From a44afad8497fc69af95a11a2779618cccf96e5de Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Mon, 10 Aug 2020 08:26:06 +1000 Subject: [PATCH 12/84] Update autohydro.dm --- code/modules/plumbing/plumbers/autohydro.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/plumbing/plumbers/autohydro.dm b/code/modules/plumbing/plumbers/autohydro.dm index 0f0e3008f0..5157000754 100644 --- a/code/modules/plumbing/plumbers/autohydro.dm +++ b/code/modules/plumbing/plumbers/autohydro.dm @@ -33,7 +33,7 @@ if(reagents) applyChemicals(reagents) reagents.clear_reagents() - if(dead) + if(dead) dead = 0 qdel(myseed) myseed = null From 6c4c3e42553152a8c92c3ef44645f2dd83a7d6bd Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 10 Aug 2020 09:47:55 +1000 Subject: [PATCH 13/84] lint! --- code/modules/reagents/chemistry/machinery/chem_master.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 207325e1b3..32ac7cecba 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -1,5 +1,3 @@ -#define PILL_STYLE_COUNT 22 //Update this if you add more pill icons or you die -#define RANDOM_PILL_STYLE 22 //Dont change this one though /obj/machinery/chem_master name = "ChemMaster 3000" From 5a121281e30be9fa5a99c8bcd69a44412a9d81da Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 10 Aug 2020 00:09:24 +0000 Subject: [PATCH 14/84] Automatic changelog compile [ci skip] --- html/changelog.html | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index d0731d740c..7b5ea206f8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -917,30 +917,6 @@
  • plantpeople should stop dying in the halls now
  • Modifier-independent hotkey bindings have been added.
  • - -

    08 June 2020

    -

    DeltaFire15 updated:

    -
      -
    • Delinging now properly removes their special role
    • -
    • Keycard auth devices now require two seperate IDs with sufficient access to auth.
    • -
    -

    Linzolle updated:

    -
      -
    • shotguns no longer delete chambered shells while firing
    • -
    -

    kevinz000 updated:

    -
      -
    • test
    • -
    -

    shellspeed1 updated:

    -
      -
    • Internal tanks are now printable at the engineering lathe.
    • -
    -

    timothyteakettle updated:

    -
      -
    • newly created areas using blueprints now maintain the previous areas noteleport value
    • -
    • kudzu seeds now actually spawn vines
    • -
    GoonStation 13 Development Team From d9c198825b7b0b0bec07a59ddbb6df607c6815be Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 10 Aug 2020 10:29:17 +1000 Subject: [PATCH 15/84] linter 2: --- code/datums/ductnet.dm | 4 ++-- code/modules/plumbing/plumbers/bottler.dm | 6 +++--- code/modules/plumbing/plumbers/grinder_chemical.dm | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/datums/ductnet.dm b/code/datums/ductnet.dm index f81e9e608c..3ab936f6f4 100644 --- a/code/datums/ductnet.dm +++ b/code/datums/ductnet.dm @@ -6,7 +6,7 @@ var/capacity /datum/ductnet/proc/add_duct(obj/machinery/duct/D) - if(!D || D in ducts) + if(!D || (D in ducts)) return ducts += D D.duct = src @@ -57,4 +57,4 @@ var/obj/machinery/duct/D = A D.duct = null if(delete) //I don't want code to run with qdeleted objects because that can never be good, so keep this in-case the ductnet has some business left to attend to before commiting suicide - qdel(src) + qdel(src) diff --git a/code/modules/plumbing/plumbers/bottler.dm b/code/modules/plumbing/plumbers/bottler.dm index 57233a5873..396c7cac22 100644 --- a/code/modules/plumbing/plumbers/bottler.dm +++ b/code/modules/plumbing/plumbers/bottler.dm @@ -65,15 +65,15 @@ var/obj/item/reagent_containers/B = AM ///see if it would overflow else inject if((B.reagents.total_volume + wanted_amount) <= B.reagents.maximum_volume) - reagents.trans_to(B, wanted_amount, transfered_by = src) + reagents.trans_to(B, wanted_amount) B.forceMove(goodspot) return ///glass was full so we move it away AM.forceMove(badspot) if(istype(AM, /obj/item/slime_extract)) ///slime extracts need inject AM.forceMove(goodspot) - reagents.trans_to(AM, wanted_amount, transfered_by = src, method = INJECT) + reagents.trans_to(AM, wanted_amount) return if(istype(AM, /obj/item/slimecross/industrial)) ///no need to move slimecross industrial things - reagents.trans_to(AM, wanted_amount, transfered_by = src, method = INJECT) + reagents.trans_to(AM, wanted_amount) return diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm index d080bd7c8f..f39c79f906 100644 --- a/code/modules/plumbing/plumbers/grinder_chemical.dm +++ b/code/modules/plumbing/plumbers/grinder_chemical.dm @@ -56,7 +56,7 @@ I.on_juice() reagents.add_reagent_list(I.juice_results) if(I.reagents) - I.reagents.trans_to(src, I.reagents.total_volume, transfered_by = src) + I.reagents.trans_to(src, I.reagents.total_volume) qdel(I) return I.on_grind() From 900b0b068aa97bf7e95dac7615147802d38b2316 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 10 Aug 2020 10:38:53 +1000 Subject: [PATCH 16/84] linter take 3 love u putnam --- code/modules/plumbing/ducts.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm index 735526511f..c05f3f93f0 100644 --- a/code/modules/plumbing/ducts.dm +++ b/code/modules/plumbing/ducts.dm @@ -42,8 +42,8 @@ All the important duct code: active = FALSE anchored = FALSE else if(!can_anchor()) - CRASH("Overlapping ducts detected") qdel(src) + CRASH("Overlapping ducts detected") if(force_connects) connects = force_connects //skip change_connects() because we're still initializing and we need to set our connects at one point if(!lock_layers) From c160d73265508debe38af90c6b8fb840f45c3248 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 10 Aug 2020 10:40:30 +1000 Subject: [PATCH 17/84] ee --- code/modules/plumbing/ducts.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm index c05f3f93f0..6cc09c7d15 100644 --- a/code/modules/plumbing/ducts.dm +++ b/code/modules/plumbing/ducts.dm @@ -43,7 +43,6 @@ All the important duct code: anchored = FALSE else if(!can_anchor()) qdel(src) - CRASH("Overlapping ducts detected") if(force_connects) connects = force_connects //skip change_connects() because we're still initializing and we need to set our connects at one point if(!lock_layers) From 1b35e02554688072dfb8049d58318b7ca71d2c5c Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 10 Aug 2020 11:21:24 +1000 Subject: [PATCH 18/84] eee --- code/game/objects/items/RCD.dm | 1 + code/game/objects/items/RPD.dm | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 3ec0da70c5..c89e318714 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -860,6 +860,7 @@ RLD /obj/item/construction/plumbing name = "Plumbing Constructor" desc = "An expertly modified RCD outfitted to construct plumbing machinery. Reload with compressed matter cartridges." + icon = 'icons/obj/tools.dmi' icon_state = "arcd" item_state = "oldrcd" has_ammobar = FALSE diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index 79f03f0005..70e4441c66 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -522,7 +522,7 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( /obj/item/pipe_dispenser/proc/activate() playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1) - +/* unneeded, you can craft ducts from plastic /obj/item/pipe_dispenser/plumbing name = "Plumberinator" desc = "A crude device to rapidly plumb things." @@ -540,7 +540,7 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( recipe = first_plumbing - +*/ #undef ATMOS_CATEGORY #undef DISPOSALS_CATEGORY From 957b3948bd3d53fff6fe9c4e2dfdb8e1de6863fe Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 10 Aug 2020 20:26:32 +1000 Subject: [PATCH 19/84] aare --- icons/obj/watercloset.dmi | Bin 16012 -> 24009 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 94ea415ed7cf406fb49befddd17426bccf1fd3c2..2b641768783821717ab7969abdc117e27e7b7bf9 100644 GIT binary patch literal 24009 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 literal 16012 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 From 0f99d574086da4cfb7a705984fcd1ff100bc3caa Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 11 Aug 2020 00:09:06 +0000 Subject: [PATCH 20/84] Automatic changelog compile [ci skip] --- html/changelog.html | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 7b5ea206f8..b50101c1d9 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -892,31 +892,6 @@
  • Mice can now breed using cheese wedges
  • Royal cheese can be crafted to convert a mouse into king rat
  • - -

    09 June 2020

    -

    Anonymous updated:

    -
      -
    • Added Orville-inspired clothing as a worthy alternative to Trek stuff.
    • -
    • Adds chaplain role allowance to the TMP Service Uniform loadout.
    • -
    • Adds paramedic in every medsci mentioned uniform loadout.
    • -
    -

    DeltaFire15 updated:

    -
      -
    • Offstation AIs can once again only interact with their z-level
    • -
    -

    Ghommie updated:

    -
      -
    • Fixing IC material containers interaction with stacks, for real.
    • -
    -

    Trilbyspaceclone updated:

    -
      -
    • Gasses like BZ and Masiam seem to just sell for less in cargo, markets seem to change it seems
    • -
    -

    kevinz000 updated:

    -
      -
    • plantpeople should stop dying in the halls now
    • -
    • Modifier-independent hotkey bindings have been added.
    • -
    GoonStation 13 Development Team From c18f0defd8ae7138e4966ccbc514b431223d193a Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 11 Aug 2020 16:44:08 +1000 Subject: [PATCH 21/84] medi8el --- .../plumbing/plumbers/medipenrefill.dm | 96 ++++++++++++++++++ icons/obj/machines/medipen_refiller.dmi | Bin 0 -> 640 bytes 2 files changed, 96 insertions(+) create mode 100644 code/modules/plumbing/plumbers/medipenrefill.dm create mode 100644 icons/obj/machines/medipen_refiller.dmi diff --git a/code/modules/plumbing/plumbers/medipenrefill.dm b/code/modules/plumbing/plumbers/medipenrefill.dm new file mode 100644 index 0000000000..4b11076e04 --- /dev/null +++ b/code/modules/plumbing/plumbers/medipenrefill.dm @@ -0,0 +1,96 @@ +/obj/machinery/medipen_refiller + name = "Medipen Refiller" + desc = "A machine that refills used medipens with chemicals." + icon = 'icons/obj/machines/medipen_refiller.dmi' + icon_state = "medipen_refiller" + density = TRUE + circuit = /obj/item/circuitboard/machine/medipen_refiller + idle_power_usage = 100 + /// list of medipen subtypes it can refill + var/list/allowed = list(/obj/item/reagent_containers/hypospray/medipen = /datum/reagent/medicine/epinephrine, + /obj/item/reagent_containers/hypospray/medipen/atropine = /datum/reagent/medicine/atropine, + /obj/item/reagent_containers/hypospray/medipen/salbutamol = /datum/reagent/medicine/salbutamol, + /obj/item/reagent_containers/hypospray/medipen/oxandrolone = /datum/reagent/medicine/oxandrolone, + /obj/item/reagent_containers/hypospray/medipen/salacid = /datum/reagent/medicine/sal_acid, + /obj/item/reagent_containers/hypospray/medipen/penacid = /datum/reagent/medicine/pen_acid) + /// var to prevent glitches in the animation + var/busy = FALSE + +/obj/machinery/medipen_refiller/Initialize() + . = ..() + create_reagents(100, TRANSPARENT) + for(var/obj/item/stock_parts/matter_bin/B in component_parts) + reagents.maximum_volume += 100 * B.rating + AddComponent(/datum/component/plumbing/simple_demand) + + +/obj/machinery/medipen_refiller/RefreshParts() + var/new_volume = 100 + for(var/obj/item/stock_parts/matter_bin/B in component_parts) + new_volume += 100 * B.rating + if(!reagents) + create_reagents(new_volume, TRANSPARENT) + reagents.maximum_volume = new_volume + return TRUE + +/// handles the messages and animation, calls refill to end the animation +/obj/machinery/medipen_refiller/attackby(obj/item/I, mob/user, params) + if(busy) + to_chat(user, "The machine is busy.") + return + if(istype(I, /obj/item/reagent_containers) && I.is_open_container()) + var/obj/item/reagent_containers/RC = I + var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this, transfered_by = user) + if(units) + to_chat(user, "You transfer [units] units of the solution to the [name].") + return + else + to_chat(user, "The [name] is full.") + return + if(istype(I, /obj/item/reagent_containers/hypospray/medipen)) + var/obj/item/reagent_containers/hypospray/medipen/P = I + if(!(LAZYFIND(allowed, P.type))) + to_chat(user, "Error! Unknown schematics.") + return + if(P.reagents?.reagent_list.len) + to_chat(user, "The medipen is already filled.") + return + if(reagents.has_reagent(allowed[P.type], 10)) + busy = TRUE + add_overlay("active") + addtimer(CALLBACK(src, .proc/refill, P, user), 20) + qdel(P) + return + to_chat(user, "There aren't enough reagents to finish this operation.") + return + ..() + +/obj/machinery/medipen_refiller/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) + to_chat(user, "You start furiously plunging [name].") + if(do_after(user, 30, target = src)) + to_chat(user, "You finish plunging the [name].") + reagents.expose(get_turf(src), TOUCH) + reagents.clear_reagents() + +/obj/machinery/medipen_refiller/wrench_act(mob/living/user, obj/item/I) + ..() + default_unfasten_wrench(user, I) + return TRUE + +/obj/machinery/medipen_refiller/crowbar_act(mob/user, obj/item/I) + ..() + default_deconstruction_crowbar(I) + return TRUE + +/obj/machinery/medipen_refiller/screwdriver_act(mob/living/user, obj/item/I) + . = ..() + if(!.) + return default_deconstruction_screwdriver(user, "medipen_refiller_open", "medipen_refiller", I) + +/// refills the medipen +/obj/machinery/medipen_refiller/proc/refill(obj/item/reagent_containers/hypospray/medipen/P, mob/user) + new P.type(loc) + reagents.remove_reagent(allowed[P.type], 10) + cut_overlays() + busy = FALSE + to_chat(user, "Medipen refilled.") diff --git a/icons/obj/machines/medipen_refiller.dmi b/icons/obj/machines/medipen_refiller.dmi new file mode 100644 index 0000000000000000000000000000000000000000..300d218d2d75da8958ce0d57dda1dc588fa30d6b GIT binary patch literal 640 zcmV-`0)PF9P)Mv0GynfHGfL+AX#fBK0d!JMQvg8b*k%9#0HAtQSad{Xb7OL8aCB*JZU6vy zoKseCa&`CgQ*iP1H7zqIC$&h4i!&v&s2C_^$ixjKRt@3mscg1`_| zNrITRKM-Kij Date: Tue, 11 Aug 2020 16:44:45 +1000 Subject: [PATCH 22/84] THESUN --- tgstation.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/tgstation.dme b/tgstation.dme index 77c4dd3c7e..5b17db08f4 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2856,6 +2856,7 @@ #include "code\modules\plumbing\plumbers\fermenter.dm" #include "code\modules\plumbing\plumbers\filter.dm" #include "code\modules\plumbing\plumbers\grinder_chemical.dm" +#include "code\modules\plumbing\plumbers\medipenrefill.dm" #include "code\modules\plumbing\plumbers\pill_press.dm" #include "code\modules\plumbing\plumbers\pumps.dm" #include "code\modules\plumbing\plumbers\reaction_chamber.dm" From f977ac7180a435c27c2359e874ea725bc6a37fce Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 11 Aug 2020 17:08:21 +1000 Subject: [PATCH 23/84] e e e ee ee --- .../objects/items/circuitboards/machine_circuitboards.dm | 7 +++++++ code/modules/plumbing/plumbers/medipenrefill.dm | 9 ++++----- .../designs/machine_desings/machine_designs_medical.dm | 8 ++++++++ code/modules/research/techweb/nodes/medical_nodes.dm | 8 ++++---- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 8a8aba50a3..37d19783b5 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -48,6 +48,13 @@ /obj/item/stack/cable_coil = 5, /obj/item/stack/sheet/glass = 1) +/obj/item/circuitboard/machine/medipen_refiller + name = "Medipen Refiller (Machine Board)" + icon_state = "medical" + build_path = /obj/machinery/medipen_refiller + req_components = list( + /obj/item/stock_parts/matter_bin = 1) + /obj/item/circuitboard/machine/clonepod name = "Clone Pod (Machine Board)" build_path = /obj/machinery/clonepod diff --git a/code/modules/plumbing/plumbers/medipenrefill.dm b/code/modules/plumbing/plumbers/medipenrefill.dm index 4b11076e04..79522fabf6 100644 --- a/code/modules/plumbing/plumbers/medipenrefill.dm +++ b/code/modules/plumbing/plumbers/medipenrefill.dm @@ -8,11 +8,10 @@ idle_power_usage = 100 /// list of medipen subtypes it can refill var/list/allowed = list(/obj/item/reagent_containers/hypospray/medipen = /datum/reagent/medicine/epinephrine, - /obj/item/reagent_containers/hypospray/medipen/atropine = /datum/reagent/medicine/atropine, - /obj/item/reagent_containers/hypospray/medipen/salbutamol = /datum/reagent/medicine/salbutamol, - /obj/item/reagent_containers/hypospray/medipen/oxandrolone = /datum/reagent/medicine/oxandrolone, - /obj/item/reagent_containers/hypospray/medipen/salacid = /datum/reagent/medicine/sal_acid, - /obj/item/reagent_containers/hypospray/medipen/penacid = /datum/reagent/medicine/pen_acid) + /obj/item/reagent_containers/hypospray/medipen/ekit = /datum/reagent/medicine/epinephrine, + /obj/item/reagent_containers/hypospray/medipen/firelocker = /datum/reagent/medicine/oxandrolone, + /obj/item/reagent_containers/hypospray/medipen/stimpack = /datum/reagent/medicine/ephedrine, + /obj/item/reagent_containers/hypospray/medipen/blood_loss = /datum/reagent/medicine/coagulant/weak) /// var to prevent glitches in the animation var/busy = FALSE diff --git a/code/modules/research/designs/machine_desings/machine_designs_medical.dm b/code/modules/research/designs/machine_desings/machine_designs_medical.dm index 329fb7bf6e..84a3ed10d5 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_medical.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_medical.dm @@ -105,3 +105,11 @@ build_path = /obj/item/circuitboard/machine/bloodbankgen departmental_flags = DEPARTMENTAL_FLAG_MEDICAL category = list ("Medical Machinery") + +/datum/design/board/medipen_refiller + name = "Machine Design (Medipen Refiller)" + desc = "The circuit board for a Medipen Refiller." + id = "medipen_refiller" + build_path = /obj/item/circuitboard/machine/medipen_refiller + category = list ("Medical Machinery") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL diff --git a/code/modules/research/techweb/nodes/medical_nodes.dm b/code/modules/research/techweb/nodes/medical_nodes.dm index 02562f941e..150e420c09 100644 --- a/code/modules/research/techweb/nodes/medical_nodes.dm +++ b/code/modules/research/techweb/nodes/medical_nodes.dm @@ -29,17 +29,17 @@ display_name = "Reagent Plumbing Technology" description = "Plastic tubes, and machinery used for manipulating things in them." prereq_ids = list("base") - design_ids = list("acclimator", "disposer", "plumb_filter", "plumb_synth", "plumb_grinder", "reaction_chamber", "duct_print", "plumb_splitter", "pill_press", "plumb_pump", "plumb_in", "plumb_out", "plumb_tank") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + design_ids = list("acclimator", "disposer", "plumb_filter", "plumb_synth", "plumb_grinder", "reaction_chamber", "duct_print", "plumb_splitter", "pill_press", "plumb_pump", "plumb_in", "plumb_out", "plumb_tank", "medipen_refiller") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) /datum/techweb_node/advplumbing id = "advplumbing" display_name = "Advanced Plumbing Technology" description = "Plumbing RCD." - prereq_ids = list("plumbing", "adv_engi", "adv_biotech") + prereq_ids = list("plumbing", "adv_engi") design_ids = list("plumb_rcd", "autohydrotray") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) //////////////////////Cybernetics///////////////////// From 6e2bb798342d0f387fbba2f80dcd90dfb5e4c85f Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 11 Aug 2020 17:32:44 +1000 Subject: [PATCH 24/84] Update medipenrefill.dm --- code/modules/plumbing/plumbers/medipenrefill.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/plumbing/plumbers/medipenrefill.dm b/code/modules/plumbing/plumbers/medipenrefill.dm index 79522fabf6..195d866a38 100644 --- a/code/modules/plumbing/plumbers/medipenrefill.dm +++ b/code/modules/plumbing/plumbers/medipenrefill.dm @@ -68,7 +68,6 @@ to_chat(user, "You start furiously plunging [name].") if(do_after(user, 30, target = src)) to_chat(user, "You finish plunging the [name].") - reagents.expose(get_turf(src), TOUCH) reagents.clear_reagents() /obj/machinery/medipen_refiller/wrench_act(mob/living/user, obj/item/I) From 6ec9a3c4bddc091720463c5b31b9b5f679fbb6f0 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 11 Aug 2020 17:38:16 +1000 Subject: [PATCH 25/84] craftable plunger --- .../components/crafting/recipes/recipes_misc.dm | 11 ++++++++++- code/game/objects/structures/lavaland/geyser.dm | 4 ++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index 214c1b1427..a1111dfb8b 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -2,6 +2,15 @@ //Large Objects// ///////////////// +/datum/crafting_recipe/plunger + name = "Plunger" + result = /obj/item/plunger + time = 1 + reqs = list(/obj/item/stack/sheet/mineral/plastic = 1, + /obj/item/stack/sheet/mineral/wood = 1) + category = CAT_MISC + subcategory = CAT_TOOL + /datum/crafting_recipe/showercurtain name = "Shower Curtains" reqs = list(/obj/item/stack/sheet/cloth = 2, @@ -324,7 +333,7 @@ result = /obj/item/toy/sword/cx subcategory = CAT_MISCELLANEOUS category = CAT_MISC - + /datum/crafting_recipe/catgirlplushie name = "Catgirl Plushie" reqs = list(/obj/item/toy/plush/hairball = 3) diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index 2379513d03..263b47aab2 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -77,10 +77,10 @@ /obj/item/plunger/reinforced name = "reinforced plunger" - desc = "It's an M. 7 Reinforced Plunger© for heavy duty plunging." + desc = "It's an M. 7 Reinforced Plunger� for heavy duty plunging." icon_state = "reinforced_plunger" reinforced = TRUE plunge_mod = 0.8 - custom_premium_price = 1200 + custom_premium_price = 600 From 740b4f3ecf2cbba62c7b54e758b457af6db98bd4 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 11 Aug 2020 17:50:30 +1000 Subject: [PATCH 26/84] WHOOPS --- code/datums/components/crafting/recipes/recipes_misc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index a1111dfb8b..bab03fb55e 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -6,7 +6,7 @@ name = "Plunger" result = /obj/item/plunger time = 1 - reqs = list(/obj/item/stack/sheet/mineral/plastic = 1, + reqs = list(/obj/item/stack/sheet/plastic = 1, /obj/item/stack/sheet/mineral/wood = 1) category = CAT_MISC subcategory = CAT_TOOL From c69972925004356d6e7af4e5be9386e7a3f7d22c Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 11 Aug 2020 17:53:51 +1000 Subject: [PATCH 27/84] lint --- code/modules/plumbing/plumbers/medipenrefill.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/plumbing/plumbers/medipenrefill.dm b/code/modules/plumbing/plumbers/medipenrefill.dm index 195d866a38..fb7553a4d5 100644 --- a/code/modules/plumbing/plumbers/medipenrefill.dm +++ b/code/modules/plumbing/plumbers/medipenrefill.dm @@ -39,7 +39,7 @@ return if(istype(I, /obj/item/reagent_containers) && I.is_open_container()) var/obj/item/reagent_containers/RC = I - var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this, transfered_by = user) + var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this) if(units) to_chat(user, "You transfer [units] units of the solution to the [name].") return From f10053fe963669af99f98f05e406698ceb8ccbfb Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 11 Aug 2020 18:03:59 +1000 Subject: [PATCH 28/84] suture --- .../reagents/chemistry/recipes/medicine.dm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 9b303cd5c0..9e0c78d2e6 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -352,3 +352,19 @@ var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/stack/medical/mesh/advanced(location) + +/datum/chemical_reaction/suture + required_reagents = list(/datum/reagent/cellulose = 2, /datum/reagent/medicine/styptic_powder = 2) + +/datum/chemical_reaction/suture/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/stack/medical/suture/(location) + +/datum/chemical_reaction/mesh + required_reagents = list(/datum/reagent/cellulose = 2, /datum/reagent/medicine/silver_sulfadiazine = 2) + +/datum/chemical_reaction/mesh/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/stack/medical/mesh/(location) From 49948e77a41180fa9de7291fc7eaf3e0f0e193e3 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 11 Aug 2020 18:08:40 +1000 Subject: [PATCH 29/84] SELLYOULOSE --- code/game/objects/items/stacks/medical.dm | 1 + code/game/objects/items/stacks/sheets/sheet_types.dm | 3 +++ 2 files changed, 4 insertions(+) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 11df83230c..1840921be4 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -128,6 +128,7 @@ absorption_capacity = 5 splint_factor = 0.35 custom_price = PRICE_REALLY_CHEAP + grind_results = list(/datum/reagent/cellulose = 2) // gauze is only relevant for wounds, which are handled in the wounds themselves /obj/item/stack/medical/gauze/try_heal(mob/living/M, mob/user, silent) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 44906a7179..9cbd8b3c92 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -412,6 +412,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ force = 0 throwforce = 0 merge_type = /obj/item/stack/sheet/cloth + grind_results = list(/datum/reagent/cellulose = 2) /obj/item/stack/sheet/cloth/get_main_recipes() . = ..() @@ -843,6 +844,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra merge_type = /obj/item/stack/sheet/cotton var/pull_effort = 30 var/loom_result = /obj/item/stack/sheet/cloth + grind_results = list(/datum/reagent/cellulose = 1) /obj/item/stack/sheet/cotton/ten amount = 10 @@ -858,6 +860,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra merge_type = /obj/item/stack/sheet/cotton/durathread pull_effort = 70 loom_result = /obj/item/stack/sheet/durathread + grind_results = list(/datum/reagent/cellulose = 4) /obj/item/stack/sheet/meat name = "meat sheets" From 0a6eca818cc881d3176b90ac231224d0ba444680 Mon Sep 17 00:00:00 2001 From: SmArtKar Date: Sun, 16 Aug 2020 15:59:31 +0300 Subject: [PATCH 30/84] Succesfull removal of shuttle limit --- .../configuration/entries/game_options.dm | 7 ------- .../shuttle_creation/shuttle_creator.dm | 19 +++++-------------- .../shuttle_creator_actions.dm | 6 ------ 3 files changed, 5 insertions(+), 27 deletions(-) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 5765f291e9..61e3faa61c 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -523,10 +523,3 @@ * Camera mobs, AIs, ghosts and some other are of course exempt from this. This also doesn't influence simplemob AI, for the best. */ /datum/config_entry/flag/use_field_of_vision - -//Shuttle size limiter -/datum/config_entry/number/max_shuttle_count - config_entry_value = 6 - -/datum/config_entry/number/max_shuttle_size - config_entry_value = 250 diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm index f5a11db60f..10bc2b3523 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm @@ -1,5 +1,3 @@ -#define SHUTTLE_CREATOR_MAX_SIZE CONFIG_GET(number/max_shuttle_size) -#define CUSTOM_SHUTTLE_LIMIT CONFIG_GET(number/max_shuttle_count) #define CARDINAL_DIRECTIONS_X list(1, 0, -1, 0) #define CARDINAL_DIRECTIONS_Y list(0, 1, 0, -1) @@ -57,10 +55,6 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He ..() if(linkedShuttleId) return - if(GLOB.custom_shuttle_count > CUSTOM_SHUTTLE_LIMIT && !override_max_shuttles) - to_chat(user, "Too many shuttles have been created.") - message_admins("[ADMIN_FLW(user)] attempted to create a shuttle, however [CUSTOM_SHUTTLE_LIMIT] have already been created.") - return if(!internal_shuttle_creator) return overlay_holder.add_client(user.client) @@ -237,13 +231,13 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He port.register() - icon_state = "rsd_used" + icon_state = "rsd_empty" //Clear highlights overlay_holder.clear_highlights() GLOB.custom_shuttle_count ++ - message_admins("[ADMIN_LOOKUPFLW(user)] created a new shuttle with a [src] at [ADMIN_VERBOSEJMP(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])") - log_game("[key_name(user)] created a new shuttle with a [src] at [AREACOORD(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])") + message_admins("[ADMIN_LOOKUPFLW(user)] created a new shuttle with a [src] at [ADMIN_VERBOSEJMP(user)] ([GLOB.custom_shuttle_count] custom shuttles)") + log_game("[key_name(user)] created a new shuttle with a [src] at [AREACOORD(user)] ([GLOB.custom_shuttle_count] custom shuttles)") return TRUE /obj/item/shuttle_creator/proc/create_shuttle_area(mob/user) @@ -290,13 +284,10 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He return TRUE //Checks an area to ensure that the turfs provided are valid to be made into a shuttle -/obj/item/shuttle_creator/proc/check_area(list/turfs, addingTurfs = TRUE) +/obj/item/shuttle_creator/proc/check_area(list/turfs) if(!turfs) to_chat(usr, "Shuttles must be created in an airtight space, ensure that the shuttle is airtight, including corners.") return FALSE - if(turfs.len + (addingTurfs ? loggedTurfs.len : 0) > SHUTTLE_CREATOR_MAX_SIZE) - to_chat(usr, "The [src]'s internal cooling system wizzes violently and a message appears on the screen, \"Caution, this device can only handle the creation of shuttles up to [SHUTTLE_CREATOR_MAX_SIZE] units in size. Please reduce your shuttle by [turfs.len-SHUTTLE_CREATOR_MAX_SIZE]. Sorry for the inconvinience\"") - return FALSE //Check to see if it's a valid shuttle for(var/i in 1 to turfs.len) var/area/place = get_area(turfs[i]) @@ -350,7 +341,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He loggedOldArea = get_area(get_turf(user)) loggedTurfs |= turfs overlay_holder.highlight_area(turfs) - //TODO READD THIS SHIT: icon_state = "rsd_used" + //TODO READD THIS SHIT: icon_state = "rsd_empty" to_chat(user, "You add the area into the buffer of the [src], you made add more areas or select an airlock to act as a docking port to complete the shuttle.") return turfs diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm index f50b3bf59f..397cfad35a 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm @@ -81,12 +81,6 @@ return if(shuttle_creator.linkedShuttleId) return - if(GLOB.custom_shuttle_count > CUSTOM_SHUTTLE_LIMIT) - to_chat(C, "Shuttle limit reached, sorry.") - return - if(shuttle_creator.loggedTurfs.len > SHUTTLE_CREATOR_MAX_SIZE) - to_chat(C, "This shuttle is too large!") - return if(!shuttle_creator.getNonShuttleDirection(T)) to_chat(C, "Docking port must be on an external wall, with only 1 side exposed to space.") return From dd64dcc4ea9b318f3c7a9695343d2f8a0ea66510 Mon Sep 17 00:00:00 2001 From: SmArtKar Date: Sun, 16 Aug 2020 16:21:17 +0300 Subject: [PATCH 31/84] Return of the King(and the limits) --- code/controllers/configuration/entries/game_options.dm | 3 +++ code/modules/shuttle/shuttle_creation/shuttle_creator.dm | 7 ++++++- .../shuttle/shuttle_creation/shuttle_creator_actions.dm | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 61e3faa61c..b3430cb260 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -523,3 +523,6 @@ * Camera mobs, AIs, ghosts and some other are of course exempt from this. This also doesn't influence simplemob AI, for the best. */ /datum/config_entry/flag/use_field_of_vision + +/datum/config_entry/number/max_shuttle_size + config_entry_value = 500 diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm index 10bc2b3523..e6cf6d962b 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm @@ -1,3 +1,4 @@ +#define SHUTTLE_CREATOR_MAX_SIZE CONFIG_GET(number/max_shuttle_size) #define CARDINAL_DIRECTIONS_X list(1, 0, -1, 0) #define CARDINAL_DIRECTIONS_Y list(0, 1, 0, -1) @@ -41,6 +42,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He . = ..() internal_shuttle_creator = new() internal_shuttle_creator.owner_rsd = src + desc += " Attention, the max size of the shuttle is [SHUTTLE_CREATOR_MAX_SIZE]." overlay_holder = new() /obj/item/shuttle_creator/Destroy() @@ -284,10 +286,13 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He return TRUE //Checks an area to ensure that the turfs provided are valid to be made into a shuttle -/obj/item/shuttle_creator/proc/check_area(list/turfs) +/obj/item/shuttle_creator/proc/check_area(list/turfs, addingTurfs = TRUE) if(!turfs) to_chat(usr, "Shuttles must be created in an airtight space, ensure that the shuttle is airtight, including corners.") return FALSE + if(turfs.len + (addingTurfs ? loggedTurfs.len : 0) > SHUTTLE_CREATOR_MAX_SIZE) + to_chat(usr, "The [src]'s internal cooling system wizzes violently and a message appears on the screen, \"Caution, this device can only handle the creation of shuttles up to [SHUTTLE_CREATOR_MAX_SIZE] units in size. Please reduce your shuttle by [turfs.len-SHUTTLE_CREATOR_MAX_SIZE]. Sorry for the inconvinience\"") + return FALSE //Check to see if it's a valid shuttle for(var/i in 1 to turfs.len) var/area/place = get_area(turfs[i]) diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm index 397cfad35a..d77232672b 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm @@ -81,6 +81,9 @@ return if(shuttle_creator.linkedShuttleId) return + if(shuttle_creator.loggedTurfs.len > SHUTTLE_CREATOR_MAX_SIZE) + to_chat(C, "This shuttle is too large!") + return if(!shuttle_creator.getNonShuttleDirection(T)) to_chat(C, "Docking port must be on an external wall, with only 1 side exposed to space.") return From f5300750b5da677919de6e9df5702abdd9a5d6e6 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 17 Aug 2020 03:18:36 +0100 Subject: [PATCH 32/84] Revert "[TESTMERGE ONLY] FUCK" --- code/__DEFINES/pool.dm | 2 +- code/__HELPERS/global_lists.dm | 8 +- code/__HELPERS/mobs.dm | 14 +- code/_globalvars/lists/flavor_misc.dm | 35 ++++ .../diseases/advance/symptoms/species.dm | 1 - code/datums/dna.dm | 4 +- code/modules/arousal/organs/womb.dm | 2 +- code/modules/client/preferences.dm | 12 +- code/modules/jobs/job_types/_job.dm | 1 + .../jobs/job_types/atmospheric_technician.dm | 1 + code/modules/jobs/job_types/bartender.dm | 1 + code/modules/jobs/job_types/botanist.dm | 1 + code/modules/jobs/job_types/captain.dm | 1 + .../jobs/job_types/cargo_technician.dm | 1 + code/modules/jobs/job_types/chaplain.dm | 1 + code/modules/jobs/job_types/chemist.dm | 1 + code/modules/jobs/job_types/chief_engineer.dm | 1 + .../jobs/job_types/chief_medical_officer.dm | 1 + code/modules/jobs/job_types/clown.dm | 1 + code/modules/jobs/job_types/cook.dm | 1 + code/modules/jobs/job_types/curator.dm | 1 + code/modules/jobs/job_types/detective.dm | 1 + code/modules/jobs/job_types/geneticist.dm | 1 + .../jobs/job_types/head_of_personnel.dm | 1 + .../jobs/job_types/head_of_security.dm | 2 + code/modules/jobs/job_types/janitor.dm | 1 + code/modules/jobs/job_types/lawyer.dm | 1 + code/modules/jobs/job_types/medical_doctor.dm | 1 + code/modules/jobs/job_types/mime.dm | 1 + .../jobs/job_types/research_director.dm | 1 + code/modules/jobs/job_types/roboticist.dm | 1 + code/modules/jobs/job_types/scientist.dm | 1 + .../jobs/job_types/security_officer.dm | 1 + code/modules/jobs/job_types/shaft_miner.dm | 1 + .../jobs/job_types/station_engineer.dm | 1 + code/modules/jobs/job_types/virologist.dm | 1 + code/modules/jobs/job_types/warden.dm | 1 + .../sprite_accessories/Citadel_Snowflake.dm | 16 +- .../sprite_accessories/_sprite_accessories.dm | 3 + .../sprite_accessories/alienpeople.dm | 10 + .../sprite_accessories/body_markings.dm | 3 + .../new_player/sprite_accessories/ears.dm | 74 ++++--- .../new_player/sprite_accessories/frills.dm | 4 + .../new_player/sprite_accessories/horns.dm | 4 + .../sprite_accessories/legs_and_taurs.dm | 3 + .../new_player/sprite_accessories/snouts.dm | 110 +++++----- .../new_player/sprite_accessories/spines.dm | 5 + .../new_player/sprite_accessories/synthliz.dm | 12 +- .../new_player/sprite_accessories/tails.dm | 188 +++++++++-------- .../new_player/sprite_accessories/wings.dm | 6 + .../mob/living/carbon/human/species.dm | 194 ++---------------- .../carbon/human/species_types/jellypeople.dm | 6 +- .../carbon/human/species_types/plasmamen.dm | 85 +------- .../human/species_types/shadowpeople.dm | 2 - .../carbon/human/species_types/skeletons.dm | 2 +- .../carbon/human/species_types/synthliz.dm | 2 +- .../carbon/human/species_types/synths.dm | 2 - .../mob/living/simple_animal/bot/cleanbot.dm | 2 +- .../chemistry/reagents/other_reagents.dm | 40 +--- 59 files changed, 369 insertions(+), 512 deletions(-) diff --git a/code/__DEFINES/pool.dm b/code/__DEFINES/pool.dm index 64bbd20b19..1bf39dcb1d 100644 --- a/code/__DEFINES/pool.dm +++ b/code/__DEFINES/pool.dm @@ -8,5 +8,5 @@ GLOBAL_LIST_INIT(blacklisted_pool_reagents, list( /datum/reagent/toxin/plasma, /datum/reagent/oxygen, /datum/reagent/nitrous_oxide, /datum/reagent/nitrogen, //gases /datum/reagent/fermi, //blanket fermichem ban sorry. this also covers mkultra, genital enlargers, etc etc. - /datum/reagent/consumable/femcum, /datum/reagent/consumable/semen //NO. + /datum/reagent/consumable/semen //NO. )) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index d66e83d651..1119ef44ed 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -37,10 +37,10 @@ //CIT CHANGES START HERE, ADDS SNOWFLAKE BODYPARTS AND MORE //mammal bodyparts (fucking furries) init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_body_markings, GLOB.mam_body_markings_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_ears, GLOB.mam_ears_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_snouts, GLOB.mam_snouts_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails_animated, GLOB.mam_tails_animated_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/mam_tails, GLOB.mam_tails_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/ears/mam_ears, GLOB.mam_ears_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts/mam_snouts, GLOB.mam_snouts_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/mam_tails_animated, GLOB.mam_tails_animated_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/taur, GLOB.taur_list) //xeno parts (hiss?) init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_head, GLOB.xeno_head_list) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index c4964022e5..52e26b67e7 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -93,16 +93,16 @@ if(!GLOB.mam_body_markings_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_body_markings, GLOB.mam_body_markings_list) if(!GLOB.mam_tails_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/mam_tails, GLOB.mam_tails_list) if(!GLOB.mam_ears_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_ears, GLOB.mam_ears_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/ears/mam_ears, GLOB.mam_ears_list) if(!GLOB.mam_snouts_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_snouts, GLOB.mam_snouts_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts/mam_snouts, GLOB.mam_snouts_list) //snowflake check so people's ckey features don't get randomly put on unmonkeys/spawns var/list/snowflake_mam_tails_list = list() for(var/mtpath in GLOB.mam_tails_list) - var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[mtpath] + var/datum/sprite_accessory/tails/mam_tails/instance = GLOB.mam_tails_list[mtpath] if(istype(instance, /datum/sprite_accessory)) var/datum/sprite_accessory/S = instance if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies)) @@ -120,7 +120,7 @@ snowflake_markings_list[S.name] = mmpath var/list/snowflake_ears_list = list() for(var/mepath in GLOB.mam_ears_list) - var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[mepath] + var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[mepath] if(istype(instance, /datum/sprite_accessory)) var/datum/sprite_accessory/S = instance if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies)) @@ -129,7 +129,7 @@ snowflake_ears_list[S.name] = mepath var/list/snowflake_mam_snouts_list = list() for(var/mspath in GLOB.mam_snouts_list) - var/datum/sprite_accessory/mam_snouts/instance = GLOB.mam_snouts_list[mspath] + var/datum/sprite_accessory/snouts/mam_snouts/instance = GLOB.mam_snouts_list[mspath] if(istype(instance, /datum/sprite_accessory)) var/datum/sprite_accessory/S = instance if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies)) @@ -138,7 +138,7 @@ snowflake_mam_snouts_list[S.name] = mspath var/list/snowflake_ipc_antenna_list = list() for(var/mspath in GLOB.ipc_antennas_list) - var/datum/sprite_accessory/mam_snouts/instance = GLOB.ipc_antennas_list[mspath] + var/datum/sprite_accessory/snouts/mam_snouts/instance = GLOB.ipc_antennas_list[mspath] if(istype(instance, /datum/sprite_accessory)) var/datum/sprite_accessory/S = instance if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies)) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 7c2ebc5f0c..1a0afc2c2a 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -40,6 +40,41 @@ GLOBAL_LIST_EMPTY(insect_fluffs_list) GLOBAL_LIST_EMPTY(insect_markings_list) GLOBAL_LIST_EMPTY(caps_list) +//a way to index the right bodypart list given the type of bodypart +GLOBAL_LIST_INIT(mutant_reference_list, list( + "tail_lizard" = GLOB.tails_list_lizard, + "waggingtail_lizard" = GLOB.animated_tails_list_lizard, + "tail_human" = GLOB.tails_list_human, + "waggingtail_human" = GLOB.animated_tails_list_human, + "spines" = GLOB.spines_list, + "waggingspines" = GLOB.animated_spines_list, + "snout" = GLOB.snouts_list, + "frills" = GLOB.frills_list, + "horns" = GLOB.horns_list, + "ears" = GLOB.ears_list, + "body_markings" = GLOB.body_markings_list, + "wings" = GLOB.wings_list, + "wingsopen" = GLOB.wings_open_list, + "deco_wings" = GLOB.deco_wings_list, + "legs" = GLOB.legs_list, + "insect_wings" = GLOB.insect_wings_list, + "insect_fluff" = GLOB.insect_fluffs_list, + "insect_markings" = GLOB.insect_markings_list, + "caps" = GLOB.caps_list, + "ipc_screen" = GLOB.ipc_screens_list, + "ipc_antenna" = GLOB.ipc_antennas_list, + "mam_tail" = GLOB.mam_tails_list, + "mam_waggingtail" = GLOB.mam_tails_animated_list, + "mam_body_markings" = GLOB.mam_body_markings_list, + "mam_ears" = GLOB.mam_ears_list, + "mam_snouts" = GLOB.mam_snouts_list, + "taur" = GLOB.taur_list, + "xenodorsal" = GLOB.xeno_dorsal_list, + "xenohead" = GLOB.xeno_head_list, + "xenotail" = GLOB.xeno_tail_list)) + + + GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list("ghost")) //stores the ghost forms that support directional sprites GLOBAL_LIST_INIT(ghost_forms_with_accessories_list, list("ghost")) //stores the ghost forms that support hair and other such things diff --git a/code/datums/diseases/advance/symptoms/species.dm b/code/datums/diseases/advance/symptoms/species.dm index 49a3cf8d07..2d5255842b 100644 --- a/code/datums/diseases/advance/symptoms/species.dm +++ b/code/datums/diseases/advance/symptoms/species.dm @@ -31,4 +31,3 @@ /datum/symptom/inorganic_adaptation/OnRemove(datum/disease/advance/A) A.infectable_biotypes &= ~MOB_MINERAL - diff --git a/code/datums/dna.dm b/code/datums/dna.dm index de5c1ece91..9486029fdd 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -137,10 +137,10 @@ L[DNA_COLOR_TWO_BLOCK] = sanitize_hexcolor(features["mcolor2"], 6) L[DNA_COLOR_THREE_BLOCK] = sanitize_hexcolor(features["mcolor3"], 6) if(!GLOB.mam_tails_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/mam_tails, GLOB.mam_tails_list) L[DNA_MUTANTTAIL_BLOCK] = construct_block(GLOB.mam_tails_list.Find(features["mam_tail"]), GLOB.mam_tails_list.len) if(!GLOB.mam_ears_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_ears, GLOB.mam_ears_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/ears/mam_ears, GLOB.mam_ears_list) L[DNA_MUTANTEAR_BLOCK] = construct_block(GLOB.mam_ears_list.Find(features["mam_ears"]), GLOB.mam_ears_list.len) if(!GLOB.mam_body_markings_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_body_markings, GLOB.mam_body_markings_list) diff --git a/code/modules/arousal/organs/womb.dm b/code/modules/arousal/organs/womb.dm index 386f407a26..e89d4329aa 100644 --- a/code/modules/arousal/organs/womb.dm +++ b/code/modules/arousal/organs/womb.dm @@ -6,5 +6,5 @@ zone = BODY_ZONE_PRECISE_GROIN slot = ORGAN_SLOT_WOMB genital_flags = GENITAL_INTERNAL|GENITAL_FUID_PRODUCTION - fluid_id = /datum/reagent/consumable/femcum + fluid_id = /datum/reagent/consumable/semen/femcum linked_organ_slot = ORGAN_SLOT_VAGINA diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 017a25db34..480ebda4f8 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -791,9 +791,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
    " dat += "
    " - + dat += "
    " - + if(!length(GLOB.loadout_categories[gear_category])) dat += "No subcategories detected. Something is horribly wrong!" else @@ -1636,7 +1636,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("mam_tail") var/list/snowflake_tails_list = list() for(var/path in GLOB.mam_tails_list) - var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[path] + var/datum/sprite_accessory/tails/mam_tails/instance = GLOB.mam_tails_list[path] if(istype(instance, /datum/sprite_accessory)) var/datum/sprite_accessory/S = instance if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id)) @@ -1661,7 +1661,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("snout") var/list/snowflake_snouts_list = list() for(var/path in GLOB.snouts_list) - var/datum/sprite_accessory/mam_snouts/instance = GLOB.snouts_list[path] + var/datum/sprite_accessory/snouts/mam_snouts/instance = GLOB.snouts_list[path] if(istype(instance, /datum/sprite_accessory)) var/datum/sprite_accessory/S = instance if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id)) @@ -1678,7 +1678,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("mam_snouts") var/list/snowflake_mam_snouts_list = list() for(var/path in GLOB.mam_snouts_list) - var/datum/sprite_accessory/mam_snouts/instance = GLOB.mam_snouts_list[path] + var/datum/sprite_accessory/snouts/mam_snouts/instance = GLOB.mam_snouts_list[path] if(istype(instance, /datum/sprite_accessory)) var/datum/sprite_accessory/S = instance if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id)) @@ -1827,7 +1827,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("mam_ears") var/list/snowflake_ears_list = list() for(var/path in GLOB.mam_ears_list) - var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[path] + var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[path] if(istype(instance, /datum/sprite_accessory)) var/datum/sprite_accessory/S = instance if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id)) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index bd36218211..1238b37919 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -46,6 +46,7 @@ var/minimal_player_age = 0 var/outfit = null + var/plasma_outfit = null //the outfit given to plasmamen var/exp_requirements = 0 diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 1962b8e8a9..bff56d1d16 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -12,6 +12,7 @@ exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/atmos + plasma_outfit = /datum/outfit/plasmaman/atmospherics access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index e5cd015460..8290adbbd7 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -11,6 +11,7 @@ exp_type_department = EXP_TYPE_SERVICE // This is so the jobs menu can work properly outfit = /datum/outfit/job/bartender + plasma_outfit = /datum/outfit/plasmaman/bar access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index 65f3e7ca48..4c91f87791 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -10,6 +10,7 @@ selection_color = "#bbe291" outfit = /datum/outfit/job/botanist + plasma_outfit = /datum/outfit/plasmaman/botany access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 3733658c33..047a07062d 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -17,6 +17,7 @@ outfit = /datum/outfit/job/captain + plasma_outfit = /datum/outfit/plasmaman/captain access = list() //See get_access() minimal_access = list() //See get_access() diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index 840af56a0e..1f87a5265d 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -10,6 +10,7 @@ selection_color = "#ca8f55" outfit = /datum/outfit/job/cargo_tech + plasma_outfit = /datum/outfit/plasmaman/cargo access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index 5f66519365..a9e891a303 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -10,6 +10,7 @@ selection_color = "#dddddd" outfit = /datum/outfit/job/chaplain + plasma_outfit = /datum/outfit/plasmaman/chaplain access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE) minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE) diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index b2699071e3..6d4204d041 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -12,6 +12,7 @@ exp_requirements = 60 outfit = /datum/outfit/job/chemist + plasma_outfit = /datum/outfit/plasmaman/chemist access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index d8df767a9f..18be8c9835 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -17,6 +17,7 @@ exp_type_department = EXP_TYPE_ENGINEERING outfit = /datum/outfit/job/ce + plasma_outfit = /datum/outfit/plasmaman/ce access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 9cbc15ca28..627a7a2ca1 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -17,6 +17,7 @@ exp_type_department = EXP_TYPE_MEDICAL outfit = /datum/outfit/job/cmo + plasma_outfit = /datum/outfit/plasmaman/cmo access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index 7ad7148614..dc2f60434c 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -10,6 +10,7 @@ selection_color = "#dddddd" outfit = /datum/outfit/job/clown + plasma_outfit = /datum/outfit/plasmaman/clown access = list(ACCESS_THEATRE) minimal_access = list(ACCESS_THEATRE) diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 5a5916cb7e..666ee8f036 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -11,6 +11,7 @@ var/cooks = 0 //Counts cooks amount outfit = /datum/outfit/job/cook + plasma_outfit = /datum/outfit/plasmaman/chef access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index 47bfd4914a..254fc15bd4 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -10,6 +10,7 @@ selection_color = "#dddddd" outfit = /datum/outfit/job/curator + plasma_outfit = /datum/outfit/plasmaman/curator access = list(ACCESS_LIBRARY) minimal_access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION, ACCESS_MINING_STATION) diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index 463113f14c..65724765e1 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -14,6 +14,7 @@ exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/detective + plasma_outfit = /datum/outfit/plasmaman/detective access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index a40ca0fca3..5ff1bebfbf 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -12,6 +12,7 @@ exp_requirements = 60 outfit = /datum/outfit/job/geneticist + plasma_outfit = /datum/outfit/plasmaman/genetics access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE) minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 8015c19c36..41fb4b99da 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -17,6 +17,7 @@ exp_type_department = EXP_TYPE_SERVICE outfit = /datum/outfit/job/hop + plasma_outfit = /datum/outfit/plasmaman/hop access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 3d7d07d894..cfd8d7f6c0 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -17,6 +17,8 @@ exp_type_department = EXP_TYPE_SECURITY outfit = /datum/outfit/job/hos + plasma_outfit = /datum/outfit/plasmaman/hos + mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index 2f6d6f0e32..c62c2e5b26 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -10,6 +10,7 @@ selection_color = "#bbe291" outfit = /datum/outfit/job/janitor + plasma_outfit = /datum/outfit/plasmaman/janitor access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index 1a7499800b..17c376a5de 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -11,6 +11,7 @@ var/lawyers = 0 //Counts lawyer amount outfit = /datum/outfit/job/lawyer + plasma_outfit = /datum/outfit/plasmaman/bar //yes, this is correct, there's no 'lawyer' plasmeme outfit access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index 5ec4b83b2f..d6a763acfe 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -10,6 +10,7 @@ selection_color = "#74b5e0" outfit = /datum/outfit/job/doctor + plasma_outfit = /datum/outfit/plasmaman/medical access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index 4ba2489ab2..e00b3a1e29 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -10,6 +10,7 @@ selection_color = "#dddddd" outfit = /datum/outfit/job/mime + plasma_outfit = /datum/outfit/plasmaman/mime access = list(ACCESS_THEATRE) minimal_access = list(ACCESS_THEATRE) diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 7128fbe2c7..33f7df8260 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -17,6 +17,7 @@ exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/rd + plasma_outfit = /datum/outfit/plasmaman/rd access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index f5ae93bb6a..aa52b353df 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -12,6 +12,7 @@ exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/roboticist + plasma_outfit = /datum/outfit/plasmaman/robotics access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_XENOBIOLOGY, ACCESS_GENETICS) minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index 476f740b9d..a851b333fe 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -12,6 +12,7 @@ exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/scientist + plasma_outfit = /datum/outfit/plasmaman/science access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_GENETICS) minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 7e71b2d1f4..bc83eb752d 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -14,6 +14,7 @@ exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/security + plasma_outfit = /datum/outfit/plasmaman/security access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access() diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index ebf7ba0f1f..04d3fb53b8 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -12,6 +12,7 @@ outfit = /datum/outfit/job/miner + plasma_outfit = /datum/outfit/plasmaman/mining access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index d3f5db7dbb..2396728ad8 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -12,6 +12,7 @@ exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/engineer + plasma_outfit = /datum/outfit/plasmaman/engineering access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index 790e828931..3e9b3ba06c 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -12,6 +12,7 @@ exp_requirements = 60 outfit = /datum/outfit/job/virologist + plasma_outfit = /datum/outfit/plasmaman/viro access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 22e3f9b0f1..c909342d6f 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -14,6 +14,7 @@ exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/warden + plasma_outfit = /datum/outfit/plasmaman/warden access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/warden/get_access() diff --git a/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm b/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm index 020776a75f..3c2c850e3c 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm @@ -1,9 +1,9 @@ -/datum/sprite_accessory/mam_tails/shark/datashark +/datum/sprite_accessory/tails/mam_tails/shark/datashark name = "DataShark" icon_state = "datashark" ckeys_allowed = list("rubyflamewing") -/datum/sprite_accessory/mam_tails_animated/shark/datashark +/datum/sprite_accessory/tails_animated/mam_tails_animated/shark/datashark name = "DataShark" icon_state = "datashark" ckeys_allowed = list("rubyflamewing") @@ -14,19 +14,19 @@ ckeys_allowed = list("rubyflamewing") //Sabresune -/datum/sprite_accessory/mam_ears/sabresune +/datum/sprite_accessory/ears/mam_ears/sabresune name = "Sabresune" icon_state = "sabresune" ckeys_allowed = list("poojawa") extra = TRUE extra_color_src = MUTCOLORS3 -/datum/sprite_accessory/mam_tails/sabresune +/datum/sprite_accessory/tails/mam_tails/sabresune name = "Sabresune" icon_state = "sabresune" ckeys_allowed = list("poojawa") -/datum/sprite_accessory/mam_tails_animated/sabresune +/datum/sprite_accessory/tails_animated/mam_tails_animated/sabresune name = "Sabresune" icon_state = "sabresune" ckeys_allowed = list("poojawa") @@ -37,17 +37,17 @@ ckeys_allowed = list("poojawa") //Lunasune -/datum/sprite_accessory/mam_ears/lunasune +/datum/sprite_accessory/ears/mam_ears/lunasune name = "lunasune" icon_state = "lunasune" ckeys_allowed = list("invader4352") -/datum/sprite_accessory/mam_tails/lunasune +/datum/sprite_accessory/tails/mam_tails/lunasune name = "lunasune" icon_state = "lunasune" ckeys_allowed = list("invader4352") -/datum/sprite_accessory/mam_tails_animated/lunasune +/datum/sprite_accessory/tails_animated/mam_tails_animated/lunasune name = "lunasune" icon_state = "lunasune" ckeys_allowed = list("invader4352") diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm index 6514cb4f80..4cb8d080ff 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm @@ -76,6 +76,9 @@ //For soft-restricting markings to species IDs var/list/recommended_species +/datum/sprite_accessory/proc/is_not_visible(var/mob/living/carbon/human/H, var/tauric) //return if the accessory shouldn't be shown + return FALSE + /datum/sprite_accessory/underwear icon = 'icons/mob/clothing/underwear.dmi' var/has_color = FALSE diff --git a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm index c8e7aca26d..899bf91081 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm @@ -7,6 +7,9 @@ mutant_part_string = "xenodorsal" relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) +/datum/sprite_accessory/xeno_dorsal/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + return (!H.dna.features["xenodorsal"] || H.dna.features["xenodorsal"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))) + /datum/sprite_accessory/xeno_dorsal/standard name = "Standard" icon_state = "standard" @@ -27,6 +30,9 @@ mutant_part_string = "tail" relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) +/datum/sprite_accessory/xeno_tail/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + return (!H.dna.features["xenotail"] || H.dna.features["xenotail"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) + /datum/sprite_accessory/xeno_tail/none name = "None" relevant_layers = null @@ -43,6 +49,10 @@ mutant_part_string = "xhead" relevant_layers = list(BODY_ADJ_LAYER) +/datum/sprite_accessory/xeno_head/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) + return (!H.dna.features["xenohead"] || H.dna.features["xenohead"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC) + /datum/sprite_accessory/xeno_head/standard name = "Standard" icon_state = "standard" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm index 9950f0d76a..a04838a360 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm @@ -224,6 +224,9 @@ color_src = 0 relevant_layers = list(BODY_FRONT_LAYER) +/datum/sprite_accessory/insect_fluff/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + return (!H.dna.features["insect_fluff"] || H.dna.features["insect_fluff"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) + /datum/sprite_accessory/insect_fluff/none name = "None" icon_state = "none" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm index bc269ccf62..1e6c797364 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -3,6 +3,10 @@ mutant_part_string = "ears" relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) +/datum/sprite_accessory/ears/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) + return (!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC) + /datum/sprite_accessory/ears/none name = "None" icon_state = "none" @@ -175,50 +179,54 @@ *************** Furry Ears **************** *******************************************/ -/datum/sprite_accessory/mam_ears +/datum/sprite_accessory/ears/mam_ears icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED mutant_part_string = "ears" relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) -/datum/sprite_accessory/mam_ears/none +/datum/sprite_accessory/ears/mam_ears/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) + return (!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC) + +/datum/sprite_accessory/ears/mam_ears/none name = "None" icon_state = "none" relevant_layers = null -/datum/sprite_accessory/mam_ears/axolotl +/datum/sprite_accessory/ears/mam_ears/axolotl name = "Axolotl" icon_state = "axolotl" -/datum/sprite_accessory/mam_ears/bat +/datum/sprite_accessory/ears/mam_ears/bat name = "Bat" icon_state = "bat" -/datum/sprite_accessory/mam_ears/bear +/datum/sprite_accessory/ears/mam_ears/bear name = "Bear" icon_state = "bear" -/datum/sprite_accessory/mam_ears/bigwolf +/datum/sprite_accessory/ears/mam_ears/bigwolf name = "Big Wolf" icon_state = "bigwolf" -/datum/sprite_accessory/mam_ears/bigwolfinner +/datum/sprite_accessory/ears/mam_ears/bigwolfinner name = "Big Wolf (ALT)" icon_state = "bigwolfinner" extra = TRUE extra_color_src = NONE -/datum/sprite_accessory/mam_ears/bigwolfdark +/datum/sprite_accessory/ears/mam_ears/bigwolfdark name = "Dark Big Wolf" icon_state = "bigwolfdark" -/datum/sprite_accessory/mam_ears/bigwolfinnerdark +/datum/sprite_accessory/ears/mam_ears/bigwolfinnerdark name = "Dark Big Wolf (ALT)" icon_state = "bigwolfinnerdark" extra = TRUE extra_color_src = NONE -/datum/sprite_accessory/mam_ears/cat +/datum/sprite_accessory/ears/mam_ears/cat name = "Cat" icon_state = "cat" icon = 'icons/mob/mutant_bodyparts.dmi' @@ -226,100 +234,100 @@ extra = TRUE extra_color_src = NONE -/datum/sprite_accessory/mam_ears/catbig +/datum/sprite_accessory/ears/mam_ears/catbig name = "Cat, Big" icon_state = "catbig" -/datum/sprite_accessory/mam_ears/cow +/datum/sprite_accessory/ears/mam_ears/cow name = "Cow" icon_state = "cow" -/datum/sprite_accessory/mam_ears/curled +/datum/sprite_accessory/ears/mam_ears/curled name = "Curled Horn" icon_state = "horn1" color_src = MUTCOLORS3 -/datum/sprite_accessory/mam_ears/deer +/datum/sprite_accessory/ears/mam_ears/deer name = "Deer" icon_state = "deer" color_src = MUTCOLORS3 -/datum/sprite_accessory/mam_ears/eevee +/datum/sprite_accessory/ears/mam_ears/eevee name = "Eevee" icon_state = "eevee" -/datum/sprite_accessory/mam_ears/elf +/datum/sprite_accessory/ears/mam_ears/elf name = "Elf" icon_state = "elf" color_src = MUTCOLORS3 -/datum/sprite_accessory/mam_ears/elephant +/datum/sprite_accessory/ears/mam_ears/elephant name = "Elephant" icon_state = "elephant" -/datum/sprite_accessory/mam_ears/fennec +/datum/sprite_accessory/ears/mam_ears/fennec name = "Fennec" icon_state = "fennec" -/datum/sprite_accessory/mam_ears/fish +/datum/sprite_accessory/ears/mam_ears/fish name = "Fish" icon_state = "fish" -/datum/sprite_accessory/mam_ears/fox +/datum/sprite_accessory/ears/mam_ears/fox name = "Fox" icon_state = "fox" -/datum/sprite_accessory/mam_ears/husky +/datum/sprite_accessory/ears/mam_ears/husky name = "Husky" icon_state = "wolf" -/datum/sprite_accessory/mam_ears/kangaroo +/datum/sprite_accessory/ears/mam_ears/kangaroo name = "kangaroo" icon_state = "kangaroo" -/datum/sprite_accessory/mam_ears/jellyfish +/datum/sprite_accessory/ears/mam_ears/jellyfish name = "Jellyfish" icon_state = "jellyfish" color_src = HAIR -/datum/sprite_accessory/mam_ears/lab +/datum/sprite_accessory/ears/mam_ears/lab name = "Dog, Long" icon_state = "lab" -/datum/sprite_accessory/mam_ears/murid +/datum/sprite_accessory/ears/mam_ears/murid name = "Murid" icon_state = "murid" -/datum/sprite_accessory/mam_ears/otie +/datum/sprite_accessory/ears/mam_ears/otie name = "Otusian" icon_state = "otie" -/datum/sprite_accessory/mam_ears/squirrel +/datum/sprite_accessory/ears/mam_ears/squirrel name = "Squirrel" icon_state = "squirrel" -/datum/sprite_accessory/mam_ears/pede +/datum/sprite_accessory/ears/mam_ears/pede name = "Scolipede" icon_state = "pede" -/datum/sprite_accessory/mam_ears/rabbit +/datum/sprite_accessory/ears/mam_ears/rabbit name = "Rabbit" icon_state = "rabbit" -/datum/sprite_accessory/mam_ears/sergal +/datum/sprite_accessory/ears/mam_ears/sergal name = "Sergal" icon_state = "sergal" -/datum/sprite_accessory/mam_ears/skunk +/datum/sprite_accessory/ears/mam_ears/skunk name = "skunk" icon_state = "skunk" -/datum/sprite_accessory/mam_ears/wolf +/datum/sprite_accessory/ears/mam_ears/wolf name = "Wolf" icon_state = "wolf" -/datum/sprite_accessory/mam_ears/bunny +/datum/sprite_accessory/ears/mam_ears/bunny name = "Bunny" icon_state = "bunny" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm index 0aaec309a4..18a76df116 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm @@ -2,6 +2,10 @@ icon = 'icons/mob/mutant_bodyparts.dmi' relevant_layers = list(BODY_ADJ_LAYER) +/datum/sprite_accessory/frills/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) + return (!H.dna.features["frills"] || H.dna.features["frills"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || !HD || HD.status == BODYPART_ROBOTIC) + /datum/sprite_accessory/frills/none name = "None" icon_state = "none" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm index b39f48f858..3a65eaebfa 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm @@ -3,6 +3,10 @@ color_src = HORNCOLOR relevant_layers = list(HORNS_LAYER) +/datum/sprite_accessory/horns/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) + return (!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC) + /datum/sprite_accessory/horns/none name = "None" icon_state = "none" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm index 2ec6da2da8..d41f5ace22 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm @@ -30,6 +30,9 @@ var/alt_taur_mode = NONE //Same as above. var/hide_legs = USE_QUADRUPED_CLIP_MASK +/datum/sprite_accessory/taur/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + return (!tauric || (H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR))) + /datum/sprite_accessory/taur/New() switch(hide_legs) if(USE_QUADRUPED_CLIP_MASK) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm index 2c0db56ce4..2e14a88f29 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm @@ -3,6 +3,10 @@ mutant_part_string = "snout" relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER) +/datum/sprite_accessory/snouts/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) + return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC) + /datum/sprite_accessory/snouts/sharp name = "Sharp" icon_state = "sharp" @@ -150,35 +154,39 @@ ************** Mammal Snouts ************** *******************************************/ -/datum/sprite_accessory/mam_snouts +/datum/sprite_accessory/snouts/mam_snouts color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_snouts.dmi' recommended_species = list("mammal", "slimeperson", "insect", "podweak") mutant_part_string = "snout" relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER) -/datum/sprite_accessory/mam_snouts/none +/datum/sprite_accessory/snouts/mam_snouts/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) + return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC) + +/datum/sprite_accessory/snouts/mam_snouts/none name = "None" icon_state = "none" recommended_species = null relevant_layers = null -/datum/sprite_accessory/mam_snouts/bird +/datum/sprite_accessory/snouts/mam_snouts/bird name = "Beak" icon_state = "bird" -/datum/sprite_accessory/mam_snouts/bigbeak +/datum/sprite_accessory/snouts/mam_snouts/bigbeak name = "Big Beak" icon_state = "bigbeak" -/datum/sprite_accessory/mam_snouts/bug +/datum/sprite_accessory/snouts/mam_snouts/bug name = "Bug" icon_state = "bug" color_src = MUTCOLORS extra2 = TRUE extra2_color_src = MUTCOLORS3 -/datum/sprite_accessory/mam_snouts/elephant +/datum/sprite_accessory/snouts/mam_snouts/elephant name = "Elephant" icon_state = "elephant" extra = TRUE @@ -194,92 +202,92 @@ name = "Mammal, Long" icon_state = "lcanid" -/datum/sprite_accessory/mam_snouts/lcanidalt +/datum/sprite_accessory/snouts/mam_snouts/lcanidalt name = "Mammal, Long ALT" icon_state = "lcanidalt" -/datum/sprite_accessory/mam_snouts/scanid +/datum/sprite_accessory/snouts/mam_snouts/scanid name = "Mammal, Short" icon_state = "scanid" -/datum/sprite_accessory/mam_snouts/scanidalt +/datum/sprite_accessory/snouts/mam_snouts/scanidalt name = "Mammal, Short ALT" icon_state = "scanidalt" -/datum/sprite_accessory/mam_snouts/scanidalt2 +/datum/sprite_accessory/snouts/mam_snouts/scanidalt2 name = "Mammal, Short ALT 2" icon_state = "scanidalt2" -/datum/sprite_accessory/mam_snouts/wolf +/datum/sprite_accessory/snouts/mam_snouts/wolf name = "Mammal, Thick" icon_state = "wolf" -/datum/sprite_accessory/mam_snouts/wolfalt +/datum/sprite_accessory/snouts/mam_snouts/wolfalt name = "Mammal, Thick ALT" icon_state = "wolfalt" -/datum/sprite_accessory/mam_snouts/redpanda +/datum/sprite_accessory/snouts/mam_snouts/redpanda name = "WahCoon" icon_state = "wah" -/datum/sprite_accessory/mam_snouts/redpandaalt +/datum/sprite_accessory/snouts/mam_snouts/redpandaalt name = "WahCoon ALT" icon_state = "wahalt" -/datum/sprite_accessory/mam_snouts/rhino +/datum/sprite_accessory/snouts/mam_snouts/rhino name = "Horn" icon_state = "rhino" extra = TRUE extra = MUTCOLORS3 -/datum/sprite_accessory/mam_snouts/rodent +/datum/sprite_accessory/snouts/mam_snouts/rodent name = "Rodent" icon_state = "rodent" -/datum/sprite_accessory/mam_snouts/husky +/datum/sprite_accessory/snouts/mam_snouts/husky name = "Husky" icon_state = "husky" -/datum/sprite_accessory/mam_snouts/otie +/datum/sprite_accessory/snouts/mam_snouts/otie name = "Otie" icon_state = "otie" -/datum/sprite_accessory/mam_snouts/pede +/datum/sprite_accessory/snouts/mam_snouts/pede name = "Scolipede" icon_state = "pede" -/datum/sprite_accessory/mam_snouts/sergal +/datum/sprite_accessory/snouts/mam_snouts/sergal name = "Sergal" icon_state = "sergal" -/datum/sprite_accessory/mam_snouts/shark +/datum/sprite_accessory/snouts/mam_snouts/shark name = "Shark" icon_state = "shark" -/datum/sprite_accessory/mam_snouts/hshark +/datum/sprite_accessory/snouts/mam_snouts/hshark name = "hShark" icon_state = "hshark" -/datum/sprite_accessory/mam_snouts/toucan +/datum/sprite_accessory/snouts/mam_snouts/toucan name = "Toucan" icon_state = "toucan" -/datum/sprite_accessory/mam_snouts/sharp +/datum/sprite_accessory/snouts/mam_snouts/sharp name = "Sharp" icon_state = "sharp" color_src = MUTCOLORS -/datum/sprite_accessory/mam_snouts/round +/datum/sprite_accessory/snouts/mam_snouts/round name = "Round" icon_state = "round" color_src = MUTCOLORS -/datum/sprite_accessory/mam_snouts/sharplight +/datum/sprite_accessory/snouts/mam_snouts/sharplight name = "Sharp + Light" icon_state = "sharplight" color_src = MUTCOLORS -/datum/sprite_accessory/mam_snouts/roundlight +/datum/sprite_accessory/snouts/mam_snouts/roundlight name = "Round + Light" icon_state = "roundlight" color_src = MUTCOLORS @@ -289,109 +297,109 @@ **************** Snouts ******************* *************but higher up*****************/ -/datum/sprite_accessory/mam_snouts/fbird +/datum/sprite_accessory/snouts/mam_snouts/fbird name = "Beak (Top)" icon_state = "fbird" -/datum/sprite_accessory/mam_snouts/fbigbeak +/datum/sprite_accessory/snouts/mam_snouts/fbigbeak name = "Big Beak (Top)" icon_state = "fbigbeak" -/datum/sprite_accessory/mam_snouts/fbug +/datum/sprite_accessory/snouts/mam_snouts/fbug name = "Bug (Top)" icon_state = "fbug" color_src = MUTCOLORS extra2 = TRUE extra2_color_src = MUTCOLORS3 -/datum/sprite_accessory/mam_snouts/felephant +/datum/sprite_accessory/snouts/mam_snouts/felephant name = "Elephant (Top)" icon_state = "felephant" extra = TRUE extra_color_src = MUTCOLORS3 -/datum/sprite_accessory/mam_snouts/flcanid +/datum/sprite_accessory/snouts/mam_snouts/flcanid name = "Mammal, Long (Top)" icon_state = "flcanid" -/datum/sprite_accessory/mam_snouts/flcanidalt +/datum/sprite_accessory/snouts/mam_snouts/flcanidalt name = "Mammal, Long ALT (Top)" icon_state = "flcanidalt" -/datum/sprite_accessory/mam_snouts/fscanid +/datum/sprite_accessory/snouts/mam_snouts/fscanid name = "Mammal, Short (Top)" icon_state = "fscanid" -/datum/sprite_accessory/mam_snouts/fscanidalt +/datum/sprite_accessory/snouts/mam_snouts/fscanidalt name = "Mammal, Short ALT (Top)" icon_state = "fscanidalt" -/datum/sprite_accessory/mam_snouts/fscanidalt2 +/datum/sprite_accessory/snouts/mam_snouts/fscanidalt2 name = "Mammal, Short ALT 2 (Top)" icon_state = "fscanidalt2" -/datum/sprite_accessory/mam_snouts/fwolf +/datum/sprite_accessory/snouts/mam_snouts/fwolf name = "Mammal, Thick (Top)" icon_state = "fwolf" -/datum/sprite_accessory/mam_snouts/fwolfalt +/datum/sprite_accessory/snouts/mam_snouts/fwolfalt name = "Mammal, Thick ALT (Top)" icon_state = "fwolfalt" -/datum/sprite_accessory/mam_snouts/fredpanda +/datum/sprite_accessory/snouts/mam_snouts/fredpanda name = "WahCoon (Top)" icon_state = "fwah" -/datum/sprite_accessory/mam_snouts/frhino +/datum/sprite_accessory/snouts/mam_snouts/frhino name = "Horn (Top)" icon_state = "frhino" extra = TRUE extra = MUTCOLORS3 -/datum/sprite_accessory/mam_snouts/frodent +/datum/sprite_accessory/snouts/mam_snouts/frodent name = "Rodent (Top)" icon_state = "frodent" -/datum/sprite_accessory/mam_snouts/fhusky +/datum/sprite_accessory/snouts/mam_snouts/fhusky name = "Husky (Top)" icon_state = "fhusky" -/datum/sprite_accessory/mam_snouts/fotie +/datum/sprite_accessory/snouts/mam_snouts/fotie name = "Otie (Top)" icon_state = "fotie" -/datum/sprite_accessory/mam_snouts/fpede +/datum/sprite_accessory/snouts/mam_snouts/fpede name = "Scolipede (Top)" icon_state = "fpede" -/datum/sprite_accessory/mam_snouts/fsergal +/datum/sprite_accessory/snouts/mam_snouts/fsergal name = "Sergal (Top)" icon_state = "fsergal" -/datum/sprite_accessory/mam_snouts/fshark +/datum/sprite_accessory/snouts/mam_snouts/fshark name = "Shark (Top)" icon_state = "fshark" -/datum/sprite_accessory/mam_snouts/ftoucan +/datum/sprite_accessory/snouts/mam_snouts/ftoucan name = "Toucan (Top)" icon_state = "ftoucan" -/datum/sprite_accessory/mam_snouts/fsharp +/datum/sprite_accessory/snouts/mam_snouts/fsharp name = "Sharp (Top)" icon_state = "fsharp" color_src = MUTCOLORS -/datum/sprite_accessory/mam_snouts/fround +/datum/sprite_accessory/snouts/mam_snouts/fround name = "Round (Top)" icon_state = "fround" color_src = MUTCOLORS -/datum/sprite_accessory/mam_snouts/fsharplight +/datum/sprite_accessory/snouts/mam_snouts/fsharplight name = "Sharp + Light (Top)" icon_state = "fsharplight" color_src = MUTCOLORS -/datum/sprite_accessory/mam_snouts/froundlight +/datum/sprite_accessory/snouts/mam_snouts/froundlight name = "Round + Light (Top)" icon_state = "froundlight" color_src = MUTCOLORS diff --git a/code/modules/mob/dead/new_player/sprite_accessories/spines.dm b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm index 54749d5ea9..53a5650a05 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/spines.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm @@ -2,10 +2,15 @@ icon = 'icons/mob/mutant_bodyparts.dmi' relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER) +/datum/sprite_accessory/spines/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + return (!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) + /datum/sprite_accessory/spines_animated icon = 'icons/mob/mutant_bodyparts.dmi' relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER) +/datum/sprite_accessory/spines_animated/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + return (!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR) || H.dna.species.mutant_bodyparts["tail"]) /datum/sprite_accessory/spines/none name = "None" icon_state = "none" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm index a2884ab944..16531d8f06 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm @@ -1,24 +1,24 @@ //Synth snouts (This is the most important part) -/datum/sprite_accessory/mam_snouts/synthliz +/datum/sprite_accessory/snouts/mam_snouts/synthliz recommended_species = list("synthliz") icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi' color_src = MUTCOLORS name = "Synthetic Lizard - Snout" icon_state = "synthliz_basic" -/datum/sprite_accessory/mam_snouts/synthliz/synthliz_under +/datum/sprite_accessory/snouts/mam_snouts/synthliz/synthliz_under icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi' color_src = MATRIXED name = "Synthetic Lizard - Snout Under" icon_state = "synthliz_under" -/datum/sprite_accessory/mam_snouts/synthliz/synthliz_tert +/datum/sprite_accessory/snouts/mam_snouts/synthliz/synthliz_tert icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi' color_src = MATRIXED name = "Synthetic Lizard - Snout Tertiary" icon_state = "synthliz_tert" -/datum/sprite_accessory/mam_snouts/synthliz/synthliz_tertunder +/datum/sprite_accessory/snouts/mam_snouts/synthliz/synthliz_tertunder icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi' color_src = MATRIXED name = "Synthetic Lizard - Snout Tertiary Under" @@ -42,14 +42,14 @@ icon_state = "synthlizpecslight" //Synth tails -/datum/sprite_accessory/mam_tails/synthliz +/datum/sprite_accessory/tails/mam_tails/synthliz recommended_species = list("synthliz") icon = 'modular_citadel/icons/mob/synthliz_tails.dmi' color_src = MUTCOLORS name = "Synthetic Lizard" icon_state = "synthliz" -/datum/sprite_accessory/mam_tails_animated/synthliz +/datum/sprite_accessory/tails_animated/mam_tails_animated/synthliz recommended_species = list("synthliz") icon = 'modular_citadel/icons/mob/synthliz_tails.dmi' color_src = MUTCOLORS diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm index 33dbd7059f..0afbeaf070 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -3,6 +3,9 @@ mutant_part_string = "tail" relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) +/datum/sprite_accessory/tails/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + return ((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) + /datum/sprite_accessory/tails_animated icon = 'icons/mob/mutant_bodyparts.dmi' mutant_part_string = "tailwag" @@ -12,6 +15,9 @@ ************* Lizard Tails **************** *******************************************/ +/datum/sprite_accessory/tails_animated/lizard/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + return ((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric || H.dna.species.mutant_bodyparts["tail_lizard"]) + /datum/sprite_accessory/tails/lizard/smooth name = "Smooth" icon_state = "smooth" @@ -98,6 +104,9 @@ icon_state = "none" relevant_layers = null +/datum/sprite_accessory/tails_animated/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + return ((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric || H.dna.species.mutant_bodyparts["tail_human"]) + /datum/sprite_accessory/tails/human/ailurus name = "Red Panda" icon_state = "wah" @@ -122,22 +131,22 @@ icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED -/datum/sprite_accessory/mam_tails/batl +/datum/sprite_accessory/tails/mam_tails/batl name = "Bat (Long)" icon = 'modular_citadel/icons/mob/mam_tails.dmi' icon_state = "batl" -/datum/sprite_accessory/mam_tails_animated/batl +/datum/sprite_accessory/tails_animated/mam_tails_animated/batl name = "Bat (Long)" icon = 'modular_citadel/icons/mob/mam_tails.dmi' icon_state = "batl" -/datum/sprite_accessory/mam_tails/bats +/datum/sprite_accessory/tails/mam_tails/bats name = "Bat (Short)" icon = 'modular_citadel/icons/mob/mam_tails.dmi' icon_state = "bats" -/datum/sprite_accessory/mam_tails_animated/bats +/datum/sprite_accessory/tails_animated/mam_tails_animated/bats name = "Bat (Short)" icon = 'modular_citadel/icons/mob/mam_tails.dmi' icon_state = "bats" @@ -518,368 +527,371 @@ ************** Furry Tails **************** *******************************************/ -/datum/sprite_accessory/mam_tails +/datum/sprite_accessory/tails/mam_tails color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' recommended_species = list("mammal", "slimeperson", "podweak", "felinid", "insect") mutant_part_string = "tail" relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) -/datum/sprite_accessory/mam_tails/none +/datum/sprite_accessory/tails/mam_tails/none name = "None" icon_state = "none" recommended_species = null relevant_layers = null -/datum/sprite_accessory/mam_tails_animated +/datum/sprite_accessory/tails_animated/mam_tails_animated color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' mutant_part_string = "tailwag" relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) -/datum/sprite_accessory/mam_tails_animated/none +/datum/sprite_accessory/tails_animated/mam_tails_animated/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + return ((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric || H.dna.species.mutant_bodyparts["mam_tail"]) + +/datum/sprite_accessory/tails_animated/mam_tails_animated/none name = "None" icon_state = "none" relevant_layers = null -/datum/sprite_accessory/mam_tails/ailurus +/datum/sprite_accessory/tails/mam_tails/ailurus name = "Red Panda" icon_state = "wah" extra = TRUE -/datum/sprite_accessory/mam_tails_animated/ailurus +/datum/sprite_accessory/tails_animated/mam_tails_animated/ailurus name = "Red Panda" icon_state = "wah" extra = TRUE -/datum/sprite_accessory/mam_tails/axolotl +/datum/sprite_accessory/tails/mam_tails/axolotl name = "Axolotl" icon_state = "axolotl" -/datum/sprite_accessory/mam_tails_animated/axolotl +/datum/sprite_accessory/tails_animated/mam_tails_animated/axolotl name = "Axolotl" icon_state = "axolotl" -/datum/sprite_accessory/mam_tails/batl +/datum/sprite_accessory/tails/mam_tails/batl name = "Bat (Long)" icon_state = "batl" -/datum/sprite_accessory/mam_tails_animated/batl +/datum/sprite_accessory/tails_animated/mam_tails_animated/batl name = "Bat (Long)" icon_state = "batl" -/datum/sprite_accessory/mam_tails/bats +/datum/sprite_accessory/tails/mam_tails/bats name = "Bat (Short)" icon_state = "bats" -/datum/sprite_accessory/mam_tails_animated/bats +/datum/sprite_accessory/tails_animated/mam_tails_animated/bats name = "Bat (Short)" icon_state = "bats" -/datum/sprite_accessory/mam_tails/bee +/datum/sprite_accessory/tails/mam_tails/bee name = "Bee" icon_state = "bee" -/datum/sprite_accessory/mam_tails_animated/bee +/datum/sprite_accessory/tails_animated/mam_tails_animated/bee name = "Bee" icon_state = "bee" -/datum/sprite_accessory/mam_tails/cat +/datum/sprite_accessory/tails/mam_tails/cat name = "Cat" icon_state = "cat" color_src = HAIR -/datum/sprite_accessory/mam_tails_animated/cat +/datum/sprite_accessory/tails_animated/mam_tails_animated/cat name = "Cat" icon_state = "cat" color_src = HAIR -/datum/sprite_accessory/mam_tails/catbig +/datum/sprite_accessory/tails/mam_tails/catbig name = "Cat, Big" icon_state = "catbig" -/datum/sprite_accessory/mam_tails_animated/catbig +/datum/sprite_accessory/tails_animated/mam_tails_animated/catbig name = "Cat, Big" icon_state = "catbig" -/datum/sprite_accessory/mam_tails/twocat +/datum/sprite_accessory/tails/mam_tails/twocat name = "Cat, Double" icon_state = "twocat" -/datum/sprite_accessory/mam_tails_animated/twocat +/datum/sprite_accessory/tails_animated/mam_tails_animated/twocat name = "Cat, Double" icon_state = "twocat" -/datum/sprite_accessory/mam_tails/corvid +/datum/sprite_accessory/tails/mam_tails/corvid name = "Corvid" icon_state = "crow" -/datum/sprite_accessory/mam_tails_animated/corvid +/datum/sprite_accessory/tails_animated/mam_tails_animated/corvid name = "Corvid" icon_state = "crow" -/datum/sprite_accessory/mam_tail/cow +/datum/sprite_accessory/tails/mam_tail/cow name = "Cow" icon_state = "cow" -/datum/sprite_accessory/mam_tails_animated/cow +/datum/sprite_accessory/tails_animated/mam_tails_animated/cow name = "Cow" icon_state = "cow" -/datum/sprite_accessory/mam_tails/eevee +/datum/sprite_accessory/tails/mam_tails/eevee name = "Eevee" icon_state = "eevee" -/datum/sprite_accessory/mam_tails_animated/eevee +/datum/sprite_accessory/tails_animated/mam_tails_animated/eevee name = "Eevee" icon_state = "eevee" -/datum/sprite_accessory/mam_tails/fennec +/datum/sprite_accessory/tails/mam_tails/fennec name = "Fennec" icon_state = "fennec" -/datum/sprite_accessory/mam_tails_animated/fennec +/datum/sprite_accessory/tails_animated/mam_tails_animated/fennec name = "Fennec" icon_state = "fennec" -/datum/sprite_accessory/mam_tails/human/fish +/datum/sprite_accessory/tails/mam_tails/human/fish name = "Fish" icon_state = "fish" -/datum/sprite_accessory/mam_tails_animated/human/fish +/datum/sprite_accessory/tails_animated/mam_tails_animated/human/fish name = "Fish" icon_state = "fish" -/datum/sprite_accessory/mam_tails/fox +/datum/sprite_accessory/tails/mam_tails/fox name = "Fox" icon_state = "fox" -/datum/sprite_accessory/mam_tails_animated/fox +/datum/sprite_accessory/tails_animated/mam_tails_animated/fox name = "Fox" icon_state = "fox" -/datum/sprite_accessory/mam_tails/hawk +/datum/sprite_accessory/tails/mam_tails/hawk name = "Hawk" icon_state = "hawk" -/datum/sprite_accessory/mam_tails_animated/hawk +/datum/sprite_accessory/tails_animated/mam_tails_animated/hawk name = "Hawk" icon_state = "hawk" -/datum/sprite_accessory/mam_tails/horse +/datum/sprite_accessory/tails/mam_tails/horse name = "Horse" icon_state = "horse" color_src = HAIR -/datum/sprite_accessory/mam_tails_animated/horse +/datum/sprite_accessory/tails_animated/mam_tails_animated/horse name = "Horse" icon_state = "horse" color_src = HAIR -/datum/sprite_accessory/mam_tails/husky +/datum/sprite_accessory/tails/mam_tails/husky name = "Husky" icon_state = "husky" -/datum/sprite_accessory/mam_tails_animated/husky +/datum/sprite_accessory/tails_animated/mam_tails_animated/husky name = "Husky" icon_state = "husky" -datum/sprite_accessory/mam_tails/insect +datum/sprite_accessory/tails/mam_tails/insect name = "Insect" icon_state = "insect" -/datum/sprite_accessory/mam_tails_animated/insect +/datum/sprite_accessory/tails_animated/mam_tails_animated/insect name = "Insect" icon_state = "insect" -/datum/sprite_accessory/mam_tails/kangaroo +/datum/sprite_accessory/tails/mam_tails/kangaroo name = "kangaroo" icon_state = "kangaroo" -/datum/sprite_accessory/mam_tails_animated/kangaroo +/datum/sprite_accessory/tails_animated/mam_tails_animated/kangaroo name = "kangaroo" icon_state = "kangaroo" -/datum/sprite_accessory/mam_tails/kitsune +/datum/sprite_accessory/tails/mam_tails/kitsune name = "Kitsune" icon_state = "kitsune" -/datum/sprite_accessory/mam_tails_animated/kitsune +/datum/sprite_accessory/tails_animated/mam_tails_animated/kitsune name = "Kitsune" icon_state = "kitsune" -/datum/sprite_accessory/mam_tails/lab +/datum/sprite_accessory/tails/mam_tails/lab name = "Lab" icon_state = "lab" -/datum/sprite_accessory/mam_tails_animated/lab +/datum/sprite_accessory/tails_animated/mam_tails_animated/lab name = "Lab" icon_state = "lab" -/datum/sprite_accessory/mam_tails/murid +/datum/sprite_accessory/tails/mam_tails/murid name = "Murid" icon_state = "murid" -/datum/sprite_accessory/mam_tails_animated/murid +/datum/sprite_accessory/tails_animated/mam_tails_animated/murid name = "Murid" icon_state = "murid" -/datum/sprite_accessory/mam_tails/otie +/datum/sprite_accessory/tails/mam_tails/otie name = "Otusian" icon_state = "otie" -/datum/sprite_accessory/mam_tails_animated/otie +/datum/sprite_accessory/tails_animated/mam_tails_animated/otie name = "Otusian" icon_state = "otie" -/datum/sprite_accessory/mam_tails/orca +/datum/sprite_accessory/tails/mam_tails/orca name = "Orca" icon_state = "orca" -/datum/sprite_accessory/mam_tails_animated/orca +/datum/sprite_accessory/tails_animated/mam_tails_animated/orca name = "Orca" icon_state = "orca" -/datum/sprite_accessory/mam_tails/pede +/datum/sprite_accessory/tails/mam_tails/pede name = "Scolipede" icon_state = "pede" -/datum/sprite_accessory/mam_tails_animated/pede +/datum/sprite_accessory/tails_animated/mam_tails_animated/pede name = "Scolipede" icon_state = "pede" -/datum/sprite_accessory/mam_tails/rabbit +/datum/sprite_accessory/tails/mam_tails/rabbit name = "Rabbit" icon_state = "rabbit" -/datum/sprite_accessory/mam_tails_animated/rabbit +/datum/sprite_accessory/tails_animated/mam_tails_animated/rabbit name = "Rabbit" icon_state = "rabbit" -/datum/sprite_accessory/mam_tails/sergal +/datum/sprite_accessory/tails/mam_tails/sergal name = "Sergal" icon_state = "sergal" -/datum/sprite_accessory/mam_tails_animated/sergal +/datum/sprite_accessory/tails_animated/mam_tails_animated/sergal name = "Sergal" icon_state = "sergal" -/datum/sprite_accessory/mam_tails/skunk +/datum/sprite_accessory/tails/mam_tails/skunk name = "Skunk" icon_state = "skunk" -/datum/sprite_accessory/mam_tails_animated/skunk +/datum/sprite_accessory/tails_animated/mam_tails_animated/skunk name = "Skunk" icon_state = "skunk" -/datum/sprite_accessory/mam_tails/smooth +/datum/sprite_accessory/tails/mam_tails/smooth name = "Smooth" icon_state = "smooth" color_src = MUTCOLORS icon = 'icons/mob/mutant_bodyparts.dmi' -/datum/sprite_accessory/mam_tails_animated/smooth +/datum/sprite_accessory/tails_animated/mam_tails_animated/smooth name = "Smooth" icon_state = "smooth" color_src = MUTCOLORS icon = 'icons/mob/mutant_bodyparts.dmi' -/datum/sprite_accessory/mam_tails_animated/spikes +/datum/sprite_accessory/tails_animated/mam_tails_animated/spikes name = "Spikes" icon_state = "spikes" color_src = MUTCOLORS icon = 'icons/mob/mutant_bodyparts.dmi' -/datum/sprite_accessory/mam_tails/spikes +/datum/sprite_accessory/tails/mam_tails/spikes name = "Spikes" icon_state = "spikes" color_src = MUTCOLORS icon = 'icons/mob/mutant_bodyparts.dmi' -/datum/sprite_accessory/mam_tails/shark +/datum/sprite_accessory/tails/mam_tails/shark name = "Shark" icon_state = "shark" -/datum/sprite_accessory/mam_tails_animated/shark +/datum/sprite_accessory/tails_animated/mam_tails_animated/shark name = "Shark" icon_state = "shark" -/datum/sprite_accessory/mam_tails/shepherd +/datum/sprite_accessory/tails/mam_tails/shepherd name = "Shepherd" icon_state = "shepherd" -/datum/sprite_accessory/mam_tails_animated/shepherd +/datum/sprite_accessory/tails_animated/mam_tails_animated/shepherd name = "Shepherd" icon_state = "shepherd" -/datum/sprite_accessory/mam_tails/straighttail +/datum/sprite_accessory/tails/mam_tails/straighttail name = "Straight Tail" icon_state = "straighttail" -/datum/sprite_accessory/mam_tails_animated/straighttail +/datum/sprite_accessory/tails_animated/mam_tails_animated/straighttail name = "Straight Tail" icon_state = "straighttail" -/datum/sprite_accessory/mam_tails/squirrel +/datum/sprite_accessory/tails/mam_tails/squirrel name = "Squirrel" icon_state = "squirrel" -/datum/sprite_accessory/mam_tails_animated/squirrel +/datum/sprite_accessory/tails_animated/mam_tails_animated/squirrel name = "Squirrel" icon_state = "squirrel" -/datum/sprite_accessory/mam_tails/tamamo_kitsune +/datum/sprite_accessory/tails/mam_tails/tamamo_kitsune name = "Tamamo Kitsune Tails" icon_state = "9sune" -/datum/sprite_accessory/mam_tails_animated/tamamo_kitsune +/datum/sprite_accessory/tails_animated/mam_tails_animated/tamamo_kitsune name = "Tamamo Kitsune Tails" icon_state = "9sune" -/datum/sprite_accessory/mam_tails/tentacle +/datum/sprite_accessory/tails/mam_tails/tentacle name = "Tentacle" icon_state = "tentacle" -/datum/sprite_accessory/mam_tails_animated/tentacle +/datum/sprite_accessory/tails_animated/mam_tails_animated/tentacle name = "Tentacle" icon_state = "tentacle" -/datum/sprite_accessory/mam_tails/tiger +/datum/sprite_accessory/tails/mam_tails/tiger name = "Tiger" icon_state = "tiger" -/datum/sprite_accessory/mam_tails_animated/tiger +/datum/sprite_accessory/tails_animated/mam_tails_animated/tiger name = "Tiger" icon_state = "tiger" -/datum/sprite_accessory/mam_tails/dtiger +/datum/sprite_accessory/tails/mam_tails/dtiger name = "Dark Tiger" icon_state = "dtiger" color_src = MUTCOLORS icon = 'icons/mob/mutant_bodyparts.dmi' -/datum/sprite_accessory/mam_tails_animated/dtiger +/datum/sprite_accessory/tails_animated/mam_tails_animated/dtiger name = "Dark Tiger" icon_state = "dtiger" color_src = MUTCOLORS icon = 'icons/mob/mutant_bodyparts.dmi' -/datum/sprite_accessory/mam_tails/ltiger +/datum/sprite_accessory/tails/mam_tails/ltiger name = "Light Tiger" icon_state = "ltiger" color_src = MUTCOLORS icon = 'icons/mob/mutant_bodyparts.dmi' -/datum/sprite_accessory/mam_tails_animated/ltiger +/datum/sprite_accessory/tails_animated/mam_tails_animated/ltiger name = "Light Tiger" icon_state = "ltiger" color_src = MUTCOLORS icon = 'icons/mob/mutant_bodyparts.dmi' -/datum/sprite_accessory/mam_tails/wolf +/datum/sprite_accessory/tails/mam_tails/wolf name = "Wolf" icon_state = "wolf" -/datum/sprite_accessory/mam_tails_animated/wolf +/datum/sprite_accessory/tails_animated/mam_tails_animated/wolf name = "Wolf" icon_state = "wolf" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm index 34767a10f1..fb03df88a1 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm @@ -5,10 +5,16 @@ icon_state = "none" relevant_layers = null +/datum/sprite_accessory/wings/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + return (!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))) + /datum/sprite_accessory/wings_open icon = 'icons/mob/wings.dmi' relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) +/datum/sprite_accessory/wings_open/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + return (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)) || H.dna.species.mutant_bodyparts["wings"]) + /datum/sprite_accessory/wings_open/angel name = "Angel" icon_state = "angel" diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index df049f672d..ee1ebe4506 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -642,106 +642,15 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!mutant_bodyparts) return - var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) var/tauric = mutant_bodyparts["taur"] && H.dna.features["taur"] && H.dna.features["taur"] != "None" - if(mutant_bodyparts["tail_lizard"]) - if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) - bodyparts_to_add -= "tail_lizard" - - if(mutant_bodyparts["waggingtail_lizard"]) - if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) - bodyparts_to_add -= "waggingtail_lizard" - else if (mutant_bodyparts["tail_lizard"]) - bodyparts_to_add -= "waggingtail_lizard" - - if(mutant_bodyparts["tail_human"]) - if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) - bodyparts_to_add -= "tail_human" - - if(mutant_bodyparts["waggingtail_human"]) - if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) - bodyparts_to_add -= "waggingtail_human" - else if (mutant_bodyparts["tail_human"]) - bodyparts_to_add -= "waggingtail_human" - - if(mutant_bodyparts["spines"]) - if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) - bodyparts_to_add -= "spines" - - if(mutant_bodyparts["waggingspines"]) - if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) - bodyparts_to_add -= "waggingspines" - else if (mutant_bodyparts["tail"]) - bodyparts_to_add -= "waggingspines" - - if(mutant_bodyparts["snout"]) //Take a closer look at that snout! - if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC) - bodyparts_to_add -= "snout" - - if(mutant_bodyparts["frills"]) - if(!H.dna.features["frills"] || H.dna.features["frills"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || !HD || HD.status == BODYPART_ROBOTIC) - bodyparts_to_add -= "frills" - - if(mutant_bodyparts["horns"]) - if(!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC) - bodyparts_to_add -= "horns" - - if(mutant_bodyparts["ears"]) - if(!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC) - bodyparts_to_add -= "ears" - - if(mutant_bodyparts["wings"]) - if(!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))) - bodyparts_to_add -= "wings" - - if(mutant_bodyparts["wings_open"]) - if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception))) - bodyparts_to_add -= "wings_open" - else if (mutant_bodyparts["wings"]) - bodyparts_to_add -= "wings_open" - - if(mutant_bodyparts["insect_fluff"]) - if(!H.dna.features["insect_fluff"] || H.dna.features["insect_fluff"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) - bodyparts_to_add -= "insect_fluff" - -//CITADEL EDIT - //Race specific bodyparts: - //Xenos - if(mutant_bodyparts["xenodorsal"]) - if(!H.dna.features["xenodorsal"] || H.dna.features["xenodorsal"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))) - bodyparts_to_add -= "xenodorsal" - if(mutant_bodyparts["xenohead"])//This is an overlay for different castes using different head crests - if(!H.dna.features["xenohead"] || H.dna.features["xenohead"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC) - bodyparts_to_add -= "xenohead" - if(mutant_bodyparts["xenotail"]) - if(!H.dna.features["xenotail"] || H.dna.features["xenotail"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) - bodyparts_to_add -= "xenotail" - - //Other Races - if(mutant_bodyparts["mam_tail"]) - if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) - bodyparts_to_add -= "mam_tail" - - if(mutant_bodyparts["mam_waggingtail"]) - if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) - bodyparts_to_add -= "mam_waggingtail" - else if (mutant_bodyparts["mam_tail"]) - bodyparts_to_add -= "mam_waggingtail" - - if(mutant_bodyparts["mam_ears"]) - if(!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC) - bodyparts_to_add -= "mam_ears" - - if(mutant_bodyparts["mam_snouts"]) //Take a closer look at that snout! - if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC) - bodyparts_to_add -= "mam_snouts" - - if(mutant_bodyparts["taur"]) - if(!tauric || (H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR))) - bodyparts_to_add -= "taur" - -//END EDIT + for(var/mutant_part in mutant_bodyparts) + var/reference_list = GLOB.mutant_reference_list[mutant_part] + if(reference_list) + var/datum/sprite_accessory/S + S = reference_list[H.dna.features[mutant_part]] + if(!S || S.is_not_visible(H, tauric)) + bodyparts_to_add -= mutant_part //Digitigrade legs are stuck in the phantom zone between true limbs and mutant bodyparts. Mainly it just needs more agressive updating than most limbs. var/update_needed = FALSE @@ -778,76 +687,18 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/list/dna_feature_as_text_string = list() for(var/bodypart in bodyparts_to_add) - var/datum/sprite_accessory/S - switch(bodypart) - if("tail_lizard") - S = GLOB.tails_list_lizard[H.dna.features["tail_lizard"]] - if("waggingtail_lizard") - S = GLOB.animated_tails_list_lizard[H.dna.features["tail_lizard"]] - if("tail_human") - S = GLOB.tails_list_human[H.dna.features["tail_human"]] - if("waggingtail_human") - S = GLOB.animated_tails_list_human[H.dna.features["tail_human"]] - if("spines") - S = GLOB.spines_list[H.dna.features["spines"]] - if("waggingspines") - S = GLOB.animated_spines_list[H.dna.features["spines"]] - if("snout") - S = GLOB.snouts_list[H.dna.features["snout"]] - if("frills") - S = GLOB.frills_list[H.dna.features["frills"]] - if("horns") - S = GLOB.horns_list[H.dna.features["horns"]] - if("ears") - S = GLOB.ears_list[H.dna.features["ears"]] - if("body_markings") - S = GLOB.body_markings_list[H.dna.features["body_markings"]] - if("wings") - S = GLOB.wings_list[H.dna.features["wings"]] - if("wingsopen") - S = GLOB.wings_open_list[H.dna.features["wings"]] - if("deco_wings") - S = GLOB.deco_wings_list[H.dna.features["deco_wings"]] - if("legs") - S = GLOB.legs_list[H.dna.features["legs"]] - if("insect_wings") - S = GLOB.insect_wings_list[H.dna.features["insect_wings"]] - if("insect_fluff") - S = GLOB.insect_fluffs_list[H.dna.features["insect_fluff"]] - if("insect_markings") - S = GLOB.insect_markings_list[H.dna.features["insect_markings"]] - if("caps") - S = GLOB.caps_list[H.dna.features["caps"]] - if("ipc_screen") - S = GLOB.ipc_screens_list[H.dna.features["ipc_screen"]] - if("ipc_antenna") - S = GLOB.ipc_antennas_list[H.dna.features["ipc_antenna"]] - if("mam_tail") - S = GLOB.mam_tails_list[H.dna.features["mam_tail"]] - if("mam_waggingtail") - S = GLOB.mam_tails_animated_list[H.dna.features["mam_tail"]] - if("mam_body_markings") - S = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]] - if("mam_ears") - S = GLOB.mam_ears_list[H.dna.features["mam_ears"]] - if("mam_snouts") - S = GLOB.mam_snouts_list[H.dna.features["mam_snouts"]] - if("taur") - S = GLOB.taur_list[H.dna.features["taur"]] - if("xenodorsal") - S = GLOB.xeno_dorsal_list[H.dna.features["xenodorsal"]] - if("xenohead") - S = GLOB.xeno_head_list[H.dna.features["xenohead"]] - if("xenotail") - S = GLOB.xeno_tail_list[H.dna.features["xenotail"]] + var/reference_list = GLOB.mutant_reference_list[bodypart] + if(reference_list) + var/datum/sprite_accessory/S + S = reference_list[H.dna.features[bodypart]] - if(!S || S.icon_state == "none") - continue + if(!S || S.icon_state == "none") + continue - for(var/L in S.relevant_layers) - LAZYADD(relevant_layers["[L]"], S) - if(!S.mutant_part_string) - dna_feature_as_text_string[S] = bodypart + for(var/L in S.relevant_layers) + LAZYADD(relevant_layers["[L]"], S) + if(!S.mutant_part_string) + dna_feature_as_text_string[S] = bodypart var/static/list/layer_text = list( "[BODY_BEHIND_LAYER]" = "BEHIND", @@ -2046,17 +1897,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) return /** - - - * The human species version of [/mob/living/carbon/proc/get_biological_state]. Depends on the HAS_FLESH and HAS_BONE species traits, having bones lets you have bone wounds, having flesh lets you have burn, slash, and piercing wounds - - - */ - - - /datum/species/proc/get_biological_state(mob/living/carbon/human/H) . = BIO_INORGANIC if(HAS_FLESH in species_traits) @@ -2072,7 +1914,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(HAS_TRAIT(H, TRAIT_NOBREATH)) return TRUE - /datum/species/proc/handle_environment(datum/gas_mixture/environment, mob/living/carbon/human/H) if(!environment) return @@ -2264,7 +2105,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /datum/species/proc/spec_stun(mob/living/carbon/human/H,amount) if(H) stop_wagging_tail(H) - . = stunmod * H.physiology.stun_mod * amount ////////////// diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index c762a52ffc..49c55f70b3 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -504,7 +504,7 @@ else if (select_alteration == "Ears") var/list/snowflake_ears_list = list("Normal" = null) for(var/path in GLOB.mam_ears_list) - var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[path] + var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[path] if(istype(instance, /datum/sprite_accessory)) var/datum/sprite_accessory/S = instance if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey))) @@ -518,7 +518,7 @@ else if (select_alteration == "Snout") var/list/snowflake_snouts_list = list("Normal" = null) for(var/path in GLOB.mam_snouts_list) - var/datum/sprite_accessory/mam_snouts/instance = GLOB.mam_snouts_list[path] + var/datum/sprite_accessory/snouts/mam_snouts/instance = GLOB.mam_snouts_list[path] if(istype(instance, /datum/sprite_accessory)) var/datum/sprite_accessory/S = instance if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey))) @@ -549,7 +549,7 @@ else if (select_alteration == "Tail") var/list/snowflake_tails_list = list("Normal" = null) for(var/path in GLOB.mam_tails_list) - var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[path] + var/datum/sprite_accessory/tails/mam_tails/instance = GLOB.mam_tails_list[path] if(istype(instance, /datum/sprite_accessory)) var/datum/sprite_accessory/S = instance if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey))) diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index b61e29b685..8c30adb8f9 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -57,89 +57,10 @@ ..() /datum/species/plasmaman/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE) - var/current_job = J?.title var/datum/outfit/plasmaman/O = new /datum/outfit/plasmaman - switch(current_job) - if("Chaplain") - O = new /datum/outfit/plasmaman/chaplain - - if("Curator") - O = new /datum/outfit/plasmaman/curator - - if("Janitor") - O = new /datum/outfit/plasmaman/janitor - - if("Botanist") - O = new /datum/outfit/plasmaman/botany - - if("Bartender", "Lawyer") - O = new /datum/outfit/plasmaman/bar - - if("Cook") - O = new /datum/outfit/plasmaman/chef - - if("Security Officer") - O = new /datum/outfit/plasmaman/security - - if("Detective") - O = new /datum/outfit/plasmaman/detective - - if("Warden") - O = new /datum/outfit/plasmaman/warden - - if("Cargo Technician", "Quartermaster") - O = new /datum/outfit/plasmaman/cargo - - if("Shaft Miner") - O = new /datum/outfit/plasmaman/mining - - if("Medical Doctor") - O = new /datum/outfit/plasmaman/medical - - if("Chemist") - O = new /datum/outfit/plasmaman/chemist - - if("Geneticist") - O = new /datum/outfit/plasmaman/genetics - - if("Roboticist") - O = new /datum/outfit/plasmaman/robotics - - if("Virologist") - O = new /datum/outfit/plasmaman/viro - - if("Scientist") - O = new /datum/outfit/plasmaman/science - - if("Station Engineer") - O = new /datum/outfit/plasmaman/engineering - - if("Atmospheric Technician") - O = new /datum/outfit/plasmaman/atmospherics - - if("Captain") - O = new /datum/outfit/plasmaman/captain - - if("Head of Personnel") - O = new /datum/outfit/plasmaman/hop - - if("Head of Security") - O = new /datum/outfit/plasmaman/hos - - if("Chief Engineer") - O = new /datum/outfit/plasmaman/ce - - if("Chief Medical Officer") - O = new /datum/outfit/plasmaman/cmo - - if("Research Director") - O = new /datum/outfit/plasmaman/rd - - if("Mime") - O = new /datum/outfit/plasmaman/mime - - if("Clown") - O = new /datum/outfit/plasmaman/clown + if(J) + if(J.plasma_outfit) + O = new J.plasma_outfit H.equipOutfit(O, visualsOnly) H.internal = H.get_item_for_held_index(2) diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index b760af9850..228a69c30f 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -82,13 +82,11 @@ M.AddSpell(SW) shadowwalk = SW - /obj/item/organ/brain/nightmare/Remove(special = FALSE) if(shadowwalk && owner) owner.RemoveSpell(shadowwalk) return ..() - /obj/item/organ/heart/nightmare name = "heart of darkness" desc = "An alien organ that twists and writhes when exposed to light." diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index c504e5ccd3..1b6bef9dc6 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -24,7 +24,7 @@ burnmod = 1 ..() -/datum/species/skeleton/greater/check_roundstart_eligible() +/datum/species/skeleton/check_roundstart_eligible() if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) return TRUE return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/synthliz.dm b/code/modules/mob/living/carbon/human/species_types/synthliz.dm index 5ed806b302..173411eaa1 100644 --- a/code/modules/mob/living/carbon/human/species_types/synthliz.dm +++ b/code/modules/mob/living/carbon/human/species_types/synthliz.dm @@ -22,4 +22,4 @@ tail_type = "mam_tail" wagging_type = "mam_waggingtail" - species_type = "robotic" \ No newline at end of file + species_type = "robotic" diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm index a1a2a33c54..c10521dfd9 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -100,14 +100,12 @@ else return ..() - /datum/species/synth/handle_body(mob/living/carbon/human/H) if(fake_species) fake_species.handle_body(H) else return ..() - /datum/species/synth/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) if(fake_species) fake_species.handle_body(H,forced_colour) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 5c83482bde..e7c5644e26 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -313,7 +313,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/insectguts, /obj/effect/decal/cleanable/semen, - /obj/effect/decal/cleanable/femcum, + /obj/effect/decal/cleanable/semen/femcum, /obj/effect/decal/cleanable/generic, /obj/effect/decal/cleanable/glass,, /obj/effect/decal/cleanable/cobweb, diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index b60ee8d108..3433824282 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2218,6 +2218,7 @@ color = "#FFFFFF" // rgb: 255, 255, 255 can_synth = FALSE nutriment_factor = 0.5 * REAGENTS_METABOLISM + var/decal_path = /obj/effect/decal/cleanable/semen /datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume) if(!istype(T)) @@ -2227,7 +2228,7 @@ var/obj/effect/decal/cleanable/semen/S = locate() in T if(!S) - S = new(T) + S = new decal_path(T) if(data["blood_DNA"]) S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) @@ -2251,51 +2252,20 @@ blood_DNA |= S.blood_DNA return ..() -/datum/reagent/consumable/femcum +/datum/reagent/consumable/semen/femcum name = "Female Ejaculate" description = "Vaginal lubricant found in most mammals and other animals of similar nature. Where you found this is your own business." taste_description = "something with a tang" // wew coders who haven't eaten out a girl. - taste_mult = 2 - data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null) - reagent_state = LIQUID color = "#AAAAAA77" - can_synth = FALSE - nutriment_factor = 0.5 * REAGENTS_METABOLISM + decal_path = /obj/effect/decal/cleanable/semen/femcum -/obj/effect/decal/cleanable/femcum +/obj/effect/decal/cleanable/semen/femcum name = "female ejaculate" - desc = null - gender = PLURAL - density = 0 - layer = ABOVE_NORMAL_TURF_LAYER - icon = 'icons/obj/genitals/effects.dmi' icon_state = "fem1" random_icon_states = list("fem1", "fem2", "fem3", "fem4") blood_state = null bloodiness = null -/obj/effect/decal/cleanable/femcum/Initialize(mapload) - . = ..() - dir = GLOB.cardinals - add_blood_DNA(list("Non-human DNA" = "A+")) - -/obj/effect/decal/cleanable/femcum/replace_decal(obj/effect/decal/cleanable/femcum/F) - if(F.blood_DNA) - blood_DNA |= F.blood_DNA - return ..() - -/datum/reagent/consumable/femcum/reaction_turf(turf/T, reac_volume) - if(!istype(T)) - return - if(reac_volume < 10) - return - - var/obj/effect/decal/cleanable/femcum/S = locate() in T - if(!S) - S = new(T) - if(data["blood_DNA"]) - S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) - /datum/reagent/determination name = "Determination" description = "For when you need to push on a little more. Do NOT allow near plants." From e087845745e958a2acc76f0397c8e3c1b07fc28a Mon Sep 17 00:00:00 2001 From: SmArtKar Date: Mon, 17 Aug 2020 13:32:18 +0300 Subject: [PATCH 33/84] reee --- code/controllers/configuration/entries/game_options.dm | 4 ++++ code/modules/shuttle/shuttle_creation/shuttle_creator.dm | 5 +++++ .../shuttle/shuttle_creation/shuttle_creator_actions.dm | 3 +++ 3 files changed, 12 insertions(+) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index b3430cb260..772c9fde0a 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -524,5 +524,9 @@ */ /datum/config_entry/flag/use_field_of_vision +//Shuttle size limiter +/datum/config_entry/number/max_shuttle_count + config_entry_value = 6 + /datum/config_entry/number/max_shuttle_size config_entry_value = 500 diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm index e6cf6d962b..b3d99f22ab 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm @@ -1,4 +1,5 @@ #define SHUTTLE_CREATOR_MAX_SIZE CONFIG_GET(number/max_shuttle_size) +#define CUSTOM_SHUTTLE_LIMIT CONFIG_GET(number/max_shuttle_count) #define CARDINAL_DIRECTIONS_X list(1, 0, -1, 0) #define CARDINAL_DIRECTIONS_Y list(0, 1, 0, -1) @@ -57,6 +58,10 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He ..() if(linkedShuttleId) return + if(GLOB.custom_shuttle_count > CUSTOM_SHUTTLE_LIMIT && !override_max_shuttles) + to_chat(user, "Too many shuttles have been created.") + message_admins("[ADMIN_FLW(user)] attempted to create a shuttle, however [CUSTOM_SHUTTLE_LIMIT] have already been created.") + return if(!internal_shuttle_creator) return overlay_holder.add_client(user.client) diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm index d77232672b..f50b3bf59f 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm @@ -81,6 +81,9 @@ return if(shuttle_creator.linkedShuttleId) return + if(GLOB.custom_shuttle_count > CUSTOM_SHUTTLE_LIMIT) + to_chat(C, "Shuttle limit reached, sorry.") + return if(shuttle_creator.loggedTurfs.len > SHUTTLE_CREATOR_MAX_SIZE) to_chat(C, "This shuttle is too large!") return From 2f14d8998bb7aa2edb9da4b7d837db63625678ea Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Mon, 17 Aug 2020 22:42:41 +1000 Subject: [PATCH 34/84] Update autohydro.dm --- code/modules/plumbing/plumbers/autohydro.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/plumbing/plumbers/autohydro.dm b/code/modules/plumbing/plumbers/autohydro.dm index 5157000754..5e4c618284 100644 --- a/code/modules/plumbing/plumbers/autohydro.dm +++ b/code/modules/plumbing/plumbers/autohydro.dm @@ -7,7 +7,7 @@ canirrigate = FALSE -/obj/machinery/hydroponics/attackby(obj/item/O, mob/user, params) +/obj/machinery/hydroponics/constructable/automagic/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/reagent_containers) ) return FALSE //avoid fucky wuckies ..() From c74803dd1a03a9279ebfafdf20781c3e81e937ff Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Mon, 17 Aug 2020 16:53:49 +0200 Subject: [PATCH 35/84] updates the wiki page link --- code/game/gamemodes/clock_cult/clock_cult.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 406e142a25..ebd9dfaee1 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -225,7 +225,7 @@ Credit where due: if(S && !QDELETED(S)) to_chat(L, "[slot] is a clockwork slab, a multipurpose tool used to construct machines and invoke ancient words of power. If this is your first time \ as a servant, you can find a concise tutorial in the Recollection category of its interface.") - to_chat(L, "If you want more information, you can read the wiki page to learn more.") + to_chat(L, "If you want more information, you can read the wiki page to learn more.") return TRUE return FALSE From 31f1e04654f1506682be66f1a3460468059126bc Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Mon, 17 Aug 2020 17:03:53 +0200 Subject: [PATCH 36/84] updates the helpertext in general Recollection doesn't actually offer any help anymore and just redirects you to the wiki anyways. --- code/game/gamemodes/clock_cult/clock_cult.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index ebd9dfaee1..be8dee5bf8 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -224,8 +224,7 @@ Credit where due: qdel(S) if(S && !QDELETED(S)) to_chat(L, "[slot] is a clockwork slab, a multipurpose tool used to construct machines and invoke ancient words of power. If this is your first time \ - as a servant, you can find a concise tutorial in the Recollection category of its interface.") - to_chat(L, "If you want more information, you can read the wiki page to learn more.") + as a servant, you can read the wiki page to learn more.") return TRUE return FALSE From 47424be1c0213b926d93d6a22670144750c03539 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 18 Aug 2020 00:46:05 +0100 Subject: [PATCH 37/84] tail fix --- code/_globalvars/lists/flavor_misc.dm | 7 ++++++- .../mob/dead/new_player/sprite_accessories/spines.dm | 3 ++- .../mob/dead/new_player/sprite_accessories/tails.dm | 8 ++++---- code/modules/mob/living/carbon/human/species.dm | 6 +++++- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 1a0afc2c2a..8225725ffd 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -73,7 +73,12 @@ GLOBAL_LIST_INIT(mutant_reference_list, list( "xenohead" = GLOB.xeno_head_list, "xenotail" = GLOB.xeno_tail_list)) - +//references wag types to regular types, wings open to wings, etc +GLOBAL_LIST_INIT(mutant_transform_list, list("wingsopen" = "wings", + "waggingtail_human" = "tail_human", + "waggingtail_lizard" = "tail_lizard", + "waggingspines" = "spines", + "mam_waggingtail" = "mam_tail")) GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list("ghost")) //stores the ghost forms that support directional sprites GLOBAL_LIST_INIT(ghost_forms_with_accessories_list, list("ghost")) //stores the ghost forms that support hair and other such things diff --git a/code/modules/mob/dead/new_player/sprite_accessories/spines.dm b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm index 53a5650a05..83415ed375 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/spines.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm @@ -10,7 +10,8 @@ relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER) /datum/sprite_accessory/spines_animated/is_not_visible(var/mob/living/carbon/human/H, var/tauric) - return (!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR) || H.dna.species.mutant_bodyparts["tail"]) + return ((!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || H.dna.species.mutant_bodyparts["tail"]) + /datum/sprite_accessory/spines/none name = "None" icon_state = "none" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm index 0afbeaf070..812e0c052c 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -16,7 +16,7 @@ *******************************************/ /datum/sprite_accessory/tails_animated/lizard/is_not_visible(var/mob/living/carbon/human/H, var/tauric) - return ((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric || H.dna.species.mutant_bodyparts["tail_lizard"]) + return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) || H.dna.species.mutant_bodyparts["tail_lizard"]) /datum/sprite_accessory/tails/lizard/smooth name = "Smooth" @@ -104,8 +104,8 @@ icon_state = "none" relevant_layers = null -/datum/sprite_accessory/tails_animated/is_not_visible(var/mob/living/carbon/human/H, var/tauric) - return ((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric || H.dna.species.mutant_bodyparts["tail_human"]) +/datum/sprite_accessory/tails_animated/human/is_not_visible(var/mob/living/carbon/human/H, var/tauric) + return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)|| H.dna.species.mutant_bodyparts["tail_human"]) /datum/sprite_accessory/tails/human/ailurus name = "Red Panda" @@ -547,7 +547,7 @@ relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/tails_animated/mam_tails_animated/is_not_visible(var/mob/living/carbon/human/H, var/tauric) - return ((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric || H.dna.species.mutant_bodyparts["mam_tail"]) + return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) || H.dna.species.mutant_bodyparts["mam_tail"]) /datum/sprite_accessory/tails_animated/mam_tails_animated/none name = "None" diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index ee1ebe4506..e132ea615f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -648,7 +648,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/reference_list = GLOB.mutant_reference_list[mutant_part] if(reference_list) var/datum/sprite_accessory/S - S = reference_list[H.dna.features[mutant_part]] + var/transformed_part = GLOB.mutant_transform_list[mutant_part] + if(transformed_part) + S = reference_list[H.dna.features[transformed_part]] + else + S = reference_list[H.dna.features[mutant_part]] if(!S || S.is_not_visible(H, tauric)) bodyparts_to_add -= mutant_part From d312a5d639db5a829edc0cd0412e3a2709347589 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 18 Aug 2020 01:32:06 +0100 Subject: [PATCH 38/84] fix tails --- code/modules/mob/living/carbon/human/species.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index e132ea615f..230a634e0e 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -694,7 +694,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/reference_list = GLOB.mutant_reference_list[bodypart] if(reference_list) var/datum/sprite_accessory/S - S = reference_list[H.dna.features[bodypart]] + var/transformed_part = GLOB.mutant_transform_list[bodypart] + if(transformed_part) + S = reference_list[H.dna.features[transformed_part]] + else + S = reference_list[H.dna.features[bodypart]] if(!S || S.icon_state == "none") continue From 32c0335a17dcaff6c2c625ecec8aca640907f78b Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Tue, 18 Aug 2020 10:35:56 +1000 Subject: [PATCH 39/84] Update medical_designs.dm --- .../research/designs/medical_designs.dm | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 04ef917b00..8b322cea0d 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -968,7 +968,7 @@ desc = "A heating and cooling device for pipes!" id = "acclimator" build_type = PROTOLATHE - materials = list(MAT_METAL = 1000, MAT_GLASS = 500) + materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) construction_time = 75 build_path = /obj/machinery/plumbing/acclimator category = list("Misc","Medical Designs") @@ -976,10 +976,10 @@ /datum/design/disposer name = "Plumbing Disposer" - desc = "Using the power of SCIENCE, dissolves reagents into nothing (almost)." + desc = "Using the power of Science, dissolves reagents into nothing (almost)." id = "disposer" build_type = PROTOLATHE - materials = list(MAT_METAL = 500, MAT_GLASS = 100) + materials = list(/datum/material/iron = 500, /datum/material/glass = 100) construction_time = 75 build_path = /obj/machinery/plumbing/disposer category = list("Misc","Medical Designs") @@ -990,7 +990,7 @@ desc = "Filters out chemicals by their NTDB ID." id = "plumb_filter" build_type = PROTOLATHE - materials = list(MAT_METAL = 1000, MAT_GLASS = 500) + materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) construction_time = 75 build_path = /obj/machinery/plumbing/filter category = list("Misc","Medical Designs") @@ -1001,7 +1001,7 @@ desc = "Using standard mass-energy dynamic autoconverters, generates reagents from power and puts them in a pipe." id = "plumb_synth" build_type = PROTOLATHE - materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_PLASTIC = 1000) + materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, MAT_PLASTIC = 1000) construction_time = 75 build_path = /obj/machinery/plumbing/synthesizer category = list("Misc","Medical Designs") @@ -1012,7 +1012,7 @@ desc = "Automatically extracts reagents from an item by grinding it. Think of the possibilities! Note: does not grind people." id = "plumb_grinder" build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_GLASS = 1500) + materials = list(/datum/material/iron = 2000, /datum/material/glass = 1500) construction_time = 75 build_path = /obj/machinery/plumbing/grinder_chemical category = list("Misc","Medical Designs") @@ -1023,7 +1023,7 @@ desc = "You can set a list of allowed reagents and amounts. Once the chamber has these reagents, will let the products through." id = "reaction_chamber" build_type = PROTOLATHE - materials = list(MAT_METAL = 1000, MAT_GLASS = 500) + materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) construction_time = 75 build_path = /obj/machinery/plumbing/reaction_chamber category = list("Misc","Medical Designs") @@ -1034,8 +1034,8 @@ desc = "Ducts for plumbing! Now lathed for efficiency." id = "duct_print" build_type = PROTOLATHE - materials = list(MAT_PLASTIC = 400) - construction_time = 5 + materials = list(/datum/material/plastic = 400) + construction_time = 1 build_path = /obj/item/stack/ducts category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE @@ -1045,7 +1045,7 @@ desc = "A splitter. Has 2 outputs. Can be configured to allow a certain amount through each side." id = "plumb_splitter" build_type = PROTOLATHE - materials = list(MAT_METAL = 750, MAT_GLASS = 250) + materials = list(/datum/material/iron = 750, /datum/material/glass = 250) construction_time = 75 build_path = /obj/machinery/plumbing/splitter category = list("Misc","Medical Designs") @@ -1056,7 +1056,7 @@ desc = "Automatically forms pills to the required parameters with piped reagents! A good replacement for those lazy, useless chemists." id = "pill_press" build_type = PROTOLATHE - materials = list(MAT_METAL = 1000, MAT_GLASS = 500) + materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) construction_time = 75 build_path = /obj/machinery/plumbing/pill_press category = list("Misc","Medical Designs") @@ -1067,7 +1067,7 @@ desc = "Use it for extracting liquids from lavaland's geysers!" id = "plumb_pump" build_type = PROTOLATHE - materials = list(MAT_METAL = 1000, MAT_GLASS = 500) + materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) construction_time = 75 build_path = /obj/machinery/plumbing/liquid_pump category = list("Misc","Medical Designs") @@ -1078,7 +1078,7 @@ desc = "A big piped funnel for putting stuff in the pipe network." id = "plumb_in" build_type = PROTOLATHE - materials = list(MAT_METAL = 400, MAT_GLASS = 400) + materials = list(/datum/material/iron = 400, /datum/material/glass = 400) construction_time = 75 build_path = /obj/machinery/plumbing/input category = list("Misc","Medical Designs") @@ -1089,7 +1089,7 @@ desc = "A big piped funnel for taking stuff out of the pipe network." id = "plumb_out" build_type = PROTOLATHE - materials = list(MAT_METAL = 400, MAT_GLASS = 400) + materials = list(/datum/material/iron = 400, /datum/material/glass = 400) construction_time = 75 build_path = /obj/machinery/plumbing/output category = list("Misc","Medical Designs") @@ -1100,7 +1100,7 @@ desc = "A tank for storing plumbed reagents." id = "plumb_tank" build_type = PROTOLATHE - materials = list(MAT_METAL = 10000, MAT_GLASS = 10000, MAT_PLASTIC = 4000) + materials = list(/datum/material/iron = 10000, /datum/material/glass = 10000, MAT_PLASTIC = 4000) construction_time = 75 build_path = /obj/machinery/plumbing/tank category = list("Misc","Medical Designs") @@ -1111,7 +1111,7 @@ desc = "A RCD for plumbing machines! Cannot make ducts." id = "plumb_rcd" build_type = PROTOLATHE - materials = list(MAT_METAL = 20000, MAT_GLASS = 10000, MAT_PLASTIC = 20000, MAT_PLASMA = 6000, MAT_DIAMOND = 5000, MAT_BLUESPACE = 5000, MAT_GOLD = 5000, MAT_SILVER = 5000) + materials = list(/datum/material/iron = 20000, /datum/material/glass = 10000, /datum/material/plastic = 20000, /datum/material/titanium = 2000, /datum/material/diamond = 800, /datum/material/gold = 2000, /datum/material/silver = 2000) construction_time = 150 build_path = /obj/item/construction/plumbing category = list("Misc","Medical Designs") From 8356dbf20a0defb1f3b9456f50812eeb75b38716 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Tue, 18 Aug 2020 13:26:32 +1000 Subject: [PATCH 40/84] Update medical_designs.dm --- code/modules/research/designs/medical_designs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 8b322cea0d..e177fd0aec 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -1001,7 +1001,7 @@ desc = "Using standard mass-energy dynamic autoconverters, generates reagents from power and puts them in a pipe." id = "plumb_synth" build_type = PROTOLATHE - materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, MAT_PLASTIC = 1000) + materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/plastic = 1000) construction_time = 75 build_path = /obj/machinery/plumbing/synthesizer category = list("Misc","Medical Designs") @@ -1100,7 +1100,7 @@ desc = "A tank for storing plumbed reagents." id = "plumb_tank" build_type = PROTOLATHE - materials = list(/datum/material/iron = 10000, /datum/material/glass = 10000, MAT_PLASTIC = 4000) + materials = list(/datum/material/iron = 10000, /datum/material/glass = 10000, /datum/material/plastic = 4000) construction_time = 75 build_path = /obj/machinery/plumbing/tank category = list("Misc","Medical Designs") From 2d1edc9fa2beea45c93065dd06848329986cf5e9 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Tue, 18 Aug 2020 13:30:49 +1000 Subject: [PATCH 41/84] Update _box_magazine.dm --- .../projectiles/boxes_magazines/_box_magazine.dm | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index d0d846c144..24372ded7e 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -84,13 +84,15 @@ if(istype(A, /obj/item/ammo_box)) var/obj/item/ammo_box/AM = A for(var/obj/item/ammo_casing/AC in AM.stored_ammo) - if(load_delay && do_after(user, load_delay, target = src)) - var/did_load = give_round(AC, replace_spent) - if(did_load) - AM.stored_ammo -= AC - num_loaded++ - if(!did_load || !multiload) - break + if(load_delay) + if(!do_after(user, load_delay, target = src)) + return FALSE + var/did_load = give_round(AC, replace_spent) + if(did_load) + AM.stored_ammo -= AC + num_loaded++ + if(!did_load || !multiload) + break if(istype(A, /obj/item/ammo_casing)) var/obj/item/ammo_casing/AC = A if(give_round(AC, replace_spent)) From 8027706bea95ddebcc9d799b8d5db8d8ea6f50a6 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Tue, 18 Aug 2020 13:45:44 +1000 Subject: [PATCH 42/84] Update _box_magazine.dm --- code/modules/projectiles/boxes_magazines/_box_magazine.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index 24372ded7e..cea40dc27e 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -85,7 +85,8 @@ var/obj/item/ammo_box/AM = A for(var/obj/item/ammo_casing/AC in AM.stored_ammo) if(load_delay) - if(!do_after(user, load_delay, target = src)) + if(do_after(user, load_delay, target = src)) + else return FALSE var/did_load = give_round(AC, replace_spent) if(did_load) From f2a86f2c428f087f5ba1a2c143dc7e265dae8b1f Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Tue, 18 Aug 2020 14:23:09 +1000 Subject: [PATCH 44/84] Update medical_designs.dm --- .../research/designs/medical_designs.dm | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index e177fd0aec..0a9fce2e67 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -969,7 +969,7 @@ id = "acclimator" build_type = PROTOLATHE materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) - construction_time = 75 + construction_time = 15 build_path = /obj/machinery/plumbing/acclimator category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE @@ -980,7 +980,7 @@ id = "disposer" build_type = PROTOLATHE materials = list(/datum/material/iron = 500, /datum/material/glass = 100) - construction_time = 75 + construction_time = 15 build_path = /obj/machinery/plumbing/disposer category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE @@ -991,7 +991,7 @@ id = "plumb_filter" build_type = PROTOLATHE materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) - construction_time = 75 + construction_time = 15 build_path = /obj/machinery/plumbing/filter category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE @@ -1002,7 +1002,7 @@ id = "plumb_synth" build_type = PROTOLATHE materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/plastic = 1000) - construction_time = 75 + construction_time = 15 build_path = /obj/machinery/plumbing/synthesizer category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE @@ -1013,7 +1013,7 @@ id = "plumb_grinder" build_type = PROTOLATHE materials = list(/datum/material/iron = 2000, /datum/material/glass = 1500) - construction_time = 75 + construction_time = 15 build_path = /obj/machinery/plumbing/grinder_chemical category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE @@ -1024,7 +1024,7 @@ id = "reaction_chamber" build_type = PROTOLATHE materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) - construction_time = 75 + construction_time = 15 build_path = /obj/machinery/plumbing/reaction_chamber category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE @@ -1046,7 +1046,7 @@ id = "plumb_splitter" build_type = PROTOLATHE materials = list(/datum/material/iron = 750, /datum/material/glass = 250) - construction_time = 75 + construction_time = 15 build_path = /obj/machinery/plumbing/splitter category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE @@ -1057,7 +1057,7 @@ id = "pill_press" build_type = PROTOLATHE materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) - construction_time = 75 + construction_time = 15 build_path = /obj/machinery/plumbing/pill_press category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE @@ -1068,7 +1068,7 @@ id = "plumb_pump" build_type = PROTOLATHE materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) - construction_time = 75 + construction_time = 15 build_path = /obj/machinery/plumbing/liquid_pump category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE @@ -1079,7 +1079,7 @@ id = "plumb_in" build_type = PROTOLATHE materials = list(/datum/material/iron = 400, /datum/material/glass = 400) - construction_time = 75 + construction_time = 15 build_path = /obj/machinery/plumbing/input category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE @@ -1090,7 +1090,7 @@ id = "plumb_out" build_type = PROTOLATHE materials = list(/datum/material/iron = 400, /datum/material/glass = 400) - construction_time = 75 + construction_time = 15 build_path = /obj/machinery/plumbing/output category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE @@ -1101,7 +1101,7 @@ id = "plumb_tank" build_type = PROTOLATHE materials = list(/datum/material/iron = 10000, /datum/material/glass = 10000, /datum/material/plastic = 4000) - construction_time = 75 + construction_time = 15 build_path = /obj/machinery/plumbing/tank category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE From 6f21b23a87450b83a13677b49ad07758d8b37d35 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 18 Aug 2020 14:28:57 +1000 Subject: [PATCH 45/84] Fixes Shit. --- .../projectiles/boxes_magazines/_box_magazine.dm | 10 +++++++--- code/modules/projectiles/guns/ballistic.dm | 4 ++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index cea40dc27e..c99508cda5 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -76,7 +76,8 @@ return 1 /obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0) - if(INTERACTING_WITH(user, A)) + if(INTERACTING_WITH(user, src) || INTERACTING_WITH(user, A)) + to_chat(user, "You're already doing that!") return FALSE var/num_loaded = 0 if(!can_load(user)) @@ -84,8 +85,11 @@ if(istype(A, /obj/item/ammo_box)) var/obj/item/ammo_box/AM = A for(var/obj/item/ammo_casing/AC in AM.stored_ammo) - if(load_delay) - if(do_after(user, load_delay, target = src)) + if(load_delay || AM.load_delay) + var/loadtime = load_delay + if(AM.load_delay > load_delay) + loadtime = AM.load_delay + if(do_after(user, loadtime, target = src)) else return FALSE var/did_load = give_round(AC, replace_spent) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index fa8099a257..22e53e83f0 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -53,6 +53,10 @@ ..() if (istype(A, /obj/item/ammo_box/magazine)) var/obj/item/ammo_box/magazine/AM = A + if(AM.load_delay) + if(do_after(user, AM.load_delay, target = src)) + else + return FALSE if (!magazine && istype(AM, mag_type)) if(user.transferItemToLoc(AM, src)) magazine = AM From 3040032409ab7c71118bb65fb654a934d4d3edf0 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 18 Aug 2020 15:42:19 +1000 Subject: [PATCH 46/84] documentation updates --- code/datums/ductnet.dm | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/code/datums/ductnet.dm b/code/datums/ductnet.dm index 3ab936f6f4..14a74a67c4 100644 --- a/code/datums/ductnet.dm +++ b/code/datums/ductnet.dm @@ -1,32 +1,34 @@ +///We handle the unity part of plumbing. We track who is connected to who. /datum/ductnet var/list/suppliers = list() var/list/demanders = list() var/list/obj/machinery/duct/ducts = list() var/capacity - +///Add a duct to our network /datum/ductnet/proc/add_duct(obj/machinery/duct/D) if(!D || (D in ducts)) return ducts += D D.duct = src - +///Remove a duct from our network and commit suicide, because this is probably easier than to check who that duct was connected to and what part of us was lost /datum/ductnet/proc/remove_duct(obj/machinery/duct/ducting) destroy_network(FALSE) - for(var/A in ducting.neighbours) - var/obj/machinery/duct/D = A - D.attempt_connect() //we destroyed the network, so now we tell the disconnected ducts neighbours they can start making a new ductnet + for(var/obj/machinery/duct/D in ducting.neighbours) + addtimer(CALLBACK(D, /obj/machinery/duct/proc/reconnect), 0) //all needs to happen after the original duct that was destroyed finishes destroying itself + addtimer(CALLBACK(D, /obj/machinery/duct/proc/generate_connects), 0) qdel(src) - +///add a plumbing object to either demanders or suppliers /datum/ductnet/proc/add_plumber(datum/component/plumbing/P, dir) if(!P.can_add(src, dir)) - return + return FALSE P.ducts[num2text(dir)] = src if(dir & P.supply_connects) suppliers += P else if(dir & P.demand_connects) demanders += P - + return TRUE +///remove a plumber. we dont delete ourselves because ductnets dont persist through plumbing objects /datum/ductnet/proc/remove_plumber(datum/component/plumbing/P) suppliers.Remove(P) //we're probably only in one of these, but Remove() is inherently sane so this is fine demanders.Remove(P) @@ -34,7 +36,9 @@ for(var/dir in P.ducts) if(P.ducts[dir] == src) P.ducts -= dir - + if(!ducts.len) //there were no ducts, so it was a direct connection. we destroy ourselves since a ductnet with only one plumber and no ducts is worthless + destroy_network() +///we combine ductnets. this occurs when someone connects to seperate sets of fluid ducts /datum/ductnet/proc/assimilate(datum/ductnet/D) ducts.Add(D.ducts) suppliers.Add(D.suppliers) @@ -48,8 +52,9 @@ for(var/A in D.ducts) var/obj/machinery/duct/M = A M.duct = src //forget your old master - qdel(D) + destroy_network() +///destroy the network and tell all our ducts and plumbers we are gone /datum/ductnet/proc/destroy_network(delete=TRUE) for(var/A in suppliers + demanders) remove_plumber(A) From 325f4eb72e6aa5e20d1b3ae42715ef5996bf8a77 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 18 Aug 2020 15:43:44 +1000 Subject: [PATCH 47/84] Updates 2 --- code/modules/plumbing/ducts.dm | 138 ++++++++++++++++++++++++--------- 1 file changed, 101 insertions(+), 37 deletions(-) diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm index 6cc09c7d15..cb94f281db 100644 --- a/code/modules/plumbing/ducts.dm +++ b/code/modules/plumbing/ducts.dm @@ -7,10 +7,10 @@ All the important duct code: name = "fluid duct" icon = 'icons/obj/plumbing/fluid_ducts.dmi' icon_state = "nduct" - level = 1 + ///bitfield with the directions we're connected in var/connects - ///set to TRUE to disable smart cable behaviour + ///set to TRUE to disable smart duct behaviour var/dumb = FALSE ///wheter we allow our connects to be changed after initialization or not var/lock_connects = FALSE @@ -36,13 +36,16 @@ All the important duct code: ///wheter we just unanchored or drop whatever is in the variable. either is safe var/drop_on_wrench = /obj/item/stack/ducts -/obj/machinery/duct/Initialize(mapload, no_anchor, color_of_duct, layer_of_duct = DUCT_LAYER_DEFAULT, force_connects) +/obj/machinery/duct/Initialize(mapload, no_anchor, color_of_duct = "#ffffff", layer_of_duct = DUCT_LAYER_DEFAULT, force_connects) . = ..() + if(no_anchor) active = FALSE - anchored = FALSE + set_anchored(FALSE) else if(!can_anchor()) qdel(src) + CRASH("Overlapping ducts detected") + if(force_connects) connects = force_connects //skip change_connects() because we're still initializing and we need to set our connects at one point if(!lock_layers) @@ -51,17 +54,22 @@ All the important duct code: duct_color = color_of_duct if(duct_color) add_atom_colour(duct_color, FIXED_COLOUR_PRIORITY) + handle_layer() + for(var/obj/machinery/duct/D in loc) if(D == src) continue if(D.duct_layer & duct_layer) disconnect_duct() + if(active) attempt_connect() + + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) + ///start looking around us for stuff to connect to /obj/machinery/duct/proc/attempt_connect() - reset_connects() //All connects are gathered here again eitherway, we might aswell reset it so they properly update when reconnecting for(var/atom/movable/AM in loc) var/datum/component/plumbing/P = AM.GetComponent(/datum/component/plumbing) @@ -75,6 +83,7 @@ All the important duct code: if(connect_network(AM, D)) add_connects(D) update_icon() + ///see if whatever we found can be connected to /obj/machinery/duct/proc/connect_network(atom/movable/AM, direction, ignore_color) if(istype(AM, /obj/machinery/duct)) @@ -84,6 +93,7 @@ All the important duct code: if(!plumber) return return connect_plumber(plumber, direction) + ///connect to a duct /obj/machinery/duct/proc/connect_duct(obj/machinery/duct/D, direction, ignore_color) var/opposite_dir = turn(direction, 180) @@ -92,11 +102,11 @@ All the important duct code: if(!dumb && D.dumb && !(opposite_dir & D.connects)) return - if(dumb && D.dumb && !(connects & D.connects)) //we eliminated a few more scenario in attempt connect + if(dumb && D.dumb && !(connects & D.connects)) //we eliminated a few more scenarios in attempt connect return if((duct == D.duct) && duct)//check if we're not just comparing two null values - add_neighbour(D) + add_neighbour(D, direction) D.add_connects(opposite_dir) D.update_icon() @@ -118,9 +128,12 @@ All the important duct code: else create_duct() duct.add_duct(D) - add_neighbour(D) - D.attempt_connect()//tell our buddy its time to pass on the torch of connecting to pipes. This shouldn't ever infinitely loop since it only works on pipes that havent been inductrinated + add_neighbour(D, direction) + //tell our buddy its time to pass on the torch of connecting to pipes. This shouldn't ever infinitely loop since it only works on pipes that havent been inductrinated + D.attempt_connect() + return TRUE + ///connect to a plumbing object /obj/machinery/duct/proc/connect_plumber(datum/component/plumbing/P, direction) var/opposite_dir = turn(direction, 180) @@ -134,11 +147,14 @@ All the important duct code: if(opposite_dir & comp_directions) if(!duct) create_duct() - duct.add_plumber(P, opposite_dir) - return TRUE + if(duct.add_plumber(P, opposite_dir)) + neighbours[P.parent] = direction + return TRUE + ///we disconnect ourself from our neighbours. we also destroy our ductnet and tell our neighbours to make a new one -/obj/machinery/duct/proc/disconnect_duct() - anchored = FALSE +/obj/machinery/duct/proc/disconnect_duct(skipanchor) + if(!skipanchor) //since set_anchored calls us too. + set_anchored(FALSE) active = FALSE if(duct) duct.remove_duct(src) @@ -149,30 +165,72 @@ All the important duct code: new drop_on_wrench(drop_location()) qdel(src) +///''''''''''''''''optimized''''''''''''''''' proc for quickly reconnecting after a duct net was destroyed +/obj/machinery/duct/proc/reconnect() + if(neighbours.len && !duct) + create_duct() + for(var/atom/movable/AM in neighbours) + if(istype(AM, /obj/machinery/duct)) + var/obj/machinery/duct/D = AM + if(D.duct) + if(D.duct == duct) //we're already connected + continue + else + duct.assimilate(D.duct) + continue + else + duct.add_duct(D) + D.reconnect() + else + var/datum/component/plumbing/P = AM.GetComponent(/datum/component/plumbing) + if(AM in get_step(src, neighbours[AM])) //did we move? + if(P) + connect_plumber(P, neighbours[AM]) + else + neighbours -= AM //we moved + +///Special proc to draw a new connect frame based on neighbours. not the norm so we can support multiple duct kinds +/obj/machinery/duct/proc/generate_connects() + if(lock_connects) + return + connects = 0 + for(var/A in neighbours) + connects |= neighbours[A] + update_icon() + ///create a new duct datum /obj/machinery/duct/proc/create_duct() duct = new() duct.add_duct(src) + ///add a duct as neighbour. this means we're connected and will connect again if we ever regenerate -/obj/machinery/duct/proc/add_neighbour(obj/machinery/duct/D) +/obj/machinery/duct/proc/add_neighbour(obj/machinery/duct/D, direction) if(!(D in neighbours)) - neighbours += D + neighbours[D] = direction if(!(src in D.neighbours)) - D.neighbours += src + D.neighbours[src] = turn(direction, 180) + ///remove all our neighbours, and remove us from our neighbours aswell /obj/machinery/duct/proc/lose_neighbours() - for(var/A in neighbours) - var/obj/machinery/duct/D = A + for(var/obj/machinery/duct/D in neighbours) D.neighbours.Remove(src) neighbours = list() + ///add a connect direction /obj/machinery/duct/proc/add_connects(new_connects) //make this a define to cut proc calls? if(!lock_connects) connects |= new_connects + +///remove a connect direction +/obj/machinery/duct/proc/remove_connects(dead_connects) + if(!lock_connects) + connects &= ~dead_connects + ///remove our connects /obj/machinery/duct/proc/reset_connects() if(!lock_connects) connects = 0 + ///get a list of the ducts we can connect to if we are dumb /obj/machinery/duct/proc/get_adjacent_ducts() var/list/adjacents = list() @@ -183,7 +241,7 @@ All the important duct code: adjacents += D return adjacents -/obj/machinery/duct/update_icon() //setting connects isnt a parameter because sometimes we make more than one change, overwrite it completely or just add it to the bitfield +/obj/machinery/duct/update_icon_state() var/temp_icon = initial(icon_state) for(var/D in GLOB.cardinals) if(D & connects) @@ -196,6 +254,7 @@ All the important duct code: if(D == WEST) temp_icon += "_w" icon_state = temp_icon + ///update the layer we are on /obj/machinery/duct/proc/handle_layer() var/offset @@ -214,31 +273,33 @@ All the important duct code: pixel_y = offset +/obj/machinery/duct/set_anchored(anchorvalue) + . = ..() + if(isnull(.)) + return + if(anchorvalue) + active = TRUE + attempt_connect() + else + disconnect_duct(TRUE) + /obj/machinery/duct/wrench_act(mob/living/user, obj/item/I) //I can also be the RPD ..() add_fingerprint(user) I.play_tool_sound(src) - if(anchored) + if(anchored || can_anchor()) + set_anchored(!anchored) user.visible_message( \ - "[user] unfastens \the [src].", \ - "You unfasten \the [src].", \ + "[user] [anchored ? null : "un"]fastens \the [src].", \ + "You [anchored ? null : "un"]fasten \the [src].", \ "You hear ratcheting.") - disconnect_duct() - else if(can_anchor()) - anchored = TRUE - active = TRUE - user.visible_message( \ - "[user] fastens \the [src].", \ - "You fasten \the [src].", \ - "You hear ratcheting.") - attempt_connect() return TRUE -///collection of all the sanity checks to prevent us from stacking ducts that shouldnt be stacked +///collection of all the sanity checks to prevent us from stacking ducts that shouldn't be stacked /obj/machinery/duct/proc/can_anchor(turf/T) if(!T) T = get_turf(src) for(var/obj/machinery/duct/D in T) - if(!anchored) + if(!anchored || D == src) continue for(var/A in GLOB.cardinals) if(A & connects && A & D.connects) @@ -271,9 +332,10 @@ All the important duct code: return add_connects(direction) //the connect of the other duct is handled in connect_network, but do this here for the parent duct because it's not necessary in normal cases - add_neighbour(D) + add_neighbour(D, direction) connect_network(D, direction, TRUE) update_icon() + ///has a total of 5 layers and doesnt give a shit about color. its also dumb so doesnt autoconnect. /obj/machinery/duct/multilayered name = "duct layer-manifold" @@ -298,8 +360,9 @@ All the important duct code: . = ..() update_connects() -/obj/machinery/duct/multilayered/update_icon() - return +/obj/machinery/duct/multilayered/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_blocker) /obj/machinery/duct/multilayered/wrench_act(mob/living/user, obj/item/I) . = ..() @@ -311,7 +374,7 @@ All the important duct code: else connects = EAST | WEST -///don't connect to other multilayered stuff because honestly it shouldnt be done and I dont wanna deal with it +///don't connect to other multilayered stuff because honestly it shouldn't be done and I dont wanna deal with it /obj/machinery/duct/multilayered/connect_duct(obj/machinery/duct/D, direction, ignore_color) if(istype(D, /obj/machinery/duct/multilayered)) return @@ -326,6 +389,7 @@ All the important duct code: singular_name = "duct" icon = 'icons/obj/plumbing/fluid_ducts.dmi' icon_state = "ducts" + custom_materials = list(/datum/material/iron=500) w_class = WEIGHT_CLASS_TINY novariants = FALSE max_amount = 50 From d8e286d7bef5b7da6a6c5d9b81836fb461703cbe Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 18 Aug 2020 16:17:00 +1000 Subject: [PATCH 48/84] ee --- code/game/atoms_movable.dm | 7 +++++++ code/modules/plumbing/ducts.dm | 1 - 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0238529195..0a6c2b9eca 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -646,3 +646,10 @@ animate(I, alpha = 175, pixel_x = to_x, pixel_y = to_y, time = 3, transform = M, easing = CUBIC_EASING) sleep(1) animate(I, alpha = 0, transform = matrix(), time = 1) + +/atom/movable/proc/set_anchored(anchorvalue) //literally only for plumbing ran + SHOULD_CALL_PARENT(TRUE) + if(anchored == anchorvalue) + return + . = anchored + anchored = anchorvalue diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm index cb94f281db..8a27f2669c 100644 --- a/code/modules/plumbing/ducts.dm +++ b/code/modules/plumbing/ducts.dm @@ -66,7 +66,6 @@ All the important duct code: if(active) attempt_connect() - AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) ///start looking around us for stuff to connect to /obj/machinery/duct/proc/attempt_connect() From 13609ba6e69f6d6ab002ed127727ec806b310da1 Mon Sep 17 00:00:00 2001 From: tiramisuapimancer <32314478+tiramisuapimancer@users.noreply.github.com> Date: Mon, 17 Aug 2020 23:01:01 -0800 Subject: [PATCH 49/84] Update ethereal.dm --- code/modules/mob/living/carbon/human/species_types/ethereal.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index cda6faded0..cd9b3b80c7 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -27,7 +27,7 @@ // Cold temperatures hurt faster as it is harder to move with out the heat energy bodytemp_cold_damage_limit = (T20C - 10) // about 10c */ - hair_color = "fixedmutcolor" + hair_color = "mutcolor" hair_alpha = 140 var/current_color var/EMPeffect = FALSE From 9931cb006c0815b679141db223498d28ddd122b5 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 18 Aug 2020 17:33:20 +1000 Subject: [PATCH 50/84] eee --- code/datums/components/plumbing/filter.dm | 4 ++-- .../components/plumbing/reaction_chamber.dm | 17 ++++++----------- code/modules/plumbing/plumbers/filter.dm | 11 +---------- .../plumbing/plumbers/reaction_chamber.dm | 2 +- 4 files changed, 10 insertions(+), 24 deletions(-) diff --git a/code/datums/components/plumbing/filter.dm b/code/datums/components/plumbing/filter.dm index 55647a353b..76b76323c5 100644 --- a/code/datums/components/plumbing/filter.dm +++ b/code/datums/components/plumbing/filter.dm @@ -35,12 +35,12 @@ else for(var/A in reagents.reagent_list) var/datum/reagent/R = A - if(!can_give_in_direction(direction, R)) + if(!can_give_in_direction(direction, R.type)) continue var/new_amount if(R.volume < amount) new_amount = amount - R.volume - reagents.trans_id_to(target.parent, R, amount) + reagents.trans_id_to(target.parent, R.type, amount) amount = new_amount if(amount <= 0) break diff --git a/code/datums/components/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm index 705611ed1a..3345eb0e76 100644 --- a/code/datums/components/plumbing/reaction_chamber.dm +++ b/code/datums/components/plumbing/reaction_chamber.dm @@ -7,7 +7,7 @@ if(!istype(parent, /obj/machinery/plumbing/reaction_chamber)) return COMPONENT_INCOMPATIBLE -/datum/component/plumbing/reaction_chamber/can_give(amount, reagent) +/datum/component/plumbing/reaction_chamber/can_give(amount, reagent, datum/ductnet/net) . = ..() var/obj/machinery/plumbing/reaction_chamber/RC = parent if(!. || !RC.emptying) @@ -21,7 +21,7 @@ var/has_reagent = FALSE for(var/A in reagents.reagent_list) var/datum/reagent/RD = A - if(RT == RD) + if(RT == RD.type) has_reagent = TRUE if(RD.volume < RC.required_reagents[RT]) process_request(min(RC.required_reagents[RT] - RD.volume, MACHINE_REAGENT_TRANSFER) , RT, dir) @@ -30,14 +30,9 @@ process_request(min(RC.required_reagents[RT], MACHINE_REAGENT_TRANSFER), RT, dir) return - RC.reagent_flags &= ~NO_REACT + reagents.flags &= ~NO_REACT reagents.handle_reactions() - if(reagents.fermiIsReacting) - return - RC.emptying = TRUE -/datum/component/plumbing/reaction_chamber/can_give(amount, reagent, datum/ductnet/net) - . = ..() - var/obj/machinery/plumbing/reaction_chamber/RC = parent - if(!. || !RC.emptying) - return FALSE + RC.emptying = TRUE //If we move this up, it'll instantly get turned off since any reaction always sets the reagent_total to zero. Other option is make the reaction update + //everything for every chemical removed, wich isn't a good option either. + RC.on_reagent_change() //We need to check it now, because some reactions leave nothing left. diff --git a/code/modules/plumbing/plumbers/filter.dm b/code/modules/plumbing/plumbers/filter.dm index b748c576e7..1ffd170507 100644 --- a/code/modules/plumbing/plumbers/filter.dm +++ b/code/modules/plumbing/plumbers/filter.dm @@ -4,6 +4,7 @@ desc = "A chemical filter for filtering chemicals. The left and right outputs appear to be from the perspective of the input port." icon_state = "filter" density = FALSE + ///whitelist of chems id's that go to the left side. Empty to disable port var/list/left = list() ///whitelist of chem id's that go to the right side. Empty to disable port @@ -12,21 +13,11 @@ var/list/english_left = list() ///whitelist of chems but their name instead of path var/list/english_right = list() - ui_x = 320 - ui_y = 310 - /obj/machinery/plumbing/filter/Initialize(mapload, bolt) . = ..() AddComponent(/datum/component/plumbing/filter, bolt) -/obj/machinery/plumbing/filter/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - - if(!ui) - ui = new(user, src, ui_key, "chemical_filter", name, ui_x, ui_y, master_ui, state) - ui.open() - /obj/machinery/plumbing/filter/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) diff --git a/code/modules/plumbing/plumbers/reaction_chamber.dm b/code/modules/plumbing/plumbers/reaction_chamber.dm index 33fc5c8f0c..949543c300 100644 --- a/code/modules/plumbing/plumbers/reaction_chamber.dm +++ b/code/modules/plumbing/plumbers/reaction_chamber.dm @@ -3,9 +3,9 @@ name = "reaction chamber" desc = "Keeps chemicals seperated until given conditions are met." icon_state = "reaction_chamber" - buffer = 200 reagent_flags = TRANSPARENT | NO_REACT + /**list of set reagents that the reaction_chamber allows in, and must all be present before mixing is enabled. * example: list(/datum/reagent/water = 20, /datum/reagent/fuel/oil = 50) */ From 4e235590659c1908c5da8b63828a69b59d1556b4 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Tue, 18 Aug 2020 18:15:24 +1000 Subject: [PATCH 51/84] Update sheet_types.dm --- code/game/objects/items/stacks/sheets/sheet_types.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 9cbd8b3c92..eac57eb767 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -844,7 +844,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra merge_type = /obj/item/stack/sheet/cotton var/pull_effort = 30 var/loom_result = /obj/item/stack/sheet/cloth - grind_results = list(/datum/reagent/cellulose = 1) + grind_results = list(/datum/reagent/cellulose = 5) /obj/item/stack/sheet/cotton/ten amount = 10 @@ -860,7 +860,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra merge_type = /obj/item/stack/sheet/cotton/durathread pull_effort = 70 loom_result = /obj/item/stack/sheet/durathread - grind_results = list(/datum/reagent/cellulose = 4) + grind_results = list(/datum/reagent/cellulose = 10) /obj/item/stack/sheet/meat name = "meat sheets" From b466a5aae94c70ae8689d43ad22379141d28b460 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 18 Aug 2020 18:57:23 +1000 Subject: [PATCH 52/84] e --- code/datums/components/plumbing/reaction_chamber.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm index 3345eb0e76..029f1fde86 100644 --- a/code/datums/components/plumbing/reaction_chamber.dm +++ b/code/datums/components/plumbing/reaction_chamber.dm @@ -30,7 +30,7 @@ process_request(min(RC.required_reagents[RT], MACHINE_REAGENT_TRANSFER), RT, dir) return - reagents.flags &= ~NO_REACT + reagent_flags &= ~NO_REACT reagents.handle_reactions() RC.emptying = TRUE //If we move this up, it'll instantly get turned off since any reaction always sets the reagent_total to zero. Other option is make the reaction update From 7390effcb96e89049f6c19e4307129ac5f7c86c0 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 18 Aug 2020 19:09:01 +1000 Subject: [PATCH 53/84] e --- code/datums/components/plumbing/reaction_chamber.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm index 029f1fde86..90f4e621da 100644 --- a/code/datums/components/plumbing/reaction_chamber.dm +++ b/code/datums/components/plumbing/reaction_chamber.dm @@ -30,7 +30,7 @@ process_request(min(RC.required_reagents[RT], MACHINE_REAGENT_TRANSFER), RT, dir) return - reagent_flags &= ~NO_REACT + RC.reagent_flags &= ~NO_REACT reagents.handle_reactions() RC.emptying = TRUE //If we move this up, it'll instantly get turned off since any reaction always sets the reagent_total to zero. Other option is make the reaction update From e00c383b1a6bd46af34698020831559d1e3ff2b8 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 18 Aug 2020 20:19:54 +1000 Subject: [PATCH 54/84] Update belt.dm --- code/game/objects/items/storage/belt.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 3c554aa58e..0001494fdd 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -478,7 +478,7 @@ /obj/item/assembly/signaler, /obj/item/lightreplacer, /obj/item/rcd_ammo, - /obj/item/construction/rcd, + /obj/item/construction, /obj/item/pipe_dispenser, /obj/item/stack/rods, /obj/item/stack/tile/plasteel, @@ -492,7 +492,7 @@ icon_state = "grenadebeltnew" item_state = "security" rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE - + /obj/item/storage/belt/grenade/ComponentInitialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) From b50ccb980c37508ed04240b1ade8d61d7104dc8a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 19 Aug 2020 00:13:00 +0000 Subject: [PATCH 55/84] Automatic changelog compile [ci skip] --- html/changelog.html | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 56bb7500b4..43bac219ab 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1434,17 +1434,6 @@
  • medbots can now be tipped over
  • added more medbot sounds
  • - -

    17 June 2020

    -

    SmArtKar updated:

    -
      -
    • New ID icons
    • -
    • Sutures and Meshes
    • -
    -

    Trilbyspaceclone updated:

    -
      -
    • Gin export takes gin now
    • -
    GoonStation 13 Development Team From ce80f64d2740a6a7adf7646438181a7b6cbdf528 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 18 Aug 2020 18:52:06 -0700 Subject: [PATCH 56/84] Update suppression.dm --- code/modules/research/nanites/nanite_programs/suppression.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/nanites/nanite_programs/suppression.dm b/code/modules/research/nanites/nanite_programs/suppression.dm index 3b0d6d0d06..d2aa243fee 100644 --- a/code/modules/research/nanites/nanite_programs/suppression.dm +++ b/code/modules/research/nanites/nanite_programs/suppression.dm @@ -176,7 +176,7 @@ sent_message = message_setting.get_value() if(host_mob.stat == DEAD) return - to_chat(host_mob, "You hear a strange, robotic voice in your head... \"[sent_message]\"") + to_chat(host_mob, "You hear a strange, robotic voice in your head... \"[html_encode(sent_message)]\"") /datum/nanite_program/comm/hallucination name = "Hallucination" From ecff6bc36a451a5e87183379372eff27fb339dee Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 18 Aug 2020 20:53:24 -0500 Subject: [PATCH 57/84] Automatic changelog generation for PR #13194 [ci skip] --- html/changelogs/AutoChangeLog-pr-13194.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13194.yml diff --git a/html/changelogs/AutoChangeLog-pr-13194.yml b/html/changelogs/AutoChangeLog-pr-13194.yml new file mode 100644 index 0000000000..8769abd6d5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13194.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - tweak: "Changed the clockie help-link to lead to our own wiki." From 6eac8800b62958a9dc85909976490b888d0e883c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 18 Aug 2020 20:53:42 -0500 Subject: [PATCH 58/84] Automatic changelog generation for PR #13202 [ci skip] --- html/changelogs/AutoChangeLog-pr-13202.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13202.yml diff --git a/html/changelogs/AutoChangeLog-pr-13202.yml b/html/changelogs/AutoChangeLog-pr-13202.yml new file mode 100644 index 0000000000..8713ea2bd9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13202.yml @@ -0,0 +1,4 @@ +author: "tiramisuapimancer" +delete-after: True +changes: + - bugfix: "Ethereal hair is now their body color instead of accidentally white" From b59d449a75c01e128bdbc3c3b974224168673bb7 Mon Sep 17 00:00:00 2001 From: Letter N <24603524+LetterN@users.noreply.github.com> Date: Wed, 19 Aug 2020 09:59:41 +0800 Subject: [PATCH 59/84] Update adminhelp.dm --- code/modules/admin/verbs/adminhelp.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index b93c8dabf1..edf95dc47e 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -254,6 +254,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) //message from the initiator without a target, all admins will see this //won't bug irc /datum/admin_help/proc/MessageNoRecipient(msg) + msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN)) var/ref_src = "[REF(src)]" //Message to be sent to all admins var/admin_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [keywords_lookup(msg)]" From a7a964154e324169003f639233617acf9d4d6713 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Wed, 19 Aug 2020 12:02:34 +1000 Subject: [PATCH 60/84] Update code/modules/projectiles/boxes_magazines/_box_magazine.dm Co-authored-by: silicons <2003111+silicons@users.noreply.github.com> --- code/modules/projectiles/boxes_magazines/_box_magazine.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index c99508cda5..2406b09c45 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -89,8 +89,7 @@ var/loadtime = load_delay if(AM.load_delay > load_delay) loadtime = AM.load_delay - if(do_after(user, loadtime, target = src)) - else + if(!do_after(user, loadtime, target = src)) return FALSE var/did_load = give_round(AC, replace_spent) if(did_load) From 09bba250508cc219796032fba5b50afa38e4eade Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Wed, 19 Aug 2020 12:02:45 +1000 Subject: [PATCH 61/84] Update code/modules/projectiles/boxes_magazines/_box_magazine.dm Co-authored-by: silicons <2003111+silicons@users.noreply.github.com> --- code/modules/projectiles/boxes_magazines/_box_magazine.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index 2406b09c45..78ca6e9280 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -86,9 +86,7 @@ var/obj/item/ammo_box/AM = A for(var/obj/item/ammo_casing/AC in AM.stored_ammo) if(load_delay || AM.load_delay) - var/loadtime = load_delay - if(AM.load_delay > load_delay) - loadtime = AM.load_delay + var/loadtime = max(AM.load_delay, load_delay) if(!do_after(user, loadtime, target = src)) return FALSE var/did_load = give_round(AC, replace_spent) From 5306da79389920e0d0b95be2e8675489da7fc465 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Wed, 19 Aug 2020 12:02:53 +1000 Subject: [PATCH 62/84] Update code/modules/projectiles/guns/ballistic.dm Co-authored-by: silicons <2003111+silicons@users.noreply.github.com> --- code/modules/projectiles/guns/ballistic.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 22e53e83f0..1aefa51a51 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -53,10 +53,8 @@ ..() if (istype(A, /obj/item/ammo_box/magazine)) var/obj/item/ammo_box/magazine/AM = A - if(AM.load_delay) - if(do_after(user, AM.load_delay, target = src)) - else - return FALSE + if(AM.load_delay && !do_after(user, AM.load_delay, target = src)) + return FALSE if (!magazine && istype(AM, mag_type)) if(user.transferItemToLoc(AM, src)) magazine = AM From fa7b82694da239839c1e88fb5d414d3e9256ed0d Mon Sep 17 00:00:00 2001 From: Letter N <24603524+LetterN@users.noreply.github.com> Date: Wed, 19 Aug 2020 10:04:56 +0800 Subject: [PATCH 63/84] src.islazy = TRUE --- code/modules/admin/verbs/adminpm.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 68b9a8e341..b7f05740a3 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -55,7 +55,7 @@ if(AH) message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.") - var/msg = stripped_multiline_input(src,"Message:", "Private message to [key_name(C, 0, 0)]") + var/msg = input(src,"Message:", "Private message to [C.holder?.fakekey ? "an Administrator" : key_name(C, 0, 0)].") as message|null if (!msg) message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.") return @@ -90,7 +90,7 @@ if(!ircreplyamount) //to prevent people from spamming irc/discord return if(!msg) - msg = stripped_multiline_input(src,"Message:", "Private message to Administrator") + msg = input(src,"Message:", "Private message to Administrator") as message|null if(!msg) return @@ -112,7 +112,7 @@ //get message text, limit it's length.and clean/escape html if(!msg) - msg = stripped_multiline_input(src,"Message:", "Private message to [key_name(recipient, 0, 0)]") + msg = input(src,"Message:", "Private message to [recipient.holder?.fakekey ? "an Administrator" : key_name(recipient, 0, 0)].") as message|null msg = trim(msg) if(!msg) return @@ -133,7 +133,7 @@ //clean the message if it's not sent by a high-rank admin if(!check_rights(R_SERVER|R_DEBUG,0)||irc)//no sending html to the poor bots - msg = trim(sanitize(msg), MAX_MESSAGE_LEN) + msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN)) if(!msg) return @@ -188,10 +188,10 @@ //AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn if(CONFIG_GET(flag/popup_admin_pm)) - spawn() //so we don't hold the caller proc up + spawn() //so we don't hold the caller proc up. Please functionalize this var/sender = src var/sendername = key - var/reply = stripped_multiline_input(recipient, msg,"Admin PM from-[sendername]", "") //show message and await a reply + var/reply = input(recipient, msg,"Admin PM from-[sendername]", "") as message|null //show message and await a reply if(recipient && reply) if(sender) recipient.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them From 428d95b8930ce70057d1538acf80636a674773e4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 18 Aug 2020 21:16:35 -0500 Subject: [PATCH 64/84] Automatic changelog generation for PR #13207 [ci skip] --- html/changelogs/AutoChangeLog-pr-13207.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13207.yml diff --git a/html/changelogs/AutoChangeLog-pr-13207.yml b/html/changelogs/AutoChangeLog-pr-13207.yml new file mode 100644 index 0000000000..9f354f34bb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13207.yml @@ -0,0 +1,4 @@ +author: "Fikou" +delete-after: True +changes: + - admin: "admins can now do html in ahelps properly" From b40a42209d0be37f129c467ca6f888dc239e00c8 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 19 Aug 2020 03:19:51 +0100 Subject: [PATCH 65/84] fixes two snout paths --- code/modules/mob/dead/new_player/sprite_accessories/snouts.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm index 2e14a88f29..7319652ebe 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm @@ -192,13 +192,13 @@ extra = TRUE extra_color_src = MUTCOLORS3 -/datum/sprite_accessory/mam_snouts/skulldog +/datum/sprite_accessory/snouts/mam_snouts/skulldog name = "Skulldog" icon_state = "skulldog" extra = TRUE extra_color_src = MATRIXED -/datum/sprite_accessory/mam_snouts/lcanid +/datum/sprite_accessory/snouts/mam_snouts/lcanid name = "Mammal, Long" icon_state = "lcanid" From 0c4a3c740d95284af51bbf1ce9d8fd23ef54d3e1 Mon Sep 17 00:00:00 2001 From: Hatterhat Date: Tue, 18 Aug 2020 21:50:57 -0500 Subject: [PATCH 66/84] >metabreaks >2020 --- code/modules/events/pirates.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index af44b54ed0..9ab5e8d517 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -25,7 +25,7 @@ ship_name = pick(strings(PIRATE_NAMES_FILE, "ship_names")) /datum/round_event/pirates/announce(fake) - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak + priority_announce("A business proposition has been downloaded and printed out at all communication consoles.", "Incoming Business Proposition", "commandreport") if(fake) return threat_message = new @@ -49,6 +49,7 @@ else priority_announce("Trying to cheat us? You'll regret this!",sender_override = ship_name) if(!shuttle_spawned) + priority_announce("You won't listen to reason? Then we'll take what's yours or die trying!",sender_override = ship_name) spawn_shuttle() /datum/round_event/pirates/start() @@ -83,8 +84,7 @@ announce_to_ghosts(M) else announce_to_ghosts(spawner) - - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") //CITADEL EDIT also metabreak here too + priority_announce("Unidentified ship detected near the station.") //Shuttle equipment From 8de7717b522903719a82246ddcf51df091734927 Mon Sep 17 00:00:00 2001 From: Letter N <24603524+LetterN@users.noreply.github.com> Date: Wed, 19 Aug 2020 11:01:38 +0800 Subject: [PATCH 67/84] wounds moment --- strings/tips.txt | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/strings/tips.txt b/strings/tips.txt index a1d2befab3..5dc4e1b985 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -25,7 +25,7 @@ As the Captain, you have absolute access and control over the station, but this As the Captain, you have a fancy pen that can be used as a holdout dagger or even as a scalpel in surgery! As the Captain, you can purchase a new emergency shuttle using a communications console. Some require credits, while others give you credits in exchange. Keep in mind that purchasing dangerous shuttles will incur the ire of your crew. As the Chief Medical Officer, your hypospray is like the ones that your Medical Doctors can buy, except it comes in a fancy box that can hold several more hypovials than the standard, and already comes preloaded with specially-made high-capacity hypovials that hold double the reagents the standard ones do. -As the Chief Medical Officer, coordinate and communicate with your doctors, chemists, and geneticists during a nuclear emergency, blob infestation, or some other crisis to keep people alive and fighting. +As the Chief Medical Officer, coordinate and communicate with your doctors, chemists, and paramedics during a nuclear emergency, blob infestation, or some other crisis to keep people alive and fighting. As a Medical Doctor, pester Research for improved surgical tools. They work faster, combine the purposes of several tools in one (scalpel/saw, retractor/hemostat, drill/cautery), and don't cost many materials to boot! As a Medical Doctor, the surgical saw and drill are both powerful weapons, the saw is sharp and can slice and dice, while the drill can quickly blind someone if aimed for the eyes. The laser scalpel is an upgraded version producible with Research's aid, and it has the highest force of most common place weapons, while still remaining sharp. As a Medical Doctor, your belt can hold a full set of surgical tools. Using sterilizine before each attempt during surgery will reduce your failure chance on tricky steps or when using less-than-optimal equipment. @@ -34,11 +34,14 @@ As a Medical Doctor, while both heal toxin damage, the difference between charco As a Medical Doctor, you can surgically implant or extract things from people's chests by performing a cavity implant. This could range from inserting a suicide bomb to embedding the nuke disk into the Captain's chest. As a Medical Doctor, it's of utmost urgency that you tend to anyone who's been hugged by a facehugger. You only have a couple of minutes from the initial attachment to perform organ manipulation to their chest and remove the rapidly developing alien embryo before it bursts out and immediately kills your patient. As a Medical Doctor, you must target the correct limb and be on help intent when trying to perform surgery on someone. Using disarm attempt will intentionally fail the surgery step. -As a Medical Doctor, corpses with the "...and their soul has departed" description no longer have a ghost attached to them and aren't usually revivable or cloneable. However it may prove useful to be creative in your revivification techniques with these bodies. +As a Medical Doctor, corpses with the "...and their soul has departed" description no longer have a ghost attached to them and can't be revived. However it may prove useful to be creative in your revivification techniques with these bodies. As a Medical Doctor, treating plasmamen is not impossible! Salbutamol and epinephrine stops them from suffocating due to lack of internals and showers stop them from burning alive. You can even perform surgery on them by doing the procedure on a roller bed under a shower. As a Medical Doctor, you can point your penlight at people to create a medical hologram. This lets them know that you're coming to treat them. As a Medical Doctor, you can extract implants by holding an empty implant case in your offhand while performing the extraction step. As a Medical Doctor, clone scanning people will implant them with a health tracker that displays their vitals in the clone records. Useful to check on crew members that didn't activate suit sensors! +As a Medical Doctor, you can deal with patients who have absurd amounts of wounds by putting them in cryo. This will slowly treat all of their wounds simultaneously, but is much slower than direct treatment. +As a Medical Doctor, Critical Slash wounds are one of the most dangerous conditions someone can have. Apply gauze, epipens, sutures, cauteries, whatever you can, as soon as possible! +As a Medical Doctor, Saline-Glucose not only acts as a temporary boost to a patient's blood level, it also speeds regeneration! Perfect for drained patients! As a Medical Doctor, medical gauze is an incredibly underrated tool. It can be used to entirely halt a limb from bleeding or sling one that's been shattered until it can be given proper attention. This even works on the dead, too! Be sure to stop someone's bleeding whether they're in critical condition or a corpse, as dragging someone whom is bleeding will rapidly deplete them of all their blood. As a Chemist, there are dozens of chemicals that can heal, and even more that can cause harm. See which chemicals have the best synergy, both in healing, and in harming. Experiment! As a Chemist, some chemicals can only be synthesized by heating up the contents in the chemical heater. @@ -135,10 +138,10 @@ As a Security Officer, examining someone while wearing your security HUDglasses As a Security Officer, you can take out the power cell on your baton to replace it with a better or fully charged one. Just use a screwdriver on your baton to remove the old cell. As a Security Officer, you can just about any firearm on your vest, this even works with other non-standard armor-substitutes like security winter coats! As the Detective, people leave fingerprints everywhere and on everything. With the exception of white latex, gloves will hide them. All is not lost, however, as gloves leave fibers specific to their kind such as black or nitrile, pointing to a general department. -As the Detective, you can use your forensics scanner from a distance. +As the Detective, you can use your forensics scanner from a distance. Use this to scan boxes or other storage containers. As the Detective, your revolver can be loaded with .357 ammunition. Use a screwdriver to permanently modify your revolver into using this type of ammunition, be warned however, firing it has a decent chance to cause the revolver to misfire and shoot you in the foot. As the Lawyer, try to negotiate with the Warden if sentences seem too high for the crime. -As the Lawyer, you can try to convince the captain and Head of Security to hold trials for prisoners in the courtroom. +As the Lawyer, you can try to convince the Captain and Head of Security to hold trials for prisoners in the courtroom. As the Head of Personnel, you are not higher ranking than other heads of staff, even though you are expected to take the Captain's place first should he go missing. If the situation seems too rough for you, consider allowing another head to become temporary Captain. As the Head of Personnel, you are just as large a target as the Captain because of the potential power your ID and computer can hand out and your comparative vulnerability. As the Mime, your invisible wall power blocks people as well as projectiles. You can use it in a pinch to delay your pursuer. @@ -187,7 +190,7 @@ As a Shaft Miner, every monster on Lavaland has a pattern you can exploit to min As a Shaft Miner, you can harvest goliath plates from goliaths and upgrade your explorer's suit, mining hardsuits as well as Firefighter APLUs with them, greatly reducing incoming melee damage. As a Shaft Miner, always have a GPS on you, so a fellow miner or cyborg can come to save you if you die. As a Shaft Miner, you can craft a variety of equipment from the local fauna. Bone axes, lava boats and ash drake armour are just a few of them! -As a Traitor, the cryptographic sequencer (emag) can not only open doors, but also lockers, crates, APCs and more. It can hack cyborgs, and even cause bots to go berserk. Use it on the right machines, and you may just be able to create some difficult to obtain substances, or contact your employers to request special objectives! Experiment! +As a Traitor, the cryptographic sequencer (emag) can not only open lockers, crates, APCs and more. It can also do things like hack cyborgs, and even cause bots to go berserk. Use it on the right machines, and you can even contact the Syndicate. Experiment! As a Traitor, subverting the AI to serve you can make it an extremely powerful ally. However, be careful of the wording in the laws you give it, as it may use your poorly written laws against you! As a Traitor, the Captain and the Head of Security are two of the most difficult to kill targets on the station. If either one is your target, plan carefully. As a Traitor, you can manufacture and recycle revolver bullets at a hacked autolathe, making the revolver an extremely powerful tool if you manage to nab an autolathe for yourself. @@ -235,6 +238,7 @@ As a Changeling, absorbing someone will give you their full memory. This can inc As a Changeling, absorbing another Changeling will permanently boost your chemical reserve, allow you to pick more abilities, and make the victim unable to revive. Be careful when exposing your identity to other Changelings, as they may be out of those wonderful benefits. As a Changeling, BZ gas will dramatically slow down or even halt your natural chemical regeneration, be sure to avoid it at all costs as some lunatics may try and flood portions of the station to deal with you. As a Changeling, death is not the end for you! You can revive after two minutes from being dead by triggering your stasis ability, and then waiting for the prompt to resurrect yourself to show up. +As a Changeling, your Regenerate Limbs power will quickly heal all of your wounds, but they'll still leave scars. Changelings can use Fleshmend to get rid of scars, or you can ingest Carpotoxin to get rid of them like a normal person. As a Cultist, do not cause too much chaos before your objective is completed. If the shuttle gets called too soon, you may not have enough time to win. As a Cultist, your team starts off very weak, but if necessary can quickly convert everything they have into raw power. Make sure you have the numbers and equipment to support going loud, or the cult will fall flat on its face. As a Cultist, the Blood Boil rune will deal massive amounts of brute damage to non-cultists, stamina damage to Ratvarian scum, and some damage to fellow cultists of Nar-Sie nearby, but will create a fire where the rune stands on use. @@ -281,12 +285,17 @@ As a Devil, you gain power for every three souls you control, however you also b As a Devil, as long as you control at least one other soul, you will automatically resurrect, as long as a banishment ritual is not performed. At which time a Devil's nameth is spake on the tongue of man, the Devil may appeareth. You can swap floor tiles by holding a crowbar in one hand and a stack of tiles in the other. -When hacking doors, cutting and mending the "test light wire" will restore power to the door. -When hacking, remote singulars pulse when attached to a wire and pinged. This can allow you to hack things or set traps from far away. +When hacking doors, cutting and mending a "test light wire" will restore power to the door. When crafting most items, you can either manually combine parts or use the crafting menu. Suit storage units not only remove blood and dirt from clothing, but also radiation! -Suit storage units entirely purge radiation from any carbon mob put inside of them when cycling, at the cost of some horrific burns, this is a very effective strategy to clean someone up after they bathed in the engine. Remote devices will work when used through cameras. For example: Bluespace RPEDs and door remotes. +You can light a cigar on a supermatter crystal. +Using sticky tape on items can make them stick to people and walls! Be careful, grenades might stick to your hand during the moment of truth! +In a pinch, stripping yourself naked will give you a sizeable resistance to being tackled. What do you value more, your freedom or your dignity? +Wearing riot armor makes you significantly more effective at performing tackle takedowns, but will use extra stamina with each leap! It will also significantly protect you from other tackles! +Epipens contain a powerful coagulant that drastically reduces bleeding on all bleeding wounds. If you don't have time to properly treat someone with lots of slashes or piercings, stick them with a pen to buy some time! +Anything you can light a cigarette with, you can use to cauterize a bleeding wound. Technically, that includes the supermatter. +Suit storage units entirely purge radiation from any carbon mob put inside of them when cycling, at the cost of some horrific burns, this is a very effective strategy to clean someone up after they bathed in the engine. Laser pointers can be upgraded by replacing its micro laser with a better one from RnD! Use a screwdriver on it to remove the old laser. Upgrading the laser pointer gives you better odds of stunning a cyborg, and even blinding people with sunglasses. Being out of combat mode makes makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by resting. Resting makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by being out of combat mode. From 81dc6c7ee560411da2064292e5e8712c062f5fa5 Mon Sep 17 00:00:00 2001 From: Putnam Date: Tue, 18 Aug 2020 20:41:43 -0700 Subject: [PATCH 68/84] Ports reftracking from TG. --- byond-extools.dll | Bin 907264 -> 948224 bytes code/__DEFINES/qdel.dm | 15 +- code/__DEFINES/vv.dm | 1 + code/_compile_options.dm | 21 +- code/controllers/subsystem/garbage.dm | 152 ++---------- code/datums/datumvars.dm | 3 + code/game/world.dm | 3 + code/modules/admin/admin_verbs.dm | 6 +- .../view_variables/reference_tracking.dm | 225 ++++++++++++++++++ .../admin/view_variables/topic_basic.dm | 10 + .../admin/view_variables/view_variables.dm | 1 + tgstation.dme | 1 + 12 files changed, 299 insertions(+), 139 deletions(-) create mode 100644 code/modules/admin/view_variables/reference_tracking.dm diff --git a/byond-extools.dll b/byond-extools.dll index 4910fad01b151441354da8dba1dd8ce52955388c..bd6b34c48ee8b69492f9bd23d543c9a1cf44eca3 100644 GIT binary patch delta 373157 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

    WCudgosPKneb=#%~*b2QQUw zNN20m|6jF_{>fhZ=%19@pT?tv{>;R0E`G~?`e*H`p8=r9AAkHJ@k{)9d`3Bmb(?`GxR{)iEK9Y#G4b@+mc&p)FhU#QIEP)`q5Oj$0IN4 z52pX4f$2ZH$@ICmnf~YBnZ6kBWAW~T_t)^=1@E_SF#V^0F?~4RkN?T^EAgI&_lkO^ ze-`h(@ZNBX>7T?q!~5CmOuroO65iiO9WUX%8{RirnSLnVTjKr1O*T?5zXSKMAc7SS zGV_=cc9)MK(yF+QS?^9fSaLQ1FEB�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 z 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%0A@v;Vv+X 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

    YIi>tkl;{=*`+d zq-8RR%y<5?6?si2!QQ4u5~%K;Umd7X*o^^hCVvvZi}mO;T|%Dzp*j1S$r zhnn}>9W<{v>!k`%w?#S;luA1S(Jd7_$oV7hi#Jo*$lAdpQNDk$`WcCaPpDpqf0WAR zn^uiLD+ZoYn}=YdH1xi^STTh)tDS^cEct3oZ#3+L8av{?D4fDVjG+jWPXQ7dg!5Du zX1tnwUxZI(B(f6Aq^<_j?Xfmk%YA(4ebI9U>tqZ-H)hOW z4^iQ~nXFmei3#^@DMozQ4e+vKa|St$DN9JWFTS10$O!$xOcrXoj;Tf4sUzRnw*}#| zur~pvN|?o3(sRKq*4Ss_5Y+!4Z2D#v8v;1BX0s6glKA`ZyYN7lR?qUyI&?05mHiO3 z=r@~f@M($+mT$H`m2_`5gmnML-52%eFn_>mKZh;FWB(kMibw0Y*r4wod|!;6D|>PE zT-l4(xh%YeorsqESd4HT2xibu>^0gd-A}>KR)zX-(0x&R9##*7NS?>~wYK*@(bxho z%K8~z<^PaBh!)W%RkY*<@B z&lwbEJHH6lVW;t}S@SCNY3UfsC@RxG00^2p3Ak2iIYx#KO$Xc;Y6go$1r0LUcsw#Q zu}7TT|GwCk$?84ELo_zUdvAT!ReYbxEDp;3HEO7)+~x&rfS$N@%pWl93-W_8=+BmP zURd~_)vbYvnba+q+YWhta2D%f9Eb`hWU(~=R29>`{&k{8+BPcUC|H+57xxd`#6MZA zo6kYYkpBzO0|>)#YQR_pn%H|0+i6q*)|Er5DA&BmSyZkDQ&LIW(%ac3`;8%k|`F2=60$>UABBVBdyBk%h?&M zWJ@e^tG&;{UNf4?Tt%}L5UbQAFXHe{@+{~<=pZPn}@arZeXOa9=rjYKX{_v z!0O?#cmumCDbdRtS!g4$@7cY3ExP2ncp;D#j53)}(#Z)jHrCW>;?s@Hw=Q1Cf^SVw z!|U2?39#>&+sv$ME-r6mf$k^*aY00RGjqe{!g&)5dWJr-LS6bVdWX!0qc?#dp-k5M z+fkV5CoPzL~X+-~Iu<1L6Xw;|NGm0WHMPJpuW!53pegTVC)vw#dsNkOwn)lk^Vv-u)R@B3;QW7cI~uct16b)0 ztiK80b|hG@A&Yl>Ga#&bECsY%gTt~s;FbmfmhvMO1EO6-FCA%E}LbH`vd2X z-etoL`E5i@E*oVy(?;axLY_k0XK^lzHcms1fbFawQ3%^GmYj@JR5*-)8=`UiphB|l z8Qa+iW85Qm>*ei`e4|^H_gQ|O>Zz!iy3cZdKT=$JA9|jZfVlAkHp{TNov62ig`z;$ z9W2OqNqc50pp~c2T@ZRa^XKB;!zJy-v>j}cF&a|tpOL%IMhrP{BYUiqdUhGzXFoA} zY_IIG1EfRI9T=AA>^`xU!t9JtxgC(2pK5mkR2Z5b5(*Cdkj1o=GU=vR=$ixIEra0K z-~Sz(O%wb%tn)hN*onvf4X5+kMyGN6B z%t59fe$0B<%T%g6mfOn=+6nC_c5FLYbFED0nq`W2vIf=l{F!YpqkO{RBJEQwvXJC{ z%DS5>X#~MK{kGIzqiGj#*C3*HY3l1;Y-077G<4)SyNfk8>OOQ64|cI22fq!Y$iU!G z5w;tw*Ol&~|8CZV=$BLT*Ng=NEFC&oQH=9VSKI~rSc{Ya5;jP(v0GJ=6gbI;bplC&%zGdAlb zobiu2w0R^m0f^XpOm0_#jbI zJn{1nSmM3Jpc5>yE}cf#doElF3)eDut<`yc-I&g|e|>`ad)d=Up)t~;t-qaMAL|X* z$B4I2vB>(@$1q$Em2(S^RrK!xerzl=1&kFxpJGD|x=>i0vYvHTA#T-H{M&)wUi^-a zwXQtP)*AkQ)jnZ@R{Mkrvi3AQR?)w?_$|Y4Yd4}W$K6fBKORr?CJ>x@5=N#+mTtRru- ze4`PWM9|;N&wWQDIuV%SZC-_$-Rp0*H)Af!OKsjm2sm*NcPHp&xsQ3PBN_@?ik^9h z$S9P4fv^uEG723L8dNK)3TrTq-Kk5!@g>{&>uq_MS;Sy9rQ@s+{MU+8N8r?grBbFO zlW1-+-jkCP#hiZ_Z-K+Q(jUbDaH3E*P;pzjF(R)Zf%GPzp0-Gevs9@jvF9IFCxhP9 zwh{yc$G>bq{WUmffw`KM;q8>3nAJ^}7B4ry?bYF8+P|!!YvfrP zQ5;{26I=dey=pmu8zQGer>LgM;;(;Mbm00QDG$8a!lieT`m!6E>MKp$r}?V$#Gu>k zIsL0*-fh+{xEy9$mh@0td+p|_By|V|6CN6(;}DUg{vl4^hV@jMxO*GCU#4hqhmEc0 z1c`g6R2&4`X}}b^eIF2po79_P^&J*l_dUFJN)1Res~adGIsof~x=Q?ghcz<{A1(r` zm_={0eptmk^!gscdY4TfJQOS>ilk4F;))b~g1YwvwV!UyZ3hZ&uE3|sn|E*FNSN9f z*|Sk$pyWKOvSYn1F`*a}BgkAroEjqL-UE|8Ky19n0_zr4(ax{aOqSLgXrP@5RX-Oe z?}3T2hzIvz!ICY)@3U?Cy5h`zwo%!MflXFDMEV2h|G_CeWF6vH=F(K%`*^C>IKSA# zDG%|5dP*hgf{8^AS2Y*D@K1W@LUR4Qvo;vv!Kn^U*jy0(-iXa<=h%sWEjrl|^q+=)27VS9gI7)HjoLcn{ zV9pHCr3cE*iwfC=dL40C-pK?sJ2pVwf}?6`d-0hK%*)&2PaA6)!suJNO$Om{__kAD zM@b;BbhM=QUelHL&_}JA&+EE%#sXaq$B7kc{F*JimHy_MA9#JAcmAe&eRcDh`UZlw zSlkLvy^Gd6On+9P+qWik5noJ1y-1kIi;>1Lgq0F?-X$ z2{XiKXKq)QA$iPbTjT902y{y{hf)riHx-^7KtmxY0RfR}w`cfZq#d!NhL%)RmM3Sd zDF(Ia|Fx(uoga6UZAWD#fJHMzEf*dbB6(7B^SHA{wyu;-=3O;I3~=GWq%eb`5uBcO zV0@!a%yZ%O6dA4d7aLr754XFk!64cBz~5c?$Xfa}H3v<^DSUbhih~!-cz4SX_fGK) z{`rApx`Ld(x`g;|PJsrO*K&l#UkYzVi*W$sH+<2&6dg%tt|Nro)IrXmmoLQ?gdF&> z5o3?58_4%wqWZiT!+B%c3);@XT{AwOCYwA^4sB4ncSIzzi*20uhfL@O=MBkz8o*TQ z0?l_3yhpZM^s#SoZ-+Ralw_h?i`Jr@WO|j=LUp2m7sh=4m z3(5sjHe?xP&$4YRn%cvS*ULZvMj>(PKSv0abGPGFrPk206Gd;j^cFZHlO0JJ)gNl) zYVc$(XQ+wC6p)!iDf%1MN8}$kr+09idg}+AX&_LR^ZEB&vfJ&o6lRrnf3>Ki#c7SP zV;at}xbfhOWsPCdzH2PG4wW7LY7Fb>OrU505>)}#UcGUW?un4FZ0%gs>{E8Y$rdM< zth``!Hcjv>m`^-%Prm@c54CwT+6=i5eG1GDC2Y_#oK^HuTjG|SLLK-%oLiaY&ZFqi zmVLY>?IwsbAII5QARqNRamAgt9J&+DfrRKsGADfD4D}i2?=0u6leY3Ybfr4Xt)~a5 znTL@wF#ueKdK+2cj-RGA_<=AzT32g4q?73kN2I}A`KVE1j0X=keEy@z^xy*xv3haR zgD-DrrmT;~B5Mq@g{w<40Efsk+*;$i;R#TU4Bri21qfwoLaIwwA=j-Q)U@z`JpsWNr@YROpEIQlZ`BlEWU=r=yL6sUu*Jz)w+7^Rq z@3Ed(PBG@%A=8(xqbC~N7anyu?V~q&@dmXpw5EN~vElS29^$AM5A8&8w|lhGr-i9o z;33ftYWE$e*d9R?8E+>44C*;7mO#L=VW2^YD(tsx$zrgDHxYRr+(|z{#MkBl*bh#| zqgFGNMKj9%K_qZN;kw$qW$gaz_$2L{2C`+$rhOHe^z`99 z^$}vJ4}TFiI^r`@M5PZ8t@qv`*;ncu*Xrt5V7V6Ye=~1q8kNzaS6$v&-(FNao&eE>30{1>JEgl%^`uK&KD0_WILib659T0o>hI#my1bG8J8`Ej7AqkF>+!7t z%z&yzB1Dt4b@EZa#}a7&>Pw=y9uL9i-LJ=c>C;8DFCQr9_bOjrUq48E?8|>Jt-qwx z880N)xfgMp25gpC=Eq0seZ+M?9`6%Iz=MX8-19nis)Xvp{}v@Hc~ret;0cno*&9zM zLM$$pj!EitvAI6lW)z3&^NxC}cvzp$)Bh>v`14@>OJbuxZ_kfo@x=uAJfK~wNT^H4k&$h-Qk z{f%fRG_ak&B)o&KDL0$*4p7*IfqbTZpST~$=P6AN>U0M%4Kf;VSm}f6ZE3(8*OU0u z2lK&KEy9vz@5y3usR3_;YiT`#_#hWEHS(?)AH?gLy8fYId#kL0*D*Efi={!lTgIQb zYR%C(=v7EAfy3y)2kME>&?2bPn0XmNd36vtydj?;Efx5m)d%g}nAzUQz)7 zbIzvjoq_#?gJMSHb#Xtu4C_c*Qz#EwP5mpU$BnEiuNlrMqE|5YH?F|a^g=Li+O^K7 z(&ou!?+TFgf~-960#)aTA}Wt4nBKdacTkIR2iENT%i?e_@8-Ryy!v|p8gdB6wnvJW8}i1&HI&yTyba}v z`e>0B%FVc1uOyT=HGKGq)ul0Lh`ye+Q4`)*-zjc7t#n@7bYa+t8Misnqo)&GF{uaM z!=*V&&J30iXNet!3P`_nPuv{)avS&3NAlEv;T-$XLI<`te7? zDU3JrA+i>67+jP)XNDs# ztCR}oy;{Vz@_J+xyPEMedN&c%oKH6Bu8JEid2?~KIrru(_d#rTLal8Srj|TF__p9L z2Du`x4t`vz6YsRZuvC<2Q2uGby^WuJ&4g=9z9y)_*UZ!uzpnVj z;5P`r1pG$f_YyMgZwabcBr00+?#3hEF!5X~zBuUlZH`TzBPS%JnBg#$<`Pp6#++ zw=CwqC8i=9w}adVvJDguV)zGc*AI|gZ|CLe0l2X4&Hef=fLzDYAmYq&x164O6w6=c z*?D<|J=ZNf;km>G9L)3CF3UWZ=V#q>PQMxtczsbW#W)0LH2WES|2_FtkQ`-Si{DNvOfG(H*e%dvgQL)tW{0d9&Sn)?+-qf^eKXy!2^lvB{s^*E1e%wckO+|$HIK^(T_U;F~*87XW z{eepNL~4INSnn(H`tvTB84vn{)x(lF02AbtcxM0~Y`9q>^852JQD-2p?K1%vqr;2R z-=1F;tT$HG`P(uuK&=v;2l7GsYu4<6*v#7D?z=mCT9<;ia2BGwb!XpOoci} z{5gpG=@$q-m~R0hSU(!fZF;v8-@%0Xt9FY|e&;5>i08pAeucu%as>9qahAmwz#Ms6 zofaQQrW~imMVJe5Ig2Y1Yb=aYU$xred5qCGVZWQT&oI9ENnn+U_`(l`R}!z|`|R?q zXRIB<>sb?$cykR%<_NAgKG7lq(!yij;}(_vUt9FH_55gl&mdcLb{zjg-_QPeoA7xi z%ia9n4ex=|Nqi|TCqFj{6U|rDe~o8}t*`M3;BK5J zgXR_%i>|Mef6hRwmiU^nu!oDNg{{AYcqLb<6hgUsp2r4S}nd=b{ZKHlD;9wItk|Pb+8e< zB<5uDMuym(VrwS%jotAwj`o5)UdS&Q70TcfJ*8d>EAN$%q-O2Z=}KatST7$_e6ysC z4i)v9-7!8MdDMM*U|`59xp7t#U5RsWp4-|5+&klVIBgOG${V0uqLwocoI^qqPBE#W z5?&R)Z0txFXvmKnUFJRnAES|IZ~OkUj@k`wUsCFh$qrZJvI)z;&ZltfT`Z51|M^&R zcV0*JtIpIy%hXD|y?}@G{cVfAu;qyKh^k)s3LAAe3>#e)mp%FxT{ScmO+o8D7vp+b zB;k_M$&Q#}8S@}cUA9v^T)?CCH$=CE+_%d|0769;y@U*Kq_@6VOa&=x{f6OEM=RJr z>JHDv-N05t!-+h)vM%_al&HQV-dxB73<+O}T?={RcIq^}F53nBXt%7qu33eLvR$%% zv_bON60O+9XCuZ>ZMsRMF9HUBCAKW$ulN_qe8DyI z^_BT%Z4`|b^A`RK|C_-mGem3@uPo*x0&fgNKOE`p4GSGf@H6Lo>(ZPkLj87wC|%4) z>yL1|^65+3GJ1*---Q^6OBT}yaGK*)S_u)O=KpLRb2WKXvA%jn6mjm4uS zyi4sF15nMF%z3H~7kQ>%R$m?<`Y+|N9?D~2z91M&d3{6V5b^C&Y&D9-&82)~hazIh zYyFO1p2xtc*pDqh3bF`VEA?6oSmC|nAcj}nu&=-+f$1b3n4FC@Q7>|`c_WWMM0H2s&lKNf^U&Z#9}Y;GXwn@}HS-S# zio7I*emRfqu2PqU{E9A<`Y~@c;W4BMnPlfu-t~YDav2OzX(Q^1E``%B(gruhO`YQ; z(wFlNUdyp_aBSe<*)Xw#_-;7_2DgN5Id9~}jHn{=`a`)bMyYQ_goVd6+>b7C6q0It zY&`3z?rR;ip+Sat$HIrT{dkQd=DYclT6hgX9rNKMhQtj}V3D91_LdQOaEuujryiOw zLRRq5jFp=JKgBR+VwWRn?Q>$F^O}noB6$?kq9n$2;j}zTnHE@bO(TD9p4OOJAL=r7 zx^!N0p*5%92{-mokF=2D{NntJ zcG^n7U26bG#{UAp2%F(28(k!Zui)L?aQ81RYsJ<`T`4|a!CM9!>0_MtUT`y&-32-F zwB|29m=0fH45vb!w}O+it>A4lV!_&7IC|MR&i)*3e~z<1&GzR^`*RhZSB@6vU%7VW zd+C2My>5wfv`oBGUVQY*&zC*c;jO%1asK?4mp#G}Ep8qh_PuXK9%4z;tRdqcVf!=`NH1u5bAp!}Ilb(J9T!p8w zy#aCQ?l2Lu3UZ)A(PtIpK=~qb6|b8SXaOof_yL#5Sas;OqzGK1_#g?wt{o78V4(%& zzh?Q9w8F&9xX`nPQstsWR_#W!KIn%4$*9{TM{*D;EL;FAtD$%l5Q^22*Rcrj&F!pZ+CvO z=>a0|E$$t6`l;wUG_=HnId8>yRkLazJ(ca0BOC5Yv}eky7*1Q!(6@PP#<*SfVe(v@ z31XMx1R@^Z9pj%Jb4p!=K#Ji&CUFsJeJ%F7I+3 zx>W70Md~TCM2ozvwn1dpp{|`qpYmMfY1E1Gx3QnqiDs*@gSCnmSMwM2+r^R9;IOBN zyQ{$kCtE|;@YnRM=F)&JS&dIUkcodSu#tI1M$yRtdK-y1+gB^_23`IBwY*2;S`>rz z&;`#VRVUv{)v7M!kP(W6p0sfPAwmUjoUu0_T4f2n;~@$W(7lJrAX45N4$+Zz@9gx0 z58=rVlKWVia-GjVUXvz)1GKXd^QOu*X`*Bk(|*nDu1hP;>_$gI`&4HtzmgMkJx-l~ z^)fkYo^qX1n`euY0z3F@Q7(A9mtUteYJUYx=e`3s>2XWzU^EE zsh=UOVM;xlPX%ZUrk!(&f*Wa4^k%qCj)n`|yRU29y-}TtHS)M!QI^)$p(OJ){QH&I zw~hzL*bJN*Ug6F(yXYiGa%UW zTznUCIUadMZlNO|Q*y!>RMdIB1o5d}FzLz!w8v)5xA-BNtD9y0W;;;;3* z4n*nB@9@6HQ^jr~{vBR#z!~H(E-gETN6Cd^wd^3h=d0LOA$rkK&&8V_*=!{jN-kV# z6@JmpBz2QzUm&hHulT`*;ytS^)idl2Do5m(;hJsUT~ z!2&3C3)*m#M_X>HkKa=KezrerM{rZ)2y5^6Iox=Fpe*`;U)FCF<9F~a4My&INJcq1 zFC7Boqj|wRzgx~7o!WhuXz(F_K{<|QC#ieH(hvD)<$`<}Xf6Mc!xCgby4d|O5B6xD zUfsD}#)y)SVRfK;9OX5JCR*8Z7&Y+ebffZH!gnXX<5xb7iZujwl$+Em@}(|bu(J;P zgm;0o(ZQ~LC?Rdo@iWiKt;3cr7R*60k(+ZqT^)G^b#+%pw1o6pPzuhU@gm1PKG>S3paKi1i zPU>ng;4=sar-;`-!x$HVL)r2f_w9gysk|)=LyK=-_9F(;d3J*mXBpeziC9+RoJV=J zr?~kU@1w6R+JDYB`?}4Nbw0dZU`q449b*bkb4v+U|D9>A_?&y{^-h84JoO&#fu zj!QN(ig3a|wV#Z@*1D5#y2lY`G(#kO4WaK5k@+=W@O*FvC}x#DEqKB@*T*`7BP1} ze~AH)5V{8MEFF@d>&*3 z2r($1`@S4b?SP5r-&lOW2$pSlh(mu6;hOeQ^=b}~*6cbMuhd|5K3;8+RKJ>!0=7sh zu6{*jlMBi$C<`r~O1S%Ir$$jU^j;`_$miVxEpT!yjS-3{OYRd{nu@T4yjw`P%%TxB z!s)Eipp@X`7Da&bW0ADDU3!p*5dHb+Any%P;9mzp^~MOV0x0ni+qr;mpy&AlKFFQs z->^!YlYq8Ov^m71C?)j}7B5T%@y;Pw%^;%U5bv2W6zV==f1zTL^F)3*IjEoylx#9m z)DQ?7r4k00=1}Vr)vmqBAVGn8GEp@yCF>8bE%ZMQf?w<>Xg7qt%Q?8=acs=Z1Arzu z18wS1jQwss;clWWBeE+RppNpu(hwPqAl5f6s;`V9l*^V0YDXC{K}Jxt+7uDs53?gF zu6p}LqCs3#X>q~H3YPAZbRZ8J%ue0XT%m*fmnL?0H*(Jae@#`GZHjp&{;LI|-4Wg- zK$^yYi~6)5eeP%&xFS)@Q6{Dzfd;@J4jzFV%pfX|Uy(LUX4XPfI(O=J2Z_EXhJDXF`7u~mND>`O$-&jhJH!Xy z12OZ$#P{Fx)_$8HoR-n))5Gf;*5eYKpC5^FVOdrG~m7h0L(~{Il zL?U$RF-W&SWGz?W4~DF)<=OuGFm%L5d1Qfl_9(WORO_S@kOSkn`~+`I&pju2oeT-~ zQ!Xp=gvUquz8UX{<;Aj^M703(6xB4;s=-G&kuM~*Gr_gk;2}Vh*~w4Sx*#A<4FCw~ zLB|aocKS@%WZy4OlYNu|4{}km!n888=y?)XMafF*Aud7vh@@_hyTBkb*6e~xSj0T; z0w1kyX(;vIF3>u_d?%UXzEg#+Pt=A;JIBx(Bp1EQ<5Y3+BzKFpC#HE|kWmM2X+&;~ zKuHyDFt+=kU%JF3T;Cj-2}?u!Maos>&Ibnm%|+u=yhHRYus3D2?adxoS{QR(zT*BU z9LKp{NlCw9Dr!mcHB=^*qWP3V1uL}i6m-rN2z+yjHw%gCnl(q z@d_DV`FQ**ao+K=NIC-{u&6s90brlJ5Ui&mlhzIAi_O)(~N;8TO0K-6}QXE9hRsOkyIM2 zAz5pK7yI#q#{Z+YaC<$i0EYe3kq;<^LMgRWTp*}5A%If6 z=^uqsJkGjW5E#U&^E}c$kA`nA{ew;V>GQlkx#5F3H>|$NAYI~` zy^%$fOXg3VAxsw>S!EV7U?)R#d)8BwRpy^LLk#|J)*X+tN}QAVVRpXq0uMCF1^_C< zb)B}xJ8^}>1qg`^0MqiBJuO)?L3i2> zrl_AK`u|Y&EpSm)Tii3eWHy7KBBFwzqT&O^2MXc?71UI06a{=!sd2H)5{yb43@LD$ zq_Vb^-h5?LR#rYn(?T)Dvcj~Yw4}7|If8|TiusuDzt%Z3jNSWvzu#x+{?FcPt^Izj zz4kt2P8C>g%nQ}6$#*Df9I;`29G(P0N-%t1>!)&gli%@jPjA6O#{5KK9_I)Y>Eo6qKr1Ix#i4lp*-{?UX z)?MF3bf^wo3A|c2c@uFwQ)`N_Hll!Wv${d41HfVGk-Vx*bXNc!oZ&4Fx=10<|ANiN zE!pB%81h_@eSbC0i7e=asOvt2q!^Oaw8ExmC;P zPHtKG5sGm{^Wvk_Pw^c=RWrbkmj_#9zjLN`y>||Gm2DkPwf^6g^6)uR@2+#*49Y{; z%A#ys_9!dspGDo$`OK&1OwnxpUYfttmf{x%Lm}_WrKx45`Rk$ULF%BfN-asZr|nlZ zN^u?v3#!3!=S^e1lDo?_=dn9CT##R#H+ABGKhK+zD4@@8IB}UJbAK~UFmA^8L125> zT1Ng3vvQ*x^}A^#oRz-%WADsB~8Q3>;IEBKq2D}M#`<^_-4OY0 za|36kE8XO4|1pJkK*K8an}>Y`4$66Wh7~$}-&GkPPyELe$_csv!eolCaCux$LtX@( zHrsp-kdHGjE(~`Lwei5m^`^Qm%3%(Hx+k#YmXk`hvkHw3cw~+OBPgRhrI@`>v-oZgD|3PVaTW^ptUx zeD{KB2!#B0!PJjFA6n|CnJLd5_~k6+$YR%N6SdvdMcDH~2XXs0ZdH`WYs0}uaJ62o zV$+KL7F6;gTy0bcDuM#VVEg&t4L{ov3=S9>uY@qVG%A?M|GL#oyLABsUO=-6k z=Xs&5h2zT}OoA?Yw>uK0f4p?m!9?bFVyaZG4APQeXr^e@Nw%mr4GY<-2fYth@81xiSGJTPfTeNj>(Gf=lot3gLwyn0=EI}R z)s*0vnbzOUv!Da=_qo${sBQ=i8?_iYXxdJSke~l)8q--sXp;eN4nuVI z8q9KfhE>_O!Sp2O^Zf=>TsN)Uy<)xcU{BPuelG%jelW%Ln(9S1x4d;RJ!sA?jYIByWlBn{xXe6 z`|R9kDxuNiokr6LFI@bnYc%cln$cTsxnk<=)u*?tzG8Z$Lu4q5123z##ND5CrIq$8 zKOj?iQ_j9>+H0anv~urs&9uVn)*89tnyEvu)@8fVTS!n}RN+m?YbJbC1(COJGQF6n z1^=sP#d$;CeYWY1`Y>}fB_U>fUXRsj_*{UoG_}6)y2$q_X<66mh+m*aB7bYrhe-_)KJQj@-rJ1uUsFQvUT6^&JFJ-_ z`0Db4n+ZCb<+WR;m{C<-wA7u1tEbKig-G$~pptoTlOkx56I7HAY^$_=fn^>IXH6K+ zT(y>c+tkIhKo_$_+HRX>#(Lpr=QyP$3#IfckpcJ`XEnA8wiQjb>E_b3#?tBa+5{q7 zJ59;va_rWQ8fd|;td?_~rmh{Rh)Yv~qHH*vm=+Xm`ws6^*?hPPUUQo6;_xFW-n|5# zb;+}W$~LD#55Mg+b?-#{^AHhedJ|24k|)heqeYh?9L4ndc}G%=eMGvlhKdWz%7=+C zO&5k44_~}nF~^=-V{zsyG}FEGn&_-`p8QB{Ifk#)zjRzAXe~T%CLW?nOgsPRRPPm7 z?;yXfbagR`vF$L~{49pmdoHQea>MWhzEb1{7W3e-+K!?h}eNtnU*H7c+)?YwqNwK}16IwmFe zaBj?7?vtt9dP;Wo5@8*wY&@o-4?DS&x>io}5+gf~DB{MIh5$-&Rx`oBwcoQsp%vxkR3L|t~9oVm^jwapD5`VEHE+uX8sni zyjAL5_l8!MMNN>4wr>D z?Z9bD@k-Lm+ti0axezX%jVjEALnOOb>(K}NO|8@+}fm%p?WV~z7< zOpxerd{E8|61$QO-{9&7&1*MT`;Eo3JJ);X-%PsPv0{vOrT0hKAoy&Z11bFl#stKCzO-II>jjYpg)kf$Q*}ts_ zO}D;+eq94i`HksIW9{ZSSo#^JDE@!Kw`m6YOndu8;}rDrDVa)+TipM!7Tn#4L=3Fh zONNQBwiVscz7Dn(?W{Sli$*~VyoywewLen`@e32<@N5ztmWgZ?NX6rr{!ZyzUz&6WoD@8 z(>3!$y&!^$RZ2kVGx!+1q3&>wf++A+qnpYpxh)ifBT6(>WEkI*vF$`Jp@rf;ZF_l7 zI}wFW@)W$=-E}_(VzfTu zo=XvB*rg61Uc?uX>^`?)ba&($>Ittf>ZX9JM$qQWRmES+M>~pW>C*I991tLZ1dh2j%xq5zpuHN=GpY77jzg z(e8p}M!4wKuZFT3A40X{oihckJX2ATCn=T-@yqCV4Yl#CoRy z^obB%jg`_8AwmlxjRBcwpmi|%H_&>T2oQIC=p_1i{nU11|Gs$(n%zQPzsM0CnK>Sfr-9z zAl@C>-%0duhg1bWS!vra2w_E)UYvn+TsZfM6!FGQdxl1e0^_KmiB!x=`UEI$bYs~< zgC${3}ZQXj~`1>Wl%u=bo@G!r$1k z1j8q6ba$l?$u!xwtLW7-8N-ylxDh@UC1$T&*j0=d!APQ}ag~m)BFZ`x+CQ5;1~j(f zDEvF6bk*w{ku9Y&1r&$F3vUdK!}pxs?c|qu%D~F&{uo`L7X1r01m0I|Dc54yjv&#Q zcP&Oa_ny-U5Uu=3V5cVXD_~o30z}f_W~Zde%xDzNUTKdO5yl+(PPFJm1{YsMi>_XA zyJbVP=+@#4k~~$JyC=MxC^34CA1JqV7d`Na>#w?tP_KK=$yPCLt3ib~hW0A@;OdCE}JW>m?pA7Ry_`#PBvB_T`p$;bkcAl|%S< zM&+Kly~W$c9yPF(J3Z&-YgZ5Y=LN&E^mHuw{4}TWHT<}G5Raaojy(?(yneA_fR!e_ z!X;#Bh7X1UQ!hB`n+?=(2_u2;e4sL#c^nj4>7bBG2XR$yqA+cB=z33O?q8He9z7ny zm%wvFvtV{WjP&xOzLIp&4j|f*8u1u6G0FcQ#D2|!+qr3x3K`i~Obu8Mb0%&1_?}$e zS40HlxjmkiTl&s+)qS^n@zay>$|V2317JFhsL%`&VqLb8F$OM zH@GFH-?9GJ)LcXFn%rR>|ISQTo|G^26A50aaq@USG1K^!>=7q=kKT;?0raeH9hMzO zjK;ciP`oSe{2LvEEGs(O#wMWs^~jA@Zk)st2SO8+e{V+U*aTX=!>0Oixi(Hrw5~$| z=bMv;Z-pDQYA)&^F@6aOB52j$sE(jLfvvH&T$mUi3@5*R(4L48fPoc3d)kHqB;$)^ zrTI!-D+JJQ(zRnjQ#wb1M;JUx=hOprVAKE<&ZrTn6HvNS&h0Nc%{+_3UhIRro{8eRdATo*`*u-y*Y6ORD-U4QXJi}lFd zrt%n>H9$<9xsh_Zp`z|sQv7y;>nrL$!9}Tk+JsIIy1FLxq6JL`44hb~rz;)N)9}u{ z5zn2?C`onZ=c4RQwm}D)P@AyS9CY9?>hsnBk<^ds7d}1*P{YARE5dy9qmmk)3@`el zMP0l9#dQBb5pAUuZlRQwMo^9LgtLW`2g^T8X?!`5(h&z>Nx=pV6V)}P_W~CS;MtJ9-ye0y~ zzKV7jp?4{A80ta z-t#gua+5Ko9g~*^Vg8>hL*ua?8zP6t3w(rjt$Z+EjKtvkZafw|kISFpMV6K2s_QZ1 zM-YTfTmc*$jY2Pl)0m)Dq>owDmOO_IJT?kv8^-}l1F5~1PQSS@F@l;;p8ukw!@Lh+ z(t`)J-n`&VQE;#=Ytj4YqKaX7t`V9N(r~0UD6M8A8%igSIy`m>weAeAUCUelu`MS)azWc2fKLk&(Loas5VkhIu~n-E$$ zoYHAgI!tp-9sc$M#8x*J7kctXId>72auQ~Ve8mzPer4%v2<|R-4-vtwYSMMSJnxLU z)0ud!;QJw>-^2)z&i6Iddh~Nu@e#-aKmLP`02J}b*)*l8rGEux60%Zvrt3JNs zTp~W^(ZH97icYOxM?KOm*c-R_Y+pIxE#roY9$mY`A4auCn44Z53$2`flAvD~%J-Y2 z?v;-Z#ojaQqTDuAM2;K(yL(`t@%3%zCs+qq>vGshIi14~J+lofp>o}`| zk}SWCJ-;!-g8krHX-*R1fnTiAx9AuFe~|G>$jGzuy(IBK5Xb-Y~89)`8DK^__=Vqm>jHw=yVoa{YZjK*qV@o+Jt-xaLEY?X;~ z!XCv#kYU3qwaYpwarjt6ZfIQ=lJuFA})it9+BU$S_|Yj&;t zC|S%mUX@{^M5I@j9x`#1NDftz^R#7 zC2L2CxIXT60ok?X`;(I7mEVxv)OuWOg%381{@6;Lr?J(vkeR&mB?1u`%HHQXJ^9f1W7}4L$ca5wZBN9`4fDQNI>K>)L!ow(eAsI^R zm(UT5^H3`o4rbB^d$&Bt{f+M2RXKN22u>eDoV)OZf>SvsN2MU8pUMR(BC20OTS_8b zt;oJO$hE5Nh$&CqpQCN~GMED(1Jn)CI!NK+n|asJE+lQ{=$0VzTi* z`P5kG!@A2)$BJ%kdlTVJ)OYsL7B0dk<@K>pEF6$A<3vnKr&hR^GVp4;(w2bjhgLwn5Qq48bHXivwmGY4GlgTtq+DS^R*(ne=-QEKlv3Kx@jlbAIWPIMW1eQ@SjuZNYEUj z!mmE;a5*drO#UK3j-MnZ$B^$9qTfPfTQn9WXe9=|3jfO7n4B_7Oq(w9lSyKVm-kb$ zRhsBx{t=Umo}D^5GEH>!YB5UACKnyyu{3eNB?Y$8W^eCBf#Vre;hol`gL!R=vi+g@ zG1qB!dbYGPrAF5yT2M$D3RnDY$bT^DT7IJPsuhiTiGL>4#%z`qH(5jl&w%;E4BPZt ze9rT8_RXFwBJs9H;bhUp)Pe$WM=nFYGg<7N)tYv|bQ!;Z+#B-Nq1cIcP?BvBlR6+8KQqkf5wV#n~n^V$0};*yth425=vTypxc3 zG7|DCA+NQs7R&5kfQJ{dY{)Ev?1 zjkiE@!Bi|$mH@mtRYZ7a1Jq=RkJ z_Kwo-HBHRE!{hmB(EF2+J<~+z|7$(`IZY&c$AN0VbkWN@3Si!JF`M~5nJ$J4#1)J? z?duTWn;{+xDB;Ak_N{ zg_R>h(EILyt1f_cfm#86?6J%gfkwW2nLSJN_5KkI&(9Jg+2`aeF^GYfEjo0m2J4aH zCFpM6mEu_b`*i=3{3>zn@|V-Ge}HrBY%#&x>&F23;%xD>_gsMI=ZJQ4;2hBl7HV_n zh&Y!geNL@uj(F00GKe0VE9~C5nIKK`L`0jE9|MBL#XMX$702>mRGfi;#ChUF?{mFOjKL}U32+_z5%l>^P za4QkMtSdWV!mK?aGh3$JBVxQAh_B!t)I2WB$?xwGSqui;D;6=>c&`Zeu13(O_lgDH z`;Op~+xLmy9V}Q88}fVV_5p7naF2i=%LncgiRJ~(KFj0>_leL>W14-YZM*G+mLIFZ zMXaZ2P`;JF-6xi{om)w3lExfEA+3(coN4>%+w#QorqH20q1tf0CmAC%#`}|1*sJpE~(|e)Mc95Zq#0c@w{jA&Y!)>Cui=Z)oK<-*3IyWybT10QI_ zc{rOp+Ai&-D-BcVhNLZdd{IT1Wr{OC1?@v@ zK{pGcpsPGZO}Fz~AN8f5h#U*$NvNEmb=bd+O`Ac?NEC$n}WzJ%#xA2X!#bPmT zKQ}H$d&-e*AA)DH9R857d&OOl#~%{Ijk!`R5&g$}y~EZ2ZGUAd-`|S@)~((OSKxw? zuQK`#R1-d5kUSnG6*e)yEq<&lz%?b5l*zedys||;xkPlKH#s&h5hJ2}5TMS*5P{un zHC5y3TQ_wp#}#z2`trk2?~ak-4~woQ7SbXEyTbAKiAP!=cvyrjIt&}c zJIW`mM0wPgYp^#Vs_NQakbW4t1io`eSAB0O=G)wyj`$L{k*@pEIj!=`EYjKfBUSV; zk@mb+6m53?d|34MYUm@w9}zuKY-1l0qv$(hST*J6Pz$q<4MW?1QNH?!Sk#ZIGpKk6 zDwKArbnV51M&L1hRL-K*^LRYI)?R3cm4lXwZeB_sIcur7%d4@E+_qHoZrAg7&n`$- zSJVl=k;+nWPisWIB?qy<{F&eb7y@VIiE$6%2R&qj{Ssc4-i~ZwAhFeC_Wt?A4eWmK zxDT$a6&;R-{sk!?jPGw_AEuq+bt1hJY_c-(0Z)sP!E|(5?q@qYkW65q)aZ=bno;Lv zI}7nGFpvy0$X5BHgYm5FlP^Yv(oNC)ClcqF^THD&_+o2_Vwfb0@R)eal36=tb0|{#?sgnrEPDP)t*0{W8&S=%47@MPFb!+zVBM z*SA4B1Ln&$@YWXj2!!o0dDE9d=%}0z0}L<9>5oDsHc}QpD*9Mkg85eCc{^KHfkYPK}X^PHT{;M;l)XZf(0}Yk?Z-MIUxR)%oLLozVqirq|+f`R@YJ zb42lXC;}YZVhh?f>GslAy|3AQk}~K8=ZW`n8|2L4x%#$)xG8U;l|N0mMcsg;?_<~o zd&!u`kYg{I^%!gbaKqy{VH zkK@Q^M}IlzanU8H0i)u=pwqV(20avSK;UzaiyZG-EK#mMF7_Lz%iT|ifuTDf0n5CK zeNeg^>ekaD&jDKJ6QZZsh%hW$%kg`_a?#zp5Mb7F(d3OcJ!HlT@j{vc3eR;_4Sv(Q zYU!Xefla`5eU27W;nV8rC*RtCP*>~J%lys+Hk=OF6aOU6o9JBMVigm;%DTx7RvgFN zD?cSCS^i=bA?Dst06KTm3B3{}jfJ9f?Cq&2{X3t2sbeo(Q{|^$e!?&P>6dTh-Gw5$ zBOkU!aHWP6B^dI9@Fo@!4aC6mT%iabxD3B=hx2AprBBh(;39=AE%J9{D09i5_0rl} ziJq~~3tf4g-tG9QQ1s{s5S-WE_B4%2q;G7Qp}gIL+P?Qx8M#ul<#$DftQ7ZAHrKBd zLxu*oKwoXFzsU+l<@<@qOdy#j*b62V^F>sQ3`4Nb9FAuk=9v*aX)c}dFjkO(Pl@hc zOU?4ZhebO)RGIda80j^>hkWiSEJgEBMSGtToxP*ZA!#7=jt1~65|h0RX98qqk%$=K za|Xwp)6;-j#tH%7e{7gvimTUr;7^aG!Ql2h?qNJvzuY-1_QW$$9qkxfvs zK+3}xMvFz;_C&Ju9>o1K>^Wy_DXfxB44YyoLrirh6 zkuN1A*>?8eIlpuTdRbaQ9&GZ{?Fbh?EmB(|Emz0lo=7Xq7X=1+@M#enM6n(rJ8s?J z_14oOEbjRhV0VphWI>M`3HR&QM6l4X-KMNM{T9{W>kw3gGW8je*qO7+C0aDeI}GC} z@>%eTJD)ROk*_}^I!+%BuOgV)jdustjVV4>&?703i!#!7u;`bONco~;kWNODx}CY7 zEyX_!x{_P#G=6_Kzta9G8B`+Lj`|%zTB+70KxDKoGW@?q2JJ?ki)xc0?*liJa%j(j z5)3cUbX!Z&PbSGXD@ujYYr@O&&}z}$+~sB0CS;IRHp0i)AUoQ`!!VMv+eCX>$(7s0 zrgk+K$fzW|DBH&{Rn2LwJ!*pYNV1<5yZx7~pbuFpYh)+8_}tjIN43Mq3kG6S*I+HU z=oz_sjTq$B>Exb@HR67w@%WyY=b?IpB}(QC;yZMezAr*oSt=L3D8>YgKs@w<@5l=Q za_@^Gs(1Q0>IK>hzB`(<7kr0-sQCroG8~Q33%)-{pS8l_HRP#1pR9%A%&SA8JpD5E z<#^Foww6#dZj+Ox*nLM7LF*93t(EU^emTp7>V;9?ex{z-uCrBN+FZ zc*d*S6SDd>ENOq2E!T_Zy{0`bH?4rtpC@boEjn1&!+49X;CC8Con~xslJ7>{$E^8;B>8UDef}QEG+{};<+_ie`GhC= zZr6Rj(|n?me0S(Rhc%z*B;TF7&xe{%LXvOQy}H*%&1+ba?{VGdIn5_I$+uefS+4n{ zB>A4weR4IQ@kzclx=)toGbzdUjP5g5o_<{no>YdP>L5(Bxmb29TL)l3$0mp#h`Ity zg>*F^W+%yN2GP(nZiPgHS6cC;igH4yaps$Fn_AA+bN@xDY}CI4V?1 z0cO-4vVFWAL!EuB*^=8f)1Io}OJ_BKKxTvDH1?DT1H3%Bv@-M3BW68~MdH1+Oeyk-o z(-jif%+S}8JJscVb)!4e{VciZF7LC_xLJhWRfW*zB}aG0-^B z2C5hP7(7)K?D9LW`^8znNOUN;YWQ&t*~bjBs6oP!63+P3@C&FxNA!gyyTL-Om@~B){?M*zK|AjVN|*LGML%m-=CnV(o&s}w zx=P5bdrv~$S#o1s@~*r}@z|fXu(w8yvilj{RCWm2$Z{fGat`YZbaHLUjdFRvt9zGY z!ZlcOyn|sXsMptvGOb*+@Az1=NL&R5Z)9e!7f9$S|CQzF0^@ZNvnjM$0#eggepoK< zZD+=8;@nLUD@KO6e2p(E%HD5@^e&sR7yH%8hS{$RJw(*Nx4Y z4=;?dSLIi4iLRmjK!&lmE;{olZwwGmrv#=AKFhS6*1_i%vv zfn4&QD8nZujPE0DwR=XrFD4ja;rZ+i(W$@XEktz4jQ29NZTl-TniZ*y$Yb-tttR_t zd3p!V`8&V-ff$cPz+E3;le(r{lc7oYQ9k|w4qVp3jA-KrVo0}VVLg5kbYc>}|+R&df2QnWihR4 z1Kl#FlofL8P7&8-5)XHx{ecWyNlh7%*sDv%k+CaaWkT73oQsh1-2d!Zf*H4=3Rj z5FsV!_K45myyXz*Vi#}pNYKjqI~$BH#vg?WF~$(Ncdx+noA@5L$j9di?%gLIe5t2Y0(N5UtzJY z!1p=o2UbA+t2D~b_KTQ+=s$64Ki-l%gVwM0@S;XE>42DuyOXaUz#=_) zz1)95^bXc?aF8AdZsZ3ft{o7OJ)cDqfxl(2#fT6Z%2-hC-BAo5|jh%a4lq zelwbVa$SrnO;UOi+9^YtDaMbMwMRv0_mF09v_GeuM!zF z?&ejAKKPc$rYe{Qw3P>|Fg_Y&@G)UC_LS?7i5}s1y?)baJIvn^4q9~$ksmd%ok^Gl zwi{=UiNp@u7t<(#yI4W1Xr{@`#ND7Xxmb0-CWLBDe8)Y05noxOXH&llnp zzr*_DaTsrHkjY<)XSxr3mT2*W#}ZOVTtkn9ferHCM(LUEY70rjaq-*5==n>hw`4pC{Fs(`S9s_2!8Z@gc;qTUA2fBeA42o+q!Rt zJ8$DESI6{p?Wyhd9t?TAj2-h)9mw@eD8#q6=-bsX`LWLzY+I)mq9gF_>EZPl`}+M{6=VZ{ew=5wu$3t z@k^h#_!?>N`bE)oXMU*iN!o4a%7h}+R^DVhHH9s*p>7;T3aA7zuwcoUf$ss#If)AT zT|Rvhvt(y^8$u$3%JNT}qhIr|!rQ6>^WinTWeJAeXtCl4xt$GqI zR5(!NEINVLJou{X^6zks1Syu=zk}w)AWwcL`iEm^u_#~Mg&cdPN|zkE|wMN8r z9EmDk2&?vebi}wY>GP%0LAy^}^_flw>@U@bJtTed52Aku8&oLz;Icjr$#U6?-d8AJ z`2ojsUefFH#3mWh#!$CibH50qy zJYQRk#3&bRq!&q5FcO&+fdE@R-jyPKhZ!2$8fV)C6tS&_4<>PF*9F(GW)!Z#J$O7G zRHL+!EzgS3gx^QGBfi!Pva9fZ3i@cX0TMlJffLo`IFoRV8qstTH~XxJXjur~f!~bA z7;gG_Sl2zzoE3|VR{zIn)F4eut~dVALDxvm*%5EXDOn!~+fo}#q5{b&x_%p*uoI|3 z?Kf@}UU$;b$0iQNV?TJ!|2B4#+S4&w0&sMKLP4gHPG>w3I@_|c6;}QEvCbI&f_zbv zUw#*5H?@tW_y+~@UmWt4U&Jx}wM^|HbL+3re;42gr21FUE(pgM^w96@71#v^R>aGz zzrvn{tV(*EgE2P@TY??vsLjumH=rdl;l1aC-Q00FMo6{{jm7TuoERMN!!XyFSto~` z7g3S#kw=%h)_9x6KK3>YoR_sxUUd^~mrtA*7rjd`94-1y*uz>UxofIxG)bb%8*337 z{JZGFy(|8Aao0c^7>=X__cYe^H5ZnogvRJEoRFVaU598Z`PH@7!_2J1{or>oG58@` zFLSrTIVN>7f2~XjlBX1y}1P5}{26N6`DDi;6->09b5Il4~7Om(G0i+|cd*wP)k9CWA}W?G*e z!i&v@ycR$C7C=ztJ{8Khy1Q}4)|QAb2hFVp4qO7f&mYBE2jjHXf!TxQ{yK3t^ugwO zF^)!2ydQ#((_se*Yf}4U*p&KXHaY6&KTQEV#X&M(N{Bap0NtNe+HPO@<%@s z@9)SY@pB6_1B#nUG(_PFZMF{bGnLlxu^Cn-q}@HHHgCM*{iEE}Ale%1<(>x7tN+3$ z1x7|ZF&kI9#7CJ5;gw1@iO#fL$H)wWj&VNu9c(Q!Y;pR%!q%5y2jL}$UBU$8C1+j| z-J>3-H2k^@X*i7+JX3Px>UEbsL{#!gXC~e+Nrz3B@IasYdiRMdx>}eHh&EzJh4d0lsk2c#T>>pUAbR)X) zMCUjupPv>GG6@v;Zh%^w=0SNJlo#iMvYaRjnpUekg6=b-3w{-JStn)x8zOwr z2J+ee8hqlKInS#xo}9Jd%qKd9==@L0gBbyB!oxgC6p*A6$uJULBMWcf{#4lAP0mVt z+FCUTz?QbY=%9}pLR_iUMYUc*tH>z1XhHQY1gYWh2W^eI1$nclZC6iwh+mzD8I_Vh z2OEM3H-SC|a)eWICV#_4Xiqb%In3%%v#EGeYaT4BHM%0H!NPWvy!Qq@?n@g+nDr z6H%6(aM!uNT0Y4`Vgu;DCAxK#u^bnjD@l7BXW&rf$o(E1P2ku<9EUf6WAF*w0d-Ns zwWs;3<2@rF@_ZtXA#(o{^5I(o73oPrg`3K0Ad(unk%Nn(u`D@gTy1Pzy%XGIycMEm5KzEmDu2s#^J+gH-OLr~0J6?B_ zbvHqG<8(JhccXMSOm~BI*I#!Hy4y5C>u3$^T5D8A_o&s~8r`kd-74L!&|Qb_?qIh< zE!Tf_59Rx=+gu2bC z4q=E5q*Lv~a6G}z3~_ehR6`k76I%eo0`fI5RLJ+rT~r8V>cu1ib^`_f%6{eQk8oZ2 zSWT%wR(#x9`FjSk68<`}Vt*+hpuKe+sGIv8b%(=5QLqUVnP1(JSv1;O)qe}cT&o)3 zx?-7d25fd>tK9;&C>I;xSMy-JBmU#*?V~KVZ z$*ce^cOR0uHv!8OENq~$zm-LEyFZ2}f7SSg2m21N|A9cqFk)ZnVn-g%tB(jDmL^$@TT0^TD5*&88X)R!{L7!YZ_g6tr&GwKN!z2t&@)ZYoZhDn-sKFUOV_0%55-Vq-PYMq)jPOBITT;{UU z{I?ElE5N1=_e)7Y6$$YBr+^wY%*9B2G%BaM`I3n5S<2{FUuY%bnXCv3<+*Q%7JB?R zCBVuPFb#yaGC;r+b(tpthtpX46NR&YCI2)0fScdq3a6$OHdbrig{dCpL`~67^!0Nn zy-_ZPy;(Cc>OTz@cac)m_Yr9rweYK--_e1n-<1EeKg1LD5^5P$vf4W!!Wu{(30vW@ z(Zx=k!+{jhQe=l`%GOd&r@N}+B#>hgMZD0(skI*HCe?M^H0#wu&je75+dy2)DZV)3 ziX#@Dp7aQl$+aK8i6Q1&v{p(>EPJiG1+PP!<$9lhaH|iz&@n318!1FyMqyE}HTcOH~fX+=c2^9@jjx+q;`SF6TAE+s6=Q$984G~!agHA}6n z(ldcaUVQM?vgva@VmJ@lE<_tbY1!o>*Uw@eoJD z^k<;Z7hFVJLP?*j2_}iW$dKT)8q`USMJ`Zj?AHSi^5(a5^sng<6}z~!mn$a@nU#YdYf84b)nh+0T7 z`0aKJ!N(asK=2`kB?RX)+)8i;!wQ0v8J@Xi1s=n=iM$gShR_5V%Mcqqr`m-fbf!+V z9YYv7gI@Cu$S!b9}r^QHN{n}?*KXal%wcI z9O0tdyKWY>T+eFbmP>Ry-UVH#MyIt~D&ycwNJU$U)!v7oU^t$jlWNR9pI{@yLV~K5 z@p{5PGjtF<$?z1xDu(pnh#3}Xns$uNcBdWP8qpJ%w7;L{A(5qyH-PJ&Aq zR$B=#U|dgdCPV+f0PkiPO)!OFGQmWKvkCTPSU|8V!?gs%815h#$nZEpFNO-iYiQ-@ zvyFiDSFD7i2>-&~!w7!IFpJ<94D$$9Ff1dui{W;HZ!@eS_&US$1lKY&TmdX)7*6m> zh6x0hGMsjWT67NMCFDJa;j;v%GAt)Jj^SZ~!x+{Q?9cEf!R`#ht^!gYMrR`!%#c2R zr1~;^fZ*SaL{LKT&qf+Y?OO?-XYUGvKQKH)@GFK*1S=Va;3+HB!7z^Cy9_50+{`eC zpk%m;;Ij-j5?sk}Kfz@TYpyx1PIVFEM)J;P7~BLnonaq>6Bv#sIFjLff`b?q670!v zJ;6>49R%AjJVnr-VFSTie^K_$*8wjBTJ822!vA6K6oO|MW)nQYa5=#v4A&9-nBh)> zI~Z0Ie1l;sSKFs(g;e`ytXk?$o zkf#g_L!L5H8S<1dlp#+U{TT9;5zUaNjP?wnl60yq8S;$b&5&n|rc0D%(hWM*i;Q{7 z_?00~8Q(MHDdRXpo-z(H^juhaCyqeVcQVQ8Z@@U^bRw!d;7N9(!gu16;OEUi*q1H*jtzz{7?$6i2<(N z&RO#1s5wi2qdOq~oTon-bDqvK9Hu*SFm7c&d?HgViob;1XqT(0y);vdSb|@cVy`J-U6B(L;v(x zfY9u?lo-y??C5tV!(Io^rvIR~Dr1OY6)}8=Pj7k_8Pr%+Ln$w{YBpT=3YAu4fy9+S z>DuVxqV0s^bB%rnTsJ+fi+;Kb^gcwt#7%F{LI1~^h}&cWEg<$Gb$0tCf@d!hkANU~oRPTe2p_#K@E%4;52WKkL z-6T5XrWMv#$`GoNa!8g&f^Sm8+5L)~M~8NvzwMrb6}6X>JZ8aTRJK zx!QnH$|N=FFC0{+{=jazdO{~X#-tWX*Ib=+HwV?I@98Aln1mCRq$lb{4uaOzrqdKP z(}d|XOE{=T&CyA+n@O(B*7BC7lcee-!<$LI(MfvgBwcip4$UO*$LTaJ;OFW~tJiC_ z(Lcpi8$Ey=aSqhRKKXOofY9OPdS8voq*R^g%N<%@nU6!JRwzqIdi737_jXCARSD#V>HNVS{1euLc{o_C8uvirPN9N0 zvir^=we#xZ+y0csa`j7c?W|Hi#9kHZKK3f0X8%5W)u?a6b*FTYmeLcWTq!*YgwrSnJ(jsI=Rc&|>l=wH^C>f>jJzD|Vn6KH^c0tFu9etW0uCA5GHFQ{(t{ zmuF6>B$PNU7q#r-5R%;*HMN>SnOa4zo%3>ly~@>HaNT)H*79;T*_D@XfgJm3=FZtA z54H+u)31Q}P@5in6AF>U4Q{3viD?}TYTb9qrR@WHStCIVU0<0Rs&ls_S4)Vu?scP| zmiWKeEmP~*tx(UgTce)Vf1lKUf1&@bgzL`0Y%K#9N4hd_4#?qGu>*-&CcAV9=rX4O z^zQW{ciOFP>Q{++JvEcqomzi6ua@JygZhgho!b2wwP~tHyQdj+0Wr;|>^6P$(k66y zf6o-9XoJiEcN{T9zMUHK#~V!%wpZjD-{|E|z~J9Kx4?qAMsnYxkPa&;YC zcL|)jW#txgXoRZ>96*j}s>6vKVY!+^j9Tf>VHp+bbau?o9{8cjQ;Slcn1*m|k}<#=`aANyLcaRCW_5xV zm2`|`zG7oQbUL{(M z{ZD8d+_^fgRepPSu7W66KGYgFf8g%D`hc?woO-RiO%N&F%x<~*Y9DA0-BR^Net4Lx zto8vpf~nc2u~ZtKOFT-Km(DK{Q6aUvm=EM7tipSPf|TJEoUh}ma(8omOrVB6oj44{ zp~xK(IB19^k0lgO#ST67u0&1P3Wh+0YvZlAoAPBBrM5BRqkTj~Ni^`$i9@Z?e>dPn zAZOzZXgR%d!|bUJi}C`dA~d2bs;Up~wrXsj(^*1ViMknV9^@q!WxhsEbBDU>j?iKf zVNu3t1l&f>O>WNaYT6qi18GUfU>t2_YTtLaZ-3PRQnZrkYD2H)%H`9k2ry_lZbPhR zh;^Hb)s*YpZD6@jnb%$#{mLm9>l~7_*k~2*aJEPyCo+HNhPWS&J0=0 z7|M{fi~$T;%V=Q8O2#W^s3cg)c!41+8P75_SV;qTig7r>V+>i#_z6SSGJeF6wT$Hq zSu|!&oHbd-{lN%5`35;D;XCuWF_OQGkg%hT1E?dvz9THA!`|jGGr}d zKZdMjjAqDM#`X+Z%h-}3YZ<*6vXZgsG-aQaj29WQM($UJt8QD7w(l9UM(#L6*2o=X z$P?9WhOCi$hapdS8yWI^`VvDPAXhV-kN&S(2|^?HD7)*`huC$f_rujRa^rHXP|0Ds z!YI28lbm~nwHiAv8bECEt^s5vkmG>^=s6*8yXQb!%9pEEPf2bk zyT=YX!XECHHjtzZ!*FC(kG$m}js$L33v_|i(IjxYnxhM>z;Cy}XCd(7AXoCv0XYh3 zd|UQUc`!QjJH*&TBh?6v(Vn(LZCa`2$l}RZ4#pL3#-+q}ocR3y5uv?; zRxqFOuw1AHavs*HzPfv>D~VpGUeR2udXa#(th$0RPI@1 zG&z@FYn~P-G=lBhfgtuj0^*!Ih%vkET|OHc)C`RyMYDBm0?QU+IrAA<2H(j-vwl{S zM+BrD%qQv{MD1TLH+6ur3KTrRds5QeHk>HUM?qQrrk-wBCP@{kL{K=dPj%bZ57tlP=v?TGPrI&I{jba=37d9$&?j8S4^(uLeye4OiytzyEUpmyVYtir~I%Q z=9zLzP&c>WjwHB|=KuG$aT(F9TGiPjAyiUV`h%*5l3lWm_jT5ik0{MGYMCb~weSNV z)$;lgF=bIjjnzbJDb{x3S)P1US;cO?Cx~wq@wL?Wa_IIqTVqW{5Lsi{=3pV({VLT< zz1sH*x#!j0jpUwDZ-3yCdJ^561oolSfAR+Bk!I?esDDuT64iF1TK6*SAtL;fJP4@a zeH%vv--00L4c@pFKm_%uC1WUJXe#)3xti@Edi8Q`L9`moTCo(87@zMTrj3>wE*2`w z80N1~qdfR0Y)8y#Zssw>TuW*AZmX>98PM5U6Uob|8ue=cO2tvQ?pCxB+>QNQQC|RZ z6cYCeOe~tk6B{&9DSb(S4oX)x2O?Qix>a5OhS>9JLn6ecnc1cc6Td5l5v+%Qfq0|7 z2X8kQubwMdJdN|{z_gfMK*Z-MqNXjhv%q=_Bov2bG`Scy;kqK2Kuff4#L`I3-+`Ak zr=ZUxHN+7`sq$PUUhE6XY!Y6$h3gu_&iE({J1-$Bg8w1sp%UqO$3uY zZL6BoiR3@4X0v-r&0=@IYJp3vY$vvwG?!q19PG9UG?FbLK_!$^%f;UBgEN+QymUMl4RBPYQ@BDQEp;hfv5!H zU!SaH;#4@Lgmw6(y4OMWdVmtQn;^3K9(yt4mXpK~Ofs^-V6&GHOlyXtNsK+3d^4?G zs4<^X9|FHe&W3Sv7Hi3QmMEWNCI>CxiWrjGPEELzje;%85RGjsN5Hhal$%5_ZKvwv z$z!z_Q=moh)|hy`)s>k}Q8|SHdZdf|EXwzorcg|$D1vJvDKjxdYv!X2u7_XPcRl&O zjIqc=f>zKkX%gyr(YK3<70TM%4Cj;Jvys#o;z-1KhTKFFJF_nljG#fzzMNpu2!cKY z9e^IukyMM)LyL~i2-R_jLL>0QCf!<0rE5|AGzwl7Z-WTE)?OpQD6^9t+;v)_dsVO( zH-cRRLG`ZgzM;Dtn1oxxRGn)zdoh=lpcQP7>f{gU?)^-|EiPPVo2Ca%;vg>9l^xOX zwYGJ2xR%Pk9LkOG9C_J!?OVdU$JJoCHhTdT(q{OW@Pt*R48*5p_{ao)+av zqR?~JiKTI^v|-3`_%rN7wVBrGZ_hZieltvqgA4x5Fe(U6&y@d>9;*`Uk)Sv?g-3e+ z#0=+3&zfdwKAZ?{bFbW)2rZ)yV$(BP12(NBJmg9uh|x1T1QfPnsvN#2f^SG0ir%1~ zxGJ(!oe|a~m-UA+_K+}Ad1$p>m!#EtSNQ4igfZj>@FhZZ!b8n)58!`Q$yLl{NGXpk zq3)ED3QHdwzSRh-Z(32}SMC&{4LLiBLXU3RodjABd{Gm@1JOr!5@^Nsh(@rA`uhua z5@-X|6cAWlaa;~$xuRvX>QPYBKmD)rH8Fn*u$1fAFbzroL=p;4ek zSrto#2et5c^1LWBM zHHze+SF|M&49aL6Q-9+#ia3J%AVTkhBSjQuQGV*p1yi9KK&7RZ3Z}S# z)9@*U+O$)~dGf?vI5Ilc)m0*&0yz|FBvaS97l~BaReapQnwbqlwEEu#FOSloFpDxx zi@QvHRHs^VCsi0z_0_1#)hR?}h5UcrNv3c{{9PI8tqU8≻}r4TG0Q?Bs{FO)tGk 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 R3PMrBkv+Y%c6@2f{{!M|1X2J1 diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index 4296e3c2e9..63259774fa 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -6,10 +6,17 @@ #define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it. #define QDEL_HINT_HARDDEL 3 //qdel should assume this object won't gc, and queue a hard delete using a hard reference. #define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste. -#define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm. - //if TESTING is enabled, qdel will call this object's find_references() verb. -#define QDEL_HINT_IFFAIL_FINDREFERENCE 6 //Above but only if gc fails. -//defines for the gc_destroyed var + +#ifdef LEGACY_REFERENCE_TRACKING +/** If LEGACY_REFERENCE_TRACKING is enabled, qdel will call this object's find_references() verb. + * + * Functionally identical to QDEL_HINT_QUEUE if GC_FAILURE_HARD_LOOKUP is not enabled in _compiler_options.dm. +*/ +#define QDEL_HINT_FINDREFERENCE 5 +/// Behavior as QDEL_HINT_FINDREFERENCE, but only if the GC fails and a hard delete is forced. +#define QDEL_HINT_IFFAIL_FINDREFERENCE 6 +#endif + #define GC_QUEUE_CHECK 1 #define GC_QUEUE_HARDDELETE 2 diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 101330cc8b..fe46fdc710 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -75,6 +75,7 @@ #define VV_HK_MARK "mark" #define VV_HK_ADDCOMPONENT "addcomponent" #define VV_HK_MODIFY_TRAITS "modtraits" +#define VV_HK_VIEW_REFERENCES "viewreferences" // /datum/gas_mixture #define VV_HK_SET_MOLES "set_moles" diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 9a36c626ba..0e0bd4ffaa 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -11,15 +11,28 @@ #ifdef TESTING #define DATUMVAR_DEBUGGING_MODE -//#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing. - //implies FIND_REF_NO_CHECK_TICK +/* +* Enables extools-powered reference tracking system, letting you see what is referencing objects that refuse to hard delete. +* +* * Requires TESTING to be defined to work. +*/ +//#define REFERENCE_TRACKING -//#define FIND_REF_NO_CHECK_TICK //Sets world.loop_checks to false and prevents find references from sleeping +///Method of tracking references without using extools. Slower, kept to avoid over-reliance on extools. +//#define LEGACY_REFERENCE_TRACKING +#ifdef LEGACY_REFERENCE_TRACKING +///Use the legacy reference on things hard deleting by default. +//#define GC_FAILURE_HARD_LOOKUP +#ifdef GC_FAILURE_HARD_LOOKUP +#define FIND_REF_NO_CHECK_TICK +#endif //ifdef GC_FAILURE_HARD_LOOKUP + +#endif //ifdef LEGACY_REFERENCE_TRACKING //#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green -#endif +#endif //ifdef TESTING //#define UNIT_TESTS //Enables unit tests via TEST_RUN_PARAMETER #ifndef PRELOAD_RSC //set to: diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 8a1c08bc35..b46e22c1fa 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -25,7 +25,7 @@ SUBSYSTEM_DEF(garbage) //Queue var/list/queues - #ifdef TESTING + #ifdef LEGACY_REFERENCE_TRACKING var/list/reference_find_on_fail = list() var/list/reference_find_on_fail_types = list() #endif @@ -134,7 +134,7 @@ SUBSYSTEM_DEF(garbage) ++gcedlasttick ++totalgcs pass_counts[level]++ - #ifdef TESTING + #ifdef LEGACY_REFERENCE_TRACKING reference_find_on_fail -= refID //It's deleted we don't care anymore. #endif if (MC_TICK_CHECK) @@ -145,7 +145,9 @@ SUBSYSTEM_DEF(garbage) fail_counts[level]++ switch (level) if (GC_QUEUE_CHECK) - #ifdef TESTING + #ifdef REFERENCE_TRACKING + D.find_references() + #elif defined(LEGACY_REFERENCE_TRACKING) if(reference_find_on_fail[refID]) D.find_references() #ifdef GC_FAILURE_HARD_LOOKUP @@ -156,7 +158,19 @@ SUBSYSTEM_DEF(garbage) #endif var/type = D.type var/datum/qdel_item/I = items[type] + #ifdef TESTING + log_world("## TESTING: GC: -- \ref[D] | [type] was unable to be GC'd --") + for(var/c in GLOB.admins) //Using testing() here would fill the logs with ADMIN_VV garbage + var/client/admin = c + if(!check_rights_for(admin, R_ADMIN)) + continue + to_chat(admin, "## TESTING: GC: -- [ADMIN_VV(D)] | [type] was unable to be GC'd --") testing("GC: -- \ref[src] | [type] was unable to be GC'd --") + #endif + #ifdef REFERENCE_TRACKING + GLOB.deletion_failures += D //It should no longer be bothered by the GC, manual deletion only. + continue + #endif I.failures++ if (GC_QUEUE_HARDDELETE) HardDelete(D) @@ -181,7 +195,7 @@ SUBSYSTEM_DEF(garbage) var/gctime = world.time var/refid = "\ref[D]" -#ifdef TESTING +#ifdef LEGACY_REFERENCE_TRACKING if(reference_find_on_fail_types[D.type]) reference_find_on_fail["\ref[D]"] = TRUE #endif @@ -193,7 +207,7 @@ SUBSYSTEM_DEF(garbage) queue[refid] = gctime -#ifdef TESTING +#ifdef LEGACY_REFERENCE_TRACKING /datum/controller/subsystem/garbage/proc/add_type_to_findref(type) if(!ispath(type)) return "NOT A VAILD PATH" @@ -260,12 +274,6 @@ SUBSYSTEM_DEF(garbage) /datum/qdel_item/New(mytype) name = "[mytype]" -#ifdef TESTING -/proc/qdel_and_find_ref_if_fail(datum/D, force = FALSE) - SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE - qdel(D, force) -#endif - // Should be treated as a replacement for the 'del' keyword. // Datums passed to this will be given a chance to clean up references to allow the GC to collect them. /proc/qdel(datum/D, force=FALSE, ...) @@ -319,16 +327,13 @@ SUBSYSTEM_DEF(garbage) SSgarbage.Queue(D, GC_QUEUE_HARDDELETE) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. SSgarbage.HardDelete(D) - if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. + #ifdef LEGACY_REFERENCE_TRACKING + if (QDEL_HINT_FINDREFERENCE) //qdel will, if LEGACY_REFERENCE_TRACKING is enabled, display all references to this object, then queue the object for deletion. SSgarbage.Queue(D) - #ifdef TESTING - D.find_references() - #endif if (QDEL_HINT_IFFAIL_FINDREFERENCE) SSgarbage.Queue(D) - #ifdef TESTING SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE - #endif + #endif else #ifdef TESTING if(!I.no_hint) @@ -339,119 +344,6 @@ SUBSYSTEM_DEF(garbage) else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic") -#ifdef TESTING - -/datum/verb/find_refs() - set category = "Debug" - set name = "Find References" - set src in world - - find_references(FALSE) - -/datum/proc/find_references(skip_alert) - running_find_references = type - if(usr && usr.client) - if(usr.client.running_find_references) - testing("CANCELLED search for references to a [usr.client.running_find_references].") - usr.client.running_find_references = null - running_find_references = null - //restart the garbage collector - SSgarbage.can_fire = 1 - SSgarbage.next_fire = world.time + world.tick_lag - return - - if(!skip_alert) - if(alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") == "No") - running_find_references = null - return - - //this keeps the garbage collector from failing to collect objects being searched for in here - SSgarbage.can_fire = 0 - - if(usr && usr.client) - usr.client.running_find_references = type - - testing("Beginning search for references to a [type].") - last_find_references = world.time - - DoSearchVar(GLOB) //globals - for(var/datum/thing in world) //atoms (don't beleive it's lies) - DoSearchVar(thing, "World -> [thing]") - - for (var/datum/thing) //datums - DoSearchVar(thing, "World -> [thing]") - - for (var/client/thing) //clients - DoSearchVar(thing, "World -> [thing]") - - testing("Completed search for references to a [type].") - if(usr && usr.client) - usr.client.running_find_references = null - running_find_references = null - - //restart the garbage collector - SSgarbage.can_fire = 1 - SSgarbage.next_fire = world.time + world.tick_lag - -/datum/verb/qdel_then_find_references() - set category = "Debug" - set name = "qdel() then Find References" - set src in world - - qdel(src, TRUE) //Force. - if(!running_find_references) - find_references(TRUE) - -/datum/verb/qdel_then_if_fail_find_references() - set category = "Debug" - set name = "qdel() then Find References if GC failure" - set src in world - - qdel_and_find_ref_if_fail(src, TRUE) - -/datum/proc/DoSearchVar(X, Xname, recursive_limit = 64) - if(usr && usr.client && !usr.client.running_find_references) - return - if (!recursive_limit) - return - - if(istype(X, /datum)) - var/datum/D = X - if(D.last_find_references == last_find_references) - return - - D.last_find_references = last_find_references - var/list/L = D.vars - - for(var/varname in L) - if (varname == "vars") - continue - var/variable = L[varname] - - if(variable == src) - testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]") - - else if(islist(variable)) - DoSearchVar(variable, "[Xname] -> list", recursive_limit-1) - - else if(islist(X)) - var/normal = IS_NORMAL_LIST(X) - for(var/I in X) - if (I == src) - testing("Found [src.type] \ref[src] in list [Xname].") - - else if (I && !isnum(I) && normal && X[I] == src) - testing("Found [src.type] \ref[src] in list [Xname]\[[I]\]") - - else if (islist(I)) - DoSearchVar(I, "[Xname] -> list", recursive_limit-1) - -#ifndef FIND_REF_NO_CHECK_TICK - CHECK_TICK -#endif - -#endif - #ifdef TESTING /proc/writeDatumCount() var/list/datums = list() diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 348f9e6778..a91549ab4c 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -31,6 +31,9 @@ VV_DROPDOWN_OPTION(VV_HK_EXPOSE, "Show VV To Player") VV_DROPDOWN_OPTION(VV_HK_ADDCOMPONENT, "Add Component/Element") VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRAITS, "Modify Traits") + #ifdef REFERENCE_TRACKING + VV_DROPDOWN_OPTION(VV_HK_VIEW_REFERENCES, "View References") + #endif //This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks! //href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables! diff --git a/code/game/world.dm b/code/game/world.dm index 55333fb3e6..a342200b3d 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -12,6 +12,9 @@ GLOBAL_LIST(topic_status_cache) if (fexists(EXTOOLS)) call(EXTOOLS, "maptick_initialize")() enable_debugger() +#ifdef REFERENCE_TRACKING + enable_reference_tracking() +#endif world.Profile(PROFILE_START) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 718f9d4246..e9abb7db87 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -171,7 +171,11 @@ GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug()) /client/proc/cmd_display_overlay_log, /client/proc/reload_configuration, /datum/admins/proc/create_or_modify_area, - /client/proc/generate_wikichem_list //DO NOT PRESS UNLESS YOU WANT SUPERLAG +#ifdef REFERENCE_TRACKING + /datum/admins/proc/view_refs, + /datum/admins/proc/view_del_failures, +#endif + /client/proc/generate_wikichem_list, //DO NOT PRESS UNLESS YOU WANT SUPERLAG ) GLOBAL_PROTECT(admin_verbs_debug) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release)) diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm new file mode 100644 index 0000000000..70aac2f107 --- /dev/null +++ b/code/modules/admin/view_variables/reference_tracking.dm @@ -0,0 +1,225 @@ +#ifdef REFERENCE_TRACKING + +GLOBAL_LIST_EMPTY(deletion_failures) + +/world/proc/enable_reference_tracking() + if (fexists(EXTOOLS)) + call(EXTOOLS, "ref_tracking_initialize")() + +/proc/get_back_references(datum/D) + CRASH("/proc/get_back_references not hooked by extools, reference tracking will not function!") + +/proc/get_forward_references(datum/D) + CRASH("/proc/get_forward_references not hooked by extools, reference tracking will not function!") + +/proc/clear_references(datum/D) + return + +/datum/admins/proc/view_refs(atom/D in world) //it actually supports datums as well but byond no likey + set category = "Debug" + set name = "View References" + + if(!check_rights(R_DEBUG) || !D) + return + + var/list/backrefs = get_back_references(D) + if(isnull(backrefs)) + var/datum/browser/popup = new(usr, "ref_view", "

    Error
    ") + popup.set_content("Reference tracking not enabled") + popup.open(FALSE) + return + + var/list/frontrefs = get_forward_references(D) + var/list/dat = list() + dat += "

    References of \ref[D] - [D]


    \[Refresh\]
    " + dat += "

    Back references - these things hold references to this object.

    " + dat += "" + dat += "" + for(var/ref in backrefs) + var/datum/backreference = ref + if(isnull(backreference)) + dat += "" + if(istype(backreference)) + dat += "" + else if(islist(backreference)) + dat += "" + else + dat += "" + dat += "
    RefTypeVariable NameFollow
    GC'd Reference
    [REF(backreference)][backreference.type][backrefs[backreference]]\[Follow\]
    [REF(backreference)]list[backrefs[backreference]]\[Follow\]
    Weird reference type. Add more debugging checks.

    " + dat += "

    Forward references - this object is referencing those things.

    " + dat += "" + dat += "" + for(var/ref in frontrefs) + var/datum/backreference = frontrefs[ref] + dat += "" + dat += "
    Variable nameRefTypeFollow
    [ref][REF(backreference)][backreference.type]\[Follow\]

    " + dat = dat.Join() + + var/datum/browser/popup = new(usr, "ref_view", "
    References of \ref[D]
    ") + popup.set_content(dat) + popup.open(FALSE) + + +/datum/admins/proc/view_del_failures() + set category = "Debug" + set name = "View Deletion Failures" + + if(!check_rights(R_DEBUG)) + return + + var/list/dat = list("") + for(var/t in GLOB.deletion_failures) + if(isnull(t)) + dat += "" + continue + var/datum/thing = t + dat += "" + dat += "
    GC'd Reference | Clear Nulls
    \ref[thing] | [thing.type][thing.gc_destroyed ? " (destroyed)" : ""] [ADMIN_VV(thing)]

    " + dat = dat.Join() + + var/datum/browser/popup = new(usr, "del_failures", "
    Deletion Failures
    ") + popup.set_content(dat) + popup.open(FALSE) + + +/datum/proc/find_references() + testing("Beginning search for references to a [type].") + var/list/backrefs = get_back_references(src) + for(var/ref in backrefs) + if(isnull(ref)) + log_world("## TESTING: Datum reference found, but gone now.") + continue + if(islist(ref)) + log_world("## TESTING: Found [type] \ref[src] in list.") + continue + var/datum/datum_ref = ref + if(!istype(datum_ref)) + log_world("## TESTING: Found [type] \ref[src] in unknown type reference: [datum_ref].") + return + log_world("## TESTING: Found [type] \ref[src] in [datum_ref.type][datum_ref.gc_destroyed ? " (destroyed)" : ""]") + message_admins("Found [type] \ref[src] [ADMIN_VV(src)] in [datum_ref.type][datum_ref.gc_destroyed ? " (destroyed)" : ""] [ADMIN_VV(datum_ref)]") + testing("Completed search for references to a [type].") + +#endif + +#ifdef LEGACY_REFERENCE_TRACKING + +/datum/verb/legacy_find_refs() + set category = "Debug" + set name = "Find References" + set src in world + + find_references(FALSE) + + +/datum/proc/find_references_legacy(skip_alert) + running_find_references = type + if(usr?.client) + if(usr.client.running_find_references) + testing("CANCELLED search for references to a [usr.client.running_find_references].") + usr.client.running_find_references = null + running_find_references = null + //restart the garbage collector + SSgarbage.can_fire = TRUE + SSgarbage.next_fire = world.time + world.tick_lag + return + + if(!skip_alert && alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") != "Yes") + running_find_references = null + return + + //this keeps the garbage collector from failing to collect objects being searched for in here + SSgarbage.can_fire = FALSE + + if(usr?.client) + usr.client.running_find_references = type + + testing("Beginning search for references to a [type].") + last_find_references = world.time + + DoSearchVar(GLOB) //globals + for(var/datum/thing in world) //atoms (don't beleive its lies) + DoSearchVar(thing, "World -> [thing]") + + for(var/datum/thing) //datums + DoSearchVar(thing, "World -> [thing]") + + for(var/client/thing) //clients + DoSearchVar(thing, "World -> [thing]") + + testing("Completed search for references to a [type].") + if(usr?.client) + usr.client.running_find_references = null + running_find_references = null + + //restart the garbage collector + SSgarbage.can_fire = TRUE + SSgarbage.next_fire = world.time + world.tick_lag + + +/datum/verb/qdel_then_find_references() + set category = "Debug" + set name = "qdel() then Find References" + set src in world + + qdel(src, TRUE) //force a qdel + if(!running_find_references) + find_references(TRUE) + + +/datum/verb/qdel_then_if_fail_find_references() + set category = "Debug" + set name = "qdel() then Find References if GC failure" + set src in world + + qdel_and_find_ref_if_fail(src, TRUE) + + +/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 64) + if(usr?.client && !usr.client.running_find_references) + return + + if(!recursive_limit) + return + + if(istype(potential_container, /datum)) + var/datum/datum_container = potential_container + if(datum_container.last_find_references == last_find_references) + return + + datum_container.last_find_references = last_find_references + var/list/vars_list = datum_container.vars + + for(var/varname in vars_list) + if (varname == "vars") + continue + var/variable = vars_list[varname] + + if(variable == src) + testing("Found [type] \ref[src] in [datum_container.type]'s [varname] var. [container_name]") + + else if(islist(variable)) + DoSearchVar(variable, "[container_name] -> list", recursive_limit - 1) + + else if(islist(potential_container)) + var/normal = IS_NORMAL_LIST(potential_container) + for(var/element_in_list in potential_container) + if(element_in_list == src) + testing("Found [type] \ref[src] in list [container_name].") + + else if(element_in_list && !isnum(element_in_list) && normal && potential_container[element_in_list] == src) + testing("Found [type] \ref[src] in list [container_name]\[[element_in_list]\]") + + else if(islist(element_in_list)) + DoSearchVar(element_in_list, "[container_name] -> list", recursive_limit - 1) + + #ifndef FIND_REF_NO_CHECK_TICK + CHECK_TICK + #endif + + +/proc/qdel_and_find_ref_if_fail(datum/thing_to_del, force = FALSE) + SSgarbage.reference_find_on_fail[REF(thing_to_del)] = TRUE + qdel(thing_to_del, force) + +#endif diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index d6e4c2b944..9ee7103562 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -45,6 +45,16 @@ usr.client.admin_delete(target) if (isturf(src)) // show the turf that took its place usr.client.debug_variables(src) + return + #ifdef REFERENCE_TRACKING + if(href_list[VV_HK_VIEW_REFERENCES]) + var/datum/D = locate(href_list[VV_HK_TARGET]) + if(!D) + to_chat(usr, "Unable to locate item.") + return + usr.client.holder.view_refs(target) + return + #endif if(href_list[VV_HK_MARK]) usr.client.mark_datum(target) if(href_list[VV_HK_ADDCOMPONENT]) diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index abe445589f..a4dff725f7 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -61,6 +61,7 @@ "Set len" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SET_LENGTH), "Shuffle" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SHUFFLE), "Show VV To Player" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_EXPOSE), + "View References" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_VIEW_REFERENCES), "---" ) for(var/i in 1 to length(dropdownoptions)) diff --git a/tgstation.dme b/tgstation.dme index 61a7eec79e..11f8b22fdd 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1394,6 +1394,7 @@ #include "code\modules\admin\view_variables\mark_datum.dm" #include "code\modules\admin\view_variables\mass_edit_variables.dm" #include "code\modules\admin\view_variables\modify_variables.dm" +#include "code\modules\admin\view_variables\reference_tracking.dm" #include "code\modules\admin\view_variables\topic.dm" #include "code\modules\admin\view_variables\topic_basic.dm" #include "code\modules\admin\view_variables\topic_list.dm" From e82772dc44005af2b6ab24d82af839a03e8ff85f Mon Sep 17 00:00:00 2001 From: lolman360 Date: Wed, 19 Aug 2020 17:22:52 +1000 Subject: [PATCH 69/84] kekw --- code/modules/plumbing/plumbers/autohydro.dm | 17 ++++++++++++++--- .../chemistry/machinery/smoke_machine.dm | 5 +++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/code/modules/plumbing/plumbers/autohydro.dm b/code/modules/plumbing/plumbers/autohydro.dm index 5e4c618284..dbc70dfcf5 100644 --- a/code/modules/plumbing/plumbers/autohydro.dm +++ b/code/modules/plumbing/plumbers/autohydro.dm @@ -8,7 +8,7 @@ /obj/machinery/hydroponics/constructable/automagic/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/reagent_containers) ) + if(istype(O, /obj/item/reagent_containers)) return FALSE //avoid fucky wuckies ..() @@ -23,11 +23,22 @@ else CP.disable() -/obj/machinery/hydroponics/constructable/automagic/Initialize(mapload, bolt) +/obj/machinery/hydroponics/constructable/automagic/Destroy() . = ..() - AddComponent(/datum/component/plumbing/simple_demand, bolt) + STOP_PROCESSING(SSobj, src) + +/obj/machinery/hydroponics/constructable/automagic/Initialize(mapload) + . = ..() + START_PROCESSING(SSobj, src) create_reagents(100 , AMOUNT_VISIBLE) +/obj/machinery/hydroponics/constructable/automagic/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated)) + AddComponent(/datum/component/plumbing/simple_demand) + +/obj/machinery/hydroponics/constructable/proc/can_be_rotated(mob/user, rotation_type) + return !anchored /obj/machinery/hydroponics/constructable/automagic/process() if(reagents) diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index a539897c9d..fd9f9116b7 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -36,6 +36,11 @@ for(var/obj/item/stock_parts/matter_bin/B in component_parts) reagents.maximum_volume += REAGENTS_BASE_VOLUME * B.rating +/obj/machinery/smoke_machine/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated)) + AddComponent(/datum/component/plumbing/simple_demand) //this SURELY CANT' LEAD TO BAD THINGS HAPPENING. + /obj/machinery/smoke_machine/update_icon_state() if((!is_operational()) || (!on) || (reagents.total_volume == 0)) if (panel_open) From 1654a925b69e421daf76589bb601cf549bee14bd Mon Sep 17 00:00:00 2001 From: lolman360 Date: Wed, 19 Aug 2020 18:26:53 +1000 Subject: [PATCH 70/84] Update smoke_machine.dm --- code/modules/reagents/chemistry/machinery/smoke_machine.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index fd9f9116b7..d22523c4b8 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -41,6 +41,9 @@ AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated)) AddComponent(/datum/component/plumbing/simple_demand) //this SURELY CANT' LEAD TO BAD THINGS HAPPENING. +/obj/machinery/smoke_machine/proc/can_be_rotated(mob/user, rotation_type) + return !anchored + /obj/machinery/smoke_machine/update_icon_state() if((!is_operational()) || (!on) || (reagents.total_volume == 0)) if (panel_open) From 1982ad5ed1f13b421f4ba3fa7822458a4bbef6a6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 19 Aug 2020 08:59:40 -0500 Subject: [PATCH 71/84] Automatic changelog generation for PR #13210 [ci skip] --- html/changelogs/AutoChangeLog-pr-13210.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13210.yml diff --git a/html/changelogs/AutoChangeLog-pr-13210.yml b/html/changelogs/AutoChangeLog-pr-13210.yml new file mode 100644 index 0000000000..a43ae215f5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13210.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - balance: "Pirate threats are now announced as \"business propositions\", and their arrivals are now also announced properly." From 7a9796e7828e9db0540de1b6f5c9951e77913a4e Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Wed, 19 Aug 2020 17:05:27 +0200 Subject: [PATCH 72/84] minmax torture --- code/modules/reagents/chemistry/reagents/food_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index a6e78ae98c..18203f1a4c 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -132,8 +132,8 @@ "You're covered in boiling oil!") M.emote("scream") playsound(M, 'sound/machines/fryer/deep_fryer_emerge.ogg', 25, TRUE) - var/oil_damage = max((holder.chem_temp / fry_temperature) * 0.33,1) //Damage taken per unit - M.adjustFireLoss(oil_damage * max(reac_volume,20)) //Damage caps at 20 + var/oil_damage = min((holder.chem_temp / fry_temperature) * 0.33,1) //Damage taken per unit + M.adjustFireLoss(oil_damage * min(reac_volume,20)) //Damage caps at 20 else ..() return TRUE From 3d520782a3fc259a3319aded4d928af99c021996 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 19 Aug 2020 10:36:05 -0500 Subject: [PATCH 73/84] Automatic changelog generation for PR #13214 [ci skip] --- html/changelogs/AutoChangeLog-pr-13214.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13214.yml diff --git a/html/changelogs/AutoChangeLog-pr-13214.yml b/html/changelogs/AutoChangeLog-pr-13214.yml new file mode 100644 index 0000000000..8bbf605fe4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13214.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - bugfix: "The cooking oil damage formula is no longer scuffed." From 5414a8949c1cf3a501e1b4468c853d540f18349b Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 19 Aug 2020 08:50:26 -0700 Subject: [PATCH 74/84] Update text.dm --- code/modules/research/nanites/extra_settings/text.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/research/nanites/extra_settings/text.dm b/code/modules/research/nanites/extra_settings/text.dm index 56aa3dd07f..d3cad27bcf 100644 --- a/code/modules/research/nanites/extra_settings/text.dm +++ b/code/modules/research/nanites/extra_settings/text.dm @@ -10,6 +10,9 @@ /datum/nanite_extra_setting/text/get_copy() return new /datum/nanite_extra_setting/text(value) +/datum/nanite_extra_setting/text/get_value() + return html_encode(value) + /datum/nanite_extra_setting/text/get_frontend_list(name) return list(list( "name" = name, From a0823ea54b95f4f03565c6a0380f9234a6e4df3d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 20 Aug 2020 00:14:25 +0000 Subject: [PATCH 75/84] Automatic changelog compile [ci skip] --- html/changelog.html | 37 +++++++++++----------- html/changelogs/.all_changelog.yml | 11 +++++++ html/changelogs/AutoChangeLog-pr-13194.yml | 4 --- html/changelogs/AutoChangeLog-pr-13202.yml | 4 --- html/changelogs/AutoChangeLog-pr-13207.yml | 4 --- html/changelogs/AutoChangeLog-pr-13210.yml | 4 --- html/changelogs/AutoChangeLog-pr-13214.yml | 4 --- 7 files changed, 30 insertions(+), 38 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-13194.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13202.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13207.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13210.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13214.yml diff --git a/html/changelog.html b/html/changelog.html index 43bac219ab..c3f2151b35 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,25 @@ -->
    +

    20 August 2020

    +

    DeltaFire15 updated:

    +
      +
    • The cooking oil damage formula is no longer scuffed.
    • +
    • Changed the clockie help-link to lead to our own wiki.
    • +
    +

    Fikou updated:

    +
      +
    • admins can now do html in ahelps properly
    • +
    +

    Hatterhat updated:

    +
      +
    • Pirate threats are now announced as "business propositions", and their arrivals are now also announced properly.
    • +
    +

    tiramisuapimancer updated:

    +
      +
    • Ethereal hair is now their body color instead of accidentally white
    • +
    +

    18 August 2020

    DeltaFire15 updated:

      @@ -1416,24 +1435,6 @@
    • Adds the stray cargo pod event, where a cargo pod crashes into the station.
    • Adds the fugitives event, where fugitives are loose on the station, and it's the hunters jobs to capture them.
    - -

    18 June 2020

    -

    Detective-Google updated:

    -
      -
    • cog is now less the suck
    • -
    • couple little derpy bits
    • -
    • malf disk and illegal tech disk moved from ashwalker base (guaranteed) to tendrils (chance based)
    • -
    -

    SmArtKar updated:

    -
      -
    • Ported shuttles from beestation
    • -
    -

    timothyteakettle updated:

    -
      -
    • embeds got reworked, sticky tape was added, more bullets that ricochet also added
    • -
    • medbots can now be tipped over
    • -
    • added more medbot sounds
    • -
    GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index f8749c8dc5..559f77437d 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -26998,3 +26998,14 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - refactor: snowflake code for mutant bodypart selection has been rewritten to be ~14x shorter - tweak: meat type and horns can now be selected by any species +2020-08-20: + DeltaFire15: + - bugfix: The cooking oil damage formula is no longer scuffed. + - tweak: Changed the clockie help-link to lead to our own wiki. + Fikou: + - admin: admins can now do html in ahelps properly + Hatterhat: + - balance: Pirate threats are now announced as "business propositions", and their + arrivals are now also announced properly. + tiramisuapimancer: + - bugfix: Ethereal hair is now their body color instead of accidentally white diff --git a/html/changelogs/AutoChangeLog-pr-13194.yml b/html/changelogs/AutoChangeLog-pr-13194.yml deleted file mode 100644 index 8769abd6d5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13194.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - tweak: "Changed the clockie help-link to lead to our own wiki." diff --git a/html/changelogs/AutoChangeLog-pr-13202.yml b/html/changelogs/AutoChangeLog-pr-13202.yml deleted file mode 100644 index 8713ea2bd9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13202.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "tiramisuapimancer" -delete-after: True -changes: - - bugfix: "Ethereal hair is now their body color instead of accidentally white" diff --git a/html/changelogs/AutoChangeLog-pr-13207.yml b/html/changelogs/AutoChangeLog-pr-13207.yml deleted file mode 100644 index 9f354f34bb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13207.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fikou" -delete-after: True -changes: - - admin: "admins can now do html in ahelps properly" diff --git a/html/changelogs/AutoChangeLog-pr-13210.yml b/html/changelogs/AutoChangeLog-pr-13210.yml deleted file mode 100644 index a43ae215f5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13210.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Hatterhat" -delete-after: True -changes: - - balance: "Pirate threats are now announced as \"business propositions\", and their arrivals are now also announced properly." diff --git a/html/changelogs/AutoChangeLog-pr-13214.yml b/html/changelogs/AutoChangeLog-pr-13214.yml deleted file mode 100644 index 8bbf605fe4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13214.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - bugfix: "The cooking oil damage formula is no longer scuffed." From 23648a0c447579b6cf80ba77d0d8f4813aa655a6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 19 Aug 2020 21:56:16 -0500 Subject: [PATCH 76/84] Automatic changelog generation for PR #13208 [ci skip] --- html/changelogs/AutoChangeLog-pr-13208.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13208.yml diff --git a/html/changelogs/AutoChangeLog-pr-13208.yml b/html/changelogs/AutoChangeLog-pr-13208.yml new file mode 100644 index 0000000000..e6eed72515 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13208.yml @@ -0,0 +1,4 @@ +author: "timothyteakettle" +delete-after: True +changes: + - bugfix: "two snouts can once again be chosen in customization" From d12cb37d889670f210a52898bd91e5010da8f63d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 19 Aug 2020 23:04:01 -0500 Subject: [PATCH 77/84] Automatic changelog generation for PR #13183 [ci skip] --- html/changelogs/AutoChangeLog-pr-13183.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13183.yml diff --git a/html/changelogs/AutoChangeLog-pr-13183.yml b/html/changelogs/AutoChangeLog-pr-13183.yml new file mode 100644 index 0000000000..f93214e200 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13183.yml @@ -0,0 +1,6 @@ +author: "SmArtKar" +delete-after: True +changes: + - tweak: "RSD limitation is now 500 tiles" + - bugfix: "Fixed broken RSD sprites" + - config: "Removed that shuttle limit" From b2f16d794d2cdd50edd9e03a70421ee6fd922534 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 19 Aug 2020 23:11:15 -0500 Subject: [PATCH 78/84] Automatic changelog generation for PR #13211 [ci skip] --- html/changelogs/AutoChangeLog-pr-13211.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13211.yml diff --git a/html/changelogs/AutoChangeLog-pr-13211.yml b/html/changelogs/AutoChangeLog-pr-13211.yml new file mode 100644 index 0000000000..0c11c20a0d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13211.yml @@ -0,0 +1,4 @@ +author: "LetterN" +delete-after: True +changes: + - rscadd: "Updates and adds some of the tips" From ce10f90b1c25e114affc042c09ae9cabf98a07ab Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 20 Aug 2020 00:03:19 -0500 Subject: [PATCH 79/84] Automatic changelog generation for PR #13212 [ci skip] --- html/changelogs/AutoChangeLog-pr-13212.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13212.yml diff --git a/html/changelogs/AutoChangeLog-pr-13212.yml b/html/changelogs/AutoChangeLog-pr-13212.yml new file mode 100644 index 0000000000..0bc2d57909 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13212.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - admin: "added reftracking as a compile flag" From 88fb9d277a659d5cac47b2a2f1f0c975d2aa0e60 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 20 Aug 2020 21:58:54 +0100 Subject: [PATCH 80/84] fix lizard snouts (#13223) --- code/modules/client/preferences_savefile.dm | 6 +++++- .../mob/living/carbon/human/species_types/lizardpeople.dm | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 64c5e775b0..a8183e4940 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 34 +#define SAVEFILE_VERSION_MAX 35 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -200,6 +200,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["silicon_flavor_text"] = html_encode(features["silicon_flavor_text"]) features["ooc_notes"] = html_encode(features["ooc_notes"]) + if(current_version < 35) + if(S["species"] == "lizard") + features["mam_snouts"] = features["snout"] + /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index a55952d62f..4901fad892 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -11,7 +11,7 @@ mutanttail = /obj/item/organ/tail/lizard coldmod = 1.5 heatmod = 0.67 - mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "snout" = "Round", + mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "mam_snouts" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None") attack_verb = "slash" From 91764493fe7eea247f08f4278fa4e6bc64f24df6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 20 Aug 2020 15:58:57 -0500 Subject: [PATCH 81/84] Automatic changelog generation for PR #13223 [ci skip] --- html/changelogs/AutoChangeLog-pr-13223.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13223.yml diff --git a/html/changelogs/AutoChangeLog-pr-13223.yml b/html/changelogs/AutoChangeLog-pr-13223.yml new file mode 100644 index 0000000000..c54fe031f5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13223.yml @@ -0,0 +1,4 @@ +author: "timothyteakettle" +delete-after: True +changes: + - bugfix: "lizard snouts work again" From eb2dadfd0d813720636a0b3d5604ce5a47cc67aa Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 21 Aug 2020 00:12:48 +0000 Subject: [PATCH 82/84] Automatic changelog compile [ci skip] --- html/changelog.html | 51 +++++++++------------- html/changelogs/.all_changelog.yml | 12 +++++ html/changelogs/AutoChangeLog-pr-13183.yml | 6 --- html/changelogs/AutoChangeLog-pr-13208.yml | 4 -- html/changelogs/AutoChangeLog-pr-13211.yml | 4 -- html/changelogs/AutoChangeLog-pr-13212.yml | 4 -- html/changelogs/AutoChangeLog-pr-13223.yml | 4 -- 7 files changed, 33 insertions(+), 52 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-13183.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13208.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13211.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13212.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13223.yml diff --git a/html/changelog.html b/html/changelog.html index c3f2151b35..5a0e608cd6 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,27 @@ -->
    +

    21 August 2020

    +

    LetterN updated:

    +
      +
    • Updates and adds some of the tips
    • +
    +

    Putnam3145 updated:

    +
      +
    • added reftracking as a compile flag
    • +
    +

    SmArtKar updated:

    +
      +
    • RSD limitation is now 500 tiles
    • +
    • Fixed broken RSD sprites
    • +
    • Removed that shuttle limit
    • +
    +

    timothyteakettle updated:

    +
      +
    • two snouts can once again be chosen in customization
    • +
    • lizard snouts work again
    • +
    +

    20 August 2020

    DeltaFire15 updated:

      @@ -1405,36 +1426,6 @@
      • Removed unsavory things from the vent clog event
      - -

      19 June 2020

      -

      Bhijn updated:

      -
        -
      • Atmos can no longer become completely bricked
      • -
      -

      Funce updated:

      -
        -
      • Square root circuit should now actually work.
      • -
      -

      SmArtKar updated:

      -
        -
      • Fixed my runtimes
      • -
      -

      TheSpaghetti updated:

      -
        -
      • more insectoid insects
      • -
      -

      kevinz000 updated:

      -
        -
      • bay/polaris style say_emphasis has been added. You can now |italicize| _underline_ and +bold+ your messages.
      • -
      -

      timothyteakettle updated:

      -
        -
      • Adds the brain trauma event, where one player gets a random brain trauma!
      • -
      • Adds the wisdom cow event, where the wisdom cow appears on the station!
      • -
      • Adds the fake virus event, where people get fake virus symptoms.
      • -
      • Adds the stray cargo pod event, where a cargo pod crashes into the station.
      • -
      • Adds the fugitives event, where fugitives are loose on the station, and it's the hunters jobs to capture them.
      • -
    GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 559f77437d..10477b56d3 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -27009,3 +27009,15 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. arrivals are now also announced properly. tiramisuapimancer: - bugfix: Ethereal hair is now their body color instead of accidentally white +2020-08-21: + LetterN: + - rscadd: Updates and adds some of the tips + Putnam3145: + - admin: added reftracking as a compile flag + SmArtKar: + - tweak: RSD limitation is now 500 tiles + - bugfix: Fixed broken RSD sprites + - config: Removed that shuttle limit + timothyteakettle: + - bugfix: two snouts can once again be chosen in customization + - bugfix: lizard snouts work again diff --git a/html/changelogs/AutoChangeLog-pr-13183.yml b/html/changelogs/AutoChangeLog-pr-13183.yml deleted file mode 100644 index f93214e200..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13183.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - tweak: "RSD limitation is now 500 tiles" - - bugfix: "Fixed broken RSD sprites" - - config: "Removed that shuttle limit" diff --git a/html/changelogs/AutoChangeLog-pr-13208.yml b/html/changelogs/AutoChangeLog-pr-13208.yml deleted file mode 100644 index e6eed72515..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13208.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "timothyteakettle" -delete-after: True -changes: - - bugfix: "two snouts can once again be chosen in customization" diff --git a/html/changelogs/AutoChangeLog-pr-13211.yml b/html/changelogs/AutoChangeLog-pr-13211.yml deleted file mode 100644 index 0c11c20a0d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13211.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LetterN" -delete-after: True -changes: - - rscadd: "Updates and adds some of the tips" diff --git a/html/changelogs/AutoChangeLog-pr-13212.yml b/html/changelogs/AutoChangeLog-pr-13212.yml deleted file mode 100644 index 0bc2d57909..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13212.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - admin: "added reftracking as a compile flag" diff --git a/html/changelogs/AutoChangeLog-pr-13223.yml b/html/changelogs/AutoChangeLog-pr-13223.yml deleted file mode 100644 index c54fe031f5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13223.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "timothyteakettle" -delete-after: True -changes: - - bugfix: "lizard snouts work again" From a9ce548755c118d21c94cb15749d0b5053bbc294 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 20 Aug 2020 23:32:29 -0500 Subject: [PATCH 83/84] Automatic changelog generation for PR #13178 [ci skip] --- html/changelogs/AutoChangeLog-pr-13178.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13178.yml diff --git a/html/changelogs/AutoChangeLog-pr-13178.yml b/html/changelogs/AutoChangeLog-pr-13178.yml new file mode 100644 index 0000000000..d6765a7694 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13178.yml @@ -0,0 +1,5 @@ +author: "Time-Green (copypasta'd by lolman360)" +delete-after: True +changes: + - rscadd: "plumbing" + - rscadd: "automatic hydro trays" From 559c0d7024293c5b8c4bef981677da867e7674a9 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 22 Aug 2020 00:12:22 +0000 Subject: [PATCH 84/84] Automatic changelog compile [ci skip] --- html/changelog.html | 19 +++++++------------ html/changelogs/.all_changelog.yml | 4 ++++ html/changelogs/AutoChangeLog-pr-13178.yml | 5 ----- 3 files changed, 11 insertions(+), 17 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-13178.yml diff --git a/html/changelog.html b/html/changelog.html index 5a0e608cd6..ab4eb79cd6 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,13 @@ -->
    +

    22 August 2020

    +

    Time-Green (copypasta'd by lolman360) updated:

    +
      +
    • plumbing
    • +
    • automatic hydro trays
    • +
    +

    21 August 2020

    LetterN updated:

      @@ -1414,18 +1421,6 @@
      • calculations for punch hit chance has been drastically buffed in favor of the attacker.
      - -

      20 June 2020

      -

      LetterN updated:

      -
        -
      • Asset cache from tg
      • -
      • Made the map viewer not look bad
      • -
      • Admin matrix right-bracket
      • -
      -

      bunny232 updated:

      -
        -
      • Removed unsavory things from the vent clog event
      • -
    GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 10477b56d3..e03cc15b14 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -27021,3 +27021,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. timothyteakettle: - bugfix: two snouts can once again be chosen in customization - bugfix: lizard snouts work again +2020-08-22: + Time-Green (copypasta'd by lolman360): + - rscadd: plumbing + - rscadd: automatic hydro trays diff --git a/html/changelogs/AutoChangeLog-pr-13178.yml b/html/changelogs/AutoChangeLog-pr-13178.yml deleted file mode 100644 index d6765a7694..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13178.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Time-Green (copypasta'd by lolman360)" -delete-after: True -changes: - - rscadd: "plumbing" - - rscadd: "automatic hydro trays"