Skip to main content

Ideas planted today are built into tomorrow's services.

Illuminate the Dark Dungeon

A mobile dungeon puzzle game that combines Minesweeper-style rules with RPG battles and character progression. Players reveal hidden tiles, infer monster locations from number hints, and advance to the next stage through battles, keys, and gates.

Follow
0

Overview

"Illuminate the Dark Dungeon" is a mobile dungeon puzzle game that combines Minesweeper-style rules with RPG battles and character progression.

Players reveal dungeon tiles hidden in darkness one by one and infer the number of nearby monsters based on number hints. When they encounter a monster, a battle is resolved according to the character’s stats. After obtaining a key and opening the gate, they can move on to the next stage.

What I wanted to validate through this project was a service-based game structure that includes user login and data storage, a mobile game monetization flow with in-app purchases, and a fully controlled approach to vibe coding.

en-main
Main image

Participants
NameOrganizationRole
JaeKyeong SimDeveloper
Period
2025-07-15 – 2026-02-28
Technologies Used
  • Flutter Used to develop a mobile app that supports both Android and iOS
  • Supabase Save user data and user authentication based on guest login, Google login, and Apple login
  • Cursor Used for Vibe Coding
  • ChatGPT Create image asset drafts
  • ElevenLabs Generate in-game sounds using AI
  • Google AdMob Applying advertisements inside the app
Links
Download on the App Store Get it on Google Play

Background

In previous projects, I experienced Flutter app development, store releases, and user acquisition through advertising. In particular, through “SnapSlide Puzzle Game,” I confirmed that paid advertising could generate downloads, but I also learned that download count does not necessarily translate into sustained users.

For this project, I therefore focused not just on releasing an app, but on creating a game structure that users could play repeatedly. I initially planned a text RPG, but the development scope became larger than expected while implementing the foundation for login and data management. I then looked for an idea that could be built more quickly while still supporting repeat play, and shifted direction to an RPG puzzle game based on the intuitive rules of Minesweeper.

I chose this project for the following reasons.

Goal Reason
Monetization Experiment To see whether some users would proceed to purchase in-app digital products
Implementing a Service-Based Game Structure To implement login, user data, currency management, and related systems within a single game flow
Experimenting with a Game That Creates Sustained Users Because I concluded from previous projects that repeat play and return visits matter more than download count
Experimenting with Controlled Vibe Coding To design the project structure myself and limit AI to assisting implementation only within designated code files

The game I referenced was Daniel Benmergui’s Dragonsweeper. Dragonsweeper is introduced as a Minesweeper game that requires observation, and it is an HTML5 puzzle game tagged with Minesweeper and Roguelike [Daniel Benmergui - Dragonsweeper, itch.io]. Rather than directly copying that idea, this project expanded it by connecting Minesweeper-style rules with RPG battles and character progression.

en-background
Background and Goal

Key Features

  1. Dungeon Exploration

    Progress through the dungeon by revealing tiles hidden in darkness

  2. Number Hints

    Display the number of nearby monsters so the player can decide their next move

  3. Monster Battles

    When a monster tile is revealed, process the battle result based on the character’s stats

  4. Keys and Gates

    Obtain a key and open the gate to move to the next stage

  5. Character Progression

    Grow character stats and progression status through battles and rewards

  6. Login and Data Storage

    Manage each user’s progress status, currency, and character information

  7. In-App Purchases

    Apply a consumable currency purchase structure through crystal products

  8. In-App Ads

    Experiment with an ad-based revenue model for a free app using Google AdMob, with a reward flow that grants additional HP after watching an ad

Development

Setting the Development Goals

The development goal of "Illuminate the Dark Dungeon" was to build a Minesweeper-based RPG puzzle game with Flutter, release it on Android and iOS, and implement a mobile game structure that includes login, data storage, ads, and in-app purchases.

This project required more than simply implementing game logic. It also had to handle user identification and progress data management. Since character progression, owned currency, stage progress, ad rewards, and in-app purchase products were all connected, the game needed a structure that could reliably manage each user’s play history and purchase rewards.

Data integrity was especially important in order to experiment with monetization through in-app purchases. Purchased currency had to be granted correctly, and each user’s progress and owned currency had to remain consistent. For that reason, I decided to implement account-based user identification as part of the project.

For login, I wanted to provide Google login and Apple login using Supabase Auth’s Social Login (OAuth), as well as Anonymous Sign-Ins for users who wanted to start immediately without an account.

The development goals for this project also included an experiment in fully controlled Cursor-based vibe coding. I personally determined the overall project structure, code placement, and feature-level design, while limiting the AI tool to the role of a coder that writes code within the predefined structure. When requesting features, I gave specific instructions about which code files should implement which functionality and content, and I directly modified small parts when the result was not satisfactory.

en-concept
Illuminate the Dark Dungeon

System Architecture

"Illuminate the Dark Dungeon" was structured as a mobile game app based on Minesweeper-style rules, where players reveal dungeon tiles, check surrounding information, find a key, and then move to the next stage through a gate. When the player selects a tile, the app checks the current dungeon state and shows information based on the number of nearby monsters and nearby object hints so the player can decide the next action.

Game progress centers on the state of the dungeon board. Each tile contains information for one of the following: monster, treasure chest, key, gate, or empty tile. Whenever the player reveals a tile, the flow branches into number display, hint display, battle, reward acquisition, key acquisition, or gate movement.

Component Role
Dungeon Board Places hidden tiles for each stage and manages monster, treasure chest, key, gate, and empty tile information
Surrounding Information Calculation Calculates the number of monsters around the selected tile and displays whether nearby treasure chests, keys, or gates exist as hints
Tile Selection Handling Branches the next flow depending on whether the tile opened by the player is empty, a monster, a treasure chest, a key, or a gate
Battle Handling Calculates battle results based on the character’s and monster’s stats when a monster tile is opened
Keys and Gates Checks whether a key has been obtained and handles whether the player can move to the next stage when a gate tile is opened
Character Progression Connects battle rewards and currency to character progression, stat enhancement, and character purchase flows
Currency and Hearts Manages gold, crystals, heart usage and recovery, revives, and shop purchase flows
In-App Purchase Handling Sells digital products such as crystals through real user payments and grants the purchased product as in-game currency after payment completion
User Progress Information Stores each user’s character, currency, hearts, and stage progress so they can continue playing later
Reward Flow Reflects rewards generated both inside and outside the game, such as ad views, product purchases, and battle rewards, into the game state
Ad Module Displays Google AdMob ads inside the app
Localization Resources Manages app text for each supported language

en-system-architecture
System Architecture Diagram

Core Implementation Flow

en-step
Implementation Flow

Login and User Data Management

In this project, I implemented login and data management together in order to store each user’s progress. This was necessary because the game needed to distinguish users in order to reliably manage stage progress, owned currency, and character growth information.

I built the foundation for guest login and social login using Supabase Auth, and created a structure that manages game progress data based on the logged-in user [Supabase - Auth]. Through this process, I confirmed that user identification and data storage design are more important in this type of project than in a purely local game.

Implementing Minesweeper-Based Dungeon Rules

"Illuminate the Dark Dungeon" was designed around a structure similar to Minesweeper: players reveal hidden tiles and decide their next action based on surrounding information. When the player selects a tile, the flow branches depending on whether that tile is empty, a monster, a treasure chest, a key, or a gate.

When an empty tile is opened, the game displays the number of monsters in the surrounding nine directions. I also added object hints that indicate whether a treasure chest, key, or gate exists nearby, so the player can infer both rewards and progression goals rather than simply avoiding monsters.

The goal of a stage was not to open every tile, but to find the key inside the dungeon and move to the next stage through the gate. This expanded Minesweeper’s inference rules into a dungeon exploration and stage progression structure.

Implementing Stat-Based Battle Logic

Monster tiles were designed not merely as obstacles to avoid, but as risk elements that can provide experience and currency through battle. Characters and monsters were given attack, defense, speed, and HP stats, and when a monster tile is opened, the battle result is calculated based on those stats.

Battles proceed with the character and monster attacking each other. Damage is primarily calculated based on attack and defense, while differences in speed can trigger attack and defense adjustments, evasion, or critical hits. This makes the battle outcome vary depending on the character’s current state, even against the same monster.

If the player wins a battle, they gain experience and currency. If the character’s HP reaches 0, the run ends. However, I allowed one revive using either crystals or a rewarded ad, so battle results would connect to character progression and currency usage flows.

en-screenshot-basic
Play screen

Implementing Character Progression and a Repeat-Play Structure

To encourage sustained play, I structured battle rewards so they lead into character progression. Players earn experience and currency through battles, then use them to grow characters or purchase new characters.

Character progression was not simply a level-up feature; it was designed to give players a reason to challenge higher stages. Rewards gained from battle were connected to character stat enhancement, while gold and crystals could be used for character purchases and some progression elements.

Through this structure, I aimed to create a loop in which players repeatedly explore dungeons, collect rewards, strengthen characters, and then challenge higher stages again.

en-screenshot-stat
Character stats screen

Implementing the Shop and In-App Purchase Flow

The shop was implemented as a structure that connects crystals, hearts, revives, and character progression elements. Users can purchase digital products such as crystals through real payments, and purchased crystals are granted as in-game currency.

Crystals can be used for heart refills, reducing heart refill time, revives, character purchases, and progression elements. In addition, when the character’s HP reaches 0, using crystals revives the character with full HP, while watching a rewarded ad revives the character with half HP. This connects paid currency and ad rewards within the same flow.

During this process, I applied both Google Play Billing and Apple In-App Purchase. Rather than ending with product registration, I implemented the full flow of checking payment completion and reflecting the purchased digital product in user data.

en-screenshot-store
Store screen

Applying Ads and In-App Purchases

Since the game was released as a free game, I applied both rewarded ads and in-app purchases. Users can watch ads to receive rewards, and they can purchase in-game currency such as crystals through in-app purchases.

On Android, I implemented the payment structure based on Google Play Billing, and on iOS, based on Apple In-App Purchase [Android Developers - Google Play Billing Library integration] [Apple Developer - In-App Purchase types]. Products such as crystals, which disappear when used and can be purchased again, were designed according to a consumable product structure.

Vibe Coding Approach

In this project, I wanted to apply Cursor-based vibe coding in a more controlled way than before. I personally determined the overall project structure, code placement, and feature-level design direction, and limited AI to the role of writing code within the defined scope.

When requesting work, I did not simply ask the AI to implement a feature. Instead, I specified the files to modify, the code to connect, and the behavior the result needed to satisfy. I also directly fixed small changes or unsatisfactory results so that AI would not disturb the overall project structure.

This approach was more advantageous than before for understanding and maintaining the code structure. However, because I had to divide tasks into small units and continuously review the results, the development speed did not improve as much as expected. For features I was trying for the first time, such as login, it was difficult to define the structure clearly enough in advance, and I eventually had to understand the entire flow again and make large-scale modifications.

As the project grew, the number of code files and the connections between features increased. Even when I gave instructions at the same level of detail, there were once again many cases where AI could not implement the requested requirements correctly in a single attempt. As a result, controlled vibe coding improved code quality and maintainability, but still had clear limitations in complex feature implementation and development speed.

Responding to App Store Review Issues

The Google Play Store release took longer than expected. Google Play requires new personal developer accounts to run a closed test before production release, and it states that at least 12 testers must participate continuously for 14 days before a production application can be submitted [Google Play Console Help - App testing requirements for new personal developer accounts]. This requirement delayed the Google Play release, so the app was released on the Apple App Store first.

The issue occurred later during Google Play’s production review. Google Play’s impersonation policy explains that app names, icons, descriptions, and in-app elements that could mislead users about a relationship with another app or developer are not allowed [Google Play Console Help - Impersonation]. Its intellectual property policy also states that apps that infringe others’ copyrights, trademarks, or other rights are not allowed, and proof of rights may be required in some cases [Google Play Console Help - Intellectual Property].

In this project, I did not use another person’s app name, images, resources, or descriptions. However, at the time of Google Play review, the App Store version that I had released first was already public, and when searched, the only similar-looking target was that App Store version. I therefore judged that the previously released same app may have been mistaken for a separate app or another person’s app during the Google Play review process.

At first, I aligned the app name, copyright notice, developer information, and email between the App Store and Google Play, and submitted the App Store Connect management screen, access video, business registration proof, and identity verification materials. However, this alone did not resolve the issue. Eventually, I prepared and submitted a separate rights verification document explaining that the app released first on the App Store was also the same app I had created, and that the Google Play release was being conducted by the same rights holder. Only after that was I able to proceed with the Google Play resubmission.

en-authorization
Affidavit of Identity and Authorization

Store Release

en-store
[Left Image]: Appearance on Google Play Store, [Right Image]: Appearance on Apple App Store

Achievements

  1. Monetization experiment through paid crystal product purchases

    Failure
  2. Implementation of a service-based game structure including login, user data, and currency management

    Success
  3. A game that creates sustained users

    Failure
  4. Application of a controlled vibe coding approach that uses AI as a limited implementation assistant

    Success

This project went beyond a simple puzzle app and implemented a mobile game structure that included login, user data storage, ads, and in-app purchases. I worked toward releasing it on both Android and iOS, and gained experience connecting authentication, data, and monetization features together in a Flutter-based game app.

The in-app purchase feature itself was implemented and store products were applied, but it did not lead to actual purchases. Crystals were designed for use in revives, heart refills, character progression, and other areas, but because there were almost no users who played continuously, there was also no motivation to purchase paid currency.

In this project, I succeeded in implementing login, data management, and payment features, but failed to create sustained users, which was the prerequisite for monetization.

Lessons Learned from the Project

First, this project showed me that implementing simple game logic and implementing a service-based mobile game are different things. Beyond creating Minesweeper-based battle rules, connecting login, data storage, ads, and payments greatly expanded the app structure and testing scope.

Second, I learned that adding many features is not enough to create sustained users. Even if battles, progression, currency, ads, and payments are all connected, if the core game loop that gives users a reason to keep playing is weak, it is difficult to turn the app into sustained use.

Third, controlled vibe coding also had limitations. Even when I designed the overall structure and code placement myself, it was difficult to give sufficiently clear instructions for features I was trying for the first time, which eventually required large-scale revisions. Also, as the project grew and the number of code files and inter-feature connections increased, AI often failed to implement requirements accurately in one attempt even under a controlled workflow.

Fourth, I learned important lessons from the release process as well. Mobile app release does not end with feature implementation and build submission. In particular, when releasing sequentially across multiple stores, the same app released first on one store may be misunderstood during another store’s review process. After this experience, I concluded that even if one store’s review is approved first, it may be safer not to release immediately and instead align the release timing of the Google Play Store and Apple App Store as closely as possible.

Get in Touch

Contact Me