Wage payouts to virtual wallets (#33537)

* Wage payouts to virtual wallets

* Wage payouts to virtual wallets

* ATMs too

* decimal patch

Co-authored-by: SECBATON GRIFFON <sage>
This commit is contained in:
SECBATON GRIFFON
2022-10-28 23:51:02 +01:00
committed by GitHub
parent c711d4585b
commit 5e25ea14fe
10 changed files with 66 additions and 10 deletions

View File

@@ -20,6 +20,7 @@ CREATE TABLE players (
disabilities INTEGER,
nanotrasen_relation TEXT,
bank_security INTEGER,
wage_ratio INTEGER,
UNIQUE ( player_ckey, player_slot )
);

View File

@@ -458,9 +458,10 @@ var/global/datum/controller/occupations/job_master
var/balance_wallet = rand(100,250)
var/bank_pref_number = H.client.prefs.bank_security
var/bank_pref = bank_security_num2text(bank_pref_number)
var/pref_wage_ratio = H.client.prefs.wage_ratio
if(centcomm_account_db)
var/wage = job.get_wage()
var/datum/money_account/M = create_account(H.real_name, balance_bank, null, wage_payout = wage, security_pref = bank_pref_number)
var/datum/money_account/M = create_account(H.real_name, balance_bank, null, wage_payout = wage, security_pref = bank_pref_number, ratio_pref = pref_wage_ratio)
if (joined_late)
latejoiner_allowance += wage + round(wage/10)

View File

@@ -253,6 +253,7 @@ log transactions
<A href='?src=\ref[src];choice=view_screen;view_screen=1'>Change account security level</a><br>
<A href='?src=\ref[src];choice=view_screen;view_screen=2'>Make transfer to another bank account</a><br>
<A href='?src=\ref[src];choice=view_screen;view_screen=3'>View transaction log</a><br>
<A href='?src=\ref[src];choice=wage_percent'>Change virtual wallet wage payout percentage</a><br>
<A href='?src=\ref[src];choice=balance_statement'>Print balance statement</a><br>
<A href='?src=\ref[src];choice=create_debit_card'>Print new debit card ($5)</a><br>
<A href='?src=\ref[src];choice=toggle_account'>Toggle account status</a><br>
@@ -284,6 +285,12 @@ log transactions
if(authenticated_account && linked_db && authenticated_account.disabled < 2)
authenticated_account.disabled = !authenticated_account.disabled
to_chat(usr, "[bicon(src)]<span class='info'>Account [authenticated_account.disabled ? "disabled" : "enabled"].</span>")
if("wage_percent")
if(authenticated_account && linked_db && authenticated_account.disabled < 2)
var/new_wage_ratio = input(usr, "Input what % of wages end up in virtual wallets, from 0-100", "Wage Percentage",authenticated_account.virtual_wallet_wage_ratio) as num
if(!isnull(new_wage_ratio))
new_wage_ratio = clamp(new_wage_ratio,0,100)
authenticated_account.virtual_wallet_wage_ratio = new_wage_ratio
if("transfer")
if(CAN_INTERACT_WITH_ACCOUNT)
var/transfer_amount = text2num(href_list["funds_amount"])

View File

@@ -58,7 +58,7 @@ var/latejoiner_allowance = 0//Added to station_allowance and reset before every
//the current ingame time (hh:mm) can be obtained by calling:
//worldtime2text()
/proc/create_account(var/new_owner_name = "Default user", var/starting_funds = 0, var/obj/machinery/account_database/source_db, var/wage_payout = 0, var/security_pref = 1, var/makehidden = FALSE, var/isStationAccount = TRUE)
/proc/create_account(var/new_owner_name = "Default user", var/starting_funds = 0, var/obj/machinery/account_database/source_db, var/wage_payout = 0, var/security_pref = 1, var/ratio_pref = 0.5, var/makehidden = FALSE, var/isStationAccount = TRUE)
//create a new account
var/datum/money_account/M = new()
@@ -68,6 +68,7 @@ var/latejoiner_allowance = 0//Added to station_allowance and reset before every
M.wage_gain = wage_payout
M.security_level = security_pref
M.hidden = makehidden
M.virtual_wallet_wage_ratio = ratio_pref
var/ourdate = ""
var/ourtime = ""
@@ -130,6 +131,7 @@ var/latejoiner_allowance = 0//Added to station_allowance and reset before every
//1 - require manual login / account number and pin
//2 - require card and manual login
var/virtual = 0
var/virtual_wallet_wage_ratio = 50
var/wage_gain = 0 // How much an account gains per 'wage' tick.
var/disabled = 0
var/hidden = FALSE

View File

@@ -105,10 +105,26 @@ If all wages are decreased bellow 100%, for example due to the AI spending all t
if(locate(Acc) in all_station_accounts)
if(Acc.wage_gain)
adjusted_wage_gain = round((Acc.wage_gain)*payroll_modifier)
Acc.money += adjusted_wage_gain
var/left_from_virtual_wallet = adjusted_wage_gain
var/decimal_wage_ratio = 0
var/list/obj/item/device/pda/matching_PDAs = list()
for(var/obj/item/device/pda/PDA in PDAs)
// Only works and does this if ID is in PDA
if(PDA?.id?.virtual_wallet)
var/datum/pda_app/balance_check/app = locate(/datum/pda_app/balance_check) in PDA.applications
if(app && app.linked_db && Acc == app.linked_db.attempt_account_access(PDA.id.associated_account_number, 0, 2, 0))
matching_PDAs.Add(PDA)
if(matching_PDAs.len)
decimal_wage_ratio = Acc.virtual_wallet_wage_ratio/100
for(var/obj/item/device/pda/PDA in matching_PDAs)
left_from_virtual_wallet -= round(adjusted_wage_gain*(decimal_wage_ratio/matching_PDAs.len))
PDA.id.virtual_wallet.money += round(adjusted_wage_gain*(decimal_wage_ratio/matching_PDAs.len))
if(round(adjusted_wage_gain*(decimal_wage_ratio/matching_PDAs.len)) > 0)
new /datum/transaction(PDA.id.virtual_wallet,"Nanotrasen employee payroll","[round(adjusted_wage_gain*(decimal_wage_ratio/matching_PDAs.len))]",station_account.owner_name)
Acc.money += left_from_virtual_wallet
if(adjusted_wage_gain > 0)
new /datum/transaction(Acc,"Nanotrasen employee payroll","[adjusted_wage_gain]",station_account.owner_name)
if(left_from_virtual_wallet > 0)
new /datum/transaction(Acc,"Nanotrasen employee payroll","[left_from_virtual_wallet]",station_account.owner_name)
else //non-station accounts get their money from magic, not that these accounts have any wages anyway
Acc.money += Acc.wage_gain

View File

@@ -198,6 +198,7 @@ var/const/MAX_SAVE_SLOTS = 16
var/nanotrasen_relation = "Neutral"
var/bank_security = 1 //for bank accounts, 0-2, no-pin,pin,pin&card
var/wage_ratio = 50
// 0 = character settings, 1 = game preferences
@@ -321,6 +322,7 @@ var/const/MAX_SAVE_SLOTS = 16
<b>Character records:</b>
[jobban_isbanned(user, "Records") ? "Banned" : "<a href=\"byond://?src=\ref[user];preference=records;record=1\">Set</a>"]<br>
<b>Bank account security preference:</b><a href ='?_src_=prefs;preference=bank_security;task=input'>[bank_security_num2text(bank_security)]</a> <br>
<b>Percent of wages sent to ID virtual wallet:</b><a href ='?_src_=prefs;preference=wage_ratio;task=input'>[wage_ratio]</a> <br>
</td><td valign='top' width='21%'>
<h3>Hair Style</h3>
<a href='?_src_=prefs;preference=h_style;task=input'>[h_style]</a><BR>
@@ -1112,6 +1114,12 @@ var/const/MAX_SAVE_SLOTS = 16
if(!isnull(new_bank_security))
bank_security = bank_security_text2num_associative[new_bank_security]
if("wage_ratio")
var/new_wage_ratio = input(user, "Input what % of wages end up in virtual wallets, from 0-100", "Character Preference",wage_ratio) as num
if(!isnull(new_wage_ratio))
new_wage_ratio = clamp(new_wage_ratio,0,100)
wage_ratio = new_wage_ratio
if("flavor_text")
flavor_text = input(user,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message

View File

@@ -208,6 +208,7 @@ SELECT
players.disabilities,
players.nanotrasen_relation,
players.bank_security,
players.wage_ratio,
jobs.player_ckey,
jobs.player_slot,
jobs.alternate_option,
@@ -291,6 +292,7 @@ AND players.player_slot = ? ;"}, ckey, slot)
disabilities = text2num(preference_list["disabilities"])
nanotrasen_relation = preference_list["nanotrasen_relation"]
bank_security = preference_list["bank_security"]
wage_ratio = preference_list["wage_ratio"]
r_hair = text2num(preference_list["hair_red"])
g_hair = text2num(preference_list["hair_green"])
@@ -341,8 +343,12 @@ AND players.player_slot = ? ;"}, ckey, slot)
nanotrasen_relation = initial(nanotrasen_relation)
if(isnull(bank_security))
bank_security = initial(bank_security)
if(isnull(wage_ratio))
wage_ratio = initial(wage_ratio)
if(!real_name)
real_name = random_name(gender,species)
wage_ratio = clamp(wage_ratio,0,100)
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body))
gender = sanitize_gender(gender)
@@ -432,17 +438,17 @@ AND players.player_slot = ? ;"}, ckey, slot)
check.Add("SELECT player_ckey FROM players WHERE player_ckey = ? AND player_slot = ?", ckey, slot)
if(check.Execute(db))
if(!check.NextRow())
q.Add("INSERT INTO players (player_ckey,player_slot,ooc_notes,real_name, random_name, gender, age, species, language, flavor_text, med_record, sec_record, gen_record, player_alt_titles, disabilities, nanotrasen_relation, bank_security, random_body)\
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
ckey, slot, metadata, real_name, be_random_name, gender, age, species, language, flavor_text, med_record, sec_record, gen_record, altTitles, disabilities, nanotrasen_relation, bank_security, be_random_body)
q.Add("INSERT INTO players (player_ckey,player_slot,ooc_notes,real_name, random_name, gender, age, species, language, flavor_text, med_record, sec_record, gen_record, player_alt_titles, disabilities, nanotrasen_relation, bank_security, wage_ratio, random_body)\
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
ckey, slot, metadata, real_name, be_random_name, gender, age, species, language, flavor_text, med_record, sec_record, gen_record, altTitles, disabilities, nanotrasen_relation, bank_security, wage_ratio, be_random_body)
if(!q.Execute(db))
message_admins("Error in save_character_sqlite [__FILE__] ln:[__LINE__] #:[q.Error()] - [q.ErrorMsg()]")
WARNING("Error in save_character_sqlite [__FILE__] ln:[__LINE__] #:[q.Error()] - [q.ErrorMsg()]")
return 0
to_chat(user, "Created Character")
else
q.Add("UPDATE players SET ooc_notes=?,real_name=?,random_name=?, gender=?,age=?,species=?,language=?,flavor_text=?,med_record=?,sec_record=?,gen_record=?,player_alt_titles=?,disabilities=?,nanotrasen_relation=?,bank_security=?,random_body=? WHERE player_ckey = ? AND player_slot = ?",\
metadata, real_name, be_random_name, gender, age, species, language, flavor_text, med_record, sec_record, gen_record, altTitles, disabilities, nanotrasen_relation, bank_security, be_random_body, ckey, slot)
q.Add("UPDATE players SET ooc_notes=?,real_name=?,random_name=?, gender=?,age=?,species=?,language=?,flavor_text=?,med_record=?,sec_record=?,gen_record=?,player_alt_titles=?,disabilities=?,nanotrasen_relation=?,bank_security=?,wage_ratio=?,random_body=? WHERE player_ckey = ? AND player_slot = ?",\
metadata, real_name, be_random_name, gender, age, species, language, flavor_text, med_record, sec_record, gen_record, altTitles, disabilities, nanotrasen_relation, bank_security, wage_ratio, be_random_body, ckey, slot)
if(!q.Execute(db))
message_admins("Error in save_character_sqlite [__FILE__] ln:[__LINE__] #:[q.Error()] - [q.ErrorMsg()]")
WARNING("Error in save_character_sqlite [__FILE__] ln:[__LINE__] #:[q.Error()] - [q.ErrorMsg()]")

View File

@@ -24,6 +24,7 @@
`disabilities` INTEGER,
`nanotrasen_relation` TEXT,
`bank_security` INTEGER,
`wage_ratio` INTEGER,
UNIQUE(player_ckey, player_slot)
);"}
if(!hasTable("players"))

View File

@@ -0,0 +1,13 @@
/datum/migration/sqlite/ss13_prefs/_029
id = 29
name = "Wage Ratio"
/datum/migration/sqlite/ss13_prefs/_029/up()
if(!hasColumn("players", "wage_ratio"))
return execute("ALTER TABLE `players` ADD COLUMN wage_ratio")
return TRUE
/datum/migration/sqlite/ss13_prefs/_029/down()
if(hasColumn("players", "wage_ratio"))
return execute("ALTER TABLE `players` DROP COLUMN wage_ratio")
return TRUE

View File

@@ -1765,6 +1765,7 @@
#include "code\modules\migrations\SS13_Prefs\026-add-fps.dm"
#include "code\modules\migrations\SS13_Prefs\027-refactor-jobs.dm"
#include "code\modules\migrations\SS13_Prefs\028-headset-sounds.dm"
#include "code\modules\migrations\SS13_Prefs\029-wage-ratio.dm"
#include "code\modules\migrations\SS13_Prefs\_base.dm"
#include "code\modules\mining\abandonedcrates.dm"
#include "code\modules\mining\debug_shit.dm"