Merge branch 'master' into ed-04-08-2025-upstream-sync
This commit is contained in:
@@ -18,13 +18,13 @@ public sealed partial class FTLMapComponent : Component
|
||||
/// What parallax to use for the background, immediately gets deffered to ParallaxComponent.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public string Parallax = "CP14Ocean"; //CP14 parallax replacement
|
||||
public string Parallax = "Sky"; //CP14 parallax replacement
|
||||
|
||||
/// <summary>
|
||||
/// CP14 FTL map ambient color
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public Color AmbientColor = new(34, 90, 122);
|
||||
public Color AmbientColor = new(47, 51, 54);
|
||||
|
||||
/// <summary>
|
||||
/// Can FTL on this map only be done to beacons.
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
using Content.Shared._CP14.Demiplane.Components;
|
||||
using Content.Shared._CP14.DemiplaneTraveling;
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.Interaction;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared._CP14.Demiplane;
|
||||
|
||||
public abstract partial class CP14SharedDemiplaneSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
|
||||
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<CP14DemiplaneRiftOpenedComponent, InteractHandEvent>(OnDemiplanePasswayInteract);
|
||||
SubscribeLocalEvent<CP14DemiplaneHintComponent, MapInitEvent>(OnDemiplaneHintMapInit);
|
||||
}
|
||||
|
||||
private void OnDemiplaneHintMapInit(Entity<CP14DemiplaneHintComponent> ent, ref MapInitEvent args)
|
||||
{
|
||||
var query = EntityQueryEnumerator<CP14DemiplaneRiftOpenedComponent, TransformComponent>();
|
||||
|
||||
var xformHint = Transform(ent);
|
||||
var hintPos = _transform.GetWorldPosition(xformHint);
|
||||
|
||||
while (query.MoveNext(out _, out _, out var xformRift))
|
||||
{
|
||||
if (xformRift.MapUid != xformHint.MapUid)
|
||||
continue;
|
||||
|
||||
var riftPos = _transform.GetWorldPosition(xformRift);
|
||||
|
||||
//Calculate the rotation
|
||||
Angle angle = new(riftPos - hintPos);
|
||||
|
||||
_transform.SetWorldRotation(ent, angle + Angle.FromDegrees(90));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnDemiplanePasswayInteract(Entity<CP14DemiplaneRiftOpenedComponent> passway, ref InteractHandEvent args)
|
||||
{
|
||||
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager,
|
||||
args.User,
|
||||
passway.Comp.DoAfter,
|
||||
new CP14DemiplanPasswayUseDoAfter(),
|
||||
args.Target,
|
||||
args.Target)
|
||||
{
|
||||
BreakOnDamage = true,
|
||||
BreakOnMove = true,
|
||||
BreakOnHandChange = true,
|
||||
NeedHand = true,
|
||||
MovementThreshold = 0.2f,
|
||||
});
|
||||
}
|
||||
|
||||
public virtual bool TryTeleportIntoDemiplane(Entity<CP14DemiplaneComponent> demiplane, EntityUid? entity)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public virtual bool TryTeleportOutDemiplane(Entity<CP14DemiplaneComponent> demiplane, EntityUid? entity)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed partial class CP14DemiplanPasswayUseDoAfter : SimpleDoAfterEvent
|
||||
{
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
using Robust.Shared.Audio;
|
||||
|
||||
namespace Content.Shared._CP14.Demiplane.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Designates this entity as holding a demiplane.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem))]
|
||||
public sealed partial class CP14DemiplaneComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// All entities in the real world that are connected to this demiplane
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadOnly)]
|
||||
[DataField]
|
||||
public HashSet<EntityUid> ExitPoints = new();
|
||||
|
||||
/// <summary>
|
||||
/// All entities in the demiplane in which the objects entered in the demiplane appear
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadOnly)]
|
||||
[DataField]
|
||||
public HashSet<EntityUid> EntryPoints = new();
|
||||
|
||||
/// <summary>
|
||||
/// The sound of entering a demiplane, played locally to the player who entered it.
|
||||
/// Consider more as an intro sound “You have entered the demiplane. Good luck.”
|
||||
/// </summary>
|
||||
[DataField("arrivalSound")]
|
||||
public SoundSpecifier ArrivalSound = new SoundCollectionSpecifier("CP14DemiplaneIntro");
|
||||
|
||||
/// <summary>
|
||||
/// The sound of exiting the demiplane, played locally to the player who exited the demiplane.
|
||||
/// Consider it more as an ending sound
|
||||
/// </summary>
|
||||
[DataField("departureSound")]
|
||||
public SoundSpecifier DepartureSound = new SoundCollectionSpecifier("CP14DemiplaneIntro");
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
namespace Content.Shared._CP14.Demiplane.Components;
|
||||
|
||||
/// <summary>
|
||||
/// is automatically delete over time if there are no active stabilizers inside this demiplane.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem)), AutoGenerateComponentPause]
|
||||
public sealed partial class CP14DemiplaneDestroyWithoutStabilizationComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// how many time after generation the demiplane cannot be destroyed.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public TimeSpan ProtectedSpawnTime = TimeSpan.FromMinutes(1);
|
||||
|
||||
[DataField]
|
||||
[AutoPausedField]
|
||||
public TimeSpan EndProtectionTime = TimeSpan.Zero;
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
using Content.Shared.Damage;
|
||||
|
||||
namespace Content.Shared._CP14.Demiplane.Components;
|
||||
|
||||
/// <summary>
|
||||
/// When closing the demiplane, all entities with this component will be thrown out instead of being deleted.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem))]
|
||||
public sealed partial class CP14DemiplaneForceExtractComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public bool Enabled = true;
|
||||
|
||||
[DataField]
|
||||
public DamageSpecifier ExtractDamage = new()
|
||||
{
|
||||
DamageDict = new()
|
||||
{
|
||||
{ "Blunt", 111 },
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
namespace Content.Shared._CP14.Demiplane.Components;
|
||||
|
||||
using Demiplane;
|
||||
|
||||
/// <summary>
|
||||
/// A very small and silly component that simply turns the entity toward the nearest demiplane rift
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem))]
|
||||
public sealed partial class CP14DemiplaneHintComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
namespace Content.Shared._CP14.Demiplane.Components;
|
||||
|
||||
/// <summary>
|
||||
/// An entity that is the link between the demiplane and the real world. Depending on whether it is in the real world or in the demiplane
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem))]
|
||||
public sealed partial class CP14DemiplaneRiftComponent : Component
|
||||
{
|
||||
[ViewVariables(VVAccess.ReadOnly)]
|
||||
[DataField]
|
||||
public EntityUid? Demiplane;
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the map on which this rift is initialized is a demiplane to automatically bind to it. QoL thing.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadOnly)]
|
||||
[DataField]
|
||||
public bool TryAutoLinkToMap = true;
|
||||
|
||||
/// <summary>
|
||||
/// will this rift become one of the random entry or exit points of the demiplane
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadOnly)]
|
||||
[DataField]
|
||||
public bool ActiveTeleport = true;
|
||||
|
||||
[DataField]
|
||||
public bool DeleteAfterDisconnect = true;
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
namespace Content.Shared._CP14.Demiplane.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Keeps the demiplanes from being destroyed while they're in it.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem))]
|
||||
public sealed partial class CP14DemiplaneStabilizerComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// must be a being and be alive to work as a stabilizer
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public bool RequireAlive = false;
|
||||
|
||||
[DataField]
|
||||
public bool Enabled = true;
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared._CP14.Demiplane.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Destroy demiplane after time
|
||||
/// </summary>
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause, Access(typeof(CP14SharedDemiplaneSystem))]
|
||||
public sealed partial class CP14DemiplaneTimedDestructionComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public TimeSpan TimeToDestruction = TimeSpan.FromSeconds(240f);
|
||||
|
||||
[DataField, AutoPausedField]
|
||||
public TimeSpan EndTime = TimeSpan.Zero;
|
||||
|
||||
/// <summary>
|
||||
/// Countdown audio stream.
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public EntityUid? Stream = null;
|
||||
|
||||
/// <summary>
|
||||
/// Sound that plays when the demiplane start to collapse.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public SoundSpecifier Sound = new SoundCollectionSpecifier("ExpeditionEnd")
|
||||
{
|
||||
Params = AudioParams.Default.WithVolume(-5),
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Song selected on MapInit so we can predict the audio countdown properly.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public SoundPathSpecifier? SelectedSong;
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.Demiplane.Prototypes;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
[Prototype("cp14DemiplaneModifierCategory")]
|
||||
public sealed partial class CP14DemiplaneModifierCategoryPrototype : IPrototype
|
||||
{
|
||||
[IdDataField] public string ID { get; } = default!;
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
using Content.Shared.Destructible.Thresholds;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.Demiplane.Prototypes;
|
||||
|
||||
/// <summary>
|
||||
/// A prototype “Special Demiplane” that can appear on the demiplane map as the final room of a chain of demiplanes.
|
||||
/// It is supposed to be used as a special demiplane with special modifiers, and mining resources and
|
||||
/// equipment from here is the main task of adventurers
|
||||
/// </summary>
|
||||
[Prototype("cp14SpecialDemiplane")]
|
||||
public sealed partial class CP14SpecialDemiplanePrototype : IPrototype
|
||||
{
|
||||
[IdDataField] public string ID { get; } = default!;
|
||||
|
||||
/// <summary>
|
||||
/// The difficulty levels at which this location can be generated.
|
||||
/// </summary>
|
||||
[DataField(required: true)]
|
||||
public MinMax Levels = new(1, 10);
|
||||
|
||||
/// <summary>
|
||||
/// The location config that will be used to generate the demiplane. May be null, and if so, the location will be generated using the default way.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public ProtoId<CP14DemiplaneLocationPrototype>? Location;
|
||||
|
||||
/// <summary>
|
||||
/// Modifiers that will be automatically added to the demiplane when it is generated.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public List<ProtoId<CP14DemiplaneModifierPrototype>> Modifiers = new();
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
|
||||
using System.Numerics;
|
||||
using Content.Shared._CP14.Demiplane.Prototypes;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared._CP14.DemiplaneTraveling;
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public enum CP14DemiplaneMapUiKey
|
||||
{
|
||||
Key,
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class CP14DemiplaneMapUiState(Dictionary<Vector2i, CP14DemiplaneMapNode> nodes, HashSet<(Vector2i, Vector2i)>? edges = null) : BoundUserInterfaceState
|
||||
{
|
||||
public Dictionary<Vector2i, CP14DemiplaneMapNode> Nodes = nodes;
|
||||
public HashSet<(Vector2i, Vector2i)> Edges = edges ?? new();
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class CP14DemiplaneMapNode(int level, Vector2 uiPosition, bool start, ProtoId<CP14DemiplaneLocationPrototype>? locationConfig = null, List<ProtoId<CP14DemiplaneModifierPrototype>>? modifiers = null)
|
||||
{
|
||||
public int Level = level;
|
||||
public int AdditionalLevel = 0;
|
||||
public Vector2 UiPosition = uiPosition;
|
||||
public bool Start = start;
|
||||
|
||||
public bool InFrontierZone = false;
|
||||
public bool InUsing = false;
|
||||
public bool Completed = start;
|
||||
|
||||
public ProtoId<CP14DemiplaneLocationPrototype>? LocationConfig = locationConfig;
|
||||
public List<ProtoId<CP14DemiplaneModifierPrototype>> Modifiers = modifiers ?? new();
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
using Content.Shared.Damage;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.DemiplaneTraveling;
|
||||
|
||||
/// <summary>
|
||||
/// Component for opening demiplane map UI and interacting with StationDemiplaneMapComponent
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed partial class CP14DemiplaneNavigationMapComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Extracting coordinates from the demiplane node will create this entity and synchronize its modifiers, location and other parameters.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public EntProtoId KeyProto = "CP14BaseDemiplaneKey";
|
||||
|
||||
[DataField]
|
||||
public SoundSpecifier EjectSound = new SoundPathSpecifier("/Audio/Magic/ethereal_exit.ogg");
|
||||
|
||||
[DataField]
|
||||
public DamageSpecifier RevokeDamage = new()
|
||||
{
|
||||
DamageDict = new()
|
||||
{
|
||||
{ "Blunt", 100 },
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
using Robust.Shared.Audio;
|
||||
|
||||
namespace Content.Shared._CP14.DemiplaneTraveling;
|
||||
|
||||
/// <summary>
|
||||
/// teleports a certain number of entities between demiplanes with a delay
|
||||
/// </summary>
|
||||
[RegisterComponent, AutoGenerateComponentPause]
|
||||
public sealed partial class CP14DemiplaneRadiusTimedPasswayComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public int MaxEntities = 3;
|
||||
|
||||
[DataField]
|
||||
public TimeSpan Delay = TimeSpan.FromSeconds(10f);
|
||||
|
||||
[DataField]
|
||||
public float Radius = 3f;
|
||||
|
||||
[DataField]
|
||||
[AutoPausedField]
|
||||
public TimeSpan NextTimeTeleport = TimeSpan.Zero;
|
||||
|
||||
[DataField("arrivalSound")]
|
||||
public SoundSpecifier ArrivalSound = new SoundPathSpecifier("/Audio/Effects/teleport_arrival.ogg");
|
||||
|
||||
[DataField("departureSound")]
|
||||
public SoundSpecifier DepartureSound = new SoundPathSpecifier("/Audio/Effects/teleport_departure.ogg");
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using Robust.Shared.Audio;
|
||||
|
||||
namespace Content.Shared._CP14.DemiplaneTraveling;
|
||||
|
||||
/// <summary>
|
||||
/// if located on an entity with a CP14DemiplanRiftComponent, allows users to move through that rift via an interaction with doAfter
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed partial class CP14DemiplaneRiftOpenedComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// The number of teleportations this teleporter can make before disappearing. Use the negative number to make infinite.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public int MaxUse = -1;
|
||||
|
||||
[DataField]
|
||||
public float DoAfter = 4f;
|
||||
|
||||
[DataField("arrivalSound")]
|
||||
public SoundSpecifier ArrivalSound = new SoundPathSpecifier("/Audio/Effects/teleport_arrival.ogg");
|
||||
|
||||
[DataField("departureSound")]
|
||||
public SoundSpecifier DepartureSound = new SoundPathSpecifier("/Audio/Effects/teleport_departure.ogg");
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
using Robust.Shared.Audio;
|
||||
|
||||
namespace Content.Shared._CP14.DemiplaneTraveling;
|
||||
|
||||
/// <summary>
|
||||
/// teleports a certain number of entities to coordinate with a delay
|
||||
/// </summary>
|
||||
[RegisterComponent, AutoGenerateComponentPause]
|
||||
public sealed partial class CP14MonolithTimedPasswayComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public int MaxEntities = 3;
|
||||
|
||||
[DataField]
|
||||
public TimeSpan Delay = TimeSpan.FromSeconds(10f);
|
||||
|
||||
[DataField]
|
||||
public float Radius = 3f;
|
||||
|
||||
[DataField]
|
||||
[AutoPausedField]
|
||||
public TimeSpan NextTimeTeleport = TimeSpan.Zero;
|
||||
|
||||
[DataField("arrivalSound")]
|
||||
public SoundSpecifier ArrivalSound = new SoundPathSpecifier("/Audio/Effects/teleport_arrival.ogg");
|
||||
|
||||
[DataField("departureSound")]
|
||||
public SoundSpecifier DepartureSound = new SoundPathSpecifier("/Audio/Effects/teleport_departure.ogg");
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared._CP14.DemiplaneTraveling;
|
||||
|
||||
public abstract partial class CP14SharedStationDemiplaneMapSystem : EntitySystem
|
||||
{
|
||||
public static bool NodeInFronrierZone(Dictionary<Vector2i,CP14DemiplaneMapNode> nodes, HashSet<(Vector2i, Vector2i)> edges, Vector2i key)
|
||||
{
|
||||
if (!nodes.TryGetValue(key, out var node))
|
||||
return false;
|
||||
|
||||
if (node.Completed || node.Start)
|
||||
return false;
|
||||
|
||||
//return false if no finished or start nodes near
|
||||
var near = new List<Vector2i>();
|
||||
foreach (var edge in edges)
|
||||
{
|
||||
var node1 = nodes[edge.Item1];
|
||||
var node2 = nodes[edge.Item2];
|
||||
|
||||
if (node1 != node && node2 != node)
|
||||
continue;
|
||||
|
||||
if (node1.Completed || node1.Start || node2.Completed || node2.Start)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class CP14DemiplaneMapEjectMessage(Vector2i position) : BoundUserInterfaceMessage
|
||||
{
|
||||
public readonly Vector2i Position = position;
|
||||
}
|
||||
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class CP14DemiplaneMapRevokeMessage(Vector2i position) : BoundUserInterfaceMessage
|
||||
{
|
||||
public readonly Vector2i Position = position;
|
||||
}
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
using Content.Shared.Destructible.Thresholds;
|
||||
|
||||
namespace Content.Shared._CP14.DemiplaneTraveling;
|
||||
|
||||
/// <summary>
|
||||
/// A station component that stores information about the current map of demiplanes, their research status and relationships.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed partial class CP14StationDemiplaneMapComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public Dictionary<Vector2i, CP14DemiplaneMapNode> Nodes = new();
|
||||
|
||||
[DataField]
|
||||
public HashSet<(Vector2i, Vector2i)> Edges = new();
|
||||
|
||||
/// <summary>
|
||||
/// Count of special rooms that can be generated in the demiplane map.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public MinMax Specials = new(30, 30);
|
||||
}
|
||||
@@ -19,6 +19,9 @@ public sealed partial class CP14SpellConsumeManaEffect : CP14SpellEffect
|
||||
|
||||
var targetEntity = args.Target.Value;
|
||||
|
||||
if (!entManager.HasComponent<CP14MagicEnergyContainerComponent>(targetEntity))
|
||||
return;
|
||||
|
||||
var magicEnergy = entManager.System<SharedCP14MagicEnergySystem>();
|
||||
|
||||
//First - used object
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
using Content.Shared._CP14.Demiplane;
|
||||
using Content.Shared._CP14.Demiplane.Components;
|
||||
|
||||
namespace Content.Shared._CP14.MagicSpell.Spells;
|
||||
|
||||
public sealed partial class CP14SpellDemiplaneInfiltration : CP14SpellEffect
|
||||
{
|
||||
public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args)
|
||||
{
|
||||
if (args.User is null)
|
||||
return;
|
||||
|
||||
if (!entManager.TryGetComponent<CP14DemiplaneRiftComponent>(args.Target, out var rift))
|
||||
return;
|
||||
|
||||
if (rift.Demiplane is null)
|
||||
return;
|
||||
|
||||
if (!entManager.TryGetComponent<CP14DemiplaneComponent>(rift.Demiplane.Value, out var demiplane))
|
||||
return;
|
||||
|
||||
var demiplaneSystem = entManager.System<CP14SharedDemiplaneSystem>();
|
||||
|
||||
demiplaneSystem.TryTeleportIntoDemiplane((rift.Demiplane.Value, demiplane), args.User.Value);
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ using Robust.Shared.Prototypes;
|
||||
namespace Content.Shared._CP14.ModularCraft.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Adds all details to the item when initializing. This is useful for spawning modular items directly when mapping or as loot in demiplanes.
|
||||
/// Adds all details to the item when initializing. This is useful for spawning modular items directly when mapping or as loot in dungeons
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(CP14SharedModularCraftSystem))]
|
||||
public sealed partial class CP14ModularCraftAutoAssembleComponent : Component
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
using Content.Shared.Maps;
|
||||
using Content.Shared.Parallax.Biomes;
|
||||
using Content.Shared.Tag;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared.Procedural.DungeonLayers;
|
||||
|
||||
[Virtual]
|
||||
public partial class CP14BiomeDunGen : IDunGenLayer
|
||||
{
|
||||
[DataField(required: true)]
|
||||
public ProtoId<BiomeTemplatePrototype> BiomeTemplate;
|
||||
|
||||
/// <summary>
|
||||
/// creates a biome only on the specified tiles
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public HashSet<ProtoId<ContentTileDefinition>>? TileMask;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using Content.Shared.Maps;
|
||||
using Content.Shared.Parallax.Biomes;
|
||||
using Content.Shared.Tag;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared.Procedural.DungeonLayers;
|
||||
|
||||
[Virtual]
|
||||
public partial class CP14ReserveGrid : IDunGenLayer
|
||||
{
|
||||
}
|
||||
@@ -4,13 +4,13 @@ using Content.Shared.Tag;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Utility;
|
||||
|
||||
namespace Content.Shared._CP14.Demiplane.Prototypes;
|
||||
namespace Content.Shared._CP14.Procedural.Prototypes;
|
||||
|
||||
/// <summary>
|
||||
/// procedural location template. The answer to the question “Where” as far as the combinatorics of the expedition is concerned.
|
||||
/// procedural location template. The answer to the question “Where” as far as the combinatorics of the generation is concerned.
|
||||
/// </summary>
|
||||
[Prototype("cp14DemiplaneLocation")]
|
||||
public sealed partial class CP14DemiplaneLocationPrototype : IPrototype
|
||||
[Prototype("cp14Location")]
|
||||
public sealed partial class CP14ProceduralLocationPrototype : IPrototype
|
||||
{
|
||||
[IdDataField] public string ID { get; } = default!;
|
||||
|
||||
@@ -18,13 +18,22 @@ public sealed partial class CP14DemiplaneLocationPrototype : IPrototype
|
||||
/// The difficulty levels at which this location can be generated.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public MinMax Levels = new(1, 10);
|
||||
public MinMax Levels = new(0, 10);
|
||||
|
||||
[DataField(required: true)]
|
||||
public ProtoId<DungeonConfigPrototype> LocationConfig;
|
||||
|
||||
/// <summary>
|
||||
/// Components that will be automatically added to the demiplane when it is generated
|
||||
/// This modifier will be added to all adjacent connected locations leading to this location.
|
||||
/// </summary>
|
||||
[DataField(required: true)]
|
||||
public ProtoId<CP14ProceduralModifierPrototype> Connection;
|
||||
|
||||
[DataField]
|
||||
public float GenerationProb = 1f;
|
||||
|
||||
/// <summary>
|
||||
/// Components that will be automatically added to the location map when it is generated
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public ComponentRegistry Components = new();
|
||||
@@ -34,13 +43,4 @@ public sealed partial class CP14DemiplaneLocationPrototype : IPrototype
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public List<ProtoId<TagPrototype>> Tags = new();
|
||||
|
||||
[DataField]
|
||||
public LocId? Name;
|
||||
|
||||
[DataField]
|
||||
public float ExamineProb = 0.75f;
|
||||
|
||||
[DataField]
|
||||
public SpriteSpecifier? Icon = null;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.Procedural.Prototypes;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
[Prototype("cp14LocationModifierCategory")]
|
||||
public sealed partial class CP14ProceduralModifierCategoryPrototype : IPrototype
|
||||
{
|
||||
[IdDataField] public string ID { get; } = default!;
|
||||
}
|
||||
@@ -3,13 +3,13 @@ using Content.Shared.Procedural;
|
||||
using Content.Shared.Tag;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.Demiplane.Prototypes;
|
||||
namespace Content.Shared._CP14.Procedural.Prototypes;
|
||||
|
||||
/// <summary>
|
||||
/// Demiplane modifier prototype. The answer to the question “Which” in terms of the combinatorics of demiplane generation is
|
||||
/// Location modifier prototype. The answer to the question “What's inside" from the point of view of the combinatorics of creating locations
|
||||
/// </summary>
|
||||
[Prototype("cp14DemiplaneModifier")]
|
||||
public sealed partial class CP14DemiplaneModifierPrototype : IPrototype
|
||||
[Prototype("cp14LocationModifier")]
|
||||
public sealed partial class CP14ProceduralModifierPrototype : IPrototype
|
||||
{
|
||||
[IdDataField] public string ID { get; } = default!;
|
||||
|
||||
@@ -23,7 +23,7 @@ public sealed partial class CP14DemiplaneModifierPrototype : IPrototype
|
||||
/// Each modifier belongs to specific categories. Used by the generator to determine what to generate
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public Dictionary<ProtoId<CP14DemiplaneModifierCategoryPrototype>, float> Categories = new();
|
||||
public Dictionary<ProtoId<CP14ProceduralModifierCategoryPrototype>, float> Categories = new();
|
||||
|
||||
/// <summary>
|
||||
/// How often can this modifier be generated? Determined by weight from all modifiers available for the location
|
||||
@@ -40,10 +40,10 @@ public sealed partial class CP14DemiplaneModifierPrototype : IPrototype
|
||||
public float GenerationProb = 1f;
|
||||
|
||||
/// <summary>
|
||||
/// Can this modifier be generated multiple times within a single demiplane?
|
||||
/// Can this modifier be generated multiple times within a single location?
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public bool Unique = true;
|
||||
public bool Unique = false;
|
||||
|
||||
/// <summary>
|
||||
/// Generation layers that will be added to the location generation after the main layers.
|
||||
@@ -71,7 +71,4 @@ public sealed partial class CP14DemiplaneModifierPrototype : IPrototype
|
||||
|
||||
[DataField]
|
||||
public LocId? Name;
|
||||
|
||||
[DataField]
|
||||
public float ExamineProb = 0.75f;
|
||||
}
|
||||
Reference in New Issue
Block a user