Snake in a QR Code(itsmattkc.com) |
Snake in a QR Code(itsmattkc.com) |
PICO-8 is a virtual game console. I.e. it's an emulator for an oldschool game console that doesn't exist in reality. It's designed to be easy to code for while maintaining the limits and aesthetics of old game computers
PICO-8 games are, of course, distributed on cartridges. However because it's a virtual console, the cartridges are virtual too: they're PNG files.
Try browsing PICO-8 games here: https://www.lexaloffle.com/bbs/?sub=2&cat=7
Press the play button the play a game right inside the web browser, but be sure to click the little "Cart" link right below the playing area to see what's going on. You'll see it open a little PNG file.
That PNG file is the cartridge. It contains the entire game.
The file format is explained here: https://pico-8.fandom.com/wiki/P8PNGFileFormat. Obviously, because PICO-8 carts are purely digital, the format doesn't need any of the contrast, the error correction features or the orientation markers that QR-codes have. You can't take a picture of a cart with your phone and play it. You need the exact same, byte-for-byte PNG file. But it's still super cool.
That said, I think the PICO-8 ecosystem is a lot cooler than I made it sound :-)
EDIT, try watching this demo for example: https://www.youtube.com/watch?v=UR3MXKIefAI It's a demo, not a game, so not interactive and hence youtubeable. Tell me that isn't cool (and remember, it fits in is cartridge png).
E.g. on https://www.lexaloffle.com/bbs/?tid=29967
Takes you to https://www.lexaloffle.com/bbs/cposts/4/44467.p8.png
(I feel a little evil for even suggesting that)
When I still used my Pebble watch, my favorite watch face was just a QR-code of the time. So to tell what time it is, you have to scan your watch with your phone.
(If you want to take a guess at what I'm referencing, spoiler alert — the URL itself contains a clue: https://web.archive.org/web/20160129014847/http://i.emezeta.... )
Had to add a security exception only to receive
404 Not Found
nginx/1.18.0
:/(It doesn't need a .NET runtime; it's fully self-contained and runs on Windows as a native app.)
Just print out stickers and put them up at restaurants, stores...
(small process snapshot sizes and sandboxing capabilities)
Using the WebAssembly VM would be a good alternative for real applications.
All the data is stored in the QR code.
https://aaronfrancis.com/2013/remaking-cellphone-snake-in-mi...
That would be the best way to transfer files in physical locations.
[1]: https://apple.stackexchange.com/questions/301563/what-is-the...
[2]: http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&Sect2=H...
[3]: http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&Sect2=H...
He also made a video about it: https://www.youtube.com/watch?v=ExwqNreocpg
https://smallbasic.github.io/images/screenshots/mira.bas.png
Unfortunately, scanning large QR codes doesn't seem to work too well in practice :(
...slightly larger than the executable shown in the video because I decided to add a little more functionalityBesides, that binary is small enough that it would be far easier to analyse than the piles of other software you use every day.
>Naturally, a more accurate value can be obtained by using a bigger program.
That's delightful
So at any point while being copied from person to person, that game data could be lost.
And keep in mind, malicious software is going to be challenging, and there are much more clever ways to use QR codes.
E.g., imagine some store that has QR codes on the product aisles to access information on a product via a URL. I make a fake website that spoofs the legit product page, but offers the user a special "Buy online and save 25%" offer, which of course they are very tempted by due to the steep discount.
There are some interesting approaches listed at https://news.sophos.com/en-us/2019/10/17/beware-the-square-h...
The images are RGBA PNGs. So for each display pixel there's a byte for each color channel and the alpha channel. The two least significant bits in each byte are a quarter of a PICO-8 data byte. Those bits are read from a channel byte and concatenated in RGBA order to get a data byte.
Using the LSBs for each channel means the those swizzled bits won't contribute very much to that pixel's color value. At worst it would just look like noise in the image.
Also by putting the data inside the image data of a PNG it won't be stripped off by some optimizer or hosting service.
Note that if you cut and paste into Chrome it may delete the "javascript:" part and you will have to add that back.
You could probably use a data: URL to avoid needing a server at all, but if not, the server would just provide a launcher and not host the application code.