Merge remote-tracking branch 'refs/remotes/wizards/master'

# Conflicts:
#	Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs
This commit is contained in:
VigersRay 2024-06-07 20:16:41 +03:00
commit c01034d336
27 changed files with 217 additions and 85 deletions

View file

@ -636,7 +636,8 @@ namespace Content.Client.Lobby.UI
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<SharedRoleSystem>().GetAntagRequirement(antag);
if (!_requirements.CheckRoleTime(requirements, out var reason))
{
selector.LockRequirements(reason);
Profile = Profile?.WithAntagPreference(antag.ID, false);

View file

@ -122,7 +122,13 @@ public sealed class JobRequirementsManager : ISharedPlaytimeManager
}
// 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<SharedRoleSystem>().GetJobRequirement(job);
return CheckRoleTime(reqs, out reason);
}
public bool CheckRoleTime(HashSet<JobRequirement>? requirements, [NotNullWhen(false)] out FormattedMessage? reason)

View file

@ -374,6 +374,9 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem<AntagSelection
/// </summary>
public bool IsSessionValid(Entity<AntagSelectionComponent> ent, ICommonSession? session, AntagSelectionDefinition def, EntityUid? mind = null)
{
// TODO ROLE TIMERS
// Check if antag role requirements are met
if (session == null)
return true;

View file

@ -14,6 +14,10 @@ namespace Content.Server.Ghost.Roles.Components
[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<JobRequirement>? Requirements;

View file

@ -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 @@ public sealed class PlayTimeTrackingSystem : EntitySystem
public bool IsAllowed(ICommonSession player, string role)
{
if (!_prototypes.TryIndex<JobPrototype>(role, out var job) ||
job.Requirements == null ||
!_cfg.GetCVar(CCVars.GameRoleTimers))
return true;
@ -224,19 +224,8 @@ public sealed class PlayTimeTrackingSystem : EntitySystem
foreach (var job in _prototypes.EnumeratePrototypes<JobPrototype>())
{
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 sealed class PlayTimeTrackingSystem : EntitySystem
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--;
}
}

View file

@ -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 @@ namespace Content.Shared.CCVar
public static readonly CVarDef<bool>
GameRoleTimers = CVarDef.Create("game.role_timers", true, CVar.SERVER | CVar.REPLICATED);
/// <summary>
/// Override default role requirements using a <see cref="JobRequirementOverridePrototype"/>
/// </summary>
public static readonly CVarDef<string>
GameRoleTimerOverride = CVarDef.Create("game.role_timer_override", "", CVar.SERVER | CVar.REPLICATED);
/// <summary>
/// If roles should be restricted based on whether or not they are whitelisted.
/// </summary>

View file

@ -15,24 +15,24 @@ public sealed partial class GhostRolePrototype : IPrototype
/// <summary>
/// The name of the ghostrole.
/// </summary>
[DataField]
[DataField(required: true)]
public string Name { get; set; } = default!;
/// <summary>
/// The description of the ghostrole.
/// </summary>
[DataField]
[DataField(required: true)]
public string Description { get; set; } = default!;
/// <summary>
/// The entity prototype of the ghostrole
/// </summary>
[DataField]
public string EntityPrototype = default!;
[DataField(required: true)]
public EntProtoId EntityPrototype;
/// <summary>
/// Rules of the ghostrole
/// </summary>
[DataField]
[DataField(required: true)]
public string Rules = default!;
}
}

View file

@ -11,6 +11,11 @@ namespace Content.Shared.Ghost.Roles
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<JobRequirement>? Requirements { get; set; }
/// <inheritdoc cref="GhostRoleKind"/>

View file

@ -42,7 +42,9 @@ public sealed partial class AntagPrototype : IPrototype
/// <summary>
/// Requirements that must be met to opt in to this antag role.
/// </summary>
[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<JobRequirement>? Requirements;
/// <summary>

View file

@ -43,7 +43,7 @@ namespace Content.Shared.Roles
[ViewVariables(VVAccess.ReadOnly)]
public string? LocalizedDescription => Description is null ? null : Loc.GetString(Description);
[DataField("requirements")]
[DataField, Access(typeof(SharedRoleSystem), Other = AccessPermissions.None)]
public HashSet<JobRequirement>? Requirements;
[DataField("joinNotifyCrew")]

View file

@ -0,0 +1,20 @@
using Robust.Shared.Prototypes;
namespace Content.Shared.Roles;
/// <summary>
/// Collection of job, antag, and ghost-role job requirements for per-server requirement overrides.
/// </summary>
[Prototype]
public sealed partial class JobRequirementOverridePrototype : IPrototype
{
[ViewVariables]
[IdDataField]
public string ID { get; private set; } = default!;
[DataField]
public Dictionary<ProtoId<JobPrototype>, HashSet<JobRequirement>> Jobs = new ();
[DataField]
public Dictionary<ProtoId<AntagPrototype>, HashSet<JobRequirement>> Antags = new ();
}

View file

@ -73,16 +73,18 @@ namespace Content.Shared.Roles
{
public static bool TryRequirementsMet(
JobPrototype job,
Dictionary<string, TimeSpan> playTimes,
IReadOnlyDictionary<string, TimeSpan> playTimes,
[NotNullWhen(false)] out FormattedMessage? reason,
IEntityManager entManager,
IPrototypeManager prototypes)
{
var sys = entManager.System<SharedRoleSystem>();
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 @@ namespace Content.Shared.Roles
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 @@ namespace Content.Shared.Roles
{
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 @@ namespace Content.Shared.Roles
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 @@ namespace Content.Shared.Roles
{
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 @@ namespace Content.Shared.Roles
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 @@ namespace Content.Shared.Roles
{
if (roleDiff <= 0)
{
reason = FormattedMessage.FromMarkup(Loc.GetString(
reason = FormattedMessage.FromMarkupPermissive(Loc.GetString(
"role-timer-role-too-high",
("time", -roleDiff),
("job", Loc.GetString(proto)),

View file

@ -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<Type> _antagTypes = new();
private JobRequirementOverridePrototype? _requirementOverride;
public override void Initialize()
{
// TODO make roles entities
SubscribeLocalEvent<JobComponent, MindGetAllRolesEvent>(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 abstract class SharedRoleSystem : EntitySystem
if (Resolve(mindId, ref mind) && mind.Session != null)
_audio.PlayGlobal(sound, mind.Session);
}
public HashSet<JobRequirement>? GetJobRequirement(JobPrototype job)
{
if (_requirementOverride != null && _requirementOverride.Jobs.TryGetValue(job.ID, out var req))
return req;
return job.Requirements;
}
public HashSet<JobRequirement>? GetJobRequirement(ProtoId<JobPrototype> job)
{
if (_requirementOverride != null && _requirementOverride.Jobs.TryGetValue(job, out var req))
return req;
return _prototypes.Index(job).Requirements;
}
public HashSet<JobRequirement>? GetAntagRequirement(ProtoId<AntagPrototype> antag)
{
if (_requirementOverride != null && _requirementOverride.Antags.TryGetValue(antag, out var req))
return req;
return _prototypes.Index(antag).Requirements;
}
public HashSet<JobRequirement>? GetAntagRequirement(AntagPrototype antag)
{
if (_requirementOverride != null && _requirementOverride.Antags.TryGetValue(antag.ID, out var req))
return req;
return antag.Requirements;
}
}

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -1,6 +1,6 @@
<Document>
# 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.

View file

@ -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.

View file

@ -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.

View file

@ -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

View file

@ -1,6 +1,6 @@
<Document>
# 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.
</Document>

View file

@ -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

View file

@ -1,6 +1,6 @@
<Document>
# 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.

View file

@ -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.

View file

@ -42,22 +42,22 @@
</ColorBox>
<ColorBox Color="#593a4e">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Failure to Comply
Failure to Comply (E)
</Box>
</ColorBox>
<ColorBox Color="#593a4e">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Breach of Arrest
Breach of Arrest (E)
</Box>
</ColorBox>
<ColorBox Color="#593a4e">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Breach of Custody
Breach of Custody (E)
</Box>
</ColorBox>
<ColorBox Color="#593a4e">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Refusal of Mental Shielding
Refusal of Mental Shielding (E)
</Box>
</ColorBox>
<ColorBox>
@ -67,17 +67,17 @@
</ColorBox>
<ColorBox Color="#2f3832">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Possession: Substances
Possession: Substances (P)
</Box>
</ColorBox>
<ColorBox Color="#2f3832">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Possession: Gear
Possession: Gear (P)
</Box>
</ColorBox>
<ColorBox Color="#2f3832">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Possession: Weaponry
Possession: Weaponry (P)
</Box>
</ColorBox>
<ColorBox>
@ -95,7 +95,7 @@
</ColorBox>
<ColorBox Color="#2e422e">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Petty Theft
Petty Theft (H)
</Box>
</ColorBox>
<ColorBox>
@ -104,7 +104,7 @@
</ColorBox>
<ColorBox Color="#2e422e">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Grand Theft
Grand Theft (H)
</Box>
</ColorBox>
<ColorBox>
@ -123,17 +123,17 @@
</ColorBox>
<ColorBox Color="#453a59">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Vandalism
Vandalism (D)
</Box>
</ColorBox>
<ColorBox Color="#453a59">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Damage of Property
Damage of Property (D)
</Box>
</ColorBox>
<ColorBox Color="#453a59">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Mass Destruction
Mass Destruction (D)
</Box>
</ColorBox>
<ColorBox>
@ -142,7 +142,7 @@
</ColorBox>
<ColorBox Color="#453a59">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Terrorism
Terrorism (D)
</Box>
</ColorBox>
<ColorBox>
@ -152,7 +152,7 @@
</ColorBox>
<ColorBox Color="#59563a">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Trespass
Trespass (T)
</Box>
</ColorBox>
<ColorBox>
@ -161,7 +161,7 @@
</ColorBox>
<ColorBox Color="#59563a">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Secure Trespass
Secure Trespass (T)
</Box>
</ColorBox>
<ColorBox>
@ -183,22 +183,22 @@
</ColorBox>
<ColorBox Color="#4d2e2e">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Endangerment
Endangerment (V)
</Box>
</ColorBox>
<ColorBox Color="#4d2e2e">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Assault
Assault (V)
</Box>
</ColorBox>
<ColorBox Color="#4d2e2e">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Attempted Murder
Attempted Murder (V)
</Box>
</ColorBox>
<ColorBox Color="#4d2e2e">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Prevention of Revival
Prevention of Revival (V)
</Box>
</ColorBox>
<ColorBox>
@ -216,17 +216,17 @@
</ColorBox>
<ColorBox Color="#4d2e2e">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Manslaughter
Manslaughter (V)
</Box>
</ColorBox>
<ColorBox Color="#4d2e2e">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Murder
Murder (V)
</Box>
</ColorBox>
<ColorBox Color="#4d2e2e">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Mass Murder
Mass Murder (V)
</Box>
</ColorBox>
<ColorBox>
@ -236,7 +236,7 @@
</ColorBox>
<ColorBox Color="#3b4354">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Disturbance
Disturbance (R)
</Box>
</ColorBox>
<ColorBox>
@ -245,7 +245,7 @@
</ColorBox>
<ColorBox Color="#3b4354">
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
Rioting
Rioting (R)
</Box>
</ColorBox>
<ColorBox>

View file

@ -1,9 +1,12 @@
<Document>
# 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

View file

@ -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.