Преглед изворни кода

QOL patch 2 (#232)

* trying to fix linter stuff

* destroyable barbwire, WIP ranks

* rank trackers

* rank corrections

* rank typos

* rank descs, fixes playtimetrackers

* more rolefixes

* role reqs

* yml fix
Taislin пре 6 месеци
родитељ
комит
e1ea025daa
33 измењених фајлова са 809 додато и 642 уклоњено
  1. 7 0
      Content.Client/_RMC14/Marines/Roles/Ranks/RankSystem.cs
  2. 75 0
      Content.Server/_RMC14/Marines/Roles/Ranks/RankSystem.cs
  3. 6 0
      Content.Shared/Roles/JobPrototype.cs
  4. 2 0
      Content.Shared/Roles/JobRequirement/RoleTimeRequirement.cs
  5. 12 0
      Content.Shared/_RMC14/Marines/Roles/Ranks/RankComponent.cs
  6. 49 0
      Content.Shared/_RMC14/Marines/Roles/Ranks/RankPrototype.cs
  7. 133 0
      Content.Shared/_RMC14/Marines/Roles/Ranks/SharedRankSystem.cs
  8. 4 0
      Resources/Locale/en-US/_RMC/ranks.ftl
  9. 0 14
      Resources/Maps/Test/dev_map.yml
  10. 0 18
      Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml
  11. 2 2
      Resources/Prototypes/Civ14/Entities/Markers/capturable_areas.yml
  12. 10 0
      Resources/Prototypes/Civ14/Entities/Structures/Walls/barbedwire.yml
  13. 1 1
      Resources/Prototypes/Civ14/Entities/Structures/Walls/barricades.yml
  14. 53 0
      Resources/Prototypes/Civ14/Roles/Jobs/Ranks/enlisted.yml
  15. 65 0
      Resources/Prototypes/Civ14/Roles/Jobs/Ranks/officers.yml
  16. 0 18
      Resources/Prototypes/Civ14/Roles/Jobs/TDM/english.yml
  17. 0 18
      Resources/Prototypes/Civ14/Roles/Jobs/TDM/french.yml
  18. 60 18
      Resources/Prototypes/Civ14/Roles/Jobs/TDM/german.yml
  19. 140 0
      Resources/Prototypes/Civ14/Roles/Jobs/TDM/playtimetrackers.yml
  20. 60 18
      Resources/Prototypes/Civ14/Roles/Jobs/TDM/soviet.yml
  21. 42 14
      Resources/Prototypes/Civ14/Roles/Jobs/TDM/sovietCW.yml
  22. 42 15
      Resources/Prototypes/Civ14/Roles/Jobs/TDM/usa.yml
  23. 0 0
      Resources/Prototypes/Civ14/Roles/Jobs/departments.yml
  24. 0 0
      Resources/Prototypes/Civ14/Roles/Jobs/nomad.yml
  25. 26 27
      Resources/Prototypes/Entities/Markers/Spawners/Random/techboard.yml
  26. 0 46
      Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml
  27. 0 27
      Resources/Prototypes/Entities/Objects/Misc/implanters.yml
  28. 0 43
      Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml
  29. 0 9
      Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
  30. 0 312
      Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml
  31. 0 3
      Resources/Prototypes/Recipes/Lathes/Packs/science.yml
  32. 0 15
      Resources/Prototypes/Recipes/Lathes/electronics.yml
  33. 20 24
      Resources/Prototypes/Research/experimental.yml

+ 7 - 0
Content.Client/_RMC14/Marines/Roles/Ranks/RankSystem.cs

@@ -0,0 +1,7 @@
+using Content.Shared._RMC14.Marines.Roles.Ranks;
+
+namespace Content.Client._RMC14.Marines.Roles.Ranks;
+
+public sealed class RankSystem : SharedRankSystem
+{
+}

+ 75 - 0
Content.Server/_RMC14/Marines/Roles/Ranks/RankSystem.cs

@@ -0,0 +1,75 @@
+using Content.Server.Players.PlayTimeTracking;
+using Content.Shared._RMC14.Marines.Roles.Ranks;
+using Content.Shared.Chat;
+using Content.Shared.GameTicking;
+using Content.Shared.Roles;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server._RMC14.Marines.Roles.Ranks;
+
+public sealed class RankSystem : SharedRankSystem
+{
+    [Dependency] private readonly PlayTimeTrackingManager _tracking = default!;
+    [Dependency] private readonly IPrototypeManager _prototypes = default!;
+    [Dependency] private readonly IEntityManager _entityManager = default!;
+
+    public override void Initialize()
+    {
+        base.Initialize();
+
+        SubscribeLocalEvent<RankComponent, TransformSpeakerNameEvent>(OnSpeakerNameTransform);
+        SubscribeLocalEvent<PlayerSpawnCompleteEvent>(OnPlayerSpawnComplete);
+    }
+
+    private void OnSpeakerNameTransform(Entity<RankComponent> ent, ref TransformSpeakerNameEvent args)
+    {
+        var name = GetSpeakerRankName(ent);
+        if (name == null)
+            return;
+
+        args.VoiceName = name;
+    }
+
+    private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent ev)
+    {
+        if (ev.JobId == null)
+            return;
+
+        if (!_prototypes.TryIndex<JobPrototype>(ev.JobId, out var jobPrototype))
+            return;
+
+        if (jobPrototype.Ranks == null)
+            return;
+
+        if (!_tracking.TryGetTrackerTimes(ev.Player, out var playTimes))
+        {
+            // Playtimes haven't loaded.
+            Log.Error($"Playtimes weren't ready yet for {ev.Player} on roundstart!");
+            playTimes ??= new Dictionary<string, TimeSpan>();
+        }
+
+        foreach (var rank in jobPrototype.Ranks)
+        {
+            var failed = false;
+            var jobRequirements = rank.Value;
+
+            if (_prototypes.TryIndex<RankPrototype>(rank.Key, out var rankPrototype) && rankPrototype != null)
+            {
+                if (jobRequirements != null)
+                {
+                    foreach (var req in jobRequirements)
+                    {
+                        if (!req.Check(_entityManager, _prototypes, ev.Profile, playTimes, out _))
+                            failed = true;
+                    }
+                }
+
+                if (!failed)
+                {
+                    SetRank(ev.Mob, rankPrototype);
+                    break;
+                }
+            }
+        }
+    }
+}

+ 6 - 0
Content.Shared/Roles/JobPrototype.cs

@@ -4,6 +4,7 @@
 using Content.Shared.StatusIcon;
 using Robust.Shared.Prototypes;
 using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
+using Content.Shared._RMC14.Marines.Roles.Ranks;
 
 namespace Content.Shared.Roles
 {
@@ -168,6 +169,11 @@ public sealed partial class JobPrototype : IPrototype
         /// </summary>
         [DataField]
         public List<ProtoId<GuideEntryPrototype>>? Guides;
+
+        //RMC Ranks
+        [DataField]
+        public readonly Dictionary<ProtoId<RankPrototype>, HashSet<JobRequirement>?>? Ranks;
+
     }
 
     /// <summary>

+ 2 - 0
Content.Shared/Roles/JobRequirement/RoleTimeRequirement.cs

@@ -54,7 +54,9 @@ public sealed partial class RoleTimeRequirement : JobRequirement
         if (!Inverted)
         {
             if (roleDiff <= 0)
+            {
                 return true;
+            }
 
             reason = FormattedMessage.FromMarkupPermissive(Loc.GetString(
                 "role-timer-role-insufficient",

+ 12 - 0
Content.Shared/_RMC14/Marines/Roles/Ranks/RankComponent.cs

@@ -0,0 +1,12 @@
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared._RMC14.Marines.Roles.Ranks;
+
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+[Access(typeof(SharedRankSystem))]
+public sealed partial class RankComponent : Component
+{
+    [DataField, AutoNetworkedField]
+    public ProtoId<RankPrototype>? Rank;
+}

+ 49 - 0
Content.Shared/_RMC14/Marines/Roles/Ranks/RankPrototype.cs

@@ -0,0 +1,49 @@
+using Content.Shared.Roles;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Array;
+
+namespace Content.Shared._RMC14.Marines.Roles.Ranks;
+
+/// <summary>
+///     Used for cosmetic ranks.
+/// </summary>
+[Prototype]
+public sealed partial class RankPrototype : IPrototype, IInheritingPrototype
+{
+    [ParentDataField(typeof(AbstractPrototypeIdArraySerializer<RankPrototype>))]
+    public string[]? Parents { get; }
+
+    [NeverPushInheritance]
+    [AbstractDataField]
+    public bool Abstract { get; }
+
+    [ViewVariables]
+    [IdDataField]
+    public string ID { get; private set; } = default!;
+
+    /// <summary>
+    ///     The name of the rank.
+    /// </summary>
+    [AlwaysPushInheritance]
+    [DataField(required: true)]
+    public string Name { get; set; } = default!;
+
+    /// <summary>
+    ///     The shortened version of the rank.
+    /// </summary>
+    [AlwaysPushInheritance]
+    [DataField(required: true)]
+    public string Prefix { get; set; } = default!;
+
+    [AlwaysPushInheritance]
+    [DataField]
+    public string? MalePrefix { get; set; }
+
+    [AlwaysPushInheritance]
+    [DataField]
+    public string? FemalePrefix { get; set; }
+
+    [AlwaysPushInheritance]
+    [DataField]
+    public string? Paygrade { get; set; }
+}

+ 133 - 0
Content.Shared/_RMC14/Marines/Roles/Ranks/SharedRankSystem.cs

@@ -0,0 +1,133 @@
+using Content.Shared.Examine;
+using Content.Shared.Humanoid;
+using Robust.Shared.Enums;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared._RMC14.Marines.Roles.Ranks;
+
+public abstract class SharedRankSystem : EntitySystem
+{
+    [Dependency] private readonly IPrototypeManager _prototypes = default!;
+
+    public override void Initialize()
+    {
+        base.Initialize();
+
+        SubscribeLocalEvent<RankComponent, ExaminedEvent>(OnRankExamined);
+    }
+
+    private void OnRankExamined(Entity<RankComponent> ent, ref ExaminedEvent args)
+    {
+        using (args.PushGroup(nameof(SharedRankSystem), 1))
+        {
+            var user = ent.Owner;
+            var rank = GetRankString(user, hasPaygrade: true);
+
+            if (rank != null)
+            {
+                var finalString = Loc.GetString("rmc-rank-component-examine", ("user", user), ("rank", rank));
+                args.PushMarkup(finalString);
+            }
+        }
+    }
+
+    /// <summary>
+    ///     Sets a mob's rank from the given RankPrototype.
+    /// </summary>
+    public void SetRank(EntityUid uid, RankPrototype from)
+    {
+        SetRank(uid, from.ID);
+    }
+
+    /// <summary>
+    ///     Sets a mob's rank from the given RankPrototype.
+    /// </summary>
+    public void SetRank(EntityUid uid, ProtoId<RankPrototype> from)
+    {
+        var comp = EnsureComp<RankComponent>(uid);
+        comp.Rank = from;
+        Dirty(uid, comp);
+    }
+
+    /// <summary>
+    ///     Gets the rank of a given mob.
+    /// </summary>
+    public RankPrototype? GetRank(EntityUid uid)
+    {
+        if (TryComp<RankComponent>(uid, out var component))
+            return GetRank(component);
+
+        return null;
+    }
+
+    /// <summary>
+    ///     Gets a RankPrototype from a RankComponent.
+    /// </summary>
+    public RankPrototype? GetRank(RankComponent component)
+    {
+        if (_prototypes.TryIndex<RankPrototype>(component.Rank, out var rankProto) && rankProto != null)
+            return rankProto;
+
+        return null;
+    }
+
+    /// <summary>
+    ///     Gets the rank name of a given mob.
+    /// </summary>
+    public string? GetRankString(EntityUid uid, bool isShort = false, bool hasPaygrade = false)
+    {
+        var rank = GetRank(uid);
+        if (rank == null)
+            return null;
+
+        if (isShort)
+        {
+            if (rank.FemalePrefix == null || rank.MalePrefix == null)
+                return rank.Prefix;
+
+            if (!TryComp<HumanoidAppearanceComponent>(uid, out var humanoidAppearance))
+                return rank.Prefix;
+
+            var genderPrefix = humanoidAppearance.Gender switch
+            {
+                Gender.Female => rank.FemalePrefix,
+                Gender.Male => rank.MalePrefix,
+                Gender.Epicene or Gender.Neuter or _ => rank.Prefix
+            };
+
+            return genderPrefix;
+        }
+        else if (hasPaygrade && rank.Paygrade != null)
+        {
+            return "(" + rank.Paygrade + ")" + " " + rank.Name;
+        }
+        else
+        {
+            return rank.Name;
+        }
+    }
+
+    /// <summary>
+    ///     Gets the prefix rank name. (ex. Maj John Marine)
+    /// </summary>
+    public string? GetSpeakerRankName(EntityUid uid)
+    {
+        var rank = GetRankString(uid, true);
+        if (rank == null)
+            return null;
+
+        return rank + " " + Name(uid);
+    }
+
+    /// <summary>
+    ///     Gets the prefix full name. (ex. Major John Marine)
+    /// </summary>
+    public string? GetSpeakerFullRankName(EntityUid uid)
+    {
+        var rank = GetRankString(uid);
+        if (rank == null)
+            return null;
+
+        return rank + " " + Name(uid);
+    }
+}

+ 4 - 0
Resources/Locale/en-US/_RMC/ranks.ftl

@@ -0,0 +1,4 @@
+rmc-rank-component-examine = { CAPITALIZE(SUBJECT($user)) } { GENDER($user) ->
+    [epicene] hold
+    *[other] holds
+  } the rank of [color=white]{ $rank }[/color].

+ 0 - 14
Resources/Maps/Test/dev_map.yml

@@ -5285,20 +5285,6 @@ entities:
           - type: Transform
             pos: 5.5,-7.5
             parent: 179
-  - proto: MachineAnomalyGenerator
-    entities:
-      - uid: 1071
-        components:
-          - type: Transform
-            pos: 16.5,25.5
-            parent: 179
-  - proto: MachineAnomalyVessel
-    entities:
-      - uid: 1087
-        components:
-          - type: Transform
-            pos: 15.5,19.5
-            parent: 179
   - proto: MachineArtifactAnalyzer
     entities:
       - uid: 1078

+ 0 - 18
Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml

@@ -50,24 +50,6 @@
         - state: box_of_doom
         - state: throwing_knives
 
-- type: entity
-  name: deathrattle implant box
-  parent: [BoxCardboard]
-  id: BoxDeathRattleImplants
-  description: Six deathrattle implants for the whole squad.
-  components:
-    - type: Sprite
-      layers:
-        - state: box_of_doom
-        - state: syringe
-    - type: Storage
-      grid:
-        - 0,0,5,3
-    - type: StorageFill
-      contents:
-        - id: DeathRattleImplanter
-          amount: 6
-
 - type: entity
   parent: [BoxCardboard]
   id: CombatBakeryKit

+ 2 - 2
Resources/Prototypes/Civ14/Entities/Markers/capturable_areas.yml

@@ -57,7 +57,7 @@
       state: capture_blue
     - type: CaptureArea
       name: "the Main House"
-      captureDuration: 240 # 4 min
+      captureDuration: 240 # 3 min
       captureRadius: 5
       contestedResetTime: 10 # 10 seconds before timer resets when contested
       capturableFactions:
@@ -74,7 +74,7 @@
       state: capture_red
     - type: CaptureArea
       name: "the command post"
-      captureDuration: 240 # 4 min
+      captureDuration: 180 # 3 min
       captureRadius: 4
       contestedResetTime: 10 # 10 seconds before timer resets when contested
       capturableFactions:

+ 10 - 0
Resources/Prototypes/Civ14/Entities/Structures/Walls/barbedwire.yml

@@ -43,6 +43,16 @@
       slipSound:
         path: /Audio/Effects/glass_step.ogg
       launchForwardsMultiplier: 0
+    - type: Damageable
+      damageModifierSet: Metallic
+      damageContainer: StructuralInorganic
+    - type: Destructible
+      thresholds:
+        - trigger: !type:DamageTrigger
+            damage: 220
+          behaviors:
+            - !type:DoActsBehavior
+              acts: ["Destruction"]
     - type: Construction
       graph: Barbedwire
       node: end

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

@@ -77,7 +77,7 @@
       fixtures:
         fix1:
           shape: !type:PhysShapeAabb
-            bounds: "-0.49,-0.45,0.49,-0.02"
+            bounds: "-0.49,-0.45,0.49,-0.15"
           mask:
             - FullTileMask
           layer:

+ 53 - 0
Resources/Prototypes/Civ14/Roles/Jobs/Ranks/enlisted.yml

@@ -0,0 +1,53 @@
+- type: rank
+  id: RankSergeantMajor
+  name: Sergeant Major
+  prefix: SgtMaj.
+  paygrade: E9
+
+- type: rank
+  id: RankFirstSergeant
+  name: First Sergeant
+  prefix: 1stSgt.
+  paygrade: E8
+
+- type: rank
+  id: RankMasterSergeant
+  name: Master Sergeant
+  prefix: MSgt.
+  paygrade: E7
+
+- type: rank
+  id: RankStaffSergeant
+  name: Staff Sergeant
+  prefix: SSgt.
+  paygrade: E6
+
+- type: rank
+  id: RankSergeant
+  name: Sergeant
+  prefix: Sgt.
+  paygrade: E5
+
+- type: rank
+  id: RankCorporal
+  name: Corporal
+  prefix: Cpl.
+  paygrade: E4
+
+- type: rank
+  id: RankLanceCorporal
+  name: Lance Corporal
+  prefix: LCpl.
+  paygrade: E3
+
+- type: rank
+  id: RankPrivateFirstClass
+  name: Private First Class
+  prefix: Pfc.
+  paygrade: E2
+
+- type: rank
+  id: RankPrivate
+  name: Private
+  prefix: Pvt.
+  paygrade: E1

+ 65 - 0
Resources/Prototypes/Civ14/Roles/Jobs/Ranks/officers.yml

@@ -0,0 +1,65 @@
+- type: rank
+  id: RankFieldMarshal
+  name: Field Marshal
+  prefix: FM.
+  paygrade: O11
+
+- type: rank
+  id: RankGeneral
+  name: General
+  prefix: Gen.
+  paygrade: O10
+
+- type: rank
+  id: RankLieutenantGeneral
+  name: Lieutenant General
+  prefix: LtGen.
+  paygrade: O9
+
+- type: rank
+  id: RankMajorGeneral
+  name: Major General
+  prefix: MajGen.
+  paygrade: O8
+
+- type: rank
+  id: RankBrigadierGeneral
+  name: Brigadier General
+  prefix: BGen.
+  paygrade: O7
+
+- type: rank
+  id: RankColonel
+  name: Colonel
+  prefix: Col.
+  paygrade: O6
+
+- type: rank
+  id: RankLieutenantColonel
+  name: Lieutenant Colonel
+  prefix: LtCol.
+  paygrade: O5
+
+- type: rank
+  id: RankMajor
+  name: Major
+  prefix: Maj.
+  paygrade: O4
+
+- type: rank
+  id: RankCaptain
+  name: Captain
+  prefix: Capt.
+  paygrade: O3
+
+- type: rank
+  id: RankFirstLT
+  name: First Lieutenant
+  prefix: 1stLt.
+  paygrade: O2
+
+- type: rank
+  id: RankSecondLT
+  name: Second Lieutenant
+  prefix: 2ndLt.
+  paygrade: O1

+ 0 - 18
Resources/Prototypes/Roles/Jobs/Civ14/TDM/english.yml → Resources/Prototypes/Civ14/Roles/Jobs/TDM/english.yml

@@ -21,9 +21,6 @@
         - type: ShowFactionIcons
           factionIcon: EnglishFaction
 
-- type: playTimeTracker
-  id: JobEnglishLord
-
 - type: startingGear
   id: EnglishLordGear
   equipment:
@@ -58,9 +55,6 @@
         - type: ShowFactionIcons
           factionIcon: EnglishFaction
 
-- type: playTimeTracker
-  id: JobEnglishKnight
-
 - type: startingGear
   id: EnglishKnightGear
   equipment:
@@ -96,9 +90,6 @@
         - type: ShowFactionIcons
           factionIcon: EnglishFaction
 
-- type: playTimeTracker
-  id: JobEnglishSwordsman
-
 - type: startingGear
   id: EnglishSwordsmanGear
   equipment:
@@ -144,9 +135,6 @@
         - type: ShowFactionIcons
           factionIcon: EnglishFaction
 
-- type: playTimeTracker
-  id: JobEnglishSpearman
-
 - type: startingGear
   id: EnglishSpearmanGear
   equipment:
@@ -192,9 +180,6 @@
         - type: ShowFactionIcons
           factionIcon: EnglishFaction
 
-- type: playTimeTracker
-  id: JobEnglishRanged
-
 - type: startingGear
   id: EnglishRangedGear
   equipment:
@@ -267,9 +252,6 @@
         - type: ShowFactionIcons
           factionIcon: EnglishFaction
 
-- type: playTimeTracker
-  id: JobEnglishMedic
-
 - type: startingGear
   id: EnglishMedicGear
   equipment:

+ 0 - 18
Resources/Prototypes/Roles/Jobs/Civ14/TDM/french.yml → Resources/Prototypes/Civ14/Roles/Jobs/TDM/french.yml

@@ -21,9 +21,6 @@
         - type: ShowFactionIcons
           factionIcon: FrenchFaction
 
-- type: playTimeTracker
-  id: JobFrenchLord
-
 - type: startingGear
   id: FrenchLordGear
   equipment:
@@ -57,9 +54,6 @@
         - type: ShowFactionIcons
           factionIcon: FrenchFaction
 
-- type: playTimeTracker
-  id: JobFrenchKnight
-
 - type: startingGear
   id: FrenchKnightGear
   equipment:
@@ -95,9 +89,6 @@
         - type: ShowFactionIcons
           factionIcon: FrenchFaction
 
-- type: playTimeTracker
-  id: JobFrenchSwordsman
-
 - type: startingGear
   id: FrenchSwordsmanGear
   equipment:
@@ -143,9 +134,6 @@
         - type: ShowFactionIcons
           factionIcon: FrenchFaction
 
-- type: playTimeTracker
-  id: JobFrenchSpearman
-
 - type: startingGear
   id: FrenchSpearmanGear
   equipment:
@@ -192,9 +180,6 @@
         - type: ShowFactionIcons
           factionIcon: FrenchFaction
 
-- type: playTimeTracker
-  id: JobFrenchRanged
-
 - type: startingGear
   id: FrenchRangedGear
   equipment:
@@ -267,9 +252,6 @@
         - type: ShowFactionIcons
           factionIcon: FrenchFaction
 
-- type: playTimeTracker
-  id: JobFrenchMedic
-
 - type: startingGear
   id: FrenchMedicGear
   equipment:

+ 60 - 18
Resources/Prototypes/Roles/Jobs/Civ14/TDM/german.yml → Resources/Prototypes/Civ14/Roles/Jobs/TDM/german.yml

@@ -11,6 +11,12 @@
   startingGear: GermanCaptainGear
   icon: "JobIconICpt"
   supervisors: job-supervisors-nobody
+  ranks:
+    RankMajor:
+      - !type:RoleTimeRequirement
+        role: JobGermanCaptain
+        time: 18000 # 5 hours
+    RankCaptain: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -23,9 +29,6 @@
           jobIcon: JobIconICpt
           assignSquad: false
 
-- type: playTimeTracker
-  id: JobGermanCaptain
-
 - type: startingGear
   id: GermanCaptainGear
   equipment:
@@ -53,6 +56,16 @@
   startingGear: GermanSergeantGear
   icon: "JobIconISgt"
   supervisors: job-supervisors-cpt
+  ranks:
+    RankSergeantMajor:
+      - !type:RoleTimeRequirement
+        role: JobGermanSergeant
+        time: 36000 # 10 hours
+    RankStaffSergeant:
+      - !type:RoleTimeRequirement
+        role: JobGermanSergeant
+        time: 10800 # 3 hours
+    RankSergeant: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -65,9 +78,6 @@
           jobIcon: JobIconISgt
           assignSquad: true
 
-- type: playTimeTracker
-  id: JobGermanSergeant
-
 - type: startingGear
   id: GermanSergeantGear
   equipment:
@@ -94,6 +104,20 @@
   randomStartingGears: [GermanSubmachineGunnerGear, GermanSubmachineGunnerGear2]
   icon: "JobIconSoldier"
   supervisors: job-supervisors-cpt
+  requirements:
+    - !type:RoleTimeRequirement
+      role: JobGermanRifleman
+      time: 3600 # 1 hour
+  ranks:
+    RankLanceCorporal:
+      - !type:RoleTimeRequirement
+        role: JobGermanSubmachineGunner
+        time: 36000 # 10 hours
+    RankPrivateFirstClass:
+      - !type:RoleTimeRequirement
+        role: JobGermanSubmachineGunner
+        time: 10800 # 3 hours
+    RankPrivate: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -106,9 +130,6 @@
           jobIcon: JobIconRifleman
           assignSquad: true
 
-- type: playTimeTracker
-  id: JobGermanSubmachineGunner
-
 - type: startingGear
   id: GermanSubmachineGunnerGear
   equipment:
@@ -146,6 +167,16 @@
   randomStartingGears: [GermanRiflemanGear, GermanRiflemanGear2]
   icon: "JobIconSoldier"
   supervisors: job-supervisors-cpt
+  ranks:
+    RankLanceCorporal:
+      - !type:RoleTimeRequirement
+        role: JobGermanRifleman
+        time: 36000 # 10 hours
+    RankPrivateFirstClass:
+      - !type:RoleTimeRequirement
+        role: JobGermanRifleman
+        time: 10800 # 3 hours
+    RankPrivate: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -158,9 +189,6 @@
           jobIcon: JobIconRifleman
           assignSquad: true
 
-- type: playTimeTracker
-  id: JobGermanRifleman
-
 - type: startingGear
   id: GermanRiflemanGear
   equipment:
@@ -198,6 +226,20 @@
   randomStartingGears: [GermanMachinegunnerGear, GermanMachinegunnerGear2]
   icon: "JobIconMg"
   supervisors: job-supervisors-cpt
+  requirements:
+    - !type:RoleTimeRequirement
+      role: JobGermanRifleman
+      time: 3600 # 1 hour
+  ranks:
+    RankLanceCorporal:
+      - !type:RoleTimeRequirement
+        role: JobGermanMachinegunner
+        time: 36000 # 10 hours
+    RankPrivateFirstClass:
+      - !type:RoleTimeRequirement
+        role: JobGermanMachinegunner
+        time: 10800 # 3 hours
+    RankPrivate: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -210,9 +252,6 @@
           jobIcon: JobIconRifleman
           assignSquad: true
 
-- type: playTimeTracker
-  id: JobGermanMachinegunner
-
 - type: startingGear
   id: GermanMachinegunnerGear
   equipment:
@@ -249,6 +288,12 @@
   startingGear: GermanMedicGear
   icon: "JobIconMedic"
   supervisors: job-supervisors-cpt
+  ranks:
+    RankSergeant:
+      - !type:RoleTimeRequirement
+        role: JobGermanMedic
+        time: 10800 # 3 hours
+    RankCorporal: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -261,9 +306,6 @@
           jobIcon: JobIconMedic
           assignSquad: false
 
-- type: playTimeTracker
-  id: JobGermanMedic
-
 - type: startingGear
   id: GermanMedicGear
   equipment:

+ 140 - 0
Resources/Prototypes/Civ14/Roles/Jobs/TDM/playtimetrackers.yml

@@ -0,0 +1,140 @@
+# coldwar
+- type: playTimeTracker
+  id: JobSovietCWCaptain
+
+- type: playTimeTracker
+  id: JobSovietCWOfficer
+
+- type: playTimeTracker
+  id: JobSovietCWSergeant
+
+- type: playTimeTracker
+  id: JobSovietCWRifleman
+
+- type: playTimeTracker
+  id: JobSovietCWMachinegunner
+
+- type: playTimeTracker
+  id: JobSovietCWSpecialist
+
+- type: playTimeTracker
+  id: JobSovietCWMedic
+
+- type: playTimeTracker
+  id: JobSovietCWSapper
+
+- type: playTimeTracker
+  id: JobUSCaptain
+
+- type: playTimeTracker
+  id: JobUSOfficer
+
+- type: playTimeTracker
+  id: JobUSSergeant
+
+- type: playTimeTracker
+  id: JobUSRifleman
+
+- type: playTimeTracker
+  id: JobUSMachinegunner
+
+- type: playTimeTracker
+  id: JobUSSpecialist
+
+- type: playTimeTracker
+  id: JobUSMedic
+
+- type: playTimeTracker
+  id: JobUSSapper
+
+# ww2
+- type: playTimeTracker
+  id: JobSovietCaptain
+
+- type: playTimeTracker
+  id: JobSovietOfficer
+
+- type: playTimeTracker
+  id: JobSovietSergeant
+
+- type: playTimeTracker
+  id: JobSovietRifleman
+
+- type: playTimeTracker
+  id: JobSovietMachinegunner
+
+- type: playTimeTracker
+  id: JobSovietSubmachineGunner
+
+- type: playTimeTracker
+  id: JobSovietSpecialist
+
+- type: playTimeTracker
+  id: JobSovietMedic
+
+- type: playTimeTracker
+  id: JobSovietSapper
+
+- type: playTimeTracker
+  id: JobGermanCaptain
+
+- type: playTimeTracker
+  id: JobGermanOfficer
+
+- type: playTimeTracker
+  id: JobGermanSergeant
+
+- type: playTimeTracker
+  id: JobGermanRifleman
+
+- type: playTimeTracker
+  id: JobGermanMachinegunner
+
+- type: playTimeTracker
+  id: JobGermanSubmachineGunner
+
+- type: playTimeTracker
+  id: JobGermanSpecialist
+
+- type: playTimeTracker
+  id: JobGermanMedic
+
+- type: playTimeTracker
+  id: JobGermanSapper
+
+# medieval
+- type: playTimeTracker
+  id: JobEnglishLord
+
+- type: playTimeTracker
+  id: JobEnglishKnight
+
+- type: playTimeTracker
+  id: JobEnglishSpearman
+
+- type: playTimeTracker
+  id: JobEnglishSwordsman
+
+- type: playTimeTracker
+  id: JobEnglishRanged
+
+- type: playTimeTracker
+  id: JobEnglishMedic
+
+- type: playTimeTracker
+  id: JobFrenchLord
+
+- type: playTimeTracker
+  id: JobFrenchKnight
+
+- type: playTimeTracker
+  id: JobFrenchSwordsman
+
+- type: playTimeTracker
+  id: JobFrenchSpearman
+
+- type: playTimeTracker
+  id: JobFrenchRanged
+
+- type: playTimeTracker
+  id: JobFrenchMedic

+ 60 - 18
Resources/Prototypes/Roles/Jobs/Civ14/TDM/soviet.yml → Resources/Prototypes/Civ14/Roles/Jobs/TDM/soviet.yml

@@ -11,6 +11,12 @@
   startingGear: SovietCaptainGear
   icon: "JobIconICpt"
   supervisors: job-supervisors-nobody
+  ranks:
+    RankMajor:
+      - !type:RoleTimeRequirement
+        role: JobSovietCaptain
+        time: 18000 # 5 hours
+    RankCaptain: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -23,9 +29,6 @@
           jobIcon: JobIconICpt
           assignSquad: false
 
-- type: playTimeTracker
-  id: JobSovietCaptain
-
 - type: startingGear
   id: SovietCaptainGear
   equipment:
@@ -51,6 +54,16 @@
   startingGear: SovietSergeantGear
   icon: "JobIconISgt"
   supervisors: job-supervisors-cpt
+  ranks:
+    RankSergeantMajor:
+      - !type:RoleTimeRequirement
+        role: JobSovietSergeant
+        time: 36000 # 10 hours
+    RankStaffSergeant:
+      - !type:RoleTimeRequirement
+        role: JobSovietSergeant
+        time: 10800 # 3 hours
+    RankSergeant: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -63,9 +76,6 @@
           jobIcon: JobIconISgt
           assignSquad: true
 
-- type: playTimeTracker
-  id: JobSovietSergeant
-
 - type: startingGear
   id: SovietSergeantGear
   equipment:
@@ -92,6 +102,20 @@
   randomStartingGears: [SovietSubmachineGunnerGear, SovietSubmachineGunnerGear2]
   icon: "JobIconSoldier"
   supervisors: job-supervisors-cpt
+  requirements:
+    - !type:RoleTimeRequirement
+      role: JobSovietRifleman
+      time: 3600 # 1 hour
+  ranks:
+    RankLanceCorporal:
+      - !type:RoleTimeRequirement
+        role: JobSovietSubmachineGunner
+        time: 36000 # 10 hours
+    RankPrivateFirstClass:
+      - !type:RoleTimeRequirement
+        role: JobSovietSubmachineGunner
+        time: 10800 # 3 hours
+    RankPrivate: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -104,9 +128,6 @@
           jobIcon: JobIconRifleman
           assignSquad: true
 
-- type: playTimeTracker
-  id: JobSovietSubmachineGunner
-
 - type: startingGear
   id: SovietSubmachineGunnerGear
   equipment:
@@ -146,6 +167,16 @@
   randomStartingGears: [SovietRiflemanGear, SovietRiflemanGear2]
   icon: "JobIconSoldier"
   supervisors: job-supervisors-cpt
+  ranks:
+    RankLanceCorporal:
+      - !type:RoleTimeRequirement
+        role: JobSovietRifleman
+        time: 36000 # 10 hours
+    RankPrivateFirstClass:
+      - !type:RoleTimeRequirement
+        role: JobSovietRifleman
+        time: 10800 # 3 hours
+    RankPrivate: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -158,9 +189,6 @@
           jobIcon: JobIconRifleman
           assignSquad: true
 
-- type: playTimeTracker
-  id: JobSovietRifleman
-
 - type: startingGear
   id: SovietRiflemanGear
   equipment:
@@ -201,6 +229,20 @@
   randomStartingGears: [SovietMachinegunnerGear, SovietMachinegunnerGear2]
   icon: "JobIconMg"
   supervisors: job-supervisors-cpt
+  requirements:
+    - !type:RoleTimeRequirement
+      role: JobSovietRifleman
+      time: 3600 # 1 hour
+  ranks:
+    RankLanceCorporal:
+      - !type:RoleTimeRequirement
+        role: JobSovietMachinegunner
+        time: 36000 # 10 hours
+    RankPrivateFirstClass:
+      - !type:RoleTimeRequirement
+        role: JobSovietMachinegunner
+        time: 10800 # 3 hours
+    RankPrivate: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -213,9 +255,6 @@
           jobIcon: JobIconRifleman
           assignSquad: true
 
-- type: playTimeTracker
-  id: JobSovietMachinegunner
-
 - type: startingGear
   id: SovietMachinegunnerGear
   equipment:
@@ -256,6 +295,12 @@
   startingGear: SovietMedicGear
   icon: "JobIconMedic"
   supervisors: job-supervisors-cpt
+  ranks:
+    RankSergeant:
+      - !type:RoleTimeRequirement
+        role: JobSovietMedic
+        time: 10800 # 3 hours
+    RankCorporal: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -268,9 +313,6 @@
           jobIcon: JobIconMedic
           assignSquad: false
 
-- type: playTimeTracker
-  id: JobSovietMedic
-
 - type: startingGear
   id: SovietMedicGear
   equipment:

+ 42 - 14
Resources/Prototypes/Roles/Jobs/Civ14/TDM/sovietCW.yml → Resources/Prototypes/Civ14/Roles/Jobs/TDM/sovietCW.yml

@@ -11,6 +11,12 @@
   startingGear: SovietCWCaptainGear
   icon: "JobIconICpt"
   supervisors: job-supervisors-nobody
+  ranks:
+    RankMajor:
+      - !type:RoleTimeRequirement
+        role: JobSovietCWCaptain
+        time: 18000 # 5 hours
+    RankCaptain: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -22,8 +28,6 @@
           factionIcon: SovietFaction
           jobIcon: JobIconICpt
           assignSquad: false
-- type: playTimeTracker
-  id: JobSovietCWCaptain
 
 - type: startingGear
   id: SovietCWCaptainGear
@@ -53,6 +57,16 @@
   startingGear: SovietCWSergeantGear
   icon: "JobIconISgt"
   supervisors: job-supervisors-cpt
+  ranks:
+    RankSergeantMajor:
+      - !type:RoleTimeRequirement
+        role: JobSovietCWSergeant
+        time: 36000 # 10 hours
+    RankStaffSergeant:
+      - !type:RoleTimeRequirement
+        role: JobSovietCWSergeant
+        time: 10800 # 3 hours
+    RankSergeant: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -65,9 +79,6 @@
           jobIcon: JobIconISgt
           assignSquad: true
 
-- type: playTimeTracker
-  id: JobSovietCWSergeant
-
 - type: startingGear
   id: SovietCWSergeantGear
   equipment:
@@ -95,6 +106,16 @@
   randomStartingGears: [SovietCWRiflemanGear, SovietCWRiflemanGear2]
   icon: "JobIconICpl"
   supervisors: job-supervisors-cpt
+  ranks:
+    RankLanceCorporal:
+      - !type:RoleTimeRequirement
+        role: JobSovietCWRifleman
+        time: 36000 # 10 hours
+    RankPrivateFirstClass:
+      - !type:RoleTimeRequirement
+        role: JobSovietCWRifleman
+        time: 10800 # 3 hours
+    RankPrivate: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -107,9 +128,6 @@
           jobIcon: JobIconRifleman
           assignSquad: true
 
-- type: playTimeTracker
-  id: JobSovietCWRifleman
-
 - type: startingGear
   id: SovietCWRiflemanGear
   equipment:
@@ -152,6 +170,16 @@
   randomStartingGears: [SovietCWMachinegunnerGear, SovietCWMachinegunnerGear2]
   icon: "JobIconMg"
   supervisors: job-supervisors-cpt
+  ranks:
+    RankLanceCorporal:
+      - !type:RoleTimeRequirement
+        role: JobSovietCWMachinegunner
+        time: 36000 # 10 hours
+    RankPrivateFirstClass:
+      - !type:RoleTimeRequirement
+        role: JobSovietCWMachinegunner
+        time: 10800 # 3 hours
+    RankPrivate: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -164,9 +192,6 @@
           jobIcon: JobIconMg
           assignSquad: true
 
-- type: playTimeTracker
-  id: JobSovietCWMachinegunner
-
 - type: startingGear
   id: SovietCWMachinegunnerGear
   equipment:
@@ -209,6 +234,12 @@
   startingGear: SovietCWMedicGear
   icon: "JobIconMedic"
   supervisors: job-supervisors-cpt
+  ranks:
+    RankSergeant:
+      - !type:RoleTimeRequirement
+        role: JobSovietCWMedic
+        time: 10800 # 3 hours
+    RankCorporal: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -221,9 +252,6 @@
           jobIcon: JobIconMedic
           assignSquad: false
 
-- type: playTimeTracker
-  id: JobSovietCWMedic
-
 - type: startingGear
   id: SovietCWMedicGear
   equipment:

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

@@ -11,6 +11,12 @@
   startingGear: USCaptainGear
   icon: "JobIconICpt"
   supervisors: job-supervisors-nobody
+  ranks:
+    RankMajor:
+      - !type:RoleTimeRequirement
+        role: JobUSCaptain
+        time: 18000 # 5 hours
+    RankCaptain: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -21,9 +27,6 @@
           factionIcon: UsFaction
           jobIcon: JobIconICpt
 
-- type: playTimeTracker
-  id: JobUSCaptain
-
 - type: startingGear
   id: USCaptainGear
   equipment:
@@ -51,6 +54,16 @@
   startingGear: USSergeantGear
   icon: "JobIconISgt"
   supervisors: job-supervisors-cpt
+  ranks:
+    RankSergeantMajor:
+      - !type:RoleTimeRequirement
+        role: JobUSSergeant
+        time: 36000 # 10 hours
+    RankStaffSergeant:
+      - !type:RoleTimeRequirement
+        role: JobUSSergeant
+        time: 10800 # 3 hours
+    RankSergeant: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -62,9 +75,6 @@
           jobIcon: JobIconISgt
           assignSquad: true
 
-- type: playTimeTracker
-  id: JobUSSergeant
-
 - type: startingGear
   id: USSergeantGear
   equipment:
@@ -92,6 +102,16 @@
   randomStartingGears: [USRiflemanGear, USRiflemanGear2]
   icon: "JobIconICpl"
   supervisors: job-supervisors-cpt
+  ranks:
+    RankLanceCorporal:
+      - !type:RoleTimeRequirement
+        role: JobUSRifleman
+        time: 36000 # 10 hours
+    RankPrivateFirstClass:
+      - !type:RoleTimeRequirement
+        role: JobUSRifleman
+        time: 10800 # 3 hours
+    RankPrivate: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -103,9 +123,6 @@
           jobIcon: JobIconRifleman
           assignSquad: true
 
-- type: playTimeTracker
-  id: JobUSRifleman
-
 - type: startingGear
   id: USRiflemanGear
   equipment:
@@ -147,6 +164,16 @@
   randomStartingGears: [USMachinegunnerGear, USMachinegunnerGear2]
   icon: "JobIconMg"
   supervisors: job-supervisors-cpt
+  ranks:
+    RankLanceCorporal:
+      - !type:RoleTimeRequirement
+        role: JobUSMachinegunner
+        time: 36000 # 10 hours
+    RankPrivateFirstClass:
+      - !type:RoleTimeRequirement
+        role: JobUSMachinegunner
+        time: 10800 # 3 hours
+    RankPrivate: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -158,9 +185,6 @@
           jobIcon: JobIconMg
           assignSquad: true
 
-- type: playTimeTracker
-  id: JobUSMachinegunner
-
 - type: startingGear
   id: USMachinegunnerGear
   equipment:
@@ -201,6 +225,12 @@
   startingGear: USMedicGear
   icon: "JobIconMedic"
   supervisors: job-supervisors-cpt
+  ranks:
+    RankSergeant:
+      - !type:RoleTimeRequirement
+        role: JobUSMedic
+        time: 10800 # 3 hours
+    RankCorporal: []
   special:
     - !type:AddComponentSpecial
       components:
@@ -211,9 +241,6 @@
           factionIcon: UsFaction
           jobIcon: JobIconMedic
 
-- type: playTimeTracker
-  id: JobUSMedic
-
 - type: startingGear
   id: USMedicGear
   equipment:

+ 0 - 0
Resources/Prototypes/Roles/Jobs/departments.yml → Resources/Prototypes/Civ14/Roles/Jobs/departments.yml


+ 0 - 0
Resources/Prototypes/Roles/Jobs/Civ14/nomad.yml → Resources/Prototypes/Civ14/Roles/Jobs/nomad.yml


+ 26 - 27
Resources/Prototypes/Entities/Markers/Spawners/Random/techboard.yml

@@ -3,30 +3,29 @@
   name: random board spawner
   parent: MarkerBase
   components:
-  - type: Sprite
-    layers:
-    - state: red
-    - sprite: Objects/Misc/module.rsi
-      state: boris
-  - type: RandomSpawner
-    prototypes:
-    - AirAlarmElectronics
-    - FireAlarmElectronics
-    - DoorElectronics
-    - FirelockElectronics
-    - IntercomElectronics
-    - APCElectronics
-    - SignalTimerElectronics
-    - APECircuitboard
-    - SMESMachineCircuitboard
-    - SubstationMachineCircuitboard
-    - TelecomServerCircuitboard
-    chance: 0.95
-    rarePrototypes:
-    - CommsComputerCircuitboard
-    - ShuttleConsoleCircuitboard
-    - ComputerMassMediaCircuitboard
-    - AutolatheMachineCircuitboard
-    - ProtolatheMachineCircuitboard
-    - SalvageMagnetMachineCircuitboard
-    rareChance: 0.05
+    - type: Sprite
+      layers:
+        - state: red
+        - sprite: Objects/Misc/module.rsi
+          state: boris
+    - type: RandomSpawner
+      prototypes:
+        - AirAlarmElectronics
+        - FireAlarmElectronics
+        - DoorElectronics
+        - FirelockElectronics
+        - IntercomElectronics
+        - APCElectronics
+        - SignalTimerElectronics
+        - SMESMachineCircuitboard
+        - SubstationMachineCircuitboard
+        - TelecomServerCircuitboard
+      chance: 0.95
+      rarePrototypes:
+        - CommsComputerCircuitboard
+        - ShuttleConsoleCircuitboard
+        - ComputerMassMediaCircuitboard
+        - AutolatheMachineCircuitboard
+        - ProtolatheMachineCircuitboard
+        - SalvageMagnetMachineCircuitboard
+      rareChance: 0.05

+ 0 - 46
Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml

@@ -284,37 +284,6 @@
         Glass: 1
         Steel: 5
 
-- type: entity
-  parent: BaseMachineCircuitboard
-  id: AnomalyVesselCircuitboard
-  name: anomaly vessel machine board
-  description: A machine printed circuit board for an anomaly vessel.
-  components:
-    - type: Sprite
-      state: science
-    - type: MachineBoard
-      prototype: MachineAnomalyVessel
-      stackRequirements:
-        Capacitor: 3
-        Cable: 1
-        PlasmaGlass: 10
-
-- type: entity
-  parent: BaseMachineCircuitboard
-  id: AnomalyVesselExperimentalCircuitboard
-  name: experimental anomaly vessel machine board
-  description: A machine printed circuit board for an experimental anomaly vessel.
-  components:
-    - type: Sprite
-      state: science
-    - type: MachineBoard
-      prototype: MachineAnomalyVesselExperimental
-      stackRequirements:
-        Capacitor: 3
-        Cable: 5
-        PlasmaGlass: 15
-        MetalRod: 4
-
 - type: entity
   parent: BaseMachineCircuitboard
   id: AnomalySynchronizerCircuitboard
@@ -331,21 +300,6 @@
         PlasmaGlass: 5
         Cable: 5
 
-- type: entity
-  parent: BaseMachineCircuitboard
-  id: APECircuitboard
-  name: A.P.E. machine board
-  description: A machine printed circuit board for an A.P.E.
-  components:
-    - type: Sprite
-      state: science
-    - type: MachineBoard
-      prototype: MachineAPE
-      stackRequirements:
-        Capacitor: 2
-        Cable: 1
-        Glass: 1
-
 - type: entity
   id: ThermomachineFreezerMachineCircuitBoard
   parent: BaseMachineCircuitboard

+ 0 - 27
Resources/Prototypes/Entities/Objects/Misc/implanters.yml

@@ -43,10 +43,8 @@
         - MicroBombImplant
         - MacroBombImplant
         - DeathAcidifierImplant
-        - DeathRattleImplant
         - MindShieldImplant
         - FakeMindShieldImplant
-        - RadioImplant
       deimplantFailureDamage:
         types:
           Cellular: 50
@@ -207,14 +205,6 @@
     - type: Implanter
       implant: FreedomImplant
 
-- type: entity
-  id: RadioImplanter
-  suffix: radio Syndicate
-  parent: BaseImplantOnlyImplanterSyndi
-  components:
-    - type: Implanter
-      implant: RadioImplant
-
 - type: entity
   id: UplinkImplanter
   suffix: uplink
@@ -265,13 +255,6 @@
     - type: Implanter
       implant: MacroBombImplant
 
-- type: entity
-  id: DeathRattleImplanter
-  suffix: death rattle
-  parent: BaseImplantOnlyImplanterSyndi
-  components:
-    - type: Implanter
-      implant: DeathRattleImplant
 
 - type: entity
   id: DeathAcidifierImplanter
@@ -298,13 +281,3 @@
   components:
     - type: Implanter
       implant: MindShieldImplant
-
-# Centcomm implanters
-
-- type: entity
-  id: RadioImplanterCentcomm
-  suffix: radio Centcomm
-  parent: BaseImplantOnlyImplanter
-  components:
-    - type: Implanter
-      implant: RadioImplantCentcomm

+ 0 - 43
Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml

@@ -142,17 +142,6 @@
         components:
           - Cuffable # useless if you cant be cuffed
 
-- type: entity
-  parent: BaseSubdermalImplant
-  id: RadioImplant
-  name: radio implant
-  description: This implant grants access to the Syndicate channel without a headset.
-  categories: [HideSpawnMenu]
-  components:
-    - type: SubdermalImplant
-    - type: RadioImplant
-      radioChannels:
-        - Common
 - type: entity
   parent: [BaseSubdermalImplant, StorePresetUplink]
   id: UplinkImplant
@@ -303,24 +292,6 @@
         - HideContextMenu
         - DeathAcidifier
 
-- type: entity
-  parent: BaseSubdermalImplant
-  id: DeathRattleImplant
-  name: death rattle implant
-  description: This implant will inform the Syndicate radio channel should the user fall into critical condition or die.
-  categories: [HideSpawnMenu]
-  components:
-    - type: SubdermalImplant
-      permanent: true
-      whitelist:
-        components:
-          - MobState # admeme implanting a chair with rattle implant needs to give the chair mobstate so it can die first
-    - type: TriggerOnMobstateChange
-      mobState:
-        - Critical
-        - Dead
-    - type: Rattle
-
 - type: entity
   parent: BaseSubdermalImplant
   id: FakeMindShieldImplant
@@ -346,17 +317,3 @@
     - type: Tag
       tags:
         - MindShield
-
-# Centcomm implants
-
-- type: entity
-  parent: BaseSubdermalImplant
-  id: RadioImplantCentcomm
-  name: radio implant
-  description: This implant grants access to the Centcomm channel without a headset. Only authorized for Centcomm employees.
-  categories: [HideSpawnMenu]
-  components:
-    - type: SubdermalImplant
-    - type: RadioImplant
-      radioChannels:
-        - Common

+ 0 - 9
Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml

@@ -459,9 +459,6 @@
           state: generic_panel_open
     - type: ResearchClient
     - type: ResearchConsole
-    - type: ActiveRadio
-      channels:
-        - Common
     - type: TechnologyDatabase
     - type: ActivatableUI
       key: enum.ResearchConsoleUiKey.Key
@@ -864,9 +861,6 @@
           state: generic_panel_open
     - type: CargoOrderConsole
     - type: BankClient
-    - type: ActiveRadio
-      channels:
-        - Common
     - type: ActivatableUI
       key: enum.CargoConsoleUiKey.Orders
     - type: UserInterface
@@ -1111,9 +1105,6 @@
         - map: ["enum.WiresVisualLayers.MaintenancePanel"]
           state: generic_panel_open
     - type: RoboticsConsole
-    - type: ActiveRadio
-      channels:
-        - Common
     - type: ActivatableUI
       key: enum.RoboticsConsoleUiKey.Key
     - type: UserInterface

+ 0 - 312
Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml

@@ -1,312 +0,0 @@
-- type: entity
-  id: MachineAnomalyVessel
-  parent: [BaseMachinePowered, ConstructibleMachine]
-  name: anomaly vessel
-  description: A container able to harness a scan of an anomaly and turn it into research data.
-  components:
-    - type: Sprite
-      noRot: true
-      sprite: Structures/Machines/Anomaly/anomaly_vessel.rsi
-      layers:
-        - state: base
-        - state: powered-1
-          shader: unshaded
-          map: ["enum.PowerDeviceVisualLayers.Powered"]
-        - state: anomaly-1
-          visible: false
-          shader: unshaded
-          map: ["enum.AnomalyVesselVisualLayers.Base"]
-        - state: panel
-          map: ["enum.WiresVisualLayers.MaintenancePanel"]
-    - type: Transform
-      noRot: false
-    - type: AnomalyVessel
-    - type: ResearchClient
-    - type: ActivatableUI
-      key: enum.ResearchClientUiKey.Key
-    - type: ActivatableUIRequiresPower
-    - type: UserInterface
-      interfaces:
-        enum.ResearchClientUiKey.Key:
-          type: ResearchClientBoundUserInterface
-    - type: Machine
-      board: AnomalyVesselCircuitboard
-    - type: PointLight
-      radius: 1.2
-      energy: 2
-      color: "#fca3c0"
-    - type: Appearance
-    - type: WiresPanel
-    - type: GenericVisualizer
-      visuals:
-        enum.PowerDeviceVisuals.Powered:
-          enum.PowerDeviceVisualLayers.Powered:
-            True: { visible: true }
-            False: { visible: false }
-        enum.AnomalyVesselVisuals.HasAnomaly:
-          enum.AnomalyVesselVisualLayers.Base:
-            True: { visible: true }
-            False: { visible: false }
-        enum.AnomalyVesselVisuals.AnomalyState:
-          enum.PowerDeviceVisualLayers.Powered:
-            1: { state: powered-1 }
-            2: { state: powered-2 }
-            3: { state: powered-3 }
-          enum.AnomalyVesselVisualLayers.Base:
-            1: { state: anomaly-1 }
-            2: { state: anomaly-2 }
-            3: { state: anomaly-3 }
-        enum.WiresVisuals.MaintenancePanelState:
-          enum.WiresVisualLayers.MaintenancePanel:
-            True: { visible: false }
-            False: { visible: true }
-    - type: Explosive
-      explosionType: Default
-      maxIntensity: 20
-      intensitySlope: 30
-      totalIntensity: 30
-      canCreateVacuum: false
-    - type: Destructible
-      thresholds:
-        - trigger: !type:DamageTrigger
-            damage: 150
-          behaviors:
-            - !type:DoActsBehavior
-              acts: ["Destruction"]
-            - !type:PlaySoundBehavior
-              sound:
-                collection: MetalGlassBreak
-            - !type:ExplodeBehavior
-
-- type: entity
-  id: MachineAnomalyVesselExperimental
-  parent: MachineAnomalyVessel
-  name: experimental anomaly vessel
-  description: An advanced anomaly vessel capable of greater research potential at the cost of increased volatility and low-level radioactive decay into the environment.
-  components:
-    - type: Sprite
-      sprite: Structures/Machines/Anomaly/adv_anomaly_vessel.rsi
-      offset: 0,0.5
-      drawdepth: Mobs
-    - type: SpriteFade
-    - type: AnomalyVessel
-      pointMultiplier: 2
-    - type: RadiationSource
-      intensity: 0.75
-      slope: 0.1
-      enabled: false
-    - type: Machine
-      board: AnomalyVesselExperimentalCircuitboard
-    - type: Explosive
-      explosionType: Default
-      maxIntensity: 50
-      intensitySlope: 7.5
-      totalIntensity: 500
-      canCreateVacuum: true
-
-- type: entity
-  id: MachineAPE
-  parent: [BaseMachinePowered, ConstructibleMachine]
-  name: A.P.E.
-  description: An Anomalous Particle Emitter, capable of shooting out unstable particles which can interface with anomalies.
-  components:
-    - type: Sprite
-      noRot: true
-      sprite: Structures/Machines/Anomaly/ape.rsi
-      layers:
-        - state: base
-        - state: unshaded
-          shader: unshaded
-          map: ["enum.PowerDeviceVisualLayers.Powered"]
-        - state: panel
-          map: ["enum.WiresVisualLayers.MaintenancePanel"]
-        - state: firing
-          shader: unshaded
-          visible: false
-          map: ["enum.EmitterVisualLayers.Lights"]
-        - state: locked
-          shader: unshaded
-          visible: false
-          map: ["enum.LockVisualLayers.Lock"]
-    - type: Transform
-      noRot: false
-    - type: Fixtures
-      fixtures:
-        fix1:
-          shape: !type:PhysShapeCircle
-            radius: 0.35
-          density: 50
-          mask:
-            - MachineMask
-          layer:
-            - MachineLayer
-    - type: Rotatable
-      rotateWhileAnchored: true
-    - type: Machine
-      board: APECircuitboard
-    - type: Lock
-      locked: false
-    - type: LockedWiresPanel
-    - type: AccessReader
-      access: [["Research"]]
-    - type: Emitter
-      onState: firing
-      powerUseActive: 100
-      boltType: AnomalousParticleDelta
-      underpoweredState: underpowered
-      selectableTypes:
-        - AnomalousParticleDelta
-        - AnomalousParticleEpsilon
-        - AnomalousParticleZeta
-        - AnomalousParticleSigma
-      setTypePorts:
-        SetParticleDelta: AnomalousParticleDelta
-        SetParticleEpsilon: AnomalousParticleEpsilon
-        SetParticleZeta: AnomalousParticleZeta
-        SetParticleSigma: AnomalousParticleSigma
-      fireBurstSize: 1
-      fireBurstDelayMin: 2
-      fireBurstDelayMax: 6
-    - type: ApcPowerReceiver
-      powerLoad: 100
-
-    - type: Gun
-      projectileSpeed: 10
-      fireRate: 10 #just has to be fast enough to keep up with upgrades
-      showExamineText: false
-      selectedMode: SemiAuto
-      availableModes:
-        - SemiAuto
-      soundGunshot:
-        path: /Audio/Weapons/Guns/Gunshots/taser2.ogg
-    - type: Appearance
-    - type: WiresPanel
-    - type: WiresVisuals
-    - type: GenericVisualizer
-      visuals:
-        enum.PowerDeviceVisuals.Powered:
-          enum.PowerDeviceVisualLayers.Powered:
-            True: { visible: true }
-            False: { visible: false }
-    - type: LockVisuals
-    - type: LockedAnchorable
-    - type: DeviceNetwork
-      deviceNetId: Wireless
-      receiveFrequencyId: BasicDevice
-    - type: WirelessNetworkConnection
-      range: 200
-    - type: DeviceLinkSink
-      ports:
-        - On
-        - Off
-        - Toggle
-        - SetParticleDelta
-        - SetParticleEpsilon
-        - SetParticleZeta
-        - SetParticleSigma
-
-- type: entity
-  id: MachineAnomalyGenerator
-  parent: BaseMachinePowered
-  name: anomaly generator
-  description: The peak of pseudoscientific technology.
-  placement:
-    mode: AlignTileAny
-  components:
-    - type: StationAiWhitelist
-    - type: SpriteFade
-    - type: Sprite
-      sprite: Structures/Machines/Anomaly/anomaly_generator.rsi
-      offset: 0,1
-      drawdepth: Mobs
-      layers:
-        - state: base
-        - state: panel
-          map: ["enum.WiresVisualLayers.MaintenancePanel"]
-          visible: false
-        - state: unshaded
-          shader: unshaded
-          map: ["enum.PowerDeviceVisualLayers.Powered"]
-        - state: inserting
-          visible: false
-          map: ["enum.MaterialStorageVisualLayers.Inserting"]
-        - state: generating
-          visible: false
-          shader: unshaded
-          map: ["enum.AnomalyGeneratorVisualLayers.Base"]
-    - type: Transform
-      anchored: true
-    - type: ApcPowerReceiver
-      powerLoad: 1500
-    - type: ExtensionCableReceiver
-    - type: AmbientSound
-      range: 5
-      volume: -6
-      sound:
-        path: /Audio/Ambience/Objects/anomaly_generator.ogg
-    - type: Physics
-      bodyType: Static
-    - type: AnomalyGenerator
-      generatingSound:
-        path: /Audio/Machines/anomaly_generate.ogg
-      generatingFinishedSound:
-        path: /Audio/Machines/beep.ogg
-    - type: MaterialStorage
-      whitelist:
-        tags:
-          - Sheet
-      materialWhiteList:
-        - Plasma
-    - type: Fixtures
-      fixtures:
-        fix1:
-          shape: !type:PhysShapeAabb
-            bounds: "-1.5,-0.5,1.5,0.6"
-          density: 50
-          mask:
-            - LargeMobMask
-          layer:
-            - WallLayer
-    - type: Repairable
-      fuelCost: 10
-      doAfterDelay: 5
-    - type: WiresPanel
-    - type: Wires
-      boardName: wires-board-name-anomalygenerator
-      layoutId: AnomalyGenerator
-    - type: Destructible
-      thresholds:
-        - trigger: !type:DamageTrigger
-            damage: 500
-          behaviors:
-            - !type:DoActsBehavior
-              acts: ["Breakage"]
-    - type: ActivatableUI
-      key: enum.AnomalyGeneratorUiKey.Key
-    - type: ActivatableUIRequiresAccess
-    - type: ActivatableUIRequiresPower
-    - type: UserInterface
-      interfaces:
-        enum.AnomalyGeneratorUiKey.Key:
-          type: AnomalyGeneratorBoundUserInterface
-        enum.WiresUiKey.Key:
-          type: WiresBoundUserInterface
-    - type: Appearance
-    - type: ActiveRadio
-      channels:
-        - Common
-    - type: GenericVisualizer
-      visuals:
-        enum.PowerDeviceVisuals.Powered:
-          enum.PowerDeviceVisualLayers.Powered:
-            True: { visible: true }
-            False: { visible: false }
-        enum.AnomalyGeneratorVisuals.Generating:
-          enum.AnomalyGeneratorVisualLayers.Base:
-            True: { visible: true }
-            False: { visible: false }
-    - type: WiresVisuals
-    - type: StaticPrice
-      price: 5000
-    - type: AccessReader
-      access: [["Research"]]

+ 0 - 3
Resources/Prototypes/Recipes/Lathes/Packs/science.yml

@@ -85,10 +85,7 @@
     - SheetifierMachineCircuitboard
     - PowerCageRechargerCircuitboard
     - AnalysisComputerCircuitboard
-    - AnomalyVesselCircuitboard
-    - AnomalyVesselExperimentalCircuitboard
     - AnomalySynchronizerCircuitboard
-    - APECircuitboard
     - ArtifactAnalyzerMachineCircuitboard
     - ArtifactCrusherMachineCircuitboard
 

+ 0 - 15
Resources/Prototypes/Recipes/Lathes/electronics.yml

@@ -259,26 +259,11 @@
   id: ArtifactCrusherMachineCircuitboard
   result: ArtifactCrusherMachineCircuitboard
 
-- type: latheRecipe
-  parent: BaseCircuitboardRecipe
-  id: AnomalyVesselCircuitboard
-  result: AnomalyVesselCircuitboard
-
-- type: latheRecipe
-  parent: BaseGoldCircuitboardRecipe
-  id: AnomalyVesselExperimentalCircuitboard
-  result: AnomalyVesselExperimentalCircuitboard
-
 - type: latheRecipe
   parent: BaseSilverCircuitboardRecipe
   id: AnomalySynchronizerCircuitboard
   result: AnomalySynchronizerCircuitboard
 
-- type: latheRecipe
-  parent: BaseCircuitboardRecipe
-  id: APECircuitboard
-  result: APECircuitboard
-
 - type: latheRecipe
   parent: BaseCircuitboardRecipe
   id: ReagentGrinderMachineCircuitboard

+ 20 - 24
Resources/Prototypes/Research/experimental.yml

@@ -10,7 +10,7 @@
   tier: 1
   cost: 5000
   recipeUnlocks:
-  - ProximitySensor
+    - ProximitySensor
 
 - type: technology
   id: BasicAnomalousResearch
@@ -22,13 +22,10 @@
   tier: 1
   cost: 5000
   recipeUnlocks:
-  - AnomalyScanner
-  - AnomalyLocator
-  - AnomalyLocatorWide
-  - BorgModuleAnomaly
-  - APECircuitboard
-  - AnomalyVesselCircuitboard
-
+    - AnomalyScanner
+    - AnomalyLocator
+    - AnomalyLocatorWide
+    - BorgModuleAnomaly
 - type: technology
   id: BasicXenoArcheology
   name: research-technology-basic-xenoarcheology
@@ -39,10 +36,10 @@
   tier: 1
   cost: 5000
   recipeUnlocks:
-  - NodeScanner
-  - BorgModuleArtifact
-  - AnalysisComputerCircuitboard
-  - ArtifactAnalyzerMachineCircuitboard
+    - NodeScanner
+    - BorgModuleArtifact
+    - AnalysisComputerCircuitboard
+    - ArtifactAnalyzerMachineCircuitboard
 
 - type: technology
   id: AlternativeResearch
@@ -54,7 +51,7 @@
   tier: 1
   cost: 5000
   recipeUnlocks:
-  - TechDiskComputerCircuitboard
+    - TechDiskComputerCircuitboard
 
 - type: technology
   id: MagnetsTech
@@ -66,8 +63,8 @@
   tier: 1
   cost: 7500
   recipeUnlocks:
-  - ClothingShoesBootsMagSci
-  - ClothingShoesBootsMoon
+    - ClothingShoesBootsMagSci
+    - ClothingShoesBootsMoon
 
 - type: technology
   id: AnomalyCoreHarnessing
@@ -79,7 +76,7 @@
   tier: 1
   cost: 10000
   recipeUnlocks:
-  - WeaponGauntletGorilla
+    - WeaponGauntletGorilla
 
 # Tier 2
 
@@ -93,7 +90,7 @@
   tier: 2
   cost: 5000
   recipeUnlocks:
-  - ArtifactCrusherMachineCircuitboard
+    - ArtifactCrusherMachineCircuitboard
 
 - type: technology
   id: AdvancedAnomalyResearch
@@ -105,11 +102,10 @@
   tier: 2
   cost: 10000
   recipeUnlocks:
-  - WeaponPistolCHIMP
-  - AnomalySynchronizerCircuitboard
-  - AnomalyVesselExperimentalCircuitboard
+    - WeaponPistolCHIMP
+    - AnomalySynchronizerCircuitboard
   technologyPrerequisites:
-  - BasicAnomalousResearch
+    - BasicAnomalousResearch
 
 - type: technology
   id: DeterrenceTechnologies
@@ -121,8 +117,8 @@
   tier: 2
   cost: 7500
   recipeUnlocks:
-  - WeaponParticleDecelerator
-  - HoloprojectorField
+    - WeaponParticleDecelerator
+    - HoloprojectorField
 
 # Tier 3
 
@@ -149,4 +145,4 @@
   tier: 3
   cost: 10000
   recipeUnlocks:
-  - DeviceQuantumSpinInverter
+    - DeviceQuantumSpinInverter