Skip to content

Commit fe015cb

Browse files
authored
Merge pull request #101 from Alliance-codeBase/metacoins
Metacoins 1.7
2 parents 4cafdea + bfc0683 commit fe015cb

16 files changed

Lines changed: 1880 additions & 851 deletions

File tree

SQL/tgstation_schema.sql

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,18 @@ CREATE TABLE `player` (
413413
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
414414
/*!40101 SET character_set_client = @saved_cs_client */;
415415

416+
--
417+
-- Table structure for table `metacoin_purchases`
418+
-- MASSMETA EDIT ADDITION START (metacoins)
419+
DROP TABLE IF EXISTS `metacoin_purchases`;
420+
CREATE TABLE `metacoin_purchases` (
421+
`ckey` varchar(32) NOT NULL,
422+
`listing` varchar(64) NOT NULL,
423+
`owned` tinyint(1) NOT NULL DEFAULT 1,
424+
PRIMARY KEY (`ckey`, `listing`)
425+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
426+
-- MASSMETA EDIT ADDITION END (metacoins)
427+
416428
--
417429
-- Table structure for table `poll_option`
418430
--

code/modules/deathmatch/deathmatch_controller.dm

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@
3535
entry_fee = min(max(round(text2num("[entry_fee]") || 0), 0), 1000)
3636

3737
if(entry_fee > 0)
38-
var/datum/metacoin_shop_controller/shop = get_metacoin_shop_controller()
38+
var/datum/metacoin_shop_controller/shop = get_metacoin_controller()
3939
if(!shop)
4040
return list("ok" = FALSE, "error" = "shop_unavailable")
4141

42-
var/current_balance = shop.fetch_metacoin_balance(host.ckey)
42+
var/current_balance = shop.fetch_balance(host.ckey)
4343
if(isnull(current_balance))
4444
return list("ok" = FALSE, "error" = "db_unavailable")
4545
if(current_balance < entry_fee)
@@ -52,7 +52,7 @@
5252
lobbies[host.ckey] = new_lobby
5353
deadchat_broadcast(" has opened a new deathmatch lobby. <a href=byond://?src=[REF(new_lobby)];join=1>(Join)</a>", "<B>[host]</B>")
5454
return list("ok" = TRUE)
55-
//MASSMETA EDIT CHANGE START (metacoins)
55+
//MASSMETA EDIT CHANGE END (metacoins)
5656

5757
/datum/deathmatch_controller/proc/remove_lobby(ckey)
5858
var/lobby = lobbies[ckey]

modular_meta/features/metacoins/code/award_overrides.dm

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,13 @@
7676

7777
// CLOSE_TO_NOTHING
7878

79-
// ONE_POINT
79+
// You genuinely don't want to award much for every "robot" served in kitchen. Five points is okay, in my opinion.
8080

81-
/datum/award/score/drake_score
82-
reward = METACOIN_AWARD_ONE_POINT
81+
/datum/award/score/bartender_tourist_score
8382

84-
/datum/award/score/hierophant_score
85-
reward = METACOIN_AWARD_ONE_POINT
83+
/datum/award/score/chef_tourist_score
84+
85+
// ONE_POINT
8686

8787
/datum/award/score/maintenance_pill
8888
reward = METACOIN_AWARD_ONE_POINT
@@ -101,24 +101,29 @@
101101
/datum/award/score/wendigo_score
102102
reward = METACOIN_AWARD_SMALL
103103

104-
/datum/award/score/colussus_score
104+
/datum/award/score/hardcore_random
105105
reward = METACOIN_AWARD_SMALL
106106

107-
/datum/award/score/thething_score
108-
reward = METACOIN_AWARD_SMALL
107+
/datum/award/score/style_score
108+
reward = METACOIN_AWARD_NONE
109109

110-
/datum/award/score/bartender_tourist_score
110+
/datum/award/score/drake_score
111111
reward = METACOIN_AWARD_SMALL
112112

113-
/datum/award/score/chef_tourist_score
113+
/datum/award/score/hierophant_score
114114
reward = METACOIN_AWARD_SMALL
115115

116-
/datum/award/score/hardcore_random
117-
reward = METACOIN_AWARD_SMALL
116+
// METACOIN_AWARD_MED
118117

119-
/datum/award/score/style_score
120-
reward = METACOIN_AWARD_SMALL
118+
/datum/award/score/bubblegum_score
119+
reward = METACOIN_AWARD_MED
120+
121+
/datum/award/score/colussus_score
122+
reward = METACOIN_AWARD_MED
123+
124+
// METACOIN_AWARD_BIG
125+
/datum/award/score/thething_score
126+
reward = METACOIN_AWARD_BIG //overall rare boss, why not?
121127

122-
// METACOIN_AWARD_MED
123128
/datum/award/score/legion_score
124-
reward = METACOIN_AWARD_MED // this one is hard to kill y'know?
129+
reward = METACOIN_AWARD_BIG // this one is hard to kill y'know?

modular_meta/features/metacoins/code/metacoin.dm

Lines changed: 84 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ GLOBAL_DATUM(metacoins_controller, /datum/metacoins_controller)
2020
if(.)
2121
return
2222
get_metacoins_controller()
23-
get_metacoin_shop_controller()
23+
get_metacoin_controller()
2424

2525
/datum/metacoins_controller
2626
var/list/roundstart_ready_ckeys = list()
@@ -69,12 +69,9 @@ GLOBAL_DATUM(metacoins_controller, /datum/metacoins_controller)
6969

7070
processed_ckeys[player_ckey] = TRUE
7171

72-
if(METACOIN_REWARD_SURVIVE_EVAC > 0 && is_evacuation_condition_met(player_ckey))
73-
award_metacoins(player_ckey, METACOIN_REWARD_SURVIVE_EVAC, "survived_shift", "Survived Shift")
74-
if(METACOIN_REWARD_IMPORTANT_JOBS > 0 && is_important_role(player_ckey))
75-
award_metacoins(player_ckey, METACOIN_REWARD_IMPORTANT_JOBS, "social_role", "Highly Important Role")
76-
if(METACOIN_REWARD_ANTAG_GREENTEXT > 0 && is_antag_greentext(player_ckey))
77-
award_metacoins(player_ckey, METACOIN_REWARD_ANTAG_GREENTEXT, "antag_greentext", "Antagonist Greentext")
72+
var/list/rewards = get_round_rewards(player_ckey)
73+
if(length(rewards))
74+
award_entries(player_ckey, rewards)
7875
/// Main proc for your awards. Integrate it wherever you like to
7976
///
8077
/// Arguments:
@@ -84,7 +81,7 @@ GLOBAL_DATUM(metacoins_controller, /datum/metacoins_controller)
8481
/// * reason - reason shown in reward chat message.
8582
/// * allow_repeat - If TRUE, skips source dedupe and allows payout on every call.
8683
/// * resolve_from_award_type - If TRUE, reward_value is resolved through the award datum's reward var.
87-
/// * sound - If TRUE plays a sound, check notify_player_reward_awarded
84+
/// * sound - If TRUE plays a sound, check notify_reward
8885
/// Returns TRUE when payout is persisted, FALSE otherwise.
8986
/datum/metacoins_controller/proc/award_metacoins(target_ckey, reward_value, source, reason, allow_repeat = FALSE, resolve_from_award_type = FALSE, sound = TRUE)
9087
var/amount
@@ -95,8 +92,17 @@ GLOBAL_DATUM(metacoins_controller, /datum/metacoins_controller)
9592
if(!target_ckey || amount <= 0)
9693
return FALSE
9794

98-
var/sanitized_source = source || "unknown"
99-
var/sanitized_reason = reason || "Reward"
95+
var/list/rewards = list(list(
96+
"amount" = amount,
97+
"source" = source || "unknown",
98+
"reason" = reason || "Reward",
99+
"by_award_type" = resolve_from_award_type,
100+
))
101+
return award_entries(target_ckey, rewards, allow_repeat, sound)
102+
103+
/datum/metacoins_controller/proc/award_entries(target_ckey, list/rewards, allow_repeat = FALSE, sound = TRUE)
104+
if(!target_ckey || !length(rewards))
105+
return FALSE
100106

101107
var/list/source_awards
102108
if(!allow_repeat)
@@ -105,35 +111,77 @@ GLOBAL_DATUM(metacoins_controller, /datum/metacoins_controller)
105111
source_awards = list()
106112
awarded_sources_by_ckey[target_ckey] = source_awards
107113

108-
if(source_awards[sanitized_source])
109-
return FALSE
114+
var/total_amount = 0
115+
var/list/pay_rewards = list()
116+
for(var/list/reward_entry as anything in rewards)
117+
var/amount = reward_entry["amount"] || 0
118+
if(amount <= 0)
119+
continue
120+
121+
var/sanitized_source = reward_entry["source"] || "unknown"
122+
var/sanitized_reason = reward_entry["reason"] || "Reward"
123+
if(!allow_repeat && source_awards[sanitized_source])
124+
log_game("[src] metacoin payout skipped: ckey=[target_ckey], amount=[amount], source='[sanitized_source]', reason='[sanitized_reason]', cause='duplicate source'.")
125+
continue
126+
127+
pay_rewards += list(list(
128+
"amount" = amount,
129+
"source" = sanitized_source,
130+
"reason" = sanitized_reason,
131+
"by_award_type" = reward_entry["by_award_type"] || FALSE,
132+
))
133+
total_amount += amount
134+
135+
if(total_amount <= 0)
136+
return FALSE
110137

111138
if(!SSdbcore.Connect())
139+
log_game("[src] metacoin payout failed: ckey=[target_ckey], amount=[total_amount], cause='db unavailable', rewards=[json_encode(pay_rewards)].")
112140
return FALSE
113141

114-
if(!add_metacoins(target_ckey, amount))
142+
if(!add_metacoins(target_ckey, total_amount))
143+
log_game("[src] metacoin payout failed: ckey=[target_ckey], amount=[total_amount], cause='update failed', rewards=[json_encode(pay_rewards)].")
115144
return FALSE
116145

117146
if(!allow_repeat)
118-
source_awards[sanitized_source] = TRUE
147+
for(var/list/reward_entry as anything in pay_rewards)
148+
source_awards[reward_entry["source"]] = TRUE
119149

120-
log_game("[src] metacoin payout: ckey=[target_ckey], amount=[amount], source='[sanitized_source]', reason='[sanitized_reason]', allow_repeat=[allow_repeat], by_award_type=[resolve_from_award_type].")
150+
log_game("[src] metacoin payout: ckey=[target_ckey], amount=[total_amount], allow_repeat=[allow_repeat], rewards=[json_encode(pay_rewards)].")
121151

122-
add_round_award_log_entry(target_ckey, amount, sanitized_source, sanitized_reason)
152+
for(var/list/reward_entry as anything in pay_rewards)
153+
add_round_award_log_entry(target_ckey, reward_entry["amount"], reward_entry["source"], reward_entry["reason"])
123154

124-
var/list/reward_entries = list(list(
125-
"amount" = amount,
126-
"source" = sanitized_source,
127-
"reason" = sanitized_reason,
128-
))
129-
notify_player_reward_awarded(target_ckey, amount, reward_entries, sound)
155+
notify_reward(target_ckey, total_amount, pay_rewards, sound)
130156

131157
var/mob/player_mob = get_mob_by_ckey(target_ckey)
132158
if(player_mob)
133159
SStgui.update_user_uis(player_mob)
134160

135161
return TRUE
136162

163+
/datum/metacoins_controller/proc/get_round_rewards(target_ckey)
164+
var/list/rewards = list()
165+
if(METACOIN_REWARD_SURVIVE_EVAC > 0 && is_evacuation_condition_met(target_ckey))
166+
rewards += list(list(
167+
"amount" = METACOIN_REWARD_SURVIVE_EVAC,
168+
"source" = "survived_shift",
169+
"reason" = "Survived Shift",
170+
))
171+
if(METACOIN_REWARD_IMPORTANT_JOBS > 0 && is_important_role(target_ckey))
172+
rewards += list(list(
173+
"amount" = METACOIN_REWARD_IMPORTANT_JOBS,
174+
"source" = "social_role",
175+
"reason" = "Highly Important Role",
176+
))
177+
if(METACOIN_REWARD_ANTAG_GREENTEXT > 0 && is_antag_greentext(target_ckey))
178+
rewards += list(list(
179+
"amount" = METACOIN_REWARD_ANTAG_GREENTEXT,
180+
"source" = "antag_greentext",
181+
"reason" = "Antagonist Greentext",
182+
))
183+
return rewards
184+
137185
/datum/metacoins_controller/proc/get_reward_amount(award_type)
138186
if(!ispath(award_type, /datum/award))
139187
return 0
@@ -222,7 +270,7 @@ GLOBAL_DATUM(metacoins_controller, /datum/metacoins_controller)
222270
if(!player_turf)
223271
return FALSE
224272

225-
if(player_turf.onCentCom())
273+
if(player_turf.onCentCom() || player_turf.onSyndieBase() || player_turf.on_escaped_shuttle())
226274
return TRUE
227275

228276
return !!SSshuttle.emergency.shuttle_areas[player_area]
@@ -245,13 +293,13 @@ GLOBAL_DATUM(metacoins_controller, /datum/metacoins_controller)
245293
return TRUE
246294
if(antag_datum.antag_flags & ANTAG_FAKE)
247295
continue
248-
if(!is_antag_objectives_successful(antag_datum))
296+
if(!is_greentext(antag_datum))
249297
continue
250298
return TRUE
251299

252300
return FALSE
253301

254-
/datum/metacoins_controller/proc/is_antag_objectives_successful(datum/antagonist/antag_datum)
302+
/datum/metacoins_controller/proc/is_greentext(datum/antagonist/antag_datum)
255303
if(!antag_datum)
256304
return FALSE
257305

@@ -264,7 +312,7 @@ GLOBAL_DATUM(metacoins_controller, /datum/metacoins_controller)
264312

265313
return TRUE
266314

267-
/datum/metacoins_controller/proc/notify_player_reward_awarded(target_ckey, total_reward, list/reward_entries, sound = TRUE)
315+
/datum/metacoins_controller/proc/notify_reward(target_ckey, total_reward, list/reward_entries, sound = TRUE)
268316
if(total_reward <= 0)
269317
return
270318

@@ -298,8 +346,9 @@ GLOBAL_DATUM(metacoins_controller, /datum/metacoins_controller)
298346
)
299347

300348
var/success = update_query.warn_execute(async = FALSE)
349+
var/affected = update_query.affected
301350
qdel(update_query)
302-
return success
351+
return success && affected > 0
303352

304353
/datum/metacoins_panel
305354
var/client/owner
@@ -329,7 +378,7 @@ GLOBAL_DATUM(metacoins_controller, /datum/metacoins_controller)
329378
data["roundAwardLog"] = client_ckey ? controller.get_round_award_log(client_ckey) : list()
330379
data["canOpenShop"] = TRUE
331380

332-
var/balance = fetch_metacoin_balance(client_ckey)
381+
var/balance = fetch_balance(client_ckey)
333382
data["dbConnected"] = !isnull(balance)
334383
data["balance"] = isnull(balance) ? 0 : balance
335384

@@ -346,7 +395,7 @@ GLOBAL_DATUM(metacoins_controller, /datum/metacoins_controller)
346395

347396
return FALSE
348397

349-
/datum/metacoins_panel/proc/fetch_metacoin_balance(target_ckey)
398+
/datum/metacoins_panel/proc/fetch_balance(target_ckey)
350399
if(!target_ckey)
351400
return 0
352401

@@ -392,7 +441,7 @@ ADMIN_VERB(mc_give, R_ADMIN, "Grant Metacoins", "Grant metacoins to a target cke
392441
if(!length(grant_reason))
393442
grant_reason = "Manual admin grant"
394443

395-
var/create_note = tgui_alert(user, "Include a note?", "Grant Metacoins", list("No", "Yes")) == "Yes"
444+
// var/create_note = tgui_alert(user, "Include a note?", "Grant Metacoins", list("No", "Yes")) == "Yes"
396445

397446
var/datum/metacoins_controller/controller = get_metacoins_controller()
398447
if(!controller)
@@ -409,15 +458,15 @@ ADMIN_VERB(mc_give, R_ADMIN, "Grant Metacoins", "Grant metacoins to a target cke
409458
log_admin("[key_name(user)] failed to grant [amount] metacoins to [target_ckey]. Reason='[grant_reason]'.")
410459
to_chat(user, span_warning("Failed to grant metacoins. Check SQL logs"), confidential = TRUE)
411460
return
412-
461+
/* // i've thought about it, that's kinda useless
413462
if(create_note)
414463
var/note_text = "Metacoins granted: +[amount]. Reason: [grant_reason]"
415464
create_message("note", target_ckey, user.ckey, note_text, null, null, 0, 0, null, 0, "none")
416-
417-
var/admin_msg = "[key_name_admin(user)] granted [amount] metacoins to [target_ckey]. Reason='[grant_reason]'. Auto-note=[create_note ? "yes" : "no"]."
465+
*/
466+
var/admin_msg = "[key_name_admin(user)] granted [amount] metacoins to [target_ckey]. Reason='[grant_reason]']."
418467
message_admins(admin_msg)
419-
log_admin("[key_name(user)] granted [amount] metacoins to [target_ckey]. Reason='[grant_reason]'. Auto-note=[create_note ? "yes" : "no"].")
420-
log_game("[key_name(user)] granted [amount] metacoins to [target_ckey]. Reason='[grant_reason]'. Auto-note=[create_note ? "yes" : "no"].")
468+
log_admin("[key_name(user)] granted [amount] metacoins to [target_ckey]. Reason='[grant_reason]'.")
469+
log_game("[key_name(user)] granted [amount] metacoins to [target_ckey]. Reason='[grant_reason]'].")
421470

422471
/client/verb/view_metacoins()
423472
set name = "View Metacoins"

modular_meta/features/metacoins/code/metacoin_deathmatch.dm

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
if(!player?.ckey)
44
return FALSE
55

6-
var/already_paid = text2num(fees_paid[player.ckey]) || 0
6+
var/already_paid = fees_paid[player.ckey] || 0
77
if(entry_fee <= already_paid)
88
return TRUE
99

1010
var/to_pay = entry_fee - already_paid
11-
var/datum/metacoin_shop_controller/shop = get_metacoin_shop_controller()
11+
var/datum/metacoin_shop_controller/shop = get_metacoin_controller()
1212
if(!shop)
1313
to_chat(player, span_warning("Metacoin subsystem is unavailable."))
1414
return FALSE
@@ -34,12 +34,12 @@
3434
if(!target_ckey)
3535
return FALSE
3636

37-
var/paid_amount = text2num(fees_paid[target_ckey]) || 0
37+
var/paid_amount = fees_paid[target_ckey] || 0
3838
if(paid_amount <= 0)
3939
fees_paid -= target_ckey
4040
return TRUE
4141

42-
var/datum/metacoin_shop_controller/shop = get_metacoin_shop_controller()
42+
var/datum/metacoin_shop_controller/shop = get_metacoin_controller()
4343
if(!shop || !shop.add_metacoins(target_ckey, paid_amount))
4444
log_game("Deathmatch lobby [host] failed to refund [paid_amount] metacoins to [target_ckey].")
4545
return FALSE
@@ -59,7 +59,7 @@
5959

6060
var/payout_amount = prize_pool
6161
var/list/paid_snapshot = fees_paid?.Copy() || list()
62-
var/datum/metacoin_shop_controller/shop = get_metacoin_shop_controller()
62+
var/datum/metacoin_shop_controller/shop = get_metacoin_controller()
6363

6464
if(winner_ckey && shop?.add_metacoins(winner_ckey, payout_amount))
6565
announce(span_boldnicegreen("[winner ? winner.real_name : winner_ckey] received [payout_amount] metacoins from the prize pool."))
@@ -74,7 +74,7 @@
7474
log_game("Deathmatch lobby [host] failed to pay prize pool [payout_amount] to [payout_target], trying refunds.")
7575
if(shop)
7676
for(var/paid_ckey in paid_snapshot)
77-
var/paid_amount = text2num(paid_snapshot[paid_ckey]) || 0
77+
var/paid_amount = paid_snapshot[paid_ckey] || 0
7878
if(paid_amount <= 0)
7979
continue
8080
shop.add_metacoins(paid_ckey, paid_amount)

0 commit comments

Comments
 (0)