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.
Main image
Participants
Name
Organization
Role
JaeKyeong Sim
—
Developer
Period
2025-07-15 – 2026-02-28
Technologies Used
FlutterUsed to develop a mobile app that supports both Android and iOS
SupabaseSave user data and user authentication based on guest login, Google login, and Apple login
Google AdMobApplying advertisements inside the app
Links
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.
Background and Goal
Key Features
Dungeon Exploration
Progress through the dungeon by revealing tiles hidden in darkness
Number Hints
Display the number of nearby monsters so the player can decide their next move
Monster Battles
When a monster tile is revealed, process the battle result based on the character’s stats
Keys and Gates
Obtain a key and open the gate to move to the next stage
Character Progression
Grow character stats and progression status through battles and rewards
Login and Data Storage
Manage each user’s progress status, currency, and character information
In-App Purchases
Apply a consumable currency purchase structure through crystal products
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.
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
System Architecture Diagram
Core Implementation Flow
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.
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.
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.
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.
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.
Affidavit of Identity and Authorization
Store Release
[Left Image]: Appearance on Google Play Store, [Right Image]: Appearance on Apple App Store
Achievements
Monetization experiment through paid crystal product purchases
Failure
Implementation of a service-based game structure including login, user data, and currency management
Success
A game that creates sustained users
Failure
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.