diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index f469b859f2b..8436f932d4a 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -28449,7 +28449,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/computer/ordercomp, +/obj/machinery/computer/supplycomp/public, /obj/effect/decal/warning_stripes/yellow/hollow, /turf/simulated/floor/plasteel{ dir = 5; @@ -29206,7 +29206,7 @@ }, /area/hallway/primary/fore) "bed" = ( -/obj/machinery/computer/ordercomp, +/obj/machinery/computer/supplycomp/public, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "purple" diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 28f2f2f5ebf..c07960eab59 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -35305,7 +35305,7 @@ }, /area/engine/chiefs_office) "bjJ" = ( -/obj/machinery/computer/ordercomp, +/obj/machinery/computer/supplycomp/public, /obj/effect/decal/warning_stripes/yellow, /turf/simulated/floor/plasteel{ dir = 9; @@ -41916,7 +41916,7 @@ d2 = 8; icon_state = "1-8" }, -/obj/machinery/computer/ordercomp, +/obj/machinery/computer/supplycomp/public, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -44531,7 +44531,7 @@ layer = 4; pixel_y = 32 }, -/obj/machinery/computer/ordercomp, +/obj/machinery/computer/supplycomp/public, /turf/simulated/floor/wood, /area/crew_quarters/heads) "byv" = ( diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 4b21edd5a54..6458f106529 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -48799,7 +48799,7 @@ }, /area/engine/gravitygenerator) "bOt" = ( -/obj/machinery/computer/ordercomp, +/obj/machinery/computer/supplycomp/public, /obj/item/radio/intercom{ broadcasting = 0; name = "station intercom (General)"; diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 66f2f61abee..987c1ee28b4 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -9856,7 +9856,7 @@ }, /area/admin) "xV" = ( -/obj/machinery/computer/ordercomp, +/obj/machinery/computer/supplycomp/public, /turf/unsimulated/floor{ tag = "icon-floor"; icon_state = "floor" diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm index 67b6a1b8dd7..c86f988bcd4 100644 --- a/code/controllers/subsystem/shuttles.dm +++ b/code/controllers/subsystem/shuttles.dm @@ -31,7 +31,7 @@ SUBSYSTEM_DEF(shuttle) var/points_per_intel = 250 //points gained per intel returned var/points_per_plasma = 5 //points gained per plasma returned var/points_per_design = 25 //points gained per research design returned - var/centcom_message = "" //Remarks from Centcom on how well you checked the last order. + var/centcom_message = null //Remarks from Centcom on how well you checked the last order. var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentComm, associated with their potencies var/list/techLevels = list() var/list/researchDesigns = list() @@ -61,6 +61,8 @@ SUBSYSTEM_DEF(shuttle) supply_packs["[P.type]"] = P initial_move() + centcom_message = "
---[station_time_timestamp()]---

Remember to stamp and send back the supply manifests.
" + return ..() /datum/controller/subsystem/shuttle/stat_entry(msg) @@ -252,7 +254,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/generateSupplyOrder(packId, _orderedby, _orderedbyRank, _comment, _crates) if(!packId) return - var/datum/supply_packs/P = supply_packs["[packId]"] + var/datum/supply_packs/P = locateUID(packId) if(!P) return diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 0eae7ecc765..98272825e2f 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -55,6 +55,8 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY var/list/announce_beacons = list() // Particular beacons that we'll notify the relevant department when we reach var/special = FALSE //Event/Station Goals/Admin enabled packs var/special_enabled = FALSE + /// List of names for being done in TGUI + var/list/tgui_manifest = list() /datum/supply_packs/New() @@ -63,8 +65,12 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY if(!path) continue var/atom/movable/AM = path manifest += "
  • [initial(AM.name)]
  • " + // Add the name to the UI manifest + tgui_manifest += "[initial(AM.name)]" manifest += "" + + ////// Use the sections to keep things tidy please /Malkevin ////////////////////////////////////////////////////////////////////////////// diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 3115a4a235b..a02c46524c5 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -280,7 +280,7 @@ origin_tech = "programming=3;powerstorage=3" /obj/item/circuitboard/ordercomp name = "Circuit board (Supply Ordering Console)" - build_path = /obj/machinery/computer/ordercomp + build_path = /obj/machinery/computer/supplycomp/public origin_tech = "programming=3" /obj/item/circuitboard/supplycomp name = "Circuit board (Supply Shuttle Console)" diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index b1eeb07a6de..5d8e9a6f914 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -1,8 +1,3 @@ -#define ORDER_SCREEN_WIDTH 625 //width of order computer interaction window -#define ORDER_SCREEN_HEIGHT 580 //height of order computer interaction window -#define SUPPLY_SCREEN_WIDTH 625 //width of supply computer interaction window -#define SUPPLY_SCREEN_HEIGHT 620 //height of supply computer interaction window - /obj/item/paper/manifest name = "supply manifest" var/erroneous = 0 @@ -98,7 +93,7 @@ var/intel_count = 0 var/crate_count = 0 - var/msg = "" + var/msg = "
    ---[station_time_timestamp()]---

    " var/pointsEarned for(var/atom/movable/MA in areaInstance) @@ -231,7 +226,7 @@ msg += "+[pointsEarned]: Received [crate_count] crate(s).
    " SSshuttle.points += pointsEarned - SSshuttle.centcom_message = msg + SSshuttle.centcom_message += "[msg]
    " /proc/forbidden_atoms_check(atom/A) var/list/blacklist = list( @@ -387,156 +382,23 @@ icon_screen = "supply" req_access = list(ACCESS_CARGO) circuit = /obj/item/circuitboard/supplycomp - var/temp = null + /// Is this a public console (Confirm + Shuttle controls are not visible) + var/is_public = FALSE + /// Time of last request var/reqtime = 0 - var/hacked = 0 - var/can_order_contraband = 0 - var/last_viewed_group = "categories" - var/datum/supply_packs/content_pack + /// Can we order special supplies + var/hacked = FALSE + /// Can we order contraband + var/can_order_contraband = FALSE -/obj/machinery/computer/ordercomp +/obj/machinery/computer/supplycomp/public name = "Supply Ordering Console" desc = "Used to order supplies from cargo staff." icon = 'icons/obj/computer.dmi' icon_screen = "request" circuit = /obj/item/circuitboard/ordercomp - var/reqtime = 0 - var/last_viewed_group = "categories" - var/datum/supply_packs/content_pack - -/obj/machinery/computer/ordercomp/attack_ai(var/mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer/ordercomp/attack_hand(var/mob/user as mob) - ui_interact(user) - -/obj/machinery/computer/ordercomp/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) - ui = SSnanoui.try_update_ui(user, src, ui_key, ui) - if(!ui) - ui = new(user, src, ui_key, "order_console.tmpl", name, ORDER_SCREEN_WIDTH, ORDER_SCREEN_HEIGHT) - ui.open() - -/obj/machinery/computer/ordercomp/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) - var/data[0] - data["last_viewed_group"] = last_viewed_group - - var/category_list[0] - for(var/category in GLOB.all_supply_groups) - category_list.Add(list(list("name" = get_supply_group_name(category), "category" = category))) - data["categories"] = category_list - var/cat = text2num(last_viewed_group) - var/packs_list[0] - for(var/set_name in SSshuttle.supply_packs) - var/datum/supply_packs/pack = SSshuttle.supply_packs[set_name] - if((!pack.contraband && !pack.hidden && !pack.special && pack.group == cat) || (!pack.contraband && !pack.hidden && (pack.special && pack.special_enabled) && pack.group == cat)) - // 0/1 after the pack name (set_name) is a boolean for ordering multiple crates - packs_list.Add(list(list("name" = pack.name, "amount" = pack.amount, "cost" = pack.cost, "command1" = list("doorder" = "[set_name]0"), "command2" = list("doorder" = "[set_name]1"), "command3" = list("contents" = set_name)))) - - data["supply_packs"] = packs_list - if(content_pack) - var/pack_name = sanitize(content_pack.name) - data["contents_name"] = pack_name - data["contents"] = content_pack.manifest - data["contents_access"] = content_pack.access ? get_access_desc(content_pack.access) : "None" - - var/requests_list[0] - for(var/set_name in SSshuttle.requestlist) - var/datum/supply_order/SO = set_name - if(SO) - // Check if the user owns the request, so they can cancel requests - var/obj/item/card/id/I = user.get_id_card() - var/owned = 0 - if(I && SO.orderedby == I.registered_name) - owned = 1 - requests_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby, "owned" = owned, "command1" = list("rreq" = SO.ordernum)))) - data["requests"] = requests_list - var/orders_list[0] - for(var/set_name in SSshuttle.shoppinglist) - var/datum/supply_order/SO = set_name - if(SO) - orders_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby))) - data["orders"] = orders_list - - data["points"] = round(SSshuttle.points) - data["send"] = list("send" = 1) - - data["moving"] = SSshuttle.supply.mode != SHUTTLE_IDLE - data["at_station"] = SSshuttle.supply.getDockedId() == "supply_home" - data["timeleft"] = SSshuttle.supply.timeLeft(600) - return data - -/obj/machinery/computer/ordercomp/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["doorder"]) - if(world.time < reqtime) - visible_message("[src]'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"") - SSnanoui.update_uis(src) - return 1 - - var/index = copytext(href_list["doorder"], 1, length(href_list["doorder"])) //text2num(copytext(href_list["doorder"], 1)) - var/multi = text2num(copytext(href_list["doorder"], -1)) - if(!isnum(multi)) - return 1 - var/datum/supply_packs/P = SSshuttle.supply_packs[index] - if(!istype(P)) - return 1 - var/crates = 1 - if(multi) - var/num_input = input(usr, "Amount:", "How many crates?") as null|num - if(!num_input || ..()) - return 1 - crates = clamp(round(num_input), 1, 20) - - var/timeout = world.time + 600 - var/reason = input(usr,"Reason:","Why do you require this item?","") as null|text - if(world.time > timeout || !reason || ..()) - return 1 - reason = sanitize(copytext(reason, 1, MAX_MESSAGE_LEN)) - - var/idname = "*None Provided*" - var/idrank = "*None Provided*" - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - idname = H.get_authentification_name() - idrank = H.get_assignment() - else if(issilicon(usr)) - idname = usr.real_name - - reqtime = (world.time + 5) % 1e5 - - //make our supply_order datums - for(var/i = 1; i <= crates; i++) - var/datum/supply_order/O = SSshuttle.generateSupplyOrder(index, idname, idrank, reason, crates) - if(!O) return - if(i == 1) - O.generateRequisition(loc) - - else if(href_list["rreq"]) - var/ordernum = text2num(href_list["rreq"]) - var/obj/item/card/id/I = usr.get_id_card() - for(var/i=1, i<=SSshuttle.requestlist.len, i++) - var/datum/supply_order/SO = SSshuttle.requestlist[i] - if(SO.ordernum == ordernum && (I && SO.orderedby == I.registered_name)) - SSshuttle.requestlist.Cut(i,i+1) - break - - else if(href_list["last_viewed_group"]) - content_pack = null - last_viewed_group = text2num(href_list["last_viewed_group"]) - - else if(href_list["contents"]) - var/topic = href_list["contents"] - if(topic == 1) - content_pack = null - else - var/datum/supply_packs/P = SSshuttle.supply_packs[topic] - content_pack = P - - add_fingerprint(usr) - SSnanoui.update_uis(src) - return 1 + req_access = list() + is_public = TRUE /obj/machinery/computer/supplycomp/attack_ai(var/mob/user as mob) return attack_hand(user) @@ -547,47 +409,25 @@ return 1 post_signal("supply") - ui_interact(user) + tgui_interact(user) return /obj/machinery/computer/supplycomp/emag_act(user as mob) if(!hacked) to_chat(user, "Special supplies unlocked.") - hacked = 1 + hacked = TRUE return -/obj/machinery/computer/supplycomp/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) - ui = SSnanoui.try_update_ui(user, src, ui_key, ui) +/obj/machinery/computer/supplycomp/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "supply_console.tmpl", name, SUPPLY_SCREEN_WIDTH, SUPPLY_SCREEN_HEIGHT) + ui = new(user, src, ui_key, "CargoConsole", name, 900, 800, master_ui, state) ui.open() -/obj/machinery/computer/supplycomp/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) - var/data[0] - data["last_viewed_group"] = last_viewed_group +/obj/machinery/computer/supplycomp/tgui_data(mob/user) + var/list/data = list() - var/category_list[0] - for(var/category in GLOB.all_supply_groups) - category_list.Add(list(list("name" = get_supply_group_name(category), "category" = category))) - data["categories"] = category_list - - var/cat = text2num(last_viewed_group) - var/packs_list[0] - for(var/set_name in SSshuttle.supply_packs) - var/datum/supply_packs/pack = SSshuttle.supply_packs[set_name] - if((pack.hidden && hacked) || (pack.contraband && can_order_contraband) || (pack.special && pack.special_enabled) || (!pack.contraband && !pack.hidden && !pack.special)) - if(pack.group == cat) - // 0/1 after the pack name (set_name) is a boolean for ordering multiple crates - packs_list.Add(list(list("name" = pack.name, "amount" = pack.amount, "cost" = pack.cost, "command1" = list("doorder" = "[set_name]0"), "command2" = list("doorder" = "[set_name]1"), "command3" = list("contents" = set_name)))) - - data["supply_packs"] = packs_list - if(content_pack) - var/pack_name = sanitize(content_pack.name) - data["contents_name"] = pack_name - data["contents"] = content_pack.manifest - data["contents_access"] = content_pack.access ? get_access_desc(content_pack.access) : "None" - - var/requests_list[0] + var/list/requests_list = list() for(var/set_name in SSshuttle.requestlist) var/datum/supply_order/SO = set_name if(SO) @@ -596,146 +436,177 @@ requests_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby, "comment" = SO.comment, "command1" = list("confirmorder" = SO.ordernum), "command2" = list("rreq" = SO.ordernum)))) data["requests"] = requests_list - var/orders_list[0] + var/list/orders_list = list() for(var/set_name in SSshuttle.shoppinglist) var/datum/supply_order/SO = set_name if(SO) orders_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby, "comment" = SO.comment))) data["orders"] = orders_list - data["canapprove"] = (SSshuttle.supply.getDockedId() == "supply_away") && !(SSshuttle.supply.mode != SHUTTLE_IDLE) + data["is_public"] = is_public + + data["canapprove"] = (SSshuttle.supply.getDockedId() == "supply_away") && !(SSshuttle.supply.mode != SHUTTLE_IDLE) && !is_public data["points"] = round(SSshuttle.points) - data["send"] = list("send" = 1) - data["message"] = SSshuttle.centcom_message ? SSshuttle.centcom_message : "Remember to stamp and send back the supply manifests." data["moving"] = SSshuttle.supply.mode != SHUTTLE_IDLE data["at_station"] = SSshuttle.supply.getDockedId() == "supply_home" data["timeleft"] = SSshuttle.supply.timeLeft(600) data["can_launch"] = !SSshuttle.supply.canMove() + + return data + +/obj/machinery/computer/supplycomp/tgui_static_data(mob/user) + var/list/data = list() + var/list/packs_list = list() + + for(var/set_name in SSshuttle.supply_packs) + var/datum/supply_packs/pack = SSshuttle.supply_packs[set_name] + if((pack.hidden && hacked) || (pack.contraband && can_order_contraband) || (pack.special && pack.special_enabled) || (!pack.contraband && !pack.hidden && !pack.special)) + packs_list.Add(list(list("name" = pack.name, "cost" = pack.cost, "ref" = "[pack.UID()]", "contents" = pack.tgui_manifest, "cat" = pack.group))) + + data["supply_packs"] = packs_list + + var/list/categories = list() // meow + for(var/category in GLOB.all_supply_groups) + categories.Add(list(list("name" = get_supply_group_name(category), "category" = category))) + data["categories"] = categories + return data /obj/machinery/computer/supplycomp/proc/is_authorized(mob/user) if(allowed(user)) - return 1 + return TRUE if(user.can_admin_interact()) - return 1 + return TRUE - return 0 + return FALSE -/obj/machinery/computer/supplycomp/Topic(href, href_list) +/obj/machinery/computer/supplycomp/tgui_act(action, list/params) if(..()) - return 1 + return - if(!is_authorized(usr)) - return 1 + // If its not a public console, and they aint authed, dont let them use this + if(!is_public && !is_authorized(usr)) + return if(!SSshuttle) - log_runtime(EXCEPTION("The SSshuttle controller datum is missing somehow."), src) - return 1 - - if(href_list["send"]) - if(SSshuttle.supply.canMove()) - to_chat(usr, "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.") - else if(SSshuttle.supply.getDockedId() == "supply_home") - SSshuttle.toggleShuttle("supply", "supply_home", "supply_away", 1) - investigate_log("[key_name(usr)] has sent the supply shuttle away. Remaining points: [SSshuttle.points]. Shuttle contents: [SSshuttle.sold_atoms]", "cargo") - else if(!SSshuttle.supply.request(SSshuttle.getDock("supply_home"))) - post_signal("supply") - if(LAZYLEN(SSshuttle.shoppinglist) && prob(10)) - var/datum/supply_order/O = new /datum/supply_order() - O.ordernum = SSshuttle.ordernum - O.object = SSshuttle.supply_packs[pick(SSshuttle.supply_packs)] - O.orderedby = random_name(pick(MALE,FEMALE), species = "Human") - SSshuttle.shoppinglist += O - investigate_log("Random [O.object] crate added to supply shuttle") - - else if(href_list["doorder"]) - if(world.time < reqtime) - visible_message("[src]'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"") - SSnanoui.update_uis(src) - return 1 - - var/index = copytext(href_list["doorder"], 1, length(href_list["doorder"])) //text2num(copytext(href_list["doorder"], 1)) - var/multi = text2num(copytext(href_list["doorder"], -1)) - if(!isnum(multi)) - return 1 - var/datum/supply_packs/P = SSshuttle.supply_packs[index] - if(!istype(P)) - return 1 - var/crates = 1 - if(multi) - var/num_input = input(usr, "Amount:", "How many crates?") as null|num - if(!num_input || !is_authorized(usr) || ..()) - return 1 - crates = clamp(round(num_input), 1, 20) - - var/timeout = world.time + 600 - var/reason = input(usr,"Reason:","Why do you require this item?","") as null|text - if(world.time > timeout || !reason || !is_authorized(usr) || ..()) - return 1 - reason = sanitize(copytext(reason, 1, MAX_MESSAGE_LEN)) - - var/idname = "*None Provided*" - var/idrank = "*None Provided*" - - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - idname = H.get_authentification_name() - idrank = H.get_assignment() - else if(issilicon(usr)) - idname = usr.real_name - - //make our supply_order datums - for(var/i = 1; i <= crates; i++) - var/datum/supply_order/O = SSshuttle.generateSupplyOrder(index, idname, idrank, reason, crates) - if(!O) return 1 - if(i == 1) - O.generateRequisition(loc) - - else if(href_list["confirmorder"]) - if(SSshuttle.supply.getDockedId() != "supply_away" || SSshuttle.supply.mode != SHUTTLE_IDLE) - return 1 - var/ordernum = text2num(href_list["confirmorder"]) - var/datum/supply_order/O - var/datum/supply_packs/P - for(var/i=1, i<=SSshuttle.requestlist.len, i++) - var/datum/supply_order/SO = SSshuttle.requestlist[i] - if(SO.ordernum == ordernum) - O = SO - P = O.object - if(SSshuttle.points >= P.cost) - SSshuttle.requestlist.Cut(i,i+1) - SSshuttle.points -= P.cost - SSshuttle.shoppinglist += O - investigate_log("[key_name(usr)] has authorized an order for [P.name]. Remaining points: [SSshuttle.points].", "cargo") - else - to_chat(usr, "There are insufficient supply points for this request.") - break - - else if(href_list["rreq"]) - var/ordernum = text2num(href_list["rreq"]) - for(var/i=1, i<=SSshuttle.requestlist.len, i++) - var/datum/supply_order/SO = SSshuttle.requestlist[i] - if(SO.ordernum == ordernum) - SSshuttle.requestlist.Cut(i,i+1) - break - - else if(href_list["last_viewed_group"]) - content_pack = null - last_viewed_group = text2num(href_list["last_viewed_group"]) - - else if(href_list["contents"]) - var/topic = href_list["contents"] - if(topic == 1) - content_pack = null - else - var/datum/supply_packs/P = SSshuttle.supply_packs[topic] - content_pack = P + stack_trace("The SSshuttle controller datum is missing somehow.") + return + . = TRUE add_fingerprint(usr) - SSnanoui.update_uis(src) - return 1 + + switch(action) + if("moveShuttle") + // Public consoles cant move the shuttle. Dont allow exploiters. + if(is_public) + return + if(SSshuttle.supply.canMove()) + to_chat(usr, "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.") + else if(SSshuttle.supply.getDockedId() == "supply_home") + SSshuttle.toggleShuttle("supply", "supply_home", "supply_away", 1) + investigate_log("[key_name(usr)] has sent the supply shuttle away. Remaining points: [SSshuttle.points]. Shuttle contents: [SSshuttle.sold_atoms]", "cargo") + else if(!SSshuttle.supply.request(SSshuttle.getDock("supply_home"))) + post_signal("supply") + if(LAZYLEN(SSshuttle.shoppinglist) && prob(10)) + var/datum/supply_order/O = new /datum/supply_order() + O.ordernum = SSshuttle.ordernum + O.object = SSshuttle.supply_packs[pick(SSshuttle.supply_packs)] + O.orderedby = random_name(pick(MALE,FEMALE), species = "Human") + SSshuttle.shoppinglist += O + investigate_log("Random [O.object] crate added to supply shuttle") + + if("order") + if(world.time < reqtime) + visible_message("[src]'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"") + return + + var/amount = 1 + if(params["multiple"] == "1") // 1 is a string here. DO NOT MAKE THIS A BOOLEAN YOU DORK + var/num_input = input(usr, "Amount", "How many crates? (20 Max)") as null|num + if(!num_input || (!is_public && !is_authorized(usr)) || ..()) // Make sure they dont walk away + return + amount = clamp(round(num_input), 1, 20) + + + var/datum/supply_packs/P = locateUID(params["crate"]) + if(!istype(P)) + return + + var/timeout = world.time + 600 // If you dont type the reason within a minute, theres bigger problems here + var/reason = input(usr, "Reason", "Why do you require this item?","") as null|text + if(world.time > timeout || !reason || (!is_public && !is_authorized(usr)) || ..()) + // Cancel if they take too long, they dont give a reason, they aint authed, or if they walked away + return + reason = sanitize(copytext(reason, 1, MAX_MESSAGE_LEN)) + + var/idname = "*None Provided*" + var/idrank = "*None Provided*" + + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + idname = H.get_authentification_name() + idrank = H.get_assignment() + else if(issilicon(usr)) + idname = usr.real_name + + //make our supply_order datums + for(var/i = 1; i <= amount; i++) + var/datum/supply_order/O = SSshuttle.generateSupplyOrder(params["crate"], idname, idrank, reason, amount) + if(!O) + return + if(i == 1) + O.generateRequisition(loc) + + if("approve") + // Public consoles cant approve stuff + if(is_public) + return + if(SSshuttle.supply.getDockedId() != "supply_away" || SSshuttle.supply.mode != SHUTTLE_IDLE) + return + + var/ordernum = text2num(params["ordernum"]) + var/datum/supply_order/O + var/datum/supply_packs/P + for(var/i=1, i<=SSshuttle.requestlist.len, i++) + var/datum/supply_order/SO = SSshuttle.requestlist[i] + if(SO.ordernum == ordernum) + O = SO + P = O.object + if(SSshuttle.points >= P.cost) + SSshuttle.requestlist.Cut(i,i+1) + SSshuttle.points -= P.cost + SSshuttle.shoppinglist += O + investigate_log("[key_name(usr)] has authorized an order for [P.name]. Remaining points: [SSshuttle.points].", "cargo") + else + to_chat(usr, "There are insufficient supply points for this request.") + break + + if("deny") + var/ordernum = text2num(params["ordernum"]) + for(var/i=1, i<=SSshuttle.requestlist.len, i++) + var/datum/supply_order/SO = SSshuttle.requestlist[i] + if(SO.ordernum == ordernum) + // If we are on a public console, only allow cancelling of our own orders + if(is_public) + var/obj/item/card/id/I = usr.get_id_card() + if(I && SO.orderedby == I.registered_name) + SSshuttle.requestlist.Cut(i,i+1) + break + // If we arent public, were cargo access. CANCELLATIONS FOR EVERYONE + else + SSshuttle.requestlist.Cut(i,i+1) + break + + // Popup to show CC message logs. Its easier this way to avoid box-spam in TGUI + if("showMessages") + // Public consoles cant view messages + if(is_public) + return + var/datum/browser/ccmsg_browser = new(usr, "ccmsg", "Central Command Cargo Message Log", 800, 600) + ccmsg_browser.set_content(SSshuttle.centcom_message) + ccmsg_browser.open() /obj/machinery/computer/supplycomp/proc/post_signal(var/command) var/datum/radio_frequency/frequency = SSradio.return_frequency(DISPLAY_FREQ) @@ -748,9 +619,3 @@ status_signal.data["command"] = command frequency.post_signal(src, status_signal) - - -#undef ORDER_SCREEN_WIDTH -#undef ORDER_SCREEN_HEIGHT -#undef SUPPLY_SCREEN_WIDTH -#undef SUPPLY_SCREEN_HEIGHT diff --git a/nano/templates/order_console.tmpl b/nano/templates/order_console.tmpl deleted file mode 100644 index 271e35c525a..00000000000 --- a/nano/templates/order_console.tmpl +++ /dev/null @@ -1,111 +0,0 @@ - - - -
    -
    - Supply Points: -
    -
    - {{:data.points}} -
    -
    -
    -
    - Shuttle Status: -
    -
    - {{if !data.moving && !data.at_station}} - Docked off-station. - {{else !data.moving && data.at_station}} - Docked at the station. - {{else data.moving}} - Shuttle is en route (ETA: {{:data.timeleft}} minute{{if data.timeleft != 1}}s{{/if}}). - {{/if}} -
    -
    -
    -
    - Supply Crates -
    -
    -
    -
    - {{if !data.contents}} - {{for data.supply_packs}} -
    -
    -
    {{:helper.link(value.name, null, value.command1)}}
    - {{:helper.link('#', null, value.command2, null)}}{{:helper.link('C', null, value.command3, null)}}
    {{:value.cost}} points
    -
    -
    - {{/for}} - {{else}} -
    - Contents of {{:data.contents_name}} -
    - {{:data.contents}} - {{:helper.link('Return', 'arrow-left', {'contents' : 1})}} - {{/if}} -
    -
    -
    -
    -
    -
    - Categories -
    - {{for data.categories}} -
    - {{:helper.link(value.name, 'gear', {'last_viewed_group':value.category}, (data.last_viewed_group==value.category) ? 'linkOn' : '', 'category')}} -
    - {{/for}} -
    -
    -
    - Supply Orders -
    -
    -
    -
    - Requests -
    - {{for data.requests}} -
    - #{{:value.ordernum}} - {{:value.supply_type}} for {{:value.orderedby}} - {{if value.owned == 1}} - {{:helper.link('CANCEL', null, value.command1, null)}} - {{/if}} -
    - {{empty}} - No active requests. - {{/for}} -
    - Orders -
    - {{for data.orders}} -
    - #{{:value.ordernum}} - {{:value.supply_type}} for {{:value.orderedby}} -
    - {{empty}} - No confirmed orders. - {{/for}} -
    -
    -
    -
    \ No newline at end of file diff --git a/nano/templates/supply_console.tmpl b/nano/templates/supply_console.tmpl deleted file mode 100644 index 3402e8982b5..00000000000 --- a/nano/templates/supply_console.tmpl +++ /dev/null @@ -1,130 +0,0 @@ - - - -
    -
    - Supply Points: -
    -
    - {{:data.points}} -
    -
    -
    -
    - Central Command messages: -
    -
    - {{:data.message}} -
    -
    -
    -
    - Shuttle Status: -
    -
    - {{if !data.moving && !data.at_station}} - Docked off-station. - {{else !data.moving && data.at_station}} - Docked at the station. - {{else data.moving}} -
    Shuttle is en route (ETA: {{:data.timeleft}} minute{{if data.timeleft != 1}}s{{/if}}).
    - {{/if}} -
    -
    -
    -
    - Shuttle Control: -
    -
    - {{:helper.link('Call Shuttle', 'arrow-circle-down', data.send, data.moving || data.at_station || !data.can_launch ? 'disabled' : '')}} - {{:helper.link('Return Shuttle', 'arrow-circle-up', data.send, data.moving || !data.at_station || !data.can_launch ? 'disabled' : '')}} -
    -
    -
    -
    - Supply Crates -
    -
    -
    -
    - {{if !data.contents}} - {{for data.supply_packs}} -
    -
    -
    {{:helper.link(value.name, null, value.command1)}}
    - {{:helper.link('#', null, value.command2, null)}} - {{:helper.link('C', null, value.command3, null)}}
    {{:value.cost}} points
    -
    -
    - {{/for}} - {{else}} - {{:helper.link('Return', 'arrow-left', {'contents' : 1})}} -
    - Contents of {{:data.contents_name}} -
    - {{:data.contents}} - {{/if}} -
    -
    -
    -
    -
    -
    - Categories -
    - {{for data.categories}} -
    - {{:helper.link(value.name, 'gear', {'last_viewed_group':value.category}, (data.last_viewed_group==value.category) ? 'linkOn' : '', 'category')}} -
    - {{/for}} -
    -
    -
    - Supply Orders -
    -
    -
    -
    - Requests -
    - {{for data.requests}} -
    - #{{:value.ordernum}} - {{:value.supply_type}} for {{:value.orderedby}} -
    - {{:value.comment}} -
    - {{:helper.link('APPROVE', null, value.command1, !data.canapprove ? 'disabled' : '')}} {{:helper.link('REJECT', null, value.command2, null)}} -
    - {{empty}} - No active requests. - {{/for}} -
    - Orders -
    - {{for data.orders}} -
    - #{{:value.ordernum}} - {{:value.supply_type}} for {{:value.orderedby}} -
    - {{empty}} - No confirmed orders. - {{/for}} -
    -
    -
    -
    \ No newline at end of file diff --git a/tgui/packages/tgui/interfaces/CargoConsole.js b/tgui/packages/tgui/interfaces/CargoConsole.js new file mode 100644 index 00000000000..a9ae19b5e10 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CargoConsole.js @@ -0,0 +1,280 @@ +import { flow } from 'common/fp'; +import { Fragment } from 'inferno'; +import { filter, sortBy } from 'common/collections'; +import { useBackend, useSharedState, useLocalState } from "../backend"; +import { Button, LabeledList, Box, AnimatedNumber, Section, Dropdown, Input, Table, Modal } from "../components"; +import { Window } from "../layouts"; +import { LabeledListItem } from "../components/LabeledList"; +import { createSearch, toTitleCase } from 'common/string'; + +export const CargoConsole = (props, context) => { + return ( + + + + + + + + + ); +}; + +const ContentsModal = (_properties, context) => { + const [ + contentsModal, + setContentsModal, + ] = useLocalState(context, 'contentsModal', null); + + const [ + contentsModalTitle, + setContentsModalTitle, + ] = useLocalState(context, 'contentsModalTitle', null); + if ((contentsModal !== null) && (contentsModalTitle !== null)) { + return ( + +

    {contentsModalTitle} contents:

    + + {contentsModal.map(i => ( + // This needs keying. I hate it. + + - {i} + + ))} + + +