Log In  
Follow
icegoat

new to pico-8 in 2020.

PICOhaven 2 (card-based tactical RPG)
by
PICOhaven - dungeon crawler / light RPG
by
"Empty Saloon" -- poker solitaire
by
[ :: Read More :: ]

Cart #kingslayers_remastered-2 | 2023-12-05 | Code ▽ | Embed ▽ | No License
21

"Unsettled with the crown, a small group sets off to take the castle by force and defend the throne as their own. Their success will depend on their tactics on the battlefield, and the cunning by which they select their allies."

Kingslayers Remastered is a small tactical RPG. The original Kingslayers was created by Justin Jaffray (@J) in 2015, the early days of PICO8! This is my "remaster" of it (with permission), adding in helpful tactical UI elements (view unit stats, movement ranges, and so on), background music, and various new units, abilities, and levels-- almost twice the game content. I also found and fixed some bugs in the original... but it's possible I've introduced new ones :)

How to Play

Arrows move the cursor, πŸ…ΎοΈ/Z selects, and ❎/X cancels

After moving, each unit can attack adjacent units, or use its special ability if relevant.

Maneuver your team to defeat the enemy, but be careful not to expose your weaker units to too many hits, as defeated units die permanently! Note that you can afford to lose some units in pursuit of the greater good-- you'll get to recruit new team members after each level.

The game has a few roguelike elements (partly randomized enemies and ally recruits each level, permadeath, and no save/load: die, learn, repeat), but there a fixed campaign of 8 levels to beat to achieve "victory" (which then unlocks a "hard mode" if you want an additional challenge...)

Development Notes

After finishing a larger tactical RPG project, I was looking to just play others' PICO8 games for a while. One of the games I came across was Kingslayers, which I enjoyed (fitting allied-unit tactical combat into a single PICO8 cart is impressive!), but realized I missed the tactical assistance that comes from "open unit information" (HP, attack damage, movement) in games such as the GBA era Fire Emblems.

I looked in the code to understand how combat math worked, and realized I could print these units stats as an overlay on my local copy of the game. Somehow that spiraled into other just-for-myself(?) UI improvements such as auto-endings turns after all units have gone and palette-swapping enemy sprites to add red to make them easier to distinguish. Then once I beat the game, I was inspired to add a few more unit types and levels until I hit the PICO8 limits. I reached out to the original author to check he was fine with me releasing this modified version, and here it is.

I'm calling this "v0.9" rather than "1.0", as this was a small-scope project over the past two weeks, and I've done only moderate amounts of playtesting (and I only partially understand the original code-- I'm not as familiar with that deeply object-oriented approach), so it's likely there are new corner case bugs I haven't found in testing. I'll fix bugs and tweak balance as I get feedback here (updates below).

Bonus note for reading this far: There is a secret way to warp reality to bypass levels, created for debugging but left in... there's one square on the map with special properties...

Release Log

v0.91 (2023-12-03): first upload
v0.92 (2023-12-03): bugfix (I hope) for crash bug, potentially related to flying units which ignore terrain trying to path-plan a route that takes them off the map...
v0.94 (2023-12-04): improve spinblade UI and flexibility, add "hard" mode (stronger enemy AI, slightly more units), make final boss immune to stun, rare bug fixes

P#138197 2023-12-03 22:37 ( Edited 2023-12-13 05:13)

[ :: Read More :: ]

PICOhaven 2 is a card-based tactical RPG / dungeon crawler inspired by my love of the board game Gloomhaven* (and less directly, of other 2D tactical turn-based games such as the GBA Fire Emblem and Into The Breach), and a sequel to PICOhaven from 2021.

It adopts a modified & simplified version of the mechanics from that board game, both to streamline solo play and to fit the platform constraints. It includes a campaign with 21 scenarios, 9 character levels with multiple upgrade paths, and various items that further modify gameplay and strategy.

*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 the Gloomhaven family of board games for a lot of fun from multi-character cooperative play!

Cart #picohaven2-8 | 2023-11-08 | Code ▽ | Embed ▽ | No License
18

How To Play

Standard PICO8 controls: arrows/dpad, πŸ…ΎοΈ (z on keyboards) for most actions, and occasionally ❎ (x on keyboards) to undo/cancel. As a general UI note: the game shows your possible actions and the relevant buttons in blue at the bottom of the screen.

The game will also automatically save your progress every time you return to town, so you can close the game / browser and come back to it later on the same device.

If you've previously played PICOhaven 1, the interface and rules are similar enough that you can jump right in!

Given the tight code size constraints, I was unable to fit a detailed step by step tutorial into the game itself, so below is a brief "game manual" for someone new to the genre:

In Picohaven 2, you explore and fight your way through a series of scenarios / levels. In most of them, you need to defeat all enemies in all rooms (end your move on a doorway or arch to reveal the next room).

You start with a deck of 11 different action cards. Unlike some games, you do not randomly draw from it. Instead, you start with all 11 cards in hand, and each round you choose two of the cards in hand to play (which are then discarded).

Each type of enemy also has a small deck of preset action cards they randomly draw from. Once the cards are chosen, the round begins and the character with the lowest initiative number on the card they selected goes first.

Each following round, you'll choose another two cards from your hand, so your choices become more limited. However, you can also use a card as a default "attack 2" or "move 2" action rather than what's printed on it, to give yourself some more flexibility.

Once you've finished enough rounds to play through your deck, you reshuffle your discarded cards and start again with a full hand of cards to choose from, with one exception: you randomly burn one card each time you reshuffle, meaning it is not available for the rest of this scenario. Because of this, you only have a finite number of rounds to win a scenario before your deck runs out of cards and you become exhausted, meaning you return to town, heal up, and prepare to try again (note that all burned cards, used items, and lost health are restored after each scenario, success or failure, and you keep any gold or experience collected even if you fail a scenario and try again).

You are also exhausted if you are reduced to 0 health, except: if you still have cards in hand, you'll burn a random card from hand to dodge that killing blow and survive for another turn. Be warned: this reduces the number of rounds you have left until your deck runs out of cards, so you can't afford to do this too many times!

A few more powerful cards are burned whenever you play them, so you can only use them once per scenario (though if you select them for your turn but use a default move 2 / attack 2 instead of playing them, they are just discarded instead of burned, and you'll have another chance to use them after your next reshuffle).

You'll see periodic (optional) treasure around the world, ranging from gold dropped by enemies to mysterious chests. You'll only collect this treasure if you make an effort to end your turn on it, or use a card with the "loot nearby squares" action-- any treasure that's not collected by the end of the scenario is lost. (Thematically, imagine there are additional cowardly enemies lurking on the edge of each skirmish: once you defeat the last enemy in a scenario, they scoop up any remaining treasure and flee):

That summarizes the core gameplay. There are many additionl details you can probably learn as you play. However, if you want to know more now (or are coming back to this later after being confused about something in the game), read on...

More Detailed How-To-Play / Tips

Info Panels

The "enemy info" on the right side of the screen typically shows the action card each enemy type has drawn for the turn, but if you move the selection cursor over a specific enemy (which you can do during the "beginning of round inspect map" phase, or when actively playing an attack), you can see the remaining health of that specific enemy.

Also note that if you are selecting cards from your hand for the turn and can't remember the map layout or how close an enemy is, you can press "X" to review the map (this is also noted in the standard action prompt at the bottom of the screen).

Conditions and Buffs

The Wound condition can be applied by certain attack cards or modifiers. It causes the afflicted character to lose 1HP at the end of every round. A "heal" action removes the wound condition in addition to healing as normal.

The Stun condition causes the afflicted character to skip their next turn. This may happen during the current round, or next round (if stun is applied to a character that's already acted this round).

If you or an enemy have the Shield condition (either innately or from playing a card), all incoming attacks have their damage reduced by that amount. This does not apply to damage sources other than attacks...

Attack Modifier Cards

Whenever you attack, you draw a random "attack modifier card" that increases or decreases the damage. This deck begins the game with a balance of + and - modifiers, most of them "-1", "+0", or "+1":

As you level-up through the game, you'll be able to remove some of these modifiers and replace them with more powerful ones that increase the values or even add conditions to them, swaying randomness in your favor and making even your initial deck of action cards more powerful...

Message Log / Damage Animations

When you attack or are attacked, a red number indicating the actual damage dealt will briefly animate between attacker and target. If the number seems different than you expect, this may be because it includes any changes from attack modifier cards drawn and any Shield the target has-- the message log below the map gives you the full information. If the message log scrolls by too quickly, note that you can scroll back through it at the end of the turn to understand what happened.

XP / Leveling Up

You gain XP for winning scenarios, as well as for killing enemies and using burned cards, even if you fail the scenario. When you accrue enough to level up, you get to swap in one of two new cards to your deck, as well as upgrade your attack modifier deck.

Long Rest action

In the card selection screen, there is also a "REST" action. You generally don't need to use this, as whenever your hand runs out of cards, you automatically reshuffle your deck and burn a random card.

But this "long rest" action gives you the benefit of choosing which card to burn to ensure you redraw an important card you need for next turn, as well as providing a bit of healing and refreshing a few specific items.

Strategy Tips

This isn't comprehensive, but a few tips if you're finding this challenging:

  • Health is a precious resource: try to position yourself so that as few enemies as possible can hit you (since you can see what each enemy will be doing this round, if you move faster than them you may be able to end your turn just out of range of them, forcing them to waste their turn). Ranged attacks are also useful here.
  • Be cautious about using too many "burn on use" cards during the first half of a scenario-- they are powerful, but also reduce the size of your deck after the reshuffle, reducing the number of turns you have to win the scenario before you run out of cards.
  • When you select your two cards from hand for the round, the one you select first sets your initiative for the round (see the cues in the UI). Going faster than enemies is often useful, but depending on your positioning you can also strategically use slow initiatives to let enemies come to you, so you can hit them and then run out of range before the next round.
  • Each enemy type has their own group of behaviors: fast vs. slow initiative, melee vs. ranged attacks, high vs. low movement, and a few have unique more dangerous abilities. You can use knowledge of them over time to prioritize which ones to tackle first or to stay away from.
  • Enemies with shield reduce all your incoming attacks by that amount. Strategies against these can include high-value attacks, or other sources of damage (which bypass shield values): traps, pushing into objects, wounds.
  • It's possible to win the game with many different "builds" in terms of cards, upgrades, and items chosen, but some scenarios will be difficult if you remove too many of the move cards from your deck!

You can share your own strategy tips or ask for help here as well...

Notes for Gloomhaven players

Picohaven should feel conceptually familiar to you: there are many common mechanics, which leads to some similar tactical trade-offs.

However, there are a number of differences from the Gloomhaven game mechanics, some made in the interest of streamlining play (some choices are automated to reduce the number of user prompts), some made because I felt they led to better single-character gameplay or balance, and some made to simplify project scope / code size. As a Gloomhaven player you may come in with assumptions about mechanics for this game, so I'll list some main differences to be aware of:

  • Cards each have only one action rather than a "top" and "bottom", though you can still use cards as a default Move 2 or Attack 2 once each per turn. This combination does make it easier to have double-move or double-attack turns, but cards and level designs are balanced around this.
  • Stun and wound are the only conditions.
  • There is no advantage/disadvantage, curse, bless, or muddle (so there's no drawback to using ranged attacks on adjacent targets).
  • You still have an attack modifier deck, but enemies do not-- their damage is always what's shown on their action card for the turn. Also, your attack modifier deck's "critical miss" is a "/2" rather than a "*0" to slightly reduce variance.
  • All pushing attacks cause damage on collision with an obstacle or another enemy (inspired by a few Cragheart cards in Gloomhaven)-- the cards explain how they work in-game.
  • You will automatically burn a card to prevent fatal damage, but it is a random card from your hand (you cannot burn discarded cards to avoid damage).
  • You will automatically short rest when you drop below two cards in hand (and cannot choose to take damage to lose a different card).
  • You can choose to long rest, but must do it before you have fewer than two cards in hand (note: you can still long rest even if stunned)
  • All items are passively used-- they either provide a passive bonus, or automatically trigger on damage or some other condition (some are one-time use and some are refreshed on long rest).
  • When you open a door, that ends your move, but revealed enemies do not act until the next round.
  • There are no battle goals, enhancements, prosperity, reputation, new character class unlocks, and so on.
  • Enemy difficulty does not automatically scale with your level (that was less important as this is a simpler, more linear, single-character campaign)
  • The enemy movement AI is different, though it still follows a deterministic algorithm where enemies try to move into range and then attack, and can move through or around their allies as needed. One notable difference: enemies do not see traps and do not try to navigate around them, to make it somewhat easier to use traps to your advantage.

Despite these differences, many key concepts and strategies from the Gloomhaven family of board games are relevant, including:

  • Managing hand size, exhaustion, use of burn cards
  • Upgrading your action and attack modifier decks over time
  • Using tactical positioning and knowledge of enemy actions to avoid incoming damage
  • Strategic use of both fast and slow initiatives
  • Direct damage (traps, push) and wound vs. shielded enemies
  • Balancing the value of collecting loot for optional item upgrades vs. the risk of failing a scenario outright if you spend too much time doing that

Thanks & Source Code

  • To the small group of fans of PICOhaven 1 who left nice comments on it on the BBS or Reddit, such as "What an insane labor of love."
  • To @nephilim, xcw, and seppo for playtesting or useful feedback on early versions of the game, which led to various UI changes and some new gameplay features
  • To @gearfo and @hwd2002 who responded to my "call for remix / reinterpretations of PICOhaven 1 music". I ended up using a variant of @gearfo's composition as the music for PICOhaven 2 (I sadly ran out of space to include a major second theme song, as I ended up using 2/3 of the SFX memory to store binary game data...)
  • And to the entire PICO8 community (on the BBS, Reddit, and Discord)-- what a helpful, supportive group

Source Code + Development Documentation

The entire game is about 1800 lines of PICO-8 flavored Lua, plus the accompanying sprite, sound, and binary data (some data such as the story text is compressed and packed into unused nooks and crannies of the graphics and sound memory, for example)-- at one point I hit 8192/8192 tokens and 96% of the compressed size limit.

I had to aggressively minify the source code and strip all comments/whitespace (with the useful Shrinko-8 tool), but I plan to upload the original commented source code to: https://github.com/icegoat9/picohaven2. I'll probably wait until a month after release when I've had a chance to fix any bugs or make any updates that come up-- if you're interested in the source, feel free to remind me.

I also posted some light devlog-ish updates on Mastodon during development, but I'm still trying to figure out where to do that in the future-- I don't quite have the energy to keep up with mastodon, discord, the BBS, reddit, and twitter...

Release Log

  • Oct 31, v1.0a: release
  • Nov 8, v1.0b: fix an embarrassing crash bug that happens when you beat the final boss if you've never saved and reloaded the game (there was a 'how many times have you won the game?' variable I added late in development which only got initialized to 0 when loading a saved game, and in playtesting I always tested load/save during the campaign which masked it).
P#136712 2023-10-31 23:06 ( Edited 2023-11-08 17:01)

[ :: Read More :: ]

Hi all, I got inspired to work on a sequel to PICOhaven (tactical card-based RPG-lite) and am about 70% done-- enough that I'm confident I will actually finish and release it (maybe in a few months?)

I wrote music for the original PICOhaven, though I have no particular musical background-- I noodled around on a mini keyboard with minor chords and an arpeggiator to find some ideas I liked, then built a simple version of that in PICO-8, see the cart below.

For the sequel, one idea I had was finding someone who'd be interested in creating a 'remix' or adaptation-- creating their own take on one or both of the theme songs. I'm open-minded about where on the spectrum of "clear remix" to "loosely inspired by" a composition ends up, but I thought the PICOhaven 1 theme songs could provide a useful creative constraint / starting point.

If this sounds interesting, reach out and let's chat, either here in the comments, in DM on the discord, on mastodon, or so on. I'm also very open to critique+tips on the previous music!

This cart contains two theme songs, for reference:

Cart #bakyohw-0 | 2023-09-14 | Code ▽ | Embed ▽ | No License
1

(in case it wasn't clear, this will be another free labor-of-love game, and there is no pay involved :)

P#134352 2023-09-14 18:01 ( Edited 2023-09-14 18:10)

[ :: Read More :: ]

I saw kenney.nl released a free CC0 set of 8x8 city-themed tiles in the PICO8 palette, which looked interesting (thank you Kenney!)

Because that set includes more tiles than would fit in a PICO-8 cart, I chose a subset that were most interesting to me and copied them into a PICO-8 cart so I could play around with a few ideas, with some very quick throwaway code to let me move and animate sprites, layer them on top of each other so I could have cars "drive behind" trees, and so on, just to help with prototyping visual ideas.

I saw a few people posting on Mastodon asking if there was a pico8 cart that included these assets, so I figured I'd share this in case it was useful to anyone else for playing around, to save the time of slicing and dicing the tilemap into a PICO8 format. Note: I modified a few of the sprites and added a few other unique combo sprites and accessory sprites for the types of terrain intersections I found myself wanting to draw, but 99% of this is just directly the asset pack from above, packaged into a PICO8 cart.

Cart #citytilesubsettest-0 | 2023-09-07 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
3

P#134036 2023-09-07 22:20 ( Edited 2023-09-07 22:21)

[ :: Read More :: ]

I joined the itch.io 'Secret Santa Jam' this year, where you get anonymously paired with a random stranger and create a small game for them based on a letter about their interests.

Part of my giftee's prompt was "I like playing games that make me think and involve some kind of strategy e.g. card games like Magic the Gathering [...] I am a huge football fan. I support Manchester United in England and Borussia Dortmund in Germany. I have a rubbish Windows laptop, so any game that can run in browser works best for me.".

I let inspiration guide me from there and here's the small puzzle / tactics game I came up with.

Cart #footballdungeon-5 | 2021-12-25 | Code ▽ | Embed ▽ | No License

Sadly, there are no sound effects or background music as I ran out of time and wanted to ensure I gave them something playable by the deadline, but maybe I'll come back to it some day...

p.s. I used this free pack of 16x16 sprites as a starting point for the character sprites and animations: https://route1rodent.itch.io/16x16-rpg-character-sprite-sheet, thanks!

P#103536 2021-12-25 23:22 ( Edited 2021-12-25 23:23)

[ :: Read More :: ]

Usage (requires keyboard): Type text including control codes (\n, \f, \^, #, and more) live in your terminal and see the result displayed on screen...

You could also just edit a print() statement in a dummy cart and reload... but there's something about being able to edit color/spacing/etc 'live', especially for codes like + and \^v that can take a lot of trial-and-error tweaking.

In the comments below I have a larger utility cart version of this that includes help, save/load/export, and so on. But this first post is trying to pack a subset of that into 560 characters for TweetTweetJam.


p.s. The tweetcart it doesn't quite support all the P8SCII codes (no \a, |, -, and likely more), but the full cart in the comments supports most of them (still not \a).

P#100530 2021-11-21 06:38 ( Edited 2021-11-23 05:22)

[ :: Read More :: ]

[updated from WIP post]

I saw the announcement for this week's TweetTweetJam #7 and here's a barely-roguelike in 560 characters.

Feedback, or suggestions for other character shaving welcome!

Cart #twrogue-2 | 2021-11-19 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
5

Gameplay:

  • Use arrow keys and try to get as high a score or level as possible (my personal records are 140 points and level 8, but it's hard)
  • Hitting two arrow keys at once lets you move diagonally (but requires some skill+luck on a keyboard!)
  • Every heart (♥) you collect raises your score
  • Every step you take or spike (∧) you step on lowers your score
  • The house (βŒ‚) transports you to a new more challenging level (and raises your score)
  • The game ends if you are eaten by the dragon(🐱) or your score drops to 0...
  • To restart the game you'll need to reload

Note: the game is definitely unfair in that it can generate a level where it's impossible to reach the goal or avoid the dragon (though note the diagonal-move trick above) and you'll have to reload and try again.

If I find time I will come back to it based on @dw817's comment below and figure out if I can cut some functionality (maybe level progression) and add in a way to organically generate a known-solvable map layout.

side note: I had a question about flip() but couldn't reproduce it, so removed it

P#100252 2021-11-17 05:25 ( Edited 2021-12-11 19:10)

[ :: Read More :: ]

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)

Cart #picohaven-40 | 2022-09-01 | Code ▽ | Embed ▽ | No License
25

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!

Dev Notes

Releases

  • 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.

Thank You

  • 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

P#99001 2021-10-21 20:42 ( Edited 2022-09-01 19:09)

[ :: Read More :: ]

For fun, I recently prototyped a little 'PICO-8 micro-console' (compact enclosure with a Raspberry Pi and square display that boots directly into SPLORE):

It's certainly less practical than commercial off-the-shelf handhelds that support PICO-8 -- it has no battery or keypad (you pair a bluetooth controller to it), but practical wasn't really the goal-- I wanted to build something designed around a high-quality square display.

For scale:

Internals being tested (Pi Zero W, Pimoroni Hyperpixel 720x720 screen (used pixel-perfect with 5x5 pixels and a minimal 40px black border), USB DAC -> speaker, etc):

I plan to make a smoother white enclosure, this was just a 3D printed first pass with a lot of hand-filing to get everything to fit and figure out hardware. Maybe some day I'll make an extended-case version with a custom PCB to add battery / charging / integrated buttons... but it's nice to call a prototype "done enough to use and share".

P#94469 2021-07-05 02:51 ( Edited 2021-07-05 03:08)

[ :: Read More :: ]

I saw someone post a suggestion for SPLORE to add a "play random cart" feature (especially for new game exploration on a handheld without keyboard/web browser, once you get past the list of Featured and New loaded in SPLORE). I liked that idea.

While having that in SPLORE would be cleanest and would stay up to date, I hacked together a quick prototype for myself that loads a random Featured Cart (from a scraped list of the 340 carts on the Featured board as of June 2021) to play around with.

Cart #randomcart-0 | 2021-06-26 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
7

If using it on a handheld it requires an internet connection, of course.

It also adds a Select/Enter menu option to each cart that lets you chain to a new random cart.

P#94097 2021-06-26 16:35 ( Edited 2021-06-26 20:01)

[ :: Read More :: ]

[ edit: see follow-up post for updated cart ]

For the newest #tweettweetjam I made a very basic space shooter (layout inspired by Gyruss/Tempest) in <560 characters. It even includes a bit of sound via poke-ing to the sfx memory, since the jam rules say "code only" without separate gfx/sfx assets.

Use ⬅️/➑️ to move, ❎ to fire.

Cart #jenubiwara-0 | 2021-06-20 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
1

(I may write up a commented / uncompressed version of the code at some point...)

P#93771 2021-06-20 06:11 ( Edited 2021-08-31 19:22)

[ :: Read More :: ]

On the last evening of #tweettweetjam I was playing around with free body motion, made a prototype... it evolved into a ~1000 character toy... and I managed to squeeze it down to 560 just before the deadline. The math is buggy when paths get too close to centers, but I sort of like the look so I didn't even try to "fix" it...

Arrow keys move the attractor, πŸ…ΎοΈ/Z switches control, ❎/X resizes.

Cart #sisuterujo-1 | 2020-11-15 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
1

P#84104 2020-11-11 05:07 ( Edited 2021-06-20 05:58)

[ :: Read More :: ]

Cart #diwipeboju-0 | 2020-11-07 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
8

My entry in #TweetTweetJam, in 554 characters.

Cross four levels of increasingly busy traffic, using only the up and down arrow keys!

This was my first time trying a minimal-code jam-- I read various forum tips but I'm sure there's still some compression to be had. Since the jam rules were to use source code only, no spritesheet/map/sfx data, I had the idea of Poke-ing a basic sprite into memory and then using sspr() and palt() to reuse it in different forms... and a little game evolved from that.

P#83904 2020-11-07 04:35

[ :: Read More :: ]

Cart #tebomejosi-1 | 2020-11-03 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
11

Years ago while bored on a train with a deck of cards, I made up this solitaire game (for all I know, it may already exist under another name). So I've turned it into a little Pico-8 cart, my first "finished" game.

(as sounds common, I've started at least 4 other ideas... all in various WIP / playing-around stages, it's just too much fun to try new things...)

Arrange cards to make as many good poker hands as possible. For an extra challenge, play in "Perfectionist" mode where you only score points if you make a pair or better in all 12 hands (across, down, and diagonal), which takes some careful play and a bit of luck.

My personal best score for some time was 44, though I recently managed a 57 when the stars aligned.

P#83439 2020-10-29 05:39 ( Edited 2020-11-03 18:48)

[ :: Read More :: ]

Cart #yeduzahise-3 | 2020-09-22 | Code ▽ | Embed ▽ | No License
6

Program a tiny virtual console, the "Turtle-2", with increasing levels of capability at your fingertips.

This isn't "done" (there isn't a lot of error checking so there are various ways to make it crash, and I want to add more SFX and animations and maybe figure out custom background music), but it's a playable version of the core ideas. If anyone checks this out I'm curious what you think, whether you find it fun to play around with, and whether you create any interesting designs (share screenshots!)

I'm on the fence about trying to extend it to challenges / puzzles or just leave it as this open sandbox.

P#82098 2020-09-22 06:03 ( Edited 2020-09-22 06:14)

[ :: Read More :: ]

Cart #nufuzuwota-1 | 2020-09-14 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
6

I just came across Pico-8, did a few tutorials last weekend, and here's my first cart-- a spaceship flying over an endless 2D parallax scrolling background (with more layers that get added in over time).

The whole experience was a lot of fun for someone who rarely writes software-- just poking around within the tool and trying things out. Thank you to everyone who developed Pico-8 and posted tutorials and tips!

I didn't plan to share anything because this isn't a "game" and I expect the code has all sorts of ugly parts I should clean up. But I saw a talk about how part of the concept is just encouraging sharing in any form. So why not... feedback welcome.

p.s. thanks to @Gruber for the music shared in the Pico-8 Tunes #1 cart.

P#81785 2020-09-14 00:27 ( Edited 2020-09-14 06:04)