From f96fc1be41be21662c38a0b04197eba7f3e41c7d Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 12 Feb 2023 23:40:57 +1100 Subject: [PATCH] Ore veins (#14011) * Ore veins I dislike rocks just providing generic drops and this factors into mining more. * fixes * descriptions * comment * every flipping time --- .../IconSmoothing/IconSmoothSystem.Edge.cs | 87 ++++++++ .../IconSmoothing/IconSmoothSystem.cs | 72 ++++++- .../Mining/OreVeinVisualsComponent.cs | 6 + .../IconSmoothing/SmoothEdgeComponent.cs | 12 ++ .../Mining/Components/OreVeinComponent.cs | 0 Content.Shared/Mining/OrePrototype.cs | 1 - .../Entities/Structures/Walls/asteroid.yml | 185 ++++++++++++++++++ .../Structures/Walls/rock.rsi/meta.json | 80 ++++++++ .../Structures/Walls/rock.rsi/rock.png | Bin 0 -> 755 bytes .../Walls/rock.rsi/rock_bauxite.png | Bin 0 -> 854 bytes .../Structures/Walls/rock.rsi/rock_carbon.png | Bin 0 -> 521 bytes .../Structures/Walls/rock.rsi/rock_copper.png | Bin 0 -> 591 bytes .../Walls/rock.rsi/rock_diamond.png | Bin 0 -> 1307 bytes .../Structures/Walls/rock.rsi/rock_east.png | Bin 0 -> 254 bytes .../Structures/Walls/rock.rsi/rock_gold.png | Bin 0 -> 503 bytes .../Walls/rock.rsi/rock_hematite.png | Bin 0 -> 792 bytes .../Structures/Walls/rock.rsi/rock_lead.png | Bin 0 -> 798 bytes .../Structures/Walls/rock.rsi/rock_marble.png | Bin 0 -> 796 bytes .../Structures/Walls/rock.rsi/rock_north.png | Bin 0 -> 260 bytes .../Walls/rock.rsi/rock_painite.png | Bin 0 -> 379 bytes .../Structures/Walls/rock.rsi/rock_phoron.png | Bin 0 -> 529 bytes .../Walls/rock.rsi/rock_platinum.png | Bin 0 -> 747 bytes .../Structures/Walls/rock.rsi/rock_quartz.png | Bin 0 -> 633 bytes .../Structures/Walls/rock.rsi/rock_rutile.png | Bin 0 -> 934 bytes .../Structures/Walls/rock.rsi/rock_silver.png | Bin 0 -> 575 bytes .../Structures/Walls/rock.rsi/rock_south.png | Bin 0 -> 285 bytes .../Structures/Walls/rock.rsi/rock_tin.png | Bin 0 -> 486 bytes .../Walls/rock.rsi/rock_uranium.png | Bin 0 -> 445 bytes .../Walls/rock.rsi/rock_verdantium.png | Bin 0 -> 543 bytes .../Walls/rock.rsi/rock_void_opal.png | Bin 0 -> 371 bytes .../Structures/Walls/rock.rsi/rock_west.png | Bin 0 -> 272 bytes 31 files changed, 434 insertions(+), 9 deletions(-) create mode 100644 Content.Client/IconSmoothing/IconSmoothSystem.Edge.cs create mode 100644 Content.Client/Mining/OreVeinVisualsComponent.cs create mode 100644 Content.Shared/IconSmoothing/SmoothEdgeComponent.cs rename {Content.Server => Content.Shared}/Mining/Components/OreVeinComponent.cs (100%) create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/meta.json create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_bauxite.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_carbon.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_copper.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_diamond.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_east.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_gold.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_hematite.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_lead.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_marble.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_north.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_painite.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_phoron.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_platinum.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_quartz.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_rutile.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_silver.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_south.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_tin.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_uranium.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_verdantium.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_void_opal.png create mode 100644 Resources/Textures/Structures/Walls/rock.rsi/rock_west.png diff --git a/Content.Client/IconSmoothing/IconSmoothSystem.Edge.cs b/Content.Client/IconSmoothing/IconSmoothSystem.Edge.cs new file mode 100644 index 0000000000..6de31e8f0a --- /dev/null +++ b/Content.Client/IconSmoothing/IconSmoothSystem.Edge.cs @@ -0,0 +1,87 @@ +using Content.Shared.IconSmoothing; +using Robust.Client.GameObjects; + +namespace Content.Client.IconSmoothing; + +public sealed partial class IconSmoothSystem +{ + // Handles drawing edge sprites on the non-smoothed edges. + + private void InitializeEdge() + { + SubscribeLocalEvent(OnEdgeStartup); + SubscribeLocalEvent(OnEdgeShutdown); + } + + private void OnEdgeStartup(EntityUid uid, SmoothEdgeComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var sprite)) + return; + + sprite.LayerSetOffset(EdgeLayer.South, new Vector2(0, -1f)); + sprite.LayerSetOffset(EdgeLayer.East, new Vector2(1f, 0f)); + sprite.LayerSetOffset(EdgeLayer.North, new Vector2(0, 1f)); + sprite.LayerSetOffset(EdgeLayer.West, new Vector2(-1f, 0f)); + + sprite.LayerSetVisible(EdgeLayer.South, false); + sprite.LayerSetVisible(EdgeLayer.East, false); + sprite.LayerSetVisible(EdgeLayer.North, false); + sprite.LayerSetVisible(EdgeLayer.West, false); + } + + private void OnEdgeShutdown(EntityUid uid, SmoothEdgeComponent component, ComponentShutdown args) + { + if (!TryComp(uid, out var sprite)) + return; + + sprite.LayerMapRemove(EdgeLayer.South); + sprite.LayerMapRemove(EdgeLayer.East); + sprite.LayerMapRemove(EdgeLayer.North); + sprite.LayerMapRemove(EdgeLayer.West); + } + + private void CalculateEdge(EntityUid uid, DirectionFlag directions, SpriteComponent? sprite = null, SmoothEdgeComponent? component = null) + { + if (!Resolve(uid, ref sprite, ref component, false)) + return; + + for (var i = 0; i < 4; i++) + { + var dir = (DirectionFlag) Math.Pow(2, i); + var edge = GetEdge(dir); + + if ((dir & directions) != 0x0) + { + sprite.LayerSetVisible(edge, false); + continue; + } + + sprite.LayerSetVisible(edge, true); + } + } + + private EdgeLayer GetEdge(DirectionFlag direction) + { + switch (direction) + { + case DirectionFlag.South: + return EdgeLayer.South; + case DirectionFlag.East: + return EdgeLayer.East; + case DirectionFlag.North: + return EdgeLayer.North; + case DirectionFlag.West: + return EdgeLayer.West; + default: + throw new ArgumentOutOfRangeException(); + } + } + + private enum EdgeLayer : byte + { + South, + East, + North, + West + } +} diff --git a/Content.Client/IconSmoothing/IconSmoothSystem.cs b/Content.Client/IconSmoothing/IconSmoothSystem.cs index 2206821303..af04d6d67d 100644 --- a/Content.Client/IconSmoothing/IconSmoothSystem.cs +++ b/Content.Client/IconSmoothing/IconSmoothSystem.cs @@ -1,3 +1,4 @@ +using Content.Shared.IconSmoothing; using JetBrains.Annotations; using Robust.Client.GameObjects; using Robust.Shared.Map; @@ -11,7 +12,7 @@ namespace Content.Client.IconSmoothing /// Entity system implementing the logic for /// [UsedImplicitly] - internal sealed class IconSmoothSystem : EntitySystem + public sealed partial class IconSmoothSystem : EntitySystem { [Dependency] private readonly IMapManager _mapManager = default!; @@ -24,6 +25,7 @@ namespace Content.Client.IconSmoothing { base.Initialize(); + InitializeEdge(); SubscribeLocalEvent(OnAnchorChanged); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnStartup); @@ -166,6 +168,9 @@ namespace Content.Client.IconSmoothing EntityQuery xformQuery, IconSmoothComponent? smooth = null) { + TransformComponent? xform; + MapGridComponent? grid = null; + // The generation check prevents updating an entity multiple times per tick. // As it stands now, it's totally possible for something to get queued twice. // Generation on the component is set after an update so we can cull updates that happened this generation. @@ -173,8 +178,33 @@ namespace Content.Client.IconSmoothing || smooth.Mode == IconSmoothingMode.NoSprite || smooth.UpdateGeneration == _generation) { + if (smooth != null && + TryComp(uid, out var edge) && + xformQuery.TryGetComponent(uid, out xform)) + { + var directions = DirectionFlag.None; + + if (_mapManager.TryGetGrid(xform.GridUid, out grid)) + { + var pos = grid.TileIndicesFor(xform.Coordinates); + + if (MatchingEntity(smooth, grid.GetAnchoredEntities(pos.Offset(Direction.North)), smoothQuery)) + directions |= DirectionFlag.North; + if (MatchingEntity(smooth, grid.GetAnchoredEntities(pos.Offset(Direction.South)), smoothQuery)) + directions |= DirectionFlag.South; + if (MatchingEntity(smooth, grid.GetAnchoredEntities(pos.Offset(Direction.East)), smoothQuery)) + directions |= DirectionFlag.East; + if (MatchingEntity(smooth, grid.GetAnchoredEntities(pos.Offset(Direction.West)), smoothQuery)) + directions |= DirectionFlag.West; + } + + CalculateEdge(uid, directions, component: edge); + } + return; } + + xform = xformQuery.GetComponent(uid); smooth.UpdateGeneration = _generation; if (!spriteQuery.TryGetComponent(uid, out var sprite)) @@ -184,10 +214,6 @@ namespace Content.Client.IconSmoothing return; } - var xform = xformQuery.GetComponent(uid); - - MapGridComponent? grid = null; - if (xform.Anchored) { if (!_mapManager.TryGetGrid(xform.GridUid, out grid)) @@ -242,10 +268,11 @@ namespace Content.Client.IconSmoothing if (matching) { sprite.LayerSetState(0, $"{smooth.StateBase}1"); - return; } - - sprite.LayerSetState(0, $"{smooth.StateBase}0"); + else + { + sprite.LayerSetState(0, $"{smooth.StateBase}0"); + } } private void CalculateNewSpriteCardinal(MapGridComponent? grid, IconSmoothComponent smooth, SpriteComponent sprite, TransformComponent xform, EntityQuery smoothQuery) @@ -269,6 +296,19 @@ namespace Content.Client.IconSmoothing dirs |= CardinalConnectDirs.West; sprite.LayerSetState(0, $"{smooth.StateBase}{(int) dirs}"); + + var directions = DirectionFlag.None; + + if ((dirs & CardinalConnectDirs.South) != 0x0) + directions |= DirectionFlag.South; + if ((dirs & CardinalConnectDirs.East) != 0x0) + directions |= DirectionFlag.East; + if ((dirs & CardinalConnectDirs.North) != 0x0) + directions |= DirectionFlag.North; + if ((dirs & CardinalConnectDirs.West) != 0x0) + directions |= DirectionFlag.West; + + CalculateEdge(sprite.Owner, directions, sprite); } private bool MatchingEntity(IconSmoothComponent smooth, IEnumerable candidates, EntityQuery smoothQuery) @@ -297,6 +337,22 @@ namespace Content.Client.IconSmoothing sprite.LayerSetState(CornerLayers.SE, $"{smooth.StateBase}{(int) cornerSE}"); sprite.LayerSetState(CornerLayers.SW, $"{smooth.StateBase}{(int) cornerSW}"); sprite.LayerSetState(CornerLayers.NW, $"{smooth.StateBase}{(int) cornerNW}"); + + var directions = DirectionFlag.None; + + if ((cornerSE & cornerSW) != CornerFill.None) + directions |= DirectionFlag.South; + + if ((cornerSE & cornerNE) != CornerFill.None) + directions |= DirectionFlag.East; + + if ((cornerNE & cornerNW) != CornerFill.None) + directions |= DirectionFlag.North; + + if ((cornerNW & cornerSW) != CornerFill.None) + directions |= DirectionFlag.West; + + CalculateEdge(sprite.Owner, directions, sprite); } private (CornerFill ne, CornerFill nw, CornerFill sw, CornerFill se) CalculateCornerFill(MapGridComponent grid, IconSmoothComponent smooth, TransformComponent xform, EntityQuery smoothQuery) diff --git a/Content.Client/Mining/OreVeinVisualsComponent.cs b/Content.Client/Mining/OreVeinVisualsComponent.cs new file mode 100644 index 0000000000..c662111c3e --- /dev/null +++ b/Content.Client/Mining/OreVeinVisualsComponent.cs @@ -0,0 +1,6 @@ +namespace Content.Client.Mining; + +public sealed class OreVeinVisualsComponent +{ + +} diff --git a/Content.Shared/IconSmoothing/SmoothEdgeComponent.cs b/Content.Shared/IconSmoothing/SmoothEdgeComponent.cs new file mode 100644 index 0000000000..ccde4c9c98 --- /dev/null +++ b/Content.Shared/IconSmoothing/SmoothEdgeComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.IconSmoothing; + +/// +/// Applies an edge sprite to for non-smoothed directions. +/// +[RegisterComponent, NetworkedComponent] +public sealed class SmoothEdgeComponent : Component +{ + +} diff --git a/Content.Server/Mining/Components/OreVeinComponent.cs b/Content.Shared/Mining/Components/OreVeinComponent.cs similarity index 100% rename from Content.Server/Mining/Components/OreVeinComponent.cs rename to Content.Shared/Mining/Components/OreVeinComponent.cs diff --git a/Content.Shared/Mining/OrePrototype.cs b/Content.Shared/Mining/OrePrototype.cs index f2dbe2cc68..3d0cab5a02 100644 --- a/Content.Shared/Mining/OrePrototype.cs +++ b/Content.Shared/Mining/OrePrototype.cs @@ -7,7 +7,6 @@ namespace Content.Shared.Mining; /// This is a prototype for defining ores that generate in rock /// [Prototype("ore")] -[DataDefinition] public sealed class OrePrototype : IPrototype { /// diff --git a/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml b/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml index 62e2bf9bb7..89d9d732ea 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml @@ -56,3 +56,188 @@ - type: OreVein oreChance: 0.33 oreRarityPrototypeId: RandomOreDistributionStandard + +# Rocks and ore veins +- type: entity + id: WallRock + parent: BaseStructure + name: rock + components: + - type: Gatherable + whitelist: + tags: + - Pickaxe + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 150 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Occluder + - type: Airtight + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.5,0.5,0.5" + density: 100 + mask: + - FullTileMask + layer: + - WallLayer + - type: IconSmooth + key: walls + mode: NoSprite + - type: SmoothEdge + - type: Sprite + sprite: Structures/Walls/rock.rsi + netsync: false + layers: + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + +# Ore veins +- type: entity + id: WallRockGold + parent: WallRock + description: An ore vein rich with gold + suffix: Gold + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreGold + - type: Sprite + layers: + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_gold + +- type: entity + id: WallRockPlasma + parent: WallRock + description: An ore vein rich with plasma + suffix: Plasma + components: + - type: OreVein + oreChance: 1.0 + currentOre: OrePlasma + - type: Sprite + layers: + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_phoron + +- type: entity + id: WallRockQuartz + parent: WallRock + description: An ore vein rich with quartz + suffix: Quartz + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreSpaceQuartz + - type: Sprite + layers: + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_quartz + +- type: entity + id: WallRockSilver + parent: WallRock + description: An ore vein rich with silver + suffix: Silver + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreSilver + - type: Sprite + layers: + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_silver + +# Yes I know it drops steel but we may get smelting at some point +- type: entity + id: WallRockTin + parent: WallRock + description: An ore vein rich with steel + suffix: Steel + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreSteel + - type: Sprite + layers: + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_tin + +- type: entity + id: WallRockUranium + parent: WallRock + description: An ore vein rich with uranium + suffix: Uranium + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreUranium + - type: Sprite + layers: + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_uranium diff --git a/Resources/Textures/Structures/Walls/rock.rsi/meta.json b/Resources/Textures/Structures/Walls/rock.rsi/meta.json new file mode 100644 index 0000000000..ce053d2a8f --- /dev/null +++ b/Resources/Textures/Structures/Walls/rock.rsi/meta.json @@ -0,0 +1,80 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/Citadel-Station-13/Citadel-Station-13-RP/blob/817e7c1f225876b45891e3f06908e6d032f0a8bc/icons/turf/walls.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "rock" + }, + { + "name": "rock_south" + }, + { + "name": "rock_east" + }, + { + "name": "rock_north" + }, + { + "name": "rock_west" + }, + { + "name": "rock_bauxite" + }, + { + "name": "rock_carbon" + }, + { + "name": "rock_copper" + }, + { + "name": "rock_diamond" + }, + { + "name": "rock_gold" + }, + { + "name": "rock_hematite" + }, + { + "name": "rock_lead" + }, + { + "name": "rock_marble" + }, + { + "name": "rock_painite" + }, + { + "name": "rock_phoron" + }, + { + "name": "rock_platinum" + }, + { + "name": "rock_quartz" + }, + { + "name": "rock_rutile" + }, + { + "name": "rock_silver" + }, + { + "name": "rock_tin" + }, + { + "name": "rock_uranium" + }, + { + "name": "rock_verdantium" + }, + { + "name": "rock_void_opal" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Walls/rock.rsi/rock.png b/Resources/Textures/Structures/Walls/rock.rsi/rock.png new file mode 100644 index 0000000000000000000000000000000000000000..e52978b0c5d972fe229588a23ee282885c1621c4 GIT binary patch literal 755 zcmVdR6Mm|+O{xAZ{W%hN7n+^IRr1sc^Zqu-7O@XaEZ?PC!OoS07LW!;7I$h^SGM_yl&|7st*OWY_AJcCU&%v;2?gxYsvi0J~VKug8G=~ zduu}%oMrtD9NcBi!FAT;w{TU@Ed;08DU}MEfD4|`G2G_BZJ%oFP*s5%NrH>4lAYJ+ zu*!H@H&A)*0x(PibOg80oS_-hu3&-ojg-L5$#qxUhE9RM0#1<#kp3niijJBIY)uEG z0TxcgoS`!TnR4M_GO{iF1^2N!1IA8dB59c@Y^x%5U4p?D929|F`zZ;Wj$<#*v~``L zg~}I`EXb(Na@%E`Lk1AC8+$Ou+H4hrTeB>}3ar9072I3@{#yci zUv%4CBSOo;u?AeYFw#2%ap1d{?z#TsBn&q<5n-bt=j84qGJ7I&&Y>;D8 zRq(1{Ga!y&O(yi@atDWIyaY#r&l^QkKuJ_Vwa=?9Vqbc8SOQAIseqz!XGT>ghjf^| l5h;FLw-)LISlTMyrf*~+xcU15f;RvF002ovPDHLkV1lzsSaSdX literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Walls/rock.rsi/rock_bauxite.png b/Resources/Textures/Structures/Walls/rock.rsi/rock_bauxite.png new file mode 100644 index 0000000000000000000000000000000000000000..f47f6386b4dd64785c5a035814ce5ef618b6dbe6 GIT binary patch literal 854 zcmV-c1F8IpP)M4$VE@yG&a3?HX#~>gDo|dHd{>*i!Ehg!DW1JaY-n%v$I&f7fR^P z`^=l~dvA6K1iBHAvk$tifTY$E3FiF$KA)F*&K2Ov?FIIGPla$e%)AyO(3w~e;!_G# z@EM&k8%73#3ve@;WQC#z5CTwfu?LHb?B(XB>tgLJ#c}s_7_PNoX(0fGVg&Bb&$CzC z+d_yQ01AFNgpo1uPQ4CGvkl1P8F6 z-cZ`TMOF_qRtYD{KdYlb<$n-fIm(ABv8duyr6}<1-PZpNBay0BmFp84 zV8yLEqy+t+njLw~Y0o_Xl)@M3w2z zWkQ}rHy}}o_W<-W{U|t{GgX0X`MCo01JT)e7JRD@1Bog7KxErEB2^&$VqQWS?qs(1A!a=ipX5CQ=;8zJFg8?V#htz`1ajsO4mi8qQMf)~zH8p&*%ekj|4 zmv>`n&tq)Tyw#r-4Nz6pPM?=$d3nMR^NNg>0r)0e*QsF`Vm8#~bzQ5nEcF_Em)1A| zun4Bmx~_Vo(36l%+)m)ovEG{z@fE;)p66)uD+Jae8w4_rqm>aa0Ga2COpgDGzm~Rb z&x|0(0-#_rPknj;Mw?#ub!H$Z?U4|cz5wXtKW#3_%D^wpEr4H}TL4!zO|x&?ra$}O zQeK-YRs?`~Q53p-j#}P%L*msEGACoiqr7=95CIT`V1QtuX~}1oLt_D8j5&`32>L@1 zzy|@roL*08JqJNH>ASNLNt-CsOgz6uKL}USJb+D(RB8xplzB(w13=R>ecktWl|2zX z)ibgHT;{oL{IQvk4jFG=F+h(Gr6@D{L)j`*IZ?OaUD3UdrUP@+LC<+I8Xz=ChQwb1 z@1RL#mVqAlJJ@yo~T80$mI4$Ti*v$MWlJp9^9t!jcz&PqGl5 z=G3!+cvOY&?g*A4jnRGIXFa)O9t8m9rX5`omzNY1oQTv7h0LK37VwnXR(t@S00000 LNkvXXu0mjfzp~ws literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Walls/rock.rsi/rock_copper.png b/Resources/Textures/Structures/Walls/rock.rsi/rock_copper.png new file mode 100644 index 0000000000000000000000000000000000000000..e22a15f31f4d476f74b18f1dcd0bdc3574b84c7e GIT binary patch literal 591 zcmV-V0O3O9vRn zd&Sx4wzUv|L4T*{b$jM9P0IDf&0Whh6cxaEd{9i1iP`FIl*VZ|VlI_Fp~J*b}9$}3ZyUuL4k5*=2-pg6kX|D)p&=u64EkAl)~+e_C}x*1rzX|4C&f3MYTX5PmjFTz zm5=~l%3QZ0j3S@RBgF^A-?~!P=sK1jF-_7?o@HkG_SgGH0KWcrhB^8!+Jymd`uX~w z?*TB z09j0kNa!|1EdXK|w~I!DNWSrS<7q~+uN7+nNbj{%uNu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Walls/rock.rsi/rock_diamond.png b/Resources/Textures/Structures/Walls/rock.rsi/rock_diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..eb05ebd3d11d956ea2df824d59d4578fca94f0a5 GIT binary patch literal 1307 zcmeAS@N?(olHy`uVBq!ia0vp^2|(Py!3HG1+{xJmq&N#aB8wRq_>O=u<5X=vX$A(C zvz{)FAr*7p&OPWI;wW=GUD3cNXrkAIv(0isO?=N(KP-`3Rb28ig`>11DCm>EfXS8@ z0RoaC0vC7gdanCfOybGWGXYK^1*-m+`wV}TeLs1wI{#Vi{p#O;n>Os;@q6aa+WY6; zoI5w&QcYt;21A4i!V>*DHOyyPq~y?guCr2bj6*2FYMJ`I;Jh@JD)y+&=;f)D*iuiw<< z*tmC(PW-m*()Qc0{SamAiJ0|ty-57?f9L!boKv5v|1^B&=~$CG-QazfEgvL0H*e)M z$Y9L*Bx>y=?ek-!{~_~f)1J&ecg~@eGnzrV=Ipn7{g>K`_HAV3xBEY}TKwA)pXB5v zOf98VB3#b_O+kfmzYiY+{^po^;%)(osU)h_wC-PDQ|B6+w94=U%P6m zp7}gcbSMoejrjQcsQJUUJF@qst-d{Lz5Mp0=4J^8(u=IP)}<`|5w%O;X?Uzm&DnS2 z-0a_TKLvkw)p>P8erj&=zmLILJPxO?vL>8uh|bRb6q&94M$1?G{w&5;Cr6&O>rOq- z&7GjMWNQA|hU>Dj7ebG3`Q$A9A31>g2Cq z7kbYc?LX4+y1V;RYKmAH8;@ndi4EY+#ap@ZC_`FSS?xMuXvp+m_iie2xhh88!e@!5Q|3pU8Ml%fTc&hBN6< zY%bR{;rHjmTD&#N%s@u2cIKZ|Yzp6>SGS&0-|;Nmlwqg+eeDptgQoX0IGo;{zwY!* zIObEYdg7CRe{{Ocp18XG8oK9#*+c1Zs zCoNne;CXL;{^b4Vo#x6f_ILaHq*M9azK&3iBEK44-F0vGH8~ANvg=4*z60a%#o&xh-ZP$=0XY zHGX_3TfUWv<>Bi`+W&kWPnv4Bq;dA(F^(@tY?vJ_x`KxT% z#SS;zrr3*J|MzDxmq5DRfhGTEo@4(Z+VHbs!mDIEh1tJ9U#wZz*5t~3068r@|H+tO zcOK~U$~s_tdd`j2MjzH_(_ICDy&%9R7=IRLwT=BB%r|^B3c_&VO zZ@sfyS?pF>|KkcF72!2Z2bg1KAJe|pQMOKNqQFm1nWiANi0!@13TKTQ`vSZE5FY=L1p}o=OxN@Snb;MOW%4b{Q19t{X?lv zgw2783}qsdpGh+OpK)i`xol5I#s>^9Vm~lHJQXQw{)KHl(CrMKu6{1-oD!MP4M%{Af*gS+ zDbrA#sH#nunMZM_q~M(wiAjO1!< z4|y;^%BkUeav!(G3IP57!VUm9Y^vxLP?3j`* zs~0d3qVcvAZSsxAqD&!*F_r{bA8WU5F&RLP&n zZ%UOuEj3b_6shdOfR0E`h`}}-25fKM_spJ*IQEV+kdY9Fy}R@5?7K5_kHlbaOC_bB zE4Cez0DHHyDHkRTgfGDR zg9BByEcZEy#frnBG}7s*5boa?Ex;yjZ)JaFMXI@+eB9nvUyhHB5EB4&{wkFcf#VY_ zxIY-k4?H`LV>|{8v4QbJL?ef}PXQei3Ev1jrc>?fSZDD5hOKuAV__VjD8YpUxp`OeQ zfam-g<+q(kxWD_oo+vmjBE8oQ^CkdHt(VC;&p8f((W#TqOAmcO7B!{IUc!)BeIqan z#D~pI#a^%qfHoVER?Gdgsd)5<<*?OIJ5HmGx_?bf#+}o75{`Qaxw{}jPSd?akc|P* zc@oqw(NtC>oUwfWhS0Jj$MsPkK?_sV#sHX|xT}UpsJ5DsIzDB;}!%GI${&k9? zA5zMViKq$ZYxv$mDzznAj))BKmv2YVLkG#FBhlOQ$N+T49a9g4SyaaqSPK^Eoc0e4 WN1H!kgjBNt00002Sx3X+2$La8kH2RucSl1eWvK@TFB+MqoZL{JimVa-Vcf_fU~n|9aDW;Qds zP4Uuq+TF>%_suuo``%`l{&VaA*a5KZ05X{jD;A4G0|8Jfl~^OjcG8C7A08;?#Ron?o z31Dsg6SZ4){^PoIT~@qWt&$frZdQh!3yDO6(&@ClcsTuuhZbPP4}kYAha)OADYo#*ZHbfUf6Yk~1p0#(A{Z z)Pa$Z{X3-ypUy9e1f5QYg~Q=45Makka84aOUw+LjCc#vQZwky|Q%V5nfLr$-GF)3P zAsOx=P(wo_o5#aIJ?>Z5n`F+-i8U=FLIQx8y+31j1_aku2+p13;MfuIF0NNMpKDt& zUg82`I76O@HrlgJx&h$P{kwQqb&J*4EN~bS0|*FIx94+LQo^W)O<4-BC7wJF+A7FL^192*tpRjE|^4k+IMFmAag^mqWK zAx5{==LWZC3^%MLlSy$s5D{WG?!n`nhE8Bs!CWrKWZDP>00YJupd5PWHw|ImuyGj+ zz5uxU{BZ09YkYX8Wy!HvOxhv70JwLr`wf8I=ks}~5VZlQzJU7$3~S3>5VW}J(|p_i c8L5WVUu;dc8yLjV8( literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Walls/rock.rsi/rock_marble.png b/Resources/Textures/Structures/Walls/rock.rsi/rock_marble.png new file mode 100644 index 0000000000000000000000000000000000000000..df72eb9e2548869f4376a199b8e8edc1d4850f2b GIT binary patch literal 796 zcmV+%1LOROP)`J|Q#Lb` zjErnVMuU`vl2S4l7}@Uc{hr=O7x&(CT(76Dd%5SF=X0LtInVR>$4n%ZN~!cbnM@QW zka#?PAHQ5Kh2tTH0Nd?WJ)h64R4UzJj3Dstcs#Oxzt6m0FN?)u97YC07a$l6s@ZIo zKi_UQ*6DOurBX43z;AemIo)oTjmKk#=lOiDCK3r#h!+4TAB{%*Ig`oo#d5hEbGclm zZXk$!KF>TJ4+n`xqe4sQTEOS?aWnRMJ$5)8gvzxL*nrJu)6G5S@eR;yK3tJOFRzT;!H zTCv4q!BaHO{Z|0A5XEAVCnuy=$a=lz%E?8t^6WApfCd7Ykxzz8U==8rIckWdR;#6( zS)~9-K#d(>Az9@RQcl*=#>`s)5ORs^c$8$Mb!1k(V0|0l3B**U(Sv|1?pr;&u zM)|GR>->AUT;}B%716Akz5tlDUPeMe=61Uo+BldTofO^8*3-4XI}njbL`Bm|Sc212bb_$_B0s`NQM+g$7$Che+vP$i()YxBfuDeP$!J>R$DjSAcS&&1Ofpzo6T4j8h<2lh{-l91O+*fdgWre4AwOoH?DTDb-`f9idu|zke2aJh%(wbPVJ-Nk aa>#!LI=~;Zx{QSY00005e(!&U?%;MkKSoX27QN--RZlfmSa5#I zJE{8q-QIqSUxkc76HviF_50fhdEP)Hv}*aN5uNzv-r}j05HXYFbW~14sowDk}bS zbadc!G|e4=&vLprfDj876P~|BFFNNAKx)NOicVQKYu>)X@FX( z9OQFCmSc4QH31>ZY3=}Q;G~b|fAcNd;SM9(0igVR@ybO8WXYCk{v*;0*Gt}P}6b{ Z008uifbQO6sty1E002ovPDHLkV1kdAnF9a- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Walls/rock.rsi/rock_phoron.png b/Resources/Textures/Structures/Walls/rock.rsi/rock_phoron.png new file mode 100644 index 0000000000000000000000000000000000000000..b78b02323a9cb39689c2d1fcaa2dda4b7372bcf6 GIT binary patch literal 529 zcmV+s0`C2ZP)GU%)TQollfI`2{Zk zg-dQLA>dY?kQelZ9kAG@_O6{q;lf5$Hf`*gwP(HV1pavZ6EG3j-Mn5Gk5@0F5+G2X zm*Jtp=Vf0KsRf7x$l(3st*ZAmZ05I1`kVs(9G=<*&~w+%L^2@oi}OopLIaYK2OMwJ zY&wIM1ni(2NihNhjs~!ruTNSzrEW1@K(lXJUn^LrBfv%l6urP%H*80#qm`$89T1?G zv|L%hr7-8jdz6AcA?L{9iUESp-ynsEBUgqJNo-uH8>|vCi5z&hCJb7NE#O=e_+1wP zG`#x(y7!V}aNH3PlQ0t?a1`2>_BGDkBz|?$iq#(h0wiD}QHOflC1E+RB%QcYz$ADc zgH!poh%kE=SV%}t8Qgnx54{bKR6ZI3P35Bz;52-n2cJMEpJk{GN$+DAFHZv_HY8Nj zQz6s{TFbFYAZ{YGkrSFXa@l@BTCG=TW&$xVgU9KJl)fYqR&aM$%tm;__U!ENd%UFH zF6Ac`Ep-=2TJVa@QX519+R4Sgfn!j_s7=!vQ#A#Bwv^_B=h8dLN;t&-!JLmTtSYmF T&e1l(00000NkvXXu0mjf?zrEz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Walls/rock.rsi/rock_platinum.png b/Resources/Textures/Structures/Walls/rock.rsi/rock_platinum.png new file mode 100644 index 0000000000000000000000000000000000000000..4c2fa783fb13c65d462632a026eda23f3b367b86 GIT binary patch literal 747 zcmVJNRCt{2mdk4sQ543%Nu!yhp(KqYp<_&Ji?&rE3dTV}u`WbJ zPp_ZZP&=?-v|KSAgi3XU+_4nWO?Y!QCG7ve~wA1D3@p(_AgHH8>? z{sff9YCn3}2p=Pq0%PX`~X%A=B4 zs~x#~0f~4J-tGVby_b-gosvM-Lns2AI^RbM$V!9r?=VYs~{ z8To+Cg;@b$F_f?%(!UG6f!ou8zN^>B!2NrwA==zd$ymsgFg_Z@yl76J%j0Hk0HAqi znpm)gB79yB-G>91ntZDYg09}z!%OBf;rDbKLiILm@A4D6RhAYP!LSa*ro%8dTg5lS z*th=xCPJ^J)VvxRP@IsOTO3}*qo1*qPN10oT6M*W01~MPvHIg`g}TI?#o~a86^p0q z7)+*}TTVptTZ{1qfHjD9q7%6|km*lh@gSLn-MPE!Bx;Y{Edi9Ywi+=yLN>f*8vY7^ zEE*lx?`@>FR3F81G-$!9sczi?Wa(*M7l7XS5AbgT=y5J+0^l5GXjR<+H*fWm`Rqz# z0B-c(Ac#_ub6lyb|`6})W#boJ3l z1g++8Qu9K)o?7pJO#sx~%Q>W$E0O%7*}NtI+AscK3{s<6Pv@f=B`8I55gP`+fn+Up8e(0b|0`J-*1_|(m!gD6& z*Z8)HrY7J5W58Nmv989s!vP5`xMW0-fD2BK@_N0B@0IQN3N4!LlEkYz*p_oc>4R$B z?y8AHCXo;cxSIAGO0C5lb*U#e T`a=Af00000NkvXXu0mjfn|m7j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Walls/rock.rsi/rock_rutile.png b/Resources/Textures/Structures/Walls/rock.rsi/rock_rutile.png new file mode 100644 index 0000000000000000000000000000000000000000..ff63e930fd6f6bc4b222e99e93b3b706a1eb2457 GIT binary patch literal 934 zcmV;X16lluP)R!~~4{raT1sq%{X$S(JI*-xoJ_tYD*{{WXZQf-A zuLNMp$CC(#VWQKz#g=J6mSvO;D>n23T5WHo65%j{Y1s)#7Q{+`tII|*NY%|)H!WIw z4*j}8uMZ4@5lSUB9u7yD5WH5Rh#J|4y2+A!`cA>GsnzSpzpd`MEh@l;r~RZ@J(7-4#l@1-IS7s>L{k zpwEl@D=ip}qvWb8FT1hte2pU?S!#*2On|8hdvbv5V9}Q8eZ@XXX1`8bsQ?EY(M;16 zXhk|e!PlAns{q_MI9oCA@w!2U0oZ2_&JYA3^gxmPFATt~e&FQtStS1p0r2dP^l=hA zkK`ixe;zIsp!BrxT9KUF@7MA_2WOS05UBv1UL|>&v3%rhY5Bi^$3%^O-^c!kItE@d z>H7kJ51oAOla&$_wS;QzFfKff;D^yd8WvIk&-p)~Sx*S8c3emM)}5y3MF2i%aBxl2 z5^_bQ@AQDP@8`L<-E#hyVbJqz1pO}N541A?4sMcf96X#9KqU?)NqF}4%bWK+2O>M- zqM{~SSu-mbblinLGXRndTNJS8ha{T}MJwZnVDMGdlkLz=JKl8;X&pq#vA(+uz`k2{ zB?)d>7A}5%6Q1?7YGy&OvV4v-j51noBmGFGl}*|x6Ey!cq$ct;&Xk-llG-o_#EpSi zSx!vDftNZy0cg67H~Y-qaONuJ+J+8IxX8tz_EfB zbc}AA1g2B{@FlJx)F*TNM&6DS?+HRxo-3tj@!Hty`CCi$KgS5=HJksmNdN!<07*qo IM6N<$f&kpEHvj+t literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Walls/rock.rsi/rock_silver.png b/Resources/Textures/Structures/Walls/rock.rsi/rock_silver.png new file mode 100644 index 0000000000000000000000000000000000000000..3a06596ccfed7fc76f746367dcbb0988b810f3cb GIT binary patch literal 575 zcmV-F0>J%=P)!NgY(vm%I0+Gx`0l%3hoSjr`2u_aJ`S*4F75Gn9P|QkI-Trz zJT`~Jp;_E*~}~!i}t1{OA#Vp+?HGH1+<@Xd&pXZT$s6oXu7Wjwp0NU_8fb^s;9S zjuUQbSx+XD_PJ;gq68!4xG0L`g40e&B!7Qzor(gWyr#BX%O;eu#&}BTU8AgVXt&!n z_mT#YDBxPWPANF8qfUj@(8;4%xSdF5PawKJn&jxIt?+pTCEz7 zTnWv7a!<~EDSPWU)*fNpcQ(*=KJVWG2=%|u5F^_6?8^W${X+dO?+r4%fbBH`A@31s zQ$7qYPSdV=kqr=W&vpLQ>UP$$oG6QKl@|M}e1+Y2*y RJOO%*!PC{xWt~$(699&+ZkPZ7 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Walls/rock.rsi/rock_tin.png b/Resources/Textures/Structures/Walls/rock.rsi/rock_tin.png new file mode 100644 index 0000000000000000000000000000000000000000..8f92a5163623885d038d3d596712e9d838d0a29f GIT binary patch literal 486 zcmV@P)6pi%%+tc#*x z2Y~b$;4q4S0Ky0;Q$iZA;b*bZ3xMnU{tE*^d>2LGMPV;D09trdHI9vt8;Et1BwumL z7u9L$H(6=6u7uQJXhUoUL5O3ls*0Je;B60x5aMP81aI6muU9^NF9dJLu3iWV052Q~$sYlrVuKq&^@6Uc?s^6RAVCOG55Y*+RM$(q z0U(Z3%LIhFp$v;RfXT%)2N2$s@M<`{%^MKrP&k4Bh&{n(zV83QEdZByMZkK!55%_U c048s}0reCUv^HIBUH||907*qoM6N<$f{D_=r~m)} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Walls/rock.rsi/rock_uranium.png b/Resources/Textures/Structures/Walls/rock.rsi/rock_uranium.png new file mode 100644 index 0000000000000000000000000000000000000000..1815c44d6c1566ad888980597d04564e9130efe0 GIT binary patch literal 445 zcmV;u0Yd(XP)T`sKQBFLSsg$J&;hI+ zU}t+PetvniS_Al)N15?j0dV^BlbMVs-!AliTYzWUGF=_)+8GxL0gev$;?2=Qj`!a( z#JYNzE@kMtGJ9W?13)NF;(YTo5!T}{>HP`;?(QG0r>PTPo_;1HTXew#b%Ah5^K9Z2mQ00f?% z4>xcfQ3A7+v+L@8!Fg=HS^#+vI07e3s8J9BgxAmt0Awl`{_o$gYK$8NU{Pj06R!-! z7yt?(RCt`lm#=SwKorN{5)hqe(!XFyGg~uLQB!0MmcMbfrV`9V z&CJA1(`0`E31Wzf?cTwA19HH<<5-_5q1=5xyq`w^ceYso)<66G^&!jd0-(iTvsC>? zHW1zcP*jUsLd+5ZhB%%z1l{{L0JgFO^aLyx&Vvdgb}3Ls}+_(02HRh zwn@dn=zb+mYs4O)Y}VI_y*P<& zeE$fzA-vsSY*P})XW<~?hM*hk?gQ7`IURa4T%SWxtv|d((rO7PVYHZ8AR+;iIKr)# zPq1EYB9~GP`h>}v8Qsc}+E6?{e!?o=f{R%-A`-{i#@x`c-i0i#?>U-vD{h7g6AfW< zsKv8y$m2p>0U`i`plh0VfOoNeqc<g*9UFbX_@=5+ zL2TY*dI(e}934bB+8bV)48Z4y&biNI9F{UOPE;{~^sLA^l6cC2vGaoob_mod1Ww-w hJvQr?k*O@Z_6uz^gpqt(M4|uy002ovPDHLkV1l`4>vsSE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Walls/rock.rsi/rock_void_opal.png b/Resources/Textures/Structures/Walls/rock.rsi/rock_void_opal.png new file mode 100644 index 0000000000000000000000000000000000000000..7624dcee44e483939433c446561067c219abdd66 GIT binary patch literal 371 zcmV-(0gV2MP)3rLKoiuEG|5PxbOgl%w&k7rKTng z%77mRS501%G|71PuwH<_0f6tXxfLLU0OL41a$Mz{Y-Md^0q}tL9>0zt)av^lVvOm9 zcmQ;cht8-4`Z-5QA^=9tQD_4=TRDJ68}?k7OBbU*(fHp1WMJSDgDL}5u zZv{Z7=zLk0%V*3}kem5pfUfI6(^g5E&>gZ@y&}_OtLH@kFOw-hkS}E;=$5L8Y_a6vCTp?!S4<4(78j$&;~ccyH5Qe%pv)*Z=U)x7GXQBCeUjjUrbQY?G6rTJp^I~}?b3oyd7BPEKcb^Q+57|zC zxcUysE32@o)tPxelF{r5}E*okZc|R literal 0 HcmV?d00001