diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 0a3146b54d0..5df61b032bf 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -701,6 +701,7 @@ This method wont take into account storage items developed in the future and doe density = 0 anchored = 1 var/id = "" + var/temphtml = null // Store the menu HTML in here var/obj/machinery/supply_depot/machine = null var/machinedir = SOUTHWEST @@ -714,34 +715,35 @@ This method wont take into account storage items developed in the future and doe del(src) /obj/machinery/supply_depot_console/attack_hand(user as mob) - // Not ID-locked for now. Maybe in a late update. - var/dat - - dat += text("

Raw Materials Storage

") - - var/canrelease = 0 - if (machine.totalmaterial > 0) - // Loop through the items in our inventory - for (var/material in machine.inventory) - var/temp = machine.inventory[material] - if (temp["amt"] > 0) - - // Can we press the "release" button? - if (temp["rel"] > 0) - canrelease = 1 - - // The things I do to make it look good... - dat += text("[(temp["name"]) ? temp["name"] : material]: [temp["rel"]] ([temp["amt"]] remaining)
") + if (src.temphtml) + dat = src.temphtml else - dat += "No materials loaded." + dat += "

Raw Materials Storage

" + dat += "
" - dat += text("
Storage space remaining: [(machine.MAX_MATERIAL - machine.totalmaterial < machine.MAX_MATERIAL/10) ? "" : ""][machine.MAX_MATERIAL - machine.totalmaterial][(machine.MAX_MATERIAL - machine.totalmaterial < machine.MAX_MATERIAL/10) ? "" : ""]
") // Warn the operator when we're at 90% capacity - dat += text("Print manifest: [machine.printmanifest ? "Yes" : "No"]

") + var/canrelease = 0 + if (machine.total_material > 0) + // Loop through the items in our inventory + for (var/material in machine.inventory) + var/temp = machine.inventory[material] + if (temp["amt"] > 0) - dat += text("Load material
") - if (canrelease) - dat += text("Release materials
") + // Can we press the "release" button? + if (temp["rel"] > 0) + canrelease = 1 + + // The things I do to make it look good... + dat += "" + else + dat += "" + + dat += text("
MaterialStoredAmount to release
[temp["name"]][temp["amt"]][temp["rel"]] - Release
No materials loaded.

Space remaining: [((machine.MAX_MATERIAL - machine.total_material) < machine.MAX_MATERIAL/10) ? "" : ""][machine.MAX_MATERIAL - machine.total_material][(machine.MAX_MATERIAL - machine.total_material < machine.MAX_MATERIAL/10) ? "" : ""]
") // Warn the user when we're at 90% capacity + dat += text("Print manifest: [machine.print_manifest ? "Yes" : "No"]

") + + dat += text("Load material
") + if (canrelease) + dat += text("Release material
") user << browse("[dat]", "window=console_stacking_machine") @@ -751,9 +753,10 @@ This method wont take into account storage items developed in the future and doe usr.machine = src src.add_fingerprint(usr) - if (href_list["setrelease"]) - if (machine.inventory[href_list["setrelease"]]["amt"] > 0) - var/release = text2num(sanitize(input("Amount of [lowertext(machine.inventory[href_list["setrelease"]]["name"])] to release (max 500):", "Amount to release", num2text(machine.inventory[href_list["setrelease"]]["rel"])))) + if (href_list["set_release"]) + var/material = text2path(href_list["set_release"]) + if (machine.inventory[material]["amt"] > 0) + var/release = input("Amount of [lowertext(machine.inventory[material]["name"])] to release (max 500):", "Amount to release", machine.inventory[material]["rel"]) as num // For sanity's sake, we don't drop more than 10 stacks at a time. if (release > 500) @@ -761,20 +764,36 @@ This method wont take into account storage items developed in the future and doe else if (release < 0) release = 0 - machine.inventory[href_list["setrelease"]]["rel"] = release + machine.inventory[material]["rel"] = release - else if (href_list["toggleprint"]) - - machine.printmanifest = !machine.printmanifest + // Turn manifests on/off + else if (href_list["toggle_print"]) + machine.print_manifest = !machine.print_manifest + // Load materials from the output area else if (href_list["load"]) - machine.load_materials(machine.output.loc) - else if (href_list["release"]) + // Release a single material + else if (href_list["release_one"]) + var/material = text2path(href_list["release_one"]) + // Can we release it? + if (!machine.total_material) return + if (machine.inventory[material]["amt"] <= 0 || machine.inventory[material]["rel"] <= 0) return + + if (machine.spawn_stacks(material, machine.inventory[material]["rel"])) + src.temphtml = "Material released.

" + src.temphtml += "OK" + + else if (href_list["release_all"]) // Do it. machine.release_materials() + src.temphtml = "Material released[(machine.print_manifest) ? " and shipping manifest printed" : ""].

" + src.temphtml += "OK" + + else if (href_list["main_menu"]) + src.temphtml = null src.updateUsrDialog() return @@ -784,7 +803,7 @@ This method wont take into account storage items developed in the future and doe */ /obj/machinery/supply_depot name = "supply depot" - icon_state = "supply_depot" + icon_state = "depot_open" density = 1 anchored = 1 var/id = "" @@ -799,29 +818,28 @@ This method wont take into account storage items developed in the future and doe // Or infinite, if research feels like giving cargo a bag of holding, the miserly fucks. var/MAX_MATERIAL = 5000 // The upper limit of -all- materials in the machine (default 100 stacks of 50) - var/totalmaterial = 0 // The total amount it's holding - var/printmanifest = 1 // Print a manifest when releasing material? - var/inventory[0] // See below. + var/total_material = 0 // The total amount it's holding + var/print_manifest = 1 // Print a manifest when releasing material? + + // DEEEEEEERP + var/inventory = list( + /obj/item/stack/sheet/metal = list("name" = "Iron", "amt" = 0, "rel" = 50), + /obj/item/stack/sheet/plasteel = list("name" = "Plasteel", "amt" = 0, "rel" = 50), + /obj/item/stack/sheet/glass = list("name" = "Glass", "amt" = 0, "rel" = 50), + /obj/item/stack/sheet/rglass = list("name" = "Reinforced glass", "amt" = 0, "rel" = 50), + /obj/item/stack/sheet/plasma = list("name" = "Solid plasma", "amt" = 0, "rel" = 50), + /obj/item/stack/sheet/gold = list("name" = "Gold", "amt" = 0, "rel" = 50), + /obj/item/stack/sheet/silver = list("name" = "Silver", "amt" = 0, "rel" = 50), + /obj/item/stack/sheet/uranium = list("name" = "Uranium", "amt" = 0, "rel" = 50), + /obj/item/stack/sheet/diamond = list("name" = "Diamond", "amt" = 0, "rel" = 50), + /obj/item/stack/sheet/clown = list("name" = "Bananium", "amt" = 0, "rel" = 50), + /obj/item/stack/sheet/adamantine= list("name" = "Adamantine", "amt" = 0, "rel" = 50), + /obj/item/stack/sheet/mythril = list("name" = "Mythril", "amt" = 0, "rel" = 50) + ) /obj/machinery/supply_depot/New() ..() - // name is a display name if the item name isn't suitable - // amt is how much is in the machine - // rel is how much we're releasing in this shipment - inventory["metal"] = list(name = "iron", "amt" = 0, "rel" = 50) - inventory["plasteel"] = list("amt" = 0, "rel" = 50) - inventory["glass"] = list("amt" = 0, "rel" = 50) - inventory["rglass"] = list("name" = "reinforced glass", "amt" = 0, "rel" = 50) - inventory["plasma"] = list("amt" = 0, "rel" = 50) - inventory["gold"] = list("amt" = 0, "rel" = 50) - inventory["silver"] = list("amt" = 0, "rel" = 50) - inventory["uranium"] = list("amt" = 0, "rel" = 50) - inventory["diamond"] = list("amt" = 0, "rel" = 50) - inventory["clown"] = list("name" = "bananium", "amt" = 0, "rel" = 50) // HONK - inventory["adamantine"] = list("amt" = 0, "rel" = 50) - inventory["mythril"] = list("amt" = 0, "rel" = 50) - spawn(5) // Find input for (var/dir in cardinal) @@ -831,58 +849,50 @@ This method wont take into account storage items developed in the future and doe for (var/dir in cardinal) src.output = locate(/obj/machinery/mineral/output, get_step(src, dir)) if (src.output) break - // process_objects.Add(src) return return -// Suck up all processable matter from a given location, moving anything we can't -// process to an arbitrary location. -/obj/machinery/supply_depot/proc/load_materials(target, passthrough) - // No overloading. - if (totalmaterial >= MAX_MATERIAL) +// Suck up all processable matter from a given location +/obj/machinery/supply_depot/proc/load_materials(loc_in, loc_out) + // If we can get out of doing anything, we do. + if (total_material >= MAX_MATERIAL || !loc_in) return - if (target) - var/obj/item/stack/sheet/O - while (locate(/obj/item/stack/sheet, target)) - O = locate(/obj/item/stack/sheet, target) - var/found = 0 + var/obj/item/stack/sheet/O + while (locate(/obj/item/stack/sheet, loc_in)) + O = locate(/obj/item/stack/sheet, loc_in) - // Can we fit any more in? - if (totalmaterial + O.amount < MAX_MATERIAL) - for (var/material in inventory) - if (istype(O, text2path("/obj/item/stack/sheet/[material]"))) - inventory[material]["amt"] += O.amount - totalmaterial += O.amount - del(O) - found = 1 - break - else - // Nope. Max us out and edit the material's amount. We're not deleting it. - for (var/material in inventory) - if (istype(O, text2path("/obj/item/stack/sheet/[material]"))) - inventory[material]["amt"] += (MAX_MATERIAL - totalmaterial) - totalmaterial = MAX_MATERIAL - O.amount = MAX_MATERIAL - totalmaterial - found = 1 - break + // Do we want it? + if (inventory[O.type]) + // Will the entire stack fit? + if (total_material + O.amount <= MAX_MATERIAL) + inventory[O.type]["amt"] += O.amount + total_material += O.amount - if (found) - continue + update_icon() + del(O) else - // Anything we don't want gets moved through - if (passthrough) - O.loc = passthrough + // Nope, max us out and update the item + var/taken = MAX_MATERIAL - total_material + inventory[O.type]["amt"] += taken + total_material = MAX_MATERIAL + O.amount = O.amount - taken + + update_icon() + return + else + // We don't. Move it along. + O.loc = loc_out // Release a given batch of materials /obj/machinery/supply_depot/proc/release_materials() - // Can we actually release anything in the first place? - var/canrelease = 0 + if (!src.total_material) return + var/can_release = 0 for (var/material in inventory) if (inventory[material]["amt"] > 0 && inventory[material]["rel"] > 0) - canrelease = 1 - if (!canrelease) return + can_release = 1 + if (!can_release) return // Get us a cargo manifest if applicable... if (ordernum) @@ -891,7 +901,7 @@ This method wont take into account storage items developed in the future and doe ordernum = rand(500,5000) var/obj/item/weapon/paper/manifest/slip - if (printmanifest) + if (print_manifest) slip = new /obj/item/weapon/paper/manifest(output.loc) slip.info = "" slip.info +="

[command_name()] Internal Shipping Manifest



" @@ -908,36 +918,42 @@ This method wont take into account storage items developed in the future and doe if (temp["rel"] > temp["amt"]) temp["rel"] = temp["amt"] - // Subtract material before we go any further - inventory[material]["amt"] -= temp["rel"] - totalmaterial -= temp["rel"] + // WHY THE FUCK DO I DO THESE THINGS + var/obj/item/stack/sheet/M = spawn_stacks(material, temp["rel"]) - var/path = text2path("/obj/item/stack/sheet/[material]") - if (path) - // Need this outside of the ifs so we can get the name afterward. - var obj/item/stack/sheet/G - - // Get our full stacks - for (var/i = 1, i <= round(temp["rel"] / 50), i++) - G = new path - G.amount = 50 - G.loc = output.loc - - // Get our remainder - if (temp["rel"] % 50) - G = new path - G.amount = temp["rel"] % 50 - G.loc = output.loc - - // Try to get the "official" object name if possible. - if (printmanifest) - slip.info += "
  • [temp["rel"]] units [(G.name) ? G.name : (temp["name"]) ? temp["name"] : material]
  • " + if (M && print_manifest) + slip.info += "
  • [temp["rel"]] units [M.name]
  • " // Close up the cargo manifest - if (printmanifest) + if (print_manifest) slip.info += "
    CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
    " slip.loc = output.loc + update_icon() + +/obj/machinery/supply_depot/proc/spawn_stacks(material, amount) + if (!material || amount < 1) + return 0 + + // Decrement our material counts + inventory[material]["amt"] -= amount + total_material -= amount + + var/obj/item/stack/sheet/G + // Spawn our stacks + while (amount > 0) + G = new material(output.loc) + G.amount = (amount >= 50) ? 50 : amount + amount -= G.amount + + return G + /obj/machinery/supply_depot/process() if (src.input && src.output) - load_materials(input.loc, output.loc) \ No newline at end of file + load_materials(input.loc, output.loc) + +/obj/machinery/supply_depot/update_icon() + if (src.total_material >= src.MAX_MATERIAL) + src.icon_state = "depot_closed" + else + icon_state = "depot_open" \ No newline at end of file diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 5fba6b79b99..19cc12a5646 100755 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ