diff --git a/baystation12.dme b/baystation12.dme
index 32628ed0ae..d7a1750493 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1615,6 +1615,7 @@
#include "code\modules\research\circuitprinter.dm"
#include "code\modules\research\designs.dm"
#include "code\modules\research\destructive_analyzer.dm"
+#include "code\modules\research\mechfab_designs.dm"
#include "code\modules\research\message_server.dm"
#include "code\modules\research\protolathe.dm"
#include "code\modules\research\rd-readme.dm"
diff --git a/code/__defines/atmos.dm b/code/__defines/atmos.dm
index ef41eb97f5..e93bf45085 100644
--- a/code/__defines/atmos.dm
+++ b/code/__defines/atmos.dm
@@ -86,3 +86,10 @@
//Flags for zone sleeping
#define ZONE_ACTIVE 1
#define ZONE_SLEEPING 0
+
+// Defines how much of certain gas do the Atmospherics tanks start with. Values are in kpa per tile (assuming 20C)
+#define ATMOSTANK_NITROGEN 90000 // A lot of N2 is needed to produce air mix, that's why we keep 90MPa of it
+#define ATMOSTANK_OXYGEN 40000 // O2 is also important for airmix, but not as much as N2 as it's only 21% of it.
+#define ATMOSTANK_CO2 25000 // CO2 and PH are not critically important for station, only for toxins and alternative coolants, no need to store a lot of those.
+#define ATMOSTANK_PHORON 25000
+#define ATMOSTANK_NITROUSOXIDE 10000 // N2O doesn't have a real useful use, i guess it's on station just to allow refilling of sec's riot control canisters?
\ No newline at end of file
diff --git a/code/__defines/research.dm b/code/__defines/research.dm
index 0cfc2aded6..d40722d0cf 100644
--- a/code/__defines/research.dm
+++ b/code/__defines/research.dm
@@ -14,5 +14,5 @@
#define IMPRINTER 0x1 //For circuits. Uses glass/chemicals.
#define PROTOLATHE 0x2 //New stuff. Uses glass/metal/chemicals
-#define MECHFAB 0x4 //Remember, objects utilising this flag should have construction_time and construction_cost vars.
+#define MECHFAB 0x4 //Mechfab
#define CHASSIS 0x8 //For protolathe, but differently
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 366fcbbbc1..69c891d2a4 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -1053,12 +1053,10 @@ proc/get_mob_with_client_list()
//gets the turf the atom is located in (or itself, if it is a turf).
//returns null if the atom is not in a turf.
-/proc/get_turf(atom/location)
- while(location)
- if(isturf(location))
- return location
- location = location.loc
- return null
+/proc/get_turf(atom/A)
+ if(!istype(A)) return
+ for(A, A && !isturf(A), A=A.loc);
+ return A
/proc/get(atom/loc, type)
while(loc)
diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm
index 8916beb413..6662b20b67 100644
--- a/code/game/machinery/door_control.dm
+++ b/code/game/machinery/door_control.dm
@@ -65,7 +65,7 @@
use_power(5)
icon_state = "doorctrl1"
desiredstate = !desiredstate
- trigger()
+ trigger(user)
spawn(15)
update_icon()
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 2fa0281ecd..94f9bc70df 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -623,7 +623,6 @@ var/list/turret_icons
else
A = new projectile(loc)
playsound(loc, shot_sound, 75, 1)
- A.original = target
// Lethal/emagged turrets use twice the power due to higher energy beams
// Emagged turrets again use twice as much power due to higher firing rates
@@ -631,19 +630,15 @@ var/list/turret_icons
//Turrets aim for the center of mass by default.
//If the target is grabbing someone then the turret smartly aims for extremities
+ var/def_zone
var/obj/item/weapon/grab/G = locate() in target
if(G && G.state >= GRAB_NECK) //works because mobs are currently not allowed to upgrade to NECK if they are grabbing two people.
- A.def_zone = pick("head", "l_hand", "r_hand", "l_foot", "r_foot", "l_arm", "r_arm", "l_leg", "r_leg")
+ def_zone = pick("head", "l_hand", "r_hand", "l_foot", "r_foot", "l_arm", "r_arm", "l_leg", "r_leg")
else
- A.def_zone = pick("chest", "groin")
+ def_zone = pick("chest", "groin")
//Shooting Code:
- A.current = T
- A.starting = T
- A.yo = U.y - T.y
- A.xo = U.x - T.x
- spawn(1)
- A.process()
+ A.launch(target, def_zone)
/datum/turret_checks
var/enabled
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 8ac413b605..a14b5d2e9a 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -176,7 +176,7 @@
return
return
-
+
/obj/machinery/vending/emag_act(var/remaining_charges, var/mob/user)
if (!emagged)
src.emagged = 1
@@ -235,26 +235,25 @@
nanomanager.update_uis(src)
return
else if(istype(W, /obj/item/weapon/wrench))
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ if(anchored)
+ user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
+ else
+ user.visible_message("[user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
+
if(do_after(user, 20))
if(!src) return
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- switch (anchored)
- if (0)
- anchored = 1
- user.visible_message("\The [user] tightens the bolts securing \the [src] to the floor.", "You tighten the bolts securing \the [src] to the floor.")
- if (1)
- user.visible_message("\The [user] unfastens the bolts securing \the [src] to the floor.", "You unfasten the bolts securing \the [src] to the floor.")
- anchored = 0
+ user << "You [anchored? "un" : ""]secured \the [src]!"
+ anchored = !anchored
return
- else if(src.panel_open)
+ else
for(var/datum/data/vending_product/R in product_records)
if(istype(W, R.product_path))
stock(R, user)
qdel(W)
-
- else
+ return
..()
/**
@@ -560,7 +559,7 @@
/obj/machinery/vending/proc/stock(var/datum/data/vending_product/R, var/mob/user)
if(src.panel_open)
- user << "You stock \the [src] with \a [R.product_name]"
+ user << "You insert \the [src] in the product receptor."
R.amount++
nanomanager.update_uis(src)
@@ -692,7 +691,8 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 6,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 4,
/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 4,/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 4,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 4,/obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 8,
- /obj/item/weapon/reagent_containers/food/drinks/cans/cola = 8, /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/cola = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/space_up = 5,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind = 5, /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 15,
/obj/item/weapon/reagent_containers/food/drinks/flask/barflask = 2, /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask = 2,
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 30,/obj/item/weapon/reagent_containers/food/drinks/ice = 9,
/obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor = 2,/obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao = 2,
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index 607e8f445c..db1cb3d004 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -7,8 +7,6 @@
icon_state = "mecha_equip"
force = 5
origin_tech = list(TECH_MATERIAL = 2)
- construction_time = 100
- construction_cost = list(DEFAULT_WALL_MATERIAL=10000)
var/equip_cooldown = 0
var/equip_ready = 1
var/energy_drain = 0
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index 498a9dfff6..98a49af28a 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -6,7 +6,6 @@
origin_tech = list(TECH_DATA = 2, TECH_BIO = 3)
energy_drain = 20
range = MELEE
- construction_cost = list(DEFAULT_WALL_MATERIAL=5000,"glass"=10000)
equip_cooldown = 20
var/mob/living/carbon/occupant = null
var/datum/global_iterator/pr_mech_sleeper
@@ -384,8 +383,6 @@
range = MELEE|RANGED
equip_cooldown = 10
origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3)
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=3000,"glass"=2000)
required_type = /obj/mecha/medical
New()
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 4b9a17483f..ca51d1e1b3 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -126,9 +126,8 @@
/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill
name = "diamond drill"
desc = "This is an upgraded version of the drill that'll pierce the heavens! (Can be attached to: Combat and Engineering Exosuits)"
- icon_state = "mecha_diamond_drill"
- origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3)
- construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"diamond"=6500)
+ icon_state = "mecha_diamond_drill"
+ origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3)
equip_cooldown = 20
force = 15
@@ -255,8 +254,6 @@
equip_cooldown = 10
energy_drain = 250
range = MELEE|RANGED
- construction_time = 1200
- construction_cost = list(DEFAULT_WALL_MATERIAL=30000,"phoron"=25000,"silver"=20000,"gold"=20000)
var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock.
var/disabled = 0 //malf
@@ -506,7 +503,6 @@
equip_cooldown = 10
energy_drain = 50
range = 0
- construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"silver"=5000)
var/deflect_coeff = 1.15
var/damage_coeff = 0.8
@@ -556,7 +552,6 @@
equip_cooldown = 10
energy_drain = 50
range = 0
- construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"gold"=5000)
var/deflect_coeff = 1.15
var/damage_coeff = 0.8
@@ -627,7 +622,6 @@
equip_cooldown = 20
energy_drain = 100
range = 0
- construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"gold"=1000,"silver"=2000,"glass"=5000)
var/health_boost = 2
var/datum/global_iterator/pr_repair_droid
var/icon/droid_overlay
@@ -722,7 +716,6 @@
equip_cooldown = 10
energy_drain = 0
range = 0
- construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"gold"=2000,"silver"=3000,"glass"=2000)
var/datum/global_iterator/pr_energy_relay
var/coeff = 100
var/list/use_channels = list(EQUIP,ENVIRON,LIGHT)
@@ -839,7 +832,6 @@
equip_cooldown = 10
energy_drain = 0
range = MELEE
- construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"silver"=500,"glass"=1000)
var/datum/global_iterator/pr_mech_generator
var/coeff = 100
var/obj/item/stack/material/fuel
@@ -972,9 +964,8 @@
/obj/item/mecha_parts/mecha_equipment/generator/nuclear
name = "\improper ExoNuclear reactor"
desc = "Generates power using uranium. Pollutes the environment."
- icon_state = "tesla"
- origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3)
- construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"silver"=500,"glass"=1000)
+ icon_state = "tesla"
+ origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3)
max_fuel = 50000
fuel_per_cycle_idle = 10
fuel_per_cycle_active = 30
@@ -1072,7 +1063,6 @@
origin_tech = list(TECH_ENGINEERING = 1, TECH_BIO = 1)
energy_drain = 10
range = MELEE
- construction_cost = list(DEFAULT_WALL_MATERIAL=5000,"glass"=5000)
equip_cooldown = 20
var/mob/living/carbon/occupant = null
var/door_locked = 1
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index f034f27550..913f9acb72 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -274,7 +274,6 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang//Because I am a heartless bastard -Sieve
name = "\improper SOP-6 grenade launcher"
projectile = /obj/item/weapon/grenade/flashbang/clusterbang
- construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"gold"=6000,"uranium"=6000)
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/get_equip_info()//Limited version of the clusterbang launcher that can't reload
return "* [chassis.selected==src?"":""][src.name][chassis.selected==src?"":""]\[[src.projectiles]\]"
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 3fb9ed8bf4..7fc5f17e86 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -1,126 +1,29 @@
-/////////////////////////////
-///// Part Fabricator ///////
-/////////////////////////////
-
/obj/machinery/mecha_part_fabricator
icon = 'icons/obj/robotics.dmi'
icon_state = "fab-idle"
name = "Exosuit Fabricator"
- desc = "Nothing is being built."
+ desc = "A machine used for construction of robotcs and mechas."
density = 1
anchored = 1
use_power = 1
idle_power_usage = 20
active_power_usage = 5000
req_access = list(access_robotics)
- var/current_manufacturer
- var/time_coeff = 1.5 //can be upgraded with research
- var/resource_coeff = 1.5 //can be upgraded with research
- var/list/resources = list(
- DEFAULT_WALL_MATERIAL=0,
- "glass"=0,
- "gold"=0,
- "silver"=0,
- "diamond"=0,
- "phoron"=0,
- "uranium"=0,
- )
+
+ var/speed = 1
+ var/mat_efficiency = 1
+ var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0)
var/res_max_amount = 200000
+
var/datum/research/files
- var/id
- var/sync = 0
- var/part_set
- var/obj/being_built
- var/list/queue = list()
- var/processing_queue = 0
- var/screen = "main"
- var/opened = 0
- var/temp
- var/output_dir = SOUTH //the direction relative to the fabber at which completed parts appear.
- var/list/part_sets = list( //set names must be unique
- "Robot"=list(
- /obj/item/robot_parts/robot_suit,
- /obj/item/robot_parts/chest,
- /obj/item/robot_parts/head,
- /obj/item/robot_parts/l_arm,
- /obj/item/robot_parts/r_arm,
- /obj/item/robot_parts/l_leg,
- /obj/item/robot_parts/r_leg,
- /obj/item/robot_parts/robot_component/binary_communication_device,
- /obj/item/robot_parts/robot_component/radio,
- /obj/item/robot_parts/robot_component/actuator,
- /obj/item/robot_parts/robot_component/diagnosis_unit,
- /obj/item/robot_parts/robot_component/camera,
- /obj/item/robot_parts/robot_component/armour
- ),
- "Ripley"=list(
- /obj/item/mecha_parts/chassis/ripley,
- /obj/item/mecha_parts/part/ripley_torso,
- /obj/item/mecha_parts/part/ripley_left_arm,
- /obj/item/mecha_parts/part/ripley_right_arm,
- /obj/item/mecha_parts/part/ripley_left_leg,
- /obj/item/mecha_parts/part/ripley_right_leg
- ),
-// "Hoverpod"=list(
-// /obj/structure/largecrate/hoverpod // Doesn't work, even with required vars. Why? - Gamerofthegame
-// ),
- "Odysseus"=list(
- /obj/item/mecha_parts/chassis/odysseus,
- /obj/item/mecha_parts/part/odysseus_torso,
- /obj/item/mecha_parts/part/odysseus_head,
- /obj/item/mecha_parts/part/odysseus_left_arm,
- /obj/item/mecha_parts/part/odysseus_right_arm,
- /obj/item/mecha_parts/part/odysseus_left_leg,
- /obj/item/mecha_parts/part/odysseus_right_leg
- ),
+ var/list/datum/design/queue = list()
+ var/progress = 0
+ var/busy = 0
- "Gygax"=list(
- /obj/item/mecha_parts/chassis/gygax,
- /obj/item/mecha_parts/part/gygax_torso,
- /obj/item/mecha_parts/part/gygax_head,
- /obj/item/mecha_parts/part/gygax_left_arm,
- /obj/item/mecha_parts/part/gygax_right_arm,
- /obj/item/mecha_parts/part/gygax_left_leg,
- /obj/item/mecha_parts/part/gygax_right_leg,
- /obj/item/mecha_parts/part/gygax_armour
- ),
- "Durand"=list(
- /obj/item/mecha_parts/chassis/durand,
- /obj/item/mecha_parts/part/durand_torso,
- /obj/item/mecha_parts/part/durand_head,
- /obj/item/mecha_parts/part/durand_left_arm,
- /obj/item/mecha_parts/part/durand_right_arm,
- /obj/item/mecha_parts/part/durand_left_leg,
- /obj/item/mecha_parts/part/durand_right_leg,
- /obj/item/mecha_parts/part/durand_armour
- ),
- "Exosuit Equipment"=list(
- /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,
- /obj/item/mecha_parts/mecha_equipment/tool/drill,
- /obj/item/mecha_parts/mecha_equipment/tool/extinguisher,
- /obj/item/mecha_parts/mecha_equipment/tool/cable_layer,
- /obj/item/mecha_parts/mecha_equipment/tool/sleeper,
- /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun,
- /obj/item/mecha_parts/mecha_equipment/tool/passenger,
- /obj/item/mecha_parts/chassis/firefighter,
- ///obj/item/mecha_parts/mecha_equipment/repair_droid,
- /obj/item/mecha_parts/mecha_equipment/generator,
- ///obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING
- /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,
- /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
- ),
-
- "Robotic Upgrade Modules" = list(
- /obj/item/borg/upgrade/reset,
- /obj/item/borg/upgrade/rename,
- /obj/item/borg/upgrade/restart,
- /obj/item/borg/upgrade/vtec,
- /obj/item/borg/upgrade/tasercooler,
- /obj/item/borg/upgrade/jetpack
- ),
-
- "Misc"=list(/obj/item/mecha_parts/mecha_tracking)
- )
+ var/list/categories = list()
+ var/category = null
+ var/manufacturer = null
+ var/sync_message = ""
/obj/machinery/mecha_part_fabricator/New()
..()
@@ -134,643 +37,129 @@
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
RefreshParts()
- // part_sets["Cyborg Upgrade Modules"] = typesof(/obj/item/borg/upgrade/) - /obj/item/borg/upgrade/ // Eh. This does it dymaically, but to support having the items referenced otherwhere in the code but not being constructable, going to do it manaully.
-
- for(var/part_set in part_sets)
- convert_part_set(part_set)
files = new /datum/research(src) //Setup the research data holder.
- /*
- if(!id)
- for(var/obj/machinery/r_n_d/server/centcom/S in world)
- S.initialize()
- break
- */
return
/obj/machinery/mecha_part_fabricator/initialize()
- current_manufacturer = basic_robolimb.company
+ manufacturer = basic_robolimb.company
+ update_categories()
+
+/obj/machinery/mecha_part_fabricator/process()
+ ..()
+ if(stat)
+ return
+ if(busy)
+ use_power = 2
+ progress += speed
+ check_build()
+ else
+ use_power = 1
+ update_icon()
+
+/obj/machinery/mecha_part_fabricator/update_icon()
+ overlays.Cut()
+ if(panel_open)
+ icon_state = "fab-o"
+ else
+ icon_state = "fab-idle"
+ if(busy)
+ overlays += "fab-active"
+
+/obj/machinery/mecha_part_fabricator/dismantle()
+ for(var/f in materials)
+ eject_materials(f, -1)
+ ..()
/obj/machinery/mecha_part_fabricator/RefreshParts()
- var/T = 0
+ res_max_amount = 0
for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
+ res_max_amount += M.rating * 100000 // 200k -> 600k
+ var/T = 0
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
T += M.rating
- res_max_amount = (187500+(T * 37500))
- T = 0
- for(var/obj/item/weapon/stock_parts/micro_laser/Ma in component_parts)
- T += Ma.rating
- if(T >= 1)
- T -= 1
- var/diff
- diff = round(initial(resource_coeff) - (initial(resource_coeff)*(T))/25,0.01)
- if(resource_coeff!=diff)
- resource_coeff = diff
- T = 0
- for(var/obj/item/weapon/stock_parts/manipulator/Ml in component_parts)
- T += Ml.rating
- if(T>= 1)
- T -= 1
- diff = round(initial(time_coeff) - (initial(time_coeff)*(T))/25,0.01)
- if(time_coeff!=diff)
- time_coeff = diff
+ mat_efficiency = 1 - (T - 1) / 4 // 1 -> 0.5
+ for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts) // Not resetting T is intended; speed is affected by both
+ T += M.rating
+ speed = T / 2 // 1 -> 3
-/obj/machinery/mecha_part_fabricator/Destroy()
- for(var/atom/A in src)
- qdel(A)
- ..()
- return
-
-/obj/machinery/mecha_part_fabricator/proc/operation_allowed(mob/M)
- if(isrobot(M) || isAI(M))
- return 1
- if(!istype(req_access) || !req_access.len)
- return 1
- else if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- for(var/ID in list(H.get_active_hand(), H.wear_id, H.belt))
- if(src.check_access(ID))
- return 1
- M << "You don't have required permissions to use [src]"
- return 0
-
-/obj/machinery/mecha_part_fabricator/proc/convert_part_set(set_name as text)
- var/list/parts = part_sets[set_name]
- if(istype(parts, /list))
- for(var/i=1;i<=parts.len;i++)
- var/path = parts[i]
- var/part = new path(src)
- if(part)
- parts[i] = part
- //debug below
- if(!istype(parts[i],/obj/item)) return 0
- return
-
-
-/obj/machinery/mecha_part_fabricator/proc/add_part_set(set_name as text,parts=null)
- if(set_name in part_sets)//attempt to create duplicate set
- return 0
- if(isnull(parts))
- part_sets[set_name] = list()
- else
- part_sets[set_name] = parts
- convert_part_set(set_name)
- return 1
-
-/obj/machinery/mecha_part_fabricator/proc/add_part_to_set(set_name as text,part)
- if(!part) return 0
- src.add_part_set(set_name)//if no "set_name" set exists, create
- var/list/part_set = part_sets[set_name]
- var/atom/apart
- if(ispath(part))
- apart = new part(src)
- else
- apart = part
- if(!istype(apart)) return 0
- for(var/obj/O in part_set)
- if(O.type == apart.type)
- qdel(apart)
- return 0
- part_set[++part_set.len] = apart
- return 1
-
-/obj/machinery/mecha_part_fabricator/proc/remove_part_set(set_name as text)
- for(var/i=1,i<=part_sets.len,i++)
- if(part_sets[i]==set_name)
- part_sets.Cut(i,++i)
- return
-/*
- proc/sanity_check()
- for(var/p in resources)
- var/index = resources.Find(p)
- index = resources.Find(p, ++index)
- if(index) //duplicate resource
- world << "Duplicate resource definition for [src](\ref[src])"
- return 0
- for(var/set_name in part_sets)
- var/index = part_sets.Find(set_name)
- index = part_sets.Find(set_name, ++index)
- if(index) //duplicate part set
- world << "Duplicate part set definition for [src](\ref[src])"
- return 0
- return 1
-*/
-
-/obj/machinery/mecha_part_fabricator/proc/output_parts_list(set_name)
- var/output = ""
- var/list/part_set = listgetindex(part_sets, set_name)
- if(istype(part_set))
- for(var/obj/item/part in part_set)
- var/resources_available = check_resources(part)
- output += "
"
- return output
-
-/obj/machinery/mecha_part_fabricator/proc/output_part_info(var/obj/item/part)
- var/output = "[part.name] (Cost: [output_part_cost(part)]) [get_construction_time_w_coeff(part)/10]sec"
- return output
-
-/obj/machinery/mecha_part_fabricator/proc/output_part_cost(var/obj/item/part)
- var/i = 0
- var/output
- if(part.vars.Find("construction_time") && part.vars.Find("construction_cost"))//The most efficient way to go about this. Not all objects have these vars, but if they don't then they CANNOT be made by the mech fab. Doing it this way reduces a major amount of typecasting and switches, while cutting down maintenece for them as well -Sieve
- for(var/c in part:construction_cost)//The check should ensure that anything without the var doesn't make it to this point
- if(c in resources)
- output += "[i?" | ":null][get_resource_cost_w_coeff(part,c)] [c]"
- i++
- return output
- else
- return 0
-
-/obj/machinery/mecha_part_fabricator/proc/output_available_resources()
- var/output
- for(var/resource in resources)
- var/amount = min(res_max_amount, resources[resource])
- output += "[resource]: [amount] cm³"
- if(amount>0)
- output += " - Remove \[1\] | \[10\] | \[All\]"
- output += "
"
- return output
-
-/obj/machinery/mecha_part_fabricator/proc/remove_resources(var/obj/item/part)
-//Be SURE to add any new equipment to this switch, but don't be suprised if it spits out children objects
- if(part.vars.Find("construction_time") && part.vars.Find("construction_cost"))
- for(var/resource in part:construction_cost)
- if(resource in src.resources)
- src.resources[resource] -= get_resource_cost_w_coeff(part,resource)
- else
+/obj/machinery/mecha_part_fabricator/attack_hand(var/mob/user)
+ if(..())
return
-
-/obj/machinery/mecha_part_fabricator/proc/check_resources(var/obj/item/part)
-// if(istype(part, /obj/item/robot_parts) || istype(part, /obj/item/mecha_parts) || istype(part,/obj/item/borg/upgrade))
-//Be SURE to add any new equipment to this switch, but don't be suprised if it spits out children objects
- if(part.vars.Find("construction_time") && part.vars.Find("construction_cost"))
- for(var/resource in part:construction_cost)
- if(resource in src.resources)
- if(src.resources[resource] < get_resource_cost_w_coeff(part,resource))
- return 0
- return 1
- else
- return 0
-
-/obj/machinery/mecha_part_fabricator/proc/build_part(var/obj/item/part)
- if(!part) return
-
- // critical exploit prevention, do not remove unless you replace it -walter0o
- if( !(locate(part, src.contents)) || !(part.vars.Find("construction_time")) || !(part.vars.Find("construction_cost")) ) // these 3 are the current requirements for an object being buildable by the mech_fabricator
+ if(!allowed(user))
return
+ ui_interact(user)
- if(current_manufacturer)
- src.being_built = new part.type(src, current_manufacturer)
- else
- src.being_built = new part.type(src, basic_robolimb.company)
+/obj/machinery/mecha_part_fabricator/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ var/data[0]
- src.desc = "It's building [src.being_built]."
- src.remove_resources(part)
- src.overlays += "fab-active"
- src.use_power = 2
- src.updateUsrDialog()
- sleep(get_construction_time_w_coeff(part))
- src.use_power = 1
- src.overlays -= "fab-active"
- src.desc = initial(src.desc)
- if(being_built)
- src.being_built.Move(get_step(src,output_dir))
- src.visible_message("\icon[src] [src] beeps, \"The following has been completed: [src.being_built] is built\".")
- src.being_built = null
- src.updateUsrDialog()
- return 1
+ var/datum/design/current = queue.len ? queue[1] : null
+ if(current)
+ data["current"] = current.name
+ data["queue"] = get_queue_names()
+ data["buildable"] = get_build_options()
+ data["category"] = category
+ data["categories"] = categories
+ if(all_robolimbs)
+ var/list/T = list()
+ for(var/A in all_robolimbs)
+ var/datum/robolimb/R = all_robolimbs[A]
+ T += list(list("id" = A, "company" = R.company))
+ data["manufacturers"] = T
+ data["manufacturer"] = manufacturer
+ data["materials"] = get_materials()
+ data["maxres"] = res_max_amount
+ data["sync"] = sync_message
+ if(current)
+ data["builtperc"] = round((progress / current.time) * 100)
-/obj/machinery/mecha_part_fabricator/proc/update_queue_on_page()
- send_byjax(usr,"mecha_fabricator.browser","queue",src.list_queue())
- return
-
-/obj/machinery/mecha_part_fabricator/proc/add_part_set_to_queue(set_name)
- if(set_name in part_sets)
- var/list/part_set = part_sets[set_name]
- if(islist(part_set))
- for(var/obj/item/part in part_set)
- add_to_queue(part)
- return
-
-/obj/machinery/mecha_part_fabricator/proc/add_to_queue(part)
- if(!istype(queue))
- queue = list()
- if(part)
- queue[++queue.len] = part
- return queue.len
-
-/obj/machinery/mecha_part_fabricator/proc/remove_from_queue(index)
- if(!isnum(index) || !istype(queue) || (index<1 || index>queue.len))
- return 0
- queue.Cut(index,++index)
- return 1
-
-/obj/machinery/mecha_part_fabricator/proc/process_queue()
- var/obj/item/part = listgetindex(src.queue, 1)
- if(!part)
- remove_from_queue(1)
- if(src.queue.len)
- return process_queue()
- else
- return
- if(!(part.vars.Find("construction_time")) || !(part.vars.Find("construction_cost")))//If it shouldn't be printed
- remove_from_queue(1)//Take it out of the quene
- return process_queue()//Then reprocess it
- temp = null
- while(part)
- if(stat&(NOPOWER|BROKEN))
- return 0
- if(!check_resources(part))
- src.visible_message("\icon[src] [src] beeps, \"Not enough resources. Queue processing stopped\".")
- temp = {"Not enough resources to build next part.
- Try again | Return"}
- return 0
- remove_from_queue(1)
- build_part(part)
- part = listgetindex(src.queue, 1)
- src.visible_message("\icon[src] [src] beeps, \"Queue processing finished successfully\".")
- return 1
-
-/obj/machinery/mecha_part_fabricator/proc/list_queue()
- var/output = "Queue contains:"
- if(!istype(queue) || !queue.len)
- output += "
Nothing"
- else
- output += ""
- for(var/i=1;i<=queue.len;i++)
- var/obj/item/part = listgetindex(src.queue, i)
- if(istype(part))
- if(part.vars.Find("construction_time") && part.vars.Find("construction_cost"))
- output += "- [part.name] - [i>1?"↑":null] [i↓
":null] Remove"
- else//Prevents junk items from even appearing in the list, and they will be silently removed when the fab processes
- remove_from_queue(i)//Trash it
- return list_queue()//Rebuild it
- output += ""
- output += "\[Process queue | Clear queue\]"
- return output
-
-/obj/machinery/mecha_part_fabricator/proc/convert_designs()
- if(!files) return
- var/i = 0
- for(var/datum/design/D in files.known_designs)
- if(D.build_type&16)
- if(D.category in part_sets)//Checks if it's a valid category
- if(add_part_to_set(D.category, D.build_path))//Adds it to said category
- i++
- else
- if(add_part_to_set("Misc", D.build_path))//If in doubt, chunk it into the Misc
- i++
- return i
-
-/obj/machinery/mecha_part_fabricator/proc/update_tech()
- if(!files) return
- var/output
- for(var/datum/tech/T in files.known_tech)
- if(T && T.level > 1)
- var/diff
- switch(T.id) //bad, bad formulas
- if("materials")
- var/pmat = 0//Calculations to make up for the fact that these parts and tech modify the same thing
- for(var/obj/item/weapon/stock_parts/micro_laser/Ml in component_parts)
- pmat += Ml.rating
- if(pmat >= 1)
- pmat -= 1//So the equations don't have to be reworked, upgrading a single part from T1 to T2 is == to 1 tech level
- diff = round(initial(resource_coeff) - (initial(resource_coeff)*(T.level+pmat))/25,0.01)
- if(resource_coeff!=diff)
- resource_coeff = diff
- output+="Production efficiency increased.
"
- if("programming")
- var/ptime = 0
- for(var/obj/item/weapon/stock_parts/manipulator/Ma in component_parts)
- ptime += Ma.rating
- if(ptime >= 2)
- ptime -= 2
- diff = round(initial(time_coeff) - (initial(time_coeff)*(T.level+ptime))/25,0.1)
- if(time_coeff!=diff)
- time_coeff = diff
- output+="Production routines updated.
"
- return output
-
-
-/obj/machinery/mecha_part_fabricator/proc/sync(silent=null)
-/* if(queue.len)
- if(!silent)
- temp = "Error. Please clear processing queue before updating!"
- src.updateUsrDialog()
- return
-*/
- if(!silent)
- temp = "Updating local R&D database..."
- src.updateUsrDialog()
- sleep(30) //only sleep if called by user
- var/found = 0
- for(var/obj/machinery/computer/rdconsole/RDC in get_area_all_atoms(get_area(src)))
- if(!RDC.sync)
- continue
- found++
- for(var/datum/tech/T in RDC.files.known_tech)
- files.AddTech2Known(T)
- for(var/datum/design/D in RDC.files.known_designs)
- files.AddDesign2Known(D)
- files.RefreshResearch()
- var/i = src.convert_designs()
- var/tech_output = update_tech()
- if(!silent)
- temp = "Processed [i] equipment designs.
"
- temp += tech_output
- temp += "Return"
- src.updateUsrDialog()
- if(i || tech_output)
- src.visible_message("\icon[src] [src] beeps, \"Successfully synchronized with R&D server. New data processed.\"")
- if(found == 0)
- temp = "Couldn't contact R&D server.
"
- temp += "Return"
- src.updateUsrDialog()
- src.visible_message("\icon[src] [src] beeps, \"Error! Couldn't connect to R&D server.\"")
- return
-
-/obj/machinery/mecha_part_fabricator/proc/get_resource_cost_w_coeff(var/obj/item/part as obj,var/resource as text, var/roundto=1)
-//Be SURE to add any new equipment to this switch, but don't be suprised if it spits out children objects
- if(part.vars.Find("construction_time") && part.vars.Find("construction_cost"))
- return round(part:construction_cost[resource]*resource_coeff, roundto)
- else
- return 0
-
-/obj/machinery/mecha_part_fabricator/proc/get_construction_time_w_coeff(var/obj/item/part as obj, var/roundto=1)
-//Be SURE to add any new equipment to this switch, but don't be suprised if it spits out children objects
- if(part.vars.Find("construction_time") && part.vars.Find("construction_cost"))
- return round(part:construction_time*time_coeff, roundto)
- else
- return 0
-
-
-/obj/machinery/mecha_part_fabricator/attack_hand(mob/user as mob)
- var/dat, left_part
- if (..())
- return
- if(!operation_allowed(user))
- return
- user.set_machine(src)
- var/turf/exit = get_step(src,SOUTH)
- if(exit.density)
- src.visible_message("\icon[src] [src] beeps, \"Error! Part outlet is obstructed\".")
- return
- if(temp)
- left_part = temp
- else if(src.being_built)
- left_part = {"Building [src.being_built.name].
- Please wait until completion..."}
- else
- switch(screen)
- if("main")
- left_part = output_available_resources()+"
"
- left_part += "Sync with R&D servers | Set manufacturer ([current_manufacturer])
"
- for(var/part_set in part_sets)
- left_part += "[part_set] - \[Add all parts to queue\]
"
- if("parts")
- left_part += output_parts_list(part_set)
- left_part += "
Return"
- dat = {"
-
- [src.name]
-
-
-
-
-
-
- |
- [left_part]
- |
-
- [list_queue()]
- |
-
-
-
- "}
- user << browse(dat, "window=mecha_fabricator;size=1000x400")
- onclose(user, "mecha_fabricator")
- return
-
-/obj/machinery/mecha_part_fabricator/proc/exploit_prevention(var/obj/Part, mob/user as mob, var/desc_exploit)
-// critical exploit prevention, feel free to improve or replace this, but do not remove it -walter0o
-
- if(!Part || !user || !istype(Part) || !istype(user)) // sanity
- return 1
-
- if( !(locate(Part, src.contents)) || !(Part.vars.Find("construction_time")) || !(Part.vars.Find("construction_cost")) ) // these 3 are the current requirements for an object being buildable by the mech_fabricator
-
- var/turf/LOC = get_turf(user)
- message_admins("[key_name_admin(user)] tried to exploit an Exosuit Fabricator to [desc_exploit ? "get the desc of" : "duplicate"] [Part] ! ([LOC ? "JMP" : "null"])", 0)
- log_admin("EXPLOIT : [key_name(user)] tried to exploit an Exosuit Fabricator to [desc_exploit ? "get the desc of" : "duplicate"] [Part] !")
- return 1
-
- return null
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "mechfab.tmpl", "Exosuit Fabricator UI", 800, 600)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
/obj/machinery/mecha_part_fabricator/Topic(href, href_list)
-
- if(..()) // critical exploit prevention, do not remove unless you replace it -walter0o
+ if(..())
return
- var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
- if(href_list["set_manufacturer"])
- var/choice = input(usr, "Which manufacturer do you wish to use for this fabricator?") as null|anything in all_robolimbs
- if(choice) current_manufacturer = choice
- if(href_list["part_set"])
- var/tpart_set = filter.getStr("part_set")
- if(tpart_set)
- if(tpart_set=="clear")
- src.part_set = null
- else
- src.part_set = tpart_set
- screen = "parts"
- if(href_list["part"])
- var/obj/part = filter.getObj("part")
+ if(href_list["build"])
+ add_to_queue(text2num(href_list["build"]))
- // critical exploit prevention, do not remove unless you replace it -walter0o
- if(src.exploit_prevention(part, usr))
- return
+ if(href_list["remove"])
+ remove_from_queue(text2num(href_list["remove"]))
- if(!processing_queue)
- build_part(part)
- else
- add_to_queue(part)
- if(href_list["add_to_queue"])
- var/obj/part = filter.getObj("add_to_queue")
+ if(href_list["category"])
+ if(href_list["category"] in categories)
+ category = href_list["category"]
- // critical exploit prevention, do not remove unless you replace it -walter0o
- if(src.exploit_prevention(part, usr))
- return
+ if(href_list["manufacturer"])
+ if(href_list["manufacturer"] in all_robolimbs)
+ manufacturer = href_list["manufacturer"]
- add_to_queue(part)
+ if(href_list["eject"])
+ eject_materials(href_list["eject"], text2num(href_list["amount"]))
- return update_queue_on_page()
- if(href_list["remove_from_queue"])
- remove_from_queue(filter.getNum("remove_from_queue"))
- return update_queue_on_page()
- if(href_list["partset_to_queue"])
- add_part_set_to_queue(filter.get("partset_to_queue"))
- return update_queue_on_page()
- if(href_list["process_queue"])
- spawn(-1)
- if(processing_queue || being_built)
- return 0
- processing_queue = 1
- process_queue()
- processing_queue = 0
-/*
- if(href_list["list_queue"])
- list_queue()
-*/
- if(href_list["clear_temp"])
- temp = null
- if(href_list["screen"])
- src.screen = href_list["screen"]
- if(href_list["queue_move"] && href_list["index"])
- var/index = filter.getNum("index")
- var/new_index = index + filter.getNum("queue_move")
- if(isnum(index) && isnum(new_index))
- if(InRange(new_index,1,queue.len))
- queue.Swap(index,new_index)
- return update_queue_on_page()
- if(href_list["clear_queue"])
- queue = list()
- return update_queue_on_page()
if(href_list["sync"])
- queue = list()
- src.sync()
- return update_queue_on_page()
- if(href_list["part_desc"])
- var/obj/part = filter.getObj("part_desc")
-
- // critical exploit prevention, do not remove unless you replace it -walter0o
- if(src.exploit_prevention(part, usr, 1))
- return
-
- if(part)
- temp = {"[part] description:
- [part.desc]
- Return
- "}
- if(href_list["remove_mat"] && href_list["material"])
- temp = "Ejected [remove_material(href_list["material"],text2num(href_list["remove_mat"]))] of [href_list["material"]]
Return"
- src.updateUsrDialog()
- return
-
-/obj/machinery/mecha_part_fabricator/proc/remove_material(var/mat_string, var/amount)
- var/type
- switch(mat_string)
- if(DEFAULT_WALL_MATERIAL)
- type = /obj/item/stack/material/steel
- if("glass")
- type = /obj/item/stack/material/glass
- if("gold")
- type = /obj/item/stack/material/gold
- if("silver")
- type = /obj/item/stack/material/silver
- if("diamond")
- type = /obj/item/stack/material/diamond
- if("phoron")
- type = /obj/item/stack/material/phoron
- if("uranium")
- type = /obj/item/stack/material/uranium
- else
- return 0
- var/result = 0
- var/obj/item/stack/material/res = new type(src)
-
- // amount available to take out
- var/total_amount = round(resources[mat_string]/res.perunit)
-
- // number of stacks we're going to take out
- res.amount = round(min(total_amount,amount))
-
- if(res.amount>0)
- resources[mat_string] -= res.amount*res.perunit
- res.Move(src.loc)
- result = res.amount
+ sync()
else
- qdel(res)
- return result
+ sync_message = ""
+
+ return 1
-/obj/machinery/mecha_part_fabricator/emag_act(var/remaining_charges, var/mob/user)
- sleep()
- switch(emagged)
- if(0)
- emagged = 0.5
- src.visible_message("\icon[src] [src] beeps: \"DB error \[Code 0x00F1\]\"")
- sleep(10)
- src.visible_message("\icon[src] [src] beeps: \"Attempting auto-repair\"")
- sleep(15)
- src.visible_message("\icon[src] [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"")
- sleep(30)
- src.visible_message("\icon[src] [src] beeps: \"User DB truncated. Please contact your [company_name] system operator for future assistance.\"")
- req_access = null
- emagged = 1
- return 1
- if(0.5)
- src.visible_message("\icon[src] [src] beeps: \"DB not responding \[Code 0x0003\]...\"")
- if(1)
- src.visible_message("\icon[src] [src] beeps: \"No records in User DB\"")
-
-/obj/machinery/mecha_part_fabricator/attackby(obj/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/screwdriver))
- if (!opened)
- opened = 1
- icon_state = "fab-o"
- user << "You open the maintenance hatch of [src]."
- else
- opened = 0
- icon_state = "fab-idle"
- user << "You close the maintenance hatch of [src]."
+/obj/machinery/mecha_part_fabricator/attackby(var/obj/item/I, var/mob/user)
+ if(busy)
+ user << "\The [src] is busy. Please wait for completion of previous operation."
+ return 1
+ if(default_deconstruction_screwdriver(user, I))
+ return
+ if(default_deconstruction_crowbar(user, I))
+ return
+ if(default_part_replacement(user, I))
return
- if (opened)
- if(istype(W, /obj/item/weapon/crowbar))
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc)
- M.state = 2
- M.icon_state = "box_1"
- for(var/obj/I in component_parts)
- I.loc = src.loc
- if(src.resources[DEFAULT_WALL_MATERIAL] >= 3750)
- var/obj/item/stack/material/steel/G = new /obj/item/stack/material/steel(src.loc)
- G.amount = round(src.resources[DEFAULT_WALL_MATERIAL] / G.perunit)
- if(src.resources["glass"] >= 3750)
- var/obj/item/stack/material/glass/G = new /obj/item/stack/material/glass(src.loc)
- G.amount = round(src.resources["glass"] / G.perunit)
- if(src.resources["phoron"] >= 2000)
- var/obj/item/stack/material/phoron/G = new /obj/item/stack/material/phoron(src.loc)
- G.amount = round(src.resources["phoron"] / G.perunit)
- if(src.resources["silver"] >= 2000)
- var/obj/item/stack/material/silver/G = new /obj/item/stack/material/silver(src.loc)
- G.amount = round(src.resources["silver"] / G.perunit)
- if(src.resources["gold"] >= 2000)
- var/obj/item/stack/material/gold/G = new /obj/item/stack/material/gold(src.loc)
- G.amount = round(src.resources["gold"] / G.perunit)
- if(src.resources["uranium"] >= 2000)
- var/obj/item/stack/material/uranium/G = new /obj/item/stack/material/uranium(src.loc)
- G.amount = round(src.resources["uranium"] / G.perunit)
- if(src.resources["diamond"] >= 2000)
- var/obj/item/stack/material/diamond/G = new /obj/item/stack/material/diamond(src.loc)
- G.amount = round(src.resources["diamond"] / G.perunit)
- qdel(src)
- return 1
- else
- user << "You can't load the [src.name] while it's opened."
- return 1
var/material
- switch(W.type)
+ switch(I.type)
if(/obj/item/stack/material/gold)
material = "gold"
if(/obj/item/stack/material/silver)
@@ -788,30 +177,171 @@
else
return ..()
- if(src.being_built)
- user << "The fabricator is currently processing. Please wait until completion."
- return
-
- var/obj/item/stack/material/stack = W
-
+ var/obj/item/stack/material/stack = I
var/sname = "[stack.name]"
var/amnt = stack.perunit
- if(src.resources[material] < res_max_amount)
+
+ if(materials[material] + amnt <= res_max_amount)
if(stack && stack.amount >= 1)
var/count = 0
- src.overlays += "fab-load-[material]"//loading animation is now an overlay based on material type. No more spontaneous conversion of all ores to metal. -vey
- sleep(10)
-
- while(src.resources[material] < res_max_amount && stack.amount >= 1)
- src.resources[material] += amnt
+ overlays += "fab-load-metal"
+ spawn(10)
+ overlays -= "fab-load-metal"
+ while(materials[material] + amnt <= res_max_amount && stack.amount >= 1)
+ materials[material] += amnt
stack.use(1)
count++
- src.overlays -= "fab-load-[material]"
user << "You insert [count] [sname] into the fabricator."
- src.updateUsrDialog()
- else
- user << "The fabricator can only accept full sheets of [sname]."
- return
+ update_busy()
else
user << "The fabricator cannot hold more [sname]."
- return
+
+/obj/machinery/mecha_part_fabricator/emag_act(var/remaining_charges, var/mob/user)
+ switch(emagged)
+ if(0)
+ emagged = 0.5
+ visible_message("\icon[src] [src] beeps: \"DB error \[Code 0x00F1\]\"")
+ sleep(10)
+ visible_message("\icon[src] [src] beeps: \"Attempting auto-repair\"")
+ sleep(15)
+ visible_message("\icon[src] [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"")
+ sleep(30)
+ visible_message("\icon[src] [src] beeps: \"User DB truncated. Please contact your [company_name] system operator for future assistance.\"")
+ req_access = null
+ emagged = 1
+ return 1
+ if(0.5)
+ visible_message("\icon[src] [src] beeps: \"DB not responding \[Code 0x0003\]...\"")
+ if(1)
+ visible_message("\icon[src] [src] beeps: \"No records in User DB\"")
+
+/obj/machinery/mecha_part_fabricator/proc/update_busy()
+ if(queue.len)
+ if(can_build(queue[1]))
+ busy = 1
+ else
+ busy = 0
+ else
+ busy = 0
+
+/obj/machinery/mecha_part_fabricator/proc/add_to_queue(var/index)
+ var/datum/design/D = files.known_designs[index]
+ queue += D
+ update_busy()
+
+/obj/machinery/mecha_part_fabricator/proc/remove_from_queue(var/index)
+ if(index == 1)
+ progress = 0
+ queue.Cut(index, index + 1)
+ update_busy()
+
+/obj/machinery/mecha_part_fabricator/proc/can_build(var/datum/design/D)
+ for(var/M in D.materials)
+ if(materials[M] < D.materials[M])
+ return 0
+ return 1
+
+/obj/machinery/mecha_part_fabricator/proc/check_build()
+ if(!queue.len)
+ progress = 0
+ return
+ var/datum/design/D = queue[1]
+ if(!can_build(D))
+ progress = 0
+ return
+ if(D.time > progress)
+ return
+ for(var/M in D.materials)
+ materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency)
+ if(D.build_path)
+ var/obj/new_item = new D.build_path(loc, manufacturer)
+ visible_message("\The [src] pings, indicating that \the [D] is complete.", "You hear a ping.")
+ if(mat_efficiency != 1)
+ if(new_item.matter && new_item.matter.len > 0)
+ for(var/i in new_item.matter)
+ new_item.matter[i] = new_item.matter[i] * mat_efficiency
+ remove_from_queue(1)
+
+/obj/machinery/mecha_part_fabricator/proc/get_queue_names()
+ . = list()
+ for(var/i = 2 to queue.len)
+ var/datum/design/D = queue[i]
+ . += D.name
+
+/obj/machinery/mecha_part_fabricator/proc/get_build_options()
+ . = list()
+ for(var/i = 1 to files.known_designs.len)
+ var/datum/design/D = files.known_designs[i]
+ if(!D.build_path || !(D.build_type & MECHFAB))
+ continue
+ . += list(list("name" = D.name, "id" = i, "category" = D.category, "resourses" = get_design_resourses(D), "time" = get_design_time(D)))
+
+/obj/machinery/mecha_part_fabricator/proc/get_design_resourses(var/datum/design/D)
+ var/list/F = list()
+ for(var/T in D.materials)
+ F += "[capitalize(T)]: [D.materials[T] * mat_efficiency]"
+ return english_list(F, and_text = ", ")
+
+/obj/machinery/mecha_part_fabricator/proc/get_design_time(var/datum/design/D)
+ return time2text(round(10 * D.time / speed), "mm:ss")
+
+/obj/machinery/mecha_part_fabricator/proc/update_categories()
+ categories = list()
+ for(var/datum/design/D in files.known_designs)
+ if(!D.build_path || !(D.build_type & MECHFAB))
+ continue
+ categories |= D.category
+ if(!category || !(category in categories))
+ category = categories[1]
+
+/obj/machinery/mecha_part_fabricator/proc/get_materials()
+ . = list()
+ for(var/T in materials)
+ . += list(list("mat" = capitalize(T), "amt" = materials[T]))
+
+/obj/machinery/mecha_part_fabricator/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything
+ var/recursive = amount == -1 ? 1 : 0
+ material = lowertext(material)
+ var/mattype
+ switch(material)
+ if(DEFAULT_WALL_MATERIAL)
+ mattype = /obj/item/stack/material/steel
+ if("glass")
+ mattype = /obj/item/stack/material/glass
+ if("gold")
+ mattype = /obj/item/stack/material/gold
+ if("silver")
+ mattype = /obj/item/stack/material/silver
+ if("diamond")
+ mattype = /obj/item/stack/material/diamond
+ if("phoron")
+ mattype = /obj/item/stack/material/phoron
+ if("uranium")
+ mattype = /obj/item/stack/material/uranium
+ else
+ return
+ var/obj/item/stack/material/S = new mattype(loc)
+ if(amount <= 0)
+ amount = S.max_amount
+ var/ejected = min(round(materials[material] / S.perunit), amount)
+ S.amount = min(ejected, amount)
+ if(S.amount <= 0)
+ qdel(S)
+ return
+ materials[material] -= ejected * S.perunit
+ if(recursive && materials[material] >= S.perunit)
+ eject_materials(material, -1)
+ update_busy()
+
+/obj/machinery/mecha_part_fabricator/proc/sync()
+ sync_message = "Error: no console found."
+ for(var/obj/machinery/computer/rdconsole/RDC in get_area_all_atoms(get_area(src)))
+ if(!RDC.sync)
+ continue
+ for(var/datum/tech/T in RDC.files.known_tech)
+ files.AddTech2Known(T)
+ for(var/datum/design/D in RDC.files.known_designs)
+ files.AddDesign2Known(D)
+ files.RefreshResearch()
+ sync_message = "Sync complete."
+ update_categories()
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index e3bee7a816..e9dbd93edf 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -70,8 +70,6 @@
icon = 'icons/obj/device.dmi'
icon_state = "motion2"
origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 2)
- construction_time = 50
- construction_cost = list(DEFAULT_WALL_MATERIAL=500)
proc/get_mecha_info()
if(!in_mecha())
diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm
index fbc6a1d7aa..876e6c3f6b 100644
--- a/code/game/mecha/mecha_parts.dm
+++ b/code/game/mecha/mecha_parts.dm
@@ -11,15 +11,12 @@
w_class = 5
flags = CONDUCT
origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2)
- var/construction_time = 100
- var/list/construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"glass"=5000)
/obj/item/mecha_parts/chassis
name="Mecha Chassis"
icon_state = "backbone"
var/datum/construction/construct
- construction_cost = list(DEFAULT_WALL_MATERIAL=20000)
flags = CONDUCT
attackby(obj/item/W as obj, mob/user as mob)
@@ -42,48 +39,37 @@
/obj/item/mecha_parts/part/ripley_torso
name="Ripley Torso"
desc="A torso part of Ripley APLU. Contains power unit, processing core and life support systems."
- icon_state = "ripley_harness"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_ENGINEERING = 2)
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=40000,"glass"=15000)
+ icon_state = "ripley_harness"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_ENGINEERING = 2)
/obj/item/mecha_parts/part/ripley_left_arm
name="Ripley Left Arm"
desc="A Ripley APLU left arm. Data and power sockets are compatible with most exosuit tools."
- icon_state = "ripley_l_arm"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
- construction_time = 150
- construction_cost = list(DEFAULT_WALL_MATERIAL=25000)
+ icon_state = "ripley_l_arm"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
/obj/item/mecha_parts/part/ripley_right_arm
name="Ripley Right Arm"
desc="A Ripley APLU right arm. Data and power sockets are compatible with most exosuit tools."
- icon_state = "ripley_r_arm"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
- construction_time = 150
- construction_cost = list(DEFAULT_WALL_MATERIAL=25000)
+ icon_state = "ripley_r_arm"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
/obj/item/mecha_parts/part/ripley_left_leg
name="Ripley Left Leg"
desc="A Ripley APLU left leg. Contains somewhat complex servodrives and balance maintaining systems."
- icon_state = "ripley_l_leg"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
- construction_time = 150
- construction_cost = list(DEFAULT_WALL_MATERIAL=30000)
+ icon_state = "ripley_l_leg"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
/obj/item/mecha_parts/part/ripley_right_leg
name="Ripley Right Leg"
desc="A Ripley APLU right leg. Contains somewhat complex servodrives and balance maintaining systems."
- icon_state = "ripley_r_leg"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
- construction_time = 150
- construction_cost = list(DEFAULT_WALL_MATERIAL=30000)
+ icon_state = "ripley_r_leg"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
///////// Gygax
/obj/item/mecha_parts/chassis/gygax
name = "Gygax Chassis"
- construction_cost = list(DEFAULT_WALL_MATERIAL=25000)
New()
..()
@@ -92,62 +78,47 @@
/obj/item/mecha_parts/part/gygax_torso
name="Gygax Torso"
desc="A torso part of Gygax. Contains power unit, processing core and life support systems. Has an additional equipment slot."
- icon_state = "gygax_harness"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 3, TECH_ENGINEERING = 3)
- construction_time = 300
- construction_cost = list(DEFAULT_WALL_MATERIAL=50000,"glass"=20000)
+ icon_state = "gygax_harness"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 3, TECH_ENGINEERING = 3)
/obj/item/mecha_parts/part/gygax_head
name="Gygax Head"
desc="A Gygax head. Houses advanced surveilance and targeting sensors."
- icon_state = "gygax_head"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_MAGNET = 3, TECH_ENGINEERING = 3)
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"glass"=10000)
+ icon_state = "gygax_head"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_MAGNET = 3, TECH_ENGINEERING = 3)
/obj/item/mecha_parts/part/gygax_left_arm
name="Gygax Left Arm"
desc="A Gygax left arm. Data and power sockets are compatible with most exosuit tools and weapons."
- icon_state = "gygax_l_arm"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3)
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=30000)
+ icon_state = "gygax_l_arm"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3)
/obj/item/mecha_parts/part/gygax_right_arm
name="Gygax Right Arm"
desc="A Gygax right arm. Data and power sockets are compatible with most exosuit tools and weapons."
- icon_state = "gygax_r_arm"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3)
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=30000)
+ icon_state = "gygax_r_arm"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3)
/obj/item/mecha_parts/part/gygax_left_leg
name="Gygax Left Leg"
- icon_state = "gygax_l_leg"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3)
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=35000)
+ icon_state = "gygax_l_leg"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3)
/obj/item/mecha_parts/part/gygax_right_leg
name="Gygax Right Leg"
- icon_state = "gygax_r_leg"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3)
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=35000)
+ icon_state = "gygax_r_leg"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3)
/obj/item/mecha_parts/part/gygax_armour
name="Gygax Armour Plates"
- icon_state = "gygax_armour"
- origin_tech = list(TECH_MATERIAL = 6, TECH_COMBAT = 4, TECH_ENGINEERING = 5)
- construction_time = 600
- construction_cost = list(DEFAULT_WALL_MATERIAL=50000,"diamond"=10000)
+ icon_state = "gygax_armour"
+ origin_tech = list(TECH_MATERIAL = 6, TECH_COMBAT = 4, TECH_ENGINEERING = 5)
//////////// Durand
/obj/item/mecha_parts/chassis/durand
name = "Durand Chassis"
- construction_cost = list(DEFAULT_WALL_MATERIAL=25000)
New()
..()
@@ -155,52 +126,38 @@
/obj/item/mecha_parts/part/durand_torso
name="Durand Torso"
- icon_state = "durand_harness"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_BIO = 3, TECH_ENGINEERING = 3)
- construction_time = 300
- construction_cost = list(DEFAULT_WALL_MATERIAL=55000,"glass"=20000,"silver"=10000)
+ icon_state = "durand_harness"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_BIO = 3, TECH_ENGINEERING = 3)
/obj/item/mecha_parts/part/durand_head
name="Durand Head"
- icon_state = "durand_head"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_ENGINEERING = 3)
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=25000,"glass"=10000,"silver"=3000)
+ icon_state = "durand_head"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_ENGINEERING = 3)
/obj/item/mecha_parts/part/durand_left_arm
name="Durand Left Arm"
- icon_state = "durand_l_arm"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3)
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"silver"=3000)
+ icon_state = "durand_l_arm"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3)
/obj/item/mecha_parts/part/durand_right_arm
name="Durand Right Arm"
- icon_state = "durand_r_arm"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3)
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"silver"=3000)
+ icon_state = "durand_r_arm"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3)
/obj/item/mecha_parts/part/durand_left_leg
name="Durand Left Leg"
- icon_state = "durand_l_leg"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3)
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=40000,"silver"=3000)
+ icon_state = "durand_l_leg"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3)
/obj/item/mecha_parts/part/durand_right_leg
name="Durand Right Leg"
- icon_state = "durand_r_leg"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3)
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=40000,"silver"=3000)
+ icon_state = "durand_r_leg"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3)
/obj/item/mecha_parts/part/durand_armour
name="Durand Armour Plates"
- icon_state = "durand_armour"
- origin_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4, TECH_ENGINEERING = 5)
- construction_time = 600
- construction_cost = list(DEFAULT_WALL_MATERIAL=50000,"uranium"=10000)
+ icon_state = "durand_armour"
+ origin_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4, TECH_ENGINEERING = 5)
@@ -247,43 +204,43 @@
/obj/item/mecha_parts/part/phazon_torso
name="Phazon Torso"
icon_state = "phazon_harness"
- construction_time = 300
- construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"glass"=10000,"phoron"=20000)
+ //construction_time = 300
+ //construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"glass"=10000,"phoron"=20000)
origin_tech = list(TECH_DATA = 5, TECH_MATERIAL = 7, TECH_BLUESPACE = 6, TECH_POWER = 6)
/obj/item/mecha_parts/part/phazon_head
name="Phazon Head"
icon_state = "phazon_head"
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=15000,"glass"=5000,"phoron"=10000)
+ //construction_time = 200
+ //construction_cost = list(DEFAULT_WALL_MATERIAL=15000,"glass"=5000,"phoron"=10000)
origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 5, TECH_MAGNET = 6)
/obj/item/mecha_parts/part/phazon_left_arm
name="Phazon Left Arm"
icon_state = "phazon_l_arm"
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000)
+ //construction_time = 200
+ //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000)
origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 2)
/obj/item/mecha_parts/part/phazon_right_arm
name="Phazon Right Arm"
icon_state = "phazon_r_arm"
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000)
+ //construction_time = 200
+ //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000)
origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 2)
/obj/item/mecha_parts/part/phazon_left_leg
name="Phazon Left Leg"
icon_state = "phazon_l_leg"
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000)
+ //construction_time = 200
+ //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000)
origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 3, TECH_MAGNET = 3)
/obj/item/mecha_parts/part/phazon_right_leg
name="Phazon Right Leg"
icon_state = "phazon_r_leg"
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000)
+ //construction_time = 200
+ //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000)
origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 3, TECH_MAGNET = 3)
///////// Odysseus
@@ -299,49 +256,37 @@
/obj/item/mecha_parts/part/odysseus_head
name="Odysseus Head"
icon_state = "odysseus_head"
- construction_time = 100
- construction_cost = list(DEFAULT_WALL_MATERIAL=2000,"glass"=10000)
origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 2)
/obj/item/mecha_parts/part/odysseus_torso
name="Odysseus Torso"
desc="A torso part of Odysseus. Contains power unit, processing core and life support systems."
- icon_state = "odysseus_torso"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_ENGINEERING = 2)
- construction_time = 180
- construction_cost = list(DEFAULT_WALL_MATERIAL=25000)
+ icon_state = "odysseus_torso"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_ENGINEERING = 2)
/obj/item/mecha_parts/part/odysseus_left_arm
name="Odysseus Left Arm"
desc="An Odysseus left arm. Data and power sockets are compatible with most exosuit tools."
- icon_state = "odysseus_l_arm"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
- construction_time = 120
- construction_cost = list(DEFAULT_WALL_MATERIAL=10000)
+ icon_state = "odysseus_l_arm"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
/obj/item/mecha_parts/part/odysseus_right_arm
name="Odysseus Right Arm"
desc="An Odysseus right arm. Data and power sockets are compatible with most exosuit tools."
- icon_state = "odysseus_r_arm"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
- construction_time = 120
- construction_cost = list(DEFAULT_WALL_MATERIAL=10000)
+ icon_state = "odysseus_r_arm"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
/obj/item/mecha_parts/part/odysseus_left_leg
name="Odysseus Left Leg"
desc="An Odysseus left leg. Contains somewhat complex servodrives and balance maintaining systems."
- icon_state = "odysseus_l_leg"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
- construction_time = 130
- construction_cost = list(DEFAULT_WALL_MATERIAL=15000)
+ icon_state = "odysseus_l_leg"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
/obj/item/mecha_parts/part/odysseus_right_leg
name="Odysseus Right Leg"
desc="A Odysseus right leg. Contains somewhat complex servodrives and balance maintaining systems."
- icon_state = "odysseus_r_leg"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
- construction_time = 130
- construction_cost = list(DEFAULT_WALL_MATERIAL=15000)
+ icon_state = "odysseus_r_leg"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
/*/obj/item/mecha_parts/part/odysseus_armour
name="Odysseus Carapace"
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index 8f9fa27093..c253976b76 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -194,8 +194,6 @@
desc = "When a problem arises, SCIENCE is the solution."
icon_state = "sflash"
origin_tech = list(TECH_MAGNET = 2, TECH_COMBAT = 1)
- var/construction_cost = list(DEFAULT_WALL_MATERIAL=750,"glass"=750)
- var/construction_time=100
/obj/item/device/flash/synthetic/attack(mob/living/M as mob, mob/user as mob)
..()
diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm
index 3bd706f11e..7dc13cb9e8 100644
--- a/code/game/objects/items/devices/t_scanner.dm
+++ b/code/game/objects/items/devices/t_scanner.dm
@@ -8,7 +8,7 @@
w_class = 2
item_state = "electronic"
matter = list(DEFAULT_WALL_MATERIAL = 150)
- origin_tech = list(TECH_MAGNET = 1, TECH_ENGINERING = 1)
+ origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)
var/scan_range = 1
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 83c5ea2098..78a4e41f28 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -5,8 +5,6 @@
icon_state = "blank"
flags = CONDUCT
slot_flags = SLOT_BELT
- var/construction_time = 100
- var/list/construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"glass"=5000)
var/list/part = null // Order of args is important for installing robolimbs.
var/sabotaged = 0 //Emagging limbs can have repercussions when installed as prosthetics.
var/model_info
@@ -32,8 +30,6 @@
name = "left arm"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
icon_state = "l_arm"
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=18000)
part = list("l_arm","l_hand")
model_info = 1
@@ -41,8 +37,6 @@
name = "right arm"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
icon_state = "r_arm"
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=18000)
part = list("r_arm","r_hand")
model_info = 1
@@ -50,8 +44,6 @@
name = "left leg"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
icon_state = "l_leg"
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=15000)
part = list("l_leg","l_foot")
model_info = 1
@@ -59,8 +51,6 @@
name = "right leg"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
icon_state = "r_leg"
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=15000)
part = list("r_leg","r_foot")
model_info = 1
@@ -69,8 +59,6 @@
desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell."
icon_state = "chest"
part = list("groin","chest")
- construction_time = 350
- construction_cost = list(DEFAULT_WALL_MATERIAL=40000)
var/wires = 0.0
var/obj/item/weapon/cell/cell = null
@@ -79,8 +67,6 @@
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
icon_state = "head"
part = list("head")
- construction_time = 350
- construction_cost = list(DEFAULT_WALL_MATERIAL=25000)
var/obj/item/device/flash/flash1 = null
var/obj/item/device/flash/flash2 = null
@@ -88,8 +74,6 @@
name = "endoskeleton"
desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors."
icon_state = "robo_suit"
- construction_time = 500
- construction_cost = list(DEFAULT_WALL_MATERIAL=50000)
var/obj/item/robot_parts/l_arm/l_arm = null
var/obj/item/robot_parts/r_arm/r_arm = null
var/obj/item/robot_parts/l_leg/l_leg = null
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 1dc489d75e..ccd6ab0adb 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -6,8 +6,6 @@
desc = "Protected by FRM."
icon = 'icons/obj/module.dmi'
icon_state = "cyborg_upgrade"
- var/construction_time = 120
- var/construction_cost = list(DEFAULT_WALL_MATERIAL=10000)
var/locked = 0
var/require_module = 0
var/installed = 0
@@ -43,7 +41,6 @@
name = "robot reclassification board"
desc = "Used to rename a cyborg."
icon_state = "cyborg_upgrade1"
- construction_cost = list(DEFAULT_WALL_MATERIAL=35000)
var/heldname = "default name"
/obj/item/borg/upgrade/rename/attack_self(mob/user as mob)
@@ -61,7 +58,6 @@
/obj/item/borg/upgrade/restart
name = "robot emergency restart module"
desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online."
- construction_cost = list(DEFAULT_WALL_MATERIAL=60000 , "glass"=5000)
icon_state = "cyborg_upgrade1"
@@ -85,7 +81,6 @@
/obj/item/borg/upgrade/vtec
name = "robotic VTEC Module"
desc = "Used to kick in a robot's VTEC systems, increasing their speed."
- construction_cost = list(DEFAULT_WALL_MATERIAL=80000 , "glass"=6000 , "gold"= 5000)
icon_state = "cyborg_upgrade2"
require_module = 1
@@ -102,7 +97,6 @@
/obj/item/borg/upgrade/tasercooler
name = "robotic Rapid Taser Cooling Module"
desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate."
- construction_cost = list(DEFAULT_WALL_MATERIAL=80000 , "glass"=6000 , "gold"= 2000, "diamond" = 500)
icon_state = "cyborg_upgrade3"
require_module = 1
@@ -137,7 +131,6 @@
/obj/item/borg/upgrade/jetpack
name = "mining robot jetpack"
desc = "A carbon dioxide jetpack suitable for low-gravity mining operations."
- construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"phoron"=15000,"uranium" = 20000)
icon_state = "cyborg_upgrade3"
require_module = 1
@@ -159,7 +152,6 @@
/obj/item/borg/upgrade/syndicate/
name = "illegal equipment module"
desc = "Unlocks the hidden, deadlier functions of a robot"
- construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"glass"=15000,"diamond" = 10000)
icon_state = "cyborg_upgrade3"
require_module = 1
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index a471595886..e61875f5ec 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -14,8 +14,6 @@
var/maxcharge = 1000
var/rigged = 0 // true if rigged to explode
var/minor_fault = 0 //If not 100% reliable, it will build up faults.
- var/construction_cost = list(DEFAULT_WALL_MATERIAL=750,"glass"=75)
- var/construction_time=100
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
suicide_act(mob/user)
@@ -83,7 +81,6 @@
icon_state = "scell"
maxcharge = 20000
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70)
- construction_cost = list(DEFAULT_WALL_MATERIAL=750,"glass"=100)
/obj/item/weapon/cell/super/empty/New()
..()
@@ -95,7 +92,6 @@
icon_state = "hpcell"
maxcharge = 30000
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 80)
- construction_cost = list(DEFAULT_WALL_MATERIAL=500,"glass"=150,"gold"=200,"silver"=200)
/obj/item/weapon/cell/hyper/empty/New()
..()
diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm
index fd8903df78..7b0d833c63 100644
--- a/code/game/turfs/flooring/flooring_premade.dm
+++ b/code/game/turfs/flooring/flooring_premade.dm
@@ -55,21 +55,21 @@
/turf/simulated/floor/reinforced/nitrogen
oxygen = 0
- nitrogen = MOLES_O2ATMOS + MOLES_N2ATMOS
+ nitrogen = ATMOSTANK_NITROGEN
/turf/simulated/floor/reinforced/oxygen
- oxygen = MOLES_O2ATMOS + MOLES_N2ATMOS
+ oxygen = ATMOSTANK_OXYGEN
nitrogen = 0
/turf/simulated/floor/reinforced/phoron
oxygen = 0
nitrogen = 0
- phoron = MOLES_O2ATMOS + MOLES_N2ATMOS
+ phoron = ATMOSTANK_PHORON
/turf/simulated/floor/reinforced/carbon_dioxide
oxygen = 0
nitrogen = 0
- carbon_dioxide = MOLES_O2ATMOS + MOLES_N2ATMOS
+ carbon_dioxide = ATMOSTANK_CO2
/turf/simulated/floor/reinforced/n20
oxygen = 0
@@ -79,7 +79,7 @@
..()
sleep(-1)
if(!air) make_air()
- air.adjust_gas("sleeping_agent", MOLES_O2ATMOS + MOLES_N2ATMOS)
+ air.adjust_gas("sleeping_agent", ATMOSTANK_NITROUSOXIDE)
/turf/simulated/floor/cult
name = "engraved floor"
@@ -133,13 +133,6 @@
nitrogen = 0
temperature = TCMB
-/turf/simulated/floor/reinforced/nitrogen
- oxygen = 0
-
-/turf/simulated/floor/reinforced/n20/New()
- . = ..()
- assume_gas("sleeping_agent", 2000)
-
/turf/simulated/floor/airless
name = "airless plating"
oxygen = 0
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index 862602bd5c..8b44fb8627 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -57,7 +57,7 @@
slot_flags = SLOT_HEAD | SLOT_OCLOTHING
/obj/item/weapon/holder/drone
- origin_tech = list(TECH_MAGNET = 3, TECH_ENGINERING = 5)
+ origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 5)
/obj/item/weapon/holder/mouse
w_class = 1
diff --git a/code/modules/mob/language/monkey.dm b/code/modules/mob/language/monkey.dm
index f40a276bbc..ce276a358a 100644
--- a/code/modules/mob/language/monkey.dm
+++ b/code/modules/mob/language/monkey.dm
@@ -7,7 +7,7 @@
key = "6"
/datum/language/skrell/monkey
- name = "Neara"
+ name = "Neaera"
desc = "Squik squik squik."
key = "8"
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index d9b84ea3b0..07004f9754 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -25,10 +25,6 @@
w_class = 3
origin_tech = list(TECH_BIO = 3)
- var/list/construction_cost = list(DEFAULT_WALL_MATERIAL=1000,"glass"=500)
- var/construction_time = 75
- //these vars are so the mecha fabricator doesn't shit itself anymore. --NEO
-
req_access = list(access_robotics)
//Revised. Brainmob is now contained directly within object of transfer. MMI in this case.
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index 4af00df604..05198f38bf 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -6,8 +6,6 @@
w_class = 3
origin_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2, TECH_DATA = 4)
- construction_cost = list(DEFAULT_WALL_MATERIAL=500,"glass"=500,"silver"=200,"gold"=200,"phoron"=100,"diamond"=10)
- construction_time = 75
var/searching = 0
var/askDelay = 10 * 60 * 1
req_access = list(access_robotics)
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index b6587af087..5f9d7e827c 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -95,6 +95,8 @@
g_hair = green
b_hair = blue
+ force_update_limbs()
+ update_body()
update_hair()
return 1
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index cd3d8bf07d..53c1b33688 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1093,18 +1093,21 @@
else
dna.species = new_species
+ // No more invisible screaming wheelchairs because of set_species() typos.
+ if(!all_species[new_species])
+ new_species = "Human"
+
if(species)
if(species.name && species.name == new_species)
return
if(species.language)
remove_language(species.language)
-
if(species.default_language)
remove_language(species.default_language)
-
// Clear out their species abilities.
species.remove_inherent_verbs(src)
+ holder_type = null
species = all_species[new_species]
@@ -1124,6 +1127,11 @@
g_skin = 0
b_skin = 0
+ if(species.holder_type)
+ holder_type = species.holder_type
+
+ icon_state = lowertext(species.name)
+
species.create_organs(src)
species.handle_post_spawn(src)
@@ -1384,3 +1392,10 @@
return 0
return 1
return 0
+
+/mob/living/carbon/human/MouseDrop(var/atom/over_object)
+ var/mob/living/carbon/human/H = over_object
+ if(holder_type && a_intent == "help" && H.a_intent == "help" && istype(H) && !issmall(H) && Adjacent(H))
+ get_scooped(H)
+ return
+ return ..()
diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm
index f7a644646d..f4172060f9 100644
--- a/code/modules/mob/living/carbon/human/human_species.dm
+++ b/code/modules/mob/living/carbon/human/human_species.dm
@@ -31,8 +31,8 @@
/mob/living/carbon/human/farwa/New(var/new_loc)
..(new_loc, "Farwa")
-/mob/living/carbon/human/neara/New(var/new_loc)
- ..(new_loc, "Neara")
+/mob/living/carbon/human/neaera/New(var/new_loc)
+ ..(new_loc, "Neaera")
/mob/living/carbon/human/stok/New(var/new_loc)
..(new_loc, "Stok")
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index cc53182440..4d7b5d1741 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -108,6 +108,7 @@
var/slowdown = 0 // Passive movement speed malus (or boost, if negative)
var/primitive_form // Lesser form, if any (ie. monkey for humans)
var/greater_form // Greater form, if any, ie. human for monkeys.
+ var/holder_type
var/gluttonous // Can eat some mobs. 1 for mice, 2 for monkeys, 3 for people.
var/rarity_value = 1 // Relative rarity/collector value for this species.
// Determines the organs that the species spawns with and
diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm
index 6f75f8406a..74293d1176 100644
--- a/code/modules/mob/living/carbon/human/species/station/monkey.dm
+++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm
@@ -63,14 +63,14 @@
tail = "farwatail"
/datum/species/monkey/skrell
- name = "Neara"
- name_plural = "Neara"
+ name = "Neaera"
+ name_plural = "Neaera"
- icobase = 'icons/mob/human_races/monkeys/r_neara.dmi'
- deform = 'icons/mob/human_races/monkeys/r_neara.dmi'
+ icobase = 'icons/mob/human_races/monkeys/r_neaera.dmi'
+ deform = 'icons/mob/human_races/monkeys/r_neaera.dmi'
greater_form = "Skrell"
- default_language = "Neara"
+ default_language = "Neaera"
flesh_color = "#8CD7A3"
blood_color = "#1D2CBF"
reagent_tag = IS_SKRELL
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index abf187db1e..032cf51db9 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -126,7 +126,7 @@
icobase = 'icons/mob/human_races/r_skrell.dmi'
deform = 'icons/mob/human_races/r_def_skrell.dmi'
eyes = "skrell_eyes_s"
- primitive_form = "Neara"
+ primitive_form = "Neaera"
unarmed_types = list(/datum/unarmed_attack/punch)
blurb = "An amphibious species, Skrell come from the star system known as Qerr'Vallis, which translates to 'Star of \
the royals' or 'Light of the Crown'.
Skrell are a highly advanced and logical race who live under the rule \
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 94fe7fd949..55bce8251c 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -271,8 +271,13 @@ var/global/list/damage_icon_parts = list()
icon_key += "[part.species.race_key]"
icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]"
icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]"
- if(part.s_col)
+ if(part.s_col && part.s_col.len >= 3)
icon_key += "[rgb(part.s_col[1],part.s_col[2],part.s_col[3])]"
+ if(part.body_hair && part.h_col && part.h_col.len >= 3)
+ icon_key += "[rgb(part.h_col[1],part.h_col[2],part.h_col[3])]"
+ else
+ icon_key += "#000000"
+
icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
var/icon/base_icon
diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm
index 1894d62942..6f0b3d81bd 100644
--- a/code/modules/mob/living/silicon/robot/component.dm
+++ b/code/modules/mob/living/silicon/robot/component.dm
@@ -217,8 +217,6 @@
/obj/item/robot_parts/robot_component
icon = 'icons/obj/robot_component.dmi'
icon_state = "working"
- construction_time = 200
- construction_cost = list(DEFAULT_WALL_MATERIAL=5000)
var/brute = 0
var/burn = 0
var/icon_state_broken = "broken"
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index ae072145bb..c90dc6de8a 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -152,6 +152,8 @@
generate_data()
/datum/nano_module/appearance_changer/proc/generate_data()
+ if(!owner)
+ return
if(!valid_species.len)
valid_species = owner.generate_valid_species(check_whitelist, whitelist, blacklist)
if(!valid_hairstyles.len || !valid_facial_hairstyles.len)
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 1b6108c238..da12fdbb1c 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -35,6 +35,7 @@
var/cannot_break
var/s_tone
var/list/s_col
+ var/list/h_col
var/list/wounds = list()
var/number_wounds = 0 // cache the number of wounds, which is NOT wounds.len!
var/perma_injury = 0
@@ -55,6 +56,7 @@
var/dislocated = 0 // If you target a joint, you can dislocate the limb, causing temporary damage to the organ.
var/can_grasp //It would be more appropriate if these two were named "affects_grasp" and "affects_stand" at this point
var/can_stand
+ var/body_hair
/obj/item/organ/external/Destroy()
if(parent && parent.children)
@@ -258,7 +260,7 @@
createwound(BURN, min(burn,can_inflict))
//How much burn damage is left to inflict
spillover += max(0, burn - can_inflict)
-
+
//If there are still hurties to dispense
if (spillover)
owner.shock_stage += spillover * config.organ_damage_spillover_multiplier
@@ -275,7 +277,7 @@
//2. If the damage amount dealt exceeds the disintegrate threshold, the organ is completely obliterated.
//3. If the organ has already reached or would be put over it's max damage amount (currently redundant),
// and the brute damage dealt exceeds the tearoff threshold, the organ is torn off.
-
+
//Check edge eligibility
var/edge_eligible = 0
if(edge)
diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm
index d74548ccbe..bcc8de7694 100644
--- a/code/modules/organs/organ_icon.dm
+++ b/code/modules/organs/organ_icon.dm
@@ -15,6 +15,7 @@ var/global/list/limb_icon_cache = list()
/obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human)
s_tone = null
s_col = null
+ h_col = null
if(status & ORGAN_ROBOT)
return
if(species && human.species && species.name != human.species.name)
@@ -23,16 +24,19 @@ var/global/list/limb_icon_cache = list()
s_tone = human.s_tone
if(human.species.appearance_flags & HAS_SKIN_COLOR)
s_col = list(human.r_skin, human.g_skin, human.b_skin)
+ h_col = list(human.r_hair, human.g_hair, human.b_hair)
/obj/item/organ/external/proc/sync_colour_to_dna()
s_tone = null
s_col = null
+ h_col = null
if(status & ORGAN_ROBOT)
return
if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && (species.appearance_flags & HAS_SKIN_TONE))
s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE)
if(species.appearance_flags & HAS_SKIN_COLOR)
s_col = list(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B))
+ h_col = list(dna.GetUIValue(DNA_UI_HAIR_R),dna.GetUIValue(DNA_UI_HAIR_G),dna.GetUIValue(DNA_UI_HAIR_B))
/obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human)
..()
@@ -77,8 +81,8 @@ var/global/list/limb_icon_cache = list()
var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style]
if(hair_style && (species.get_bodytype() in hair_style.species_allowed))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
- if(hair_style.do_colouration)
- hair_s.Blend(rgb(owner.r_hair, owner.g_hair, owner.b_hair), ICON_ADD)
+ if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3)
+ hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_ADD)
overlays |= hair_s
return mob_icon
@@ -121,6 +125,14 @@ var/global/list/limb_icon_cache = list()
else if(s_col && s_col.len >= 3)
mob_icon.Blend(rgb(s_col[1], s_col[2], s_col[3]), ICON_ADD)
+ if(body_hair && islist(h_col) && h_col.len >= 3)
+ var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
+ if(!limb_icon_cache[cache_key])
+ var/icon/I = icon(species.icobase, "[icon_name]_[body_hair]")
+ I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_ADD)
+ limb_icon_cache[cache_key] = I
+ mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
+
dir = EAST
icon = mob_icon
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index c0535f4865..8ff1a680d7 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -1,5 +1,5 @@
var/list/obj/machinery/photocopier/faxmachine/allfaxes = list()
-var/list/admin_departments = list("[boss_name]", "Sol Government")
+var/list/admin_departments = list("[boss_name]", "Sol Government", "Supply")
var/list/alldepartments = list()
var/list/adminfaxes = list() //cache for faxes that have been sent to admins
@@ -9,7 +9,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
icon = 'icons/obj/library.dmi'
icon_state = "fax"
insert_anim = "faxsend"
- req_one_access = list(access_lawyer, access_heads, access_armory) //Warden needs to be able to Fax solgov too.
+ req_one_access = list(access_lawyer, access_heads, access_armory, access_qm)
use_power = 1
idle_power_usage = 30
@@ -201,6 +201,8 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
if ("Sol Government")
message_admins(sender, "SOL GOVERNMENT FAX", rcvdcopy, "CentcommFaxReply", "#1F66A0")
//message_admins(sender, "SOL GOVERNMENT FAX", rcvdcopy, "SolGovFaxReply", "#1F66A0")
+ if ("Supply")
+ message_admins(sender, "[uppertext(boss_short)] SUPPLY FAX", rcvdcopy, "CentcommFaxReply", "#5F4519")
sendcooldown = 1800
sleep(50)
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index ceb41d4588..51093296b2 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -126,27 +126,16 @@
//need to calculate the power per shot as the emitter doesn't fire continuously.
var/burst_time = (min_burst_delay + max_burst_delay)/2 + 2*(burst_shots-1)
var/power_per_shot = active_power_usage * (burst_time/10) / burst_shots
- var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
- A.damage = round(power_per_shot/EMITTER_DAMAGE_POWER_TRANSFER)
playsound(src.loc, 'sound/weapons/emitter.ogg', 25, 1)
if(prob(35))
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
- A.set_dir(src.dir)
- A.starting = get_turf(src)
- switch(dir)
- if(NORTH)
- A.original = locate(x, y+1, z)
- if(EAST)
- A.original = locate(x+1, y, z)
- if(WEST)
- A.original = locate(x-1, y, z)
- else // Any other
- A.original = locate(x, y-1, z)
- A.process()
+ var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
+ A.damage = round(power_per_shot/EMITTER_DAMAGE_POWER_TRANSFER)
+ A.launch( get_step(src.loc, src.dir) )
/obj/machinery/power/emitter/attackby(obj/item/W, mob/user)
@@ -225,7 +214,7 @@
return
..()
return
-
+
/obj/machinery/power/emitter/emag_act(var/remaining_charges, var/mob/user)
if(!emagged)
locked = 0
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 31f6295987..d10c09ecb1 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -41,7 +41,7 @@
//how far the reaction proceeds each time it is processed. Used with either REACTION_RATE or HALF_LIFE macros.
var/reaction_rate = HALF_LIFE(0)
- //if less than 1, the reaction will be inhibited if the ratio of products/reagents is too high.
+ //if less than 1, the reaction will be inhibited if the ratio of products/reagents is too high.
//0.5 = 50% yield -> reaction will only proceed halfway until products are removed.
var/yield = 1.0
@@ -70,22 +70,22 @@
/datum/chemical_reaction/proc/calc_reaction_progress(var/datum/reagents/holder, var/reaction_limit)
var/progress = reaction_limit * reaction_rate //simple exponential progression
-
+
//calculate yield
if(1-yield > 0.001) //if yield ratio is big enough just assume it goes to completion
/*
Determine the max amount of product by applying the yield condition:
(max_product/result_amount) / reaction_limit == yield/(1-yield)
-
+
We make use of the fact that:
reaction_limit = (holder.get_reagent_amount(reactant) / required_reagents[reactant]) of the limiting reagent.
*/
var/yield_ratio = yield/(1-yield)
var/max_product = yield_ratio * reaction_limit * result_amount //rearrange to obtain max_product
var/yield_limit = max(0, max_product - holder.get_reagent_amount(result))/result_amount
-
+
progress = min(progress, yield_limit) //apply yield limit
-
+
//apply min reaction progress - wasn't sure if this should go before or after applying yield
//I guess people can just have their miniscule reactions go to completion regardless of yield.
for(var/reactant in required_reagents)
@@ -93,7 +93,7 @@
if(remainder <= min_reaction*required_reagents[reactant])
progress = reaction_limit
break
-
+
return progress
/datum/chemical_reaction/proc/process(var/datum/reagents/holder)
@@ -101,28 +101,28 @@
var/list/reaction_limits = list()
for(var/reactant in required_reagents)
reaction_limits += holder.get_reagent_amount(reactant) / required_reagents[reactant]
-
+
//determine how far the reaction proceeds
var/reaction_limit = min(reaction_limits)
var/progress_limit = calc_reaction_progress(holder, reaction_limit)
-
+
var/reaction_progress = min(reaction_limit, progress_limit) //no matter what, the reaction progress cannot exceed the stoichiometric limit.
-
+
//need to obtain the new reagent's data before anything is altered
var/data = send_data(holder, reaction_progress)
-
+
//remove the reactants
for(var/reactant in required_reagents)
var/amt_used = required_reagents[reactant] * reaction_progress
holder.remove_reagent(reactant, amt_used, safety = 1)
-
+
//add the product
var/amt_produced = result_amount * reaction_progress
if(result)
holder.add_reagent(result, amt_produced, data, safety = 1)
-
+
on_reaction(holder, amt_produced)
-
+
return reaction_progress
//called when a reaction processes
@@ -314,9 +314,9 @@
/datum/chemical_reaction/dexalin
name = "Dexalin"
id = "dexalin"
- result = "dexalin"
+ result = "dexalin"
required_reagents = list("acetone" = 2, "phoron" = 0.1)
- catalysts = list("phoron" = 1)
+ catalysts = list("phoron" = 1)
inhibitors = list("water" = 1) // Messes with cryox
result_amount = 1
@@ -1470,22 +1470,22 @@
name = "Iced Tea"
id = "icetea"
result = "icetea"
- required_reagents = list("ice" = 1, "tea" = 3)
+ required_reagents = list("ice" = 1, "tea" = 4)
result_amount = 4
/datum/chemical_reaction/icecoffee
name = "Iced Coffee"
id = "icecoffee"
result = "icecoffee"
- required_reagents = list("ice" = 1, "coffee" = 3)
+ required_reagents = list("ice" = 1, "coffee" = 4)
result_amount = 4
/datum/chemical_reaction/nuka_cola
name = "Nuka Cola"
id = "nuka_cola"
result = "nuka_cola"
- required_reagents = list("uranium" = 1, "cola" = 6)
- result_amount = 6
+ required_reagents = list("uranium" = 1, "cola" = 5)
+ result_amount = 5
/datum/chemical_reaction/moonshine
name = "Moonshine"
@@ -1599,8 +1599,8 @@
name = "White Russian"
id = "whiterussian"
result = "whiterussian"
- required_reagents = list("blackrussian" = 3, "cream" = 2)
- result_amount = 5
+ required_reagents = list("blackrussian" = 2, "cream" = 1)
+ result_amount = 3
/datum/chemical_reaction/whiskey_cola
name = "Whiskey Cola"
@@ -1620,8 +1620,8 @@
name = "Bloody Mary"
id = "bloodymary"
result = "bloodymary"
- required_reagents = list("vodka" = 1, "tomatojuice" = 2, "limejuice" = 1)
- result_amount = 4
+ required_reagents = list("vodka" = 2, "tomatojuice" = 3, "limejuice" = 1)
+ result_amount = 6
/datum/chemical_reaction/gargle_blaster
name = "Pan-Galactic Gargle Blaster"
@@ -1648,22 +1648,22 @@
name = "Toxins Special"
id = "phoronspecial"
result = "phoronspecial"
- required_reagents = list("rum" = 2, "vermouth" = 1, "phoron" = 2)
- result_amount = 5
+ required_reagents = list("rum" = 2, "vermouth" = 2, "phoron" = 2)
+ result_amount = 6
/datum/chemical_reaction/beepsky_smash
name = "Beepksy Smash"
id = "beepksysmash"
result = "beepskysmash"
- required_reagents = list("limejuice" = 2, "whiskey" = 2, "iron" = 1)
- result_amount = 4
+ required_reagents = list("limejuice" = 1, "whiskey" = 1, "iron" = 1)
+ result_amount = 2
/datum/chemical_reaction/doctor_delight
name = "The Doctor's Delight"
id = "doctordelight"
result = "doctorsdelight"
- required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 1, "tricordrazine" = 1)
- result_amount = 5
+ required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 2, "tricordrazine" = 1)
+ result_amount = 6
/datum/chemical_reaction/irish_cream
name = "Irish Cream"
@@ -1718,15 +1718,15 @@
name = "Long Island Iced Tea"
id = "longislandicedtea"
result = "longislandicedtea"
- required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 1)
- result_amount = 4
+ required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 3)
+ result_amount = 6
/datum/chemical_reaction/icedtea
name = "Long Island Iced Tea"
id = "longislandicedtea"
result = "longislandicedtea"
- required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 1)
- result_amount = 4
+ required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 3)
+ result_amount = 6
/datum/chemical_reaction/threemileisland
name = "Three Mile Island Iced Tea"
@@ -1746,8 +1746,8 @@
name = "Black Russian"
id = "blackrussian"
result = "blackrussian"
- required_reagents = list("vodka" = 3, "kahlua" = 2)
- result_amount = 5
+ required_reagents = list("vodka" = 2, "kahlua" = 1)
+ result_amount = 3
/datum/chemical_reaction/manhattan
name = "Manhattan"
@@ -1774,8 +1774,8 @@
name = "Gin Fizz"
id = "ginfizz"
result = "ginfizz"
- required_reagents = list("gin" = 2, "sodawater" = 1, "limejuice" = 1)
- result_amount = 4
+ required_reagents = list("gin" = 1, "sodawater" = 1, "limejuice" = 1)
+ result_amount = 3
/datum/chemical_reaction/bahama_mama
name = "Bahama mama"
@@ -1802,22 +1802,22 @@
name = "Demons Blood"
id = "demonsblood"
result = "demonsblood"
- required_reagents = list("rum" = 1, "spacemountainwind" = 1, "blood" = 1, "dr_gibb" = 1)
- result_amount = 4
+ required_reagents = list("rum" = 3, "spacemountainwind" = 1, "blood" = 1, "dr_gibb" = 1)
+ result_amount = 6
/datum/chemical_reaction/booger
name = "Booger"
id = "booger"
result = "booger"
- required_reagents = list("cream" = 1, "banana" = 1, "rum" = 1, "watermelonjuice" = 1)
- result_amount = 4
+ required_reagents = list("cream" = 2, "banana" = 1, "rum" = 1, "watermelonjuice" = 1)
+ result_amount = 5
/datum/chemical_reaction/antifreeze
name = "Anti-freeze"
id = "antifreeze"
result = "antifreeze"
- required_reagents = list("vodka" = 2, "cream" = 1, "ice" = 1)
- result_amount = 4
+ required_reagents = list("vodka" = 1, "cream" = 1, "ice" = 1)
+ result_amount = 3
/datum/chemical_reaction/barefoot
name = "Barefoot"
@@ -1909,14 +1909,14 @@
id = "changelingsting"
result = "changelingsting"
required_reagents = list("screwdrivercocktail" = 1, "limejuice" = 1, "lemonjuice" = 1)
- result_amount = 5
+ result_amount = 3
/datum/chemical_reaction/aloe
name = "Aloe"
id = "aloe"
result = "aloe"
required_reagents = list("cream" = 1, "whiskey" = 1, "watermelonjuice" = 1)
- result_amount = 2
+ result_amount = 3
/datum/chemical_reaction/andalusia
name = "Andalusia"
@@ -1957,8 +1957,8 @@
name = "Erika Surprise"
id = "erikasurprise"
result = "erikasurprise"
- required_reagents = list("ale" = 1, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1)
- result_amount = 5
+ required_reagents = list("ale" = 2, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1)
+ result_amount = 6
/datum/chemical_reaction/devilskiss
name = "Devils Kiss"
@@ -2007,14 +2007,14 @@
id = "kiraspecial"
result = "kiraspecial"
required_reagents = list("orangejuice" = 1, "limejuice" = 1, "sodawater" = 1)
- result_amount = 2
+ result_amount = 3
/datum/chemical_reaction/brownstar
name = "Brown Star"
id = "brownstar"
result = "brownstar"
required_reagents = list("orangejuice" = 2, "cola" = 1)
- result_amount = 2
+ result_amount = 3
/datum/chemical_reaction/milkshake
name = "Milkshake"
@@ -2034,8 +2034,8 @@
name = "Sui Dream"
id = "suidream"
result = "suidream"
- required_reagents = list("space_up" = 2, "bluecuracao" = 1, "melonliquor" = 1)
- result_amount = 4
+ required_reagents = list("space_up" = 1, "bluecuracao" = 1, "melonliquor" = 1)
+ result_amount = 3
/* Removed xenoarcheology stuff
datum
diff --git a/code/modules/reagents/reagent_containers/food.dm b/code/modules/reagents/reagent_containers/food.dm
index 1b94dfcdae..1e797d6040 100644
--- a/code/modules/reagents/reagent_containers/food.dm
+++ b/code/modules/reagents/reagent_containers/food.dm
@@ -1,4 +1,4 @@
-#define CELLS 4
+#define CELLS 8
#define CELLSIZE (32/CELLS)
////////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
index 5c557ce950..fdaf407fa3 100644
--- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
@@ -347,6 +347,33 @@
..()
reagents.add_reagent("grenadine", 100)
+/obj/item/weapon/reagent_containers/food/drinks/bottle/cola
+ name = "\improper Space Cola"
+ desc = "Cola. in space"
+ icon_state = "colabottle"
+ center_of_mass = list("x"=16, "y"=6)
+ New()
+ ..()
+ reagents.add_reagent("cola", 100)
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/space_up
+ name = "\improper Space-Up"
+ desc = "Tastes like a hull breach in your mouth."
+ icon_state = "space-up_bottle"
+ center_of_mass = list("x"=16, "y"=6)
+ New()
+ ..()
+ reagents.add_reagent("space_up", 100)
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind
+ name = "\improper Space Mountain Wind"
+ desc = "Blows right through you like a space wind."
+ icon_state = "space_mountain_wind_bottle"
+ center_of_mass = list("x"=16, "y"=6)
+ New()
+ ..()
+ reagents.add_reagent("spacemountainwind", 100)
+
/obj/item/weapon/reagent_containers/food/drinks/bottle/pwine
name = "Warlock's Velvet"
desc = "What a delightful packaging for a surely high quality wine! The vintage must be amazing!"
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index 69d98f11d6..12af8c4a7f 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -1616,11 +1616,11 @@
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/neaeracube
name = "neaera cube"
- monkey_type = "Neara"
+ monkey_type = "Neaera"
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube
name = "neaera cube"
- monkey_type = "Neara"
+ monkey_type = "Neaera"
/obj/item/weapon/reagent_containers/food/snacks/spellburger
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 9d5bfd40da..ce5fb4670b 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -63,7 +63,7 @@ other types of metals and chemistry for reagents).
desc = "Produce additional disks for storing device designs."
id = "design_disk"
req_tech = list(TECH_DATA = 1)
- materials = list("metal" = 30, "glass" = 10)
+ materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10)
build_path = /obj/item/weapon/disk/design_disk
sort_string = "GAAAA"
@@ -72,7 +72,7 @@ other types of metals and chemistry for reagents).
desc = "Produce additional disks for storing technology data."
id = "tech_disk"
req_tech = list(TECH_DATA = 1)
- materials = list("metal" = 30, "glass" = 10)
+ materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10)
build_path = /obj/item/weapon/disk/tech_disk
sort_string = "GAAAB"
@@ -90,114 +90,114 @@ other types of metals and chemistry for reagents).
/datum/design/item/stock_part/basic_capacitor
id = "basic_capacitor"
req_tech = list(TECH_POWER = 1)
- materials = list("metal" = 50, "glass" = 50)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
build_path = /obj/item/weapon/stock_parts/capacitor
sort_string = "CAAAA"
/datum/design/item/stock_part/adv_capacitor
id = "adv_capacitor"
req_tech = list(TECH_POWER = 3)
- materials = list("metal" = 50, "glass" = 50)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
build_path = /obj/item/weapon/stock_parts/capacitor/adv
sort_string = "CAAAB"
/datum/design/item/stock_part/super_capacitor
id = "super_capacitor"
req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4)
- materials = list("metal" = 50, "glass" = 50, "gold" = 20)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, "gold" = 20)
build_path = /obj/item/weapon/stock_parts/capacitor/super
sort_string = "CAAAC"
/datum/design/item/stock_part/micro_mani
id = "micro_mani"
req_tech = list(TECH_MATERIAL = 1, TECH_DATA = 1)
- materials = list("metal" = 30)
+ materials = list(DEFAULT_WALL_MATERIAL = 30)
build_path = /obj/item/weapon/stock_parts/manipulator
sort_string = "CAABA"
/datum/design/item/stock_part/nano_mani
id = "nano_mani"
req_tech = list(TECH_MATERIAL = 3, TECH_DATA = 2)
- materials = list("metal" = 30)
+ materials = list(DEFAULT_WALL_MATERIAL = 30)
build_path = /obj/item/weapon/stock_parts/manipulator/nano
sort_string = "CAABB"
/datum/design/item/stock_part/pico_mani
id = "pico_mani"
req_tech = list(TECH_MATERIAL = 5, TECH_DATA = 2)
- materials = list("metal" = 30)
+ materials = list(DEFAULT_WALL_MATERIAL = 30)
build_path = /obj/item/weapon/stock_parts/manipulator/pico
sort_string = "CAABC"
/datum/design/item/stock_part/basic_matter_bin
id = "basic_matter_bin"
req_tech = list(TECH_MATERIAL = 1)
- materials = list("metal" = 80)
+ materials = list(DEFAULT_WALL_MATERIAL = 80)
build_path = /obj/item/weapon/stock_parts/matter_bin
sort_string = "CAACA"
/datum/design/item/stock_part/adv_matter_bin
id = "adv_matter_bin"
req_tech = list(TECH_MATERIAL = 3)
- materials = list("metal" = 80)
+ materials = list(DEFAULT_WALL_MATERIAL = 80)
build_path = /obj/item/weapon/stock_parts/matter_bin/adv
sort_string = "CAACB"
/datum/design/item/stock_part/super_matter_bin
id = "super_matter_bin"
req_tech = list(TECH_MATERIAL = 5)
- materials = list("metal" = 80)
+ materials = list(DEFAULT_WALL_MATERIAL = 80)
build_path = /obj/item/weapon/stock_parts/matter_bin/super
sort_string = "CAACC"
/datum/design/item/stock_part/basic_micro_laser
id = "basic_micro_laser"
req_tech = list(TECH_MAGNET = 1)
- materials = list("metal" = 10, "glass" = 20)
+ materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20)
build_path = /obj/item/weapon/stock_parts/micro_laser
sort_string = "CAADA"
/datum/design/item/stock_part/high_micro_laser
id = "high_micro_laser"
req_tech = list(TECH_MAGNET = 3)
- materials = list("metal" = 10, "glass" = 20)
+ materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20)
build_path = /obj/item/weapon/stock_parts/micro_laser/high
sort_string = "CAADB"
/datum/design/item/stock_part/ultra_micro_laser
id = "ultra_micro_laser"
req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5)
- materials = list("metal" = 10, "glass" = 20, "uranium" = 10)
+ materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20, "uranium" = 10)
build_path = /obj/item/weapon/stock_parts/micro_laser/ultra
sort_string = "CAADC"
/datum/design/item/stock_part/basic_sensor
id = "basic_sensor"
req_tech = list(TECH_MAGNET = 1)
- materials = list("metal" = 50, "glass" = 20)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20)
build_path = /obj/item/weapon/stock_parts/scanning_module
sort_string = "CAAEA"
/datum/design/item/stock_part/adv_sensor
id = "adv_sensor"
req_tech = list(TECH_MAGNET = 3)
- materials = list("metal" = 50, "glass" = 20)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20)
build_path = /obj/item/weapon/stock_parts/scanning_module/adv
sort_string = "CAAEB"
/datum/design/item/stock_part/phasic_sensor
id = "phasic_sensor"
req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 3)
- materials = list("metal" = 50, "glass" = 20, "silver" = 10)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20, "silver" = 10)
build_path = /obj/item/weapon/stock_parts/scanning_module/phasic
sort_string = "CAAEC"
/datum/design/item/stock_part/RPED
name = "Rapid Part Exchange Device"
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
- id = "rped"
+ id = "rped"
req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 3)
- materials = list("metal" = 15000, "glass" = 5000)
+ materials = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 5000)
build_path = /obj/item/weapon/storage/part_replacer
sort_string = "CBAAA"
@@ -217,7 +217,7 @@ other types of metals and chemistry for reagents).
build_type = PROTOLATHE | MECHFAB
id = "basic_cell"
req_tech = list(TECH_POWER = 1)
- materials = list("metal" = 700, "glass" = 50)
+ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
build_path = /obj/item/weapon/cell
category = "Misc"
sort_string = "DAAAA"
@@ -227,7 +227,7 @@ other types of metals and chemistry for reagents).
build_type = PROTOLATHE | MECHFAB
id = "high_cell"
req_tech = list(TECH_POWER = 2)
- materials = list("metal" = 700, "glass" = 60)
+ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60)
build_path = /obj/item/weapon/cell/high
category = "Misc"
sort_string = "DAAAB"
@@ -236,7 +236,7 @@ other types of metals and chemistry for reagents).
name = "super-capacity"
id = "super_cell"
req_tech = list(TECH_POWER = 3, TECH_MATERIAL = 2)
- materials = list("metal" = 700, "glass" = 70)
+ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70)
build_path = /obj/item/weapon/cell/super
category = "Misc"
sort_string = "DAAAC"
@@ -245,13 +245,13 @@ other types of metals and chemistry for reagents).
name = "hyper-capacity"
id = "hyper_cell"
req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4)
- materials = list("metal" = 400, "gold" = 150, "silver" = 150, "glass" = 70)
+ materials = list(DEFAULT_WALL_MATERIAL = 400, "gold" = 150, "silver" = 150, "glass" = 70)
build_path = /obj/item/weapon/cell/hyper
category = "Misc"
sort_string = "DAAAD"
/datum/design/item/hud
- materials = list("metal" = 50, "glass" = 50)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
/datum/design/item/hud/AssembleDesignName()
..()
@@ -277,9 +277,9 @@ other types of metals and chemistry for reagents).
/datum/design/item/mesons
name = "Optical meson scanners design"
desc = "Using the meson-scanning technology those glasses allow you to see through walls, floor or anything else."
- id = "mesons"
+ id = "mesons"
req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2)
- materials = list("metal" = 50, "glass" = 50)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
build_path = /obj/item/clothing/glasses/meson
sort_string = "GAAAC"
@@ -288,23 +288,23 @@ other types of metals and chemistry for reagents).
name = "Mining equipment design ([item_name])"
/datum/design/item/weapon/mining/jackhammer
- id = "jackhammer"
+ id = "jackhammer"
req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2)
- materials = list("metal" = 2000, "glass" = 500, "silver" = 500)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "silver" = 500)
build_path = /obj/item/weapon/pickaxe/jackhammer
sort_string = "KAAAA"
/datum/design/item/weapon/mining/drill
- id = "drill"
+ id = "drill"
req_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2)
- materials = list("metal" = 6000, "glass" = 1000) //expensive, but no need for miners.
+ materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1000) //expensive, but no need for miners.
build_path = /obj/item/weapon/pickaxe/drill
sort_string = "KAAAB"
/datum/design/item/weapon/mining/plasmacutter
- id = "plasmacutter"
+ id = "plasmacutter"
req_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3)
- materials = list("metal" = 1500, "glass" = 500, "gold" = 500, "phoron" = 500)
+ materials = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 500, "gold" = 500, "phoron" = 500)
build_path = /obj/item/weapon/pickaxe/plasmacutter
sort_string = "KAAAC"
@@ -316,9 +316,9 @@ other types of metals and chemistry for reagents).
sort_string = "KAAAD"
/datum/design/item/weapon/mining/drill_diamond
- id = "drill_diamond"
+ id = "drill_diamond"
req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 4)
- materials = list("metal" = 3000, "glass" = 1000, "diamond" = 2000)
+ materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 1000, "diamond" = 2000)
build_path = /obj/item/weapon/pickaxe/diamonddrill
sort_string = "KAAAE"
///////////////////////////////////
@@ -329,7 +329,7 @@ other types of metals and chemistry for reagents).
materials = list("$glass" = 2000, "sacid" = 20, "$phoron" = 10000, "$diamond" = 5000, "$gold" = 10000)
/datum/design/item/medical
- materials = list("metal" = 30, "glass" = 20)
+ materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 20)
/datum/design/item/medical/AssembleDesignName()
..()
@@ -337,9 +337,9 @@ other types of metals and chemistry for reagents).
/datum/design/item/medical/robot_scanner
desc = "A hand-held scanner able to diagnose robotic injuries."
- id = "robot_scanner"
+ id = "robot_scanner"
req_tech = list(TECH_MAGNET = 3, TECH_BIO = 2, TECH_ENGINEERING = 3)
- materials = list("metal" = 500, "glass" = 200)
+ materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200)
build_path = /obj/item/device/robotanalyzer
sort_string = "MACFA"
@@ -379,7 +379,7 @@ other types of metals and chemistry for reagents).
desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units."
id = "splitbeaker"
req_tech = list(TECH_MATERIAL = 2)
- materials = list("metal" = 3000)
+ materials = list(DEFAULT_WALL_MATERIAL = 3000)
build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact
sort_string = "MADAA"
@@ -388,15 +388,15 @@ other types of metals and chemistry for reagents).
desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units."
id = "bluespacebeaker"
req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 6)
- materials = list("metal" = 3000, "phoron" = 3000, "diamond" = 500)
+ materials = list(DEFAULT_WALL_MATERIAL = 3000, "phoron" = 3000, "diamond" = 500)
build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace
sort_string = "MADAB"
/datum/design/item/medical/nanopaste
desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery."
- id = "nanopaste"
+ id = "nanopaste"
req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3)
- materials = list("metal" = 7000, "glass" = 7000)
+ materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000)
build_path = /obj/item/stack/nanopaste
sort_string = "MBAAA"
@@ -405,7 +405,7 @@ other types of metals and chemistry for reagents).
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved."
id = "scalpel_laser1"
req_tech = list(TECH_BIO = 2, TECH_MATERIAL = 2, TECH_MAGNET = 2)
- materials = list("metal" = 12500, "glass" = 7500)
+ materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500)
build_path = /obj/item/weapon/scalpel/laser1
sort_string = "MBBAA"
@@ -414,7 +414,7 @@ other types of metals and chemistry for reagents).
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced."
id = "scalpel_laser2"
req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 4, TECH_MAGNET = 4)
- materials = list("metal" = 12500, "glass" = 7500, "silver" = 2500)
+ materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2500)
build_path = /obj/item/weapon/scalpel/laser2
sort_string = "MBBAB"
@@ -423,7 +423,7 @@ other types of metals and chemistry for reagents).
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!"
id = "scalpel_laser3"
req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 5)
- materials = list("metal" = 12500, "glass" = 7500, "silver" = 2000, "gold" = 1500)
+ materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2000, "gold" = 1500)
build_path = /obj/item/weapon/scalpel/laser3
sort_string = "MBBAC"
@@ -432,12 +432,12 @@ other types of metals and chemistry for reagents).
desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision allowing for the immediate commencement of therapeutic steps."
id = "scalpel_manager"
req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 7, TECH_MAGNET = 5, TECH_DATA = 4)
- materials = list ("metal" = 12500, "glass" = 7500, "silver" = 1500, "gold" = 1500, "diamond" = 750)
+ materials = list (DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 1500, "gold" = 1500, "diamond" = 750)
build_path = /obj/item/weapon/scalpel/manager
sort_string = "MBBAD"
/datum/design/item/implant
- materials = list("metal" = 50, "glass" = 50)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
/datum/design/item/implant/AssembleDesignName()
..()
@@ -471,14 +471,14 @@ other types of metals and chemistry for reagents).
/datum/design/item/weapon/stunrevolver
id = "stunrevolver"
req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
- materials = list("metal" = 4000)
+ materials = list(DEFAULT_WALL_MATERIAL = 4000)
build_path = /obj/item/weapon/gun/energy/stunrevolver
sort_string = "TAAAA"
/datum/design/item/weapon/nuclear_gun
id = "nuclear_gun"
req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3)
- materials = list("metal" = 5000, "glass" = 1000, "uranium" = 500)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "uranium" = 500)
build_path = /obj/item/weapon/gun/energy/gun/nuclear
sort_string = "TAAAB"
@@ -486,14 +486,14 @@ other types of metals and chemistry for reagents).
desc = "The lasing medium of this prototype is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core."
id = "lasercannon"
req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
- materials = list("metal" = 10000, "glass" = 1000, "diamond" = 2000)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1000, "diamond" = 2000)
build_path = /obj/item/weapon/gun/energy/lasercannon
sort_string = "TAAAC"
/datum/design/item/weapon/phoronpistol
id = "ppistol"
req_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4)
- materials = list("metal" = 5000, "glass" = 1000, "phoron" = 3000)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "phoron" = 3000)
build_path = /obj/item/weapon/gun/energy/toxgun
sort_string = "TAAAD"
@@ -507,14 +507,14 @@ other types of metals and chemistry for reagents).
/datum/design/item/weapon/smg
id = "smg"
req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3)
- materials = list("metal" = 8000, "silver" = 2000, "diamond" = 1000)
+ materials = list(DEFAULT_WALL_MATERIAL = 8000, "silver" = 2000, "diamond" = 1000)
build_path = /obj/item/weapon/gun/projectile/automatic
sort_string = "TAABA"
/datum/design/item/weapon/ammo_9mm
id = "ammo_9mm"
req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3)
- materials = list("metal" = 3750, "silver" = 100)
+ materials = list(DEFAULT_WALL_MATERIAL = 3750, "silver" = 100)
build_path = /obj/item/ammo_magazine/c9mm
sort_string = "TAACA"
@@ -522,22 +522,22 @@ other types of metals and chemistry for reagents).
desc = "A stunning shell for a shotgun."
id = "stunshell"
req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3)
- materials = list("metal" = 4000)
+ materials = list(DEFAULT_WALL_MATERIAL = 4000)
build_path = /obj/item/ammo_casing/shotgun/stunshell
sort_string = "TAACB"
/datum/design/item/weapon/chemsprayer
desc = "An advanced chem spraying device."
- id = "chemsprayer"
+ id = "chemsprayer"
req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2)
- materials = list("metal" = 5000, "glass" = 1000)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000)
build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer
sort_string = "TABAA"
/datum/design/item/weapon/rapidsyringe
- id = "rapidsyringe"
+ id = "rapidsyringe"
req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2)
- materials = list("metal" = 5000, "glass" = 1000)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000)
build_path = /obj/item/weapon/gun/launcher/syringe/rapid
sort_string = "TABAB"
@@ -545,56 +545,56 @@ other types of metals and chemistry for reagents).
desc = "A gun that shoots high-powered glass-encased energy temperature bullets."
id = "temp_gun"
req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2)
- materials = list("metal" = 5000, "glass" = 500, "silver" = 3000)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 500, "silver" = 3000)
build_path = /obj/item/weapon/gun/energy/temperature
sort_string = "TABAC"
/datum/design/item/weapon/large_grenade
id = "large_Grenade"
req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2)
- materials = list("metal" = 3000)
+ materials = list(DEFAULT_WALL_MATERIAL = 3000)
build_path = /obj/item/weapon/grenade/chem_grenade/large
sort_string = "TACAA"
/datum/design/item/weapon/flora_gun
id = "flora_gun"
req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3)
- materials = list("metal" = 2000, "glass" = 500, "uranium" = 500)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "uranium" = 500)
build_path = /obj/item/weapon/gun/energy/floragun
sort_string = "TBAAA"
/datum/design/item/stock_part/subspace_ansible
id = "s-ansible"
req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
- materials = list("metal" = 80, "silver" = 20)
+ materials = list(DEFAULT_WALL_MATERIAL = 80, "silver" = 20)
build_path = /obj/item/weapon/stock_parts/subspace/ansible
sort_string = "UAAAA"
/datum/design/item/stock_part/hyperwave_filter
id = "s-filter"
req_tech = list(TECH_DATA = 3, TECH_MAGNET = 3)
- materials = list("metal" = 40, "silver" = 10)
+ materials = list(DEFAULT_WALL_MATERIAL = 40, "silver" = 10)
build_path = /obj/item/weapon/stock_parts/subspace/filter
sort_string = "UAAAB"
/datum/design/item/stock_part/subspace_amplifier
id = "s-amplifier"
req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
- materials = list("metal" = 10, "gold" = 30, "uranium" = 15)
+ materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 30, "uranium" = 15)
build_path = /obj/item/weapon/stock_parts/subspace/amplifier
sort_string = "UAAAC"
/datum/design/item/stock_part/subspace_treatment
id = "s-treatment"
req_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
- materials = list("metal" = 10, "silver" = 20)
+ materials = list(DEFAULT_WALL_MATERIAL = 10, "silver" = 20)
build_path = /obj/item/weapon/stock_parts/subspace/treatment
sort_string = "UAAAD"
/datum/design/item/stock_part/subspace_analyzer
id = "s-analyzer"
req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
- materials = list("metal" = 10, "gold" = 15)
+ materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 15)
build_path = /obj/item/weapon/stock_parts/subspace/analyzer
sort_string = "UAAAE"
@@ -617,7 +617,7 @@ other types of metals and chemistry for reagents).
desc = "A device to automatically replace lights. Refill with working lightbulbs."
id = "light_replacer"
req_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 4)
- materials = list("metal" = 1500, "silver" = 150, "glass" = 3000)
+ materials = list(DEFAULT_WALL_MATERIAL = 1500, "silver" = 150, "glass" = 3000)
build_path = /obj/item/device/lightreplacer
sort_string = "VAAAH"
@@ -625,7 +625,7 @@ other types of metals and chemistry for reagents).
name = "'pAI', personal artificial intelligence device"
id = "paicard"
req_tech = list(TECH_DATA = 2)
- materials = list("glass" = 500, "metal" = 500)
+ materials = list("glass" = 500, DEFAULT_WALL_MATERIAL = 500)
build_path = /obj/item/device/paicard
sort_string = "VABAI"
@@ -639,26 +639,31 @@ other types of metals and chemistry for reagents).
sort_string = "VACAA"
/datum/design/item/posibrain
- id = "posibrain"
+ name = "Positronic brain"
+ id = "posibrain"
req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4)
- materials = list("metal" = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100)
build_path = /obj/item/device/mmi/digital/posibrain
+ category = "Misc"
sort_string = "VACAB"
-/datum/design/item/medical/mmi
+/datum/design/item/mmi
+ name = "Man-machine interface"
id = "mmi"
req_tech = list(TECH_DATA = 2, TECH_BIO = 3)
build_type = PROTOLATHE | MECHFAB
- materials = list("metal" = 1000, "glass" = 500)
+ materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500)
build_path = /obj/item/device/mmi
category = "Misc"
sort_string = "VACBA"
-/datum/design/item/medical/mmi_radio
+/datum/design/item/mmi_radio
+ name = "Radio-enabled man-machine interface"
id = "mmi_radio"
req_tech = list(TECH_DATA = 2, TECH_BIO = 4)
build_type = PROTOLATHE | MECHFAB
- materials = list("metal" = 1200, "glass" = 500)
+ materials = list(DEFAULT_WALL_MATERIAL = 1200, "glass" = 500)
build_path = /obj/item/device/mmi/radio_enabled
category = "Misc"
sort_string = "VACBB"
@@ -667,7 +672,7 @@ other types of metals and chemistry for reagents).
name = "Bluespace tracking beacon design"
id = "beacon"
req_tech = list(TECH_BLUESPACE = 1)
- materials = list ("metal" = 20, "glass" = 10)
+ materials = list (DEFAULT_WALL_MATERIAL = 20, "glass" = 10)
build_path = /obj/item/device/radio/beacon
sort_string = "VADAA"
@@ -685,7 +690,7 @@ other types of metals and chemistry for reagents).
desc = "Allows for deciphering the binary channel on-the-fly."
id = "binaryencrypt"
req_tech = list(TECH_ILLEGAL = 2)
- materials = list("metal" = 300, "glass" = 300)
+ materials = list(DEFAULT_WALL_MATERIAL = 300, "glass" = 300)
build_path = /obj/item/device/encryptionkey/binary
sort_string = "VASAA"
@@ -694,7 +699,7 @@ other types of metals and chemistry for reagents).
desc = "A kit of dangerous, high-tech equipment with changeable looks."
id = "chameleon"
req_tech = list(TECH_ILLEGAL = 2)
- materials = list("metal" = 500)
+ materials = list(DEFAULT_WALL_MATERIAL = 500)
build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon
sort_string = "VASBA"
@@ -1349,16 +1354,16 @@ CIRCUITS BELOW
/datum/design/item/pda
name = "PDA design"
desc = "Cheaper than whiny non-digital assistants."
- id = "pda"
+ id = "pda"
req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3)
- materials = list("metal" = 50, "glass" = 50)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
build_path = /obj/item/device/pda
sort_string = "VAAAA"
// Cartridges
-/datum/design/item/pda_cartridge
+/datum/design/item/pda_cartridge
req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3)
- materials = list("metal" = 50, "glass" = 50)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
/datum/design/item/pda_cartridge/AssembleDesignName()
..()
@@ -1438,155 +1443,7 @@ CIRCUITS BELOW
id = "cart_captain"
build_path = /obj/item/weapon/cartridge/captain
sort_string = "VBAAO"
-
-/*
-MECHAS BELOW
-*/
-
-/datum/design/item/mecha
- build_type = MECHFAB
- req_tech = list(TECH_COMBAT = 3)
- category = "Exosuit Equipment"
-
-/datum/design/item/mecha/AssembleDesignName()
- ..()
- name = "Exosuit module design ([item_name])"
-
-/datum/design/item/mecha/weapon/AssembleDesignName()
- ..()
- name = "Exosuit weapon design ([item_name])"
-
-/datum/design/item/mecha/AssembleDesignDesc()
- if(!desc)
- desc = "Allows for the construction of \a '[item_name]' exosuit module."
-
-// *** Weapon modules
-/datum/design/item/mecha/weapon/scattershot
- id = "mech_scattershot"
- req_tech = list(TECH_COMBAT = 4)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
-
-/datum/design/item/mecha/weapon/laser
- id = "mech_laser"
- req_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
-
-/datum/design/item/mecha/weapon/laser_rigged
- desc = "Allows for the construction of a welder-laser assembly package for non-combat exosuits."
- id = "mech_laser_rigged"
- req_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser
-
-/datum/design/item/mecha/weapon/laser_heavy
- id = "mech_laser_heavy"
- req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
-
-/datum/design/item/mecha/weapon/ion
- id = "mech_ion"
- req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion
-
-/datum/design/item/mecha/weapon/grenade_launcher
- id = "mech_grenade_launcher"
- req_tech = list(TECH_COMBAT = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
-
-/datum/design/item/mecha/weapon/clusterbang_launcher
- desc = "A weapon that violates the Geneva Convention at 6 rounds per minute."
- id = "clusterbang_launcher"
- req_tech = list(TECH_COMBAT= 5, TECH_MATERIAL = 5, TECH_ILLEGAL = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited
-
-// *** Nonweapon modules
-/datum/design/item/mecha/wormhole_gen
- desc = "An exosuit module that can generate small quasi-stable wormholes."
- id = "mech_wormhole_gen"
- req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 2)
- build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator
-
-/datum/design/item/mecha/teleporter
- desc = "An exosuit module that allows teleportation to any position in view."
- id = "mech_teleporter"
- req_tech = list(TECH_BLUESPACE = 10, TECH_MAGNET = 5)
- build_path = /obj/item/mecha_parts/mecha_equipment/teleporter
-
-/datum/design/item/mecha/rcd
- desc = "An exosuit-mounted rapid construction device."
- id = "mech_rcd"
- req_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_POWER=4, TECH_ENGINEERING = 4)
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/rcd
-
-/datum/design/item/mecha/gravcatapult
- desc = "An exosuit-mounted gravitational catapult."
- id = "mech_gravcatapult"
- req_tech = list(TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_ENGINEERING = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult
-
-/datum/design/item/mecha/repair_droid
- desc = "Automated repair droid, exosuits' best companion. BEEP BOOP"
- id = "mech_repair_droid"
- req_tech = list(TECH_MAGNET = 3, TECH_DATA = 3, TECH_ENGINEERING = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid
-
-/datum/design/item/mecha/phoron_generator
- desc = "Exosuit-mounted phoron generator."
- id = "mech_phoron_generator"
- req_tech = list(TECH_PHORON = 2, TECH_POWER= 2, TECH_ENGINEERING = 2)
- build_path = /obj/item/mecha_parts/mecha_equipment/generator
-
-/datum/design/item/mecha/energy_relay
- id = "mech_energy_relay"
- req_tech = list(TECH_MAGNET = 4, TECH_POWER = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
-
-/datum/design/item/mecha/ccw_armor
- desc = "Exosuit close-combat armor booster."
- id = "mech_ccw_armor"
- req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4)
- build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster
-
-/datum/design/item/mecha/proj_armor
- desc = "Exosuit projectile armor booster."
- id = "mech_proj_armor"
- req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_ENGINEERING=3)
- build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
-
-/datum/design/item/mecha/syringe_gun
- desc = "Exosuit-mounted syringe gun and chemical synthesizer."
- id = "mech_syringe_gun"
- req_tech = list(TECH_MATERIAL = 3, TECH_BIO=4, TECH_MAGNET=4, TECH_DATA=3)
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
-
-/datum/design/item/mecha/diamond_drill
- desc = "A diamond version of the exosuit drill. It's harder, better, faster, stronger."
- id = "mech_diamond_drill"
- req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill
-
-/datum/design/item/mecha/generator_nuclear
- desc = "Exosuit-held nuclear reactor. Converts uranium and everyone's health to energy."
- id = "mech_generator_nuclear"
- req_tech = list(TECH_POWER= 3, TECH_ENGINEERING = 3, TECH_MATERIAL = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear
-
-/datum/design/item/synthetic_flash
- id = "sflash"
- req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2)
- build_type = MECHFAB
- materials = list("metal" = 750, "glass" = 750)
- build_path = /obj/item/device/flash/synthetic
- category = "Misc"
-
-/datum/design/item/borg_syndicate_module
- name = "Cyborg lethal weapons upgrade"
- desc = "Allows for the construction of lethal upgrades for cyborgs."
- id = "borg_syndicate_module"
- build_type = MECHFAB
- req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3)
- build_path = /obj/item/borg/upgrade/syndicate
- category = "Cyborg Upgrade Modules"
-
+
/* Uncomment if someone makes these buildable
/datum/design/circuit/general_alert
name = "general alert console"
@@ -1598,7 +1455,7 @@ MECHAS BELOW
name = "loyalty"
id = "implant_loyal"
req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3)
- materials = list("metal" = 7000, "glass" = 7000)
+ materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000)
build_path = /obj/item/weapon/implantcase/loyalty"
/datum/design/rust_core_control
diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm
new file mode 100644
index 0000000000..cfdce572b1
--- /dev/null
+++ b/code/modules/research/mechfab_designs.dm
@@ -0,0 +1,589 @@
+/datum/design/item/mechfab
+ build_type = MECHFAB
+ category = "Misc"
+ req_tech = list(TECH_MATERIAL = 1)
+
+/datum/design/item/mechfab/robot
+ category = "Robot"
+
+/datum/design/item/mechfab/robot/exoskeleton
+ name = "Robot exoskeleton"
+ id = "robot_exoskeleton"
+ build_path = /obj/item/robot_parts/robot_suit
+ time = 50
+ materials = list(DEFAULT_WALL_MATERIAL = 50000)
+
+/datum/design/item/mechfab/robot/torso
+ name = "Robot torso"
+ id = "robot_torso"
+ build_path = /obj/item/robot_parts/chest
+ time = 35
+ materials = list(DEFAULT_WALL_MATERIAL = 40000)
+
+/datum/design/item/mechfab/robot/head
+ name = "Robot head"
+ id = "robot_head"
+ build_path = /obj/item/robot_parts/head
+ time = 35
+ materials = list(DEFAULT_WALL_MATERIAL = 25000)
+
+/datum/design/item/mechfab/robot/l_arm
+ name = "Robot left arm"
+ id = "robot_l_arm"
+ build_path = /obj/item/robot_parts/l_arm
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 18000)
+
+/datum/design/item/mechfab/robot/r_arm
+ name = "Robot right arm"
+ id = "robot_r_arm"
+ build_path = /obj/item/robot_parts/r_arm
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 18000)
+
+/datum/design/item/mechfab/robot/l_leg
+ name = "Robot left leg"
+ id = "robot_l_leg"
+ build_path = /obj/item/robot_parts/l_leg
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 15000)
+
+/datum/design/item/mechfab/robot/r_leg
+ name = "Robot right leg"
+ id = "robot_r_leg"
+ build_path = /obj/item/robot_parts/r_leg
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 15000)
+
+/datum/design/item/mechfab/robot/component
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 5000)
+
+/datum/design/item/mechfab/robot/component/binary_communication_device
+ name = "Binary communication device"
+ id = "binary_communication_device"
+ build_path = /obj/item/robot_parts/robot_component/binary_communication_device
+
+/datum/design/item/mechfab/robot/component/radio
+ name = "Radio"
+ id = "radio"
+ build_path = /obj/item/robot_parts/robot_component/radio
+
+/datum/design/item/mechfab/robot/component/actuator
+ name = "Actuator"
+ id = "actuator"
+ build_path = /obj/item/robot_parts/robot_component/actuator
+
+/datum/design/item/mechfab/robot/component/diagnosis_unit
+ name = "Diagnosis unit"
+ id = "diagnosis_unit"
+ build_path = /obj/item/robot_parts/robot_component/diagnosis_unit
+
+/datum/design/item/mechfab/robot/component/camera
+ name = "Camera"
+ id = "camera"
+ build_path = /obj/item/robot_parts/robot_component/camera
+
+/datum/design/item/mechfab/robot/component/armour
+ name = "Armour plating"
+ id = "armour"
+ build_path = /obj/item/robot_parts/robot_component/armour
+
+/datum/design/item/mechfab/ripley
+ category = "Ripley"
+
+/datum/design/item/mechfab/ripley/chassis
+ name = "Ripley chassis"
+ id = "ripley_chassis"
+ build_path = /obj/item/mecha_parts/chassis/ripley
+ time = 10
+ materials = list(DEFAULT_WALL_MATERIAL = 20000)
+
+/datum/design/item/mechfab/ripley/chassis/firefighter
+ name = "Firefigher chassis"
+ id = "firefighter_chassis"
+ build_path = /obj/item/mecha_parts/chassis/firefighter
+
+/datum/design/item/mechfab/ripley/torso
+ name = "Ripley torso"
+ id = "ripley_torso"
+ build_path = /obj/item/mecha_parts/part/ripley_torso
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 40000, "glass" = 15000)
+
+/datum/design/item/mechfab/ripley/left_arm
+ name = "Ripley left arm"
+ id = "ripley_left_arm"
+ build_path = /obj/item/mecha_parts/part/ripley_left_arm
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 25000)
+
+/datum/design/item/mechfab/ripley/right_arm
+ name = "Ripley right arm"
+ id = "ripley_right_arm"
+ build_path = /obj/item/mecha_parts/part/ripley_right_arm
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 25000)
+
+/datum/design/item/mechfab/ripley/left_leg
+ name = "Ripley left leg"
+ id = "ripley_left_leg"
+ build_path = /obj/item/mecha_parts/part/ripley_left_leg
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 30000)
+
+/datum/design/item/mechfab/ripley/right_leg
+ name = "Ripley right leg"
+ id = "ripley_right_leg"
+ build_path = /obj/item/mecha_parts/part/ripley_right_leg
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 30000)
+
+/datum/design/item/mechfab/odysseus
+ category = "Odysseus"
+
+/datum/design/item/mechfab/odysseus/chassis
+ name = "Odysseus chassis"
+ id = "odysseus_chassis"
+ build_path = /obj/item/mecha_parts/chassis/odysseus
+ time = 10
+ materials = list(DEFAULT_WALL_MATERIAL = 20000)
+
+/datum/design/item/mechfab/odysseus/torso
+ name = "Odysseus torso"
+ id = "odysseus_torso"
+ build_path = /obj/item/mecha_parts/part/odysseus_torso
+ time = 18
+ materials = list(DEFAULT_WALL_MATERIAL = 25000)
+
+/datum/design/item/mechfab/odysseus/head
+ name = "Odysseus head"
+ id = "odysseus_head"
+ build_path = /obj/item/mecha_parts/part/odysseus_head
+ time = 10
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 10000)
+
+/datum/design/item/mechfab/odysseus/left_arm
+ name = "Odysseus left arm"
+ id = "odysseus_left_arm"
+ build_path = /obj/item/mecha_parts/part/odysseus_left_arm
+ time = 12
+ materials = list(DEFAULT_WALL_MATERIAL = 10000)
+
+/datum/design/item/mechfab/odysseus/right_arm
+ name = "Odysseus right arm"
+ id = "odysseus_right_arm"
+ build_path = /obj/item/mecha_parts/part/odysseus_right_arm
+ time = 12
+ materials = list(DEFAULT_WALL_MATERIAL = 10000)
+
+/datum/design/item/mechfab/odysseus/left_leg
+ name = "Odysseus left leg"
+ id = "odysseus_left_leg"
+ build_path = /obj/item/mecha_parts/part/odysseus_left_leg
+ time = 13
+ materials = list(DEFAULT_WALL_MATERIAL = 15000)
+
+/datum/design/item/mechfab/odysseus/right_leg
+ name = "Odysseus right leg"
+ id = "odysseus_right_leg"
+ build_path = /obj/item/mecha_parts/part/odysseus_right_leg
+ time = 13
+ materials = list(DEFAULT_WALL_MATERIAL = 15000)
+
+/datum/design/item/mechfab/gygax
+ category = "Gygax"
+
+/datum/design/item/mechfab/gygax/chassis
+ name = "Gygax chassis"
+ id = "gygax_chassis"
+ build_path = /obj/item/mecha_parts/chassis/gygax
+ time = 10
+ materials = list(DEFAULT_WALL_MATERIAL = 25000)
+
+/datum/design/item/mechfab/gygax/torso
+ name = "Gygax torso"
+ id = "gygax_torso"
+ build_path = /obj/item/mecha_parts/part/gygax_torso
+ time = 30
+ materials = list(DEFAULT_WALL_MATERIAL = 50000, "glass" = 20000)
+
+/datum/design/item/mechfab/gygax/head
+ name = "Gygax head"
+ id = "gygax_head"
+ build_path = /obj/item/mecha_parts/part/gygax_head
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 20000, "glass" = 10000)
+
+/datum/design/item/mechfab/gygax/left_arm
+ name = "Gygax left arm"
+ id = "gygax_left_arm"
+ build_path = /obj/item/mecha_parts/part/gygax_left_arm
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 30000)
+
+/datum/design/item/mechfab/gygax/right_arm
+ name = "Gygax right arm"
+ id = "gygax_right_arm"
+ build_path = /obj/item/mecha_parts/part/gygax_right_arm
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 30000)
+
+/datum/design/item/mechfab/gygax/left_leg
+ name = "Gygax left leg"
+ id = "gygax_left_leg"
+ build_path = /obj/item/mecha_parts/part/gygax_left_leg
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 35000)
+
+/datum/design/item/mechfab/gygax/right_leg
+ name = "Gygax right leg"
+ id = "gygax_right_leg"
+ build_path = /obj/item/mecha_parts/part/gygax_right_leg
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 35000)
+
+/datum/design/item/mechfab/gygax/armour
+ name = "Gygax armour plates"
+ id = "gygax_armour"
+ build_path = /obj/item/mecha_parts/part/gygax_armour
+ time = 60
+ materials = list(DEFAULT_WALL_MATERIAL = 50000, "diamond" = 10000)
+
+/datum/design/item/mechfab/durand
+ category = "Durand"
+
+/datum/design/item/mechfab/durand/chassis
+ name = "Durand chassis"
+ id = "durand_chassis"
+ build_path = /obj/item/mecha_parts/chassis/durand
+ time = 10
+ materials = list(DEFAULT_WALL_MATERIAL = 25000)
+
+/datum/design/item/mechfab/durand/torso
+ name = "Durand torso"
+ id = "durand_torso"
+ build_path = /obj/item/mecha_parts/part/durand_torso
+ time = 30
+ materials = list(DEFAULT_WALL_MATERIAL = 55000, "glass" = 20000, "silver" = 10000)
+
+/datum/design/item/mechfab/durand/head
+ name = "Durand head"
+ id = "durand_head"
+ build_path = /obj/item/mecha_parts/part/durand_head
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 25000, "glass" = 10000, "silver" = 3000)
+
+/datum/design/item/mechfab/durand/left_arm
+ name = "Durand left arm"
+ id = "durand_left_arm"
+ build_path = /obj/item/mecha_parts/part/durand_left_arm
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 35000, "silver" = 3000)
+
+/datum/design/item/mechfab/durand/right_arm
+ name = "Durand right arm"
+ id = "durand_right_arm"
+ build_path = /obj/item/mecha_parts/part/durand_right_arm
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 35000, "silver" = 3000)
+
+/datum/design/item/mechfab/durand/left_leg
+ name = "Durand left leg"
+ id = "durand_left_leg"
+ build_path = /obj/item/mecha_parts/part/durand_left_leg
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 40000, "silver" = 3000)
+
+/datum/design/item/mechfab/durand/right_leg
+ name = "Durand right leg"
+ id = "durand_right_leg"
+ build_path = /obj/item/mecha_parts/part/durand_right_leg
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 40000, "silver" = 3000)
+
+/datum/design/item/mechfab/durand/armour
+ name = "Durand armour plates"
+ id = "durand_armour"
+ build_path = /obj/item/mecha_parts/part/durand_armour
+ time = 60
+ materials = list(DEFAULT_WALL_MATERIAL = 50000, "uranium" = 10000)
+
+/datum/design/item/robot_upgrade
+ build_type = MECHFAB
+ time = 12
+ materials = list(DEFAULT_WALL_MATERIAL = 10000)
+ category = "Cyborg Upgrade Modules"
+
+/datum/design/item/robot_upgrade/rename
+ name = "Rename module"
+ desc = "Used to rename a cyborg."
+ id = "borg_rename_module"
+ build_path = /obj/item/borg/upgrade/rename
+
+/datum/design/item/robot_upgrade/reset
+ name = "Reset module"
+ desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot."
+ id = "borg_reset_module"
+ build_path = /obj/item/borg/upgrade/reset
+
+/datum/design/item/robot_upgrade/restart
+ name = "Emergency restart module"
+ desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online."
+ id = "borg_restart_module"
+ materials = list(DEFAULT_WALL_MATERIAL = 60000, "glass" = 5000)
+ build_path = /obj/item/borg/upgrade/restart
+
+/datum/design/item/robot_upgrade/vtec
+ name = "VTEC module"
+ desc = "Used to kick in a robot's VTEC systems, increasing their speed."
+ id = "borg_vtec_module"
+ materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 5000)
+ build_path = /obj/item/borg/upgrade/vtec
+
+/datum/design/item/robot_upgrade/tasercooler
+ name = "Rapid taser cooling module"
+ desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate."
+ id = "borg_taser_module"
+ materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 2000, "diamond" = 500)
+ build_path = /obj/item/borg/upgrade/tasercooler
+
+/datum/design/item/robot_upgrade/jetpack
+ name = "Jetpack module"
+ desc = "A carbon dioxide jetpack suitable for low-gravity mining operations."
+ id = "borg_jetpack_module"
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "phoron" = 15000, "uranium" = 20000)
+ build_path = /obj/item/borg/upgrade/jetpack
+
+/datum/design/item/robot_upgrade/syndicate
+ name = "Illegal upgrade"
+ desc = "Allows for the construction of lethal upgrades for cyborgs."
+ id = "borg_syndicate_module"
+ req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 15000, "diamond" = 10000)
+ build_path = /obj/item/borg/upgrade/syndicate
+
+/datum/design/item/mecha_tracking
+ name = "Exosuit tracking beacon"
+ build_type = MECHFAB
+ time = 5
+ materials = list(DEFAULT_WALL_MATERIAL = 500)
+ build_path = /obj/item/mecha_parts/mecha_tracking
+ category = "Misc"
+
+/datum/design/item/mecha
+ build_type = MECHFAB
+ category = "Exosuit Equipment"
+ time = 10
+ materials = list(DEFAULT_WALL_MATERIAL = 10000)
+
+/datum/design/item/mecha/AssembleDesignDesc()
+ if(!desc)
+ desc = "Allows for the construction of \a '[item_name]' exosuit module."
+
+/datum/design/item/mecha/hydraulic_clamp
+ name = "Hydraulic clamp"
+ id = "hydraulic_clamp"
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp
+
+/datum/design/item/mecha/drill
+ name = "Drill"
+ id = "drill"
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill
+
+/datum/design/item/mecha/extinguisher
+ name = "Extinguisher"
+ id = "extinguisher"
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/extinguisher
+
+/datum/design/item/mecha/cable_layer
+ name = "Cable layer"
+ id = "mech_cable_layer"
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/cable_layer
+
+/datum/design/item/mecha/sleeper
+ name = "Sleeper"
+ id = "mech_sleeper"
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/sleeper
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 10000)
+
+/datum/design/item/mecha/syringe_gun
+ name = "Syringe gun"
+ id = "mech_syringe_gun"
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000)
+
+/*
+/datum/design/item/mecha/syringe_gun
+ desc = "Exosuit-mounted syringe gun and chemical synthesizer."
+ id = "mech_syringe_gun"
+ req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
+ */
+
+/datum/design/item/mecha/passenger
+ name = "Passenger compartment"
+ id = "mech_passenger"
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/passenger
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000)
+
+//obj/item/mecha_parts/mecha_equipment/repair_droid,
+//obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING
+
+/datum/design/item/mecha/generator
+ name = "Phoron generator"
+ id = "mech_generator"
+ build_path = /obj/item/mecha_parts/mecha_equipment/generator
+
+/datum/design/item/mecha/taser
+ name = "PBT \"Pacifier\" mounted taser"
+ id = "mech_taser"
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser
+
+/datum/design/item/mecha/lmg
+ name = "Ultra AC 2"
+ id = "mech_lmg"
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
+
+/datum/design/item/mecha/weapon
+ req_tech = list(TECH_COMBAT = 3)
+
+// *** Weapon modules
+/datum/design/item/mecha/weapon/scattershot
+ name = "LBX AC 10 \"Scattershot\""
+ id = "mech_scattershot"
+ req_tech = list(TECH_COMBAT = 4)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
+
+/datum/design/item/mecha/weapon/laser
+ name = "CH-PS \"Immolator\" laser"
+ id = "mech_laser"
+ req_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
+
+/datum/design/item/mecha/weapon/laser_rigged
+ name = "Jury-rigged welder-laser"
+ desc = "Allows for the construction of a welder-laser assembly package for non-combat exosuits."
+ id = "mech_laser_rigged"
+ req_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser
+
+/datum/design/item/mecha/weapon/laser_heavy
+ name = "CH-LC \"Solaris\" laser cannon"
+ id = "mech_laser_heavy"
+ req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
+
+/datum/design/item/mecha/weapon/ion
+ name = "mkIV ion heavy cannon"
+ id = "mech_ion"
+ req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion
+
+/datum/design/item/mecha/weapon/grenade_launcher
+ name = "SGL-6 grenade launcher"
+ id = "mech_grenade_launcher"
+ req_tech = list(TECH_COMBAT = 3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
+
+/datum/design/item/mecha/weapon/clusterbang_launcher
+ name = "SOP-6 grenade launcher"
+ desc = "A weapon that violates the Geneva Convention at 6 rounds per minute."
+ id = "clusterbang_launcher"
+ req_tech = list(TECH_COMBAT= 5, TECH_MATERIAL = 5, TECH_ILLEGAL = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 20000, "gold" = 6000, "uranium" = 6000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited
+
+// *** Nonweapon modules
+/datum/design/item/mecha/wormhole_gen
+ name = "Wormhole generator"
+ desc = "An exosuit module that can generate small quasi-stable wormholes."
+ id = "mech_wormhole_gen"
+ req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 2)
+ build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator
+
+/datum/design/item/mecha/teleporter
+ name = "Teleporter"
+ desc = "An exosuit module that allows teleportation to any position in view."
+ id = "mech_teleporter"
+ req_tech = list(TECH_BLUESPACE = 10, TECH_MAGNET = 5)
+ build_path = /obj/item/mecha_parts/mecha_equipment/teleporter
+
+/datum/design/item/mecha/rcd
+ name = "RCD"
+ desc = "An exosuit-mounted rapid construction device."
+ id = "mech_rcd"
+ time = 120
+ materials = list(DEFAULT_WALL_MATERIAL = 30000, "phoron" = 25000, "silver" = 20000, "gold" = 20000)
+ req_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_POWER = 4, TECH_ENGINEERING = 4)
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/rcd
+
+/datum/design/item/mecha/gravcatapult
+ name = "Gravitational catapult"
+ desc = "An exosuit-mounted gravitational catapult."
+ id = "mech_gravcatapult"
+ req_tech = list(TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_ENGINEERING = 3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult
+
+/datum/design/item/mecha/repair_droid
+ name = "Repair droid"
+ desc = "Automated repair droid, exosuits' best companion. BEEP BOOP"
+ id = "mech_repair_droid"
+ req_tech = list(TECH_MAGNET = 3, TECH_DATA = 3, TECH_ENGINEERING = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "gold" = 1000, "silver" = 2000, "glass" = 5000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid
+
+/datum/design/item/mecha/phoron_generator
+ desc = "Phoron reactor."
+ id = "mech_phoron_generator"
+ req_tech = list(TECH_PHORON = 2, TECH_POWER= 2, TECH_ENGINEERING = 2)
+ build_path = /obj/item/mecha_parts/mecha_equipment/generator
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "silver" = 500, "glass" = 1000)
+
+/datum/design/item/mecha/energy_relay
+ name = "Energy relay"
+ id = "mech_energy_relay"
+ req_tech = list(TECH_MAGNET = 4, TECH_POWER = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "gold" = 2000, "silver" = 3000, "glass" = 2000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
+
+/datum/design/item/mecha/ccw_armor
+ name = "CCW armor booster"
+ desc = "Exosuit close-combat armor booster."
+ id = "mech_ccw_armor"
+ req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 20000, "silver" = 5000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster
+
+/datum/design/item/mecha/proj_armor
+ desc = "Exosuit projectile armor booster."
+ id = "mech_proj_armor"
+ req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_ENGINEERING = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 20000, "gold" = 5000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
+
+/datum/design/item/mecha/diamond_drill
+ name = "Diamond drill"
+ desc = "A diamond version of the exosuit drill. It's harder, better, faster, stronger."
+ id = "mech_diamond_drill"
+ req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "diamond" = 6500)
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill
+
+/datum/design/item/mecha/generator_nuclear
+ name = "Nuclear reactor"
+ desc = "Exosuit-held nuclear reactor. Converts uranium and everyone's health to energy."
+ id = "mech_generator_nuclear"
+ req_tech = list(TECH_POWER= 3, TECH_ENGINEERING = 3, TECH_MATERIAL = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "silver" = 500, "glass" = 1000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear
+
+/datum/design/item/synthetic_flash
+ name = "Synthetic flash"
+ id = "sflash"
+ req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2)
+ build_type = MECHFAB
+ materials = list(DEFAULT_WALL_MATERIAL = 750, "glass" = 750)
+ build_path = /obj/item/device/flash/synthetic
+ category = "Misc"
\ No newline at end of file
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 5ff3d23c74..9cb029f58e 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -8,7 +8,7 @@
active_power_usage = 5000
var/max_material_storage = 100000
- var/list/materials = list("metal" = 0, "glass" = 0, "gold" = 0, "silver" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0)
+ var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0)
var/list/datum/design/queue = list()
var/progress = 0
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index 3f73929aad..031c82a958 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -16,7 +16,7 @@
/obj/machinery/r_n_d/proc/getMaterialType(var/name)
switch(name)
- if("metal")
+ if(DEFAULT_WALL_MATERIAL)
return /obj/item/stack/material/steel
if("glass")
return /obj/item/stack/material/glass
@@ -35,7 +35,7 @@
/obj/machinery/r_n_d/proc/getMaterialName(var/type)
switch(type)
if(/obj/item/stack/material/steel)
- return "metal"
+ return DEFAULT_WALL_MATERIAL
if(/obj/item/stack/material/glass)
return "glass"
if(/obj/item/stack/material/gold)
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index ae928749e2..8dc8a12263 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -98,7 +98,7 @@ research holder datum.
var/datum/design/A = known_designs[i]
if(A.id == D.id) // We are guaranteed to reach this if the ids are the same, because sort_string will also be the same
return
- if(A.sort_string >= D.sort_string)
+ if(A.sort_string > D.sort_string)
known_designs.Insert(i, D)
return
known_designs.Add(D)
diff --git a/html/changelogs/Hubblenaut-dev.yml b/html/changelogs/Hubblenaut-dev.yml
new file mode 100644
index 0000000000..dd90f083d3
--- /dev/null
+++ b/html/changelogs/Hubblenaut-dev.yml
@@ -0,0 +1,35 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Hubblenaut
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+changes:
+ - rscadd: "Adds glass bottles for Cola, Space Up and Space Mountain Wind to Booze-O-Mat."
+ - tweak: "Some bar drink recipes have been amended to easily sum to 30 units for drinking glasses."
+ - tweak: "Vendors now have a product receptor for accepting goods. Opening the maintenance painel is no longer required."
+ - tweak: "Wrenching a vending machine is no longer a silent action."
+ - tweak: "Stepup: Item placement on 4x4 grids seemed to work great. Now we'll try 8x8."
\ No newline at end of file
diff --git a/html/changelogs/Kelenius-ofMechbabAndPanic.yml b/html/changelogs/Kelenius-ofMechbabAndPanic.yml
new file mode 100644
index 0000000000..67f0c0806c
--- /dev/null
+++ b/html/changelogs/Kelenius-ofMechbabAndPanic.yml
@@ -0,0 +1,6 @@
+author: Kelenius
+
+delete-after: True
+
+changes:
+ - tweak: "Mechfab can now be upgraded using RPED, and now uses NanoUI."
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 4d1e6d8e27..c62da8842e 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/head.dmi.orig b/icons/mob/head.dmi.orig
new file mode 100644
index 0000000000..1ac40803aa
Binary files /dev/null and b/icons/mob/head.dmi.orig differ
diff --git a/icons/mob/human_races/monkeys/r_neara.dmi b/icons/mob/human_races/monkeys/r_neaera.dmi
similarity index 100%
rename from icons/mob/human_races/monkeys/r_neara.dmi
rename to icons/mob/human_races/monkeys/r_neaera.dmi
diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi
index 90d89ad52f..339a3b7005 100644
Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ
diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi
index d5b1cfd6cd..d94ddd8880 100644
Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 5d3b01eb1f..2c353b0afc 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index e33858e7af..1858d28925 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm
index 2817a737ae..c851696176 100644
--- a/maps/exodus-1.dmm
+++ b/maps/exodus-1.dmm
@@ -1903,7 +1903,7 @@
"aKE" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"aKF" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"aKG" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet)
-"aKH" = (/obj/machinery/door/airlock/security{name = "Security Checkpoint"; req_access = list(1)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard)
+"aKH" = (/obj/machinery/door/airlock/security{name = "Security Checkpoint"; req_access = list(1)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard)
"aKI" = (/obj/machinery/light,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet)
"aKJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/primary/port)
"aKK" = (/obj/machinery/door/airlock{name = "Bar Backroom"; req_access = list(25)},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/lino,/area/crew_quarters/bar)
@@ -2580,7 +2580,7 @@
"aXF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hydroponics/garden)
"aXG" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/door/window/westright{name = "Library Desk Door"},/turf/simulated/floor/wood,/area/library)
"aXH" = (/obj/effect/landmark/start{name = "Gardener"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/lime{dir = 9},/turf/simulated/floor/tiled,/area/hydroponics/garden)
-"aXI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Vacant Office"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/vacantoffice)
+"aXI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Vacant Office"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/vacantoffice)
"aXJ" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/chapel,/turf/simulated/floor/tiled/dark,/area/chapel/main)
"aXK" = (/turf/simulated/wall,/area/maintenance/substation/medical)
"aXL" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/chapel{tag = "icon-chapel (WEST)"; icon_state = "chapel"; dir = 8},/turf/simulated/floor/tiled/dark,/area/chapel/main)
@@ -4520,7 +4520,7 @@
"bIV" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/miningdock)
"bIW" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/device/megaphone,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/quartermaster/qm)
"bIX" = (/obj/item/weapon/clipboard,/obj/item/weapon/stamp{name = "Quartermaster's stamp"; pixel_x = 0; pixel_y = 0},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/quartermaster/qm)
-"bIY" = (/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/quartermaster/qm)
+"bIY" = (/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/structure/table/standard{name = "plastic table frame"},/obj/item/device/eftpos{eftpos_name = "Quartermaster EFTPOS scanner"},/turf/simulated/floor/tiled,/area/quartermaster/qm)
"bIZ" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/civilian_west{c_tag = "Cargo - Quartermaster's Office"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/qm)
"bJa" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIW"; location = "QM"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/central_three)
"bJb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three)
@@ -4742,8 +4742,8 @@
"bNj" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/quartermaster/miningdock)
"bNk" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/papershredder,/turf/simulated/floor/tiled,/area/quartermaster/qm)
"bNl" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/wall,/area/quartermaster/miningdock)
-"bNm" = (/obj/structure/table/standard,/obj/item/weapon/coin/silver{pixel_x = -3; pixel_y = 3},/obj/item/weapon/coin/silver,/obj/item/device/eftpos{eftpos_name = "Quartermaster EFTPOS scanner"},/turf/simulated/floor/tiled,/area/quartermaster/qm)
-"bNn" = (/obj/structure/closet/secure_closet/quartermaster,/turf/simulated/floor/tiled,/area/quartermaster/qm)
+"bNm" = (/obj/structure/table/standard,/obj/machinery/photocopier/faxmachine{department = "Quartermaster's Office"},/turf/simulated/floor/tiled,/area/quartermaster/qm)
+"bNn" = (/obj/structure/closet/secure_closet/quartermaster,/obj/item/weapon/coin/silver{pixel_x = -3; pixel_y = 3},/obj/item/weapon/coin/silver,/turf/simulated/floor/tiled,/area/quartermaster/qm)
"bNo" = (/obj/structure/table/standard,/obj/item/weapon/cartridge/quartermaster{pixel_x = 6; pixel_y = 5},/obj/item/weapon/cartridge/quartermaster,/obj/item/weapon/cartridge/quartermaster{pixel_x = -4; pixel_y = 7},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/quartermaster/qm)
"bNp" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/tiled,/area/hallway/primary/aft)
"bNq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/server)
@@ -5110,7 +5110,7 @@
"bUn" = (/turf/simulated/wall,/area/maintenance/research_starboard)
"bUo" = (/obj/machinery/door/airlock/highsecurity{name = "Secure Tech Storage"; req_access = list(19,23)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/storage/tech)
"bUp" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/paleblue{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/medbay4)
-"bUq" = (/obj/machinery/door/airlock/engineering{name = "Tech Storage"; req_access = list(23)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/aft)
+"bUq" = (/obj/machinery/door/airlock/engineering{name = "Tech Storage"; req_access = list(23)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hallway/primary/aft)
"bUr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/break_room)
"bUs" = (/turf/simulated/floor/tiled/white,/area/medical/medbay4)
"bUt" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/medbay{c_tag = "Medbay Lounge"},/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/medbay4)
@@ -6055,7 +6055,7 @@
"cmw" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/tiled,/area/engineering/foyer)
"cmx" = (/obj/machinery/door/window/eastright{name = "Engineering Reception Desk"; req_one_access = list(11,24)},/obj/machinery/light,/turf/simulated/floor/tiled,/area/engineering/foyer)
"cmy" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/foyer)
-"cmz" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/turf/simulated/floor,/area/engineering)
+"cmz" = (/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering)
"cmA" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/foyer)
"cmB" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer)
"cmC" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor/tiled,/area/engineering/foyer)
@@ -6509,7 +6509,7 @@
"cvi" = (/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"cvj" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"cvk" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"cvl" = (/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering)
+"cvl" = (/obj/machinery/door/airlock/maintenance{req_access = list(10,12)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/engineering)
"cvm" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 8; sortType = "Drone Fabrication"; name = "Drone Fabrication"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"cvn" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/atmos)
"cvo" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering)
@@ -6874,7 +6874,7 @@
"cCj" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor/plating,/area/engineering/atmos)
"cCk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engine_monitoring)
"cCl" = (/obj/machinery/camera/network/engineering{c_tag = "Engineering Hallway Southwest"; dir = 1},/turf/simulated/floor/tiled,/area/engineering)
-"cCm" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_engineering{name = "Engine Monitoring Room"; req_access = list(11)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_monitoring)
+"cCm" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_engineering{name = "Engine Monitoring Room"; req_access = list(11)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"cCn" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cCo" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engine_monitoring)
"cCp" = (/obj/machinery/camera/network/engineering{c_tag = "Engineering Hallway Southeast"; dir = 1},/turf/simulated/floor/tiled,/area/engineering)
@@ -6936,7 +6936,7 @@
"cDt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/medical/virology)
"cDu" = (/obj/machinery/washing_machine,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/medical/virology)
"cDv" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/reinforced,/area/rnd/xenobiology)
-"cDw" = (/obj/machinery/door/airlock/maintenance{req_access = list(10,12)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering)
+"cDw" = (/obj/machinery/door/airlock/maintenance_hatch{icon_state = "door_closed"; locked = 0; name = "Engine Access"; req_one_access = list(11)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/engine_airlock)
"cDx" = (/obj/machinery/light/small{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/reinforced,/area/rnd/xenobiology)
"cDy" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication)
"cDz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication)
@@ -6969,7 +6969,7 @@
"cEa" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/medical/virology)
"cEb" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/medical/virology)
"cEc" = (/obj/machinery/computer/arcade,/turf/simulated/floor/tiled/white,/area/medical/virology)
-"cEd" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_airlock)
+"cEd" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/engineering/engine_airlock)
"cEe" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/reinforced,/area/rnd/xenobiology)
"cEf" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/solar/starboard)
"cEg" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/wall/r_wall,/area/engineering/atmos)
@@ -6991,8 +6991,8 @@
"cEw" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"cEx" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "engineering_dock_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "engineering_dock_sensor"; pixel_x = -25; pixel_y = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"cEy" = (/obj/machinery/door/blast/regular{dir = 4; id = "disvent"; name = "Incinerator Vent"},/turf/simulated/floor/reinforced,/area/maintenance/incinerator)
-"cEz" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering/engine_airlock)
-"cEA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/engineering/engine_airlock)
+"cEz" = (/obj/structure/closet/radiation,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/camera/network/engine{c_tag = "Engine Airlock"},/turf/simulated/floor/tiled,/area/engineering/engine_airlock)
+"cEA" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/engine_airlock)
"cEB" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/corner/lime,/turf/simulated/floor/tiled/white,/area/medical/virology)
"cEC" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/green,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/white,/area/medical/virology)
"cED" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
@@ -7071,7 +7071,7 @@
"cFY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication)
"cFZ" = (/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Gas Mixing"; dir = 1},/turf/simulated/floor/reinforced/airless,/area/engineering/atmos)
"cGa" = (/obj/machinery/computer/drone_control,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/drone_fabrication)
-"cGb" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/light,/obj/machinery/mecha_part_fabricator{output_dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/plating,/area/engineering/drone_fabrication)
+"cGb" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/light,/obj/machinery/mecha_part_fabricator,/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/plating,/area/engineering/drone_fabrication)
"cGc" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Master Grid"; name_tag = "Master"},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/engineering/drone_fabrication)
"cGd" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication)
"cGe" = (/obj/structure/bed/chair{dir = 8},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/drone_fabrication)
@@ -7091,7 +7091,7 @@
"cGs" = (/obj/structure/grille,/obj/structure/grille,/turf/simulated/wall/r_wall,/area/engineering/atmos)
"cGt" = (/turf/simulated/wall/r_wall,/area/engineering/engine_room)
"cGu" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/constructionsite/station)
-"cGv" = (/obj/machinery/door/airlock/maintenance_hatch{icon_state = "door_closed"; locked = 0; name = "Engine Access"; req_one_access = list(11)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_airlock)
+"cGv" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/machinery/light_switch{pixel_x = -27; pixel_y = 0},/obj/machinery/airlock_sensor/airlock_exterior{id_tag = "eng_al_ext_snsr"; layer = 3.3; master_tag = "engine_room_airlock"; pixel_y = -22; req_access = list(10)},/obj/item/weapon/book/manual/supermatter_engine,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/engine_airlock)
"cGw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/engine_room)
"cGx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/engineering/engine_room)
"cGy" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -7233,11 +7233,11 @@
"cJe" = (/turf/simulated/floor/plating,/area/maintenance/engi_engine)
"cJf" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/engi_engine)
"cJg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/engi_engine)
-"cJh" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/engineering/engine_airlock)
+"cJh" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_airlock)
"cJi" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"cJj" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"cJk" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 6},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
-"cJl" = (/obj/structure/closet/radiation,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/camera/network/engine{c_tag = "Engine Airlock"},/turf/simulated/floor,/area/engineering/engine_airlock)
+"cJl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/engineering/engine_airlock)
"cJm" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/obj/structure/lattice,/turf/space,/area/space)
"cJn" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Solar - Aft Port"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
"cJo" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -7264,16 +7264,16 @@
"cJJ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/engi_engine)
"cJK" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/engi_engine)
"cJL" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
-"cJM" = (/obj/machinery/air_sensor{frequency = 1438; id_tag = "engine_sensor"; output = 63},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/reinforced/nitrogen,/area/engineering/engine_room)
+"cJM" = (/obj/machinery/door/airlock/maintenance_hatch{name = "SMES Access"; req_access = list(11)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"cJN" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "SupermatterPort"; layer = 2.7; name = "Reactor Blast Door"; opacity = 0},/obj/structure/grille,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (NORTH)"; icon_state = "phoronrwindow"; dir = 1},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
-"cJO" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1438; icon_state = "map_injector"; id = "cooling_in"; name = "Coolant Injector"; pixel_y = 1; power_rating = 30000; use_power = 1; volume_rate = 700},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/reinforced/nitrogen,/area/engineering/engine_room)
-"cJP" = (/obj/machinery/atmospherics/unary/vent_pump/engine{dir = 1; external_pressure_bound = 100; external_pressure_bound_default = 0; frequency = 1438; icon_state = "map_vent_in"; id_tag = "cooling_out"; initialize_directions = 1; use_power = 1; pressure_checks = 1; pressure_checks_default = 1; pump_direction = 0},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/reinforced/nitrogen,/area/engineering/engine_room)
+"cJO" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1379; icon_state = "door_closed"; id_tag = "engine_airlock_exterior"; locked = 0; name = "Engine Airlock Exterior"; req_access = list(11)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/engineering/engine_airlock)
+"cJP" = (/obj/machinery/air_sensor{frequency = 1438; id_tag = "engine_sensor"; output = 63},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/reinforced{name = "engine floor"; oxygen = 0},/area/engineering/engine_room)
"cJQ" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/engineering/engine_room)
"cJR" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"cJS" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"cJT" = (/turf/simulated/floor/plating,/area/maintenance/portsolar)
"cJU" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room)
-"cJV" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/machinery/light_switch{pixel_x = -27; pixel_y = 0},/obj/machinery/airlock_sensor/airlock_exterior{id_tag = "eng_al_ext_snsr"; layer = 3.3; master_tag = "engine_room_airlock"; pixel_y = -22; req_access = list(10)},/obj/item/weapon/book/manual/supermatter_engine,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/engine_airlock)
+"cJV" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1438; icon_state = "map_injector"; id = "cooling_in"; name = "Coolant Injector"; pixel_y = 1; power_rating = 30000; use_power = 1; volume_rate = 700},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/reinforced{name = "engine floor"; oxygen = 0},/area/engineering/engine_room)
"cJW" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/engi_engine)
"cJX" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/engi_engine)
"cJY" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/maintenance/engi_engine)
@@ -7305,15 +7305,15 @@
"cKy" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/space,/area/space)
"cKz" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/obj/structure/lattice,/turf/space,/area/space)
"cKA" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/space,/area/space)
-"cKB" = (/obj/machinery/door/airlock/maintenance_hatch{name = "SMES Access"; req_access = list(11)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engineering/engine_monitoring)
-"cKC" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1379; icon_state = "door_closed"; id_tag = "engine_airlock_exterior"; locked = 0; name = "Engine Airlock Exterior"; req_access = list(11)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/engineering/engine_airlock)
+"cKB" = (/obj/machinery/atmospherics/unary/vent_pump/engine{dir = 1; external_pressure_bound = 100; external_pressure_bound_default = 0; frequency = 1438; icon_state = "map_vent_in"; id_tag = "cooling_out"; initialize_directions = 1; use_power = 1; pressure_checks = 1; pressure_checks_default = 1; pump_direction = 0},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/reinforced{name = "engine floor"; oxygen = 0},/area/engineering/engine_room)
+"cKC" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/reinforced{name = "engine floor"; oxygen = 0},/area/engineering/engine_room)
"cKD" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/quartermaster/office)
-"cKE" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/reinforced/nitrogen,/area/engineering/engine_room)
+"cKE" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/reinforced{name = "engine floor"; oxygen = 0},/area/engineering/engine_room)
"cKF" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_dock_outer"; locked = 1; name = "Engineering Dock Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"cKG" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_dock_outer"; locked = 1; name = "Engineering Dock Airlock"; req_access = list(13)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"cKH" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "engineering_dock_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -8; req_one_access = list(13,11,24)},/turf/space,/area/space)
"cKI" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/engineering)
-"cKJ" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/reinforced/nitrogen,/area/engineering/engine_room)
+"cKJ" = (/obj/machinery/camera/network/engine{c_tag = "Engine Core South"; dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/reinforced{name = "engine floor"; oxygen = 0},/area/engineering/engine_room)
"cKK" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"cKL" = (/obj/machinery/atmospherics/pipe/simple/visible/black,/turf/simulated/floor/plating,/area/engineering/engine_room)
"cKM" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/solar/port)
@@ -7323,7 +7323,6 @@
"cKQ" = (/obj/machinery/power/solar_control{id = "portsolar"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable/yellow,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/plating,/area/maintenance/portsolar)
"cKR" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Aft Port Access"; dir = 1},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engi_engine)
"cKS" = (/turf/simulated/floor/greengrid/nitrogen,/area/engineering/engine_room)
-"cKT" = (/obj/machinery/camera/network/engine{c_tag = "Engine Core South"; dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/reinforced/nitrogen,/area/engineering/engine_room)
"cKU" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room)
"cKV" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"cKW" = (/obj/machinery/atmospherics/valve/digital{dir = 4; name = "Emergency Cooling Valve 2"},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -7541,13 +7540,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcprcprcprcprcprcwVcprcprcprcwVcprcprcprcprcprcqMcprcprcwZcwYcxbcxacxacxbcxccxbcxecxdcxgcxfcxicxhcxkcxjcxlcwccoCcxmcoCcrkcxncoNcoNcxocoNcxpcpjczqczqcxDcwxcwwcpjbPxcvMcvNcxrcxqcxxcxucxycxucxzcvNcxBcxAcrGaaaaaaaaaaaaaaaaaacqvcxHcxGcxJcxIcxLcxKcxMcxZcuTcxNcuScxEcuTcxOcqvcqvcqvcqvaaaaaacdOcoUcoVcoUcxPcoWcoZcrBcrBcxQcxRcrBcxScomcomcomcdOaaaaaacrPaaactPctPctPctPctPaafcsJaafctPctPctPctPctPaafcrPaaaczLaaaaaaczLaaaaaaaaaczLaaaaaaaaaaaaaaaczLaaaaaaaaaczLaaaaaaczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcprcxTcxUcxUcxWcxVcxUcxWcxUcxXcxYcrTcrTcyacrTcybcrTcrTcrWcyccvYcprcprcydcyfcyecykcyjcyncylcxicxhcyocyocyqcypcoCcxmcyrcnOcyscoNcytcoNcyvcyucpjcpjcpjcpjcpjcpjcpjbPxcvMcvNcyxcywcxqcyycxqcxucyzcvNcyQcADcrGaaaaaaaaaaaaaaaaaacqvcuVcyActFctFcyDcyCcyEcyWcsDcsFcsEcyBcsDcuHcyFcqvaaaaaaaaaaaacdOcoUcoUcoUckXcyGcyHcrBcrBcrBcxRcrBcyIcrBcyJcrBcsqaafaafcrPaafcuYcuZcuZcuZcuZcvacsJcvccvbcvbcvbcvbcvdaafcrPaaaczLczLczLczLaaaaaaaaaczLczLczLczLczLczLczLaaaaaaaaaczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcprcqLcprcprcprcwVcprcprcprcwVcprcprcprcyKcprcqMcprcprcprcyLcvYcprcprcylcxccyMcyNcwgcAUcwgcwgcyOcyRcyPcBkcypcoCcxmcoCcnOcyTcyScyVcyUcyXcoNcnOcBucBzcBzczhcBAcBDczNczOcvNczacyYczbcxuczccBHcBIcvNczgczecrGaaaaaaaaaaaaaaaaaacqvczjcziczkcuVcznczmczoctFczrczpczscyBczjcztczucqvaaaaaaaaaaaackEcdOcAfcAgcAgczvczxczwczBczzczFczCczIczHczJcodctjaaaaaacrPaafcvXcvXcvXcvXcvXaaacsJaafcvXcvXcvXcvXcvXaaacrPaaaczLczLczLczLaaaaaaczLczLczLczLczLczLczLczLczLaaaaaaczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaaaaaactncprcqLcprczKcrOcrNcrOczMcrOcrNcrOczMcrOczPcrOczQczSczRcxaczTcyMczUczWczVczYczXczZcwgcAaczycwgcwgcwgcwgcwgczAcmzcvlcmzcnOcnOcnOcnOcnOcnOcnOcnOczDcBzcBzczEcANcAObPxcAPcvNcCgcCfcAccAbcAecCncCvcvNcAjcAicrGaaaaaaaaaaaaaaaaaacqvcuycAkczuctFcBacBbcBcctFcAmcAlcAnczGcAocAlcApcqvaafaafaaaaaaaaaaaacAqaaacdOcAtcAvcAucAxcAwcAvcAycAzcAwcAvcAAcdOaaaaaacbOaaaaafaaaaafaaaaafaaacsJaaaaafaaaaafaafaafaafcrPaaaczLczLczLczLaaaaaaczLczLczLczLczLczLczLczLczLaaaaaaczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbOaaaaaaaaaaaIaaaaaacvncprcqLcprcABcyfcqLcprcACcyfcqLcprcAEcyfcprcprcAFcprcAHcyfcAIcAKcAJcAMcALcARcAQcAScwgcAWcATcDwcAXcAYcudcBdcAZcudcBecudcBfcuhcBgcBicBhcBhcBjcBlcBVcBWcBWcBXcBYcAObPxcBZcvNcvNcCacCbcDFcCbcCacCdcvNcrGcDIcrGaaaaaaaaaaaaaaaaaacqvctFcBmcuVctFcBocBncBpctFcwOcwJcpIcgvcwWcwJcxscrHaaaaaaaaaaaaaaaaaacBqaafcdOcBrcBsclUcomclscBvclqcomclocBxclWcdOaaaaaacrPaaactPctPctPctPctPaafcsJaafctPctPctPctPctPaafcrPaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaaaaaactncprcqLcprczKcrOcrNcrOczMcrOcrNcrOczMcrOczPcrOczQczSczRcxaczTcyMczUczWczVczYczXczZcwgcAaczycwgcwgcwgcwgcwgczAcnjcmzcnjcnOcnOcnOcnOcnOcnOcnOcnOczDcBzcBzczEcANcAObPxcAPcvNcCgcCfcAccAbcAecCncCvcvNcAjcAicrGaaaaaaaaaaaaaaaaaacqvcuycAkczuctFcBacBbcBcctFcAmcAlcAnczGcAocAlcApcqvaafaafaaaaaaaaaaaacAqaaacdOcAtcAvcAucAxcAwcAvcAycAzcAwcAvcAAcdOaaaaaacbOaaaaafaaaaafaaaaafaaacsJaaaaafaaaaafaafaafaafcrPaaaczLczLczLczLaaaaaaczLczLczLczLczLczLczLczLczLaaaaaaczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbOaaaaaaaaaaaIaaaaaacvncprcqLcprcABcyfcqLcprcACcyfcqLcprcAEcyfcprcprcAFcprcAHcyfcAIcAKcAJcAMcALcARcAQcAScwgcAWcATcvlcAXcAYcudcBdcAZcudcBecudcBfcuhcBgcBicBhcBhcBjcBlcBVcBWcBWcBXcBYcAObPxcBZcvNcvNcCacCbcDFcCbcCacCdcvNcrGcDIcrGaaaaaaaaaaaaaaaaaacqvctFcBmcuVctFcBocBncBpctFcwOcwJcpIcgvcwWcwJcxscrHaaaaaaaaaaaaaaaaaacBqaafcdOcBrcBsclUcomclscBvclqcomclocBxclWcdOaaaaaacrPaaactPctPctPctPctPaafcsJaafctPctPctPctPctPaafcrPaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafaafaafaaIaafaafcvncprcBycBCcBBcBFcBEcBJcBGcBLcBKcBOcBMcBPcprcBRcBQcBTcBScCccBUcnycnycnycnycnycnycnycnycEJcBNczAcChcCicoCcClcoCcoCcxmcoCcoCcCpcoCcCicCqcCtcCscCrcCucCxcCwcCycFCcAObPwcCRcCzcCTcCacAGcAVcBwcCacCEcCBcCGcCFcCHaaaaaaaaaaaaaaaaaacqvcCJcCIcCLcCKcCNcuycCPcCOcxvaafaaacCQcCUcCScCVaaaaaaaaaaacaaaaaaaaaaaaaaacdOcCWcoUcoUcomcCXcoUcoUcomcCXcoUcoUcdOaafaafcrPaafcuYcuZcuZcuZcuZcvacsJcvccvbcvbcvbcvbcvdaafcrPaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcCYaaaaaaaaIaaaaaacxwczdcyZczlczfcAhcAdcArczfcAhcAdcArczfcAhcBtcBtcCecArczfcAhcCjcnyaaacCMcCZcDbcDacDdcDccDjcDecDkcDkcDfcDlcDocCkcCocCmcCkcCocDocDrcGvcDscDrczAczAcAOcGEcGAcDPcDQcAObNUcDRcDgcDhcCacCbcGMcCbcCacDmcDicDnaafaaaaaaaaaaaaaaaaaaaaacqvcCJcDpcDtcDqcDqcDtczscDucqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdOcDvcoUcoUcomcDxcoUcoUcomcDxcoUcoUcdOaaaaaacrPaafcvXcvXcvXcvXcvXaaacsJaaacvXcvXcvXcvXcvXaaacrPaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcDBcHjcHjcHCcHjcHjcHjcHjcHVcHjcIAcHjcHVcHjcIAcHjcHVcHjcIAcHjcHjcHjcIAcHjcIAcHjcIMaafaaacDzcDycDCcDAcDDcDEcDjcDGcDkcDHcDLcDKcDJcDMcDOcDNcDTcDScDJcJhcEdcJlcDraaaaafcAOcDVcDUcEDaafaaabNUbPxbPxbSkcCacDXcDWcDYcCaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcDZcuIcEbcEacEacEbcuycEccqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdOcoUcoUcoUcomcEecoUcoUcomcEecoUcoUcdOaacaaacrPaaaaaaaafaafaafaaaaaacEfaafaaaaaaaafaafaaaaaacrPaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafaafaaaaaqaaaaaaaafcgEcmtcgScEgcgEcmtcgScEgcgEcmtcgScEhcgEaaacgEcEgcgScEhcgEaaaaafaaacDzcJCcEicEkcEncEjcEpcEocDkcElcEqcEmcDJcErcEtcEscEvcEucDJcJVcEAcEzcDraaaaaacAOcExcEwcFiaaaaaabNUbPxbPxbNUcCacEycEycEycCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcECcEBcEFcEEcuycuycuycEGcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackEcdOcdOcdOcdOcdOcdOcdOcdOcEHcEHcEHckEaaaaaacrPcrPcrPcrPcrPaaaaaaaaacqGaaaaaaaaacrPcrPcrPcbOcrPaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaafaaIaaaaaaaafcgEcEIcELcEKcgEcEMcEOcENcgEcEPcERcEQcgEaafcgEcEScEUcETcgEaaaaafaaacDzcEVcDCcEncEncEWcEYcKpcFacEXcFbcEZcKBcFccFecFdcFgcFfcFpcFmcKCcFqcDraafaaacFJcKGcKFcAOcKHaaabNUcFMcKIcFNcFOaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrHcqvcqvcCAcFhcEbcEbcEbcFjcCAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFkcFkcFkaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafcFlaafcrPaaaaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcCYaaaaaaaaIaaaaaacxwczdcyZczlczfcAhcAdcArczfcAhcAdcArczfcAhcBtcBtcCecArczfcAhcCjcnyaaacCMcCZcDbcDacDdcDccDjcDecDkcDkcDfcDlcDocCkcCocCmcCkcCocDocDrcDwcDscDrczAczAcAOcGEcGAcDPcDQcAObNUcDRcDgcDhcCacCbcGMcCbcCacDmcDicDnaafaaaaaaaaaaaaaaaaaaaaacqvcCJcDpcDtcDqcDqcDtczscDucqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdOcDvcoUcoUcomcDxcoUcoUcomcDxcoUcoUcdOaaaaaacrPaafcvXcvXcvXcvXcvXaaacsJaaacvXcvXcvXcvXcvXaaacrPaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcDBcHjcHjcHCcHjcHjcHjcHjcHVcHjcIAcHjcHVcHjcIAcHjcHVcHjcIAcHjcHjcHjcIAcHjcIAcHjcIMaafaaacDzcDycDCcDAcDDcDEcDjcDGcDkcDHcDLcDKcDJcDMcDOcDNcDTcDScDJcEdcEAcEzcDraaaaafcAOcDVcDUcEDaafaaabNUbPxbPxbSkcCacDXcDWcDYcCaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcDZcuIcEbcEacEacEbcuycEccqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdOcoUcoUcoUcomcEecoUcoUcomcEecoUcoUcdOaacaaacrPaaaaaaaafaafaafaaaaaacEfaafaaaaaaaafaafaaaaaacrPaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafaafaaaaaqaaaaaaaafcgEcmtcgScEgcgEcmtcgScEgcgEcmtcgScEhcgEaaacgEcEgcgScEhcgEaaaaafaaacDzcJCcEicEkcEncEjcEpcEocDkcElcEqcEmcDJcErcEtcEscEvcEucDJcGvcJlcJhcDraaaaaacAOcExcEwcFiaaaaaabNUbPxbPxbNUcCacEycEycEycCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcECcEBcEFcEEcuycuycuycEGcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackEcdOcdOcdOcdOcdOcdOcdOcdOcEHcEHcEHckEaaaaaacrPcrPcrPcrPcrPaaaaaaaaacqGaaaaaaaaacrPcrPcrPcbOcrPaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaafaaIaaaaaaaafcgEcEIcELcEKcgEcEMcEOcENcgEcEPcERcEQcgEaafcgEcEScEUcETcgEaaaaafaaacDzcEVcDCcEncEncEWcEYcKpcFacEXcFbcEZcJMcFccFecFdcFgcFfcFpcFmcJOcFqcDraafaaacFJcKGcKFcAOcKHaaabNUcFMcKIcFNcFOaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrHcqvcqvcCAcFhcEbcEbcEbcFjcCAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFkcFkcFkaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafcFlaafcrPaaaaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaaaaafaafcgEcFncFocFncgEcFrcFscFrcgEcFtcFucFtcgEaaacgEcFvcFvcFwcgEaaaaafaaacDzcCZcFxcEkcEncDEcFAcDGcDkcFycFBcFzcDJcFDcFFcFEcFFcFGcDJcFHcFTcFIcDraapcFLcFKcKPcKOcFKcFKcFPbNUciEciDcGjaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCCcFQcFRcFRcFRcFScCCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaaacrPaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaIaafaafaaacgEcFncFUcFncgEcFrcFVcFrcgEcFtcFWcFtcgEaafcgEcFvcFZcFvcgEaafaafaafcFYcFXcGbcGacGecGccGdcDGcDkcGfcGhcGgcDJcGicGlcGkcGncGmcDJcGocGrcGpcDraaacGqcKXcGBcGucLccLbcGDcGFcGGcGHbNUaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcCDcpScpScpScxscqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcrPcrPcrPcrPaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbOaaaaaacgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEaaacGscgEcgEcgEcgEaaaaaaaaaaaacBNcBNcBNcBNcBNcLecGtcGtcGtcGtcLfcGtcGwcGycGxcGycGzcGtcGtcLgcGtcGtcGtcGqcKXcGNcGKcLkcLjcLlaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -7557,9 +7556,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHpcHUcHraaacHpcHUcHraafcHpcHUcHraafaaaaaaaafaafcIcaaaaafcHqcGRcGRcGRcGScGOcIscIkcIvcIucIxcIwcIycHWcHZcHYcHYcHYcIzcIacIBcHYcHYcICcIGcIDcINcIJcIRcIjcImcIlcIlcIlcIlcIlcIlcIncIocIncIocIncHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacHpcHUcHraafcHpcHUcHraaacHpcHUcHraaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaaaaafcIpcIrcIqcItcITcIUcGJcHbcHbcHbcHbcIWcIVcIYcIXcJbcIZcJicJdcIFcIEcIHcJjcJkcIIcImcIOcIPcIOcIPcIOcIPcIOcIPcIOcIPcIOcHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaaacHpcHUcHraafcHpcHUcHraaacHpcHUcHraafaaaaaaaaaaaaaafaafcJpcIKcIKcIKcIKcILcILcILcILcILcLCcILcGtcIQcHbcHbcHbcJrcGtcLEcIScLFcGtcJtcJscJvcJucJxcJwcJycGtaaacHPcHPcHPcHPcJmcHPcHPcHPcHPcHPcHPcHPaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcJzaafaafaafcJzaafaaaaafcJzaafaaaaaaaaaaaaaaacJAcJDcJBcJFcJEcJncJacJGcJcciFcJecJfcJgcJecGtcLIcJocHbcHbcJLcJqcJOcJMcJPcJNcJRcJQcIGcIDcJUcJScKacGtaafcHycHycHycHycHycHycHycHycHycHycHycHyaafaanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcKdcKccKfcKecKkcKkcKkcKkcKkcKkcKkcKkcKkcKkcKmcKccKccKccKocLKcKqcLMcKscKrcKtcLPcKucJHcJHcJHcJIcJJcJKcGtcKvcKvcHbcHbcJLcKbcKEcKwcKJcLVcJRcJLcIFcJZcIHcKKcKLcGtaafcHycHycHycHycHycHycHycHycHycHycHycHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaactYctYctYctYctYaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcKMaafaaaaafcKMaafaaaaafcKMaafaaaaaaaaaaaaaaacJAcJDcKNcKQcJTcLQcIKcKRcJWcJecJecJXcJXcJYcGtcKvcKvcHbcHbcJLcLWcKEcKScKTcLXcKVcKUcKYcKWcLacKZcLdcGtaaacHPcHPcHPcHPcJmcHPcHPcHPcHPcHPcHPcHPaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcJzaafaafaafcJzaafaaaaafcJzaafaaaaaaaaaaaaaaacJAcJDcJBcJFcJEcJncJacJGcJcciFcJecJfcJgcJecGtcLIcJocHbcHbcJLcJqcJVcJPcKBcJNcJRcJQcIGcIDcJUcJScKacGtaafcHycHycHycHycHycHycHycHycHycHycHycHyaafaanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcKdcKccKfcKecKkcKkcKkcKkcKkcKkcKkcKkcKkcKkcKmcKccKccKccKocLKcKqcLMcKscKrcKtcLPcKucJHcJHcJHcJIcJJcJKcGtcKvcKvcHbcHbcJLcKbcKCcKwcKEcLVcJRcJLcIFcJZcIHcKKcKLcGtaafcHycHycHycHycHycHycHycHycHycHycHycHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaactYctYctYctYctYaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcKMaafaaaaafcKMaafaaaaafcKMaafaaaaaaaaaaaaaaacJAcJDcKNcKQcJTcLQcIKcKRcJWcJecJecJXcJXcJYcGtcKvcKvcHbcHbcJLcLWcKCcKScKJcLXcKVcKUcKYcKWcLacKZcLdcGtaaacHPcHPcHPcHPcJmcHPcHPcHPcHPcHPcHPcHPaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaactYctYctYctYctYaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaafcHpcLhcHraaacHpcLhcHraaacHpcLhcHraafaaaaaaaaaaaaaafaafcLicIKcIKcIKcIKcKgcKhcKicKicKjcKgcKgcGtcGtcGJcGtcGtcGtcGtcGtcLmcGtcGtcGtcGtcGtcGJcGtcGtcGtcGtaafcHycHycHycHycHycHycHycHycHycHycHycHyaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHpcLhcHraafcHpcLhcHraaacHpcLhcHraaaaaaaaaaafaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacKxaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaacHqcKycHqcKycKzcKycHqcKycHqcKycHqcKyaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHpcLhcHraaacHpcLhcHraaacHpcLhcHraafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaapaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/nano/templates/mechfab.tmpl b/nano/templates/mechfab.tmpl
new file mode 100644
index 0000000000..8fcc82f877
--- /dev/null
+++ b/nano/templates/mechfab.tmpl
@@ -0,0 +1,81 @@
+Exosuit Fabricator
+
+
+ {{:helper.link("Sync", null, {'sync' : 1})}}
+ {{:data.sync}}
+
+ {{if data.manufacturers}}
+
+ {{for data.manufacturers}}
+ {{:helper.link(value.company, null, {'manufacturer' : value.id}, value.id == data.manufacturer ? 'selected' : null)}}
+ {{/for}}
+
+ {{/if}}
+
+ {{for data.categories}}
+ {{:helper.link(value, null, {'category' : value}, value == data.category ? 'selected' : null)}}
+ {{empty}}
+ There are no known designs
+ {{/for}}
+
+ {{for data.buildable}}
+ {{if value.category == data.category}}
+
+
+ {{:helper.link(value.name, null, {'build' : value.id})}}
+
+
+ {{:value.resourses}}, {{:value.time}}
+
+
+ {{/if}}
+ {{/for}}
+
+
+
+ Queue contains:
+
+ {{if data.current}}
+
+
+ Now: {{:data.current}} ({{:data.builtperc}}% ready)
+
+
+ {{:helper.link('Cancel', null, {'remove' : 1})}}
+
+
+ {{for data.queue}}
+
+
+ {{:index + 2}}: {{:value}}
+
+
+ {{:helper.link('Remove', null, {'remove' : index + 2})}}
+
+ {{empty}}
+
+ The queue is empty
+
+ {{/for}}
+ {{else}}
+
+ Nothing
+
+ {{/if}}
+
Materials:
+ {{for data.materials}}
+
+
+ {{:value.mat}}: {{:value.amt}}/{{:data.maxres}}
+
+
+ {{:helper.link('x1', null, {'eject' : value.mat, 'amount' : 1}, value.amt > 2000 ? null : 'disabled')}}
+ {{:helper.link('x5', null, {'eject' : value.mat, 'amount' : 5}, value.amt > 10000 ? null : 'disabled')}}
+ {{:helper.link('x10', null, {'eject' : value.mat, 'amount' : 10}, value.amt > 20000 ? null : 'disabled')}}
+ {{:helper.link('Stack', null, {'eject' : value.mat, 'amount' : 0})}}
+ {{:helper.link('All', null, {'eject' : value.mat, 'amount' : -1})}}
+
+
+ {{/for}}
+
+
diff --git a/tools/mapmerge/mapmerge.sh b/tools/mapmerge/mapmerge.sh
index 145537f7ca..fe74602c08 100755
--- a/tools/mapmerge/mapmerge.sh
+++ b/tools/mapmerge/mapmerge.sh
@@ -4,6 +4,6 @@ then
echo "Unable to automatically resolve map conflicts, please merge manually."
exit 1
fi
-java -jar tools/mapmerge/MapPatcher.jar -clean $1 $2 $2
+java -jar tools/mapmerge/MapPatcher.jar -clean $3 $2 $2
-exit 0
+exit 0
\ No newline at end of file