In late 2022, I decided it would be fun to design my own retro-style simulation game so I created "The Nightportsman of El'al Raheeb".
In Nightportsman your goal is to make as much money as possible through the winter by strategically sailing between islands in the archipelago of El'al Raheeb. You'll need to recognize trends (which islands need what type of items), avoid hazards (krakens!), and carefully spend your money to expand your ship or buy information about the islands
A game of Nightportsman takes about 20 minutes and you can't lose - it's just about doing better than the time before. It's purposely slow and relaxing, but getting a highscore will require you to take notes and pay careful attention to the trends of that season.
The gameplay takes place both at port (buying and selling items) and at sea (navigating between islands).
In this post I'll talk a bit about the design of the game and some of the trade-offs which needed to be made to fit the experience into the limitations of the Pico-8.
Play the Game
If you'd like to just play the game and ignore my words, then please enjoy! On PC the controls are Z/X. The control scheme is really designed for use with a controller, so they will be slightly awkward with a keyboard, however these controls are hard-coded in Pico-8 and I cannot change them.
A few helpful hints...
- If an island pays a lot for one items (like a fruit) it'll pay more for other similar items.
- The game lasts 45 days, so plan accordingly.
- Even if you have nothing to sell at a port, keep track of which items are expensive there. The sale price is also the buying price at that port.
- A score of 750¥ is commendable.
My History of Nautical Obsession
Warning: The following content contains spoilers.
For many years I've been thinking about some form of slow, long-form multiplayer sailing game. Generally I've referred to the concept by the name of "Great Blue". Great Blue would be a game which was played over a week or more, predominately asynchronous where players would control a small fleet of vessels navigating between ports in a large body of water.
The concept of slow, asynchronous games has always been appealing to me as a way of getting my non-gaming, generally busy friends to play with me. By reducing the time commitment to just a few minutes throughout a day I thought I'd have a good chance of fitting into folks complicated schedules and by making the gameplay done at one's own pace, I thought it would lower the barrier to entry since fast reactions would not be required.
I've flirted with this idea for a long time and the latest idea, inspired by the current auto-battlers trend, involved strategically placing cargo in your ships to either optimize for cashflow or offensive/defensive capabilities. I began working on a prototype of this game using modern, web technologies, but I quickly found the concept to be too ill-defined to progress with.
This is around the same time I began watching classic simulation game reviews for games like Oregon Trail and Cross-country Canada. I was also reminded of the Pico-8 fantasy console.
The Pico-8, if you're not familiar, is a purposefully limited game engine which has limited code size, color palette, and more. It forces you to reduce your games to their simplest form and create something which is the core, condensed version of your idea. This seemed perfect to help me break down the undefined game I had floating in my head, so I decided to create a small, single-player version of my merchant simulator. This small version would become Nightportsman.
Defining the Idea
I knew the core gameplay loop would involve strategically filling your ship with an "inventory management" style system then sailing between ports to sell goods. This has always stayed constant and most other core ideas from my initial scoping were able to be included like random encounters, varied port styles, etc. The only element which I considered critical to the game which didn't make it in was deliveries. Originally I wanted there to be two types of items which you could transfer, raw goods (like buying and selling bananas) and deliveries (where you'd be paid to go from Port A to Port B and deliver it).
In a full game, I would definitely want deliveries as they provide an important early-game guidance where a new player can understand a simple task and be rewarded for it. Sadly, I ran out of tokens (code) and could not find the space to implement this complex feature without sacrificing any other core feature, so I left it out. This makes the early game much less approachable and is something that I am unhappy with.
The rest of the game stayed true to my vision and I even had chances to add small secrets (like the ability to defeat krakens) and other hidden elements.
Another element which I felt missed the mark was the balance of commerce to puzzling. I wanted the game to be mostly about fitting things in your ship, tapping into the satisfying organization / puzzle aspect with the blocks. However in the final game, the puzzle elements only come into play once you have enough money to fill your entire ship. Normally the first 10 days or so you are sailing without a full cargo load so this puzzle aspect doesn't come up. This means you have to understand the commerce elements (and earn money) before you get to the simpler to understand puzzle elements. This would also be better if we had deliveries, but alas.
Aside from these elements, the rest of the game turned out exactly how I pictured.
Drawing the Art
I actually learned a lot doing the pixel art for Nightportsman. I haven't attempted pixel art in years (and arguably, I've never succeeded at it) but I have been drawing a lot more in recent times so I think I was more prepared going in.
I am very happy with most of the art and working with the limited palette has had positive impacts in my normal drawing. When you only have ~16 colors to work with, you need to get very creative with hues. You may not have a dark brown to use as a shadow, so can you use a dark purple? dark blue? The experimentation has made me much more confident in my color-mixing abilities.
I think the whole game has the cute, cozy feel that I wanted. I love the mix of vibey sea-fairing game elements with the cute art style.
The only thing I really wanted to add that I couldn't fit (again due to token limitations) was snow/rain effects for some ports. I thought it would add a great bit of variation, but the asset swapping at ports does the job well enough.
Some of my favorite art in the game is in the menus, for example, the newspapers which are available at some ports.
The newspapers display extra bits of information about islands or areas in the sea. The subtext is a chance to introduce more lore as well. In this case, it's canonical that El'al Raheeb has cats.
The overworld map was also a unique challenge as I wanted the islands to still feel like they had their own identities, but they appear so small that adding art would be very hard.
I landed on using small flags (which are just 2x2 color patterns rendered as 2x3 to look flag-like) to help differentiate ports. I thought this added some great variety and I think it worked because when I think of "Snow Raheeb" I think of their iconic pink / white flag.
Aside from the islands, I went back and forth on how much detail to add in the overview. The clouds were a critical element and their shadows (which render beneath the islands) are a great subtle way to add depth to the simple art.
If you buy enough newspapers, you'll eventually receive information about floating objects in the sea. These are then shown on your map with these dancing lines. This is another element I was very happy with because it is hard to figure out how to make an outline which draws attention but isn't overhwelming when you have a limited color palette.
Creating the Sounds
I'll be honest - sounds and music have always been a tough topic for me. I'm not musical and don't have great taste in the matter. I added simple blips and bloops in the game, since Pico-8 makes these basic noises to trivial to create, but if I wanted to go the extra mile I would have loved to work with someone to create some proper nautical tunes.
For now the game remains mostly silent, but I think that's okay - I've heard the sea is also quite noiseless.
Crafting the Lore
Working on the lore of Nightportsman was a lot of fun, more fun than I expected. I've always felt like my favorite stories were ones which told small stories but in a world where the lore ran deep. I tried to create Nightportsman in this way. I don't think it's that obvious to someone playing the game, but I actually started with defined lore from the beginning then looked for areas to leave traces of it. This original blurb was intended to be a Star Wars style scroll at some point, but I had to remove it for cart size...
Writing the Code
The code of Nightportsman is really not anything special. Pico-8 uses Lua (one of my favorite languages) and for the most part there was not any technical challenge in implementing the game. One concern came from dealing with limited token counts which required optimizing existing code to use fewer tokens (e.g. "if", "=", "()" etc) and the other came from the overworld navigation algorithm.
Ask anyone who knows me and they'll tell you I'm not really an algorithm-y type chap. I have no formal computer science training and failed 8th grade algebra, so creating the code to navigate around islands to arbitrary points was a bit complicated. It was made more complex by the Pico-8's limited floating point precision which limited some traditional algorithms from working right.
The algorithm I ended up with works well 95% of the time, but does occasionally produce less-optimal navigational routes. To navigate it create a list of all clear line-of-sights between any two ports (so no islands on the line) then it uses that navigational web to create a series of potential routes. When navigating between islands it attempts to find an unobstructed line to the destination, if it doesn't find it, it attempts to find a clear route to a point on a line which is a clear route (i.e. one from the web defined earlier). Then it follows that route until it has a direct line-of-sight to the destination then it turns and heads straight for the destination.
This algorithm produces fairly organic looking paths and I'm very happy with it. The only issue is on some machines it may produce a little lag spike while routing. I wanted to cache the paths, but again, token limitations.
Reflecting on the Game
All in all, I'm happy with Nightportsman. I don't think it's an amazing game. I think it's fun for what it is and demonstrates that there is probably a version of the larger multiplayer game that is fun. I may make that one day, I don't know. I do know that this version is satisfying and I enjoyed the constraints of the Pico-8. I would definitely recommend it if you'd like to make a small, retro-style game.
Thanks for reading and happy hacking!