From c89f4fb977f225014dbb0f7161e332439ddfa3d1 Mon Sep 17 00:00:00 2001 From: Casper3667 <8396443+Casper3667@users.noreply.github.com> Date: Thu, 26 Mar 2026 21:57:43 +0100 Subject: [PATCH] Combines the quikpay system into a datum, adds categories and more commissary things (#22055) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes a couple of issues with the quikpay program, and makes it into a datum that can be put into anything. The ordering terminal the galley has now uses the quikpay program as well. The commissary now has a wall terminal they can enable and disable at need to allow people to purchase things while the shop is unattended. Also a small expansion to the commissary. Food and drink fridges can be renamed with a pen. All commissary shelves now have a message when an item are taken from them. The frozen meal vending machine was also readded behind the café. image image image image image image --- aurorastation.dme | 1 + code/__HELPERS/price.dm | 73 ++- code/datums/components/commissaryShop.dm | 434 +++++++++++++++ code/modules/cooking/machinery/commissary.dm | 380 ++++--------- code/modules/cooking/machinery/smartfridge.dm | 24 +- code/modules/economy/OrderTerminal.dm | 165 +----- code/modules/economy/quikpay.dm | 259 +-------- html/changelogs/CommissaryChanges.yml | 13 + icons/obj/machinery/wall/terminals.dmi | Bin 42785 -> 48785 bytes maps/sccv_horizon/sccv_horizon.dmm | 512 ++++++++++-------- tgui/packages/tgui/interfaces/QuikPay.tsx | 96 ++-- 11 files changed, 1001 insertions(+), 956 deletions(-) create mode 100644 code/datums/components/commissaryShop.dm create mode 100644 html/changelogs/CommissaryChanges.yml diff --git a/aurorastation.dme b/aurorastation.dme index 611dbec244e..a8f148a0ceb 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -484,6 +484,7 @@ #include "code\datums\weakrefs.dm" #include "code\datums\changelog\changelog.dm" #include "code\datums\components\_component.dm" +#include "code\datums\components\commissaryShop.dm" #include "code\datums\components\connect_mob_behalf.dm" #include "code\datums\components\drift.dm" #include "code\datums\components\jukebox.dm" diff --git a/code/__HELPERS/price.dm b/code/__HELPERS/price.dm index 3a5331f3bed..50f53df1d76 100644 --- a/code/__HELPERS/price.dm +++ b/code/__HELPERS/price.dm @@ -11,35 +11,73 @@ /proc/read_paper_price_list(var/obj/item/paper/R) var/text = R.info - // Split on new line + // Split on line breaks var/list/lines = splittext(text, "
") var/list/result = list() - // Skip a header line + // Skip header line for(var/i = 2; i <= lines.len; i++) - var/line = lines[i] + var/line = trim(lines[i]) if(!length(line)) continue - // Split the name and price var/list/split_input = splittext(line, ";") - if(split_input.len < 2) + // category;name;price + if(length(split_input) >= 3) + var/category = trim(split_input[1]) + var/name = trim(split_input[2]) + var/price_text = trim(split_input[3]) + + if(!length(category)) + category = "Uncategorized" + if(!length(name)) + continue + + var/price = text2num(price_text) + + // Reject null prices + if(isnull(price)) + continue + + // Reject invalid prices + if(price == 0 && price_text != "0" && price_text != "0.0" && price_text != "0.00") + continue + + result += list(list( + "name" = name, + "price" = price, + "category" = category + )) continue - var/name = split_input[1] - var/price_text = split_input[2] + // name;price + if(length(split_input) >= 2) + var/name = trim(split_input[1]) + var/price_text = trim(split_input[2]) - var/price = text2num(price_text) + if(!length(name)) + continue - // In case of invalid prices for some reason - if(price == 0 && price_text != "0" && price_text != "0.0") - continue + var/price = text2num(price_text) - result += list(list("name" = name, "price" = price)) + // Reject null prices + if(isnull(price)) + continue + + // Reject invalid prices + if(price == 0 && price_text != "0" && price_text != "0.0" && price_text != "0.00" && price != null) + continue + + result += list(list( + "name" = name, + "price" = price, + "category" = "Uncategorized" + )) return result + // Prints the prices from a register/quikpay into a list that can be used for read_paper_price_list() /proc/print_price_to_paper(var/shop_name, var/list/items, var/paper_loc, mob/user) if(!items || !items.len) @@ -47,12 +85,17 @@ var/obj/item/paper/notepad/receipt/R = new(paper_loc) var/title = "Price List: [shop_name]" - var/text = "name;price
" + var/text = "category;name;price
" for(var/list/L in items) - var/item_name = L["name"] + var/item_category = sanitize_tg(L["category"]) + var/item_name = sanitize_tg(L["name"]) var/item_price = L["price"] - text += "[item_name];[round(item_price, 0.01)]
" + + if(!length(item_category)) + item_category = "Uncategorized" + + text += "[item_category];[item_name];[round(item_price, 0.01)]
" R.set_content(title, text) diff --git a/code/datums/components/commissaryShop.dm b/code/datums/components/commissaryShop.dm new file mode 100644 index 00000000000..6227cdcea27 --- /dev/null +++ b/code/datums/components/commissaryShop.dm @@ -0,0 +1,434 @@ +/datum/component/quikpay_shop + /// The id associated with the quikpay system. Automatically assigned. + var/machine_id = "" + /// The Items for sale, containing name and price + var/list/items = list() + /// The items in the purchase basket, containing name, price and amount + var/list/buying = list() + /// The input field for new item names + var/new_item = "" + /// The input field for new item prices + var/new_price = 0 + /// The input field for new item categories + var/new_category = "" + /// The transaction total for a purchase, 0 when there is no transaction ongoing + var/sum = 0 + /// If the shop can be changed or not, to add new items or change destination account + var/editmode = FALSE + /// Receipt printing info + var/receipt = "" + /// The account to receive funds from card transactions + var/destinationact = "Operations" + /// The credits within the shop object + var/credit = 100 + /// The name used for the shop + var/shop_name = "Commissary" + /// The owner object, also known as parent. Defined to easily do obj specific procs + var/obj/owner + /// If it is possible to pay with physical credits or only card + var/can_use_credits = TRUE + /// The the longer version of the shop name + var/shop_long_name = "Idris Quik-Pay Register" + /// The access types that can configure the shop + var/req_one_access = list(ACCESS_BAR, ACCESS_GALLEY, ACCESS_CARGO) + +/datum/component/quikpay_shop/quikpay + shop_name = "Quik-Pay" + destinationact = "Service" + shop_long_name = "Quik-Pay device" + can_use_credits = FALSE + +/// Add an item by clicking on it with the quikpay +/datum/component/quikpay_shop/quikpay/proc/add_item(atom/target, mob/user) + if(!isobj(target)) + return + if (!editmode) + to_chat(user, SPAN_NOTICE("Unlock \the [owner] to add items.")) + return + + var/obj/O = target + var/name_guess = O.name + var/price_guess = 0 + var/category_guess = "" + + price_guess = text2num(tgui_input_text(user, "Set price for [name_guess]:", "[shop_long_name]", 0, 10)) + if(isnull(price_guess) || price_guess == 0) + return + price_guess = max(0.01, round(price_guess, 0.01)) + + category_guess = tgui_input_text(user, "Set category for [name_guess]:", "[shop_long_name]", "Uncategorized", 32) + if(isnull(category_guess) || !length(category_guess)) + category_guess = "Uncategorized" + + items += list(list( + "name" = "[name_guess]", + "price" = price_guess, + "category" = "[category_guess]" + )) + + to_chat(user, SPAN_NOTICE("[owner]: added '[name_guess]' for [price_guess] in category '[category_guess]'.")) + return TRUE + + +/datum/component/quikpay_shop/Initialize(access = list(ACCESS_BAR, ACCESS_GALLEY, ACCESS_CARGO), destination = "Operations") + . = ..() + machine_id = "[station_name()] [shop_long_name] #[SSeconomy.num_financial_terminals++]" + if(!isobj(parent)) + return + req_one_access = access + destinationact = destination + owner = parent + +/// Put credits in or take them out, assuming the device has credits +/datum/component/quikpay_shop/proc/take_give_credits(mob/user) + if(!can_use_credits) + return + var/item = user.get_active_hand() + + if(istype(item, /obj/item/spacecash) && !istype(item, /obj/item/spacecash/ewallet)) + var/obj/item/spacecash/cashmoney = item + credit += cashmoney.worth + user.drop_from_inventory(cashmoney,get_turf(owner)) + user.visible_message("\The [user] inserts some credits into \the [owner]." ) + qdel(cashmoney) + return + + var/obj/item/card/id/I = user.GetIdCard() + if(istype(I) && has_access(req_one_access = src.req_one_access, accesses = I.access)) + var/price_guess = text2num(tgui_input_text(user, "How much do you wish to withdraw? Remaining credits: [credit]电", "Quik-Pay", 0, 10)) + if(isnull(price_guess) || price_guess == 0) + return + price_guess = max(0, round(price_guess, 0.01)) + if(credit >= price_guess) + spawn_money(price_guess, owner.loc, user) + credit = max(0, credit - price_guess) + user.visible_message("\The [user] remove some credits from \the [owner].", "You hear a drawer being opened and the clinking of coins, followed by a drawer being closed." ) + +/// Print out a relevant receipt +/datum/component/quikpay_shop/proc/print_receipt() + var/obj/item/paper/notepad/receipt/R = new(owner.loc) + var/receiptname = "Receipt: [machine_id]" + R.set_content_unsafe(receiptname, receipt, sum) + stamp_receipt(R) + usr.put_in_any_hand_if_possible(R) + +/// Interact with an object. Papers or payment pethods +/datum/component/quikpay_shop/proc/interact_object(obj/item/attacking_item, mob/user) + if(istype(attacking_item, /obj/item/paper)) + read_paper_list(attacking_item, user) + return + if(sum == 0) + return + if (istype(attacking_item, /obj/item/spacecash/ewallet)) + card_pay(attacking_item, user) + return + else if (istype(attacking_item, /obj/item/card/id)) + ID_pay(attacking_item, user) + return + else if(istype(attacking_item, /obj/item/spacecash) && can_use_credits) + cash_pay(attacking_item, user) + return + +/// Paying with cash +/datum/component/quikpay_shop/proc/cash_pay(obj/item/spacecash/cashmoney, mob/user) + if(!can_use_credits) + return + var/transaction_amount = sum + if(transaction_amount > cashmoney.worth) + to_chat(user, SPAN_WARNING("[icon2html(cashmoney, user)] That is not enough money.")) + return FALSE + if(istype(cashmoney, /obj/item/spacecash/bundle)) + user.visible_message(SPAN_INFO("\The [user] inserts some cash into \the [owner].")) + var/obj/item/spacecash/bundle/cashmoney_bundle = cashmoney + cashmoney_bundle.worth -= transaction_amount + + if(cashmoney_bundle.worth <= 0) + usr.drop_from_inventory(cashmoney_bundle,get_turf(owner)) + qdel(cashmoney_bundle) + else + cashmoney_bundle.update_icon() + else + user.visible_message(SPAN_INFO("\The [user] inserts a bill into \the [owner].")) + var/left = cashmoney.worth - transaction_amount + user.drop_from_inventory(cashmoney,get_turf(owner)) + qdel(cashmoney) + + if(left) + spawn_money(left, get_turf(user), user) + credit += transaction_amount + print_receipt() + clear_order() + +/// Paying with an id card +/datum/component/quikpay_shop/proc/ID_pay(obj/item/attacking_item, mob/user) + var/obj/item/card/id/I = attacking_item.GetID() + var/transaction_amount = sum + var/transaction_purpose = "[destinationact] Payment" + var/transaction_terminal = machine_id + + var/transaction = SSeconomy.transfer_money(I.associated_account_number, SSeconomy.get_department_account(destinationact)?.account_number,transaction_purpose,transaction_terminal,transaction_amount,null,usr) + + if(transaction) + to_chat(user, SPAN_NOTICE("[icon2html(owner, user)][transaction].")) + else + end_transaction(user) + +/// Paying with a charge card +/datum/component/quikpay_shop/proc/card_pay(obj/item/attacking_item, mob/user) + var/obj/item/spacecash/ewallet/E = attacking_item + var/transaction_amount = sum + var/transaction_purpose = "[destinationact] Payment" + var/transaction_terminal = machine_id + + if(transaction_amount <= E.worth) + SSeconomy.charge_to_account(SSeconomy.get_department_account(destinationact)?.account_number, E.owner_name, transaction_purpose, transaction_terminal, transaction_amount) + E.worth -= transaction_amount + + end_transaction(user) + else if (transaction_amount > E.worth) + to_chat(user, SPAN_WARNING("[icon2html(owner, user)]\The [E] doesn't have that much money!")) + +/// Read a paper to get data +/datum/component/quikpay_shop/proc/read_paper_list(obj/item/paper/R, mob/user) + if(!editmode) + owner.balloon_alert(user, "device locked!") + return FALSE + + var/result = read_paper_price_list(R) + for(var/item in result) + items += list(list( + "name" = item["name"], + "price" = item["price"], + "category" = item["category"] || "Uncategorized" + )) + owner.balloon_alert(user, "device set!") + return TRUE + +/// Handles receipt creation +/datum/component/quikpay_shop/proc/buying_receipt(mob/user) + receipt = "" + sum = 0 + var/obj/item/card/id/id_card = user.GetIdCard() + var/cashier = id_card ? id_card.registered_name : "Unknown" + receipt = "

[shop_name] receipt

Today's date: [worlddate2text()]
Cashier: [cashier]

Purchased items:
Total: [sum]电
" + +/datum/component/quikpay_shop/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "QuikPay", "[shop_long_name]", 550, 550) + ui.open() + +/datum/component/quikpay_shop/ui_data(mob/user) + var/list/data = list() + + data["items"] = items + data["buying"] = buying + data["sum"] = sum + data["new_item"] = new_item + data["new_price"] = new_price + data["new_category"] = new_category + data["editmode"] = editmode + data["destinationact"] = destinationact + + return data + +/datum/component/quikpay_shop/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + switch(action) + if("add") + if(!editmode) + owner.balloon_alert(usr, "device locked!") + return FALSE + + if(!length(new_item)) + return FALSE + + if(!length(new_category)) + new_category = "Uncategorized" + + for(var/list/L in items) + if(L["name"] == new_item) + return FALSE + + items += list(list( + "name" = new_item, + "price" = new_price, + "category" = new_category + )) + + new_item = "" + . = TRUE + + if("remove") + if(!editmode) + owner.balloon_alert(usr, "device locked!") + return FALSE + var/index = 0 + for(var/list/L in items) + index++ + if(L["name"] == params["removing"]) + items.Cut(index, index+1) + break + . = TRUE + + if("set_new_price") + new_price = params["set_new_price"] + . = TRUE + + if("set_new_item") + new_item = params["set_new_item"] + . = TRUE + + if("set_new_category") + new_category = params["set_new_category"] + . = TRUE + + if("clear") + clear_order() + . = TRUE + + if("buy") + for(var/list/L in buying) + if(L["name"] == params["buying"]) + L["amount"]++ + return TRUE + buying += list(list("name" = sanitize_tg(params["buying"]), "amount" = params["amount"], "price" = params["price"])) + + if("removal") + var/index = 0 + for(var/list/L in buying) + index++ + if(L["name"] == params["removal"]) + if(L["amount"] > 1) + L["amount"]-- + else + buying.Cut(index, index+1) + break + . = TRUE + + if("confirm") + buying_receipt(usr) + playsound(owner, 'sound/machines/ping.ogg', 25, TRUE) + owner.audible_message(SPAN_NOTICE("[icon2html(owner, viewers(get_turf(owner)))] \The [owner] pings.")) + . = TRUE + + if("locking") + if(editmode) + editmode = FALSE + owner.balloon_alert(usr, "device locked!") + else + if(!editmode) + var/obj/item/card/id/I = usr.GetIdCard() + if(!istype(I)) + return + if(!has_access(req_one_access = src.req_one_access, accesses = I.access)) + owner.balloon_alert(usr, "no access!") + return + editmode = !editmode + owner.balloon_alert(usr, "device [editmode ? "un" : ""]locked") + . = TRUE + + if("accountselect") + if(!editmode) + owner.balloon_alert(usr, "device locked!") + return FALSE + + var/dest = tgui_input_list(usr, "What account would you like to select?", "Destination Account", assoc_to_keys(SSeconomy.department_accounts)) + if(!dest) + return FALSE + destinationact = dest + . = TRUE + + if("print_dsv") + if(!editmode) + owner.balloon_alert(usr, "device locked!") + return FALSE + print_price_to_paper(shop_name, items, owner.loc, usr) + . = TRUE + +/// Clear the order from the selection +/datum/component/quikpay_shop/proc/clear_order() + buying.Cut() + sum = 0 + receipt = "" + +/// Ends the transaction by using a card, giving a message +/datum/component/quikpay_shop/proc/end_transaction(mob/user) + user.visible_message("\The [user] swipes a card on \the [owner]." ) + owner.audible_message(SPAN_NOTICE("[icon2html(owner, viewers(get_turf(owner)))] \The [owner] chimes.")) + playsound(owner, 'sound/machines/chime.ogg', 50, TRUE) + print_receipt() + to_chat(user, SPAN_NOTICE("Transaction completed, please return to the home screen.")) + clear_order() + +/datum/component/quikpay_shop/orderterminal + shop_name = "Commissary" + shop_long_name = "Self-serve Shop Teller" + can_use_credits = FALSE + +/datum/component/quikpay_shop/orderterminal/food + var/ticket = "" + var/ticket_number = 1 + shop_name = "Service terminal" + shop_long_name = "Idris Food Terminal" + +/datum/component/quikpay_shop/orderterminal/food/buying_receipt(mob/user) + ticket = "" + receipt = "" + sum = 0 + receipt += "
[shop_long_name] Receipt

" + ticket += "
[shop_long_name] Ticket

" + for(var/list/bought_item in buying) + var/item_name = bought_item["name"] + var/item_amount = bought_item["amount"] + var/item_price = bought_item["price"] + sum += item_price * item_amount + + receipt += "
  • [item_name]: [item_amount] x [item_price]电: [item_amount * item_price]电
    " + ticket += "
  • [item_name]: [item_amount] x [item_price]电: [item_amount * item_price]电
    " + receipt += "
    Total: [sum]电" + ticket += "
    Total: [sum]电" + sum = sum + +/// Print the receipt followed by the order ticket +/datum/component/quikpay_shop/orderterminal/food/print_receipt() + var/obj/item/card/id/id_card + if(ishuman(usr)) + id_card = usr.GetIdCard() + ticket += "
    Customer: [id_card ? id_card.registered_name : "Unknown"]" + receipt += "
    Customer: [id_card ? id_card.registered_name : "Unknown"]" + var/obj/item/paper/notepad/receipt/R = new(owner.loc) + var/receiptname = "Receipt: [machine_id]" + R.set_content_unsafe(receiptname, receipt, sum) + stamp_receipt(R) + usr.put_in_any_hand_if_possible(R) + // And now we do it but for the ticket. + var/obj/item/paper/notepad/receipt/T = new(owner.loc) + var/tickettname = "Order ticket: [ticket_number]" + ticket_number++ + T.set_content_unsafe(tickettname, ticket, sum) + stamp_receipt(T) + usr.put_in_any_hand_if_possible(T) + ticket = "" + receipt = "" + +/datum/component/quikpay_shop/proc/stamp_receipt(obj/item/paper/R) // Stamps the papers, made into a proc to avoid copy pasting too much + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + stampoverlay.icon_state = "paper_stamp-hop" + if(!R.stamped) + R.stamped = new + R.stamped += /obj/item/stamp + R.AddOverlays(stampoverlay) + R.stamps += "
    This paper has been stamped by \the [owner]." + R.ripped = TRUE diff --git a/code/modules/cooking/machinery/commissary.dm b/code/modules/cooking/machinery/commissary.dm index dba823d2beb..bb89d7ca255 100644 --- a/code/modules/cooking/machinery/commissary.dm +++ b/code/modules/cooking/machinery/commissary.dm @@ -41,6 +41,7 @@ display_tiers = 5 display_tier_amt = 3 has_emissive = FALSE + visible_takeout = TRUE /obj/machinery/smartfridge/tradeshelf/clothing name = "clothing shelf" @@ -87,6 +88,17 @@ display_tier_amt = 5 has_emissive = TRUE +/obj/machinery/smartfridge/tradeshelf/food/attackby(obj/item/attacking_item, mob/user) + if(attacking_item.tool_behaviour == TOOL_PEN) + name_fridge(user) + return + . = ..() + +/obj/machinery/smartfridge/tradeshelf/food/proc/name_fridge(mob/user) + var/newname = tgui_input_text(user, "What would you like to rename the fridge? Note that fridge will be appended to the end of it", "Fridge name") + if(newname) + name = newname + " fridge" + /obj/machinery/smartfridge/tradeshelf/toy name = "toy shelf" desc = "A commercialized shelf for toys and associated items." @@ -139,308 +151,119 @@ // ------------------------------------------------- /obj/structure/cash_register/commissary - var/machine_id = "" - var/list/items = list() - var/list/items_to_price = list() - var/list/buying = list() - var/new_item = "" - var/new_price = 0 - var/sum = 0 - var/editmode = FALSE - var/receipt = "" - var/destinationact = "Operations" - var/credit = 100 - var/shop_name = "Commissary" storage_type = null + req_one_access = list(ACCESS_BAR, ACCESS_GALLEY, ACCESS_CARGO) + var/destination = "Operations" /obj/structure/cash_register/commissary/mechanics_hints(mob/user, distance, is_adjacent) . = list() - . += "Alt click with a command id in hand, to gain command access." - . += "Alt click with credits in hand, to deposit them." - . += "Alt click while having operations access, to withdraw credits from it." + . += "Alt-click with credits in hand, to deposit them." + . += "Alt-click while having the proper access, to withdraw credits from it." . += "Items can be paid for with id cards, charge cards or physical credits, and a receipt will be printed." . += "The register can print a paper which can be used to quickly fill it out in the future by using it on the register." /obj/structure/cash_register/commissary/Initialize() . = ..() - machine_id = "[station_name()] Idris Quik-Pay Register #[SSeconomy.num_financial_terminals++]" + src.LoadComponent(/datum/component/quikpay_shop, req_one_access, destination) /obj/structure/cash_register/commissary/AltClick(var/mob/user) - var/item = user.get_active_hand() - var/obj/item/card/id/I = item - if(istype(I) && (ACCESS_HEADS in I.access)) - if(ACCESS_HEADS in I.access) - editmode = TRUE - to_chat(user, SPAN_NOTICE("Command access granted.")) - SStgui.update_uis(src) + . = ..() + var/datum/component/quikpay_shop/qp_shop = src.GetComponent(/datum/component/quikpay_shop) + if(!qp_shop) return - if(istype(item, /obj/item/spacecash) && !istype(item, /obj/item/spacecash/ewallet)) - var/obj/item/spacecash/cashmoney = item - credit += cashmoney.worth - user.drop_from_inventory(cashmoney,get_turf(src)) - visible_message("\The [user] inserts some credits into \the [src]." ) - qdel(cashmoney) - return - I = user.GetIdCard() - if(istype(I) && (ACCESS_CARGO in I.access)) - var/price_guess = text2num(sanitizeSafe( tgui_input_text(user, "How much do you wish to withdraw? Remaining credits: [credit]电", "QuikPay", 0, 10), 10)) - if(isnull(price_guess) || price_guess == 0) - return - price_guess = max(0, round(price_guess, 0.01)) - if(credit >= price_guess) - spawn_money(price_guess, loc, user) - credit -= price_guess - visible_message("\The [user] remove some credits from \the [src]." ) - return - -/obj/structure/cash_register/commissary/proc/print_receipt() - var/obj/item/paper/notepad/receipt/R = new(loc) - var/receiptname = "Receipt: [machine_id]" - R.set_content_unsafe(receiptname, receipt, sum) - - //stamp the paper - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - stampoverlay.icon_state = "paper_stamp-hop" - if(!R.stamped) - R.stamped = new - R.stamped += /obj/item/stamp - R.AddOverlays(stampoverlay) - R.stamps += "
    This paper has been stamped by the Idris Quik-Pay Register." - usr.put_in_any_hand_if_possible(R) - R.ripped = TRUE + qp_shop.take_give_credits(user, loc) /obj/structure/cash_register/commissary/attackby(obj/item/attacking_item, mob/user) - if(istype(attacking_item, /obj/item/paper)) - read_paper_list(attacking_item, user) + . = ..() + var/datum/component/quikpay_shop/qp_shop = src.GetComponent(/datum/component/quikpay_shop) + if(!qp_shop) return - if(sum == 0) - return - if (istype(attacking_item, /obj/item/spacecash/ewallet)) - card_pay(attacking_item, user) - return - else if (istype(attacking_item, /obj/item/card/id)) - ID_pay(attacking_item, user) - return - else if(istype(attacking_item, /obj/item/spacecash)) - cash_pay(attacking_item, user) - return - -/obj/structure/cash_register/commissary/proc/cash_pay(obj/item/spacecash/cashmoney, mob/user) - var/transaction_amount = sum - if(transaction_amount > cashmoney.worth) - to_chat(user, SPAN_WARNING("[icon2html(cashmoney, user)] That is not enough money.")) - return 0 - if(istype(cashmoney, /obj/item/spacecash/bundle)) - visible_message(SPAN_INFO("\The [user] inserts some cash into \the [src].")) - var/obj/item/spacecash/bundle/cashmoney_bundle = cashmoney - cashmoney_bundle.worth -= transaction_amount - - if(cashmoney_bundle.worth <= 0) - usr.drop_from_inventory(cashmoney_bundle,get_turf(src)) - qdel(cashmoney_bundle) - else - cashmoney_bundle.update_icon() - else - visible_message(SPAN_INFO("\The [user] inserts a bill into \the [src].")) - var/left = cashmoney.worth - transaction_amount - user.drop_from_inventory(cashmoney,get_turf(src)) - qdel(cashmoney) - - if(left) - spawn_money(left, get_turf(user), user) - credit += transaction_amount - print_receipt() - clear_order() - return 1 - -/obj/structure/cash_register/commissary/proc/ID_pay(obj/item/attacking_item, mob/user) - var/obj/item/card/id/I = attacking_item.GetID() - var/transaction_amount = sum - var/transaction_purpose = "[destinationact] Payment" - var/transaction_terminal = machine_id - - var/transaction = SSeconomy.transfer_money(I.associated_account_number, SSeconomy.get_department_account(destinationact)?.account_number,transaction_purpose,transaction_terminal,transaction_amount,null,usr) - - if(transaction) - to_chat(user, SPAN_NOTICE("[icon2html(src, user)][transaction].")) - else - visible_message("\The [user] swipes a card on \the [src]." ) - audible_message(SPAN_NOTICE("[icon2html(src, viewers(get_turf(src)))] \The [src] chimes.")) - playsound(src, 'sound/machines/chime.ogg', 50, 1) - print_receipt() - sum = 0 - receipt = "" - to_chat(user, SPAN_NOTICE("Transaction completed, please return to the home screen.")) - clear_order() - -/obj/structure/cash_register/commissary/proc/card_pay(obj/item/attacking_item, mob/user) - var/obj/item/spacecash/ewallet/E = attacking_item - var/transaction_amount = sum - var/transaction_purpose = "[destinationact] Payment" - var/transaction_terminal = machine_id - - if(transaction_amount <= E.worth) - SSeconomy.charge_to_account(SSeconomy.get_department_account(destinationact)?.account_number, E.owner_name, transaction_purpose, transaction_terminal, transaction_amount) - E.worth -= transaction_amount - - visible_message("\The [user] swipes a card on \the [src]." ) - audible_message(SPAN_NOTICE("[icon2html(src, viewers(get_turf(src)))] \The [src] chimes.")) - playsound(src, 'sound/machines/chime.ogg', 50, 1) - print_receipt() - sum = 0 - receipt = "" - to_chat(user, SPAN_NOTICE("Transaction completed, please return to the home screen.")) - clear_order() - else if (transaction_amount > E.worth) - to_chat(user, SPAN_WARNING("[icon2html(src, user)]\The [E] doesn't have that much money!")) - return - -/obj/structure/cash_register/commissary/proc/read_paper_list(obj/item/paper/R, mob/user) - if(!editmode) - balloon_alert(user, "device locked!") - return FALSE - var/result = read_paper_price_list(R) - for(var/item in result) - items += list(list("name" = item["name"], "price" = item["price"])) - items_to_price[item["name"]] += item["price"] - -/obj/structure/cash_register/commissary/proc/print_price(mob/user) - return print_price_to_paper(shop_name, items, loc, user) + qp_shop.interact_object(attacking_item, user) /obj/structure/cash_register/commissary/attack_hand(mob/living/user) . = ..() - ui_interact(user) - -/obj/structure/cash_register/commissary/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "QuikPay", "Idris Quik-Pay Register", 550, 550) - ui.open() - -/obj/structure/cash_register/commissary/ui_data(var/mob/user) - var/list/data = list() - - data["items"] = items - data["buying"] = buying - data["sum"] = sum - data["new_item"] = new_item - data["new_price"] = new_price - data["editmode"] = editmode - data["destinationact"] = destinationact - - return data - -/obj/structure/cash_register/commissary/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) + var/datum/component/quikpay_shop/qp_shop = src.GetComponent(/datum/component/quikpay_shop) + if(!qp_shop) return - switch(action) - if("add") - if(!editmode) - balloon_alert(usr, "device locked!") - return FALSE + qp_shop.ui_interact(user) - items += list(list("name" = new_item, "price" = new_price)) - items_to_price[new_item] = new_price - . = TRUE +/obj/machinery/commissary_wall_shop + name = "self-serve shop teller" + desc = "An ordering terminal designed by Idris for quicker expedition." + icon = 'icons/obj/machinery/wall/terminals.dmi' + icon_state = "orderterminal" + idle_power_usage = 10 + anchored = TRUE + var/turned_on = FALSE + req_one_access = list(ACCESS_BAR, ACCESS_GALLEY, ACCESS_CARGO) + var/destination = "Operations" - if("remove") - if(!editmode) - balloon_alert(usr, "device locked!") - return FALSE - var/index = 0 - for(var/list/L in items) - index++ - if(L["name"] == params["removing"]) - items.Cut(index, index+1) - . = TRUE +/obj/machinery/commissary_wall_shop/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Items can be paid for with id cards or charge cards, and a receipt will be printed." + . += "The terminal can print a paper which can be used to quickly fill it out in the future by using it on the register." + . += "With the proper access, ctrl-click to turn the machine on and off." - if("set_new_price") - new_price = params["set_new_price"] - . = TRUE +/obj/machinery/commissary_wall_shop/Initialize() + . = ..() + src.LoadComponent(/datum/component/quikpay_shop/orderterminal, req_one_access, destination) + update_icon() - if("set_new_item") - new_item = params["set_new_item"] - . = TRUE +/obj/machinery/commissary_wall_shop/attackby(obj/item/attacking_item, mob/user) + if(!turned_on) + balloon_alert(user, "turned off") + return + if(stat & NOPOWER) + balloon_alert(user, "no power") + return + var/datum/component/quikpay_shop/orderterminal/qp_shop = src.GetComponent(/datum/component/quikpay_shop/orderterminal) + if(!qp_shop) + return + qp_shop.interact_object(attacking_item, user) - if("clear") - clear_order() - . = TRUE +/obj/machinery/commissary_wall_shop/attack_hand(mob/living/user) + if(!turned_on) + balloon_alert(user, "turned off") + return + if(stat & NOPOWER) + balloon_alert(user, "no power") + return + var/datum/component/quikpay_shop/orderterminal/qp_shop = src.GetComponent(/datum/component/quikpay_shop/orderterminal) + if(!qp_shop) + return + qp_shop.ui_interact(user) - if("buy") - for(var/list/L in buying) - if(L["name"] == params["buying"]) - L["amount"]++ - return TRUE - buying += list(list("name" = params["buying"], "amount" = params["amount"], "price" = items_to_price[params["buying"]])) +/obj/machinery/commissary_wall_shop/CtrlClick(mob/user) + var/obj/item/card/id/I = user.GetIdCard() + if(!istype(I)) + balloon_alert(user, "no id!") + return + if(!has_access(req_one_access = src.req_one_access, accesses = I.access)) + balloon_alert(user, "no access!") + return + turned_on = !turned_on + balloon_alert(user, "turned [turned_on ? "on" : "off"]") + update_icon() - if("removal") - var/index = 0 - for(var/list/L in buying) - index++ - if(L["name"] == params["removal"]) - if(L["amount"] > 1) - L["amount"]-- - else - buying.Cut(index, index+1) - . = TRUE +/obj/machinery/commissary_wall_shop/power_change() + ..() + update_icon() - if("confirm") - // Ensuring it is clear, in case the button is clicked multiple times - receipt = "" - sum = 0 - var/obj/item/card/id/id_card = usr.GetIdCard() - var/cashier = id_card? id_card.registered_name : "Unknown" - receipt = "

    [shop_name] receipt

    Today's date: [worlddate2text()]
    Cashier: [cashier]

    Purchased items:
    Total: [sum]电
    " - playsound(src, 'sound/machines/ping.ogg', 25, 1) - audible_message(SPAN_NOTICE("[icon2html(src, viewers(get_turf(src)))] \The [src] pings.")) - . = TRUE - - if("locking") - if(editmode) - editmode = FALSE - balloon_alert(usr, "device locked!") - else - if(!editmode) - var/obj/item/card/id/I = usr.GetIdCard() - if(!istype(I)) - return - if(check_access(I)) - editmode = !editmode - balloon_alert(usr, "device [editmode ? "un" : ""]locked") - . = TRUE - - if("accountselect") - if(!editmode) - balloon_alert(usr, "device locked!") - return FALSE - - var/dest = tgui_input_list(usr, "What account would you like to select?", "Destination Account", assoc_to_keys(SSeconomy.department_accounts)) - if(!dest) - return FALSE - destinationact = dest - . = TRUE - - if("print_dsv") - if(!editmode) - balloon_alert(usr, "device locked!") - return FALSE - print_price(usr) - . = TRUE - -/obj/structure/cash_register/commissary/proc/clear_order() - buying.Cut() - sum = 0 - receipt = "" +/obj/machinery/commissary_wall_shop/process() + if(stat & NOPOWER || !turned_on) + ClearOverlays() + set_light(FALSE) + return /obj/item/commissary_restrock name = "commissary cigarette restock pack" @@ -701,6 +524,17 @@ desc = "A crate packed with boxes of various goods. Handle with care!" /obj/structure/closet/crate/commissary/fill() + for(var/i = 1 to 8) + new /obj/item/storage/box/unique/papersack(src) + new /obj/item/storage/bag/plasticbag(src) + new /obj/item/storage/box/plasticbag(src) + new /obj/item/tape_roll(src) + new /obj/item/hand_labeler(src) + new /obj/item/storage/toolbox/mechanical(src) + +/obj/structure/closet/crate/commissary/resupply + +/obj/structure/closet/crate/commissary/resupply/fill() new /obj/item/commissary_restrock(src) new /obj/item/commissary_restrock/rollable(src) new /obj/item/commissary_restrock/chewable(src) diff --git a/code/modules/cooking/machinery/smartfridge.dm b/code/modules/cooking/machinery/smartfridge.dm index 31957f5890e..19447520bc9 100644 --- a/code/modules/cooking/machinery/smartfridge.dm +++ b/code/modules/cooking/machinery/smartfridge.dm @@ -20,6 +20,7 @@ var/scan_id = 1 var/is_secure = 0 var/machineselect = 0 + var/visible_takeout = FALSE var/list/accepted_items = list(/obj/item/reagent_containers/food/snacks/grown, /obj/item/seeds, /obj/item/mollusc) /// List of items that the machine starts with upon spawn @@ -536,15 +537,20 @@ var/i = amount for(var/obj/O in contents) - if(O.name == K) - if(Adjacent(user)) - user.put_in_hands(O) - else - O.forceMove(loc) - i-- - update_overlays() - if(i <= 0) - break + if(O.name != K) + continue + if(Adjacent(user)) + user.put_in_hands(O) + if(visible_takeout) + user.visible_message( + "[SPAN_BOLD("[user]")] takes \a [O] from \the [src].", + SPAN_NOTICE("You take \a [O] from \the [src].")) + else + O.forceMove(loc) + i-- + update_overlays() + if(i <= 0) + break if(item_quants[K] <= 0) update_static_data_for_all_viewers() diff --git a/code/modules/economy/OrderTerminal.dm b/code/modules/economy/OrderTerminal.dm index 9df4983d1a6..d5b1dd8779d 100644 --- a/code/modules/economy/OrderTerminal.dm +++ b/code/modules/economy/OrderTerminal.dm @@ -21,16 +21,16 @@ var/ticket = "" var/destinationact = "Service" var/ticket_number = 1 - req_one_access = list(ACCESS_BAR, ACCESS_GALLEY) // Access to change the menu + req_one_access = list(ACCESS_BAR, ACCESS_GALLEY, ACCESS_CARGO) // Access to change the menu /obj/machinery/orderterminal/mechanics_hints(mob/user, distance, is_adjacent) . += ..() - . += "To edit the menu, select 'Toggle Lock' while wearing an ID with galley access." - . += "All credits from the machine will automatically go to the civilian account." + . += "Items can be paid for with id cards or charge cards, and a receipt will be printed." + . += "The terminal can print a paper which can be used to quickly fill it out in the future by using it on the register." /obj/machinery/orderterminal/Initialize() . = ..() - machine_id = "Idris Ordering Terminal #[SSeconomy.num_financial_terminals++]" + src.LoadComponent(/datum/component/quikpay_shop/orderterminal/food, req_one_access, destinationact) update_icon() /obj/machinery/orderterminal/power_change() @@ -54,152 +54,19 @@ return /obj/machinery/orderterminal/attack_hand(var/mob/user) - ui_interact(user) - -/obj/machinery/orderterminal/ui_interact(mob/user, var/datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "OrderTerminal", "Idris Ordering Terminal", 450, 450) - ui.open() - -/obj/machinery/orderterminal/proc/print_receipt() // Print the receipt followed by the order ticket - var/obj/item/paper/notepad/receipt/R = new(usr.loc) - var/receiptname = "Receipt: [machine_id]" - R.set_content_unsafe(receiptname, receipt, sum) - stamp_receipt(R) - // And now we do it but for the ticket. - var/obj/item/paper/notepad/receipt/T = new(usr.loc) - var/tickettname = "Order ticket: [ticket_number]" - ticket_number++ - T.set_content_unsafe(tickettname, ticket, sum) - stamp_receipt(T) - -/obj/machinery/orderterminal/proc/stamp_receipt(obj/item/paper/R) // Stamps the papers, made into a proc to avoid copy pasting too much - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - stampoverlay.icon_state = "paper_stamp-hop" - if(!R.stamped) - R.stamped = new - R.stamped += /obj/item/stamp - R.AddOverlays(stampoverlay) - R.stamps += "
    This paper has been stamped by the Idris Ordering Terminal." - R.ripped = TRUE + if(stat & NOPOWER) + balloon_alert(user, "no power") + return + var/datum/component/quikpay_shop/orderterminal/food/qp_shop = src.GetComponent(/datum/component/quikpay_shop/orderterminal/food) + if(!qp_shop) + return + qp_shop.ui_interact(user) /obj/machinery/orderterminal/attackby(obj/item/attacking_item, mob/user) - var/obj/item/card/id/I = attacking_item.GetID() - if (!I) + if(stat & NOPOWER) + balloon_alert(user, "no power") return - if (!istype(attacking_item)) + var/datum/component/quikpay_shop/orderterminal/food/qp_shop = src.GetComponent(/datum/component/quikpay_shop/orderterminal/food) + if(!qp_shop) return - - else if (confirmorder) - var/transaction_amount = sum - var/transaction_purpose = "Idris Ordering Terminal order." - var/transaction_terminal = machine_id - if(sum > 0) // it will just get denied if the order is 0 credits. We still need the id regardless for the name - var/transaction = SSeconomy.transfer_money(I.associated_account_number, SSeconomy.get_department_account(destinationact)?.account_number,transaction_purpose,transaction_terminal,transaction_amount,null,usr) - if(transaction) - to_chat(user,"[icon2html(src, user)][transaction].") - else - playsound(src, 'sound/machines/chime.ogg', 50, 1) - src.visible_message("[icon2html(src, viewers(get_turf(src)))] \The [src] chimes.") - ticket += "
    Customer: [I.registered_name]" - receipt += "
    Customer: [I.registered_name]" - print_receipt() - clear_order() - -/obj/machinery/orderterminal/ui_data(mob/user) - var/list/data = list() - - data["items"] = items - data["buying"] = buying - data["sum"] = sum - data["new_item"] = new_item - data["new_price"] = new_price - data["editmode"] = editmode - data["destinationact"] = destinationact - - return data - -/obj/machinery/orderterminal/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - - switch(action) - if("add") - if(!editmode) - to_chat(usr, SPAN_NOTICE("You don't have access to use this option.")) - return FALSE - items += list(list("name" = new_item, "price" = new_price)) - items_to_price[new_item] = new_price - . = TRUE - - if("remove") - if(!editmode) - to_chat(usr, SPAN_NOTICE("You don't have access to use this option.")) - return FALSE - items -= params["remove"] - items_to_price -= params["remove"] - . = TRUE - - if("buy") - for(var/list/L in buying) - if(L["name"] == params["buying"]) - L["amount"]++ - return TRUE - buying += list(list("name" = params["buying"], "amount" = params["amount"])) - . = TRUE - - if("removal") - for(var/list/L in buying) - if(L["name"] == params["removal"]) - if(L["amount"] > 1) - L["amount"]-- - else - buying -= L - . = TRUE - - if("clear") - clear_order() - . = TRUE - - if("set_new_price") - new_price = params["set_new_price"] - . = TRUE - - if("set_new_item") - new_item = params["set_new_item"] - . = TRUE - - if("confirm") - confirmorder = TRUE - receipt += "
    Idris Food Terminal Receipt

    " - ticket += "
    Idris Food Terminal Ticket

    " - for(var/list/bought_item in buying) - var/item_name = bought_item["name"] - var/item_amount = bought_item["amount"] - var/item_price = items_to_price[item_name] - sum += item_price - - receipt += "[name]: [item_name] x[item_amount] at [item_price]电 each
    " - ticket += "[name]: [item_name] x[item_amount] at [item_price]电 each
    " - receipt += "
    Total: [sum]电" - ticket += "
    Total: [sum]电" - sum = sum - . = TRUE - - if("locking") - var/obj/item/card/id/I = usr.GetIdCard() - if(!istype(I)) - return - if(check_access(I)) - editmode = !editmode - to_chat(usr, SPAN_NOTICE("Device [editmode ? "un" : ""]locked.")) - . = TRUE - -/obj/machinery/orderterminal/proc/clear_order() - buying.Cut() - sum = 0 - receipt = "" - ticket = "" - confirmorder = FALSE + qp_shop.interact_object(attacking_item, user) diff --git a/code/modules/economy/quikpay.dm b/code/modules/economy/quikpay.dm index a3c3c01c667..3e29362b030 100644 --- a/code/modules/economy/quikpay.dm +++ b/code/modules/economy/quikpay.dm @@ -8,36 +8,31 @@ item_state = "electronic" w_class = WEIGHT_CLASS_SMALL slot_flags = SLOT_BELT - var/machine_id = "" - var/list/items = list() - var/list/items_to_price = list() - var/list/buying = list() - var/new_item = "" - var/new_price = 0 - var/sum = 0 - var/editmode = FALSE - var/receipt = "" var/destinationact = "Service" - var/shop_name = "Quikpay" + var/shop_name + req_one_access = list(ACCESS_BAR, ACCESS_GALLEY, ACCESS_CARGO) + +/obj/item/quikpay/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Items can be paid for with id cards or charge cards, and a receipt will be printed." + . += "The quikpay can print a paper which can be used to quickly fill it out in the future by using it on the register." /obj/item/quikpay/Initialize() . = ..() - machine_id = "[station_name()] Idris Quik-Pay #[SSeconomy.num_financial_terminals++]" + src.LoadComponent(/datum/component/quikpay_shop/quikpay, req_one_access, destinationact) //create a short manual as well var/obj/item/paper/R = new(src.loc) R.name = "Quik And Easy: How to make a transaction" R.info += "Quik-Pay setup:
    " - R.info += "
    1. Remember your access code included on the paper that is included with your device
    2. " R.info += "
    3. Unlock it to be able to add items to the menu
    4. " - R.info += "
    5. Add items to the menu by typing the item name and its price
    " + R.info += "
  • Add items to the menu by typing the item name and its price, optionally include a category
  • " R.info += "When starting a new transaction:
    " R.info += "
    1. Have the customer enter the amount of the item they want and then confirm the purchase.
    2. " R.info += "
    3. Allow them to review the sum.
    4. " R.info += "
    5. Have them swipe their card to pay for the items.
    " - //stamp the paper var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') stampoverlay.icon_state = "paper_stamp-cent" @@ -50,238 +45,24 @@ R.AddOverlays(stampoverlay) R.stamps += "
    This paper has been stamped by the Executive Officer's desk." -/obj/item/quikpay/AltClick(var/mob/user) - var/obj/item/card/id/I = user.GetIdCard() - if(istype(I) && (ACCESS_HEADS in I.access)) - editmode = TRUE - to_chat(user, SPAN_NOTICE("Command access granted.")) - SStgui.update_uis(src) - -/obj/item/quikpay/proc/print_receipt() - var/obj/item/paper/notepad/receipt/R = new(usr.loc) - var/receiptname = "Receipt: [machine_id]" - R.set_content_unsafe(receiptname, receipt, sum) - - //stamp the paper - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - stampoverlay.icon_state = "paper_stamp-hop" - if(!R.stamped) - R.stamped = new - R.stamped += /obj/item/stamp - R.AddOverlays(stampoverlay) - R.stamps += "
    This paper has been stamped by the Quik-Pay device." - R.ripped = TRUE - usr.put_in_any_hand_if_possible(R) - /obj/item/quikpay/attackby(obj/item/attacking_item, mob/user) - if(istype(attacking_item, /obj/item/paper)) - read_paper_list(attacking_item, user) + . = ..() + var/datum/component/quikpay_shop/quikpay/qp_shop = src.GetComponent(/datum/component/quikpay_shop/quikpay) + if(!qp_shop) return - if (istype(attacking_item, /obj/item/spacecash/ewallet)) - var/obj/item/spacecash/ewallet/E = attacking_item - var/transaction_amount = sum - var/transaction_purpose = "[destinationact] Payment" - var/transaction_terminal = machine_id - - if(transaction_amount <= E.worth) - audible_message(SPAN_NOTICE("[icon2html(src, viewers(get_turf(src)))] \The [src] chimes.")) - playsound(src, 'sound/machines/chime.ogg', 50, 1) - - SSeconomy.charge_to_account(SSeconomy.get_department_account(destinationact)?.account_number, E.owner_name, transaction_purpose, transaction_terminal, transaction_amount) - E.worth -= transaction_amount - print_receipt() - sum = 0 - receipt = "" - to_chat(user, SPAN_NOTICE("Transaction completed, please return to the home screen.")) - else if (transaction_amount > E.worth) - to_chat(user, SPAN_WARNING("[icon2html(src, user)]\The [E] doesn't have that much money!")) - return - - var/obj/item/card/id/I = attacking_item.GetID() - if (!istype(attacking_item)) - return - - var/transaction_amount = sum - var/transaction_purpose = "[destinationact] Payment" - var/transaction_terminal = machine_id - - var/transaction = SSeconomy.transfer_money(I.associated_account_number, SSeconomy.get_department_account(destinationact)?.account_number,transaction_purpose,transaction_terminal,transaction_amount,null,usr) - - if(transaction) - to_chat(user, SPAN_NOTICE("[icon2html(src, user)][transaction].")) - else - audible_message(SPAN_NOTICE("[icon2html(src, viewers(get_turf(src)))] \The [src] chimes.")) - playsound(src, 'sound/machines/chime.ogg', 50, 1) - print_receipt() - sum = 0 - receipt = "" - to_chat(user, SPAN_NOTICE("Transaction completed, please return to the home screen.")) - -/obj/item/quikpay/proc/read_paper_list(obj/item/paper/R, mob/user) - if(!editmode) - balloon_alert(user, "device locked!") - return FALSE - var/result = read_paper_price_list(R) - for(var/item in result) - items += list(list("name" = item["name"], "price" = item["price"])) - items_to_price[item["name"]] += item["price"] - -/obj/item/quikpay/proc/print_price(mob/user) - return print_price_to_paper(shop_name, items, loc, user) + qp_shop.interact_object(attacking_item, user) /obj/item/quikpay/attack_self(var/mob/user) - ui_interact(user) - -/obj/item/quikpay/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "QuikPay", "Idris Quik-Pay", 550, 550) - ui.open() - -/obj/item/quikpay/ui_data(var/mob/user) - var/list/data = list() - - data["items"] = items - data["buying"] = buying - data["sum"] = sum - data["new_item"] = new_item - data["new_price"] = new_price - data["editmode"] = editmode - data["destinationact"] = destinationact - - return data - -/obj/item/quikpay/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() - if(.) + var/datum/component/quikpay_shop/quikpay/qp_shop = src.GetComponent(/datum/component/quikpay_shop/quikpay) + if(!qp_shop) return - - switch(action) - if("add") - if(!editmode) - balloon_alert(usr, "device locked!") - return FALSE - - items += list(list("name" = new_item, "price" = new_price)) - items_to_price[new_item] = new_price - . = TRUE - - if("remove") - if(!editmode) - balloon_alert(usr, "device locked!") - return FALSE - var/index = 0 - for(var/list/L in items) - index++ - if(L["name"] == params["removing"]) - items.Cut(index, index+1) - . = TRUE - - if("set_new_price") - new_price = params["set_new_price"] - . = TRUE - - if("set_new_item") - new_item = params["set_new_item"] - . = TRUE - - if("clear") - clear_order() - . = TRUE - - if("buy") - for(var/list/L in buying) - if(L["name"] == params["buying"]) - L["amount"]++ - return TRUE - buying += list(list("name" = params["buying"], "amount" = params["amount"], "price" = items_to_price[params["buying"]])) - - if("removal") - var/index = 0 - for(var/list/L in buying) - index++ - if(L["name"] == params["removal"]) - if(L["amount"] > 1) - L["amount"]-- - else - buying.Cut(index, index+1) - . = TRUE - - if("confirm") - // Ensuring it is clear, in case the button is clicked multiple times - receipt = "" - sum = 0 - var/obj/item/card/id/id_card = usr.GetIdCard() - var/cashier = id_card? id_card.registered_name : "Unknown" - receipt = "

    [shop_name] receipt

    Today's date: [worlddate2text()]
    Cashier: [cashier]

    Purchased items:
    Total: [sum]电
    " - playsound(src, 'sound/machines/ping.ogg', 25, 1) - audible_message(SPAN_NOTICE("[icon2html(src, viewers(get_turf(src)))] \The [src] pings.")) - . = TRUE - - if("locking") - if(editmode) - editmode = FALSE - balloon_alert(usr, "device locked!") - else - if(!editmode) - var/obj/item/card/id/I = usr.GetIdCard() - if(!istype(I)) - return - if(check_access(I)) - editmode = !editmode - to_chat(usr, SPAN_NOTICE("Device [editmode ? "un" : ""]locked.")) - . = TRUE - - if("accountselect") - if(!editmode) - balloon_alert(usr, "device locked!") - return FALSE - - var/dest = tgui_input_list(usr, "What account would you like to select?", "Destination Account", assoc_to_keys(SSeconomy.department_accounts)) - if(!dest) - return FALSE - destinationact = dest - . = TRUE - - if("print_dsv") - if(!editmode) - balloon_alert(usr, "device locked!") - return FALSE - print_price(usr) - . = TRUE - -/obj/item/quikpay/proc/clear_order() - buying.Cut() - sum = 0 - receipt = "" + qp_shop.ui_interact(user) /obj/item/quikpay/afterattack(atom/target, mob/user, proximity) if (!proximity) return - if (!istype(target, /obj)) + + var/datum/component/quikpay_shop/quikpay/qp_shop = src.GetComponent(/datum/component/quikpay_shop/quikpay) + if(!qp_shop) return - if (!editmode) - to_chat(user, SPAN_NOTICE("Unlock \the [src] to add items.")) - return - - var/obj/O = target - var/name_guess = O.name - var/price_guess = 0 - - price_guess = text2num(sanitizeSafe( tgui_input_text(user, "Set price for [name_guess]:", "QuikPay", 0, 10), 10)) - if(isnull(price_guess) || price_guess == 0) - return - price_guess = max(0, round(price_guess, 0.01)) - - items += list(list("name" = "[name_guess]", "price" = price_guess)) - items_to_price[name_guess] = price_guess - - to_chat(user, SPAN_NOTICE("[src]: added '[name_guess]' for [price_guess].")) + qp_shop.add_item(target, user) diff --git a/html/changelogs/CommissaryChanges.yml b/html/changelogs/CommissaryChanges.yml new file mode 100644 index 00000000000..743518a6308 --- /dev/null +++ b/html/changelogs/CommissaryChanges.yml @@ -0,0 +1,13 @@ +author: TheGreyWolf + +delete-after: True + +changes: + - bugfix: "Fixed that the quikpay and cash register prices could be wrong." + - rscadd: "The commissary register now has categories." + - refactor: "Changed the commissary and quikpay to rely on a component, making them easier to maintan and ensuring they function almost identical." + - rscadd: "The commissary now has a wall terminal, that can be enabled by hangar technicians." + - bugfix: "The noticeboard in operations is now properly on one side of the wall, instead of on the wall turf itself." + - rscadd: "The food and drink fridges in the commissary can now be renamed." + - rscadd: "The shelves in the commissary now has a message when an item are taken from them." + - rscadd: "The quick-e-meals vendor was readded behind the café." diff --git a/icons/obj/machinery/wall/terminals.dmi b/icons/obj/machinery/wall/terminals.dmi index 41a5b5fe63b3462f6d8838f75e082a26bd509d92..08286b10cae377854c39d0667d2a9edd24666dcd 100644 GIT binary patch literal 48785 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

    wumguyeU(8I@0~ugb=9eUs&fKTh~5EQzf2 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 I;x^`D$x-1 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

    ZRGMJXjKxZ7@BZ5QU4I{sHUUI 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

    -
    - - {data.items.map((item) => ( - - {item.name} - - {item.price.toFixed(2)}电   - - - {!data.editmode ? ( -
    + {groupedItems[category].map((item) => ( + + {item.name} + + {item.price.toFixed(2)}电   + + + {!data.editmode ? (
    -
    + ) : ( + <> +   +
    + ))} + +
    - {' '}