← Back to projects
arthur@portfolio: ~/dungeon
Solo Personal 2026

A turn-based ASCII dungeon crawler hidden inside this portfolio.
You fight the characters locked inside it, one game per room.

arthur@portfolio:~/dungeon$ cat -n intentions.txt

I wanted to gamify the portfolio a bit. Reward the people who poke around, hide a few winks for them. It turned into the piece I care about most.

The challenge I set myself was to build a real little game inside the site, not a prototype I would abandon halfway. Progression, balance, a boss fight, and a few things you only catch on a second run.

I hit my own limits in JavaScript and CSS pretty fast, so I used Claude for the programming. I wrote the GDD first: intentions, rough diagrams, the whole gameplay. There was never anything left for it to decide.

Working alone means there is nobody else to blame. If the combat is boring, that one is on me.

It is also for the players who, like me, dig around in the corners of a game looking for whatever the developer left there on purpose. If you got this far, I already want to work with you.

arthur@portfolio:~/dungeon$ man dungeon
> ls systems/

There is no tutorial popup anywhere. Pango, the first enemy, misses half his attacks, which leaves you enough room to try the buttons and see what they do without dying for it. After that, one new thing per room, and nothing in the game that is there just to look clever.

Five verbs drive every combat encounter, and you start with four. The spell stays greyed out until you spend your first SP on the GDD.

  • Attack 4 to 7 damage on a fresh run. No cost, no cooldown.
  • Spell 8 to 15 damage for 8 MP, down to 3 MP as the GDD levels up. The only action that can run out.
  • Defend Halves the next hit and gives back 3 MP. It is also the only thing that clears TV Head's fear.
  • Inspect Prints the enemy's HP, damage range and drops, and marks a weak point worth 20% on your next strike. One enemy makes you pay for using it.
  • Use Item Health potion, mana potion, scroll of stun. It does not cost you the turn.

SP and the review multiplier. Enemies drop SP when they die, and you spend it between runs: relic levels, or a permanent multiplier on everything you earn after that. Your first run is the hardest one you will ever play. Save a profile and the multiplier is still there a week later. I wanted it to reward coming back, not grinding it out in one sitting.

Gear, or rather the eight relics. Eight slots, eight relics, every one of them picked up somewhere else on the site. None of them can be found in the dungeon.

They are also what opens the door: the key only appears once you are holding all eight, so nobody ever gets in underequipped. Everyone descends with a full loadout. The gear is a receipt more than a reward: it says you went through the site before you got here. What I like is the delay. You hover five project cards on the home page and forget about it, then twenty minutes later a headset is sitting in your inventory.

  • Head Noise-Cancelling Headset Hovered 5 project cards
  • Body Dev Hoodie Hovered every project
  • Hands Producer's Watch Waved back
  • Feet Sprint Shoes Visited 3 project pages
  • Weapon Scope Cutter Entered the Konami code
  • Offhand The GDD Opened 4 sections on one project page
  • Light Vision Holder Opened any project section
  • Potion Shipping Ale Spent 30 seconds on the Naheulbeuk page

Saving. A run lives in sessionStorage, so closing the tab wipes it. That one is on purpose: this is an easter egg, and I did not want to write anything permanent into someone's browser just because they clicked a key in a footer. If you want to keep your progress there is an action in the game that creates a real profile.

Infinite mode. Opens after your first clear. The rooms loop with a random enemy pool and difficulty that keeps climbing. Once you have a profile, your best wave is kept between sessions.

> ls roster/

Every enemy comes from a project. I ordered the rooms by pacing, and the chronology mostly followed on its own: the run climbs through the years, with two rooms out of order because the pacing wanted them there.

Room Enemy Project Identity
01 Pango Pango Build Park · 2017 Implicit tutorial. Misses 50% of turns. Shares a snack at low HP.
02 The Bot Magibot · 2017 Standard combat. No special mechanic.
03 Chaos Archer Catch The Dragon · 2019 Standard combat. No special mechanic.
04 The A.I Mission NAR-6 · 2021 Telegraphs every attack. Announces intent one turn before executing. Can overclock, glitch, or strike 2×.
05 The Sorcerer Rune Tales: The Citadel · 2020 Standard combat. No special mechanic.
06 Lug Rune Tales: Underground · 2021 Standard combat. No special mechanic.
07 Dummizz Gang of Dummizz · 2021 Standard combat. No special mechanic.
08 TV Head Darkensum · 2023 Punishes Inspect. Each use adds +2 to his damage range, and from two stacks on your attacks can freeze outright: 25%, then 40%, then 60%. Defend clears it for one action.
09 Jolly Jolly Island · 2022 Standard combat. No special mechanic.
10 Abyssa Naheulbeuk · 2023–2026 RAGE climbs on her turn, and what she does climbs with it. A sixth verb shows up for her alone: Compliment, which drops RAGE by 3 half the time and raises it by 1 the other half.
11 Dark [YOU] Portfolio Dungeon Boss. Form chosen by the player at the Mirror Room. See below.

Four of them carry the run. Pango teaches you the buttons without saying so. The A.I starts announcing what it is about to do. TV Head takes Inspect, which had been free until then, and makes it cost. Abyssa needs everything at once. The six rooms in between are there to let the pressure drop before the next one.

Beware the Cube is the only project without an enemy. It got cut during the design pass and never made it back in.

> ./dark_[you]

The Mirror Room sits between room 10 and the boss. In the first build the game picked Dark [You]'s form for you, reading how you had been fighting up to then. It looked good written down. In practice nobody understood why they were facing that particular version of themselves.

So I turned it around. You walk in, four forms on a screen, you pick one. The game still reads your combat log and marks one of them as its recommendation, but the choice is yours. Take it and you get a title tied to the form. Ignore it and you get THE CONTRARIAN.

THE THEORIST
110 HP  ·  10–20 dmg
Lightest pool, highest variance.
Style trigger
4+ spells
Title
THE PRAGMATIST
THE ANALYST
120 HP  ·  11–18 dmg
Consistent pressure. Mid-range on both stats.
Style trigger
3+ inspects
Title
THE DECIDER
THE BRUTE
140 HP  ·  12–22 dmg
Hits hard. Not subtle about it.
Style trigger
8+ attacks
Title
THE TACTICIAN
THE DIRECTOR
130 HP  ·  11–19 dmg
Durable. Steady damage floor.
Style trigger
mixed · balanced
Title
THE AUTEUR
> cat next_iteration.txt

The first fight still asks a lot. Pango missing half the time works for pacing, but you can get through the whole room without realising that was the tutorial. One line of dialogue on the first miss would probably close it, and it would not cost me a tutorial screen.

Damage scaling in infinite mode gets steep past wave five. Fine as a wall for completionists, but there is room to smooth the ramp for everyone else.

And I have no idea how many people who find the dungeon play more than one run. Nothing measures it. That is the number I would want first, because the whole SP economy is built on the assumption that they come back.

None of it blocks anything. The game works and it plays clean. This is just the next pass.

arthur@portfolio:~/dungeon$ credits
  • Code Vanilla JavaScript, HTML and CSS.
  • Visuals & ASCII asciiart.eu (ASCII generation and resources)  ·  ResizePixel (image editing and resizing for source sprites)
  • AI assist Claude (programming help)
arthur@portfolio:~/dungeon$