Files
Casper3667 0ae5bc0574 Fixed the elevator time display and increased the elevator timer (#22510)
fixes https://github.com/Aurorastation/Aurora.3/issues/22409

The reason for the increased elevator timer was due to how rarely it
came up that the supplier time would be longer than the base 30 second
timer, so instead the two timers were combined to trial how a longer
timer would feel.
2026-05-28 10:34:33 +00:00

694 lines
24 KiB
Plaintext

// Config Defines
#define SUPPLY_DOCKZ 1 // Z-level of the dock.
#define SUPPLY_STATIONZ 6 // Z-level of the main map.
#define SUPPLY_STATION_AREATYPE /area/supply/station // Type of the cargo elevator area for station.
#define SUPPLY_DOCK_AREATYPE /area/supply/dock // Type of the cargo elevator area for dock.
SUBSYSTEM_DEF(cargo)
name = "Cargo"
wait = 30 SECONDS
flags = SS_NO_FIRE
init_order = SS_INIT_CARGO
// Shipment Variables and Lists
var/shipmentnum
var/list/cargo_shipments = list() // List of the shipments to the main map.
var/datum/cargo_shipment/current_shipment = null // The current cargo shipment.
var/list/queued_mining_equipment = list()
// Order Variables and Lists
var/ordernum
var/list/cargo_items = list() // The list of items.
var/list/cargo_categories = list() // The list of categories.
var/list/cargo_suppliers = list() // The list of suppliers.
var/list/all_orders = list() // All orders.
// Fee Variables
var/credits_per_crate = 15 // "Cost / Payment" per crate shipped from or to centcomm.
var/credits_per_platinum = 140 // Per sheet.
var/credits_per_phoron = 100 // Per sheet.
var/cargo_handlingfee = 5 // The handling fee cargo takes per crate, as a percentage of the order's value.
var/cargo_handlingfee_min = 0 // The minimum handling fee.
var/cargo_handlingfee_max = 500 // The maximum handling fee.
var/cargo_handlingfee_change = 1 // If the handling fee can be changed -> for a random event.
var/datum/money_account/supply_account
// Elevator Movement Variables
var/movetime = 300
var/min_movetime = 300
var/max_movetime = 2400
var/datum/shuttle/autodock/ferry/supply/shuttle
// Item Variables
var/last_item_id = 0 // The ID of the last item that has been added.
/// Indicates if orders have been dumped.
var/dumped_orders = FALSE
// Exports and Bounties
var/list/exports_list = list()
var/list/bounties_list = list()
/datum/controller/subsystem/cargo/Recover()
src.shuttle = SScargo.shuttle
src.cargo_items = SScargo.cargo_items
src.cargo_categories = SScargo.cargo_categories
src.cargo_shipments = SScargo.cargo_shipments
src.all_orders = SScargo.all_orders
src.cargo_handlingfee = SScargo.cargo_handlingfee
src.cargo_handlingfee_change = SScargo.cargo_handlingfee_change
src.supply_account = SScargo.supply_account
src.last_item_id = SScargo.last_item_id
src.exports_list = SScargo.exports_list
src.bounties_list = SScargo.bounties_list
/datum/controller/subsystem/cargo/Initialize(timeofday)
// Generate the order number and shipment number to start with.
ordernum = rand(1, 8000)
shipmentnum = rand(500, 700)
supply_account = SSeconomy.get_department_account("Operations")
// Load in the cargo items config.
load_cargo_files()
setupExports()
setupBounties()
// Spawn in the warehouse objects and items.
var/datum/cargospawner/spawner = new
spawner.start()
qdel(spawner)
return SS_INIT_SUCCESS
/*
Loading Data
*/
// Reset cargo to prep for loading in new items.
/datum/controller/subsystem/cargo/proc/reset_cargo()
cargo_shipments = list() // List of the shipments to the main map.
current_shipment = null // The current cargo shipment.
all_orders = list() // All orders.
last_item_id = 0
// Load Categories
/datum/controller/subsystem/cargo/proc/load_cargo_categories()
for(var/singleton/cargo_category/C as anything in (GET_SINGLETON_SUBTYPE_LIST(/singleton/cargo_category)))
log_subsystem_cargo("Loading category '[C.name]'.")
SScargo.cargo_categories[C.name] = C
// Load Suppliers
/datum/controller/subsystem/cargo/proc/load_cargo_suppliers()
for(var/singleton/cargo_supplier/S as anything in (GET_SINGLETON_SUBTYPE_LIST(/singleton/cargo_supplier)))
log_subsystem_cargo("Loading supplier '[S.name]', with short name '[S.short_name]'.")
S.price_modifier = S.get_total_price_coefficient()
SScargo.cargo_suppliers[S.short_name] = S
/datum/controller/subsystem/cargo/proc/load_cargo_items()
log_subsystem_cargo("Loading cargo items.")
var/id = 1
reset_cargo()
// Get the list of all valid cargo items.
for(var/singleton/cargo_item/I as anything in (GET_SINGLETON_SUBTYPE_LIST(/singleton/cargo_item)))
cargo_items[I.name] = I
I.id = id++
I.get_adjusted_price()
// Check if the category exists in "SScargo.cargo_categories".
if(!(I.category || SScargo.cargo_categories[I.category]))
log_subsystem_cargo("Error: Unable to find category '[I.category]' for item '[I.name]. Skipping.")
continue
else
var/singleton/cargo_category/item_category = SScargo.cargo_categories[I.category]
if(!item_category.items)
item_category.items = list()
item_category.items += I
log_subsystem_cargo("Inserted item '[I.name]' into category '[I.category]' with ID '[I.id]'.")
if(!(I.supplier || SScargo.cargo_suppliers[I.supplier]))
log_subsystem_cargo("Error: Unable to find supplier '[I.supplier]' for item '[I.name]. Skipping.")
continue
else
var/singleton/cargo_supplier/item_supplier = SScargo.cargo_suppliers[I.supplier]
if(!item_supplier.items)
item_supplier.items = list()
item_supplier.items += I
I.supplier_data = item_supplier
log_subsystem_cargo("Finished loading cargo items.")
// Load cargo data from "cargo_items.dm".
/datum/controller/subsystem/cargo/proc/load_cargo_files()
log_subsystem_cargo("Starting to load cargo data from files.")
// Reset the loaded cargo data.
reset_cargo()
// Add categories.
load_cargo_categories()
// Load suppliers.
load_cargo_suppliers()
// Load cargo items.
load_cargo_items()
log_subsystem_cargo("Finished loading cargo data from files.")
/*
Getting Items, Categories, Suppliers, and Shipments
*/
/datum/controller/subsystem/cargo/proc/get_order_count()
return all_orders.len
// Returns the order ID and increments it.
/datum/controller/subsystem/cargo/proc/get_next_order_id()
. = ordernum
ordernum++
return .
// Increments the item ID and returns it.
/datum/controller/subsystem/cargo/proc/get_next_item_id()
last_item_id++
return last_item_id
/// Returns a default cargo_category for usage in situations where one is needed.
/datum/controller/subsystem/cargo/proc/get_default_category()
var/list/categories = GET_SINGLETON_SUBTYPE_LIST(/singleton/cargo_category)
var/singleton/cargo_category/default_cat = categories[1]
log_subsystem_cargo("Default category set to '[initial(default_cat.name)]'.")
return initial(default_cat.name)
/// Returns a string-formatted list of data for all suppliers and their information for use in TGUI.
/datum/controller/subsystem/cargo/proc/get_supplier_data(var/supplier_short_name)
var/list/supplier_data = list()
var/singleton/cargo_supplier/S = cargo_suppliers[supplier_short_name]
if(!S)
log_subsystem_cargo("Error: Unable to find supplier '[supplier_short_name]'.")
return
supplier_data += list(
"short_name" = S.short_name,
"name" = S.name,
"description" = S.description,
"tag_line" = S.tag_line,
"shuttle_time" = S.shuttle_time,
"shuttle_price" = S.shuttle_price,
"available" = S.available,
"price_modifier" = S.price_modifier,
)
return supplier_data
/// Returns a string-formatted list of every item in each category and their information for use in TGUI.
/datum/controller/subsystem/cargo/proc/get_items_for_category(var/category_name)
var/list/item_list = list()
var/singleton/cargo_category/C = cargo_categories[category_name]
if(!C)
log_subsystem_cargo("Error: get_items_for_category() was unable to find category '[category_name]'.")
return
for(var/singleton/cargo_item/ci as anything in C.items)
item_list += list(list(
"name" = ci.name,
"description" = ci.description,
"price" = ci.price,
"id" = ci.id,
"price_adjusted" = ci.adjusted_price,
"supplier" = ci.supplier,
"supplier_data" = get_supplier_data(ci.supplier),
"access" = ci.access != 0 ? get_access_desc(ci.access) : "none",
))
return item_list
/// Returns a string-formatted list of categories for use in TGUI.
/datum/controller/subsystem/cargo/proc/get_category_list()
var/list/category_list = list()
for (var/cat_name in cargo_categories)
// Get the singleton instance for the current category.
var/singleton/cargo_category/cc = cargo_categories[cat_name]
category_list += list(list(
"name" = cc.name,
"display_name" = cc.display_name,
"description" = cc.description,
"icon" = cc.icon,
"price_modifier" = cc.price_modifier,
))
return category_list
// Get category names.
/datum/controller/subsystem/cargo/proc/get_category_by_name(var/name)
// Check if the category exists in cargo_categories.
if(!cargo_categories[name])
log_subsystem_cargo("Error: Requested category '[name]' does not exist.")
return
// Return the category if it exists.
return cargo_categories[name]
// Gets a order by order ID.
/datum/controller/subsystem/cargo/proc/get_order_by_id(var/id)
for (var/datum/cargo_order/co in all_orders)
if(co.order_id == id)
return co
return null
// Gets a supplier by name.
/datum/controller/subsystem/cargo/proc/get_supplier_by_name(var/name)
return cargo_suppliers[name]
// Gets all the shipments sent to or from the main map.
/datum/controller/subsystem/cargo/proc/get_shipment_list()
var/list/shipment_list = list()
for(var/datum/cargo_shipment/cs in cargo_shipments)
if(cs.get_list() != null)
shipment_list.Add(list(cs.get_list()))
return shipment_list
// Get a shipment by shipment ID.
/datum/controller/subsystem/cargo/proc/get_shipment_by_id(var/id)
for(var/datum/cargo_shipment/cs in cargo_shipments)
if(cs.shipment_num == id)
return cs
return null
/*
Submitting, Approving, Rejecting and Shipping Orders
*/
// Gets the orders based on their status (submitted, approved, shipped).
/datum/controller/subsystem/cargo/proc/get_orders_by_status(status, data_list = FALSE, list/avoid)
if(!status)
log_subsystem_cargo("get_orders_by_status has been called with a invalid status")
return list()
var/list/orders = list()
for (var/datum/cargo_order/co in all_orders)
if(co.status == status || co.get_payment_status() == status)
if(avoid && (avoid.Find(co.status) || avoid.Find(co.get_payment_status())))
continue
if(data_list)
orders.Add(list(co.get_list()))
else
orders.Add(co)
return orders
// Gets the value of orders based on their status, type is passed on to co.get_value.
/datum/controller/subsystem/cargo/proc/get_orders_value_by_status(var/status, var/type=0)
if(!status)
log_subsystem_cargo("get_orders_value_by_status has been called with a invalid status")
return 0
var/value = 0
for (var/datum/cargo_order/co in all_orders)
if(co.status == status)
value += co.get_value(type)
return value
// Gets the suppliers of the orders of a specific type.
/datum/controller/subsystem/cargo/proc/get_order_suppliers_by_status(var/status, var/pretty_names=0)
if(!status)
log_subsystem_cargo("get_order_suppliers_by_status has been called with a invalid status")
return list()
var/list/suppliers = list()
for(var/datum/cargo_order/co in all_orders)
if(co.status == status)
// Get the list of supplirs and add it to the suppliers list.
for(var/supplier in co.get_supplier_list())
if(pretty_names)
var/singleton/cargo_supplier/cs = SScargo.cargo_suppliers[supplier]
suppliers[cs.short_name] = cs.name
else
suppliers[supplier] = supplier
return suppliers
// Checks if theorder can be shipped and marks it as shipped if possible.
/datum/controller/subsystem/cargo/proc/ship_order(var/datum/cargo_order/co)
// Get the price cargo has to pay for the order.
var/item_price = co.get_value(1)
// Get the maximum shipment costs for the order.
var/shipment_cost = co.get_shipment_cost()
// Check if cargo has enough money to pay for the shipment of the item and the maximum shipment cost.
if(item_price + shipment_cost > get_cargo_money())
log_subsystem_cargo("Order could not be shipped. Insufficient money. [item_price] + [shipment_cost] > [get_cargo_money()].")
return 0
co.set_shipped()
current_shipment.shipment_cost_purchase += item_price // Increase the price of the shipment.
current_shipment.orders.Add(co) // Add the order to the order list.
return 1
// Generate a new cargo shipment.
/datum/controller/subsystem/cargo/proc/new_shipment()
current_shipment = new()
shipmentnum ++
cargo_shipments.Add(current_shipment)
current_shipment.shipment_num = shipmentnum
/*
Changing Settings
*/
// Gets the current handlingfee.
/datum/controller/subsystem/cargo/proc/get_handlingfee()
return cargo_handlingfee
/datum/controller/subsystem/cargo/proc/get_handlingfee_cost(shipment_cost)
if(shipment_cost)
return (cargo_handlingfee / 100) * shipment_cost
return 0
// Sets the handling fee and returns a status message.
/datum/controller/subsystem/cargo/proc/set_handlingfee(var/fee)
if(!fee)
return "Unable to set handlingfee - Can not be NULL"
if(fee < cargo_handlingfee_min)
return "Unable to set handlingfee - Smaller than minimum: [cargo_handlingfee_min]"
if(fee > cargo_handlingfee_max)
return "Unable to set handlingfee - Higher than maximum: [cargo_handlingfee_max]"
if(cargo_handlingfee_change != 1)
return "Unable to set handlingfee - Changing the handlingfee is currently not possible"
cargo_handlingfee = fee
return
//Gets the current crate fee
/datum/controller/subsystem/cargo/proc/get_cratefee()
return credits_per_crate
/*
Money Stuff
*/
//Gets the current money on the cargo account
/datum/controller/subsystem/cargo/proc/get_cargo_money()
return supply_account.money
//Charges cargo. Accepts a text that should appear as charge and the numer of credits to charge
/datum/controller/subsystem/cargo/proc/charge_cargo(var/charge_text, var/charge_credits)
if(!supply_account)
log_subsystem_cargo("Warning: Tried to charge supply account but supply acount doesnt exist")
return 0
return SSeconomy.charge_to_account(supply_account.account_number, "[commstation_name()] - Operations", "[charge_text]", "[commstation_name()] - Banking System", -charge_credits)
//Gets the pending shipment costs for the items that are about to be shipped to the station
/datum/controller/subsystem/cargo/proc/get_pending_shipment_cost(var/status="approved")
//Loop through all the orders marked as shipped and get the suppliers into a list of involved suppliers
var/list/suppliers = get_order_suppliers_by_status(status)
var/price = 0
for(var/supplier in suppliers)
var/singleton/cargo_supplier/cs = SScargo.cargo_suppliers[supplier]
if(cs)
price += cs.shuttle_price
return price
//Gets the pending shipment time for the items that are about to be shipped to the station
/datum/controller/subsystem/cargo/proc/get_pending_shipment_time(var/status="approved")
//Loop through all the orders marked as shipped and get the suppliers into a list of involved suppliers
var/list/suppliers = get_order_suppliers_by_status(status)
var/time = 0
for(var/supplier in suppliers)
var/singleton/cargo_supplier/cs = SScargo.cargo_suppliers[supplier]
if(cs)
time += cs.shuttle_time
return time
/*
Shuttle Operations - Calling, Forcing, Canceling, Buying / Selling
*/
// Calls the shuttle and returns a status message.
/datum/controller/subsystem/cargo/proc/shuttle_call(var/requester_name)
if(shuttle.at_station())
if(shuttle.forbidden_atoms_check())
. = "For safety reasons the cargo elevator cannot transport live organisms, classified nuclear weaponry, nor homing beacons."
else
movetime = min_movetime // It always takes two minutes to get to centcomm.
shuttle.launch(src)
. = "Initiating cargo elevator."
current_shipment.shuttle_recalled_by = requester_name
else
// Check if there is enough money in the cargo account for the current shipment.
var/shipment_cost = get_pending_shipment_cost()
if(shipment_cost > get_cargo_money())
. = "The cargo elevator could not be called due to insufficient funds. [shipment_cost] credits required."
else
// Create a new shipment if one does not exist already.
if(!current_shipment)
new_shipment()
// Set the elevator movement time.
current_shipment.shuttle_time = get_pending_shipment_time() + min_movetime
current_shipment.shuttle_fee = shipment_cost
if(current_shipment.shuttle_time < min_movetime)
log_subsystem_cargo("Cargo elevator time less than [min_movetime]: [current_shipment.shuttle_time]. Setting to [min_movetime].")
current_shipment.shuttle_time = min_movetime
if(current_shipment.shuttle_time > max_movetime)
log_subsystem_cargo("Cargo elevator time larger than [max_movetime]: [current_shipment.shuttle_time]. Setting to [max_movetime].")
current_shipment.shuttle_time = max_movetime
movetime = current_shipment.shuttle_time
//Launch it
shuttle.launch(src)
. = "The cargo elevator has been called and will arrive in approximately [shuttle.launch_estimate(TRUE)] seconds."
current_shipment.shuttle_called_by = requester_name
// Cancels the elevator. Can return a status message.
/datum/controller/subsystem/cargo/proc/shuttle_cancel()
shuttle.cancel_launch(src)
// Forces the eleavtor. Can return a status message.
/datum/controller/subsystem/cargo/proc/shuttle_force()
shuttle.force_launch(src)
// To stop things being sent to centcomm which should not be sent to centcomm. Recursively checks for these types.
/datum/controller/subsystem/cargo/proc/forbidden_atoms_check(atom/A)
if(istype(A, /mob/living))
var/mob/living/mob_to_send = A
var/mob_is_for_bounty = FALSE
if(!mob_to_send.mind)
for(var/bounty in bounties_list)
var/datum/bounty/B = bounty
if(B.applies_to(mob_to_send))
mob_is_for_bounty = TRUE
if(!mob_is_for_bounty)
return 1
if(istype(A, /obj/item/disk/nuclear))
return 1
if(istype(A, /obj/structure/machinery/nuclearbomb))
return 1
if(istype(A, /obj/item/radio/beacon))
return 1
for(var/i=1, i<=A.contents.len, i++)
var/atom/B = A.contents[i]
if(.(B))
return 1
// Sells stuff on the elevator to centcomm.
/datum/controller/subsystem/cargo/proc/sell()
if(!shuttle.shuttle_area)
return
var/msg = ""
var/matched_bounty = FALSE
var/sold_atoms = ""
for(var/area/subarea in shuttle.shuttle_area)
for(var/atom/movable/AM in subarea)
if(bounty_ship_item_and_contents(AM, dry_run = FALSE))
matched_bounty = TRUE
if(!AM.anchored)
sold_atoms += export_item_and_contents(AM, FALSE, FALSE, dry_run = FALSE)
if(sold_atoms)
sold_atoms += "."
if(matched_bounty)
msg += "Bounty items received. An update has been sent to all bounty consoles.\n"
for(var/a in exports_list)
var/datum/export/E = a
var/export_text = E.total_printout()
if(!export_text)
continue
msg += export_text + "\n"
current_shipment.shipment_cost_sell += E.total_cost
E.export_end()
charge_cargo("Shipment #[current_shipment.shipment_num] - Income", -current_shipment.shipment_cost_sell)
current_shipment.message = msg
current_shipment.generate_invoice()
current_shipment = null // Null the current shipment because it is completed.
/datum/controller/subsystem/cargo/proc/order_mining(var/equip_path)
if(!ispath(equip_path))
return FALSE
queued_mining_equipment += equip_path
return TRUE
// Buys the item and places them on the elevator.
// Returns 0 if unsuccessful and returns 1 if the elevator can be sent.
/datum/controller/subsystem/cargo/proc/buy()
if(!current_shipment)
new_shipment()
var/list/approved_orders = get_orders_by_status("approved", 0)
if(!shuttle.shuttle_area)
return
var/list/clear_turfs = list()
for(var/area/subarea in shuttle.shuttle_area)
for(var/turf/T in subarea)
if(T.density)
continue
var/contcount
for(var/atom/A in T.contents)
if(!A.simulated)
continue
contcount++
if(contcount)
continue
clear_turfs += T
for(var/E in queued_mining_equipment)
if(!ispath(E))
continue
var/i = rand(1,clear_turfs.len)
var/turf/pickedloc = clear_turfs[i]
clear_turfs.Cut(i,i+1)
if(isturf(pickedloc))
new E(pickedloc)
queued_mining_equipment -= E
for(var/datum/cargo_order/co in approved_orders)
if(!co)
continue
// Check if theres space to place the order.
if(!clear_turfs.len)
log_subsystem_cargo("Order [co.order_id] could not be placed on the cargo elevator because it is full.")
break
// Check if the supplier is still available.
for(var/datum/cargo_order_item/coi in co.items)
if(!coi.ci.supplier_data.available)
log_subsystem_cargo("Order [co.order_id] could not be placed on the cargo elevator because supplier [coi.ci.supplier_data.name] for item [coi.ci.name] is unavailable.")
continue
// Check if there is enough money to ship the order.
if(!ship_order(co))
continue
var/i = rand(1,clear_turfs.len)
var/turf/pickedloc = clear_turfs[i]
clear_turfs.Cut(i,i+1)
// Spawn the crate.
var/containertype = co.get_container_type()
var/obj/crate = new containertype(pickedloc)
// Label the crate.
crate.name_unlabel = crate.name
crate.name = "[crate.name] ([co.order_id] - [co.ordered_by])"
crate.verbs += /atom/proc/remove_label
// Set the access requirement.
if(co.required_access.len > 0)
crate.req_access = co.required_access.Copy()
// Loop through the items and spawn them.
for(var/datum/cargo_order_item/coi in co.items)
if(!coi)
continue
for(var/_ in 1 to coi.ci.spawn_amount)
for(var/item_typepath in coi.ci.items)
new item_typepath(crate)
// Spawn the paper inside.
var/obj/item/paper/P = new(crate)
P.set_content_unsafe("[co.order_id] - [co.ordered_by]", co.get_report_delivery_order())
// Shuttle is loaded now, charge operations for it.
charge_cargo("Shipment #[current_shipment.shipment_num] - Expense", current_shipment.shipment_cost_purchase)
return 1
/// Dumps the cargo orders to the database when the round ends.
/datum/controller/subsystem/cargo/Shutdown()
if(dumped_orders)
log_subsystem_cargo("SQL: Orders already dumped. Cargo data dump has been aborted.")
return
if(!SSdbcore.Connect())
log_subsystem_cargo("SQL: Unable to connect to SQL database. Cargo data dump has been aborted.")
return
dumped_orders = TRUE
// Loop through all the orders and dump them all.
for(var/datum/cargo_order/co in all_orders)
// Iterate over the items in the order and build the a list with the item count.
var/list/itemcount = list()
var/list/itemnames = list()
for(var/datum/cargo_order_item/coi in co.items)
if(!isnull(itemcount["[coi.ci.id]"]))
itemcount["[coi.ci.id]"] = itemcount["[coi.ci.id]"] + 1
else
itemcount["[coi.ci.id]"] = 1
itemnames["[coi.ci.id]"] = coi.ci.name
var/datum/db_query/dump_query = SSdbcore.NewQuery("INSERT INTO `ss13_cargo_orderlog` (`game_id`, `order_id`, `status`, `price`, `ordered_by_id`, `ordered_by`, `authorized_by_id`, `authorized_by`, `received_by_id`, `received_by`, `paid_by_id`, `paid_by`, `time_submitted`, `time_approved`, `time_shipped`, `time_delivered`, `time_paid`, `reason`) \
VALUES (:game_id, :order_id, :status, :price, :ordered_by_id, :ordered_by, :authorized_by_id, :authorized_by, :received_by_id, :received_by, :paid_by_id, :paid_by, :time_submitted, :time_approved, :time_shipped, :time_delivered, :time_paid, :reason)",
list(
"game_id"=GLOB.round_id,
"order_id"=co.order_id,
"status"=co.status,
"price"=co.price,
"ordered_by_id"=co.ordered_by_id,
"ordered_by"=co.ordered_by,
"authorized_by_id"=co.authorized_by_id,
"authorized_by"=co.authorized_by,
"received_by_id"=co.received_by_id,
"received_by"=co.received_by,
"paid_by_id"=co.paid_by_id,
"paid_by"=co.paid_by,
"time_submitted"=co.time_submitted,
"time_approved"=co.time_approved,
"time_shipped"=co.time_shipped,
"time_delivered"=co.time_delivered,
"time_paid"=co.time_paid,
"reason"=co.reason
), TRUE)
if(!dump_query.Execute())
log_subsystem_cargo("SQL: Could not write order to database. Cargo data dump has been aborted.")
continue
if(dump_query.last_insert_id)
for(var/item_id in itemcount)
var/datum/db_query/dump_item_query = SSdbcore.NewQuery("INSERT INTO `ss13_cargo_item_orderlog` (`cargo_orderlog_id`, `item_name`, `amount`) \
VALUES (:cargo_orderlog_id, :item_name, :amount)",
list(
"cargo_orderlog_id" = dump_query.last_insert_id,
"item_name"= itemnames[item_id],
"amount" = itemcount[item_id]
),
TRUE)
if(!dump_item_query.Execute())
log_subsystem_cargo("SQL: Cound not write details of a cargo order.")
qdel(dump_item_query)
continue
qdel(dump_query)
log_subsystem_cargo("SQL: Saved cargo order log to database.")