tibo.dog Wiki Game v75 Play tibo.dog

Stats

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:[1] 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
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.[2][3]
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.[4]
Dash grace max(0, x) seconds Ghost Pepper

Source: stat conversion in sim-BkfBhQfw.js, e.g.[5]

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.[6]

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, Tibo takes another 25% less damage after guard and armor. This also reduces terrain damage; it is separate from the armor percentages below.[7]

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.[8]

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 and 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.[9][10]
  • 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.[11][12][13]
  • 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.[14][15][16]

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.[17][18]

Stat sources

Passives that raise each stat:

Stat Passives Items
Damage to elites and bosses Bacon Bits Boss Buster
Area Big Bowl Philosopher's Potato, Wide Ladle
Damage Butter Pat Cursed Crown, Golden Gravy, Philosopher's Potato, Salt Crystal
Dash charges Butter Socks
Dash cooldown Butter Socks
Cooldown Chives, GPU Chive Charm
XP gain Fertilizer Compost Tea
Luck Four-Eyed Spud Cursed Crown, Lucky Peel
Gold gain Golden Fry Golden Gravy, Penny Spud
Projectiles (amount) GPU, Sprouting Eyes Extra Eye
Max HP (%) Gravy Heart
Crit points Hot Sauce Hot Pepper
Knockback Masher Grip
Pickup range Potato Magnet Copper Spoon
Recovery (HP/s) Root Network Pickle Jar
Curse Rotten Spud Cursed Crown
Projectile speed Salt Shaker Philosopher's Potato, Time Tuber
Duration Slow Cooker Philosopher's Potato, Time Tuber
Crit damage Sour Cream Crit Chip
Move speed Spud Sneakers Starch Sock
Armor Starch Plating Baked Buckler
Dodge points Thick Skin Ghost Skin
Explode-on-kill chance Boom Spud
Purchase discount Coupon Book
Post-dash invulnerability (s) Ghost Pepper
Revivals Second Spud
Pierce Sharp Peeler
Max HP Spud Muffin
Thorns Thorny Jacket
Heal on kill 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.

  • Game config and formulas in sim-BkfBhQfw.js

Code references

  1. sim-BkfBhQfw.js function Ke(e,t){return e<=0?0:e/(t+e)}
  2. sim-BkfBhQfw.js n.hp[r]=e.loadout.stats.maxHp*(i?t.reviveHp:e.cfg.player.reviveHp)
  3. sim-BkfBhQfw.js function Lu(e){return e.mode===story?e.cfg.story.invulnSec:e.cfg.revive.graceSec}
  4. 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))}
  5. sim-BkfBhQfw.js i[r.cooldownMult]=1-Ge(e.cooldown,-1,n.cooldownCap)
  6. sim-BkfBhQfw.js function Qa(e,t,n){let r=n.armor;return Math.min(r.cap,Ke(e,r.k*t))}
  7. sim-BkfBhQfw.js d=l*(1-Qa(s.armor,i,e.cfg))*(u?1-e.cfg.player.freezeDamageCut:1)
  8. sim-BkfBhQfw.js let u=s.critChance+o.critBonus[r];u>0&&e.rng.next()<u&&(d*=s.critMult,f=!0)
  9. sim-BkfBhQfw.js let o=(a===`nuke`?e.cfg.reset.minCooldownSec:.05)*Nf(e)
  10. sim-BkfBhQfw.js function Nm(e,t){let n=t-Mm(e);return n>1e-9?n:0}
  11. sim-BkfBhQfw.js revive:{graceSec:4,radius:160,push:900,stunSec:5,bossSlow:.5,clearsBullets:!0}
  12. sim-BkfBhQfw.js let n=e.enemies,r={kind:freeze,seconds:e.cfg.revive.stunSec}
  13. sim-BkfBhQfw.js i={kind:slow,factor:n.bossSlow,seconds:n.stunSec}
  14. sim-BkfBhQfw.js a=i+e.cfg.player.hitOffsetY
  15. sim-BkfBhQfw.js let ie=n.radius[d]+s,ae=ie+Math.abs(g)+Math.abs(_)
  16. sim-BkfBhQfw.js qe(r,a,m,h,v,y)<=ie?Sp(e,d):bp(e,d,te,ie+c)
  17. sim-BkfBhQfw.js let x=v-r,ee=y-a,te=x*x+ee*ee;if(b<=0||te>l*l)
  18. sim-BkfBhQfw.js gp(r,i,e.lastDashTick<0?pp:e.tick-e.lastDashTick,e.cfg.level.returnSpeed)