Objectives ecs rework (#19967)
Co-authored-by: deltanedas <@deltanedas:kde.org>
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Requires that the player dies to be complete.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(DieConditionSystem))]
|
||||
public sealed partial class DieConditionComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Objective condition that requires the player to be a ninja and have doorjacked at least a random number of airlocks.
|
||||
/// Requires <see cref="NumberObjectiveComponent"/> to function.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(NinjaConditionsSystem))]
|
||||
public sealed partial class DoorjackConditionComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Requires that the player is on the emergency shuttle's grid when docking to CentCom.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(EscapeShuttleConditionSystem))]
|
||||
public sealed partial class EscapeShuttleConditionComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Requires that a target completes half of their objectives.
|
||||
/// Depends on <see cref="TargetObjectiveComponent"/> to function.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(HelpProgressConditionSystem))]
|
||||
public sealed partial class HelpProgressConditionComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Requires that a target stays alive.
|
||||
/// Depends on <see cref="TargetObjectiveComponent"/> to function.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(KeepAliveConditionSystem))]
|
||||
public sealed partial class KeepAliveConditionComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Requires that a target dies or, if <see cref="RequireDead"/> is false, is not on the emergency shuttle.
|
||||
/// Depends on <see cref="TargetObjectiveComponent"/> to function.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(KillPersonConditionSystem))]
|
||||
public sealed partial class KillPersonConditionComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Whether the target must be truly dead, ignores missing evac.
|
||||
/// </summary>
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool RequireDead = false;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Requires that there are a certain number of other traitors alive for this objective to be given.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(MultipleTraitorsRequirementSystem))]
|
||||
public sealed partial class MultipleTraitorsRequirementComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Number of traitors, excluding yourself, that have to exist.
|
||||
/// </summary>
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
||||
public int Traitors = 2;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Requires that the player is not a member of command.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(NotCommandRequirementSystem))]
|
||||
public sealed partial class NotCommandRequirementComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
using Content.Shared.Roles;
|
||||
using Content.Shared.Roles.Jobs;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||
|
||||
/// <summary>
|
||||
/// Requires that the player not have a certain job to have this objective.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(NotJobRequirementSystem))]
|
||||
public sealed partial class NotJobRequirementComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// ID of the job to ban from having this objective.
|
||||
/// </summary>
|
||||
[DataField(required: true, customTypeSerializer: typeof(PrototypeIdSerializer<JobPrototype>))]
|
||||
public string Job = string.Empty;
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Objective has a target number of something.
|
||||
/// When the objective is assigned it randomly picks this target from a minimum to a maximum.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(NumberObjectiveSystem))]
|
||||
public sealed partial class NumberObjectiveComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Number to use in the objective condition.
|
||||
/// </summary>
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
||||
public int Target;
|
||||
|
||||
/// <summary>
|
||||
/// Minimum number for target to roll.
|
||||
/// </summary>
|
||||
[DataField(required: true)]
|
||||
public int Min;
|
||||
|
||||
/// <summary>
|
||||
/// Maximum number for target to roll.
|
||||
/// </summary>
|
||||
[DataField(required: true)]
|
||||
public int Max;
|
||||
|
||||
/// <summary>
|
||||
/// Optional title locale id, passed "count" with <see cref="Target"/>.
|
||||
/// </summary>
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
||||
public string? Title;
|
||||
|
||||
/// <summary>
|
||||
/// Optional description locale id, passed "count" with <see cref="Target"/>.
|
||||
/// </summary>
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
||||
public string? Description;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
using Content.Shared.Whitelist;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Requires that the objective entity has no blacklisted components.
|
||||
/// Lets you check for incompatible objectives.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(ObjectiveBlacklistRequirementSystem))]
|
||||
public sealed partial class ObjectiveBlacklistRequirementComponent : Component
|
||||
{
|
||||
[DataField(required: true), ViewVariables(VVAccess.ReadWrite)]
|
||||
public EntityWhitelist Blacklist = new();
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Sets the target for <see cref="TargetObjectiveComponent"/> to a random head.
|
||||
/// If there are no heads it will fallback to any person.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(KillPersonConditionSystem))]
|
||||
public sealed partial class PickRandomHeadComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Sets the target for <see cref="TargetObjectiveComponent"/> to a random person.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(KillPersonConditionSystem))]
|
||||
public sealed partial class PickRandomPersonComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Sets the target for <see cref="KeepAliveConditionComponent"/> to a random traitor.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(KeepAliveConditionSystem))]
|
||||
public sealed partial class RandomTraitorAliveComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Sets the target for <see cref="HelpProgressConditionComponent"/> to a random traitor.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(HelpProgressConditionSystem))]
|
||||
public sealed partial class RandomTraitorProgressComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
using Content.Shared.Whitelist;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Requires that the player's mind matches a whitelist.
|
||||
/// Typical use is checking for (antagonist) roles.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(RoleRequirementSystem))]
|
||||
public sealed partial class RoleRequirementComponent : Component
|
||||
{
|
||||
[DataField(required: true), ViewVariables(VVAccess.ReadWrite)]
|
||||
public EntityWhitelist Roles = new();
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Marker component for social objectives and kill objectives to be mutually exclusive.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed partial class SocialObjectiveComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Requires that the player is a ninja and blew up their spider charge at its target location.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(NinjaConditionsSystem))]
|
||||
public sealed partial class SpiderChargeConditionComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Requires the player to be a ninja that has a spider charge target assigned, which is almost always the case.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(SpiderChargeTargetRequirementSystem))]
|
||||
public sealed partial class SpiderChargeTargetRequirementComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Requires that you steal a certain item.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(StealConditionSystem))]
|
||||
public sealed partial class StealConditionComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// The id of the item to steal.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Works by prototype id not tags or anything so it has to be the exact item.
|
||||
/// </remarks>
|
||||
[DataField(required: true, customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>)), ViewVariables(VVAccess.ReadWrite)]
|
||||
public string Prototype = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Help newer players by saying e.g. "steal the chief engineer's advanced magboots"
|
||||
/// instead of "steal advanced magboots. Should be a loc string.
|
||||
/// </summary>
|
||||
[DataField("owner"), ViewVariables(VVAccess.ReadWrite)]
|
||||
public string? OwnerText;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Objective condition that requires the player to be a ninja and have stolen at least a random number of technologies.
|
||||
/// Requires <see cref="NumberObjectiveComponent"/> to function.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(NinjaConditionsSystem))]
|
||||
public sealed partial class StealResearchConditionComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Just requires that the player is not dead, ignores evac and what not.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(SurviveConditionSystem))]
|
||||
public sealed partial class SurviveConditionComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
[RegisterComponent, Access(typeof(TargetObjectiveSystem))]
|
||||
public sealed partial class TargetObjectiveComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Locale id for the objective title.
|
||||
/// It is passed "targetName" and "job" arguments.
|
||||
/// </summary>
|
||||
[DataField(required: true), ViewVariables(VVAccess.ReadWrite)]
|
||||
public string Title = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Mind entity id of the target.
|
||||
/// This must be set by another system using <see cref="TargetObjectiveSystem.SetTarget"/>.
|
||||
/// </summary>
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
||||
public EntityUid? Target;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using Content.Server.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Objectives.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Requires that the player is a ninja and has called in a threat.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(NinjaConditionsSystem))]
|
||||
public sealed partial class TerrorConditionComponent : Component
|
||||
{
|
||||
}
|
||||
Reference in New Issue
Block a user