Skip to content

Combat

Every roll happens on the server. The client only sends “I want to attack this monster”; the server decides what happened.

Attacks roll an exploding d20:

roll total + attack bonus > target Guard → hit
roll total + attack bonus ≤ target Guard → miss

Note it’s strictly greater. Rolling exactly the target’s Guard is a miss.

Attack bonus:

  • Player = floor(level / 2) + your STR modifier + weapon enchant +N
  • Monster = level (not halved) — steeper than the player curve, because player Guard climbs from gear rather than level. A CSV attackBonus in monsters.csv overrides the default, and the place attack bonus below stacks on top of whichever value applies.

Player Guard has no ceiling — gear and enchants can push it arbitrarily high — but monster attack bonus is capped at level 20, and a 28-point gap can’t fit inside a single d20’s window. So difficulty isn’t scaled through the monster itself, it’s scaled through where you fight:

Dungeons: bonus = max(0, depth − 5) × 3
Surface: bonus = max(0, distance from town − 300m) / 20m
  • Monster level, HP, damage, and XP are all untouched — only the attack bonus changes.
  • Safe zones keep their existing difficulty: Old Crypt’s first 5 floors and the 300m ring around town both sit at bonus 0.
  • Deep dungeon floors and remote wilderness get noticeably harder as a result — enchant scrolls (see Enchanting) go from a nice extra to the price of admission out there.

Roll a d20. On a 20, roll again and add it. If that roll is also 20, add again (up to 5 extra rolls — a total of 120 already beats any Guard).

Roll 13 → total 13
Roll 20, 10 → total 30
Roll 20, 20, 4 → total 44

Why. A flat “natural 20 always hits” rule floors hit chance at exactly 5% — an artifact of the die having 20 faces, not a balance choice: a kobold would land a hit on a fully plate-armored player once every twenty swings no matter how much Guard you stack. The exploding die instead shrinks the odds the further short you are, without ever flooring at zero: every time the gap crosses another 20 points, the chance is cut by another 1/20. A kobold (+1) hits Guard 40 just 0.25% of the time — about once every 400 swings, or 13 minutes at its 1.9s attack cooldown. A natural 1 gets no special treatment.

Columns are the target’s Guard, rows are your total attack bonus.

Attack bonusGuard 8Guard 9Guard 10Guard 11Guard 13Guard 15
+0 60% 55% 50% 45% 35% 25%
+1 65% 60% 55% 50% 40% 30%
+2 70% 65% 60% 55% 45% 35%
+3 75% 70% 65% 60% 50% 40%
+4 80% 75% 70% 65% 55% 45%
+5 85% 80% 75% 70% 60% 50%
+6 90% 85% 80% 75% 65% 55%
+7 95% 90% 85% 80% 70% 60%
+8 100% 95% 90% 85% 75% 65%
+9 100% 100% 95% 90% 80% 70%
+10 100% 100% 100% 95% 85% 75%

Look up your total attack bonus (half your level, plus your STR modifier):

MonsterGuard+0+2+4+6+8
Kobold 8 60% 70% 80% 90% 100%
Goblin 9 55% 65% 75% 85% 95%
Stalker 10 50% 60% 70% 80% 90%
Female Orc 10 50% 60% 70% 80% 90%
Orc 11 45% 55% 65% 75% 85%
Goblin Chief 11 45% 55% 65% 75% 85%
Hobgoblin 12 40% 50% 60% 70% 80%
Gnoll 13 35% 45% 55% 65% 75%
Orc Warlord 13 35% 45% 55% 65% 75%
Bugbear 14 30% 40% 50% 60% 70%
Forgotten Dead 14 30% 40% 50% 60% 70%
Ogre 15 25% 35% 45% 55% 65%
Lizardfolk 15 25% 35% 45% 55% 65%
Troll 16 20% 30% 40% 50% 60%
Stone Golem 17 15% 25% 35% 45% 55%
Ogre Warlord 17 15% 25% 35% 45% 55%
Cyclop 20 5% 10% 20% 30% 40%
Skeleton 20 5% 10% 20% 30% 40%
Skeleton Warrior 24 4% 5% 5% 10% 20%
Skeleton Knight 32 2% 3% 3% 3% 4%

The other direction, by your Guard (DEX base plus equipment):

MonsterTo-hitYour Guard 10Your Guard 14Your Guard 18Your Guard 22Damage on hit
Kobold +1 55% 35% 15% 5% 1d4
Goblin +2 60% 40% 20% 5% 1d4
Stalker +3 65% 45% 25% 5% 1d6
Orc +4 70% 50% 30% 10% 1d6
Female Orc +4 70% 50% 30% 10% 1d6
Hobgoblin +5 75% 55% 35% 15% 1d8
Goblin Chief +5 75% 55% 35% 15% 1d8
Gnoll +6 80% 60% 40% 20% 2d6
Bugbear +7 85% 65% 45% 25% 2d6
Ogre +8 90% 70% 50% 30% 2d8
Forgotten Dead +8 90% 70% 50% 30% 3d6
Troll +9 95% 75% 55% 35% 2d10
Stone Golem +10 100% 80% 60% 40% 2d10
Orc Warlord +10 100% 80% 60% 40% 2d8
Ogre Warlord +10 100% 80% 60% 40% 2d8
Lizardfolk +13 100% 95% 75% 55% 3d6
Cyclop +15 100% 100% 85% 65% 3d8
Skeleton +20 100% 100% 100% 90% 6d8
Skeleton Warrior +20 100% 100% 100% 90% 6d8
Skeleton Knight +25 100% 100% 100% 100% 6d12

Stacking Guard pays off very directly — within the attacker’s plain d20 range, each +1 costs them 5% hit chance. Past that range the exploding die takes over, and the odds drop much faster than 5% per point since each extra 20-point band costs another 1/20. A full plate set (19 Guard total) plus an armor enchant scroll makes you nearly unhittable by low-level monsters, but deep-dungeon monsters keep pace better since their attack bonus tracks their level directly.

Damage is only rolled on a hit. Dice notation is {count}d{sides}:

2d6 → roll two six-sided dice and sum (2–12)

Player melee adds your STR modifier.

WeaponDamageMinAvgMaxWeight
Great Sword 2d8 2 9.0 16 6 kg
Steel Longsword 1d10 1 5.5 10 4 kg
Iron Sword 1d8 1 4.5 8 3 kg
Notched Iron Sword 1d8 1 4.5 8 3 kg
Morningstar 1d8 1 4.5 8 5 kg
Greatclub 1d8 1 4.5 8 10 kg
Worn Iron Sword 1d6 1 3.5 6 3 kg
Spear 1d6 1 3.5 6 4 kg
Dagger 1d4 1 2.5 4 1 kg
Goblin Sword 1d4 1 2.5 4 2 kg
Small Sword 1d4 1 2.5 4 1.5 kg
Torch 1d4 1 2.5 4 1 kg
Worn Torch 1d4 1 2.5 4 1 kg
Bow 1d1 1 1.0 1 2 kg

The STR modifier applies to every hit, so it lifts low-damage weapons proportionally more: STR 18 (+4) with a Dagger (1d4, average 2.5) actually averages 6.5 — 2.6× the base.

A weapon can declare three extra fields: range (meters; absent means melee, using the server’s fixed 2m reach), rangedAbility (which ability replaces STR for the hit and damage bonus), and hands (how many hands it occupies — 2 seals the off-hand too). The Bow is the first weapon to use any of them: two-handed, 10m range, hit and damage driven by DEX.

  • Range is gated on max(melee reach, weapon range) — walls, closed doors, and furniture block a shot the same way they block a swing. Fences don’t block a shot — an arrow flies straight over one (protocol v69), though fences still block movement and melee attacks. An attack beyond range but within the 10m provoke distance only wakes the target; it deals no damage.
  • Chasing a target stops at the weapon’s own range and fires from there — there’s no kiting room.
  • A landed shot shows a visible arrow in flight (a fixed 30 m/s, re-aiming every frame to guarantee it reaches the target’s current position). A miss keeps its original heading and flies 3m past before vanishing.

The bow’s own die is a token (1d1) — the real damage comes from the arrow, and the two dice roll together, the same path a monster takes when it adds its own die to a wielded weapon’s:

ItemDiceAverageNote
Bow 1d1 1.0 The bow itself — sets range and ability only
Iron Arrow 1d6 3.5 Combined average 4.5, close to Iron Sword (1d8)
Steel Arrow 1d8 4.5 Combined average 5.5, close to Steel Longsword (1d10)

The bow needs arrows to fire: items.csv’s ammoKind pairs bow and arrow by sharing the same name (arrow); a weapon without ammoKind costs nothing to fire, so melee weapons are untouched. Arrows stack in your bag, don’t take an equip slot, and can’t be enchanted.

  • Equipping a bow with no valid selection yet auto-picks the strongest stack in your bag.
  • Manually picking a cheaper arrow is never overridden just because you pick up a better one.
  • Running the chosen stack dry auto-drops to the next-strongest arrow; an empty bag rejects the attack (OutOfAmmo) and stops auto-attack too, so it doesn’t spam a rejection every cooldown.

Equipping a hands: 2 weapon (only the bow, for now) unequips your off-hand item to your bag and refuses any off-hand equip while worn.

Guard is NetHack’s AC inverted — higher is better.

GuardMeaning
0–7Barely defended
8–9Light defence
10Ordinary
11–13Solid
14+Heavy armor and up

Against NetHack: Guard = 10 − AC.

XP = 1 + level² + max(Guard - 10, 0) × 2

Guard above 10 earns a bonus — harder monsters pay more.

MonsterLevelGuardXPHealthXP / health
Kobold 1 8 2 5 0.40
Goblin 2 9 5 9 0.56
Stalker 3 10 10 14 0.71
Female Orc 4 10 17 18 0.94
Orc 4 11 19 18 1.06
Goblin Chief 5 11 28 23 1.22
Hobgoblin 5 12 30 23 1.30
Gnoll 6 13 43 27 1.59
Bugbear 7 14 58 32 1.81
Forgotten Dead 8 14 73 40 1.82
Ogre 8 15 75 36 2.08
Troll 9 16 94 41 2.29
Orc Warlord 10 13 107 120 0.89
Stone Golem 10 17 115 45 2.56
Ogre Warlord 10 17 115 140 0.82
Lizardfolk 13 15 180 59 3.05
Cyclop 15 20 246 68 3.62
Skeleton 16 20 277 72 3.85
Skeleton Warrior 20 24 429 90 4.77
Skeleton Knight 25 32 670 350 1.91

XP / health is the efficiency column — higher means more XP per point of health you have to chew through. The Orc Warlord gives the most XP but takes 120 health to get there, so it isn’t the most efficient.

Levels 2–50 now follow a table paced by in-game play time (see the updates log, protocol v39) instead of a pure exponential; doubling only resumes past level 50:

XP(n) = XP(50) × 2^(n-50) (n > 50)

The table is tuned around a standard player putting in 4 hours a day: 5 to 22 minutes per level from 2–10 (2 hours cumulative), 22 minutes to 5.5 hours per level from 10–30 (roughly once a day), 5.5 to 8 hours per level from 30–50 (about once every two days late), for a total of roughly 199.5 hours (50 days) to reach level 50.

LevelCumulative XPThis level costsOrcs, roughly
1 0
2 17 17 1
3 76 59 4
4 226 150 8
5 586 360 19
6 1,256 670 36
7 2,356 1,100 58
8 4,056 1,700 90
9 6,556 2,500 132
10 9,956 3,400 179
11 17,156 7,200 379
12 29,156 12,000 632
13 48,156 19,000 1,000
14 74,156 26,000 1,369
15 110,156 36,000 1,895
16 158,156 48,000 2,527
17 219,156 61,000 3,211
18 296,156 77,000 4,053
19 391,156 95,000 5,000
20 511,156 120,000 6,316
21 651,156 140,000 7,369
22 811,156 160,000 8,422
23 1,001,156 190,000 10,000
24 1,231,156 230,000 12,106
25 1,491,156 260,000 13,685
26 1,791,156 300,000 15,790
27 2,131,156 340,000 17,895
28 2,521,156 390,000 20,527
29 2,961,156 440,000 23,158
30 3,451,156 490,000 25,790
31 3,991,156 540,000 28,422
32 4,581,156 590,000 31,053
33 5,221,156 640,000 33,685
34 5,911,156 690,000 36,316
35 6,661,156 750,000 39,474
36 7,471,156 810,000 42,632
37 8,341,156 870,000 45,790
38 9,271,156 930,000 48,948
39 10,271,156 1,000,000 52,632
40 11,371,156 1,100,000 57,895
41 12,571,156 1,200,000 63,158
42 13,771,156 1,200,000 63,158
43 15,071,156 1,300,000 68,422
44 16,471,156 1,400,000 73,685
45 17,971,156 1,500,000 78,948
46 19,571,156 1,600,000 84,211
47 21,271,156 1,700,000 89,474
48 23,071,156 1,800,000 94,737
49 24,971,156 1,900,000 100,000
50 26,971,156 2,000,000 105,264

The last column converts to Orcs (level 4, Guard 11, 19 XP each). The outdoor roster currently tops out at the level-15 Cyclops, and dungeon depth scaling stalls at depth 20, so real pacing tracks the table only up to roughly levels 15–20 — past that there’s nothing tougher to fight, so it runs well behind the table.

Dying costs no equipment but does cost XP:

level band = XP(L+1) - XP(L)
penalty = max(1, floor(band × 0.15))

That’s 15% of your progress through the current level.

If the deduction drops you below the level’s starting XP you lose a level. Two protections:

  • At most one level per death.
  • Level 1 never drops.

After a drop your XP is floored at 30% through the lower band, so you don’t end up stuck just short of relevelling over and over.

LevelLevel bandLost on deathOrcs to recover
2 59 8 1
3 150 22 2
4 360 54 3
5 670 100 6
6 1,100 165 9
7 1,700 255 14
8 2,500 375 20
9 3,400 510 27
10 7,200 1,080 57
11 12,000 1,800 95
12 19,000 2,850 150
13 26,000 3,900 206

So that repeatedly levelling up and down can’t be farmed for health, the distribution of health lost on a level-down is identical to the health gained on a level-up:

roll the hit die, guarantee at least half, add the CON modifier

The long-run expectation is therefore zero — no statistical gain from cycling. Health also never drops below your level 1 value.

Hit dieClassesExpected gain / loss
d10 Barbarian, Caveman, Knight, Valkyrie 6.50
d8 Ranger, Samurai, Monk, Priest 5.25
d6 Archaeologist, Healer, Rogue, Wizard, Bard 4.00
d4 Tourist 2.75

If you didn’t lose a level, you don’t lose health.

Request a respawn and the server confirms your health is 0, refills it and returns you to the origin (0, 0, 0). Satiation resets to 300 — the bottom of the Well-Fed band — so you don’t respawn starving and immediately go Weak.

Carry a phoenix talisman and the death dialog offers a “Use Phoenix Talisman” button. Using it revives you in place, on the same floor, restoring 70% of max HP and spending one talisman; the death XP penalty already applied is unaffected. Unlike a normal respawn, reviving in place does not reset satiation, and there’s no invulnerability window afterward. Using it while alive is refused and the talisman is kept. Sold by Rica for 5,000c, and also a 0.2% world drop.

Monster AI runs on the client, but attack resolution always goes to the server.

StateMeaning
idleWaiting (30% chance to wander)
walkMoving
runChasing a player (within chase range)
attackAttacking (within attack range)
hitStagger from being hit (~800 ms)
deadDead

A dead monster is removed after 30 seconds. Per-monster chase ranges and attack intervals are in Monster index.

Both “attacks on sight” and “fights back only” monsters engage the moment a player gets within 5m, no provocation needed — “fights back only” is no longer a safe distance to walk past at.

Some monster attacks and foods attach a debuff. The same debuff never stacks — retriggering it just refreshes the duration — but different debuffs can be active at once, and their multipliers multiply together.

DebuffChanceDurationDPSMove speedAttack speedMax carryArmor weight (wet)Satiation drainHP regen
Food Poisoning 70% 5 min ×0.6 ×0.6 ×0.6 ×4 Stops
Bleeding 35% 8s 1 Stops
Wet 100% 7.5 min ×0.83 ×1.5
Tipsy 100% 5 min ×1.1 ×1.1
Drunk 100% 5 min ×0.85 ×0.85 ×0.85
Wasted 100% 5 min ×0.6 ×0.6 ×0.6

Bleeding — rolled on a hit from a gnoll’s claws. Its damage die was lowered from 2d8 to 2d6 to make room for the new effect. Bleeding can kill outright; the death is handled the same way as a monster kill, with no credited killer.

Food Poisoning — the risk of eating raw fish; see Food and satiation.

Wet — triggers when you wade into a river or the sea, lasting 450 seconds (one in-game hour). Move speed drops to ×0.83 (running falls from 4.5 to 3.75, between walking’s 3.0 and running’s 4.5), and armor worn or carried in your bag gets heavier from soaking up water (armor weight ×1.5) — the more armor you’re carrying, the bigger the bite out of your usable carry capacity. Walking through water keeps refreshing the timer; the countdown only starts once you step out. Standing near a lit campfire (within 3m) dries you faster — 45 seconds to go from soaked to dry. Crossing a bridge doesn’t count as wading. As of protocol v78, standing in the rain long enough triggers the same Wet debuff — see Weather for the details.

A blue MP bar now sits under the HP bar over your character’s head, for every class — even if you don’t have any ability that spends MP yet. Max MP is calculated from your class, WIS, and level, and regenerates naturally every 16 real seconds; it won’t start regenerating until 10 real seconds after your last spend. Existing characters were topped up to their max MP the first time they logged in after this shipped, and the max recalculates on level-up.

The character panel’s ABILITIES tab lists your available skills as icons — drag one onto the existing 1–0 quickslots to use it, sharing the same drag-and-tooltip code as your inventory.

AbilityGranted toRequiresEffectCooldown
Double SlashRogue, by defaultDagger in main handYour next basic attack becomes two independent hits, each at 100% damage10s
Guardian WardKnight, by defaultSword or Mace in main hand + Shield off-hand+10% Guard for yourself and party members within 20m on the same floor, for 60s45s, costs 2 MP

Guardian Ward used to cost satiation; as of protocol v79 it costs 2 MP instead. You can’t cast it below 2 MP, and a failed cast doesn’t spend MP or start the cooldown. Recasting just refreshes the duration back to 60s — it doesn’t stack.

The server’s ability list also defines Radiance (a self-only toggled light) and True Aim (a bow skill that guarantees a hit on the marked target), fully implemented and protocol-supported — but they’re deliberately hidden from the skill list and quickslots for now, so players can’t use them yet.

Shields now have their own armorType: shield classification (currently just the Wooden Shield and Raven Shield) — an off-hand torch doesn’t count as one. The Goblin Sword and Small Sword were folded into the Sword weapon type; Dagger and Great Sword remain their own types.