mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-21 04:48:18 +01:00
3f62424312
This has zero reason to exist in our code base. We have no procs or variables tied to this. I removed it to make future modifications cleaner. --------- Signed-off-by: Cody Brittain <1779662+Generalcamo@users.noreply.github.com>
687 lines
24 KiB
Plaintext
687 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 = 30 // "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 = 20 // The handling fee cargo takes per crate.
|
|
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(var/status, var/data_list=0)
|
|
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)
|
|
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
|
|
|
|
// 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()
|
|
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 [round(SScargo.movetime/600, 2)] minutes."
|
|
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/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.")
|