Repository: CleverRaven/Cataclysm-DDA
Pull request #80305: Add a new nether monster, Eldritch Huntsman
Author: login: RangerFromBaja
Labels: name: [JSON]
description: Changes (can be) made in JSON
name: Spawn
description: Creatures, items, vehicles, locations appearing on map
name: Code: Tests
description: Measurement, self-control, statistics, balancing.
name: Monsters
description: Monsters both friendly and unfriendly.
name: Items: Ammo / Guns
description: Ammunition for all kinds of weapons and these weapons themselves
name: [Python]
description: Code made in Python
name: Code: Tooling
description: Tooling that is not part of the main game but is part of the repo.
name: astyled
description: astyled PR, label is assigned by github actions
name: json-styled
description: JSON lint passed, label assigned by github actions
name: BasicBuildPassed
description: This PR builds correctly, label assigned by github actions
Created: 2025-03-24T10:30:14Z | Merged: 2025-03-31T02:48:39Z

<!-- HOW TO USE: Under each "#### Heading" below, enter information relevant to your pull request.
Leave the headings unless they don't apply to your PR.

Please read carefully.
Once a pull request is submitted, automatic stylistic and consistency checks will be performed on the PR's changes.
The results can be either seen under the "Files changed" section of a PR or in the check's details.

Rules for suggested pull requests:
- If possible, limit yourself to small changes, 500 strings at max. Exceptions are adding or changing maps, and changes, that won't work unless they are done in a single run (even then there can be ways) - violating it puts a lot of unnecessary work on our merge team.
- Do not scope creep. If you make a pull request "Add new gun", please do not make anything more than adding the gun and following changes, like changing the stats of the gun, removing other guns from itemgroups or tweaking zombie horse stats - violating it makes future search and debugging stuff much harder, since PR name is not related to what is changed in the game. "Who the hell removed the quest item from drop in location X in PR, that adds a new plushie" - this may be a quote from a person who was affected by scope creep
- Do not make omnibus PRs. Meaning do not make a single PR, that fixes ten different, not related issues, at once, even if they are all one string - same as previously mentioned scope creep, it doesn't help to search the changes when debugging, despite all power of git blame tool

NOTE: Please grant permission for repository maintainers to edit your PR.  It is EXTREMELY common for PRs to be held up due to trivial changes being requested and the author being unavailable to make them. -->

#### Summary
Content "Adds a new nether monster"
<!-- This section should consist of exactly one line, edit the one above.
1. Replace the word "Category" with one of these words: Features, Content, Interface, Mods, Balance, Bugfixes, Performance, Infrastructure, Build, I18N.
2. Replace the text inside the quotes with a brief description of your changes.
Or if you don't want a changelog entry, replace the whole line with just the word "None" (with no quotes).
Examples:
1. None
2. Features "In-game Armor sprite change"
3. Interface "Show crafting failure chances in the crafting interface"
4. Infrastructure "JSON-ize slot machines"
5. Bugfixes "Crafting GUI: show how much recipe makes for non-charge items"
For more on the meaning of each category, see:
https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/CHANGELOG_GUIDELINES.md
If approved and merged, your summary will be added to the project changelog:
https://github.com/CleverRaven/Cataclysm-DDA/blob/master/data/changelog.txt -->

#### Purpose of change
I noticed that a lot of nether creatures are quite old, why not add another one?
<!-- With a few sentences, describe your reasons for making this change.
If it relates to an existing issue, you can link it with a # followed by the GitHub issue number, like #1234.
When you submit a pull request that completely resolves an issue, use [Github's closing keywords](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests#linking-a-pull-request-to-an-issue)
to automatically close the issue once your pull request is merged.
If there is no related issue, explain here what issue, feature, or other concern you are addressing.  If this is a bugfix, include steps to reproduce the original bug, so your fix can be verified. -->

#### Describe the solution
Add a new nether monster, the dimensional shambler. It is somewhat intelligent, can occasionally throw "javelins" at enemies (that grow out of its body), and can flee if it takes enough damage and feels like it can't kill you. It is not very difficult to kill with a gun but you'll be in lot of trouble in melee without good armor. If it manages to flee it will slowly heal back (it has 1 hp regen per second) and more than likely try its chances again.
I made it spawn somewhat rarely from portals and whatever places nether creatures appear at.
<!-- How does the feature work, or how does this fix a bug?  The easier you make your solution to understand, the faster it can get merged. -->

#### Describe alternatives you've considered
Add a sonar-like ability that it would use occasionally that allows it to see creatures behind walls briefly, but I couldn't figure out how to do it in a good enough way or with the player getting signposted that they're being tracked.
<!-- Explain any alternative solutions, different approaches, or possibilities you've considered using to solve the same problem. -->

#### Testing
Teleported around locations with nether creatures, it successfully spawned in the monster corpse location and seems to work.

Combat testing:
evacuee: barely killed it with a pistol, spear got me turned into a smoothie.
scavenger: AR rifle was effective, killed it in 5-6 shots. almost killed it with a knife, shambler saw that I took considerable damage and chose to finish me off instead of retreating. Barely managed to kill it with a shillelagh with huge damage taken, got lucky with that one if anything.
survivor: killed it with most melee weapons, it barely did any damage to me. It actually successfully ran away from me a couple times during melee testing. I nuked it with a .50 cal for fun.
<!-- Describe what steps you took to test that this PR resolved the bug or added the feature, and what tests you performed to make sure it didn't cause any regressions.  Also, include testing suggestions for reviewers and maintainers. See TESTING_YOUR_CHANGES.md -->

#### Additional context
Wanted to add some spooky nether trinkets that it would carry around, mostly interesting paper weight, maybe something somewhat useful but rare. Also wanted to add some unique butchery results, might add both of those in at one point.

first big PR, hopefully it's good
<!-- Add any other context (such as mock-ups, proof of concepts or screenshots) about the feature or bugfix here. -->


<!--README: Cataclysm: Dark Days Ahead is released under the Creative Commons Attribution ShareAlike 3.0 license.
The code and content of the game are free to use, modify, and redistribute for any purpose whatsoever.
By contributing to the project you agree to the terms of the license and that any contribution you make will also be covered by the same license.
See http://creativecommons.org/licenses/by-sa/3.0/ for details. -->



Diff:
diff --git a/data/json/effects.json b/data/json/effects.json
index a349757afe136..53bfc7524a19f 100644
--- a/data/json/effects.json
+++ b/data/json/effects.json
@@ -403,6 +403,14 @@
     "desc": [ { "str": "Your acid glands got all leaky.", "//~": "NO_I18N" } ],
     "show_in_info": true
   },
+  {
+    "type": "effect_type",
+    "id": "maimed_huntsman_arm",
+    "name": [ "Broken Appendage" ],
+    "//": "Disables javelin throwing.",
+    "desc": [ { "str": "Your long grotesque throwing appendage has been compromised.", "//~": "NO_I18N" } ],
+    "show_in_info": true
+  },
   {
     "type": "effect_type",
     "id": "elec_charged",
diff --git a/data/json/items/ammo_types.json b/data/json/items/ammo_types.json
index e5e82cd3b246e..1dbdf5e37dc32 100644
--- a/data/json/items/ammo_types.json
+++ b/data/json/items/ammo_types.json
@@ -77,6 +77,12 @@
     "name": "yugg stinger",
     "default": "gene_sting_barb"
   },
+  {
+    "type": "ammunition_type",
+    "id": "nether_huntsman_javelin_ammo",
+    "name": "alien outgrowth",
+    "default": "nether_huntsman_javelin"
+  },
   {
     "type": "ammunition_type",
     "id": "BB",
diff --git a/data/json/items/ranged/throwing.json b/data/json/items/ranged/throwing.json
index 15a69bc9255fc..8c0497d6b9168 100644
--- a/data/json/items/ranged/throwing.json
+++ b/data/json/items/ranged/throwing.json
@@ -192,5 +192,31 @@
     "price": "90 USD",
     "price_postapoc": "5 USD",
     "melee_damage": { "bash": 5, "stab": 16 }
+  },
+  {
+    "type": "AMMO",
+    "id": "nether_huntsman_javelin",
+    "name": { "str": "huntsman outgrowth" },
+    "copy-from": "javelin_fletched",
+    "symbol": "/",
+    "color": "light_gray",
+    "description": "A wet alien rod with a sharp point at the end, vaguely shaped like a javelin of sorts.  It is heavier than what you expected, and gives off a weird acidic smell you can't quite describe.",
+    "material": [ "bone" ],
+    "volume": "1400 ml",
+    "weight": "1200 g",
+    "longest_side": "76 cm",
+    "ammo_type": "nether_huntsman_javelin_ammo",
+    "damage": { "damage_type": "stab", "amount": 14 },
+    "count": 1,
+    "stack_size": 1,
+    "dispersion": 15,
+    "loudness": 0,
+    "recovery_chance": 90,
+    "to_hit": { "grip": "weapon", "length": "long", "surface": "point", "balance": "uneven" },
+    "thrown_damage": [ { "damage_type": "bash", "amount": 5 }, { "damage_type": "stab", "amount": 10 } ],
+    "flags": [ "NONCONDUCTIVE", "JAVELIN", "NPC_THROWN" ],
+    "weapon_category": [ "POLEARMS", "SPEARS" ],
+    "price_postapoc": "50 cent",
+    "melee_damage": { "bash": 5, "stab": 10 }
   }
 ]
diff --git a/data/json/monster_special_attacks/monster_gun.json b/data/json/monster_special_attacks/monster_gun.json
index ddda92831310e..221515fb84d99 100644
--- a/data/json/monster_special_attacks/monster_gun.json
+++ b/data/json/monster_special_attacks/monster_gun.json
@@ -176,6 +176,47 @@
     ],
     "melee_damage": { "bash": 2 }
   },
+  {
+    "id": "nether_huntsman_arm",
+    "type": "GUN",
+    "symbol": "%",
+    "color": "red",
+    "name": { "str": "huntsman appendage", "//~": "NO_I18N" },
+    "description": { "str": "huntsman throwing appendage as a pseudo item.", "//~": "NO_I18N" },
+    "material": [ "bone" ],
+    "flags": [
+      "PRIMITIVE_RANGED_WEAPON",
+      "PSEUDO",
+      "NEVER_JAMS",
+      "NONCONDUCTIVE",
+      "NO_REPAIR",
+      "WATERPROOF_GUN",
+      "NO_SALVAGE",
+      "NO_TURRET",
+      "RELOAD_AND_SHOOT"
+    ],
+    "skill": "throw",
+    "ammo": [ "nether_huntsman_javelin_ammo" ],
+    "ammo_effects": [ "NEVER_MISFIRES" ],
+    "clip_size": 1,
+    "weight": "12 kg",
+    "volume": "20000 ml",
+    "longest_side": "1000 mm",
+    "loudness": 0,
+    "range": 14,
+    "dispersion": 150,
+    "durability": 8,
+    "pocket_data": [
+      {
+        "pocket_type": "MAGAZINE",
+        "rigid": true,
+        "max_contains_volume": "1400 ml",
+        "max_contains_weight": "1200 g",
+        "max_item_length": "76 cm",
+        "ammo_restriction": { "nether_huntsman_javelin_ammo": 1 }
+      }
+    ]
+  },
   {
     "id": "v29_turret",
     "copy-from": "v29",
diff --git a/data/json/monster_weakpoints/netherium_weakpoints.json b/data/json/monster_weakpoints/netherium_weakpoints.json
index a27afc270f566..d16be24eef989 100644
--- a/data/json/monster_weakpoints/netherium_weakpoints.json
+++ b/data/json/monster_weakpoints/netherium_weakpoints.json
@@ -13,5 +13,81 @@
         "armor_mult": { "all": 0.75 }
       }
     ]
+  },
+  {
+    "type": "weakpoint_set",
+    "id": "wps_nether_huntsman",
+    "weakpoints": [
+      {
+        "id": "huntsman_arm",
+        "name": "appendage",
+        "armor_mult": { "bullet": 0.5, "cut": 0.5, "stab": 0.25, "bash": 0.25 },
+        "crit_mult": { "all": 0.75 },
+        "difficulty": { "ranged": 5, "melee": 2 },
+        "coverage_mult": { "point": 0.75 },
+        "effects": [
+          {
+            "effect": "maimed_huntsman_arm",
+            "chance": 15,
+            "permanent": true,
+            "message": "The %s makes a pained screech as the appendage goes limp!",
+            "damage_required": [ 10, 30 ]
+          },
+          {
+            "effect": "maimed_huntsman_arm",
+            "chance": 50,
+            "permanent": true,
+            "message": "The %s makes a pained screech as the appendage goes limp!",
+            "damage_required": [ 31, 100 ]
+          }
+        ],
+        "coverage": 12
+      },
+      {
+        "id": "huntsman_armor",
+        "name": "its porous armor plate",
+        "is_good": false,
+        "armor_mult": { "bullet": 2, "cut": 1.5, "stab": 1.5, "bash": 2 },
+        "coverage_mult": { "ranged": 1, "melee": 0.4 },
+        "coverage": 20
+      },
+      {
+        "id": "huntsman_armor_alt",
+        "name": "its armored limb",
+        "is_good": false,
+        "armor_mult": { "bullet": 1.7, "cut": 1.3, "stab": 1.3, "bash": 1.7 },
+        "coverage_mult": { "ranged": 1, "melee": 0.4 },
+        "coverage": 20
+      },
+      {
+        "id": "huntsman_armor_gap",
+        "name": "a vulnerable spot between the armor",
+        "is_good": true,
+        "crit_mult": { "all": 1.25 },
+        "armor_mult": { "all": 0.5 },
+        "difficulty": { "melee": 3, "ranged": 4 },
+        "coverage": 7
+      },
+      {
+        "id": "eye",
+        "name": "the photoreceptors",
+        "is_head": true,
+        "coverage": 2,
+        "armor_mult": { "physical": 0 },
+        "crit_mult": { "all": 1.25 },
+        "difficulty": { "ranged": 7, "melee": 5 },
+        "coverage_mult": { "broad": 0.8 },
+        "effects": [
+          { "effect": "blind", "duration": [ 1, 2 ], "chance": 40, "message": "The %s is blinded!", "damage_required": [ 1, 25 ] },
+          {
+            "effect": "blind",
+            "permanent": true,
+            "chance": 70,
+            "message": "The %s's photoreceptors are obliterated!",
+            "damage_required": [ 26, 100 ]
+          }
+        ]
+      }
+    ]
   }
 ]
diff --git a/data/json/monsterdrops/nether.json b/data/json/monsterdrops/nether.json
index dc9a2aa45354b..0ef0ae798754e 100644
--- a/data/json/monsterdrops/nether.json
+++ b/data/json/monsterdrops/nether.json
@@ -14,5 +14,11 @@
     "subtype": "collection",
     "id": "shrapnel_swarm_drops",
     "entries": [ { "item": "shrapnel", "count": [ 3, 7 ] } ]
+  },
+  {
+    "type": "item_group",
+    "subtype": "collection",
+    "id": "nether_huntsman_drops",
+    "entries": [ { "item": "nether_huntsman_javelin", "count": [ 3, 7 ] } ]
   }
 ]
diff --git a/data/json/monstergroups/nether.json b/data/json/monstergroups/nether.json
index fef39e3a97b70..274cee6a7014f 100644
--- a/data/json/monstergroups/nether.json
+++ b/data/json/monstergroups/nether.json
@@ -37,7 +37,8 @@
       { "monster": "mon_flaming_eye", "weight": 100, "cost_multiplier": 0 },
       { "monster": "mon_kreck", "weight": 100, "cost_multiplier": 0 },
       { "monster": "mon_gracke", "weight": 100, "cost_multiplier": 0 },
-      { "monster": "mon_blank", "weight": 100, "cost_multiplier": 0 }
+      { "monster": "mon_blank", "weight": 100, "cost_multiplier": 0 },
+      { "monster": "mon_nether_huntsman", "weight": 100, "cost_multiplier": 0 }
     ]
   },
   {
@@ -56,7 +57,8 @@
       { "monster": "mon_star_vampire_coiling", "weight": 7, "cost_multiplier": 0 },
       { "monster": "mon_kreck", "weight": 210, "cost_multiplier": 0 },
       { "monster": "mon_gozu", "weight": 25, "cost_multiplier": 0 },
-      { "monster": "mon_shoggoth", "weight": 5, "cost_multiplier": 0 }
+      { "monster": "mon_shoggoth", "weight": 5, "cost_multiplier": 0 },
+      { "monster": "mon_nether_huntsman", "weight": 35, "cost_multiplier": 0 }
     ]
   },
   {
@@ -125,7 +127,8 @@
       { "monster": "mon_star_vampire_coiling", "weight": 25, "cost_multiplier": 0 },
       { "monster": "mon_shoggoth", "weight": 30, "cost_multiplier": 0 },
       { "monster": "mon_flying_polyp", "weight": 50, "cost_multiplier": 0 },
-      { "monster": "mon_yugg", "weight": 50, "cost_multiplier": 0 }
+      { "monster": "mon_yugg", "weight": 50, "cost_multiplier": 0 },
+      { "monster": "mon_nether_huntsman", "weight": 50, "cost_multiplier": 0 }
     ]
   },
   {
@@ -141,7 +144,8 @@
       { "monster": "mon_star_vampire", "weight": 10, "cost_multiplier": 0 },
       { "monster": "mon_star_vampire_coiling", "weight": 10, "cost_multiplier": 0 },
       { "monster": "mon_shoggoth", "weight": 10, "cost_multiplier": 0 },
-      { "monster": "mon_yugg", "weight": 5, "cost_multiplier": 0 }
+      { "monster": "mon_yugg", "weight": 5, "cost_multiplier": 0 },
+      { "monster": "mon_nether_huntsman", "weight": 15, "cost_multiplier": 0 }
     ]
   },
   {
diff --git a/data/json/monsters/nether.json b/data/json/monsters/nether.json
index 86b7bfee535e8..b32be2089218e 100644
--- a/data/json/monsters/nether.json
+++ b/data/json/monsters/nether.json
@@ -2178,6 +2178,82 @@
     "reproduction": { "baby_type": { "baby_monster": "mon_nether_leech" }, "baby_count": 1, "baby_timer": 330 },
     "flags": [ "SMELLS" ]
   },
+  {
+    "id": "mon_nether_huntsman",
+    "type": "MONSTER",
+    "name": { "str": "eldritch huntsman", "str_pl": "eldritch huntsmen" },
+    "description": "Tall, partially armored, barely humanoid creature with a long appendage growing out of its side.  Flexible spearlike rods protrude throughout its body, seemingly holstered under the skin.  It feverishly darts and scouts the surroundings, looking to rip its victims apart.",
+    "default_faction": "nether",
+    "bodytype": "human",
+    "species": [ "NETHER" ],
+    "volume": "150000 ml",
+    "weight": "120 kg",
+    "diff": 10,
+    "hp": 210,
+    "regenerates": 1,
+    "speed": 110,
+    "material": [ "flesh" ],
+    "symbol": "Y",
+    "color": "light_gray",
+    "aggression": 30,
+    "morale": 50,
+    "regen_morale": true,
+    "stomach_size": 3000,
+    "anger_triggers": [ "PLAYER_WEAK" ],
+    "fear_triggers": [ "HURT" ],
+    "melee_skill": 7,
+    "melee_dice": 4,
+    "melee_dice_sides": 6,
+    "melee_damage": [ { "damage_type": "cut", "amount": 4 } ],
+    "dodge": 4,
+    "bleed_rate": 40,
+    "vision_day": 35,
+    "vision_night": 35,
+    "harvest": "demihuman",
+    "weakpoint_sets": [ "wps_humanoid_body", "wps_nether_huntsman" ],
+    "families": [ "prof_wp_netherium_abomination" ],
+    "path_settings": { "max_dist": 35, "allow_open_doors": false, "avoid_traps": false, "avoid_sharp": true },
+    "starting_ammo": { "nether_huntsman_javelin": 7 },
+    "death_drops": "nether_huntsman_drops",
+    "death_function": { "corpse_type": "NORMAL" },
+    "special_attacks": [
+      [ "PARROT", 30 ],
+      [ "EAT_CARRION", 120 ],
+      {
+        "type": "gun",
+        "cooldown": 20,
+        "move_cost": 110,
+        "gun_type": "nether_huntsman_arm",
+        "ammo_type": "nether_huntsman_javelin",
+        "fake_skills": [ [ "throwing", 5 ] ],
+        "fake_dex": 8,
+        "require_targeting_npc": true,
+        "require_targeting_monster": true,
+        "target_moving_vehicles": true,
+        "targeting_sound": "rapid clicking, increasing in pitch!",
+        "targeting_cost": 330,
+        "targeting_volume": 30,
+        "no_ammo_sound": "slow clicking.",
+        "description": "huntsman's appendage hurls a sharp outgrowth out of its body!",
+        "condition": { "not": { "u_has_effect": "maimed_huntsman_arm" } },
+        "ranges": [ [ 2, 14, "DEFAULT" ] ]
+      }
+    ],
+    "flags": [
+      "SEES",
+      "HEARS",
+      "STUN_IMMUNE",
+      "HAS_MIND",
+      "BASHES",
+      "PATH_AVOID_DANGER",
+      "EATS",
+      "DROPS_AMMO",
+      "CORNERED_FIGHTER",
+      "RANGED_ATTACKER",
+      "PRIORITIZE_TARGETS"
+    ],
+    "armor": { "bash": 10, "cut": 15, "bullet": 5, "heat": 3 }
+  },
   {
     "id": "mon_nether_fish",
     "type": "MONSTER",
diff --git a/data/json/speech.json b/data/json/speech.json
index ac084edf443c0..a68eddf5a7996 100644
--- a/data/json/speech.json
+++ b/data/json/speech.json
@@ -3675,6 +3675,30 @@
     "sound": "hissing.",
     "volume": 10
   },
+  {
+    "type": "speech",
+    "speaker": [ "mon_nether_huntsman" ],
+    "sound": "wet clicking, turning into a drone.",
+    "volume": 20
+  },
+  {
+    "type": "speech",
+    "speaker": [ "mon_nether_huntsman" ],
+    "sound": "a series of clicks, changing in pitch.",
+    "volume": 20
+  },
+  {
+    "type": "speech",
+    "speaker": [ "mon_nether_huntsman" ],
+    "sound": "a visceral hissing screech!",
+    "volume": 35
+  },
+  {
+    "type": "speech",
+    "speaker": [ "mon_nether_huntsman" ],
+    "sound": "a quiet drone.",
+    "volume": 10
+  },
   {
     "type": "speech",
     "speaker": [
diff --git a/data/mods/TEST_DATA/expected_dps_data/spears_dps.json b/data/mods/TEST_DATA/expected_dps_data/spears_dps.json
index 8d076d8f3aa0f..47c077d463488 100644
--- a/data/mods/TEST_DATA/expected_dps_data/spears_dps.json
+++ b/data/mods/TEST_DATA/expected_dps_data/spears_dps.json
@@ -21,6 +21,7 @@
       "EOD_hotstick": 14.66,
       "simple_spear_pipe": 12.59,
       "javelin_fletched": 13.23,
+      "nether_huntsman_javelin": 6.42,
       "spear_forked": 13.8,
       "spear_stone_simple": 14.18,
       "lc_aztec_spear": 15.23,
diff --git a/tools/json_tools/generic_guns_validator.py b/tools/json_tools/generic_guns_validator.py
index 099a6f0587583..ebc441f0f45e3 100755
--- a/tools/json_tools/generic_guns_validator.py
+++ b/tools/json_tools/generic_guns_validator.py
@@ -26,6 +26,7 @@
     'fishspear',
     'flammable',
     'gene_sting',
+    'nether_huntsman_javelin_ammo',
     'm235',  # Rocket
     'metal_rail',
     'nail',
@@ -58,6 +59,7 @@
     'raging_judge',
     'american_180',
     'gene_sting_gun',
+    'nether_huntsman_arm',
     'ppsh',
     'af2011a1_38super',
     # Magazines


Reviews:
user: login: RangerFromBaja
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T05:26:55Z
user: login: github-actions[bot]
body: Auto-requesting reviews from non-collaborators: @jbytheway
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T05:45:11Z
user: login: Maleclypse
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-26T14:26:55Z
user: login: Maleclypse
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-26T14:27:08Z
user: login: Maleclypse
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-27T04:00:14Z
user: login: RangerFromBaja
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-27T04:45:00Z

Review comments:
path: data/json/monster_special_attacks/monster_gun.json
user: login: RangerFromBaja
body: Meant to delete it from the huntsman but accidentally did it for the barb_launcher, trying to figure out how to revert that
created_at: 2025-03-25T05:26:54Z
author_association: CONTRIBUTOR
diff_hunk: @@ -403,6 +403,14 @@
     "desc": [ { "str": "Your acid glands got all leaky.", "//~": "NO_I18N" } ],
     "show_in_info": true
   },
+  {
+    "type": "effect_type",
+    "id": "maimed_huntsman_arm",
+    "name": [ "Broken Appendage" ],
+    "//": "Disables javelin throwing.",
+    "desc": [ { "str": "Your long grotesque throwing appendage has been compromised.", "//~": "NO_I18N" } ],
+    "show_in_info": true
+  },
path: data/json/effects.json
user: login: Maleclypse
body: ```suggestion
  }
```
Seeing a weird previously resolved lewis mag error. Trying to do the "mergers rebase" to reset test date.
created_at: 2025-03-26T14:26:55Z
author_association: MEMBER
diff_hunk: @@ -403,6 +403,14 @@
     "desc": [ { "str": "Your acid glands got all leaky.", "//~": "NO_I18N" } ],
     "show_in_info": true
   },
+  {
+    "type": "effect_type",
+    "id": "maimed_huntsman_arm",
+    "name": [ "Broken Appendage" ],
+    "//": "Disables javelin throwing.",
+    "desc": [ { "str": "Your long grotesque throwing appendage has been compromised.", "//~": "NO_I18N" } ],
+    "show_in_info": true
+  }
path: data/json/effects.json
user: login: Maleclypse
body: ```suggestion
  },
```
created_at: 2025-03-26T14:27:07Z
author_association: MEMBER
diff_hunk: @@ -192,5 +192,31 @@
     "price": "90 USD",
     "price_postapoc": "5 USD",
     "melee_damage": { "bash": 5, "stab": 16 }
+  },
+  {
+    "type": "AMMO",
+    "id": "nether_huntsman_javelin",
+    "name": { "str": "huntsman outgrowth" },
+    "copy-from": "javelin_fletched",
+    "symbol": "/",
+    "color": "light_gray",
+    "description": "A wet alien rod with a sharp point at the end, vaguely shaped like a javelin of sorts.  It is heavier than what you expected, and gives off a weird acidic smell you can't quite describe.",
+    "material": [ "bone" ],
+    "volume": "1400 ml",
+    "weight": "1200 g",
+    "longest_side": "76 cm",
+    "ammo_type": "nether_huntsman_javelin_ammo",
+    "damage": { "damage_type": "stab", "amount": 14 },
+    "count": 1,
+    "stack_size": 1,
+    "dispersion": 15,
+    "loudness": 0,
+    "recovery_chance": 90,
+    "to_hit": { "grip": "weapon", "length": "long", "surface": "point", "balance": "uneven" },
+    "thrown_damage": [ { "damage_type": "bash", "amount": 5 }, { "damage_type": "cut", "amount": 10 } ],
path: data/json/items/ranged/throwing.json
user: login: Maleclypse
body: Shouldn't one of these be stab?
created_at: 2025-03-27T04:00:14Z
author_association: MEMBER
diff_hunk: @@ -192,5 +192,31 @@
     "price": "90 USD",
     "price_postapoc": "5 USD",
     "melee_damage": { "bash": 5, "stab": 16 }
+  },
+  {
+    "type": "AMMO",
+    "id": "nether_huntsman_javelin",
+    "name": { "str": "huntsman outgrowth" },
+    "copy-from": "javelin_fletched",
+    "symbol": "/",
+    "color": "light_gray",
+    "description": "A wet alien rod with a sharp point at the end, vaguely shaped like a javelin of sorts.  It is heavier than what you expected, and gives off a weird acidic smell you can't quite describe.",
+    "material": [ "bone" ],
+    "volume": "1400 ml",
+    "weight": "1200 g",
+    "longest_side": "76 cm",
+    "ammo_type": "nether_huntsman_javelin_ammo",
+    "damage": { "damage_type": "stab", "amount": 14 },
+    "count": 1,
+    "stack_size": 1,
+    "dispersion": 15,
+    "loudness": 0,
+    "recovery_chance": 90,
+    "to_hit": { "grip": "weapon", "length": "long", "surface": "point", "balance": "uneven" },
+    "thrown_damage": [ { "damage_type": "bash", "amount": 5 }, { "damage_type": "cut", "amount": 10 } ],
path: data/json/items/ranged/throwing.json
user: login: RangerFromBaja
body: Yeah I'll change that.
I think I was trying to nerf it with that, which doesn't make much sense. Even then I lowered the base damage after I tweaked the ammo damage.
created_at: 2025-03-27T04:45:00Z
author_association: CONTRIBUTOR

PR comments:
user: login: John-Candlebury
created_at: 2025-03-24T13:12:43Z
body: Can I suggest a name more related to "hunter" or "tracker", just to better communicate to players that this thing isn't zombified and will turn you into a pincushion from range if you let it.

Also I'd probably use "eldritch" instead of "dimensional" the game doesn't really tend to refer to the nether as other dimensions in general.

Looks great tho.
author_association: MEMBER
user: login: ADekema
created_at: 2025-03-24T14:22:35Z
body: I like the concept. Especially the parts where you actually allow the main weapon arm to be disabled. I do want to point out however that you seem to not have put in all the armour value´s like piece, electric or acid. Not sure if acid and electric protection are nessecery on this creature but I would expect piece protection. 

I´d also suggest that if you want a unique buthering result than probably the organic javlins that the player can get from killing this thing should probably be only be uptainable as a butchering result. Those javlins are part of it´s body and it doesn´t make a lot of sense that a survivor can somehow pick them up after killing the thing. You would have to cut them out.
author_association: NONE
user: login: Daved27hundred
created_at: 2025-03-24T17:14:33Z
body: > Can I suggest a name more related to "hunter" or "tracker", just to better communicate to players that this thing isn't zombified and will turn you into a pincushion from range if you let it.
> 
> Also I'd probably use "eldritch" instead of "dimensional" the game doesn't really tend to refer to the nether as other dimensions in general.
> 
> Looks great tho.

I wanna suggest "javelineer" to play into the creature's abilities, because I like the comparison to throwing javelins a lot.
author_association: CONTRIBUTOR
user: login: RangerFromBaja
created_at: 2025-03-24T17:46:15Z
body: It was originally just named "huntsman" but I wasn't sure about the adjective, then I kinda just searched up some lovecraft monster names and chose that. Eldritch huntsman or hunter sounds good so I'll replace that.
author_association: CONTRIBUTOR
user: login: RangerFromBaja
created_at: 2025-03-24T22:25:31Z
body: Pierce protection is automatically derived from cut protection so it's not a problem, I could maybe add a bit of acid protection but I think it's fine as it is.
I kinda imagine that the mature spikes it has aren't rooted to it well, so you can pull them out without much trouble. For the butchery results I'll probably add stuff like immature spikes, pieces of armor and other weird stuff but that'd be a separate PR
author_association: CONTRIBUTOR
user: login: Nebnis
created_at: 2025-03-25T01:32:15Z
body: Very good monster and the balance seems very good in contrast with all the other overpowered nether enemies.
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-03-25T06:31:57Z
body: Spell checker encountered unrecognized words in the in-game text added in this pull request. See below for details.
<details>
<summary>Click to expand</summary>

* Tall, partially armored, barely humanoid creature with a long appendage growing out of its side.  Flexible **spearlike** rods protrude throughout its body, seemingly holstered under the skin.  It feverishly darts and scouts the surroundings, looking to rip its victims apart.
* The %s's **photoreceptors** are obliterated!
* the **photoreceptors**
</details>

This alert is automatically generated. You can simply disregard if this is inaccurate, or (optionally) you can also add the new words to `tools/spell_checker/dictionary.txt` so they will not trigger an alert next time.

<details>
<summary>Hints for adding a new word to the dictionary</summary>

* If the word is normally in all lowercase, such as the noun `word` or the verb `does`, add it in its lower-case form; if the word is a proper noun, such as the surname `George`, add it in its initial-caps form; if the word is an acronym or has special letter case, such as the acronym `CDDA` or the unit `mW`, add it by preserving the case of all the letters. A word in the dictionary will also match its initial-caps form (if the word is in all lowercase) and all-uppercase form, so a word should be added to the dictionary in its normal letter case even if used in a different letter case in a sentence.
* For a word to be added to the dictionary, it should either be a real, properly-spelled modern American English word, a foreign loan word (including romanized foreign names), or a foreign or made-up word that is used consistently and commonly enough in the game. Intentional misspelling (including eye dialect) of a word should not be added unless it has become a common terminology in the game, because while someone may have a legitimate use for it, another person may spell it that way accidentally.
</details>

author_association: CONTRIBUTOR
user: login: Maleclypse
created_at: 2025-03-26T03:23:46Z
body: ```./tests/effective_dps_test.cpp:322: FAILED:
(~[slow] ~[.],starting_items)=>   CHECK( calc_expected_dps( it->get_id() ) <= 5.0 )
(~[slow] ~[.],starting_items)=> with expansion:
Error: (~[slow] ~[.],starting_items)=>   Approx( 6.4278239972 ) <= 5.0
(~[slow] ~[.],starting_items)=> with message:
(~[slow] ~[.],starting_items)=>   'nether_huntsman_javelin' is a weapon, but is not included in DPS tests.
(~[slow] ~[.],starting_items)=>   Please place it in the appropriate file in data/mods/TEST_DATA/
(~[slow] ~[.],starting_items)=>   expected_dps_data.
```
You need to add this to the expected dps test.  Let me know if you need help with this.
author_association: MEMBER
user: login: Maleclypse
created_at: 2025-03-31T02:49:06Z
body: I have concerns this might be a little too deadly for as easily as it spawns but we should have feedback on that pretty quickly.
author_association: MEMBER