* Partial work on StationSystem refactor. * WIP station jobs API. * forgor to fire off grid events. * Partial implementation of StationSpawningSystem * whoops infinite loop. * Spawners should work now. * it compiles. * tfw * Vestigial code cleanup. * fix station deletion. * attempt to make tests go brr * add latejoin spawnpoints to test maps. * make sure the station still exists while destructing spawners. * forgot an exists check. * destruction order check. * hopefully fix final test. * fail-safe radstorm. * Deep-clean job code further. This is bugged!!!!! * Fix job bug. (init order moment) * whooo cleanup * New job selection algorithm that tries to distribute fairly across stations. * small nitpicks * Give the heads their weights to replace the head field. * make overflow assign take a station list. * moment * Fixes and test #1 of many. * please fix nullspace * AssignJobs should no longer even consider showing up on a trace. * add comment. * Introduce station configs, praying i didn't miss something. * in one small change stations are now fully serializable. * Further doc comments. * whoops. * Solve bug where assignjobs didn't account for roundstart. * Fix spawning, improve the API. Caught an oversight in stationsystem that should've broke everything but didn't, whoops. * Goodbye JobController. * minor fix.. * fix test fail, remove debug logs. * quick serialization fixes. * fixes.. * sus * partialing * Update Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs Co-authored-by: Kara <lunarautomaton6@gmail.com> * Use dirtying to avoid rebuilding the list 2,100 times. * add a bajillion more lines of docs (mostly in AssignJobs so i don't ever forget how it works) * Update Content.IntegrationTests/Tests/Station/StationJobsTest.cs Co-authored-by: Kara <lunarautomaton6@gmail.com> * Add the Mysteriously Missing Captain Check. * Put maprender back the way it belongs. * I love addressing reviews. * Update Content.Server/Station/Systems/StationJobsSystem.cs Co-authored-by: Kara <lunarautomaton6@gmail.com> * doc cleanup. * Fix bureaucratic error, add job slot tests. * zero cost abstractions when * cri * saner error. * Fix spawning failing certain tests due to gameticker not handling falliability correctly. Can't fix this until I refactor the rest of spawning code. * submodule gaming * Packedenger. * Documentation consistency. Co-authored-by: Kara <lunarautomaton6@gmail.com>
164 lines
5.0 KiB
C#
164 lines
5.0 KiB
C#
using Robust.Shared.Network;
|
|
using Robust.Shared.Serialization;
|
|
|
|
namespace Content.Shared.GameTicking
|
|
{
|
|
public abstract class SharedGameTicker : EntitySystem
|
|
{
|
|
// See ideally these would be pulled from the job definition or something.
|
|
// But this is easier, and at least it isn't hardcoded.
|
|
//TODO: Move these, they really belong in StationJobsSystem or a cvar.
|
|
public const string FallbackOverflowJob = "Passenger";
|
|
public const string FallbackOverflowJobName = "passenger";
|
|
}
|
|
|
|
[Serializable, NetSerializable]
|
|
public sealed class TickerJoinLobbyEvent : EntityEventArgs
|
|
{
|
|
}
|
|
|
|
[Serializable, NetSerializable]
|
|
public sealed class TickerJoinGameEvent : EntityEventArgs
|
|
{
|
|
}
|
|
|
|
[Serializable, NetSerializable]
|
|
public sealed class TickerLateJoinStatusEvent : EntityEventArgs
|
|
{
|
|
// TODO: Make this a replicated CVar, honestly.
|
|
public bool Disallowed { get; }
|
|
|
|
public TickerLateJoinStatusEvent(bool disallowed)
|
|
{
|
|
Disallowed = disallowed;
|
|
}
|
|
}
|
|
|
|
|
|
[Serializable, NetSerializable]
|
|
public sealed class TickerLobbyStatusEvent : EntityEventArgs
|
|
{
|
|
public bool IsRoundStarted { get; }
|
|
public string? LobbySong { get; }
|
|
public string? LobbyBackground { get; }
|
|
public bool YouAreReady { get; }
|
|
// UTC.
|
|
public TimeSpan StartTime { get; }
|
|
public bool Paused { get; }
|
|
|
|
public TickerLobbyStatusEvent(bool isRoundStarted, string? lobbySong, string? lobbyBackground, bool youAreReady, TimeSpan startTime, bool paused)
|
|
{
|
|
IsRoundStarted = isRoundStarted;
|
|
LobbySong = lobbySong;
|
|
LobbyBackground = lobbyBackground;
|
|
YouAreReady = youAreReady;
|
|
StartTime = startTime;
|
|
Paused = paused;
|
|
}
|
|
}
|
|
|
|
[Serializable, NetSerializable]
|
|
public sealed class TickerLobbyInfoEvent : EntityEventArgs
|
|
{
|
|
public string TextBlob { get; }
|
|
|
|
public TickerLobbyInfoEvent(string textBlob)
|
|
{
|
|
TextBlob = textBlob;
|
|
}
|
|
}
|
|
|
|
[Serializable, NetSerializable]
|
|
public sealed class TickerLobbyCountdownEvent : EntityEventArgs
|
|
{
|
|
/// <summary>
|
|
/// The game time that the game will start at.
|
|
/// </summary>
|
|
public TimeSpan StartTime { get; }
|
|
|
|
/// <summary>
|
|
/// Whether or not the countdown is paused
|
|
/// </summary>
|
|
public bool Paused { get; }
|
|
|
|
public TickerLobbyCountdownEvent(TimeSpan startTime, bool paused)
|
|
{
|
|
StartTime = startTime;
|
|
Paused = paused;
|
|
}
|
|
}
|
|
|
|
[Serializable, NetSerializable]
|
|
public sealed class TickerLobbyReadyEvent : EntityEventArgs
|
|
{
|
|
/// <summary>
|
|
/// The Status of the Player in the lobby (ready, observer, ...)
|
|
/// </summary>
|
|
public Dictionary<NetUserId, LobbyPlayerStatus> Status { get; }
|
|
|
|
public TickerLobbyReadyEvent(Dictionary<NetUserId, LobbyPlayerStatus> status)
|
|
{
|
|
Status = status;
|
|
}
|
|
}
|
|
|
|
[Serializable, NetSerializable]
|
|
public sealed class TickerJobsAvailableEvent : EntityEventArgs
|
|
{
|
|
/// <summary>
|
|
/// The Status of the Player in the lobby (ready, observer, ...)
|
|
/// </summary>
|
|
public Dictionary<EntityUid, Dictionary<string, uint?>> JobsAvailableByStation { get; }
|
|
public Dictionary<EntityUid, string> StationNames { get; }
|
|
|
|
public TickerJobsAvailableEvent(Dictionary<EntityUid, string> stationNames, Dictionary<EntityUid, Dictionary<string, uint?>> jobsAvailableByStation)
|
|
{
|
|
StationNames = stationNames;
|
|
JobsAvailableByStation = jobsAvailableByStation;
|
|
}
|
|
}
|
|
|
|
[Serializable, NetSerializable]
|
|
public sealed class RoundEndMessageEvent : EntityEventArgs
|
|
{
|
|
[Serializable, NetSerializable]
|
|
public struct RoundEndPlayerInfo
|
|
{
|
|
public string PlayerOOCName;
|
|
public string? PlayerICName;
|
|
public string Role;
|
|
public bool Antag;
|
|
public bool Observer;
|
|
public bool Connected;
|
|
}
|
|
|
|
public string GamemodeTitle { get; }
|
|
public string RoundEndText { get; }
|
|
public TimeSpan RoundDuration { get; }
|
|
public int RoundId { get; }
|
|
public int PlayerCount { get; }
|
|
public RoundEndPlayerInfo[] AllPlayersEndInfo { get; }
|
|
|
|
public RoundEndMessageEvent(string gamemodeTitle, string roundEndText, TimeSpan roundDuration, int roundId,
|
|
int playerCount, RoundEndPlayerInfo[] allPlayersEndInfo)
|
|
{
|
|
GamemodeTitle = gamemodeTitle;
|
|
RoundEndText = roundEndText;
|
|
RoundDuration = roundDuration;
|
|
RoundId = roundId;
|
|
PlayerCount = playerCount;
|
|
AllPlayersEndInfo = allPlayersEndInfo;
|
|
}
|
|
}
|
|
|
|
|
|
[Serializable, NetSerializable]
|
|
public enum LobbyPlayerStatus : sbyte
|
|
{
|
|
NotReady = 0,
|
|
Ready,
|
|
Observer,
|
|
}
|
|
}
|
|
|