Merge remote-tracking branch 'tgstation/master' into upstream-12-15

# Conflicts:
#	.github/workflows/compile_all_maps.yml
#	.github/workflows/run_integration_tests.yml
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	code/_onclick/hud/credits.dm
#	code/controllers/subsystem/networks/id_access.dm
#	code/datums/diseases/advance/advance.dm
#	code/datums/diseases/advance/symptoms/heal.dm
#	code/game/machinery/doors/door.dm
#	code/game/objects/structures/crates_lockers/closets/secure/medical.dm
#	code/game/objects/structures/crates_lockers/closets/secure/security.dm
#	code/modules/antagonists/malf_ai/malf_ai_modules.dm
#	code/modules/jobs/job_types/_job.dm
#	code/modules/loadout/categories/accessories.dm
#	code/modules/loadout/loadout_helpers.dm
#	code/modules/loadout/loadout_items.dm
#	code/modules/loadout/loadout_preference.dm
#	code/modules/mob/living/silicon/robot/robot_defense.dm
#	code/modules/mod/mod_theme.dm
#	code/modules/projectiles/ammunition/energy/laser.dm
#	code/modules/reagents/reagent_containers/cups/drinks.dm
#	code/modules/shuttle/mobile_port/variants/supply.dm
#	code/modules/surgery/organs/internal/eyes/_eyes.dm
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_heretic.png
#	icons/hud/screen_full.dmi
This commit is contained in:
nevimer
2025-12-15 18:08:36 -05:00
1053 changed files with 115751 additions and 34654 deletions
@@ -234,7 +234,7 @@ GLOBAL_LIST_EMPTY_TYPED(active_bets, /datum/active_bet)
//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]!")
winner_account.bank_card_talk("You won [money_won][MONEY_SYMBOL] 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)
@@ -255,7 +255,7 @@ GLOBAL_LIST_EMPTY_TYPED(active_bets, /datum/active_bet)
if(!better.adjust_money(-money_adding_in, "Gambling on [name]."))
return
total_amount_bet += money_adding_in
better.bank_card_talk("Additional [money_adding_in]cr deducted for your bet on [name].")
better.bank_card_talk("Additional [money_adding_in][MONEY_SYMBOL] deducted for your bet 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.
@@ -269,7 +269,7 @@ GLOBAL_LIST_EMPTY_TYPED(active_bets, /datum/active_bet)
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.bank_card_talk("Refunded [money_taking_out][MONEY_SYMBOL] 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
@@ -278,7 +278,7 @@ GLOBAL_LIST_EMPTY_TYPED(active_bets, /datum/active_bet)
return
total_amount_bet += money_betting
options[option_betting] += list(list(better, "[money_betting]"))
better.bank_card_talk("Deducted [money_betting]cr for your bet on [name].")
better.bank_card_talk("Deducted [money_betting][MONEY_SYMBOL] 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)
@@ -287,7 +287,7 @@ GLOBAL_LIST_EMPTY_TYPED(active_bets, /datum/active_bet)
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.bank_card_talk("Refunded [money_refunding][MONEY_SYMBOL] for cancelling your bet on [name].")
better.adjust_money(money_refunding, "Refunded: changed bet for [name].")
options[option] -= list(existing_bets)
@@ -102,7 +102,7 @@
playsound(computer, 'sound/machines/buzz/buzz-sigh.ogg', 30, TRUE)
return
request_target.transfer_money(current_user, active_request.value, "Bounties: Request Completed")
computer.say("Paid out [active_request.value] credits.")
computer.say("Paid out [active_request.value] [MONEY_NAME].")
GLOB.request_list.Remove(active_request)
return TRUE
if("clear")
@@ -67,7 +67,7 @@
var/obj/item/card/id/id_card = computer.stored_id?.GetID()
if(id_card?.registered_account)
buyer = SSeconomy.get_dep_account(id_card?.registered_account.account_job.paycheck_department)
if((ACCESS_COMMAND in id_card.access))
if((ACCESS_BUDGET in id_card.access))
requestonly = FALSE
can_approve_requests = TRUE
// If buyer is a departmental budget, replaces "Cargo" with that budget - we're not using the cargo budget here
@@ -89,14 +89,16 @@
data["supplies"] = list()
for(var/pack in SSshuttle.supply_packs)
var/datum/supply_pack/P = SSshuttle.supply_packs[pack]
if(!is_visible_pack(user, P.access_view , null, P.contraband) || P.hidden)
if(P.order_flags & ORDER_INVISIBLE)
continue
if(!is_visible_pack(user, P.access_view , null, (P.order_flags & ORDER_CONTRABAND)) || (P.order_flags & ORDER_EMAG_ONLY))
continue
if(!data["supplies"][P.group])
data["supplies"][P.group] = list(
"name" = P.group,
"packs" = list()
)
if((P.hidden && (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.drop_pod_only))
if(((P.order_flags & ORDER_EMAG_ONLY) && ((P.order_flags & ORDER_CONTRABAND) && !contraband) || ((P.order_flags & ORDER_SPECIAL) && !(P.order_flags & ORDER_SPECIAL_ENABLED)) || (P.order_flags & ORDER_POD_ONLY)))
continue
var/obj/item/first_item = length(P.contains) > 0 ? P.contains[1] : null
@@ -107,7 +109,7 @@
"desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name.
"first_item_icon" = first_item?.icon,
"first_item_icon_state" = first_item?.icon_state,
"goody" = P.goody,
"goody" = P.order_flags & ORDER_GOODY,
"access" = P.access,
"contains" = P.get_contents_ui_data(),
))
@@ -216,7 +218,7 @@
var/datum/supply_pack/pack = SSshuttle.supply_packs[id]
if(!istype(pack))
return
if(pack.hidden || pack.contraband || pack.drop_pod_only || (pack.special && !pack.special_enabled))
if((pack.order_flags & (ORDER_EMAG_ONLY | ORDER_POD_ONLY | ORDER_CONTRABAND)) || ((pack.order_flags & ORDER_SPECIAL) && !(pack.order_flags & ORDER_SPECIAL_ENABLED)))
return
var/name = "*None Provided*"
@@ -267,7 +269,7 @@
if(dept_choice == "Cargo Budget")
personal_department = null
if(pack.goody && !self_paid)
if((pack.order_flags & ORDER_GOODY) && !self_paid)
playsound(computer, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE)
computer.say("ERROR: Small crates may only be purchased by private accounts.")
return
@@ -105,13 +105,11 @@ GLOBAL_VAR(department_cd_override)
/// Checks if we can "see" the passed supply pack
/datum/computer_file/program/department_order/proc/can_see_pack(datum/supply_pack/to_check)
PROTECTED_PROC(TRUE)
if(to_check.hidden && !(computer.obj_flags & EMAGGED))
if((to_check.order_flags & ORDER_EMAG_ONLY) && !(computer.obj_flags & EMAGGED))
return FALSE
if(to_check.special && !to_check.special_enabled)
if((to_check.order_flags & ORDER_SPECIAL) && !(to_check.order_flags & ORDER_SPECIAL_ENABLED))
return FALSE
if(to_check.drop_pod_only)
return FALSE
if(to_check.goody)
if(to_check.order_flags & (ORDER_INVISIBLE | ORDER_POD_ONLY | ORDER_GOODY | ORDER_NOT_DEPARTMENTAL))
return FALSE
return TRUE
@@ -606,6 +606,13 @@
for(var/datum/computer_file/program/messenger/messenger as anything in targets)
stringified_targets += get_messenger_name(messenger)
var/sent_prob = 0
if(ishuman(source))
var/mob/living/carbon/human/oldie = source
sent_prob = (0.025 * oldie.age) ** 3 // 25 y/o = ~0.25% chance, 85 y/o = ~10% chance
if (computer && prob(sent_prob))
message = "[message] [computer.get_messenger_ending()]"
var/datum/signal/subspace/messaging/tablet_message/signal = new(computer, list(
"ref" = REF(src),
"message" = message,
@@ -83,7 +83,7 @@
return NT_PAY_STATUS_INVALID_MONEY
if(token == current_user.pay_token)
if(user)
to_chat(user, span_notice("You can't send credits to yourself."))
to_chat(user, span_notice("You can't send [MONEY_NAME] to yourself."))
return NT_PAY_SATUS_SENDER_IS_RECEIVER
for(var/account in SSeconomy.bank_accounts_by_id)
@@ -100,12 +100,12 @@
current_user.bank_card_talk("You cannot afford it.")
return NT_PAY_STATUS_INVALID_MONEY
recipient.bank_card_talk("You received [money_to_send] credit(s). Reason: transfer from [current_user.account_holder]")
recipient.bank_card_talk("You received [money_to_send] [MONEY_NAME](s). Reason: transfer from [current_user.account_holder]")
recipient.transfer_money(current_user, money_to_send)
for(var/obj/item/card/id/id_card as anything in recipient.bank_cards)
SEND_SIGNAL(id_card, COMSIG_ID_CARD_NTPAY_MONEY_RECEIVED, computer, money_to_send)
current_user.bank_card_talk("You send [money_to_send] credit(s) to [recipient.account_holder]. Now you have [current_user.account_balance] credit(s)")
current_user.bank_card_talk("You send [money_to_send] [MONEY_NAME](s) to [recipient.account_holder]. Now you have [current_user.account_balance] [MONEY_NAME](s)")
return NT_PAY_STATUS_SUCCESS