From 0ed79656bfbbc519d12a4fae4c43af09fc862cde Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Thu, 10 Apr 2025 00:27:28 -0400 Subject: [PATCH] Adds a sports betting/polling app (#90421) Adds a new PDA app that allows you to create polls that people can bet on with credits, the owner can then lock the bets, decide what the answer is (up to the player for whatever poll they made), and send it off, giving the money the losers bet into the accounts of the winners. It's a small PDA app that currently doesn't make any announcements or come preinstalled in anything, but that's subject to change. PDA screen sprite is codersprited. Video demonstration https://github.com/user-attachments/assets/449e1f0b-7fd3-4948-bff8-2793af831360 Not shown (as I added later), it now uses newscasters as well. ![image](https://github.com/user-attachments/assets/d3defa60-03cc-4557-98b7-b4088b158b3d) https://forums.tgstation13.org/viewtopic.php?t=38278 Allows people to host polls for station events, allowing for the SS13 version of sports betting. :cl: add: Adds a new sports betting app on your PDA, you can now host and vote on polls using in-game credits. /:cl: --------- Co-authored-by: san7890 --- code/__DEFINES/announcements.dm | 4 + code/__HELPERS/priority_announce.dm | 6 +- code/controllers/subsystem/economy.dm | 2 +- .../machinery/newscaster/newscaster_data.dm | 16 +- .../newscaster/newscaster_machine.dm | 8 +- code/game/machinery/requests_console.dm | 2 +- .../file_system/programs/betting.dm | 285 ++++++++++++++++++ icons/obj/devices/modular_pda.dmi | Bin 24000 -> 25261 bytes tgstation.dme | 1 + .../tgui/interfaces/NtosSpaceBetting.tsx | 263 ++++++++++++++++ 10 files changed, 573 insertions(+), 14 deletions(-) create mode 100644 code/modules/modular_computers/file_system/programs/betting.dm create mode 100644 tgui/packages/tgui/interfaces/NtosSpaceBetting.tsx diff --git a/code/__DEFINES/announcements.dm b/code/__DEFINES/announcements.dm index 3a2edf6d6f7..b40303514ea 100644 --- a/code/__DEFINES/announcements.dm +++ b/code/__DEFINES/announcements.dm @@ -5,3 +5,7 @@ #define ANNOUNCEMENT_TYPE_CAPTAIN "Captain" /// Make it sound like it's coming from the Syndicate #define ANNOUNCEMENT_TYPE_SYNDICATE "Syndicate" + +//Defines for newscaster news stations, the defined thing is what it'll be called in the Newscaster. +#define NEWSCASTER_STATION_ANNOUNCEMENTS "Station Announcements" +#define NEWSCASTER_SPACE_BETTING "SpaceBet" diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm index 3e458bbb33f..e49001b4e72 100644 --- a/code/__HELPERS/priority_announce.dm +++ b/code/__HELPERS/priority_announce.dm @@ -63,7 +63,7 @@ header += SUBHEADER_ANNOUNCEMENT_TITLE(title) if(ANNOUNCEMENT_TYPE_CAPTAIN) header = MAJOR_ANNOUNCEMENT_TITLE("Captain's Announcement") - GLOB.news_network.submit_article(text, "Captain's Announcement", "Station Announcements", null) + GLOB.news_network.submit_article(text, "Captain's Announcement", NEWSCASTER_STATION_ANNOUNCEMENTS, null) if(ANNOUNCEMENT_TYPE_SYNDICATE) header = MAJOR_ANNOUNCEMENT_TITLE("Syndicate Captain's Announcement") else @@ -87,9 +87,9 @@ if(isnull(sender_override) && players == GLOB.player_list) if(length(title) > 0) - GLOB.news_network.submit_article(title + "

" + text, "[command_name()]", "Station Announcements", null) + GLOB.news_network.submit_article(title + "

" + text, "[command_name()]", NEWSCASTER_STATION_ANNOUNCEMENTS, null) else - GLOB.news_network.submit_article(text, "[command_name()] Update", "Station Announcements", null) + GLOB.news_network.submit_article(text, "[command_name()] Update", NEWSCASTER_STATION_ANNOUNCEMENTS, null) /proc/print_command_report(text = "", title = null, announce=TRUE) if(!title) diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index aed9222b40d..9aff9693914 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -191,7 +191,7 @@ SUBSYSTEM_DEF(economy) update_alerts = TRUE inflict_moneybags(moneybags) earning_report += "That's all from the Nanotrasen Economist Division." - GLOB.news_network.submit_article(earning_report, "Station Earnings Report", "Station Announcements", null, update_alert = update_alerts) + GLOB.news_network.submit_article(earning_report, "Station Earnings Report", NEWSCASTER_STATION_ANNOUNCEMENTS, null, update_alert = update_alerts) return TRUE /** diff --git a/code/game/machinery/newscaster/newscaster_data.dm b/code/game/machinery/newscaster/newscaster_data.dm index 3b3287b2513..d67e7e99365 100644 --- a/code/game/machinery/newscaster/newscaster_data.dm +++ b/code/game/machinery/newscaster/newscaster_data.dm @@ -185,7 +185,8 @@ GLOBAL_LIST_EMPTY(request_list) var/message_count = 0 /datum/feed_network/New() - create_feed_channel("Station Announcements", "SS13", "Company news, staff announcements, and all the latest information. Have a secure shift!", locked = TRUE, hardset_channel = 1000) + create_feed_channel(NEWSCASTER_STATION_ANNOUNCEMENTS, "SS13", "Company news, staff announcements, and all the latest information. Have a secure shift!", locked = TRUE, hardset_channel = 1000) + create_feed_channel(NEWSCASTER_SPACE_BETTING, "NtOS", "News from the SpaceBet PDA App! Download now and make your own bets!", locked = TRUE, hardset_channel = 1001) wanted_issue = new /datum/wanted_message /datum/feed_network/proc/create_feed_channel(channel_name, author, desc, locked, adminChannel = FALSE, hardset_channel = null, author_ckey = null, cross_sector = FALSE, cross_sector_delay = null, receiving_cross_sector = FALSE) @@ -236,7 +237,6 @@ GLOBAL_LIST_EMPTY(request_list) newMsg.parent_ID = channel.channel_ID if (!channel.cross_sector) break - // Newscaster articles could be huge, and usefulness of first 50 symbols is dubious message_admins(span_adminnotice("Outgoing cross-sector newscaster article by [key_name(author_mob) || author] in channel [channel_name].")) var/list/payload = list( @@ -249,6 +249,18 @@ GLOBAL_LIST_EMPTY(request_list) for(var/obj/machinery/newscaster/caster in GLOB.allCasters) caster.news_alert(channel_name, update_alert) + return newMsg + +///Submits a comment on the news network +/datum/feed_network/proc/submit_comment(mob/user, comment_text, newscaster_username, datum/feed_message/current_message) + var/datum/feed_comment/new_feed_comment = new/datum/feed_comment + new_feed_comment.author = newscaster_username + new_feed_comment.body = comment_text + new_feed_comment.time_stamp = station_time_timestamp() + GLOB.news_network.last_action ++ + current_message.comments += new_feed_comment + if(user) + user.log_message("(as [newscaster_username]) commented on message [current_message.return_body(-1)] -- [current_message.body]", LOG_COMMENT) /datum/feed_network/proc/submit_wanted(criminal, body, scanned_user, datum/picture/picture, adminMsg = FALSE, newMessage = FALSE) wanted_issue.active = TRUE diff --git a/code/game/machinery/newscaster/newscaster_machine.dm b/code/game/machinery/newscaster/newscaster_machine.dm index da243f81a35..208166ef231 100644 --- a/code/game/machinery/newscaster/newscaster_machine.dm +++ b/code/game/machinery/newscaster/newscaster_machine.dm @@ -741,13 +741,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) if(!newscaster_username) creating_comment = FALSE return TRUE - var/datum/feed_comment/new_feed_comment = new/datum/feed_comment - new_feed_comment.author = newscaster_username - new_feed_comment.body = comment_text - new_feed_comment.time_stamp = station_time_timestamp() - GLOB.news_network.last_action ++ - current_message.comments += new_feed_comment - user.log_message("(as [newscaster_username]) commented on message [current_message.return_body(-1)] -- [current_message.body]", LOG_COMMENT) + GLOB.news_network.submit_comment(user, comment_text, newscaster_username, current_message) creating_comment = FALSE /** diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 394ed99e9dd..60ad61f8cf5 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -191,7 +191,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) message = L.treat_message(message)["message"] minor_announce(message, "[department] Announcement:", html_encode = FALSE, sound_override = ANNOUNCER_DEPARTMENTAL) // SKYRAT EDIT CHANGE - Announcer Sounds - GLOB.news_network.submit_article(message, department, "Station Announcements", null) + GLOB.news_network.submit_article(message, department, NEWSCASTER_STATION_ANNOUNCEMENTS, null) usr.log_talk(message, LOG_SAY, tag="station announcement from [src]") message_admins("[ADMIN_LOOKUPFLW(usr)] has made a station announcement from [src] at [AREACOORD(usr)].") deadchat_broadcast(" made a station announcement from [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type=DEADCHAT_ANNOUNCEMENT) diff --git a/code/modules/modular_computers/file_system/programs/betting.dm b/code/modules/modular_computers/file_system/programs/betting.dm new file mode 100644 index 00000000000..19b47dd89d2 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/betting.dm @@ -0,0 +1,285 @@ +GLOBAL_LIST_EMPTY_TYPED(active_bets, /datum/active_bet) + +///Max amount of characters you can have in an active bet's title +#define MAX_LENGTH_TITLE 64 +///Max amount of characters you can have in an active bet's description +#define MAX_LENGTH_DESCRIPTION 200 + +/datum/computer_file/program/betting + filename = "betting" + filedesc = "SpaceBet" + downloader_category = PROGRAM_CATEGORY_GAMES + program_open_overlay = "gambling" + extended_desc = "A multi-platform network for placing requests across the station, with payment across the network being possible." + program_flags = PROGRAM_ON_NTNET_STORE | PROGRAM_REQUIRES_NTNET + can_run_on_flags = PROGRAM_PDA + size = 4 + tgui_id = "NtosSpaceBetting" + program_icon = "dice" + + ///The active bet this program made, as we can only have 1 going at a time to prevent flooding/spam. + var/datum/active_bet/created_bet + +/datum/computer_file/program/betting/New() + . = ..() + RegisterSignal(src, COMSIG_COMPUTER_FILE_DELETE, PROC_REF(on_delete)) + +///Called when we're deleted, we'll be taking the bet with us. +/datum/computer_file/program/betting/proc/on_delete(datum/source, obj/item/modular_computer/computer_uninstalling) + SIGNAL_HANDLER + + created_bet.payout() + QDEL_NULL(created_bet) + +/datum/computer_file/program/betting/ui_data(mob/user) + var/list/data = list() + data["active_bets"] = list() + for(var/datum/active_bet/bets as anything in GLOB.active_bets) + data["active_bets"] += list(list( + "name" = bets.name, + "description" = bets.description, + "owner" = bets == created_bet, + "creator" = bets.bet_owner, + "current_bets" = bets.get_bets(computer.computer_id_slot?.registered_account), + "locked" = bets.locked, + )) + + data["can_create_bet"] = !!isnull(created_bet) + if(isnull(computer.computer_id_slot)) + data["bank_name"] = null + data["bank_money"] = null + else + data["bank_name"] = computer.computer_id_slot.registered_account.account_holder + data["bank_money"] = computer.computer_id_slot.registered_account.account_balance + + return data + +/datum/computer_file/program/betting/ui_static_data(mob/user) + var/list/data = list() + data["max_title_length"] = MAX_LENGTH_TITLE + data["max_description_length"] = MAX_LENGTH_DESCRIPTION + return data + +/datum/computer_file/program/betting/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + var/mob/user = ui.user + if(isnull(computer.computer_id_slot)) + to_chat(user, span_danger("\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning.")) + return + switch(action) + if("create_bet") + var/title = reject_bad_name(params["title"], allow_numbers = TRUE, max_length = MAX_LENGTH_TITLE, cap_after_symbols = FALSE) + var/description = reject_bad_name(params["description"], allow_numbers = TRUE, max_length = MAX_LENGTH_DESCRIPTION, cap_after_symbols = FALSE) + if(isnull(title) || isnull(description)) + return + var/list/options = list(params["option1"], params["option2"], params["option3"], params["option4"]) + for(var/option in options) + options -= option + //remove nulls, empty, and duplicates. + if(isnull(option) || option == "" || options.Find(option)) + continue + options += option + option = reject_bad_name(option, allow_numbers = TRUE, max_length = MAX_LENGTH_TITLE, cap_after_symbols = FALSE) + if(length(options) < 2) + to_chat(user, span_danger("2 options minimum required to start a bet.")) + return + created_bet = new(user, title, description, options) + return TRUE + if("place_bet") + var/datum/active_bet/bet_placed_on + for(var/datum/active_bet/bets as anything in GLOB.active_bets) + if(bets.name == params["bet_selected"]) + bet_placed_on = bets + //can't bet on your own bet + if(isnull(bet_placed_on)) + return + if(bet_placed_on == created_bet) + to_chat(user, span_danger("You can't bet on your own poll!")) + return + var/money_betting = params["money_betting"] + if(!isnum(money_betting)) + return + var/option = params["option_selected"] + if(isnull(bet_placed_on)) + return + bet_placed_on.bet_money(computer.computer_id_slot.registered_account, money_betting, option) + return TRUE + if("cancel_bet") + var/datum/active_bet/bet_cancelling + for(var/datum/active_bet/bets as anything in GLOB.active_bets) + if(bets.name == params["bet_selected"]) + bet_cancelling = bets + bet_cancelling.cancel_bet(computer.computer_id_slot.registered_account) + return TRUE + if("select_winner") + var/datum/active_bet/bets_ending + for(var/datum/active_bet/bets as anything in GLOB.active_bets) + if(bets.name == params["bet_selected"]) + bets_ending = bets + if(isnull(bets_ending) || bets_ending != created_bet) + return + created_bet.payout(params["winning_answer"]) + QDEL_NULL(created_bet) + return TRUE + if("lock_betting") + var/datum/active_bet/bet_locking + for(var/datum/active_bet/bets as anything in GLOB.active_bets) + if(bets.name == params["bet_selected"]) + bet_locking = bets + if(bet_locking != created_bet) + return + bet_locking.locked = TRUE + +/** + * The active bet that our app will create & use, handles following who owns the bet, + * who is betting, and also takes care of paying out at the end. + */ +/datum/active_bet + ///The person owning the bet, who will choose which option has won. + var/bet_owner + ///The name of the bet + var/name + ///The description of the bet + var/description + ///Boolean on whether the bet is locked from getting new betters, or current ones from taking their money out. + var/locked + ///Total amount of money that has been bet. + var/total_amount_bet + /** Assoc list of options, with each option having a list of people betting and the amount they've bet. + options = list( + OPTION_A = list( + PERSON_1_ACCOUNT = bet_amount, + PERSON_2_ACCOUNT = bet_amount, + ), + OPTION_B = list( + PERSON_3_ACCOUNT = bet_amount, + ), + ) + */ + var/list/options + + ///The message we sent to the newscaster, which we'll then reply to once the betting is over. + var/datum/feed_message/newscaster_message + +/datum/active_bet/New(creator, name, description, options) + src.bet_owner = creator + src.name = name + src.description = description + src.options = options + GLOB.active_bets += src + for(var/option in options) + if(!length(options[option])) + options[option] = list() + //we'll only advertise it on the first bet of the round, as to not make this overly annoying. + var/should_alert = FALSE + for(var/datum/feed_channel/FC in GLOB.news_network.network_channels) + if(FC.channel_name == NEWSCASTER_SPACE_BETTING) + if(!length(FC.messages)) + should_alert = TRUE + newscaster_message = GLOB.news_network.submit_article("The bet [name] has started, place your bets now!", "NtOS Space Betting App", NEWSCASTER_SPACE_BETTING, null, update_alert = should_alert) + +/datum/active_bet/Destroy(force) + GLOB.active_bets -= src + newscaster_message = null + return ..() + +///Returns how many bets there is per option +/datum/active_bet/proc/get_bets(datum/bank_account/user_account) + var/list/bets_per_option = list() + for(var/option in options) + var/amount_personally_invested = 0 + var/total_amount = 0 + for(var/list/existing_bets in options[option]) + var/existing_bet_amount = text2num(existing_bets[2]) + if(user_account && (existing_bets[1] == user_account)) + amount_personally_invested = existing_bet_amount + total_amount += existing_bet_amount + bets_per_option += list(list("option_name" = option, "amount" = total_amount, "personally_invested" = amount_personally_invested)) + return bets_per_option + +///Pays out the loser's money equally to all the winners, or refunds it all if no winning option was given. +/datum/active_bet/proc/payout(winning_option) + if(isnull(winning_option) || !(winning_option in options)) + //no winner was selected (likely the host's PDA was destroyed or attempted href exploit), so let's refund everyone. + for(var/list/option in options) + for(var/list/existing_bets in options[option]) + var/datum/bank_account/refunded_account = existing_bets[1] + refunded_account.adjust_money(text2num(existing_bets[2]), "Refund: [name] gamble cancelled.") + return + GLOB.news_network.submit_comment( + comment_text = "The bet [name] has ended, the winner was [winning_option]!", + newscaster_username = "NtOS Betting Results", + current_message = newscaster_message, + ) + var/list/winners = options[winning_option] + if(!length(winners)) + return + for(var/list/winner in winners) + //they aren't winning their own money, so people betting a ton of money won't lose their money to those who bet few. + total_amount_bet -= text2num(winner[2]) + for(var/list/winner in winners) + var/datum/bank_account/winner_account = winner[1] + var/money_won = text2num(winner[2]) + total_amount_bet / length(winners) + winner_account.adjust_money(money_won, "Won gamble: [name]") //give them their money back & whatever they won. + //they only made their money back, don't tell them they won anything. + if((money_won - text2num(winner[2])) == 0) + continue + winner_account.bank_card_talk("You won [money_won]cr from having a correct guess on [name]!") + +///Puts a bank account's money bet on a given option. +/datum/active_bet/proc/bet_money(datum/bank_account/better, money_betting, option_betting) + if(locked) + return + for(var/option in options) + for(var/list/existing_bets in options[option]) + if(existing_bets[1] == better) + //We're already betting, but now we're betting on another one, clear our previous and we'll bet on the new. + if(option != option_betting) + better.adjust_money(text2num(existing_bets[2]), "Refunded: changed bet for [name].") + options[option] -= list(existing_bets) + //We're already betting on the same one, we'll add it together instead of making it a separate bet, or the user is taking money out. + else + //putting more money in + if(text2num(existing_bets[2]) < money_betting) + if(better.account_balance < money_betting) + return + var/money_adding_in = money_betting - text2num(existing_bets[2]) + total_amount_bet += money_adding_in + better.bank_card_talk("Additional [money_adding_in]cr deducted for your bet on [name].") + better.adjust_money(-money_adding_in, "Gambling on [name].") + existing_bets[2] = "[money_betting]" + return + //taking it all out, we remove them from the list so they aren't a winner with bets of 0. + if(money_betting == 0) + var/money_taking_out = text2num(existing_bets[2]) + total_amount_bet -= money_taking_out + better.adjust_money(money_taking_out, "Refunded: changed bet for [name].") + options[option] -= list(existing_bets) + return + //taking money out + if(text2num(existing_bets[2]) > money_betting) + var/money_taking_out = text2num(existing_bets[2]) - money_betting + total_amount_bet -= money_taking_out + better.bank_card_talk("Refunded [money_taking_out]cr for taking money out of your bet on [name].") + better.adjust_money(money_taking_out, "Refund from gambling on [name].") + existing_bets[2] = "[money_betting]" + return + + total_amount_bet += money_betting + options[option_betting] += list(list(better, "[money_betting]")) + better.adjust_money(-money_betting, "Gambling on [name]") + better.bank_card_talk("Deducted [money_betting]cr for your bet on [name].") + +///Cancels your bet, removing your bet and refunding your money. +/datum/active_bet/proc/cancel_bet(datum/bank_account/better) + for(var/option in options) + for(var/list/existing_bets in options[option]) + if(existing_bets[1] == better) + var/money_refunding = text2num(existing_bets[2]) + total_amount_bet -= money_refunding + better.bank_card_talk("Refunded [money_refunding]cr for cancelling your bet on [name].") + better.adjust_money(money_refunding, "Refunded: changed bet for [name].") + options[option] -= list(existing_bets) + +#undef MAX_LENGTH_TITLE +#undef MAX_LENGTH_DESCRIPTION diff --git a/icons/obj/devices/modular_pda.dmi b/icons/obj/devices/modular_pda.dmi index 6981b1de37ff63eaaebf39c0bf89fb6c6e2bf6de..a427eb143ce1c7655525451eea80950f9ee9f6c3 100644 GIT binary patch literal 25261 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 z { + const { act, data } = useBackend(); + const { bank_name, bank_money, can_create_bet } = data; + return ( + + +
+ + + + + + Username: {bank_name} + Money Available: {bank_money}cr + + +
+ + {!!can_create_bet && } +
+
+ ); +}; + +export const PollsSection = () => { + const { act, data } = useBackend(); + const { active_bets = [] } = data; + const [Winner, set_winner] = useState(''); + return ( +
+ {!active_bets.length ? ( + + There's currently no active polls to bet on, create one below! + + ) : ( + active_bets.map( + ( + { name, description, owner, creator, current_bets = [], locked }, + index, + ) => ( +
+ + + {description} + + {current_bets.map( + ( + { option_name, total_amount, personally_invested }, + index, + ) => ( + + + + {option_name} (Has {total_amount || 0}cr bet on it) + {!owner ? ( + + act('place_bet', { + bet_selected: name, + option_selected: option_name, + money_betting: value, + }) + } + /> + ) : ( + set_winner(option_name)} + /> + )} + + + + ), + )} + {!!owner && + (!locked ? ( + + + act('lock_betting', { bet_selected: name }) + } + > + Lock Betting + + + ) : ( + + act('select_winner', { + bet_selected: name, + winning_answer: Winner, + }) + } + > + Finalize Results + + ))} + + + + + +
+ ), + ) + )} +
+ ); +}; + +export const BettingCreation = () => { + const { act, data } = useBackend(); + const { max_title_length, max_description_length } = data; + const [Title, setTitle] = useState(''); + const [Desc, setDesc] = useState(''); + const [Option1, setOption1] = useState(''); + const [Option2, setOption2] = useState(''); + const [Option3, setOption3] = useState(''); + const [Option4, setOption4] = useState(''); + return ( + + + + setTitle(value)} + /> + + +