
slit animation
Probably just the start of some graphical experiments.
Improvements to the animation could still be made, but it's a start.
The code is also still messy and could use some cleanup.
This works like a slit animation.
New features include;
Screen border
Many new pipe colors
New pipe design
New borb design
Less dirt
I hope you enjoy
Hello! This is a small game I made for a school physics project.
It is heavily inspired by WHAT THE GOLF? and WHAT THE BAT? by Triband.
It features a tutorial, 4 levels, 12 total gags/sublevels, and a boss fight.
I built it on top of zep's collision demo but modified it to account for mass and elasticity (still not very accurate though).
Celeste Midnight
Welcome to Celeste Midnight! In essence, this is a harder version of Celeste. I added a Deathless mode, a way to show hitboxes, a skip level function, and some TASing capabilities in a new code tab. Have fun! :)
Feature Overview
TOHEX()
Converts to a hexadecimal string filled with zeros.
- If the number of digits is not specified, specify 0.
- The maximum number of digits specified is 4.
- This function consumes 40 Token.
?tohex(32) -- 20 ?tohex(32,3) -- 020 ?tohex('0x32',1) -- 32 |
This function is included in the KNUTIL library.
release note
To commemorate the release of the Teenage Mutant Ninja Turtles Arcade core on MiSTerFPGA, I decided to whip up this little cover. I was so excited to get it done, but ended up throwing it out and starting over, missing my mark...
Anyway, Here it is for everyone to listen to.
Please let me know what you think!
P.S.
Logos are really hard to draw with a trackpad... :)
Somewhat proudly presenting...
TIS-8
Introduction
This is a demake of possibly the least visually compelling and overall ill-suited games to port to Pico-8; TIS-100!
If you are familiar with Zachtronics games (and frankly why wouldn't you be?), you will be aware of this game already but in case you aren't, here's a (non-manual) way of explaining what it is:
TIS-100 is a virtual computer system produced in 1972 featuring a multiple-core architecture. Basic Execution Nodes can have up to 16 lines of assembler-esque code written into them and data is passed from one core to another. Each core only has one accumulator register and a non-interactable bak register. There are also Stack Memory Modules which can have up to 16 numbers pushed to and popped from them. The goal of the game is to read the instructions for each level, take the inputs from the top and using the nodes and modules, output the correct values at the bottom.
Cart features
- the first 17 levels that only feature Basic Execution Nodes and Stack Memory Modules. The Visualization Module isn't implemented in this.
- mostly near as damnit accuracy of the original game. I can't say that the tick/cycle counts will be the same (they won't) or that the ANY orders are the same when multiple nodes are all in read or write contention, but that shouldn't impact on your gameplay experience.
- high scores are saved but understandably code is not. copy and pasting level data is included but was mostly used for playtesting and there is no error checking on paste.
- a somewhat comprehensive version of the manual is included for those that aren't familiar with syntax.
Notes on control
Obviously taking a 100% keyboard driven game and mapping it to a dpad and two buttons isn't easy or even sensible, but I've hopefully made it as painless as possible. I did not want to enable devmode for this game as your Pico-8 didn't ship with a keyboard out of the box! Plus I wanted to play the game on my Linux based handheld emulator device. Controls are described at the top of the manual.
Change focus between three elements; playback, editor and navigation. Circle generally enters and allows edit, whereas Cross backs out. Setting labels on code is probably least intuitive and could do with a slight tweak, but I wanted to ship this nice and quick and it isn't so bad once you get used to it.
Final notes / disclaimer
I hope anyone who enjoyed playing the PC version enjoys this, even if it's a funny diversion. I enjoyed playtesting it and surprisingly the one-node-per-screen limitation wasn't as much of an issue as I feared.
I have done my best to make sure inputs and outputs are correct, but entering hundreds of numbers on a 65 key keyboard is likely to result in a typo and if that has happened, I apologize wholeheartedly. Let me know if there's an issue and I'll fix it. Likewise if you notice an issue with code you've written, please drop a comment below and I'll see what I can do. Tokens and most of all size are quite tight now.
Lastly, if the thought of playing this game interests you and you have not played the original (or any Zachtronics game), please please please check them out. Zachtronics literally gave birth to the Zach-like subgenre of puzzle games so give them a little love! Zachtronics' website
Introduction
You crashland after being a sleep for thousands of years.
You rather go back to sleep again, if you are being honest to yourself...
So go out there and reach for the stars!
⚠️ BTW THIS GAME IS HARD 🔥
Controls
Arrow keys or dpad.
Z/X keys or A/B buttons
Credits
Sebastian Lind
Made for #PPJJGG Game Jam
Theme: PENALIZED
Update
- Added a tutorial section in the pause menu
I need help using the MGET to make collisions i need some help please
This is for one of my classes.
You are making gunpowder. Press Z to scroll through the text on the top of the screen and use the arrow keys to increase or decrease whatever ingredient your cursor is on. When you have some gunpowder made, you can pause by clicking the pause button to the right of the game or by pressing either P or ENTER on your keyboard. After doing so, use the arrow keys to move down to [BLOW STUFF UP] and press X or Z to blow up some terrain. In this mode, you use the arrow keys to move around the gunpowder and press DOWN to drop the gunpowder. Pause again to go back to mix more gunpowder.
Just released a new feature for my VSCode plugin PICO-8 LS: Code formatting! (Link to install VSCode extension)
IMO it's most useful for making minified code from e.g. a tweetcart more readable. Example:

(The code snippet above is the excellent TweetTweetJam entry XTRIS, by Fletch: https://fletchmakesstuff.itch.io/xtris)
Note that it's accessible in multiple ways:
- The regular
Format Document
command in VSCode (alt+shift+F is the default keyboard shortcut) Command Palette
->PICO-8 LS: Format File
for regular code formattingCommand Palette
->PICO-8 LS: Format File: Each Statement on Separate Line
which will put each statement on a separate line. (By default, the formatter lets multiple statements be on the same line, preserving your cart structure.) This is the command used in the GIF above.
Please be careful when using this tool, and save a backup of your cart before formatting it! Since this is the first time it's being released, there may still be issues to work through.
Big thanks to beetrootpaul for help implementing this feature!
Report any issues here: https://github.com/japhib/pico8-ls/issues
Greetings thy humble peasants! I, thy mighty deity, have blessed thee with a demo of my recreation of Celestial Resort from the steam release of Celeste. It has some stuff i guess. It also has a secret pro tip that therapists DON'T WANT YOU TO KNOW! Keep in mind that this was made by a middle schooler in like a month with little to no pico-8 code experience prior to this. And I suck at pixel art. Cheers.
Thanks to @StrongSand94191 for the new ending!!?!?!/1!


Headline Generator
silly project I did yesterday.
It picks 3 lines from 3 different lists and combines them based on a seed so you get randomized headlines.
You can flip pages with the arrow keys.
It was a challenge to make something both randomized and internally consistent.
The art for the images has been a bit of a struggle.
They need to be readable enough to feel like they mean something, but ambiguous enough to fit almost any context.
I feel like I didn't completely succeed with the images, so I might end up changing the art later.
If you know a good joke that fits the template, feel free to put some lines in. Just insert them into the lists on tab1. The lists don't have to be the same length. If you add a lot of entries (like say 15 or so) you should probable make it pick from a bigger random number in the for loop that generates the seeds (right after the "end" of the draw funciton).
Because of the way the images are picked, occasionally you see the right edge of the sprite sheet. This didn't bother me that much, so for now i left it like that.
PS is there some sort of modulo function in pico8? I think lua has one in its math library, but I couldn't immediately it in pico8. I ended up writing my own modulo function to convert bigger seeds into smaller ones so the arrays don't return "nil" when te seed is bigger then the length of the array.
possible improvements
- a page flipping sound
- a full page flipping animation is still too complicated at the moment, but some other screen transition might also be nice
- better humour
- better fitting images
im so close to finishing my biggest project yet, but another bug comes up!
anyboy know why the player wont jump?
function _update60() cls() if(btnp(⬆️))then yv=5 end if(btn(➡️))then xv+=s end if(btn(⬅️))then xv-=s end if(xv>mxv)then xv=mxv end if(xv<0-mxv)then xv=0-mxv end yv+=g y+=yv x+=xv if(xv>0)then xv-=f if(xv<0)then xv=0 end end if(xv<0)then xv+=f if(xv>0)then xv=0 end end if(y>120)then y=120 end spr(skin,x,y) end |
My first game. It's very simple but I was happy to see it to completion. :)
Feature Overview
TONORM()
normalize argument values (strings) to the correct type.
- Mainly converts from strings to values of the correct type.
- Especially used to initialize multiple values from a long string, see HTBL().
- Hexadecimal numbers are converted to decimal numbers.
- This function consumes 28 Token.
?tonorm('true') -- true (The type is 'boolean') ?tonorm('nil') -- [nil] (The type is 'nil') |
This function is included in the KNUTIL library.
If you want to check the type at once, consider using a DMP().
release note
Here's two low effort Celeste mods where I only changed the dash mechanic (and sometimes bits of levels to make them more possible.)
Your dash has been replaced with the ability to teleport to the ceiling. I wish I had this ability irl, I would use it every day
You can phase through walls while dashing. I wish I had this ability irl, I would use it every day
On the latest episode of his advanced shmup tutorial, @Krystman showed off a function for splitting a string into a 2D array, and then said there could be more ways to make it more compact and token-efficient. Guess what I... didn't do?
Well, I didn't make it more token-efficient - my new version is close to double that of the original 28-token function at 55 tokens - but I DID make it more versatile; It can now handle:
- 3,4,5 and onwards dimensional arrays (the original could only do 2-dimensional arrays)
- Any character for use as a separator (the original could only use "|" and ",")
- Optional tonum() conversion (the original had that forced on)
In fact, you could use this function exclusively instead of the built-in split() and you might not even notice. In order to get multi-dimensional arrays, the sep
parameter should be given a string that is more than a single character long, with the most significant separator characters coming first. Oh, uh, after you paste the function into your code, that is. Speaking of which...
function splitf(str,sep,tnm) local cnt=type(sep)=="string" and #sep>1 local arr=split(str,sep,not cnt and tnm!=false) if cnt then for k,v in pairs(arr) do arr[k]=splitf(v,sub(sep,2),tnm) end end return arr end |
if you want to get a good idea of how it behaves, paste the function definition into an empty cart, and then follow it up with this testing snippet:
function recursive_print(t,d) d=d or 0 for k,v in pairs(t) do for i=1,9 do flip() end ?"\f2\*"..d.."|\fb"..k.."\f7: \fc"..tostr(v).."\f6 ("..type(v)..")" if type(v)=="table" then if d<8 then recursive_print(v,d+1) else ?"\f2\*"..1+d.."|\f8[ ** max depth reached ** ]" end end end end cls() ?"printing split string",13 recursive_print(splitf("1,2,3|1,2,3|1,2,3 1,2,3|1,2,3|1,2,3 1,2,3|1,2,3|1,2,3"," |,",true)) |
Of course, I'm sure I'm not the first person to come up with this function, and it's probably overkill in most cases. Still, if anyone wants to mess around with the function and make it more token-efficient, then I'll leave off by saying that the cnt
local variable is the variable that determines if a recursive function call is necessary. (cnt
for 'continue'. Previously I went with lst
for 'last', but the continue flag was better at capturing the nuances of what happens when you give split()
a non-string value for its separator.)