diff --git a/config/config.txt b/config/config.txt index 6d94e27560..897967be2e 100644 --- a/config/config.txt +++ b/config/config.txt @@ -42,3 +42,4 @@ $include entries/vote.txt $include plushies/defines.txt # Special Sandstorm configs $include sandstorm/config.txt +$include sandstorm/balance.txt diff --git a/config/sandstorm/balance.txt b/config/sandstorm/balance.txt new file mode 100644 index 0000000000..1268cb1904 --- /dev/null +++ b/config/sandstorm/balance.txt @@ -0,0 +1,59 @@ +# Special Sandstorm balance config! + +### +## CRYPTOMINER +### + +## Should cryptominers work in non-atmos turf (ex. space)? +## Uncomment this to disable atmos processing (cheat mode) +#CRYPTO_IGNORE_ATMOS + +## What point multiplier should cryptominers use? +## Determined by heat level, or uses MAX in cheat mode +CRYPTO_MULTIPLIER_MIN 0.2 +CRYPTO_MULTIPLIER_MID 1 +CRYPTO_MULTIPLIER_MAX 3 + +## What heat thresholds should cryptominers use? +## This is measured in Kelvins +CRYPTO_HEAT_THRESHOLD_MIN 225 +CRYPTO_HEAT_THRESHOLD_MID 273 +CRYPTO_HEAT_THRESHOLD_MAX 500 + +## How much heat should cryptominers produce? +## This amount is added to the environment on process +CRYPTO_HEAT_POWER 100 + +## How long between cryptominers producing resources? +## Currently unimplemented! +CRYPTO_MINING_TIME 3000 + +## What material amount should the cryptominers produce? +## This is modified by the MULTIPLIER value +## Currently unimplemented! +CRYPTO_PAYOUT_AMOUNT 50 + +## How much power should the cryptominer use? +## Currently unimplemented! +CRYPTO_POWER_USE_IDLE 20 +CRYPTO_POWER_USE_ACTIVE 200 +CRYPTO_POWER_USE_PROCESS 20 + +### +## AUTODOC +### + +## How long should the autodoc take to perform surgery? +## This is modified by stock part ratings +AUTODOC_TIME_SURGERY_BASE 350 + +### +## BLUESPACE MINER +### + +## How much should the bluespace miner produce, compared to normal? +## This is modified by stock part ratings +BLUESPACEMINER_MULT_OUTPUT 1 + +## What is the minimum stock part tier to produce bluespace crystals? +BLUESPACEMINER_CRYSTAL_TIER 5 diff --git a/modular_sand/code/controllers/configuration/entries/sandstorm_balance.dm b/modular_sand/code/controllers/configuration/entries/sandstorm_balance.dm new file mode 100644 index 0000000000..f739dec7b1 --- /dev/null +++ b/modular_sand/code/controllers/configuration/entries/sandstorm_balance.dm @@ -0,0 +1,66 @@ +/// CRYPTOMINERS /// +// Should cryptominers work in non-atmos turf +/datum/config_entry/flag/crypto_ignore_atmos + +// Cryptominer point multipliers +/datum/config_entry/number/crypto_multiplier_min + config_entry_value = 0.20 + integer = FALSE + +/datum/config_entry/number/crypto_multiplier_mid + config_entry_value = 1 + integer = FALSE + +/datum/config_entry/number/crypto_multiplier_max + config_entry_value = 3 + integer = FALSE + +// Cryptominer heat thresholds +/datum/config_entry/number/crypto_heat_threshold_min + config_entry_value = 225 + +/datum/config_entry/number/crypto_heat_threshold_mid + config_entry_value = 273 + +/datum/config_entry/number/crypto_heat_threshold_max + config_entry_value = 500 + +// Cryptominer heat produced +/datum/config_entry/number/crypto_heat_power + config_entry_value = 100 + +/* + * The contained configuration values are currently unimplemented + * +// Cryptominer processing time +/datum/config_entry/number/crypto_mining_time + config_entry_value = 3000 + +// Cryptominer base payout +/datum/config_entry/number/crypto_payout_amount + config_entry_value = 50 + +// Cryptominer power use +/datum/config_entry/number/crypto_power_use_idle + config_entry_value = 20 + +/datum/config_entry/number/crypto_power_use_active + config_entry_value = 200 + +/datum/config_entry/number/crypto_power_use_process + config_entry_value = 20 +*/ + +/// AUTODOC /// +// Autodoc processing time +/datum/config_entry/number/autodoc_time_surgery_base + config_entry_value = 350 + +/// BLUESPACE MINER /// +// BSM production output multiplier +/datum/config_entry/number/bluespaceminer_mult_output + config_entry_value = 1 + +// BSM minimum tier for bluespace crystals +/datum/config_entry/number/bluespaceminer_crystal_tier + config_entry_value = 5 diff --git a/modular_sand/code/game/machinery/autodoc.dm b/modular_sand/code/game/machinery/autodoc.dm index fcd00555c4..d4d266200b 100644 --- a/modular_sand/code/game/machinery/autodoc.dm +++ b/modular_sand/code/game/machinery/autodoc.dm @@ -1,3 +1,6 @@ +// Configuration defines +#define AUTODOC_TIME_BASE CONFIG_GET(number/autodoc_time_surgery_base) + /obj/machinery/autodoc name = "autodoc" desc = "An advanced machine used for inserting organs and implants into the occupant." @@ -17,8 +20,11 @@ . = ..() update_icon() + // Set initial time based on config + surgerytime = max(AUTODOC_TIME_BASE,10) + /obj/machinery/autodoc/RefreshParts() - var/max_time = 350 + var/max_time = AUTODOC_TIME_BASE for(var/obj/item/stock_parts/L in component_parts) max_time -= (L.rating*10) surgerytime = max(max_time,10) @@ -165,3 +171,5 @@ return obj_flags |= EMAGGED to_chat(user, span_warning("You reprogram [src]'s surgery procedures.")) + +#undef AUTODOC_TIME_BASE diff --git a/modular_sand/code/game/machinery/cryptominers.dm b/modular_sand/code/game/machinery/cryptominers.dm index 33f87a8e9f..6738511b4f 100644 --- a/modular_sand/code/game/machinery/cryptominers.dm +++ b/modular_sand/code/game/machinery/cryptominers.dm @@ -1,3 +1,22 @@ +// Configuration defines +/* + * Some entries are currently unimplemented + * +#define CRYPTO_POWER_USE CONFIG_GET(number/crypto_power_use_process) +#define CRYPTO_POWER_IDLE CONFIG_GET(number/crypto_power_use_idle) +#define CRYPTO_POWER_ACTIVE CONFIG_GET(number/crypto_power_use_active) +#define CRYPTO_MININGTIME CONFIG_GET(number/crypto_mining_time) +#define CRYPTO_MININGPOINTS CONFIG_GET(number/crypto_payout_amount) +*/ +#define CRYPTO_TEMP_MIN CONFIG_GET(number/crypto_heat_threshold_min) +#define CRYPTO_TEMP_MID CONFIG_GET(number/crypto_heat_threshold_mid) +#define CRYPTO_TEMP_MAX CONFIG_GET(number/crypto_heat_threshold_max) +#define CRYPTO_MULT_MIN CONFIG_GET(number/crypto_multiplier_min) +#define CRYPTO_MULT_MID CONFIG_GET(number/crypto_multiplier_mid) +#define CRYPTO_MULT_MAX CONFIG_GET(number/crypto_multiplier_max) +#define CRYPTO_HEATING_POWER CONFIG_GET(number/crypto_heat_power) +#define CRYPTO_IGNORE_ATMOS CONFIG_GET(flag/crypto_ignore_atmos) + /obj/machinery/cryptominer name = "cryptocurrency miner" desc = "This handy-dandy machine will produce credits for your enjoyment." @@ -12,11 +31,6 @@ var/mining = FALSE var/miningtime = 3000 var/miningpoints = 50 - var/mintemp = TCRYO // 225K equals approximately -55F or -48C - var/midtemp = T0C // 273K equals 32F or 0C - var/maxtemp = 500 // 500K equals approximately 440F or 226C - var/heatingPower = 100 // Heat added each processing - var/require_conductivity = TRUE // Prevent use in space var/datum/bank_account/pay_me = null /obj/machinery/cryptominer/Initialize(mapload) @@ -59,7 +73,7 @@ return to_chat(user, span_notice("You link \the [CARD] to \the [src].")) pay_me = CARD.registered_account - say("Now using [pay_me.account_holder ? "[pay_me.account_holder]'s" : span_boldwarning("ERROR")] account.") + say("Now using [pay_me.account_holder ? "[pay_me.account_holder]s" : span_boldwarning("ERROR")] account.") return /obj/machinery/cryptominer/AltClick(mob/user) @@ -68,13 +82,13 @@ balloon_alert(user, "resetting") if(do_after(user, 5 SECONDS, target = src)) pay_me = SSeconomy.get_dep_account(ACCOUNT_CAR) - say("Now using [pay_me.account_holder]'s account.") + say("Now using [pay_me.account_holder]s account.") /obj/machinery/cryptominer/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += span_notice("A little screen on the machine reads: Currently the linked bank account is [pay_me.account_holder ? "[pay_me.account_holder]'s" : span_boldwarning("ERROR")].") - . += "Modify the destination of the credits using your id on it while it is inactive and has it's panel open." + . += span_notice("A little screen on the machine reads: Currently the linked bank account is [pay_me.account_holder ? "[pay_me.account_holder]s" : span_boldwarning("ERROR")].") + . += "Modify the destination of the credits using your id on it while it is inactive and has its panel open." . += "Alt-Click to reset to the Cargo budget." /obj/machinery/cryptominer/process() @@ -85,18 +99,19 @@ // Check for tiles with no conductivity (space) if(T.thermal_conductivity == 0) + // Cheat mode: Skip all atmos code and give points + // Placed first, as servers are more likely to use it + if(CRYPTO_IGNORE_ATMOS) + produce_points(CRYPTO_MULT_MAX) + return + // Normal mode: Warn the user and stop processing - if(require_conductivity) + else say("Invalid atmospheric conditions detected! Shutting off!") playsound(loc, 'sound/machines/beep.ogg', 50, TRUE, -1) set_mining(FALSE) return - // Cheat mode: Skip all atmos code and give points - else - produce_points(3) - return - // Get air var/datum/gas_mixture/env = T.return_air() if(!env) @@ -105,24 +120,29 @@ // Get temp var/env_temp = env.return_temperature() + // Define temperature settings + var/temp_min = CRYPTO_TEMP_MIN // 225K equals approximately -55F or -48C + var/temp_mid = CRYPTO_TEMP_MID // 273K equals 32F or 0C + var/temp_max = CRYPTO_TEMP_MAX // 500K equals approximately 440F or 226C + // Check for temperature effects // Minimum (most likely) - if(env_temp <= mintemp) - produce_points(3) + if(env_temp <= temp_min) + produce_points(CRYPTO_MULT_MAX) // Mid - else if((env_temp <= midtemp) && (env_temp >= mintemp)) - produce_points(1) + else if((env_temp <= temp_mid) && (env_temp >= temp_min)) + produce_points(CRYPTO_MULT_MID) // Maximum - else if((env_temp <= maxtemp) && (env_temp >= midtemp)) - produce_points(0.20) + else if((env_temp <= temp_max) && (env_temp >= temp_mid)) + produce_points(CRYPTO_MULT_MIN) // Overheat - else if(env_temp >= maxtemp) + else if(env_temp >= temp_max) say("Critical overheating detected! Shutting off!") playsound(loc, 'sound/machines/beep.ogg', 50, TRUE, -1) set_mining(FALSE) - // Increase heat by heatingPower - env.set_temperature(env_temp + heatingPower) + // Increase heat by heating_power + env.set_temperature(env_temp + CRYPTO_HEATING_POWER) // Update air air_update_turf() @@ -148,15 +168,25 @@ set_mining(TRUE) /obj/machinery/cryptominer/proc/set_mining(new_value) + // Check if status changed if(new_value == mining) return //No changes - mining = new_value - if(mining) - START_PROCESSING(SSmachines, src) - else - STOP_PROCESSING(SSmachines, src) - update_icon() + // Set status new value + mining = new_value + + // Check if mining should run + if(mining) + // Start processing + START_PROCESSING(SSmachines, src) + + // Mining should not run + else + // Stop processing + STOP_PROCESSING(SSmachines, src) + + // Update machine icon + update_icon() /obj/machinery/cryptominer/syndie name = "syndicate cryptocurrency miner" @@ -198,3 +228,21 @@ icon_state = "loop_nano" else icon_state = "on_nano" + +/* + * Some entries are currently unimplemented + * +#undef CRYPTO_POWER_USE +#undef CRYPTO_POWER_IDLE +#undef CRYPTO_POWER_ACTIVE +#undef CRYPTO_MININGTIME +#undef CRYPTO_MININGPOINTS +*/ +#undef CRYPTO_TEMP_MIN +#undef CRYPTO_TEMP_MID +#undef CRYPTO_TEMP_MAX +#undef CRYPTO_MULT_MIN +#undef CRYPTO_MULT_MID +#undef CRYPTO_MULT_MAX +#undef CRYPTO_HEATING_POWER +#undef CRYPTO_IGNORE_ATMOS diff --git a/modular_sand/code/modules/mining/machine_bluespaceminer.dm b/modular_sand/code/modules/mining/machine_bluespaceminer.dm index 9241f8745e..80fd0dadd9 100644 --- a/modular_sand/code/modules/mining/machine_bluespaceminer.dm +++ b/modular_sand/code/modules/mining/machine_bluespaceminer.dm @@ -1,3 +1,7 @@ +// Configuration defines +#define BLUESPACE_MINER_BONUS_MULT CONFIG_GET(number/bluespaceminer_mult_output) +#define BLUESPACE_MINER_CRYSTAL_TIER CONFIG_GET(number/bluespaceminer_crystal_tier) + /obj/machinery/mineral/bluespace_miner name = "bluespace mining machine" desc = "A machine that uses the magic of Bluespace to slowly generate materials and add them to a linked ore silo." @@ -8,7 +12,16 @@ circuit = /obj/item/circuitboard/machine/bluespace_miner layer = BELOW_OBJ_LAYER init_process = TRUE - var/list/ore_rates = list(/datum/material/iron = 0.3, /datum/material/glass = 0.3, /datum/material/plasma = 0.1, /datum/material/silver = 0.1, /datum/material/gold = 0.05, /datum/material/titanium = 0.05, /datum/material/uranium = 0.05, /datum/material/diamond = 0.02) + var/list/ore_rates = list( + /datum/material/iron = 0.3, + /datum/material/glass = 0.3, + /datum/material/plasma = 0.1, + /datum/material/silver = 0.1, + /datum/material/gold = 0.05, + /datum/material/titanium = 0.05, + /datum/material/uranium = 0.05, + /datum/material/diamond = 0.02 + ) var/datum/component/remote_materials/materials var/multiplier = 0 //Multiplier by tier, has been made fair and everything @@ -16,11 +29,14 @@ . = ..() materials = AddComponent(/datum/component/remote_materials, "bsm", mapload) + // Set initial multiplier based on config + multiplier *= BLUESPACE_MINER_BONUS_MULT + /obj/machinery/mineral/bluespace_miner/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) . += span_notice("A small screen on the machine reads, \"Efficiency at [multiplier * 100]%\"") - if(multiplier >= 5) + if(multiplier >= BLUESPACE_MINER_CRYSTAL_TIER) . += span_notice("Bluespace generation is active.") if(!anchored) . += span_warning("The machine won't work while not firmly secured to the ground.") @@ -38,11 +54,14 @@ multiplier += L.rating stock_amt++ multiplier /= stock_amt - if(multiplier >= 5) + if(multiplier >= BLUESPACE_MINER_CRYSTAL_TIER) ore_rates[/datum/material/bluespace] = 0.01 else ore_rates -= /datum/material/bluespace + // Apply config multiplier here to not interfere with bluespace material check + multiplier *= BLUESPACE_MINER_BONUS_MULT + /obj/machinery/mineral/bluespace_miner/Destroy() materials = null return ..() @@ -108,3 +127,6 @@ if(default_unfasten_wrench(user, I)) return TRUE return FALSE + +#undef BLUESPACE_MINER_BONUS_MULT +#undef BLUESPACE_MINER_CRYSTAL_TIER diff --git a/tgstation.dme b/tgstation.dme index 7662909375..a5582efdfc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3910,6 +3910,7 @@ #include "modular_sand\code\_onclick\hud\hud.dm" #include "modular_sand\code\_onclick\hud\screen_objects.dm" #include "modular_sand\code\controllers\configuration\entries\sandstorm.dm" +#include "modular_sand\code\controllers\configuration\entries\sandstorm_balance.dm" #include "modular_sand\code\controllers\subsystem\interactions.dm" #include "modular_sand\code\controllers\subsystem\job.dm" #include "modular_sand\code\controllers\subsystem\language.dm"