Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
863edc2
v0.5
Kocma-san Jun 9, 2025
cb37c7e
Apply suggestions from code review
Iajret Jun 10, 2025
e114dab
Update tff_modular/modules/shift_intensity/shift_intensity_vote.dm
Kocma-san Jun 10, 2025
0825e40
Update tff_modular/modules/shift_intensity/shift_intensity_vote.dm
Kocma-san Jun 11, 2025
7bc9eee
Update tff_modular/modules/shift_intensity/shift_intensity_vote.dm
Kocma-san Jun 11, 2025
ba6e593
Update tff_modular/modules/shift_intensity/shift_intensity_vote.dm
Kocma-san Jun 11, 2025
537b4b6
verb for admins
Kocma-san Jun 15, 2025
db73f42
weh (Теперь все привязано к конфигам)
Kocma-san Jun 16, 2025
5872434
configs (probably bad)
Kocma-san Jun 17, 2025
761b051
Update tff_modular/modules/shift_intensity/shift_intensity_config.dm
Kocma-san Jun 17, 2025
9d5d421
Update shift_intensity.dm
Kocma-san Jun 17, 2025
dd44e6f
Merge branch 'vote-things' of https://github.com/Kocma-san/FluffySTG …
Kocma-san Jun 17, 2025
da44838
Update dynamic_hard.json
Kocma-san Jun 17, 2025
e640daf
Merge remote-tracking branch 'upstream/master' into vote-things
Kocma-san Sep 12, 2025
95a215f
v2
Kocma-san Sep 12, 2025
f41a1fa
Merge branch 'master' into vote-things
Kocma-san Sep 12, 2025
10a8680
fixes
Kocma-san Sep 13, 2025
4f7c41d
update
Kocma-san Sep 13, 2025
54fd7fb
Update dynamic.dm
Kocma-san Sep 13, 2025
d0dafe3
v2.1
Kocma-san Sep 26, 2025
e948bfa
Update statpanel.dm
Kocma-san Nov 14, 2025
838198c
Update code/modules/mob/dead/new_player/login.dm
Kocma-san Nov 20, 2025
edb9723
Update code/modules/mob/dead/new_player/login.dm
Kocma-san Nov 20, 2025
58e7336
small addition
Kocma-san Jan 13, 2026
e21f67a
Update shift_intensity_vote.dm
Kocma-san Jan 13, 2026
4e4a389
Update shift_intensity.dm
Kocma-san Jan 13, 2026
d95b454
Update shift_intensity.dm
Kocma-san Jan 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions code/__DEFINES/~ff_defines/dynamic.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

// Названия типов раунда
/// Обычная зеленая смена, экста
#define ROUND_LIGHT_SHIFT_STRING "Green Shift"
/// Обычная смена, 50% между Yellow Star и Red Star
#define ROUND_MID_SHIFT_STRING "Blue Shift"
/// Black Star
#define ROUND_HEAVY_SHIFT_STRING "Red Shift"
/// Midnight Sun
#define ROUND_TOTALLY_HELL_SHIFT_STRING "TOTALLY HELL"

GLOBAL_VAR(shift_intensity_level)
8 changes: 8 additions & 0 deletions code/controllers/subsystem/dynamic/dynamic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -613,13 +613,21 @@ SUBSYSTEM_DEF(dynamic)
if(num_dead + num_alive <= 0)
return 0

/* // FLUFFY FRONTIER EDIT START - dynamic changes - ORIGINAL:
chance += 100 - (200 * (num_dead / (num_alive + num_dead)))
if(num_antags < 0)
chance += 50
chance += (failed_latejoins * 15)
// Reduced chance before lights start
if(!COOLDOWN_FINISHED(src, light_ruleset_start))
chance *= 0.2
*/
// У нас мало людей с включенными префами на антагов, поэтому каждый подобный человек на вес золота и ваниальная формула не подходит
var/num_sec_alive = length(SSjob.get_living_sec())
chance = clamp(100 - 40 * (2 * num_antags - num_sec_alive), 0, 100)
if(num_antags <= 0)
chance = 100
// FLUFFY FRONTIER EDIT END

return chance

Expand Down
14 changes: 14 additions & 0 deletions code/controllers/subsystem/statpanel.dm
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,20 @@ SUBSYSTEM_DEF(statpanels)
)
// NOVA EDIT CHANGE END

// FLUFFY FRONTIER ADDITION START - shift intensity system
if(!isnull(GLOB.shift_intensity_level))
global_data += list(
" ",
"Shift Intensity: [GLOB.shift_intensity_level]",
" ",
)
else if(istype(SSvote.current_vote, /datum/vote/shift_intensity))
global_data += list(
" ",
"Shift Intensity: Voting in progress",
" ",
)
// FLUFFY FRONTIER ADDITION END
if(SSshuttle.emergency)
var/ETA = SSshuttle.emergency.getModeStr()
if(ETA)
Expand Down
7 changes: 7 additions & 0 deletions code/modules/mob/dead/new_player/login.dm
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,11 @@
if(SSticker.current_state < GAME_STATE_SETTING_UP)
var/tl = SSticker.GetTimeLeft()
to_chat(src, "Please set up your character and select \"Ready\". The game will start [tl > 0 ? "in about [DisplayTimeText(tl)]" : "soon"].")
// FLUFFY FRONTIER ADDITION START - shift intensity system
if(istype(SSvote.current_vote, /datum/vote/shift_intensity))
to_chat(src, custom_boxed_message("purple_box center", span_infoplain(
"<font color='purple'>[span_bold("Shift intensity vote is in progress right now")]<br>\
Type <b>vote</b> or click <a href='byond://winset?command=vote'>here</a> to place your votes.\n\
You have [DisplayTimeText(SSvote.current_vote.time_remaining SECONDS)] to vote.</font>")))
// FLUFFY FRONTIER ADDITION END

2 changes: 1 addition & 1 deletion config/admins.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#Ranks will match to those with the same name in admin_ranks.txt, if a match isn't found the user won't be adminned.
#If SQL-based admin loading is enabled, admins listed here will always be loaded first and will override any duplicate entries in the database.

Optimumtact = Host
Comka = Host
LemonInTheDark = Host
CitrusGender = Game Master
NewSta = Game Master
Expand Down
1 change: 1 addition & 0 deletions config/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ $include interviews.txt
$include lua.txt
$include auxtools.txt
$include map_vote.txt
$include tff/config_tff.txt

# You can use the @ character at the beginning of a config option to lock it from being edited in-game
# Example usage:
Expand Down
8 changes: 4 additions & 4 deletions config/dynamic.toml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ ruleset_type_settings.latejoin.low = 0
ruleset_type_settings.latejoin.high = 1
ruleset_type_settings.latejoin.half_range_pop_threshold = 25
ruleset_type_settings.latejoin.full_range_pop_threshold = 40
ruleset_type_settings.latejoin.time_threshold = 5
ruleset_type_settings.latejoin.time_threshold = 0.1
ruleset_type_settings.latejoin.execution_cooldown_low = 10
ruleset_type_settings.latejoin.execution_cooldown_high = 20

Expand Down Expand Up @@ -87,7 +87,7 @@ ruleset_type_settings.latejoin.low = 1
ruleset_type_settings.latejoin.high = 2
ruleset_type_settings.latejoin.half_range_pop_threshold = 25
ruleset_type_settings.latejoin.full_range_pop_threshold = 40
ruleset_type_settings.latejoin.time_threshold = 5
ruleset_type_settings.latejoin.time_threshold = 0.1
ruleset_type_settings.latejoin.execution_cooldown_low = 10
ruleset_type_settings.latejoin.execution_cooldown_high = 20

Expand Down Expand Up @@ -118,7 +118,7 @@ ruleset_type_settings.latejoin.low = 1
ruleset_type_settings.latejoin.high = 3
ruleset_type_settings.latejoin.half_range_pop_threshold = 25
ruleset_type_settings.latejoin.full_range_pop_threshold = 40
ruleset_type_settings.latejoin.time_threshold = 5
ruleset_type_settings.latejoin.time_threshold = 0.1
ruleset_type_settings.latejoin.execution_cooldown_low = 10
ruleset_type_settings.latejoin.execution_cooldown_high = 20

Expand Down Expand Up @@ -149,7 +149,7 @@ ruleset_type_settings.latejoin.low = 2
ruleset_type_settings.latejoin.high = 3
ruleset_type_settings.latejoin.half_range_pop_threshold = 25
ruleset_type_settings.latejoin.full_range_pop_threshold = 40
ruleset_type_settings.latejoin.time_threshold = 5
ruleset_type_settings.latejoin.time_threshold = 0.1
ruleset_type_settings.latejoin.execution_cooldown_low = 10
ruleset_type_settings.latejoin.execution_cooldown_high = 20

Expand Down
11 changes: 11 additions & 0 deletions config/tff/config_tff.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## Включает систему голосования за тип раунда
#SHIFT_INTENSITY

## Включает возможность начать голосование за тип раунда
#ALLOW_SHIFT_INTENSITY_VOTE

## Время до начала раунда (в децисекундах), в которое запускается голосование за тип раунда
SHIFT_INTENSITY_VOTE_STARTTIME 2000

## Количество игроков, необходимое для старта голосования за тип раунда
SHIFT_INTENSITY_VOTE_MINIMUM_PLAYERS 20
78 changes: 78 additions & 0 deletions tff_modular/modules/shift_intensity/shift_intensity.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#define LAST_ATTEMPT_DEADLINE 120 SECONDS

SUBSYSTEM_DEF(shift_intensity)
name = "Shift Intensity Vote"
flags = SS_BACKGROUND
runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP
dependencies = list(
/datum/controller/subsystem/vote,
)

/// Время до начала раунда, после которого подсистема будет пытаться запустить голосование
var/start_time
/// Количество игроков, необходимое для старта голосования
var/minimum_players
/// Будет ли в воуте самый сложный тип смены
var/enable_hell_shift = FALSE

/datum/controller/subsystem/shift_intensity/Initialize()
start_time = CONFIG_GET(number/shift_intensity_vote_starttime)
minimum_players = CONFIG_GET(number/shift_intensity_vote_minimum_players)

if(!CONFIG_GET(flag/shift_intensity))
can_fire = FALSE
return SS_INIT_NO_NEED

log_game("SSshift_intensity was enabled in config. Vote will start [start_time/10] seconds before the start of the round.")
message_admins("SSshift_intensity was enabled in config. Vote will start [start_time/10] seconds before the start of the round.")
return SS_INIT_SUCCESS

/datum/controller/subsystem/shift_intensity/Recover()
start_time = SSshift_intensity.start_time
minimum_players = SSshift_intensity.minimum_players

/datum/controller/subsystem/shift_intensity/fire()
if(SSticker.current_state > GAME_STATE_PREGAME)
can_fire = FALSE
return

if(!isnull(SSvote.current_vote))
if(istype(SSvote.current_vote, /datum/vote/shift_intensity))
can_fire = FALSE
return

if(SSticker.GetTimeLeft() <= start_time)
if(SSticker.totalPlayers < minimum_players)
if(SSticker.GetTimeLeft() > LAST_ATTEMPT_DEADLINE) // Будет пытаться начать воут вплоть до 120 секунд доя старта раунда и потом отключится, если все еще не набрались люди
return

can_fire = FALSE
log_game("The vote for shift intensity was cancelled due to insufficient number of players.")
message_admins("The vote for shift intensity was cancelled due to insufficient number of players.")
return

can_fire = FALSE
SSvote.initiate_vote(/datum/vote/shift_intensity, "server", forced = TRUE)

/datum/controller/subsystem/shift_intensity/proc/set_intensity(intensity_level)

switch(intensity_level)
if(ROUND_LIGHT_SHIFT_STRING)
SSdynamic.set_tier(/datum/dynamic_tier/greenshift)
if(ROUND_MID_SHIFT_STRING)
if(prob(50))
SSdynamic.set_tier(/datum/dynamic_tier/low)
else
SSdynamic.set_tier(/datum/dynamic_tier/lowmedium)
if(ROUND_HEAVY_SHIFT_STRING)
SSdynamic.set_tier(/datum/dynamic_tier/mediumhigh)
if(ROUND_TOTALLY_HELL_SHIFT_STRING)
SSdynamic.set_tier(/datum/dynamic_tier/high)

GLOB.shift_intensity_level = intensity_level

message_admins("The type of round will be: [intensity_level].")
log_admin("The type of round will be: [intensity_level].")


#undef LAST_ATTEMPT_DEADLINE
14 changes: 14 additions & 0 deletions tff_modular/modules/shift_intensity/shift_intensity_config.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/// Определяет, работает ли [SSshift_intensity] или нет
/datum/config_entry/flag/shift_intensity

/// Определяет, может ли голосование за [SSshift_intensity] быть начато кем-либо или нет
/datum/config_entry/flag/allow_shift_intensity_vote

/// Время (в децисекундах) до начала раунда, после которого SSshiftcolorvote будет пытаться запустить голосование
/datum/config_entry/number/shift_intensity_vote_starttime
min_val = 50
default = 1000

/// Количество игроков, необходимое для старта голосования
/datum/config_entry/number/shift_intensity_vote_minimum_players
default = 20
11 changes: 11 additions & 0 deletions tff_modular/modules/shift_intensity/shift_intensity_toggle.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
ADMIN_VERB(disable_shift_intensity, R_ADMIN, "Disable Intensity Vote", "Turn Off the Shift Intensity Vote.", ADMIN_CATEGORY_SERVER)
SSshift_intensity.can_fire = 0;
if(istype(SSvote.current_vote, /datum/vote/shift_intensity))
SSvote.reset()
log_admin("[key_name(user)] turned off Shift Intensity Vote.")
message_admins("[key_name_admin(user)] turned off Shift Intensity Vote.")

ADMIN_VERB(toggle_hell_intensity, R_ADMIN, "Toggle Hell Intensity", "Toggle Hell option in Shift Intensity Vote.", ADMIN_CATEGORY_SERVER)
SSshift_intensity.enable_hell_shift = !SSshift_intensity.enable_hell_shift
log_admin("[key_name(user)] turned [SSshift_intensity.enable_hell_shift ? "On" : "Off"] Hell option in Shift Intensity Vote.")
message_admins("[key_name_admin(user)] turned [SSshift_intensity.enable_hell_shift ? "On" : "Off"] Hell option in Shift Intensity Vote.")
58 changes: 58 additions & 0 deletions tff_modular/modules/shift_intensity/shift_intensity_vote.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/datum/vote/shift_intensity
name = "Intensity"
default_choices = list(
ROUND_LIGHT_SHIFT_STRING,
ROUND_MID_SHIFT_STRING,
ROUND_HEAVY_SHIFT_STRING,
)

/datum/vote/shift_intensity/toggle_votable()
CONFIG_SET(flag/allow_shift_intensity_vote, !CONFIG_GET(flag/allow_shift_intensity_vote))

/datum/vote/shift_intensity/is_config_enabled()
return CONFIG_GET(flag/shift_intensity) && CONFIG_GET(flag/allow_shift_intensity_vote)

/datum/vote/shift_intensity/can_be_initiated(forced)
. = ..()
if(. != VOTE_AVAILABLE)
return

if(!forced && SSticker.current_state != GAME_STATE_PREGAME)
return "It's too late for that, the round is already starting."

return VOTE_AVAILABLE

/datum/vote/shift_intensity/initiate_vote(initiator, duration)
. = ..()
// Необходимо продлить время до старта раунда, если до него меньше 90 секунд (60 секунд сам воут + 30 на то, чтобы игроки успели понять тип раунда)
if(SSticker.GetTimeLeft() < 90 SECONDS)
SSticker.SetTimeLeft(90 SECONDS)

/datum/vote/shift_intensity/create_vote(mob/vote_creator)
if(SSshift_intensity.enable_hell_shift)
default_choices += ROUND_TOTALLY_HELL_SHIFT_STRING
return ..()

/datum/vote/shift_intensity/tiebreaker(list/winners)
// Если никто не проголосовал - смена будет *обычная*
if(choices_by_ckey.len == 0)
return ROUND_LIGHT_SHIFT_STRING
// Если ничья между грином и редом - будет блю
if((ROUND_LIGHT_SHIFT_STRING in winners) && (ROUND_HEAVY_SHIFT_STRING in winners))
return ROUND_MID_SHIFT_STRING
return ..()

/datum/vote/shift_intensity/finalize_vote(winning_option)
if(SSticker.current_state != GAME_STATE_PREGAME)
message_admins("Shift type vote ended after the round started. No changes to the round type.")
log_admin("Shift type vote ended after the round started. No changes to the round type.")
return

message_admins("Shift type vote ended.")
log_admin("Shift type vote ended.")

switch(winning_option)
if(ROUND_LIGHT_SHIFT_STRING, ROUND_MID_SHIFT_STRING, ROUND_HEAVY_SHIFT_STRING, ROUND_TOTALLY_HELL_SHIFT_STRING)
SSshift_intensity.set_intensity(winning_option)
else
CRASH("[type] wasn't passed a valid winning choice. (Got: [winning_option || "null"])")
5 changes: 5 additions & 0 deletions tgstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,7 @@
#include "code\__DEFINES\traits\sources.dm"
#include "code\__DEFINES\~ff_defines\barsigns.dm"
#include "code\__DEFINES\~ff_defines\DNA.dm"
#include "code\__DEFINES\~ff_defines\dynamic.dm"
#include "code\__DEFINES\~ff_defines\flavor_misc.dm"
#include "code\__DEFINES\~ff_defines\nabber_clothes_pathes.dm"
#include "code\__DEFINES\~ff_defines\say.dm"
Expand Down Expand Up @@ -9468,6 +9469,10 @@
#include "tff_modular\modules\shadekin\organs\_eyes.dm"
#include "tff_modular\modules\shadekin\sprites\ears.dm"
#include "tff_modular\modules\shadekin\sprites\tails.dm"
#include "tff_modular\modules\shift_intensity\shift_intensity.dm"
#include "tff_modular\modules\shift_intensity\shift_intensity_config.dm"
#include "tff_modular\modules\shift_intensity\shift_intensity_toggle.dm"
#include "tff_modular\modules\shift_intensity\shift_intensity_vote.dm"
#include "tff_modular\modules\silicon_laws_tweaks\code\upload.dm"
#include "tff_modular\modules\snowfall\snowfall.dm"
#include "tff_modular\modules\spiderbuff\giant_spiders.dm"
Expand Down
Loading