From 6ac39e264e5f87e6c1986ecccfa6c0eecd3ac676 Mon Sep 17 00:00:00 2001 From: Cameron Lennox Date: Thu, 21 May 2026 10:22:06 -0400 Subject: [PATCH] Adds Inflation (#19447) * it's yours my friend as long as you have enough * Sellable AND bombcode is fixed * this * Craftable * Update code/controllers/subsystems/supply.dm * Update code/modules/economy/cargo_point_scanner.dm * Apply suggestion from @Cameron-The-Raven --- code/_helpers/roundstats.dm | 17 +- code/controllers/subsystems/internal_wiki.dm | 6 +- code/controllers/subsystems/supply.dm | 33 ++- code/datums/elements/sellable.dm | 205 +++++++++++++++++- code/game/machinery/bomb_tester_vr.dm | 5 +- code/game/machinery/computer/supply.dm | 8 +- code/game/mecha/mecha.dm | 2 + .../objects/items/devices/transfer_valve.dm | 4 + .../game/objects/items/weapons/tanks/tanks.dm | 3 +- .../crates_lockers/closets/secure/cargo.dm | 6 +- code/modules/economy/cargo_point_scanner.dm | 49 +++++ code/modules/food/food.dm | 1 + code/modules/reagents/machinery/chemalyzer.dm | 2 +- .../research/tg/designs/service_designs.dm | 13 ++ .../tg/techwebs/nodes/service_nodes.dm | 1 + code/modules/xenobio/items/extracts_vr.dm | 1 + code/modules/xenobio/items/extracts_worth.dm | 44 ++++ .../SupplyConsoleShuttleStatus.tsx | 15 +- vorestation.dme | 2 + 19 files changed, 392 insertions(+), 25 deletions(-) create mode 100644 code/modules/economy/cargo_point_scanner.dm create mode 100644 code/modules/xenobio/items/extracts_worth.dm diff --git a/code/_helpers/roundstats.dm b/code/_helpers/roundstats.dm index 9db69b9658..5b4061c38f 100644 --- a/code/_helpers/roundstats.dm +++ b/code/_helpers/roundstats.dm @@ -90,14 +90,27 @@ GLOBAL_LIST_EMPTY(refined_chems_sold) points += GLOB.refined_chems_sold[D]["value"] if(GLOB.refined_chems_sold[D]["units"] >= 1000) // Don't spam the list - var/dols = GLOB.refined_chems_sold[D]["value"] * SSsupply.points_per_money + var/dols = GLOB.refined_chems_sold[D]["value"] * SSsupply.money_per_points dols = FLOOR(dols * 100,1) / 100 // Truncate decimals valid_stats_list.Add("[GLOB.refined_chems_sold[D]["units"]]u of [D], for [GLOB.refined_chems_sold[D]["value"]] points! A total of [dols] [dols > 1 ? "thalers" : "thaler"]") - var/end_dols = points * SSsupply.points_per_money + var/end_dols = points * SSsupply.money_per_points end_dols = FLOOR(end_dols * 100,1) / 100 // Truncate decimals valid_stats_list.Add("For a total of: [points] points, or [end_dols] [end_dols > 1 ? "thalers" : "thaler"]!") + if(SSsupply.warheads_sold > 0) + var/end_dols = SSsupply.warheads_value * SSsupply.money_per_points + end_dols = FLOOR(end_dols * 100,1) / 100 // Truncate decimals + valid_stats_list.Add("[SSsupply.warheads_sold] TTV warheads were sold! For a total of: [SSsupply.warheads_value] points, or [end_dols] [end_dols > 1 ? "thalers" : "thaler"]!") + + //NYI + if(SSsupply.watts_sold >= 1 GIGAWATTS) + var/gws = FLOOR(SSsupply.watts_sold / (1 GIGAWATTS),1) // Truncate decimals + points = FLOOR(SSsupply.watts_sold / SSsupply.points_per_watt,1) + var/end_dols = points * SSsupply.money_per_points + end_dols = FLOOR(end_dols * 100,1) / 100 // Truncate decimals + valid_stats_list.Add("[gws] gigawatt[gws > 1 ? "s" : ""] of power were sold! For a total of: [points] points, or [end_dols] [end_dols > 1 ? "thalers" : "thaler"]!") + if(SSnerdle) var/word_export = "This shift's nerdle Was: [SSnerdle.target_word]!
" word_export += "There were [SSnerdle.total_players] players this shift!
" diff --git a/code/controllers/subsystems/internal_wiki.dm b/code/controllers/subsystems/internal_wiki.dm index a398d2c6fb..c16332b228 100644 --- a/code/controllers/subsystems/internal_wiki.dm +++ b/code/controllers/subsystems/internal_wiki.dm @@ -841,7 +841,7 @@ SUBSYSTEM_DEF(internal_wiki) data["stack_size"] = initial(stack_path.max_amount) ? initial(stack_path.max_amount) : 0 var/supply_value = M.supply_conversion_value ? M.supply_conversion_value : 0 data["supply_points"] = supply_value - var/value = supply_value * SSsupply.points_per_money + var/value = supply_value * SSsupply.money_per_points value = FLOOR(value * 100, 1) / 100 // Truncate decimals data["market_price"] = value @@ -1132,7 +1132,7 @@ SUBSYSTEM_DEF(internal_wiki) data["industrial_use"] = R.industrial_use data["supply_points"] = R.supply_conversion_value ? R.supply_conversion_value : 0 data["cooling_mod"] = R.coolant_modifier - var/value = R.supply_conversion_value * REAGENTS_PER_SHEET * SSsupply.points_per_money + var/value = R.supply_conversion_value * REAGENTS_PER_SHEET * SSsupply.money_per_points value = FLOOR(value * 100,1) / 100 // Truncate decimals data["market_price"] = value data["sintering"] = SSinternal_wiki.assemble_sintering(GLOB.reagent_sheets[R.id]) @@ -1243,7 +1243,7 @@ SUBSYSTEM_DEF(internal_wiki) var/list/recipe_data = list() var/value = recipe["Price"] ? recipe["Price"] : 0 recipe_data["supply_points"] = value - value *= SSsupply.points_per_money // convert to cash + value *= SSsupply.money_per_points // convert to cash value = FLOOR(value * 100,1) / 100 // Truncate decimals recipe_data["market_price"] = value recipe_data["appliance"] = recipe["Appliance"] diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm index 456deca754..99a1556637 100644 --- a/code/controllers/subsystems/supply.dm +++ b/code/controllers/subsystems/supply.dm @@ -7,11 +7,23 @@ SUBSYSTEM_DEF(supply) //Initializes at default time flags = SS_NO_TICK_CHECK - //supply points + /// Supply points var/points = 50 - var/points_per_process = 1.0 // Processes every 20 seconds, so this is 3 per minute + /// How many points we get every SSSupply fire. + var/points_per_process = 1.0 + /// How much money we get for every stamped slip we return to Central var/points_per_slip = 2 - var/points_per_money = 0.02 // 1 point for $50 + /// How much money one SP is worth in thalers. Shows up in the end of round stats. + var/money_per_points = 50 + /// How much power we've sold this round. + var/watts_sold = 0 + /// How many watts that have to be sold for a point - NYI + var/points_per_watt = 10 MEGAWATTS + /// How many TTVs we have sold this round. + var/warheads_sold = 0 + /// How many points we've made selling TTVs + var/warheads_value = 0 + //control var/ordernum = 0 // Start at zero, it's per-shift tracking var/list/shoppinglist = list() // Approved orders @@ -53,10 +65,12 @@ SUBSYSTEM_DEF(supply) return 1 if(istype(A,/obj/item/radio/beacon)) return 1 - if(istype(A,/obj/item/perfect_tele_beacon)) //VOREStation Addition: Translocator beacons - return 1 //VOREStation Addition: Translocator beacons - if(istype(A,/obj/machinery/power/quantumpad)) // //VOREStation Add: Quantum pads - return 1 //VOREStation Add: Quantum pads + if(istype(A,/obj/item/perfect_tele_beacon)) + return 1 + if(istype(A,/obj/machinery/power/quantumpad)) + return 1 + if(istype(A,/obj/structure/extraction_point)) + return 1 for(var/atom/B in A.contents) if(.(B)) @@ -68,7 +82,7 @@ SUBSYSTEM_DEF(supply) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_SUPPLY_SHUTTLE_DEPART, shuttle.shuttle_area) for(var/area/subarea in shuttle.shuttle_area) for(var/atom/movable/MA in subarea) - if(MA.anchored) + if(MA.anchored && !istype(MA,/obj/mecha)) continue var/datum/exported_crate/EC = new /datum/exported_crate() @@ -376,3 +390,6 @@ SUBSYSTEM_DEF(supply) var/ordered_at // Date and time the order was requested at var/approved_at // Date and time the order was approved at var/status // [Requested, Accepted, Denied, Shipped] + +/datum/controller/subsystem/supply/proc/points_to_cash(val) + return FLOOR(((val * money_per_points)), 1) diff --git a/code/datums/elements/sellable.dm b/code/datums/elements/sellable.dm index 4790ce30bc..3b372bf4a3 100644 --- a/code/datums/elements/sellable.dm +++ b/code/datums/elements/sellable.dm @@ -80,9 +80,12 @@ // Money +/datum/element/sellable/spacecash + sale_info = "This can be sold on the cargo shuttle if packed in a crate. Due to taxes, this is worth less than its face value when sold to the cargo shuttle." + /datum/element/sellable/spacecash/calculate_sell_value(obj/source) var/obj/item/spacecash/cashmoney = source - return cashmoney.worth * SSsupply.points_per_money + return FLOOR((cashmoney.worth / SSsupply.money_per_points),1) /datum/element/sellable/spacecash/calculate_sell_quantity(obj/source) var/obj/item/spacecash/cashmoney = source @@ -195,3 +198,203 @@ if(organ_stuff.health != initial(organ_stuff.health) ) return "Error: Product was damaged on arrival." return null + +// Selling slimes +/datum/element/sellable/slime_extract/calculate_sell_value(obj/source) + var/obj/item/slime_extract/slime_stuff = source + return FLOOR(slime_stuff.supply_conversion_value,1) + + +// Selling food +/datum/element/sellable/food_snack + sale_info = "This can be sold on the cargo shuttle if packed in a freezer crate." + +/datum/element/sellable/food_snack/sell_error(obj/source) + if(!istype(source.loc, /obj/structure/closet/crate/freezer)) + return "Error: Product was improperly packaged. Send contents in freezer crate to preserve contents for transport. Payment rendered null under terms of agreement." + var/obj/item/reagent_containers/food/food_stuff = source + if(istype(food_stuff,/obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/S = food_stuff + if(S.bitecount > 0) + return "Error: Product was partially consumed, and is unfit for sale. Payment rendered null under terms of agreement." + return null + +/datum/element/sellable/food_snack/calculate_sell_value(obj/source) + var/obj/item/reagent_containers/food/food_stuff = source + return FLOOR(food_stuff.price_tag,1) // Converts old price system into supply point cost + + +// Selling TTVs +/datum/element/sellable/transfer_valve/calculate_sell_value(obj/source) + var/obj/item/transfer_valve/TTV = source + + if(!TTV.tank_one || !TTV.tank_two) + return 0 + + var/datum/gas_mixture/faketank = new() + QDEL_IN(faketank,5) + + // Highest pressure must be in tank 1! + var/obj/item/tank/tank1 = TTV.tank_one + var/obj/item/tank/tank2 = TTV.tank_two + faketank.volume = tank1.air_contents.volume + tank2.air_contents.volume + faketank.copy_from(tank1.air_contents) + var/faketank_integrity = tank1.integrity + faketank.merge(tank2.air_contents) + + // Perform the explosion + faketank.merge(tank2.air_contents) + faketank.react() + var/pressure = faketank.return_pressure() + if(pressure <= TANK_FRAGMENT_PRESSURE) + return 0 + var/intervals = 0 + //Very dumbed down version. Close enough for our purposes. + while(faketank_integrity >= 7) + if(intervals < 0 || intervals >= 13) //13 because we calculate for adminspawn bombs or pre-welded bombs, too, which start at 20 integrity. If it's losing integrity, it's going to rupture eventually! + break + intervals++ + faketank.react() + pressure = faketank.return_pressure() + if(pressure > TANK_FRAGMENT_PRESSURE) + faketank_integrity -= 7 + + else if(pressure > TANK_RUPTURE_PRESSURE) + faketank_integrity -= 5 + + if(faketank_integrity > 7) + return 0 + + faketank.react() + faketank.react() + faketank.react() + pressure = faketank.return_pressure() + + var/strength = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE + var/mult = ((faketank.volume/140)**(1/2)) * (faketank.total_moles**(2/3))/((29*0.64) **(2/3)) //Don't ask me what this is, see tanks.dm + + var/dev_value = round((mult*strength)*1) + var/heavy_value = round((mult*strength)*0.5) + var/light_value = round((mult*strength)*0.25) + + return FLOOR(dev_value + heavy_value + light_value,1) + +/datum/element/sellable/transfer_valve/sell(obj/source, datum/exported_crate/EC, in_crate) + . = ..() + if(. && EC.contents[EC.contents.len]["value"] > 0) + SSsupply.warheads_sold++ + SSsupply.warheads_value += EC.contents[EC.contents.len]["value"] + + +// Mech selling +/datum/element/sellable/mecha + needs_crate = FALSE + sale_info = "This can be sold on the cargo shuttle. It's condition and parts would greatly affects its price." + +/datum/element/sellable/mecha/sell_error(obj/source) + var/obj/mecha/exo = source + exo.wreckage = null // Exo sold, remove it's lootpile on qdel, or we'll have issues in cargo.... + var/check_val = calculate_sell_value(source) + if(!check_val) + if((exo.health / exo.maxhealth) < 0.5) + return "Error: The unit is too damaged to sell, and will be used as scrap. Payment rendered null under terms of agreement." + return "Error: The unit in its current condition has no resale value at all, and will be used as scrap. Payment rendered null under terms of agreement." + return null + +/datum/element/sellable/mecha/calculate_sell_value(obj/source) + var/obj/mecha/exo = source + var/amount = exo.health / 10 + amount += exo.max_temperature / 1000 + + // generic bonuses + for(var/slot in exo.internal_components) + var/obj/item/mecha_parts/component/MC = exo.internal_components[slot] + amount += MC.integrity + amount += MC.emp_resistance * 10 + + // special bonuses + if(exo.internal_components[MECH_ACTUATOR]) + var/obj/item/mecha_parts/component/actuator/MC = exo.internal_components[MECH_ACTUATOR] + amount += MC.integrity + amount += 20 * MC.strafing_multiplier + + if(exo.internal_components[MECH_ARMOR]) + var/obj/item/mecha_parts/component/armor/MC = exo.internal_components[MECH_ARMOR] + amount += MC.deflect_chance + for(var/dam in MC.damage_absorption) + amount += MC.damage_absorption[dam] * 10 + + if(exo.internal_components[MECH_ELECTRIC]) + var/obj/item/mecha_parts/component/electrical/MC = exo.internal_components[MECH_ELECTRIC] + amount += MC.integrity + amount -= 100 * MC.charge_cost_mod + + // Extra equipment + for(var/E in exo.hull_equipment) + amount += 3 + + for(var/E in exo.weapon_equipment) + amount += 3 + + for(var/E in exo.utility_equipment) + amount += 2 + + for(var/E in exo.universal_equipment) + amount += 1 + + for(var/E in exo.special_equipment) + amount += 4 + + // Don't bother somehow... + if(amount < 0) + return 0 + + // Special mech multipliers + if(istype(exo,/obj/mecha/combat/phazon)) + amount *= 30 + else if(istype(exo,/obj/mecha/combat/fighter)) // More niche + amount *= 8 + else if(istype(exo,/obj/mecha/medical)) + amount *= 11 + else if(istype(exo,/obj/mecha/combat)) + amount *= 6 + else if(istype(exo,/obj/mecha/micro)) // Teeny weenies! + amount *= 3.5 + else + amount *= 1 + + // Final health scaler + amount *= (exo.health / exo.maxhealth) + if(amount < 100) + return 0 + return FLOOR(amount,10) + + +// Selling GUNZ +/datum/element/sellable/gun/calculate_sell_value(obj/source) + var/amount = 10 + var/obj/item/gun/G = source + var/obj/item/projectile/P = initial(G.projectile_type) + + if(istype(G,/obj/item/gun/projectile)) + var/obj/item/gun/projectile/PG = G + amount += initial(PG.recoil) * 2 // We can assume bigger bang + amount += initial(PG.max_shells) * 1.5 // More shots more bang + + if(istype(G,/obj/item/gun/energy)) + var/obj/item/gun/energy/EG = G + amount += initial(EG.charge_cost) / 100 // We can assume bigger bang + + if(P) + // Default bullet breakdown + amount += initial(P.damage) / 2 + amount += initial(P.stun) + amount += initial(P.weaken) + amount += initial(P.paralyze) + amount += initial(P.irradiate) / 2 + amount += initial(P.agony) / 2 + // Stop trying to sell donksofts + if(initial(P.nodamage)) + amount /= 20 + + return FLOOR(amount,5) diff --git a/code/game/machinery/bomb_tester_vr.dm b/code/game/machinery/bomb_tester_vr.dm index 6b5b0c7090..aed85b6680 100644 --- a/code/game/machinery/bomb_tester_vr.dm +++ b/code/game/machinery/bomb_tester_vr.dm @@ -242,7 +242,7 @@ var/dev = round((mult*strength)*0.15) var/heavy = round((mult*strength)*0.35) var/light = round((mult*strength)*0.80) - simulation_results += "
Final Result: Explosive tank rupture. [dev?"Extreme damage within [2*dev] meters. ":""][heavy?"Heavy damage within [2*heavy] meters. ":""][light?"Light damage within [2*light] meters. ":""]Hazardous shrapnel produced." + simulation_results += "
Final Result: Explosive tank rupture. [dev?"Extreme damage within [dev] meters. ":""][heavy?"Heavy damage within [heavy] meters. ":""][light?"Light damage within [light] meters. ":""]Hazardous shrapnel produced." return 1 else faketank_integrity -= 7 @@ -254,9 +254,10 @@ return 1 else faketank_integrity -= 5 - + /* else if(pressure > TANK_LEAK_PRESSURE || faketank.temperature - T0C > 173) faketank_integrity -= 1 + */ return 0 /obj/machinery/bomb_tester/proc/single_tank_sim() diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm index 69c845d264..26d5c40744 100644 --- a/code/game/machinery/computer/supply.dm +++ b/code/game/machinery/computer/supply.dm @@ -15,6 +15,7 @@ var/active_category = null var/menu_tab = 0 var/list/expanded_packs = list() + var/price_mode = FALSE // Show in supply points(TRUE) or thalers(FALSE) // Supply control console /obj/machinery/computer/supplycomp/control @@ -23,7 +24,6 @@ icon_keyboard = "tech_key" icon_screen = "supply" light_color = "#b88b2e" - req_access = list(ACCESS_CARGO) circuit = /obj/item/circuitboard/supplycomp/control authorization = SUP_SEND_SHUTTLE | SUP_ACCEPT_ORDERS @@ -155,6 +155,8 @@ data["receipts"] = receipts data["contraband"] = can_order_contraband || (authorization & SUP_CONTRABAND) data["modal"] = tgui_modal_data(src) + data["price_mod"] = price_mode + data["cash_points"] = SSsupply.money_per_points return data /obj/machinery/computer/supplycomp/tgui_static_data(mob/user) @@ -483,7 +485,9 @@ if("force_shuttle") shuttle.force_launch(src) . = TRUE - + if("change_cash_mode") + price_mode = !price_mode + . = TRUE add_fingerprint(ui.user) /obj/machinery/computer/supplycomp/proc/post_signal(command) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 5b590dd779..0c543aca97 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -235,6 +235,8 @@ loc.Entered(src) GLOB.mechas_list += src //global mech list + AddElement(/datum/element/sellable/mecha) + /obj/mecha/drain_power(drain_check) if(drain_check) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 8912209e8c..76f8e3a5c1 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -10,6 +10,10 @@ var/valve_open = 0 var/toggle = 1 +/obj/item/transfer_valve/Initialize(mapload) + . = ..() + AddElement(/datum/element/sellable/transfer_valve) + /obj/item/transfer_valve/attackby(obj/item/item, mob/user) var/turf/location = get_turf(src) // For admin logs if(istype(item, /obj/item/tank)) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 7136cb6c91..fc082580d8 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -510,9 +510,10 @@ GLOBAL_LIST_EMPTY(tank_gauge_cache) log_world(span_warning("[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]")) #endif - + /* //This resulted in tanks going into negative values of integrity forever. Integrity should only be lost if the tank is moving towards exploding. else integrity-= 1 + */ else diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index a521879dda..2150cacbc7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -16,7 +16,8 @@ /obj/item/radio/headset/earbud/cargo, /obj/item/clothing/gloves/black, /obj/item/clothing/gloves/fingerless, - /obj/item/clothing/head/soft) + /obj/item/clothing/head/soft, + /obj/item/cargo_scanner) /obj/structure/closet/secure_closet/cargotech/Initialize(mapload) if(prob(75)) @@ -58,7 +59,8 @@ /obj/item/clothing/suit/storage/hooded/wintercoat/cargo, /obj/item/clothing/suit/storage/hooded/wintercoat/cargo/qm, /obj/item/clothing/head/beret/qm, - /obj/item/clothing/shoes/boots/winter/supply) + /obj/item/clothing/shoes/boots/winter/supply, + /obj/item/cargo_scanner) /obj/structure/closet/secure_closet/quartermaster/Initialize(mapload) if(prob(75)) diff --git a/code/modules/economy/cargo_point_scanner.dm b/code/modules/economy/cargo_point_scanner.dm new file mode 100644 index 0000000000..8d5f440e63 --- /dev/null +++ b/code/modules/economy/cargo_point_scanner.dm @@ -0,0 +1,49 @@ +//Device that tells you how many cargo points / thalers an item sells for +/obj/item/cargo_scanner + name = "cargo scanner" + desc = "Assess the cargo sale value of items." + icon = 'icons/obj/device.dmi' + icon_state = "retail_idle" + flags = NOBLUDGEON + slot_flags = SLOT_BELT + w_class = ITEMSIZE_SMALL + +// Always face the user when put on a table +/obj/item/cargo_scanner/afterattack(atom/movable/AM, mob/user, proximity) + if(!proximity) return + if(istype(AM, /obj/structure/table)) + src.pixel_y = 3 // Shift it up slightly to look better on table + src.dir = get_dir(src, user) + else + flick("retail_scan", src) + scan_item_price(AM,user) + +// Reset dir when picked back up +/obj/item/cargo_scanner/pickup(mob/user) + src.dir = SOUTH + src.pixel_y = 0 + +/obj/item/cargo_scanner/proc/scan_item_price(atom/movable/AM,mob/user) + if(istype(AM,/obj/effect)) + return 0 + + var/final_output = span_boldnotice("\The [src] assesses the supply point value of \the [AM]...\n") + playsound(src, 'sound/machines/beep.ogg', 50, 1) + + // Some things cannot be sold + if(isliving(AM) || isstructure(AM) || isturf(AM)) + final_output += span_danger("-Cannot be sold.") + to_chat(user,final_output) + return 0 + + // Get item value + var/value = SEND_SIGNAL(AM,COMSIG_ITEM_SCAN_PROFIT) + if(!value) + final_output += span_danger("-It's worth nothing.") + to_chat(user,final_output) + return 0 + + var/price = SSsupply.points_to_cash(value) + final_output += span_notice("-It can be sold for [value] points, or [price] [price > 1 ? "thalers" : "thaler"]") + to_chat(user,final_output) + return value diff --git a/code/modules/food/food.dm b/code/modules/food/food.dm index 64e6c28a7f..c123f9a6ea 100644 --- a/code/modules/food/food.dm +++ b/code/modules/food/food.dm @@ -38,6 +38,7 @@ if ((center_of_mass_x || center_of_mass_y) && !pixel_x && !pixel_y) src.pixel_x = rand(-6.0, 6) //Randomizes postion src.pixel_y = rand(-6.0, 6) + AddElement(/datum/element/sellable/food_snack) /obj/item/reagent_containers/food/attackby(obj/item/W, mob/user) . = ..() diff --git a/code/modules/reagents/machinery/chemalyzer.dm b/code/modules/reagents/machinery/chemalyzer.dm index 805a16103a..e2813a4d3b 100644 --- a/code/modules/reagents/machinery/chemalyzer.dm +++ b/code/modules/reagents/machinery/chemalyzer.dm @@ -96,7 +96,7 @@ subdata["addictive"] = TRUE subdata["industrial_use"] = R.industrial_use subdata["supply_points"] = R.supply_conversion_value ? R.supply_conversion_value : 0 - var/value = R.supply_conversion_value * REAGENTS_PER_SHEET * SSsupply.points_per_money + var/value = R.supply_conversion_value * REAGENTS_PER_SHEET * SSsupply.money_per_points value = FLOOR(value * 100,1) / 100 // Truncate decimals subdata["market_price"] = value subdata["sintering"] = SSinternal_wiki.assemble_sintering(GLOB.reagent_sheets[R.id]) diff --git a/code/modules/research/tg/designs/service_designs.dm b/code/modules/research/tg/designs/service_designs.dm index 467e8ce42d..327faf5c29 100644 --- a/code/modules/research/tg/designs/service_designs.dm +++ b/code/modules/research/tg/designs/service_designs.dm @@ -303,3 +303,16 @@ RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SERVICE ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_SERVICE + +/datum/design_techweb/cargo_scanner + name = "cargo scanner" + desc = "A device for scanning items for cargo value." + id = "cargo_scanner" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_STEEL = 500, MAT_GLASS = 200) + build_path = /obj/item/cargo_scanner + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SERVICE + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_SERVICE diff --git a/code/modules/research/tg/techwebs/nodes/service_nodes.dm b/code/modules/research/tg/techwebs/nodes/service_nodes.dm index 465339da46..a6b4611df5 100644 --- a/code/modules/research/tg/techwebs/nodes/service_nodes.dm +++ b/code/modules/research/tg/techwebs/nodes/service_nodes.dm @@ -28,6 +28,7 @@ // "earmuffs", "taperecorder", "recordingcassette", + "cargo_scanner", // "toy_balloon", // "pet_carrier", // "chisel", diff --git a/code/modules/xenobio/items/extracts_vr.dm b/code/modules/xenobio/items/extracts_vr.dm index e90e55489e..0449ae2f4b 100644 --- a/code/modules/xenobio/items/extracts_vr.dm +++ b/code/modules/xenobio/items/extracts_vr.dm @@ -18,6 +18,7 @@ /obj/item/slime_extract/Initialize(mapload) . = ..() create_reagents(60) + AddElement(/datum/element/sellable/slime_extract) /obj/item/slime_extract/attackby(obj/item/O, mob/user) if(istype(O, /obj/item/slimepotion/enhancer)) diff --git a/code/modules/xenobio/items/extracts_worth.dm b/code/modules/xenobio/items/extracts_worth.dm new file mode 100644 index 0000000000..7c999a9cad --- /dev/null +++ b/code/modules/xenobio/items/extracts_worth.dm @@ -0,0 +1,44 @@ +/obj/item/slime_extract + var/supply_conversion_value = 10 +/obj/item/slime_extract/metal + supply_conversion_value = 60 +/obj/item/slime_extract/blue + supply_conversion_value = 60 +/obj/item/slime_extract/purple + supply_conversion_value = 60 +/obj/item/slime_extract/orange + supply_conversion_value = 120 +/obj/item/slime_extract/yellow + supply_conversion_value = 60 +/obj/item/slime_extract/gold + supply_conversion_value = 90 +/obj/item/slime_extract/silver + supply_conversion_value = 90 +/obj/item/slime_extract/dark_purple + supply_conversion_value = 90 +/obj/item/slime_extract/dark_blue + supply_conversion_value = 120 +/obj/item/slime_extract/red + supply_conversion_value = 90 +/obj/item/slime_extract/green + supply_conversion_value = 90 +/obj/item/slime_extract/pink + supply_conversion_value = 90 +/obj/item/slime_extract/oil + supply_conversion_value = 60 +/obj/item/slime_extract/bluespace + supply_conversion_value = 90 +/obj/item/slime_extract/cerulean + supply_conversion_value = 90 +/obj/item/slime_extract/amber + supply_conversion_value = 60 +/obj/item/slime_extract/sapphire + supply_conversion_value = 90 +/obj/item/slime_extract/ruby + supply_conversion_value = 90 +/obj/item/slime_extract/emerald + supply_conversion_value = 90 +/obj/item/slime_extract/light_pink + supply_conversion_value = 90 +/obj/item/slime_extract/rainbow + supply_conversion_value = 60 diff --git a/tgui/packages/tgui/interfaces/SupplyConsole/SupplyConsoleShuttleStatus.tsx b/tgui/packages/tgui/interfaces/SupplyConsole/SupplyConsoleShuttleStatus.tsx index 5d2de85b32..b699cd00f9 100644 --- a/tgui/packages/tgui/interfaces/SupplyConsole/SupplyConsoleShuttleStatus.tsx +++ b/tgui/packages/tgui/interfaces/SupplyConsole/SupplyConsoleShuttleStatus.tsx @@ -13,7 +13,7 @@ import type { Data } from './types'; export const SupplyConsoleShuttleStatus = (props) => { const { act, data } = useBackend(); - const { supply_points, shuttle, shuttle_auth } = data; + const { supply_points, shuttle, shuttle_auth, price_mod, cash_points } = data; // Outpost 21 edit - Points or thalers let shuttle_buttons: React.JSX.Element | string = ''; let showShuttleForce = false; @@ -58,8 +58,17 @@ export const SupplyConsoleShuttleStatus = (props) => { return ( <> - - + + {' '} + +
diff --git a/vorestation.dme b/vorestation.dme index fdf699fe3c..555425f65f 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2764,6 +2764,7 @@ #include "code\modules\economy\Accounts.dm" #include "code\modules\economy\Accounts_DB.dm" #include "code\modules\economy\ATM.dm" +#include "code\modules\economy\cargo_point_scanner.dm" #include "code\modules\economy\cash.dm" #include "code\modules\economy\cash_register.dm" #include "code\modules\economy\casinocash.dm" @@ -4999,6 +5000,7 @@ #include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm" #include "code\modules\xenoarcheaology\tools\tools_pickaxe_vr.dm" #include "code\modules\xenobio\items\extracts_vr.dm" +#include "code\modules\xenobio\items\extracts_worth.dm" #include "code\modules\xenobio\items\slime_objects.dm" #include "code\modules\xenobio\items\slimepotions.dm" #include "code\modules\xenobio\items\slimepotions_vr.dm"