Noctivine·a card-battle roguelite
A C# card-battle roguelite that took first place in one category of the vote among first-year game teams at NHL Stenden. I was Scrum Master of the team of four and wrote the turn loop, the fire, ice and heal cards and the procedural route map.
| Genre | turn-based card battler on a procedurally generated route map |
| Stack | C#, .NET 8, WPF, no game engine |
| Team | four first-year students, I was Scrum Master |
| My code | async turn loop, fire, ice and heal cards, route-map generator, main menu, sound, persisted settings |
| Built | code written 6 to 31 October 2025, first term of HBO-ICT |
| Project grade | 9.4 out of 10 for the project part of module 1.1 Game Interaction |
| Result | first place in one category of the vote among first-year game teams at NHL Stenden |
Noctivine is a turn-based card-battle roguelite for Windows, written in C# on .NET 8 and WPF without a game engine. In each fight the player plays one card a turn from a hand of five against a shadow monster, and a procedurally generated route map leads through the fights to a boss. Four of us built it in the first term of HBO-ICT at NHL Stenden. Besides running the team as Scrum Master, I wrote the async turn loop, the fire, ice and heal cards, the map generator, the main menu and the sound.
A jungle and a plan, September 2025
The setting came out of a creativity workshop, where we were handed three random flashcards, Warzone, Hospital and Jungle, and the jungle stuck. Shadow monsters have drained the colour from the jungle, and every won fight floods the arena with light for a moment.
I created the team’s GitHub repository on 15 September, and the same day the four of us drew up the first plan together in one shared diagram. It had a hub world, a weapon and nine cards for each of the four classes, special events on the world map, fights against three enemies with a hand of three cards, and new cards or runes after every win. The classes, the map, the boss and the endless mode made it into the game.
The same evening I made the title art: an image-model render of the jungle and its heroes, with the title set over it in Photoshop.
Sprints and scope, September to October 2025
We ran three-week sprints with daily stand-ups and a retrospective after each one. The team wanted a coin economy, shops on the map, more enemy types and complex boss fights; our client, a teacher acting as Product Owner, put a stable core loop first in the weekly meetings. As Scrum Master I steered the scope to match: we cut the economy, the shops and the complex bosses and spent the time on combat, movement and the look of the jungle.
The menu, October 2025
For the main menu I used the 6-to-1 method: six quick sketches, scored on usability, originality and visual appeal. Sketch 5, a hero in a stone portal between two arrows, was the only one to score high on all three. On 14 October I built it in WPF with a two-class carousel (warrior and archer). The mage and the druid followed on 21 October, each with a backstory in the right-hand panel.
More than ten students and teachers, aged 18 to 50, played the game in the study area at NHL Stenden, and we explained nothing unless someone got stuck. They switched classes and found the Cards, Settings and Credits buttons without help. The mage was picked most, a class testers knew from other games, and the druid second: testers found her sprite the most detailed, and she is the only female hero of the four. One tester pressed Space to start the game, which did nothing, so on 26 October I bound Enter to Start Game.
Combat and cards, October 2025
A teammate built the first WPF prototype on 6 October and, over the next week, the battle screen with the base card system; he later added the card artwork. Another teammate built a first route map as a separate window, and the third made a simple settings screen, which I extended into the one the game uses. From 14 October I wrote the game logic on top of that base, first the turns of the warrior and the archer. On 26 October I added the attacks of the mage and the druid and the heal, fire and ice cards; until then every card was an attack.
The first battle screen polled the turn flags from a 20 ms DispatcherTimer and ran the monster’s whole turn inside the timer tick. On 27 October I replaced it with an awaited sequence that the Ok button starts after each card: the monster’s attack, the burn damage, then the check for a win. The same commit marshalled every MediaPlayer call onto the UI thread, so sounds can start from background tasks. The shield, the shattering ice and a pity rule on the draw followed on 28 October.
The rules as submitted: the player holds five cards, plays one a turn and draws a replacement, and after each card the monster attacks unless it is frozen. A monster has 15, 20 or 25 HP; the player starts on 25, the cap, and heals 5 after each win. Attack cards deal 1 to 9 damage and make up 70% of draws. Fire, ice and heal come up 10% each, and after four attack cards in a row the next draw is always one of the three. Fire hits for 1 to 5 and leaves a burn of 1 to 3 damage for 1 to 3 turns, and burns stack. Ice hits for 1 to 5 and freezes the monster 70% of the time: it skips its attacks until the next hit shatters the ice, and every burn on it goes out. Heal restores 1 to 9 HP and, half the time, raises a shield that absorbs the next attack completely. The monster hits back for 1 to 5, or 6 to 9 on the 30% of attacks that land hard.
The procedural route map, 29 October 2025
On 29 October I rebuilt the route map inside the game window and made it procedural. The node clicks, the walking token and the visited marking came from my teammate’s map window, which had a fixed, hand-placed graph. The generator lays out four columns of one to three nodes between the start and the boss, links each node to one or two in the next column at random, then runs a second pass that connects every node still unreachable to the column before it. Paths out of the current node light up in the class colour.
After every won fight the map fades in and the player picks the next node. The opening fight and four map fights lead to the boss, a 30 HP version of the shadow monster that drops in from above. Beating it generates a fresh map, so a run lasts until the player dies.
Player tests and the result
The test sessions on the full run showed that the core loop needed little explanation. Some players wanted to play their next card straight away instead of pressing Ok, and everyone was used to the turn order after a few rounds. For many, the five fights before the boss set a clear goal: beat at least one boss.
The same sessions found the weak spots. The boss is a tougher monster with no reward, route choices change nothing, and the classes differ only in sprite and attack animation: the warrior lunges, the other three fire an arrow or an orb. Most players skipped the longer texts, such as the class backstories, and learned the cards by playing them.
The last commit, on 31 October, added a guard that stops fast clicking from playing several cards in one turn. At the end of the term, NHL Stenden held a competition among the first-year game teams from several classes: the teams toured each other’s games and voted in several categories, and Noctivine took first place in one of them. The project part of the module was graded 9.4 out of 10.