< Back 

Rod and Reef: Luck System

2026-09-14

Every cast in Rod and Reef goes through five rolls and several layers of luck: rod, bait, nearby friends, boat, multipliers, ceilings, pity and a nudge toward the fish your quests ask for. This article explains the math of each layer and how they compose.

LuauRobloxGameplayMath
Go to quick view

Five rolls and two ladders.

Warning

Rod and Reef hasn’t been released yet, and videos or GIFs of this system can’t be shown until it launches.

Abstract. In Rod and Reef, every time the player casts, the server resolves five rolls: the fish’s rarity, its species, its mutation, the lunar variant and its size. On top of them sit the rod, the bait, Roblox friends fishing nearby, the boat being fished from, timed multipliers, a pity system that guarantees certain outcomes after a bad streak, and a nudge toward the species the player’s active quests ask for. This article describes version 5 of the system. Luck is the sum of two numbers, rod and bait. Odds are read from two piecewise-linear ladders, one for rarity and one for size, and each rod’s ceilings are a conditioning of the distribution rather than a clamp. The three rarity modifiers that come afterwards preserve the shape of the upper tiers, and their composition has a closed form. Pity thresholds are derived from the natural probability, and a renewal-process analysis matches a 400,000-cast simulation to the decimal. Size uses a power curve that separates the ordinary from the exceptional. And bait prices were derived so each bait is the best choice on exactly its own rod.

1. The problem

Version 4 of the system came with player reports that, once measured, turned out to be true. With an empty hook, any rod caught an uncommon fish one cast in five. A legendary rod with legendary bait still caught common fish 11.5% of the time. Rod luck moved only 0.1% of the common probability per point, so going from the free rod to the legendary one, which costs 100,000 coins, raised empty-hook income from 54 to 81 coins per cast. The starter rod with no bait could land a giant fish. And the bait economy was broken: on the first island, rare, epic and legendary bait lost coins every cast on any rod, and on islands 2 to 4 every bait lost coins on every rod.

The goal of version 5 fit in one sentence: players have to want better rods and better bait, and must not lose money by using them.

2. One cast, start to finish

Everything is resolved on the server, in this order:

  1. Resolve the tier the cast rolls as (paid rods borrow the tier of the best regular rod the player owns) and the bait’s tier.
  2. Every pity category this cast qualifies for adds one to its counter.
  3. Roll 1, rarity: ladder, ceiling, friends, boat and timed multiplier, then sample.
  4. Roll 2, species: among the species of that rarity on the current island, with the quest nudge.
  5. Roll 3, mutation: plain, shiny or glowing, mutually exclusive.
  6. Roll 4, lunar variant: independent of the previous one, and only at night.
  7. If a pity counter is full and forcing it doesn’t make the result worse, the species and mutation are replaced.
  8. Counters whose target matches what came out are reset.
  9. Roll 5, size: size ladder, ceiling, and a weight inside the category through a power curve, clamped to the rod’s maximum weight.

The following sections take these one at a time.

3. Luck

A cast’s luck is a sum:

ℓ=ℓrod+ℓbait

Rods are worth 0 (starter), 5, 15, 25, 35, 45, 55, 70 (legendary) and 85 (secret), and baits 0 (empty hook), 6, 13, 21, 30 and 40 (legendary). It’s one number, and the shop shows both halves so players can add them up themselves. The spacing between baits isn’t arbitrary: with these values, each bait earns more than the one before exactly on the rod that unlocks next to it, and with tighter spacing the cheaper bait would win everywhere. Prices were derived from these numbers (section 10), so changing one means re-deriving the other.

4. The ladder

4.1 Interpolating inside the simplex

Rarity is read from a table of rows, each with a luck value xk and a probability vector 𝐩k over the six rarities. Some of its rows:

Luck Common Uncommon Rare Epic Legendary Mythical
0 92.0 7.0 1.0 0.0 0.0 0.0
25 73.0 21.0 5.0 0.95 0.05 0.0
55 41.5 36.0 16.5 5.3 0.7 0.0
70 26.0 39.5 24.5 8.8 1.0 0.2
110 5.0 27.5 39.5 21.5 5.0 1.5
125 3.0 21.5 41.0 25.5 6.8 2.2

Between two rows it interpolates in a straight line:

𝐩(ℓ)=(1−α)𝐩k+α𝐩k+1,α=ℓ−xkxk+1−xk

and outside the table it uses the end row. Each row is a point in the probability simplex Δ5={𝐩∈ℝ6:pi≥0, ∑ipi=1}, and the simplex is convex [1], so a convex combination of two valid rows is a valid row. Interpolation never needs renormalizing.

There’s a second, identical ladder for size, with six categories from tiny to legendary. The numbers are typed by hand into six-column rows, which is exactly where a slip goes unnoticed, so the module checks its own arithmetic on load: every row must add up to 100 within 0.01, luck must increase from row to row, and every rod tier must have both a luck value and a ceiling. If something is off it warns loudly but doesn’t stop the game, because a row that’s off by a tenth still rolls; it just no longer means what it says.

4.2 Ceilings as conditioning

Each rod has the best rarity and the largest size it can land on an empty hook. Basic rods stop at rare and medium, the legendary rod at epic and giant, the secret rods at legendary on both scales. Any bait raises both ceilings one step, and legendary bait raises rarity two. So, with c the index of the ceiling,

c=min⁡(crod+λbait, 6)

and the distribution is cut at c and renormalized:

ri={pi∑j≤cpji≤c0i>c

That is the conditional distribution, P(X=i|X≤c). It isn’t a clamp that sends everything above the ceiling onto it. With a clamp, a rod capped at epic would add all of its legendary and mythical mass to its epics. With conditioning, that mass is spread proportionally over every allowed rarity.

The design rule that follows is that the rod decides what can bite and the bait decides how often the good ones do, and neither can stand in for the other. Some concrete cases:

  • Starter rod, empty hook (ℓ=0, ceiling rare): 92% common, 7% uncommon, 1% rare.
  • Legendary rod, empty hook (ℓ=70, ceiling epic): 26.3% common, 40.0% uncommon, 24.8% rare and 8.9% epic. Its legendary and mythical fish only come with bait.
  • Legendary rod with legendary bait (ℓ=110, ceiling mythical): 5% common, 5% legendary and 1.5% mythical.
  • Starter rod with legendary bait (ℓ=40, ceiling legendary): 57.8% common and only 0.3% legendary. Plenty of luck with nowhere to go.

There are 9 rods by 7 baits, 63 pairs in all, and each pair’s result is computed the first time it’s asked for, cached and frozen, because every cast asks and the answer never changes. Freezing it stops the modifiers in the next section from writing into the shared table.

5. Three nudges that keep the shape

After the ladder, three modifiers move the rarity distribution, in this order.

Each Roblox friend fishing within 100 studs moves 3% of the common mass up into the higher rarities, up to 4 friends. The friend list is fetched once when the player joins, because that web call blocks, and each cast only counts who is nearby. With f friends, φ=0.03f, m=pCφ and U=1−pC the mass of everything that isn’t common:

pC′=pC−m,pi′=pi+mpiU=piU+mU(i≠C)

The boat does the same with its own fraction b, between 1% and 12% depending on the boat. The timed multiplier, earned for example as a daily login reward, multiplies every upper rarity by M and common pays for it:

s=min⁡(M, 1U),pi′=spi(i≠C),pC′=1−sU

The minimum is there because common pays for the boost and therefore caps it: once the upper rarities fill the whole row there’s nothing left to buy, and without the minimum common would go negative.

All three have one thing in common: they multiply every non-common rarity by the same factor. So their composition does too, and it has a closed form. If U is the starting upper mass,

U1=1−pC(1−φ),U2=1−pC(1−φ)(1−b),U3=min⁡(1, MU2)

and the final result is

pifinal=pi⋅U3U(i≠C),pCfinal=1−U3

Three properties that matter for the design fall out of this form. A rarity at zero stays at zero, so no nudge can open something the ceiling closed. The upper rarities keep their proportions to each other, so a 2x multiplier doesn’t favour mythical over uncommon. And friends and boat commute, because their factors (1−φ) and (1−b) just multiply. An example: the starter rod with common bait has 88.25% common and 9.87% uncommon. With two friends nearby, a 5% boat and a 2x multiplier, the factor is U3/U=3.61, and the result is 57.6% common, 35.6% uncommon, 6.3% rare and 0.5% epic.

The final sample uses inverse transform sampling over the cumulative sum [2]. Draw u uniform in [0,1) and walk the rarities in a fixed order, common to secret, returning the first one whose running sum reaches u. The order has to be fixed because a Luau table’s isn’t. In the size roll, if rounding leaves the sum a hair below 1, the result lands on the last category with a probability above zero, never on one the table has at zero.

6. Species and quests

Roll 2 picks a species among those of that rarity on the current island. If an active quest asks for a species, that species counts twice in the pick. With n species in the pool and one wanted,

P(quest species|rarity)=2n+1

which turns a two-species pool from 50% into 67% and a three-species pool from 33% into 50%. You notice it over a session, and it’s still well short of skipping the hunt. On top of that there’s a guarantee: every time the roll lands on the right rarity and a different species comes up counts as a miss, and after three misses in a row the next one is the quest species. Reaching the guarantee has probability

(n−1n+1)3

which is 1 in 27 with two species and 1 in 8 with three. Most players never reach it. It’s there for the bad-luck tail, the player who rolls the right rarity over and over and watches the wrong fish come up.

The nudge never touches roll 1. A legendary species on a rod that can’t roll legendary stays exactly as impossible, because the nudge only decides which species a rarity that already landed turns into. It doesn’t touch weight, mutation or the lunar variant either. And only objectives this cast could actually complete get a nudge: a fish heavier than the rod can land, a lunar fish in daylight, or a glowing one on gear with no glowing odds get nothing. The counters are saved in the player’s profile, so leaving the game doesn’t lose them.

7. Mutation and the lunar variant

Roll 3 is a single choice among three outcomes. With u uniform, the fish is glowing if u<g, shiny if g≤u<g+s and plain otherwise, where g and s depend on the rod’s tier: the starter rod has 1.5% shiny and 0.3% glowing, so a mutation during the tutorial is a real surprise, and the legendary rod has 21% and 11%. If the species has no version of the mutation that came up, the fish stays plain and nothing is re-rolled. Certain paid baits replace the rod’s odds entirely with their own.

Roll 4 is independent: a Bernoulli event with probability λ, which also depends on the rod, and which can only succeed between 9 pm and 5 am on the game’s clock. A fish can be lunar and shiny at the same time. None of these rolls receive the luck nudges from section 5. What they do is multiply the sell price: 1.4 for shiny, 1.8 for glowing and 2 for lunar.

8. Size

8.1 A curve for the kilograms

Roll 5 picks a size category from the second ladder and its ceiling. Inside the category, the weight is uniform between two fractions of the species’ range. The fractions come from the design document, 𝐬=(0, 0.14, 0.30, 0.50, 0.70, 0.90, 1), but they aren’t applied linearly. They are raised to a power:

βk=skγ,γ=1.8,W=wmin⁡+(wmax⁡−wmin⁡)(βk+u(βk+1−βk))

The reason is that species ranges are huge. A herring goes from 3 to 62 kg, and linearly the medium category covered 21 to 32 kg. Medium is the most frequent outcome with the cheapest bait in the game, so the middle of the distribution sat at a third of the species’ maximum: there was no such thing as an ordinary fish, the category names didn’t describe what they returned, and a tutorial player on a free rod with nothing on the hook pulled a 30 kg uncommon fish roughly once every twenty casts. With γ=1.8 the same herring looks like this:

Category Kilograms
Tiny 3 to 4.7
Small 4.7 to 9.8
Medium 9.8 to 19.9
Large 19.9 to 34.0
Giant 34.0 to 51.8
Legendary 51.8 to 62

The category odds don’t change. All that moves is which kilogram number wears which name. But since the upper categories now cover most of the range, the gap between the worst gear and the best doubles: the average herring on an empty hook dropped from 17.9 to 10.0 kg while legendary bait still lands 29.6 kg, so the spread went from 5.0x to 10.7x. That’s also what makes bait worth buying. With γ=1 the linear version comes back exactly.

8.2 One table

Three functions use those fractions: the one that generates a rod-caught fish’s weight, the one that generates a net-caught fish’s weight, and the one that classifies an existing weight to price it and award experience. All three read the same table, built once on load. They used to be copies, and a fish that rolled as one category and priced as another was exactly the bug that duplication produced. The final weight is clamped to the rod’s maximum, so the player always lands the fish but a low-tier rod can’t land the heaviest specimens, and the clamp happens before saving, so the weight shown, the weight stored, the price and quest progress all agree.

9. Pity

9.1 The mechanism

There are 14 pity categories, each with a target (for example “a shiny common” or “a mythical”), bait, rod and sometimes time-of-day requirements, and a threshold T. Every cast that meets a category’s requirements adds one to its counter, before the rolls. If the counter reaches T, that cast’s result is replaced by the target. And any catch matching the target, natural or forced, resets the counter.

9.2 A renewal process

Let p be the target’s natural per-cast probability. Every cycle between two resets ends either with a natural catch or with pity, so its length is L=min⁡(G,T), with G geometric with parameter p [4]. Its expectation is

𝔼[L]=∑k=0T−1P(L>k)=∑k=0T−1(1−p)k=1−(1−p)Tp

and by the renewal-reward theorem [3], the long-run rate at which the target arrives is

λ=1𝔼[L]=p1−(1−p)T

while the share of targets delivered by pity, rather than the natural roll, is the probability that a cycle reaches the threshold, (1−p)T−1.

9.3 Pity was winning

The old thresholds were picked by feel, and the analysis shows what was going on. The shiny common category had T=20 against a natural probability of 1 in 93:

λ=1/931−(1−1/93)20≈0.0553

that is, 5.53% of casts, with pity delivering 81% of them. A 400,000-cast simulation on the starter rod with common bait measured exactly 5.53%: 1.08% from the natural roll and 4.51% from pity. That was the “mutations feel common on basic gear” report, and it explained why an earlier tuning pass never reached anyone. The starter rod’s mutation odds had been lowered on purpose, so a mutation during the tutorial would be a surprise, and pity handed them back five times over. Rods couldn’t sell their own stat because pity was outbidding them.

9.4 A rule for thresholds

Now every threshold comes from one rule:

T=2.5p

with p measured on the worst gear that still qualifies for the category. With that rule, (1−p)T≈e−pT=e−2.5≈0.082, so

λ≈p1−e−2.5≈1.09p

Pity adds about 9% on top of the natural rate and delivers about 8% of targets. It’s a floor under a bad streak, not the main source. For shiny common, p=1/76 and T=190, and the rate comes out at 1.43% against 1.32% natural. Each category keeps, in a comment, the natural probability its threshold was derived from, so re-deriving them after a ladder change is arithmetic rather than taste. One category is off the rule on purpose: lunar glowing mythical, with a natural probability of 1 in 6734, would need 16,835 night casts, so it keeps a threshold of 300, and there the counter is the mechanic and the natural roll is the bonus.

9.5 Never worse

A counter also fills on gear far above its target, since shiny common counts just the same on a legendary rod with legendary bait. When it filled, pity swapped whatever had been rolled for its target, and a natural epic became a shiny common. Now a category holds its fire on any cast where forcing it would make the result worse, either a lower rarity than the one rolled or a shiny where a glowing of the same rarity came up. It stays full, waiting for a cast it actually improves, and the payout is still owed. Also, the forced species is drawn from the island the player is on. It used to come from the global pool, which was the source of the “sometimes I get fish from other islands” report.

10. The economy

Bait prices were derived with a rule. Each bait is paired with the rod that unlocks next to it, and stepping up one bait tier costs somewhere between what that step is worth on the rod paired with the previous bait and what it’s worth on its own rod, placed 75% of the way up that band and rounded without leaving it. With that, on every island, each bait is the most profitable choice on exactly its own rod and a waste on rods well below it. On the first island the per-cast prices came out at 5, 20, 80, 275 and 1000 coins, from common to legendary.

Income was modelled in coins per minute of fishing, counting 11 s of overhead per cast, the bite delay (which bait shortens), the minigame, 90% of fights won at or below the rod’s tier and 15% fewer per tier above, and the value of mutations and variants. On the first island:

Rod Price No bait With its best bait Bait Pays for the next in
Starter 0 100 104 common 24 min
Bamboo Reed 2,500 156 205 uncommon 41 min
Budding Branch 8,500 252 396 uncommon 35 min
Thornspear 14,000 391 745 rare 38 min
Tidevine Rod 28,000 614 1,266 rare 43 min
Bloomfang 55,000 948 2,269 epic 44 min
Verdant Reaper 100,000 1,517 4,569 legendary

Every rod upgrade and every matched bait upgrade raises income, and each takes a little longer to pay off: about 40 minutes on the first island, around an hour on the second and 2 to 3.5 hours on the last two, not counting quest rewards.

A single cast on rare or epic bait returns less than the bait cost about half the time, and on legendary bait nearer two casts in three, because that’s what it means for a fish to be rare. So whether the player loses money is a question about sessions. Simulating 50-cast sessions on each rod with its matched bait, the share that ends with fewer coins than it started with is 0.1% or less up to epic bait on every island, and between 0.9% and 2.1% on legendary. An empty hook never loses.

11. Limitations

The ladders are written by hand. They are tuned against the income model in section 10, but they don’t come out of it in closed form, and changing them means running that model again. The 100-stud radius for friends was a design choice with no number in the spec. The pity rule assumes p is measured on the worst qualifying gear, and on better gear the target’s natural probability can be different, so the 9% is exact only at that point. And the secret rarity, which is each island’s guardian, has its own path outside all of this.

12. What I took away

Measuring before changing is what made this system possible. Every problem in version 4 had a number behind it, and every decision in version 5 can be checked against that number. The other thing was to look for operations with good properties instead of adding rules: interpolating inside the simplex never needs renormalizing, a ceiling as conditioning doesn’t distort what’s left, and proportional nudges can’t break the ceiling. And the pity math taught me to distrust intuition about probabilities: a 20-cast threshold looked like insurance, and it was actually the main source of the thing it was supposed to insure.

References

  1. S. Boyd and L. Vandenberghe. Convex Optimization. Cambridge University Press, 2004.
  2. L. Devroye. Non-Uniform Random Variate Generation. Springer, 1986.
  3. S. M. Ross. Introduction to Probability Models, 11th ed. Academic Press, 2014.
  4. W. Feller. An Introduction to Probability Theory and Its Applications, Vol. 1, 3rd ed. Wiley, 1968.

This text by Mastedore. All rights reserved.