diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 73f37265f5a..78a37ce9e3c 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -21,21 +21,10 @@ SUBSYSTEM_DEF(statpanels) if (!resumed) num_fires++ var/datum/map_config/cached = SSmap_vote.next_map_config - /* SKYRAT EDIT CHANGE - if(isnull(SSmapping.current_map)) - global_data = list("Loading") - else if(SSmapping.current_map.feedback_link) - global_data = list(list("Map: [SSmapping.current_map.map_name]", " (Feedback)", "action=openLink&link=[SSmapping.current_map.feedback_link]")) - else - global_data = list("Map: [SSmapping.current_map?.map_name]") - - if(SSmapping.current_map?.mapping_url) - global_data += list(list("same_line", " | (View in Browser)", "action=openWebMap")) - - if(cached) - global_data += "Next Map: [cached.map_name]" - - global_data += list( + /* BUBBER EDIT CHANGE BEGIN - Stat Panel - Original: + global_data = list( + "Map: [SSmapping.current_map?.map_name || "Loading..."]", + cached ? "Next Map: [cached.map_name]" : null, "Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]", "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss", world.timezone)]", "Round Time: [ROUND_TIME()]", @@ -43,29 +32,25 @@ SUBSYSTEM_DEF(statpanels) "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)", ) */ - var/round_time = world.time - SSticker.round_start_time var/real_round_time = world.timeofday - SSticker.real_round_start_time - //BUBBER EDIT ADDITION: ACTIVE AND OBSERVING PLAYERS var/active_players = get_active_player_count(alive_check = FALSE, afk_check = TRUE, human_check = FALSE) //This is a list of all active players, including players who are dead var/observing_players = length(GLOB.current_observers_list) //This is a list of all players that started as an observer-- dead and lobby players are not included. - //BUBBER EDIT ADDITION: Time in the world (as in, in-game date) - var/timeinworld = "[time2text(world.realtime, "DD of Month,")] [CURRENT_STATION_YEAR]" + var/current_date = "[time2text(world.realtime, "DDD Month DD")], [CURRENT_STATION_YEAR]" + global_data = list( - "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)", "Map: [SSmapping.current_map?.map_name || "Loading..."]", cached ? "Next Map: [cached.map_name]" : null, - "Storyteller: [SSgamemode.storyteller ? SSgamemode.storyteller.name : "N/A"]", // BUBBER EDIT ADDITION "Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]", - "Connected: [GLOB.clients.len] | Active: [active_players]/[CONFIG_GET(number/hard_popcap)] | Observing: [observing_players]", //BUBBER EDIT: ACTIVE AND OBSERVING PLAYERS - " ", + "Connected: [GLOB.clients.len] | Active: [active_players]/[CONFIG_GET(number/hard_popcap)] | Observing: [observing_players]", "OOC: [GLOB.ooc_allowed ? "Enabled" : "Disabled"]", " ", + "Storyteller: [SSgamemode.storyteller ? SSgamemode.storyteller.name : "N/A"]", + "Station Time: [station_time_timestamp(format = "hh:mm")], [current_date]", + "Round Time: [time2text(real_round_time, "hh:mm:ss", 0)]", "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]", - "Station Time: [time_to_twelve_hour(station_time(), format = "hh:mm")], [timeinworld]", //BUBBER EDIT: READABLE STATION TIME - "Round Timer: [round_time > MIDNIGHT_ROLLOVER ? "[round(round_time/MIDNIGHT_ROLLOVER)]:[gameTimestamp()]" : gameTimestamp()]", - "Actual Round Timer: [time2text(real_round_time, "hh:mm:ss", 0)]" + "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)", ) - // SKYRAT EDIT END + // BUBBER EDIT CHANGE END if(SSshuttle.emergency) var/ETA = SSshuttle.emergency.getModeStr() diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3618.yml b/html/changelogs/AutoChangeLog-bubber-pr-3618.yml deleted file mode 100644 index 4df552e4c83..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3618.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "KazooBard" -delete-after: True -changes: - - qol: "unifies the two existing coco powder related reagents into one" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3688.yml b/html/changelogs/AutoChangeLog-bubber-pr-3688.yml deleted file mode 100644 index 398f11762af..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3688.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MajManatee" -delete-after: True -changes: - - rscadd: "New job on tarkon, Generic Service Man" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3703.yml b/html/changelogs/AutoChangeLog-bubber-pr-3703.yml deleted file mode 100644 index 229f525c85e..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3703.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - config: "added config options for toggling blinking" \ No newline at end of file diff --git a/html/changelogs/bubber_archive/2025-05.yml b/html/changelogs/bubber_archive/2025-05.yml index 90695000b5a..84ee78ed0f2 100644 --- a/html/changelogs/bubber_archive/2025-05.yml +++ b/html/changelogs/bubber_archive/2025-05.yml @@ -31,8 +31,19 @@ aggresively. - bugfix: Fixes feed detailed description lying about the time it takes to start feeding + - config: added config options for toggling blinking + KazooBard: + - balance: A plethora of /obj/item/gun typecache weapons are gone from the secbelt. + - qol: unifies the two existing coco powder related reagents into one + LT3: + - bugfix: Stat panel now shows the correct station time + MajManatee: + - rscadd: New job on tarkon, Generic Service Man + sippykot: + - rscadd: New Climax option; (You) can cum into open reagent containers if you have + a penis. Isn't science wonderful? 2025-05-05: LT3: - bugfix: Everyone's chat log no longer bluescreens due to Admins' bad taste in - music. Their fatal attempts to make you listen to king gizzard the lizard - wizard will now fail silently + music. Their fatal attempts to make you listen to king gizzard the lizard wizard + will now fail silently diff --git a/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm b/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm index 979978a7873..3daba9697ac 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm @@ -100,7 +100,7 @@ savefile_key = "feature_body_markings" relevant_mutant_bodypart = "body_markings" type_to_check = /datum/preference/toggle/mutant_toggle/body_markings - default_accessory_type = /datum/sprite_accessory/lizard_markings + default_accessory_type = /datum/sprite_accessory/lizard_markings/none /datum/preference/choiced/mutant_choice/body_markings/is_accessible(datum/preferences/preferences) . = ..() // Got to do this because of linters. @@ -213,7 +213,7 @@ savefile_key = "feature_horns" relevant_mutant_bodypart = "horns" type_to_check = /datum/preference/toggle/mutant_toggle/horns - default_accessory_type = /datum/sprite_accessory/horns + default_accessory_type = /datum/sprite_accessory/horns/none /datum/preference/tri_color/horns category = PREFERENCE_CATEGORY_SECONDARY_FEATURES @@ -291,7 +291,7 @@ savefile_key = "feature_frills" relevant_mutant_bodypart = "frills" type_to_check = /datum/preference/toggle/mutant_toggle/frills - default_accessory_type = /datum/sprite_accessory/frills + default_accessory_type = /datum/sprite_accessory/frills/none /datum/preference/tri_color/frills category = PREFERENCE_CATEGORY_SECONDARY_FEATURES @@ -317,7 +317,7 @@ savefile_key = "feature_spines" relevant_mutant_bodypart = "spines" type_to_check = /datum/preference/toggle/mutant_toggle/spines - default_accessory_type = /datum/sprite_accessory/spines + default_accessory_type = /datum/sprite_accessory/spines/none /datum/preference/tri_color/spines category = PREFERENCE_CATEGORY_SECONDARY_FEATURES @@ -399,7 +399,7 @@ savefile_key = "feature_moth_markings" relevant_mutant_bodypart = "moth_markings" type_to_check = /datum/preference/toggle/mutant_toggle/moth_markings - default_accessory_type = /datum/sprite_accessory/moth_markings + default_accessory_type = /datum/sprite_accessory/moth_markings/none /datum/preference/choiced/mutant_choice/moth_markings/is_accessible(datum/preferences/preferences) . = ..() // Got to do this because of linters. diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_arousal/climax.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_arousal/climax.dm index 740192df9ef..cb213e23562 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_arousal/climax.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_arousal/climax.dm @@ -4,6 +4,7 @@ #define CLIMAX_ON_FLOOR "On the floor" #define CLIMAX_IN_OR_ON "Climax in or on someone" +#define CLIMAX_OPEN_CONTAINER "Fill reagent container" /mob/living/carbon/human /// Used to prevent nightmare scenarios. @@ -72,15 +73,24 @@ else var/list/interactable_inrange_humans = list() + // monkey see, monkey do + var/list/interactable_inrange_open_containers = list() // Unfortunately prefs can't be checked here, because byond/tgstation moment. for(var/mob/living/carbon/human/iterating_human in (view(1, src) - src)) interactable_inrange_humans[iterating_human.name] = iterating_human + // this should be making a list of cups(?) + for(var/obj/item/reagent_containers/cup/iterating_open_container in (view(1, src) - src)) + interactable_inrange_open_containers[iterating_open_container.name] = iterating_open_container + var/list/buttons = list(CLIMAX_ON_FLOOR) if(interactable_inrange_humans.len) buttons += CLIMAX_IN_OR_ON + if(interactable_inrange_open_containers.len) + buttons += CLIMAX_OPEN_CONTAINER + var/penis_climax_choice = tgui_alert(src, "Choose where to shoot your load.", "Load preference!", buttons) var/create_cum_decal = FALSE @@ -90,6 +100,41 @@ visible_message(span_userlove("[src] shoots [self_their] sticky load onto the floor!"), \ span_userlove("You shoot string after string of hot cum, hitting the floor!")) + else if(penis_climax_choice == CLIMAX_OPEN_CONTAINER) + var/target_choice = tgui_input_list(src, "Choose a container to cum into.", "Choose target!", interactable_inrange_open_containers) + if(!target_choice) + create_cum_decal = TRUE + visible_message(span_userlove("[src] shoots [self_their] sticky load onto the floor!"), \ + span_userlove("You shoot string after string of hot cum, hitting the floor!")) + else + var/obj/item/reagent_containers/cup/target_open_container = interactable_inrange_open_containers[target_choice] + if(target_open_container.is_refillable() && target_open_container.is_drainable()) + // here's where we actually do the cumming(?) + var/obj/item/organ/genital/testicles/src_testicles = src.get_organ_slot(ORGAN_SLOT_TESTICLES) + var/cum_volume = src_testicles.genital_size * 10 + var/total_volume_w_cum = cum_volume + target_open_container.reagents.total_volume + conditional_pref_sound(get_turf(src), SFX_DESECRATION, 50, TRUE, pref_to_check = /datum/preference/toggle/erp/sounds) + if(target_open_container.reagents.holder_full()) + // its full already + add_cum_splatter_floor(get_turf(target_open_container)) + visible_message(span_userlove("[src] tries to cum into the [target_open_container], but it's already full, spilling their hot load onto the floor!"), \ + span_userlove("You try to cum into the [target_open_container], but it's already full, so it all hits the floor instead!")) + else + target_open_container.reagents.add_reagent(/datum/reagent/consumable/cum, cum_volume) + if(total_volume_w_cum > target_open_container.volume) + // overflow, make the decal + add_cum_splatter_floor(get_turf(target_open_container)) + visible_message(span_userlove("[src] shoots [self_their] sticky load into the [target_open_container], it's so full that it overflows!"), \ + span_userlove("You shoot string after string of hot cum into the [target_open_container], making it overflow!")) + else + visible_message(span_userlove("[src] shoots [self_their] sticky load into the [target_open_container]!"), \ + span_userlove("You shoot string after string of hot cum into the [target_open_container]!")) + else + // cum fail + create_cum_decal = TRUE + visible_message(span_userlove("[src] shoots [self_their] sticky load onto the floor!"), \ + span_userlove("You shoot string after string of hot cum, hitting the floor!")) + else var/target_choice = tgui_input_list(src, "Choose a person to cum in or on.", "Choose target!", interactable_inrange_humans) if(!target_choice) @@ -163,3 +208,4 @@ #undef CLIMAX_BOTH #undef CLIMAX_ON_FLOOR #undef CLIMAX_IN_OR_ON +#undef CLIMAX_OPEN_CONTAINER