diff --git a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs index f2fdafdd8bb..40fec079197 100644 --- a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs @@ -636,7 +636,8 @@ public void RefreshAntags() selector.Setup(items, title, 250, description, guides: antag.Guides); selector.Select(Profile?.AntagPreferences.Contains(antag.ID) == true ? 0 : 1); - if (!_requirements.CheckRoleTime(antag.Requirements, out var reason)) + var requirements = _entManager.System().GetAntagRequirement(antag); + if (!_requirements.CheckRoleTime(requirements, out var reason)) { selector.LockRequirements(reason); Profile = Profile?.WithAntagPreference(antag.ID, false); diff --git a/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs b/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs index e05c15cda26..2e8fa7027e7 100644 --- a/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs +++ b/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs @@ -122,7 +122,13 @@ public bool IsAllowed(JobPrototype job, [NotNullWhen(false)] out FormattedMessag } // Sunrise-End - return CheckRoleTime(job.Requirements, out reason); + return CheckRoleTime(job, out reason); + } + + public bool CheckRoleTime(JobPrototype job, [NotNullWhen(false)] out FormattedMessage? reason) + { + var reqs = _entManager.System().GetJobRequirement(job); + return CheckRoleTime(reqs, out reason); } public bool CheckRoleTime(HashSet? requirements, [NotNullWhen(false)] out FormattedMessage? reason) diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index 52ccb1bd708..55c66e89334 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -374,6 +374,9 @@ public AntagSelectionPlayerPool GetPlayerPool(Entity en /// public bool IsSessionValid(Entity ent, ICommonSession? session, AntagSelectionDefinition def, EntityUid? mind = null) { + // TODO ROLE TIMERS + // Check if antag role requirements are met + if (session == null) return true; diff --git a/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs b/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs index 86026b230ba..14007edcbf9 100644 --- a/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs +++ b/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs @@ -14,6 +14,10 @@ public sealed partial class GhostRoleComponent : Component [DataField("rules")] private string _roleRules = "ghost-role-component-default-rules"; + // TODO ROLE TIMERS + // Actually make use of / enforce this requirement? + // Why is this even here. + // Move to ghost role prototype & respect CCvars.GameRoleTimerOverride [DataField("requirements")] public HashSet? Requirements; diff --git a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs index c3142a709a7..09956e313f3 100644 --- a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs +++ b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs @@ -35,6 +35,7 @@ public sealed class PlayTimeTrackingSystem : EntitySystem [Dependency] private readonly MindSystem _minds = default!; [Dependency] private readonly PlayTimeTrackingManager _tracking = default!; [Dependency] private readonly IAdminManager _adminManager = default!; + [Dependency] private readonly SharedRoleSystem _role = default!; public override void Initialize() { @@ -197,7 +198,6 @@ private void OnGetDisallowedJobs(ref GetDisallowedJobsEvent ev) public bool IsAllowed(ICommonSession player, string role) { if (!_prototypes.TryIndex(role, out var job) || - job.Requirements == null || !_cfg.GetCVar(CCVars.GameRoleTimers)) return true; @@ -224,19 +224,8 @@ public HashSet> GetDisallowedJobs(ICommonSession player) foreach (var job in _prototypes.EnumeratePrototypes()) { - if (job.Requirements != null) - { - foreach (var requirement in job.Requirements) - { - if (JobRequirements.TryRequirementMet(requirement, playTimes, out _, EntityManager, _prototypes)) - continue; - - goto NoRole; - } - } - - roles.Add(job.ID); - NoRole:; + if (JobRequirements.TryRequirementsMet(job, playTimes, out _, EntityManager, _prototypes)) + roles.Add(job.ID); } return roles; @@ -257,22 +246,14 @@ public void RemoveDisallowedJobs(NetUserId userId, List> j for (var i = 0; i < jobs.Count; i++) { - var job = jobs[i]; - - if (!_prototypes.TryIndex(job, out var jobber) || - jobber.Requirements == null || - jobber.Requirements.Count == 0) - continue; - - foreach (var requirement in jobber.Requirements) + if (_prototypes.TryIndex(jobs[i], out var job) + && JobRequirements.TryRequirementsMet(job, playTimes, out _, EntityManager, _prototypes)) { - if (JobRequirements.TryRequirementMet(requirement, playTimes, out _, EntityManager, _prototypes)) - continue; - - jobs.RemoveSwap(i); - i--; - break; + continue; } + + jobs.RemoveSwap(i); + i--; } } diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 23c16318e2e..35ddbcd6f11 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1,4 +1,5 @@ using Content.Shared.Maps; +using Content.Shared.Roles; using Robust.Shared; using Robust.Shared.Configuration; using Robust.Shared.Physics.Components; @@ -219,6 +220,12 @@ public static readonly CVarDef public static readonly CVarDef GameRoleTimers = CVarDef.Create("game.role_timers", true, CVar.SERVER | CVar.REPLICATED); + /// + /// Override default role requirements using a + /// + public static readonly CVarDef + GameRoleTimerOverride = CVarDef.Create("game.role_timer_override", "", CVar.SERVER | CVar.REPLICATED); + /// /// If roles should be restricted based on whether or not they are whitelisted. /// diff --git a/Content.Shared/Ghost/Roles/GhostRolePrototype.cs b/Content.Shared/Ghost/Roles/GhostRolePrototype.cs index 43d64322504..bc36774ea8b 100644 --- a/Content.Shared/Ghost/Roles/GhostRolePrototype.cs +++ b/Content.Shared/Ghost/Roles/GhostRolePrototype.cs @@ -15,24 +15,24 @@ public sealed partial class GhostRolePrototype : IPrototype /// /// The name of the ghostrole. /// - [DataField] + [DataField(required: true)] public string Name { get; set; } = default!; /// /// The description of the ghostrole. /// - [DataField] + [DataField(required: true)] public string Description { get; set; } = default!; /// /// The entity prototype of the ghostrole /// - [DataField] - public string EntityPrototype = default!; + [DataField(required: true)] + public EntProtoId EntityPrototype; /// /// Rules of the ghostrole /// - [DataField] + [DataField(required: true)] public string Rules = default!; -} \ No newline at end of file +} diff --git a/Content.Shared/Ghost/Roles/GhostRolesEuiMessages.cs b/Content.Shared/Ghost/Roles/GhostRolesEuiMessages.cs index b7457538ebe..b5d8fedbd92 100644 --- a/Content.Shared/Ghost/Roles/GhostRolesEuiMessages.cs +++ b/Content.Shared/Ghost/Roles/GhostRolesEuiMessages.cs @@ -11,6 +11,11 @@ public struct GhostRoleInfo public string Name { get; set; } public string Description { get; set; } public string Rules { get; set; } + + // TODO ROLE TIMERS + // Actually make use of / enforce this requirement? + // Why is this even here. + // Move to ghost role prototype & respect CCvars.GameRoleTimerOverride public HashSet? Requirements { get; set; } /// diff --git a/Content.Shared/Roles/AntagPrototype.cs b/Content.Shared/Roles/AntagPrototype.cs index 05c0c535049..3cb81d4f9c5 100644 --- a/Content.Shared/Roles/AntagPrototype.cs +++ b/Content.Shared/Roles/AntagPrototype.cs @@ -42,7 +42,9 @@ public sealed partial class AntagPrototype : IPrototype /// /// Requirements that must be met to opt in to this antag role. /// - [DataField("requirements")] + // TODO ROLE TIMERS + // Actually check if the requirements are met. Because apparently this is actually unused. + [DataField, Access(typeof(SharedRoleSystem), Other = AccessPermissions.None)] public HashSet? Requirements; /// diff --git a/Content.Shared/Roles/JobPrototype.cs b/Content.Shared/Roles/JobPrototype.cs index ff3b5090624..c8efb4c3179 100644 --- a/Content.Shared/Roles/JobPrototype.cs +++ b/Content.Shared/Roles/JobPrototype.cs @@ -43,7 +43,7 @@ public sealed partial class JobPrototype : IPrototype [ViewVariables(VVAccess.ReadOnly)] public string? LocalizedDescription => Description is null ? null : Loc.GetString(Description); - [DataField("requirements")] + [DataField, Access(typeof(SharedRoleSystem), Other = AccessPermissions.None)] public HashSet? Requirements; [DataField("joinNotifyCrew")] diff --git a/Content.Shared/Roles/JobRequirementOverridePrototype.cs b/Content.Shared/Roles/JobRequirementOverridePrototype.cs new file mode 100644 index 00000000000..d0ce649f360 --- /dev/null +++ b/Content.Shared/Roles/JobRequirementOverridePrototype.cs @@ -0,0 +1,20 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Roles; + +/// +/// Collection of job, antag, and ghost-role job requirements for per-server requirement overrides. +/// +[Prototype] +public sealed partial class JobRequirementOverridePrototype : IPrototype +{ + [ViewVariables] + [IdDataField] + public string ID { get; private set; } = default!; + + [DataField] + public Dictionary, HashSet> Jobs = new (); + + [DataField] + public Dictionary, HashSet> Antags = new (); +} diff --git a/Content.Shared/Roles/JobRequirements.cs b/Content.Shared/Roles/JobRequirements.cs index ba559fadd5c..c9d66fcf918 100644 --- a/Content.Shared/Roles/JobRequirements.cs +++ b/Content.Shared/Roles/JobRequirements.cs @@ -73,16 +73,18 @@ public static class JobRequirements { public static bool TryRequirementsMet( JobPrototype job, - Dictionary playTimes, + IReadOnlyDictionary playTimes, [NotNullWhen(false)] out FormattedMessage? reason, IEntityManager entManager, IPrototypeManager prototypes) { + var sys = entManager.System(); + var requirements = sys.GetJobRequirement(job); reason = null; - if (job.Requirements == null) + if (requirements == null) return true; - foreach (var requirement in job.Requirements) + foreach (var requirement in requirements) { if (!TryRequirementMet(requirement, playTimes, out reason, entManager, prototypes)) return false; @@ -130,7 +132,7 @@ public static bool TryRequirementMet( if (deptDiff <= 0) return true; - reason = FormattedMessage.FromMarkup(Loc.GetString( + reason = FormattedMessage.FromMarkupPermissive(Loc.GetString( "role-timer-department-insufficient", ("time", Math.Ceiling(deptDiff)), ("department", Loc.GetString(deptRequirement.Department)), @@ -141,7 +143,7 @@ public static bool TryRequirementMet( { if (deptDiff <= 0) { - reason = FormattedMessage.FromMarkup(Loc.GetString( + reason = FormattedMessage.FromMarkupPermissive(Loc.GetString( "role-timer-department-too-high", ("time", -deptDiff), ("department", Loc.GetString(deptRequirement.Department)), @@ -161,7 +163,7 @@ public static bool TryRequirementMet( if (overallDiff <= 0 || overallTime >= overallRequirement.Time) return true; - reason = FormattedMessage.FromMarkup(Loc.GetString( + reason = FormattedMessage.FromMarkupPermissive(Loc.GetString( "role-timer-overall-insufficient", ("time", Math.Ceiling(overallDiff)))); return false; @@ -170,7 +172,7 @@ public static bool TryRequirementMet( { if (overallDiff <= 0 || overallTime >= overallRequirement.Time) { - reason = FormattedMessage.FromMarkup(Loc.GetString("role-timer-overall-too-high", ("time", -overallDiff))); + reason = FormattedMessage.FromMarkupPermissive(Loc.GetString("role-timer-overall-too-high", ("time", -overallDiff))); return false; } @@ -197,7 +199,7 @@ public static bool TryRequirementMet( if (roleDiff <= 0) return true; - reason = FormattedMessage.FromMarkup(Loc.GetString( + reason = FormattedMessage.FromMarkupPermissive(Loc.GetString( "role-timer-role-insufficient", ("time", Math.Ceiling(roleDiff)), ("job", Loc.GetString(proto)), @@ -208,7 +210,7 @@ public static bool TryRequirementMet( { if (roleDiff <= 0) { - reason = FormattedMessage.FromMarkup(Loc.GetString( + reason = FormattedMessage.FromMarkupPermissive(Loc.GetString( "role-timer-role-too-high", ("time", -roleDiff), ("job", Loc.GetString(proto)), diff --git a/Content.Shared/Roles/SharedRoleSystem.cs b/Content.Shared/Roles/SharedRoleSystem.cs index d5ac2e5923a..81a360ebb7f 100644 --- a/Content.Shared/Roles/SharedRoleSystem.cs +++ b/Content.Shared/Roles/SharedRoleSystem.cs @@ -1,10 +1,12 @@ -using System.Linq; using Content.Shared.Administration.Logs; +using Content.Shared.CCVar; using Content.Shared.Database; +using Content.Shared.Ghost.Roles; using Content.Shared.Mind; using Content.Shared.Roles.Jobs; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; +using Robust.Shared.Configuration; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -16,14 +18,30 @@ public abstract class SharedRoleSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototypes = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedMindSystem _minds = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; // TODO please lord make role entities private readonly HashSet _antagTypes = new(); + private JobRequirementOverridePrototype? _requirementOverride; + public override void Initialize() { // TODO make roles entities SubscribeLocalEvent(OnJobGetAllRoles); + Subs.CVar(_cfg, CCVars.GameRoleTimerOverride, SetRequirementOverride, true); + } + + private void SetRequirementOverride(string value) + { + if (string.IsNullOrEmpty(value)) + { + _requirementOverride = null; + return; + } + + if (!_prototypes.TryIndex(value, out _requirementOverride )) + Log.Error($"Unknown JobRequirementOverridePrototype: {value}"); } private void OnJobGetAllRoles(EntityUid uid, JobComponent component, ref MindGetAllRolesEvent args) @@ -253,4 +271,36 @@ public void MindPlaySound(EntityUid mindId, SoundSpecifier? sound, MindComponent if (Resolve(mindId, ref mind) && mind.Session != null) _audio.PlayGlobal(sound, mind.Session); } + + public HashSet? GetJobRequirement(JobPrototype job) + { + if (_requirementOverride != null && _requirementOverride.Jobs.TryGetValue(job.ID, out var req)) + return req; + + return job.Requirements; + } + + public HashSet? GetJobRequirement(ProtoId job) + { + if (_requirementOverride != null && _requirementOverride.Jobs.TryGetValue(job, out var req)) + return req; + + return _prototypes.Index(job).Requirements; + } + + public HashSet? GetAntagRequirement(ProtoId antag) + { + if (_requirementOverride != null && _requirementOverride.Antags.TryGetValue(antag, out var req)) + return req; + + return _prototypes.Index(antag).Requirements; + } + + public HashSet? GetAntagRequirement(AntagPrototype antag) + { + if (_requirementOverride != null && _requirementOverride.Antags.TryGetValue(antag.ID, out var req)) + return req; + + return antag.Requirements; + } } diff --git a/Resources/Locale/en-US/guidebook/guides.ftl b/Resources/Locale/en-US/guidebook/guides.ftl index 66c1a42adf2..5b99ea2bbe9 100644 --- a/Resources/Locale/en-US/guidebook/guides.ftl +++ b/Resources/Locale/en-US/guidebook/guides.ftl @@ -100,6 +100,8 @@ guide-entry-rules-r8 = R8 guide-entry-rules-r9 = R9 guide-entry-rules-r10 = R10 guide-entry-rules-r11 = R11 +guide-entry-rules-r11-1 = R11-1 +guide-entry-rules-r11-2 = R11-2 guide-entry-rules-r12 = R12 guide-entry-rules-r13 = R13 guide-entry-rules-r14 = R14 diff --git a/Resources/Prototypes/Guidebook/rules.yml b/Resources/Prototypes/Guidebook/rules.yml index 72dd4764955..a867ca23364 100644 --- a/Resources/Prototypes/Guidebook/rules.yml +++ b/Resources/Prototypes/Guidebook/rules.yml @@ -251,6 +251,23 @@ ruleEntry: true priority: 11 text: "/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR11Escalation.xml" + children: + - RuleR11-1 + - RuleR11-2 + +- type: guideEntry + id: RuleR11-1 + name: guide-entry-rules-r11-1 + ruleEntry: true + priority: 10 + text: "/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR11-1AnimalEscalation.xml" + +- type: guideEntry + id: RuleR11-2 + name: guide-entry-rules-r11-2 + ruleEntry: true + priority: 10 + text: "/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR11-2ConflictTypes.xml" - type: guideEntry id: RuleR12 diff --git a/Resources/Prototypes/Roles/requirement_overrides.yml b/Resources/Prototypes/Roles/requirement_overrides.yml new file mode 100644 index 00000000000..62041f42d7e --- /dev/null +++ b/Resources/Prototypes/Roles/requirement_overrides.yml @@ -0,0 +1,16 @@ +- type: jobRequirementOverride + id: Reduced + jobs: + Captain: + - !type:DepartmentTimeRequirement + department: Engineering + time: 3600 # 1 hours + - !type:DepartmentTimeRequirement + department: Medical + time: 3600 # 1 hours + - !type:DepartmentTimeRequirement + department: Security + time: 3600 # 1 hours + - !type:DepartmentTimeRequirement + department: Command + time: 3600 # 1 hour diff --git a/Resources/ServerInfo/Guidebook/ServerRules/CoreRules/RuleC11AhelpThreats.xml b/Resources/ServerInfo/Guidebook/ServerRules/CoreRules/RuleC11AhelpThreats.xml index 47420264946..15784c4dfeb 100644 --- a/Resources/ServerInfo/Guidebook/ServerRules/CoreRules/RuleC11AhelpThreats.xml +++ b/Resources/ServerInfo/Guidebook/ServerRules/CoreRules/RuleC11AhelpThreats.xml @@ -1,6 +1,6 @@  # Core Rule 11 - Do not threaten to ahelp other players or argue with them about rules - Don't threaten to ahelp a player, don't tell them you are ahelping them, and don't tell them you did ahelp them. You can argue in character about Space Law, but do not argue about whether something is or is not against the rules. If you think someone is breaking a rule, ahelp them. If you don't think someone is breaking a rule, don't ahelp them. Either way, the best thing that you can do once you after is to continue in-character. + This rule covers out-of-character (OOC) and in-character (IC) actions. Don't threaten to ahelp a player, don't tell them you are ahelping them, and don't tell them you did ahelp them. You can argue in character about Space Law, but do not argue about whether something is or is not against the rules. If you think someone is breaking a rule, ahelp them. If you don't think someone is breaking a rule, don't ahelp them. Either way, the best thing that you can do after is to continue in-character. ## Example Scenario 1 You are a security officer and think someone who is causing a ton of problems for security is not an antag and is breaking the rules by doing so. diff --git a/Resources/ServerInfo/Guidebook/ServerRules/CoreRules/RuleC13CharacterNames.xml b/Resources/ServerInfo/Guidebook/ServerRules/CoreRules/RuleC13CharacterNames.xml index faaedd4d511..6c01f9de23a 100644 --- a/Resources/ServerInfo/Guidebook/ServerRules/CoreRules/RuleC13CharacterNames.xml +++ b/Resources/ServerInfo/Guidebook/ServerRules/CoreRules/RuleC13CharacterNames.xml @@ -6,6 +6,8 @@ - Usernames, objects, random characters, very "low effort" names, "meta" names, or otherwise implausible names cannot be used as names. See examples below. - Admin rulings on IC names are final and disputes should be done through the forums, not by refusing to comply with an admin + Clowns and mimes are exempt from the prohibition on titles/honorifics, and have loosened restrictions on low effort and implausible names. + ## Clarification on "Meta" Names Meta names are ones which attempt to take advantage of some game mechanic or game design choice. "Urist McHands" is a meta name because it is the default name used for admin spawned humans. "Operator Whiskey" is a meta name because it follows the naming pattern of nuclear operatives. This rule is not intended to prevent things like nuclear operatives using a fake ID with names that appear to be nuclear operative names if they decide that they want to do that. diff --git a/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR11Escalation.xml b/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR11Escalation.xml index 6f91fa0fb12..18ebc79a836 100644 --- a/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR11Escalation.xml +++ b/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR11Escalation.xml @@ -24,7 +24,7 @@ People using or brandishing Syndicate items can typically be presumed to have lethal intent. Someone with lethal intent can typically be immediately escalated against at a lethal level, a notable exception is if you have the tools to safely detain them. ## Escalation Involving Animals - See [textlink="Escalation Involving Animals" link="RuleR11-1AnimalEscalation"]. + See [textlink="Escalation Involving Animals" link="RuleR11-1"]. ## Exemptions Escalation rules aren't enforced against non-players, but players will be held responsible for rule violations even if they don't realize that a character or animal was controlled by another player. Characters who have purple text saying that they are catatonic are considered non-players. Characters who are disconnected are still considered players. @@ -33,7 +33,7 @@ Escalation rules are enforced even against non-players. ## Examples of Conflict Types - See [textlink="Examples of Conflict Types" link="RuleR11-2ConflictTypes"]. + See [textlink="Examples of Conflict Types" link="RuleR11-2"]. ## Example Scenarios These examples assume that you are not an antagonist. @@ -54,8 +54,8 @@ Prohibited: - A player starts punching you, so you gib them. - A clown throws a pie at you and steals your shoes, so you stab them to crit with a screwdriver. - - You are a security officer and tell someone to stop so you can question them. They run away so you use a truncheon to beat them to crit. - - An authorized person who you think is unauthorized enters a high risk area of the station, like the armory or atmospherics, so you attack them until they leave. + - You are a security officer and tell someone to stop, so you can question them. They run away so you use a truncheon to beat them to crit. + - An authorized person who you unreasonably or carelessly think is unauthorized enters a high risk area of the station, like the armory or atmospherics, so you attack them until they leave. - An unauthorized person enters a low risk area of the station, like cargo, and you start attacking them with no other escalation. - Slipping security all round because they are security. - Blocking the head of personnel in their office using walls because they didn't give you what you asked for. diff --git a/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR15SpaceLaw.xml b/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR15SpaceLaw.xml index e2d51d672a1..57effb54699 100644 --- a/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR15SpaceLaw.xml +++ b/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR15SpaceLaw.xml @@ -2,9 +2,18 @@ # Roleplay Rule 15 - Command and Security must follow Space Law All non-antagonist command and security roles must obey [textlink="Space Law" link="SpaceLaw"]. This includes non-antagonists who are promoted to or gain a position during the round in any way. This also includes non-antagonists who are acting as a security role. - This prohibits use of syndicate items, including uplinks by command and security. + Space Law violations should be prioritized based on severity and the current situation. + + This prohibits use of syndicate items outside extreme emergencies, including uplinks by command and security. This also prohibits the preparing of syndicate items for an emergency. ## Examples + Acceptable: + - After a war announcement, a security officer ignores crewmembers carrying contraband so that they can focus on preparing to defend the station. + - A security officer disarms someone attacking them with an energy sword, then uses the sword to kill the attacker. + + Prohibited: + - A security officer carries around an energy sword in case of an emergency. + Roles that are included: - A security officer - The Captain diff --git a/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR2Familiars.xml b/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR2Familiars.xml index 4f008e93c5a..51a445dfe0f 100644 --- a/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR2Familiars.xml +++ b/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR2Familiars.xml @@ -1,6 +1,6 @@  # Roleplay Rule 2 - Familiars must obey their master - Familiars are considered non-antagonists, but have instructions to obey someone. They must obey this person even if it causes them to violate Roleplay Rules or die. You are only a familiar if the game clearly and explicitly tells you that you are a familiar. You are only the familiar of the person the game tells you. If your master dies, you can continue to attempt to fulfill orders given to you before they died. You can defend your master without an explicit order to, but must obey your master if they order you to not defend them. + Familiars are considered non-antagonists, but have instructions to obey someone. They must obey this person even if it causes them to violate Roleplay Rules or die. You are only a familiar if the game clearly and explicitly tells you that you are a familiar. You are only the familiar of the person the game tells you. If your master dies, you can continue to attempt to fulfill orders given to you before they died. You can defend your master without an explicit order to, but must obey your master if they order you to not defend them. Orders do not override Core Rules. Masters giving orders that violate Roleplay Rules are the ones that will be held responsible for the rule violations. You can ahelp masters who you believe are breaking rules with an order. diff --git a/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR4Metashield.xml b/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR4Metashield.xml index 2e263be896a..4ebbad326c8 100644 --- a/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR4Metashield.xml +++ b/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR4Metashield.xml @@ -10,7 +10,7 @@ The following are shielded: - Current game mode and possible antags during the current game mode. - Events from previous rounds. - - Events from previous characters. + - Events you experienced as a different character. - All information related to the player of a character rather than the character itself. (See "Metafriending and Metagrudging" below.) - All information gained while dead or a ghost. - The fact that a round will end. @@ -25,6 +25,7 @@ The revealing condition for this shield is any of the following: - discovering a blood red hardsuit + - discovering a nuclear operative's shuttle - an operative name - a War Ops announcement - being a nuclear operative diff --git a/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR5Arrivals.xml b/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR5Arrivals.xml index a54211f32f2..b4a06427401 100644 --- a/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR5Arrivals.xml +++ b/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR5Arrivals.xml @@ -1,6 +1,6 @@  # Roleplay Rule 5 - Do not interfere with arrivals - The arrivals station, the arrivals shuttle, at the area immediately around the arrivals shuttle at the station ("arrivals") are off-limits to antagonistic activity or damage (even to antagonists). Do not prevent people from safely arriving to the station. Do not cause people to die immediately after arriving at the station. + The arrivals terminal/station, the arrivals shuttle, at the area immediately around the arrivals shuttle at the station ("arrivals") are off-limits to antagonistic activity or damage (even to antagonists). Do not prevent people from safely arriving to the station. Do not cause people to die immediately after arriving at the station. There is an exemption for antagonists that are allowed to perform mass station sabotage if there is no reasonable way to limit the damage of the mass station sabotage. This exemption only applies to damage that is a direct result of the mass station sabotage. diff --git a/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR9MassSabotage.xml b/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR9MassSabotage.xml index bc7996f23e8..366ac6666f2 100644 --- a/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR9MassSabotage.xml +++ b/Resources/ServerInfo/Guidebook/ServerRules/RoleplayRules/RuleR9MassSabotage.xml @@ -15,6 +15,7 @@ - Permanently round removing a single person so that you can impersonate them to make it easier for you to complete a steal objective. - Sabotaging station power 10 minutes into the round to try to get the shuttle called because you've completed all of your other objectives and have one to escape on the shuttle alive. - Sabotaging a department's power 10 minutes into the round to make a steal objective easier to accomplish. + - Permanently round removing many people who have demonstrated a persistence and a capability to either kill you or interfere with the completion of your objectives. Prohibited: - As a traitor with 3 kill objectives, taking steps to permanently round remove many non-objective people who are no longer an immediate threat to you, even if it is done to prevent yourself from being discovered. diff --git a/Resources/ServerInfo/Guidebook/ServerRules/SpaceLaw/SLCrimeList.xml b/Resources/ServerInfo/Guidebook/ServerRules/SpaceLaw/SLCrimeList.xml index 17a2139658d..04e7139a48b 100644 --- a/Resources/ServerInfo/Guidebook/ServerRules/SpaceLaw/SLCrimeList.xml +++ b/Resources/ServerInfo/Guidebook/ServerRules/SpaceLaw/SLCrimeList.xml @@ -42,22 +42,22 @@ - Failure to Comply + Failure to Comply (E) - Breach of Arrest + Breach of Arrest (E) - Breach of Custody + Breach of Custody (E) - Refusal of Mental Shielding + Refusal of Mental Shielding (E) @@ -67,17 +67,17 @@ - Possession: Substances + Possession: Substances (P) - Possession: Gear + Possession: Gear (P) - Possession: Weaponry + Possession: Weaponry (P) @@ -95,7 +95,7 @@ - Petty Theft + Petty Theft (H) @@ -104,7 +104,7 @@ - Grand Theft + Grand Theft (H) @@ -123,17 +123,17 @@ - Vandalism + Vandalism (D) - Damage of Property + Damage of Property (D) - Mass Destruction + Mass Destruction (D) @@ -142,7 +142,7 @@ - Terrorism + Terrorism (D) @@ -152,7 +152,7 @@ - Trespass + Trespass (T) @@ -161,7 +161,7 @@ - Secure Trespass + Secure Trespass (T) @@ -183,22 +183,22 @@ - Endangerment + Endangerment (V) - Assault + Assault (V) - Attempted Murder + Attempted Murder (V) - Prevention of Revival + Prevention of Revival (V) @@ -216,17 +216,17 @@ - Manslaughter + Manslaughter (V) - Murder + Murder (V) - Mass Murder + Mass Murder (V) @@ -236,7 +236,7 @@ - Disturbance + Disturbance (R) @@ -245,7 +245,7 @@ - Rioting + Rioting (R) diff --git a/Resources/ServerInfo/Guidebook/ServerRules/SpaceLaw/SLRestrictedWeapons.xml b/Resources/ServerInfo/Guidebook/ServerRules/SpaceLaw/SLRestrictedWeapons.xml index c1d8ff3b027..0872683d1cf 100644 --- a/Resources/ServerInfo/Guidebook/ServerRules/SpaceLaw/SLRestrictedWeapons.xml +++ b/Resources/ServerInfo/Guidebook/ServerRules/SpaceLaw/SLRestrictedWeapons.xml @@ -1,9 +1,12 @@  # Space Law: Restricted Weapons -- \[Security\] Lethal firearms, excluding syndicate firearms, proto kinetic accelerators, glaives, daggers, crushers and the antique laser gun +- \[Security\] Lethal firearms, excluding: syndicate firearms, proto kinetic accelerators, glaives, daggers, crushers, the captain's saber, antique laser guns, and deckards - \[Security/Salvage\] Proto kinetic accelerators, glaives, daggers, and crushers -- \[Security/Command\] Antique laser gun +- \[Security/Command\] The captain's saber, antique laser guns, and deckards +- \[Salvage\] seismic charges +- \[Atmospherics\] Fire axes - \[None\] Syndicate weapons +- \[None\] Explosive devices, excluding seismic charges - \[None\] Swords - \[None\] Improvised weaponry, including baseball bats - \[None\] Lethal implants diff --git a/Resources/ServerInfo/Guidebook/ServerRules/SpaceLaw/SpaceLaw.xml b/Resources/ServerInfo/Guidebook/ServerRules/SpaceLaw/SpaceLaw.xml index f2b913a1714..b672e35204d 100644 --- a/Resources/ServerInfo/Guidebook/ServerRules/SpaceLaw/SpaceLaw.xml +++ b/Resources/ServerInfo/Guidebook/ServerRules/SpaceLaw/SpaceLaw.xml @@ -37,7 +37,7 @@ Use common sense and humanity when issuing punishments. You should not always seek out the highest punishment you can, you don't have to always give the maximum time or always look to demote someone. Prisoners cooperating and on good behavior should have their sentences reduced. Always take in account the severity and only charge for what is needed for someone to learn their lesson. - [color=#a4885c]Stackable Crimes:[/color] Crimes are to be considered 'stackable' in the sense that if you charge someone with two or more different crimes, you should combine the times you would give them for each crime. Linked crimes, shown in matching colors on the Quick Crime Guide, can not be stacked and instead override each other, you should pick the highest crime that matches the case. + [color=#a4885c]Stackable Crimes:[/color] Crimes are to be considered 'stackable' in the sense that if you charge someone with two or more different crimes, you should combine the times you would give them for each crime. Linked crimes, shown in matching colors and suffixes on the Quick Crime Guide, can not be stacked and instead override each other, you should pick the highest crime that matches the case. - Example: A suspect has committed a 2-01 (possession of restricted gear) and a 3-01 (possession of restricted weapons). The maximum sentence here would be 10 minutes due to them being linked crimes, and 3-01 is the greater crime. - Example 2: A suspect commits a 3-04 (Secure trespassing) and a 3-06 (manslaughter). Those crimes stack since they are not linked crimes. You could sentence for a maximum of 20 minutes, but context matters heavily, and maximum sentences should only be used for the worst offenders. @@ -53,7 +53,7 @@ ## Major Punishments [color=#a4885c]Permanent Confinement:[/color] Being held in the permanent brig for the entire duration of the shift. A person is eligible for permanent confinement if their timed sentence would exceed 15 minutes. Any persons subject to this punishment are required to be transported in cuffs to CentComm at the end of the shift. A permanent prisoner can not be deprived of anything covered by the section "Treatment Of Prisoners". - [color=#a4885c]Execution:[/color] A humane way of dealing with extremely unruly crewmates. A prisoner who has been given the death sentence may pick how they wish to be killed, common methods are firing line, lethal injection, exile, and high voltage electrocution. Another alternate method of "execution" is the process of placing a staff's mind into a borg, this is allowed so long as it is lawful. Execution can only be issued with the captain's or acting captain's approval; if the HoS is acting captain or there is no acting captain, all heads of staff are to hold a vote on the matter. + [color=#a4885c]Execution:[/color] A humane way of dealing with extremely unruly crewmates. Within reason, a prisoner who has been given the death sentence may pick how they wish to be killed, common methods are firing line, lethal injection, exile, and high voltage electrocution. Another alternate method of "execution" is the process of placing a staff's mind into a borg, this is allowed so long as it is lawful. Execution can only be issued with the captain's or acting captain's approval; if the HoS is acting captain or there is no acting captain, all heads of staff are to hold a vote on the matter. ## Restricted Items Items in the lists are preceded by an indication of which department or job is legally allowed to use or possess the item on most stations. The station captain may modify these lists as they see fit so long as they exercise due care and provide reasonable notification to the station. Members of command who oversee a department that is permitted to use a restricted item may issue permits to specific people outside of their department to use those items. "None" indicates that there are no departments or roles authorized to use or possess the item.