#define AUTOLATHE_MAIN_MENU 1 #define AUTOLATHE_CATEGORY_MENU 2 #define AUTOLATHE_SEARCH_MENU 3 /obj/machinery/autolathe name = "autolathe" desc = "It produces items using metal and glass." icon_state = "autolathe" density = 1 var/operating = 0 anchored = 1 var/list/L = list() var/list/LL = list() var/hacked = 0 var/disabled = 0 var/shocked = 0 var/hack_wire var/disable_wire var/shock_wire use_power = 1 idle_power_usage = 10 active_power_usage = 100 var/busy = 0 var/prod_coeff = 1 var/datum/design/being_built var/datum/research/files var/list/datum/design/matching_designs var/selected_category var/screen = 1 var/datum/material_container/materials var/list/categories = list( "Tools", "Electronics", "Construction", "T-Comm", "Security", "Machinery", "Medical", "Misc", "Dinnerware", "Imported" ) /obj/machinery/autolathe/New() ..() materials = new /datum/material_container(src, list(MAT_METAL, MAT_GLASS)) var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/autolathe(null) B.apply_default_parts(src) wires = new /datum/wires/autolathe(src) files = new /datum/research/autolathe(src) matching_designs = list() /obj/item/weapon/circuitboard/machine/autolathe name = "Autolathe (Machine Board)" build_path = /obj/machinery/autolathe origin_tech = "engineering=2;programming=2" req_components = list( /obj/item/weapon/stock_parts/matter_bin = 3, /obj/item/weapon/stock_parts/manipulator = 1, /obj/item/weapon/stock_parts/console_screen = 1) /obj/machinery/autolathe/Destroy() qdel(wires) wires = null qdel(materials) materials = null return ..() /obj/machinery/autolathe/interact(mob/user) if(!is_operational()) return if(shocked && !(stat & NOPOWER)) shock(user,50) var/dat switch(screen) if(AUTOLATHE_MAIN_MENU) dat = main_win(user) if(AUTOLATHE_CATEGORY_MENU) dat = category_win(user,selected_category) if(AUTOLATHE_SEARCH_MENU) dat = search_win(user) var/datum/browser/popup = new(user, "autolathe", name, 400, 500) popup.set_content(dat) popup.open() /obj/machinery/autolathe/on_deconstruction() materials.retrieve_all() /obj/machinery/autolathe/attackby(obj/item/O, mob/user, params) if (busy) to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.") return 1 if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O)) updateUsrDialog() return if(exchange_parts(user, O)) return if(panel_open) if(istype(O, /obj/item/weapon/crowbar)) default_deconstruction_crowbar(O) return 1 else if(is_wire_tool(O)) wires.interact(user) return 1 if(user.a_intent == INTENT_HARM) //so we can hit the machine return ..() if(stat) return 1 if(istype(O, /obj/item/weapon/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 = 1 var/obj/item/weapon/disk/design_disk/D = O if(do_after(user, 14.4, target = src)) for(var/B in D.blueprints) if(B) files.AddDesign2Known(B) busy = 0 return 1 if(HAS_SECONDARY_FLAG(O, HOLOGRAM)) return 1 var/material_amount = materials.get_item_material_amount(O) if(!material_amount) to_chat(user, "This object does not contain sufficient amounts of metal or glass to be accepted by the autolathe.") return 1 if(!materials.has_space(material_amount)) to_chat(user, "The autolathe is full. Please remove metal or glass from the autolathe in order to insert more.") return 1 if(!user.temporarilyRemoveItemFromInventory(O)) to_chat(user, "\The [O] is stuck to you and cannot be placed into the autolathe.") return 1 busy = 1 var/inserted = materials.insert_item(O) if(inserted) if(istype(O,/obj/item/stack)) if (O.materials[MAT_METAL]) flick("autolathe_o",src)//plays metal insertion animation if (O.materials[MAT_GLASS]) flick("autolathe_r",src)//plays glass insertion animation to_chat(user, "You insert [inserted] sheet[inserted>1 ? "s" : ""] to the autolathe.") use_power(inserted*100) if(!QDELETED(O)) user.put_in_active_hand(O) else to_chat(user, "You insert a material total of [inserted] to the autolathe.") use_power(max(500,inserted/10)) qdel(O) else user.put_in_active_hand(O) busy = 0 updateUsrDialog() return 1 /obj/machinery/autolathe/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"]) var/turf/T = loc ///////////////// //href protection being_built = files.FindDesignByID(href_list["make"]) //check if it's a valid design 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/power = max(2000, (metal_cost+glass_cost)*multiplier/5) if((materials.amount(MAT_METAL) >= metal_cost*multiplier*coeff) && (materials.amount(MAT_GLASS) >= glass_cost*multiplier*coeff)) busy = 1 use_power(power) icon_state = "autolathe" flick("autolathe_n",src) if(is_stack) spawn(32*coeff) use_power(power) var/list/materials_used = list(MAT_METAL=metal_cost*multiplier, MAT_GLASS=glass_cost*multiplier) materials.use_amount(materials_used) var/obj/item/stack/N = new being_built.build_path(T, multiplier) N.update_icon() N.autolathe_crafted(src) for(var/obj/item/stack/S in T.contents - N) if(istype(S, N.merge_type)) N.merge(S) busy = 0 updateUsrDialog() else spawn(32*coeff*multiplier) use_power(power) var/list/materials_used = list(MAT_METAL=metal_cost*coeff*multiplier, MAT_GLASS=glass_cost*coeff*multiplier) materials.use_amount(materials_used) for(var/i=1, i<=multiplier, i++) var/obj/item/new_item = new being_built.build_path(T) for(var/mat in materials_used) new_item.materials[mat] = materials_used[mat] / multiplier new_item.autolathe_crafted(src) busy = 0 updateUsrDialog() if(href_list["search"]) matching_designs.Cut() for(var/v in files.known_designs) var/datum/design/D = files.known_designs[v] if(findtext(D.name,href_list["to_search"])) matching_designs.Add(D) updateUsrDialog() else to_chat(usr, "The autolathe is busy. Please wait for completion of previous operation.") updateUsrDialog() return /obj/machinery/autolathe/RefreshParts() var/T = 0 for(var/obj/item/weapon/stock_parts/matter_bin/MB in component_parts) T += MB.rating*75000 materials.max_amount = T T=1.2 for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) T -= M.rating*0.2 prod_coeff = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4 /obj/machinery/autolathe/proc/main_win(mob/user) var/dat = "

Autolathe Menu:


" dat += materials_printout() dat += "
\ \ \ \ \ \

" var/line_length = 1 dat += "" for(var/C in categories) if(line_length > 2) dat += "" line_length = 1 dat += "" line_length++ dat += "
[C]
" return dat /obj/machinery/autolathe/proc/category_win(mob/user,selected_category) var/dat = "Return to main menu" dat += "

Browsing [selected_category]:


" dat += materials_printout() for(var/v in files.known_designs) var/datum/design/D = files.known_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)) 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) 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/autolathe/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)) 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) 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/autolathe/proc/materials_printout() 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/autolathe/proc/can_build(datum/design/D, amount = 1) if(D.make_reagents.len) return 0 var/coeff = (ispath(D.build_path,/obj/item/stack) ? 1 : prod_coeff) if(D.materials[MAT_METAL] && (materials.amount(MAT_METAL) < (D.materials[MAT_METAL] * coeff * amount))) return 0 if(D.materials[MAT_GLASS] && (materials.amount(MAT_GLASS) < (D.materials[MAT_GLASS] * coeff * amount))) return 0 return 1 /obj/machinery/autolathe/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" return dat /obj/machinery/autolathe/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/autolathe/proc/shock(mob/user, prb) if(stat & (BROKEN|NOPOWER)) // unpowered, no shock return 0 if(!prob(prb)) return 0 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 1 else return 0 /obj/machinery/autolathe/proc/adjust_hacked(state) hacked = state for(var/datum/design/D in files.possible_designs) if((D.build_type & AUTOLATHE) && ("hacked" in D.category)) if(hacked) files.AddDesign2Known(D) else files.known_designs -= D.id //Called when the object is constructed by an autolathe //Has a reference to the autolathe so you can do !!FUN!! things with hacked lathes /obj/item/proc/autolathe_crafted(obj/machinery/autolathe/A) return