Преглед на файлове

Tdm update 9b (#221)

* window fix, WIP map

* Adds a LOT of decals, signs, road markings, etc

* even more civ13 sprites to play around with

* more chairs and stuff

* cigs

* Cold war (#220) (#222)

* Update base_clothing.yml again

* Lowered base_item.yml to 100g

* yes

* Update ShowFactionIconsComponent.cs

* sovietCW

* changes sovietcw

* Update usa.yml

* Update Resources/Prototypes/Roles/Jobs/Civ14/TDM/sovietCW.yml



* Update Resources/Prototypes/Roles/Jobs/Civ14/TDM/sovietCW.yml



* Update sovietCW.yml

* Update sovietCW.yml

---------

Co-authored-by: Papiditel <mrharved@gmail.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* wardrobes, decorative machines, hesco bastions and jersey barriers

* cold war grenades, loadouts, fixes (hopefully) the capture timer resetting

* Asymmetric capture mechanics

* sprite, code fix

* roles, small fixes

* equipments

* sprite fix, gracewall fix

* map fix

---------

Co-authored-by: Papiditel <mrharved@gmail.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Taislin преди 6 месеца
родител
ревизия
2b654bb090
променени са 100 файла, в които са добавени 3116 реда и са изтрити 383 реда
  1. 110 42
      Content.Server/GameTicking/Rules/CaptureAreaSystem.cs
  2. 25 0
      Content.Server/GameTicking/Rules/Components/CaptureAreaComponent.cs
  3. 2 1
      Content.Server/GameTicking/Rules/Components/RandomWeatherRuleComponent.cs
  4. 5 0
      Content.Server/Maps/GameMapPrototype.cs
  5. 1 1
      Content.Server/Weapons/Ranged/Systems/GunSystem.Cartridges.cs
  6. 2 2
      Resources/ConfigPresets/Build/development.toml
  7. 4 0
      Resources/Locale/en-US/game-ticking/game-presets/preset-extended.ftl
  8. 1 1
      Resources/Locale/en-US/job/department.ftl
  9. 68 0
      Resources/Maps/civ/tdm/hotel.yml
  10. 14 19
      Resources/Maps/civ/tdm/opushka.yml
  11. 10 35
      Resources/Prototypes/Civ14/Entities/Clothing/entities_clothing_accessories.yml
  12. 57 0
      Resources/Prototypes/Civ14/Entities/Clothing/webbings.yml
  13. 56 0
      Resources/Prototypes/Civ14/Entities/Decals/road.yml
  14. 43 0
      Resources/Prototypes/Civ14/Entities/Decals/wide.yml
  15. 18 1
      Resources/Prototypes/Civ14/Entities/Markers/capturable_areas.yml
  16. 101 2
      Resources/Prototypes/Civ14/Entities/Objects/Explosives/grenades.yml
  17. 15 15
      Resources/Prototypes/Civ14/Entities/Objects/Guns/entities_smg.yml
  18. 237 0
      Resources/Prototypes/Civ14/Entities/Objects/Specific/cigarettes.yml
  19. 10 0
      Resources/Prototypes/Civ14/Entities/Objects/Storage/crates.yml
  20. 44 0
      Resources/Prototypes/Civ14/Entities/Objects/Storage/filled_crates.yml
  21. 161 0
      Resources/Prototypes/Civ14/Entities/Structures/Furniture/Decorative/decorative_machines.yml
  22. 0 1
      Resources/Prototypes/Civ14/Entities/Structures/Furniture/Decorative/decoratives.yml
  23. 27 0
      Resources/Prototypes/Civ14/Entities/Structures/Furniture/beds.yml
  24. 142 0
      Resources/Prototypes/Civ14/Entities/Structures/Furniture/chairs.yml
  25. 463 0
      Resources/Prototypes/Civ14/Entities/Structures/Furniture/sign.yml
  26. 84 0
      Resources/Prototypes/Civ14/Entities/Structures/Furniture/tables.yml
  27. 151 0
      Resources/Prototypes/Civ14/Entities/Structures/Furniture/wardrobes.yml
  28. 221 0
      Resources/Prototypes/Civ14/Entities/Structures/Walls/barricades.yml
  29. 1 1
      Resources/Prototypes/Civ14/Entities/Structures/Walls/windows.yml
  30. 256 0
      Resources/Prototypes/Civ14/Entities/Structures/paintings.yml
  31. 3 3
      Resources/Prototypes/Civ14/StatusIcon/faction.yml
  32. 1 0
      Resources/Prototypes/Damage/modifier_sets.yml
  33. 9 2
      Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/cigarette.yml
  34. 1 0
      Resources/Prototypes/Entities/Objects/Weapons/Guns/Bow/bow.yml
  35. 1 1
      Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/arrows.yml
  36. 186 196
      Resources/Prototypes/Entities/Structures/Wallmounts/Signs/signs.yml
  37. 25 1
      Resources/Prototypes/GameRules/roundstart.yml
  38. 1 0
      Resources/Prototypes/Maps/Pools/default.yml
  39. 1 0
      Resources/Prototypes/Maps/civ/camp.yml
  40. 1 0
      Resources/Prototypes/Maps/civ/camp_ww2.yml
  41. 30 0
      Resources/Prototypes/Maps/civ/hotel.yml
  42. 1 0
      Resources/Prototypes/Maps/civ/nomads.yml
  43. 1 0
      Resources/Prototypes/Maps/civ/opushka.yml
  44. 11 10
      Resources/Prototypes/Roles/Jobs/Civ14/TDM/sovietCW.yml
  45. 12 5
      Resources/Prototypes/Roles/Jobs/Civ14/TDM/usa.yml
  46. 14 0
      Resources/Prototypes/game_presets.yml
  47. BIN
      Resources/Textures/Civ14/Clothing/exported/ties/6b2.rsi/equipped-OUTERCLOTHING.png
  48. 24 20
      Resources/Textures/Civ14/Clothing/exported/ties/6b2.rsi/meta.json
  49. BIN
      Resources/Textures/Civ14/Clothing/exported/ties/pasgt_woodland.rsi/equipped-HELMET.png
  50. BIN
      Resources/Textures/Civ14/Clothing/exported/ties/pasgt_woodland.rsi/equipped-OUTERCLOTHING.png
  51. 24 24
      Resources/Textures/Civ14/Clothing/exported/ties/pasgt_woodland.rsi/meta.json
  52. BIN
      Resources/Textures/Civ14/Machines/Coinsmelter.rsi/coinsmelter.png
  53. BIN
      Resources/Textures/Civ14/Machines/Coinsmelter.rsi/coinsmelter_on.png
  54. 32 0
      Resources/Textures/Civ14/Machines/Coinsmelter.rsi/meta.json
  55. BIN
      Resources/Textures/Civ14/Machines/bullet_press.rsi/bullet_press.png
  56. 17 0
      Resources/Textures/Civ14/Machines/bullet_press.rsi/meta.json
  57. BIN
      Resources/Textures/Civ14/Machines/bullet_press.rsi/rusted_bullet_press.png
  58. 28 0
      Resources/Textures/Civ14/Machines/mining_drill.rsi/meta.json
  59. BIN
      Resources/Textures/Civ14/Machines/mining_drill.rsi/mining_drill.png
  60. BIN
      Resources/Textures/Civ14/Machines/mining_drill.rsi/mining_drill_active.png
  61. BIN
      Resources/Textures/Civ14/Machines/mining_drill.rsi/mining_drill_powered.png
  62. 46 0
      Resources/Textures/Civ14/Machines/pipes.rsi/meta.json
  63. BIN
      Resources/Textures/Civ14/Machines/pipes.rsi/pipe-b.png
  64. BIN
      Resources/Textures/Civ14/Machines/pipes.rsi/pipe-d.png
  65. BIN
      Resources/Textures/Civ14/Machines/pipes.rsi/pipe-t.png
  66. BIN
      Resources/Textures/Civ14/Machines/pipes.rsi/pipe-u.png
  67. BIN
      Resources/Textures/Civ14/Machines/pipes.rsi/s_pipe.png
  68. BIN
      Resources/Textures/Civ14/Machines/pipes.rsi/s_pipe2_thin.png
  69. BIN
      Resources/Textures/Civ14/Machines/pipes.rsi/s_pipe_connection3_thin.png
  70. BIN
      Resources/Textures/Civ14/Machines/pipes.rsi/s_pipe_connection4_thin.png
  71. BIN
      Resources/Textures/Civ14/Machines/pipes.rsi/s_pipe_turn.png
  72. 14 0
      Resources/Textures/Civ14/Machines/powertransformer.rsi/meta.json
  73. BIN
      Resources/Textures/Civ14/Machines/powertransformer.rsi/powertransformer.png
  74. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/AAS_Off.png
  75. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/AAS_Off_Open.png
  76. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/AAS_On.png
  77. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/AAS_On_Open.png
  78. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/blackbox.png
  79. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/blackbox_b.png
  80. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/bus.png
  81. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/bus_o.png
  82. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/bus_o_off.png
  83. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/bus_off.png
  84. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/comm_server.png
  85. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/comm_server_o.png
  86. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/comm_server_o_off.png
  87. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/comm_server_off.png
  88. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/controller-p.png
  89. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/controller.png
  90. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/hub.png
  91. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/hub_o.png
  92. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/hub_o_off.png
  93. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/hub_off.png
  94. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/message_server.png
  95. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/message_server_o.png
  96. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/message_server_o_off.png
  97. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/message_server_off.png
  98. 304 0
      Resources/Textures/Civ14/Machines/servers.rsi/meta.json
  99. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/processor.png
  100. BIN
      Resources/Textures/Civ14/Machines/servers.rsi/processor_off.png

+ 110 - 42
Content.Server/GameTicking/Rules/CaptureAreaSystem.cs

@@ -26,19 +26,61 @@ public override void Update(float frameTime)
     {
         base.Update(frameTime);
 
+        // Attempt to get the rule component.
+        // The standard way in GameRuleSystem<T> is: var ruleComp = RuleConfiguration;
+        // If 'RuleConfiguration' is not recognized by the compiler in your environment,
+        // you can query for the component directly as a workaround.
+        CaptureAreaRuleComponent? ruleComp = null;
+        var ruleQuery = EntityQueryEnumerator<CaptureAreaRuleComponent>();
+        if (ruleQuery.MoveNext(out _, out var activeRuleComp)) // Assumes one active rule component
+        {
+            ruleComp = activeRuleComp;
+        }
+
+        if (ruleComp == null) // No active CaptureAreaRuleComponent found
+        {
+            return;
+        }
+
+        // Handle Asymmetric mode timer and defender victory
+        if (ruleComp.Mode == "Asymmetric")
+        {
+            // If the round has already ended (e.g., by a capture in ProcessArea earlier this frame), do nothing.
+            if (_gameTicker.RunLevel != GameRunLevel.InRound)
+                return;
+
+            ruleComp.AsymmetricGameTimeElapsed += frameTime;
+            if (ruleComp.AsymmetricGameTimeElapsed >= ruleComp.Timer * 60f) // ruleComp.Timer is in minutes
+            {
+                var defenderDisplayName = Faction2String(ruleComp.DefenderFactionName);
+                if (string.IsNullOrEmpty(ruleComp.DefenderFactionName) || string.IsNullOrEmpty(defenderDisplayName))
+                {
+                    Logger.ErrorS("capturearea", $"Asymmetric mode: DefenderFactionName is not set or Faction2String returned empty for '{ruleComp.DefenderFactionName}'. Defaulting defender display name.");
+                    defenderDisplayName = "The Defenders"; // Fallback display name
+                }
+
+                _chat.DispatchGlobalAnnouncement(
+                    $"{defenderDisplayName} ha(s) successfully defended for {ruleComp.Timer:F0} minutes and win(s) the round!",
+                    "Round", false, null, Color.Green);
+                _roundEndSystem.EndRound();
+                return; // Round ended, no need to process areas further for capture victories
+            }
+        }
+
+        // Process individual capture areas
         var query = EntityQueryEnumerator<CaptureAreaComponent>();
         while (query.MoveNext(out var uid, out var area))
         {
-            ProcessArea(uid, area, frameTime);
+            // If the round ended due to asymmetric timer, stop processing areas.
+            if (_gameTicker.RunLevel != GameRunLevel.InRound)
+                break;
+            ProcessArea(uid, area, frameTime, ruleComp);
         }
     }
     /// <summary>
     /// Processes a capture area, determining faction control based on the presence of alive faction members, updating control status, managing capture timers, and dispatching global announcements for control changes, timed warnings, and victory.
     /// </summary>
-    /// <param name="uid">The entity identifier of the capture area.</param>
-    /// <param name="area">The capture area component to process.</param>
-    /// <param name="frameTime">The elapsed time since the last update, in seconds.</param>
-    private void ProcessArea(EntityUid uid, CaptureAreaComponent area, float frameTime)
+    private void ProcessArea(EntityUid uid, CaptureAreaComponent area, float frameTime, CaptureAreaRuleComponent ruleComp)
     {
         var areaXform = _transform.GetMapCoordinates(uid);
         var factionCounts = new Dictionary<string, int>();
@@ -77,7 +119,7 @@ private void ProcessArea(EntityUid uid, CaptureAreaComponent area, float frameTi
             if (count > maxCount)
             {
                 maxCount = count;
-                currentController = faction;
+                currentController = Faction2String(faction);
             }
             else if (maxCount != 0 && count == maxCount)
             {
@@ -86,10 +128,7 @@ private void ProcessArea(EntityUid uid, CaptureAreaComponent area, float frameTi
         }
 
         // Update component state
-        if (maxCount > 0 && currentController != "")
-        {
-            area.Occupied = true;
-        }
+        area.Occupied = maxCount > 0 && !string.IsNullOrEmpty(currentController);
 
         if (currentController != area.Controller)
         {
@@ -143,33 +182,29 @@ private void ProcessArea(EntityUid uid, CaptureAreaComponent area, float frameTi
             else
             {
                 // Direct change from one faction to another
-                if (area.ContestedTimer == 0f)
-                {
-                    // Store the last controller when we first enter contested state
-                    area.LastController = area.Controller;
-                }
+                var oldController = area.Controller; // This is the display name of the old controller
 
-                // Treat as contested first
-                area.Controller = "";
-                area.ContestedTimer += frameTime;
+                // Announce loss for the old controller
+                // oldController is guaranteed to be non-empty here because:
+                // 1. currentController != area.Controller (outer condition)
+                // 2. currentController != "" (otherwise this branch wouldn't be hit, it'd be currentController == "")
+                // 3. area.Controller != "" (otherwise this branch wouldn't be hit, it'd be area.Controller == "")
+                _chat.DispatchGlobalAnnouncement($"{oldController} has lost control of {area.Name}!", "Objective", false, null, Color.Red);
 
-                // Only reset and announce if contested long enough
-                if (area.ContestedTimer >= area.ContestedResetTime)
-                {
-                    area.CaptureTimer = 0f;
-                    area.CaptureTimerAnnouncement1 = false;
-                    area.CaptureTimerAnnouncement2 = false;
+                // Announce gain for the new controller
+                _chat.DispatchGlobalAnnouncement($"{currentController} has gained control of {area.Name}!", "Objective", false, null, Color.DodgerBlue);
 
-                    // Now update to the new controller
-                    area.Controller = currentController;
+                // Update to the new controller
+                area.Controller = currentController;
 
-                    // Announce the change
-                    _chat.DispatchGlobalAnnouncement($"{area.LastController} has lost control of {area.Name}!", "Objective", false, null, Color.Red);
-                    _chat.DispatchGlobalAnnouncement($"{currentController} has gained control of {area.Name}!", "Objective", false, null, Color.DodgerBlue);
+                // Reset capture progress for the new controller
+                area.CaptureTimer = 0f;
+                area.CaptureTimerAnnouncement1 = false;
+                area.CaptureTimerAnnouncement2 = false;
 
-                    area.LastController = "";
-                    area.ContestedTimer = 0f;
-                }
+                // Reset contested state as it's now firmly controlled by a new faction
+                area.ContestedTimer = 0f;
+                area.LastController = ""; // Previous "last controller" during a contested phase is no longer relevant
             }
         }
         else if (!string.IsNullOrEmpty(currentController))
@@ -180,23 +215,44 @@ private void ProcessArea(EntityUid uid, CaptureAreaComponent area, float frameTi
 
             //announce when theres 2 and 1 minutes left.
             var timeleft = area.CaptureDuration - area.CaptureTimer;
-            if (timeleft <= 120 && area.CaptureTimerAnnouncement2 == false)
-            {
-                _chat.DispatchGlobalAnnouncement($"Two minutes until {currentController} captures {area.Name}!", "Round", false, null, Color.Blue);
-                area.CaptureTimerAnnouncement2 = true;
-            }
-            else if (timeleft < 60 && area.CaptureTimerAnnouncement1 == false)
+            if (currentController != ruleComp.DefenderFactionName)
             {
-                _chat.DispatchGlobalAnnouncement($"One minute until {currentController} captures {area.Name}!", "Round", false, null, Color.Blue);
-                area.CaptureTimerAnnouncement1 = true;
+                if (timeleft <= 120 && area.CaptureTimerAnnouncement2 == false)
+                {
+                    _chat.DispatchGlobalAnnouncement($"Two minutes until {currentController} captures {area.Name}!", "Round", false, null, Color.Blue);
+                    area.CaptureTimerAnnouncement2 = true;
+                }
+                else if (timeleft < 60 && area.CaptureTimerAnnouncement1 == false)
+                {
+                    _chat.DispatchGlobalAnnouncement($"One minute until {currentController} captures {area.Name}!", "Round", false, null, Color.Blue);
+                    area.CaptureTimerAnnouncement1 = true;
+                }
             }
             //Check for capture completion
             if (area.CaptureTimer >= area.CaptureDuration)
             {
                 if (_gameTicker.RunLevel == GameRunLevel.InRound)
                 {
-                    _chat.DispatchGlobalAnnouncement($"{currentController} has captured {area.Name} and is victorious!", "Round", false, null, Color.Green);
-                    _roundEndSystem.EndRound();
+                    bool canWinByCapture = true;
+                    // area.Controller is the display name of the faction that has held the point
+                    string winningControllerDisplay = area.Controller;
+
+                    if (ruleComp.Mode == "Asymmetric")
+                    {
+                        // In Asymmetric mode, only non-defenders (attackers) can win by capturing a point.
+                        // The defender wins by timeout.
+                        if (winningControllerDisplay == Faction2String(ruleComp.DefenderFactionName))
+                        {
+                            canWinByCapture = false;
+                        }
+                    }
+
+                    if (canWinByCapture && !string.IsNullOrEmpty(winningControllerDisplay))
+                    {
+                        _chat.DispatchGlobalAnnouncement($"{winningControllerDisplay} has captured {area.Name} and is victorious!", "Round", false, null, Color.Green);
+                        _roundEndSystem.EndRound();
+                        return; // Round ended, no further processing for this area needed.
+                    }
                 }
             }
         }
@@ -216,5 +272,17 @@ private void ProcessArea(EntityUid uid, CaptureAreaComponent area, float frameTi
         }
         area.PreviousController = currentController;
     }
+    private static string Faction2String(string faction)
+    {
+        switch (faction)
+        {
+            case "SovietCW":
+                return "Soviet Union";
+            case "Soviet":
+                return "Soviet Union";
+            default:
+                return faction;
+        }
 
+    }
 }

+ 25 - 0
Content.Server/GameTicking/Rules/Components/CaptureAreaComponent.cs

@@ -3,6 +3,31 @@ namespace Content.Server.GameTicking.Rules.Components;
 [RegisterComponent, Access(typeof(CaptureAreaSystem))]
 public sealed partial class CaptureAreaRuleComponent : Component
 {
+    /// <summary>
+    /// The type of captures possible
+    /// - King of the Hill: All factions try to capture a specific area.
+    /// - Asymmetric: One faction attacks, another defends. Only the attacker can capture.
+    /// There is a timer for the defender.
+    /// - Symmetric: Factions have to capture each other's bases.
+    /// </summary>
+    [DataField("mode")]
+    public string Mode { get; set; } = "King of the Hill";
+    /// <summary>
+    /// The timer before the defender wins, in minutes. Only applies if Mode is Asymmetric.
+    /// </summary>
+    [DataField("timer")]
+    public float Timer { get; set; } = 40f;
+    /// <summary>
+    /// The faction that is defending on this map.
+    /// </summary>
+    [DataField("defenderFactionName")]
+    public string DefenderFactionName { get; set; } = "Defender";
+
+    /// <summary>
+    /// How much time has elapsed in an Asymmetric mode game.
+    /// </summary>
+    [DataField("asymmetricGameTimeElapsed"), ViewVariables(VVAccess.ReadWrite)]
+    public float AsymmetricGameTimeElapsed { get; set; } = 0f;
 }
 [RegisterComponent]
 public sealed partial class CaptureAreaComponent : Component

+ 2 - 1
Content.Server/GameTicking/Rules/Components/RandomWeatherRuleComponent.cs

@@ -23,7 +23,8 @@ public sealed partial class RandomWeatherRuleComponent : Component
     /// <summary>
     /// List of pre-set colors, mostly for tdm maps so we can set fixed times of day.
     /// </summary>
-    [DataField]
+
+    [DataField("dayTimes")]
     public List<string> DayTimes = [
         "Day", //Daylight #D8B059
         "Dawn", //Dawn/Dusk #cf7330

+ 5 - 0
Content.Server/Maps/GameMapPrototype.cs

@@ -44,6 +44,11 @@ public sealed partial class GameMapPrototype : IPrototype
     /// </summary>
     [DataField(required: true)]
     public ResPath MapPath { get; private set; } = default!;
+    /// <summary>
+    /// If this map requires a specific preset
+    /// </summary>
+    [DataField("fixedPreset")]
+    public string FixedPreset { get; private set; } = "Nomads";
 
     [DataField("stations", required: true)]
     private Dictionary<string, StationConfig> _stations = new();

+ 1 - 1
Content.Server/Weapons/Ranged/Systems/GunSystem.Cartridges.cs

@@ -102,7 +102,7 @@ public void CheckAndScheduleSpentCartridgeDeletion(EntityUid cartridgeUid, Cartr
 
                     if (EntityManager.TryGetComponent<CartridgeAmmoComponent>(cartridgeUid, out var currentCartridge) && currentCartridge.Spent)
                     {
-                        _sawmill.Info($"Deleting spent cartridge {ToPrettyString(cartridgeUid)} after 5 minutes.");
+                        //_sawmill.Info($"Deleting spent cartridge {ToPrettyString(cartridgeUid)} after 5 minutes.");
                         EntityManager.QueueDeleteEntity(cartridgeUid);
                     }
                     else

+ 2 - 2
Resources/ConfigPresets/Build/development.toml

@@ -2,11 +2,11 @@
 # Straight in-game baby
 lobbyenabled = true
 # Dev map for faster loading & convenience
-map = "CampWW2"
+map = "Hotel"
 role_timers = false
 lobbyduration = 15
 disallowlatejoins = false
-defaultpreset = "tdm"
+defaultpreset = "tdm-asymmetric"
 
 [events]
 enabled = false

+ 4 - 0
Resources/Locale/en-US/game-ticking/game-presets/preset-extended.ftl

@@ -3,3 +3,7 @@ extended-description = No preset factions or objectives.
 
 tdm-title = Team Deathmatch
 tdm-description = Two factions competing to capture the target.
+
+
+tdm-asy-title = Team Deathmatch - Siege
+tdm-asy-description = One faction defends for a set period, another has to capture the target.

+ 1 - 1
Resources/Locale/en-US/job/department.ftl

@@ -15,4 +15,4 @@ department-English = England
 department-German = Germany
 department-Soviet = Soviet Union
 department-US = United States
-department-SovietCW = Soviet Union.
+department-SovietCW = Soviet Union

Файловите разлики са ограничени, защото са твърде много
+ 68 - 0
Resources/Maps/civ/tdm/hotel.yml


+ 14 - 19
Resources/Maps/civ/tdm/opushka.yml

@@ -4,8 +4,8 @@ meta:
   engineVersion: 251.0.0
   forkId: ""
   forkVersion: ""
-  time: 05/21/2025 21:19:17
-  entityCount: 1050
+  time: 05/22/2025 14:35:08
+  entityCount: 1049
 maps:
 - 1
 grids:
@@ -2536,29 +2536,29 @@ entities:
     - type: Transform
       pos: 21.578566,19.471094
       parent: 2
-- proto: civ13_wallflag_medical
+- proto: civ13_wallflag_german
   entities:
-  - uid: 113
+  - uid: 187
     components:
     - type: Transform
-      pos: -28.5,18.5
+      pos: -29.5,22.5
       parent: 2
-  - uid: 130
+  - uid: 205
     components:
     - type: Transform
-      pos: 75.5,24.5
+      pos: -29.5,19.5
       parent: 2
-- proto: civ13_wallflag_nazi
+- proto: civ13_wallflag_medical
   entities:
-  - uid: 268
+  - uid: 113
     components:
     - type: Transform
-      pos: -29.5,22.5
+      pos: -28.5,18.5
       parent: 2
-  - uid: 269
+  - uid: 130
     components:
     - type: Transform
-      pos: -29.5,19.5
+      pos: 75.5,24.5
       parent: 2
 - proto: civ13_wallflag_sov
   entities:
@@ -3874,11 +3874,6 @@ entities:
     - type: Transform
       pos: 17.5,19.5
       parent: 2
-  - uid: 187
-    components:
-    - type: Transform
-      pos: 47.5,18.5
-      parent: 2
 - proto: Shovel
   entities:
   - uid: 458
@@ -6985,7 +6980,7 @@ entities:
       pos: 21.5,24.5
       parent: 2
     - type: Door
-      secondsUntilStateChange: -12092.178
+      secondsUntilStateChange: -12158.777
       state: Opening
     - type: Godmode
       oldDamage: {}
@@ -6995,7 +6990,7 @@ entities:
       pos: 23.5,17.5
       parent: 2
     - type: Door
-      secondsUntilStateChange: -15184.893
+      secondsUntilStateChange: -15251.492
       state: Opening
     - type: Godmode
       oldDamage: {}

+ 10 - 35
Resources/Prototypes/Civ14/Entities/Clothing/entities_clothing_accessories.yml

@@ -1487,7 +1487,7 @@
       time: 5
 - type: entity
   name: green PASGT body armor
-  parent: ClothingNeckBase
+  parent: civ13_accessory_woodland_PASGT_body_armor
   id: civ13_accessory_green_PASGT_body_armor
   description: Wearable armor that can stop most pistol rounds. This one is green colored.
   components:
@@ -1495,14 +1495,6 @@
       sprite: Civ14/Clothing/exported/ties/pasgt_green.rsi
     - type: Clothing
       sprite: Civ14/Clothing/exported/ties/pasgt_green.rsi
-    - type: Armor
-      modifiers:
-        coefficients:
-          Blunt: 0.32
-          Slash: 0.32
-          Piercing: 0.48
-          Arrow: 0.054
-          Heat: 0.78
     - type: Construction
       graph: civ13_accessory_green_PASGT_body_armor
       node: end
@@ -5355,9 +5347,9 @@
         coefficients:
           Blunt: 0.32
           Slash: 0.32
-          Piercing: 0.7
+          Piercing: 0.48
           Arrow: 0.054
-          Heat: 0.85
+          Heat: 0.78
     - type: Construction
       graph: civ13_accessory_6B2_body_armor
       node: end
@@ -5761,12 +5753,11 @@
     - type: Armor
       modifiers:
         coefficients:
-          Blunt: 1
-          Slash: 1
-          Piercing: 1
-          Arrow: 1
-          Heat: 1
-          Radiation: 1
+          Blunt: 0.45
+          Slash: 0.45
+          Piercing: 0.60
+          Arrow: 0.08
+          Heat: 0.78
     - type: Construction
       graph: civ13_accessory_6B1_vest
       node: end
@@ -5801,7 +5792,7 @@
       time: 5
 - type: entity
   name: khaki PASGT body armor
-  parent: ClothingNeckBase
+  parent: civ13_accessory_woodland_PASGT_body_armor
   id: civ13_accessory_khaki_PASGT_body_armor
   description: Wearable armor that can stop most pistol rounds. This one is khaki colored.
   components:
@@ -5809,14 +5800,6 @@
       sprite: Civ14/Clothing/exported/ties/pasgt_khaki.rsi
     - type: Clothing
       sprite: Civ14/Clothing/exported/ties/pasgt_khaki.rsi
-    - type: Armor
-      modifiers:
-        coefficients:
-          Blunt: 0.32
-          Slash: 0.32
-          Piercing: 0.48
-          Arrow: 0.054
-          Heat: 0.78
     - type: Construction
       graph: civ13_accessory_khaki_PASGT_body_armor
       node: end
@@ -5825,7 +5808,7 @@
       time: 5
 - type: entity
   name: blizzard PASGT body armor
-  parent: ClothingNeckBase
+  parent: civ13_accessory_woodland_PASGT_body_armor
   id: civ13_accessory_blizzard_PASGT_body_armor
   description: >-
     Wearable armor that can stop most pistol rounds. This one has a blizzard
@@ -5835,14 +5818,6 @@
       sprite: Civ14/Clothing/exported/ties/pasgt_blizzard.rsi
     - type: Clothing
       sprite: Civ14/Clothing/exported/ties/pasgt_blizzard.rsi
-    - type: Armor
-      modifiers:
-        coefficients:
-          Blunt: 0.32
-          Slash: 0.32
-          Piercing: 0.48
-          Arrow: 0.054
-          Heat: 0.78
     - type: Construction
       graph: civ13_accessory_blizzard_PASGT_body_armor
       node: end

+ 57 - 0
Resources/Prototypes/Civ14/Entities/Clothing/webbings.yml

@@ -149,3 +149,60 @@
           amount: 4
         - id: GrenadeF1
           amount: 1
+
+# cold war
+- type: entity
+  id: ClothingWebbingSovietCWMG
+  parent: ClothingWebbingGreen
+  name: green webbing
+  suffix: filled, MG
+  components:
+    - type: StorageFill
+      contents:
+        - id: civ13_magazine_RPD_drum_(7.62x39)
+          amount: 2
+        - id: GrenadeRGD5
+          amount: 1
+
+- type: entity
+  id: ClothingWebbingUSCWMG
+  parent: ClothingWebbingUS
+  name: US webbing
+  suffix: filled, MG
+  components:
+    - type: StorageFill
+      contents:
+        - id: civ13_magazine_belt_(7.62x51mm)
+          amount: 2
+        - id: GrenadeM67
+          amount: 1
+
+- type: entity
+  id: ClothingWebbingSovietCWRifleman
+  parent: ClothingWebbingGreen
+  name: green webbing
+  suffix: filled, Rifleman
+  components:
+    - type: StorageFill
+      contents:
+        - id: civ13_magazine_AK_74_magazine_(5.45x39mm)
+          amount: 5
+        - id: GrenadeRGD5
+          amount: 1
+        - id: SmokeGrenadeRDG2
+          amount: 1
+
+- type: entity
+  id: ClothingWebbingUSCWRifleman
+  parent: ClothingWebbingUS
+  name: US webbing
+  suffix: filled, Rifleman
+  components:
+    - type: StorageFill
+      contents:
+        - id: civ13_magazine_STANAG_magazine_(5.56x45mm)
+          amount: 5
+        - id: GrenadeM67
+          amount: 1
+        - id: SmokeGrenadeM18
+          amount: 1

+ 56 - 0
Resources/Prototypes/Civ14/Entities/Decals/road.yml

@@ -0,0 +1,56 @@
+- type: decal
+  id: RoadSignZebra
+  tags: ["road"]
+  sprite:
+    sprite: Civ14/Objects/decals.rsi
+    state: zebracrossing
+- type: decal
+  id: RoadSignYeld
+  tags: ["road"]
+  sprite:
+    sprite: Civ14/Objects/decals.rsi
+    state: yeld
+- type: decal
+  id: RoadSignWay
+  tags: ["road"]
+  sprite:
+    sprite: Civ14/Objects/decals.rsi
+    state: waysign
+- type: decal
+  id: RoadSignStop
+  tags: ["road"]
+  sprite:
+    sprite: Civ14/Objects/decals.rsi
+    state: stop
+- type: decal
+  id: RoadSignParking
+  tags: ["road"]
+  sprite:
+    sprite: Civ14/Objects/decals.rsi
+    state: parking
+- type: decal
+  id: RoadSignDNE
+  tags: ["road"]
+  sprite:
+    sprite: Civ14/Objects/decals.rsi
+    state: donotenter
+
+# markings
+- type: decal
+  id: RoadMarkingZebra
+  tags: ["road"]
+  sprite:
+    sprite: Civ14/Objects/decals.rsi
+    state: zebra
+- type: decal
+  id: RoadMarkingYellowSide
+  tags: ["road"]
+  sprite:
+    sprite: Civ14/Objects/decals.rsi
+    state: sideline
+- type: decal
+  id: RoadMarkingWhiteCentral
+  tags: ["road"]
+  sprite:
+    sprite: Civ14/Objects/decals.rsi
+    state: centralline

+ 43 - 0
Resources/Prototypes/Civ14/Entities/Decals/wide.yml

@@ -0,0 +1,43 @@
+# Carpets
+- type: decal
+  id: DecalCarpet
+  tags: ["decorative"]
+  sprite:
+    sprite: Civ14/Objects/decals_wide.rsi
+    state: carpet
+
+- type: decal
+  id: DecalCarpetPurple # Or DecalCarpet2 if you prefer strict mapping from icon_state
+  tags: ["decorative"]
+  sprite:
+    sprite: Civ14/Objects/decals_wide.rsi
+    state: carpet2
+
+- type: decal
+  id: DecalCarpetRed # Or DecalCarpet3
+  tags: ["decorative"]
+  sprite:
+    sprite: Civ14/Objects/decals_wide.rsi
+    state: carpet3
+
+- type: decal
+  id: DecalCarpetGreen # Or DecalCarpet4
+  tags: ["decorative"]
+  sprite:
+    sprite: Civ14/Objects/decals_wide.rsi
+    state: carpet4
+
+# Wide Signs as Decals
+- type: decal
+  id: DecalStalingrad
+  tags: ["decorative"]
+  sprite:
+    sprite: Civ14/Objects/decals_wide.rsi
+    state: stalingrad
+
+- type: decal
+  id: DecalKandahar
+  tags: ["decorative"]
+  sprite:
+    sprite: Civ14/Objects/decals_wide.rsi
+    state: kandahar

+ 18 - 1
Resources/Prototypes/Civ14/Entities/Markers/capturable_areas.yml

@@ -56,10 +56,27 @@
       sprite: Civ14/Markers/areas.rsi
       state: capture_blue
     - type: CaptureArea
-      name: "The Main House"
+      name: "the Main House"
       captureDuration: 240 # 4 min
       captureRadius: 5
       contestedResetTime: 10 # 10 seconds before timer resets when contested
       capturableFactions:
         - Soviet
         - Germany
+
+- type: entity
+  name: capturable area - Hotel
+  id: MarkerCaptureHotel
+  parent: MarkerCapturableArea
+  components:
+    - type: Sprite
+      sprite: Civ14/Markers/areas.rsi
+      state: capture_red
+    - type: CaptureArea
+      name: "the command post"
+      captureDuration: 240 # 4 min
+      captureRadius: 4
+      contestedResetTime: 10 # 10 seconds before timer resets when contested
+      capturableFactions:
+        - US
+        - SovietCW # they dont actually capture it but need to remove control

+ 101 - 2
Resources/Prototypes/Civ14/Entities/Objects/Explosives/grenades.yml

@@ -41,9 +41,51 @@
             - !type:DoActsBehavior
               acts: ["Destruction"]
 
+- type: entity
+  name: M67 grenade
+  description: A modern US fragmentation grenade.
+  parent: GrenadeBase
+  id: GrenadeM67
+  components:
+    - type: Explosive
+      explosionType: Default
+      maxIntensity: 5
+      intensitySlope: 2
+      totalIntensity: 30 # about a ~4 tile radius
+      canCreateVacuum: false
+    - type: OnUseTimerTrigger
+    - type: ProjectileGrenade
+      fillPrototype: PelletClusterLethal
+      capacity: 15
+    - type: ContainerContainer
+      containers:
+        cluster-payload: !type:Container
+    - type: TwoStageTrigger
+      triggerDelay: 0
+      components:
+        - type: ExplodeOnTrigger
+    - type: Sprite
+      sprite: Civ14/Objects/grenade.rsi
+      layers:
+        - state: m67
+          map: ["enum.TriggerVisualLayers.Base"]
+    - type: GenericVisualizer
+      visuals:
+        enum.Trigger.TriggerVisuals.VisualState:
+          enum.ConstructionVisuals.Layer:
+            Primed: { state: m67_active }
+            Unprimed: { state: m67 }
+    - type: Destructible
+      thresholds:
+        - trigger: !type:DamageTrigger
+            damage: 60
+          behaviors:
+            - !type:TriggerBehavior
+            - !type:DoActsBehavior
+              acts: ["Destruction"]
 - type: entity
   name: F-1 grenade
-  description: A russian WW1 and WW2 fragmentation grenade.
+  description: A Soviet WW2-era fragmentation grenade.
   parent: GrenadeBase
   id: GrenadeF1
   components:
@@ -83,7 +125,48 @@
             - !type:TriggerBehavior
             - !type:DoActsBehavior
               acts: ["Destruction"]
-
+- type: entity
+  name: RGD-5 grenade
+  description: A Cold War era Soviet fragmentation grenade.
+  parent: GrenadeBase
+  id: GrenadeRGD5
+  components:
+    - type: Explosive
+      explosionType: Default
+      maxIntensity: 5
+      intensitySlope: 2
+      totalIntensity: 30 # about a ~4 tile radius
+      canCreateVacuum: false
+    - type: OnUseTimerTrigger
+    - type: ProjectileGrenade
+      fillPrototype: PelletClusterLethal
+      capacity: 15
+    - type: ContainerContainer
+      containers:
+        cluster-payload: !type:Container
+    - type: TwoStageTrigger
+      triggerDelay: 0
+      components:
+        - type: ExplodeOnTrigger
+    - type: Sprite
+      sprite: Civ14/Objects/grenade.rsi
+      layers:
+        - state: rgd5
+          map: ["enum.TriggerVisualLayers.Base"]
+    - type: GenericVisualizer
+      visuals:
+        enum.Trigger.TriggerVisuals.VisualState:
+          enum.ConstructionVisuals.Layer:
+            Primed: { state: rgd5_active }
+            Unprimed: { state: rgd5 }
+    - type: Destructible
+      thresholds:
+        - trigger: !type:DamageTrigger
+            damage: 60
+          behaviors:
+            - !type:TriggerBehavior
+            - !type:DoActsBehavior
+              acts: ["Destruction"]
 # smoke
 
 - type: entity
@@ -117,3 +200,19 @@
     - type: SoundOnTrigger
       sound: /Audio/Items/smoke_grenade_smoke.ogg
     - type: DeleteOnTrigger
+
+- type: entity
+  parent: GrenadeBase
+  id: SmokeGrenadeM18
+  name: M18 smoke grenade
+  description: A tactical grenade that releases a large, long-lasting cloud of smoke when used.
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/Grenades/m18.rsi
+      state: icon
+    - type: SmokeOnTrigger
+      duration: 25
+      spreadAmount: 30
+    - type: SoundOnTrigger
+      sound: /Audio/Items/smoke_grenade_smoke.ogg
+    - type: DeleteOnTrigger

+ 15 - 15
Resources/Prototypes/Civ14/Entities/Objects/Guns/entities_smg.yml

@@ -44,7 +44,7 @@
       selectedMode: FullAuto
       availableModes:
         - FullAuto
-      projectileSpeed: 18 # Original minAngle: 52, maxAngle: 70
+      projectileSpeed: 25 # Original minAngle: 52, maxAngle: 70
       minAngle: 12
       maxAngle: 30
       angleIncrease: 3.5
@@ -81,7 +81,7 @@
       sprite: Civ14/Weapons/Guns/mp40.rsi
       equipDelay: 1
     - type: Gun # Original minAngle: 52, maxAngle: 70
-      projectileSpeed: 18
+      projectileSpeed: 25
       minAngle: 12
       maxAngle: 40
       angleIncrease: 3.5
@@ -126,7 +126,7 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/ppd.rsi
     - type: Gun
-      projectileSpeed: 18 # Original minAngle: 55, maxAngle: 95
+      projectileSpeed: 25 # Original minAngle: 55, maxAngle: 95
       minAngle: 15
       maxAngle: 55
       angleIncrease: 5
@@ -171,7 +171,7 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/ppsh.rsi
     - type: Gun
-      projectileSpeed: 18 # Original minAngle: 65, maxAngle: 110
+      projectileSpeed: 25 # Original minAngle: 65, maxAngle: 110
       minAngle: 10
       maxAngle: 50
       angleIncrease: 3
@@ -209,7 +209,7 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/pps.rsi
     - type: Gun
-      projectileSpeed: 18 # Original minAngle: 50, maxAngle: 80
+      projectileSpeed: 25 # Original minAngle: 50, maxAngle: 80
       minAngle: 10
       maxAngle: 40
       angleIncrease: 4
@@ -244,7 +244,7 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/greasegun.rsi
     - type: Gun
-      projectileSpeed: 18 # Original minAngle: 50, maxAngle: 80
+      projectileSpeed: 25 # Original minAngle: 50, maxAngle: 80
       minAngle: 10
       maxAngle: 40
       angleIncrease: 4
@@ -280,7 +280,7 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/tommygun.rsi
     - type: Gun
-      projectileSpeed: 18 # Original minAngle: 55, maxAngle: 90
+      projectileSpeed: 25 # Original minAngle: 55, maxAngle: 90
       minAngle: 15
       maxAngle: 50
       angleIncrease: 4.5
@@ -351,7 +351,7 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/type100.rsi
     - type: Gun
-      projectileSpeed: 18 # Original minAngle: 45, maxAngle: 65
+      projectileSpeed: 25 # Original minAngle: 45, maxAngle: 65
       minAngle: 5 # 8mm Nambu is a weaker round
       maxAngle: 25
       angleIncrease: 3
@@ -386,7 +386,7 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/sten2.rsi
     - type: Gun
-      projectileSpeed: 18 # Original minAngle: 50, maxAngle: 75
+      projectileSpeed: 25 # Original minAngle: 50, maxAngle: 75
       minAngle: 10
       maxAngle: 35 # Sten was a bit rough
       angleIncrease: 3.8
@@ -442,7 +442,7 @@
       availableModes:
         - FullAuto
         - SemiAuto
-      projectileSpeed: 24 # 5.7x28mm - high velocity for a PDW # Original minAngle: 42, maxAngle: 75
+      projectileSpeed: 34 # 5.7x28mm - high velocity for a PDW # Original minAngle: 42, maxAngle: 75
       fireRate: 6.0 # ~900 RPM
       minAngle: 2 # Good control, bullpup
       maxAngle: 35
@@ -480,7 +480,7 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/victor.rsi
     - type: Gun
-      projectileSpeed: 19 # 9mm # Original minAngle: 38, maxAngle: 65
+      projectileSpeed: 34 # 9mm # Original minAngle: 38, maxAngle: 65
       fireRate: 7.0 # ~1200 RPM - very fast
       minAngle: 1 # Kriss Super V system - very low recoil
       maxAngle: 25
@@ -516,7 +516,7 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/uzi.rsi
     - type: Gun
-      projectileSpeed: 18 # 9mm # Original minAngle: 50, maxAngle: 80
+      projectileSpeed: 25 # 9mm # Original minAngle: 50, maxAngle: 80
       fireRate: 4.0 # ~600 RPM
       minAngle: 10 # Standard SMG kick
       maxAngle: 40
@@ -553,7 +553,7 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/mac10.rsi
     - type: Gun
-      projectileSpeed: 18 # .45 ACP # Original minAngle: 60, maxAngle: 115
+      projectileSpeed: 25 # .45 ACP # Original minAngle: 60, maxAngle: 115
       fireRate: 6.8 # ~1100 RPM - bullet hose
       minAngle: 20 # Hard to control
       maxAngle: 75 # Wide spread
@@ -630,7 +630,7 @@
       availableModes:
         - FullAuto
         - SemiAuto # Original minAngle: 52, maxAngle: 100
-      projectileSpeed: 19 # 9mm Parabellum
+      projectileSpeed: 25 # 9mm Parabellum
       fireRate: 5.8 # ~850 RPM
       minAngle: 12 # Machine pistol, a bit wild
       maxAngle: 60
@@ -670,7 +670,7 @@
       availableModes:
         - FullAuto
         - SemiAuto # Original minAngle: 40, maxAngle: 70
-      projectileSpeed: 20 # 9mm - high quality
+      projectileSpeed: 28 # 9mm - high quality
       fireRate: 5.6 # ~800 RPM
       minAngle: 1 # Very controllable for an SMG
       maxAngle: 30 # Tight grouping

+ 237 - 0
Resources/Prototypes/Civ14/Entities/Objects/Specific/cigarettes.yml

@@ -0,0 +1,237 @@
+- type: entity
+  id: CigPackAtika
+  parent: [BaseStorageItem, BaseBagOpenClose]
+  name: Atika cigarette pack
+  description: A pack of Atika cigarettes.
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/Cigarettes/atika.rsi
+      layers:
+        - state: closed
+          map: ["closeLayer"]
+        - state: open
+          map: ["openLayer"]
+          visible: false
+        - state: cig1
+          map: ["cig1"]
+          sprite: Civ14/Objects/Cigarettes/visualizer.rsi
+          visible: false
+        - state: cig2
+          map: ["cig2"]
+          sprite: Civ14/Objects/Cigarettes/visualizer.rsi
+          visible: false
+        - state: cig3
+          map: ["cig3"]
+          sprite: Civ14/Objects/Cigarettes/visualizer.rsi
+          visible: false
+        - state: cig4
+          map: ["cig4"]
+          sprite: Civ14/Objects/Cigarettes/visualizer.rsi
+          visible: false
+        - state: cig5
+          map: ["cig5"]
+          sprite: Civ14/Objects/Cigarettes/visualizer.rsi
+          visible: false
+        - state: cig6
+          map: ["cig6"]
+          sprite: Civ14/Objects/Cigarettes/visualizer.rsi
+          visible: false
+    - type: Tag
+      tags:
+        - CigPack
+        - Trash
+    - type: PhysicalComposition
+      materialComposition:
+        Steel: 50
+    - type: SpaceGarbage
+    - type: STWeight
+      self: 0.15
+    - type: Item
+      sprite: Civ14/Objects/Cigarettes/atika.rsi
+      size: Tiny
+      shape: # Yes, this is cursed, but it breaks otherwise, dont question it.
+        - 0,0,0,1
+    - type: Storage
+      grid:
+        - 0,0,4,1
+    - type: StorageFill
+      contents:
+        - id: CigaretteFiltered
+          amount: 10
+    - type: ItemCounter
+      count:
+        tags: [Cigarette]
+      composite: true
+      layerStates:
+        - cig1
+        - cig2
+        - cig3
+        - cig4
+        - cig5
+        - cig6
+    - type: Appearance
+
+- type: entity
+  id: CigPackLuckyStrike
+  parent: CigPackAtika
+  name: Lucky Strike cigarette pack
+  description: A pack of Lucky Strikes.
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/Cigarettes/luckystrike.rsi
+    - type: Item
+      sprite: Civ14/Objects/Cigarettes/luckystrike.rsi
+
+- type: entity
+  id: CigPackMarlboro
+  parent: CigPackAtika
+  name: Marlboro cigarette pack
+  description: A soft pack of Marlboros.
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/Cigarettes/marlboro.rsi
+      layers:
+        - state: closed
+          map: ["closeLayer"]
+        - state: open
+          map: ["openLayer"]
+          visible: false
+        - state: cig1
+          map: ["cig1"]
+          sprite: Civ14/Objects/Cigarettes/visualizer_soft.rsi
+          visible: false
+        - state: cig2
+          map: ["cig2"]
+          sprite: Civ14/Objects/Cigarettes/visualizer_soft.rsi
+          visible: false
+        - state: cig3
+          map: ["cig3"]
+          sprite: Civ14/Objects/Cigarettes/visualizer_soft.rsi
+          visible: false
+        - state: cig4
+          map: ["cig4"]
+          sprite: Civ14/Objects/Cigarettes/visualizer_soft.rsi
+          visible: false
+        - state: cig5
+          map: ["cig5"]
+          sprite: Civ14/Objects/Cigarettes/visualizer_soft.rsi
+          visible: false
+        - state: cig6
+          map: ["cig6"]
+          sprite: Civ14/Objects/Cigarettes/visualizer_soft.rsi
+          visible: false
+    - type: Item
+      sprite: Civ14/Objects/Cigarettes/marlboro.rsi
+
+- type: entity
+  id: CigPackPachka
+  parent: CigPackAtika
+  name: Pachka cigarette pack
+  description: A pack of unfiltered Pachka cigarettes.
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/Cigarettes/pachka.rsi
+      layers:
+        - state: closed
+          map: ["closeLayer"]
+        - state: open
+          map: ["openLayer"]
+          visible: false
+        - state: cig1
+          map: ["cig1"]
+          sprite: Civ14/Objects/Cigarettes/visualizer_unfiltered.rsi
+          visible: false
+        - state: cig2
+          map: ["cig2"]
+          sprite: Civ14/Objects/Cigarettes/visualizer_unfiltered.rsi
+          visible: false
+        - state: cig3
+          map: ["cig3"]
+          sprite: Civ14/Objects/Cigarettes/visualizer_unfiltered.rsi
+          visible: false
+        - state: cig4
+          map: ["cig4"]
+          sprite: Civ14/Objects/Cigarettes/visualizer_unfiltered.rsi
+          visible: false
+        - state: cig5
+          map: ["cig5"]
+          sprite: Civ14/Objects/Cigarettes/visualizer_unfiltered.rsi
+          visible: false
+        - state: cig6
+          map: ["cig6"]
+          sprite: Civ14/Objects/Cigarettes/visualizer_unfiltered.rsi
+          visible: false
+    - type: Item
+      sprite: Civ14/Objects/Cigarettes/pachka.rsi
+    - type: StorageFill
+      contents:
+        - id: CigaretteUnfiltered
+          amount: 10
+
+- type: entity
+  id: CigaretteUnfiltered
+  parent: BaseCigar
+  name: cigarette
+  description: An unfiltered cigarette.
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/Cigarettes/cigarette_unfiltered.rsi
+      state: unlit-icon
+    - type: Tag
+      tags:
+        - Cigarette
+        - Trash
+    - type: SpaceGarbage
+    - type: Clothing
+      sprite: Civ14/Objects/Cigarettes/cigarette_unfiltered.rsi
+      slots: [mask]
+      equippedPrefix: unlit
+    - type: STWeight
+      self: 0.05
+    - type: Item
+      size: Tiny
+      sprite: Civ14/Objects/Cigarettes/cigarette_unfiltered.rsi
+      heldPrefix: unlit
+    - type: SolutionContainerManager
+      solutions:
+        smokable:
+          maxVol: 40
+          reagents:
+            - ReagentId: Nicotine
+              Quantity: 20
+            - ReagentId: Epinephrine
+              Quantity: 10
+
+- type: entity
+  id: CigaretteFiltered
+  parent: BaseCigar
+  name: cigarette
+  description: A filtered cigarette.
+  components:
+    - type: Sprite
+      sprite: Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi
+      state: unlit-icon
+    - type: Tag
+      tags:
+        - Cigarette
+        - Trash
+    - type: SpaceGarbage
+    - type: Clothing
+      sprite: Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi
+      slots: [mask]
+      equippedPrefix: unlit
+    - type: STWeight
+      self: 0.05
+    - type: Item
+      size: Tiny
+      sprite: Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi
+      heldPrefix: unlit
+    - type: SolutionContainerManager
+      solutions:
+        smokable:
+          maxVol: 40
+          reagents:
+            - ReagentId: Nicotine
+              Quantity: 20
+            - ReagentId: Epinephrine
+              Quantity: 8

+ 10 - 0
Resources/Prototypes/Civ14/Entities/Objects/Storage/crates.yml

@@ -16,3 +16,13 @@
         - entity_storage
     - type: StaticPrice
       price: 100
+
+- type: entity
+  parent: CrateBaseWeldable
+  id: CrateMilitary
+  name: military crate
+  components:
+    - type: Icon
+      sprite: Civ14/Objects/Storage/green_crate.rsi
+    - type: Sprite
+      sprite: Civ14/Objects/Storage/green_crate.rsi

+ 44 - 0
Resources/Prototypes/Civ14/Entities/Objects/Storage/filled_crates.yml

@@ -107,3 +107,47 @@
       contents:
         - id: civ13_magazine_MG34_magazine_(7.92x57mm)
           amount: 6
+
+- type: entity
+  parent: CrateMilitary
+  id: CrateMilitarySTANAGAmmo
+  name: STANAG ammo crate
+  suffix: "5.56x45mm"
+  components:
+    - type: StorageFill
+      contents:
+        - id: civ13_magazine_STANAG_magazine_(5.56x45mm)
+          amount: 14
+
+- type: entity
+  parent: CrateMilitary
+  id: CrateMilitaryAK74Ammo
+  name: AK-74 ammo crate
+  suffix: "5.56x39mm"
+  components:
+    - type: StorageFill
+      contents:
+        - id: civ13_magazine_AK_74_magazine_(5.45x39mm)
+          amount: 14
+
+- type: entity
+  parent: CrateMilitary
+  id: CrateMilitaryRPDAmmo
+  name: RPD ammo crate
+  suffix: "7.62x39mm"
+  components:
+    - type: StorageFill
+      contents:
+        - id: civ13_magazine_RPD_drum_(7.62x39)
+          amount: 10
+
+- type: entity
+  parent: CrateMilitary
+  id: CrateMilitaryM60Ammo
+  name: M60 ammo crate
+  suffix: "7.62x51mm"
+  components:
+    - type: StorageFill
+      contents:
+        - id: civ13_magazine_belt_(7.62x51mm)
+          amount: 10

+ 161 - 0
Resources/Prototypes/Civ14/Entities/Structures/Furniture/Decorative/decorative_machines.yml

@@ -0,0 +1,161 @@
+- type: entity
+  parent: StructureDecorativeBase
+  id: StructureDecorativeRadio
+  name: military radio
+  description: A military radio.
+  suffix: decorative
+  components:
+    - type: Sprite
+      noRot: true
+      sprite: Civ14/Objects/device.rsi
+      state: modern_intercom
+
+- type: entity
+  parent: StructureDecorativeBase
+  id: StructureDecorativeRadioTransmitter
+  name: radio transmitter
+  description: A powerful radio transmitter.
+  suffix: decorative
+  components:
+    - type: Sprite
+      noRot: true
+      sprite: Civ14/Objects/device.rsi
+      state: radio_transmitter
+
+- type: entity
+  parent: StructureDecorativeBase
+  id: StructureDecorativeRecorder
+  name: recorder
+  description: A tape recorder.
+  suffix: decorative
+  components:
+    - type: Sprite
+      noRot: true
+      sprite: Civ14/Objects/device.rsi
+      state: recorder_on
+
+- type: entity
+  parent: StructureDecorativeBase
+  id: StructureDecorativeMachine
+  name: machine
+  description: Some sort of machine. Not sure what this does.
+  suffix: decorative
+  components:
+    - type: Sprite
+      noRot: true
+      sprite: Civ14/Objects/device.rsi
+      state: machine_on
+
+- type: entity
+  parent: StructureDecorativeBase
+  id: StructureDecorativeFOB
+  name: FOB transmitter
+  description: A transmitter for a FOB command post.
+  suffix: decorative
+  components:
+    - type: Sprite
+      noRot: true
+      sprite: Civ14/Objects/obj32x64.rsi
+      state: fob
+- type: entity
+  parent: StructureDecorativeFOB
+  id: StructureDecorativeFOBFlipped
+  name: FOB transmitter
+  description: A transmitter for a FOB command post.
+  suffix: decorative
+  components:
+    - type: Sprite
+      noRot: true
+      sprite: Civ14/Objects/obj32x64.rsi
+      state: fob_flipped
+
+- type: entity
+  parent: StructureDecorativeBase
+  id: StructureDecorativeSupplyCrate
+  name: supply crate
+  description: A crate of assorted supplies.
+  suffix: decorative
+  components:
+    - type: Sprite
+      noRot: true
+      sprite: Civ14/Objects/junk.rsi
+      state: supply_crate
+- type: entity
+  parent: StructureDecorativeBase
+  id: StructureDecorativeRadiator
+  name: radiator
+  description: An old radiator.
+  suffix: decorative
+  components:
+    - type: Sprite
+      noRot: false
+      sprite: Civ14/Objects/junk.rsi
+      state: radiator
+- type: entity
+  parent: StructureDecorativeBase
+  id: StructureDecorativeBathtube
+  name: bathtub
+  description: An old bathtub.
+  suffix: decorative
+  components:
+    - type: Sprite
+      noRot: true
+      sprite: Civ14/Objects/junk.rsi
+      state: bathtub
+
+- type: entity
+  parent: StructureDecorativeBase
+  id: StructureDecorativeWashingMachine
+  name: washing machine
+  description: An old washing machine.
+  suffix: decorative
+  components:
+    - type: Sprite
+      noRot: true
+      sprite: Civ14/Objects/modern_structures.rsi
+      state: washing_machine_4
+
+- type: entity
+  parent: StructureDecorativeBase
+  id: StructureDecorativeStove
+  name: stove
+  description: An old gas stove.
+  suffix: decorative
+  components:
+    - type: Sprite
+      noRot: true
+      sprite: Civ14/Objects/modern_structures.rsi
+      state: stove
+
+- type: entity
+  parent: StructureDecorativeBase
+  id: StructureDecorativeTV
+  name: TV
+  description: An old TV.
+  suffix: decorative
+  components:
+    - type: Sprite
+      noRot: true
+      sprite: Civ14/Objects/modern_structures.rsi
+      state: TV
+
+- type: entity
+  parent: StructureDecorativeBase
+  id: StructureDecorativeCashRegister
+  name: cash register
+  description: A standard cash register.
+  suffix: decorative
+  components:
+    - type: Sprite
+      noRot: true
+      sprite: Civ14/Objects/modern_structures.rsi
+      state: cash_register
+    - type: Fixtures
+      fixtures:
+        fix1:
+          shape: !type:PhysShapeAabb
+            bounds: "-0.2,-0.2,0.2,0.2"
+          hard: false
+          density: 30
+          mask:
+            - ItemMask

+ 0 - 1
Resources/Prototypes/Civ14/Entities/Structures/Furniture/decoratives.yml → Resources/Prototypes/Civ14/Entities/Structures/Furniture/Decorative/decoratives.yml

@@ -9,7 +9,6 @@
       sprite: Civ14/Structures/totems.rsi
       state: cross
       drawdepth: Mobs
-      offset: "0.0,0.5"
 
 - type: entity
   parent: StructureDecorativeBase

+ 27 - 0
Resources/Prototypes/Civ14/Entities/Structures/Furniture/beds.yml

@@ -61,3 +61,30 @@
   name: sleepzone bed
   id: SleepZoneBed
   parent: Bed
+
+- type: entity
+  name: bed
+  id: BedCivPadding
+  parent: Bed
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/bed_chair.rsi
+      state: bed_padding
+
+- type: entity
+  name: field bed
+  id: BedCivField
+  parent: Bed
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/bed_chair.rsi
+      state: fieldbed
+
+- type: entity
+  name: hammock
+  id: BedCivHammock
+  parent: Bed
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/bed_chair.rsi
+      state: hammockf

+ 142 - 0
Resources/Prototypes/Civ14/Entities/Structures/Furniture/chairs.yml

@@ -0,0 +1,142 @@
+- type: entity
+  name: diner booth
+  id: SofaDinerBoothLeft
+  parent: ChairBase
+  description: It looks comfy.
+  suffix: left
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/bed_chair.rsi
+      state: diner_booth_left
+
+- type: entity
+  name: diner booth
+  id: SofaDinerBoothRight
+  parent: ChairBase
+  description: It looks comfy.
+  suffix: right
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/bed_chair.rsi
+      state: diner_booth_right
+
+- type: entity
+  name: sofa
+  id: SofaFancyLeft
+  parent: ChairBase
+  description: It looks comfy.
+  suffix: left
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/bed_chair.rsi
+      state: fancysofa_l
+
+- type: entity
+  name: sofa
+  id: SofaFancyMiddle
+  parent: ChairBase
+  description: It looks comfy.
+  suffix: middle
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/bed_chair.rsi
+      state: fancysofa_middle
+
+- type: entity
+  name: sofa
+  id: SofaFancyRight
+  parent: ChairBase
+  description: It looks comfy.
+  suffix: right
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/bed_chair.rsi
+      state: fancysofa_r
+
+- type: entity
+  name: bleacher
+  id: SofaBleacherLeft
+  parent: ChairBase
+  description: It does not look comfy.
+  suffix: left
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/bed_chair.rsi
+      state: bleacher_l
+
+- type: entity
+  name: bleacher
+  id: SofaBleacherMiddle
+  parent: ChairBase
+  description: It does not look comfy.
+  suffix: middle
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/bed_chair.rsi
+      state: bleacher
+
+- type: entity
+  name: bleacher
+  id: SofaBleacherRight
+  parent: ChairBase
+  description: It does not look comfy.
+  suffix: right
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/bed_chair.rsi
+      state: bleacher_r
+
+- type: entity
+  name: wooden chair
+  id: ChairWoodCiv
+  parent: UnanchoredChairBase
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/bed_chair.rsi
+      state: wooden_chair_alt
+    - type: Damageable
+      damageModifierSet: Wood
+    - type: Destructible
+      thresholds:
+        - trigger: !type:DamageTrigger
+            damage: 25
+          behaviors:
+            - !type:DoActsBehavior
+              acts: ["Destruction"]
+            - !type:PlaySoundBehavior
+              sound:
+                collection: WoodDestroy
+            - !type:SpawnEntitiesBehavior
+              spawn:
+                MaterialWoodPlank:
+                  min: 1
+                  max: 1
+    - type: Tag
+      tags:
+        - Wooden
+    - type: StaticPrice
+      price: 75
+
+- type: entity
+  name: old wooden chair
+  id: ChairWoodCivOld
+  parent: ChairWoodCiv
+  components:
+    - type: Sprite
+      state: wooden_chair_alt
+
+- type: entity
+  name: red wooden chair
+  id: ChairWoodCivRed
+  parent: ChairWoodCiv
+  components:
+    - type: Sprite
+      state: wooden_chair_red
+
+- type: entity
+  name: wooden chair
+  id: ChairWoodCivWings
+  parent: ChairWoodCiv
+  components:
+    - type: Sprite
+      state: wooden_chair_wings

+ 463 - 0
Resources/Prototypes/Civ14/Entities/Structures/Furniture/sign.yml

@@ -16,3 +16,466 @@
       cost: 4
       material: WoodPlank
       time: 6
+
+- type: entity
+  parent: BaseSign
+  id: SignCivTfc
+  name: "Texas Fried Chicken"
+  description: "A sign Texas people usually like."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: tfc
+
+- type: entity
+  parent: BaseSign
+  id: SignCivWeedshop
+  name: "Weed Shop"
+  description: "A sign stoners usually like."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: weedshop
+
+- type: entity
+  parent: BaseSign
+  id: SignCivMckellens
+  name: "McKellen's"
+  description: "A sign for the McKellen's Franchise establishment."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: mckellens
+
+- type: entity
+  parent: BaseSign
+  id: SignCivSheriff
+  name: "Sheriff's Office"
+  description: "A sign for the local Sheriff's Office."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: sheriff
+
+- type: entity
+  parent: BaseSign
+  id: SignCivBank
+  name: "bank"
+  description: "A sign for the local bank."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: bank
+
+- type: entity
+  parent: BaseSign
+  id: SignCivBarsign
+  name: "BAR"
+  description: "A sign that says bar on it."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: barsign
+
+- type: entity
+  parent: BaseSign
+  id: SignCivCafesignRu
+  name: "CAFE"
+  description: "A sign that says CAFE on it in cyrillic."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: cafesign_ru
+
+- type: entity
+  parent: BaseSign
+  id: SignCivBarber
+  name: "barbershop"
+  description: "A swirly object indicating a barbershop."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: barber
+
+- type: entity
+  parent: BaseSign
+  id: SignCivBailypost
+  name: "Baily post"
+  description: "Protection service."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: bailypost
+
+- type: entity
+  parent: BaseSign
+  id: SignCivBailypost2
+  name: "Baily post"
+  description: "Protection service."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: bailypost2
+
+- type: entity
+  parent: BaseSign
+  id: SignCivMinefield
+  name: "Minefield"
+  description: "Achtung! Minen."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: minefield
+
+- type: entity
+  parent: BaseSign
+  id: SignCivColonialSign
+  name: "sign"
+  description: "Signs something."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: Colonial_Sign
+
+- type: entity
+  parent: BaseSign
+  id: SignCivCustomsign2
+  name: "sign"
+  description: "Signs something."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: customsign2
+
+- type: entity
+  parent: BaseSign
+  id: SignCivCustomsign
+  name: "sign"
+  description: "Signs something."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: customsign
+
+- type: entity
+  parent: BaseSign
+  id: SignCivN1
+  name: "ONE"
+  description: "A silver sign which reads 'I'."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: n1
+
+- type: entity
+  parent: BaseSign
+  id: SignCivN2
+  name: "TWO"
+  description: "A silver sign which reads 'II'."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: n2
+
+- type: entity
+  parent: BaseSign
+  id: SignCivN3
+  name: "THREE"
+  description: "A silver sign which reads 'III'."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: n3
+
+- type: entity
+  parent: BaseSign
+  id: SignCivN4
+  name: "FOUR"
+  description: "A silver sign which reads 'IV'."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: n4
+
+- type: entity
+  parent: BaseSign
+  id: SignCivN5
+  name: "FIVE"
+  description: "A silver sign which reads 'V'."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: n5
+
+- type: entity
+  parent: BaseSign
+  id: SignCivN6
+  name: "SIX"
+  description: "A silver sign which reads 'VI'."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: n6
+
+- type: entity
+  parent: BaseSign
+  id: SignCivMedal
+  name: "presence recognition"
+  description: "A recognition plaque staight from the ministy of admission! This one seems to be for the persons presence, what an award!"
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: medal
+
+- type: entity
+  parent: BaseSign
+  id: SignCivRestroom
+  name: "restroom"
+  description: "A sign indicating the presence of a restroom."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: restroom
+
+- type: entity
+  parent: BaseSign
+  id: SignCivRestroomMale
+  name: "restroom"
+  description: "A sign indicating the presence of a male restroom."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: restroom_male
+
+- type: entity
+  parent: BaseSign
+  id: SignCivRestroomFemale
+  name: "restroom"
+  description: "A sign indicating the presence of a female restroom."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: restroom_female
+
+- type: entity
+  parent: BaseSign
+  id: SignCivJustice
+  name: "justice"
+  description: "A justice sign."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: justice
+
+- type: entity
+  parent: BaseSign
+  id: SignCivCourt
+  name: "court"
+  description: "The court house."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals_wide.rsi"
+      state: court
+
+- type: entity
+  parent: BaseSign
+  id: SignCivTownhall
+  name: "town hall"
+  description: "The town hall."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals_wide.rsi"
+      state: townhall
+
+- type: entity
+  parent: BaseSign
+  id: SignCivHotelUral
+  name: "Hotel Ural sign"
+  description: "A worn-out sign with 'Hotel Ural' written in Cyrillic."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals_wide.rsi"
+      state: hotel_ural
+
+- type: entity
+  parent: BaseSign
+  id: SignCivAnatomy
+  name: "anatomy poster"
+  description: "A poster detailing the complexity of the human body."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: anatomy
+
+- type: entity
+  parent: BaseSign
+  id: SignCivXrayOn
+  name: "lightbox"
+  description: "A medical lightbox used to examine X-ray images."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: xray_on
+
+- type: entity
+  parent: BaseSign
+  id: SignCivPeriodic
+  name: "periodic table"
+  description: "A tabular display of the chemical elements."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: periodic
+
+- type: entity
+  parent: BaseSign
+  id: SignCivCasino
+  name: "casino"
+  description: "A blinking casino sign."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals_wider.rsi"
+      state: casino
+
+- type: entity
+  parent: BaseSign
+  id: SignCivOpen
+  name: "open"
+  description: "A blinking open sign."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: open
+
+- type: entity
+  parent: BaseSign
+  id: SignCivGunshop
+  name: "gun store"
+  description: "A blinking gun store sign."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: gunshop
+
+- type: entity
+  parent: BaseSign
+  id: SignCivGas
+  name: "gas"
+  description: "A flashing gas station sign."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: gas
+
+- type: entity
+  parent: BaseSign
+  id: SignCivSale
+  name: "SALE sign"
+  description: "A sign indicating a sale."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: sale
+
+- type: entity
+  parent: BaseSign
+  id: SignCivRent
+  name: "FOR RENT sign"
+  description: "A sign indicating something for rent."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: rent
+
+- type: entity
+  parent: BaseSign
+  id: SignCivDonutShop
+  name: "Randy's Donuts"
+  description: "A donut and pastries franchise."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: donut_shop
+
+- type: entity
+  parent: BaseSign
+  id: SignCivDeerTrophy
+  name: "hunting deer trophy"
+  description: "Looks like we finally found Bambi..."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: deer_trophy
+
+- type: entity
+  parent: BaseSign
+  id: SignCivSovietPoster
+  name: "military poster"
+  description: "A Soviet military poster depicting a saluting soldier in front of the Soviet flag."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: soviet_poster
+
+- type: entity
+  parent: BaseSign
+  id: SignCivSovafghanPoster1
+  name: "Soviet-Afghan friendship poster"
+  description: "A poster depicting a Soviet and DRA soldier smiling at each other while holding a rifle together."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: sovafghan_poster_1
+
+- type: entity
+  parent: BaseSign
+  id: SignCivSovafghanPoster2
+  name: "Soviet-Afghan friendship poster"
+  description: "A poster depicting armed men holding the Soviet and DRA flags."
+  components:
+    - type: Sprite
+      sprite: "Civ14/Objects/decals.rsi"
+      state: sovafghan_poster_2
+
+- type: entity
+  parent: StructureDecorativeBase
+  id: Billboard
+  name: billboard
+  description: "Goodness, what are they selling us this time?"
+  components:
+    - type: Sprite
+      noRot: true
+      sprite: Civ14/Objects/billboards.rsi
+      state: billboard
+      layers:
+        - state: billboard
+        - state: ad1
+          map: ["random"]
+    - type: RandomSprite
+      available:
+        - random:
+            ad1: ""
+            ad2: ""
+            ad3: ""
+            ad4: ""
+            ad5: ""
+            ad6: ""
+            ad7: ""
+            ad8: ""
+            ad9: ""
+            ad10: ""
+            ad11: ""
+            ad12: ""
+            ad13: ""
+            ad14: ""
+    - type: Fixtures
+      fixtures:
+        fix1:
+          shape: !type:PhysShapeAabb
+            bounds: "-0.8,0.3,0.8,1.3"
+          density: 80
+          mask:
+            - MachineMask
+          layer:
+            - MidImpassable
+            - LowImpassable

+ 84 - 0
Resources/Prototypes/Civ14/Entities/Structures/Furniture/tables.yml

@@ -46,3 +46,87 @@
     - type: FootstepModifier
       footstepSoundCollection:
         collection: FootstepWood
+# non-tileable tables
+- type: entity
+  id: TableNonTileable
+  parent: BaseStructure
+  name: table
+  abstract: true
+  description: A table.
+  components:
+    - type: Sprite
+      sprite: Civ14/Structures/closet.rsi
+      state: coffee_table
+    - type: Fixtures
+      fixtures:
+        fix1:
+          shape: !type:PhysShapeAabb
+            bounds: "-0.45,-0.45,0.45,0.45"
+          density: 55
+          mask:
+            - TableMask
+          layer:
+            - TableLayer
+    - type: Damageable
+      damageContainer: StructuralInorganic
+      damageModifierSet: Wood
+    - type: Destructible
+      thresholds:
+        - trigger: !type:DamageTrigger
+            damage: 100
+          behaviors:
+            - !type:DoActsBehavior
+              acts: ["Destruction"]
+        - trigger: !type:DamageTrigger
+            damage: 15
+          behaviors:
+            - !type:PlaySoundBehavior
+              sound:
+                collection: WoodDestroy
+            - !type:SpawnEntitiesBehavior
+              spawn:
+                MaterialWoodPlank1:
+                  min: 0
+                  max: 1
+            - !type:DoActsBehavior
+              acts: ["Destruction"]
+
+- type: entity
+  id: TableWoodCoffeeTable
+  parent: TableNonTileable
+  name: coffee table
+  description: A wooden coffee table.
+  components:
+    - type: Sprite
+      sprite: Civ14/Structures/closet.rsi
+      state: coffee_table
+
+- type: entity
+  id: TableWoodCoffeeTableWhite
+  parent: TableNonTileable
+  name: coffee table
+  description: A white coffee table.
+  components:
+    - type: Sprite
+      sprite: Civ14/Structures/closet.rsi
+      state: coffee_table-alt
+
+- type: entity
+  id: TableWoodEndtable
+  parent: TableNonTileable
+  name: end table
+  description: A wooden end table.
+  components:
+    - type: Sprite
+      sprite: Civ14/Structures/closet.rsi
+      state: endtable
+
+- type: entity
+  id: TableWoodEndtableWhite
+  parent: TableNonTileable
+  name: end table
+  description: A white end table.
+  components:
+    - type: Sprite
+      sprite: Civ14/Structures/closet.rsi
+      state: endtable-alt

+ 151 - 0
Resources/Prototypes/Civ14/Entities/Structures/Furniture/wardrobes.yml

@@ -0,0 +1,151 @@
+- type: entity
+  id: DresserCiv
+  parent: Dresser
+  name: dresser
+  description: Wooden dresser, can store things inside itself, ideal for underwear, and someone's kidneys?...
+  components:
+    - type: Sprite
+      sprite: Civ14/Structures/closet.rsi
+      state: dresser
+
+- type: entity
+  id: DresserCivLeft
+  parent: Dresser
+  name: dresser
+  description: Wooden dresser, can store things inside itself, ideal for underwear, and someone's kidneys?...
+  components:
+    - type: Sprite
+      sprite: Civ14/Structures/closet.rsi
+      state: dresser2_left
+
+- type: entity
+  id: DresserCivRight
+  parent: Dresser
+  name: dresser
+  description: Wooden dresser, can store things inside itself, ideal for underwear, and someone's kidneys?...
+  components:
+    - type: Sprite
+      sprite: Civ14/Structures/closet.rsi
+      state: dresser2_right
+
+# lockers
+- type: entity
+  id: CabinetCiv
+  parent: BaseStructureDynamic
+  name: wooden cabinet
+  description: To store all your clothes.
+  components:
+    - type: Sprite
+      sprite: Civ14/Structures/closet.rsi
+      noRot: true
+      layers:
+        - state: cabinet_open
+          map: ["enum.StorageVisualLayers.Base"]
+        - state: cabinet_closed
+          map: ["enum.StorageVisualLayers.Door"]
+    - type: Animateable
+    - type: ResistLocker
+    - type: Transform
+      noRot: true
+      anchored: true
+    - type: MovedByPressure
+    - type: ItemSlots
+    - type: DamageOnHighSpeedImpact
+      damage:
+        types:
+          Blunt: 5
+      soundHit:
+        collection: WeakHit
+    - type: InteractionOutline
+    - type: Physics
+    - type: Fixtures
+      fixtures:
+        fix1:
+          shape: !type:PhysShapeAabb
+            bounds: "-0.25,-0.48,0.25,0.48"
+          density: 75
+          mask:
+            - MachineMask
+          layer:
+            - MachineLayer
+    - type: EntityStorage
+    - type: ContainerContainer
+      containers:
+        entity_storage: !type:Container
+        paper_label: !type:ContainerSlot
+    - type: PlaceableSurface
+      placeCentered: true
+      isPlaceable: false
+    - type: Damageable
+      damageContainer: StructuralInorganic
+      damageModifierSet: Wood
+    - type: Destructible
+      thresholds:
+        - trigger: !type:DamageTrigger
+            damage: 180
+          behaviors:
+            - !type:DoActsBehavior
+              acts: ["Destruction"]
+        - trigger: !type:DamageTrigger
+            damage: 100
+          behaviors:
+            - !type:DoActsBehavior
+              acts: ["Destruction"]
+            - !type:PlaySoundBehavior
+              sound:
+                collection: WoodDestroy
+                params:
+                  volume: -6
+    - type: Appearance
+    - type: EntityStorageVisuals
+      stateBaseClosed: cabinet_closed
+      stateDoorOpen: cabinet_open
+      stateDoorClosed: cabinet_closed
+
+- type: entity
+  id: CabinetCivCeiling
+  parent: CabinetCiv
+  name: wooden cabinet
+  description: To store all your cutlery.
+  components:
+    - type: Sprite
+      sprite: Civ14/Structures/closet.rsi
+      noRot: true
+      layers:
+        - state: cabinet_open_ceiling
+          map: ["enum.StorageVisualLayers.Base"]
+        - state: cabinet_closed_ceiling
+          map: ["enum.StorageVisualLayers.Door"]
+    - type: Fixtures
+      fixtures:
+        fix1:
+          shape: !type:PhysShapeAabb
+            bounds: "-0.25,0,0.25,0.48"
+          density: 75
+          mask:
+            - MachineMask
+          layer:
+            - MachineLayer
+    - type: EntityStorageVisuals
+      stateBaseClosed: cabinet_closed_ceiling
+      stateDoorOpen: cabinet_open_ceiling
+      stateDoorClosed: cabinet_closed_ceiling
+
+- type: entity
+  id: CabinetCivGlass
+  parent: CabinetCiv
+  name: glass door cabinet
+  description: A fancy cabinet with glass doors.
+  components:
+    - type: Sprite
+      sprite: Civ14/Structures/closet.rsi
+      noRot: true
+      layers:
+        - state: cabinetglass_open
+          map: ["enum.StorageVisualLayers.Base"]
+        - state: cabinetglass_closed
+          map: ["enum.StorageVisualLayers.Door"]
+    - type: EntityStorageVisuals
+      stateBaseClosed: cabinetglass_closed
+      stateDoorOpen: cabinetglass_open
+      stateDoorClosed: cabinetglass_closed

+ 221 - 0
Resources/Prototypes/Civ14/Entities/Structures/Walls/barricades.yml

@@ -298,3 +298,224 @@
           behaviors:
             - !type:DoActsBehavior
               acts: ["Destruction"]
+
+- type: entity
+  id: BarricadeVelvetRope
+  description: A fancy velvet rope between two golden poles.
+  parent: BarricadeSandbags
+  name: velvet rope
+  placement:
+    mode: SnapgridCenter
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/structures.rsi
+      state: velvet_rope
+      drawdepth: FloorObjects
+      noRot: true
+    - type: Barricade
+      blocking: 3
+    - type: Destructible
+      thresholds:
+        - trigger: !type:DamageTrigger
+            damage: 20
+          behaviors:
+            - !type:DoActsBehavior
+              acts: ["Destruction"]
+
+- type: entity
+  id: BarricadeJerseyBarrier
+  description: A modular concrete barrier, also useful as a barricade.
+  parent: BarricadeSandbags
+  name: jersey barrier
+  placement:
+    mode: SnapgridCenter
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/junk.rsi #why???
+      state: jerseybarrier1
+      drawdepth: FloorObjects
+      noRot: true
+      layers:
+        - state: jerseybarrier1
+          map: ["random"]
+    - type: RandomSprite
+      available:
+        - random:
+            jerseybarrier1: ""
+            jerseybarrier2: ""
+            jerseybarrier3: ""
+            jerseybarrier4: ""
+            jerseybarrier5: ""
+    - type: Damageable
+      damageModifierSet: Rock
+      damageContainer: StructuralInorganic
+    - type: Destructible
+      thresholds:
+        - trigger: !type:DamageTrigger
+            damage: 320
+          behaviors:
+            - !type:DoActsBehavior
+              acts: ["Destruction"]
+
+- type: entity
+  id: BarricadeJerseyBarrierAlt
+  description: A modular concrete barrier, also useful as a barricade.
+  parent: BarricadeSandbags
+  name: jersey barrier
+  placement:
+    mode: SnapgridCenter
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/junk.rsi #why???
+      state: jerseybarrier_alt1
+      drawdepth: FloorObjects
+      noRot: true
+      layers:
+        - state: jerseybarrier_alt1
+          map: ["random"]
+    - type: RandomSprite
+      available:
+        - random:
+            jerseybarrier_alt1: ""
+            jerseybarrier_alt2: ""
+    - type: Damageable
+      damageModifierSet: Rock
+      damageContainer: StructuralInorganic
+    - type: Destructible
+      thresholds:
+        - trigger: !type:DamageTrigger
+            damage: 320
+          behaviors:
+            - !type:DoActsBehavior
+              acts: ["Destruction"]
+
+- type: entity
+  parent: BaseStructure
+  id: HescoBastionIndestructible
+  name: Hesco bastion
+  description: A modern gabion primarily used for flood control and military fortifications.
+  suffix: indestructible
+  placement:
+    mode: SnapgridCenter
+    snap:
+      - Wall
+  components:
+    - type: RangedDamageSound
+      soundGroups:
+        Brute:
+          collection: MetalBulletImpact
+      soundTypes:
+        Heat:
+          collection: MetalLaserImpact
+    - type: Tag
+      tags:
+        - Wall
+    - type: Sprite
+      sprite: Civ14/Objects/junk.rsi #why???
+      state: hescobastion
+      drawdepth: Walls
+    - type: Icon
+      sprite: Civ14/Objects/junk.rsi #why???
+      state: hescobastion
+    - type: PlacementReplacement
+      key: walls
+    - type: Damageable
+      damageContainer: StructuralInorganic
+      damageModifierSet: Inert
+    - type: Physics
+      bodyType: Static
+    - type: Fixtures
+      fixtures:
+        fix1:
+          shape: !type:PhysShapeAabb
+            bounds: "-0.5,-0.5,0.5,0.5"
+          mask:
+            - FullTileMask
+          layer:
+            - WallLayer
+          density: 1000
+    - type: Occluder
+    - type: Airtight
+      airBlocked: false
+    - type: RadiationBlocker
+      resistance: 2
+    - type: SunShadowCast
+
+- type: entity
+  parent: HescoBastionIndestructible
+  id: HescoBastion
+  name: Hesco bastion
+  description: A modern gabion primarily used for flood control and military fortifications.
+  suffix: destroyable
+  placement:
+    mode: SnapgridCenter
+    snap:
+      - Wall
+  components:
+    - type: Damageable
+      damageModifierSet: Inert
+      damageContainer: StructuralInorganic
+    - type: Destructible
+      thresholds:
+        - trigger: !type:DamageTrigger
+            damage: 450
+          behaviors:
+            - !type:DoActsBehavior
+              acts: ["Destruction"]
+
+- type: entity
+  parent: BaseBarricade
+  id: BarricadeJunk
+  name: junk
+  description: A pile of junk. Not much to see here.
+  components:
+    - type: InteractionOutline
+    - type: Sprite
+      noRot: true
+      sprite: Civ14/Objects/junk.rsi
+      state: Junk_1
+      layers:
+        - state: Junk_1
+          map: ["random"]
+    - type: RandomSprite
+      available:
+        - random:
+            Junk_1: ""
+            Junk_2: ""
+            Junk_3: ""
+            Junk_4: ""
+            Junk_5: ""
+            Junk_6: ""
+            Junk_7: ""
+            Junk_8: ""
+            Junk_9: ""
+            Junk_10: ""
+            Junk_11: ""
+            Junk_12: ""
+            Junk_13: ""
+            Junk_14: ""
+    - type: Climbable
+    - type: Physics
+    - type: Fixtures
+      fixtures:
+        fix1:
+          shape: !type:PhysShapeAabb
+            bounds: "-0.38,-0.38,0.38,0.38"
+          mask:
+            - FullTileMask
+          layer:
+            - WallLayer
+    - type: Damageable
+      damageModifierSet: Inert
+      damageContainer: StructuralInorganic
+    - type: Destructible
+      thresholds:
+        - trigger: !type:DamageTrigger
+            damage: 90
+          behaviors:
+            - !type:DoActsBehavior
+              acts: ["Destruction"]
+    - type: Barricade
+      bidirectional: true
+      blocking: 30
+    - type: AtmosExposed

+ 1 - 1
Resources/Prototypes/Civ14/Entities/Structures/Walls/windows.yml

@@ -23,7 +23,7 @@
           mask:
             - TableMask
           layer:
-            - WallLayer
+            - LowImpassable
     - type: Damageable
       damageContainer: StructuralInorganic
       damageModifierSet: Wood

+ 256 - 0
Resources/Prototypes/Civ14/Entities/Structures/paintings.yml

@@ -0,0 +1,256 @@
+- type: entity
+  parent: PaintingBase
+  id: PaintingOrthodox1
+  name: "icon of Mary"
+  description: "An icon depicting Mary, mother of Jesus. Often used in Eastern Orthodox cultures."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: orthodox1
+- type: entity
+  parent: PaintingBase
+  id: PaintingOrthodox2
+  name: "icon of Trinity"
+  description: "An icon depicting the saint Trinity. Often used in Eastern Orthodox cultures."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: orthodox2
+- type: entity
+  parent: PaintingBase
+  id: PaintingOrthodox3
+  name: "icon of Archangel Michael"
+  description: "An icon depicting Archangel Michael. Often used in Eastern Orthodox cultures."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: orthodox3
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingCiv1
+  name: painting
+  description: "A large foamy wave crashes into the rocky shore. A bit of sunlight passes through the clouds, glistening on the sea surface and wet boulders."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: painting1
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingCiv2
+  name: painting
+  description: "A serene city street with a few people on a summer day. Two- and three-storey houses stand to the left and right, separated by a cobblestone road. A massive building with spires could be seen in the distance."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: painting2
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingCiv3
+  name: painting
+  description: "A blazing sunset seen from a steep cliff above the sea."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: painting3
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingCiv4
+  name: painting
+  description: "A wooded mountain valley with a small pond at the clearing, where a group of horsemen could be seen. The mountains themselves loom farther ahead, obscured by a thin haze."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: painting4
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingCiv5
+  name: painting
+  description: "A still life painting, depicting a table with a piece of white cloth, several fruits and a human skull."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: painting5
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingCiv6
+  name: painting
+  description: "A long-tailed bird with black, olive green and white plumage, resembling a magpie, perches on a tree branch, surrounded by white cherry blossoms."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: painting6
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingCiv7
+  name: painting
+  description: "A lone figure with a carrying pole on their shoulders stands under a tall pine on the sloping shore, gazing at the snow-peaked mountain across the strait. The sky is colored dark orange by the setting sun."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: painting7
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingCiv8
+  name: painting
+  description: "A hilly landscape, where a large temple with red timber beams and sweeping roofs stands on the bank of a river."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: painting8
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingCiv9
+  name: painting
+  description: "A small encampment in the desert, with a few tents, several horses and loaded camels. A faraway river crosses the expanse of barren dunes."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: painting9
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingCiv10
+  name: painting
+  description: "A barque at sea, lit by the full moon."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: painting10
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingCiv11
+  name: painting
+  description: "A famous painting with a starry sky."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: painting11
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingCiv12
+  name: painting
+  description: "An arid desert, with some tents in the middle."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: painting12
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingCiv13
+  name: painting
+  description: "A still life."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: painting13
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingHitler
+  name: "Portrait of Hitler"
+  description: "A portrait of Hitler."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: hitler
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingLenin
+  name: "Portrait of Lenin"
+  description: "A portrait of Lenin."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: lenin
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingStalin
+  name: "Portrait of Stalin"
+  description: "A portrait of Stalin."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: stalin
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingBrezhnev
+  name: "Portrait of Brezhnev"
+  description: "A portrait of Brezhnev."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: brezhnev
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingSokolov
+  name: "Portrait of Marshal Sokolov"
+  description: "A portrait of Marshal Sokolov."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: sokolov
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingKarmal
+  name: "Portrait of Babrak Karmal"
+  description: "A portrait of Babrak Karmal."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: karmal
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingHirohito
+  name: "Portrait of Hirohito"
+  description: "A portrait of Hirohito."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: hirohito
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingKinggeorgev
+  name: "Portrait of King George V"
+  description: "A portrait of King George V."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: kinggeorgev
+
+- type: entity
+  parent: PaintingBase
+  id: PaintingKhalifAli
+  name: "Portrait of Khalif Ali"
+  description: "A portrait of Khalif Ali."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: khalif_ali1
+- type: entity
+  parent: PaintingBase
+  id: PaintingKhalifAli2
+  name: "Portrait of Khalif Ali"
+  description: "A portrait of Khalif Ali."
+  components:
+    - type: Sprite
+      sprite: Civ14/Objects/decals.rsi
+      state: khalif_ali2

+ 3 - 3
Resources/Prototypes/Civ14/StatusIcon/faction.yml

@@ -194,7 +194,7 @@
       - ShowUsFactionIcons
   icon:
     sprite: /Textures/Interface/Misc/civ_hud_countries.rsi
-    state: ger2_basic
+    state: ger_basic
 
 - type: factionIcon
   id: Ger3Faction
@@ -208,7 +208,7 @@
     state: ger3_basic
 
 - type: factionIcon
-  id: GerFaction
+  id: Ger2Faction
   priority: 1
   showTo:
     components:
@@ -216,7 +216,7 @@
       - ShowFactionIcons
   icon:
     sprite: /Textures/Interface/Misc/civ_hud_countries.rsi
-    state: ger_basic
+    state: ger2_basic
 
 - type: factionIcon
   id: GreekFaction

+ 1 - 0
Resources/Prototypes/Damage/modifier_sets.yml

@@ -59,6 +59,7 @@
     Slash: 1
     Piercing: 0.2
     Heat: 1
+    Shock: 0.6
   flatReductions:
     Blunt: 5
 

+ 9 - 2
Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/cigarette.yml

@@ -17,7 +17,7 @@
       slots: [mask]
       equippedPrefix: unlit
     - type: STWeight
-      self: 0.75
+      self: 0.05
     - type: Item
       size: Tiny
       sprite: Objects/Consumable/Smokeables/Cigarettes/cigarette.rsi
@@ -25,6 +25,13 @@
     - type: Construction
       graph: smokeableCigarette
       node: cigarette
+    - type: SolutionContainerManager
+      solutions:
+        smokable:
+          maxVol: 40
+          reagents:
+            - ReagentId: Nicotine
+              Quantity: 20
 
 - type: entity
   id: SoakedCigarette
@@ -46,7 +53,7 @@
       slots: [mask]
       equippedPrefix: unlit
     - type: STWeight
-      self: 0.75
+      self: 0.05
     - type: Item
       size: Tiny
     - type: Construction

+ 1 - 0
Resources/Prototypes/Entities/Objects/Weapons/Guns/Bow/bow.yml

@@ -23,6 +23,7 @@
       delay: 1
     - type: GunRequiresWield
     - type: Gun
+      projectileSpeed: 30
       minAngle: 0
       maxAngle: 5
       fireRate: 1

+ 1 - 1
Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/arrows.yml

@@ -86,7 +86,7 @@
     - type: Projectile
       damage:
         types:
-          Piercing: 25
+          Piercing: 30
 - type: entity
   parent: BaseArrow
   id: ArrowImprovised

Файловите разлики са ограничени, защото са твърде много
+ 186 - 196
Resources/Prototypes/Entities/Structures/Wallmounts/Signs/signs.yml


+ 25 - 1
Resources/Prototypes/GameRules/roundstart.yml

@@ -70,12 +70,28 @@
   components:
     - type: GracewallRule
 
+- type: entity
+  parent: BaseGameRule
+  id: GracewallRule5
+  components:
+    - type: GracewallRule
+      gracewallDuration: 300
+
 - type: entity
   parent: BaseGameRule
   id: CaptureAreaRule
   components:
     - type: CaptureAreaRule
 
+- type: entity
+  parent: BaseGameRule
+  id: CaptureAreaRuleAsymmetric
+  components:
+    - type: CaptureAreaRule
+      mode: Asymmetric
+      timer: 40
+      defenderFactionName: SovietCW
+
 - type: entity
   id: TeamDeathMatchRule
   parent: BaseGameRule
@@ -93,4 +109,12 @@
   parent: BaseGameRule
   components:
     - type: RandomWeatherRule
-      allowedWeathers: [Rain, Clear, Storm]
+      allowedWeathers: ["Rain", "Clear", "Storm"]
+
+- type: entity
+  id: RandomWeatherRuleNightSnow
+  parent: BaseGameRule
+  components:
+    - type: RandomWeatherRule
+      allowedWeathers: ["SnowfallLight"]
+      dayTimes: ["Night"]

+ 1 - 0
Resources/Prototypes/Maps/Pools/default.yml

@@ -5,3 +5,4 @@
     - CampWW2
     - Nomads
     - Opushka
+    - Hotel

+ 1 - 0
Resources/Prototypes/Maps/civ/camp.yml

@@ -6,6 +6,7 @@
   maxPlayers: 128
   maxRandomOffset: 0
   randomRotation: false
+  fixedPreset: TDM
   stations:
     Camp:
       stationProto: StandardStationTDM

+ 1 - 0
Resources/Prototypes/Maps/civ/camp_ww2.yml

@@ -6,6 +6,7 @@
   maxPlayers: 128
   maxRandomOffset: 0
   randomRotation: false
+  fixedPreset: TDM
   stations:
     CampWW2:
       stationProto: StandardStationTDM

+ 30 - 0
Resources/Prototypes/Maps/civ/hotel.yml

@@ -0,0 +1,30 @@
+- type: gameMap
+  id: Hotel
+  mapName: "Hotel (Cold War)"
+  mapPath: /Maps/civ/tdm/hotel.yml
+  minPlayers: 0
+  maxPlayers: 200
+  maxRandomOffset: 0
+  randomRotation: false
+  fixedPreset: TDMAsymmetric
+  stations:
+    Hotel:
+      stationProto: StandardStationTDM
+      components:
+        - type: StationNameSetup
+          mapNameTemplate: "Hotel (Cold War)"
+        - type: StationJobs
+          availableJobs:
+            # US
+            USCaptain: [1, 1]
+            USSergeant: [4, 4]
+            USRifleman: [50, 50]
+            USMachinegunner: [5, 5]
+            USMedic: [3, 3]
+
+            # Soviet
+            SovietCWCaptain: [1, 1]
+            SovietCWSergeant: [4, 4]
+            SovietCWRifleman: [50, 50]
+            SovietCWMachinegunner: [5, 5]
+            SovietCWMedic: [3, 3]

+ 1 - 0
Resources/Prototypes/Maps/civ/nomads.yml

@@ -4,6 +4,7 @@
   mapPath: /Maps/civ/nomads_classic.yml
   minPlayers: 0
   maxPlayers: 256
+  fixedPreset: Nomads
   stations:
     Nomads:
       stationProto: StandardStationArena

+ 1 - 0
Resources/Prototypes/Maps/civ/opushka.yml

@@ -6,6 +6,7 @@
   maxPlayers: 128
   maxRandomOffset: 0
   randomRotation: false
+  fixedPreset: TDM
   stations:
     Opushka:
       stationProto: StandardStationTDM

+ 11 - 10
Resources/Prototypes/Roles/Jobs/Civ14/TDM/sovietCW.yml

@@ -30,6 +30,7 @@
     shoes: civ13_shoes_Soviet_sapogi_boots
     jumpsuit: civ13_uniform_Soviet_officer_uniform
     outerClothing: civ13_suit_Soviet_officer_coat
+    neck: civ13_accessory_6B2_body_armor
     belt: civ13_pistol_Makarov_PM
     pocket2: civ13_magazine_PM_Makarov_magazine_(9x18mm)
     head: civ13_head_soviet_officer_cap
@@ -68,7 +69,7 @@
   equipment:
     shoes: civ13_shoes_leather_shoes_1
     jumpsuit: civ13_uniform_Soviet_uniform
-    #outerClothing: civ13_suit_Soviet_coat
+    neck: civ13_accessory_6B2_body_armor
     head: civ13_head_soviet_pilotka
     belt: civ13_pistol_Makarov_PM
     pocket1: civ13_magazine_PM_Makarov_magazine_(9x18mm)
@@ -107,9 +108,9 @@
   equipment:
     shoes: civ13_shoes_Soviet_sapogi_boots
     jumpsuit: civ13_uniform_Soviet_uniform
-    #outerClothing: civ13_suit_Soviet_coat_1
+    neck: civ13_accessory_6B2_body_armor
     head: civ13_head_soviet_helmet
-#    belt: ClothingWebbingRussianRifleman
+    belt: ClothingWebbingSovietCWRifleman
     pocket1: FlashlightLanternMilitary
     pocket2: Gauze
   inhand:
@@ -121,8 +122,8 @@
     shoes: civ13_shoes_Soviet_sapogi_boots
     jumpsuit: civ13_uniform_Soviet_amoeba_outfit
     gloves: ClothingHandsGlovesFingerless
-#    belt: ClothingWebbingRussianRifleman
-#    outerClothing: civ13_suit_Soviet_coat
+    belt: ClothingWebbingSovietCWRifleman
+    neck: civ13_accessory_6B2_body_armor
     head: civ13_head_soviet_helmet
     pocket1: FlashlightLanternMilitary
     pocket2: Gauze
@@ -161,8 +162,8 @@
     shoes: civ13_shoes_Soviet_sapogi_boots
     jumpsuit: civ13_uniform_Soviet_uniform
     gloves: ClothingHandsGlovesFingerless
-#    belt: ClothingWebbingSovietMG
-    #outerClothing: civ13_suit_Soviet_coat
+    belt: ClothingWebbingSovietCWMG
+    neck: civ13_accessory_6B2_body_armor
     head: civ13_head_soviet_helmet
     pocket1: CombatKnife
     pocket2: Gauze
@@ -175,8 +176,8 @@
     shoes: civ13_shoes_Soviet_sapogi_boots
     jumpsuit: civ13_uniform_Soviet_amoeba_outfit
     gloves: ClothingHandsGlovesFingerless
-#    belt: ClothingWebbingSovietMG
-#    outerClothing: civ13_suit_Soviet_coat_1
+    belt: ClothingWebbingSovietCWRifleman
+    neck: civ13_accessory_6B2_body_armor
     head: civ13_head_soviet_ushanka_1
     pocket1: CombatKnife
     pocket2: Gauze
@@ -213,7 +214,7 @@
   equipment:
     shoes: civ13_shoes_Soviet_sapogi_boots
     jumpsuit: civ13_uniform_Soviet_uniform
-    #outerClothing: civ13_suit_Soviet_coat_1
+    neck: civ13_accessory_6B2_body_armor
     head: civ13_head_soviet_medical_helmet
     belt: ClothingSatchelMedicalMedsFilled
     back: ClothingBackpackDuffelFilled

+ 12 - 5
Resources/Prototypes/Roles/Jobs/Civ14/TDM/usa.yml

@@ -28,6 +28,7 @@
   equipment:
     shoes: civ13_shoes_jackboots
     jumpsuit: civ13_uniform_American_captain_uniform
+    neck: civ13_accessory_green_PASGT_body_armor
     head: civ13_head_M1_Captain_Helmet
     belt: civ13_pistol_M1911A1
     pocket1: civ13_magazine_M1911_magazine_(.45)
@@ -64,6 +65,7 @@
   equipment:
     shoes: civ13_shoes_jackboots
     jumpsuit: civ13_uniform_US_Army_Officer_Uniform
+    neck: civ13_accessory_woodland_PASGT_body_armor
     head: civ13_head_M1_1st_LT_Helmet
     belt: civ13_pistol_M1911A1
     pocket1: civ13_magazine_M1911_magazine_(.45)
@@ -101,7 +103,8 @@
     shoes: civ13_shoes_jackboots
     jumpsuit: civ13_uniform_American_uniform
     head: civ13_head_M1_Helmet
-#    belt: ClothingWebbingGermanRifleman
+    belt: ClothingWebbingUSCWRifleman
+    neck: civ13_accessory_woodland_PASGT_body_armor
     pocket1: Gauze
     pocket2: Gauze
   inhand:
@@ -113,7 +116,8 @@
     shoes: civ13_shoes_jackboots
     jumpsuit: civ13_uniform_American_uniform
     head: civ13_head_M1_Helmet_with_netting_1
-#    belt: ClothingWebbingGermanRifleman
+    belt: ClothingWebbingUSCWRifleman
+    neck: civ13_accessory_woodland_PASGT_body_armor
     pocket1: Gauze
     pocket2: Gauze
   inhand:
@@ -150,7 +154,8 @@
     shoes: civ13_shoes_jackboots
     jumpsuit: civ13_uniform_American_uniform
     head: civ13_head_M1_Helmet
-#    belt: ClothingWebbingGermanMG
+    belt: ClothingWebbingUSCWMG
+    neck: civ13_accessory_woodland_PASGT_body_armor
     pocket1: CombatKnife
     pocket2: Gauze
   inhand:
@@ -162,11 +167,12 @@
     shoes: civ13_shoes_jackboots
     jumpsuit: civ13_uniform_American_uniform
     head: civ13_head_M1_Helmet_with_netting
-#    belt: ClothingWebbingGermanMG
+    belt: ClothingWebbingUSCWMG
+    neck: civ13_accessory_woodland_PASGT_body_armor
     pocket1: CombatKnife
     pocket2: Gauze
   inhand:
-   - civ13_mg_M60
+    - civ13_mg_M60
 
 # Medic
 
@@ -200,6 +206,7 @@
     head: civ13_head_M1_Medic_Helmet
     belt: ClothingSatchelMedicalMedsFilled
     back: ClothingBackpackDuffelFilled
+    neck: civ13_accessory_woodland_PASGT_body_armor
     pocket1: CombatKnife
   inhand:
     - civ13_ar_M16A2

+ 14 - 0
Resources/Prototypes/game_presets.yml

@@ -23,3 +23,17 @@
     - CaptureAreaRule
     - TeamDeathMatchRule
     - RandomWeatherRule
+
+- type: gamePreset
+  id: TDMAsymmetric
+  alias:
+    - tdm-asymmetric
+  name: tdm-asy-title
+  showInVote: true
+  description: tdm-asy-description
+  rules:
+    - RespawnDeadRuleTDMFixed
+    - GracewallRule5
+    - CaptureAreaRuleAsymmetric
+    - TeamDeathMatchRule
+    - RandomWeatherRuleNightSnow

BIN
Resources/Textures/Civ14/Clothing/exported/ties/6b2.rsi/equipped-OUTERCLOTHING.png


+ 24 - 20
Resources/Textures/Civ14/Clothing/exported/ties/6b2.rsi/meta.json

@@ -1,23 +1,27 @@
 {
-  "version": 1,
-  "license": "AGPLv3",
-  "copyright": "Taken from Civilization 13 https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "6b2",
-      "directions": 1
+    "version": 1,
+    "license": "AGPLv3",
+    "copyright": "Taken from Civilization 13 https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "equipped-NECK",
-      "directions": 4
-    },
-    {
-      "name": "icon",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "6b2",
+            "directions": 1
+        },
+        {
+            "name": "equipped-NECK",
+            "directions": 4
+        },
+        {
+            "name": "equipped-OUTERCLOTHING",
+            "directions": 4
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Clothing/exported/ties/pasgt_woodland.rsi/equipped-HELMET.png


BIN
Resources/Textures/Civ14/Clothing/exported/ties/pasgt_woodland.rsi/equipped-OUTERCLOTHING.png


+ 24 - 24
Resources/Textures/Civ14/Clothing/exported/ties/pasgt_woodland.rsi/meta.json

@@ -1,27 +1,27 @@
 {
-  "version": 1,
-  "license": "AGPLv3",
-  "copyright": "Taken from Civilization 13 https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "pasgt_woodland",
-      "directions": 1
+    "version": 1,
+    "license": "AGPLv3",
+    "copyright": "Taken from Civilization 13 https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "equipped-HELMET",
-      "directions": 4
-    },
-    {
-      "name": "equipped-NECK",
-      "directions": 4
-    },
-    {
-      "name": "icon",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "pasgt_woodland",
+            "directions": 1
+        },
+        {
+            "name": "equipped-OUTERCLOTHING",
+            "directions": 4
+        },
+        {
+            "name": "equipped-NECK",
+            "directions": 4
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Machines/Coinsmelter.rsi/coinsmelter.png


BIN
Resources/Textures/Civ14/Machines/Coinsmelter.rsi/coinsmelter_on.png


+ 32 - 0
Resources/Textures/Civ14/Machines/Coinsmelter.rsi/meta.json

@@ -0,0 +1,32 @@
+{
+  "version": 1,
+  "license": "AGPLv3",
+  "copyright": "Taken from Civilization 13 https://github.com/civ13/civ13",
+  "size": {
+    "x": 32,
+    "y": 32
+  },
+  "states": [
+    {
+      "name": "coinsmelter"
+    },
+    {
+      "name": "coinsmelter_on",
+      "delays": [
+        [
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1
+        ]
+      ]
+    }
+  ]
+}

BIN
Resources/Textures/Civ14/Machines/bullet_press.rsi/bullet_press.png


+ 17 - 0
Resources/Textures/Civ14/Machines/bullet_press.rsi/meta.json

@@ -0,0 +1,17 @@
+{
+  "version": 1,
+  "license": "AGPLv3",
+  "copyright": "Taken from Civilization 13 https://github.com/civ13/civ13",
+  "size": {
+    "x": 64,
+    "y": 32
+  },
+  "states": [
+    {
+      "name": "rusted_bullet_press"
+    },
+    {
+      "name": "bullet_press"
+    }
+  ]
+}

BIN
Resources/Textures/Civ14/Machines/bullet_press.rsi/rusted_bullet_press.png


+ 28 - 0
Resources/Textures/Civ14/Machines/mining_drill.rsi/meta.json

@@ -0,0 +1,28 @@
+{
+  "version": 1,
+  "license": "AGPLv3",
+  "copyright": "Taken from Civilization 13 https://github.com/civ13/civ13",
+  "size": {
+    "x": 32,
+    "y": 48
+  },
+  "states": [
+    {
+      "name": "mining_drill"
+    },
+    {
+      "name": "mining_drill_powered"
+    },
+    {
+      "name": "mining_drill_active",
+      "delays": [
+        [
+          0.1,
+          0.1,
+          0.1,
+          0.1
+        ]
+      ]
+    }
+  ]
+}

BIN
Resources/Textures/Civ14/Machines/mining_drill.rsi/mining_drill.png


BIN
Resources/Textures/Civ14/Machines/mining_drill.rsi/mining_drill_active.png


BIN
Resources/Textures/Civ14/Machines/mining_drill.rsi/mining_drill_powered.png


+ 46 - 0
Resources/Textures/Civ14/Machines/pipes.rsi/meta.json

@@ -0,0 +1,46 @@
+{
+  "version": 1,
+  "license": "AGPLv3",
+  "copyright": "Taken from Civilization 13 https://github.com/civ13/civ13",
+  "size": {
+    "x": 32,
+    "y": 32
+  },
+  "states": [
+    {
+      "name": "pipe-t",
+      "directions": 4
+    },
+    {
+      "name": "pipe-u",
+      "directions": 4
+    },
+    {
+      "name": "pipe-d",
+      "directions": 4
+    },
+    {
+      "name": "pipe-b",
+      "directions": 4
+    },
+    {
+      "name": "s_pipe",
+      "directions": 4
+    },
+    {
+      "name": "s_pipe_turn",
+      "directions": 4
+    },
+    {
+      "name": "s_pipe_connection4_thin"
+    },
+    {
+      "name": "s_pipe2_thin",
+      "directions": 4
+    },
+    {
+      "name": "s_pipe_connection3_thin",
+      "directions": 4
+    }
+  ]
+}

BIN
Resources/Textures/Civ14/Machines/pipes.rsi/pipe-b.png


BIN
Resources/Textures/Civ14/Machines/pipes.rsi/pipe-d.png


BIN
Resources/Textures/Civ14/Machines/pipes.rsi/pipe-t.png


BIN
Resources/Textures/Civ14/Machines/pipes.rsi/pipe-u.png


BIN
Resources/Textures/Civ14/Machines/pipes.rsi/s_pipe.png


BIN
Resources/Textures/Civ14/Machines/pipes.rsi/s_pipe2_thin.png


BIN
Resources/Textures/Civ14/Machines/pipes.rsi/s_pipe_connection3_thin.png


BIN
Resources/Textures/Civ14/Machines/pipes.rsi/s_pipe_connection4_thin.png


BIN
Resources/Textures/Civ14/Machines/pipes.rsi/s_pipe_turn.png


+ 14 - 0
Resources/Textures/Civ14/Machines/powertransformer.rsi/meta.json

@@ -0,0 +1,14 @@
+{
+  "version": 1,
+  "license": "AGPLv3",
+  "copyright": "Taken from Civilization 13 https://github.com/civ13/civ13",
+  "size": {
+    "x": 32,
+    "y": 64
+  },
+  "states": [
+    {
+      "name": "powertransformer"
+    }
+  ]
+}

BIN
Resources/Textures/Civ14/Machines/powertransformer.rsi/powertransformer.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/AAS_Off.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/AAS_Off_Open.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/AAS_On.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/AAS_On_Open.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/blackbox.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/blackbox_b.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/bus.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/bus_o.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/bus_o_off.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/bus_off.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/comm_server.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/comm_server_o.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/comm_server_o_off.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/comm_server_off.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/controller-p.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/controller.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/hub.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/hub_o.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/hub_o_off.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/hub_off.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/message_server.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/message_server_o.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/message_server_o_off.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/message_server_off.png


+ 304 - 0
Resources/Textures/Civ14/Machines/servers.rsi/meta.json

@@ -0,0 +1,304 @@
+{
+  "version": 1,
+  "license": "AGPLv3",
+  "copyright": "Taken from Civilization 13 https://github.com/civ13/civ13",
+  "size": {
+    "x": 32,
+    "y": 32
+  },
+  "states": [
+    {
+      "name": "hub",
+      "delays": [
+        [
+          0.3,
+          0.3,
+          0.3,
+          0.3,
+          0.3,
+          0.3
+        ]
+      ]
+    },
+    {
+      "name": "hub_off"
+    },
+    {
+      "name": "hub_o",
+      "delays": [
+        [
+          0.3,
+          0.3,
+          0.3,
+          0.3,
+          0.3,
+          0.3
+        ]
+      ]
+    },
+    {
+      "name": "hub_o_off"
+    },
+    {
+      "name": "controller",
+      "delays": [
+        [
+          0.2,
+          0.2,
+          0.2,
+          0.2
+        ]
+      ]
+    },
+    {
+      "name": "controller-p"
+    },
+    {
+      "name": "processor",
+      "delays": [
+        [
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1
+        ]
+      ]
+    },
+    {
+      "name": "processor_off"
+    },
+    {
+      "name": "comm_server",
+      "delays": [
+        [
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1
+        ]
+      ]
+    },
+    {
+      "name": "comm_server_off"
+    },
+    {
+      "name": "comm_server_o",
+      "delays": [
+        [
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1
+        ]
+      ]
+    },
+    {
+      "name": "comm_server_o_off"
+    },
+    {
+      "name": "message_server",
+      "delays": [
+        [
+          0.075,
+          0.075,
+          0.075,
+          0.075,
+          0.075,
+          0.075,
+          0.075,
+          0.8
+        ]
+      ]
+    },
+    {
+      "name": "message_server_o",
+      "delays": [
+        [
+          0.075,
+          0.075,
+          0.075,
+          0.075,
+          0.075,
+          0.075,
+          0.075,
+          0.8
+        ]
+      ]
+    },
+    {
+      "name": "message_server_off"
+    },
+    {
+      "name": "message_server_o_off"
+    },
+    {
+      "name": "relay_off"
+    },
+    {
+      "name": "relay",
+      "delays": [
+        [
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1
+        ]
+      ]
+    },
+    {
+      "name": "relay_o",
+      "delays": [
+        [
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1
+        ]
+      ]
+    },
+    {
+      "name": "relay_o_off"
+    },
+    {
+      "name": "AAS_On",
+      "delays": [
+        [
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1
+        ]
+      ]
+    },
+    {
+      "name": "AAS_Off"
+    },
+    {
+      "name": "AAS_On_Open",
+      "delays": [
+        [
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1
+        ]
+      ]
+    },
+    {
+      "name": "AAS_Off_Open"
+    },
+    {
+      "name": "bus",
+      "delays": [
+        [
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1
+        ]
+      ]
+    },
+    {
+      "name": "bus_off"
+    },
+    {
+      "name": "bus_o",
+      "delays": [
+        [
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1,
+          0.1
+        ]
+      ]
+    },
+    {
+      "name": "bus_o_off"
+    },
+    {
+      "name": "blackbox",
+      "delays": [
+        [
+          0.07,
+          0.07,
+          0.07,
+          0.07,
+          0.07,
+          0.07,
+          0.07
+        ]
+      ]
+    },
+    {
+      "name": "blackbox_b",
+      "delays": [
+        [
+          0.7,
+          0.1,
+          0.1,
+          0.1
+        ]
+      ]
+    }
+  ]
+}

BIN
Resources/Textures/Civ14/Machines/servers.rsi/processor.png


BIN
Resources/Textures/Civ14/Machines/servers.rsi/processor_off.png


Някои файлове не бяха показани, защото твърде много файлове са промени