diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm
index b3a9a05119..8d77c39740 100644
--- a/code/__DEFINES/construction.dm
+++ b/code/__DEFINES/construction.dm
@@ -91,6 +91,7 @@
#define MAT_BANANIUM "$bananium"
#define MAT_TITANIUM "$titanium"
#define MAT_BIOMASS "$biomass"
+#define MAT_PLASTIC "$plastic"
//The amount of materials you get from a sheet of mineral like iron/diamond/glass etc
#define MINERAL_MATERIAL_AMOUNT 2000
//The maximum size of a stack object.
@@ -125,4 +126,4 @@
#define RCD_FLOORWALL 1
#define RCD_AIRLOCK 2
#define RCD_DECONSTRUCT 3
-#define RCD_WINDOWGRILLE 4
\ No newline at end of file
+#define RCD_WINDOWGRILLE 4
diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm
index 4ac48b7d4f..4665bd3b1e 100644
--- a/code/__DEFINES/machines.dm
+++ b/code/__DEFINES/machines.dm
@@ -29,6 +29,7 @@
#define BIOGENERATOR 32 //Uses biomass
#define LIMBGROWER 64 //Uses synthetic flesh
#define SMELTER 128 //uses various minerals
+#define AUTOYLATHE 256 //Uses glass/metal/Plastic
//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
//Modular computer/NTNet defines
@@ -86,4 +87,4 @@
#define SUPERMATTER_DELAMINATING 6 // Pretty obvious.
//R&D Snowflakes
-#define RD_CONSOLE_LOCKED_SCREEN 0.2
\ No newline at end of file
+#define RD_CONSOLE_LOCKED_SCREEN 0.2
diff --git a/code/citadel/cit_guns.dm b/code/citadel/cit_guns.dm
index abd54a7520..da1171bb26 100644
--- a/code/citadel/cit_guns.dm
+++ b/code/citadel/cit_guns.dm
@@ -189,15 +189,6 @@
w_class = WEIGHT_CLASS_BULKY
weapon_weight = WEAPON_HEAVY
-/datum/design/foam_x9
- name = "Foam Force X9 Rifle"
- id = "foam_x9"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 24000, MAT_GLASS = 14000)
- build_path = /obj/item/gun/ballistic/automatic/x9/toy
- category = list("hacked", "Misc")
-
-
////////XCOM2 Magpistol/////////
//////projectiles//////
@@ -352,22 +343,6 @@
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
max_ammo = 42
-/datum/design/magfoam_dart
- name = "Box of MagFoam Darts"
- id = "magfoam_dart"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 300, MAT_GLASS = 200)
- build_path = /obj/item/ammo_box/foambox/mag
- category = list("initial", "Misc")
-
-/datum/design/foam_magpistol
- name = "Foam Force Magpistol"
- id = "magfoam_launcher"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 7500, MAT_GLASS = 1000)
- build_path = /obj/item/gun/ballistic/shotgun/toy/mag
- category = list("hacked", "Misc")
-
//////Magrifle//////
///projectiles///
@@ -502,14 +477,6 @@
w_class = WEIGHT_CLASS_BULKY
weapon_weight = WEAPON_HEAVY
-/datum/design/foam_magrifle
- name = "Foam Force MagRifle"
- id = "foam_magrifle"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 15000, MAT_GLASS = 7500)
- build_path = /obj/item/gun/ballistic/automatic/magrifle/toy
- category = list("hacked", "Misc")
-
/*
// TECHWEBS IMPLEMENTATION
*/
@@ -648,14 +615,6 @@
name = "toy mag burst rifle power supply"
maxcharge = 4000
-/datum/design/foam_hyperburst
- name = "MagTag Hyper Rifle"
- id = "foam_hyperburst"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 35000, MAT_GLASS = 25000)
- build_path = /obj/item/gun/energy/laser/practice/hyperburst
- category = list("hacked", "Misc")
-
/* made redundant by reskinnable stetchkins
//////Stealth Pistol//////
@@ -708,15 +667,6 @@
cut_overlays()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
-/datum/design/foam_sp
- name = "Foam Force Stealth Pistol"
- id = "foam_sp"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30000, MAT_GLASS = 15000)
- build_path = /obj/item/gun/ballistic/automatic/toy/pistol/stealth
- category = list("hacked", "Misc")
-
-
//////10mm soporific bullets//////
obj/item/projectile/bullet/c10mm/soporific
@@ -923,14 +873,6 @@ obj/item/projectile/bullet/c10mm/soporific
ammo_type = list(/obj/item/ammo_casing/energy/laser/raytag)
selfcharge = TRUE
-/datum/design/toyray
- name = "RayTag Gun"
- id = "toyray"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 7500, MAT_GLASS = 1000)
- build_path = /obj/item/gun/energy/laser/practice/raygun
- category = list("hacked", "Misc")
-
/*/////////////////////////////////////////////////////////////////////////////////////////////
The Recolourable Gun
*//////////////////////////////////////////////////////////////////////////////////////////////
@@ -1179,15 +1121,6 @@ obj/item/projectile/bullet/c10mm/soporific
can_suppress = FALSE
actions_types = list(/datum/action/item_action/pick_color)
-/datum/design/foam_p37
- name = "Foam Force Mk.37F"
- id = "foam_p37"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 15000, MAT_GLASS = 10000)
- build_path = /obj/item/gun/ballistic/automatic/pistol/p37/foam
- category = list("hacked", "Misc")
-
-
/*/////////////////////////////////////////////////////////////////////////////////////////////
The Recolourable Energy Gun
*//////////////////////////////////////////////////////////////////////////////////////////////
@@ -1311,11 +1244,3 @@ obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file)
w_class = WEIGHT_CLASS_NORMAL
burst_size = 4 //Shh.
fire_delay = 1
-
-/datum/design/am4c
- name = "Foam Force AM4-C Rifle"
- id = "foam_am4c"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 24000, MAT_GLASS = 14000)
- build_path = /obj/item/gun/ballistic/automatic/AM4C
- category = list("hacked", "Misc")
diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm
index 830f2d9a42..e3f0685ebb 100644
--- a/code/datums/components/material_container.dm
+++ b/code/datums/components/material_container.dm
@@ -350,3 +350,8 @@
/datum/material/biomass
name = "Biomass"
id = MAT_BIOMASS
+
+/datum/material/plastic
+ name = "Plastic"
+ id = MAT_PLASTIC
+ sheet_type = /obj/item/stack/sheet/plastic
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 91b3ebeb55..e5468675e2 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -458,6 +458,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
desc = "Compress dinosaur over millions of years, then refine, split and mold, and voila! You have plastic."
singular_name = "plastic sheet"
icon_state = "sheet-plastic"
+ materials = list(MAT_PLASTIC=MINERAL_MATERIAL_AMOUNT)
throwforce = 7
merge_type = /obj/item/stack/sheet/plastic
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 8350fce2b5..4bad63b5ee 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -42,7 +42,6 @@
icon_state = "waterballoon-e"
item_state = "balloon-empty"
-
/obj/item/toy/balloon/New()
create_reagents(10)
..()
@@ -287,7 +286,6 @@
w_class = WEIGHT_CLASS_SMALL
resistance_flags = FLAMMABLE
-
/obj/item/toy/windupToolbox
name = "windup toolbox"
desc = "A replica toolbox that rumbles when you turn the key."
@@ -334,7 +332,7 @@
/obj/item/toy/katana
name = "replica katana"
- desc = "Woefully underpowered in D20."
+ desc = "Woefully underpowered in D20. Almost has a sharp edge."
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "katana"
item_state = "katana"
diff --git a/modular_citadel/code/datums/wires/autoylathe.dm b/modular_citadel/code/datums/wires/autoylathe.dm
new file mode 100644
index 0000000000..736c9551ec
--- /dev/null
+++ b/modular_citadel/code/datums/wires/autoylathe.dm
@@ -0,0 +1,48 @@
+/datum/wires/autoylathe
+ holder_type = /obj/machinery/autoylathe
+ proper_name = "Autoylathe"
+
+/datum/wires/autoylathe/New(atom/holder)
+ wires = list(
+ WIRE_HACK, WIRE_DISABLE,
+ WIRE_SHOCK, WIRE_ZAP
+ )
+ add_duds(6)
+ ..()
+
+/datum/wires/autoylathe/interactable(mob/user)
+ var/obj/machinery/autoylathe/A = holder
+ if(A.panel_open)
+ return TRUE
+
+/datum/wires/autoylathe/get_status()
+ var/obj/machinery/autoylathe/A = holder
+ var/list/status = list()
+ status += "The red light is [A.disabled ? "on" : "off"]."
+ status += "The blue light is [A.hacked ? "on" : "off"]."
+ return status
+
+/datum/wires/autoylathe/on_pulse(wire)
+ var/obj/machinery/autoylathe/A = holder
+ switch(wire)
+ if(WIRE_HACK)
+ A.adjust_hacked(!A.hacked)
+ addtimer(CALLBACK(A, /obj/machinery/autoylathe.proc/reset, wire), 60)
+ if(WIRE_SHOCK)
+ A.shocked = !A.shocked
+ addtimer(CALLBACK(A, /obj/machinery/autoylathe.proc/reset, wire), 60)
+ if(WIRE_DISABLE)
+ A.disabled = !A.disabled
+ addtimer(CALLBACK(A, /obj/machinery/autoylathe.proc/reset, wire), 60)
+
+/datum/wires/autoylathe/on_cut(wire, mend)
+ var/obj/machinery/autoylathe/A = holder
+ switch(wire)
+ if(WIRE_HACK)
+ A.adjust_hacked(!mend)
+ if(WIRE_HACK)
+ A.shocked = !mend
+ if(WIRE_DISABLE)
+ A.disabled = !mend
+ if(WIRE_ZAP)
+ A.shock(usr, 50)
diff --git a/modular_citadel/code/game/machinery/toylathe.dm b/modular_citadel/code/game/machinery/toylathe.dm
new file mode 100644
index 0000000000..903235c763
--- /dev/null
+++ b/modular_citadel/code/game/machinery/toylathe.dm
@@ -0,0 +1,379 @@
+#define AUTOYLATHE_MAIN_MENU 1
+#define AUTOYLATHE_CATEGORY_MENU 2
+#define AUTOYLATHE_SEARCH_MENU 3
+
+/obj/machinery/autoylathe
+ name = "autoylathe"
+ desc = "It produces items using plastic, metal and glass."
+ icon_state = "autolathe"
+ density = TRUE
+ anchored = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 10
+ active_power_usage = 100
+ circuit = /obj/item/circuitboard/machine/autoylathe
+ var/hacked = FALSE
+ var/disabled = FALSE
+ var/shocked = FALSE
+ var/busy = FALSE
+ var/prod_coeff = 1
+ var/datum/design/being_built
+ var/datum/techweb/stored_research
+ var/list/datum/design/matching_designs
+ var/selected_category
+ var/screen = 1
+ var/list/categories = list(
+ "Toys",
+ "Figurines",
+ "Pistols",
+ "Rifles",
+ "Heavy",
+ "Melee",
+ "Armor",
+ "Adult",
+ "Misc",
+ "Imported"
+ )
+
+/obj/machinery/autoylathe/Initialize()
+ . = ..()
+ AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_PLASTIC), 0, TRUE, null, null, CALLBACK(src, .proc/AfterMaterialInsert))
+
+ wires = new /datum/wires/autoylathe(src)
+ stored_research = new /datum/techweb/specialized/autounlocking/autoylathe
+ matching_designs = list()
+
+/obj/machinery/autoylathe/Destroy()
+ QDEL_NULL(wires)
+ return ..()
+
+/obj/machinery/autoylathe/interact(mob/user)
+ if(!is_operational())
+ return
+
+ if(shocked && !(stat & NOPOWER))
+ shock(user,50)
+
+ var/dat
+
+ switch(screen)
+ if(AUTOYLATHE_MAIN_MENU)
+ dat = main_win(user)
+ if(AUTOYLATHE_CATEGORY_MENU)
+ dat = category_win(user,selected_category)
+ if(AUTOYLATHE_SEARCH_MENU)
+ dat = search_win(user)
+
+ var/datum/browser/popup = new(user, "Autoylathe", name, 400, 500)
+ popup.set_content(dat)
+ popup.open()
+
+/obj/machinery/autoylathe/on_deconstruction()
+ GET_COMPONENT(materials, /datum/component/material_container)
+ materials.retrieve_all()
+
+/obj/machinery/autoylathe/attackby(obj/item/O, mob/user, params)
+ if (busy)
+ to_chat(user, "The autoylathe is busy. Please wait for completion of previous operation.")
+ return TRUE
+
+ if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O))
+ updateUsrDialog()
+ return TRUE
+
+ if(exchange_parts(user, O))
+ return TRUE
+
+ if(default_deconstruction_crowbar(O))
+ return TRUE
+
+ if(panel_open && is_wire_tool(O))
+ wires.interact(user)
+ return TRUE
+
+ if(user.a_intent == INTENT_HARM) //so we can hit the machine
+ return ..()
+
+ if(stat)
+ return TRUE
+
+ if(istype(O, /obj/item/disk/design_disk))
+ user.visible_message("[user] begins to load \the [O] in \the [src]...",
+ "You begin to load a design from \the [O]...",
+ "You hear the chatter of a floppy drive.")
+ busy = TRUE
+ var/obj/item/disk/design_disk/D = O
+ if(do_after(user, 14.4, target = src))
+ for(var/B in D.blueprints)
+ if(B)
+ stored_research.add_design(B)
+ busy = FALSE
+ return TRUE
+
+ return ..()
+
+/obj/machinery/autoylathe/proc/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted)
+ if(ispath(type_inserted, /obj/item/stack/ore/bluespace_crystal))
+ use_power(amount_inserted / 10)
+ else
+ switch(id_inserted)
+ if (MAT_METAL)
+ flick("autolathe_o",src)//plays metal insertion animation
+ if (MAT_GLASS)
+ flick("autolathe_r",src)//plays glass insertion animation
+ if (MAT_PLASTIC)
+ flick("autolathe_o",src)//plays metal insertion animation
+ use_power(amount_inserted / 10)
+ updateUsrDialog()
+
+/obj/machinery/autoylathe/Topic(href, href_list)
+ if(..())
+ return
+ if (!busy)
+ if(href_list["menu"])
+ screen = text2num(href_list["menu"])
+ updateUsrDialog()
+
+ if(href_list["category"])
+ selected_category = href_list["category"]
+ updateUsrDialog()
+
+ if(href_list["make"])
+
+ /////////////////
+ //href protection
+ being_built = stored_research.isDesignResearchedID(href_list["make"])
+ if(!being_built)
+ return
+
+ var/multiplier = text2num(href_list["multiplier"])
+ var/is_stack = ispath(being_built.build_path, /obj/item/stack)
+
+ /////////////////
+
+ var/coeff = (is_stack ? 1 : prod_coeff) //stacks are unaffected by production coefficient
+ var/metal_cost = being_built.materials[MAT_METAL]
+ var/glass_cost = being_built.materials[MAT_GLASS]
+ var/plastic_cost = being_built.materials[MAT_PLASTIC]
+ var/power = max(2000, (metal_cost+glass_cost+plastic_cost)*multiplier/5)
+
+ GET_COMPONENT(materials, /datum/component/material_container)
+ if((materials.amount(MAT_METAL) >= metal_cost*multiplier*coeff) && (materials.amount(MAT_GLASS) >= glass_cost*multiplier*coeff) && (materials.amount(MAT_PLASTIC) >= plastic_cost*multiplier*coeff))
+ busy = TRUE
+ use_power(power)
+ icon_state = "autolathe_n"
+ var/time = is_stack ? 32 : 32*coeff*multiplier
+ addtimer(CALLBACK(src, .proc/make_item, power, metal_cost, glass_cost, plastic_cost, multiplier, coeff, is_stack), time)
+
+ if(href_list["search"])
+ matching_designs.Cut()
+
+ for(var/v in stored_research.researched_designs)
+ var/datum/design/D = stored_research.researched_designs[v]
+ if(findtext(D.name,href_list["to_search"]))
+ matching_designs.Add(D)
+ updateUsrDialog()
+ else
+ to_chat(usr, "The autoylathe is busy. Please wait for completion of previous operation.")
+
+ updateUsrDialog()
+
+ return
+
+/obj/machinery/autoylathe/proc/make_item(power, metal_cost, glass_cost, plastic_cost, multiplier, coeff, is_stack)
+ GET_COMPONENT(materials, /datum/component/material_container)
+ var/atom/A = drop_location()
+ use_power(power)
+ var/list/materials_used = list(MAT_METAL=metal_cost*coeff*multiplier, MAT_GLASS=glass_cost*coeff*multiplier, MAT_PLASTIC=plastic_cost*coeff*multiplier)
+ materials.use_amount(materials_used)
+
+ if(is_stack)
+ var/obj/item/stack/N = new being_built.build_path(A, multiplier)
+ N.update_icon()
+ N.autoylathe_crafted(src)
+ else
+ for(var/i=1, i<=multiplier, i++)
+ var/obj/item/new_item = new being_built.build_path(A)
+ for(var/mat in materials_used)
+ new_item.materials[mat] = materials_used[mat] / multiplier
+ new_item.autoylathe_crafted(src)
+ icon_state = "autolathe"
+ busy = FALSE
+ updateDialog()
+
+/obj/machinery/autoylathe/RefreshParts()
+ var/T = 0
+ for(var/obj/item/stock_parts/matter_bin/MB in component_parts)
+ T += MB.rating*75000
+ GET_COMPONENT(materials, /datum/component/material_container)
+ materials.max_amount = T
+ T=1.2
+ for(var/obj/item/stock_parts/manipulator/M in component_parts)
+ T -= M.rating*0.2
+ prod_coeff = CLAMP(T,1,0) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4
+
+/obj/machinery/autoylathe/proc/main_win(mob/user)
+ var/dat = "
Autoylathe Menu:
"
+ dat += materials_printout()
+
+ dat += "
"
+
+ var/line_length = 1
+ dat += "
"
+
+ for(var/C in categories)
+ if(line_length > 2)
+ dat += "
"
+ line_length = 1
+
+ dat += "| [C] | "
+ line_length++
+
+ dat += "
"
+ return dat
+
+/obj/machinery/autoylathe/proc/category_win(mob/user,selected_category)
+ var/dat = "Return to main menu"
+ dat += "Browsing [selected_category]:
"
+ dat += materials_printout()
+
+ for(var/v in stored_research.researched_designs)
+ var/datum/design/D = stored_research.researched_designs[v]
+ if(!(selected_category in D.category))
+ continue
+
+ if(disabled || !can_build(D))
+ dat += "
[D.name]"
+ else
+ dat += "
[D.name]"
+
+ if(ispath(D.build_path, /obj/item/stack))
+ GET_COMPONENT(materials, /datum/component/material_container)
+ var/max_multiplier = min(D.maxstack, D.materials[MAT_METAL] ?round(materials.amount(MAT_METAL)/D.materials[MAT_METAL]):INFINITY,D.materials[MAT_GLASS] ?round(materials.amount(MAT_GLASS)/D.materials[MAT_GLASS]):INFINITY,D.materials[MAT_PLASTIC] ?round(materials.amount(MAT_PLASTIC)/D.materials[MAT_PLASTIC]):INFINITY)
+ if (max_multiplier>10 && !disabled)
+ dat += "
x10"
+ if (max_multiplier>25 && !disabled)
+ dat += "
x25"
+ if(max_multiplier > 0 && !disabled)
+ dat += "
x[max_multiplier]"
+ else
+ if(!disabled && can_build(D, 5))
+ dat += "
x5"
+ if(!disabled && can_build(D, 10))
+ dat += "
x10"
+
+ dat += "[get_design_cost(D)]
"
+
+ dat += "
"
+ return dat
+
+/obj/machinery/autoylathe/proc/search_win(mob/user)
+ var/dat = "Return to main menu"
+ dat += "Search results:
"
+ dat += materials_printout()
+
+ for(var/v in matching_designs)
+ var/datum/design/D = v
+ if(disabled || !can_build(D))
+ dat += "
[D.name]"
+ else
+ dat += "
[D.name]"
+
+ if(ispath(D.build_path, /obj/item/stack))
+ GET_COMPONENT(materials, /datum/component/material_container)
+ var/max_multiplier = min(D.maxstack, D.materials[MAT_METAL] ?round(materials.amount(MAT_METAL)/D.materials[MAT_METAL]):INFINITY,D.materials[MAT_GLASS] ?round(materials.amount(MAT_GLASS)/D.materials[MAT_GLASS]):INFINITY,D.materials[MAT_PLASTIC] ?round(materials.amount(MAT_PLASTIC)/D.materials[MAT_PLASTIC]):INFINITY)
+ if (max_multiplier>10 && !disabled)
+ dat += "
x10"
+ if (max_multiplier>25 && !disabled)
+ dat += "
x25"
+ if(max_multiplier > 0 && !disabled)
+ dat += "
x[max_multiplier]"
+
+ dat += "[get_design_cost(D)]
"
+
+ dat += "
"
+ return dat
+
+/obj/machinery/autoylathe/proc/materials_printout()
+ GET_COMPONENT(materials, /datum/component/material_container)
+ var/dat = "Total amount: [materials.total_amount] / [materials.max_amount] cm3
"
+ for(var/mat_id in materials.materials)
+ var/datum/material/M = materials.materials[mat_id]
+ dat += "[M.name] amount: [M.amount] cm3
"
+ return dat
+
+/obj/machinery/autoylathe/proc/can_build(datum/design/D, amount = 1)
+ if(D.make_reagents.len)
+ return FALSE
+
+ var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : prod_coeff)
+
+ GET_COMPONENT(materials, /datum/component/material_container)
+ if(D.materials[MAT_METAL] && (materials.amount(MAT_METAL) < (D.materials[MAT_METAL] * coeff * amount)))
+ return FALSE
+ if(D.materials[MAT_GLASS] && (materials.amount(MAT_GLASS) < (D.materials[MAT_GLASS] * coeff * amount)))
+ return FALSE
+ if(D.materials[MAT_PLASTIC] && (materials.amount(MAT_PLASTIC) < (D.materials[MAT_PLASTIC] * coeff * amount)))
+ return FALSE
+ return TRUE
+
+/obj/machinery/autoylathe/proc/get_design_cost(datum/design/D)
+ var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : prod_coeff)
+ var/dat
+ if(D.materials[MAT_METAL])
+ dat += "[D.materials[MAT_METAL] * coeff] metal "
+ if(D.materials[MAT_GLASS])
+ dat += "[D.materials[MAT_GLASS] * coeff] glass "
+ if(D.materials[MAT_PLASTIC])
+ dat += "[D.materials[MAT_PLASTIC] * coeff] plastic"
+ return dat
+
+/obj/machinery/autoylathe/proc/reset(wire)
+ switch(wire)
+ if(WIRE_HACK)
+ if(!wires.is_cut(wire))
+ adjust_hacked(FALSE)
+ if(WIRE_SHOCK)
+ if(!wires.is_cut(wire))
+ shocked = FALSE
+ if(WIRE_DISABLE)
+ if(!wires.is_cut(wire))
+ disabled = FALSE
+
+/obj/machinery/autoylathe/proc/shock(mob/user, prb)
+ if(stat & (BROKEN|NOPOWER)) // unpowered, no shock
+ return FALSE
+ if(!prob(prb))
+ return FALSE
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ s.set_up(5, 1, src)
+ s.start()
+ if (electrocute_mob(user, get_area(src), src, 0.7, TRUE))
+ return TRUE
+ else
+ return FALSE
+
+/obj/machinery/autoylathe/proc/adjust_hacked(state)
+ hacked = state
+ for(var/id in SSresearch.techweb_designs)
+ var/datum/design/D = SSresearch.techweb_designs[id]
+ if((D.build_type & AUTOYLATHE) && ("hacked" in D.category))
+ if(hacked)
+ stored_research.add_design(D)
+ else
+ stored_research.remove_design(D)
+
+/obj/machinery/autoylathe/hacked/Initialize()
+ . = ..()
+ adjust_hacked(TRUE)
+
+//Called when the object is constructed by an autoylathe
+//Has a reference to the autoylathe so you can do !!FUN!! things with hacked lathes
+/obj/item/proc/autoylathe_crafted(obj/machinery/autoylathe/A)
+ return
diff --git a/modular_citadel/code/game/objects/items/circuitboards/machine_circuitboards.dm b/modular_citadel/code/game/objects/items/circuitboards/machine_circuitboards.dm
index e0abfbb574..812f26748f 100644
--- a/modular_citadel/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/modular_citadel/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -1,4 +1,12 @@
/obj/item/circuitboard/machine/kinkmate
name = "Kinkmate Vendor (Machine Board)"
build_path = /obj/machinery/vending/kink
- req_components = list(/obj/item/vending_refill/kink)
\ No newline at end of file
+ req_components = list(/obj/item/vending_refill/kink)
+
+/obj/item/circuitboard/machine/autoylathe
+ name = "Autoylathe (Machine Board)"
+ build_path = /obj/machinery/autoylathe
+ req_components = list(
+ /obj/item/stock_parts/matter_bin = 3,
+ /obj/item/stock_parts/manipulator = 1,
+ /obj/item/stack/sheet/glass = 1)
diff --git a/modular_citadel/code/modules/research/designs/autoylathe_designs.dm b/modular_citadel/code/modules/research/designs/autoylathe_designs.dm
new file mode 100644
index 0000000000..a257513e96
--- /dev/null
+++ b/modular_citadel/code/modules/research/designs/autoylathe_designs.dm
@@ -0,0 +1,626 @@
+/datum/design/autoylathe
+ build_type = AUTOYLATHE
+
+/datum/design/autoylathe/mech
+ category = list("initial", "Figurines")
+
+/datum/design/autoylathe/mech/contraband
+ category = list("hacked", "Figurines")
+
+/datum/design/autoylathe/figure
+ category = list("initial", "Figurines")
+
+/datum/design/autoylathe/balloon
+ name = "Empty Water balloon"
+ id = "waterballoon"
+ materials = list(MAT_PLASTIC = 50)
+ build_path = /obj/item/toy/balloon
+ category = list("initial", "Toys")
+
+/datum/design/autoylathe/spinningtoy
+ name = "Toy Singularity"
+ id = "singuloutoy"
+ materials = list(MAT_PLASTIC = 500)
+ build_path = /obj/item/toy/spinningtoy
+ category = list("initial", "Toys")
+
+/datum/design/autoylathe/capgun
+ name = "Cap Gun"
+ id = "capgun"
+ materials = list(MAT_PLASTIC = 500)
+ build_path = /obj/item/toy/gun
+ category = list("initial", "Pistols")
+
+/datum/design/autoylathe/capgunammo
+ name = "Capgun Ammo"
+ id = "capgunammo"
+ materials = list(MAT_PLASTIC = 50)
+ build_path = /obj/item/toy/ammo/gun
+ category = list("initial", "misc")
+
+/datum/design/autoylathe/toysword
+ name = "Toy Sword"
+ id = "toysword"
+ materials = list(MAT_PLASTIC = 500)
+ build_path = /obj/item/toy/sword
+ category = list("initial", "Melee")
+
+/datum/design/autoylathe/foamblade
+ name = "Foam Armblade"
+ id = "foamblade"
+ materials = list(MAT_PLASTIC = 500)
+ build_path = /obj/item/toy/foamblade
+ category = list("initial", "Melee")
+
+/datum/design/autoylathe/windupbox
+ name = "Wind Up Toolbox"
+ id = "windupbox"
+ materials = list(MAT_PLASTIC = 500)
+ build_path = /obj/item/toy/windupToolbox
+ category = list("initial", "Toys")
+
+/datum/design/autoylathe/toydualsword
+ name = "Double-Bladed Toy Sword"
+ id = "dbtoysword"
+ materials = list(MAT_PLASTIC = 1000)
+ build_path = /obj/item/twohanded/dualsaber/toy
+ category = list("initial", "Melee")
+
+/datum/design/autoylathe/toykatana
+ name = "Replica Katana"
+ id = "toykatana"
+ materials = list(MAT_PLASTIC = 50, MAT_METAL = 450)
+ build_path = /obj/item/toy/katana
+ category = list("initial", "Melee")
+
+/datum/design/autoylathe/snappop
+ name = "Snap Pop"
+ id = "snappop_phoenix"
+ materials = list(MAT_PLASTIC = 50)
+ build_path = /obj/item/toy/snappop
+ category = list("initial", "Toys")
+
+/datum/design/autoylathe/mech/model1
+ name = "Toy Ripley"
+ id = "toymech1"
+ materials = list(MAT_PLASTIC = 250)
+ build_path = /obj/item/toy/prize/ripley
+
+/datum/design/autoylathe/mech/model2
+ name = "Toy Firefighter Ripley"
+ id = "toymech2"
+ materials = list(MAT_PLASTIC = 250)
+ build_path = /obj/item/toy/prize/fireripley
+
+/datum/design/autoylathe/mech/contraband/model3
+ name = "Toy Deathsquad fireripley "
+ id = "toymech3"
+ materials = list(MAT_PLASTIC = 250)
+ build_path = /obj/item/toy/prize/deathripley
+
+/datum/design/autoylathe/mech/model4
+ name = "Toy Gygax"
+ id = "toymech4"
+ materials = list(MAT_PLASTIC = 250)
+ build_path = /obj/item/toy/prize/gygax
+
+/datum/design/autoylathe/mech/model5
+ name = "Toy Durand"
+ id = "toymech5"
+ materials = list(MAT_PLASTIC = 250)
+ build_path = /obj/item/toy/prize/durand
+
+/datum/design/autoylathe/mech/contraband/model6
+ name = "Toy H.O.N.K."
+ id = "toymech6"
+ materials = list(MAT_PLASTIC = 250)
+ build_path = /obj/item/toy/prize/honk
+
+/datum/design/autoylathe/mech/contraband/model7
+ name = "Toy Marauder"
+ id = "toymech7"
+ materials = list(MAT_PLASTIC = 250)
+ build_path = /obj/item/toy/prize/marauder
+
+/datum/design/autoylathe/mech/contraband/model8
+ name = "Toy Seraph"
+ id = "toymech8"
+ materials = list(MAT_PLASTIC = 250)
+ build_path = /obj/item/toy/prize/seraph
+
+/datum/design/autoylathe/mech/contraband/model9
+ name = "Toy Mauler"
+ id = "toymech9"
+ materials = list(MAT_PLASTIC = 250)
+ build_path = /obj/item/toy/prize/mauler
+
+/datum/design/autoylathe/mech/model10
+ name = "Toy Odysseus"
+ id = "toymech10"
+ materials = list(MAT_PLASTIC = 250)
+ build_path = /obj/item/toy/prize/odysseus
+
+/datum/design/autoylathe/mech/model11
+ name = "Toy Phazon"
+ id = "toymech11"
+ materials = list(MAT_PLASTIC = 250)
+ build_path = /obj/item/toy/prize/phazon
+
+/datum/design/autoylathe/mech/contraband/model12
+ name = "Toy Reticence"
+ id = "toymech12"
+ materials = list(MAT_PLASTIC = 250)
+ build_path = /obj/item/toy/prize/reticence
+ category = list("hacked", "Figurines")
+
+/datum/design/autoylathe/talking/AI
+ name = "Toy AI"
+ id = "ToyAICore"
+ materials = list(MAT_PLASTIC = 250, MAT_METAL = 50)
+ build_path = /obj/item/toy/talking/AI
+ category = list("initial", "Toys")
+
+/datum/design/autoylathe/talking/codex_gigas
+ name = "Toy Codex Gigas"
+ id = "ToyCodex"
+ materials = list(MAT_PLASTIC = 250, MAT_METAL = 50)
+ build_path = /obj/item/toy/talking/codex_gigas
+ category = list("initial", "Toys")
+
+/datum/design/autoylathe/talking/owl
+ name = "Owl Action Figure"
+ id = "owlactionfig"
+ materials = list(MAT_PLASTIC = 250, MAT_METAL = 50)
+ build_path = /obj/item/toy/talking/owl
+
+/datum/design/autoylathe/talking/griffin
+ name = "Griffon Action Figure"
+ id = "griffinactionfig"
+ materials = list(MAT_PLASTIC = 250, MAT_METAL = 50)
+ build_path = /obj/item/toy/talking/griffin
+
+/datum/design/autoylathe/cards
+ name = "Deck of Cards"
+ id = "carddeck"
+ materials = list(MAT_PLASTIC = 250)
+ build_path = /obj/item/toy/cards/deck
+ category = list("initial", "Toys")
+
+/datum/design/autoylathe/nuke
+ name = "Nuclear Fission Explosive Toy"
+ id = "nuketoy"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/nuke
+ category = list("initial", "Toys")
+
+/datum/design/autoylathe/minimeteor
+ name = "Mini-Meteor"
+ id = "meattoy"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/minimeteor
+ category = list("hacked", "Misc")
+
+/datum/design/autoylathe/redbutton
+ name = "Big Red Button"
+ id = "redbutton"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/redbutton
+ category = list("initial", "Toys")
+
+/datum/design/autoylathe/beach_ball
+ name = "Beach Ball"
+ id = "beachball"
+ materials = list(MAT_PLASTIC = 500)
+ build_path = /obj/item/toy/beach_ball
+ category = list("initial", "Toys")
+
+/datum/design/autoylathe/clockwork_watch
+ name = "Clockwork Watch"
+ id = "clockwatch"
+ materials = list(MAT_PLASTIC = 1000)
+ build_path = /obj/item/toy/clockwork_watch
+ category = list("initial", "misc")
+
+/datum/design/autoylathe/dagger
+ name = "Toy Dagger"
+ id = "toydagger"
+ materials = list(MAT_PLASTIC = 1000)
+ build_path = /obj/item/toy/toy_dagger
+ category = list("initial", "Melee")
+
+/datum/design/autoylathe/xeno
+ name = "Xenomorph"
+ id = "xenomorph"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/toy_xeno
+
+/datum/design/autoylathe/cattoy
+ name = "Toy Mouse"
+ id = "cattoy"
+ materials = list(MAT_PLASTIC = 500)
+ build_path = /obj/item/toy/cattoy
+ category = list("initial", "Toys")
+
+/datum/design/autoylathe/figure/assistant
+ name = "Assistant"
+ id = "assfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/assistant
+
+/datum/design/autoylathe/figure/atmos
+ name = "Atmos Tech"
+ id = "atmfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/atmos
+
+/datum/design/autoylathe/figure/bartender
+ name = "Bartender"
+ id = "barfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/bartender
+
+/datum/design/autoylathe/figure/botanist
+ name = "Botanist"
+ id = "botfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/botanist
+
+/datum/design/autoylathe/figure/captain
+ name = "Captain"
+ id = "capfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/captain
+
+/datum/design/autoylathe/figure/cargotech
+ name = "Cargo Technician"
+ id = "carfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/cargotech
+
+/datum/design/autoylathe/figure/ce
+ name = "Chief Engineer"
+ id = "cefigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/ce
+
+/datum/design/autoylathe/figure/chaplain
+ name = "Chaplain"
+ id = "chafigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/chaplain
+
+/datum/design/autoylathe/figure/chef
+ name = "Chef"
+ id = "chefigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/chef
+
+/datum/design/autoylathe/figure/chemist
+ name = "Chemist"
+ id = "chmfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/chemist
+
+/datum/design/autoylathe/figure/clown
+ name = "Clown"
+ id = "clnfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/clown
+
+/datum/design/autoylathe/figure/cmo
+ name = "Chief Medical Officer"
+ id = "cmofigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/cmo
+
+/datum/design/autoylathe/figure/curator
+ name = "Curator"
+ id = "curfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/curator
+
+/datum/design/autoylathe/figure/borg
+ name = "Cyborg"
+ id = "cybfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/borg
+
+/datum/design/autoylathe/figure/detective
+ name = "Detective"
+ id = "detfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/detective
+
+/datum/design/autoylathe/figure/engineer
+ name = "Engineer"
+ id = "engfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/engineer
+
+/datum/design/autoylathe/figure/geneticist
+ name = "Geneticist"
+ id = "genfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/geneticist
+
+/datum/design/autoylathe/figure/hop
+ name = "Head of Personnel"
+ id = "hopfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/hop
+
+/datum/design/autoylathe/figure/hos
+ name = "Head of Security"
+ id = "hosfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/hos
+
+/datum/design/autoylathe/figure/janitor
+ name = "Janitor"
+ id = "janfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/janitor
+
+/datum/design/autoylathe/figure/lawyer
+ name = "Lawyer"
+ id = "lawfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/lawyer
+
+/datum/design/autoylathe/figure/md
+ name = "Medical Doctor"
+ id = "medfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/md
+
+/datum/design/autoylathe/figure/mime
+ name = "Mime"
+ id = "mimfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/mime
+
+/datum/design/autoylathe/figure/miner
+ name = "Miner"
+ id = "minfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/miner
+
+/datum/design/autoylathe/figure/rd
+ name = "Research Director"
+ id = "rdfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/rd
+
+/datum/design/autoylathe/figure/robotocist
+ name = "Robotocist"
+ id = "robfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/roboticist
+
+/datum/design/autoylathe/figure/qm
+ name = "Quartermaster"
+ id = "qtmfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/qm
+
+/datum/design/autoylathe/figure/scientist
+ name = "Scientist"
+ id = "scifigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/scientist
+
+/datum/design/autoylathe/figure/secofficer
+ name = "Security Officer"
+ id = "secfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/secofficer
+
+/datum/design/autoylathe/figure/virologist
+ name = "Virologist"
+ id = "virfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/virologist
+
+/datum/design/autoylathe/figure/warden
+ name = "Warden"
+ id = "warfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/warden
+
+/datum/design/autoylathe/figure/dsquad
+ name = "Deathsquad"
+ id = "dsqfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/dsquad
+ category = list("hacked", "Figurines")
+
+/datum/design/autoylathe/figure/ian
+ name = "Ian"
+ id = "ianfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/ian
+ category = list("hacked", "Figurines")
+
+/datum/design/autoylathe/figure/ninja
+ name = "Ninja"
+ id = "ninfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/ninja
+ category = list("hacked", "Figurines")
+
+/datum/design/autoylathe/figure/syndie
+ name = "Nuclear Operative"
+ id = "nucfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/syndie
+ category = list("hacked", "Figurines")
+
+/datum/design/autoylathe/figure/wizard
+ name = "Wizard"
+ id = "wizfigure"
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 50)
+ build_path = /obj/item/toy/figure/wizard
+ category = list("hacked", "Figurines")
+
+/datum/design/autoylathe/dildo
+ name = "Customizable Dildo"
+ id = "dildo"
+ materials = list(MAT_PLASTIC = 2000)
+ build_path = /obj/item/dildo/custom
+ category = list("initial", "Adult")
+
+/datum/design/autoylathe/collar
+ name = "Collar"
+ id = "collar"
+ materials = list(MAT_PLASTIC = 250, MAT_METAL = 50)
+ build_path = /obj/item/clothing/neck/petcollar
+ category = list("initial", "Adult")
+
+/datum/design/autoylathe/lastag/blue/gun
+ name = "Blue Lasertag Rifle"
+ id = "lastagrifleblue"
+ materials = list(MAT_PLASTIC = 2000, MAT_METAL = 500, MAT_GLASS = 500)
+ build_path = /obj/item/gun/energy/laser/bluetag
+ category = list("initial", "Rifles")
+
+/datum/design/autoylathe/lastag/red/gun
+ name = "Red Lasertag Rifle"
+ id = "lastagriflered"
+ materials = list(MAT_PLASTIC = 2000, MAT_METAL = 500, MAT_GLASS = 500)
+ build_path = /obj/item/gun/energy/laser/redtag
+ category = list("initial", "Rifles")
+
+/datum/design/autoylathe/lastag/blue/hat
+ name = "Blue Lasertag Helmet"
+ id = "lastaghatblue"
+ materials = list(MAT_PLASTIC = 4000, MAT_METAL = 1000, MAT_GLASS = 500)
+ build_path = /obj/item/clothing/head/helmet/bluetaghelm
+ category = list("initial", "Armor")
+
+/datum/design/autoylathe/lastag/blue/armor
+ name = "Blue Lasertag Armor"
+ id = "lastagarmorblue"
+ materials = list(MAT_PLASTIC = 8000, MAT_METAL = 2000, MAT_GLASS = 100)
+ build_path = /obj/item/clothing/suit/bluetag
+ category = list("initial", "Armor")
+
+/datum/design/autoylathe/lastag/red/hat
+ name = "Red Lasertag Helmet"
+ id = "lastaghelmetred"
+ materials = list(MAT_PLASTIC = 4000, MAT_METAL = 1000, MAT_GLASS = 500)
+ build_path = /obj/item/clothing/head/helmet/redtaghelm
+ category = list("initial", "Armor")
+
+/datum/design/autoylathe/lastag/red/armor
+ name = "Red Lasertag Armor"
+ id = "lastagarmorred"
+ materials = list(MAT_PLASTIC = 8000, MAT_METAL = 2000, MAT_GLASS = 1000)
+ build_path = /obj/item/clothing/suit/redtag
+ category = list("initial", "Armor")
+
+//because why not make a boxed kit with all of the lastag shit?
+/obj/item/storage/box/blueteam
+ name = "Blue Team Kit"
+/obj/item/storage/box/blueteam/PopulateContents()
+ new /obj/item/clothing/head/helmet/bluetaghelm(src)
+ new /obj/item/clothing/suit/bluetag(src)
+ new /obj/item/gun/energy/laser/bluetag(src)
+ new /obj/item/clothing/gloves/color/blue(src)
+ new /obj/item/clothing/shoes/sneakers/blue(src)
+ new /obj/item/clothing/under/color/blue(src)
+
+/obj/item/storage/box/redteam
+ name = "Red Team Kit"
+/obj/item/storage/box/redteam/PopulateContents()
+ new /obj/item/clothing/head/helmet/redtaghelm(src)
+ new /obj/item/clothing/suit/redtag(src)
+ new /obj/item/gun/energy/laser/redtag(src)
+ new /obj/item/clothing/gloves/color/red(src)
+ new /obj/item/clothing/shoes/sneakers/red(src)
+ new /obj/item/clothing/under/color/red(src)
+
+/datum/design/autoylathe/lastag/blue
+ name = "Blue Lasertag Kit"
+ id = "lastagkitblue"
+ materials = list(MAT_PLASTIC = 16000, MAT_METAL = 4000, MAT_GLASS = 2000)
+ build_path = /obj/item/storage/box/blueteam
+ category = list("initial", "Misc")
+
+/datum/design/autoylathe/lastag/red
+ name = "Red Lasertag Kit"
+ id = "lastagkitred"
+ materials = list(MAT_PLASTIC = 16000, MAT_METAL = 4000, MAT_GLASS = 2000)
+ build_path = /obj/item/storage/box/redteam
+ category = list("initial", "Misc")
+
+/datum/design/foam_x9
+ name = "Foam Force X9 Rifle"
+ id = "foam_x9"
+ build_type = AUTOYLATHE
+ materials = list(MAT_PLASTIC = 4000, MAT_METAL = 500)
+ build_path = /obj/item/gun/ballistic/automatic/x9/toy
+ category = list("initial", "Rifles")
+
+/datum/design/magfoam_dart
+ name = "Box of MagFoam Darts"
+ id = "magfoam_dart"
+ build_type = AUTOYLATHE
+ materials = list(MAT_PLASTIC = 500, MAT_METAL = 100)
+ build_path = /obj/item/ammo_box/foambox/mag
+ category = list("initial", "Misc")
+
+/datum/design/foam_magpistol
+ name = "Foam Force Magpistol"
+ id = "magfoam_launcher"
+ build_type = AUTOYLATHE
+ materials = list(MAT_PLASTIC = 2000, MAT_METAL = 250)
+ build_path = /obj/item/gun/ballistic/shotgun/toy/mag
+ category = list("initial", "Pistols")
+
+/datum/design/foam_magrifle
+ name = "Foam Force MagRifle"
+ id = "foam_magrifle"
+ build_type = AUTOYLATHE
+ materials = list(MAT_PLASTIC = 4000, MAT_METAL = 500)
+ build_path = /obj/item/gun/ballistic/automatic/magrifle/toy
+ category = list("initial", "Rifles")
+
+/datum/design/foam_hyperburst
+ name = "MagTag Hyper Rifle"
+ id = "foam_hyperburst"
+ build_type = AUTOYLATHE
+ materials = list(MAT_PLASTIC = 4000, MAT_METAL = 2000, MAT_GLASS = 1000)
+ build_path = /obj/item/gun/energy/laser/practice/hyperburst
+ category = list("initial", "Rifles")
+
+/datum/design/foam_sp
+ name = "Foam Force Stealth Pistol"
+ id = "foam_sp"
+ build_type = AUTOYLATHE
+ materials = list(MAT_PLASTIC = 2000, MAT_METAL = 1000)
+ build_path = /obj/item/gun/ballistic/automatic/toy/pistol/stealth
+ category = list("initial", "Pistols")
+
+/datum/design/toyray
+ name = "RayTag Gun"
+ id = "toyray"
+ build_type = AUTOYLATHE
+ materials = list(MAT_PLASTIC = 2000, MAT_METAL = 1000, MAT_GLASS = 1000)
+ build_path = /obj/item/gun/energy/laser/practice/raygun
+ category = list("initial", "Pistols")
+
+/datum/design/foam_p37
+ name = "Foam Force Mk.37F"
+ id = "foam_p37"
+ build_type = AUTOYLATHE
+ materials = list(MAT_PLASTIC = 2000, MAT_METAL = 1000, MAT_GLASS = 250)
+ build_path = /obj/item/gun/ballistic/automatic/pistol/p37/foam
+ category = list("initial", "Pistols")
+
+/datum/design/am4c
+ name = "Foam Force AM4-C Rifle"
+ id = "foam_am4c"
+ build_type = AUTOYLATHE
+ materials = list(MAT_PLASTIC = 4000, MAT_METAL = 500)
+ build_path = /obj/item/gun/ballistic/automatic/AM4C
+ category = list("initial", "Rifles")
diff --git a/modular_citadel/code/modules/research/designs/machine_designs.dm b/modular_citadel/code/modules/research/designs/machine_designs.dm
new file mode 100644
index 0000000000..6a1331dddc
--- /dev/null
+++ b/modular_citadel/code/modules/research/designs/machine_designs.dm
@@ -0,0 +1,6 @@
+/datum/design/board/autoylathe
+ name = "Machine Design (Autoylathe)"
+ desc = "The circuit board for an autoylathe."
+ id = "autoylathe"
+ build_path = /obj/item/circuitboard/machine/autoylathe
+ category = list("Misc. Machinery")
diff --git a/modular_citadel/code/modules/research/techweb/_techweb.dm b/modular_citadel/code/modules/research/techweb/_techweb.dm
new file mode 100644
index 0000000000..1c96229594
--- /dev/null
+++ b/modular_citadel/code/modules/research/techweb/_techweb.dm
@@ -0,0 +1,3 @@
+/datum/techweb/specialized/autounlocking/autoylathe
+ design_autounlock_buildtypes = AUTOYLATHE
+ allowed_buildtypes = AUTOYLATHE
diff --git a/modular_citadel/code/modules/research/techweb/all_nodes.dm b/modular_citadel/code/modules/research/techweb/all_nodes.dm
new file mode 100644
index 0000000000..d8babf011b
--- /dev/null
+++ b/modular_citadel/code/modules/research/techweb/all_nodes.dm
@@ -0,0 +1,8 @@
+/datum/techweb_node/computer_board_gaming
+ id = "computer_board_gaming"
+ display_name = "Games and Toys"
+ description = "For the slackers on the station."
+ prereq_ids = list("comptech")
+ design_ids = list("arcade_battle", "arcade_orion", "slotmachine", "autoylathe")
+ research_cost = 1000
+ export_price = 5000
diff --git a/tgstation.dme b/tgstation.dme
index e8054cfceb..7f467630a8 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2524,9 +2524,11 @@
#include "modular_citadel\code\controllers\subsystem\shuttle.dm"
#include "modular_citadel\code\datums\uplink_items_cit.dm"
#include "modular_citadel\code\datums\mutations\hulk.dm"
+#include "modular_citadel\code\datums\wires\autoylathe.dm"
#include "modular_citadel\code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm"
#include "modular_citadel\code\game\machinery\cryopod.dm"
#include "modular_citadel\code\game\machinery\Sleeper.dm"
+#include "modular_citadel\code\game\machinery\toylathe.dm"
#include "modular_citadel\code\game\machinery\vending.dm"
#include "modular_citadel\code\game\objects\ids.dm"
#include "modular_citadel\code\game\objects\items\handcuffs.dm"
@@ -2585,5 +2587,9 @@
#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "modular_citadel\code\modules\mob\living\simple_animal\banana_spider.dm"
#include "modular_citadel\code\modules\mob\living\simple_animal\kiwi.dm"
+#include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm"
+#include "modular_citadel\code\modules\research\designs\machine_designs.dm"
+#include "modular_citadel\code\modules\research\techweb\_techweb.dm"
+#include "modular_citadel\code\modules\research\techweb\all_nodes.dm"
#include "modular_citadel\interface\skin.dmf"
// END_INCLUDE