PICOhaven is a tactical card-based dungeon crawler / light solo RPG for PICO-8, inspired by the board game Gloomhaven. It adopts a modified & simplified version of the mechanics used in that game, to fit within constraints of the PICO-8 environment (code size, resolution, etc), and to streamline solo play.
The story includes 16 playable scenarios (some are optional side quests), 8 levels of ability upgrade choices, and multiple items that also affect gameplay.
Note: This is just a free, solo-fan-made project and has no affiliation with Gloomhaven. If you like this type of game I recommend checking out Gloomhaven (and its official video game adaptation) for a game with a lot of tactical depth from multi-character cooperative play!
Play PICOhaven here: (desktop or mobile)
Quick Gameplay Overview
(for those who like to jump straight in and figure it out as you go)
- Use the arrow keys and the 🅾️ button ('Z' if using a keyboard) to explore, select cards, and fight.
- The other button occasionally used is ❎ ('X' on a keyboard) to cancel/undo.
- Defeat all enemies to advance the story and unlock new scenarios, as well as upgrades to your ability and modifier decks.
- You are 'exhausted' and fail a scenario if you take too much damage, or if your deck runs out of cards (each time you've played all the cards in your deck you reshuffle them, but a random card is 'burned' and not available for the rest of the scenario).
- If you would take fatal damage but have cards in hand, you will instead 'burn' a random card to block the damage, but beware: this shrinks your deck so you'll have limited turns left to win the scenario before becoming exhausted.
- The game should automatically save your progress after each scenario, success or failure, allowing you to come back to it later on the same device (you can retry the same scenario multiple times and earn XP even on failure).
- If you're not sure what happened in combat because a lot of text scrolled by quickly, at the end of any round you can press ❎ to scroll back through the message log.
- Let me know what you think, and if you run into any issues or questions...
How-To-Play, with screenshots
PICOhaven is a tactical turn-based dungeon crawler / light RPG. You win each scenario and unlock new ones by defeating all enemies in all rooms (unless otherwise specified) before you are exhausted.
PICOhaven is card-based in that at the beginning of each round, you choose two action cards you'll use. These include Movement, Attacks, and other actions:
After you select your cards, enemies will draw random action cards, and you will see an overview of what each character will do that round (the white numbers indicate the initiative: characters with lower numbers will act earlier).
When it is your turn, you get to play these two actions (in either order)... or instead use either of them as a default "move 2" or "attack 2" action if that's more useful.
At the end of the round, you discard those two action cards, and will have to choose different actions the next turn. When you've played through your entire deck, you will automatically 'short rest': you redraw your discard pile but randomly burn one of those cards, meaning you can no longer use it during this scenario. This means you have a finite number of rounds of play before your deck runs out of cards. Some more powerful cards are burned rather than discarded when you play them, so they can only be used once per scenario.
You become exhausted and lose a scenario if you either run out of health (HP), or if you run out of cards in your deck.
At the end of each scenario (success or failure), you return to town and all of your cards, HP, and items are restored, in preparation for your next adventure-- you can try any scenario as many times as needed. The game should automatically save your progress each time you return to town and allow you to return to it later (on the same device/browser-- data is saved locally).
See the next section for some additional details...
More Details on How-To-Play
You will discover additional details, special cards, powers, items, and rules by playing, but a few other notable rules:
You open a door by ending your movement on it. Monsters revealed in the next room will not act until the next round.
- Your initiative in each round (how early or late you act relative to the monsters) is set by the initiative value of the first of the two cards you selected before the round (shown in a circle in the upper right corner of the card in the card-selection screen):
So even once you know what two cards you want to play this round, by choosing which card you select first in that 'choose cards' view, you can choose whether you will act earlier or later in the round. When your turn comes in the round, you can still choose to play those cards (or the default move 2 / attack 2 actions) in any order.
A "burn when used" card is only burned if you actually play it. If you select it as one of your two cards for the round, but when your turn comes you use a default Move 2 / Attack 2 action instead of playing it, that card is only discarded, and you'll have another chance to use it the next time you redraw your hand.
You collect treasure or coins by ending the turn on them (or by using certain cards or items). You do not need to collect treasure (and rarely will have enough time to collect all of it without running out of cards and failing a scenario), but it will eventually allow you to buy items that enhance your powers. Note that once you defeat the last enemy in a scenario (or achieve some other special scenario objective) the scenario is over and you return to town, so if you want to pick up treasure you have to do it before completing the scenario... that may not make sense fantasy-dungeon thematically :), but the game's balanced around only being able to afford a few items over the course of the entire campaign.
- Whenever you attack, you draw a random modifier card from your deck of modifiers which is applied to the damage from your attack card. Most modifiers are -1, +0, or +1, but there are some that are larger, including a "*2" and a "/2". When you first get to town, try "View Profile" to see your current modifier deck. You'll have opportunities to upgrade this deck over the course of the campaign, whether that's by removing negative modifiers or adding additional positive modifier cards.
Enemies do not have modifier decks and always do the damage shown on their card for the round.
If you would take damage that would reduce you to 0hp, you will instead randomly burn a card from your deck to negate that damage, though this reduces the number of rounds you have until you are exhausted by running out of cards. If you have no cards in your hand (i.e. all of them are already discarded or burned) when you are reduced to 0hp, you cannot burn a card and are exhausted as above.
There are a few special conditions that attacks (yours or monsters) can apply, including stun and wound. Stun makes the recipient skip their next turn. Wound makes the recipient lose 1HP at the end of every round (until healed).
- Some monsters, actions, and items may provide a Shield, which negates the first N points of damage from every attack.
Strategy Tips (minor spoilers)
Look at upcoming enemy actions for the turn and try to avoid taking unnecessary damage. While you are a warrior, a few mighty blows can bring you to your knees, and healing is in short supply. Winning many scenarios involves more tactical positioning than 'tanking' damage.
Don't be afraid to fail a scenario-- you gain some small amount of XP for the actions you take during a scenario, and you keep any gold you collected even if you fail, and you can try again.
Sometimes it's advantageous to choose a slow initiative, to let yourself react to monster actions or let a monster move closer so you can dart in and attack it without getting counterattacked. Remember that you can use the default Attack 2 / Move 2 actions, so you can select a slow-initiative card such as "Loot 1" as your first card, to use its slow initiative... but then when your turn comes, play it as a Move 2 or Attack 2 instead.
Using too many "burn when used" cards early in the scenario will reduce the number of turns you have until you are exhausted by running out of cards-- you may want to save them for important moments (by using them as Move 2 / Attack 2 defaults the first time through your deck).
Collecting treasure can help you buy items, but is not required-- if you spend too many turns doing that you'll run out of cards before you can complete the scenario...
There are 16 playable scenarios, though about one third of them are optional 'side quests'.
You do not need to use the 'long rest' action-- you will automatically 'short rest' to redraw cards each round. The 'long rest' can be useful when you critically need healing, an item refresh (for a few specific items), or access to a specific card quickly, but it uses up a turn and burns a card so there's a cost to it...
'Long rest' is the one action you can still perform while stunned.
- Add your own Q&A in the comments below!
- v0 (July 2021): concept and screen mockups (no code)
- v0.1 (Aug): first playable prototype of concept
- v0.2 (Sep): add story, enemies, music, special actions, items, iterate on game
- v0.9 (Oct 12): feature-and-content complete? release to a few playtesters
- v1.0 (Oct 20): integrate first feedback, improve enemy pathfinding, first public release on BBS!
- v1.0b: add more tutorial-related messages, improve hand selection UI
- v1.0d (Oct 28): based on feedback, add more tutorial-related messages, "undo" for move/attacks before confirmed, screen shake on "*2" modifier, and refactor to free up tokens for these.
- v1.0f (Dec 9): add a few more tutorial-ish notes during the early levels (initiative + dmg mods)
- v1.1a (Aug 2022): under-the-hood revisions to free up tokens (PICO8 custom fonts, linting, etc) and add some more tutorial messages during the early levels. mostly a cleanup to prepare for a "Chapter 2" some day...
General Experiences + Learning
I've just played around with small games (mostly tweetcarts) in PICO-8 previously, so this was a good opportunity to learn more about the platform and Lua, experiment, and plan something larger out.
I ran into platform limits many times and had to step back and simplify or find a more efficient way to structure code and data to free up "just the 100 more tokens I need"... but I found this resource optimization a fun challenge. And frankly, if I hadn't been working within the PICO-8 resource constraints I might never have released anything-- in the absence of external deadlines it's useful to have some constraints that keep scope in check.
ipairs(), foreach(), and especially P8SCII were new to me and useful for both saving tokens and making it easier to think about code. Amusingly, I implemented my own subset of P8SCII in a mixed-font-and-sprites print routine, but misunderstood its API so I implemented something that behaves differently. To clean up some day...
Using nested calls to split to convert long strings into 2d-4d arrays of key-value game data was essential (I eventually maintained a separate spreadsheet of level/card/enemy/upgrade data that was easier to edit and which compiled all the values together into these long "database strings" which I would copy and paste into the code).
I built a simple "dev support cart" using poke+cstore to move some game data (long story text strings) into unused sprite/sfx cart space, even without enough tokens to include data compression routines or use something like PX9.
This is the first project I didn't develop primarily in the PICO-8 editor-- I used VScode to edit one monolithic .lua file that was #included in a .p8 cart that held all the sprite/map/sfx data. I usually developed with two editor panes open side by side-- one focused on whatever I was working on, and the other to search/scroll through the code for related functions / variables / context.
Debugging unexpected pathfinding behavior (even with the benefit of someone else's A* code, see note below) and figuring out what behavior I wanted when enemies were clustered around chokepoints was delightfully frustrating. This is the one area I ended up building a completely separate test cart I could populate with enemies and obstacles, just to visualize multiple pathfinding approaches.
The source code available in the cart above has comments and whitespace stripped because I was running into Compressed Size limits. I have a fully-commented version of the source code I'll plan to clean up and upload somewhere in the future...
- Like many games, I had to strike a balance between 'building an engine' (which could lead to unnecessary generality and resource use not needed for this game) and hard-coding behaviors that make sense for a specific enemy/item/card. I think I kept it general enough to make a "Chapter 2" some day with new characters/abilities/items/enemies.
- Thanks to SH, SF, and DW for playtesting and feedback.
- Thanks HB for support and sfx feedback.
- I adapted morgan3d's A* pathfinding routine for parts of enemy movement
- I watched some of the LazyDevAcademy "developing a roguelike" videos in the past and they were educational, even if this isn't a roguelike (I used their example of actor.ox/actor.sox + animation timer for animating sprite motions between player input cycles).
- Thanks @thisismypassport for the "Shrinko-8" minifaction tool, which I used to free up some space for additional tutorial messages and text
I got some good 1:1 feedback from playtesters and updated the cart to add more 'tutorial' style messages (these disappear after the first few levels to reduce the volume of messages), as well as other UI updates and undo/confirm options in a few key places.
The game is still not fully self-explanatory due to size limits (unless I can free up some more tokens), especially when it comes to some of the later upgrades... so if you play it and find it confusing, I recommend reading the "how to play" and tips hidden behind spoiler tags in the post above or leaving questions here. Have fun!
I've also now uploaded commented-in-more-detail source code to https://github.com/icegoat9/picohaven, including some notes-to-self I put together during development to remember how the different game states connected, what all the sprite flags meant, what global variables I was using, and so on.
This is partly just for myself to remember in the future since this was my first major PICO-8 project and I learned a lot about what workflow works for me, but I figured I might as well make the repo public in case others learning PICO-8 or working on similar types of games find it useful in the future.
Wow, you did a fantastic job on this. It helps that I already know how GloomHaven works; I suspect someone new to it might need some more explanation for the different systems, but what's here is really impressive and captures the feel of the larger game in a way that's streamlined and quick. Well done.
Thanks, @nephilim! Agreed-- the gloomhaven-style "select 2 cards for a turn" + default actions + discarded vs. burned cards concepts are complicated and take some time to grok if you haven't seen them before (and it takes a while to figure out strategy for how to select cards and initiative).
I wasn't able to fit a full tutorial into the game and had to settle for some screenshot-type how-to outside it, so it's not as accessible as it could be. So I'm happy whenever there are even a small number of players who get it and enjoy it!
Well you certainly succeeded with it. I played it all through my lunch hour today, and it was great fun. Indeed, I think I prefer PicoHaven to GloomHaven. Having only one character means no waiting for turns. The maps are nice and small. Plays fast but still feels strategic. No "bookkeeping" to do. Feels zippy. Really enjoying it!
@dw817 there’s not as much tutorial as there should be— when you defeat a monster it drops treasure. But if there’s a door in the room you have to use cards to go to it (the level ends when you defeat all monsters in all rooms). In an earlier version I had the next door flash during the first level as a tip. Also, if you want to pick up treasure along the way you have to end a turn on it.
Maybe some day especially if people are interested :)... I have a new character and loose story sketched out for a Part 2, but I also maxed out token and compressed size limits, so I'd need to take a step back and figure out how to rewrite a chunk of the code or cut some existing features to free up enough space for some new card mechanics.
Maybe rewriting the icon system to use the newer PICO-8 "custom fonts" mode would help, or maybe if I took out all the tutorial style tips/hints and called Part 2 advanced, "play Part 1 first to learn how to play"...
I've released a v1.1. Mostly this is under the hood changes (using PICO-8's newer custom font functionality for the multicolor icons to save tokens, a step toward being ready to write a Chapter 2 in the future), but I also added more tutorial prompts and hints about concepts like "initiative" that were confusing-- these just show up during the first few levels.
It's still a complex game that may benefit from either reading the tutorial text in the post or having some familiarity with gloomhaven, though.
[Please log in to post a comment]