Author: Landon

  • Bringing Cozy Games to Fortnite – Day 7

    Bringing Cozy Games to Fortnite – Day 7

    Day 7 — Drop/Pickup Foundations & Architectural Limits

    Context

    Adding Drop and Pickup actions revealed structural limitations.

    Drop & Pickup

    • I implemented basic dropping and picking up of items.

    Architectural Issues

    • Several systems were doing too much, signaling the need for a larger refactor.

    Summary

    What I accomplished:

    • Added early Drop and Pickup behavior.
    • Identified structural bottlenecks.

    What I learned:

    • Refactoring is essential when scaling core systems.
  • Bringing Cozy Games to Fortnite – Day 6

    Bringing Cozy Games to Fortnite – Day 6

    Day 6 — Shovel Functionality & Persistence

    Context

    Today was about getting the Shovel to meaningfully change the world.

    Hole Digging

    • The Shovel now digs and fills holes.

    Persistence

    • Tile changes now persist across player sessions.

    Collision Fix

    • A collision issue caused by unnecessary physics was resolved by disabling the physics flag.

    Summary

    What I accomplished:

    • Implemented hole-digging mechanics.
    • Added tile persistence.
    • Fixed collision behavior.

    What I learned:

    • Physics flags can create hidden issues.
    • Persistence systems need to be established early.
  • Bringing Cozy Games to Fortnite – Day 5

    Bringing Cozy Games to Fortnite – Day 5

    Day 5 — Player Inventory UI & Input Navigation

    Context

    With tools working, I focused on building a functional player inventory UI.

    Inventory UI

    • I created a hybrid UMG + Verse inventory UI. Manual input navigation was required due to UMG limitations.

    UI Polish

    • I added UMG bindings for light animations to improve overall feel.

    Summary

    What I accomplished:

    • Built the player inventory UI.
    • Added equip/unequip interactions.
    • Improved responsiveness with UI animations.

    What I learned:

    • Manual input handling is sometimes necessary.
    • UI polish significantly affects player perception.
  • Bringing Cozy Games to Fortnite – Day 4

    Bringing Cozy Games to Fortnite – Day 4

    Day 4 — Inventory Migration & First Tool Implementation

    Context

    Today I migrated my existing inventory system into Scene Graph and created the project’s first real tool.

    What I did

    • Inventory Migration
      • I took my existing inventory item system (creative_devices) and converted it to be compatible with Scene Graph (components). The migration required rethinking how items are stored, equipped, and managed.
    • Shovel Tool
      • I created the Shovel entity and implemented an equip system. A simple UI helped validate behavior.
    • Interact Prompt Issue

    Summary

    What I accomplished:

    • Migrated the inventory system into Scene Graph.
    • Created and tested the Shovel tool.
    • Found a workaround for interaction prompt issues.

    What I learned:

    • Scene Graph encourages cleaner architecture.
    • Tool systems require tightly coordinated components.

  • Bringing Cozy Games to Fortnite – Day 3

    Bringing Cozy Games to Fortnite – Day 3

    Day 3 — Preview System & Early Scene Graph Work

    Context

    Today centered on Scene Graph—the system that will ultimately power most interactions on the island.

    Tile Preview System

    I built the first version of the preview system. It highlights the tile in front of the player to clarify where actions will apply.

    Learning Scene Graph

    I spent most of the day learning:

    • Entity parenting
    • Component patterns
    • Runtime entity behavior

    Summary

    What I accomplished:

    • Built the first version of the tile preview system.
    • Developed foundational understanding of Scene Graph.

    What I learned:

    • Scene Graph concepts are essential for future interactions.
    • Even simple preview systems require careful structure (e.g. parenting to scene objects vs. player entity).
  • Bringing Cozy Games to Fortnite – Day 2

    Bringing Cozy Games to Fortnite – Day 2

    Day 2 — Establishing Time & UI Foundations

    Context

    With the visual foundation in place, today focused on developing systems that make the island feel persistent and alive.

    Date & Time System

    I built the island’s Date/Time system using UMG and Verse. This required experimenting with how data moves between UI and logic, but once everything synced correctly, the system felt stable.

    The island now tracks:

    • Real-world date (Central Time)
    • Current in-game time
    • Player inactivity windows
    Idle UI with real-time date/time

    UMG + Verse Integration

    I created a small “Idle UI” overlay to validate that the data was flowing correctly. It wasn’t required, but it helped confirm assumptions early.


    Summary

    What I accomplished:

    • Added the foundational Date/Time system.
    • Connected UMG and Verse for the first time.
    • Validated UI–logic communication with an Idle UI overlay.

    What I learned:

    • Time systems influence nearly every future mechanic.
    • Early UI prototypes save debugging effort.
    • Real-time dependencies require careful handling.
  • Bringing Cozy Games to Fortnite – Day 1

    Bringing Cozy Games to Fortnite – Day 1

    Day 1 — Setting the Visual Foundation

    Why a Cozy Game?

    There aren’t many cozy, slow‑paced games inside Fortnite, but my family really enjoys them. I wanted to create something in that space—something calmer, more intentional, and inspired by the charm of Animal Crossing. Island Crossing is my attempt to bring that feel into Fortnite while still respecting the constraints and systems of UEFN.

    Camera & Controls

    I started by adjusting the camera and third‑person controls to create a perspective closer to Animal Crossing: slightly elevated, pulled back, and wide enough to make the environment feel approachable. Even without gameplay, this shift immediately changed the feel of the island.

    Curved World Material

    With the camera in place, I moved on to implementing a Curved World material. The setup followed a few good tutorials, but the decision carried a meaningful tradeoff:

    • The effect relies on modifying the World Position Offset.
    • That requires raw material access.
    • Which means standard Fortnite meshes won’t work.

    Every mesh that participates in the curvature needs to be custom. It increases production time, but it supports the long‑term goal of giving the island a distinct, handcrafted identity.

    Early Technical Hurdle

    During testing, the ground mesh was unexpectedly sinking. After some debugging, the cause became clear: the mesh only had a single subdivision, leaving the deformation with almost nothing to work with. Increasing it to fifty subdivisions produced the curvature I wanted.

    A simple fix, but a good reminder that WPO‑driven deformation is entirely dependent on underlying geometry.


    Summary

    What I accomplished:

    • Established the camera angle and controls for a cozy, readable view.
    • Implemented the Curved World material.
    • Identified and resolved a mesh deformation issue caused by low subdivision density.
    • Evaluated long‑term implications of relying on custom meshes.

    What I learned:

    • Visual direction decisions often introduce lasting architectural consequences.
    • WPO effects require careful mesh preparation to avoid artifacts.
    • Early camera work pays off immediately—perspective defines tone before mechanics even exist.
  • Bomber Blocks – Technical Design Review

    Bomber Blocks – Technical Design Review

    Introduction

    Bomber Blocks is a Bomberman‑style experience built in Fortnite using UEFN and Verse. This project was my chance to take lessons from earlier work (e.g., my Roblox experience Bomber Buddy) and from systems I began in Mega Jump Simulator (modular UI, inventory, rewards), and apply them to a clean, scalable architecture.

    This post is a technical design review. It focuses on how the game is structured under the hood: procedural map generation (“Environments”), NPC behavior, match flow, inventory and rewards, voting, and a shared UI stack. The goal is to show how these systems fit together to make iteration fast, live ops practical, and player experience consistent—without relying on ad‑hoc scripts.

    If you’re evaluating technical designers/UEFN developers, this should give you a clear sense of my approach: build reusable foundations, minimize friction for iteration, and design for long‑term sustainability while staying faithful to the core Bomberman loop.


    1. Procedural Grid + Environment System

    The battlefield in Bomber Blocks is built procedurally at the start of every match. Instead of manually laying out tiles or environments, I rely on a set of flexible, editor-driven definitions to generate grid-based maps that change every round.

    At the core of this system are two Verse scripts: block_handler and environment_definition, both connected through the environment_manager device.

    How It Works

    1. Pick an Environment (Map) – The environment_manager selects which “map” to load. Each environment defines its own props, materials, and tile behavior.
    2. Build the Grid Procedurally – The block_handler takes parameters from the environment and constructs a randomized, yet fair, grid of blocks:
      • Solid blocks (“Barriers”)
      • Breakable blocks (“Blocks”)
      • Empty tiles
      • Powerup-eligible spaces
    3. Apply Theme-Specific Props and Materials – Each tile’s visuals and behavior come from the active environment.

    This structure means designing a new map is simple: just drop a new environment_definition device into the Editor, configure its @editable settings (like which blocks are solid vs breakable, or which props to spawn), and add it to the manager’s Environments array. No code changes required.

    Why This Matters

    Rather than hardcoding maps or tiles, this setup lets me:

    • Quickly prototype new “themes” or maps
    • Adjust block density, powerup frequency, or tile types without touching code
    • Reuse the same logic across all maps while keeping them visually distinct

    These kinds of @editable settings allow me to shape each map’s feel—and even tune gameplay—without needing to touch my underlying Verse logic. It’s designed for flexibility, iteration, and long-term scalability.


    2. NPC Behavior System

    In Bomber Blocks, NPCs aren’t just random movers—they’re designed to feel like real players, complete with priorities, personality, and situational awareness. From evading blasts to contesting powerups, each NPC responds dynamically based on what’s happening in the game.

    How NPC Behavior Works

    Each NPC is managed by a central npc_manager device, which initializes and tracks behavior scripts (bomber_npc_behavior) for every bot in the game. These behaviors aren’t just simple logic loops—they’re state-based systems that adapt to the grid and player actions.

    Each bot cycles through several key states during a match:

    • Evade – Detects nearby blasts and moves to safety
    • Place Bomb – Identifies when blocking or trapping an enemy makes sense
    • Chase/Contest – Pursues players or powerups when advantageous
    • Roam – Default logic when no immediate danger or high-value targets are nearby
    • Item Acquire – Seeks out unclaimed powerups in nearby tiles
    • Retreat – Pulls back to safer ground when low on options or cornered
    • Stuck Resolve – Detects when the bot is blocked or looping and corrects course

    Debug-Driven Development

    NPC behavior was developed with deep debugging support in mind. Each state has its own toggle so I could visually track when and why an NPC entered a state, making it easier to fine-tune transitions and avoid deadlocks or unintended loops.

    The combination of granular states, responsive logic, and debug tools makes these NPCs feel lively—and keeps matches exciting, even when player slots aren’t full.


    3. Game Flow Management (Game Manager + Game State System)

    In Bomber Blocks, every match is controlled by a single Verse-driven device: game_manager. This acts as the conductor for the entire game loop, handling what players see, when NPCs activate, and how the game transitions from one round to the next—without needing multiple triggers or manual resets.

    Match Lifecycle

    The game follows this predictable but flexible sequence:

    Setup → Match → Cleanup → Voting → Repeat

    Each phase is defined in its own game_state class, with transitions driven by a custom Verse timer_device replacement (custom_timer_device) for better UI control and animation. This lets the game:

    • Display custom countdown timers with animated digits
    • Show or hide timers based on game context (e.g., only during match start/end)
    • Snap between states instantly, without client-side lag or artifacts

    Player Handling

    • Late Joiners: Players who join mid-round are dropped into spectator mode, without interrupting the live match
    • Eliminated Players: When a player is knocked out, they instantly switch into a spectator state—but still have access to their inventory and point-earning systems

    The game_manager not only handles the match logic but also coordinates with the UI and inventory systems, meaning every round feels complete and connected, even as players come and go.


    4. Inventory Item System

    The Inventory Item System is a shared data layer for anything that can belong to a player—tangible or intangible. In Bomber Blocks, that means four item types: Bombs, Explosions, Currencies, and Stats. Each item is a small, editor-driven device with consistent fields (e.g., Id, DisplayName, Thumbnail, ItemType) and optional UI hooks, which makes the whole system easy to scale and reason about.

    Bomber Blocks – Inventory

    Why this exists

    Instead of hard‑coding separate code paths for “bomb skins,” “explosion skins,” “coins,” or “playtime,” the system gives all of them a common contract. That lets other systems (like Rewards or UI) subscribe to changes once and work across types without custom glue each time.

    How it’s modeled (high‑level)

    • Item device (inventory_item): Editor‑authored definition (id/name/icon/type), optional stat link for displaying values, optional custom UI widget, optional currency multiplier.
    • Type definition (inventory_item_type + concrete types): Declares behavior and persistence at the type level. In Bomber Blocks:
      • Bomb / Explosion: Visual definitions (props, materials, flipbook params for UI previews/frames).
      • Currency: Points to a currency manager; values are typically persistent.
      • Stat: Generic counters (e.g., eliminations, playtime); can be persistent or session‑scoped.
    • Manager (inventory_item_manager): Single place that registers items, mirrors value changes into UI, and exposes helpers to get/set values per player. It hydrates values on join and updates UI without you wiring every case by hand.

    What this unlocks in practice

    • One update path for Rewards: When a Stat changes (e.g., Eliminations), the Rewards system can listen once and evaluate definitions—no need to sprinkle “check rewards” calls all over gameplay code.
    • Rapid UI wiring: Items can carry an optional custom stat UI reference; the manager attaches and updates it per‑player, formatting values and auxiliary text (e.g., currency multipliers) automatically.
    • Editor‑first authoring: New items or types are added as devices and registered at runtime—no refactors to integrate a new currency or stat.
    • Future‑proofing: The same data model works across projects (e.g., Trails/Back Items/Currencies/Stats in Mega Jump Simulator) while Bomber Blocks focuses on Bombs/Explosions/Currencies/Stats.

    Storefront Link (Purchasable Items)

    Some items are earned through rewards; others can be purchased. To keep this clean, a storefront_item is created and linked to an inventory_item. The storefront_item handles the transaction rules (what currency, how much, static vs dynamic price, quantity, confirmation), while the inventory_item remains the single source of truth for the item’s identity and visuals. In practice, you:

    • Create or reference the currency as an inventory_item
    • Define a storefront_item with that currency + pricing
    • Link the storefront_item to the inventory_item you’re selling

    This keeps purchase logic out of game logic and makes new purchasable items mostly an editor task rather than new code.


    5. Reward System

    The rewards layer connects player actions to tangible gains without hard‑wiring checks all over gameplay code. It’s built from three parts:

    • reward_definition** (device):** What the reward is (the item + amount) and the condition to earn it (e.g., reach X Eliminations). Conditions read progress from the Inventory Item System (Stats like Eliminations, Playtime, Level, XP).
    • reward_system_registration** kinds:** Logical groupings like Orientation (Tutorial), Playtime, Achievements—and a Progression kind available for tiered/season‑pass‑style tracks.
    • rewards_manager** (device):** The orchestrator. It evaluates conditions, updates UI, handles claim states, plays SFX/notifications, and grants items through the Inventory Manager.
    creative_devices in the editor scene

    How it works at a glance

    1. Define rewards in the editor. Each reward_definition points to an inventory_item (the thing you grant: currency, cosmetic, stat bump) and a condition (e.g., stat_threshold_condition on a Stat item like ‘100 Eliminations’ or ’60 minutes of Total Playtime’).
    2. Register them under a system. A reward_system_registration groups definitions into a system type (Orientation, Playtime, Achievements, or Progression) and optionally wires a specific dialog_grid_ui and notifications when the player has a Reward to claim.
    3. Manager drives the loop. rewards_manager evaluates progress, marks items Locked / Earned / Claimed, pushes row data into the grid UI, and grants via inventory_item_manager when a player claims. It also supports per‑row availability notifications and a playtime countdown that keeps ticking even with the UI closed.

    Why this solves real problems

    • No duplicate glue code: Gameplay only updates Stats (e.g., “Elims += 1”). The Rewards layer observes those Stats and unlocks rewards automatically.
    • Editor‑first authoring: New rewards are devices—drop them in, set the condition, and they show up in the correct tab with no code changes.
    • Responsive UI: Uses the same Verse‑UI stack (Dialog Grid UI). Rows show current progress, target, lock state, and a single CLAIM action (or CLAIMED for one‑time grants). Icons/material previews are selected automatically from the item type (e.g., Explosion previews use an animated material).
    • Live‑ops friendly: Systems can add Orientation onboards, repeatable Playtime grants, achievement ladders, and (if desired) a Progression / Season Pass track—without refactoring the core game.

    Notable implementation details

    • Forced unlock on countdown zero (Playtime): If a time‑gated row hits 0, it becomes claimable on the UI immediately—even if the stat update lags a tick—so players aren’t blocked by timing.
    • Per‑item notifications: Optional notifications fire when a specific row becomes claimable and clear when it’s no longer available.
    • Claim effects: Currency grants increase balances; non‑currency grants also set ownership, so those items appear unlocked in inventory/store UIs on refresh.
    Bomber Blocks – Rewards

    6. Voting System

    The voting flow lets players pick the next map (environment) using a UI‑first approach, rather than world‑space buttons. It’s intentionally lightweight and fast so it fits between rounds without derailing the loop.

    What it does

    • Presents N options (configurable) for the next environment and lets each player cast one vote.
    • Options can be randomized per vote session, and the system prevents duplicate picks when sampling.
    • Votes are tallied per environment; ties are broken at random among the leaders.

    How it works (high‑level)

    • Owner‑driven timing: game_manager starts/ends the vote and passes in the candidates via SetEnvironmentOptions(...).
    • UI: Uses dialog_grid_ui entries that are zero‑cost, always clickable, and styled as a clear VOTE action (no lock/cost overlays).
    • Result: ApplyWinningSelection() computes the winner (with tie‑breaker) and stores it; game_manager then applies the environment index on the next round.
    • Analytics: When a player votes, the system submits an event through the chosen environment’s analytics device.

    Current scope & trade‑offs

    Today, the voting entries are hard‑wired to environments (maps). That decision let me ship quickly and collect real player preference data tied to map‑exclusive currencies. The class is structured so it can be generalized later to vote on other kinds of options without changing the UI mechanism.

    Bomber Blocks – Map Voting

    7. Custom UI Systems

    The UI stack in Bomber Blocks is designed to support a wide range of use-cases—storefronts, stat overlays, reward grids, prompts—without having to rebuild UI each time. It’s as much a technical framework as it is a UX tool.

    What these systems solve

    • Faster iteration: No need to rebuild or “Push Changes” to test layout or logic changes.
    • Shared patterns, unique screens: Inventory, rewards, voting, stats—they’re all rendered with the same Verse-driven UI system.
    • Editor-defined visuals: UI components are placed in the editor but updated dynamically through Verse, keeping iteration smooth.

    Key Devices & Use Cases

    • dialog_grid_ui – Renders large item lists like inventory grids, reward tabs, and voting prompts, with pagination and conditional lock states.
    • custom_stat_device_ui – Allows placing stat displays in the editor (e.g., currency, eliminations) and dynamically showing/hiding them through Verse.
    • prompt_dialog_device – Pop-up dialogs for purchase confirmation, teleport prompts, reward claims, etc.—all share one reusable layout.
    Prompt Dialog Device

    How it works

    1. Author the layout in the editor (drag UI devices into the scene, set icons/text/positions).
    2. Bind to live systems via Verse: Once the UI initializes, it requests data from systems like Inventory, Rewards, or Voting.
    3. Separate layout from logic: Add a new screen by defining fields in the editor; hook it up through Verse without creating bespoke UI or widgets.

    Why this matters

    Common UI patterns—like grid rows, confirmation prompts, and stat displays—are solved once and reused everywhere. This means:

    • Less code duplication
    • Faster iteration loops
    • Consistent player experience across systems
    Bomber Blocks – XP Summary

    You can read a more detailed deep dive here: Designing Modular UI in Verse


    Conclusion

    Bomber Blocks isn’t just a game—it’s a long-term investment in scalable systems and efficient workflows for UEFN. From procedural map generation to a unified inventory and rewards ecosystem, the project demonstrates how thoughtful technical architecture can unlock faster iteration, more content, and smoother live operations.

    The modular systems outlined here aren’t one-offs—they’re adaptable frameworks built for reuse across future projects. Whether it’s onboarding new rewards, swapping in UI layouts, or adding whole new environments, the structure is set up to support more features with less friction.

    If you’re looking for someone who can blend strong technical design with scalable live ops strategy—and isn’t afraid to dive deep into Verse to get it done—I’d love to collaborate. Let’s build something remarkable together.

  • Designing Modular UI in Verse: Solving Real UX Problems in UEFN

    Designing Modular UI in Verse: Solving Real UX Problems in UEFN

    Building UI in UEFN using Widget Blueprints can feel slow and limiting, especially when your workflow requires lots of iteration. Every time you make a change, you’re waiting 3–5 minutes for a full “Push Changes” cycle. If you’re making dozens of updates per project, you’ve easily lost 45-60 minutes per day.

    Me when “Push Changes”

    That’s why I started building UI directly in Verse. My goal wasn’t to replace all Blueprint Widgets overnight but to solve the real problems that UI in UEFN wasn’t handling efficiently: large item lists, dynamic stats, currency updates, reusable layouts, and on-demand prompts.

    The result is a flexible, modular UI system powered by Verse that’s now been tested in multiple live projects.


    The Problem With Blueprint Widgets

    In projects like Ultimate Capture The Flag, Mega Jump Simulator, and Bomber Blocks, I needed UI that could:

    • Show dozens of items at once with pagination or tabs
    • Display player-specific data (like currency or item ownership)
    • Let me show or hide UI elements based on different game states
    • Update in real time when something changes (like earning a new reward)
    Complicated, unscalable Bindings needed for each Widget Blueprint

    Blueprint Widgets couldn’t keep up. And the slow iteration time made creative experimentation more difficult. 💡 That’s when I figured: if I’m going to spend this much time iterating with Widget Blueprints, I could invest that same time into a Verse-powered system that would save me far more time in the long run. So I started building UI that could still be composed visually in the editor but powered dynamically through Verse logic.


    The Tools I Built

    1. Flexible, Paginated Item Browser (dialog_grid_ui)

    Created originally for Ultimate Capture The Flag, this UI system supports an infinite list of items with pagination. It’s now in use in three islands, powering things like:

    • Inventory Items
    • Storefronts
    • Level Selector
    • Map Voting

    2. Dynamic HUD Stats (custom_stat_device_ui)

    The built-in “stat_creator_device” always shows HUD stats, whether you want them to or not. I needed something more flexible, so I built a stat display system in Verse that lets me control visibility and content dynamically without sacrificing the visual components. Most of the properties you’d define in the Widget Blueprint are available in the editor, but you have the power of Verse to Show/Hide it dynamically.

    (There’s even a forum thread with the same quality-of-life request here: https://forums.unrealengine.com/t/stats-creator-hide-hud-request/2237844/4)

    3. Reusable On-Demand Prompt (prompt_dialog_device)

    This saves me from needing a new pop-up Blueprint every time I want the player to confirm something. It’s controlled through Verse, so updating the text, buttons, or style only takes seconds. Useful for purchase prompts, teleports, or reward notifications.


    What Still Needs Work

    One of the biggest challenges is how to handle updating UI efficiently when something changes. If a player earns enough currency to buy a Bomb skin, I need to update just that UI element — not rebuild the entire store.

    This is still a work in progress, but my unified Inventory system (shared between Calling Cards, Bomb skins, Trails, Powerups, etc.) gives me a strong foundation.


    Results and What’s Next

    • UI that updates instantaneously, not minutes
    • Reusable systems now used across four UEFN islands
    • Improving the visuals using material_blocks and material instances (rounded edges, gradient backgrounds, etc.) without having to “Push Changes”

    UEFN gives you powerful tools — but it’s how you extend them that really matters. I specialize in spotting gaps, optimizing workflows, and building systems that are designed to last. If you’re looking for someone who can not only execute but architect solutions that elevate your team’s efficiency and creativity, let’s talk.