Ver código fonte

Qol patch 3 (#235)

* shut up yaml linter

* job requirements

* radio channel tweaks

* barricade tweaking

* nades over barricades

* added mortars to maps, basefloors

* buffs arrows, reduces playtime reqs for now

* good enough for now
Taislin 6 meses atrás
pai
commit
add6698b7f

+ 1 - 1
Content.Server/Anomaly/Components/AnomalyGeneratorComponent.cs

@@ -56,7 +56,7 @@ public sealed partial class AnomalyGeneratorComponent : Component
     /// The radio channel for science
     /// </summary>
     [DataField("scienceChannel", customTypeSerializer: typeof(PrototypeIdSerializer<RadioChannelPrototype>))]
-    public string ScienceChannel = "Science";
+    public string ScienceChannel = "Common";
 
     /// <summary>
     /// The sound looped while an anomaly generates

+ 1 - 1
Content.Server/Research/Components/ResearchConsoleComponent.cs

@@ -10,6 +10,6 @@ public sealed partial class ResearchConsoleComponent : Component
     /// The radio channel that the unlock announcements are broadcast to.
     /// </summary>
     [DataField, ViewVariables(VVAccess.ReadWrite)]
-    public ProtoId<RadioChannelPrototype> AnnouncementChannel = "Science";
+    public ProtoId<RadioChannelPrototype> AnnouncementChannel = "Common";
 }
 

+ 3 - 2
Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs

@@ -12,7 +12,8 @@ namespace Content.Shared.Cargo.Components;
 [RegisterComponent, NetworkedComponent]
 public sealed partial class CargoOrderConsoleComponent : Component
 {
-    [DataField("soundError")] public SoundSpecifier ErrorSound =
+    [DataField("soundError")]
+    public SoundSpecifier ErrorSound =
         new SoundPathSpecifier("/Audio/Effects/Cargo/buzz_sigh.ogg");
 
     [DataField("soundConfirm")]
@@ -28,6 +29,6 @@ public sealed partial class CargoOrderConsoleComponent : Component
     /// Radio channel on which order approval announcements are transmitted
     /// </summary>
     [DataField, ViewVariables(VVAccess.ReadWrite)]
-    public ProtoId<RadioChannelPrototype> AnnouncementChannel = "Supply";
+    public ProtoId<RadioChannelPrototype> AnnouncementChannel = "Common";
 }
 

+ 1 - 1
Content.Shared/CriminalRecords/Components/CriminalRecordsConsoleComponent.cs

@@ -44,7 +44,7 @@ public sealed partial class CriminalRecordsConsoleComponent : Component
     /// Channel to send messages to when someone's status gets changed.
     /// </summary>
     [DataField]
-    public ProtoId<RadioChannelPrototype> SecurityChannel = "Security";
+    public ProtoId<RadioChannelPrototype> SecurityChannel = "Common";
 
     /// <summary>
     /// Max length of arrest and crime history strings.

+ 27 - 4
Content.Shared/Damage/Systems/RequireProjectileTargetSystem.cs

@@ -3,27 +3,50 @@
 using Content.Shared.Standing;
 using Robust.Shared.Physics.Events;
 using Robust.Shared.Containers;
+using Robust.Shared.Random;
+using Content.Shared.Mobs.Systems;
 
 namespace Content.Shared.Damage.Components;
 
 public sealed class RequireProjectileTargetSystem : EntitySystem
 {
     [Dependency] private readonly SharedContainerSystem _container = default!;
-
+    [Dependency] private readonly IRobustRandom _random = default!;
+    [Dependency] private readonly ILogManager _logManager = default!;
+    [Dependency] private readonly MobStateSystem _mobState = default!;
+    private ISawmill _sawmill = default!;
     public override void Initialize()
     {
         SubscribeLocalEvent<RequireProjectileTargetComponent, PreventCollideEvent>(PreventCollide);
         SubscribeLocalEvent<RequireProjectileTargetComponent, StoodEvent>(StandingBulletHit);
         SubscribeLocalEvent<RequireProjectileTargetComponent, DownedEvent>(LayingBulletPass);
+
+        _sawmill = _logManager.GetSawmill("targeting");
     }
 
     private void PreventCollide(Entity<RequireProjectileTargetComponent> ent, ref PreventCollideEvent args)
     {
         if (args.Cancelled)
-          return;
+            return;
 
         if (!ent.Comp.Active)
+        {
             return;
+        }
+        else
+        {
+            if (_mobState.IsDead(args.OtherEntity))
+            { args.Cancelled = true; }
+            //_sawmill.Info("checking");
+            var rando = _random.NextFloat(0.0f, 100.0f);
+            // 20% chance get hit
+            if (rando >= 80.0f)
+            {
+                //_sawmill.Info("20%");
+                return;
+            }
+
+        }
 
         var other = args.OtherEntity;
         if (TryComp(other, out ProjectileComponent? projectile) &&
@@ -40,7 +63,7 @@ private void PreventCollide(Entity<RequireProjectileTargetComponent> ent, ref Pr
                 return;
 
             if (!_container.IsEntityOrParentInContainer(shooter.Value))
-               args.Cancelled = true;
+                args.Cancelled = true;
         }
     }
 
@@ -60,6 +83,6 @@ private void StandingBulletHit(Entity<RequireProjectileTargetComponent> ent, ref
 
     private void LayingBulletPass(Entity<RequireProjectileTargetComponent> ent, ref DownedEvent args)
     {
-        SetActive(ent, true);
+        SetActive(ent, true); // stalker-changes
     }
 }

+ 6 - 1
Content.Shared/Projectiles/SharedProjectileSystem.cs

@@ -304,10 +304,15 @@ private void PreventCollision(EntityUid uid, ProjectileComponent component, ref
             {
                 //_sawmill.Debug("Barricade direction/distance check failed or shooter not valid.");
                 // Standard barricade blocking logic if the special conditions are not met.
-                if (_random.NextFloat(0.0f, 100.0f) >= barricade.Blocking)
+                var rando = _random.NextFloat(0.0f, 100.0f);
+                if (rando >= barricade.Blocking)
                 {
                     args.Cancelled = true;
                 }
+                else
+                {
+                    return;
+                }
             }
         }
     }

+ 1 - 1
Content.Shared/Robotics/Components/RoboticsConsoleComponent.cs

@@ -30,7 +30,7 @@ public sealed partial class RoboticsConsoleComponent : Component
     /// Radio channel to send messages on.
     /// </summary>
     [DataField]
-    public ProtoId<RadioChannelPrototype> RadioChannel = "Science";
+    public ProtoId<RadioChannelPrototype> RadioChannel = "Common";
 
     /// <summary>
     /// Radio message sent when destroying a borg.

+ 73 - 4
Content.Shared/Throwing/ThrownItemSystem.cs

@@ -9,6 +9,8 @@
 using Robust.Shared.Physics.Events;
 using Robust.Shared.Physics.Systems;
 using Robust.Shared.Timing;
+using Content.Shared.Barricade;
+using Robust.Shared.Random;
 
 namespace Content.Shared.Throwing
 {
@@ -23,9 +25,10 @@ public sealed class ThrownItemSystem : EntitySystem
         [Dependency] private readonly FixtureSystem _fixtures = default!;
         [Dependency] private readonly SharedPhysicsSystem _physics = default!;
         [Dependency] private readonly SharedGravitySystem _gravity = default!;
-
-        private const string ThrowingFixture = "throw-fixture";
-
+        [Dependency] private readonly SharedTransformSystem _transform = default!; private const string ThrowingFixture = "throw-fixture";
+        [Dependency] private readonly IRobustRandom _random = default!;
+        [Dependency] private readonly ILogManager _log = default!;
+        private ISawmill _sawmill = default!;
         public override void Initialize()
         {
             base.Initialize();
@@ -36,6 +39,7 @@ public override void Initialize()
             SubscribeLocalEvent<ThrownItemComponent, ThrownEvent>(ThrowItem);
 
             SubscribeLocalEvent<PullStartedMessage>(HandlePullStarted);
+            _sawmill = _log.GetSawmill("throwing");
         }
 
         private void OnMapInit(EntityUid uid, ThrownItemComponent component, MapInitEvent args)
@@ -54,7 +58,7 @@ private void ThrowItem(EntityUid uid, ThrownItemComponent component, ref ThrownE
 
             var fixture = fixturesComponent.Fixtures.Values.First();
             var shape = fixture.Shape;
-            _fixtures.TryCreateFixture(uid, shape, ThrowingFixture, hard: false, collisionMask: (int) CollisionGroup.ThrownItem, manager: fixturesComponent, body: body);
+            _fixtures.TryCreateFixture(uid, shape, ThrowingFixture, hard: false, collisionMask: (int)CollisionGroup.ThrownItem, manager: fixturesComponent, body: body);
         }
 
         private void HandleCollision(EntityUid uid, ThrownItemComponent component, ref StartCollideEvent args)
@@ -74,6 +78,71 @@ private void PreventCollision(EntityUid uid, ThrownItemComponent component, ref
             {
                 args.Cancelled = true;
             }
+            //check for barricade component (percentage of chance to hit/pass over)
+            if (TryComp(args.OtherEntity, out BarricadeComponent? barricade))
+            {
+                var alwaysPassThrough = false;
+                //_sawmill.Info("Checking barricade...");
+                if (component.Thrower is { } shooterUid && Exists(shooterUid))
+                {
+                    // Condition 1: Directions are the same (using cardinal directions).
+                    // Or, if bidirectional, directions can be opposite.
+                    var shooterWorldRotation = _transform.GetWorldRotation(shooterUid);
+                    var barricadeWorldRotation = _transform.GetWorldRotation(args.OtherEntity);
+
+                    var shooterDir = shooterWorldRotation.GetCardinalDir();
+                    var barricadeDir = barricadeWorldRotation.GetCardinalDir();
+
+                    bool directionallyAllowed = false;
+                    if (shooterDir == barricadeDir)
+                    {
+                        directionallyAllowed = true;
+                        //_sawmill.Debug("Shooter and barricade facing same cardinal direction.");
+                    }
+                    else if (barricade.Bidirectional)
+                    {
+                        var oppositeBarricadeDir = (Direction)(((int)barricadeDir + 4) % 8);
+                        if (shooterDir == oppositeBarricadeDir)
+                        {
+                            directionallyAllowed = true;
+                            //_sawmill.Debug("Shooter and barricade facing opposite cardinal directions (bidirectional pass).");
+                        }
+                    }
+
+                    if (directionallyAllowed)
+                    {
+                        // Condition 2: Firer is within 1 tile of the barricade.
+                        var shooterCoords = Transform(shooterUid).Coordinates;
+                        var barricadeCoords = Transform(args.OtherEntity).Coordinates;
+
+                        if (shooterCoords.TryDistance(EntityManager, barricadeCoords, out var distance) &&
+                            distance <= 1.5f)
+                        {
+                            alwaysPassThrough = true;
+                        }
+                    }
+                }
+
+                if (alwaysPassThrough)
+                {
+                    args.Cancelled = true;
+                }
+                else
+                {
+                    //_sawmill.Debug("Barricade direction/distance check failed or shooter not valid.");
+                    // Standard barricade blocking logic if the special conditions are not met.
+                    var rando = _random.NextFloat(0.0f, 100.0f);
+                    if (rando >= 12)
+                    {
+                        args.Cancelled = true;
+                        return;
+                    }
+                    else
+                    {
+                        return;
+                    }
+                }
+            }
         }
 
         private void OnSleep(EntityUid uid, ThrownItemComponent thrownItem, ref PhysicsSleepEvent @event)

+ 18 - 0
Content.Shared/_RMC14/Roles/JobGroupComponent.cs

@@ -0,0 +1,18 @@
+using Content.Shared.Roles;
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared._RMC14.Roles;
+
+[RegisterComponent, NetworkedComponent]
+public sealed partial class JobGroupComponent : Component
+{
+    [DataField(required: true)]
+    public LocId Name;
+
+    [DataField(required: true)]
+    public Color Color;
+
+    [DataField(required: true)]
+    public HashSet<ProtoId<JobPrototype>> Jobs = new();
+}

+ 89 - 0
Content.Shared/_RMC14/Roles/TotalJobsTimeRequirement.cs

@@ -0,0 +1,89 @@
+using System.Diagnostics.CodeAnalysis;
+using Content.Shared.Preferences;
+using Content.Shared.Roles;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization;
+using Robust.Shared.Utility;
+
+namespace Content.Shared._RMC14.Roles;
+
+[Serializable, NetSerializable]
+public sealed partial class TotalJobsTimeRequirement : JobRequirement
+{
+    /// <summary>
+    /// Which roles to add up to the required amount of time.
+    /// </summary>
+    [DataField(required: true)]
+    public EntProtoId Group;
+
+    /// <summary>
+    /// How long (in seconds) this requirement is.
+    /// </summary>
+    [DataField(required: true)]
+    public TimeSpan Time;
+
+    public bool TryRequirementsMet(IReadOnlyDictionary<string, TimeSpan> playTimes, out FormattedMessage? reason, IEntityManager entManager, IPrototypeManager prototypes)
+    {
+        reason = null;
+        var playtime = TimeSpan.Zero;
+        var trackers = new HashSet<string>();
+        if (!prototypes.Index(Group).TryGetComponent(out JobGroupComponent? comp))
+        {
+            var sawmill = Logger.GetSawmill("job.requirements");
+            sawmill.Error($"No {nameof(JobGroupComponent)} found on entity {Group}");
+            return true;
+        }
+
+        // Check all jobs' playtime
+        foreach (var jobId in comp.Jobs)
+        {
+            // The schema is stored on the Job role but we want to explode if the timer isn't found anyway.
+            var proto = prototypes.Index(jobId).PlayTimeTracker;
+            trackers.Add(proto);
+        }
+
+        foreach (var tracker in trackers)
+        {
+            playTimes.TryGetValue(tracker, out var otherTime);
+            playtime += otherTime;
+        }
+
+        var deptDiff = Time.TotalMinutes - playtime.TotalMinutes;
+
+        if (!Inverted)
+        {
+            if (deptDiff <= 0)
+                return true;
+
+            reason = FormattedMessage.FromMarkupOrThrow(Loc.GetString(
+                "role-timer-total-department-insufficient",
+                ("time", Math.Ceiling(deptDiff)),
+                ("roles", Loc.GetString(comp.Name)),
+                ("rolesColor", comp.Color.ToHex())));
+            return false;
+        }
+        else
+        {
+            if (deptDiff <= 0)
+            {
+                reason = FormattedMessage.FromMarkupOrThrow(Loc.GetString(
+                    "role-timer-total-department-too-high",
+                    ("time", -deptDiff),
+                    ("roles", Loc.GetString(comp.Name)),
+                    ("rolesColor", comp.Color.ToHex())));
+                return false;
+            }
+
+            return true;
+        }
+    }
+
+    public override bool Check(IEntityManager entManager,
+        IPrototypeManager protoManager,
+        HumanoidCharacterProfile? profile,
+        IReadOnlyDictionary<string, TimeSpan> playTimes,
+        [NotNullWhen(false)] out FormattedMessage? reason)
+    {
+        return TryRequirementsMet(playTimes, out reason, entManager, protoManager);
+    }
+}

+ 8 - 0
Resources/Locale/en-US/Civ14/jobgroup.ftl

@@ -0,0 +1,8 @@
+role-timer-enlisted-roles = any enlisted roles
+role-timer-medical-roles = any medical roles
+role-timer-officer-roles = any officer roles
+role-timer-squad-leader-roles = any squad leader roles
+role-timer-rifleman-roles = any rifleman roles
+
+role-timer-total-department-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes as [color={$rolesColor}]{$roles}[/color] to play this role.
+role-timer-total-department-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes as [color={$departmentColor}]{$rolesColor}[/color] to play this role. (Are you trying to play a trainee role?)

Diferenças do arquivo suprimidas por serem muito extensas
+ 11 - 3
Resources/Maps/civ/tdm/hotel.yml


+ 63 - 5
Resources/Maps/civ/tdm/opushka.yml

@@ -4,8 +4,8 @@ meta:
   engineVersion: 251.0.0
   forkId: ""
   forkVersion: ""
-  time: 05/22/2025 14:35:08
-  entityCount: 1049
+  time: 05/27/2025 16:17:35
+  entityCount: 1057
 maps:
 - 1
 grids:
@@ -44,8 +44,16 @@ entities:
       researchEnabled: False
     - type: FTLDestination
     - type: CivTDMFactions
-      faction1Id: German
+      faction2Squads:
+        Alpha: {}
+        Bravo: {}
+        Charlie: {}
+      faction1Squads:
+        Alpha: {}
+        Bravo: {}
+        Charlie: {}
       faction2Id: Soviet
+      faction1Id: German
   - uid: 2
     components:
     - type: MetaData
@@ -2599,6 +2607,28 @@ entities:
     - type: Transform
       pos: 71.46087,24.807653
       parent: 2
+- proto: CrateMilitaryMortarAmmo
+  entities:
+  - uid: 208
+    components:
+    - type: Transform
+      pos: -28.5,23.5
+      parent: 2
+  - uid: 209
+    components:
+    - type: Transform
+      pos: -28.5,24.5
+      parent: 2
+  - uid: 211
+    components:
+    - type: Transform
+      pos: 72.5,18.5
+      parent: 2
+  - uid: 212
+    components:
+    - type: Transform
+      pos: 72.5,17.5
+      parent: 2
 - proto: CrateWoodBarbedwire
   entities:
   - uid: 132
@@ -3645,6 +3675,20 @@ entities:
     - type: Transform
       pos: 20.664913,27.684372
       parent: 2
+- proto: MortarKit
+  entities:
+  - uid: 207
+    components:
+    - type: Transform
+      rot: -1.5707963267948966 rad
+      pos: -28.30018,22.385866
+      parent: 2
+  - uid: 210
+    components:
+    - type: Transform
+      rot: 3.141592653589793 rad
+      pos: 71.37881,19.36227
+      parent: 2
 - proto: OldBrickWallIndestructible
   entities:
   - uid: 141
@@ -6983,7 +7027,7 @@ entities:
       pos: 21.5,24.5
       parent: 2
     - type: Door
-      secondsUntilStateChange: -12158.777
+      secondsUntilStateChange: -12236.257
       state: Opening
     - type: Godmode
       oldDamage: {}
@@ -6993,7 +7037,7 @@ entities:
       pos: 23.5,17.5
       parent: 2
     - type: Door
-      secondsUntilStateChange: -15251.492
+      secondsUntilStateChange: -15328.972
       state: Opening
     - type: Godmode
       oldDamage: {}
@@ -7019,4 +7063,18 @@ entities:
     - type: Transform
       pos: 16.5,20.5
       parent: 2
+- proto: Wrench
+  entities:
+  - uid: 206
+    components:
+    - type: Transform
+      rot: -1.5707963267948966 rad
+      pos: -28.33143,22.432741
+      parent: 2
+  - uid: 213
+    components:
+    - type: Transform
+      rot: 3.141592653589793 rad
+      pos: 71.53506,19.58102
+      parent: 2
 ...

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

@@ -34,7 +34,7 @@
               acts: ["Destruction"]
     - type: Barricade
       bidirectional: false
-      blocking: 80
+      blocking: 85
     - type: AtmosExposed
 
 - type: entity
@@ -94,7 +94,7 @@
               acts: ["Destruction"]
     - type: Barricade
       bidirectional: true
-      blocking: 66
+      blocking: 75
     - type: AtmosExposed
     - type: Construction
       graph: BarricadeSandbags
@@ -113,7 +113,7 @@
       drawdepth: FloorObjects
       noRot: true
     - type: Barricade
-      blocking: 50
+      blocking: 60
 - type: entity
   id: BarricadeSandbagsLow
   description: An unfinished sandbag wall.
@@ -128,7 +128,7 @@
       drawdepth: FloorObjects
       noRot: true
     - type: Barricade
-      blocking: 33
+      blocking: 40
 # snow wall
 - type: entity
   id: BarricadeSnowwall
@@ -168,7 +168,7 @@
       drawdepth: FloorObjects
       noRot: true
     - type: Barricade
-      blocking: 50
+      blocking: 60
 - type: entity
   id: BarricadeSnowwallLow
   description: An unfinished snow barricade.
@@ -183,7 +183,7 @@
       drawdepth: FloorObjects
       noRot: true
     - type: Barricade
-      blocking: 33
+      blocking: 40
 
 # dirt wall
 - type: entity
@@ -228,7 +228,7 @@
       drawdepth: FloorObjects
       noRot: true
     - type: Barricade
-      blocking: 50
+      blocking: 60
 
 - type: entity
   id: BarricadeDirtwallLow
@@ -244,7 +244,7 @@
       drawdepth: FloorObjects
       noRot: true
     - type: Barricade
-      blocking: 33
+      blocking: 40
 
 - type: entity
   id: BarricadeStonewall

+ 17 - 10
Resources/Prototypes/Civ14/Roles/Jobs/TDM/german.yml

@@ -6,8 +6,9 @@
   description: job-description-civ-german-cpt
   playTimeTracker: JobGermanCaptain
   requirements:
-    - !type:OverallPlaytimeRequirement
-      time: 10800 #3 hrs
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsSquadLeader
+      time: 7200 # 2 hours
   startingGear: GermanCaptainGear
   icon: "JobIconICpt"
   supervisors: job-supervisors-nobody
@@ -51,8 +52,9 @@
   description: job-description-civ-german-sergeant
   playTimeTracker: JobGermanSergeant
   requirements:
-    - !type:OverallPlaytimeRequirement
-      time: 5400 #1.5 hrs
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsEnlisted
+      time: 7200 # 2 hours
   startingGear: GermanSergeantGear
   icon: "JobIconISgt"
   supervisors: job-supervisors-cpt
@@ -105,9 +107,9 @@
   icon: "JobIconSoldier"
   supervisors: job-supervisors-cpt
   requirements:
-    - !type:RoleTimeRequirement
-      role: JobGermanRifleman
-      time: 3600 # 1 hour
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsEnlisted
+      time: 3600 # 1 hours
   ranks:
     RankLanceCorporal:
       - !type:RoleTimeRequirement
@@ -227,9 +229,9 @@
   icon: "JobIconMg"
   supervisors: job-supervisors-cpt
   requirements:
-    - !type:RoleTimeRequirement
-      role: JobGermanRifleman
-      time: 3600 # 1 hour
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsEnlisted
+      time: 3600 # 1 hours
   ranks:
     RankLanceCorporal:
       - !type:RoleTimeRequirement
@@ -288,6 +290,11 @@
   startingGear: GermanMedicGear
   icon: "JobIconMedic"
   supervisors: job-supervisors-cpt
+  requirements:
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsEnlisted
+      # time: 9000 # 2.5 hours
+      time: 3600 # 1 hour temporarily until people build up playtime
   ranks:
     RankSergeant:
       - !type:RoleTimeRequirement

+ 17 - 10
Resources/Prototypes/Civ14/Roles/Jobs/TDM/soviet.yml

@@ -6,8 +6,9 @@
   description: job-description-civ-soviet-cpt
   playTimeTracker: JobSovietCaptain
   requirements:
-    - !type:OverallPlaytimeRequirement
-      time: 10800 #3 hrs
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsSquadLeader
+      time: 7200 # 2 hours
   startingGear: SovietCaptainGear
   icon: "JobIconICpt"
   supervisors: job-supervisors-nobody
@@ -49,8 +50,9 @@
   description: job-description-civ-soviet-sgt
   playTimeTracker: JobSovietSergeant
   requirements:
-    - !type:OverallPlaytimeRequirement
-      time: 5400 #1.5 hrs
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsEnlisted
+      time: 7200 # 2 hours
   startingGear: SovietSergeantGear
   icon: "JobIconISgt"
   supervisors: job-supervisors-cpt
@@ -103,9 +105,9 @@
   icon: "JobIconSoldier"
   supervisors: job-supervisors-cpt
   requirements:
-    - !type:RoleTimeRequirement
-      role: JobSovietRifleman
-      time: 3600 # 1 hour
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsEnlisted
+      time: 3600 # 1 hours
   ranks:
     RankLanceCorporal:
       - !type:RoleTimeRequirement
@@ -230,9 +232,9 @@
   icon: "JobIconMg"
   supervisors: job-supervisors-cpt
   requirements:
-    - !type:RoleTimeRequirement
-      role: JobSovietRifleman
-      time: 3600 # 1 hour
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsEnlisted
+      time: 3600 # 1 hours
   ranks:
     RankLanceCorporal:
       - !type:RoleTimeRequirement
@@ -295,6 +297,11 @@
   startingGear: SovietMedicGear
   icon: "JobIconMedic"
   supervisors: job-supervisors-cpt
+  requirements:
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsEnlisted
+      # time: 9000 # 2.5 hours
+      time: 3600 # 1 hour temporarily until people build up playtime
   ranks:
     RankSergeant:
       - !type:RoleTimeRequirement

+ 15 - 4
Resources/Prototypes/Civ14/Roles/Jobs/TDM/sovietCW.yml

@@ -6,8 +6,9 @@
   description: job-description-civ-sovietcw-cpt
   playTimeTracker: JobSovietCWCaptain
   requirements:
-    - !type:OverallPlaytimeRequirement
-      time: 10800 #3 hrs
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsSquadLeader
+      time: 7200 # 2 hours
   startingGear: SovietCWCaptainGear
   icon: "JobIconICpt"
   supervisors: job-supervisors-nobody
@@ -52,8 +53,9 @@
   description: job-description-civ-sovietcw-sgt
   playTimeTracker: JobSovietCWSergeant
   requirements:
-    - !type:OverallPlaytimeRequirement
-      time: 5400 #1.5 hrs
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsEnlisted
+      time: 7200 # 2 hours
   startingGear: SovietCWSergeantGear
   icon: "JobIconISgt"
   supervisors: job-supervisors-cpt
@@ -170,6 +172,10 @@
   randomStartingGears: [SovietCWMachinegunnerGear, SovietCWMachinegunnerGear2]
   icon: "JobIconMg"
   supervisors: job-supervisors-cpt
+  requirements:
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsEnlisted
+      time: 3600 # 1 hours
   ranks:
     RankLanceCorporal:
       - !type:RoleTimeRequirement
@@ -234,6 +240,11 @@
   startingGear: SovietCWMedicGear
   icon: "JobIconMedic"
   supervisors: job-supervisors-cpt
+  requirements:
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsEnlisted
+      # time: 9000 # 2.5 hours
+      time: 3600 # 1 hour temporarily until people build up playtime
   ranks:
     RankSergeant:
       - !type:RoleTimeRequirement

+ 15 - 4
Resources/Prototypes/Civ14/Roles/Jobs/TDM/usa.yml

@@ -6,8 +6,9 @@
   description: job-description-civ-us-cpt
   playTimeTracker: JobUSCaptain
   requirements:
-    - !type:OverallPlaytimeRequirement
-      time: 10800 #3 hrs
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsSquadLeader
+      time: 7200 # 2 hours
   startingGear: USCaptainGear
   icon: "JobIconICpt"
   supervisors: job-supervisors-nobody
@@ -49,8 +50,9 @@
   description: job-description-civ-us-sergeant
   playTimeTracker: JobUSSergeant
   requirements:
-    - !type:OverallPlaytimeRequirement
-      time: 5400 #1.5 hrs
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsEnlisted
+      time: 7200 # 2 hours
   startingGear: USSergeantGear
   icon: "JobIconISgt"
   supervisors: job-supervisors-cpt
@@ -164,6 +166,10 @@
   randomStartingGears: [USMachinegunnerGear, USMachinegunnerGear2]
   icon: "JobIconMg"
   supervisors: job-supervisors-cpt
+  requirements:
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsEnlisted
+      time: 3600 # 1 hours
   ranks:
     RankLanceCorporal:
       - !type:RoleTimeRequirement
@@ -225,6 +231,11 @@
   startingGear: USMedicGear
   icon: "JobIconMedic"
   supervisors: job-supervisors-cpt
+  requirements:
+    - !type:TotalJobsTimeRequirement
+      group: CivJobsEnlisted
+      # time: 9000 # 2.5 hours
+      time: 3600 # 1 hour temporarily until people build up playtime
   ranks:
     RankSergeant:
       - !type:RoleTimeRequirement

+ 75 - 0
Resources/Prototypes/Civ14/Roles/Jobs/jobgroups.yml

@@ -0,0 +1,75 @@
+- type: entity
+  id: CivJobsEnlisted
+  categories:
+    - HideSpawnMenu
+  components:
+    - type: JobGroup
+      name: role-timer-enlisted-roles
+      color: "#A66300"
+      jobs:
+        - SovietCWRifleman
+        - SovietCWMachinegunner
+        - SovietRifleman
+        - SovietMachinegunner
+        - SovietSubmachineGunner
+        - USRifleman
+        - USMachinegunner
+        - GermanRifleman
+        - GermanMachinegunner
+        - GermanSubmachineGunner
+
+- type: entity
+  id: CivJobsEnlistedRifleman
+  categories:
+    - HideSpawnMenu
+  components:
+    - type: JobGroup
+      name: role-timer-rifleman-roles
+      color: "#A66300"
+      jobs:
+        - SovietCWRifleman
+        - SovietRifleman
+        - USRifleman
+        - GermanRifleman
+
+- type: entity
+  id: CivJobsMedical
+  categories:
+    - HideSpawnMenu
+  components:
+    - type: JobGroup
+      name: role-timer-medical-roles
+      color: "#a60019"
+      jobs:
+        - SovietMedic
+        - SovietCWMedic
+        - USMedic
+        - GermanMedic
+
+- type: entity
+  id: CivJobsSquadLeader
+  categories:
+    - HideSpawnMenu
+  components:
+    - type: JobGroup
+      name: role-timer-squad-leader-roles
+      color: "#1967ba"
+      jobs:
+        - SovietSergeant
+        - SovietCWSergeant
+        - USSergeant
+        - GermanSergeant
+
+- type: entity
+  id: CivJobsOfficer
+  categories:
+    - HideSpawnMenu
+  components:
+    - type: JobGroup
+      name: role-timer-officer-roles
+      color: "#1967ba"
+      jobs:
+        - SovietCaptain
+        - SovietCWCaptain
+        - USCaptain
+        - GermanCaptain

+ 4 - 4
Resources/Prototypes/Civ14/Tiles/floors.yml

@@ -71,7 +71,7 @@
   name: thatch floor
   sprite: /Textures/Civ14/Structures/Floors/wood.rsi/thatch2.png
   variants: 1
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -167,7 +167,7 @@
   name: ancient road
   sprite: /Textures/Civ14/Structures/Floors/roads.rsi/r_roadfull.png
   variants: 1
-  baseTurf: Plating
+  baseTurf: FloorDirt
   weather: true
   isSubfloor: false
   deconstructTools: [Prying]
@@ -239,7 +239,7 @@
   name: cobblestone floor
   sprite: /Textures/Civ14/Objects/floors.rsi/cobble_vertical_dark.png
   variants: 1
-  baseTurf: Plating
+  baseTurf: FloorDirt
   weather: true
   isSubfloor: false
   deconstructTools: [Prying]
@@ -311,7 +311,7 @@
   name: bridge
   sprite: /Textures/Civ14/Structures/Floors/wood.rsi/woodalt7.png
   variants: 1
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:

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

@@ -60,6 +60,9 @@
     - type: SolutionContainerVisuals
       maxFillLevels: 1
       fillBaseName: solution
+    - type: StunOnCollide
+      stunAmount: 2
+      knockdownAmount: 1
 
 - type: entity
   parent: BaseArrow

+ 103 - 103
Resources/Prototypes/Tiles/floors.yml

@@ -8,7 +8,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -26,7 +26,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -44,7 +44,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -62,7 +62,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -80,7 +80,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -98,7 +98,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -110,7 +110,7 @@
   id: FloorSteelOffset
   name: tiles-steel-floor-offset
   sprite: /Textures/Tiles/steel_offset.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -128,7 +128,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -146,7 +146,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -164,7 +164,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -182,7 +182,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -194,7 +194,7 @@
   id: FloorBrassFilled
   name: tiles-brass-floor-filled
   sprite: /Textures/Tiles/Misc/clockwork/clockwork_floor_filled.png
-  baseTurf: PlatingBrass
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -206,7 +206,7 @@
   id: FloorBrassReebe
   name: tiles-brass-floor-reebe
   sprite: /Textures/Tiles/Misc/clockwork/reebe.png
-  baseTurf: PlatingBrass
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -224,7 +224,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -242,7 +242,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -263,7 +263,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -281,7 +281,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -299,7 +299,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -317,7 +317,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -329,7 +329,7 @@
   id: FloorWhiteOffset
   name: tiles-white-floor-offset
   sprite: /Textures/Tiles/white_offset.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -347,7 +347,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -365,7 +365,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -383,7 +383,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -401,7 +401,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -419,7 +419,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -437,7 +437,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -455,7 +455,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -473,7 +473,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -491,7 +491,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -503,7 +503,7 @@
   id: FloorDarkOffset
   name: tiles-dark-floor-offset
   sprite: /Textures/Tiles/dark_offset.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -521,7 +521,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -539,7 +539,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -557,7 +557,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -575,7 +575,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -593,7 +593,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -605,7 +605,7 @@
   id: FloorTechMaint
   name: tiles-techmaint-floor
   sprite: /Textures/Tiles/tech_maint.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -617,7 +617,7 @@
   id: FloorReinforced
   name: tiles-reinforced-floor
   sprite: /Textures/Tiles/reinforced.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -629,7 +629,7 @@
   id: FloorMono
   name: tiles-mono-floor
   sprite: /Textures/Tiles/mono.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -641,7 +641,7 @@
   id: FloorLino
   name: tiles-linoleum-floor
   sprite: /Textures/Tiles/lino.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -653,7 +653,7 @@
   id: FloorSteelDirty
   name: tiles-dirty-steel-floor
   sprite: /Textures/Tiles/steel_dirty.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -665,7 +665,7 @@
   id: FloorElevatorShaft
   name: tiles-elevator-shaft
   sprite: /Textures/Tiles/elevator_shaft.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -677,7 +677,7 @@
   id: FloorMetalDiamond
   name: tiles-diamond-plate-floor
   sprite: /Textures/Tiles/metaldiamond.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -689,7 +689,7 @@
   id: FloorRockVault
   name: tiles-rock-floor
   sprite: /Textures/Tiles/rock_vault.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -701,7 +701,7 @@
   id: FloorBlue
   name: tiles-blue-tile
   sprite: /Textures/Tiles/blue.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -719,7 +719,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -731,7 +731,7 @@
   id: FloorMining
   name: tiles-mining-tile
   sprite: /Textures/Tiles/mining_floor.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -743,7 +743,7 @@
   id: FloorMiningDark
   name: tiles-mining-dark-tile
   sprite: /Textures/Tiles/mining_floor_dark.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -755,7 +755,7 @@
   id: FloorMiningLight
   name: tiles-mining-light-tile
   sprite: /Textures/Tiles/mining_floor_light.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -768,7 +768,7 @@
   id: FloorFreezer
   name: tiles-freezer
   sprite: /Textures/Tiles/freezer.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -780,7 +780,7 @@
   id: FloorShowroom
   name: tiles-showroom-floor
   sprite: /Textures/Tiles/showroom.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -792,7 +792,7 @@
   id: FloorHydro
   name: tiles-hydro-floor
   sprite: /Textures/Tiles/hydro.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -810,7 +810,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -822,7 +822,7 @@
   id: FloorClown
   name: tiles-clown-floor
   sprite: /Textures/Tiles/clown.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -834,7 +834,7 @@
   id: FloorMime
   name: tiles-mime-floor
   sprite: /Textures/Tiles/mime.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -846,7 +846,7 @@
   id: FloorKitchen
   name: tiles-kitchen-floor
   sprite: /Textures/Tiles/kitchen.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -858,7 +858,7 @@
   id: FloorLaundry
   name: tiles-laundry-floor
   sprite: /Textures/Tiles/laundry.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -877,7 +877,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -896,7 +896,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -914,7 +914,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -932,7 +932,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -950,7 +950,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -968,7 +968,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -986,7 +986,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1004,7 +1004,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1022,7 +1022,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1040,7 +1040,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1053,7 +1053,7 @@
   id: FloorArcadeBlue
   name: tiles-blue-arcade-floor
   sprite: /Textures/Tiles/arcadeblue.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1068,7 +1068,7 @@
   id: FloorArcadeBlue2
   name: tiles-blue-arcade-floor
   sprite: /Textures/Tiles/arcadeblue2.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1083,7 +1083,7 @@
   id: FloorArcadeRed
   name: tiles-red-arcade-floor
   sprite: /Textures/Tiles/arcadered.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1098,7 +1098,7 @@
   id: FloorEighties
   name: tiles-eighties-floor
   sprite: /Textures/Tiles/eighties.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1113,7 +1113,7 @@
   id: FloorCarpetClown
   name: tiles-clown-carpet-floor
   sprite: /Textures/Tiles/carpetclown.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1128,7 +1128,7 @@
   id: FloorCarpetOffice
   name: tiles-office-carpet-floor
   sprite: /Textures/Tiles/carpetoffice.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1149,7 +1149,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1168,7 +1168,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1188,7 +1188,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1206,7 +1206,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1224,7 +1224,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1242,7 +1242,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1260,7 +1260,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1278,7 +1278,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1296,7 +1296,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1309,7 +1309,7 @@
   id: FloorGold
   name: tiles-gold-tile
   sprite: /Textures/Tiles/gold.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1321,7 +1321,7 @@
   id: FloorSilver
   name: tiles-silver-tile
   sprite: /Textures/Tiles/silver.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1339,7 +1339,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1357,7 +1357,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1372,7 +1372,7 @@
   variants: 1
   placementVariants:
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1385,7 +1385,7 @@
   id: FloorGreenCircuit
   name: tiles-green-circuit-floor
   sprite: /Textures/Tiles/green_circuit.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1397,7 +1397,7 @@
   id: FloorBlueCircuit
   name: tiles-blue-circuit-floor
   sprite: /Textures/Tiles/blue_circuit.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1409,7 +1409,7 @@
   id: FloorRedCircuit
   name: tiles-red-circuit-floor
   sprite: /Textures/Tiles/red_circuit.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1511,7 +1511,7 @@
   id: FloorGrassDry
   name: tiles-dry-grass-floor
   sprite: /Textures/Civ14/Structures/Floors/nature.rsi/dry_grass.png
-  baseTurf: FloorGrassDark
+  baseTurf: FloorDirt
   isSubfloor: true
   footstepSounds:
     collection: FootstepGrass
@@ -1649,7 +1649,7 @@
   id: FloorAsteroidTile
   name: tiles-asteroid-tile
   sprite: /Textures/Tiles/Asteroid/asteroid_tile.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1757,7 +1757,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1770,7 +1770,7 @@
   id: FloorTechMaint2
   name: tiles-techmaint2-floor
   sprite: /Textures/Tiles/steel_maint.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1788,7 +1788,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1806,7 +1806,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1829,7 +1829,7 @@
     - 1.0
     - 1.0
     - 1.0
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1843,7 +1843,7 @@
   id: FloorWebTile
   name: tiles-web
   sprite: /Textures/Tiles/Misc/Web/web_tile.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   footstepSounds:
@@ -1877,7 +1877,7 @@
   id: FloorHull
   name: tiles-hull
   sprite: /Textures/Tiles/hull.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   footstepSounds:
     collection: FootstepHull
@@ -1888,7 +1888,7 @@
   id: FloorHullReinforced
   name: tiles-hull-reinforced
   sprite: /Textures/Tiles/hull_reinforced.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   footstepSounds:
     collection: FootstepHull
@@ -1900,7 +1900,7 @@
   id: FloorReinforcedHardened
   name: tiles-super-reinforced-floor
   sprite: /Textures/Tiles/super_reinforced.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   footstepSounds:
     collection: FootstepHull
@@ -1911,7 +1911,7 @@
   id: FloorAstroIce
   name: tiles-astro-ice
   sprite: /Textures/Tiles/Planet/Snow/ice.png
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   friction: 0.05
@@ -1925,7 +1925,7 @@
   id: FloorAstroSnow
   name: tiles-astro-snow
   parent: FloorSnow
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   itemDrop: FloorTileItemAstroSnow
@@ -1935,7 +1935,7 @@
   id: FloorAstroAsteroidSand
   name: tiles-astro-asteroid-sand
   parent: FloorAsteroidSand
-  baseTurf: Plating
+  baseTurf: FloorDirt
   isSubfloor: false
   deconstructTools: [Prying]
   itemDrop: FloorTileItemAstroAsteroidSand

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff