pico-view:
July 2023
Hello Pico-View Reader, this July issue is the seventh in the series. Thank you to the writers, contributors, and all supporters, that includes you reader! We thank you from the bottom of our hearts. And with that, have fun adventuring through the pixels and paragraphs of this issue of the Pico-View web-zine!
Authors:
Archonic, Vlad-Constantin Comarlau, Pedro Machado, Achie, Josiah Winslow, Luchak, Marina, and Nerdy Teachers
Contributors:
SaKo, Mierdinsky, Glimm, Wolfe3D, Marina, ohhcurtains, KumaKhan22, Godmil, Nerdy Teacher J, Sika, Pico-8 Gamer
Contents:
-Cover Art by SaKo
-PSA to All those Trying to Learn to Code - archonic
-How Structured Iteration Helped Me Overcome My Lack of Art Skills - Pedro Machado
-Featured Interview - Vlad ft. Marina
-New Community Stars - Nerdy Teachers
-Featured Game Review: Kalikan - Achie
-Random Reviews - New Release Recommendations
-Tokenomics 101 - Josiah Winslow
-Function Showcase
-Pixel Art Gallery - Mierdinsky
-Prototype Party
-Closing Remarks
A PSA to All those
Trying to Learn to Code
Trying to Learn to Code
by Archonic
Hello! I’m Archonic (some may know me as Gabriel C) and I have been coding for years. I got my start with the Spigot API for Minecraft, and have worked my way into different projects since. My goal for this article is to give some advice for anyone that wants to learn to code, which is by extension anyone that wants to learn PICO-8.
NOTE: I haven’t actually worked a ton with PICO-8 (I haven’t finished any long-term projects), so this article will be more about programming in general than programming in PICO-8. But hey, the advice still applies!
Advice #1: Find a project you like
This is quite literally the best piece of advice I can possibly give. Find a project that you’re actually interested in, and try your best to follow through. That’s it! I would recommend doing a couple of tutorials, just to learn the basics, then coming up with an idea that is easy to execute and that you are passionate about. You don’t have to worry about coding cleanly and following proper game design principles on your first go; just go step by step and focus on what satisfies you!
Advice #2: Unleash your inner mad scientist
One of the best things about PICO-8 is how any game’s source code is only a couple of keys away! Don’t be shy about using this to its full potential. Trying your best to understand a game’s code by poking around in it, then making your own small changes is a great way to learn experimentally.
I think there might be something wrong with my copy of Celeste Classic. Madeline’s FAST!
Keep in mind that decoding the logic behind random games isn’t always easy. Reading someone else’s code is like reading someone else’s messy handwriting. Even if a game’s innards are well documented, it can still take some time to understand and interpret, especially if the game uses complicated techniques*. Still, try looking at the code for your favorite game and see what you can change!
*If a game’s code seems completely unreadable, like, fake-movie-programmer level unreadable, it might be due to a tool like shrink08
Advice #3: Don’t be afraid to ask for help!
Yeah, I know. This one seems very cliche. But, more times than I can count, I’ve slaved over a small error in a project, only to reluctantly ask for help on the PICO-8 Discord and have the solution to my problem made extremely obvious. Sometimes, just having one more pair of eyes to look at your code reveals small things that you simply don’t notice no matter how many times you look!
A small collage of just a few of the times that people have been helped by the PICO-8 discord. Oh, and the PICO-8 BBS is also an option.
In Conclusion
All of these tips are great to get started with your development journey. Overall though, the most important thing is to find what path works best for you. Loss of motivation is like a landmine; your path should be one that navigates around those landmines while also finding a way to your goal.
Keep these tips in mind, and don’t forget that you should…
How Structured Iteration Helped Me
Overcome My Lack of Art Skills
Overcome My Lack of Art Skills
by Pedro Machado
Introduction
'Til The Gods Devour Us is a micro-strategy game where you lead the defenses of a besieged fortress. Your goal is to survive until the end of the 5th day. It's an experimental game, mixing elements from multiple genres, like tower defense, RTS, roguelike, and board games.
I developed it by myself, doing all the design, code, art, and audio. It is also the first game I made art for.
For context, I've been a game designer for almost 11 years. I also have considerable project management and audio experience. I even learned to program a few years ago, coding a few games alone.
But I had never done art and didn't even know how to draw.
Despite my lack of experience, I am proud of the art I created for 'Til The Gods Devour Us.
A structured, iterative work process is what made it possible for someone like me, with no art skills, to create acceptable art for a game.
Iterative Process
If you've been around the game dev scene for a while, you probably heard the word "iterative" being used a lot of times.
Wikipedia defines Iterative Design as "a methodology based on a cyclic process of prototyping, testing, analyzing, and refining a product or process." That is a great definition.
I'd describe it as a way of working based on trial and error. The goal is to continuously improve the work through multiple iterations.
The Art for 'Til The Gods Devour Us
Before starting the project, I had a clear picture in my head of how I wanted it to look. Inspired by the Battle of Helm's Deep from The Lord of The Rings, my goal was to create a fortress surrounded by mountains with one gate leading straight to the castle and a river going through the wall.
Since the beginning, I wanted to use individual pixels to represent soldiers, making my life much easier since I wouldn't have to draw humanoids.
In my head, it was simple to execute.
My First Attempt
The first version was discouraging. It was so far away from what I was imagining. The mountains looked wrong. The fortress looked terrible. The perspective was clearly not working. Top-down wasn't a good choice.
I wanted to give up. I had no art experience. What was I doing trying to create art for an entire game?
I thought about inviting an artist to collaborate with me. But I wanted to complete this project by myself as a learning experience.
After a few days without touching the project, I finally convinced myself that making a terrible first version was part of the process and that I needed to try again. I had to create a new iteration, then a new one, and another one, until it looked good.
Second Attempt
Still not great, but clearly better than the first one. The perspective was better, but the fortress still looked bland. The mountains were still off, but at least they had some depth.
Third Attempt
Now we were getting somewhere. The fortress looked better with more details. The trees and the soldiers made the world feel alive. I was happy with the interface. You'll notice that it has mostly stayed the same since this version. There was still a long way to go, but it was getting somewhere.
Iterating Saved My Game
These two iterations were essential because they showed me I was capable of improving my art. It proved that it wasn't about knowing or not knowing how to draw. It is about being patient and consistent, iterating until it looks good enough.
Imposter syndrome hits hard. And to overcome it, we need to see failure as part of the process. In my opinion, it's not only a matter of "believing in ourselves." We must understand that to create something good, we need to create something bad first.
On each new iteration, my art improved. The mountains, trees, and river were looking a lot better. I added details and shadows to the fortress. I drew a little village. Later, I even created some animations and transitions.
It took a few months until it got to a point where I thought the art was good enough. I usually worked on it for 30 minutes to 2 hours a day. Each day the game looked a bit better until it finally stopped sucking.
Is it perfect? Certainly not! There is still a lot of room for improvement. But for this project, it's good enough. That's the thing with an iterative process. Your work is never done. You just reach a point where it's good enough for your goals. I could keep iterating over it forever, but I was getting diminishing returns on each new version, so I stopped.
Trust the Process!
Here are some tips on how to build and consolidate your process, no matter what type of creative work you're doing, art, code, design, or audio:
Don't overplan.
Although planning is important, overplanning is dangerous and may eat too much time if you're not careful. Time that could be better-spent prototyping and testing things out.
Gather references.
Study how other developers solved similar problems before. Good references will give you a better starting point.
Be consistent.
Don't give up if your first attempts aren't good enough. Keep pushing! Having the discipline to consistently work on new iterations, even if it's only 30 minutes per day, pays off in the long term.
Don't be afraid to fail!
Try stuff out. Make multiple alternatives. See what works and what doesn't.
Get feedback!
Show your work to friends or other devs. I've also got some great feedback posting images and gifs on Reddit and Twitter. Try it out!
Game development is hard! Go easy, and give yourself room to fail. We've all been there!
Featured Interview
with Vlad-Constantin Comarlau
ft. Marina
Marina: So who are you, and what have you done? (and thanks for the interview)
Vlad: Hello, Maria! Thank you for having me! My name is Vlad-Constantin Comarlau, I’m 28, born and living in Bucharest, Romania.
I currently am a student at the Faculty of Cybernetics, Statistics and Economic Informatics. I’ve previously finished the Faculty of Management. Writing code has been my passion since I was 14, although I thought it was too difficult for me to get into at that time, but not too long ago I’ve decided to follow my true passion which is programming.
I’ve been a game tester at Electronic Arts and later at Ubisoft Bucharest totaling almost 7 years of video game quality assurance experience. Currently I am working as an assistant at the Institute of Cellular Biology and Pathology “Nicolae Simionescu”.
I’m also known as vladcom on Lexaloffle or @vladcomarlau on Twitter. I’ve developed the 3D fighting game “HIT8OX” and top down driving/shooting game “Night Ride” both for PICO8.
Marina: Ah, so what made you want to tackle such a complex 3D game in a limited 2D fantasy console like PICO-8?
Vlad: The complex part comes from the fact that I really wanted to understand how 3D rendering worked from the ground up.
I was impressed by the impact 3D games had in the 90s, although I was not even born early enough to experience it back then not to even mention as a developer. I could only imagine how amazing it was for the pioneers to push the limits of hardware and create something that had never been seen before. These days we take memory and processing power for granted. Making HIT8OX was my way of living in those early days.
Before PICO-8 or even “fantasy consoles” was a thing I turned to the PlayStation 2 demo disc that contained Yabasic, which was a very simple Basic interpreter. It gave me the feeling of developing software on a 90s computer. It’s funny actually, the core source code of HIT8OX is the exact same code I wrote in highschool for rendering a cube wireframe on a PlayStation 2 using that same demo disc.
I chose PICO-8 for the feeling of a retro console/computer that it gives and not having tons of memory and processing power helped me finish the game. If i didn't have the PICO-8 limitations the game would've taken double or triple the time to make as I would've kept implementing tons of features.
Marina: That's so cool. I find a lot of people use PICO-8 to be able to blaze new fronteirs. I have to ask what's your favorite part of PICO-8?
Vlad: Definitely has to be the community. Be it a passion to create retro games or play them, the PICO-8 community is what makes us come back to it. I was completely overwhelmed by the creativity of PICO-8 developers and how wonderfully the players respond with feedback. Creators giving tips and helping each other can spark little collaborations or even small teams that eventually really push a game to seem like sorcery. You can never know what amazing little games will appear next time you hit that refresh button.
Marina: Speaking of community, you were pretty silent during the development of HIT80X... Or at least my sources say. What was the development of HIT80X like? How long did it last? What was the closest you came to quitting, if you ever did?
Vlad: My objective was to show the game to the world when it was as complete as possible, thus the silence. It was also a strategy to not abandon it. Posting it online was my reward so the delayed gratification really helped me stay motivated.
The game took way too long to make. I’d say about 6 months. I had to juggle both work and school to make time for it, writing code during weekends and sometimes late at night after work.
Making HIT8OX in its first 3 months was mostly coding blindly. Just putting together the basics of the graphics with all the 3D calculations, drawing optimisations and objects positioning and rotation was the hardest part. Making an animation system, trying to store as many animation frames and interpolating between them without having a high cpu and memory usage took a lot of time without even seeing an immediate result on screen.
This was the time I came the closest to quitting as the school year was about to start and I would’ve soon had to switch my focus to homework and school projects. I didn’t like the idea that all the work I’ve put into it up to that point would’ve been in vain and have nothing to show for it. With the tech complete I had to make the gameplay or there wouldn’t be any use of it. This is what helped me finish the game. Seeing it take form with each weekend that passed by really motivated me.
Every animation in the game was a slow motion video recording of me doing that move (except for the high kick of course haha) and then animating it by hand, side by side with the video, frame by frame using the editor I've created to help me with the process
The name of the game was once, as a joke: "Boxed Brawlers: Shiny Floor Edition"
Multiple times I've questioned myself if I could pull it off with all the features I wanted to implement. Only the 2 characters on screen were eating more than half of PICO-8's resources. Funny thing I did in order to save code space and make the environments was that the backgrounds you see in the final game are actually a 3rd fighter. A heavily modified one to be exact.
That's how I managed to animate even the 3D elements that are present in the world, like the gate moving in the wind in the City level.
Marina: Do you have plans to continue with PICO-8 or are you going to take a well-deserved break?
Vlad: Haha, very kind of you for thinking that I deserve a break!
Unfortunately being in my final faculty year means my time will need to be put towards preparing for all the projects and final exams. Right now I will indeed take a break to focus on school but I’ll probably start to make a new game when Picotron arrives.
Marina: I can relate to that. I'm lucky I have the time to work on a game at all right now with my cool-leg schedule. But, when the time comes, the time will come. You just gotta stay on the grind the best you can I guess.
Vlad: Consistency is definitely key!
Marina: Also, also, what started the idea of a fighting game?
Vlad: It actually was another challenge for myself since I did not play fighting games that much it was a way for me to understand a lot better what the genre is about and what makes it tick.
Marina: Oh! that's the exact reason I've been wanting to make a fighting game. But, it's been about almost my entire PICO-8 life-time that I've wanted to. I'll definitely take notes on HIT80X when I do finally get to work on it... Some day... Far in the future.
Vlad: You should definitely do it! This was one of the reasons I wanted to implement slow motion. To make a fighting game that I would play. I just can’t imagine a fighting game without slow motion.
Marina: So any ideas for the future in PICO-8/picotron? You gonna stick with technical/3D?
Vlad: I will most likely continue with 3D video games. There are still some ideas that I need to get out there in the world. Having more memory and cpu power means i’ll take on an even more challenging project. Picotron might start a new wave of PS1 quality like titles. That’s just so exciting!
Marina: I was born too late for the PS1, but just early enough to have a hand-me-down NES. So PICO-8 scratches my itch perfectly, and I look forward to seeing what you do with Picotron.
Vlad: It’s a great way to relive times when we were too young to experience.
Marina: Agreed. I enjoy blazing these new fronteirs again. Whether with art, gameplay, or in your case technical marvels. So, what's your favorite PICO-8 game? And why?
Vlad: I’m blushing you think that.
Marina: What? I don't think that. I KNOW IT!
Vlad: Ahahaha
Marina: I've gotten used to humanizing people who have done great feats. But, HIT80X is just too much of a marvel. Like wow.
Vlad: I really appreciate that! The game that inspired and really impressed me by how well rounded a PICO-8 title can be is X-Zero by Paranoid Cactus. Its quality is just astounding; simple but well polished. That’s the formula that I really like.
Marina: I see there being two kinds of PICO-8 devs. People like me, and people like you and Paranoid Cactus. Also, do you have any other PICO-8 games? That you made?
Vlad: Before HIT8OX I’ve developed Night Ride, a top down 2D driving / shoot’em up game.
Marina: Wait a f---ing minute. You're vladcom! I don't sleep enough to handle multiple names.
Vlad: Ahaha
Marina: Yea, I like "Night RIde" but, I'd argue that "Chicken Run" is where it's at.
Vlad: Ahahaha I made that more as a joke.
Marina: Can we switch the interview over to being about Chicken Run now?
Vlad: Wrote that the minute I got PICO-8 as a gift from a work colleague.
Marina: What inspired you to make a game about a chicken?
Vlad: Haha. Sure. Though there is not much to say about it. The first thing to do when someone buys PICO-8 is to create something really fast and publish it, just to get the grasp of things.
It was more of a Google Chrome dinosaur game. With the twist that it gets different colors over time just to add something new. Chicken sounds funnier than a dinosaur though. haha
Marina: See I did the opposite for about a year. I tried to make the most complicated game and didn't release it. Eventually you see the error in your way, y'know? So, what're you studying/working as?
Vlad: I currently am a student at the Faculty of Cybernetics, Statistics and Economic Informatics, specializing in software development.
I'm an assistant at the Institute of Cellular Biology and Pathology “Nicolae Simionescu” monitoring experiments, preparing materials and samples, and maintaining equipment and supplies.
Marina: Oh yeah, I was resisting the terminator joke earlier. Welp thx for your time, and mind hooking us up with your socials?
Vlad: It was a pleasure! You can find me @vladcomarlau on Twitter, vladcom on Lexaloffle or Vlad Comarlau on LinkedIn.
New Community Stars
by Nerdy Teachers
Last month we came together to create the mini-biographies page with so many of the biggest names in the community. It was a lot of fun to forge those connections and learn so much more about each other in the process. That page stands as a great way to break the ice and introduce ourselves to new members.
If you haven't seen it yet, read them all here:
This month, we'd like to announce the addition of 2 more stars!
ThatTomHall!
I was one of the co-founders of id software, and made Commander Keen, Wolfenstein 3D, and DOOM there. Later Rise of the Triad, Anachronox, Diner Dash games, Demeo / Blaston / Bait! social spaces in VR. Now a secret project!
phammond!
I'm Paul and, a few years ago, PICO-8 reignited my passion for hobby games programming (which I started on the C64). I find the PICO-8 community a breath of fresh air. I tend to remake old arcade or 80s home-computer games. I just enjoy the process, and find it a relaxing break from my day-job. I'm really looking forward to using Picotron in the future.
We are keeping our eyes on you rising stars out there so keep working hard, helping others, and being awesome. I look forward to adding more to the list! So reach out to us if you'd like to nominate the next star!
Featured Game Review
Let's shoot to the moon!
by Achie
I wasn’t really a sickly boy, but when I did get my occasional fevers they were strong and long lasting. I spent a lot of time at home under the careful watch of my grandma, playing on my knockoff Sega Mega Drive 2, while chomping down salt and pepper pasta. Yeah, weird, but I liked it. Gradius, Star Soldier, Field Combat and RollerGames. I played these so much that I’ve memorized levels, what appears where and the strive to do better this time always pushed me forward.
The last time a game managed to capture this feel was CrossGunr Infinite by Aktane, but that stemmed more from a race standpoint. Today I was mashing the shoot button like a maniac, leaning into the desk, grasping the controller like a madman and that is when I realized, "yeah, this was it, this is it." The nostalgia hit me hard and I knew I’ll play this a lot in the future. "Play what?" you ask?
@0xFFB3 created an amazing experience once again. If you are not familiar with their name, they also go by LouieChapm in a few obscure places, and to regular readers this is not his first appearance in the zine, as we covered Calico a few months ago, and he is back for seconds.
After a beautiful booting sequence we are taken to the menu screen, which we will get really familiar with, as the game is ruthless in the best way. You will die a lot but restart a lot as the game has a rewarding nature to more experienced players. But first, let us choose our vessel and launch into combat!
As of the writing of the article we have two options available for us. Type A, a fast moving weaving in and out ship, and Type B, a ship more focused on controlling the screen I feel. But we are getting a bit ahead of ourselves, so let’s talk about our options in controls!
Controls
Movement is the generic ⬅️⬇️⬆️➡️ to fly around the screen, and two buttons to handle our weaponry, which might sounds interesting if I tell you that we have 3 options. 🅾️ is a bullet clearing bomb, which we have a limited amount showcased on the bottom left of the screen. That leaves ❎ with the role of handling our two shooting modes. Tapping will cause a general shoot for each ship, while holding will engage our options, the little pods around us, helping all the way through the game. Type A places these and lets them do their job while the button is held (be careful as they are slowly drifting upwards), while Type B engages an amazing focused laser shot that also slows movement speed as well.
Am I the happiest with these controls? No, but it comes down to a personal issue. I myself suffer from RSI (Repetitive Strain Injury) so the long tapping sessions aren’t really made for me, but for an average gamer it should cause absolutely 0 issues. I could squeeze in a half an hour play session, so if you have the same problems I advise installing some kind of macro program that can auto fire for you on a button press.
Combat
So after all this let’s get into the meat of the game, the combat! You have to worry about your combo meter showing on the top left (and in Big red stylized numbers if high enough) and rank, a hidden difficulty scale that will go up and down, based on how well you are doing.
This second is not the craziest difference between low and high, but oh boi, the combo meter you really want to keep alive by killing enemies in the right order and time. How can you do this? By learning! Enemies spawn in pre-determined static positions, only some bullets are random, so here practice really does make perfect! Killing enemies refill the combo based on how strong the enemy is (the big things I call tanks for example refill the whole meter) and bombing halts the decay so you have options to play with.
Enemies
Enemy design is varied enough that you don’t really get tired of seeing them, and there are a few that I’d like to highlight. One of them is the little armored guys, who just want to chill, but as soon as you shoot them, they give off a revenge bullet stream so be on your toes!
The other ones are what I call the tanks! They appear after the first miniboss as oh boi, they are chonky and dangerous. Slow moving huge dudes, with a pretty cool bullet pattern that can be overwhelming if you leave them alive for long!
Speaking of bosses, at the moment there is one smaller one (guarding the ever so beautiful red moon) and one at the end of the current game! Have fun figuring out their patterns but be on your toes as both of them are quite tricky to deal with on their own terms!
First Boss
One important thing is the pickup after the first boss, you can see me grab it on the tank gif! It cycles between 3 modes, Red, Yellow, Green respectively giving a bomb charge, a boost for combo and an extra life. Do you dare pick up the yellow to keep a good combo? Or do you fear your life and cave in for an extra continue? That is your choice to make!
Second Boss
Overview
One thing for sure, @0xFFB3 —love that handle but ok, Louie made an amazing looking game with amazing mechanics. The background is a beautifully tanned industrial space war scene with that gorgeous moon looming over it ever so slightly. I’m in love with that moon, it is the perfect background material!
Enemy ship designs look sharp and distinct, you know by a glance what is coming. Player ships are really cool, and let me tell you, he had a lot of concept art for this! Type A heli is my favorite at the moment, but the sleek yellow Type B is hot as well, not gonna lie. If I really had to pinpoint one problem, it is the bullet/ship color differences. For a while I found it hard to see where my green copter is against green bullets and same with Type B and yellow, but I feel that differentiation will come with time.
Soundwise, I feel like shots could use a bit more oomph, but everything else is spot on. Hits, explosions and even the music, hell yeah! Really well made! The menu could use its own theme, but hey, the game is an early peek release (preorder in my indie scene, helloooo?) for what is to come once Louie has enough time to finish and polish the game!
If you like a shooter with DoDonPachi vibes, or so I heard, sadly I’m still not the deepest into the current shmup scene, but hey even without getting those vibes I can tell that this is gonna become a PICO-8 legend at one point! Well done!
So grab your control sticks, strap in the seatbelt and let’s shoot to the moon!
About the Author
I stream PICO-8 gameplay and PICO-8 game development on Twitch, as well as write detailed dev logs and a game review series called "Pico Shorts".
Thanks for reading!
Random Reviews
Game Recommendations on
New Releases: July 2023
MOTION ● RECORD
"Whoa. It's a cute little platformer game, but under the hood it uses an interesting and unique idea I haven't seen done before. It feels really nice to play, and I can see myself coming back to try and beat it faster and faster. Wish it was longer, so I could play even more! Not what I was expecting, but pleasantly surprised!"
-Glimm
"Motion Record is so clever!! Play it right now!! Clear tutorial, plus super rewarding and juicy gameplay effects. This mechanic has a huge amount of potential for expansion. I can't believe how smart this game is!"
-ohhcurtains
Logicraft
"Logicraft is hilarious and stupidly well made, lol. Imagine a complicated hecked up version of Minecraft's crafting system, and you're fighting it to get the thing you want. The puzzles are fun to solve, and the cute little sprites are a joy to look at. Totes recommend for a smile! :D"
-Glimm
Gravitor
"Guide our humble hero in a deceptively simple world through a temple maze filled with twists and turns. A sharp eye and a soft touch will serve you well here, but if you are feeling nimble you can enable the on-screen timer to add more excitement to your run. Compete against friends or challenge yourself to achieve the fastest escape. "
-KumaKhan22
Mystery House
"Mystery House Remodelled is a faithful recreation of Roberta and Ken Williams first adventure game. It uses the keyboard for text input and has an impressive amount of vector graphics. Very difficulty but quite compelling."
-Godmil
Outvain
"Outvain by Ruvalolowa is a self-described 'Mini-sized Metroidvania' which oozes charm with a colorful yet carefully cultivated aesthetic that gives its world a meaningful presence and weight. The gameplay, level design, and the timing of its many combat animations all blend together perfectly to create a very classic platform/puzzle feel in the "vain" of Kirby or Klonoa, while retaining the promised upgrade-based gating structure inherent to the Metroidvania genre. Ultimately a nice way to spend a few hundred seconds, and I hope to see more output from this developer in the future."
-Wolfe3D
"This little block of orange can do a spectacular round kick and oh is it wonderful to use around this lovingly crafted mini metroidvania. With a fun pack of upgrades that allow you to go deeper and deeper into the world. It is crushing to come to the end and realize there is no more."
-Sika
PINFALL
"A charming platformer with buttery smooth movement will absorb you into a world teetering between frustration & patience. Each jump looks easy enough, but after spending a few minutes making your way to higher ground things start to unravel very quickly. If you don’t consider every move carefully you will be subject to a gauntlet of bumpers that will erase most if not all your progress. Still, a satisfying platformer that evokes memories of Marble Madness & Mr. Gimmick among other classics."
-KumaKhan22
"PINFALL is a hardcore platform game where you play a pinball. The graphics are amazing, but the gameplay is not for the fainthearted. Mercifully there is also a tutorial cart released with it called PINFALL Primer."
-Godmil
Snowfight.io
"Snow fight is a very fun top-down shooter (uses the mouse to aim) where you pelt other kids to be top dog on the field. Very fun and easy to learn! I enjoyed rising through the ranks."
-ohhcurtains
Tiny Bomber
"Tiny Bomber is insanely good! The variety of aircraft to select from is awesome. The menu is really well put together. I like that you can upgrade your aircraft by taking down the enemy, this is definitely something I see being added to my console."
-Pico-8 Gamer
Unsudoku
"You thought soduku was hard? (me, yes). Well let's shake up the rules and you now move as a number across the board while playing hide and seek with other numbers (soduko rules style). But the goal is to clear the board rather than fill it and you end with a surprisingly fun and witty game."
-Sika
Whiplash Taxi Co
"Whiplash is the next big 3D PICO-8 game that is truly impressive. The map is huge, the maniac tailwhip driving is super fun, and the amount of details in the physics makes the world feel solid. There are even 3 different game modes to play for the style you enjoy. If you liked Crazy Taxi and wondered what it would be like in an earlier era, play this!"
-Nerdy Teacher J
Witch Blaster
"Witch Blaster is a fun side-scrolling shmup about flying through a forest on your broom and shooting evil snails. Don't be fooled by the difficulty of the first stage - once you start buying upgrades (at the end of each level) this starts being a real power trip >:)"
-ohhCurtains
Tokenomics 101:
Stringify Tables and Tablefy Strings
Stringify Tables and Tablefy Strings
By Josiah Winslow
PICO-8 games can have up to 8192 tokens. That might sound like a lot, but if you make a big enough game, it's one of the first limits you're likely to run into.
Luckily, there are quite a few tricks to reduce your token count, which are extremely effective when applied over an entire project.
Mulitple Assignments
Multiple assignments can be combined into a single statement, saving on each =
token.
a=6 b=2 c=8 -- 9 tokens
a,b,c = 6,2,8 -- 7 tokens
Single Arguments
If you're calling a function with only one argument, and that argument is a string or a table, you can get rid of the parentheses around the argument.
print("hello world") -- 3 tokens
print"hello world" -- 2 tokens
Split Strings
The split
function can be used to create tables at a very low token cost (because strings, no matter their length, are always 1 token).
tau={6,2,8,3,1,8,5,3} -- 11 tokens
tau=split"6,2,8,3,1,8,5,3" -- 4 tokens
Unpack Arguments/Assigments
The unpack
function allows for doing function calls and multi-assignments using the values from a table, which can save many tokens when combined with split
.
--for arguments
map(0,0,0,0,128,32) -- 8 tokens
map(unpack(split"0,0,0,0,128,32")) -- 6 tokens
--assignments
a,b,c,d,e,f,g,h=6,2,8,3,1,8,5,3 -- 17 tokens
a,b,c,d,e,f,g,h=unpack(split"6,2,8,3,1,8,5,3") -- 13 tokens
However, there are some commonly repeated patterns that these tricks can't do much to reduce. For example, here's an actual snippet from one of my older games (a port of the Flash game Achievement Unlocked):
adat={
{num=0,name="don't move a muscle",desc={"keep the elephant from moving"}},
{num=1,name="it's a jump to the left" ,desc={"find a way to move westward"}},
{num=2,name="and it's a step to the right!",desc={"strain yourself to move right"}},
{num=3,name="fight gravity",desc={"figure out how to jump upwards"}},
{num=4,name="elephant skewers",desc={"hit a spike strip"}},
{num=5,name="ascension",desc={"be lifted into the sky"}},
{num=6,name="lefty",desc={"show love to the left wall"}},
{num=7,name="righty",desc={"show love to the right wall"}},
{num=8,name="purple ceiling",desc={"hit the top of the hardest", "level"}},
{num=9,name="rock bottom",desc={"find the bottom of the easiest", "level"}},
{num=10,name="speedy downfall",desc={"fall from the top to bottom", "without stopping"}},
{num=11,name="escape velocity",desc={"go from bottom to top without", "stopping"}},
{num=12,name="stalactite",desc={"skewer yourself at high speed", "on downward facing spikes"}},
{num=13,name="stalagmite",desc={"skewer yourself at high speed", "on upward facing spikes"}},
-- etc.
}
The full table takes up 1125 tokens! And aside from a few spots where we can use split
, we can't reduce the tokens very much using the tricks we know. There has to be a better way.
For cases like these, we can create a function that takes a pre-formatted string and converts it to a table. That way, we can create any table, no matter how complex, with only 4 tokens (plus the token cost of that function, of course).
Here's the function I ended up using:
function tablefy(str,delim)
local result,delim={},delim or 128
--helper function to turn string to value
local function deserialize(s)
--chr(18) = number indicator
if s[1]=="□" then
return tonum(sub(s,2))
--chr(16) = table indicator
elseif s[1]=="▮" then
return s=="▮" and {} or tablefy(sub(s,2),delim+1)
end
return s
end
foreach(split(str,chr(delim),false), function(item)
--chr(17) = separator between keys and values
local key,v=unpack(split(item, "■", false ))
--if the separator isn't present, v will be nil
if v and item[1]!="▮" then
--store key-value pair if it exists
result[deserialize(key)]=deserialize(sub(item,#key+2))
else
--add item if key-value pair doesn't exist
add(result,deserialize(item))
end
end)
return result
end
str
is, of course, the string we want to convert to a table.
delim
is the P8SCII code for the delimiter (what separates the values from each other). By default, delim
is 128, the P8SCII code for the A glyph (█). Note that any nested tables will use the next delimiter in sequence (which will get higher the deeper the tables are nested), so it's a good idea to use a P8SCII code beyond all the common letters and symbols to avoid unexpected results.
We then define a helper function called deserialize
, which simply converts the string to a different value if it starts with a certain character. This allows us to unambiguously decode numbers, strings, and tables.
Finally, we have the main loop. I wanted this function to work both with array-like tables (which you can use add
to add to) and object-like tables (which you can use keys and values to add to). For this reason, we attempt to split each item string by a certain separator chracter using unpack
and split
, and we do two different things based on whether that succeeds.
If the item string was indeed a key and a value separated by a separator, then key
will have the key, and the value is in the rest of the item string, which we store in result
. But if there was no separator (which results in v
being nil
), we use add
to add the item to result
instead.
(Note: I also check that the item string isn't a table by looking at its first character. That way, if the item string's table also has keys and values, the function doesn't get confused.)
The tablefy
function is only 110 tokens, and it can save many tokens for even moderately sized carts. I made the function for a crossword game I've been working on, and this trick alone has saved well over 300 tokens throughout the game!
Of course, it would also be helpful to have a function that can convert your existing tables to this format. Here's the function I wrote to do this:
function untablefy(table,delim)
local result,seen,delim="",{},delim or 128
--helper function to turn value to string
local function serialize(v)
if type(v)=="string" then
return v
elseif type(v)=="number" then
return "□"..v
elseif type(v)=="table" then
return "▮"..untablefy(v,delim+1)
end
--this only handles strings, numbers, and tables
assert( false, "could not serialize: " ..tostr(v) )
end
--add indexed values
for i,v in ipairs(table) do
result..=chr(delim)..serialize(v)
--mark this index as seen
seen[i]=true
end
--add key-value pairs
for k,v in pairs(table) do
--add if this key wasn't seen
if not seen[k] then
result.. = chr(delim)..serialize(k).."■"..serialize(v)
end
end
--note: result has extra delimiter in front
return sub(result,2)
end
It works just as you'd expect, by converting each type of value to a string using our encoding method and concatenating them to result
.
The only subtlety to keep in mind is that we first loop through the table using ipairs
(to handle array-like tables), and then we loop through the table again using pairs
(to handle object-like tables), only processing the keys that haven't been seen in the first loop. Technically we could use only the pairs
loop -- the keys in array-like tables are simply the index of each value -- but omitting the keys for these values results in overall shorter strings.
When using this to reduce the token count of my tables, I find it helpful to copy the result of untablefy
to the clipboard using printh(str,"@clip")
(where str
is the string I want to copy). That way, I won't make mistakes when typing the converted string into my cart. (Note that once you have your converted string, you won't need the untablefy
function in your final code; you'll only need the tablefy
function to deconvert it.)
For those that like doing extra "homework", see if you can extend the tablefy
and untablefy
functions to handle booleans. Hint: try adding some cases to the deserialize
and serialize
functions.
Function Showcase
Draw a Line of any Thickness and Angle
function draw_line(x, y, len, width, angle, col)
local dirx = sin(angle / 360)
local diry = cos(angle / 360)
for i=0,len do
circfill(x + dirx * i, y + diry * i, width/2, col)
end
end
x,y |
The starting point of the line. |
len |
(length) The distance to the end point of the line. |
width |
The total thickness of the line. |
angle |
(in degrees) The angle to draw the line, zero and 360 being upwards, counting degrees clockwise. |
col |
(color) The color number of the line. |
Manipulate Nested Tables
function copy(t)
return merge({},t)
end
t |
The table to copy. |
Returns: | An independent copy of t |
function merge(base,new)
for k,v in pairs(new) do
if type(v)=="table" then
if type(base[k])=="table" then
merge(base[k],v)
else
base[k]=copy(v)
end
else
base[k]=v
end
end
return base
end
base |
The table to be merged into. This table will be modified. |
new |
The table to merge in. This table will not be modified. |
Returns: | The modified base table. |
To use these two functions, your tables must be:
- free of circular references
- tree-structured
Example of a circular reference in tables:
a={}
b={}
a[1]=b
b[1]=a -- creates a circular reference
c=copy(b) -- this will hang
Tree-structured tables have each sub-table only referred to once. Violating this will not result in hangs, though, only perhaps unexpected results. For example:
a={1}
b={a,a} -- sub-table a is referred to twice
c=copy(b)
assert(c[1]!=c[2]) -- the members of b are the same table but the members of c aren't!
Deep Copy a Table
This is useful for creating new copies of a data structure that can be modified independently of the original.
old={a=1,b={c=2,d=3}}
new=copy(old)
new.a=4
assert(old.a==1)
assert(new.a==4)
old.b.c=5
assert(old.b.c==5)
assert(new.b.c==2)
Deep Merge Two Tables
This function modifies a base table by replacing its values with those from a table of new values. This happens recursively, so, if the base table contains sub-tables, and the new table contains sub-tables at matching keys, those sub-tables will also be merged. (And their sub-tables, etc.)
This is useful for "patching" a nested table with a set of changes.
base={a=1,b=2,c={d=3,e=4}}
new={b=5,c={d=6,f=7}}
merge(base,new)
assert(base.a==1)
assert(base.b==5)
assert(base.c.d==6)
assert(base.c.e==4)
assert(base.c.f==7)
- @luchak
Pixel Art Gallery
Artist Spotlight: Mierdinsky
I am a pixelartist from Colombia, I focus my work on capturing the cultural diversity of my country. In most of my pieces I abstract the flora, fauna and typical characters. I have commissions open every month of the year and I put all the good energy into each project. A few months ago I got to know the PICO-8 color palette and I loved it for its versatility.
On August 1, 2007, I was due to submit some artwork, but two days before the deadline, my hard drive crashed. In order to fulfill my commitment, I had to use the old computer at home. It was then that I discovered PIXELART, a technique used by video game companies to graph in the 80's and 90's; From that moment, I knew that my mission was to bring joy to every home through my pieces made with pixels and my collection accounts in .pdf format.
(Example of his work outside of the PICO-8 palette)
You can find and follow Mierdinsky on Twitter as @Mierdinsky or Instagram at @mierdinsky.
Prototype Party
Each month, this section of Pico-View will bring you a prototype with a focus on a unique mechanic or style. You can take the challenge of putting your own spin on this prototype. Feel free to take the code from here and use it however you want!
This month's prototype is named "Slimer Climber". It is a vertical platform jumper.
Instead of being endless, it has a goal platform that gets farther away with each level you complete. To add to the challenge of jumping up platforms, the platform widths also oscillate wider and shorter so you need to time your jumps appropriately.
This is a great place to start for beginners, with a little extra challenge to understand and tweak the oscillation code, so take this mechanic and see what you can do! Try it out right here!
We challenge you!
Take this prototype as a jump-off point to practice your skills, and add your own flavor to it. The only requirement is to keep the oscillation somewhere in the platforms!
How to Share
You can post your spin-off on the BBS, tweet it with the hashtag "#picoview", and join our Discord community if you have questions or want to share your progress. Here is the game cart if you want to see how we made it!
And if you don't have PICO-8, you can edit this game right in the browser with PICO-8 Education Edition:
Closing Remarks
Thank you for reading the July issue of the Pico-View web-zine! We hope you enjoyed all of the articles this month. Here are the folks who helped piece the zine together one pixel at a time...
-SaKo - Cover Art
-Archonic - Article Writing, Function Contributor
-Pedro Machado - Article Writing
-Vlad-Constantin Comarlau - Interviewee
-Josiah Winslow - Article Writing
-Mierdinsky - Artist Spotlight
-Luchak - Function Contributor
-Achie - Game Reviewer & Article Writing
-Marina - Interviewer & Zine-founder
-Glimm, Wolfe3D, ohhcurtains, KumaKhan22, Godmil, Nerdy Teacher J, Sika, Pico-8 Gamer - Random Reviewers
-NerdyTeachers - Zine-Coordinator, Editor, and Article Writing
Thanks to all the authors, contributors, and readers for supporting our Pico-8 zine! If anyone would like to write an article, share pixel art, or help with anything contact @Marina Makes or @NerdyTeachers on twitter or Discord.
-Nerdy Teachers
25853
26 Jul 2023