diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index f797c520522..031c8a12f60 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -137,7 +137,7 @@ //transfer_ai() defines. Main proc in ai_core.dm #define AI_TRANS_TO_CARD 1 //Downloading AI to InteliCard. #define AI_TRANS_FROM_CARD 2 //Uploading AI from InteliCard -#define AI_MECH_HACK 3 //Malfunctioning AI hijacking mecha +#define AI_MECH_HACK 3 //Malfunctioning AI hijacking mecha //singularity defines #define STAGE_ONE 1 @@ -154,4 +154,17 @@ #define END_FOR_DVIEW dview_mob.loc = null #define MIN_SUPPLIED_LAW_NUMBER 15 -#define MAX_SUPPLIED_LAW_NUMBER 50 \ No newline at end of file +#define MAX_SUPPLIED_LAW_NUMBER 50 + +//Material defines +#define MAT_METAL "$metal" +#define MAT_GLASS "$glass" +#define MAT_SILVER "$silver" +#define MAT_GOLD "$gold" +#define MAT_DIAMOND "$diamond" +#define MAT_URANIUM "$uranium" +#define MAT_PLASMA "$plasma" +#define MAT_BANANIUM "$bananium" + +#define MAX_STACK_SIZE 50 +//The maximum size of a stack object. \ No newline at end of file diff --git a/code/datums/material_container.dm b/code/datums/material_container.dm new file mode 100644 index 00000000000..56750520095 --- /dev/null +++ b/code/datums/material_container.dm @@ -0,0 +1,249 @@ +/* + This datum should be used for handling mineral contents of machines and whatever else is supposed to hold minerals and make use of them. + + Variables: + amount - raw amount of the mineral this container is holding, calculated by the defined value MINERAL_MATERIAL_AMOUNT=2000. + max_amount - max raw amount of mineral this container can hold. + sheet_type - type of the mineral sheet the container handles, used for output. + owner - object that this container is being used by, used for output. + MAX_STACK_SIZE - size of a stack of mineral sheets. Constant. +*/ + +/datum/material_container + var/total_amount = 0 + var/max_amount + var/sheet_type + var/obj/owner + var/list/materials = list() + //MAX_STACK_SIZE = 50 + //MINERAL_MATERIAL_AMOUNT = 2000 + +/datum/material_container/New(obj/O, list/mat_list, max_amt = 0) + owner = O + max_amount = max(0, max_amt) + + if(mat_list[MAT_METAL]) + materials[MAT_METAL] = new /datum/material/metal() + if(mat_list[MAT_GLASS]) + materials[MAT_GLASS] = new /datum/material/glass() + if(mat_list[MAT_SILVER]) + materials[MAT_SILVER] = new /datum/material/silver() + if(mat_list[MAT_GOLD]) + materials[MAT_GOLD] = new /datum/material/gold() + if(mat_list[MAT_DIAMOND]) + materials[MAT_DIAMOND] = new /datum/material/diamond() + if(mat_list[MAT_URANIUM]) + materials[MAT_URANIUM] = new /datum/material/uranium() + if(mat_list[MAT_PLASMA]) + materials[MAT_PLASMA] = new /datum/material/plasma() + if(mat_list[MAT_BANANIUM]) + materials[MAT_BANANIUM] = new /datum/material/bananium() + +/datum/material_container/Destroy() + owner = null + return ..() + +//For inserting an amount of material +/datum/material_container/proc/insert_amount(amt, material_type = null) + if(amt > 0 && has_space(amt)) + var/total_amount_saved = total_amount + if(material_type) + for(var/datum/material/M in materials) + if(M.material_type == material_type) + M.amount += amt + total_amount += amt + else + for(var/datum/material/M in materials) + M.amount += amt + total_amount += amt + return (total_amount - total_amount_saved) + return 0 + +/datum/material_container/proc/insert_stack(obj/item/stack/S, amt = 0) + if(!amt) + amt = S.amount + var/material_amt = get_item_material_amount(S) + amt = min(amt, round(((max_amount - total_amount) / material_amt))) + if(!amt) + return 0 + + insert_materials(S,amt) + S.use(amt) + return amt + +/datum/material_container/proc/insert_item(obj/item/I, multiplier = 1) + if(!I) + return 0 + if(istype(I,/obj/item/stack)) + return insert_stack(I) + + var/material_amount = get_item_material_amount(I) + if(!material_amount || !has_space(material_amount)) + return 0 + + insert_materials(I, multiplier) + return material_amount + +/datum/material_container/proc/insert_materials(obj/item/I, multiplier = 1) //for internal usage only + var/datum/material/M + for(var/MAT in materials) + M = materials[MAT] + M.amount += I.materials[MAT] * multiplier + total_amount += I.materials[MAT] * multiplier + +//For consuming material +//mats is a list of types of material to use and the corresponding amounts, example: list(MAT_METAL=100, MAT_GLASS=200) +/datum/material_container/proc/use_amount(list/mats) + if(!mats || !mats.len) + return 0 + + var/datum/material/M + for(var/MAT in materials) + M = materials[MAT] + if(M.amount < mats[MAT]) + return 0 + + var/total_amount_save = total_amount + for(var/MAT in materials) + M = materials[MAT] + M.amount -= mats[MAT] + total_amount -= mats[MAT] + + return total_amount_save - total_amount + + +/datum/material_container/proc/use_amount_type(amt, material_type) + var/datum/material/M + M = materials[material_type] + if(M) + if(M.amount >= amt) + M.amount -= amt + total_amount -= amt + return amt + return 0 + +//For spawning mineral sheets; internal use only +/datum/material_container/proc/retrieve(sheet_amt, datum/material/M) + if(sheet_amt > 0 && M.amount >= (sheet_amt * MINERAL_MATERIAL_AMOUNT)) + var/count = 0 + + while(sheet_amt > MAX_STACK_SIZE) + new M.sheet_type(get_turf(owner), MAX_STACK_SIZE) + count += MAX_STACK_SIZE + use_amount_type(sheet_amt * MINERAL_MATERIAL_AMOUNT, M.material_type) + sheet_amt -= MAX_STACK_SIZE + + if(round(M.amount / MINERAL_MATERIAL_AMOUNT)) + new M.sheet_type(get_turf(owner), sheet_amt) + count += sheet_amt + use_amount_type(sheet_amt * MINERAL_MATERIAL_AMOUNT, M.material_type) + return count + return 0 + +/datum/material_container/proc/retrieve_sheets(sheet_amt, material_type) + if(materials[material_type]) + return retrieve(sheet_amt, materials[material_type]) + return 0 + +/datum/material_container/proc/retrieve_amount(amt, material_type) + return retrieve_sheets(amount2sheet(amt),material_type) + +/datum/material_container/proc/retrieve_all() + var/result = 0 + var/datum/material/M + for(var/MAT in materials) + M = materials[MAT] + result += retrieve_sheets(amount2sheet(M.amount), MAT) + return result + +/datum/material_container/proc/has_space(amt = 0) + return (total_amount + amt) <= max_amount + +/datum/material_container/proc/amount2sheet(amt) + if(amt >= MINERAL_MATERIAL_AMOUNT) + return round(amt / MINERAL_MATERIAL_AMOUNT) + return 0 + +/datum/material_container/proc/sheet2amount(sheet_amt) + if(sheet_amt > 0) + return sheet_amt * MINERAL_MATERIAL_AMOUNT + return 0 + +/datum/material_container/proc/amount(material_type) + var/datum/material/M = materials[material_type] + return M ? M.amount : 0 + +/datum/material_container/proc/can_insert(obj/item/I) + return get_item_material_amount(I) + +//returns the amount of material relevant to this container; +//if this container does not support glass, any glass in 'I' will not be taken into account +/datum/material_container/proc/get_item_material_amount(obj/item/I) + if(!istype(I)) + return 0 + var/material_amount = 0 + for(var/MAT in materials) + material_amount += I.materials[MAT] + return material_amount + + +/datum/material + var/amount = 0 + var/material_type = null + var/sheet_type = null + +/datum/material/metal + +/datum/material/metal/New() + ..() + material_type = MAT_METAL + sheet_type = /obj/item/stack/sheet/metal + +/datum/material/glass + +/datum/material/glass/New() + ..() + material_type = MAT_GLASS + sheet_type = /obj/item/stack/sheet/glass + +/datum/material/silver + +/datum/material/silver/New() + ..() + material_type = MAT_SILVER + sheet_type = /obj/item/stack/sheet/mineral/silver + +/datum/material/gold + +/datum/material/gold/New() + ..() + material_type = MAT_GOLD + sheet_type = /obj/item/stack/sheet/mineral/gold + +/datum/material/diamond + +/datum/material/diamond/New() + ..() + material_type = MAT_DIAMOND + sheet_type = /obj/item/stack/sheet/mineral/diamond + +/datum/material/uranium + +/datum/material/uranium/New() + ..() + material_type = MAT_URANIUM + sheet_type = /obj/item/stack/sheet/mineral/uranium + +/datum/material/plasma + +/datum/material/plasma/New() + ..() + material_type = MAT_PLASMA + sheet_type = /obj/item/stack/sheet/mineral/plasma + +/datum/material/bananium + +/datum/material/bananium/New() + ..() + material_type = MAT_BANANIUM + sheet_type = /obj/item/stack/sheet/mineral/bananium \ No newline at end of file diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index bc29494d6ea..9505a0c48a1 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -8,7 +8,7 @@ item_state = "electronic" throw_speed = 4 throw_range = 20 - m_amt = 500 + materials = list(MAT_METAL=500) var/obj/item/weapon/disk/nuclear/the_disk = null var/active = 0 diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 603d293dd55..960b57edacd 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -105,7 +105,7 @@ var/area/alarm_area var/danger_level = 0 var/alarmActivated = 0 // Manually activated (independent from danger level) - + var/buildstage = 2 //2 is built, 1 is building, 0 is frame. var/target_temperature = T0C+20 @@ -114,21 +114,21 @@ var/datum/radio_frequency/radio_connection var/list/TLV = list() - + var/report_danger_level = 1 - + /obj/machinery/alarm/monitor report_danger_level = 0 - + /obj/machinery/alarm/server preset = AALARM_PRESET_SERVER - + /obj/machinery/alarm/vox preset = AALARM_PRESET_VOX - + /obj/machinery/alarm/kitchen_cold_room preset = AALARM_PRESET_COLDROOM - + /obj/machinery/alarm/proc/apply_preset(var/no_cycle_after=0) // Propogate settings. for (var/obj/machinery/alarm/AA in alarm_area) @@ -143,10 +143,10 @@ "plasma" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa "other" = new/datum/tlv(-1.0, -1.0, 0.5, 1.0), // Partial pressure, kpa "pressure" = new/datum/tlv(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.10,ONE_ATMOSPHERE*1.20), /* kpa */ - "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), // K + "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), // K ) switch(preset) - if(AALARM_PRESET_VOX) + if(AALARM_PRESET_VOX) TLV = list( "oxygen" = new/datum/tlv(-1.0, -1.0, 1, 2), // Partial pressure, kpa "nitrogen" = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa @@ -154,9 +154,9 @@ "plasma" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa "other" = new/datum/tlv(-1.0, -1.0, 0.5, 1.0), // Partial pressure, kpa "pressure" = new/datum/tlv(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.10,ONE_ATMOSPHERE*1.20), /* kpa */ - "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), // K + "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), // K ) - if(AALARM_PRESET_SERVER) + if(AALARM_PRESET_SERVER) TLV = list( "oxygen" = new/datum/tlv(-1.0, -1.0,-1.0,-1.0), // Partial pressure, kpa "nitrogen" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), // Partial pressure, kpa @@ -166,7 +166,7 @@ "pressure" = new/datum/tlv(-1.0, -1.0,-1.0,-1.0), /* kpa */ "temperature" = new/datum/tlv(-1.0, -1.0,-1.0,-1.0), // K ) - if(AALARM_PRESET_COLDROOM) + if(AALARM_PRESET_COLDROOM) TLV = list( "oxygen" = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa "nitrogen" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), // Partial pressure, kpa @@ -176,7 +176,7 @@ "pressure" = new/datum/tlv(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.50,ONE_ATMOSPHERE*1.60), /* kpa */ "temperature" = new/datum/tlv(200, 210, 273.15, 283.15), // K ) - + if(!no_cycle_after) mode = AALARM_MODE_REPLACEMENT apply_mode() @@ -185,7 +185,7 @@ ..() air_alarms += src air_alarms = sortAtom(air_alarms) - + wires = new(src) if(building) @@ -223,7 +223,7 @@ set_frequency(frequency) if (!master_is_operating()) elect_master() - + /obj/machinery/alarm/proc/master_is_operating() if (! alarm_area) alarm_area = areaMaster @@ -243,12 +243,12 @@ return var/turf/simulated/location = loc - if(!istype(location)) + if(!istype(location)) return 0 var/datum/gas_mixture/environment = location.return_air() var/datum/tlv/cur_tlv - + handle_heating_cooling(environment, cur_tlv, location) var/GET_PP = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume @@ -256,13 +256,13 @@ cur_tlv = TLV["pressure"] var/environment_pressure = environment.return_pressure() var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure) - + cur_tlv = TLV["oxygen"] var/oxygen_dangerlevel = cur_tlv.get_danger_level(environment.oxygen*GET_PP) cur_tlv = TLV["nitrogen"] - var/nitrogen_dangerlevel = cur_tlv.get_danger_level(environment.nitrogen*GET_PP) - + var/nitrogen_dangerlevel = cur_tlv.get_danger_level(environment.nitrogen*GET_PP) + cur_tlv = TLV["carbon dioxide"] var/co2_dangerlevel = cur_tlv.get_danger_level(environment.carbon_dioxide*GET_PP) @@ -291,11 +291,11 @@ if (old_danger_level!=danger_level) apply_danger_level() - + if (mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05) mode = AALARM_MODE_SCRUBBING apply_mode() - + /obj/machinery/alarm/proc/handle_heating_cooling(var/datum/gas_mixture/environment, var/datum/tlv/cur_tlv, var/turf/simulated/location) cur_tlv = TLV["temperature"] //Handle temperature adjustment here. @@ -603,7 +603,7 @@ /obj/machinery/alarm/attack_robot(mob/user) return attack_ai(user) - + /obj/machinery/alarm/attack_ghost(user as mob) if(stat & (BROKEN|MAINT)) return @@ -614,22 +614,22 @@ if (.) return return interact(user) - + /obj/machinery/alarm/interact(mob/user) if(buildstage != 2) return if(wiresexposed && !istype(user, /mob/living/silicon/ai)) wires.Interact(user) - + if(!shorted) ui_interact(user) /obj/machinery/alarm/proc/ui_air_status() var/turf/location = get_turf(src) - if(!istype(location)) + if(!istype(location)) return - + var/datum/gas_mixture/environment = location.return_air() var/total = environment.oxygen + environment.nitrogen + environment.carbon_dioxide + environment.toxins if(total==0) @@ -754,7 +754,7 @@ scrubbers+=list(scrubber_data) data["scrubbers"]=scrubbers return data - + /obj/machinery/alarm/proc/get_nano_data_console(mob/user) var/data[0] data["name"] = sanitize(name) @@ -766,7 +766,7 @@ data["y"] = pos.y data["z"] = pos.z return data - + /obj/machinery/alarm/proc/generate_thresholds_menu() var/datum/tlv/selected var/list/thresholds = list() @@ -800,9 +800,9 @@ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max2", "selected" = selected.max2)) return thresholds - + /obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state) - var/list/href = state.href_list(user) + var/list/href = state.href_list(user) var/remote_connection = 0 var/remote_access = 0 if(href) @@ -812,8 +812,8 @@ var/list/data = get_nano_data(user, href) data["remote_connection"] = remote_connection - data["remote_access"] = remote_access - + data["remote_access"] = remote_access + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "air_alarm.tmpl", name, 570, 410, state = state) @@ -828,7 +828,7 @@ return 1 else return !locked - + /obj/machinery/alarm/proc/is_locked(mob/user as mob, href_list) if(isobserver(user) && check_rights(R_ADMIN, 0, user)) return 0 @@ -838,13 +838,13 @@ return 0 else return locked - + /obj/machinery/alarm/proc/is_auth_rcon(href_list) if(href_list && href_list["remote_connection"] && href_list["remote_access"]) return 1 else return 0 - + /obj/machinery/alarm/CanUseTopic(var/mob/user, var/datum/topic_state/state, var/href_list = list()) if(buildstage != 2) return STATUS_CLOSE @@ -862,12 +862,12 @@ . = STATUS_UPDATE return min(..(), .) -/obj/machinery/alarm/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state) +/obj/machinery/alarm/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state) if(..(href, href_list, nowindow, state)) return 1 - + var/state_href = state.href_list(usr) - + if(href_list["rcon"]) var/attempted_rcon_setting = text2num(href_list["rcon"]) switch(attempted_rcon_setting) @@ -1101,5 +1101,4 @@ Just an object used in constructing air alarms icon_state = "door_electronics" desc = "Looks like a circuit. Probably is." w_class = 2.0 - m_amt = 50 - g_amt = 50 + materials = list(MAT_METAL=50, MAT_GLASS=50) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 6228fe05ddd..69d6df5bb50 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -8,12 +8,6 @@ icon_state = "autolathe" density = 1 - var/m_amount = 0.0 - var/max_m_amount = 150000.0 - - var/g_amount = 0.0 - var/max_g_amount = 75000.0 - var/operating = 0.0 var/list/queue = list() var/queue_max_len = 12 @@ -40,6 +34,8 @@ var/selected_category var/screen = 1 + var/datum/material_container/materials + var/list/categories = list( "Communication", "Construction", @@ -59,6 +55,7 @@ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) component_parts += new /obj/item/weapon/stock_parts/manipulator(null) component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + materials = new /datum/material_container(src, list(MAT_METAL=1, MAT_GLASS=1)) RefreshParts() wires = new(src) @@ -115,12 +112,7 @@ if (panel_open) if(istype(O, /obj/item/weapon/crowbar)) - if(m_amount >= MINERAL_MATERIAL_AMOUNT) - var/obj/item/stack/sheet/metal/G = new /obj/item/stack/sheet/metal(src.loc) - G.amount = round(m_amount / MINERAL_MATERIAL_AMOUNT) - if(g_amount >= MINERAL_MATERIAL_AMOUNT) - var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src.loc) - G.amount = round(g_amount / MINERAL_MATERIAL_AMOUNT) + materials.retrieve_all() default_deconstruction_crowbar(O) return 1 else @@ -129,48 +121,37 @@ if (stat) return 1 - if (src.m_amount + O.m_amt > max_m_amount) - user << "The autolathe is full. Please remove metal from the autolathe in order to insert more." + var/material_amount = materials.can_insert(O) + if(!material_amount) + user << "This object does not contain sufficient amounts of metal or glass to be accepted by the autolathe." return 1 - if (src.g_amount + O.g_amt > max_g_amount) - user << "The autolathe is full. Please remove glass from the autolathe in order to insert more." + if(!materials.has_space(material_amount)) + user << "The autolathe is full. Please remove metal or glass from the autolathe in order to insert more." return 1 - if (O.m_amt == 0 && O.g_amt == 0) - user << "This object does not contain significant amounts of metal or glass, or cannot be accepted by the autolathe due to size or hazardous materials." + if(!user.unEquip(O)) + user << "\The [O] is stuck to you and cannot be placed into the autolathe." return 1 - var/amount = 1 - var/obj/item/stack/stack - var/m_amt = O.m_amt - var/g_amt = O.g_amt - if (istype(O, /obj/item/stack)) - stack = O - amount = stack.amount - if (m_amt) - amount = min(amount, round((max_m_amount-src.m_amount)/m_amt)) - flick("autolathe_o",src)//plays metal insertion animation - if (g_amt) - amount = min(amount, round((max_g_amount-src.g_amount)/g_amt)) - flick("autolathe_r",src)//plays glass insertion animation - stack.use(amount) - else - if(!user.unEquip(O)) - user << "/the [O] is stuck to your hand, you can't put it in \the [src]!" - O.loc = src - icon_state = "autolathe" busy = 1 - use_power(max(1000, (m_amt+g_amt)*amount/10)) - src.m_amount += m_amt * amount - src.g_amount += g_amt * amount - user << "You insert [amount] sheet[amount>1 ? "s" : ""] to the autolathe." - if (O && O.loc == src) - qdel(O) + 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 + user << "You insert [inserted] sheet[inserted>1 ? "s" : ""] to the autolathe." + use_power(inserted*100) + else + user << "You insert a material total of [inserted] to the autolathe." + use_power(max(500,inserted/10)) + qdel(O) busy = 0 src.updateUsrDialog() -/obj/machinery/autolathe/attack_ghost(mob/user) +/obj/machinery/autolathe/attack_ghost(mob/user) interact(user) - + /obj/machinery/autolathe/attack_hand(mob/user) if(..(user, 0)) return @@ -179,7 +160,7 @@ /obj/machinery/autolathe/Topic(href, href_list) if(..()) return 1 - + if(href_list["menu"]) screen = text2num(href_list["menu"]) @@ -200,7 +181,7 @@ //multiplier checks : only stacks can have one and its value is 1, 10 ,25 or max_multiplier var/multiplier = text2num(href_list["multiplier"]) - var/max_multiplier = min(50, design_last_ordered.materials["$metal"] ?round(m_amount/design_last_ordered.materials["$metal"]):INFINITY,design_last_ordered.materials["$glass"]?round(g_amount/design_last_ordered.materials["$glass"]):INFINITY) + var/max_multiplier = min(50, design_last_ordered.materials[MAT_METAL] ?round(materials.amount(MAT_METAL)/design_last_ordered.materials[MAT_METAL]):INFINITY,design_last_ordered.materials[MAT_GLASS]?round(materials.amount(MAT_GLASS)/design_last_ordered.materials[MAT_GLASS]):INFINITY) var/is_stack = ispath(design_last_ordered.build_path, /obj/item/stack) if(!is_stack && (multiplier > 1)) @@ -248,8 +229,7 @@ for(var/obj/item/weapon/stock_parts/matter_bin/MB in component_parts) tot_rating += MB.rating tot_rating *= 25000 - max_m_amount = tot_rating * 2 - max_g_amount = tot_rating + materials.max_amount = tot_rating * 3 for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) prod_coeff += M.rating - 1 @@ -261,8 +241,8 @@ desc = initial(desc)+"\nIt's building \a [initial(D.name)]." var/is_stack = ispath(D.build_path, /obj/item/stack) var/coeff = get_coeff(D) - var/metal_cost = D.materials["$metal"] - var/glass_cost = D.materials["$glass"] + var/metal_cost = D.materials[MAT_METAL] + var/glass_cost = D.materials[MAT_GLASS] var/power = max(2000, (metal_cost+glass_cost)*multiplier/5) if (can_build(D,multiplier)) being_built = list(D,multiplier) @@ -270,11 +250,11 @@ icon_state = "autolathe" flick("autolathe_n",src) if(is_stack) - m_amount -= metal_cost*multiplier - g_amount -= glass_cost*multiplier + var/list/materials_used = list(MAT_METAL=metal_cost*multiplier, MAT_GLASS=glass_cost*multiplier) + materials.use_amount(materials_used) else - m_amount -= metal_cost/coeff - g_amount -= glass_cost/coeff + var/list/materials_used = list(MAT_METAL=metal_cost/coeff, MAT_GLASS=glass_cost/coeff) + materials.use_amount(materials_used) updateUsrDialog() sleep(32/coeff) if(is_stack) @@ -282,38 +262,34 @@ S.amount = multiplier else var/obj/item/new_item = new D.build_path(BuildTurf) - new_item.m_amt /= coeff - new_item.g_amt /= coeff - if(m_amount < 0) - m_amount = 0 - if(g_amount < 0) - g_amount = 0 + new_item.materials[MAT_METAL] /= coeff + new_item.materials[MAT_GLASS] /= coeff updateUsrDialog() desc = initial(desc) /obj/machinery/autolathe/proc/can_build(var/datum/design/D,var/multiplier=1,var/custom_metal,var/custom_glass) var/coeff = get_coeff(D) - var/metal_amount = m_amount + var/metal_amount = materials.amount(MAT_METAL) if(custom_metal) metal_amount = custom_metal - var/glass_amount = g_amount + var/glass_amount = materials.amount(MAT_GLASS) if(custom_glass) glass_amount = custom_glass - if(D.materials["$metal"] && (metal_amount < (multiplier*D.materials["$metal"] / coeff))) + if(D.materials[MAT_METAL] && (metal_amount < (multiplier*D.materials[MAT_METAL] / coeff))) return 0 - if(D.materials["$glass"] && (glass_amount < (multiplier*D.materials["$glass"] / coeff))) + if(D.materials[MAT_GLASS] && (glass_amount < (multiplier*D.materials[MAT_GLASS] / coeff))) return 0 return 1 /obj/machinery/autolathe/proc/get_design_cost_as_list(var/datum/design/D,var/multiplier=1) var/list/OutputList = list(0,0) var/coeff = get_coeff(D) - if(D.materials["$metal"]) - OutputList[1] = (D.materials["$metal"] / coeff)*multiplier - if(D.materials["$glass"]) - OutputList[2] = (D.materials["$glass"] / coeff)*multiplier + if(D.materials[MAT_METAL]) + OutputList[1] = (D.materials[MAT_METAL] / coeff)*multiplier + if(D.materials[MAT_GLASS]) + OutputList[2] = (D.materials[MAT_GLASS] / coeff)*multiplier return OutputList /obj/machinery/autolathe/proc/get_processing_line() @@ -324,8 +300,8 @@ return output /obj/machinery/autolathe/proc/get_queue() - var/temp_metal = m_amount - var/temp_glass = g_amount + var/temp_metal = materials.amount(MAT_METAL) + var/temp_glass = materials.amount(MAT_GLASS) var/output = "
"
dat += "Autolathe Menu:" - dat += "Metal amount: [src.m_amount] / [max_m_amount] cm3 " - dat += "Glass amount: [src.g_amount] / [max_g_amount] cm3" + dat += "Total amount: [materials.total_amount] / [materials.max_amount] cm3 " + dat += "Metal amount: [materials.amount(MAT_METAL)] cm3 " + dat += "Glass amount: [materials.amount(MAT_GLASS)] cm3 " dat += " |