After developing JP I found the Gameboy medium both restricting and rewarding. The limited memory size, the tiny amount of VRAM available and the limited color palette and tilesize make the platform so restrictive in many ways. Yet, it is those same restrictions that require a different thought process to solve problems. My friend was playing a minigame in Final Fantasy online called Triple Triad, which is a deck building game where cards battle each other based on the numbers on the card in the relative position on the board.
I really liked the idea, but wanted to create a simpler concept for the Gameboy. I decided the deck building aspects would not work on the Gameboy given the screen size and the cards ascension/descension game modes are what made Triple Triad unique. However, I thought the most base mechanics of the game were interesting and could work as a standalone concept.
I decided to create Domination, which is a player-vs-ai tic-tac-toe styled card game, where cards are placed on a 3x3 grid. Each card has a number on each side of the square. When a card is placed on the board adjacent to the other players card, if the number on the placed card is equal or greater than the adjacent card, the player takes the card. When that card is acquired, if the acquired card is adjacent to other cards on the board it can also take them, but only if the numbers are greater than those adjacent cards.
This project was much more challenging than JP as there was more compiled code in this project amount of code meant that I reached memory limits of the ROM. I also found my naivety of high-level programmer experience. Like it or loathe it, the core mechanic of this game is driven by a Pseudo-random number generator. However, since the original gameboy lacks a real-time clock its not possible to seed a random number with e.g. the current time. To resolve this, I had to implement a novel solution by Luc Van den Borre, which requests that the user presses a button twice, during that time a seed is generated based on the Divider Register (DIV_REG) which is an internal timer that increments at 16384Hz. After the user presses a button the state of the DIV_REG is stored. Then, after the second press the state of DIV_REG is captured again and is used to perform a logical OR operation on the previous state. This generates a seed that allows random number generation to be different each time the game is booted up.
View the Repository on GitHub: