<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>REDAGE devlog</title>
  <subtitle>How a small studio makes pixel-art slots for Stake.</subtitle>
  <link rel="self" type="application/atom+xml" href="https://redage.dev/devlog/feed.xml"/>
  <link rel="alternate" type="text/html" href="https://redage.dev/devlog/"/>
  <id>https://redage.dev/devlog/</id>
  <updated>2026-10-04T00:00:00Z</updated>
  <author><name>REDAGE</name><uri>https://redage.dev/</uri></author>
  <icon>https://redage.dev/apple-touch-icon.png</icon>
  <entry>
    <title>How we test a slot's math: 600,000+ rounds per game, 96.50% RTP</title>
    <link rel="alternate" type="text/html" href="https://redage.dev/devlog/how-we-test-slot-math/"/>
    <id>https://redage.dev/devlog/how-we-test-slot-math/</id>
    <published>2026-10-04T00:00:00Z</published>
    <updated>2026-10-04T00:00:00Z</updated>
    <summary>What RTP, hit rate, volatility and max win mean, how we check them over 600,000+ simulated rounds per game, and why RTP says nothing about your next spin.</summary>
    <category term="Slot math"/>
    <category term="RTP"/>
    <category term="Volatility"/>
    <content type="html">&lt;p&gt;Before one of our games gets art or sound, we want to know exactly what it pays, how often and how unevenly. This post explains how we find that out, and what the numbers on our game pages mean.&lt;/p&gt;
&lt;h2 id="every-round-exists-before-you-spin"&gt;Every round exists before you spin&lt;/h2&gt;
&lt;p&gt;A slot on Stake Engine does not invent a result when you press spin. Its math is a table of finished rounds, with every symbol drop, tumble and free spin already played out, and each round has a weight. When you spin, the server picks one round at random in proportion to those weights, and the game shows it to you.&lt;/p&gt;
&lt;p&gt;We build those tables by simulation. For every game we play out and store more than 600,000 complete rounds across its four modes: 908,780 for &lt;a href="https://redage.dev/games/kaiju-snack/"&gt;Kaiju Snack&lt;/a&gt;, 641,312 for &lt;a href="https://redage.dev/games/stompkin/"&gt;Stompkin&lt;/a&gt; and 641,158 for &lt;a href="https://redage.dev/games/rust-rook/"&gt;Rust Rook&lt;/a&gt;. Every mode gets at least 120,000 of them, so rare outcomes are really in the table, not just in a formula.&lt;/p&gt;
&lt;h2 id="rtp-is-computed-not-estimated"&gt;RTP is computed, not estimated&lt;/h2&gt;
&lt;p&gt;Because the table is the game, its return to player (RTP) is not a guess from a sample. It is the weighted average payout of every round in the table, divided by what the mode costs. We tune the weights until that number is 96.50% in every mode: the base game, the 2× mode that makes free spins more likely, and both bonus buys. We chose one number for every mode, so no way of playing returns more than another in the long run.&lt;/p&gt;
&lt;p&gt;Put the other way round, the game keeps 3.50% of everything wagered on it, on average, over a very large number of rounds.&lt;/p&gt;
&lt;h2 id="what-rtp-says-about-your-next-spin-nothing"&gt;What RTP says about your next spin: nothing&lt;/h2&gt;
&lt;p&gt;This is the part worth repeating. Every spin is drawn independently, with the same odds, whatever came before. A long dry spell does not make a bonus "due", and a big win does not make the next spin colder. RTP describes the whole table over millions of rounds. Over a session of a hundred or a thousand spins, your result can land far above or far below it.&lt;/p&gt;
&lt;h2 id="hit-rate"&gt;Hit rate&lt;/h2&gt;
&lt;p&gt;Hit rate is the share of rounds that pay anything at all. In the base game it is 28.5% for Kaiju Snack, 29.3% for Stompkin and 32.0% for Rust Rook, so roughly one spin in three. Two caveats. A "hit" includes wins smaller than the bet, so it is not the chance to come out ahead. And the single most common outcome in all three base games is a spin that pays nothing: 68 to 72% of spins.&lt;/p&gt;
&lt;h2 id="volatility"&gt;Volatility&lt;/h2&gt;
&lt;p&gt;Two games with the same RTP can feel completely different. Volatility describes how unevenly the return is spread: steady small wins, or long quiet stretches broken by rare large ones. We measure it as the standard deviation of a round's payout, in multiples of the bet. Our three base games sit between about 11.5 and 13.5, which is the uneven kind.&lt;/p&gt;
&lt;p&gt;In practice, most of the return comes from uncommon rounds, mainly the free spins features: Rampage, Hallow Night and Night Shift. In Rust Rook's base game, the spins that do not trigger Night Shift return about 52% of their cost; the remaining 44.6 points of the 96.50% come from the feature, which triggers about once in 213 spins on average. Stompkin's Hallow Night arrives about once in 224.&lt;/p&gt;
&lt;h2 id="max-win"&gt;Max win&lt;/h2&gt;
&lt;p&gt;Each game caps what a single round can pay: 10,000× the bet in Kaiju Snack, 15,000× in Stompkin and Rust Rook. The platform requires the cap to be reachable, and it is, but rarely: in the base games of Stompkin and Rust Rook it is about one round in seven million. Most players will never see it.&lt;/p&gt;
&lt;h2 id="how-we-check-a-table"&gt;How we check a table&lt;/h2&gt;
&lt;p&gt;A table is only as good as the code that played it.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;An independent checker.&lt;/strong&gt; A second program, written from the published rules alone and sharing no code with the generator, replays every stored round and must agree with the table on every payout.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The platform's rules.&lt;/strong&gt; Exact RTP in every mode, at least 100,000 rounds per mode, no gaps between win ranges and a reachable max win.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Real rounds.&lt;/strong&gt; We play rounds through the finished game and compare what the screen shows with the stored result.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Stake.&lt;/strong&gt; It checks the files again on upload and reviews every game before release.&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id="why-we-publish-this"&gt;Why we publish this&lt;/h2&gt;
&lt;p&gt;A slot is entertainment with a price, and these numbers are that price, measured: a one-in-three hit rate that is mostly small wins, a feature every couple of hundred spins, and a long-run return of 96.50% that no single session has to match. If a game stops being fun, stop playing.&lt;/p&gt;
&lt;p&gt;The art side of the work has its own post: &lt;a href="https://redage.dev/devlog/drawing-jack-in-code/"&gt;drawing Jack in code&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;18+ only. Stake.com is not available in every country, including the US, UK and Australia. Gambling can be addictive, so play responsibly. &lt;a href="https://stake.com/responsible-gambling/stake-smart"&gt;Responsible gambling on Stake&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Drawing Jack in code: 26 poses and four flames for Stompkin</title>
    <link rel="alternate" type="text/html" href="https://redage.dev/devlog/drawing-jack-in-code/"/>
    <id>https://redage.dev/devlog/drawing-jack-in-code/</id>
    <published>2026-10-04T00:00:00Z</published>
    <updated>2026-10-04T00:00:00Z</updated>
    <summary>Stompkin's jack-o'-lantern is drawn by a Python program, pixel by pixel: five lobes, a face lit from inside, 26 poses and four flame stages.</summary>
    <category term="Pixel art"/>
    <category term="Animation"/>
    <category term="Stompkin"/>
    <content type="html">&lt;p&gt;Jack is the hero of &lt;a href="https://redage.dev/games/stompkin/"&gt;Stompkin&lt;/a&gt;: a living jack-o'-lantern who stomps every winning group flat, and whose flame climbs with each stomp. The multiplier lives on him, so he has to read at a glance and move well in every frame. Every Jack sprite in the game is drawn by a Python program of about 480 lines.&lt;/p&gt;
&lt;h2 id="a-pumpkin-made-of-five-lobes"&gt;A pumpkin made of five lobes&lt;/h2&gt;
&lt;p&gt;Each frame is a 72×88 pixel canvas, drawn from scratch at native resolution. At rest Jack's body is 50 by 40 pixels, built from five ellipse-shaped lobes: one in the centre and two pairs either side. For every pixel the program asks which lobe is nearest the viewer, and that lobe wins.&lt;/p&gt;
&lt;p&gt;Light comes from the upper left. Each lobe is shaded on its own, lighter towards its left edge and darker at the bottom and the rim, and the result is cut into six hard bands of orange, from deep brown to a pale lit edge. No gradients, no dithering.&lt;/p&gt;
&lt;p&gt;The ribs come for free. Where a lobe meets one that sits further forward, the pixel on the seam is pushed two bands darker, which gives the pumpkin's grooves as one-pixel lines of shading rather than drawn ink. Last comes the outline: every empty pixel that touches a coloured one turns night-ink indigo, so body, stem and flame share one clean silhouette against a busy board.&lt;/p&gt;
&lt;h2 id="a-face-lit-from-inside"&gt;A face lit from inside&lt;/h2&gt;
&lt;p&gt;The carving is a set of polygons and ellipses cut out of the rind. Inside each opening there is a one-pixel dark wall along the upper edge, which reads as the thickness of the rind, then a ring of glow, then a hotter core. In the eyes a small white-hot pupil moves when he glances left or right.&lt;/p&gt;
&lt;p&gt;Jack has five carvings: a grin for idle, a focused look before a stomp, a happy open mouth on landing, a round-eyed surprise when a feature lands, and a fanged blaze for the victory bounce. He has no arms or legs, so the face and the body do all the acting.&lt;/p&gt;
&lt;h2 id="26-poses-each-a-new-drawing"&gt;26 poses, each a new drawing&lt;/h2&gt;
&lt;p&gt;The program draws 26 poses: four breathing idles, two glances and a blink, two crouches, two leaps, the top of the arc, the fall, the contact and its follow-through, a rebound, four wobbles that settle him, two surprise frames, two leans and two victory frames.&lt;/p&gt;
&lt;p&gt;Squash and stretch are never a scaled sprite. For the contact the body is redrawn 32% wider and a third shorter, with the lobes laid out again at that size, so every pixel is still a whole pixel from the same palette. The face squashes less than the body, so the carving stays readable at the moment that matters most.&lt;/p&gt;
&lt;figure class="shot"&gt;&lt;div class="sprites cut"&gt;&lt;img src="https://redage.dev/img/drawing-jack-in-code-1.bc59398fa2.webp" width="144" height="176" alt="Jack crouching before a stomp" style="--w: 72; --k: 2; --k-phone: 2" loading="lazy" decoding="async"&gt;&lt;img src="https://redage.dev/img/drawing-jack-in-code-2.5ddc1ceeb0.webp" width="144" height="176" alt="Jack stretched tall at the start of his leap" style="--w: 72; --k: 2; --k-phone: 2" loading="lazy" decoding="async"&gt;&lt;img src="https://redage.dev/img/drawing-jack-in-code-3.2fde63a82b.webp" width="144" height="176" alt="Jack squashed wide as he lands, with a happy open mouth" style="--w: 72; --k: 2; --k-phone: 2" loading="lazy" decoding="async"&gt;&lt;img src="https://redage.dev/img/drawing-jack-in-code-4.cdfa1305cc.webp" width="144" height="176" alt="Jack rebounding upwards after the stomp" style="--w: 72; --k: 2; --k-phone: 2" loading="lazy" decoding="async"&gt;&lt;/div&gt;&lt;figcaption&gt;Four drawings from one stomp: crouch, leap, contact and rebound.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;In the game each drawing holds for 50 to 90 milliseconds, with a 34 ms freeze on contact so the hit lands.&lt;/p&gt;
&lt;h2 id="four-flames"&gt;Four flames&lt;/h2&gt;
&lt;p&gt;Each stomp multiplies its win by Jack's flame, then the flame climbs one step up a ladder of 17: ×1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 25, 30, 40, 50, 75 and 100. The art follows it in four stages, and the game picks the stage with one line: &lt;code&gt;multiplier &amp;gt;= 50 ? 3 : multiplier &amp;gt;= 10 ? 2 : multiplier &amp;gt;= 5 ? 1 : 0&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;×1 to ×4:&lt;/strong&gt; a candle glow in the face.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;×5 to ×8:&lt;/strong&gt; an orange rim, and light spills onto the rind.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;×10 to ×40:&lt;/strong&gt; a red rim, a white-hot core and a flame tongue above the stem.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;×50 and up:&lt;/strong&gt; ghost-blue fire, a wider spill and a tall teal flame with two side licks.&lt;/li&gt;&lt;/ul&gt;
&lt;figure class="shot"&gt;&lt;div class="sprites cut"&gt;&lt;img src="https://redage.dev/img/drawing-jack-in-code-5.dd6db9bf3e.webp" width="144" height="176" alt="Jack at ×1, with a candle glow in his face" style="--w: 72; --k: 2; --k-phone: 2" loading="lazy" decoding="async"&gt;&lt;img src="https://redage.dev/img/drawing-jack-in-code-6.777e05e803.webp" width="144" height="176" alt="Jack at ×5, with orange light spilling around his face" style="--w: 72; --k: 2; --k-phone: 2" loading="lazy" decoding="async"&gt;&lt;img src="https://redage.dev/img/drawing-jack-in-code-7.252271e8cb.webp" width="144" height="176" alt="Jack at ×10, with a red flame tongue above his stem" style="--w: 72; --k: 2; --k-phone: 2" loading="lazy" decoding="async"&gt;&lt;img src="https://redage.dev/img/drawing-jack-in-code-8.aafdec58f5.webp" width="144" height="176" alt="Jack at ×50, with ghost-blue fire and a tall teal flame" style="--w: 72; --k: 2; --k-phone: 2" loading="lazy" decoding="async"&gt;&lt;/div&gt;&lt;figcaption&gt;The same idle pose at ×1, ×5, ×10 and ×50.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The two burning stages get three flicker drawings of every pose, so the tongue sways while he breathes. In the base game the flame starts at ×1 on every spin and goes out when the spin ends; in Hallow Night free spins it keeps every step it climbs until the feature ends.&lt;/p&gt;
&lt;h2 id="whole-pixels-only"&gt;Whole pixels only&lt;/h2&gt;
&lt;p&gt;With flicker frames and double-size drawings for big moments and store art, the program makes 296 drawings, and the same 296 every time it runs: there is no randomness in it. The double-size Jack is drawn again at twice the resolution, not enlarged.&lt;/p&gt;
&lt;p&gt;In the game the scene is rendered at its native pixel size and enlarged by a whole number, 3× on a 1280×720 screen and 4× at 1920×1080, so a Jack pixel is always a square of identical screen pixels.&lt;/p&gt;
&lt;p&gt;Jack also lives at the bottom of this site: click him to stomp him up the ladder. For the numbers behind his game, read &lt;a href="https://redage.dev/devlog/how-we-test-slot-math/"&gt;how we test a slot's math&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;18+ only. Stake.com is not available in every country, including the US, UK and Australia. Gambling can be addictive, so play responsibly. &lt;a href="https://stake.com/responsible-gambling/stake-smart"&gt;Responsible gambling on Stake&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
</feed>
