dragon antag refactor (#28217)

* remove dragon system usage of GenericAntag

* add AntagRandomSpawn for making antags spawn at a random tile

* add AntagSpawner to make an antag spawner just spawn an entity

* add antag prototype for dragon since it never had one

* make dragon spawner a GhostRoleAntagSpawner, remove GenericAntag

* make dragon rule use AntagSelection and stuff

* remove dragon GenericAntag rule

* add back to spawn menu

---------

Co-authored-by: deltanedas <@deltanedas:kde.org>
This commit is contained in:
deltanedas
2024-05-31 15:08:26 +00:00
committed by GitHub
parent 6e278a12fb
commit 5da2151924
11 changed files with 110 additions and 45 deletions

View File

@@ -0,0 +1,22 @@
using Content.Server.Antag.Components;
using Content.Server.GameTicking.Rules;
namespace Content.Server.Antag;
public sealed class AntagRandomSpawnSystem : GameRuleSystem<AntagRandomSpawnComponent>
{
[Dependency] private readonly SharedTransformSystem _transform = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<AntagRandomSpawnComponent, AntagSelectLocationEvent>(OnSelectLocation);
}
private void OnSelectLocation(Entity<AntagRandomSpawnComponent> ent, ref AntagSelectLocationEvent args)
{
if (TryFindRandomTile(out _, out _, out _, out var coords))
args.Coordinates.Add(_transform.ToMapCoordinates(coords));
}
}

View File

@@ -0,0 +1,21 @@
using Content.Server.Antag.Components;
namespace Content.Server.Antag;
/// <summary>
/// Spawns an entity when creating an antag for <see cref="AntagSpawnerComponent"/>.
/// </summary>
public sealed class AntagSpawnerSystem : EntitySystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<AntagSpawnerComponent, AntagSelectEntityEvent>(OnSelectEntity);
}
private void OnSelectEntity(Entity<AntagSpawnerComponent> ent, ref AntagSelectEntityEvent args)
{
args.Entity = Spawn(ent.Comp.Prototype);
}
}

View File

@@ -0,0 +1,8 @@
namespace Content.Server.Antag.Components;
/// <summary>
/// Spawns this rule's antags at random tiles on a station using <c>TryGetRandomTile</c>.
/// Requires <see cref="AntagSelectionComponent"/>.
/// </summary>
[RegisterComponent]
public sealed partial class AntagRandomSpawnComponent : Component;

View File

@@ -0,0 +1,17 @@
using Content.Server.Antag;
using Robust.Shared.Prototypes;
namespace Content.Server.Antag.Components;
/// <summary>
/// Spawns a prototype for antags created with a spawner.
/// </summary>
[RegisterComponent, Access(typeof(AntagSpawnerSystem))]
public sealed partial class AntagSpawnerComponent : Component
{
/// <summary>
/// The entity to spawn.
/// </summary>
[DataField(required: true)]
public EntProtoId Prototype = string.Empty;
}

View File

@@ -1,4 +1,3 @@
using Content.Server.GenericAntag;
using Content.Server.Objectives.Components; using Content.Server.Objectives.Components;
using Content.Server.Objectives.Systems; using Content.Server.Objectives.Systems;
using Content.Server.Popups; using Content.Server.Popups;
@@ -55,7 +54,6 @@ public sealed partial class DragonSystem : EntitySystem
SubscribeLocalEvent<DragonComponent, DragonSpawnRiftActionEvent>(OnSpawnRift); SubscribeLocalEvent<DragonComponent, DragonSpawnRiftActionEvent>(OnSpawnRift);
SubscribeLocalEvent<DragonComponent, RefreshMovementSpeedModifiersEvent>(OnDragonMove); SubscribeLocalEvent<DragonComponent, RefreshMovementSpeedModifiersEvent>(OnDragonMove);
SubscribeLocalEvent<DragonComponent, MobStateChangedEvent>(OnMobStateChanged); SubscribeLocalEvent<DragonComponent, MobStateChangedEvent>(OnMobStateChanged);
SubscribeLocalEvent<DragonComponent, GenericAntagCreatedEvent>(OnCreated);
SubscribeLocalEvent<DragonComponent, EntityZombifiedEvent>(OnZombified); SubscribeLocalEvent<DragonComponent, EntityZombifiedEvent>(OnZombified);
} }
@@ -192,18 +190,6 @@ public sealed partial class DragonSystem : EntitySystem
DeleteRifts(uid, false, component); DeleteRifts(uid, false, component);
} }
private void OnCreated(EntityUid uid, DragonComponent comp, ref GenericAntagCreatedEvent args)
{
var mindId = args.MindId;
var mind = args.Mind;
_role.MindAddRole(mindId, new DragonRoleComponent(), mind);
_role.MindAddRole(mindId, new RoleBriefingComponent()
{
Briefing = Loc.GetString("dragon-role-briefing")
}, mind);
}
private void OnZombified(Entity<DragonComponent> ent, ref EntityZombifiedEvent args) private void OnZombified(Entity<DragonComponent> ent, ref EntityZombifiedEvent args)
{ {
// prevent carp attacking zombie dragon // prevent carp attacking zombie dragon

View File

@@ -30,3 +30,6 @@ roles-antag-space-ninja-objective = Use your stealth to sabotage the station, no
roles-antag-thief-name = Thief roles-antag-thief-name = Thief
roles-antag-thief-objective = Add some NT property to your personal collection without using violence. roles-antag-thief-objective = Add some NT property to your personal collection without using violence.
roles-antag-dragon-name = Space Dragon
roles-antag-dragon-objective = Create a carp army to take over this quadrant.

View File

@@ -1,3 +1,14 @@
- type: entity
abstract: true
parent: MarkerBase
id: BaseAntagSpawner
name: ghost role spawn point
components:
- type: GhostRole
raffle:
settings: default
- type: GhostRoleAntagSpawner
- type: entity - type: entity
id: SpawnPointGhostRatKing id: SpawnPointGhostRatKing
name: ghost role spawn point name: ghost role spawn point
@@ -83,18 +94,13 @@
- type: entity - type: entity
noSpawn: true noSpawn: true
parent: BaseAntagSpawner
id: SpawnPointLoneNukeOperative id: SpawnPointLoneNukeOperative
name: ghost role spawn point
suffix: loneops
parent: MarkerBase
components: components:
- type: GhostRole - type: GhostRole
name: ghost-role-information-loneop-name name: ghost-role-information-loneop-name
description: ghost-role-information-loneop-description description: ghost-role-information-loneop-description
rules: ghost-role-information-loneop-rules rules: ghost-role-information-loneop-rules
raffle:
settings: default
- type: GhostRoleAntagSpawner
- type: Sprite - type: Sprite
sprite: Markers/jobs.rsi sprite: Markers/jobs.rsi
layers: layers:
@@ -130,20 +136,14 @@
description: roles-antag-nuclear-operative-objective description: roles-antag-nuclear-operative-objective
- type: entity - type: entity
parent: MarkerBase
id: SpawnPointGhostDragon
noSpawn: true noSpawn: true
name: ghost role spawn point parent: BaseAntagSpawner
suffix: dragon id: SpawnPointGhostDragon
components: components:
- type: GhostRole - type: GhostRole
name: ghost-role-information-space-dragon-name name: ghost-role-information-space-dragon-name
description: ghost-role-information-space-dragon-description description: ghost-role-information-space-dragon-description
rules: ghost-role-component-default-rules rules: ghost-role-component-default-rules
raffle:
settings: default
- type: GhostRoleMobSpawner
prototype: MobDragon
- type: Sprite - type: Sprite
layers: layers:
- state: green - state: green

View File

@@ -142,11 +142,10 @@
- type: entity - type: entity
parent: BaseMobDragon parent: BaseMobDragon
id: MobDragon id: MobDragon
suffix: No role or objectives
components: components:
- type: Dragon - type: Dragon
spawnRiftAction: ActionSpawnRift spawnRiftAction: ActionSpawnRift
- type: GenericAntag
rule: Dragon
- type: ActionGun - type: ActionGun
action: ActionDragonsBreath action: ActionDragonsBreath
gunProto: DragonsBreathGun gunProto: DragonsBreathGun

View File

@@ -86,12 +86,28 @@
components: components:
- type: StationEvent - type: StationEvent
weight: 6.5 weight: 6.5
duration: 1
earliestStart: 40 earliestStart: 40
reoccurrenceDelay: 20 reoccurrenceDelay: 20
minimumPlayers: 20 minimumPlayers: 20
- type: RandomSpawnRule - type: AntagRandomSpawn
prototype: SpawnPointGhostDragon - type: AntagSpawner
prototype: MobDragon
- type: AntagObjectives
objectives:
- CarpRiftsObjective
- DragonSurviveObjective
- type: AntagSelection
agentName: dragon-round-end-agent-name
definitions:
- spawnerPrototype: SpawnPointGhostDragon
min: 1
max: 1
pickPlayer: false
mindComponents:
- type: DragonRole
prototype: Dragon
- type: RoleBriefing
briefing: dragon-role-briefing
- type: entity - type: entity
parent: BaseGameRule parent: BaseGameRule

View File

@@ -17,18 +17,6 @@
- type: NinjaRule - type: NinjaRule
threats: NinjaThreats threats: NinjaThreats
# stores configuration for dragon
- type: entity
noSpawn: true
parent: BaseGameRule
id: Dragon
components:
- type: GenericAntagRule
agentName: dragon-round-end-agent-name
objectives:
- CarpRiftsObjective
- DragonSurviveObjective
- type: entity - type: entity
noSpawn: true noSpawn: true
parent: BaseGameRule parent: BaseGameRule

View File

@@ -0,0 +1,5 @@
- type: antag
id: Dragon
name: roles-antag-dragon-name
antagonist: true
objective: roles-antag-dragon-objective