mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-12 00:27:31 +01:00
Merge remote-tracking branch 'tgstation/master' into upstream-2025-11-29
# Conflicts: # _maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm # _maps/RandomRuins/SpaceRuins/garbagetruck2.dmm # _maps/map_files/CatwalkStation/CatwalkStation_2023.dmm # _maps/map_files/tramstation/tramstation.dmm # code/_onclick/hud/new_player.dm # code/datums/components/squashable.dm # code/datums/diseases/advance/symptoms/heal.dm # code/datums/diseases/chronic_illness.dm # code/datums/status_effects/buffs.dm # code/datums/status_effects/debuffs/drunk.dm # code/datums/status_effects/debuffs/stamcrit.dm # code/game/machinery/computer/crew.dm # code/game/objects/items/devices/scanners/health_analyzer.dm # code/game/objects/items/wall_mounted.dm # code/game/turfs/closed/indestructible.dm # code/modules/admin/view_variables/filterrific.dm # code/modules/antagonists/heretic/influences.dm # code/modules/cargo/orderconsole.dm # code/modules/client/preferences.dm # code/modules/events/space_vines/vine_mutations.dm # code/modules/mob/dead/new_player/new_player.dm # code/modules/mob/living/carbon/human/death.dm # code/modules/mob/living/carbon/human/species_types/jellypeople.dm # code/modules/mob/living/damage_procs.dm # code/modules/mob/living/living.dm # code/modules/mob_spawn/ghost_roles/mining_roles.dm # code/modules/mob_spawn/mob_spawn.dm # code/modules/projectiles/ammunition/energy/laser.dm # code/modules/projectiles/guns/ballistic/launchers.dm # code/modules/projectiles/guns/energy/laser.dm # code/modules/reagents/chemistry/machinery/chem_dispenser.dm # code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm # code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm # code/modules/reagents/chemistry/reagents/medicine_reagents.dm # code/modules/surgery/healing.dm # code/modules/unit_tests/designs.dm # icons/mob/inhands/items_lefthand.dmi # icons/mob/inhands/items_righthand.dmi # tgui/packages/tgui/interfaces/ChemDispenser.tsx
This commit is contained in:
@@ -325,7 +325,7 @@ SUBSYSTEM_DEF(air)
|
||||
currentrun.len--
|
||||
if(!M)
|
||||
atmos_machinery -= M
|
||||
if(M.process_atmos() == PROCESS_KILL)
|
||||
if(M.process_atmos(wait * 0.1) == PROCESS_KILL)
|
||||
stop_processing_machine(M)
|
||||
if(MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
@@ -54,12 +54,17 @@ SUBSYSTEM_DEF(ambience)
|
||||
///Attempts to play an ambient sound to a mob, returning the cooldown in deciseconds
|
||||
/area/proc/play_ambience(mob/M, sound/override_sound, volume = 27)
|
||||
var/sound/new_sound = override_sound || pick(ambientsounds)
|
||||
if(!new_sound) // Dont try to play a sound if we dont have any.
|
||||
return 1 MINUTES
|
||||
/// volume modifier for ambience as set by the player in preferences.
|
||||
var/volume_modifier = (M.client?.prefs.read_preference(/datum/preference/numeric/volume/sound_ambience_volume))/100
|
||||
new_sound = sound(new_sound, repeat = 0, wait = 0, volume = volume*volume_modifier, channel = CHANNEL_AMBIENCE)
|
||||
SEND_SOUND(M, new_sound)
|
||||
|
||||
var/sound_length = SSsounds.get_sound_length(new_sound.file)
|
||||
if(!sound_length)
|
||||
// This will cause sounds to cut into eachother if the sound is longer then the min_ambience_cooldown
|
||||
stack_trace("play_ambience failed to get soundlength from [new_sound] with a file of [new_sound.file].")
|
||||
return sound_length + rand(min_ambience_cooldown, max_ambience_cooldown)
|
||||
|
||||
/datum/controller/subsystem/ambience/proc/remove_ambience_client(client/to_remove)
|
||||
|
||||
@@ -333,7 +333,7 @@ Versioning
|
||||
first_death["role"] = null
|
||||
first_death["role"] = L.mind.assigned_role.title
|
||||
first_death["area"] = "[AREACOORD(L)]"
|
||||
first_death["damage"] = "<font color='#FF5555'>[L.getBruteLoss()]</font>/<font color='orange'>[L.getFireLoss()]</font>/<font color='lightgreen'>[L.getToxLoss()]</font>/<font color='lightblue'>[L.getOxyLoss()]</font>"
|
||||
first_death["damage"] = "<font color='#FF5555'>[L.get_brute_loss()]</font>/<font color='orange'>[L.get_fire_loss()]</font>/<font color='lightgreen'>[L.get_tox_loss()]</font>/<font color='lightblue'>[L.get_oxy_loss()]</font>"
|
||||
first_death["last_words"] = L.last_words
|
||||
|
||||
if(!SSdbcore.Connect())
|
||||
@@ -355,12 +355,12 @@ Versioning
|
||||
"pod" = get_area_name(L, TRUE),
|
||||
"laname" = L.lastattacker,
|
||||
"lakey" = L.lastattackerckey,
|
||||
"brute" = L.getBruteLoss(),
|
||||
"fire" = L.getFireLoss(),
|
||||
"brute" = L.get_brute_loss(),
|
||||
"fire" = L.get_fire_loss(),
|
||||
"brain" = L.get_organ_loss(ORGAN_SLOT_BRAIN) || BRAIN_DAMAGE_DEATH, //get_organ_loss returns null without a brain but a value is required for this column
|
||||
"oxy" = L.getOxyLoss(),
|
||||
"tox" = L.getToxLoss(),
|
||||
"stamina" = L.getStaminaLoss(),
|
||||
"oxy" = L.get_oxy_loss(),
|
||||
"tox" = L.get_tox_loss(),
|
||||
"stamina" = L.get_stamina_loss(),
|
||||
"x_coord" = L.x,
|
||||
"y_coord" = L.y,
|
||||
"z_coord" = L.z,
|
||||
|
||||
@@ -154,7 +154,7 @@ SUBSYSTEM_DEF(discord)
|
||||
// While there's a collision in the token, generate a new one (should rarely happen)
|
||||
while(not_unique)
|
||||
//Column is varchar 100, so we trim just in case someone does us the dirty later
|
||||
one_time_token = trim("[pick(GLOB.most_common_words)]-[pick(GLOB.most_common_words)]-[pick(GLOB.most_common_words)]-[pick(GLOB.most_common_words)]-[pick(GLOB.most_common_words)]-[pick(GLOB.most_common_words)]", 100)
|
||||
one_time_token = trim("[pick(GLOB.most_common_words_alphabetical)]-[pick(GLOB.most_common_words_alphabetical)]-[pick(GLOB.most_common_words_alphabetical)]-[pick(GLOB.most_common_words_alphabetical)]-[pick(GLOB.most_common_words_alphabetical)]-[pick(GLOB.most_common_words_alphabetical)]", 100)
|
||||
|
||||
not_unique = find_discord_link_by_token(one_time_token, timebound = TRUE)
|
||||
|
||||
|
||||
@@ -35,9 +35,6 @@
|
||||
/datum/dynamic_ruleset/latejoin/traitor/assign_role(datum/mind/candidate)
|
||||
candidate.add_antag_datum(/datum/antagonist/traitor)
|
||||
|
||||
/datum/dynamic_ruleset/latejoin/heretic/assign_role(datum/mind/candidate)
|
||||
candidate.add_antag_datum(/datum/antagonist/heretic)
|
||||
|
||||
/datum/dynamic_ruleset/latejoin/changeling
|
||||
name = "Changeling"
|
||||
config_tag = "Latejoin Changeling"
|
||||
|
||||
@@ -472,8 +472,7 @@ ADMIN_VERB(check_bomb_impacts, R_DEBUG, "Check Bomb Impact", "See what the effec
|
||||
var/took = (REALTIMEOFDAY - started_at) / 10
|
||||
|
||||
//You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare
|
||||
if(GLOB.Debug2)
|
||||
log_world("## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds.")
|
||||
debug_world("Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds.")
|
||||
|
||||
explosion_index += 1
|
||||
|
||||
|
||||
@@ -494,7 +494,7 @@ GLOBAL_LIST_EMPTY(the_station_areas)
|
||||
/// Generates the global station area list, filling it with typepaths of unique areas found on the station Z.
|
||||
/datum/controller/subsystem/mapping/proc/generate_station_area_list()
|
||||
for(var/area/station/station_area in GLOB.areas)
|
||||
if (!(station_area.area_flags & UNIQUE_AREA))
|
||||
if (!(station_area.area_flags_mapping & UNIQUE_AREA))
|
||||
continue
|
||||
if (is_station_level(station_area.z))
|
||||
GLOB.the_station_areas += station_area.type
|
||||
|
||||
@@ -320,15 +320,16 @@ SUBSYSTEM_DEF(id_access)
|
||||
desc_by_access["[ACCESS_MECH_ENGINE]"] = "Engineering Mech Access"
|
||||
desc_by_access["[ACCESS_AUX_BASE]"] = "Auxiliary Base"
|
||||
desc_by_access["[ACCESS_SERVICE]"] = "Service Hallway"
|
||||
desc_by_access["[ACCESS_CENT_GENERAL]"] = "Code Grey"
|
||||
desc_by_access["[ACCESS_CENT_THUNDER]"] = "Code Yellow"
|
||||
desc_by_access["[ACCESS_CENT_STORAGE]"] = "Code Orange"
|
||||
desc_by_access["[ACCESS_CENT_LIVING]"] = "Code Green"
|
||||
desc_by_access["[ACCESS_CENT_MEDICAL]"] = "Code White"
|
||||
desc_by_access["[ACCESS_CENT_TELEPORTER]"] = "Code Blue"
|
||||
desc_by_access["[ACCESS_CENT_SPECOPS]"] = "Code Black"
|
||||
desc_by_access["[ACCESS_CENT_CAPTAIN]"] = "Code Gold"
|
||||
desc_by_access["[ACCESS_CENT_BAR]"] = "Code Scotch"
|
||||
desc_by_access["[ACCESS_CENT_GENERAL]"] = "CentCom General Access"
|
||||
desc_by_access["[ACCESS_CENT_THUNDER]"] = "CentCom Thunderdome"
|
||||
desc_by_access["[ACCESS_CENT_STORAGE]"] = "CentCom Storage"
|
||||
desc_by_access["[ACCESS_CENT_LIVING]"] = "CentCom Living Quarters"
|
||||
desc_by_access["[ACCESS_CENT_MEDICAL]"] = "CentCom Medical"
|
||||
desc_by_access["[ACCESS_CENT_TELEPORTER]"] = "CentCom Teleporter"
|
||||
desc_by_access["[ACCESS_CENT_SPECOPS]"] = "CentCom SpecOps"
|
||||
desc_by_access["[ACCESS_CENT_CAPTAIN]"] = "CentCom Captain"
|
||||
desc_by_access["[ACCESS_CENT_BAR]"] = "CentCom Bar"
|
||||
desc_by_access["[ACCESS_CENT_OFFICER]"] = "CentCom Officer"
|
||||
desc_by_access["[ACCESS_BIT_DEN]"] = "Bitrunner Den"
|
||||
desc_by_access["[ACCESS_BARBER]"] = "Barber" // SKYRAT EDIT ADD - BARBER UPDATE
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
if(!engraving.persistent_save)
|
||||
continue
|
||||
var/area/engraved_area = get_area(engraving.parent)
|
||||
if(!(engraved_area.area_flags & PERSISTENT_ENGRAVINGS))
|
||||
if(!(engraved_area.area_flags_mapping & PERSISTENT_ENGRAVINGS))
|
||||
continue
|
||||
saved_data["entries"] += engraving.save_persistent()
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ SUBSYSTEM_DEF(processing)
|
||||
* Additionally, any "prob" you use in this proc should instead use the SPT_PROB define to make sure that the final probability per second stays the same even if the subsystem's wait is altered.
|
||||
* Examples where this must be considered:
|
||||
* - Implementing a cooldown timer, use `mytimer -= seconds_per_tick`, not `mytimer -= 1`. This way, `mytimer` will always have the unit of seconds
|
||||
* - Damaging a mob, do `L.adjustFireLoss(20 * seconds_per_tick)`, not `L.adjustFireLoss(20)`. This way, the damage per second stays constant even if the wait of the subsystem is changed
|
||||
* - Damaging a mob, do `L.adjust_fire_loss(20 * seconds_per_tick)`, not `L.adjust_fire_loss(20)`. This way, the damage per second stays constant even if the wait of the subsystem is changed
|
||||
* - Probability of something happening, do `if(SPT_PROB(25, seconds_per_tick))`, not `if(prob(25))`. This way, if the subsystem wait is e.g. lowered, there won't be a higher chance of this event happening per second
|
||||
*
|
||||
* If you override this do not call parent, as it will return PROCESS_KILL. This is done to prevent objects that dont override process() from staying in the processing list
|
||||
|
||||
@@ -20,7 +20,7 @@ SUBSYSTEM_DEF(security_level)
|
||||
if(!current_security_level.looping_sound) // No sound? No play.
|
||||
can_fire = FALSE
|
||||
return
|
||||
sound_to_playing_players(current_security_level.looping_sound)
|
||||
sound_to_playing_players(current_security_level.looping_sound, volume_preference = /datum/preference/numeric/volume/sound_ambience_volume)
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -260,7 +260,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
can_continue = can_continue && SSjob.divide_occupations() //Distribute jobs
|
||||
CHECK_TICK
|
||||
|
||||
if(!GLOB.Debug2)
|
||||
if(!GLOB.debugging_enabled)
|
||||
if(!can_continue)
|
||||
log_game("Game failed pre_setup")
|
||||
to_chat(world, "<B>Error setting up game.</B> Reverting to pre-game lobby.")
|
||||
|
||||
@@ -295,8 +295,8 @@ SUBSYSTEM_DEF(tts)
|
||||
var/datum/http_request/request_blips = new()
|
||||
var/file_name = "tmp/tts/[identifier].ogg"
|
||||
var/file_name_blips = "tmp/tts/[identifier]_blips.ogg"
|
||||
request.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts?voice=[speaker]&identifier=[identifier]&filter=[url_encode(filter)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds))
|
||||
request_blips.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts-blips?voice=[speaker]&identifier=[identifier]&filter=[url_encode(filter)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name_blips, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds))
|
||||
request.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts?voice=[speaker]&identifier=[identifier]&filter=[tts_filter_encode(filter, speaker)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds))
|
||||
request_blips.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts-blips?voice=[speaker]&identifier=[identifier]&filter=[tts_filter_encode(filter, speaker, blips = TRUE)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name_blips, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds))
|
||||
var/datum/tts_request/current_request = new /datum/tts_request(identifier, request, request_blips, shell_scrubbed_input, target, local, language, message_range, volume_offset, listeners, pitch)
|
||||
var/list/player_queued_tts_messages = queued_tts_messages[target]
|
||||
if(!player_queued_tts_messages)
|
||||
|
||||
@@ -41,6 +41,10 @@ SUBSYSTEM_DEF(wardrobe)
|
||||
var/stock_hit = 0
|
||||
/// How many items would we make just by loading the master list once?
|
||||
var/one_go_master = 0
|
||||
/// Item types that should not ever be recycled, only generated (like modsuits)
|
||||
var/static/list/recycle_blacklist = typecacheof(list(
|
||||
/obj/item/mod/control/pre_equipped,
|
||||
))
|
||||
|
||||
/datum/controller/subsystem/wardrobe/Initialize()
|
||||
setup_callbacks()
|
||||
@@ -207,11 +211,17 @@ SUBSYSTEM_DEF(wardrobe)
|
||||
|
||||
order_list[queued_type] = amount
|
||||
|
||||
/// Take an existing object, and recycle it if we are allowed to by stashing it back into our storage
|
||||
/datum/controller/subsystem/wardrobe/proc/recycle_object(obj/item/object)
|
||||
// Don't restock blacklisted items, instead just delete them
|
||||
if(is_type_in_typecache(object, recycle_blacklist))
|
||||
qdel(object)
|
||||
return
|
||||
stash_object(object)
|
||||
|
||||
/// Take an existing object, and insert it into our storage
|
||||
/// If we can't or won't take it, it's deleted. You do not own this object after passing it in
|
||||
/datum/controller/subsystem/wardrobe/proc/stash_object(obj/item/object)
|
||||
if(object.item_flags & DO_NOT_WARDROBE)
|
||||
return
|
||||
var/object_type = object.type
|
||||
var/list/master_info = canon_minimum[object_type]
|
||||
// I will not permit objects you didn't reserve ahead of time
|
||||
|
||||
Reference in New Issue
Block a user