← All workGame

Four Slots Casino

A mobile casino slots product built as a FAB Marketplace template, then expanded on the same marketplace into a full four-game lobby with shared engine and fully themed variants. The template is what gets sold; the four-game build is what proves it ships. Pirate's Rim, Donuts Mania, China Town, and Golden Pyramids run on the same logic with completely different art, audio, paytables, and bet ranges.

Role

Developer

Year

2023

Built with
Unreal Engine 5
Blueprints
UMG
Mobile
Mockup
Gameplay video
Screenshot 1
Screenshot 2
Screenshot 3
Screenshot 4
Screenshot 5

Most slot templates stop at one reel set, one paytable, and a "you can re-skin this" promise. The whole point of a template is that it can be re-skinned and re-tuned without rewriting the engine, so this project ships four themes on the same engine to prove the architecture holds up. Same spin logic, win evaluator, jackpot pool, free-spin loop, and bonus trigger across all four; completely different art, audio, math, and bet structures driven by per-variant DataAssets.

The reel grid is 5x3 with up to 50 configurable paylines per variant. Pirate's Rim ships at 25 lines; the other three at 50. Three spin animation modes are selectable per variant via DataAsset: reel-by-reel, gravity block drop, and all-five-simultaneous. Five special symbol classes are wired into the engine, wild, scatter, free spin, bonus, and jackpot, and each variant binds its own thematic art and behavior tuning to those slots. Pirate's Rim has a female pirate as the wild, a captain portrait as the scatter, a treasure chest with chains as the free-spin trigger, a pirate hat with feather as the bonus, and a gold chest as the jackpot. Donuts Mania binds the same five classes to a baker chef, a cherry cake, a cherry parfait, a rose cake, and a frosted donut respectively. Different symbols, same underlying engine slots.

Free spin mode pauses bet deduction and runs a countdown of remaining spins on screen. Trigger counts scale the reward (3 scatters = 8 spins, 4 = 12, 5 = 20). Bonus symbols at the right count trigger a prize wheel mini-game. The jackpot pool increments live across all four games and is visible from the lobby, persistent across sessions, so coming back to the app after a day shows the pool larger.

The lobby is a four-card menu with per-game jackpot counters displayed live, level-gated unlocks priced in soft currency (Pirate's Rim free, then 60k / 150k / 400k for the other three), and a daily wheel-of-fortune bonus that triggers on app entry. The wallet is dual-currency. Soft currency earned in-game and premium currency for hard-gated content. Account flow handles registration with email/password/confirm validation and a guest login path for users who don't want to commit immediately. Account state, balance, and unlock progress are synced server-side via HTTP/REST calls into a persistence backend, so a player logging in from a different device sees their progress carried over.

Mobile ad SDK integration for interstitials between sessions is wired into UE5's mobile pipeline. This is the part most UE devs avoid because UE5's mobile ad story is fragmented and the available plugins are flaky; getting the platform-specific Java and Objective-C bridges to behave consistently across Android and iOS took meaningful integration work.

Async asset streaming per game with themed loading screens keeps memory bounded — three games the player isn't currently running don't sit hot in RAM. Texture preparation happens during the loading transition with a visible "Preparing Textures" counter so the player knows what's happening on slower devices. Paytable UI per variant renders from the same data the engine uses to evaluate wins, so there's a single source of truth for what each line pays.

Key challenges

The DataAsset architecture had to bind theme to art without binding theme to behavior. A wild symbol is mechanically a wild regardless of whether it's a female pirate or a rose cake, the engine has to treat it identically while the rendering pipeline pulls the variant-specific art. Designing the DataAsset schema so that "what this symbol does" lives in the engine and "what this symbol looks and sounds like" lives in the variant took several iterations before the boundary held cleanly.

Free spin mode is a state machine that pauses normal flow without breaking it. The engine has to suspend bet deduction, maintain a separate counter for remaining spins, continue paying out wins normally, and resume the standard flow when spins exhaust, all while keeping the UI in a consistent state and the jackpot pool still incrementing correctly.

The cross-game jackpot pool was a persistence challenge as much as a logic one. The pool needs to increment from any of the four games on any spin, be visible from the lobby in real time, survive app close and re-open, and survive device switch via the backend. Getting the read/write cadence right between local state and the persistence layer without flicker or stale reads required careful sync points.

Three spin animation modes sharing the same final reel state was the hardest single piece of the slot engine. Reel-by-reel finishes left to right with each reel locking independently. Block drop drops the entire next frame's tiles in from above with staggered timing. All-five-simultaneous spins every reel at once and locks them together. All three converge to the same evaluated outcome, but their state machines and timing curves are entirely different. Each had to be selectable per-variant via DataAsset without forking the win evaluation logic.

Mobile ad SDK integration into UE5 is genuinely painful work. UE5's mobile pipeline is built around the engine's own preferences for how Android and iOS native code should be invoked, and ad SDKs are built around Unity and native conventions. Bridging the two required platform-specific code on both sides, gradle and plist configuration, and handling the interstitial lifecycle (load, ready check, show, dismiss callback) consistently across both platforms.

The level-gated unlock economy needed unlock prices that felt earnable through play without making the premium currency feel forced. Tuning the bet ranges, win frequencies, and payout sizes so that a casual session generates meaningful soft currency toward the next unlock, without devaluing the premium currency or making the jackpot pool trivial, took balance passes across all four games.

Async asset streaming with bounded memory matters more on mobile than desktop. Three games' worth of textures held in RAM while the player is in the fourth would push mid-range Android devices into thermal throttling territory. The streaming pipeline loads on entry, unloads on exit, and shows a transition loading screen so the swap isn't visible as a freeze.