diff --git a/code/__DEFINES/mining.dm b/code/__DEFINES/mining.dm index 18dc61c67a9..ad7c6588a55 100644 --- a/code/__DEFINES/mining.dm +++ b/code/__DEFINES/mining.dm @@ -10,3 +10,5 @@ #define ORE_HYDROGEN "metallic hydrogen" #define ORE_BAUXITE "aluminium" #define ORE_GALENA "lead" + +#define MINING_POINTS_CARRYOVER_MAX 15000 diff --git a/code/__DEFINES/persistence/cleanup.dm b/code/__DEFINES/persistence/cleanup.dm index 84a3a0b607d..0992ff18223 100644 --- a/code/__DEFINES/persistence/cleanup.dm +++ b/code/__DEFINES/persistence/cleanup.dm @@ -16,6 +16,9 @@ ABSTRACT_TYPE(/singleton/persistent_type_history_expiration_rule) ABSTRACT_TYPE(/singleton/persistent_type_history_expiration_rule/row_count) var/max_row_count = 0 +/singleton/persistent_type_history_expiration_rule/row_count/one + max_row_count = 1 + /singleton/persistent_type_history_expiration_rule/row_count/ten max_row_count = 10 diff --git a/code/__DEFINES/persistence/types.dm b/code/__DEFINES/persistence/types.dm index ac07943c4f0..b80bb041394 100644 --- a/code/__DEFINES/persistence/types.dm +++ b/code/__DEFINES/persistence/types.dm @@ -25,3 +25,4 @@ CREATE_PERSISTENT_TYPE_GENERIC(horizon_overmap_position, "SCCV Horizon sector po // ##### Persistent history with character validation CREATE_PERSISTENT_TYPE_HISTORY_CHARACTER(mining_points, "Mining yield history", "History of mining points yield of individual miners.", /singleton/persistent_type_history_expiration_rule/age/week) +CREATE_PERSISTENT_TYPE_HISTORY_CHARACTER(mining_point_balance, "Mining point balance", "History of unspent mining point balances of individual miners.", /singleton/persistent_type_history_expiration_rule/row_count/one) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index ad4dccae6a5..d31704f4601 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -244,6 +244,36 @@ id_card.citizenship = SSrecords.get_citizenship_record_name(citizenship) id_card.mob_id = WEAKREF(src) id_card.employer_faction = employer_faction + INVOKE_ASYNC(id_card, TYPE_PROC_REF(/obj/item/card/id, load_mining_points)) + +/obj/item/card/id/proc/load_mining_points() + var/mob/living/carbon/human/card_owner = mob_id?.resolve() + if(!card_owner?.character_id) + return + + var/datum/persistent_record/saved_balance = SSpersistence.historyGetLastRecord( + /singleton/persistent_type/history/character/mining_point_balance, + card_owner.character_id + ) + if(!saved_balance) + return + + mining_points = clamp(text2num(saved_balance.value), 0, MINING_POINTS_CARRYOVER_MAX) + +/obj/item/card/id/proc/save_mining_points() + var/mob/living/carbon/human/card_owner = mob_id?.resolve() + if(!card_owner?.character_id) + return + + SSpersistence.historyAddCharacterRecord( + /singleton/persistent_type/history/character/mining_point_balance, + card_owner.character_id, + "[clamp(mining_points, 0, MINING_POINTS_CARRYOVER_MAX)]" + ) + +/obj/item/card/id/proc/adjust_mining_points(amount) + mining_points = max(0, mining_points + amount) + save_mining_points() /obj/item/card/id/proc/dat() var/dat = ("
| ") diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 60fde774824..e80a2464e7c 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -189,7 +189,7 @@ if(ID) if(params["choice"] == "claim") if(points >= 0) - ID.mining_points += points + ID.adjust_mining_points(points) if(points != 0) ping("\The [src] pings, \"Point transfer complete! Transaction total: [points] points!\"") var/character_id = astype(ID.mob_id.resolve(), /mob/living/carbon/human/)?.character_id diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 79fb3bc2660..4a221e31cd8 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -148,12 +148,12 @@ GLOBAL_LIST_INIT(minevendor_list, list( if(prize.cost <= ID.mining_points) if(prize.shuttle) if(SScargo.order_mining(prize.equipment_path)) - ID.mining_points -= prize.cost + ID.adjust_mining_points(-prize.cost) to_chat(usr, SPAN_NOTICE("Order passed. Your order has been placed on the next available supply shuttle.")) else to_chat(usr, SPAN_DANGER("{ERR Code: NO_SHUTTLE_SPACE} Order failed! Please try again.")) else - ID.mining_points -= prize.cost + ID.adjust_mining_points(-prize.cost) if(prize.amount != -1) prize.amount-- new prize.equipment_path(get_turf(src)) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 689957bf9c4..538c6ee3fdb 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -868,7 +868,7 @@ if(istype(attacking_item, /obj/item/card/id)) if(points) var/obj/item/card/id/C = attacking_item - C.mining_points += points + C.adjust_mining_points(points) to_chat(user, SPAN_INFO("You transfer [points] points to \the [C].")) points = 0 else diff --git a/html/changelogs/geeves-mining_points_carryover.yml b/html/changelogs/geeves-mining_points_carryover.yml new file mode 100644 index 00000000000..7d0a9e6e7a1 --- /dev/null +++ b/html/changelogs/geeves-mining_points_carryover.yml @@ -0,0 +1,7 @@ +author: Geeves + +delete-after: True + +changes: + - rscadd: "Mining points now carry over between rounds for each character." + - balance: "Mining point carryover is capped at 15,000 points." |