Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
48923f5
Initial work on unified
Shroopy Sep 3, 2024
9f43171
Fix doubled defs
Shroopy Sep 4, 2024
9732f40
More work :3
Shroopy Sep 4, 2024
9fc3722
Successful build
Shroopy Sep 4, 2024
63b9b11
Remove storyteller vote
Shroopy Sep 4, 2024
262ad7b
Remove storyteller desc to_chats if we're not running storyteller vote
Shroopy Sep 4, 2024
db0417c
Lots of cool work
Shroopy Sep 4, 2024
268f8db
Yet more work! It's looking pretty good!
Shroopy Sep 4, 2024
f4fc8d5
Documentation
Shroopy Sep 4, 2024
fad1e0c
antag costs
Shroopy Sep 4, 2024
03e4637
Increase event costs
Shroopy Sep 4, 2024
d4dfb28
fix changeling meteor
Shroopy Sep 4, 2024
e0bbd75
Make refunding event reset cooldown
Shroopy Sep 4, 2024
fff6d0b
Lots'a work
Shroopy Sep 4, 2024
f3b8edd
work work work
Shroopy Sep 4, 2024
dac1f7f
important fix
Shroopy Sep 4, 2024
71ecb7d
Fix weights
Shroopy Sep 4, 2024
3931fd4
Fix log names
Shroopy Sep 4, 2024
4414a4e
Fix runtime
Shroopy Sep 4, 2024
d886178
Add missed events
Shroopy Sep 5, 2024
0516410
Fix job weighting
Shroopy Sep 5, 2024
a0f1693
Fix roundstart event job weighting
Shroopy Sep 5, 2024
9382a33
Uncommit the thing that shouldn't have been committed
Shroopy Sep 5, 2024
2a6a0aa
Lower antag cost, increase antag cooldown
Shroopy Sep 5, 2024
b9c0558
Add threat level to the roundstart command report
Shroopy Sep 5, 2024
a19a7dc
Change antag cap to take into account captaincy
Shroopy Sep 7, 2024
4e68151
Revert "Change antag cap to take into account captaincy"
Shroopy Sep 7, 2024
71836d8
Fix up antag event numbers
Shroopy Sep 7, 2024
25a4698
Lower the costs of some events
Shroopy Sep 7, 2024
b48648e
Move cost calculation to a new proc, make antags cost less with highe…
Shroopy Sep 7, 2024
191ed27
Events are now all bought on roundstart
Shroopy Sep 7, 2024
59dc3f7
Fix ghost role
Shroopy Sep 7, 2024
bf2544f
fix not getting num of ready players
Shroopy Sep 7, 2024
d37be6b
Fixed roundstart event checks
Shroopy Sep 7, 2024
f45d72a
Things are looking pretty good, probably good to testmerge
Shroopy Sep 8, 2024
b632c9e
Fix event weighting with no heads
Shroopy Sep 8, 2024
1c1fcb7
Increase base points
Shroopy Sep 8, 2024
80ab2ac
Increase nukeops and blob cost, fix divergence report
Shroopy Sep 8, 2024
2299e4d
Fix missing 0
Shroopy Sep 8, 2024
7882e19
Definitely good changes from the future
Shroopy Sep 8, 2024
00d9bf3
All reverting done
Shroopy Sep 8, 2024
715ddb4
Re-add roundstart_control
Shroopy Sep 9, 2024
75915bb
Fix dupes
Shroopy Sep 9, 2024
c75f42a
Readd forced next event
Shroopy Sep 9, 2024
214fb14
Cool work
Shroopy Sep 9, 2024
3fca0dd
Very cool work
Shroopy Sep 9, 2024
4e249f8
Add missing minutes def
Shroopy Sep 9, 2024
bf7e7c3
make syndie pod less likely
Shroopy Sep 9, 2024
1c49365
Fix communicating cooldown
Shroopy Sep 9, 2024
07ce8e9
Fix unconverted string
Shroopy Sep 9, 2024
5db08e7
Change scheduled event time to show seconds
Shroopy Sep 9, 2024
ba6346e
Add changing point values
Shroopy Sep 9, 2024
7442f05
Increase cost and lower likeliness of moldies
Shroopy Sep 11, 2024
77ed20c
Moldies need engineering
Shroopy Sep 11, 2024
36991fb
Merge branch 'master' into unified
Shroopy Sep 16, 2024
6847584
Reset a bit to upstream
Shroopy Sep 16, 2024
36d63cc
Add bug edit commend
Shroopy Sep 16, 2024
2511a49
Lower base points
Shroopy Sep 26, 2024
d03be81
don't count heads as able to deal with nondepartmental events
Shroopy Oct 1, 2024
abebdb4
Suspends when there are no valid events
Shroopy Dec 9, 2024
ac13cf7
Merge branch 'master' into unified
Shroopy Dec 9, 2024
370f2a4
Fix proc rename
Shroopy Dec 9, 2024
f96a3ed
Don't save/load persistence stuff
Shroopy Dec 9, 2024
2ca9e69
Merge branch 'master' of https://github.com/Shroopy/Bugstation into u…
Shroopy Dec 28, 2024
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
2 changes: 1 addition & 1 deletion code/controllers/subsystem/persistence/_persistence.dm
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ SUBSYSTEM_DEF(persistence)
load_panic_bunker() //SKYRAT EDIT ADDITION - PANICBUNKER
load_tram_counter()
load_adventures()
load_storyteller_type() //BUBBER EDIT ADD - Storyteller
// load_storyteller_type() //BUBBER EDIT ADD - Storyteller // BUG EDIT - Unified
return SS_INIT_SUCCESS

///Collects all data to persist.
Expand Down
2 changes: 1 addition & 1 deletion code/controllers/subsystem/statpanel.dm
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ 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)]%)",
"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
// "Storyteller: [SSgamemode.storyteller ? SSgamemode.storyteller.name : "N/A"]", // BUBBER EDIT ADDITION // BUG REMOVAL
"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
" ",
Expand Down
9 changes: 8 additions & 1 deletion code/controllers/subsystem/ticker.dm
Original file line number Diff line number Diff line change
Expand Up @@ -172,13 +172,15 @@ SUBSYSTEM_DEF(ticker)
send2chat(new /datum/tgs_message_content("<@&[CONFIG_GET(string/game_alert_role_id)]> Round **[GLOB.round_id]** starting on [SSmapping.current_map.map_name], [CONFIG_GET(string/servername)]! \nIf you wish to be pinged for game related stuff, go to <#[CONFIG_GET(string/role_assign_channel_id)]> and assign yourself the roles."), CONFIG_GET(string/channel_announce_new_game)) // SKYRAT EDIT - Role ping and round ID in game-alert
// SKYRAT EDIT END
current_state = GAME_STATE_PREGAME
/* BUGSTATION REMOVAL START
// BUBBERSTATION EDIT START
var/storyteller = CONFIG_GET(string/default_storyteller)
if(storyteller)
SSgamemode.set_storyteller(text2path(storyteller), TRUE)
else
SSvote.initiate_vote(/datum/vote/storyteller, "Storyteller Vote", forced = TRUE)
// BUBBERSTATION EDIT END
BUGSTATION REMOVAL END */
SStitle.change_title_screen() //SKYRAT EDIT ADDITION - Title screen
addtimer(CALLBACK(SStitle, TYPE_PROC_REF(/datum/controller/subsystem/title, change_title_screen)), 1 SECONDS) //SKYRAT EDIT ADDITION - Title screen
//Everyone who wants to be an observer is now spawned
Expand Down Expand Up @@ -257,10 +259,15 @@ SUBSYSTEM_DEF(ticker)
//Configure mode and assign player to antagonists
var/can_continue = FALSE
// can_continue = SSdynamic.pre_setup() //Choose antagonists // BUBBER EDIT - STORYTELLER (note: maybe disable)
/* BUG REMOVAL START
//BUBBER EDIT BEGIN - STORYTELLER
SSgamemode.init_storyteller()
can_continue = SSgamemode.pre_setup()
//BUBBER EDIT END - STORYTELLER
BUG REMOVAL END */
// BUG ADDITION START
can_continue = SSunified.pre_setup()
// BUG ADDITION END

CHECK_TICK
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_PRE_JOBS_ASSIGNED, src)
Expand Down Expand Up @@ -330,7 +337,7 @@ SUBSYSTEM_DEF(ticker)
/datum/controller/subsystem/ticker/proc/PostSetup()
set waitfor = FALSE
SSdynamic.post_setup()
SSgamemode.post_setup() // BUBBER EDIT - Storyteller
SSunified.post_setup() // BUBBER EDIT - Storyteller // BUG EDIT - Unified
GLOB.start_state = new /datum/station_state()
GLOB.start_state.count()

Expand Down
3 changes: 2 additions & 1 deletion code/modules/admin/topic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,8 @@
if(!check_rights(R_ADMIN))
return
//SSdynamic.admin_panel() // BUBBER EDIT - STORYTELLER
SSgamemode.ui_interact(usr) // BUBBER EDIT - STORYTELLER
//SSgamemode.ui_interact(usr) // BUBBER EDIT - STORYTELLER // BUG EDIT - Unified
SSunified.admin_panel(usr) // BUG EDIT - Unified
else if(href_list["call_shuttle"])
if(!check_rights(R_ADMIN))
return
Expand Down
15 changes: 11 additions & 4 deletions code/modules/events/_event.dm
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,11 @@
var/map_flags = NONE

/datum/round_event_control/New()
SHOULD_CALL_PARENT(TRUE) // BUG EDIT
. = ..() // BUG EDIT
if(config && !wizardevent) // Magic is unaffected by configs
earliest_start = CEILING(earliest_start * CONFIG_GET(number/events_min_time_mul), 1)
min_players = CEILING(min_players * CONFIG_GET(number/events_min_players_mul), 1)
// min_players = CEILING(min_players * CONFIG_GET(number/events_min_players_mul), 1) // BUG EDIT
if(!length(admin_setup))
return
var/list/admin_setup_types = admin_setup.Copy()
Expand Down Expand Up @@ -74,13 +76,13 @@
SHOULD_CALL_PARENT(TRUE)
if(occurrences >= max_occurrences)
return FALSE
if(!(roundstart ^ SSticker.HasRoundStarted())) // BUBBER EDIT: Roundstart checks added
if(roundstart && !SSticker.HasRoundStarted()) // BUBBER EDIT: Roundstart checks added // BUG EDIT
return FALSE
if(weight == 0) // BUBBER EDIT: Weight check added
if(calculated_weight == 0 && unified_cost != 0) // BUBBER EDIT: Weight check added // BUG EDIT
return FALSE
if(!allow_magic && wizardevent != SSevents.wizardmode)
return FALSE
if(players_amt < min_players)
if(players_amt < CEILING(min_players * CONFIG_GET(number/events_min_players_mul), 1)) // BUG EDIT
return FALSE
if(holidayID && !check_holidays(holidayID))
return FALSE
Expand All @@ -92,6 +94,11 @@
if (dynamic_should_hijack && SSdynamic.random_event_hijacked != HIJACKED_NOTHING)
return FALSE

// BUG ADDITION START
if(calculated_cost > SSunified.points)
return FALSE
// BUG ADDITION END

return TRUE

/datum/round_event_control/proc/preRunEvent()
Expand Down
2 changes: 2 additions & 0 deletions code/modules/events/ghost_role/_ghost_role.dm
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,13 @@
if(MAP_ERROR)
message_admins("[role_name] cannot be spawned due to a map error.")
kill()
SSunified.refund_failed_event(control) // BUG ADDITION
return
if(NOT_ENOUGH_PLAYERS)
message_admins("[role_name] cannot be spawned due to lack of players signing up.")
deadchat_broadcast(" did not get enough candidates ([minimum_required]) to spawn.", "<b>[role_name]</b>", message_type=DEADCHAT_ANNOUNCEMENT)
kill()
SSunified.refund_failed_event(control) // BUG ADDITION
return
if(SUCCESSFUL_SPAWN)
message_admins("[role_name] spawned successfully.")
Expand Down
19 changes: 15 additions & 4 deletions modular_zubbers/code/modules/storyteller/_events/_event.dm
Original file line number Diff line number Diff line change
Expand Up @@ -58,20 +58,31 @@
if(SSticker.HasRoundStarted())
if(roundstart)
if(!can_run_post_roundstart)
return "<a class='linkOff'>Fire</a> <a class='linkOff'>Schedule</a>"
return "<a class='linkOff'>Fire</a>" // BUG EDIT
return "<a href='?src=[REF(src)];action=fire'>Fire</a> <a href='?src=[REF(src)];action=schedule'>Schedule</a>"
else
return "<a href='?src=[REF(src)];action=fire'>Fire</a> <a href='?src=[REF(src)];action=schedule'>Schedule</a> <a href='?src=[REF(src)];action=force_next'>Force Next</a>"
return "<a href='?src=[REF(src)];action=fire'>Fire</a> <a href='?src=[REF(src)];action=schedule'>Schedule</a>" // BUG EDIT
else
if(roundstart)
return "<a href='?src=[REF(src)];action=force_next'>Force Roundstart</a>"
return "<a href='?src=[REF(src)];action=fire'>Fire</a>" // BUG EDIT
else
return "<a class='linkOff'>Fire</a> <a class='linkOff'>Schedule</a> <a class='linkOff'>Force Next</a>"
return "<a href='?src=[REF(src)];action=schedule'>Schedule</a>" // BUG EDIT

/datum/round_event_control/Topic(href, href_list)
. = ..()
switch(href_list["action"])
// BUG EDIT START
if("force_next")
message_admins("[key_name_admin(usr)] has forced scheduled event [src.name].")
log_admin_private("[key_name(usr)] has forced scheduled event [src.name].")
SSgamemode.force_event(src)
if("fire")
message_admins("[key_name_admin(usr)] has fired event [src.name].")
log_admin_private("[key_name(usr)] has fired event [src.name].")
run_event(admin_forced = TRUE)
if("schedule")
var/delay = input(usr, "Enter the time in seconds to run the event in.", "Schedule Event") as null|num
message_admins("[key_name_admin(usr)] has scheduled event [src.name] to run in [delay] seconds.")
log_admin_private("[key_name(usr)] has scheduled event [src.name] to run in [delay] seconds.")
SSunified.schedule_event(src, delay SECONDS, calculated_cost, TRUE, FALSE)
// BUG EDIT END
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
. = ..()
if(!.)
return
if(!roundstart && !SSgamemode.can_inject_antags())
if(!roundstart && !SSunified.can_inject_antags()) // BUG EDIT
return FALSE
if(!get_antag_amount())
return FALSE
Expand All @@ -80,15 +80,15 @@

/datum/round_event_control/antagonist/proc/get_candidates()
var/round_started = SSticker.HasRoundStarted()
var/list/candidates = SSgamemode.get_candidates(antag_flag, pick_roundstart_players = !round_started, restricted_roles = restricted_roles)
var/list/candidates = SSunified.get_candidates(antag_flag, pick_roundstart_players = !round_started, restricted_roles = restricted_roles) // BUG EDIT
return candidates

/datum/round_event_control/antagonist/solo
typepath = /datum/round_event/antagonist/solo

/datum/round_event_control/antagonist/proc/get_antag_amount()

var/people = SSgamemode.get_correct_popcount()
var/people = SSunified.get_correct_popcount() // BUG EDIT
var/amount = base_antags + FLOOR(people / denominator, 1)

if(antag_datum && maximum_antags_global > 0)
Expand Down
2 changes: 2 additions & 0 deletions modular_zubbers/code/modules/storyteller/gamemode.dm
Original file line number Diff line number Diff line change
Expand Up @@ -688,9 +688,11 @@ SUBSYSTEM_DEF(gamemode)
if((storyboy.population_min && storyboy.population_min > client_amount) || (storyboy.population_max && storyboy.population_max < client_amount))
continue
choices += storyboy.name
/* BUG REMOVAL START
///Because the vote subsystem is dumb and does not support any descriptions, we dump them into world.
to_chat(world, span_notice("<b>[storyboy.name]</b>"))
to_chat(world, span_notice("[storyboy.desc]"))
BUG REMOVAL END */
return choices

/datum/controller/subsystem/gamemode/proc/storyteller_vote_result(winner_name)
Expand Down
38 changes: 33 additions & 5 deletions modular_zubbers/code/modules/storyteller/scheduled_event.dm
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
///Scheduled event datum for SSgamemode to put events into.
///Scheduled event datum for SSunified to put events into. // BUG EDIT
/datum/scheduled_event
/// What event are scheduling.
var/datum/round_event_control/event
Expand Down Expand Up @@ -35,7 +35,7 @@
/// For admins who want to reschedule the event.
/datum/scheduled_event/proc/reschedule(new_time)
start_time = new_time
alerted_admins = FALSE
// alerted_admins = FALSE // BUG EDIT

/datum/scheduled_event/proc/get_href_actions()
var/round_started = SSticker.HasRoundStarted()
Expand All @@ -54,15 +54,43 @@
message_admins("Scheduled Event: [event] was unable to run and has been refunded.")
log_admin("Scheduled Event: [event] was unable to run and has been refunded.")

SSgamemode.refund_scheduled_event(src)
SSunified.refund_scheduled_event(src) // BUG EDIT
return

///Trigger the event and remove the scheduled datum
message_admins("Scheduled Event: [event] successfully triggered.")
SSgamemode.TriggerEvent(event)
SSgamemode.remove_scheduled_event(src)
SSunified.TriggerEvent(event) // BUG EDIT
SSunified.remove_scheduled_event(src) // BUG EDIT

/datum/scheduled_event/Destroy()
remove_occurence()
event = null
return ..()

/datum/scheduled_event/Topic(href, href_list)
. = ..()
if(QDELETED(src))
return
var/round_started = SSticker.HasRoundStarted()
switch(href_list["action"])
if("cancel")
message_admins("[key_name_admin(usr)] cancelled scheduled event [event.name].")
log_admin_private("[key_name(usr)] cancelled scheduled event [event.name].")
SSunified.remove_scheduled_event(src) // BUG EDIT
if("refund")
message_admins("[key_name_admin(usr)] refunded scheduled event [event.name].")
log_admin_private("[key_name(usr)] refunded scheduled event [event.name].")
SSunified.refund_scheduled_event(src) // BUG EDIT
if("reschedule")
var/new_schedule = input(usr, "New schedule time (in seconds):", "Reschedule Event") as num|null
if(isnull(new_schedule) || QDELETED(src))
return
start_time = world.time + new_schedule * 1 SECONDS
message_admins("[key_name_admin(usr)] rescheduled event [event.name] to [new_schedule] seconds.")
log_admin_private("[key_name(usr)] rescheduled event [event.name] to [new_schedule] seconds.")
if("fire")
if(!round_started)
return
message_admins("[key_name_admin(usr)] has fired scheduled event [event.name].")
log_admin_private("[key_name(usr)] has fired scheduled event [event.name].")
try_fire()
2 changes: 2 additions & 0 deletions modular_zubbers/code/modules/storyteller/storyteller_vote.dm
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,12 @@ We then just check what the last one is in SSgamemode.storyteller_vote_choices()

#define STORYTELLER_LAST_FILEPATH "data/storyteller_last_round.txt"

/* BUG REMOVAL START - unified
/// Extends collect_data
/datum/controller/subsystem/persistence/collect_data()
. = ..()
collect_storyteller_type()
BUG REMOVAL END */

/// Loads last storyteller into last_storyteller_type
/datum/controller/subsystem/persistence/proc/load_storyteller_type()
Expand Down
29 changes: 29 additions & 0 deletions modular_zzbug/code/__DEFINES/unified_defines.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#define TAG_ENGINEERING "engineering"
#define TAG_MEDICAL "medical"
#define TAG_SECURITY "security"
#define TAG_SCIENCE "science"
#define TAG_WIZARD "wizard"

#define UNIFIED_WAIT_TIME 20 SECONDS

#define UNIFIED_PANEL_MAIN "Main"
#define UNIFIED_PANEL_VARIABLES "Variables"

#define COST_VERY_MINOR 5
#define COST_MINOR 10
#define COST_MODERATE 20
#define COST_SEMIMAJOR 30
#define COST_MAJOR 60
#define COST_SUPERMAJOR BASE_POINTS * 1.25

#define WEIGHT_NORMAL 10
#define WEIGHT_LESS_LIKELY 7.5
#define WEIGHT_UNLIKELY 5

// TODO add to config
#define BASE_POINTS 120

#define STARTING_DELAY 10 * BASE_POINTS/starting_points MINUTES
#define SCHEDULE_DELAY 3 MINUTES

#define COOLDOWN_MULT (120/BASE_POINTS) * (BASE_POINTS/starting_points)
9 changes: 9 additions & 0 deletions modular_zzbug/code/modules/unified/_event.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/datum/round_event_control
/// This event's cost in the Unified system. Equates to a cooldown in minutes for the event.
var/unified_cost = 0

/// The cooldown in minutes to use instead of the cost.
var/cooldown_override = 0

/// Last calculated weight that Unified assigned this event
var/calculated_cost = 0
70 changes: 70 additions & 0 deletions modular_zzbug/code/modules/unified/divergency_report.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/datum/controller/subsystem/unified/proc/send_trait_report()
. = "<b><i>Central Command Status Summary</i></b><hr>"

. += "<b>"
if(starting_points < BASE_POINTS * 0.75)
. += "Low"
else if(starting_points < BASE_POINTS * 1.25)
. += "Moderate"
else
. += "High"
. += " station threat detected.</b>"

SSstation.generate_station_goals(20)

var/list/station_goals = SSstation.get_station_goals()

if(!length(station_goals))
. += "<hr><b>No assigned goals.</b><BR>"
else
. += generate_station_goal_report(station_goals)
if(!SSstation.station_traits.len)
. += "<hr><b>No identified shift divergencies.</b><BR>"
else
. += generate_station_trait_report()

. += "<hr>This concludes your shift-start evaluation. Have a secure shift!<hr>\
<p style=\"color: grey; text-align: justify;\">This label certifies an Intern has reviewed the above before sending. This document is the property of Nanotrasen Corporation.</p>"

print_command_report(., "Central Command Status Summary", announce = FALSE)
priority_announce("Hello, crew of [station_name()]. Our intern has finished their shift-start divergency and goals evaluation, which has been sent to your communications console. Have a secure shift!", "Divergency Report", SSstation.announcer.get_rand_report_sound())



/*
* Generate a list of station goals available to purchase to report to the crew.
*
* Returns a formatted string all station goals that are available to the station.
*/
/datum/controller/subsystem/unified/proc/generate_station_goal_report(var/list/station_goals)
. = "<hr><b>Special Orders for [station_name()]:</b><BR>"
var/list/goal_reports = list()
for(var/datum/station_goal/station_goal as anything in station_goals)
station_goal.on_report()
goal_reports += station_goal.get_report()

. += goal_reports.Join("<hr>")
return
/*
* Generate a list of active station traits to report to the crew.
*
* Returns a formatted string of all station traits (that are shown) affecting the station.
*/
/datum/controller/subsystem/unified/proc/generate_station_trait_report()
if(!SSstation.station_traits.len)
return
. = "<hr><b>Identified shift divergencies:</b><BR>"
for(var/datum/station_trait/station_trait as anything in SSstation.station_traits)
if(!station_trait.show_in_report)
continue
. += "[station_trait.get_report()]<BR>"
return

/*/datum/controller/subsystem/unified/proc/generate_station_goals()
var/list/possible = subtypesof(/datum/station_goal)
var/goal_weights = 0
while(possible.len && goal_weights < 1) // station goal budget is 1
var/datum/station_goal/picked = pick_n_take(possible)
goal_weights += initial(picked.weight)
SSstation.goals_by_type += new picked // does this still work?
*/
Loading