diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm new file mode 100644 index 0000000000..78deb6cf98 --- /dev/null +++ b/code/modules/integrated_electronics/core/printer.dm @@ -0,0 +1,199 @@ + +/obj/item/device/integrated_circuit_printer + name = "integrated circuit printer" + desc = "A portable(ish) machine made to print tiny modular circuitry out of metal." + icon = 'icons/obj/electronic_assemblies.dmi' + icon_state = "circuit_printer" + w_class = ITEMSIZE_LARGE + var/metal = 0 + var/max_metal = 100 + var/metal_per_sheet = 10 // One sheet equals this much metal. + + var/upgraded = FALSE // When hit with an upgrade disk, will turn true, allowing it to print the higher tier circuits. + var/can_clone = FALSE // Same for above, but will allow the printer to duplicate a specific assembly. + var/static/list/recipe_list = list() + var/current_category = null + var/obj/item/device/electronic_assembly/assembly_to_clone = null + +/obj/item/device/integrated_circuit_printer/upgraded + upgraded = TRUE + can_clone = TRUE + +/obj/item/device/integrated_circuit_printer/initialize() + ..() + if(!recipe_list.len) + // Unfortunately this needed a lot of loops, but it should only be run once at init. + + // First loop is to seperate the actual circuits from base circuits. + var/list/circuits_to_use = list() + for(var/obj/item/integrated_circuit/IC in all_integrated_circuits) + if((IC.spawn_flags & IC_SPAWN_DEFAULT) || (IC.spawn_flags & IC_SPAWN_RESEARCH)) + circuits_to_use.Add(IC) + + // Second loop is to find all categories. + var/list/found_categories = list() + for(var/obj/item/integrated_circuit/IC in circuits_to_use) + if(!(IC.category_text in found_categories)) + found_categories.Add(IC.category_text) + + // Third loop is to initialize lists by category names, then put circuits matching the category inside. + for(var/category in found_categories) + recipe_list[category] = list() + var/list/current_list = recipe_list[category] + for(var/obj/item/integrated_circuit/IC in circuits_to_use) + if(IC.category_text == category) + current_list.Add(IC) + + // Now for non-circuit things. + var/list/assembly_list = list() + assembly_list.Add( + new /obj/item/device/electronic_assembly(null), + new /obj/item/device/electronic_assembly/medium(null), + new /obj/item/device/electronic_assembly/large(null), + new /obj/item/device/electronic_assembly/drone(null), + new /obj/item/weapon/implant/integrated_circuit(null), + new /obj/item/device/assembly/electronic_assembly(null) + ) + recipe_list["Assemblies"] = assembly_list + + var/list/tools_list = list() + tools_list.Add( + new /obj/item/device/integrated_electronics/wirer(null), + new /obj/item/device/integrated_electronics/debugger(null) + ) + recipe_list["Tools"] = tools_list + + +/obj/item/device/integrated_circuit_printer/attackby(var/obj/item/O, var/mob/user) + if(istype(O,/obj/item/stack/material)) + var/obj/item/stack/material/stack = O + if(stack.material.name == DEFAULT_WALL_MATERIAL) + var/num = min((max_metal - metal) / metal_per_sheet, stack.amount) + if(num < 1) + to_chat(user, "\The [src] is too full to add more metal.") + return + if(stack.use(num)) + to_chat(user, "You add [num] sheet\s to \the [src].") + metal += num * metal_per_sheet + interact(user) + return TRUE + + if(istype(O,/obj/item/integrated_circuit)) + to_chat(user, "You insert the circuit into \the [src]. ") + user.unEquip(O) + metal = min(metal + O.w_class, max_metal) + qdel(O) + interact(user) + return TRUE + + if(istype(O,/obj/item/weapon/disk/integrated_circuit/upgrade/advanced)) + if(upgraded) + to_chat(user, "\The [src] already has this upgrade. ") + return TRUE + to_chat(user, "You install \the [O] into \the [src]. ") + upgraded = TRUE + interact(user) + return TRUE + + if(istype(O,/obj/item/weapon/disk/integrated_circuit/upgrade/clone)) + if(can_clone) + to_chat(user, "\The [src] already has this upgrade. ") + return TRUE + to_chat(user, "You install \the [O] into \the [src]. ") + can_clone = TRUE + interact(user) + return TRUE + + return ..() + +/obj/item/device/integrated_circuit_printer/attack_self(var/mob/user) + interact(user) + +/obj/item/device/integrated_circuit_printer/interact(mob/user) + var/window_height = 600 + var/window_width = 500 + + if(isnull(current_category)) + current_category = recipe_list[1] + + var/HTML = "