mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-24 20:47:43 +01:00
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
This commit is contained in:
@@ -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]! <br>"
|
||||
word_export += "There were [SSnerdle.total_players] players this shift!<br>"
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 += "<hr>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 += "<hr>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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
// "earmuffs",
|
||||
"taperecorder",
|
||||
"recordingcassette",
|
||||
"cargo_scanner",
|
||||
// "toy_balloon",
|
||||
// "pet_carrier",
|
||||
// "chisel",
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
@@ -13,7 +13,7 @@ import type { Data } from './types';
|
||||
export const SupplyConsoleShuttleStatus = (props) => {
|
||||
const { act, data } = useBackend<Data>();
|
||||
|
||||
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 (
|
||||
<>
|
||||
<LabeledList>
|
||||
<LabeledList.Item label="Supply Points">
|
||||
<AnimatedNumber value={supply_points} />
|
||||
<LabeledList.Item label="Reserve">
|
||||
{' '}
|
||||
<AnimatedNumber
|
||||
value={supply_points * (price_mod ? 1 : cash_points)}
|
||||
/>
|
||||
<Button
|
||||
tooltip={price_mod ? 'Supply Points' : 'Thalers'}
|
||||
onClick={() => act('change_cash_mode')}
|
||||
>
|
||||
{price_mod === 1 ? 'SP' : '₮'}
|
||||
</Button>
|
||||
</LabeledList.Item>
|
||||
</LabeledList>
|
||||
<Section title="Supply Shuttle" mt={2}>
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user