A remake of the old snake game, very simply.
Also available to play on Itch: https://blinks.itch.io/snake
This code:
x+=x<0 and -100 or 100 |
doesn't work the way I'd expect; it sets x to either -100 or 100
I assume this happens because that line gets preprocessed to this:
x=x+x<0 and -100 or 100 |
which gets interpreted like this:
x=(x+x<0) and -100 or 100 |
but I wish it would be preprocessed to this instead:
x=x+(x<0 and -100 or 100) |
Here's a test cart; it currently (0.2.2c) fails the tests:





Was poking around in the new Pico-8 binary files and saw that the
"Pico8.dat" of version 02.2c was 15.64mb in file size compared to the earlier version I had of "Pico8.dat" of version 01.9b at 1.06mb in file size.
This prompted an investigation.
If you compare the two files you will see that version 01.9b appears to be binary:

Whereas the much bigger file in 0.2.2c appears to mostly be Pico-8 code !

So after truncating the binary data it was indeed a Pico-8 sourcecode file !
While there was no source text there was indeed a sound. Imagine my surprise when I played it.



Calling line() with these arguments is causing PICO-8 to crash. It seems any iteration around having these "extreme" values on one axis is causing it to either get stuck in an infinite loop or crash outright.
line(16,-15070,17,29772,12)
Oddly, if you flip the x and y values it'll finish executing and display the command prompt without rendering the line, but then crashes as soon as a key is pressed.
line(-15070,16,29772,17,12)

Had some time between jobs and wanted to play around with something new so picked up PICO and loved it. I had hoped to work on this more before I started but some personal stuff kept me from it. Wanted to publish the WIP. Hopefully will be able to come back to it.
Holding Z and moving creates a copy of the player. X resets the level.

Every time I try to publish a post that has a lot of content (E.g. inline code), when clickin on one of each buttons "Preview" "Save Draft" and "Publish", a spinner shows up that never resolves.
If I open the network dev tools, I see that a request is made to /pipe.php, but returns a failure with code 403. If I inspect the response, I see that it's a landing page to resolve a captcha, from Cloudfare. Title:
<title>Attention Required! | Cloudflare</title> One more step Please complete the security check to access www.lexaloffle.com |
But that page just doesn't show up because it's a XMLHttpRequest which just fails to load.
I got around it once by editing the HTML to turn the edit page into a form with method="post" and action="{the correct url}" so that it actually redirects me to this landing page, I solved the captcha which set me a cookie and I was able to post it. But now it's failing again (I guess that is just temporary).


This is my attempt at translating the popular font Impact into a low-res version, covering P8SCII characters 16 to 153. All characters have a width of 5 pixels and a height of 7 pixels. A few characters also have a descender height of one pixel.
The font snippet can be copied by pressing X while playing the cartridge. The snippet can also be found in the source code, and right here:
poke(0x5600,unpack(split"6,6,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,31,31,31,31,31,0,0,31,31,31,31,31,0,0,0,31,31,27,31,31,0,0,0,27,27,4,27,27,0,0,0,27,27,0,27,27,0,0,0,27,27,27,27,27,0,0,0,8,12,14,12,8,0,0,0,4,12,28,12,4,0,0,30,6,6,6,6,0,0,0,0,0,12,12,12,12,15,0,27,14,4,31,4,31,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,12,24,0,0,0,0,0,0,12,12,0,0,0,10,10,0,0,0,0,2,5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,0,3,0,27,27,0,0,0,0,0,0,10,10,31,10,31,10,10,0,4,31,3,31,24,31,4,0,19,19,8,4,2,25,25,0,6,9,1,30,9,9,22,0,6,6,6,0,0,0,0,0,24,12,6,6,6,12,24,0,3,6,12,12,12,6,3,0,27,14,31,14,27,0,0,0,0,4,4,31,4,4,0,0,0,0,0,0,0,3,3,2,0,0,0,31,0,0,0,0,0,0,0,0,0,0,3,0,24,24,12,6,3,3,3,0,14,27,27,27,27,27,14,0,6,7,6,6,6,6,15,0,14,27,24,12,6,3,31,0,14,27,24,12,24,27,14,0,28,28,26,26,25,31,24,0,31,3,3,14,24,27,14,0,14,27,3,15,27,27,14,0,31,24,12,12,6,6,3,0,14,27,27,14,27,27,14,0,14,27,27,30,24,27,14,0,0,0,6,6,0,6,6,0,0,0,6,6,0,6,6,4,24,12,6,3,6,12,24,0,0,0,31,0,31,0,0,0,3,6,12,24,12,6,3,0,14,27,27,24,15,0,3,0,14,19,27,27,27,3,30,0,0,0,14,24,30,27,30,0,3,3,15,27,27,27,15,0,0,0,14,27,3,27,14,0,24,24,30,27,27,27,30,0,0,0,14,27,31,3,14,0,12,6,15,6,6,6,6,0,0,0,14,27,27,30,24,14,3,3,15,27,27,27,27,0,6,0,7,6,6,6,15,0,24,0,24,24,24,24,27,14,3,3,27,27,15,27,27,0,7,6,6,6,6,6,15,0,0,0,10,31,31,21,21,0,0,0,15,27,27,27,27,0,0,0,14,27,27,27,14,0,0,0,15,27,27,27,15,3,0,0,30,27,27,27,30,24,0,0,15,27,3,3,3,0,0,0,30,3,14,24,15,0,6,6,15,6,6,6,12,0,0,0,27,27,27,27,30,0,0,0,27,27,27,14,4,0,0,0,21,21,31,31,10,0,0,0,27,27,14,27,27,0,0,0,27,27,30,24,27,14,0,0,31,12,6,3,31,0,30,6,6,6,6,6,30,0,3,3,6,12,24,24,24,0,15,12,12,12,12,12,15,0,4,14,27,17,0,0,0,0,0,0,0,0,0,0,31,0,6,12,0,0,0,0,0,0,4,14,27,27,31,27,27,0,15,27,27,15,27,27,15,0,14,27,27,3,27,27,14,0,15,27,27,27,27,27,15,0,31,3,3,15,3,3,31,0,31,3,3,15,3,3,3,0,14,27,3,27,27,27,30,0,27,27,27,31,27,27,27,0,15,6,6,6,6,6,15,0,24,24,24,24,24,27,14,0,27,27,27,15,27,27,27,0,3,3,3,3,3,3,31,0,17,27,31,31,27,27,27,0,25,27,31,31,31,27,19,0,14,27,27,27,27,27,14,0,15,27,27,15,3,3,3,0,14,27,27,27,27,27,14,24,15,27,27,15,27,27,27,0,14,27,3,31,24,27,14,0,15,6,6,6,6,6,6,0,27,27,27,27,27,27,14,0,27,27,27,27,31,14,4,0,27,27,27,31,31,27,17,0,27,27,27,14,27,27,27,0,27,27,27,31,6,6,6,0,31,24,12,6,3,3,31,0,28,6,6,3,6,6,28,0,4,4,4,0,4,4,4,0,7,12,12,24,12,12,7,0,0,0,0,22,9,0,0,0,0,0,14,10,14,0,0,0,31,31,31,31,31,31,31,0,21,10,21,10,21,10,21,0,0,17,31,21,21,14,0,0,0,31,17,17,27,31,0,0,17,4,17,4,17,4,17,0,0,2,30,14,15,8,0,0,0,14,23,31,31,14,0,0,0,27,31,31,14,4,0,0,0,14,27,27,27,14,0,0,0,14,14,31,14,10,0,0,0,4,14,31,10,10,0,0,0,31,19,17,19,31,0,0,0,14,21,31,17,14,0,0,0,28,4,4,7,7,0,0,0,31,17,21,17,31,0,0,0,4,14,31,14,4,0,0,0,0,0,21,0,0,0,0,0,31,25,17,25,31,0,0,0,0,4,31,14,10,0,0,0,31,14,4,14,31,0,0,0,31,27,17,17,31,0,0,0,5,2,0,20,8,0,0,8,21,2,0,8,21,2,0,0,31,21,27,21,31,0,0,31,0,31,0,31,0,31,0,21,21,21,21,21,21,21,0")) [ [size=16][color=#ffaabb] [ Continue Reading.. ] [/color][/size] ](/bbs/?pid=90764#p) |
Fireworks
Some fairly simple particle fireworks just for fun.
Press X to switch the screen effect on/off. For more about that see here: https://www.lexaloffle.com/bbs/?tid=41149
Every sixth of a second, 50-100 Particles are emitted at a random point on the screen with random angle/velocity determined by a tiny bit of trig. They're given colours in the top half of the PICO-8 palette (7+) and as the particles get old the colour changes according to the same mapping that the screen fade effect uses to a darker colour.
If they run out of life or become black then the particles are deleted.
There are two possible update functions for each particle - one with a wiggle :)



So I've just been thinking: wouldn't it be much more convinient to be able to "push" a new version of a cartridge to the BBS?
So I came up with three concept commands:
- "PUSH"
- "LOGIN"
- "LOGOUT"
First, the login command. The syntax would be as follows:
LOGIN USERNAME PASSWORD |
The screen would then be cleared and a login request would be sent to the BBS servers. If all goes well, then the login would be remembered until you logout. This would allow for things like viewing favourited cartridges and seeing them stored on other devices and on the BBS itself.
"LOGOUT" is self explanatory.
Now, the push command. It can only be used when a cartridge is loaded in memory. The syntax is as follows:
PUSH CARTID |
CARTID being the normal ID, without the version(so "cart", not "cart-0" or "cart-1"). This would then execute the following steps:
- Check if logged in

I've made a spike for cartriges to send http requests and receive their response.
The way it works is the cartrige communicates with the browser through gpio. In here I'm using 2 assumptions (I guess dangerous ones) that make it quite simple to send messages:
- We get synchronous interrupts from p8 -> JS when p8 writes to a GPIO.
- We read an analog value 0-255 in perfect accuracy.
So... yep, this code atm only works in a browser. And it might be posible that it breaks later on (specially for assumption 1, as it depends on the runtime implementation)
It's separated in two layers: The first one just abstracts over sending and receiving any message
html_messaging.lua html_messaging={ send_message=function(self, message) -- sends a `message` string to the host HTML end, add_listener=function(self, listener) -- adds the `listener` function to be called with receiving messages end, remove_listener=function(self, listener) [ [size=16][color=#ffaabb] [ Continue Reading.. ] [/color][/size] ](/bbs/?pid=90761#p) |




My first game - find the key, then the door. Enemies chase you. You and enemies have momentum and simple physics, so you can dodge/juke the enemies to make it to the door. Updated for improved enemy AI. Updated again with new menu options.
0.9.5 - Improved enemy AI, and enemy attributes (speed, etc.) are randomized
0.9.7 - Improved enemy AI (again). If you beat level 15, it adds cheats to the menu: need-key-toggle, can-die-toggle and slomo-toggle
0.9.8 - Added ability to pick from one of these characters:
- Barry - Slowest, but the most agile
- Deon - Fastest, but the least agile
- Devon - Between Barry and Deon for speed and agility



This is a little dodging game I worked on for about a month, and forgot to release it! :P But better late than never I guess. So here ya go!
I know this should go without saying but, DONT STEAL OTHER PEOPLES HIGHSCORES ON THE TABLE!
P.S. I am EBO on the highscore table. See if you can beat me! ;)
Controls:
Cursor Keys: Movement
Credits:
Highscore Table: lazydevs
Everything else: ME! :D
Update Log:
v1.1: Fixed bug with 32k limit
v1.0: Initial Release
This is a little survival / building / crafting / resource collection game I worked on for a week or two. Hope you like it! :D
How to save your worlds:
Press Enter or P to pause the game, and use the cursor keys to select save.
that will save the map to your computer's clipboard.
Then to load a world, just copy the data to your clipboard,
pause the game, and use the cursor keys to select load!
Controls:
In Game:
Cursor Keys: Movement
Q: Menu
X: Mine
Y: Place
(You mine and place in the direction you last moved)
Menu:
Cursor Keys: Move Selection
X: Craft
Q: Exit Menu
Update Log:
v1.3
ADDED SAVING AND LOADING!!!




I was listening to Missile Command's music, and really liked it, so I decided to export it to a .wav . I selected patterns 0-19 and, in the terminal, type the command:
EXPORT MISSILECOMMAND.WAV |
The result was, indeed, a .wav file, but played around a quarter of the first note of pattern 19. That's it. I'm quite annoyed since the menu music in Missile Command is very good, but that's not the point. The point is there's a bug.
