Forráskód Böngészése

TDM update 6 (#215)

* enables mapvotes, dead chat to discord

* auto-mapvote

* medieval and zoomer accents

* votefix

* heavier mgs, tweaked healing for brute packs and gauze, reduced gracewall timer to 3 mins, ammo for medics, wip permanent gracewalls for spawn points

* lower LMG accuracy, WIP gracewall fix

* wielded sprites fixed

* barbedwire, reworks wielding, smg balancing

* random weather

* permanent gracewall fixes, random times of day, magfix

* quick typo
Taislin 6 hónapja
szülő
commit
bbe27b712d
100 módosított fájl, 3139 hozzáadás és 826 törlés
  1. 142 0
      .coderabbit.yaml
  2. 40 38
      Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs
  3. 1 0
      Content.Server/Discord/DiscordLink/DiscordChatILink.cs
  4. 8 2
      Content.Server/GameTicking/GameTicker.RoundFlow.cs
  5. 19 4
      Content.Server/GameTicking/GameTicker.Spawning.cs
  6. 7 2
      Content.Server/GameTicking/Rules/Components/GracewallComponent.cs
  7. 32 0
      Content.Server/GameTicking/Rules/Components/RandomWeatherRuleComponent.cs
  8. 12 0
      Content.Server/GameTicking/Rules/Components/RespawnTrackerComponent.cs
  9. 77 30
      Content.Server/GameTicking/Rules/GracewallRuleSystem.cs
  10. 111 0
      Content.Server/GameTicking/Rules/RandomWeatherRuleSystem.cs
  11. 42 13
      Content.Server/GameTicking/Rules/RespawnRuleSystem.cs
  12. 4 1
      Content.Server/RoundEnd/RoundEndSystem.cs
  13. 13 0
      Content.Server/Speech/Components/MedievalAccentComponent.cs
  14. 12 0
      Content.Server/Speech/Components/OhioAccentComponent.cs
  15. 48 0
      Content.Server/Speech/EntitySystems/MedievalAccentSystem.cs
  16. 52 0
      Content.Server/Speech/EntitySystems/OhioAccentSystem.cs
  17. 10 18
      Content.Server/Voting/Managers/VoteManager.DefaultVotes.cs
  18. 4 3
      Content.Server/Voting/Managers/VoteManager.cs
  19. 4 4
      Content.Shared/Weather/SharedWeatherSystem.cs
  20. 22 0
      Content.Shared/Wieldable/SharedWieldableSystem.cs
  21. 1 1
      Resources/ConfigPresets/Build/development.toml
  22. 758 0
      Resources/Locale/en-US/Civ14/accent/medieval.ftl
  23. 428 0
      Resources/Locale/en-US/Civ14/accent/ohio.ftl
  24. 1 1
      Resources/Locale/en-US/voting/managers/vote-manager.ftl
  25. 2 0
      Resources/Locale/en-US/wieldable/wieldable-component.ftl
  26. 1 0
      Resources/Maps/civ/tdm/camp.yml
  27. 1 0
      Resources/Maps/civ/tdm/camp_ww2.yml
  28. 1 0
      Resources/Maps/civ/tdm/opushka.yml
  29. 5 7
      Resources/Prototypes/Civ14/Entities/Markers/grace_wall.yml
  30. 1 0
      Resources/Prototypes/Civ14/Entities/Objects/Guns/base.yml
  31. 0 1
      Resources/Prototypes/Civ14/Entities/Objects/Guns/entities_assaultrifles.yml
  32. 1 2
      Resources/Prototypes/Civ14/Entities/Objects/Guns/entities_boltaction.yml
  33. 22 23
      Resources/Prototypes/Civ14/Entities/Objects/Guns/entities_mg.yml
  34. 5 57
      Resources/Prototypes/Civ14/Entities/Objects/Guns/entities_pistol.yml
  35. 54 58
      Resources/Prototypes/Civ14/Entities/Objects/Guns/entities_smg.yml
  36. 45 0
      Resources/Prototypes/Civ14/Entities/Structures/Walls/barbedwire.yml
  37. 7 7
      Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml
  38. 18 0
      Resources/Prototypes/GameRules/roundstart.yml
  39. 1 0
      Resources/Prototypes/Roles/Jobs/Civ14/TDM/english.yml
  40. 1 0
      Resources/Prototypes/Roles/Jobs/Civ14/TDM/french.yml
  41. 1 0
      Resources/Prototypes/Roles/Jobs/Civ14/TDM/german.yml
  42. 1 0
      Resources/Prototypes/Roles/Jobs/Civ14/TDM/soviet.yml
  43. 393 0
      Resources/Prototypes/_Goobstation/Accents/word_replacements.yml
  44. 2 1
      Resources/Prototypes/game_presets.yml
  45. BIN
      Resources/Textures/Civ14/Objects/ammo.rsi/mag-0.png
  46. 4 1
      Resources/Textures/Civ14/Objects/ammo.rsi/meta.json
  47. 37 29
      Resources/Textures/Civ14/Weapons/Guns/A280.rsi/meta.json
  48. BIN
      Resources/Textures/Civ14/Weapons/Guns/A280.rsi/wielded-inhand-left.png
  49. BIN
      Resources/Textures/Civ14/Weapons/Guns/A280.rsi/wielded-inhand-right.png
  50. 36 28
      Resources/Textures/Civ14/Weapons/Guns/DC-15.rsi/meta.json
  51. BIN
      Resources/Textures/Civ14/Weapons/Guns/DC-15.rsi/wielded-inhand-left.png
  52. BIN
      Resources/Textures/Civ14/Weapons/Guns/DC-15.rsi/wielded-inhand-right.png
  53. 36 28
      Resources/Textures/Civ14/Weapons/Guns/DC-15A.rsi/meta.json
  54. BIN
      Resources/Textures/Civ14/Weapons/Guns/DC-15A.rsi/wielded-inhand-left.png
  55. BIN
      Resources/Textures/Civ14/Weapons/Guns/DC-15A.rsi/wielded-inhand-right.png
  56. 36 28
      Resources/Textures/Civ14/Weapons/Guns/DC-17.rsi/meta.json
  57. BIN
      Resources/Textures/Civ14/Weapons/Guns/DC-17.rsi/wielded-inhand-left.png
  58. BIN
      Resources/Textures/Civ14/Weapons/Guns/DC-17.rsi/wielded-inhand-right.png
  59. 36 28
      Resources/Textures/Civ14/Weapons/Guns/E-11.rsi/meta.json
  60. BIN
      Resources/Textures/Civ14/Weapons/Guns/E-11.rsi/wielded-inhand-left.png
  61. BIN
      Resources/Textures/Civ14/Weapons/Guns/E-11.rsi/wielded-inhand-right.png
  62. 36 28
      Resources/Textures/Civ14/Weapons/Guns/E-5.rsi/meta.json
  63. BIN
      Resources/Textures/Civ14/Weapons/Guns/E-5.rsi/wielded-inhand-left.png
  64. BIN
      Resources/Textures/Civ14/Weapons/Guns/E-5.rsi/wielded-inhand-right.png
  65. BIN
      Resources/Textures/Civ14/Weapons/Guns/Z-6.rsi/Z-6.png
  66. BIN
      Resources/Textures/Civ14/Weapons/Guns/Z-6.rsi/bolt-open.png
  67. BIN
      Resources/Textures/Civ14/Weapons/Guns/Z-6.rsi/icon.png
  68. BIN
      Resources/Textures/Civ14/Weapons/Guns/Z-6.rsi/inhand-left.png
  69. BIN
      Resources/Textures/Civ14/Weapons/Guns/Z-6.rsi/inhand-right.png
  70. 0 31
      Resources/Textures/Civ14/Weapons/Guns/Z-6.rsi/meta.json
  71. 24 0
      Resources/Textures/Civ14/Weapons/Guns/addmag.py
  72. 52 0
      Resources/Textures/Civ14/Weapons/Guns/addwieleded.py
  73. 44 36
      Resources/Textures/Civ14/Weapons/Guns/ak101.rsi/meta.json
  74. BIN
      Resources/Textures/Civ14/Weapons/Guns/ak101.rsi/wielded-inhand-left.png
  75. BIN
      Resources/Textures/Civ14/Weapons/Guns/ak101.rsi/wielded-inhand-right.png
  76. 40 32
      Resources/Textures/Civ14/Weapons/Guns/ak12.rsi/meta.json
  77. BIN
      Resources/Textures/Civ14/Weapons/Guns/ak12.rsi/wielded-inhand-left.png
  78. BIN
      Resources/Textures/Civ14/Weapons/Guns/ak12.rsi/wielded-inhand-right.png
  79. 44 36
      Resources/Textures/Civ14/Weapons/Guns/ak47.rsi/meta.json
  80. BIN
      Resources/Textures/Civ14/Weapons/Guns/ak47.rsi/wielded-inhand-left.png
  81. BIN
      Resources/Textures/Civ14/Weapons/Guns/ak47.rsi/wielded-inhand-right.png
  82. 40 32
      Resources/Textures/Civ14/Weapons/Guns/ak47gold.rsi/meta.json
  83. BIN
      Resources/Textures/Civ14/Weapons/Guns/ak47gold.rsi/wielded-inhand-left.png
  84. BIN
      Resources/Textures/Civ14/Weapons/Guns/ak47gold.rsi/wielded-inhand-right.png
  85. 44 36
      Resources/Textures/Civ14/Weapons/Guns/ak74.rsi/meta.json
  86. BIN
      Resources/Textures/Civ14/Weapons/Guns/ak74.rsi/wielded-inhand-left.png
  87. BIN
      Resources/Textures/Civ14/Weapons/Guns/ak74.rsi/wielded-inhand-right.png
  88. 44 36
      Resources/Textures/Civ14/Weapons/Guns/ak74m.rsi/meta.json
  89. BIN
      Resources/Textures/Civ14/Weapons/Guns/ak74m.rsi/wielded-inhand-left.png
  90. BIN
      Resources/Textures/Civ14/Weapons/Guns/ak74m.rsi/wielded-inhand-right.png
  91. 44 36
      Resources/Textures/Civ14/Weapons/Guns/ak74mtactical.rsi/meta.json
  92. BIN
      Resources/Textures/Civ14/Weapons/Guns/ak74mtactical.rsi/wielded-inhand-left.png
  93. BIN
      Resources/Textures/Civ14/Weapons/Guns/ak74mtactical.rsi/wielded-inhand-right.png
  94. 44 36
      Resources/Textures/Civ14/Weapons/Guns/akms.rsi/meta.json
  95. BIN
      Resources/Textures/Civ14/Weapons/Guns/akms.rsi/wielded-inhand-left.png
  96. BIN
      Resources/Textures/Civ14/Weapons/Guns/akms.rsi/wielded-inhand-right.png
  97. 44 36
      Resources/Textures/Civ14/Weapons/Guns/akms_folded.rsi/meta.json
  98. BIN
      Resources/Textures/Civ14/Weapons/Guns/akms_folded.rsi/wielded-inhand-left.png
  99. BIN
      Resources/Textures/Civ14/Weapons/Guns/akms_folded.rsi/wielded-inhand-right.png
  100. 44 36
      Resources/Textures/Civ14/Weapons/Guns/aks74.rsi/meta.json

+ 142 - 0
.coderabbit.yaml

@@ -0,0 +1,142 @@
+language: en-GB
+tone_instructions: Use a laid-back tone, and make some jokes every now and then
+early_access: true
+enable_free_tier: true
+reviews:
+  profile: chill
+  request_changes_workflow: false
+  high_level_summary: true
+  high_level_summary_placeholder: "@coderabbitai summary"
+  high_level_summary_in_walkthrough: true
+  auto_title_placeholder: "@coderabbitai"
+  auto_title_instructions: ""
+  review_status: true
+  commit_status: true
+  fail_commit_status: false
+  collapse_walkthrough: false
+  changed_files_summary: true
+  sequence_diagrams: true
+  assess_linked_issues: true
+  related_issues: true
+  related_prs: true
+  suggested_labels: true
+  auto_apply_labels: false
+  suggested_reviewers: true
+  auto_assign_reviewers: false
+  poem: true
+  labeling_instructions: []
+  path_filters: ["!**/meta.json"]
+  path_instructions:
+    - path: "**/*.json"
+      instructions: ignore these files
+  abort_on_close: true
+  disable_cache: false
+  auto_review:
+    enabled: true
+    auto_incremental_review: true
+    ignore_title_keywords: []
+    labels: []
+    drafts: false
+    base_branches: []
+  finishing_touches:
+    docstrings:
+      enabled: true
+    unit_tests:
+      enabled: true
+  tools:
+    ast-grep:
+      rule_dirs: []
+      util_dirs: []
+      essential_rules: true
+      packages: []
+    shellcheck:
+      enabled: true
+    ruff:
+      enabled: true
+    markdownlint:
+      enabled: true
+    github-checks:
+      enabled: false
+      timeout_ms: 300000
+    languagetool:
+      enabled: true
+      enabled_rules: []
+      disabled_rules: []
+      enabled_categories: []
+      disabled_categories: []
+      enabled_only: false
+      level: default
+    biome:
+      enabled: true
+    hadolint:
+      enabled: true
+    swiftlint:
+      enabled: true
+    phpstan:
+      enabled: true
+      level: default
+    golangci-lint:
+      enabled: true
+    yamllint:
+      enabled: true
+    gitleaks:
+      enabled: true
+    checkov:
+      enabled: true
+    detekt:
+      enabled: true
+    eslint:
+      enabled: true
+    rubocop:
+      enabled: true
+    buf:
+      enabled: true
+    regal:
+      enabled: true
+    actionlint:
+      enabled: true
+    pmd:
+      enabled: true
+    cppcheck:
+      enabled: true
+    semgrep:
+      enabled: true
+    circleci:
+      enabled: true
+    sqlfluff:
+      enabled: true
+    prismaLint:
+      enabled: true
+    oxc:
+      enabled: true
+    shopifyThemeCheck:
+      enabled: true
+chat:
+  auto_reply: true
+  integrations:
+    jira:
+      usage: disabled
+    linear:
+      usage: disabled
+knowledge_base:
+  opt_out: false
+  web_search:
+    enabled: true
+  learnings:
+    scope: auto
+  issues:
+    scope: auto
+  jira:
+    usage: auto
+    project_keys: []
+  linear:
+    usage: auto
+    team_keys: []
+  pull_requests:
+    scope: auto
+code_generation:
+  docstrings:
+    language: en-GB
+    path_instructions: []
+  unit_tests:
+    path_instructions: []

+ 40 - 38
Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs

@@ -101,7 +101,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = explodeName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/smite.svg.192dpi.png")),
+            Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/smite.svg.192dpi.png")),
             Act = () =>
             {
                 var coords = _transformSystem.GetMapCoordinates(args.Target);
@@ -122,7 +122,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = chessName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Fun/Tabletop/chessboard.rsi"), "chessboard"),
+            Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/Tabletop/chessboard.rsi"), "chessboard"),
             Act = () =>
             {
                 _sharedGodmodeSystem.EnableGodmode(args.Target); // So they don't suffocate.
@@ -151,7 +151,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
             {
                 Text = flamesName,
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Fire/fire.png")),
+                Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/Alerts/Fire/fire.png")),
                 Act = () =>
                 {
                     // Fuck you. Burn Forever.
@@ -174,7 +174,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = monkeyName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Rsi(new ("/Textures/Mobs/Animals/monkey.rsi"), "monkey"),
+            Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Animals/monkey.rsi"), "monkey"),
             Act = () =>
             {
                 _polymorphSystem.PolymorphEntity(args.Target, "AdminMonkeySmite");
@@ -189,7 +189,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = disposalBinName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Rsi(new ("/Textures/Structures/Piping/disposal.rsi"), "disposal"),
+            Icon = new SpriteSpecifier.Rsi(new("/Textures/Structures/Piping/disposal.rsi"), "disposal"),
             Act = () =>
             {
                 _polymorphSystem.PolymorphEntity(args.Target, "AdminDisposalsSmite");
@@ -207,20 +207,21 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
             {
                 Text = hardElectrocuteName,
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Rsi(new ("/Textures/Clothing/Hands/Gloves/Color/yellow.rsi"), "icon"),
+                Icon = new SpriteSpecifier.Rsi(new("/Textures/Clothing/Hands/Gloves/Color/yellow.rsi"), "icon"),
                 Act = () =>
                 {
                     int damageToDeal;
-                    if (!_mobThresholdSystem.TryGetThresholdForState(args.Target, MobState.Critical, out var criticalThreshold)) {
+                    if (!_mobThresholdSystem.TryGetThresholdForState(args.Target, MobState.Critical, out var criticalThreshold))
+                    {
                         // We can't crit them so try killing them.
                         if (!_mobThresholdSystem.TryGetThresholdForState(args.Target, MobState.Dead,
                                 out var deadThreshold))
                             return;// whelp.
-                        damageToDeal = deadThreshold.Value.Int() - (int) damageable.TotalDamage;
+                        damageToDeal = deadThreshold.Value.Int() - (int)damageable.TotalDamage;
                     }
                     else
                     {
-                        damageToDeal = criticalThreshold.Value.Int() - (int) damageable.TotalDamage;
+                        damageToDeal = criticalThreshold.Value.Int() - (int)damageable.TotalDamage;
                     }
 
                     if (damageToDeal <= 0)
@@ -253,7 +254,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
             {
                 Text = creamPieName,
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Consumable/Food/Baked/pie.rsi"), "plain-slice"),
+                Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Consumable/Food/Baked/pie.rsi"), "plain-slice"),
                 Act = () =>
                 {
                     _creamPieSystem.SetCreamPied(args.Target, creamPied, true);
@@ -271,7 +272,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
             {
                 Text = bloodRemovalName,
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Rsi(new ("/Textures/Fluids/tomato_splat.rsi"), "puddle-1"),
+                Icon = new SpriteSpecifier.Rsi(new("/Textures/Fluids/tomato_splat.rsi"), "puddle-1"),
                 Act = () =>
                 {
                     _bloodstreamSystem.SpillAllSolutions(args.Target, bloodstream);
@@ -324,7 +325,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
             {
                 Text = handsRemovalName,
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/AdminActions/remove-hands.png")),
+                Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/remove-hands.png")),
                 Act = () =>
                 {
                     var baseXform = Transform(args.Target);
@@ -347,7 +348,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
             {
                 Text = handRemovalName,
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/AdminActions/remove-hand.png")),
+                Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/remove-hand.png")),
                 Act = () =>
                 {
                     var baseXform = Transform(args.Target);
@@ -371,7 +372,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
             {
                 Text = stomachRemovalName,
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Rsi(new ("/Textures/Mobs/Species/Human/organs.rsi"), "stomach"),
+                Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Species/Human/organs.rsi"), "stomach"),
                 Act = () =>
                 {
                     foreach (var entity in _bodySystem.GetBodyOrganEntityComps<StomachComponent>((args.Target, body)))
@@ -392,7 +393,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
             {
                 Text = lungRemovalName,
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Rsi(new ("/Textures/Mobs/Species/Human/organs.rsi"), "lung-r"),
+                Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Species/Human/organs.rsi"), "lung-r"),
                 Act = () =>
                 {
                     foreach (var entity in _bodySystem.GetBodyOrganEntityComps<LungComponent>((args.Target, body)))
@@ -416,7 +417,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
             {
                 Text = pinballName,
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Fun/toys.rsi"), "basketball"),
+                Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/toys.rsi"), "basketball"),
                 Act = () =>
                 {
                     var xform = Transform(args.Target);
@@ -451,7 +452,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
             {
                 Text = yeetName,
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")),
+                Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")),
                 Act = () =>
                 {
                     var xform = Transform(args.Target);
@@ -483,7 +484,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = breadName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Consumable/Food/Baked/bread.rsi"), "plain"),
+            Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Consumable/Food/Baked/bread.rsi"), "plain"),
             Act = () =>
             {
                 _polymorphSystem.PolymorphEntity(args.Target, "AdminBreadSmite");
@@ -498,7 +499,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = mouseName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Rsi(new ("/Textures/Mobs/Animals/mouse.rsi"), "icon-0"),
+            Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Animals/mouse.rsi"), "icon-0"),
             Act = () =>
             {
                 _polymorphSystem.PolymorphEntity(args.Target, "AdminMouseSmite");
@@ -515,7 +516,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
             {
                 Text = ghostKickName,
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/gavel.svg.192dpi.png")),
+                Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/gavel.svg.192dpi.png")),
                 Act = () =>
                 {
                     _ghostKickManager.DoDisconnect(actorComponent.PlayerSession.Channel, "Smitten.");
@@ -534,7 +535,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
             {
                 Text = nyanifyName,
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Rsi(new ("/Textures/Clothing/Head/Hats/catears.rsi"), "icon"),
+                Icon = new SpriteSpecifier.Rsi(new("/Textures/Clothing/Head/Hats/catears.rsi"), "icon"),
                 Act = () =>
                 {
                     var ears = Spawn("ClothingHeadHatCatEars", Transform(args.Target).Coordinates);
@@ -552,7 +553,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
             {
                 Text = killSignName,
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Misc/killsign.rsi"), "icon"),
+                Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Misc/killsign.rsi"), "icon"),
                 Act = () =>
                 {
                     EnsureComp<KillSignComponent>(args.Target);
@@ -568,7 +569,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
                 Text = cluwneName,
                 Category = VerbCategory.Smite,
 
-                Icon = new SpriteSpecifier.Rsi(new ("/Textures/Clothing/Mask/cluwne.rsi"), "icon"),
+                Icon = new SpriteSpecifier.Rsi(new("/Textures/Clothing/Mask/cluwne.rsi"), "icon"),
 
                 Act = () =>
                 {
@@ -584,7 +585,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
             {
                 Text = maidenName,
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Rsi(new ("/Textures/Clothing/Uniforms/Jumpskirt/janimaid.rsi"), "icon"),
+                Icon = new SpriteSpecifier.Rsi(new("/Textures/Clothing/Uniforms/Jumpskirt/janimaid.rsi"), "icon"),
                 Act = () =>
                 {
                     SetOutfitCommand.SetOutfit(args.Target, "JanitorMaidGear", EntityManager, (_, clothing) =>
@@ -605,7 +606,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = angerPointingArrowsName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Rsi(new ("/Textures/Interface/Misc/pointing.rsi"), "pointing"),
+            Icon = new SpriteSpecifier.Rsi(new("/Textures/Interface/Misc/pointing.rsi"), "pointing"),
             Act = () =>
             {
                 EnsureComp<PointingArrowAngeringComponent>(args.Target);
@@ -620,7 +621,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = dustName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Materials/materials.rsi"), "ash"),
+            Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Materials/materials.rsi"), "ash"),
             Act = () =>
             {
                 EntityManager.QueueDeleteEntity(args.Target);
@@ -637,7 +638,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = youtubeVideoSimulationName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/Misc/buffering_smite_icon.png")),
+            Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/Misc/buffering_smite_icon.png")),
             Act = () =>
             {
                 EnsureComp<BufferingComponent>(args.Target);
@@ -652,7 +653,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = instrumentationName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Fun/Instruments/h_synthesizer.rsi"), "supersynth"),
+            Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/Instruments/h_synthesizer.rsi"), "supersynth"),
             Act = () =>
             {
                 _polymorphSystem.PolymorphEntity(args.Target, "AdminInstrumentSmite");
@@ -685,7 +686,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = reptilianName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Fun/toys.rsi"), "plushie_lizard"),
+            Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/toys.rsi"), "plushie_lizard"),
             Act = () =>
             {
                 _polymorphSystem.PolymorphEntity(args.Target, "AdminLizardSmite");
@@ -700,7 +701,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = lockerName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Rsi(new ("/Textures/Structures/Storage/closet.rsi"), "generic"),
+            Icon = new SpriteSpecifier.Rsi(new("/Textures/Structures/Storage/closet.rsi"), "generic"),
             Act = () =>
             {
                 var xform = Transform(args.Target);
@@ -723,7 +724,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = headstandName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")),
+            Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")),
             Act = () =>
             {
                 EnsureComp<HeadstandComponent>(args.Target);
@@ -738,7 +739,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = zoomInName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/AdminActions/zoom.png")),
+            Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/zoom.png")),
             Act = () =>
             {
                 var eye = EnsureComp<ContentEyeComponent>(args.Target);
@@ -754,7 +755,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = flipEyeName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/AdminActions/flip.png")),
+            Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/flip.png")),
             Act = () =>
             {
                 var eye = EnsureComp<ContentEyeComponent>(args.Target);
@@ -770,7 +771,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = runWalkSwapName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/AdminActions/run-walk-swap.png")),
+            Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/run-walk-swap.png")),
             Act = () =>
             {
                 var movementSpeed = EnsureComp<MovementSpeedModifierComponent>(args.Target);
@@ -791,7 +792,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = backwardsAccentName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/AdminActions/help-backwards.png")),
+            Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/help-backwards.png")),
             Act = () =>
             {
                 EnsureComp<BackwardsAccentComponent>(args.Target);
@@ -806,7 +807,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = disarmProneName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/Actions/disarm.png")),
+            Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/Actions/disarm.png")),
             Act = () =>
             {
                 EnsureComp<DisarmProneComponent>(args.Target);
@@ -821,7 +822,7 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
         {
             Text = superSpeedName,
             Category = VerbCategory.Smite,
-            Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/AdminActions/super_speed.png")),
+            Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/super_speed.png")),
             Act = () =>
             {
                 var movementSpeed = EnsureComp<MovementSpeedModifierComponent>(args.Target);
@@ -913,7 +914,8 @@ private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
                 EnsureComp<SouthernAccentComponent>(args.Target);
                 EnsureComp<SpanishAccentComponent>(args.Target);
                 EnsureComp<StutteringAccentComponent>(args.Target);
-
+                EnsureComp<MedievalAccentComponent>(args.Target); // Goobtation
+                EnsureComp<OhioAccentComponent>(args.Target); // Goobtation
                 if (_random.Next(0, 8) == 0)
                 {
                     EnsureComp<BackwardsAccentComponent>(args.Target); // was asked to make this at a low chance idk

+ 1 - 0
Content.Server/Discord/DiscordLink/DiscordChatILink.cs

@@ -76,6 +76,7 @@ public async Task SendMessage(string message, string author, ChatChannel channel
         var channelId = channel switch
         {
             ChatChannel.OOC => _oocChannelId,
+            ChatChannel.Dead => _oocChannelId,
             ChatChannel.AdminChat => _adminChannelId,
             _ => throw new InvalidOperationException("Channel not linked to Discord."),
         };

+ 8 - 2
Content.Server/GameTicking/GameTicker.RoundFlow.cs

@@ -78,8 +78,14 @@ private set
         /// <returns></returns>
         public bool CanUpdateMap()
         {
-            return RunLevel == GameRunLevel.PreRoundLobby &&
-                   _roundStartTime - RoundPreloadTime > _gameTiming.CurTime;
+            if (RunLevel == GameRunLevel.PreRoundLobby || RunLevel == GameRunLevel.PostRound)
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
         }
 
         /// <summary>

+ 19 - 4
Content.Server/GameTicking/GameTicker.Spawning.cs

@@ -154,18 +154,33 @@ private List<EntityUid> GetSpawnableStations()
 
             foreach (var tracker in EntityQuery<RespawnTrackerComponent>())
             {
+
                 foreach (var (player1, time) in tracker.RespawnQueue)
                 {
                     if (player1 == player.UserId)
                     {
-                        if (_gameTiming.CurTime < time)
+                        if (!tracker.Fixed)
+                        {
+                            if (_gameTiming.CurTime < time)
+                            {
+                                _chatManager.DispatchServerMessage(player,
+                                    Loc.GetString("rule-respawn-blocked", ("seconds", Math.Ceiling(time.TotalSeconds - _gameTiming.CurTime.TotalSeconds))));
+                                return;
+                            }
+                        }
+                        else
                         {
-                            _chatManager.DispatchServerMessage(player,
-                                Loc.GetString("rule-respawn-blocked", ("seconds", Math.Ceiling(time.TotalSeconds - _gameTiming.CurTime.TotalSeconds))));
-                            return;
+                            if (_gameTiming.CurTime < tracker.GlobalTimer)
+                            {
+                                _chatManager.DispatchServerMessage(player,
+                                    Loc.GetString("rule-respawn-blocked", ("seconds", Math.Ceiling(tracker.GlobalTimer.TotalSeconds - _gameTiming.CurTime.TotalSeconds))));
+                                return;
+                            }
                         }
+
                     }
                 }
+
             }
             //if TDM, check if the teams are balanced
             var factionCount = GetPlayerFactionCounts();

+ 7 - 2
Content.Server/GameTicking/Rules/Components/GracewallComponent.cs

@@ -12,7 +12,7 @@ public sealed partial class GracewallRuleComponent : Component
     /// How long the grace wall lasts since the round started
     /// </summary>
     [DataField("gracewallDuration")]
-    public TimeSpan GracewallDuration { get; set; } = TimeSpan.FromMinutes(5);
+    public TimeSpan GracewallDuration { get; set; } = TimeSpan.FromMinutes(3);
     /// <summary>
     /// Is the grace wall currently active?
     /// </summary>
@@ -44,5 +44,10 @@ public sealed partial class GracewallAreaComponent : Component
     /// </summary>
     [DataField("blockingFactions")]
     public List<string> BlockingFactions { get; set; } = ["All"];
-
+    /// <summary>
+    /// Does the grace wall "go down" or is it permanent?
+    /// Permanent ones are useful to stop spawnkilling
+    /// </summary>
+    [DataField("permanent")]
+    public bool Permanent { get; set; } = false;
 }

+ 32 - 0
Content.Server/GameTicking/Rules/Components/RandomWeatherRuleComponent.cs

@@ -0,0 +1,32 @@
+using Content.Shared.FixedPoint;
+using Content.Shared.Roles;
+using Content.Shared.Storage;
+using Robust.Shared.Network;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
+
+namespace Content.Server.GameTicking.Rules.Components;
+
+/// <summary>
+/// Gamerule that sets a random weather effect for this map.
+/// </summary>
+[RegisterComponent, Access(typeof(RandomWeatherRuleSystem))]
+public sealed partial class RandomWeatherRuleComponent : Component
+{
+
+    [DataField("allowedWeathers")]
+    public List<string> AllowedWeathers = ["Clear"];
+
+    [DataField("currentWeather")]
+    public string CurrentWeather = "Clear";
+
+    /// <summary>
+    /// List of pre-set colors, mostly for tdm maps so we can set fixed times of day.
+    /// </summary>
+    [DataField]
+    public List<string> DayTimes = [
+        "Day", //Daylight #D8B059
+        "Dawn", //Dawn/Dusk #cf7330
+        "Night", //Moonlight #2b3143
+    ];
+}

+ 12 - 0
Content.Server/GameTicking/Rules/Components/RespawnTrackerComponent.cs

@@ -33,4 +33,16 @@ public sealed partial class RespawnTrackerComponent : Component
     /// </summary>
     [DataField]
     public bool DeleteBody = true;
+
+
+    /// <summary>
+    /// Is the spawn timer running at a set time for everyone, or X amount of time since death?
+    /// </summary>
+    [DataField]
+    public bool Fixed = false;
+    /// <summary>
+    /// Only used if fixed is true
+    /// </summary>
+    [DataField]
+    public TimeSpan GlobalTimer = TimeSpan.Zero;
 }

+ 77 - 30
Content.Server/GameTicking/Rules/GracewallRuleSystem.cs

@@ -1,4 +1,3 @@
-
 using Content.Server.GameTicking.Rules.Components;
 using Content.Shared.NPC.Components;
 using Content.Shared.Physics;
@@ -9,24 +8,29 @@
 using Robust.Shared.Physics;
 using Content.Shared.GameTicking.Components;
 using Robust.Shared.Physics.Components;
+using System.Collections.Generic;
 
 namespace Content.Server.GameTicking.Rules;
 
 public sealed class GracewallRuleSystem : GameRuleSystem<GracewallRuleComponent>
 {
     [Dependency] private readonly SharedPhysicsSystem _physics = default!;
-    // Define a specific collision group for the grace wall.
-    // Make sure this group is defined in CollisionGroups.yml and NPCs are set to not collide with it.
     [Dependency] private readonly ChatSystem _chat = default!;
-    private const int GraceWallCollisionGroup = (int)CollisionGroup.MidImpassable; // Example: Use MidImpassable or define a custom one
+    [Dependency] private readonly IGameTiming _gameTiming = default!;
+
+    private const int GraceWallCollisionGroup = (int)CollisionGroup.MidImpassable;
+
+    // Cache for entity passability checks
+    private Dictionary<EntityUid, bool> _passabilityCache = new();
+    private TimeSpan _lastCacheClear;
+    private const float CacheClearInterval = 5.0f; // Clear cache every 5 seconds
 
-    private FixturesComponent? _fixtures;
     public override void Initialize()
     {
         base.Initialize();
 
         SubscribeLocalEvent<GracewallAreaComponent, StartCollideEvent>(OnStartCollide);
-        // Potentially subscribe to PreventCollideEvent if more fine-grained control is needed
+        SubscribeLocalEvent<GracewallAreaComponent, PreventCollideEvent>(OnPreventCollide);
     }
 
     protected override void Started(EntityUid uid, GracewallRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
@@ -35,6 +39,8 @@ protected override void Started(EntityUid uid, GracewallRuleComponent component,
 
         component.Timer = (float)component.GracewallDuration.TotalSeconds;
         component.GracewallActive = true;
+        _lastCacheClear = _gameTiming.CurTime;
+
         // Schedule the announcement for 15 seconds later
         var announcementMessage = $"The grace wall is up for {component.GracewallDuration.TotalMinutes} minutes!";
         Timer.Spawn(TimeSpan.FromSeconds(15), () =>
@@ -65,10 +71,18 @@ public override void Update(float frameTime)
     {
         base.Update(frameTime);
 
+        // Clear cache periodically to avoid memory leaks
+        var currentTime = _gameTiming.CurTime;
+        if (currentTime - _lastCacheClear > TimeSpan.FromSeconds(CacheClearInterval))
+        {
+            _passabilityCache.Clear();
+            _lastCacheClear = currentTime;
+        }
+
         var query = EntityQueryEnumerator<GracewallRuleComponent, GameRuleComponent>();
-        while (query.MoveNext(out var uid, out var gracewall, out var gameRule))
+        while (query.MoveNext(out var ruleUid, out var gracewall, out var gameRule))
         {
-            if (!GameTicker.IsGameRuleActive(uid, gameRule) || !gracewall.GracewallActive)
+            if (!GameTicker.IsGameRuleActive(ruleUid, gameRule) || !gracewall.GracewallActive)
                 continue;
 
             gracewall.Timer -= frameTime;
@@ -90,8 +104,11 @@ private void DeactivateAllGraceWalls(GracewallRuleComponent component)
         var query = EntityQueryEnumerator<GracewallAreaComponent, FixturesComponent>();
         while (query.MoveNext(out var wallUid, out var area, out var fixtures))
         {
-            area.GracewallActive = false;
-            UpdateGracewallPhysics(wallUid, area, fixtures, false);
+            if (area.Permanent == false)
+            {
+                area.GracewallActive = false;
+                UpdateGracewallPhysics(wallUid, area, fixtures, false);
+            }
         }
     }
 
@@ -99,44 +116,74 @@ private void UpdateGracewallPhysics(EntityUid uid, GracewallAreaComponent compon
     {
         // Check if the specific fixture we defined in the prototype exists
         if (!fixtures.Fixtures.TryGetValue("gracewall", out var fixture))
-
         {
             Log.Warning($"Gracewall entity {ToPrettyString(uid)} is missing the 'gracewall' fixture!");
-            // Attempt to create it dynamically if missing? Or just rely on the prototype.
-            // For now, we'll just log a warning. If it's consistently missing, the prototype needs fixing.
             return;
         }
 
         // Modify the fixture's collision properties
-        // This assumes NPCs have a mask that *doesn't* include GraceWallCollisionGroup
         _physics.SetCollisionLayer(uid, "gracewall", fixture, active ? GraceWallCollisionGroup : (int)CollisionGroup.None);
-        // Setting the layer might require refreshing contacts or waking the body if it's asleep
-        // to ensure the change takes effect immediately.
+
+        // Ensure the change takes effect immediately
         if (TryComp<PhysicsComponent>(uid, out var physics))
             _physics.WakeBody(uid, body: physics);
-        // Ensure the radius is correct (it might change dynamically later)
-        // This requires getting the specific fixture and modifying its shape.
-        // For simplicity, we assume the prototype radius is sufficient for now.
-        // If dynamic radius is needed, we'd need more complex logic here.
     }
 
     private void OnStartCollide(EntityUid uid, GracewallAreaComponent component, ref StartCollideEvent args)
     {
-        // This event triggers when something *starts* colliding with the grace wall fixture.
-        // We only care when the wall is active.
+        // This event is kept minimal to reduce lag
         if (!component.GracewallActive)
             return;
+    }
+
+    private bool CheckPassable(EntityUid entityTryingToPass, GracewallAreaComponent component)
+    {
+        // Check cache first
+        if (_passabilityCache.TryGetValue(entityTryingToPass, out var result))
+            return result;
 
-        // Check if the other entity is an NPC
-        var otherUid = args.OtherEntity;
-        if (HasComp<NpcFactionMemberComponent>(otherUid))
+        // Original logic
+        if (TryComp<NpcFactionMemberComponent>(entityTryingToPass, out var factions))
         {
-            // The collision system *should* prevent entry based on layers/masks.
-            // However, if an NPC somehow starts colliding (e.g., spawned inside, teleported),
-            // we could potentially push them out here.
-            // For now, we rely on the collision group preventing entry.
-            // Log.Debug($"NPC {ToPrettyString(otherUid)} collided with active grace wall {ToPrettyString(uid)}.");
+            foreach (var faction in component.BlockingFactions)
+            {
+                if (faction == "All")
+                {
+                    _passabilityCache[entityTryingToPass] = true;
+                    return true;
+                }
+                foreach (var member in factions.Factions)
+                {
+                    if (member.ToString() == faction)
+                    {
+                        _passabilityCache[entityTryingToPass] = true;
+                        return true;
+                    }
+                }
+            }
         }
+
+        _passabilityCache[entityTryingToPass] = false;
+        return false;
     }
 
+    private void OnPreventCollide(EntityUid uid, GracewallAreaComponent component, ref PreventCollideEvent args)
+    {
+        // Only handle collisions when the wall is active
+        if (!component.GracewallActive)
+            return;
+
+        // Get the entity trying to pass through
+        var otherEntity = args.OtherEntity;
+
+        // Skip processing for entities we've already determined can pass
+        if (_passabilityCache.TryGetValue(otherEntity, out var canPass) && canPass)
+            return;
+
+        // Check if the entity trying to pass through should be blocked
+        if (!CheckPassable(otherEntity, component))
+        {
+            args.Cancelled = true;
+        }
+    }
 }

+ 111 - 0
Content.Server/GameTicking/Rules/RandomWeatherRuleSystem.cs

@@ -0,0 +1,111 @@
+using Content.Server.GameTicking.Rules.Components;
+using Content.Shared.GameTicking.Components;
+using Robust.Shared.Random;
+using Content.Shared.Weather;
+using Robust.Shared.Timing;
+using System; // For TimeSpan
+using Robust.Shared.Prototypes;
+using Robust.Shared.Map;
+using System.Collections.Generic;
+using Robust.Shared.Map.Components;
+
+namespace Content.Server.GameTicking.Rules;
+
+/// <summary>
+/// This handles the weather for a specific map
+/// </summary>
+public sealed class RandomWeatherRuleSystem : GameRuleSystem<RandomWeatherRuleComponent>
+{
+    [Dependency] private readonly IRobustRandom _random = default!;
+    [Dependency] private readonly ILogManager _logManager = default!;
+    [Dependency] private readonly SharedWeatherSystem _weather = default!;
+    [Dependency] private readonly IPrototypeManager _protoManager = default!;
+    [Dependency] private readonly IGameTiming _gameTiming = default!;
+    [Dependency] private readonly IMapManager _mapManager = default!;
+    [Dependency] private readonly IEntityManager _entManager = default!;
+    private ISawmill _sawmill = default!;
+    /// <inheritdoc/>
+    public override void Initialize()
+    {
+        base.Initialize();
+        _sawmill = _logManager.GetSawmill("random-weather-rule");
+        // The base GameRuleSystem<T> already subscribes to GameRuleStartedEvent
+        // and calls the virtual Started() method. No need to subscribe manually here.
+    }
+
+    protected override void Started(EntityUid uid, RandomWeatherRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
+    {
+        base.Started(uid, component, gameRule, args); // It's good practice to call the base method.
+        PickRandomWeather(uid, component);
+        PickRandomDaytime(uid, component);
+    }
+
+    /// <summary>
+    /// Picks a random weather from the component's AllowedWeathers list and sets it as the CurrentWeather.
+    /// </summary>
+    public void PickRandomWeather(EntityUid uid, RandomWeatherRuleComponent? component = null)
+    {
+        if (!Resolve(uid, ref component))
+            return;
+
+        if (component.AllowedWeathers.Count == 0)
+        {
+            _sawmill.Warning($"AllowedWeathers list is empty for RandomWeatherRule on {ToPrettyString(uid)}. Rule will not pick a new weather.");
+            return;
+        }
+
+        component.CurrentWeather = _random.Pick(component.AllowedWeathers);
+        // Get the MapId from the entity's transform
+
+        _sawmill.Info($"Selected weather: {component.CurrentWeather}");
+        var endTime = _gameTiming.CurTime + TimeSpan.FromSeconds(3600); // Weather duration of 1 hour
+        WeatherPrototype? weather = null;
+        if (component.CurrentWeather != "Clear")
+        {
+            if (!_protoManager.TryIndex(component.CurrentWeather, out weather))
+            {
+                _sawmill.Error($"Unknown weather {component.CurrentWeather}!");
+                return;
+            }
+        }
+        foreach (var mapId in _mapManager.GetAllMapIds())
+        {
+            _weather.SetWeather(mapId, weather, endTime);
+        }
+    }
+
+
+
+    public void PickRandomDaytime(EntityUid uid, RandomWeatherRuleComponent? component = null)
+    {
+        if (!Resolve(uid, ref component))
+            return;
+        var chosenDaylight = _random.Pick(component.DayTimes);
+
+        _sawmill.Info($"Selected daytime: {chosenDaylight}");
+        var pickedLight = "#D8B059";
+        if (chosenDaylight == "Day")
+        {
+            pickedLight = "#D8B059";
+        }
+        else if (chosenDaylight == "Dawn" || chosenDaylight == "Dusk")
+        {
+            pickedLight = "#cf7330";
+        }
+        else if (chosenDaylight == "Night")
+        {
+            pickedLight = "#2b3143";
+        }
+        foreach (var mapId in _mapManager.GetAllMapIds())
+        {
+            var mapEntityUid = _mapManager.GetMapEntityId(mapId);
+            var lighting = _entManager.EnsureComponent<MapLightComponent>(mapEntityUid);
+            var color = Color.TryFromHex(pickedLight);
+            if (color.HasValue)
+            {
+                lighting.AmbientLightColor = color.Value;
+                _entManager.Dirty(mapEntityUid, lighting);
+            }
+        }
+    }
+}

+ 42 - 13
Content.Server/GameTicking/Rules/RespawnRuleSystem.cs

@@ -13,6 +13,7 @@
 using Robust.Shared.Player;
 using Robust.Shared.Timing;
 using Robust.Shared.Utility;
+using Content.Server.Chat.Systems;
 
 namespace Content.Server.GameTicking.Rules;
 
@@ -25,7 +26,8 @@ public sealed class RespawnRuleSystem : GameRuleSystem<RespawnDeadRuleComponent>
     [Dependency] private readonly IGameTiming _timing = default!;
     [Dependency] private readonly IPlayerManager _playerManager = default!;
     [Dependency] private readonly StationSystem _station = default!;
-
+    [Dependency] private readonly ChatSystem _chat = default!;
+    private bool _announced = false;
     /// <inheritdoc/>
     public override void Initialize()
     {
@@ -33,6 +35,10 @@ public override void Initialize()
 
         SubscribeLocalEvent<SuicideEvent>(OnSuicide);
         SubscribeLocalEvent<MobStateChangedEvent>(OnMobStateChanged);
+        foreach (var tracker in EntityQuery<RespawnTrackerComponent>())
+        {
+            tracker.GlobalTimer = _timing.CurTime + tracker.RespawnDelay;
+        }
     }
 
     public override void Update(float frameTime)
@@ -44,23 +50,46 @@ public override void Update(float frameTime)
 
         foreach (var tracker in EntityQuery<RespawnTrackerComponent>())
         {
-            foreach (var (player, time) in tracker.RespawnQueue)
+            if (!tracker.Fixed)
+            {
+                foreach (var (player, time) in tracker.RespawnQueue)
+                {
+                    if (_timing.CurTime < time)
+                        continue;
+
+                    if (!_playerManager.TryGetSessionById(player, out var session))
+                        continue;
+                    //This autorespawner is disabled since people can manually return to the lobby.
+                    //We just check on the spawn event if the player is not in the queue.
+                    //if (session.GetMind() is { } mind && TryComp<MindComponent>(mind, out var mindComp) && mindComp.OwnedEntity.HasValue)
+                    //    QueueDel(mindComp.OwnedEntity.Value);
+                    //GameTicker.MakeJoinGame(session, station, silent: true);
+                    tracker.RespawnQueue.Remove(player);
+                }
+            }
+            else
             {
-                if (_timing.CurTime < time)
-                    continue;
-
-                if (!_playerManager.TryGetSessionById(player, out var session))
-                    continue;
-                //This autorespawner is disabled since people can manually return to the lobby.
-                //We just check on the spawn event if the player is not in the queue.
-                //if (session.GetMind() is { } mind && TryComp<MindComponent>(mind, out var mindComp) && mindComp.OwnedEntity.HasValue)
-                //    QueueDel(mindComp.OwnedEntity.Value);
-                //GameTicker.MakeJoinGame(session, station, silent: true);
-                tracker.RespawnQueue.Remove(player);
+                if (_timing.CurTime > tracker.GlobalTimer && _announced == false)
+                {
+                    _announced = true;
+                    var announcementMessage = "Reinforcements are arriving!";
+                    RespawnFixed(tracker);
+                    _chat.DispatchGlobalAnnouncement(announcementMessage, "Round", false, null, Color.Yellow);
+                    tracker.GlobalTimer = _timing.CurTime + tracker.RespawnDelay;
+                    _announced = false;
+                }
             }
         }
     }
 
+    private void RespawnFixed(RespawnTrackerComponent tracker)
+    {
+        foreach (var (player, time) in tracker.RespawnQueue)
+        {
+            tracker.RespawnQueue.Remove(player);
+        }
+    }
+
     private void OnSuicide(SuicideEvent ev)
     {
         if (!TryComp<ActorComponent>(ev.Victim, out var actor))

+ 4 - 1
Content.Server/RoundEnd/RoundEndSystem.cs

@@ -22,6 +22,7 @@
 using Robust.Shared.Prototypes;
 using Robust.Shared.Timing;
 using Timer = Robust.Shared.Timing.Timer;
+using Content.Server.Voting.Managers;
 
 namespace Content.Server.RoundEnd
 {
@@ -42,7 +43,7 @@ public sealed class RoundEndSystem : EntitySystem
         [Dependency] private readonly EmergencyShuttleSystem _shuttle = default!;
         [Dependency] private readonly SharedAudioSystem _audio = default!;
         [Dependency] private readonly StationSystem _stationSystem = default!;
-
+        [Dependency] private readonly IVoteManager _votemanager = default!;
         public TimeSpan DefaultCooldownDuration { get; set; } = TimeSpan.FromSeconds(30);
 
         /// <summary>
@@ -290,6 +291,7 @@ public void EndRound(TimeSpan? countdownTime = null)
                     ("time", time),
                     ("units", Loc.GetString(unitsLocString))));
             Timer.Spawn(countdownTime.Value, AfterEndRoundRestart, _countdownTokenSource.Token);
+            _votemanager.CreateStandardVote(null, Shared.Voting.StandardVoteType.Map);
         }
 
         /// <summary>
@@ -391,3 +393,4 @@ public enum RoundEndBehavior : byte
         Nothing
     }
 }
+

+ 13 - 0
Content.Server/Speech/Components/MedievalAccentComponent.cs

@@ -0,0 +1,13 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Misandry <mary@thughunt.ing>
+// SPDX-FileCopyrightText: 2025 gus <august.eymann@gmail.com>
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+using Robust.Shared.Analyzers;
+using Robust.Shared.GameObjects;
+
+namespace Content.Server.Speech.Components;
+
+[RegisterComponent]
+public sealed partial class MedievalAccentComponent : Component;

+ 12 - 0
Content.Server/Speech/Components/OhioAccentComponent.cs

@@ -0,0 +1,12 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Misandry <mary@thughunt.ing>
+// SPDX-FileCopyrightText: 2025 gus <august.eymann@gmail.com>
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+using Robust.Shared.GameObjects;
+
+namespace Content.Server.Speech.Components;
+
+[RegisterComponent]
+public sealed partial class OhioAccentComponent : Component;

+ 48 - 0
Content.Server/Speech/EntitySystems/MedievalAccentSystem.cs

@@ -0,0 +1,48 @@
+// SPDX-FileCopyrightText: 2024 Aidenkrz <aiden@djkraz.com>
+// SPDX-FileCopyrightText: 2024 BeeRobynn <166929042+BeeRobynn@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2024 Piras314 <p1r4s@proton.me>
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Cattowo <2spoopy4u2handle@gmail.com>
+// SPDX-FileCopyrightText: 2025 Misandry <mary@thughunt.ing>
+// SPDX-FileCopyrightText: 2025 gus <august.eymann@gmail.com>
+// SPDX-FileCopyrightText: 2025 smudge <138918973+Cerise-Cattowo@users.noreply.github.com>
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+using Content.Server.Speech.Components;
+using Robust.Shared.Random;
+
+namespace Content.Server.Speech.EntitySystems;
+
+public sealed class MedievalAccentSystem : EntitySystem
+{
+    [Dependency] private readonly IRobustRandom _random = default!;
+    [Dependency] private readonly ReplacementAccentSystem _replacement = default!;
+
+    public override void Initialize()
+    {
+        base.Initialize();
+        SubscribeLocalEvent<MedievalAccentComponent, AccentGetEvent>(OnAccent);
+    }
+
+    private void OnAccent(EntityUid uid, MedievalAccentComponent component, AccentGetEvent args)
+    {
+        var message = args.Message;
+
+        message = _replacement.ApplyReplacements(message, "medieval");
+
+        // Prefix
+        if (_random.Prob(0.40f))
+        {
+            var pick = _random.Next(1, 42);
+
+            // Reverse sanitize capital
+            message = message[0].ToString().ToLower() + message.Remove(0, 1);
+            message = Loc.GetString($"accent-medieval-prefix-{pick}") + " " + message;
+        }
+
+        // Sanitize capital again, in case we substituted a word that should be capitalized
+        message = message[0].ToString().ToUpper() + message.Remove(0, 1);
+
+        args.Message = message;
+    }
+};

+ 52 - 0
Content.Server/Speech/EntitySystems/OhioAccentSystem.cs

@@ -0,0 +1,52 @@
+// SPDX-FileCopyrightText: 2024 Aidenkrz <aiden@djkraz.com>
+// SPDX-FileCopyrightText: 2024 Piras314 <p1r4s@proton.me>
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Misandry <mary@thughunt.ing>
+// SPDX-FileCopyrightText: 2025 gus <august.eymann@gmail.com>
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+using Content.Server.Speech.Components;
+using Robust.Shared.Random;
+
+namespace Content.Server.Speech.EntitySystems;
+
+public sealed class OhioAccentSystem : EntitySystem
+{
+    [Dependency] private readonly IRobustRandom _random = default!;
+    [Dependency] private readonly ReplacementAccentSystem _replacement = default!;
+
+    public override void Initialize()
+    {
+        base.Initialize();
+        SubscribeLocalEvent<OhioAccentComponent, AccentGetEvent>(OnAccent);
+    }
+
+    private void OnAccent(EntityUid uid, OhioAccentComponent component, AccentGetEvent args)
+    {
+        var message = args.Message;
+
+        message = _replacement.ApplyReplacements(message, "ohio");
+
+        // Prefix
+        if (_random.Prob(0.15f))
+        {
+            var pick = _random.Next(1, 3);
+
+            // Reverse sanitize capital
+            message = message[0].ToString().ToLower() + message.Remove(0, 1);
+            message = Loc.GetString($"accent-ohio-prefix-{pick}") + " " + message;
+        }
+
+        // Sanitize capital again, in case we substituted a word that should be capitalized
+        message = message[0].ToString().ToUpper() + message.Remove(0, 1);
+
+        // Suffixes
+        if (_random.Prob(0.3f))
+        {
+            var pick = _random.Next(1, 8);
+            message += Loc.GetString($"accent-ohio-suffix-{pick}");
+        }
+
+        args.Message = message;
+    }
+};

+ 10 - 18
Content.Server/Voting/Managers/VoteManager.DefaultVotes.cs

@@ -168,7 +168,7 @@ private void StartVote(ICommonSession? initiator)
                 var total = votesYes + votesNo;
 
                 var ratioRequired = _cfg.GetCVar(CCVars.VoteRestartRequiredRatio);
-                if (total > 0 && votesYes / (float) total >= ratioRequired)
+                if (total > 0 && votesYes / (float)total >= ratioRequired)
                 {
                     // Check if an admin is online, and ignore the passed vote if the cvar is enabled
                     if (_cfg.GetCVar(CCVars.VoteRestartNotAllowedWhenAdminOnline) && _adminMgr.ActiveAdmins.Count() != 0)
@@ -245,13 +245,13 @@ private void CreatePresetVote(ICommonSession? initiator)
                 string picked;
                 if (args.Winner == null)
                 {
-                    picked = (string) _random.Pick(args.Winners);
+                    picked = (string)_random.Pick(args.Winners);
                     _chatManager.DispatchServerAnnouncement(
                         Loc.GetString("ui-vote-gamemode-tie", ("picked", Loc.GetString(presets[picked]))));
                 }
                 else
                 {
-                    picked = (string) args.Winner;
+                    picked = (string)args.Winner;
                     _chatManager.DispatchServerAnnouncement(
                         Loc.GetString("ui-vote-gamemode-win", ("winner", Loc.GetString(presets[picked]))));
                 }
@@ -261,7 +261,7 @@ private void CreatePresetVote(ICommonSession? initiator)
             };
         }
 
-        private void CreateMapVote(ICommonSession? initiator)
+        public void CreateMapVote(ICommonSession? initiator)
         {
             var maps = _gameMapManager.CurrentlyEligibleMaps().ToDictionary(map => map, map => map.MapName);
 
@@ -291,13 +291,13 @@ private void CreateMapVote(ICommonSession? initiator)
                 GameMapPrototype picked;
                 if (args.Winner == null)
                 {
-                    picked = (GameMapPrototype) _random.Pick(args.Winners);
+                    picked = (GameMapPrototype)_random.Pick(args.Winners);
                     _chatManager.DispatchServerAnnouncement(
                         Loc.GetString("ui-vote-map-tie", ("picked", maps[picked])));
                 }
                 else
                 {
-                    picked = (GameMapPrototype) args.Winner;
+                    picked = (GameMapPrototype)args.Winner;
                     _chatManager.DispatchServerAnnouncement(
                         Loc.GetString("ui-vote-map-win", ("winner", maps[picked])));
                 }
@@ -313,15 +313,7 @@ private void CreateMapVote(ICommonSession? initiator)
                 }
                 else
                 {
-                    if (ticker.RoundPreloadTime <= TimeSpan.Zero)
-                    {
-                        _chatManager.DispatchServerAnnouncement(Loc.GetString("ui-vote-map-notlobby"));
-                    }
-                    else
-                    {
-                        var timeString = $"{ticker.RoundPreloadTime.Minutes:0}:{ticker.RoundPreloadTime.Seconds:00}";
-                        _chatManager.DispatchServerAnnouncement(Loc.GetString("ui-vote-map-notlobby-time", ("time", timeString)));
-                    }
+                    _chatManager.DispatchServerAnnouncement(Loc.GetString("ui-vote-map-notlobby"));
                 }
             };
         }
@@ -591,13 +583,13 @@ private void TimeoutStandardVote(StandardVoteType type)
 
             foreach (var preset in _prototypeManager.EnumeratePrototypes<GamePresetPrototype>())
             {
-                if(!preset.ShowInVote)
+                if (!preset.ShowInVote)
                     continue;
 
-                if(_playerManager.PlayerCount < (preset.MinPlayers ?? int.MinValue))
+                if (_playerManager.PlayerCount < (preset.MinPlayers ?? int.MinValue))
                     continue;
 
-                if(_playerManager.PlayerCount > (preset.MaxPlayers ?? int.MaxValue))
+                if (_playerManager.PlayerCount > (preset.MaxPlayers ?? int.MaxValue))
                     continue;
 
                 presets[preset.ID] = preset.ModeTitle;

+ 4 - 3
Content.Server/Voting/Managers/VoteManager.cs

@@ -26,6 +26,7 @@
 
 namespace Content.Server.Voting.Managers
 {
+
     public sealed partial class VoteManager : IVoteManager
     {
         [Dependency] private readonly IServerNetManager _netManager = default!;
@@ -276,7 +277,7 @@ private void SendSingleUpdate(VoteReg v, ICommonSession player)
                 msg.IsYourVoteDirty = dirty;
                 if (dirty)
                 {
-                    msg.YourVote = (byte) cast;
+                    msg.YourVote = (byte)cast;
                 }
             }
 
@@ -290,7 +291,7 @@ private void SendSingleUpdate(VoteReg v, ICommonSession player)
             for (var i = 0; i < msg.Options.Length; i++)
             {
                 ref var entry = ref v.Entries[i];
-                msg.Options[i] = (msg.DisplayVotes ? (ushort) entry.Votes : (ushort) 0, entry.Text);
+                msg.Options[i] = (msg.DisplayVotes ? (ushort)entry.Votes : (ushort)0, entry.Text);
             }
 
             player.Channel.SendMessage(msg);
@@ -401,7 +402,7 @@ private void EndVote(VoteReg v)
                 .ToImmutableArray();
             // Store all votes in order for webhooks
             var voteTally = new List<int>();
-            foreach(var entry in v.Entries)
+            foreach (var entry in v.Entries)
             {
                 voteTally.Add(entry.Votes);
             }

+ 4 - 4
Content.Shared/Weather/SharedWeatherSystem.cs

@@ -49,7 +49,7 @@ public bool CanWeatherAffect(EntityUid uid, MapGridComponent grid, TileRef tileR
         if (Resolve(uid, ref roofComp, false) && _roof.IsRooved((uid, grid, roofComp), tileRef.GridIndices))
             return false;
 
-        var tileDef = (ContentTileDefinition) _tileDefManager[tileRef.Tile.TypeId];
+        var tileDef = (ContentTileDefinition)_tileDefManager[tileRef.Tile.TypeId];
 
         if (!tileDef.Weather)
             return false;
@@ -76,11 +76,11 @@ public float GetPercent(WeatherData component, EntityUid mapUid)
 
         if (remaining < WeatherComponent.ShutdownTime)
         {
-            alpha = (float) (remaining / WeatherComponent.ShutdownTime);
+            alpha = (float)(remaining / WeatherComponent.ShutdownTime);
         }
         else if (elapsed < WeatherComponent.StartupTime)
         {
-            alpha = (float) (elapsed / WeatherComponent.StartupTime);
+            alpha = (float)(elapsed / WeatherComponent.StartupTime);
         }
         else
         {
@@ -186,7 +186,7 @@ public void SetWeather(MapId mapId, WeatherPrototype? proto, TimeSpan? endTime)
                 Dirty(mapUid.Value, weatherComp);
             }
         }
-
+        Log.Info("Setting weather to {0}", proto?.ID);
         if (proto != null)
             StartWeather(mapUid.Value, weatherComp, proto, endTime);
     }

+ 22 - 0
Content.Shared/Wieldable/SharedWieldableSystem.cs

@@ -77,6 +77,28 @@ private void OnMeleeAttempt(EntityUid uid, MeleeRequiresWieldComponent component
 
     private void OnShootAttempt(EntityUid uid, GunRequiresWieldComponent component, ref ShotAttemptedEvent args)
     {
+        // Do they have enough hands free?
+        if (!TryComp<HandsComponent>(args.User, out var hands))
+        {
+            args.Cancel();
+        }
+        if (_hands.TryGetEmptyHand(args.User, out var hand, hands) == false)
+        {
+            if (!TryComp<WieldableComponent>(uid, out var _))
+            {
+                args.Cancel();
+                var time = _timing.CurTime;
+                if (time > component.LastPopup + component.PopupCooldown &&
+                    !HasComp<MeleeWeaponComponent>(uid) &&
+                    !HasComp<MeleeRequiresWieldComponent>(uid))
+                {
+                    component.LastPopup = time;
+                    var message = Loc.GetString("wieldable-component-no-free-hands");
+                    _popup.PopupClient(message, args.Used, args.User);
+                }
+            }
+
+        }
         if (TryComp<WieldableComponent>(uid, out var wieldable) &&
             !wieldable.Wielded)
         {

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

@@ -2,7 +2,7 @@
 # Straight in-game baby
 lobbyenabled = true
 # Dev map for faster loading & convenience
-map = "CampWW2"
+map = "Opushka"
 role_timers = false
 lobbyduration = 15
 disallowlatejoins = false

+ 758 - 0
Resources/Locale/en-US/Civ14/accent/medieval.ftl

@@ -0,0 +1,758 @@
+# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 Aiden <aiden@djkraz.com>
+# SPDX-FileCopyrightText: 2025 smudge <138918973+Cerise-Cattowo@users.noreply.github.com>
+#
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
+accent-medieval-prefix-1 = Ah,
+accent-medieval-prefix-2 = Alas,
+accent-medieval-prefix-3 = Avast,
+accent-medieval-prefix-4 = By my faith,
+accent-medieval-prefix-5 = By my trowth,
+accent-medieval-prefix-6 = By my word,
+accent-medieval-prefix-7 = Come,
+accent-medieval-prefix-8 = Forsooth, I say,
+accent-medieval-prefix-9 = Forsooth, say I,
+accent-medieval-prefix-10 = Forsooth, sayeth I,
+accent-medieval-prefix-11 = Forsooth,
+accent-medieval-prefix-12 = Hark,
+accent-medieval-prefix-13 = Harketh,
+accent-medieval-prefix-14 = Hear me,
+accent-medieval-prefix-15 = Heigh-ho,
+accent-medieval-prefix-16 = I pray you,
+accent-medieval-prefix-17 = I say,
+accent-medieval-prefix-18 = I sayeth,
+accent-medieval-prefix-19 = I warrant,
+accent-medieval-prefix-20 = If it pleases you,
+accent-medieval-prefix-21 = In short,
+accent-medieval-prefix-22 = In sooth,
+accent-medieval-prefix-23 = In truth,
+accent-medieval-prefix-24 = Kind sire,
+accent-medieval-prefix-25 = Listen thee,
+accent-medieval-prefix-26 = Listen,
+accent-medieval-prefix-27 = Now hear me,
+accent-medieval-prefix-28 = Perchance,
+accent-medieval-prefix-29 = Pray pardon,
+accent-medieval-prefix-30 = Pray tell,
+accent-medieval-prefix-31 = Pray,
+accent-medieval-prefix-32 = Prithee,
+accent-medieval-prefix-33 = Quoth I,
+accent-medieval-prefix-34 = S'wounds,
+accent-medieval-prefix-35 = Sire,
+accent-medieval-prefix-36 = Surely,
+accent-medieval-prefix-37 = There is much in what you say, and yet,
+accent-medieval-prefix-38 = What hey,
+accent-medieval-prefix-39 = What ho,
+accent-medieval-prefix-40 = Z'wounds,
+accent-medieval-prefix-41 = Zounds,
+
+accent-medieval-words-1 = My milkshake bring all the boys to the yard, and they're like, "it's better than yours." Damn right it's better than yours. I can teach you, but I have to charge!
+accent-medieval-words-replace-1 = Mine milkshake bringeth all yon gentlefolk to mine yard, and lo they reply, "Tis better than thine." Verily, tis better than thine! I couldst apprentice thee, but I wouldst levy a fee!
+
+accent-medieval-words-2 = it is
+accent-medieval-words-replace-2 = 'tis
+
+accent-medieval-words-3 = it was
+accent-medieval-words-replace-3 = 'twas
+
+accent-medieval-words-4 = it were
+accent-medieval-words-replace-4 = 'twere
+
+accent-medieval-words-5 = it will
+accent-medieval-words-replace-5 = 'twould
+
+accent-medieval-words-6 = it's
+accent-medieval-words-replace-6 = 'tis
+
+accent-medieval-words-7 = its
+accent-medieval-words-replace-7 = 'tis
+
+accent-medieval-words-8 = over there
+accent-medieval-words-replace-8 = yonder
+
+accent-medieval-words-9 = shall not
+accent-medieval-words-replace-9 = shan't
+
+accent-medieval-words-10 = there
+accent-medieval-words-replace-10 = thither
+
+accent-medieval-words-11 = will not
+accent-medieval-words-replace-11 = shan't
+
+accent-medieval-words-12 = thank you
+accent-medieval-words-replace-12 = many good thanks to you
+
+accent-medieval-words-13 = thanks
+accent-medieval-words-replace-13 = thankee
+
+accent-medieval-words-14 = you
+accent-medieval-words-replace-14 = thee
+
+accent-medieval-words-15 = your
+accent-medieval-words-replace-15 = thy
+
+accent-medieval-words-16 = yours
+accent-medieval-words-replace-16 = thine
+
+accent-medieval-words-17 = are
+accent-medieval-words-replace-17 = art
+
+accent-medieval-words-18 = kill
+accent-medieval-words-replace-18 = bring low
+
+accent-medieval-words-19 = killed
+accent-medieval-words-replace-19 = bested
+
+accent-medieval-words-20 = goodbye
+accent-medieval-words-replace-20 = I bid thee farewell
+
+accent-medieval-words-21 = bye
+accent-medieval-words-replace-21 = fare thee well
+
+accent-medieval-words-22 = cya
+accent-medieval-words-replace-22 = cheerio
+
+accent-medieval-words-23 = murdered
+accent-medieval-words-replace-23 = slain
+
+accent-medieval-words-24 = murder
+accent-medieval-words-replace-24 = conquered
+
+accent-medieval-words-25 = yes
+accent-medieval-words-replace-25 = aye
+
+accent-medieval-words-26 = no
+accent-medieval-words-replace-26 = nay
+
+accent-medieval-words-27 = yeah
+accent-medieval-words-replace-27 = yea verily
+
+accent-medieval-words-28 = nope
+accent-medieval-words-replace-28 = nayeth
+
+accent-medieval-words-29 = hello
+accent-medieval-words-replace-29 = good day
+
+accent-medieval-words-30 = hi
+accent-medieval-words-replace-30 = ave
+
+accent-medieval-words-31 = sup
+accent-medieval-words-replace-31 = hail
+
+accent-medieval-words-32 = greetings
+accent-medieval-words-replace-32 = well meteth
+
+accent-medieval-words-33 = botanist
+accent-medieval-words-replace-33 = farmer
+
+accent-medieval-words-34 = botany
+accent-medieval-words-replace-34 = the fields
+
+accent-medieval-words-35 = does
+accent-medieval-words-replace-35 = doth
+
+accent-medieval-words-36 = cap
+accent-medieval-words-replace-36 = King
+
+accent-medieval-words-37 = captain
+accent-medieval-words-replace-37 = King
+
+accent-medieval-words-38 = my
+accent-medieval-words-replace-38 = mine
+
+accent-medieval-words-39 = mine
+accent-medieval-words-replace-39 = mine own
+
+accent-medieval-words-40 = nuke disk
+accent-medieval-words-replace-40 = plate of holy fire
+
+accent-medieval-words-41 = disk
+accent-medieval-words-replace-41 = plate of holy fire
+
+accent-medieval-words-42 = food
+accent-medieval-words-replace-42 = bellytimber
+
+accent-medieval-words-43 = bet
+accent-medieval-words-replace-43 = warrant
+
+accent-medieval-words-44 = go
+accent-medieval-words-replace-44 = a-walk
+
+accent-medieval-words-45 = going
+accent-medieval-words-replace-45 = a-walkin'
+
+accent-medieval-words-46 = the
+accent-medieval-words-replace-46 = yon
+
+accent-medieval-words-47 = kidding
+accent-medieval-words-replace-47 = but pulling a jest
+
+accent-medieval-words-48 = jokes
+accent-medieval-words-replace-48 = japes
+
+accent-medieval-words-49 = joke
+accent-medieval-words-replace-49 = jape
+
+accent-medieval-words-50 = station
+accent-medieval-words-replace-50 = castle
+
+accent-medieval-words-51 = please
+accent-medieval-words-replace-51 = prithee
+
+accent-medieval-words-52 = ok
+accent-medieval-words-replace-52 = agreed
+
+accent-medieval-words-53 = okay
+accent-medieval-words-replace-53 = as you will
+
+accent-medieval-words-54 = is
+accent-medieval-words-replace-54 = be
+
+accent-medieval-words-55 = never
+accent-medieval-words-replace-55 = ne'er
+
+accent-medieval-words-56 = haha
+accent-medieval-words-replace-56 = oh, 'tis to laugh!
+
+accent-medieval-words-57 = hehe
+accent-medieval-words-replace-57 = chuckle!
+
+accent-medieval-words-58 = hah
+accent-medieval-words-replace-58 = and there was much mirth!
+
+accent-medieval-words-59 = heh
+accent-medieval-words-replace-59 = snicker!
+
+accent-medieval-words-60 = help me!
+accent-medieval-words-replace-60 = saveth me!
+
+accent-medieval-words-61 = help me
+accent-medieval-words-replace-61 = saveth me
+
+accent-medieval-words-62 = help
+accent-medieval-words-replace-62 = succor
+
+accent-medieval-words-63 = could
+accent-medieval-words-replace-63 = couldst
+
+accent-medieval-words-64 = would
+accent-medieval-words-replace-64 = wouldst
+
+accent-medieval-words-65 = sure
+accent-medieval-words-replace-65 = shore
+
+accent-medieval-words-66 = maybe
+accent-medieval-words-replace-66 = mayhaps
+
+accent-medieval-words-67 = probably
+accent-medieval-words-replace-67 = perchance
+
+accent-medieval-words-68 = girl
+accent-medieval-words-replace-68 = lady
+
+accent-medieval-words-69 = woman
+accent-medieval-words-replace-69 = mistress
+
+accent-medieval-words-70 = girls
+accent-medieval-words-replace-70 = ladies
+
+accent-medieval-words-71 = women
+accent-medieval-words-replace-71 = madames
+
+accent-medieval-words-72 = cat
+accent-medieval-words-replace-72 = beast
+
+accent-medieval-words-73 = felinid
+accent-medieval-words-replace-73 = catbeast
+
+accent-medieval-words-74 = later
+accent-medieval-words-replace-74 = anon
+
+accent-medieval-words-75 = lizard
+accent-medieval-words-replace-75 = moat creature
+
+accent-medieval-words-76 = moth grub
+accent-medieval-words-replace-76 = gnat critter
+
+accent-medieval-words-77 = moth
+accent-medieval-words-replace-77 = gnat
+
+accent-medieval-words-78 = mothgrub
+accent-medieval-words-replace-78 = gnat critter
+
+accent-medieval-words-79 = often
+accent-medieval-words-replace-79 = oft
+
+accent-medieval-words-80 = soon
+accent-medieval-words-replace-80 = anon
+
+accent-medieval-words-81 = really
+accent-medieval-words-replace-81 = indeed
+
+accent-medieval-words-82 = away
+accent-medieval-words-replace-82 = aroint
+
+accent-medieval-words-83 = being
+accent-medieval-words-replace-83 = bein
+
+accent-medieval-words-84 = enough
+accent-medieval-words-replace-84 = ynough
+
+accent-medieval-words-85 = fuck
+accent-medieval-words-replace-85 = flummery
+
+accent-medieval-words-86 = here
+accent-medieval-words-replace-86 = hither
+
+accent-medieval-words-87 = of
+accent-medieval-words-replace-87 = o'
+
+accent-medieval-words-88 = shit
+accent-medieval-words-replace-88 = nightsoil
+
+accent-medieval-words-89 = those
+accent-medieval-words-replace-89 = yon
+
+accent-medieval-words-90 = why
+accent-medieval-words-replace-90 = wherefore
+
+accent-medieval-words-91 = based
+accent-medieval-words-replace-91 = joly
+
+accent-medieval-words-92 = cargo tech
+accent-medieval-words-replace-92 = merchant
+
+accent-medieval-words-93 = cargo
+accent-medieval-words-replace-93 = merchants' guild
+
+accent-medieval-words-94 = QM
+accent-medieval-words-replace-94 = Guild Master
+
+accent-medieval-words-95 = Quartermaster
+accent-medieval-words-replace-95 = Guild Master
+
+accent-medieval-words-96 = moths
+accent-medieval-words-replace-96 = gnats
+
+accent-medieval-words-97 = ATS
+accent-medieval-words-replace-97 = the open-air markets
+
+accent-medieval-words-98 = security
+accent-medieval-words-replace-98 = Guardsmen
+
+accent-medieval-words-99 = sec off
+accent-medieval-words-replace-99 = guard
+
+accent-medieval-words-100 = secoff
+accent-medieval-words-replace-100 = guard
+
+accent-medieval-words-101 = sec
+accent-medieval-words-replace-101 = guards
+
+accent-medieval-words-102 = shitsec
+accent-medieval-words-replace-102 = gaudy guards
+
+accent-medieval-words-103 = brig
+accent-medieval-words-replace-103 = gaol
+
+accent-medieval-words-104 = permabrig
+accent-medieval-words-replace-104 = the dungeon
+
+accent-medieval-words-105 = perma
+accent-medieval-words-replace-105 = the dungeon
+
+accent-medieval-words-106 = cell
+accent-medieval-words-replace-106 = cage
+
+accent-medieval-words-107 = arrest
+accent-medieval-words-replace-107 = arresteth
+
+accent-medieval-words-108 = spider
+accent-medieval-words-replace-108 = arachnidbeast
+
+accent-medieval-words-109 = enemies
+accent-medieval-words-replace-109 = renegades
+
+accent-medieval-words-110 = enemy
+accent-medieval-words-replace-110 = renegade
+
+accent-medieval-words-111 = traitor
+accent-medieval-words-replace-111 = betrayer
+
+accent-medieval-words-112 = nukie
+accent-medieval-words-replace-112 = harbinger o' destruction
+
+accent-medieval-words-113 = nukies
+accent-medieval-words-replace-113 = harbingers o' death
+
+accent-medieval-words-114 = admeme
+accent-medieval-words-replace-114 = deus ex machina
+
+accent-medieval-words-115 = adminbus
+accent-medieval-words-replace-115 = deus ex machina
+
+accent-medieval-words-116 = sci
+accent-medieval-words-replace-116 = alchemists
+
+accent-medieval-words-117 = RD
+accent-medieval-words-replace-117 = Head Alchemist
+
+accent-medieval-words-118 = Research Directer
+accent-medieval-words-replace-118 = Head Alchemist
+
+accent-medieval-words-119 = department
+accent-medieval-words-replace-119 =  ward
+
+accent-medieval-words-120 = science
+accent-medieval-words-replace-120 = alchemist
+
+accent-medieval-words-121 = bar
+accent-medieval-words-replace-121 = pub
+
+accent-medieval-words-122 = bartender
+accent-medieval-words-replace-122 = pubkeeper
+
+accent-medieval-words-123 = alcohol
+accent-medieval-words-replace-123 = spirits
+
+accent-medieval-words-124 = beer
+accent-medieval-words-replace-124 = ale
+
+accent-medieval-words-126 = HoP
+accent-medieval-words-replace-126 = Jester
+
+accent-medieval-words-127 = Head of Personnel
+accent-medieval-words-replace-127 = Jester
+
+accent-medieval-words-128 = BSO
+accent-medieval-words-replace-128 = Kingsguard
+
+accent-medieval-words-129 = Blueshield Officer
+accent-medieval-words-replace-129 = Kingsguard
+
+accent-medieval-words-130 = sorry
+accent-medieval-words-replace-130 = pardon me
+
+accent-medieval-words-131 = apologies
+accent-medieval-words-replace-131 = I repenteth from mine own soul
+
+accent-medieval-words-132 = loneop
+accent-medieval-words-replace-132 = lonesome harbinger o' death
+
+accent-medieval-words-133 = lone op
+accent-medieval-words-replace-133 = lonesome harbinger o' death
+
+accent-medieval-words-134 = guy
+accent-medieval-words-replace-134 = lord
+
+accent-medieval-words-135 = guys
+accent-medieval-words-replace-135 = lords
+
+accent-medieval-words-136 = man
+accent-medieval-words-replace-136 = gent
+
+accent-medieval-words-137 = men
+accent-medieval-words-replace-137 = messieurs
+
+accent-medieval-words-138 = blob
+accent-medieval-words-replace-138 = abomination
+
+accent-medieval-words-139 = changeling
+accent-medieval-words-replace-139 = abomination
+
+accent-medieval-words-140 = cling
+accent-medieval-words-replace-140 = abomination
+
+accent-medieval-words-141 = shuttle
+accent-medieval-words-replace-141 = carriage
+
+accent-medieval-words-142 = bring
+accent-medieval-words-replace-142 = bringeth
+
+accent-medieval-words-143 = price
+accent-medieval-words-replace-143 = fee
+
+accent-medieval-words-144 = in the
+accent-medieval-words-replace-144 = i' the
+
+accent-medieval-words-145 = clowns
+accent-medieval-words-replace-145 = harlequins
+
+accent-medieval-words-146 = clown
+accent-medieval-words-replace-146 = harlequin
+
+accent-medieval-words-147 = botanists
+accent-medieval-words-replace-147 = farmers
+
+accent-medieval-words-148 = med bay
+accent-medieval-words-replace-148 = the Apothecary
+
+accent-medieval-words-149 = medical
+accent-medieval-words-replace-149 = the Apothecary
+
+accent-medieval-words-150 = med
+accent-medieval-words-replace-150 = Apothecary
+
+accent-medieval-words-151 = doctor
+accent-medieval-words-replace-151 = plague doctor
+
+accent-medieval-words-152 = paramed
+accent-medieval-words-replace-152 = traveling apothecary
+
+accent-medieval-words-153 = paramedic
+accent-medieval-words-replace-153 = traveling apothecary
+
+accent-medieval-words-154 = parameds
+accent-medieval-words-replace-154 = traveling apothecaries
+
+accent-medieval-words-155 = cmo
+accent-medieval-words-replace-155 = Head Apothecary
+
+accent-medieval-words-156 = Chief Medical Officer
+accent-medieval-words-replace-156 = Head Apothecary
+
+accent-medieval-words-157 = chem
+accent-medieval-words-replace-157 = potion vendor
+
+accent-medieval-words-158 = chemists
+accent-medieval-words-replace-158 = potion sellers
+
+accent-medieval-words-159 = alarm
+accent-medieval-words-replace-159 = alarum
+
+accent-medieval-words-160 = engi
+accent-medieval-words-replace-160 = Wizard
+
+accent-medieval-words-161 = engineering
+accent-medieval-words-replace-161 = Wizard Tower
+
+accent-medieval-words-162 = engineers
+accent-medieval-words-replace-162 = Wizards
+
+accent-medieval-words-163 = CE
+accent-medieval-words-replace-163 = Arch Wizard
+
+accent-medieval-words-164 = chief engineer
+accent-medieval-words-replace-164 = Arch Wizard
+
+accent-medieval-words-165 = atmos tech
+accent-medieval-words-replace-165 = Witch
+
+accent-medieval-words-166 = atmos
+accent-medieval-words-replace-166 = Witches
+
+accent-medieval-words-167 = departments
+accent-medieval-words-replace-167 = wards
+
+accent-medieval-words-168 = heretic
+accent-medieval-words-replace-168 = blashphemer
+
+accent-medieval-words-169 = heretics
+accent-medieval-words-replace-169 = blasphemers
+
+accent-medieval-words-170 = revolutionaries
+accent-medieval-words-replace-170 = Usurpers
+
+accent-medieval-words-171 = revs
+accent-medieval-words-replace-171 = Usurpers
+
+accent-medieval-words-172 = revolution
+accent-medieval-words-replace-172 = coup
+
+accent-medieval-words-173 = head rev
+accent-medieval-words-replace-173 = Deceiver
+
+accent-medieval-words-174 = headrevs
+accent-medieval-words-replace-174 = Deceivers
+
+accent-medieval-words-175 = headrev
+accent-medieval-words-replace-175 = Deceiver
+
+accent-medieval-words-176 = zombie
+accent-medieval-words-replace-176 = deadite
+
+accent-medieval-words-177 = zombies
+accent-medieval-words-replace-177 = deadites
+
+accent-medieval-words-178 = zed
+accent-medieval-words-replace-178 = deadite
+
+accent-medieval-words-179 = zeds
+accent-medieval-words-replace-179 = deadites
+
+accent-medieval-words-180 = neato
+accent-medieval-words-replace-180 = groovy
+
+accent-medieval-words-181 = chef
+accent-medieval-words-replace-181 = cook
+
+accent-medieval-words-182 = chefs
+accent-medieval-words-replace-182 = cooks
+
+accent-medieval-words-183 = sm
+accent-medieval-words-replace-183 = Arch Wizard's Scrying Stone
+
+accent-medieval-words-184 = super matter
+accent-medieval-words-replace-184 = Arch Wizard's Scrying Stone
+
+accent-medieval-words-185 = supermatter
+accent-medieval-words-replace-185 = Arch Wizard's Scrying Stone
+
+accent-medieval-words-186 = singularity
+accent-medieval-words-replace-186 = Arch Wizard's Inconceivable Orb
+
+accent-medieval-words-187 = singulo
+accent-medieval-words-replace-187 = Arch Wizard's Inconceivable Orb
+
+accent-medieval-words-188 = tesla
+accent-medieval-words-replace-188 = Arch Wizard's God-den Thunder Boll
+
+accent-medieval-words-189 = tesloose
+accent-medieval-words-replace-189 = thine wizards hath released yon Arch Wizard's God-den Thunder Boll upon yon castle
+
+accent-medieval-words-190 = singuloose
+accent-medieval-words-replace-190 = thine wizards hath released yon Arch Wizard's Inconceivable Orb upon yon castle
+
+accent-medieval-words-191 = ball
+accent-medieval-words-replace-191 = boll
+
+accent-medieval-words-192 = tesloosed
+accent-medieval-words-replace-192 = enfreed yon Arch Wizard's God-den Thunder Boll
+
+accent-medieval-words-193 = singuloosed
+accent-medieval-words-replace-193 = enfreed yon Arch Wizard's Inconceivable Orb
+
+accent-medieval-words-194 = chapel
+accent-medieval-words-replace-194 = sanctuary
+
+accent-medieval-words-195 = church
+accent-medieval-words-replace-195 = temple
+
+accent-medieval-words-196 = chaplain
+accent-medieval-words-replace-196 = abbot
+
+accent-medieval-words-197 = free
+accent-medieval-words-replace-197 = deliver
+
+accent-medieval-words-198 = freed
+accent-medieval-words-replace-198 = delivered
+
+accent-medieval-words-199 = freedom
+accent-medieval-words-replace-199 = clearness
+
+accent-medieval-words-200 = spesos
+accent-medieval-words-replace-200 = shillings
+
+accent-medieval-words-201 = speso
+accent-medieval-words-replace-201 = shilling
+
+accent-medieval-words-202 = money
+accent-medieval-words-replace-202 = shillings
+
+accent-medieval-words-203 = dollar
+accent-medieval-words-replace-203 = shilling
+
+accent-medieval-words-204 = dollars
+accent-medieval-words-replace-204 = shillings
+
+accent-medieval-words-205 = criminal
+accent-medieval-words-replace-205 = ruffian
+
+accent-medieval-words-206 = shitter
+accent-medieval-words-replace-206 = ruffian
+
+accent-medieval-words-207 = shitters
+accent-medieval-words-replace-207 = ruffians
+
+accent-medieval-words-208 = criminals
+accent-medieval-words-replace-208 = ruffians
+
+accent-medieval-words-209 = skibidi
+accent-medieval-words-replace-209 = skee bee dee
+
+accent-medieval-words-210 = nuke
+accent-medieval-words-replace-210 = shell o' holy fire
+
+accent-medieval-words-211 = attacked
+accent-medieval-words-replace-211 = assailed
+
+accent-medieval-words-212 = rotten
+accent-medieval-words-replace-212 = addle
+
+accent-medieval-words-213 = rotted
+accent-medieval-words-replace-213 = desicrated
+
+accent-medieval-words-214 = busy
+accent-medieval-words-replace-214 = rapt
+
+accent-medieval-words-215 = occupied
+accent-medieval-words-replace-215 = rapt
+
+accent-medieval-words-216 = duel
+accent-medieval-words-replace-216 = brawl
+
+accent-medieval-words-217 = fight
+accent-medieval-words-replace-217 = brawl
+
+accent-medieval-words-218 = obliterated
+accent-medieval-words-replace-218 = razed
+
+accent-medieval-words-219 = obliterate
+accent-medieval-words-replace-219 = raze
+
+accent-medieval-words-220 = shoot
+accent-medieval-words-replace-220 = fire upon
+
+accent-medieval-words-221 = shot at
+accent-medieval-words-replace-221 = fired upon
+
+accent-medieval-words-222 = shot
+accent-medieval-words-replace-222 = fired upon
+
+accent-medieval-words-223 = dance
+accent-medieval-words-replace-223 = do a jig
+
+accent-medieval-words-224 = danced
+accent-medieval-words-replace-224 = did a jig
+
+accent-medieval-words-225 = tider
+accent-medieval-words-replace-225 = blackguard
+
+accent-medieval-words-226 = tiders
+accent-medieval-words-replace-226 = blackguards
+
+accent-medieval-words-227 = assistant
+accent-medieval-words-replace-227 = blacksguard
+
+accent-medieval-words-228 = assistants
+accent-medieval-words-replace-228 = blacksguards
+
+accent-medieval-words-229 = bot
+accent-medieval-words-replace-229 = the farmers
+
+accent-medieval-words-230 = bartenders
+accent-medieval-words-replace-230 = pubkeepers
+
+accent-medieval-words-231 = dorms 4
+accent-medieval-words-replace-231 = unspeakable filth pit
+
+accent-medieval-words-232 = dorms four
+accent-medieval-words-replace-232 = unspeakable filth pit
+
+accent-medieval-words-233 = room 4
+accent-medieval-words-replace-233 = unspeakable filth pit
+
+accent-medieval-words-234 = dorms4
+accent-medieval-words-replace-234 = unspeakable filth pit
+
+accent-medieval-words-235 = room4
+accent-medieval-words-replace-235 = unspeakable filth pit
+
+accent-medieval-words-236 = atmospherics
+accent-medieval-words-replace-236 = Witches
+
+accent-medieval-words-237 = do
+accent-medieval-words-replace-237 = dost
+
+accent-medieval-words-238 = know
+accent-medieval-words-replace-238 = knoweth

+ 428 - 0
Resources/Locale/en-US/Civ14/accent/ohio.ftl

@@ -0,0 +1,428 @@
+# SPDX-FileCopyrightText: 2024 Aidenkrz <aiden@djkraz.com>
+# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 Aiden <aiden@djkraz.com>
+# SPDX-FileCopyrightText: 2025 Piras314 <p1r4s@proton.me>
+# SPDX-FileCopyrightText: 2025 SX-7 <92227810+SX-7@users.noreply.github.com>
+#
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
+accent-ohio-prefix-1 = Gyatt dang,
+accent-ohio-prefix-2 = Chat...
+accent-ohio-prefix-3 = Epic win,
+accent-ohio-prefix-4 = Widewawwy...
+accent-ohio-prefix-5 = BRO...
+accent-ohio-prefix-6 = Call me the rizzler cause,
+accent-ohio-prefix-7 = It's giving...
+
+accent-ohio-suffix-1 = . Like in Ohio.
+accent-ohio-suffix-2 = . From Ohio...
+accent-ohio-suffix-3 = . Like in Fortnite.
+accent-ohio-suffix-4 = . Like from Fortnite.
+accent-ohio-suffix-5 = . For the Rizzler.
+accent-ohio-suffix-6 = . Chat is this real?
+accent-ohio-suffix-7 = . Bro knew what he was doing.
+accent-ohio-suffix-8 = . Goofy ahh.
+accent-ohio-suffix-9 = . Like erm... what the sigma???
+accent-ohio-suffix-10 = . What the scallop?
+accent-ohio-suffix-11 = . It's so over.
+accent-ohio-suffix-12 = . I oop!!!!!!11!!!111!
+accent-ohio-suffix-13 = . I need to work on my mewing.
+
+accent-ohio-words-1 = charisma
+accent-ohio-words-replace-1 = rizz
+
+accent-ohio-words-2 = cool
+accent-ohio-words-replace-2 = sigma
+
+accent-ohio-words-3 = amazing
+accent-ohio-words-replace-3 = rizzlike
+
+accent-ohio-words-4 = god
+accent-ohio-words-replace-4 = gyatt
+
+accent-ohio-words-5 = attack
+accent-ohio-words-replace-5 = unalive
+
+accent-ohio-words-6 = kill
+accent-ohio-words-replace-6 = unalive
+
+accent-ohio-words-7 = murder
+accent-ohio-words-replace-7 = unalive
+
+accent-ohio-words-8 = dead
+accent-ohio-words-replace-8 = in ohio
+
+accent-ohio-words-9 = maints
+accent-ohio-words-replace-9 = the backrooms
+
+accent-ohio-words-10 = maintenance
+accent-ohio-words-replace-10 = the backrooms
+
+accent-ohio-words-11 = maint
+accent-ohio-words-replace-11 = the backrooms
+
+accent-ohio-words-12 = attacked
+accent-ohio-words-replace-12 = unalived
+
+accent-ohio-words-13 = enemy
+accent-ohio-words-replace-13 = sussy baka impostor from Among Us
+
+accent-ohio-words-14 = enemies
+accent-ohio-words-replace-14 = sussy baka impostors from Among Us
+
+accent-ohio-words-15 = syndi
+accent-ohio-words-replace-15 = sussy baka impostor from Among Us
+
+accent-ohio-words-16 = traitor
+accent-ohio-words-replace-16 = sussy baka impostor from Among Us
+
+accent-ohio-words-17 = got
+accent-ohio-words-replace-17 = gyatt
+
+accent-ohio-words-18 = delicious
+accent-ohio-words-replace-18 = bussin'
+
+accent-ohio-words-19 = yummy
+accent-ohio-words-replace-19 = bussin'
+
+accent-ohio-words-20 = women
+accent-ohio-words-replace-20 = FEMALES
+
+accent-ohio-words-21 = girls
+accent-ohio-words-replace-21 = FEMALES
+
+accent-ohio-words-22 = girl
+accent-ohio-words-replace-22 = FEMALE
+
+accent-ohio-words-23 = woman
+accent-ohio-words-replace-23 = FEMALE
+
+accent-ohio-words-24 = miss
+accent-ohio-words-replace-24 = FEMALE
+
+accent-ohio-words-25 = ms
+accent-ohio-words-replace-25 = FEMALE
+
+accent-ohio-words-26 = mrs
+accent-ohio-words-replace-26 = FEMALE
+
+accent-ohio-words-27 = ms.
+accent-ohio-words-replace-27 = FEMALE
+
+accent-ohio-words-28 = mrs.
+accent-ohio-words-replace-28 = FEMALE
+
+accent-ohio-words-29 = bitch
+accent-ohio-words-replace-29 = FEMALE
+
+accent-ohio-words-30 = really
+accent-ohio-words-replace-30 = for real
+
+accent-ohio-words-31 = definitely
+accent-ohio-words-replace-31 = lowkey
+
+accent-ohio-words-32 = mhm
+accent-ohio-words-replace-32 = on god
+
+accent-ohio-words-33 = epic
+accent-ohio-words-replace-33 = poggers
+
+accent-ohio-words-34 = lingium
+accent-ohio-words-replace-34 = ligma
+
+accent-ohio-words-35 = game
+accent-ohio-words-replace-35 = roblox
+
+accent-ohio-words-36 = nah
+accent-ohio-words-replace-36 = cope
+
+accent-ohio-words-37 = weird
+accent-ohio-words-replace-37 = sus
+
+accent-ohio-words-38 = brother
+accent-ohio-words-replace-38 = bro
+
+accent-ohio-words-39 = man
+accent-ohio-words-replace-39 = bro
+
+accent-ohio-words-40 = marijuana
+accent-ohio-words-replace-40 = 420 leaf
+
+accent-ohio-words-41 = weed
+accent-ohio-words-replace-41 = 420 leaf
+
+accent-ohio-words-42 = best
+accent-ohio-words-replace-42 = GOAT
+
+accent-ohio-words-43 = loss
+accent-ohio-words-replace-43 = L
+
+accent-ohio-words-44 = lose
+accent-ohio-words-replace-44 = take an L
+
+accent-ohio-words-45 = lost
+accent-ohio-words-replace-45 = took an L
+
+accent-ohio-words-46 = silly
+accent-ohio-words-replace-46 = goofy ahh
+
+accent-ohio-words-47 = clown
+accent-ohio-words-replace-47 = goofy ahh
+
+accent-ohio-words-48 = funny
+accent-ohio-words-replace-48 = goofy
+
+accent-ohio-words-49 = joke
+accent-ohio-words-replace-49 = meme
+
+accent-ohio-words-50 = idiot
+accent-ohio-words-replace-50 = baka
+
+accent-ohio-words-51 = ugly
+accent-ohio-words-replace-51 = rizzless
+
+accent-ohio-words-52 = smartass
+accent-ohio-words-replace-52 = nerd
+
+accent-ohio-words-53 = smart
+accent-ohio-words-replace-53 = nerdlike
+
+accent-ohio-words-54 = science
+accent-ohio-words-replace-54 = nerdland
+
+accent-ohio-words-55 = scientist
+accent-ohio-words-replace-55 = professional nerd
+
+accent-ohio-words-56 = story
+accent-ohio-words-replace-56 = lorepage
+
+accent-ohio-words-57 = loser
+accent-ohio-words-replace-57 = L + Ratio idiot
+
+accent-ohio-words-58 = nice
+accent-ohio-words-replace-58 = rizzlike
+
+accent-ohio-words-59 = spesos
+accent-ohio-words-replace-59 = rizzbucks
+
+accent-ohio-words-60 = dollars
+accent-ohio-words-replace-60 = rizzbucks
+
+accent-ohio-words-61 = dollar
+accent-ohio-words-replace-61 = rizzbuck
+
+accent-ohio-words-62 = speso
+accent-ohio-words-replace-62 = rizzbuck
+
+accent-ohio-words-63 = money
+accent-ohio-words-replace-63 = rizzbucks
+
+accent-ohio-words-64 = kill you
+accent-ohio-words-replace-64 = send you to Brazil
+
+accent-ohio-words-65 = dick
+accent-ohio-words-replace-65 = glizzy
+
+accent-ohio-words-66 = hot dog
+accent-ohio-words-replace-66 = glizzy
+
+accent-ohio-words-67 = butt
+accent-ohio-words-replace-67 = bussy
+
+accent-ohio-words-68 = bum
+accent-ohio-words-replace-68 = bussy
+
+accent-ohio-words-69 = ass
+accent-ohio-words-replace-69 = bussy
+
+accent-ohio-words-70 = kill yourself
+accent-ohio-words-replace-70 = send yourself to Brazil you stupid rizzless citizen of Ohio
+
+accent-ohio-words-71 = felinid
+accent-ohio-words-replace-71 = hecking chonker
+
+accent-ohio-words-72 = cat
+accent-ohio-words-replace-72 = hecking chonker
+
+accent-ohio-words-73 = kitty
+accent-ohio-words-replace-73 = hecking chonker
+
+accent-ohio-words-74 = ian
+accent-ohio-words-replace-74 = hecking chonker
+
+accent-ohio-words-75 = dog
+accent-ohio-words-replace-75 = hecking chonker
+
+accent-ohio-words-76 = cerberus
+accent-ohio-words-replace-76 = hecking chonker
+
+accent-ohio-words-77 = puppy
+accent-ohio-words-replace-77 = hecking chonker
+
+accent-ohio-words-78 = pup
+accent-ohio-words-replace-78 = hecking chonker
+
+accent-ohio-words-79 = tesla
+accent-ohio-words-replace-79 = sparkly rizzball
+
+accent-ohio-words-80 = singularity
+accent-ohio-words-replace-80 = sussy singuawungoose
+
+accent-ohio-words-81 = singu
+accent-ohio-words-replace-81 = sussy singuawungoose
+
+accent-ohio-words-82 = singulo
+accent-ohio-words-replace-82 = sussy singuawungoose
+
+accent-ohio-words-83 = tesloose
+accent-ohio-words-replace-83 = SPARKLY RIZZBALL LOOSE NO CAP
+
+accent-ohio-words-84 = tesla loose
+accent-ohio-words-replace-84 = SPARKLY RIZZBALL LOOSE NO CAP
+
+accent-ohio-words-85 = hacking
+accent-ohio-words-replace-85 = hacking like in a video game
+
+accent-ohio-words-86 = robust
+accent-ohio-words-replace-86 = cooking
+
+accent-ohio-words-87 = die
+accent-ohio-words-replace-87 = get unalived
+
+accent-ohio-words-88 = died
+accent-ohio-words-replace-88 = was unalived
+
+accent-ohio-words-89 = goddamn
+accent-ohio-words-replace-89 = gyattdamn
+
+accent-ohio-words-90 = godamn
+accent-ohio-words-replace-90 = gyattdamn
+
+accent-ohio-words-91 = goddamned
+accent-ohio-words-replace-91 = gyatdamned
+
+accent-ohio-words-92 = goddang
+accent-ohio-words-replace-92 = gyattdang
+
+accent-ohio-words-93 = fuck
+accent-ohio-words-replace-93 = skibidi
+
+accent-ohio-words-94 = shit
+accent-ohio-words-replace-94 = skibidi
+
+accent-ohio-words-95 = im high
+accent-ohio-words-replace-95 = im tweaking
+
+accent-ohio-words-96 = i'm high
+accent-ohio-words-replace-96 = i'm tweaking
+
+accent-ohio-words-97 = supermatter
+accent-ohio-words-replace-97 = fanum crystal
+
+accent-ohio-words-98 = erping
+accent-ohio-words-replace-98 = going to freaky town
+
+accent-ohio-words-99 = erp
+accent-ohio-words-replace-99 = freaky
+
+accent-ohio-words-100 = sm
+accent-ohio-words-replace-100 = fanum crystal
+
+accent-ohio-words-101 = changeling
+accent-ohio-words-replace-101 = shapeshifting ohioan
+
+accent-ohio-words-102 = cling
+accent-ohio-words-replace-102 = shapeshifting ohioan
+
+accent-ohio-words-103 = heretic
+accent-ohio-words-replace-103 = facebook crystal worshipper
+
+accent-ohio-words-104 = heretics
+accent-ohio-words-replace-104 = members of a crystal-worshipping facebook group
+
+accent-ohio-words-105 = news
+accent-ohio-words-replace-105 = fake news
+
+accent-ohio-words-106 = tax
+accent-ohio-words-replace-106 = fanum tax
+
+accent-ohio-words-107 = cool guy
+accent-ohio-words-replace-107 = real sigma alpha male guy
+
+accent-ohio-words-108 = fed
+accent-ohio-words-replace-108 = fanum taxer
+
+accent-ohio-words-109 = athlete
+accent-ohio-words-replace-109 = ishowspeed
+
+accent-ohio-words-110 = meth
+accent-ohio-words-replace-110 = speed
+
+accent-ohio-words-111 = chemistry
+accent-ohio-words-replace-111 = walter white
+
+accent-ohio-words-112 = chem
+accent-ohio-words-replace-112 = walter white
+
+accent-ohio-words-113 = real news
+accent-ohio-words-replace-113 = fake news
+
+accent-ohio-words-114 = important
+accent-ohio-words-replace-114 = important like paying your fanum taxes
+
+accent-ohio-words-115 = literally
+accent-ohio-words-replace-115 = widewawwy
+
+accent-ohio-words-116 = best friend
+accent-ohio-words-replace-116 = bestie
+
+accent-ohio-words-117 = caught
+accent-ohio-words-replace-117 = caught in 4k
+
+accent-ohio-words-118 = delusional
+accent-ohio-words-replace-118 = delulu
+
+accent-ohio-words-119 = toes
+accent-ohio-words-replace-119 = dogs
+
+accent-ohio-words-120 = boss
+accent-ohio-words-replace-120 = girlboss
+
+accent-ohio-words-121 = make-over
+accent-ohio-words-replace-121 = glow-up
+
+accent-ohio-words-122 = makeover
+accent-ohio-words-replace-122 = glowup
+
+accent-ohio-words-123 = make over
+accent-ohio-words-replace-123 = glow up
+
+accent-ohio-words-124 = greatest
+accent-ohio-words-replace-124 = goat
+
+accent-ohio-words-125 = gross
+accent-ohio-words-replace-125 = icky
+
+accent-ohio-words-126 = pun pun
+accent-ohio-words-replace-126 = ipad-addicted monkey
+
+accent-ohio-words-127 = security
+accent-ohio-words-replace-127 = karen department
+
+accent-ohio-words-128 = secoff
+accent-ohio-words-replace-128 = pig
+
+accent-ohio-words-129 = hos
+accent-ohio-words-replace-129 = donut-feasting karen
+
+accent-ohio-words-130 = rumor
+accent-ohio-words-replace-130 = tea
+
+accent-ohio-words-131 = throw
+accent-ohio-words-replace-131 = yeet
+
+accent-ohio-words-132 = gay
+accent-ohio-words-replace-132 = zesty
+
+accent-ohio-words-133 = tajaran
+accent-ohio-words-replace-133 = hecking chonker

+ 1 - 1
Resources/Locale/en-US/voting/managers/vote-manager.ftl

@@ -18,7 +18,7 @@ ui-vote-gamemode-win = { $winner } won the gamemode vote!
 ui-vote-map-title = Next map
 ui-vote-map-tie = Tie for map vote! Picking... { $picked }
 ui-vote-map-win = { $winner } won the map vote!
-ui-vote-map-notlobby = Voting for maps is only valid in the pre-round lobby!
+ui-vote-map-notlobby = Voting for maps is only valid in the pre-round and post-round lobbies!
 ui-vote-map-notlobby-time = Voting for maps is only valid in the pre-round lobby with { $time } remaining!
 
 

+ 2 - 0
Resources/Locale/en-US/wieldable/wieldable-component.ftl

@@ -20,3 +20,5 @@ wieldable-component-requires = { CAPITALIZE(THE($item))} must be wielded!
 gunwieldbonus-component-examine = This weapon has improved accuracy when wielded.
 
 gunrequireswield-component-examine = This weapon can only be fired when wielded.
+
+wieldable-component-no-free-hands = You need both hands to use this!

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

@@ -44,6 +44,7 @@ entities:
       name: grid
     - type: Transform
       parent: 1
+    - type: Weather
     - type: MapGrid
       chunks:
         1,0:

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

@@ -202,6 +202,7 @@ entities:
     - type: Shuttle
     - type: SunShadow
     - type: GridPathfinding
+    - type: Weather
     - type: Gravity
       gravityShakeSound: !type:SoundPathSpecifier
         path: /Audio/Effects/alert.ogg

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

@@ -158,6 +158,7 @@ entities:
     - type: SpreaderGrid
     - type: Shuttle
     - type: GridPathfinding
+    - type: Weather
     - type: Gravity
       gravityShakeSound: !type:SoundPathSpecifier
         path: /Audio/Effects/alert.ogg

+ 5 - 7
Resources/Prototypes/Civ14/Entities/Markers/grace_wall.yml

@@ -40,15 +40,14 @@
       gracewallActive: true
       gracewallRadius: 1.5
       blockingFactions: [Germany]
-    - type: GracewallRule
-      gracewallDuration: 1000
+      permanent: true
     - type: Physics
       bodyType: Static
     - type: Fixtures
       fixtures:
         gracewall: # Define a fixture for the area
           shape: !type:PhysShapeAabb
-            bounds: "-1.5, -1.5, 1.5, 1.5"
+            bounds: "-0.2, -1.5, 0.2, 1.5"
           # Collision layer/mask will be managed by the GracewallRuleSystem
           density: 100
           hard: true
@@ -73,15 +72,14 @@
       gracewallActive: true
       gracewallRadius: 1.5
       blockingFactions: [Soviet]
-    - type: GracewallRule
-      gracewallDuration: 1000
+      permanent: true
     - type: Physics
       bodyType: Static
     - type: Fixtures
       fixtures:
         gracewall: # Define a fixture for the area
           shape: !type:PhysShapeAabb
-            bounds: "-1.5, -1.5, 1.5, 1.5"
+            bounds: "-0.2, -1.5, 0.2, 1.5"
           # Collision layer/mask will be managed by the GracewallRuleSystem
           density: 100
           hard: true
@@ -92,4 +90,4 @@
           layer:
             - LowImpassable
             - MidImpassable
-            - HighImpassable            
+            - HighImpassable

+ 1 - 0
Resources/Prototypes/Civ14/Entities/Objects/Guns/base.yml

@@ -17,6 +17,7 @@
       shape:
         - 0,0,5,1
     - type: Sprite
+      sprite: Civ14/Weapons/Guns/ak101.rsi
       layers:
         - state: icon
           map: ["enum.GunVisualLayers.Base"]

+ 0 - 1
Resources/Prototypes/Civ14/Entities/Objects/Guns/entities_assaultrifles.yml

@@ -40,7 +40,6 @@
       containers:
         gun_magazine: !type:ContainerSlot
         gun_chamber: !type:ContainerSlot
-    - type: Wieldable
     - type: Gun
       projectileSpeed: 30
       minAngle: 2 # 52 - 50

+ 1 - 2
Resources/Prototypes/Civ14/Entities/Objects/Guns/entities_boltaction.yml

@@ -53,8 +53,7 @@
       maxAngle: 10 # Maximum upward/sideways kick angle
       angleIncrease: 20 # Initial jump/kick from firing a powerful round
       angleDecay: 35 # Speed of aim recovery/settling after shot
-      fireRate: 1
-    - type: Wieldable
+      fireRate: 0.7
 
 # Imported
 

+ 22 - 23
Resources/Prototypes/Civ14/Entities/Objects/Guns/entities_mg.yml

@@ -19,8 +19,7 @@
       equipDelay: 3
       quickEquip: false
     - type: STWeight
-      self: 12
-    - type: Wieldable
+      self: 30
     - type: GunRequiresWield
     - type: Item
       size: Ginormous
@@ -36,7 +35,7 @@
         - FullAuto
       projectileSpeed: 32 # PKM: 7.62x54mmR
       fireRate: 4.3 # PKM: ~650 RPM
-      minAngle: 5
+      minAngle: 10
       maxAngle: 35
       angleIncrease: 4
       angleDecay: 20
@@ -108,7 +107,7 @@
     - type: Gun
       projectileSpeed: 32 # 7.92x57mm
       fireRate: 4.0 # ~600 RPM
-      minAngle: 8 # Older LMG
+      minAngle: 13 # Older LMG
       maxAngle: 30
       angleIncrease: 4.5
       angleDecay: 18
@@ -142,7 +141,7 @@
     - type: Gun
       projectileSpeed: 32 # 7.92x57mm (inherited from parent, can be explicit)
       fireRate: 6.0 # ~800-900 RPM
-      minAngle: 10 # Higher RoF than MG13
+      minAngle: 15 # Higher RoF than MG13
       maxAngle: 40
       angleIncrease: 5.0
       angleDecay: 17
@@ -165,7 +164,7 @@
     - type: Gun
       projectileSpeed: 32 # 7.92x57mm (inherited from parent, can be explicit)
       fireRate: 7.5 # ~1200-1500 RPM "Hitler's Buzzsaw"
-      minAngle: 15 # Very high recoil
+      minAngle: 20 # Very high recoil
       maxAngle: 40
       angleIncrease: 6.0
       angleDecay: 15
@@ -188,7 +187,7 @@
     - type: Gun
       projectileSpeed: 32 # 7.62x51mm
       fireRate: 7.0 # ~1000-1300 RPM (modernized MG42)
-      minAngle: 12 # Still very high recoil
+      minAngle: 17 # Still very high recoil
       maxAngle: 38
       angleIncrease: 5.5
       angleDecay: 16
@@ -224,7 +223,7 @@
     - type: Gun
       projectileSpeed: 32 # 7.62x51mm
       fireRate: 5.0 # ~750 RPM (FN MAG can vary)
-      minAngle: 6 # Good GPMG, comparable to PKM base
+      minAngle: 11 # Good GPMG, comparable to PKM base
       maxAngle: 25
       angleIncrease: 4.2
       angleDecay: 22
@@ -261,7 +260,7 @@
     - type: Gun
       projectileSpeed: 32 # 7.62x54mmR (as per item slot)
       fireRate: 3.5 # ~450-500 RPM (Older LMG)
-      minAngle: 10 # Older, less refined
+      minAngle: 15 # Older, less refined
       maxAngle: 35
       angleIncrease: 5.0
       angleDecay: 18
@@ -296,7 +295,7 @@
     - type: Gun
       projectileSpeed: 31 # 7.7x58mm Arisaka
       fireRate: 3.8 # ~550 RPM
-      minAngle: 9
+      minAngle: 14
       maxAngle: 30
       angleIncrease: 4.8
       angleDecay: 19
@@ -332,7 +331,7 @@
     - type: Gun
       projectileSpeed: 30 # 6.5x50mm Arisaka (milder)
       fireRate: 3.8 # ~550 RPM
-      minAngle: 7 # Milder round, better control
+      minAngle: 12 # Milder round, better control
       maxAngle: 25
       angleIncrease: 4.2
       angleDecay: 21
@@ -365,7 +364,7 @@
     - type: Gun
       projectileSpeed: 32 # 7.62x54mmR
       fireRate: 3.8 # ~500-600 RPM
-      minAngle: 10 # Awkward pan magazine
+      minAngle: 15 # Awkward pan magazine
       maxAngle: 35
       angleIncrease: 5.2
       angleDecay: 18
@@ -401,7 +400,7 @@
     - type: Gun
       projectileSpeed: 33 # .30-06
       fireRate: 3.7 # ~550 RPM (fast setting)
-      minAngle: 12 # Heavy automatic rifle
+      minAngle: 17 # Heavy automatic rifle
       maxAngle: 45
       angleIncrease: 6.0
       angleDecay: 17
@@ -437,7 +436,7 @@
     - type: Gun
       projectileSpeed: 33 # .30-06
       fireRate: 3.8 # ~500 RPM
-      minAngle: 8 # Heavy, stable GPMG
+      minAngle: 13 # Heavy, stable GPMG
       maxAngle: 30
       angleIncrease: 5.0
       angleDecay: 20
@@ -473,7 +472,7 @@
     - type: Gun
       projectileSpeed: 30 # 5.56x45mm
       fireRate: 5.8 # ~850 RPM
-      minAngle: 4 # Controllable LMG
+      minAngle: 9 # Controllable LMG
       maxAngle: 18
       angleIncrease: 3.5
       angleDecay: 24
@@ -507,7 +506,7 @@
     - type: Gun
       projectileSpeed: 30 # 7.62x39mm
       fireRate: 4.8 # ~700 RPM
-      minAngle: 6 # Intermediate cartridge LMG
+      minAngle: 11 # Intermediate cartridge LMG
       maxAngle: 20
       angleIncrease: 4.0
       angleDecay: 22
@@ -557,7 +556,7 @@
     - type: Gun
       projectileSpeed: 32 # 7.62x51mm
       fireRate: 4.0 # ~550-600 RPM "The Pig"
-      minAngle: 10 # Unwieldy
+      minAngle: 15 # Unwieldy
       maxAngle: 40
       angleIncrease: 5.5
       angleDecay: 18
@@ -592,7 +591,7 @@
       # PKP Pecheneg - Modernized PKM, inherits from PKM (BaseGunCivMG)
       projectileSpeed: 32 # Explicit for clarity, same as base
       fireRate: 4.8 # ~700 RPM, faster than base PKM
-      minAngle: 4 # Better control than base PKM
+      minAngle: 9 # Better control than base PKM
       maxAngle: 35
       angleIncrease: 3.8
       angleDecay: 23
@@ -613,7 +612,7 @@
     - type: Gun
       projectileSpeed: 30 # 5.45x39mm
       fireRate: 4.0 # ~600 RPM (like AK-74)
-      minAngle: 3 # Very controllable LMG
+      minAngle: 8 # Very controllable LMG
       maxAngle: 18
       angleIncrease: 3.0
       angleDecay: 25
@@ -648,7 +647,7 @@
       # RPK-16 - Modernized RPK-74, inherits from RPK-74
       projectileSpeed: 30 # Explicit for clarity, same as parent
       fireRate: 4.8 # ~700 RPM, faster than RPK-74
-      minAngle: 2 # Excellent control
+      minAngle: 7 # Excellent control
       maxAngle: 11
       angleIncrease: 2.8
       angleDecay: 28
@@ -669,7 +668,7 @@
     - type: Gun
       projectileSpeed: 30 # 7.62x39mm
       fireRate: 4.0 # ~600 RPM (like AKM)
-      minAngle: 5 # More kick than RPK-74, similar to PKM base
+      minAngle: 10 # More kick than RPK-74, similar to PKM base
       maxAngle: 22
       angleIncrease: 4.0
       angleDecay: 22
@@ -698,7 +697,7 @@
     - type: Gun # Inherits from RPK-47, explicit stats for clarity
       projectileSpeed: 30
       fireRate: 4.0
-      minAngle: 5
+      minAngle: 10
       maxAngle: 20
       angleIncrease: 4.0
       angleDecay: 22
@@ -719,7 +718,7 @@
     - type: Gun
       projectileSpeed: 30 # 5.56x45mm
       fireRate: 6.5 # ~1000 RPM (can be very high)
-      minAngle: 4 # Modern, good control despite RoF
+      minAngle: 9 # Modern, good control despite RoF
       maxAngle: 20
       angleIncrease: 3.2
       angleDecay: 26

+ 5 - 57
Resources/Prototypes/Civ14/Entities/Objects/Guns/entities_pistol.yml

@@ -15,7 +15,7 @@
           map:
             - enum.GunVisualLayers.Mag
     - type: Clothing
-      sprite: Civ14/Weapons/Guns/m9beretta.rsi
+      sprite: Objects/Weapons/Guns/Pistols/viper.rsi
       quickEquip: true
       slots:
         - suitStorage
@@ -108,8 +108,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/luger.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/luger.rsi
     - type: Gun
       projectileSpeed: 20 # 9mm
       minAngle: 6 # Older design, slightly more kick
@@ -126,12 +124,12 @@
       slots:
         gun_magazine:
           name: Magazine
-          startingItem: civ13_magazine_default
+          startingItem: civ13_magazine_Luger_magazine
 
           priority: 2
           whitelist:
             tags:
-              - civ13_magazine_default
+              - civ13_magazine_Luger_magazine
           whitelistFailPopup: gun-magazine-whitelist-fail
         gun_chamber:
           name: Chamber
@@ -148,8 +146,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/waltherp38.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/waltherp38.rsi
     - type: Gun
       projectileSpeed: 20 # 9mm
       minAngle: 5
@@ -188,8 +184,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/glock17.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/glock17.rsi
     - type: Gun
       projectileSpeed: 20
       minAngle: 5
@@ -228,8 +222,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/sig250.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/sig250.rsi
     - type: Gun
       projectileSpeed: 20 # 9mm
       minAngle: 5
@@ -268,8 +260,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/pl14.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/pl14.rsi
     - type: Gun
       projectileSpeed: 20 # 9mm
       minAngle: 4 # Experimental, very good control
@@ -308,8 +298,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/mp443.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/mp443.rsi
     - type: Gun
       projectileSpeed: 20 # 9mm
       minAngle: 5 # Standard modern 9mm
@@ -348,8 +336,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/tarusg3.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/tarusg3.rsi
     - type: Gun
       projectileSpeed: 20 # 9mm
       minAngle: 5
@@ -388,8 +374,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/p220.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/p220.rsi
     - type: Gun
       projectileSpeed: 18 # .45 ACP - slower, heavier
       minAngle: 8 # More kick
@@ -428,8 +412,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/iogb7.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/iogb7.rsi
     - type: Gun
       projectileSpeed: 20 # 9mm
       minAngle: 10 # "Fake shit" - very high RoF, wild recoil
@@ -468,8 +450,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/mauser.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/mauser.rsi
     - type: Gun
       projectileSpeed: 22 # 7.62x25mm - fast round
       minAngle: 7
@@ -508,8 +488,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/borchardt.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/borchardt.rsi
     - type: Gun
       projectileSpeed: 19 # 7.65x25mm Borchardt - less powerful than Mauser
       minAngle: 6
@@ -548,8 +526,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/coltpockethammerless.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/coltpockethammerless.rsi
     - type: Gun
       projectileSpeed: 17 # .32 ACP - weak
       minAngle: 3
@@ -588,8 +564,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/coltpockethammerless.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/coltpockethammerless.rsi
     - type: Gun
       projectileSpeed: 18 # .380 ACP
       minAngle: 4
@@ -628,8 +602,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/bergmann.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/bergmann.rsi
     - type: Gun
       projectileSpeed: 18 # Using 8mm Nambu stats as per chamber/sound
       minAngle: 4
@@ -670,8 +642,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/colt.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/colt.rsi
     - type: Gun
       projectileSpeed: 18 # .45 ACP
       minAngle: 8
@@ -709,8 +679,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/colt.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/colt.rsi
     - type: Gun
       projectileSpeed: 18 # .45 ACP
       minAngle: 7
@@ -751,8 +719,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/tt30.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/tt30.rsi
     - type: Gun
       projectileSpeed: 22 # 7.62x25mm Tokarev - fast
       minAngle: 6
@@ -769,12 +735,12 @@
       slots:
         gun_magazine:
           name: Magazine
-          startingItem: civ13_magazine_default
+          startingItem: civ13_magazine_TT_33_magazine_(7.62x25mm)
 
           priority: 2
           whitelist:
             tags:
-              - civ13_magazine_default
+              - civ13_magazine_TT_33_magazine_(7.62x25mm)
           whitelistFailPopup: gun-magazine-whitelist-fail
         gun_chamber:
           name: Chamber
@@ -793,8 +759,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/makarov.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/makarov.rsi
     - type: Gun
       projectileSpeed: 19 # 9x18mm Makarov - intermediate power
       minAngle: 5
@@ -833,8 +797,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/aps.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/aps.rsi
     - type: Gun
       projectileSpeed: 19 # 9x18mm Makarov
       minAngle: 5 # Heavier than PM, slightly more stable for single shots
@@ -875,8 +837,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/m9beretta.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/m9beretta.rsi
     - type: Gun
       projectileSpeed: 20 # 9mm
       minAngle: 5
@@ -917,8 +877,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/tanm9.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/tanm9.rsi
       quickEquip: true
     - type: Gun
       projectileSpeed: 20 # 9mm
@@ -960,8 +918,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/jericho941.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/jericho941.rsi
     - type: Gun
       projectileSpeed: 20 # 9mm
       minAngle: 5
@@ -1000,8 +956,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/deagle.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/deagle.rsi
     - type: Gun
       projectileSpeed: 20 # .50 AE
       minAngle: 15 # Massive recoil
@@ -1040,8 +994,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/deagle.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/deagle.rsi
     - type: Gun
       projectileSpeed: 21 # .44 Magnum - very powerful
       minAngle: 12
@@ -1082,8 +1034,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/browning_hp.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/browning_hp.rsi
     - type: Gun
       projectileSpeed: 20 # 9mm
       minAngle: 5
@@ -1124,8 +1074,6 @@
   components:
     - type: Sprite
       sprite: Civ14/Weapons/Guns/sti2011.rsi
-    - type: Clothing
-      sprite: Civ14/Weapons/Guns/sti2011.rsi
     - type: Gun
       projectileSpeed: 18 # .45 ACP
       minAngle: 6 # High-end, very good control for .45

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

@@ -40,17 +40,13 @@
       containers:
         gun_magazine: !type:ContainerSlot
         gun_chamber: !type:ContainerSlot
-    - type: Wieldable
-    - type: GunWieldBonus
-      minAngle: -40
-      maxAngle: -40
     - type: Gun
       selectedMode: FullAuto
       availableModes:
         - FullAuto
-      projectileSpeed: 18
-      minAngle: 52
-      maxAngle: 70
+      projectileSpeed: 18 # Original minAngle: 52, maxAngle: 70
+      minAngle: 12
+      maxAngle: 30
       angleIncrease: 3.5
       angleDecay: 17.5
       fireRate: 4
@@ -84,10 +80,10 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/mp40.rsi
       equipDelay: 1
-    - type: Gun
+    - type: Gun # Original minAngle: 52, maxAngle: 70
       projectileSpeed: 18
-      minAngle: 52
-      maxAngle: 70
+      minAngle: 12
+      maxAngle: 30
       angleIncrease: 3.5
       angleDecay: 17.5
       fireRate: 4
@@ -130,9 +126,9 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/ppd.rsi
     - type: Gun
-      projectileSpeed: 18
-      minAngle: 55
-      maxAngle: 95
+      projectileSpeed: 18 # Original minAngle: 55, maxAngle: 95
+      minAngle: 15
+      maxAngle: 55
       angleIncrease: 5
       angleDecay: 20
       fireRate: 6.0
@@ -175,9 +171,9 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/ppsh.rsi
     - type: Gun
-      projectileSpeed: 18
-      minAngle: 65
-      maxAngle: 110
+      projectileSpeed: 18 # Original minAngle: 65, maxAngle: 110
+      minAngle: 25
+      maxAngle: 70
       angleIncrease: 3
       angleDecay: 10
       fireRate: 5
@@ -213,9 +209,9 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/pps.rsi
     - type: Gun
-      projectileSpeed: 18
-      minAngle: 50
-      maxAngle: 80
+      projectileSpeed: 18 # Original minAngle: 50, maxAngle: 80
+      minAngle: 10
+      maxAngle: 40
       angleIncrease: 4
       angleDecay: 22
       fireRate: 5.0
@@ -248,9 +244,9 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/greasegun.rsi
     - type: Gun
-      projectileSpeed: 18
-      minAngle: 50
-      maxAngle: 80
+      projectileSpeed: 18 # Original minAngle: 50, maxAngle: 80
+      minAngle: 10
+      maxAngle: 40
       angleIncrease: 4
       angleDecay: 20
       fireRate: 3.5
@@ -284,9 +280,9 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/tommygun.rsi
     - type: Gun
-      projectileSpeed: 18
-      minAngle: 55
-      maxAngle: 90
+      projectileSpeed: 18 # Original minAngle: 55, maxAngle: 90
+      minAngle: 15
+      maxAngle: 50
       angleIncrease: 4.5
       angleDecay: 19
       fireRate: 5.0
@@ -320,9 +316,9 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/thompson.rsi
     - type: Gun
-      fireRate: 4.8 # Slightly more controllable/slower than M1928
-      minAngle: 52
-      maxAngle: 85
+      fireRate: 4.8 # Slightly more controllable/slower than M1928 # Original minAngle: 52, maxAngle: 85
+      minAngle: 12
+      maxAngle: 45
       angleIncrease: 4.2
       angleDecay: 20
       soundGunshot:
@@ -355,9 +351,9 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/type100.rsi
     - type: Gun
-      projectileSpeed: 18
-      minAngle: 45 # 8mm Nambu is a weaker round
-      maxAngle: 65
+      projectileSpeed: 18 # Original minAngle: 45, maxAngle: 65
+      minAngle: 5 # 8mm Nambu is a weaker round
+      maxAngle: 25
       angleIncrease: 3
       angleDecay: 25
       fireRate: 3.5 # Similar to M3A1 due to lower RPM
@@ -390,9 +386,9 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/sten2.rsi
     - type: Gun
-      projectileSpeed: 18
-      minAngle: 50
-      maxAngle: 75 # Sten was a bit rough
+      projectileSpeed: 18 # Original minAngle: 50, maxAngle: 75
+      minAngle: 10
+      maxAngle: 35 # Sten was a bit rough
       angleIncrease: 3.8
       angleDecay: 18
       fireRate: 4.0 # Similar to MP40
@@ -423,10 +419,10 @@
     - type: Sprite
       sprite: Civ14/Weapons/Guns/sten2.rsi
     - type: Clothing
-      sprite: Civ14/Weapons/Guns/sten2.rsi
+      sprite: Civ14/Weapons/Guns/sten2.rsi # Original minAngle: 48, maxAngle: 70
     - type: Gun # Overrides for better controllability than Mk II
-      minAngle: 48
-      maxAngle: 70
+      minAngle: 8
+      maxAngle: 30
       angleIncrease: 3.5
       angleDecay: 20
       # Inherits projectileSpeed, fireRate, and soundGunshot from Sten MK II
@@ -446,10 +442,10 @@
       availableModes:
         - FullAuto
         - SemiAuto
-      projectileSpeed: 24 # 5.7x28mm - high velocity for a PDW
+      projectileSpeed: 24 # 5.7x28mm - high velocity for a PDW # Original minAngle: 42, maxAngle: 75
       fireRate: 6.0 # ~900 RPM
-      minAngle: 42 # Good control, bullpup
-      maxAngle: 75
+      minAngle: 2 # Good control, bullpup
+      maxAngle: 35
       angleIncrease: 3.2
       angleDecay: 28 # Recovers well
       soundGunshot:
@@ -484,10 +480,10 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/victor.rsi
     - type: Gun
-      projectileSpeed: 19 # 9mm
+      projectileSpeed: 19 # 9mm # Original minAngle: 38, maxAngle: 65
       fireRate: 7.0 # ~1200 RPM - very fast
-      minAngle: 38 # Kriss Super V system - very low recoil
-      maxAngle: 65
+      minAngle: 1 # Kriss Super V system - very low recoil
+      maxAngle: 25
       angleIncrease: 2.8 # Minimal climb
       angleDecay: 32 # Excellent recovery
       soundGunshot:
@@ -520,10 +516,10 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/uzi.rsi
     - type: Gun
-      projectileSpeed: 18 # 9mm
+      projectileSpeed: 18 # 9mm # Original minAngle: 50, maxAngle: 80
       fireRate: 4.0 # ~600 RPM
-      minAngle: 50 # Standard SMG kick
-      maxAngle: 80
+      minAngle: 10 # Standard SMG kick
+      maxAngle: 40
       angleIncrease: 4.0 # Heavier, open bolt feel
       angleDecay: 20
       soundGunshot:
@@ -557,10 +553,10 @@
     - type: Clothing
       sprite: Civ14/Weapons/Guns/mac10.rsi
     - type: Gun
-      projectileSpeed: 18 # .45 ACP
+      projectileSpeed: 18 # .45 ACP # Original minAngle: 60, maxAngle: 115
       fireRate: 6.8 # ~1100 RPM - bullet hose
-      minAngle: 60 # Hard to control
-      maxAngle: 115 # Wide spread
+      minAngle: 20 # Hard to control
+      maxAngle: 75 # Wide spread
       angleIncrease: 6.5 # Climbs fast
       angleDecay: 16 # Slow to recover
       soundGunshot:
@@ -594,11 +590,11 @@
     - type: Gun
       selectedMode: SemiAuto
       availableModes:
-        - SemiAuto
+        - SemiAuto # Original minAngle: 55, maxAngle: 95
       projectileSpeed: 19 # 9mm
       fireRate: 5.5 # ~750-800 RPM
-      minAngle: 55 # Can be jumpy
-      maxAngle: 95
+      minAngle: 15 # Can be jumpy
+      maxAngle: 55
       angleIncrease: 5.0
       angleDecay: 19
       soundGunshot:
@@ -633,11 +629,11 @@
       selectedMode: FullAuto
       availableModes:
         - FullAuto
-        - SemiAuto
+        - SemiAuto # Original minAngle: 52, maxAngle: 100
       projectileSpeed: 19 # 9mm Parabellum
       fireRate: 5.8 # ~850 RPM
-      minAngle: 52 # Machine pistol, a bit wild
-      maxAngle: 100
+      minAngle: 12 # Machine pistol, a bit wild
+      maxAngle: 60
       angleIncrease: 5.2
       angleDecay: 20
       soundGunshot:
@@ -673,11 +669,11 @@
       selectedMode: FullAuto
       availableModes:
         - FullAuto
-        - SemiAuto
+        - SemiAuto # Original minAngle: 40, maxAngle: 70
       projectileSpeed: 20 # 9mm - high quality
       fireRate: 5.6 # ~800 RPM
-      minAngle: 40 # Very controllable for an SMG
-      maxAngle: 70 # Tight grouping
+      minAngle: 1 # Very controllable for an SMG
+      maxAngle: 30 # Tight grouping
       angleIncrease: 3.0 # Low climb
       angleDecay: 30 # Excellent recovery
       soundGunshot:

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

@@ -0,0 +1,45 @@
+- type: entity
+  id: Barbedwire
+  description: A barbed wire fence.
+  parent: BaseStructure
+  name: barbed wire
+  components:
+    - type: InteractionOutline
+    - type: Sprite
+      sprite: Civ14/Objects/structures.rsi
+      state: barbwire
+      drawdepth: BlastDoors
+      noRot: true
+    - type: Physics
+    - type: AtmosExposed
+    - type: CollisionWake
+      enabled: false
+    - type: Fixtures
+      fixtures:
+        slips:
+          shape: !type:PhysShapeAabb
+            bounds: "-0.4,-0.4,0.4,0.4"
+          hard: false
+          layer:
+            - LowImpassable
+        fix1:
+          shape: !type:PhysShapeAabb
+            bounds: "-0.4,-0.4,0.4,0.4"
+          density: 30
+          mask:
+            - ItemMask
+    - type: DamageOtherOnHit
+      damage:
+        types:
+          Slash: 2
+    - type: StepTrigger
+      intersectRatio: 0.2
+    - type: TriggerOnStepTrigger
+    - type: DamageUserOnTrigger
+      damage:
+        types:
+          Slash: 5
+    - type: Slippery
+      slipSound:
+        path: /Audio/Effects/glass_step.ogg
+      launchForwardsMultiplier: 0

+ 7 - 7
Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml

@@ -42,10 +42,10 @@
         - Biological
       damage:
         types:
-          Heat: -5
-          Cold: -5
-          Shock: -5
-          Caustic: -1.5
+          Heat: -8
+          Cold: -8
+          Shock: -8
+          Caustic: -3
       healingBeginSound:
         path: "/Audio/Items/Medical/ointment_begin.ogg"
       healingEndSound:
@@ -136,7 +136,7 @@
         - Biological
       damage:
         groups:
-          Brute: -15 # 5 for each type in the group
+          Brute: -17 # 5 for each type in the group
       healingBeginSound:
         path: "/Audio/Items/Medical/brutepack_begin.ogg"
       healingEndSound:
@@ -296,8 +296,8 @@
       damage:
         types:
           Slash: -5
-          Piercing: -10
-      bloodlossModifier: -10
+          Piercing: -5
+      bloodlossModifier: -12
       healingBeginSound:
         path: "/Audio/Items/Medical/brutepack_begin.ogg"
       healingEndSound:

+ 18 - 0
Resources/Prototypes/GameRules/roundstart.yml

@@ -24,6 +24,17 @@
     - type: RespawnTracker
       respawnDelay: 120
       deleteBody: false
+# A fixed timer where all reinforcements are spawned at the same time.
+- type: entity
+  parent: BaseGameRule
+  id: RespawnDeadRuleTDMFixed
+  components:
+    - type: RespawnDeadRule
+      alwaysRespawnDead: true
+    - type: RespawnTracker
+      respawnDelay: 120
+      deleteBody: false
+      fixed: true
 
 - type: entity
   id: InactivityTimeRestart
@@ -76,9 +87,16 @@
   parent: BaseGameRule
   components:
     - type: TeamDeathMatchRule
+
 - type: entity
   parent: BaseGameRule
   id: FactionRule
   components:
     - type: FactionRule
 
+- type: entity
+  id: RandomWeatherRule
+  parent: BaseGameRule
+  components:
+    - type: RandomWeatherRule
+      allowedWeathers: [Rain, Clear, Storm]

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

@@ -14,6 +14,7 @@
   special:
     - !type:AddComponentSpecial
       components:
+        - type: MedievalAccent
         - type: NpcFactionMember
           factions:
             - England

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

@@ -14,6 +14,7 @@
   special:
     - !type:AddComponentSpecial
       components:
+        - type: MedievalAccent
         - type: NpcFactionMember
           factions:
             - France

+ 1 - 0
Resources/Prototypes/Roles/Jobs/Civ14/TDM/german.yml

@@ -258,5 +258,6 @@
     belt: ClothingSatchelMedicalMedsFilled
     back: ClothingBackpackDuffelFilled
     pocket1: CombatKnife
+    pocket2: civ13_magazine_clip_(7.92x57mm)
   inhand:
     - civ13_boltaction_Karabiner_98k

+ 1 - 0
Resources/Prototypes/Roles/Jobs/Civ14/TDM/soviet.yml

@@ -265,5 +265,6 @@
     belt: ClothingSatchelMedicalMedsFilled
     back: ClothingBackpackDuffelFilled
     pocket1: CombatKnife
+    pocket2: civ13_magazine_clip_(7.62x54mm)
   inhand:
     - civ13_boltaction_Mosin_30

+ 393 - 0
Resources/Prototypes/_Goobstation/Accents/word_replacements.yml

@@ -0,0 +1,393 @@
+# SPDX-FileCopyrightText: 2024 Aidenkrz <aiden@djkraz.com>
+# SPDX-FileCopyrightText: 2024 Piras314 <p1r4s@proton.me>
+# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 Aiden <aiden@djkraz.com>
+# SPDX-FileCopyrightText: 2025 BeeRobynn <166929042+BeeRobynn@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 BeeRobynn <robynthewarcrime@proton.me>
+# SPDX-FileCopyrightText: 2025 Cattowo <2spoopy4u2handle@gmail.com>
+# SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
+# SPDX-FileCopyrightText: 2025 Rouge2t7 <81053047+Sarahon@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 Solstice <solsticeofthewinter@gmail.com>
+# SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 smudge <138918973+Cerise-Cattowo@users.noreply.github.com>
+#
+# SPDX-License-Identifier: AGPL-3.0-or-later
+# Accents that work off of word replacements.
+
+- type: accent
+  id: ohio
+  wordReplacements:
+    accent-ohio-words-1: accent-ohio-words-replace-1
+    accent-ohio-words-2: accent-ohio-words-replace-2
+    accent-ohio-words-3: accent-ohio-words-replace-3
+    accent-ohio-words-4: accent-ohio-words-replace-4
+    accent-ohio-words-5: accent-ohio-words-replace-5
+    accent-ohio-words-6: accent-ohio-words-replace-6
+    accent-ohio-words-7: accent-ohio-words-replace-7
+    accent-ohio-words-8: accent-ohio-words-replace-8
+    accent-ohio-words-9: accent-ohio-words-replace-9
+    accent-ohio-words-10: accent-ohio-words-replace-10
+    accent-ohio-words-11: accent-ohio-words-replace-11
+    accent-ohio-words-12: accent-ohio-words-replace-12
+    accent-ohio-words-13: accent-ohio-words-replace-13
+    accent-ohio-words-14: accent-ohio-words-replace-14
+    accent-ohio-words-15: accent-ohio-words-replace-15
+    accent-ohio-words-16: accent-ohio-words-replace-16
+    accent-ohio-words-17: accent-ohio-words-replace-17
+    accent-ohio-words-18: accent-ohio-words-replace-18
+    accent-ohio-words-19: accent-ohio-words-replace-19
+    accent-ohio-words-20: accent-ohio-words-replace-20
+    accent-ohio-words-21: accent-ohio-words-replace-21
+    accent-ohio-words-22: accent-ohio-words-replace-22
+    accent-ohio-words-23: accent-ohio-words-replace-23
+    accent-ohio-words-24: accent-ohio-words-replace-24
+    accent-ohio-words-25: accent-ohio-words-replace-25
+    accent-ohio-words-26: accent-ohio-words-replace-26
+    accent-ohio-words-27: accent-ohio-words-replace-27
+    accent-ohio-words-28: accent-ohio-words-replace-28
+    accent-ohio-words-29: accent-ohio-words-replace-29
+    accent-ohio-words-30: accent-ohio-words-replace-30
+    accent-ohio-words-31: accent-ohio-words-replace-31
+    accent-ohio-words-32: accent-ohio-words-replace-32
+    accent-ohio-words-33: accent-ohio-words-replace-33
+    accent-ohio-words-34: accent-ohio-words-replace-34
+    accent-ohio-words-35: accent-ohio-words-replace-35
+    accent-ohio-words-36: accent-ohio-words-replace-36
+    accent-ohio-words-37: accent-ohio-words-replace-37
+    accent-ohio-words-38: accent-ohio-words-replace-38
+    accent-ohio-words-39: accent-ohio-words-replace-39
+    accent-ohio-words-40: accent-ohio-words-replace-40
+    accent-ohio-words-41: accent-ohio-words-replace-41
+    accent-ohio-words-42: accent-ohio-words-replace-42
+    accent-ohio-words-43: accent-ohio-words-replace-43
+    accent-ohio-words-44: accent-ohio-words-replace-44
+    accent-ohio-words-45: accent-ohio-words-replace-45
+    accent-ohio-words-46: accent-ohio-words-replace-46
+    accent-ohio-words-47: accent-ohio-words-replace-47
+    accent-ohio-words-48: accent-ohio-words-replace-48
+    accent-ohio-words-49: accent-ohio-words-replace-49
+    accent-ohio-words-50: accent-ohio-words-replace-50
+    accent-ohio-words-51: accent-ohio-words-replace-51
+    accent-ohio-words-52: accent-ohio-words-replace-52
+    accent-ohio-words-53: accent-ohio-words-replace-53
+    accent-ohio-words-54: accent-ohio-words-replace-54
+    accent-ohio-words-55: accent-ohio-words-replace-55
+    accent-ohio-words-56: accent-ohio-words-replace-56
+    accent-ohio-words-57: accent-ohio-words-replace-57
+    accent-ohio-words-58: accent-ohio-words-replace-58
+    accent-ohio-words-59: accent-ohio-words-replace-59
+    accent-ohio-words-60: accent-ohio-words-replace-60
+    accent-ohio-words-61: accent-ohio-words-replace-61
+    accent-ohio-words-62: accent-ohio-words-replace-62
+    accent-ohio-words-63: accent-ohio-words-replace-63
+    accent-ohio-words-64: accent-ohio-words-replace-64
+    accent-ohio-words-65: accent-ohio-words-replace-65
+    accent-ohio-words-66: accent-ohio-words-replace-66
+    accent-ohio-words-67: accent-ohio-words-replace-67
+    accent-ohio-words-68: accent-ohio-words-replace-68
+    accent-ohio-words-69: accent-ohio-words-replace-69
+    accent-ohio-words-70: accent-ohio-words-replace-70
+    accent-ohio-words-71: accent-ohio-words-replace-71
+    accent-ohio-words-72: accent-ohio-words-replace-72
+    accent-ohio-words-73: accent-ohio-words-replace-73
+    accent-ohio-words-74: accent-ohio-words-replace-74
+    accent-ohio-words-75: accent-ohio-words-replace-75
+    accent-ohio-words-76: accent-ohio-words-replace-76
+    accent-ohio-words-77: accent-ohio-words-replace-77
+    accent-ohio-words-78: accent-ohio-words-replace-78
+    accent-ohio-words-79: accent-ohio-words-replace-79
+    accent-ohio-words-80: accent-ohio-words-replace-80
+    accent-ohio-words-81: accent-ohio-words-replace-81
+    accent-ohio-words-82: accent-ohio-words-replace-82
+    accent-ohio-words-83: accent-ohio-words-replace-83
+    accent-ohio-words-84: accent-ohio-words-replace-84
+    accent-ohio-words-85: accent-ohio-words-replace-85
+    accent-ohio-words-86: accent-ohio-words-replace-86
+    accent-ohio-words-87: accent-ohio-words-replace-87
+    accent-ohio-words-88: accent-ohio-words-replace-88
+    accent-ohio-words-89: accent-ohio-words-replace-89
+    accent-ohio-words-90: accent-ohio-words-replace-90
+    accent-ohio-words-91: accent-ohio-words-replace-91
+    accent-ohio-words-92: accent-ohio-words-replace-92
+    accent-ohio-words-93: accent-ohio-words-replace-93
+    accent-ohio-words-94: accent-ohio-words-replace-94
+    accent-ohio-words-95: accent-ohio-words-replace-95
+    accent-ohio-words-96: accent-ohio-words-replace-96
+    accent-ohio-words-97: accent-ohio-words-replace-97
+    accent-ohio-words-98: accent-ohio-words-replace-98
+    accent-ohio-words-99: accent-ohio-words-replace-99
+    accent-ohio-words-100: accent-ohio-words-replace-100
+    accent-ohio-words-101: accent-ohio-words-replace-101
+    accent-ohio-words-102: accent-ohio-words-replace-102
+    accent-ohio-words-103: accent-ohio-words-replace-103
+    accent-ohio-words-104: accent-ohio-words-replace-104
+    accent-ohio-words-105: accent-ohio-words-replace-105
+    accent-ohio-words-106: accent-ohio-words-replace-106
+    accent-ohio-words-107: accent-ohio-words-replace-107
+    accent-ohio-words-108: accent-ohio-words-replace-108
+    accent-ohio-words-109: accent-ohio-words-replace-109
+    accent-ohio-words-110: accent-ohio-words-replace-110
+    accent-ohio-words-111: accent-ohio-words-replace-111
+    accent-ohio-words-112: accent-ohio-words-replace-112
+    accent-ohio-words-113: accent-ohio-words-replace-113
+    accent-ohio-words-114: accent-ohio-words-replace-114
+    accent-ohio-words-115: accent-ohio-words-replace-115
+    accent-ohio-words-116: accent-ohio-words-replace-116
+    accent-ohio-words-117: accent-ohio-words-replace-117
+    accent-ohio-words-118: accent-ohio-words-replace-118
+    accent-ohio-words-119: accent-ohio-words-replace-119
+    accent-ohio-words-120: accent-ohio-words-replace-120
+    accent-ohio-words-121: accent-ohio-words-replace-121
+    accent-ohio-words-122: accent-ohio-words-replace-122
+    accent-ohio-words-123: accent-ohio-words-replace-123
+    accent-ohio-words-124: accent-ohio-words-replace-124
+    accent-ohio-words-125: accent-ohio-words-replace-125
+    accent-ohio-words-126: accent-ohio-words-replace-126
+    accent-ohio-words-127: accent-ohio-words-replace-127
+    accent-ohio-words-128: accent-ohio-words-replace-128
+    accent-ohio-words-129: accent-ohio-words-replace-129
+    accent-ohio-words-130: accent-ohio-words-replace-130
+    accent-ohio-words-131: accent-ohio-words-replace-131
+    accent-ohio-words-132: accent-ohio-words-replace-132
+
+- type: accent
+  id: medieval
+  wordReplacements:
+    accent-medieval-words-1: accent-medieval-words-replace-1
+    accent-medieval-words-2: accent-medieval-words-replace-2
+    accent-medieval-words-3: accent-medieval-words-replace-3
+    accent-medieval-words-4: accent-medieval-words-replace-4
+    accent-medieval-words-5: accent-medieval-words-replace-5
+    accent-medieval-words-6: accent-medieval-words-replace-6
+    accent-medieval-words-7: accent-medieval-words-replace-7
+    accent-medieval-words-8: accent-medieval-words-replace-8
+    accent-medieval-words-9: accent-medieval-words-replace-9
+    accent-medieval-words-10: accent-medieval-words-replace-10
+    accent-medieval-words-11: accent-medieval-words-replace-11
+    accent-medieval-words-12: accent-medieval-words-replace-12
+    accent-medieval-words-13: accent-medieval-words-replace-13
+    accent-medieval-words-14: accent-medieval-words-replace-14
+    accent-medieval-words-15: accent-medieval-words-replace-15
+    accent-medieval-words-16: accent-medieval-words-replace-16
+    accent-medieval-words-17: accent-medieval-words-replace-17
+    accent-medieval-words-18: accent-medieval-words-replace-18
+    accent-medieval-words-19: accent-medieval-words-replace-19
+    accent-medieval-words-20: accent-medieval-words-replace-20
+    accent-medieval-words-21: accent-medieval-words-replace-21
+    accent-medieval-words-22: accent-medieval-words-replace-22
+    accent-medieval-words-23: accent-medieval-words-replace-23
+    accent-medieval-words-24: accent-medieval-words-replace-24
+    accent-medieval-words-25: accent-medieval-words-replace-25
+    accent-medieval-words-26: accent-medieval-words-replace-26
+    accent-medieval-words-27: accent-medieval-words-replace-27
+    accent-medieval-words-28: accent-medieval-words-replace-28
+    accent-medieval-words-29: accent-medieval-words-replace-29
+    accent-medieval-words-30: accent-medieval-words-replace-30
+    accent-medieval-words-31: accent-medieval-words-replace-31
+    accent-medieval-words-32: accent-medieval-words-replace-32
+    accent-medieval-words-33: accent-medieval-words-replace-33
+    accent-medieval-words-34: accent-medieval-words-replace-34
+    accent-medieval-words-35: accent-medieval-words-replace-35
+    accent-medieval-words-36: accent-medieval-words-replace-36
+    accent-medieval-words-37: accent-medieval-words-replace-37
+    accent-medieval-words-38: accent-medieval-words-replace-38
+    accent-medieval-words-39: accent-medieval-words-replace-39
+    accent-medieval-words-40: accent-medieval-words-replace-40
+    accent-medieval-words-41: accent-medieval-words-replace-41
+    accent-medieval-words-42: accent-medieval-words-replace-42
+    accent-medieval-words-43: accent-medieval-words-replace-43
+    accent-medieval-words-44: accent-medieval-words-replace-44
+    accent-medieval-words-45: accent-medieval-words-replace-45
+    accent-medieval-words-46: accent-medieval-words-replace-46
+    accent-medieval-words-47: accent-medieval-words-replace-47
+    accent-medieval-words-48: accent-medieval-words-replace-48
+    accent-medieval-words-49: accent-medieval-words-replace-49
+    accent-medieval-words-50: accent-medieval-words-replace-50
+    accent-medieval-words-51: accent-medieval-words-replace-51
+    accent-medieval-words-52: accent-medieval-words-replace-52
+    accent-medieval-words-53: accent-medieval-words-replace-53
+    accent-medieval-words-54: accent-medieval-words-replace-54
+    accent-medieval-words-55: accent-medieval-words-replace-55
+    accent-medieval-words-56: accent-medieval-words-replace-56
+    accent-medieval-words-57: accent-medieval-words-replace-57
+    accent-medieval-words-58: accent-medieval-words-replace-58
+    accent-medieval-words-59: accent-medieval-words-replace-59
+    accent-medieval-words-60: accent-medieval-words-replace-60
+    accent-medieval-words-61: accent-medieval-words-replace-61
+    accent-medieval-words-62: accent-medieval-words-replace-62
+    accent-medieval-words-63: accent-medieval-words-replace-63
+    accent-medieval-words-64: accent-medieval-words-replace-64
+    accent-medieval-words-65: accent-medieval-words-replace-65
+    accent-medieval-words-66: accent-medieval-words-replace-66
+    accent-medieval-words-67: accent-medieval-words-replace-67
+    accent-medieval-words-68: accent-medieval-words-replace-68
+    accent-medieval-words-69: accent-medieval-words-replace-69
+    accent-medieval-words-70: accent-medieval-words-replace-70
+    accent-medieval-words-71: accent-medieval-words-replace-71
+    accent-medieval-words-72: accent-medieval-words-replace-72
+    accent-medieval-words-73: accent-medieval-words-replace-73
+    accent-medieval-words-74: accent-medieval-words-replace-74
+    accent-medieval-words-75: accent-medieval-words-replace-75
+    accent-medieval-words-76: accent-medieval-words-replace-76
+    accent-medieval-words-77: accent-medieval-words-replace-77
+    accent-medieval-words-78: accent-medieval-words-replace-78
+    accent-medieval-words-79: accent-medieval-words-replace-79
+    accent-medieval-words-80: accent-medieval-words-replace-80
+    accent-medieval-words-81: accent-medieval-words-replace-81
+    accent-medieval-words-82: accent-medieval-words-replace-82
+    accent-medieval-words-83: accent-medieval-words-replace-83
+    accent-medieval-words-84: accent-medieval-words-replace-84
+    accent-medieval-words-85: accent-medieval-words-replace-85
+    accent-medieval-words-86: accent-medieval-words-replace-86
+    accent-medieval-words-87: accent-medieval-words-replace-87
+    accent-medieval-words-88: accent-medieval-words-replace-88
+    accent-medieval-words-89: accent-medieval-words-replace-89
+    accent-medieval-words-90: accent-medieval-words-replace-90
+    accent-medieval-words-91: accent-medieval-words-replace-91
+    accent-medieval-words-92: accent-medieval-words-replace-92
+    accent-medieval-words-93: accent-medieval-words-replace-93
+    accent-medieval-words-94: accent-medieval-words-replace-94
+    accent-medieval-words-95: accent-medieval-words-replace-95
+    accent-medieval-words-96: accent-medieval-words-replace-96
+    accent-medieval-words-97: accent-medieval-words-replace-97
+    accent-medieval-words-98: accent-medieval-words-replace-98
+    accent-medieval-words-99: accent-medieval-words-replace-99
+    accent-medieval-words-100: accent-medieval-words-replace-100
+    accent-medieval-words-101: accent-medieval-words-replace-101
+    accent-medieval-words-102: accent-medieval-words-replace-102
+    accent-medieval-words-103: accent-medieval-words-replace-103
+    accent-medieval-words-104: accent-medieval-words-replace-104
+    accent-medieval-words-105: accent-medieval-words-replace-105
+    accent-medieval-words-106: accent-medieval-words-replace-106
+    accent-medieval-words-107: accent-medieval-words-replace-107
+    accent-medieval-words-108: accent-medieval-words-replace-108
+    accent-medieval-words-109: accent-medieval-words-replace-109
+    accent-medieval-words-110: accent-medieval-words-replace-110
+    accent-medieval-words-111: accent-medieval-words-replace-111
+    accent-medieval-words-112: accent-medieval-words-replace-112
+    accent-medieval-words-113: accent-medieval-words-replace-113
+    accent-medieval-words-114: accent-medieval-words-replace-114
+    accent-medieval-words-115: accent-medieval-words-replace-115
+    accent-medieval-words-116: accent-medieval-words-replace-116
+    accent-medieval-words-117: accent-medieval-words-replace-117
+    accent-medieval-words-118: accent-medieval-words-replace-118
+    accent-medieval-words-119: accent-medieval-words-replace-119
+    accent-medieval-words-120: accent-medieval-words-replace-120
+    accent-medieval-words-121: accent-medieval-words-replace-121
+    accent-medieval-words-122: accent-medieval-words-replace-122
+    accent-medieval-words-123: accent-medieval-words-replace-123
+    accent-medieval-words-124: accent-medieval-words-replace-124
+    accent-medieval-words-125: accent-medieval-words-replace-125
+    accent-medieval-words-126: accent-medieval-words-replace-126
+    accent-medieval-words-127: accent-medieval-words-replace-127
+    accent-medieval-words-128: accent-medieval-words-replace-128
+    accent-medieval-words-129: accent-medieval-words-replace-129
+    accent-medieval-words-130: accent-medieval-words-replace-130
+    accent-medieval-words-131: accent-medieval-words-replace-131
+    accent-medieval-words-132: accent-medieval-words-replace-132
+    accent-medieval-words-133: accent-medieval-words-replace-133
+    accent-medieval-words-134: accent-medieval-words-replace-134
+    accent-medieval-words-135: accent-medieval-words-replace-135
+    accent-medieval-words-136: accent-medieval-words-replace-136
+    accent-medieval-words-137: accent-medieval-words-replace-137
+    accent-medieval-words-138: accent-medieval-words-replace-138
+    accent-medieval-words-139: accent-medieval-words-replace-139
+    accent-medieval-words-140: accent-medieval-words-replace-140
+    accent-medieval-words-141: accent-medieval-words-replace-141
+    accent-medieval-words-142: accent-medieval-words-replace-142
+    accent-medieval-words-143: accent-medieval-words-replace-143
+    accent-medieval-words-144: accent-medieval-words-replace-144
+    accent-medieval-words-145: accent-medieval-words-replace-145
+    accent-medieval-words-146: accent-medieval-words-replace-146
+    accent-medieval-words-147: accent-medieval-words-replace-147
+    accent-medieval-words-148: accent-medieval-words-replace-148
+    accent-medieval-words-149: accent-medieval-words-replace-149
+    accent-medieval-words-150: accent-medieval-words-replace-150
+    accent-medieval-words-151: accent-medieval-words-replace-151
+    accent-medieval-words-152: accent-medieval-words-replace-152
+    accent-medieval-words-153: accent-medieval-words-replace-153
+    accent-medieval-words-154: accent-medieval-words-replace-154
+    accent-medieval-words-155: accent-medieval-words-replace-155
+    accent-medieval-words-156: accent-medieval-words-replace-156
+    accent-medieval-words-157: accent-medieval-words-replace-157
+    accent-medieval-words-158: accent-medieval-words-replace-158
+    accent-medieval-words-159: accent-medieval-words-replace-159
+    accent-medieval-words-160: accent-medieval-words-replace-160
+    accent-medieval-words-161: accent-medieval-words-replace-161
+    accent-medieval-words-162: accent-medieval-words-replace-162
+    accent-medieval-words-163: accent-medieval-words-replace-163
+    accent-medieval-words-164: accent-medieval-words-replace-164
+    accent-medieval-words-165: accent-medieval-words-replace-165
+    accent-medieval-words-166: accent-medieval-words-replace-166
+    accent-medieval-words-167: accent-medieval-words-replace-167
+    accent-medieval-words-168: accent-medieval-words-replace-168
+    accent-medieval-words-169: accent-medieval-words-replace-169
+    accent-medieval-words-170: accent-medieval-words-replace-170
+    accent-medieval-words-171: accent-medieval-words-replace-171
+    accent-medieval-words-172: accent-medieval-words-replace-172
+    accent-medieval-words-173: accent-medieval-words-replace-173
+    accent-medieval-words-174: accent-medieval-words-replace-174
+    accent-medieval-words-175: accent-medieval-words-replace-175
+    accent-medieval-words-176: accent-medieval-words-replace-176
+    accent-medieval-words-177: accent-medieval-words-replace-177
+    accent-medieval-words-178: accent-medieval-words-replace-178
+    accent-medieval-words-179: accent-medieval-words-replace-179
+    accent-medieval-words-180: accent-medieval-words-replace-180
+    accent-medieval-words-181: accent-medieval-words-replace-181
+    accent-medieval-words-182: accent-medieval-words-replace-182
+    accent-medieval-words-183: accent-medieval-words-replace-183
+    accent-medieval-words-184: accent-medieval-words-replace-184
+    accent-medieval-words-185: accent-medieval-words-replace-185
+    accent-medieval-words-186: accent-medieval-words-replace-186
+    accent-medieval-words-187: accent-medieval-words-replace-187
+    accent-medieval-words-188: accent-medieval-words-replace-188
+    accent-medieval-words-189: accent-medieval-words-replace-189
+    accent-medieval-words-190: accent-medieval-words-replace-190
+    accent-medieval-words-191: accent-medieval-words-replace-191
+    accent-medieval-words-192: accent-medieval-words-replace-192
+    accent-medieval-words-193: accent-medieval-words-replace-193
+    accent-medieval-words-194: accent-medieval-words-replace-194
+    accent-medieval-words-195: accent-medieval-words-replace-195
+    accent-medieval-words-196: accent-medieval-words-replace-196
+    accent-medieval-words-197: accent-medieval-words-replace-197
+    accent-medieval-words-198: accent-medieval-words-replace-198
+    accent-medieval-words-199: accent-medieval-words-replace-199
+    accent-medieval-words-200: accent-medieval-words-replace-200
+    accent-medieval-words-201: accent-medieval-words-replace-201
+    accent-medieval-words-202: accent-medieval-words-replace-202
+    accent-medieval-words-203: accent-medieval-words-replace-203
+    accent-medieval-words-204: accent-medieval-words-replace-204
+    accent-medieval-words-205: accent-medieval-words-replace-205
+    accent-medieval-words-206: accent-medieval-words-replace-206
+    accent-medieval-words-207: accent-medieval-words-replace-207
+    accent-medieval-words-208: accent-medieval-words-replace-208
+    accent-medieval-words-209: accent-medieval-words-replace-209
+    accent-medieval-words-210: accent-medieval-words-replace-210
+    accent-medieval-words-211: accent-medieval-words-replace-211
+    accent-medieval-words-212: accent-medieval-words-replace-212
+    accent-medieval-words-213: accent-medieval-words-replace-213
+    accent-medieval-words-214: accent-medieval-words-replace-214
+    accent-medieval-words-215: accent-medieval-words-replace-215
+    accent-medieval-words-216: accent-medieval-words-replace-216
+    accent-medieval-words-217: accent-medieval-words-replace-217
+    accent-medieval-words-218: accent-medieval-words-replace-218
+    accent-medieval-words-219: accent-medieval-words-replace-219
+    accent-medieval-words-220: accent-medieval-words-replace-220
+    accent-medieval-words-221: accent-medieval-words-replace-221
+    accent-medieval-words-222: accent-medieval-words-replace-222
+    accent-medieval-words-223: accent-medieval-words-replace-223
+    accent-medieval-words-224: accent-medieval-words-replace-224
+    accent-medieval-words-225: accent-medieval-words-replace-225
+    accent-medieval-words-226: accent-medieval-words-replace-226
+    accent-medieval-words-227: accent-medieval-words-replace-227
+    accent-medieval-words-228: accent-medieval-words-replace-228
+    accent-medieval-words-229: accent-medieval-words-replace-229
+    accent-medieval-words-230: accent-medieval-words-replace-230
+    accent-medieval-words-231: accent-medieval-words-replace-231
+    accent-medieval-words-232: accent-medieval-words-replace-232
+    accent-medieval-words-233: accent-medieval-words-replace-233
+    accent-medieval-words-234: accent-medieval-words-replace-234
+    accent-medieval-words-235: accent-medieval-words-replace-235
+    accent-medieval-words-236: accent-medieval-words-replace-236
+    accent-medieval-words-237: accent-medieval-words-replace-237
+    accent-medieval-words-238: accent-medieval-words-replace-238

+ 2 - 1
Resources/Prototypes/game_presets.yml

@@ -18,7 +18,8 @@
   showInVote: true
   description: tdm-description
   rules:
-    - RespawnDeadRuleTDM
+    - RespawnDeadRuleTDMFixed
     - GracewallRule
     - CaptureAreaRule
     - TeamDeathMatchRule
+    - RandomWeatherRule

BIN
Resources/Textures/Civ14/Objects/ammo.rsi/mag-0.png


+ 4 - 1
Resources/Textures/Civ14/Objects/ammo.rsi/meta.json

@@ -18,6 +18,9 @@
                 ]
             ]
         },
+        {
+            "name": "mag-0"
+        },
         {
             "name": "MagSpear"
         },
@@ -1566,4 +1569,4 @@
             "name": "service_rifle-0"
         }
     ]
-}
+}

+ 37 - 29
Resources/Textures/Civ14/Weapons/Guns/A280.rsi/meta.json

@@ -1,31 +1,39 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
-}
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
+}

BIN
Resources/Textures/Civ14/Weapons/Guns/A280.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/A280.rsi/wielded-inhand-right.png


+ 36 - 28
Resources/Textures/Civ14/Weapons/Guns/DC-15.rsi/meta.json

@@ -1,31 +1,39 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Weapons/Guns/DC-15.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/DC-15.rsi/wielded-inhand-right.png


+ 36 - 28
Resources/Textures/Civ14/Weapons/Guns/DC-15A.rsi/meta.json

@@ -1,31 +1,39 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Weapons/Guns/DC-15A.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/DC-15A.rsi/wielded-inhand-right.png


+ 36 - 28
Resources/Textures/Civ14/Weapons/Guns/DC-17.rsi/meta.json

@@ -1,31 +1,39 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Weapons/Guns/DC-17.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/DC-17.rsi/wielded-inhand-right.png


+ 36 - 28
Resources/Textures/Civ14/Weapons/Guns/E-11.rsi/meta.json

@@ -1,31 +1,39 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Weapons/Guns/E-11.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/E-11.rsi/wielded-inhand-right.png


+ 36 - 28
Resources/Textures/Civ14/Weapons/Guns/E-5.rsi/meta.json

@@ -1,31 +1,39 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Weapons/Guns/E-5.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/E-5.rsi/wielded-inhand-right.png


BIN
Resources/Textures/Civ14/Weapons/Guns/Z-6.rsi/Z-6.png


BIN
Resources/Textures/Civ14/Weapons/Guns/Z-6.rsi/bolt-open.png


BIN
Resources/Textures/Civ14/Weapons/Guns/Z-6.rsi/icon.png


BIN
Resources/Textures/Civ14/Weapons/Guns/Z-6.rsi/inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/Z-6.rsi/inhand-right.png


+ 0 - 31
Resources/Textures/Civ14/Weapons/Guns/Z-6.rsi/meta.json

@@ -1,31 +0,0 @@
-{
-    "version": 1,
-    "license": "AGPL-3.0",
-    "copyright": "Exported from https://github.com/civ13/civ13",
-    "size": {
-        "x": 32,
-        "y": 96
-    },
-    "states": [
-        {
-            "name": "icon",
-            "directions": 1
-        },
-        {
-            "name": "inhand-left",
-            "directions": 1
-        },
-        {
-            "name": "inhand-right",
-            "directions": 1
-        },
-        {
-            "name": "Z-6",
-            "directions": 1
-        },
-        {
-            "name": "bolt-open",
-            "directions": 1
-        }
-    ]
-}

+ 24 - 0
Resources/Textures/Civ14/Weapons/Guns/addmag.py

@@ -0,0 +1,24 @@
+import os
+import shutil
+
+
+def ensure_mag_0_exists(root_dir):
+    for current_dir, subdirs, files in os.walk(root_dir):
+        # Skip if mag-0.png already exists
+        if "mag-0.png" in files:
+            continue
+
+        parent_dir = os.path.dirname(current_dir)
+        source_path = os.path.join(parent_dir, "mag-0.png")
+        target_path = os.path.join(current_dir, "mag-0.png")
+
+        if os.path.isfile(source_path):
+            print(f"Copying {source_path} → {target_path}")
+            shutil.copyfile(source_path, target_path)
+        else:
+            print(f"No mag-0.png found to copy for: {current_dir}")
+
+
+# Change this to your actual root folder
+root_folder = os.path.abspath(os.path.dirname(__file__))
+ensure_mag_0_exists(root_folder)

+ 52 - 0
Resources/Textures/Civ14/Weapons/Guns/addwieleded.py

@@ -0,0 +1,52 @@
+import os
+import json
+import shutil
+
+
+def process_folder(folder):
+    left_src = os.path.join(folder, "inhand-left.png")
+    right_src = os.path.join(folder, "inhand-right.png")
+    left_dst = os.path.join(folder, "wielded-inhand-left.png")
+    right_dst = os.path.join(folder, "wielded-inhand-right.png")
+    meta_path = os.path.join(folder, "meta.json")
+
+    if os.path.isfile(left_src) and os.path.isfile(right_src):
+        # Copy files
+        shutil.copyfile(left_src, left_dst)
+        shutil.copyfile(right_src, right_dst)
+        print(f"Copied to wielded-inhand-* in {folder}")
+
+        # Modify meta.json
+        if os.path.isfile(meta_path):
+            with open(meta_path, "r", encoding="utf-8") as f:
+                meta = json.load(f)
+
+            states = meta.get("states", [])
+            state_names = [s["name"] for s in states]
+
+            changed = False
+            for name in ["wielded-inhand-left", "wielded-inhand-right"]:
+                if name not in state_names:
+                    states.append({"name": name, "directions": 1})
+                    changed = True
+
+            if changed:
+                meta["states"] = states
+                with open(meta_path, "w", encoding="utf-8") as f:
+                    json.dump(meta, f, indent=4)
+                print(f"Updated meta.json in {folder}")
+        else:
+            print(f"meta.json not found in {folder}, skipping JSON update.")
+    else:
+        print(f"Missing inhand-left or inhand-right in {folder}, skipping.")
+
+
+def main():
+    root = os.path.abspath(os.path.dirname(__file__))
+
+    for current_dir, subdirs, files in os.walk(root):
+        process_folder(current_dir)
+
+
+if __name__ == "__main__":
+    main()

+ 44 - 36
Resources/Textures/Civ14/Weapons/Guns/ak101.rsi/meta.json

@@ -1,39 +1,47 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "ak101",
-      "directions": 1
-    },
-    {
-      "name": "equipped-BACKPACK",
-      "directions": 4
-    },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "ak101",
+            "directions": 1
+        },
+        {
+            "name": "equipped-BACKPACK",
+            "directions": 4
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Weapons/Guns/ak101.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/ak101.rsi/wielded-inhand-right.png


+ 40 - 32
Resources/Textures/Civ14/Weapons/Guns/ak12.rsi/meta.json

@@ -1,35 +1,43 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "ak12",
-      "directions": 1
-    },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "ak12",
+            "directions": 1
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Weapons/Guns/ak12.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/ak12.rsi/wielded-inhand-right.png


+ 44 - 36
Resources/Textures/Civ14/Weapons/Guns/ak47.rsi/meta.json

@@ -1,39 +1,47 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "ak47",
-      "directions": 1
-    },
-    {
-      "name": "equipped-BACKPACK",
-      "directions": 4
-    },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "ak47",
+            "directions": 1
+        },
+        {
+            "name": "equipped-BACKPACK",
+            "directions": 4
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Weapons/Guns/ak47.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/ak47.rsi/wielded-inhand-right.png


+ 40 - 32
Resources/Textures/Civ14/Weapons/Guns/ak47gold.rsi/meta.json

@@ -1,35 +1,43 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "ak47gold",
-      "directions": 1
-    },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "ak47gold",
+            "directions": 1
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Weapons/Guns/ak47gold.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/ak47gold.rsi/wielded-inhand-right.png


+ 44 - 36
Resources/Textures/Civ14/Weapons/Guns/ak74.rsi/meta.json

@@ -1,39 +1,47 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "ak74",
-      "directions": 1
-    },
-    {
-      "name": "equipped-BACKPACK",
-      "directions": 4
-    },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "ak74",
+            "directions": 1
+        },
+        {
+            "name": "equipped-BACKPACK",
+            "directions": 4
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Weapons/Guns/ak74.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/ak74.rsi/wielded-inhand-right.png


+ 44 - 36
Resources/Textures/Civ14/Weapons/Guns/ak74m.rsi/meta.json

@@ -1,39 +1,47 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "ak74m",
-      "directions": 1
-    },
-    {
-      "name": "equipped-BACKPACK",
-      "directions": 4
-    },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "ak74m",
+            "directions": 1
+        },
+        {
+            "name": "equipped-BACKPACK",
+            "directions": 4
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Weapons/Guns/ak74m.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/ak74m.rsi/wielded-inhand-right.png


+ 44 - 36
Resources/Textures/Civ14/Weapons/Guns/ak74mtactical.rsi/meta.json

@@ -1,39 +1,47 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "ak74mtactical",
-      "directions": 1
-    },
-    {
-      "name": "equipped-BACKPACK",
-      "directions": 4
-    },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "ak74mtactical",
+            "directions": 1
+        },
+        {
+            "name": "equipped-BACKPACK",
+            "directions": 4
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Weapons/Guns/ak74mtactical.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/ak74mtactical.rsi/wielded-inhand-right.png


+ 44 - 36
Resources/Textures/Civ14/Weapons/Guns/akms.rsi/meta.json

@@ -1,39 +1,47 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "akms",
-      "directions": 1
-    },
-    {
-      "name": "equipped-BACKPACK",
-      "directions": 4
-    },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "akms",
+            "directions": 1
+        },
+        {
+            "name": "equipped-BACKPACK",
+            "directions": 4
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Weapons/Guns/akms.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/akms.rsi/wielded-inhand-right.png


+ 44 - 36
Resources/Textures/Civ14/Weapons/Guns/akms_folded.rsi/meta.json

@@ -1,39 +1,47 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "equipped-BACKPACK",
-      "directions": 4
-    },
-    {
-      "name": "folded",
-      "directions": 1
-    },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "equipped-BACKPACK",
+            "directions": 4
+        },
+        {
+            "name": "folded",
+            "directions": 1
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

BIN
Resources/Textures/Civ14/Weapons/Guns/akms_folded.rsi/wielded-inhand-left.png


BIN
Resources/Textures/Civ14/Weapons/Guns/akms_folded.rsi/wielded-inhand-right.png


+ 44 - 36
Resources/Textures/Civ14/Weapons/Guns/aks74.rsi/meta.json

@@ -1,39 +1,47 @@
 {
-  "version": 1,
-  "license": "AGPL-3.0",
-  "copyright": "Exported from https://github.com/civ13/civ13",
-  "size": {
-    "x": 32,
-    "y": 32
-  },
-  "states": [
-    {
-      "name": "mag-0",
-      "directions": 1
+    "version": 1,
+    "license": "AGPL-3.0",
+    "copyright": "Exported from https://github.com/civ13/civ13",
+    "size": {
+        "x": 32,
+        "y": 32
     },
-    {
-      "name": "aks74",
-      "directions": 1
-    },
-    {
-      "name": "equipped-BACKPACK",
-      "directions": 4
-    },
-    {
-      "name": "icon",
-      "directions": 1
-    },
-    {
-      "name": "inhand-left",
-      "directions": 4
-    },
-    {
-      "name": "inhand-right",
-      "directions": 4
-    },
-    {
-      "name": "bolt-open",
-      "directions": 1
-    }
-  ]
+    "states": [
+        {
+            "name": "mag-0",
+            "directions": 1
+        },
+        {
+            "name": "aks74",
+            "directions": 1
+        },
+        {
+            "name": "equipped-BACKPACK",
+            "directions": 4
+        },
+        {
+            "name": "icon",
+            "directions": 1
+        },
+        {
+            "name": "inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "inhand-right",
+            "directions": 4
+        },
+        {
+            "name": "bolt-open",
+            "directions": 1
+        },
+        {
+            "name": "wielded-inhand-left",
+            "directions": 4
+        },
+        {
+            "name": "wielded-inhand-right",
+            "directions": 4
+        }
+    ]
 }

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott