From b6f7039647c050a0e88073e98b0ba4d326d3f8b7 Mon Sep 17 00:00:00 2001 From: Vonsant Date: Mon, 6 Jan 2025 16:29:06 +0300 Subject: [PATCH] MappingShmapping --- Content.Server/Warps/WarpPointComponent.cs | 3 + Content.Server/Warps/WarpPointSystem.cs | 15 +++ .../AdditionalMapFixComponent.cs | 4 + .../AdditionalMap/AdditionalMapFixSystem.cs | 34 ++++++ .../StationAdditionalMapComponent.cs | 23 ++++ .../StationAdditionalMapSystem.cs | 53 ++++++++ .../Components/BiomeSpawnerComponent.cs | 22 ++++ .../EntitySystems/BiomeSpawnerSystem.cs | 96 +++++++++++++++ .../_CorvaxNext/Warper/WarperComponent.cs | 8 ++ .../_CorvaxNext/Warper/WarperSystem.cs | 76 ++++++++++++ .../Parallax/Biomes/SharedBiomeSystem.cs | 2 +- .../warper/warp-point-component.ftl | 1 + .../_CorvaxNext/Admeme/hand_teleporter.yml | 66 ++++++++++ .../Spawners/Random/Biome/biomeSpawner.yml | 114 ++++++++++++++++++ .../Entities/Structures/Walls/walls.yml | 29 +++++ .../Entities/Structures/Warps/ladders.yml | 55 +++++++++ .../_CorvaxNext/Procedural/biomes.yml | 96 +++++++++++++++ .../Markers/biome.rsi/asteroid.png | Bin 0 -> 1253 bytes .../_CorvaxNext/Markers/biome.rsi/cave.png | Bin 0 -> 721 bytes .../Markers/biome.rsi/chromite.png | Bin 0 -> 678 bytes .../_CorvaxNext/Markers/biome.rsi/desert.png | Bin 0 -> 1206 bytes .../_CorvaxNext/Markers/biome.rsi/frame.png | Bin 0 -> 341 bytes .../_CorvaxNext/Markers/biome.rsi/grass.png | Bin 0 -> 759 bytes .../_CorvaxNext/Markers/biome.rsi/lava.png | Bin 0 -> 1267 bytes .../_CorvaxNext/Markers/biome.rsi/meta.json | 35 ++++++ .../_CorvaxNext/Markers/biome.rsi/snow.png | Bin 0 -> 1196 bytes .../Markers/environment.rsi/base-blue.png | Bin 0 -> 250 bytes .../Markers/environment.rsi/base-green.png | Bin 0 -> 198 bytes .../Markers/environment.rsi/base-red.png | Bin 0 -> 255 bytes .../Markers/environment.rsi/meta.json | 26 ++++ .../Markers/environment.rsi/portal.png | Bin 0 -> 300 bytes .../Markers/environment.rsi/wall.png | Bin 0 -> 265 bytes .../Warps/ladder.rsi/ladder_bottom.png | Bin 0 -> 262 bytes .../Warps/ladder.rsi/ladder_top.png | Bin 0 -> 372 bytes .../Structures/Warps/ladder.rsi/meta.json | 17 +++ 35 files changed, 774 insertions(+), 1 deletion(-) create mode 100644 Content.Server/_CorvaxNext/AdditionalMap/AdditionalMapFixComponent.cs create mode 100644 Content.Server/_CorvaxNext/AdditionalMap/AdditionalMapFixSystem.cs create mode 100644 Content.Server/_CorvaxNext/AdditionalMap/StationAdditionalMapComponent.cs create mode 100644 Content.Server/_CorvaxNext/AdditionalMap/StationAdditionalMapSystem.cs create mode 100644 Content.Server/_CorvaxNext/BiomeSpawner/Components/BiomeSpawnerComponent.cs create mode 100644 Content.Server/_CorvaxNext/BiomeSpawner/EntitySystems/BiomeSpawnerSystem.cs create mode 100644 Content.Server/_CorvaxNext/Warper/WarperComponent.cs create mode 100644 Content.Server/_CorvaxNext/Warper/WarperSystem.cs create mode 100644 Resources/Locale/ru-RU/_corvaxnext/warper/warp-point-component.ftl create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Markers/Spawners/Random/Biome/biomeSpawner.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Structures/Walls/walls.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Structures/Warps/ladders.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Procedural/biomes.yml create mode 100644 Resources/Textures/_CorvaxNext/Markers/biome.rsi/asteroid.png create mode 100644 Resources/Textures/_CorvaxNext/Markers/biome.rsi/cave.png create mode 100644 Resources/Textures/_CorvaxNext/Markers/biome.rsi/chromite.png create mode 100644 Resources/Textures/_CorvaxNext/Markers/biome.rsi/desert.png create mode 100644 Resources/Textures/_CorvaxNext/Markers/biome.rsi/frame.png create mode 100644 Resources/Textures/_CorvaxNext/Markers/biome.rsi/grass.png create mode 100644 Resources/Textures/_CorvaxNext/Markers/biome.rsi/lava.png create mode 100644 Resources/Textures/_CorvaxNext/Markers/biome.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Markers/biome.rsi/snow.png create mode 100644 Resources/Textures/_CorvaxNext/Markers/environment.rsi/base-blue.png create mode 100644 Resources/Textures/_CorvaxNext/Markers/environment.rsi/base-green.png create mode 100644 Resources/Textures/_CorvaxNext/Markers/environment.rsi/base-red.png create mode 100644 Resources/Textures/_CorvaxNext/Markers/environment.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Markers/environment.rsi/portal.png create mode 100644 Resources/Textures/_CorvaxNext/Markers/environment.rsi/wall.png create mode 100644 Resources/Textures/_CorvaxNext/Structures/Warps/ladder.rsi/ladder_bottom.png create mode 100644 Resources/Textures/_CorvaxNext/Structures/Warps/ladder.rsi/ladder_top.png create mode 100644 Resources/Textures/_CorvaxNext/Structures/Warps/ladder.rsi/meta.json diff --git a/Content.Server/Warps/WarpPointComponent.cs b/Content.Server/Warps/WarpPointComponent.cs index ce169f2e195..ba2ab3ffba9 100644 --- a/Content.Server/Warps/WarpPointComponent.cs +++ b/Content.Server/Warps/WarpPointComponent.cs @@ -6,8 +6,11 @@ namespace Content.Server.Warps [RegisterComponent] public sealed partial class WarpPointComponent : Component { + // Corvax-Next-Warper-Start: Unique (across all loaded maps) identifier for teleporting to warp points. + [ViewVariables(VVAccess.ReadWrite)] [DataField("id")] public string? ID { get; set; } [ViewVariables(VVAccess.ReadWrite), DataField] public string? Location; + // Corvax-Next-Warper-End /// /// If true, ghosts warping to this entity will begin following it. diff --git a/Content.Server/Warps/WarpPointSystem.cs b/Content.Server/Warps/WarpPointSystem.cs index d3b978a147d..96d2e9dfaf1 100644 --- a/Content.Server/Warps/WarpPointSystem.cs +++ b/Content.Server/Warps/WarpPointSystem.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Shared.Examine; using Content.Shared.Ghost; @@ -5,12 +6,26 @@ namespace Content.Server.Warps; public sealed class WarpPointSystem : EntitySystem { + private Dictionary warpPoints = new Dictionary(); // Corvax-Next-Warper + public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnWarpPointExamine); } + // Corvax-Next-Warper-Start + public EntityUid? FindWarpPoint(string id) + { + var entMan = IoCManager.Resolve(); + var found = entMan.EntityQuery(true).Where(p => p.ID == id).FirstOrDefault(); + if (found is not null) + return found.Owner; + else + return null; + } + // Corvax-Next-Warper-End + private void OnWarpPointExamine(EntityUid uid, WarpPointComponent component, ExaminedEvent args) { if (!HasComp(args.Examiner)) diff --git a/Content.Server/_CorvaxNext/AdditionalMap/AdditionalMapFixComponent.cs b/Content.Server/_CorvaxNext/AdditionalMap/AdditionalMapFixComponent.cs new file mode 100644 index 00000000000..4f04e766fca --- /dev/null +++ b/Content.Server/_CorvaxNext/AdditionalMap/AdditionalMapFixComponent.cs @@ -0,0 +1,4 @@ +namespace Content.Server._CorvaxNext.AdditionalMap; + +[RegisterComponent] +public sealed partial class AdditionalMapFixComponent : Component; diff --git a/Content.Server/_CorvaxNext/AdditionalMap/AdditionalMapFixSystem.cs b/Content.Server/_CorvaxNext/AdditionalMap/AdditionalMapFixSystem.cs new file mode 100644 index 00000000000..9e80db2d01a --- /dev/null +++ b/Content.Server/_CorvaxNext/AdditionalMap/AdditionalMapFixSystem.cs @@ -0,0 +1,34 @@ +using System.Threading; +using Content.Server.Atmos.Components; +using Content.Server.GameTicking; +using Content.Server.Shuttles.Systems; +using Content.Server.Station.Events; +using Robust.Server.Console; +using Timer = Robust.Shared.Timing.Timer; + +namespace Content.Server._CorvaxNext.AdditionalMapFix; +public sealed class AdditionalMapFix : EntitySystem +{ + [Dependency] private readonly IServerConsoleHost _host = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup, after: new[] { typeof(ShuttleSystem) }); + } + + private void OnStartup(ref StationPostInitEvent args) + { + Timer.Spawn(TimeSpan.FromSeconds(5), () => + { + var query = AllEntityQuery(); + + while (query.MoveNext(out var dummyatmos, out var comp)) + { + var gridUid = comp.GridUid; + _host.AppendCommand($"fixgridatmos {gridUid}"); + Logger.Error($"executed command on {gridUid}"); + } + }); + } +} diff --git a/Content.Server/_CorvaxNext/AdditionalMap/StationAdditionalMapComponent.cs b/Content.Server/_CorvaxNext/AdditionalMap/StationAdditionalMapComponent.cs new file mode 100644 index 00000000000..142bba7e80f --- /dev/null +++ b/Content.Server/_CorvaxNext/AdditionalMap/StationAdditionalMapComponent.cs @@ -0,0 +1,23 @@ +/* + * All right reserved to CrystallEdge. + * + * BUT this file is sublicensed under MIT License + * + */ + +using Robust.Shared.Utility; + +namespace Content.Server._CorvaxNext.AdditionalMap; + +/// +/// Loads additional maps from the list at the start of the round. +/// +[RegisterComponent, Access(typeof(StationAdditionalMapSystem))] +public sealed partial class StationAdditionalMapComponent : Component +{ + /// + /// A map paths to load on a new map. + /// + [DataField] + public List MapPaths = new(); +} diff --git a/Content.Server/_CorvaxNext/AdditionalMap/StationAdditionalMapSystem.cs b/Content.Server/_CorvaxNext/AdditionalMap/StationAdditionalMapSystem.cs new file mode 100644 index 00000000000..ff66f934d7a --- /dev/null +++ b/Content.Server/_CorvaxNext/AdditionalMap/StationAdditionalMapSystem.cs @@ -0,0 +1,53 @@ +/* + * All right reserved to CrystallEdge. + * + * BUT this file is sublicensed under MIT License + * + */ + +using Content.Server.Parallax; +using Content.Server.Station.Components; +using Content.Server.Station.Events; +using Content.Server.Station.Systems; +using Content.Shared.Teleportation.Systems; +using Robust.Server.GameObjects; +using Robust.Server.Maps; +using Robust.Shared.Prototypes; + +namespace Content.Server._CorvaxNext.AdditionalMap; + +public sealed partial class StationAdditionalMapSystem : EntitySystem +{ + [Dependency] private readonly BiomeSystem _biome = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly MapSystem _map = default!; + [Dependency] private readonly MetaDataSystem _metaData = default!; + [Dependency] private readonly LinkedEntitySystem _linkedEntity = default!; + [Dependency] private readonly StationSystem _station = default!; + [Dependency] private readonly MapLoaderSystem _mapLoader = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStationPostInit); + } + + private void OnStationPostInit(Entity addMap, ref StationPostInitEvent args) + { + if (!TryComp(addMap, out StationDataComponent? dataComp)) + return; + + foreach (var path in addMap.Comp.MapPaths) + { + var mapUid = _map.CreateMap(out var mapId); + Log.Info($"Created map {mapId} for StationAdditionalMap system"); + var options = new MapLoadOptions { LoadMap = true }; + if (!_mapLoader.TryLoad(mapId, path.ToString(), out var roots, options)) + { + Log.Error($"Failed to load map from {path}!"); + Del(mapUid); + return; + } + } + } +} diff --git a/Content.Server/_CorvaxNext/BiomeSpawner/Components/BiomeSpawnerComponent.cs b/Content.Server/_CorvaxNext/BiomeSpawner/Components/BiomeSpawnerComponent.cs new file mode 100644 index 00000000000..5b9228aad0c --- /dev/null +++ b/Content.Server/_CorvaxNext/BiomeSpawner/Components/BiomeSpawnerComponent.cs @@ -0,0 +1,22 @@ +/* + * All right reserved to CrystallEdge. + * + * BUT this file is sublicensed under MIT License + * + */ + +using Content.Server._CorvaxNext.BiomeSpawner.EntitySystems; +using Content.Shared.Parallax.Biomes; +using Robust.Shared.Prototypes; + +namespace Content.Server._CorvaxNext.BiomeSpawner.Components; + +/// +/// fills the tile in which it is located with the contents of the biome. Includes: tile, decals and entities +/// +[RegisterComponent, Access(typeof(BiomeSpawnerSystem))] +public sealed partial class BiomeSpawnerComponent : Component +{ + [DataField] + public ProtoId Biome = "Grasslands"; +} diff --git a/Content.Server/_CorvaxNext/BiomeSpawner/EntitySystems/BiomeSpawnerSystem.cs b/Content.Server/_CorvaxNext/BiomeSpawner/EntitySystems/BiomeSpawnerSystem.cs new file mode 100644 index 00000000000..1c92306bb1e --- /dev/null +++ b/Content.Server/_CorvaxNext/BiomeSpawner/EntitySystems/BiomeSpawnerSystem.cs @@ -0,0 +1,96 @@ +/* + * All right reserved to CrystallEdge. + * + * BUT this file is sublicensed under MIT License + * + */ + +using System.Linq; +using Content.Server._CorvaxNext.BiomeSpawner.Components; +using System.Numerics; +using Content.Server.Decals; +using Content.Server.GameTicking; +using Content.Server.Parallax; +using Robust.Server.GameObjects; +using Robust.Shared.Map; +using Robust.Shared.Map.Components; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Server._CorvaxNext.BiomeSpawner.EntitySystems; + +public sealed class BiomeSpawnerSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly BiomeSystem _biome = default!; + [Dependency] private readonly TransformSystem _transform = default!; + [Dependency] private readonly SharedMapSystem _maps = default!; + [Dependency] private readonly DecalSystem _decals = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly IRobustRandom _random = default!; + + private int _seed = 27; + + public override void Initialize() + { + SubscribeLocalEvent(OnRoundStartAttempt); + SubscribeLocalEvent(OnMapInit); + } + + private void OnRoundStartAttempt(RoundStartAttemptEvent ev) + { + _seed = _random.Next(100000); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + SpawnBiome(ent); + QueueDel(ent); + } + + private void SpawnBiome(Entity ent) + { + var biome = _proto.Index(ent.Comp.Biome); + var spawnerTransform = Transform(ent); + if (spawnerTransform.GridUid == null) + return; + var gridUid = spawnerTransform.GridUid.Value; + if (!TryComp(gridUid, out var map)) + return; + + var vec = _transform.GetGridOrMapTilePosition(ent); + if (!_biome.TryGetTile(vec, biome.Layers, _seed, map, out var tile)) + return; + + // Set new tile + _maps.SetTile(gridUid, map, vec, tile.Value); + var tileCenterVec = vec + map.TileSizeHalfVector; + + // Remove old decals + var oldDecals = _decals.GetDecalsInRange(gridUid, tileCenterVec); + foreach (var (id, _) in oldDecals) + { + _decals.RemoveDecal(gridUid, id); + } + + //Add decals + if (_biome.TryGetDecals(vec, biome.Layers, _seed, map, out var decals)) + { + foreach (var decal in decals) + { + _decals.TryAddDecal(decal.ID, new EntityCoordinates(gridUid, decal.Position), out _); + } + } + + // Remove entities + var oldEntities = _lookup.GetEntitiesInRange(spawnerTransform.Coordinates, 0.48f); + // TODO: Replace this with GetEntitiesInBox2 + foreach (var entToRemove in oldEntities.Concat(new[] { ent.Owner })) // Do not remove self + { + QueueDel(entToRemove); + } + + if (_biome.TryGetEntity(vec, biome.Layers, tile.Value, _seed, map, out var entityProto)) + Spawn(entityProto, new EntityCoordinates(gridUid, tileCenterVec)); + } +} diff --git a/Content.Server/_CorvaxNext/Warper/WarperComponent.cs b/Content.Server/_CorvaxNext/Warper/WarperComponent.cs new file mode 100644 index 00000000000..59f458720ab --- /dev/null +++ b/Content.Server/_CorvaxNext/Warper/WarperComponent.cs @@ -0,0 +1,8 @@ +namespace Content.Server._CorvaxNext.Warper; + +[RegisterComponent] +public sealed partial class WarperComponent : Component +{ + /// Warp destination unique identifier. + [ViewVariables(VVAccess.ReadWrite)] [DataField("id")] public string? ID { get; set; } +} diff --git a/Content.Server/_CorvaxNext/Warper/WarperSystem.cs b/Content.Server/_CorvaxNext/Warper/WarperSystem.cs new file mode 100644 index 00000000000..e29faba73e2 --- /dev/null +++ b/Content.Server/_CorvaxNext/Warper/WarperSystem.cs @@ -0,0 +1,76 @@ +using Content.Server.Ghost.Components; +using Content.Server.Warps; +using Content.Server.Popups; +using Content.Shared.Ghost; +using Content.Shared.Interaction; +using Robust.Shared.Map; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Player; +using System.Numerics; + +namespace Content.Server._CorvaxNext.Warper; + +public class WarperSystem : EntitySystem +{ + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly WarpPointSystem _warpPointSystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInteractHand); + } + + private void OnInteractHand(EntityUid uid, WarperComponent component, InteractHandEvent args) + { + if (component.ID is null) + { + Logger.DebugS("warper", "Warper has no destination"); + _popupSystem.PopupEntity(Loc.GetString("warper-goes-nowhere", ("warper", args.Target)), args.User, Filter.Entities(args.User), true); + return; + } + + var dest = _warpPointSystem.FindWarpPoint(component.ID); + if (dest is null) + { + Logger.DebugS("warper", String.Format("Warp destination '{0}' not found", component.ID)); + _popupSystem.PopupEntity(Loc.GetString("warper-goes-nowhere", ("warper", args.Target)), args.User, Filter.Entities(args.User), true); + return; + } + + var entMan = IoCManager.Resolve(); + TransformComponent? destXform; + entMan.TryGetComponent(dest.Value, out destXform); + if (destXform is null) + { + Logger.DebugS("warper", String.Format("Warp destination '{0}' has no transform", component.ID)); + _popupSystem.PopupEntity(Loc.GetString("warper-goes-nowhere", ("warper", args.Target)), args.User, Filter.Entities(args.User), true); + return; + } + + // Check that the destination map is initialized and return unless in aghost mode. + var mapMgr = IoCManager.Resolve(); + var destMap = destXform.MapID; + if (!mapMgr.IsMapInitialized(destMap) || mapMgr.IsMapPaused(destMap)) + { + if (!entMan.HasComponent(args.User)) + { + // Normal ghosts cannot interact, so if we're here this is already an admin ghost. + Logger.DebugS("warper", String.Format("Player tried to warp to '{0}', which is not on a running map", component.ID)); + _popupSystem.PopupEntity(Loc.GetString("warper-goes-nowhere", ("warper", args.Target)), args.User, Filter.Entities(args.User), true); + return; + } + } + + var xform = entMan.GetComponent(args.User); + xform.Coordinates = destXform.Coordinates; + xform.AttachToGridOrMap(); + if (entMan.TryGetComponent(uid, out PhysicsComponent? phys)) + { + _physics.SetLinearVelocity(uid, Vector2.Zero); + } + } +} diff --git a/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs b/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs index 250b0f70a54..41c6f3f6784 100644 --- a/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs +++ b/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs @@ -118,7 +118,7 @@ public bool TryGetTile(Vector2i indices, List layers, int seed, Map // Check if the tile is from meta layer, otherwise fall back to default layers. if (layer is BiomeMetaLayer meta) { - if (TryGetBiomeTile(indices, ProtoManager.Index(meta.Template).Layers, seed, grid, out tile)) + if (TryGetTile(indices, ProtoManager.Index(meta.Template).Layers, seed, grid, out tile)) // Corvax-Next-BiomeSpawner: bandage - replaced from TryGetBiomeTile (not working for biomespawner) { return true; } diff --git a/Resources/Locale/ru-RU/_corvaxnext/warper/warp-point-component.ftl b/Resources/Locale/ru-RU/_corvaxnext/warper/warp-point-component.ftl new file mode 100644 index 00000000000..0ffa4730579 --- /dev/null +++ b/Resources/Locale/ru-RU/_corvaxnext/warper/warp-point-component.ftl @@ -0,0 +1 @@ +warper-goes-nowhere = {CAPITALIZE($warper)} никуда не ведёт. \ No newline at end of file diff --git a/Resources/Prototypes/_CorvaxNext/Admeme/hand_teleporter.yml b/Resources/Prototypes/_CorvaxNext/Admeme/hand_teleporter.yml index 8b88a53857d..cdc1915a992 100644 --- a/Resources/Prototypes/_CorvaxNext/Admeme/hand_teleporter.yml +++ b/Resources/Prototypes/_CorvaxNext/Admeme/hand_teleporter.yml @@ -24,3 +24,69 @@ components: - type: Portal canTeleportToOtherMaps: true + +- type: entity + parent: HandTeleporter + id: HandTeleporterAdmemeCNInvisible + suffix: Admeme, Invisible + components: + - type: HandTeleporter + firstPortalPrototype: PortalRedAdmemeCNInvisible + secondPortalPrototype: PortalBlueAdmemeCNInvisible + allowPortalsOnDifferentGrids: true + portalCreationDelay: 0 + +- type: entity + parent: MarkerBase + id: PortalRedAdmemeCNInvisible + suffix: Admeme, Invisible + components: + - type: Transform + anchored: True + - type: InteractionOutline + - type: Clickable + - type: Physics + bodyType: Static + - type: Sprite + layers: + - sprite: _CorvaxNext/Markers/environment.rsi + state: base-red + shader: unshaded + - sprite: _CorvaxNext/Markers/environment.rsi + shader: unshaded + state: portal + - type: Fixtures + fixtures: + portalFixture: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.48,0.25,0.48" + mask: + - FullTileMask + layer: + - WallLayer + hard: false + - type: Portal + canTeleportToOtherMaps: true + arrivalSound: + !type:SoundPathSpecifier + path: "" + departureSound: + !type:SoundPathSpecifier + path: "" + +- type: entity + parent: PortalRedAdmemeCNInvisible + id: PortalBlueAdmemeCNInvisible + suffix: Admeme, Invisible + components: + - type: Portal + canTeleportToOtherMaps: true + - type: Sprite + layers: + - sprite: _CorvaxNext/Markers/environment.rsi + state: base-blue + shader: unshaded + - sprite: _CorvaxNext/Markers/environment.rsi + shader: unshaded + state: portal diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Markers/Spawners/Random/Biome/biomeSpawner.yml b/Resources/Prototypes/_CorvaxNext/Entities/Markers/Spawners/Random/Biome/biomeSpawner.yml new file mode 100644 index 00000000000..156940445ae --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Entities/Markers/Spawners/Random/Biome/biomeSpawner.yml @@ -0,0 +1,114 @@ +- type: entity + id: BaseBiomeSpawner + name: biome spawner + abstract: true + placement: + mode: SnapgridCenter + components: + - type: Transform + anchored: true + - type: Clickable + - type: InteractionOutline + - type: Sprite + snapCardinals: true + drawdepth: BelowFloor + sprite: _CorvaxNext/Markers/biome.rsi + - type: BiomeSpawner + - type: PlacementReplacement + key: BiomeSpawner + +- type: entity + id: BiomeSpawnerCaves + parent: BaseBiomeSpawner + suffix: Caves + components: + - type: Sprite + layers: + - state: cave + - state: frame + - type: BiomeSpawner + biome: CavesGenericExample + +- type: entity + id: BiomeSpawnerGrasslands + parent: BaseBiomeSpawner + suffix: Grasslands + components: + - type: Sprite + layers: + - state: grass + - state: frame + - type: BiomeSpawner + biome: Grasslands + +- type: entity + id: BiomeSpawnerContinental + parent: BaseBiomeSpawner + suffix: Continental + components: + - type: Sprite + layers: + - state: grass + - state: frame + - type: BiomeSpawner + biome: Continental + +- type: entity + id: BiomeSpawnerLowDesert + parent: BaseBiomeSpawner + suffix: LowDesert + components: + - type: Sprite + layers: + - state: desert + - state: frame + - type: BiomeSpawner + biome: LowDesert + +- type: entity + id: BiomeSpawnerLava + parent: BaseBiomeSpawner + suffix: Lava + components: + - type: Sprite + layers: + - state: lava + - state: frame + - type: BiomeSpawner + biome: Lava + +- type: entity + id: BiomeSpawnerSnow + parent: BaseBiomeSpawner + suffix: Snow + components: + - type: Sprite + layers: + - state: snow + - state: frame + - type: BiomeSpawner + biome: Snow + +- type: entity + id: BiomeSpawnerShadow + parent: BaseBiomeSpawner + suffix: Shadow + components: + - type: Sprite + layers: + - state: chromite + - state: frame + - type: BiomeSpawner + biome: Shadow + +- type: entity + id: BiomeSpawnerAsteroid + parent: BaseBiomeSpawner + suffix: Asteroid + components: + - type: Sprite + layers: + - state: asteroid + - state: frame + - type: BiomeSpawner + biome: Asteroid diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/_CorvaxNext/Entities/Structures/Walls/walls.yml new file mode 100644 index 00000000000..a434ee703a8 --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Entities/Structures/Walls/walls.yml @@ -0,0 +1,29 @@ +- type: entity + name: invisible wall + id: MarkerBlocker + parent: MarkerBase + suffix: marker, infinity + components: + - type: Sprite + layers: + - sprite: _CorvaxNext/Markers/environment.rsi + state: base-green + shader: unshaded + - sprite: _CorvaxNext/Markers/environment.rsi + shader: unshaded + state: wall + - type: PlacementReplacement + key: blocker + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.5,0.5,0.5" + mask: + - FullTileMask + layer: + - WallLayer + density: 1000 + - type: Physics + bodyType: Static diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Structures/Warps/ladders.yml b/Resources/Prototypes/_CorvaxNext/Entities/Structures/Warps/ladders.yml new file mode 100644 index 00000000000..3f25cd85041 --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Entities/Structures/Warps/ladders.yml @@ -0,0 +1,55 @@ +- type: entity + id: BaseLadder + name: ladder + abstract: true + placement: + mode: SnapgridCenter + components: + - type: Sprite + sprite: _CorvaxNext/Structures/Warps/ladder.rsi + noRot: true + netsync: false + offset: 0, 0.25 + - type: Transform + anchored: true + - type: Clickable + - type: Physics + canCollide: False + bodyStatus: OnGround + bodyType: Static + - type: Tag + tags: + - Structure + - type: InteractionOutline + - type: Warper + - type: WarpPoint + follow: false + +- type: entity + parent: BaseLadder + id: LadderTop + suffix: top + description: The top of a ladder. Use it to go down. + components: + - type: Sprite + state: ladder_top + +- type: entity + parent: BaseLadder + id: LadderBottom + suffix: bottom + description: The bottom of a ladder. Use it to go up. + components: + - type: Sprite + state: ladder_bottom + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "0.3,0.1,-1,-1" + density: 100 + mask: + - MachineMask + layer: + - MidImpassable diff --git a/Resources/Prototypes/_CorvaxNext/Procedural/biomes.yml b/Resources/Prototypes/_CorvaxNext/Procedural/biomes.yml new file mode 100644 index 00000000000..3188ee31a18 --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Procedural/biomes.yml @@ -0,0 +1,96 @@ +- type: biomeTemplate + id: CavesGenericExample + layers: + - !type:BiomeTileLayer # Первый слой, пол. Слоёв может быть сколько угодно, с любыми настройками. + threshold: -1.0 # Полностью покрывает площадь + tile: FloorCaveDrought # Тайлы пола + - !type:BiomeEntityLayer # Второй слой, камни и прочее + threshold: 0.4 # Уровень покрытия площади + noise: # Настройки шума + seed: 1 + noiseType: OpenSimplex2 + fractalType: FBm + frequency: 2 + allowedTiles: # На каких тайлах пола могут ставиться entities, если на предыдущих слоях больше одного варианта + - FloorCaveDrought + entities: # Какие entities могут спавнитьсчя + - FloraRockSolid + - FloraGreyStalagmite + - CrystalBlue + - CrystalCyan + - CrystalGreen + - CrystalOrange + - CrystalPink + - CrystalGrey + - RandomStalagmiteOrCrystal + - CrystalSpawner + - !type:BiomeEntityLayer # Третий слой, растительность + threshold: 0.6 # Уровень покрытия площади + noise: # Настройки шума + seed: 8 + noiseType: OpenSimplex2 + fractalType: Ridged + frequency: 0.015 + octaves: 3 + lacunarity: 1.8 + gain: 0.7 + domainWarpType: OpenSimplex2 + domainWarpAmp: 120 + allowedTiles: + - FloorCaveDrought + entities: + - Spaceshroom + - !type:BiomeEntityLayer # Четвертый слой, спавнеры живых существ. Обязательно должны быть именно спавнеры, а не живые существа. + threshold: 0.8 + noise: + seed: 8 + noiseType: OpenSimplex2 + fractalType: Ridged + frequency: 0.85 + octaves: 3 + lacunarity: 1.8 + gain: 0.7 + domainWarpType: OpenSimplex2 + domainWarpAmp: 120 + allowedTiles: + - FloorCaveDrought + entities: + - RandomServiceCorpseSpawner + - !type:BiomeEntityLayer # Пятый слой, спавнер воды + allowedTiles: + - FloorCaveDrought + threshold: 0.8 + noise: + seed: 14 + noiseType: OpenSimplex2 + fractalType: FBm + frequency: 0.01 + domainWarpType: OpenSimplex2 + domainWarpAmp: 150 + entities: + - FloorWaterEntity + - !type:BiomeEntityLayer # Шестой слой, спавнер стен + threshold: -0.75 + invert: true + noise: + seed: 0 + noiseType: Perlin + fractalType: Ridged + octaves: 1 + frequency: 0.05 + gain: 0.5 + allowedTiles: + - FloorCaveDrought + entities: + - WallRockBasalt + - !type:BiomeEntityLayer # Седьмой слой, спавнер руды + threshold: 0.6 + noise: + seed: 10 + noiseType: OpenSimplex2 + fractalType: FBm + frequency: 3 + allowedTiles: + - FloorCave + entities: + - WallRockBasaltTin diff --git a/Resources/Textures/_CorvaxNext/Markers/biome.rsi/asteroid.png b/Resources/Textures/_CorvaxNext/Markers/biome.rsi/asteroid.png new file mode 100644 index 0000000000000000000000000000000000000000..97d9fcc5dc77b553749b33e40b2000f591a58a2b GIT binary patch literal 1253 zcmV%NC`5oSQKuF}AGsCLU zY8B?plmw@{?e^ZaE7)Cs{r}(R-rinWT3RX}A0MT^zrSSb>+36@pP$|R*w|QkdwVNS zPfy?G&d$!3%gf8s%ciHNWB&8=^N+Fm`1ly$*!cK(IXE~dYin!e;o%{GYOUXh@f;G~ z-`?Jq(b3Vrg5v<-BO@b0fcIFhBfvifnFJX;0VD=%43~j{flh^?p`mUZo1C01Gcz;g z>gp=)nfLno8uPrrxw+}QzrMaMi;Ih~24n&O@P8QuA;)4bFE1Stul2}h^Yine4EFy1 zUN$y1%FfPC+1%U=!mNX8kg6>hgTxGWhlhtT5%BCKCOC$N`5EA-M+hN*a&l5uR#sws zaB#2-D}O-%u)Djvh%LXw4cYnAGB`%4PESwE@bGYW*&5(krStRia0~)Cb$omrV^s+O z$NXhc7Dthg>Wg(I6zspA37!)b1&}(cMBJG}ew>}1#ag`kBLpM|FC#llF^FI$689_y zIn>H3PE1Ucg@uKf%N#0<%Ho=EWFxE{0YG7nY)l4R09Yd_>R1iTWehLPc))pAqL9K{ zJk^;tOjXuqt=?uMZv5qjq(K0Hxw*MejaUeqz6H-_<3UY3 zpH)ZbxUM8hulmj&Z<6%7X+T_aTH(Dy;0jQVR2YM-} zp#nHvD;Cgl)Y=nlE+I*KXw@>fjY#4;WWxJfndttWS@N8h+(?kzeFAW|?@TBgq3c!J z*~pX1#0>79K&KKsZz?vS+=AHwQ3sC=Pg^BgE?=CgElU<>vAjL=62QIA3K(R0k5XjU z#2|vqJm*wI-?xWo-%do?a{Tlf^TUD=nOYX)fd}M;*LpQ5O`z510&&WrC7JxoYe51!RGlQriiUj^nmrfLQA_rz1W%P=(6i z%PP+?38^5@3Dpk|Gn@ekw2eq`RiO{?4yx%r;IZgeNC;g9M^$qqA5wk;pljO5XGe_b P00000NkvXXu0mjfZCXm; literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Markers/biome.rsi/cave.png b/Resources/Textures/_CorvaxNext/Markers/biome.rsi/cave.png new file mode 100644 index 0000000000000000000000000000000000000000..0850a3b4b004df998897ab3415be1db17238d95d GIT binary patch literal 721 zcmV;?0xtcDP)Px%i%CR5R9Jhq2xRn-KRdOsDXg6Y2wE@c-Q5Lh*F#azukVIbpx#%D5ap3TBjh_ z2mB(iW{KB4HtLPk83G5wK(`XaT0jwSaAHlWX*><7h8)Lfi<)qF_Ubr#p1K&EKh8Bm z60`I9BXBnU{q*-=VM;s4eGt$XCP)P&TKTArQS$Q0dWV_o-A;HSc?NFrGoL~O2{9VK9j`(7}Kr} z@U*9*TLGVosRWXq5d6DrE#l<&g*|_kB*tl4F>%Bb>lBf`jwPiT8}k+KV{% zu?<6CWIIyJah$;SjnvrI(#Fe;t7c9miJZ8eNMaTcky2{6Q1E%>t5{r5I>&cCV6Xit z+wnlkW1>#J8}k2@Px%U`a$lR9J<*SHX&$KoEUOpOlWY;$9+?;AIKqw6KtW$fxfY?8QUyCMqI&5+;YS z+_J~k?s1cXftj(p`gK*kSEcv;+pjB5SS%9&K-m@uL}a}-Q#qQxhUWr+9FR4AjdAJ# z07G9RoSz3GLM#(BeSHYR8bB-)lx?y6-n%Uax&?y!GXfZ=4uObPH%wJ-gZ0kO9$;bG zNE?=o()sMwe!7ruzKxSuCWi&)0)(t;3-}ewtLgCaV9leJsvLeOlNG9eZM?1kKn#72 z=gTX~wg7$S*7Wu1@SAL$Itb3)?2_aC&l>y9{!aOalUd5;6Sn&gh^anK@2uh%olSYXF%}F9_m0KA_O8@YJ!01eZj>t zl`np*gouEoDo4n4;S31i771$r90&j>af)TKd}uGFQqZ3+InC6KuI2pQv|sm4xz8A* z1Yhg|g6K&gw$h;=%(aA`c`rYIUn!iX>NfRvPE!I!#wB-8!~~aGno^E#qB}Kd#8E2- zw0R&9(Om?pxnSry&ubte1S&$+7HA%nYC-6@V`|Z%OpvntHhpcZ6Mcdrz`#vA0<{g$ z3%@*F=`dRCD!Zl-^I5`}g6GTYa!Az{OFKTR_vC{|cMFVYHmcb5aNfX7K={GLo>b-c zO86N!w=tT;e9rMq<^OFwBmG#>kaD&c&d)NcHGeDQR5&i(Zm>w5uBc64n_o-_*dCR* z!*S|XqQ%$mvEXnbGQE)MGbCWw8TA3zY9829z;Ws}3)aLU`d=^fzX~Lg6`~mGmjD0& M07*qoM6N<$f@{Dxm;e9( literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Markers/biome.rsi/desert.png b/Resources/Textures/_CorvaxNext/Markers/biome.rsi/desert.png new file mode 100644 index 0000000000000000000000000000000000000000..e82207e688c0bc5ff42c17cdac594e5016f60cff GIT binary patch literal 1206 zcmV;n1WEgeP)3r7Pdea?zbL>3m z#KyL_ZCbbA24xx_+ry*3;9+I*{JbCbT^2%y?Rg~#SDrkFeO3S#g>YhL6U$7nr%<ODr8SkMyy@iG!ZH8Rzm=~dbD{v|W^~au{yC%&PGqj;yCfKNHQ$ILmJ!3Z z*#!zY1l(NzON!t*_F$rGp5e3U+sE{5`DdEWLJ1YlHI;y@aY{jP!y)AA}?aSw)z+HyjdEBq}c7OXOo;CaN z>ok2cKOZNfz;`-fjP(Tp2AR6!SP_CXV7A`ulBGZhf~bTFGkc1Evq8B{hMqy5gRoS# zLxB)r!W@DaScvo@ppWln>H9CA9gRbT`h#o>c_BqdquU}9RDufKTz5^BcL^CsW1OtT zUX_J%nh~U&hRk7BG!_yBpyu<{+;R+1iMv6$tgO}f&vjcFt6rc;w1)xTA_f&L|McN0 zSwy$cay$q9_+?SSm+S_hp~a0chc1yzF@ITVyHE~;AYgI3t)d@F@trE%DhPz$MI=#r zsR-qSwgzww*o*(B8GbM(DpwH=xijG!J zDvZ=DLD{DU=drSj>w-j3ILy3vFIV2Zn4VxjVQLxoH`gzz;vpOGy{FZA$o# zO{?k!w2Bc6W_-7}-5>ZHRnCLWq4zw;`n0P5ZTfMJfFcLIfQ>{u8s4EKYeiFLO01MD z->e7959AY+)oDmN=2Na;6U1kWp$Fjic)#eYsVZpYqqV7F#Qt8=tT13K04a7nD(Aw- zRl(vO{I#{`c|Zq|;*PCN!YJmmPc>fMEC(M0)F+=!$`Hf@glVZpeBAwEA+l<&sM1h- zKsybCAqtBlv>Wxr^2035d#|#>omvm zhoQ_~4l^E^gNgvl0qOaFnDf}9eA9aEgm8UT3AGl0p$3gY$XgQq>IiiQsitmIQWUD2 z5ica|M|u}*6@E8Ak$J#!@oBGUYPsH&LOUX{Tk$dpYuQXn2{p-@ZM3lT5{-e@>Q;$r zDz0xu`#cYDIE6*bXGN%0NUvZmZ~PKX@_O}Na4f|Px$4@pEpR9J=WmoW;$KoCX$ip};G9zd}O1i>2!xkdV%VT&MQ;R#ZhI=2XT13`oo zqG)U36=W^UkV#A`*$u?}ZZb>W?B)~pi}`-70pPe?30M?yhx97TS{w2rrb<<)4J6BaEc+=)*s5^=F;9Q-CSN{Vg^&a>Oc<+Hm zI9I3Py$2fMT%Cs3dVnqmHa$>#A!*G6)eE8xc!|jiTOKG4AoG-BBa~1rc^Z=~Ml(Sv n^?V%xuoq5elTSDmZO8LB`E_LX!PZ_T00000NkvXXu0mjfB~pq& literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Markers/biome.rsi/grass.png b/Resources/Textures/_CorvaxNext/Markers/biome.rsi/grass.png new file mode 100644 index 0000000000000000000000000000000000000000..e93f6904b55d616b25ae3edc73ccef4c5bea3fcc GIT binary patch literal 759 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 KMNUMnLSTY>XECk- literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Markers/environment.rsi/base-blue.png b/Resources/Textures/_CorvaxNext/Markers/environment.rsi/base-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..ee77bb448aca3d323b31aa128d8ba2832b121ae9 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7lsBP{NFO^{{x^1XMsm# zF$061G6*wPEVVBK3bL1Y`ns||!MP|ku_QG` zp**uBL&4qCHz2%`PaLQy$l=9+40u>Ca-Z^uY_M~#Tye!9N<)Bofx?|T z@(1cB#ok!DHF?qut_#2CU8?E%%*Nm{WoeS&=iEll4HIP;UpDO8;L_*Nz`)4F!XcpG n(9n>7{?qgD-`1+XZTB;HckoTPJ9nxQ&^887S3j3^P6aDG!CxKcSJYD@<);T3K0RS;VHRAvP literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Markers/environment.rsi/base-red.png b/Resources/Textures/_CorvaxNext/Markers/environment.rsi/base-red.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d68f8b9e52b47e75c9a8f158e1eece39c501f9 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI z1_nK45N51cYF`EvWH0gbb!C6b!z3WdDIK@{I#5Wm#5JPCIX^cyHLrxhxhOTUBsE2$ zJhLQ2!QIn0AiR-J9H=PW)5S3);_%z+8+jWHcvvrTpYqUg;7k%NJHfZ6Nh5JffC8I? zWU=bsSd5KwSv rU|?io;Sl)nHtOGPx#=1D|BR9J=WmfH=(APhxK)lpc7378=}utR3>1YU<-=ob=ocp0Z^D{+64fWgN% zNEl%2mz2VpQaBSIYt83xzD5NgdGhxaJ!%jp9Hs}^o0saz2g=P&I1Eo%8!P3#e{%#8 zyRf%ak`r5N!8r#207L{a#xBS$0N(plCg#c@H3&7pDESEDatK#6O5Tf60p#juWv#s& zQndp!)%RkT0i@MuaTin$NUCqGx#bXQv;j8222cSIk$TNC03w=v*Gt52MD;I_xKN8# y0Z3i=SU)i1LM!I~Te1=Y;7d&@hbT2_%eP+R-l+SwZ6^N!0000U9-nVZbkR9}!xfMvUl?3?(|7Z9Q1R*zjKoXNZT^vI!dRs4b^ED`Num(tc z{$FqD9PmUj_3Ya_k=L27B=4AcXJKK>F-wPHHxCz^;+3Kn&wcK#E@-$mV7&(Ht;w0Ux?vdKE@$f`?^zTG%v z`Ah6xZTEw9u3vV$K4O;It{Y^oTV!5e`fj)D)8FgY$=LgJvISm!EXfCS9)qW=pUXO@ GgeCxf5^ZPz literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Structures/Warps/ladder.rsi/ladder_bottom.png b/Resources/Textures/_CorvaxNext/Structures/Warps/ladder.rsi/ladder_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..cd9119cbb380a65915ff51474fb67c0c589eac9f GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}2RvOILn2y} zQxq5;J$m$Sf5pcpM?c4z6M{rOyf_%k#>vUq=GrZ0_$c_e)0)QZ`7x>|8Q;jrxU5vZ z#mLStd+4=r$%ALlzRi~?^;sg}#qAKnQS;}=L`8f3ehvA92RbLKORA`-ta#iYZ(nB+ zv!kF<tY$4`tgZcKLYxN!PC{x JWt~$(69C;`VhsQQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Structures/Warps/ladder.rsi/ladder_top.png b/Resources/Textures/_CorvaxNext/Structures/Warps/ladder.rsi/ladder_top.png new file mode 100644 index 0000000000000000000000000000000000000000..a261bc6aa0a5563dd08e0a639dbde196e3381648 GIT binary patch literal 372 zcmV-)0gL{LP)Px$E=fc|R9J=Wl+8-SFcgK4B4c6l01g!#$fDz}Pte)*$@&h0_%vAv;wC$16A)>b zIx7oJN!`?qEiKcu&4}V6-zGoz-g6IW8o=RjIQ~1^D5|$nRR31p#T>Cq&qI28HLAzpSn+-^2wUXN&MIOj;EG@2Ow1Rr@00Lb$koO3G! zx~h5_CX5EkQh^YHR7z;A5d=XSTX@S}?x$A0^}<`?`RNgXN+~EcEY#gM<(N1h3my*dR$`}UjQ)nJ)s^)VJj8yVS-l|+hr{9cQ@#MNMt1aX SmCYpp0000