# Stats

> How tibo.dog turns passives and items into stats: damage, cooldown cap, crit and dodge diminishing returns, curse, luck and more.

Source page: https://tibodog-wiki.vercel.app/stats · Wiki updated 5 Nov 2026, 21:46 UTC · Game version 75 (`main-CSuyb4iv.js`, data synced 5 Nov 2026, 21:45 UTC)

Tibo's stats are the sum of all passives, items, dog auras, shrine blessings and other bonuses, then converted into multipliers. The conversion below is **Verified** from the stat function in `sim-BkfBhQfw.js`. Constants: `{"critK":1,"evasionK":1,"discountK":1,"explodeK":1,"cooldownCap":0.6,"baseCritMult":2,"curseRewardShare":0.5}`.

## Diminishing returns

Several stats use the curve `f(x) = x / (k + x)` with `k = 1`: [sim-BkfBhQfw.js: `function Ke(e,t){return e<=0?0:e/(t+e)}`] so 1 point gives 50%, 0.25 gives 20%, and the result never reaches 100%. This is why the game's descriptions say “The higher your crit chance, the less it adds.”

| Points | Effective chance |
|---|---|
| 0.05 | 4.76% |
| 0.1 | 9.09% |
| 0.25 | 20% |
| 0.5 | 33.33% |
| 1 | 50% |
| 2 | 66.67% |
| 3 | 75% |

## Stat conversion

| Stat | Formula (sum of bonuses = x) | Notes |
|---|---|---|
| Damage (`might`) | `max(0.1, 1 + x)` | Multiplies weapon damage |
| Area | `max(0.2, 1 + x)` |  |
| Cooldown | `1 − clamp(x, −1, 0.6)` | Cooldown reduction is capped at 60% (`cooldownCap`) |
| Amount (projectiles) | `floor(x) + 1` | `player.baseAmount` |
| Duration | `max(0.2, 1 + x + 0.25)` | Includes a base +25% (`player.baseDuration`) |
| Projectile speed | `max(0.2, 1 + x)` |  |
| Move speed | `max(0.3, 1 + x)` | Base speed 62 |
| Max HP | `max(1, (100 + flat) × (1 + percent) × difficulty maxHp)` | Flat from items, percent from Gravy Heart |
| Recovery | `x` HP per second |  |
| Armor | `max(0, x)` | See Armor below |
| Pickup range | `40 × max(0.2, 1 + x)` | `player.baseMagnet` |
| Luck | `max(0, x)` | Affects the 4th card and other rolls |
| XP gain | `(1 + growth) × (1 + 0.5 × curse) × difficulty xp` | Curse raises XP gain |
| Gold gain | `(1 + greed) × (1 + 0.5 × curse)` | Curse raises gold gain |
| Curse | `max(0, x) + difficulty.globalCurse` | See [Curse](/curse) |
| Crit chance | `x / (1 + x)` | Hot Sauce, Hot Pepper |
| Crit damage | `2 + x` | Base crit multiplier ×2 |
| Dodge (evasion) | `x / (1 + x)` | Thick Skin, Ghost Skin |
| Knockback | `max(0, 1 + x)` |  |
| Pierce bonus | `floor(x)` |  |
| Revivals | `floor(x) + difficulty addedRevives`, or 0 if the difficulty disallows revives | Nightmare: no revives. Outside Story, a revive plays the knocked-down scene, then Tibo gets up with 50% max HP and 4 s of invulnerability; level-ups earned while down wait until then. [sim-BkfBhQfw.js: `n.hp[r]=e.loadout.stats.maxHp*(i?t.reviveHp:e.cfg.player.reviveHp)`] [sim-BkfBhQfw.js: `function Lu(e){return e.mode===`story`?e.cfg.story.invulnSec:e.cfg.revive.graceSec}`] |
| Elite/boss damage | `1 + x` |  |
| Explode on kill | `x / (1 + x)` |  |
| Purchase price | `1 − x / (1 + x)` | Coupon Book |
| Dash charges | `floor(x)` extra | Butter Socks |
| Dash cooldown | `1 − clamp(x, −1, 0.6)` | Same stat cap as weapon cooldown. Recharge is also floored at 0.75 s; the stat cap already keeps the normal 5 s base at 2 s or more. [sim-BkfBhQfw.js: `function ko(e){let t=b(e.cfg.dash.cooldownSec*e.loadout.stats.dashCooldownMult);return Math.max(t,function(e){return b(e.cfg.dash.minCooldownSec)}(e))}`] |
| Dash grace | `max(0, x)` seconds | Ghost Pepper |

Source: stat conversion in `sim-BkfBhQfw.js`, e.g. [sim-BkfBhQfw.js: `i[r.cooldownMult]=1-Ge(e.cooldown,-1,n.cooldownCap)`]

## Armor

**Verified**: damage taken = `damage × (1 − min(0.85, armor / (5 × attacker level + armor)))`. Attacker level is `10 + minutes`, +5 for elites, +10 for bosses.  [sim-BkfBhQfw.js: `function Qa(e,t,n){let r=n.armor;return Math.min(r.cap,Ke(e,r.k*t))}`]

So armor loses value over a run: 50 armor blocks 50% from a level-10 pest at 0:00 but 25% from a level-30 pest at 20:00. Reduction is capped at 85%. Guard weapons with charges subtract a fixed soak amount from a hit before armor; the hit is cancelled only if the soak is at least the damage.

While [frozen by the Deep Freezer](/bosses/deep-freezer#ice-cube-fan), Tibo takes another 25% less damage after guard and armor. This also reduces terrain damage; it is separate from the armor percentages below. [sim-BkfBhQfw.js: `d=l*(1-Qa(s.armor,i,e.cfg))*(u?1-e.cfg.player.freezeDamageCut:1)`]

| Armor | vs level 10 (0:00) | vs level 20 (10:00) | vs level 30 (20:00) | vs boss at 20:00 (level 40) |
|---|---|---|---|---|
| 10 | 17% | 9% | 6% | 5% |
| 20 | 29% | 17% | 12% | 9% |
| 50 | 50% | 33% | 25% | 20% |
| 100 | 67% | 50% | 40% | 33% |
| 200 | 80% | 67% | 57% | 50% |

Computed from the formula.

## Crit

**Verified**: each hit crits with chance `effective crit chance + the weapon's own critBonus`; a crit multiplies damage by `2 + crit damage`. Hits on elites and bosses are first multiplied by `1 + elite damage`.  [sim-BkfBhQfw.js: `let u=s.critChance+o.critBonus[r];u>0&&e.rng.next()<u&&(d*=s.critMult,f=!0)`]

## Dodge

**Verified**: when a hit would damage Tibo, dodge (evasion) is rolled right after the invulnerability checks; a success cancels the hit entirely. Damage from biome terrain and hazard pools is never dodged.

## Weapon details

- **Verified**: the amount bonus does not apply to `aura`, `cone`, `nuke` and `ring` weapons.
- **Verified**: [Andrew's pairing ring](/visitors#andrew) and [Frenzy Fryer](/points-of-interest#frenzy-fryer) multiply weapon timer speed, separately from the cooldown stat's 60% cap. The cooldown floor is 0.05 s (15 s for `nuke` weapons) multiplied by that fire-rate factor before the faster countdown; the bonuses do not lower the floor's effective interval. Weapons with no cooldown at all (Steam Vent, whose aura hits on its own timer) stay at 0. [sim-BkfBhQfw.js: `` let o=(a===`nuke`?e.cfg.reset.minCooldownSec:.05)*Nf(e) ``] [sim-BkfBhQfw.js: `function Nm(e,t){let n=t-Mm(e);return n>1e-9?n:0}`]
- **Verified**: Mezzaluna and Moon Cleaver (`hpEdge`) deal `0.8 + (lowHpBonus + 0.2) × missing HP fraction` times damage: 0.8× at full HP, up to 2.2× (Mezzaluna) or 2.6× (Moon Cleaver) near 0 HP.
- **Verified**: projectiles fired by `onHurt` items (Porcupine Spud, Fry Volcano) deal `(damage × (1 + 0.15 × minutes) + thornsShare × thorns) × damage multiplier`, so they grow over the run. The thorns share is 1 for Porcupine Spud and 1.5 for Fry Volcano.

## Luck

**Verified**: luck gives a 4th level-up card with chance `min(1, luck)`, bigger chests (`× (1 + luck)` on the 3- and 5-reward chances) and rarer items (rarity *n* weight × `(1 + luck)^n`). In-game: “Better odds of a fourth level-up card, bigger chests and rarer items.”

## Healing and revives

- **Verified**: recovery heals that many HP per second; heal on kill heals per kill. Both are capped at max HP.
- **Verified**: outside Story, a revive restores 50% max HP and grants 4 s of invulnerability. The burst knocks back visible enemies and bosses whose bodies overlap its 160-unit radius (push 900), freezes pests and elites for 5 s, and slows bosses to 50% speed for 5 s while delaying their next pattern. Nearby enemy shots are cleared. [sim-BkfBhQfw.js: `revive:{graceSec:4,radius:160,push:900,stunSec:5,bossSlow:.5,clearsBullets:!0}`] [sim-BkfBhQfw.js: `let n=e.enemies,r={kind:`freeze`,seconds:e.cfg.revive.stunSec}`] [sim-BkfBhQfw.js: `i={kind:`slow`,factor:n.bossSlow,seconds:n.stunSec}`]
- **Verified**: Story keeps its 2 s grace and 120-unit pest knockback burst; its revive does not apply the non-Story freeze or boss slow. Nightmare allows no revives and removes Second Spud from the item pool.

## Player base values

| Value | Base |
|---|---|
| Max HP (`baseMaxHp`) | 100 |
| Move speed (`baseSpeed`) | 62 |
| Pickup range (`baseMagnet`) | 40 |
| Projectile amount bonus (`baseAmount`) | 1 |
| Duration bonus (`baseDuration`) | 0.25 |
| Weapon slots | 6 |
| Passive slots | 6 |
| Contact damage cooldown (s) | 0.5 |
| Enemy-shot hit radius (`hitRadius`) | 4 |
| Enemy-shot hit centre Y offset (`hitOffsetY`) | 2.72 |

### Enemy-shot hit circle

**Verified**: enemy shots test against a circle with radius 4 units, centred at Tibo's X position and 2.72 units below his Y position, towards his feet. The shot's own radius is added to this radius. Collision checks use the shot's path over the tick, not only its final position. [sim-BkfBhQfw.js: `a=i+e.cfg.player.hitOffsetY`] [sim-BkfBhQfw.js: `let ie=n.radius[d]+s,ae=ie+Math.abs(g)+Math.abs(_)`] [sim-BkfBhQfw.js: `qe(r,a,m,h,v,y)<=ie?Sp(e,d):bp(e,d,te,ie+c)`]

Near-miss and bullet-culling distances use that same shifted centre. Bullet homing still aims at Tibo's unshifted position. This circle is for enemy shots; it does not replace Tibo's body radius for contact with enemies or pickups. [sim-BkfBhQfw.js: `let x=v-r,ee=y-a,te=x*x+ee*ee;if(b<=0||te>l*l)`] [sim-BkfBhQfw.js: `gp(r,i,e.lastDashTick<0?pp:e.tick-e.lastDashTick,e.cfg.level.returnSpeed)`]

## Stat sources

Passives that raise each stat:

| Stat | Passives | Items |
|---|---|---|
| Damage to elites and bosses | [Bacon Bits](/passives/bacon-bits) | [Boss Buster](/items/boss-buster) |
| Area | [Big Bowl](/passives/big-bowl) | [Philosopher's Potato](/items/philosophers-potato), [Wide Ladle](/items/wide-ladle) |
| Damage | [Butter Pat](/passives/butter-pat) | [Cursed Crown](/items/cursed-crown), [Golden Gravy](/items/golden-gravy), [Philosopher's Potato](/items/philosophers-potato), [Salt Crystal](/items/salt-crystal) |
| Dash charges | [Butter Socks](/passives/butter-socks) |  |
| Dash cooldown | [Butter Socks](/passives/butter-socks) |  |
| Cooldown | [Chives](/passives/chives), [GPU](/passives/gpu) | [Chive Charm](/items/chive-charm) |
| XP gain | [Fertilizer](/passives/fertilizer) | [Compost Tea](/items/compost-tea) |
| Luck | [Four-Eyed Spud](/passives/four-eyed-spud) | [Cursed Crown](/items/cursed-crown), [Lucky Peel](/items/lucky-peel) |
| Gold gain | [Golden Fry](/passives/golden-fry) | [Golden Gravy](/items/golden-gravy), [Penny Spud](/items/penny-spud) |
| Projectiles (amount) | [GPU](/passives/gpu), [Sprouting Eyes](/passives/sprouting-eyes) | [Extra Eye](/items/extra-eye) |
| Max HP (%) | [Gravy Heart](/passives/gravy-heart) |  |
| Crit points | [Hot Sauce](/passives/hot-sauce) | [Hot Pepper](/items/hot-pepper) |
| Knockback | [Masher Grip](/passives/masher-grip) |  |
| Pickup range | [Potato Magnet](/passives/potato-magnet) | [Copper Spoon](/items/copper-spoon) |
| Recovery (HP/s) | [Root Network](/passives/root-network) | [Pickle Jar](/items/pickle-jar) |
| Curse | [Rotten Spud](/passives/rotten-spud) | [Cursed Crown](/items/cursed-crown) |
| Projectile speed | [Salt Shaker](/passives/salt-shaker) | [Philosopher's Potato](/items/philosophers-potato), [Time Tuber](/items/time-tuber) |
| Duration | [Slow Cooker](/passives/slow-cooker) | [Philosopher's Potato](/items/philosophers-potato), [Time Tuber](/items/time-tuber) |
| Crit damage | [Sour Cream](/passives/sour-cream) | [Crit Chip](/items/crit-chip) |
| Move speed | [Spud Sneakers](/passives/spud-sneakers) | [Starch Sock](/items/starch-sock) |
| Armor | [Starch Plating](/passives/starch-plating) | [Baked Buckler](/items/baked-buckler) |
| Dodge points | [Thick Skin](/passives/thick-skin) | [Ghost Skin](/items/ghost-skin) |
| Explode-on-kill chance |  | [Boom Spud](/items/boom-spud) |
| Purchase discount |  | [Coupon Book](/items/coupon-book) |
| Post-dash invulnerability (s) |  | [Ghost Pepper](/items/ghost-pepper) |
| Revivals |  | [Second Spud](/items/second-spud) |
| Pierce |  | [Sharp Peeler](/items/sharp-peeler) |
| Max HP |  | [Spud Muffin](/items/spud-muffin) |
| Thorns |  | [Thorny Jacket](/items/thorny-jacket) |
| Heal on kill |  | [Vampire Tot](/items/vampire-tot) |

## Sources

Game version 75: `main-CSuyb4iv.js` / `boot-CPW8VVmR.js` / `sim-BkfBhQfw.js` from https://tibo.dog/, researched 2026-11-05. See [Versions & updates](/versions).
- Game config and formulas in `sim-BkfBhQfw.js`
