Log In  
[ :: Read More :: ]

Larkstongue v.0.0.1-alpha

Larkstongue is an asset packer, written in Python. It can extract raw cart data from a .p8 file, compress and pack assets into the cart data of a .p8 cart, and generate code for unpacking that data.

Current features:

  • Extracts any cart data area
  • Special extract function for bitmaps with automatic cropping
  • Generates loader code according to the user's specifications
  • Hilbert curve mapping for bitmaps
  • Run length encoding
  • Huffman coding

Larkstongue is currently in early public alpha, so there will probably be a lot of quirks still. Remember to keep backups of any carts you use it on!

Get it on GitHub and give it a try! Do try to break it and tell me how you broke it :)

P#76218 2020-05-09 05:05

[ :: Read More :: ]

Cart #obj_import_v01-1 | 2020-04-25 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

An importer for the Wavefront .OBJ format. Exports a code template with setup and a basic rendering loop. The template uses includes that are available at https://github.com/jorikemppi/pico-8-bits-and-pieces/tree/master/include. Import/export features require clipboard access, but if you just want to play around with it on a browser, it can also generate a cube.

Currently work in progress, both on the rendering engine side and the importer GUI side. Feel free to share your GUI improvement suggestions, as nearly everything in the GUI can currently be improved a lot :)


  • Loads both Wavefront .OBJ files and its own internal format by pasting the object into PICO-8
  • Exports a code template with the object, plus a string with the object and material data encoded in a format you can reload in the importer
  • Translate, rotate, scale and reflect functions
  • Material editor (a material consists of diffuse and ambient values, plus a gradient used for shading)
  • Layering system (if you need to force rendering order because of painter's algorithm problems)
  • Automatic material and layer assignment to separate objects in the .OBJ file (ie. first object has material 1 and layer 1, second object has material 2 and layer 2 etc.)

To do

  • Triangulation (currently only reads the first three vertices of each face, so for now, you need to triangulate your objects before importing)
  • tline texturing support (currently only basic flat shading is supported)
  • GUI improvements (including devkit mouse support)
  • Code readability improvements

Known issues

  • GUI bug in the reflect mode. Pressing left when X axis is selected, or right when Z axis is selected, causes a crash. I'll fix this in the next update, although all it does is flip an object so I might just incorporate that functionality in the scaling mode instead.
P#75343 2020-04-25 12:38 ( Edited 2020-04-25 13:54)

[ :: Read More :: ]

The code is still messy as heck so I'm going to at least tidy it up a bit before I share it :)

Next step, figuring out what to do about the perspective distortion. On a PS1 I'd just subdivide those triangles. On PICO-8, I'm already at 60% CPU, and while there's still room for optimization and I could always drop to 30 FPS, I don't think throwing more triangles at it is necessarily the right solution here.

Currently it calculates the UV coordinates correctly once per scanline. The first thing I'm going to try will probably be calculating them twice instead, splitting each rasterized line into half.

P#74831 2020-04-16 14:26 ( Edited 2020-04-16 14:27)

[ :: Read More :: ]


I'll be doing some visual effects coding and streaming it tomorrow on Twitch. That's Tuesday, March 24, 18:00 EET. This will actually be the first time I'm doing a show on Twitch, so hopefully everything goes well :)

Here's the link. See you there!

P#74135 2020-03-23 06:32 ( Edited 2020-03-23 08:27)

[ :: Read More :: ]

Cart #puroresu_no_seishin-0 | 2020-03-01 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

A demo, and a love letter to Japanese professional wrestling, from Jumalauta. Released at Instanssi 2020, won first place in the demo compo.

No guarantees at all about working on a browser. Tested on Firefox, crashes almost immediately. The cart works fine on the Pico-8 software, naturally. If you want to watch it on a browser, YouTube is your best bet :)

Minified using Picotool by @dddaaannn. Unminified source code available in the release zip. Some graphics are based on CC BY 2.0 photos, namely "Jushin Liger ROHxNJPW Global Wars 2018" by Troy Teague, "Shinsuke Nakamura" by temaki, and "Mt.Fuji & Tokyo SkyTree" by Atomark.

P#73577 2020-03-01 13:06

[ :: Read More :: ]

Cart #gradienteditor-1 | 2019-12-09 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

Inspired by Palette-Maker. This is a tool to create dithered 32-colour gradients. Mainly for my own use with my 3D lighting system, but I figured maybe someone else will find this useful.

The interface currently technically allows you to use more than 16 different colors, but of course, PICO-8 can't actually render that. I could fix that, but the simplest fix is that you just don't do that :)

Exports the gradient steps (on a scale of 0-127) and colors into the clipboard as Lua tables, without braces, like this:


Of course, this doesn't work on the browser, so run locally. You can use my code to render the gradient, or write your own. dw817 has written an excellent tutorial on how to implement dithering.

How to use:

up and down: select gradient step
left and right: select color for current gradient step
x: copy gradient steps and colors to clipboard (does not work in browser version)
z: lock gradient step for further functions

when locked:
up and down: move gradient step
z: unlock gradient step
x: go into add/delete mode

when in add/delete mode:
z: add step after current step
x: delete current step

P#70762 2019-12-09 12:01 ( Edited 2019-12-09 12:31)

[ :: Read More :: ]

Cart #a_resolute_purpose-0 | 2019-12-01 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

A demo by Matt Current. Released in 2019 at Vortex IV, second place in the demo compo.

NOTE: This demo deals with the theme of suicidal thoughts. Not in a particularly graphic or explicit manner, but if that's a trigger for you, you should be aware of the content before viewing the demo.

P#70435 2019-12-01 05:25

[ :: Read More :: ]

Cart #white_ale_in_benin-0 | 2019-04-22 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

A demo by Matt Current, first shown at Revision 2019. Placed third in the Wild competition.

Again, might not run properly in browsers everywhere, but naturally the cart runs just fine in PICO-8 itself.

P#63823 2019-04-22 07:00 ( Edited 2019-04-23 09:11)

[ :: Read More :: ]

I have this bit of code:

  if f==1635 then

which causes the CPU load in a demo I'm working on to go over 1.0, even when f!=1635. If I comment out the sspr functions, the demo runs at 60fps. Is this speculative execution as planned, or is this a bug?

EDIT: I was able to drop the CPU load back under 1.0 by doing it as a separate function, like this:

function drawthese()


  if f==1635 then drawthese() end
P#62828 2019-03-15 11:31 ( Edited 2019-03-15 11:35)

[ :: Read More :: ]

Cart #techno_utopian_edict-1 | 2019-04-13 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

Demo for the demo competition at the Instanssi 2019 demoparty, held in Jyväskylä, Finland in march 2019. Won first place.

Again, it might run correctly in a browser but there might also be some sync issues (specifically in Chrome, in my experience). The cart runs just fine in PICO-8 itself, of course.

UPDATE: Now fixed for 0.1.12! Which means it won't run correctly in older versions anymore, since it depends on time() for sync.

P#62464 2019-03-03 18:30 ( Edited 2019-04-13 04:40)

[ :: Read More :: ]

Cart #rockformetal-0 | 2019-04-13 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

A demo by Jumalauta. Participated in the demo compo at the JML 18 years anniversary demoparty, won first place.

Might not work properly with Chrome, there may be some sync errors and glitches. Should work consistently with Edge. Cart works just fine in the PICO-8 application itself, of course.

UPDATE: Now fixed for 0.1.12! Which means it won't run correctly in older versions anymore, since it depends on time() for sync.

P#55718 2018-08-26 11:16 ( Edited 2019-04-13 04:41)