Log In  

Here's 0.1.6! You can download it from your updates page while you're logged in, or from your Humble Store Library. Just a reminder, that if you're a Voxatron alpha customer, you also own PICO-8! (it should show up automatically in both places).

By far the biggest change is the addition of SPLORE, a complete bbs and local cartridge explorer. You can run it by typing SPLORE, or start PICO-8 with "pico-8 -splore". If you plug a joystick in and auto-boot into splore, it's possible to navigate everything using only the 6 buttons + menu button.

This version also has a lot of new data storage functionality. Cartridges can cstore() to themselves in order to save extra data, and this is now officially supported on the web, so don't feel like it's a weird hack that's going to break! (actually it might break, but it's supported, so I'll fix it :p). Here's a demo:

Cart #19844 | 2016-04-17 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

Notes on cartridge storage, and the full change log:

    Cartridge Data

    Each cartidge is able to store 64 numbers (256 bytes) of persistent data 
    on the user's PICO-8 (rather than on the cart itself). This can be used as
    a lightweight way to store things like high scores or to save player progress.

    If you need more than 256 bytes, it is also possible to write directly to the
    cartridge using cstore(). The disadvantage is that the data is tied to that
    particular version of the cartridge. e.g. if a game is updated, players will
    lose their savegames.

    Another alternative is to write directly to a second cartridge by specifying
    a fourth parameter to cstore(). This requires a cart swap though (so is 
    slightly slower), and leaves data-cart litter when run from a local folder.


        Added: SPLORE local & bbs cartridge explorer
        Added: setmetatable(), cocreate(), coresume(), costatus(), yield()
        Added: Spinning cart icon to show when a cart is swapped / written to
        Added: Permanent storage when carts played in a browser
        Added: Adjustable aspect ratio (-aspect 420 for 1:1)
        Changed: Lua memory limit: 1024k (was 512k)
        Changed: Music channel now resumes after being clobbered by an sfx 
        Changed: Arpeggios double speed when SFX speed <= 8
        Changed: Exceeding compressed code limit does not block saving in .p8 format 
        Changed: spr() half as expensive, to be consistent with map()
        Changed: Fractional hex number notation: 0x0.3 == 0x0.3000, (was 0x0.0003)
        Changed: : operator doesn't count as an extra token (same as .)
        Changed: cstore() writes directly to disk
        Changed: cstore(), reload() return number of bytes read / written
        Changed: save() while running does nothing. (use cstore() instead)
        Changed: load() while running loads and runs the specified cartridge 
        Fixed: Small pops in audio mixer caused by sound wave discontinuities
        Fixed: HTML5-exported sound clicks badly under Chrome
        Fixed: Display palette is not oberserved when exporting GIFs
        Fixed: Rapid keypresses causes duplicate readings in tracker & text editor
        Fixed: += inside comments breaks preprocessor
        Fixed: sspr() cpu cost the same when clipped
        Fixed: cartdata() with bad parameters crashes
        Fixed: EXPORT from commandline can not be used without brackets and quotes

P#19847 2016-04-17 18:48 ( Edited 2016-06-03 02:10)

hey zep,

ps: is there any way to continuously search inside the code editor? after pressing enter, the field closes. I also cannot paste in strings, and must repeatedly type in same string to find its next occurrence..

P#19849 2016-04-17 19:03 ( Edited 2016-04-17 23:13)

Yes, you can CTRL-G to repeat. (Updating the manual..)

P#19852 2016-04-17 19:17 ( Edited 2016-04-17 23:17)

On Mac "cmd+g" does work perfectly! Thank your for all the hard and amazing work you do!

P#19853 2016-04-17 19:21 ( Edited 2016-04-17 23:21)

Sweet! It's great to be able to use SPLORE after so many screenshots of it! Also, I love SPLORE's name ^.^ Would it be possible to have an "update all" option for splore?

P#19854 2016-04-17 19:50 ( Edited 2016-04-18 00:04)

I'm thrilled to pieces with Splore. People can buy Pico-8 and immediately start playing hundreds of games. It's the fastest cheapest app store in the world.

Now I'm fantasizing about other Pico-8 + BBS interactions like publishing, snippet sharing, and global code search from within the editor. Global as in all published carts.

P#19857 2016-04-17 21:06 ( Edited 2016-04-18 01:06)

Ooohhh, I really like those ideas, especially publishing from within PICO-8. Maybe eventually even being able to read and interact with whole threads. (this really makes me wish PICO-8 were opensource, then I could help add this stuff instead of zep doing all the work)

P#19861 2016-04-17 22:17 ( Edited 2016-04-18 02:17)

Woo, so excited about SPLORE in particular.

P#19870 2016-04-17 23:35 ( Edited 2016-04-18 03:35)

Great release! I have, however encountered a crash-making bug with Splore that I'm now posting in support.

P#19872 2016-04-18 03:25 ( Edited 2016-04-18 07:25)

Great update - any chance, we'll see multi cart support for splore and the web player anytime soon?
Technically this shouldn't be that hard now - with the mechanisms for splore, the file based memory commands could translate into splore calls. If this isn't the case already anyway (Haven't tried yet, but in that case I would wonder, how the cartride reacts on an initial load. Maybe an additional preload command would do the trick here?)

P#19874 2016-04-18 03:28 ( Edited 2016-04-18 08:09)

Hey I trust you, but both the Windows 10 SmartScreen and my antivirus (Panda) are complaining when I attempt to run the installer. Is this because it's not signed or could it be compromised in some way?

P#19884 2016-04-18 10:41 ( Edited 2016-04-18 14:41)

In SPLORE, 'o' button to select/launch a cartridge and 'x' button to go up a directory. It can be awful to scroll up a large list of carts when navigating folders.

P#19889 2016-04-18 13:34 ( Edited 2016-04-18 17:34)

Another suggestion: Link SPLORE to our BBS accounts so it shares favorites

P#19890 2016-04-18 13:56 ( Edited 2016-04-18 17:56)

love it zep! keep up the amazing work. both the saves and splore are fantastic.

P#19899 2016-04-18 15:24 ( Edited 2016-04-18 19:24)

Yes OOP with setmetatable :-)
Right now, I'm on my raspberry pi to try to use i/o. Coroutine may be fun too...

P#19900 2016-04-18 16:00 ( Edited 2016-04-18 20:00)


P#19903 2016-04-18 16:48 ( Edited 2016-04-18 20:48)


P#19924 2016-04-19 16:26 ( Edited 2016-04-19 20:26)

\o/ this is awesome!

P#19928 2016-04-19 20:13 ( Edited 2016-04-20 00:13)

still $15 tho

P#19933 2016-04-20 01:36 ( Edited 2016-04-20 05:36)

still worth it!

P#19934 2016-04-20 05:14 ( Edited 2016-04-20 09:14)

Totally worth it!

P#19936 2016-04-20 09:30 ( Edited 2016-04-20 13:30)

Very nice work, I really appreciate the audio, setmetatable, and cart persistence changes!

However, I just noticed some subtle bugs with semicolons that seem to be new in this version.

I tried a couple carts of mine which worked fine 0.14, and noticed that without changes, a few issues crop up in 0.16.

Semicolons no longer work as table separators, which you can confirm on the command line:

for i in all {1;2;3} do print(i) end -- error

Replacing this with commas works.

for i in all {1,2,3} do print(i) end -- prints 1 2 3 each on a new line

Also, semicolons are supposed to serve as a grammar-disambiguation between parentheses and function calls, which used to work... but 0.16 it treats it as if the semicolon isn't there:

;(x or print)('hello') -- should print 'hello', but instead triggers a runtime error (it tries to call y as a function)

While this particular example causes an error, this bug can cause code to silently run with different unintended behaviour.

This part of the Lua 5.2 manual explains the ambiguity further down and recommends the semicolon as a workaround (because Lua's parser doesn't treat whitespace as significant, semicolons as statement separators are pretty much optional except in the case of disambiguating leading parens vs function call in assignment rvalues) http://www.lua.org/manual/5.2/manual.html#3.3

But other than these semicolon issues, things work fine so far! Going try to dive into the new build more when I find time.

P#19941 2016-04-21 00:06 ( Edited 2016-04-21 04:13)

Hey zep, I'm really enjoying the new update!

Splore is really cool, but I go around accidentally favoriting everything when i navigate around it (i'm a weirdo that uses esdf and jk so i don't have to move my hands from the home row as i'm playtesting and coding). I just wanted to give you a heads up about it.

Besides that little thing, i've really been enjoying the new update! Thanks for all your hard work!

P#19943 2016-04-21 01:30 ( Edited 2016-04-21 05:30)

Any way to get it to look in it's own folder for the config file before creating files in %appdata%? I run this thing off a usb stick on different computers. It's kind of a hassle to tell it where to look for the carts on the stick everytime, and then to have to clean out %appdata% on the host machine when I'm done.

P#19949 2016-04-21 11:30 ( Edited 2016-04-21 15:30)

How can I clear the search and enter a new search term in splore?

P#19967 2016-04-22 14:38 ( Edited 2016-04-22 18:38)

movAX13h, that seems to be one problem with SPLORE. I actually came here to report that problem. To change the search, from what I can tell, you have to restart PICO-8.

P#19972 2016-04-23 03:30 ( Edited 2016-04-23 07:30)

Love the loading icon at the top left while accessing another cartridge :)

P#19987 2016-04-24 12:57 ( Edited 2016-04-24 16:57)

Good job on splore! It's really well-polished and shows off the Pico-8 platform well. :3 Aside from that oddity with the search function. (The "Search" menu option turns into "Update" like all the other categories, becoming useless!)

But it cheats by doing networking, the same way the editing tools cheat by letting you use the mouse. X3 Damn it, I wish I could use sockets or make HTTP requests to download PNG data in my Pico-8 games! :P

And splore doesn't get its memory cleared by reboot, either, since it's not a cartridge. :( Such cheat~

EDIT: Gamax92's game Air Raiders gets broken in few weird ways by 0.1.6! When you press X to reset the game (and possibly trigger rain), it calls run() to do so, which makes the cartridge spin animation play again and a big delay for no apparent reason? And when you download it to play via splore, the cartridge art disappears (possibly because the cart label is hacked and doesn't necessarily conform to the Pico-8 palette?)

The spinney cartridge thing also breaks parts of user memory, so PicoWare Inc. is no longer playable at all. :( You get one microgame, then you instantly game over with a score of 1 point.

I find it odd that splore overrides the Esc key with the pause menu while in use, but then after exiting splore it leaves the cartridge in memory anyway, so why...? Ah... I think I understand now, nevermind.

P#19992 2016-04-25 17:30 ( Edited 2016-04-26 13:55)

OMG this is so amazing!

P#20778 2016-05-18 11:52 ( Edited 2016-05-18 15:52)

Really excited to play with setmetatable! I should be able to fit a lot more content in my games now \o/

I've started making a vector class for picoracer2048 so I can use operator overloading to get nice stuff like v1 + v2: 3 tokens
which should be nicer than vecadd(v1,v2): 6 tokens

Splore is looking great! Makes games a lot more accessible.
Would be nice to be able to view more games by an author.

P#20824 2016-05-18 21:37 ( Edited 2016-05-19 01:37)

Impbox, you can on the BBS, click on someone name, then in the menubar on top of the page, you will have User: xxx and a link to "Cartridge", it will give you all the cart release by that user.

It's not directly usable in Pico-8, but at least.. :)

P#20825 2016-05-18 22:06 ( Edited 2016-05-19 02:06)

Hey Godzil, I know. I was suggesting it as a feature in Slore since I like to see what other things a developer has made after playing their games. =)

P#20849 2016-05-19 07:46 ( Edited 2016-05-19 11:46)

Funny the manual reference changes for 0.1.7, which is still not available ;)

Edit: it's even more funnier, the headers says

PICO-8 v0.1.6

Version 0.1.7 add at least one new command: menuitem()

Which is documented :D

menuitem index [label callback]

Add an extra item to the pause menu

Index should be 1..5 and determines the order each menu item is displayed
label should be a string up to 16 characters long
callback is a function called when the item is selected by the users

When no label or function is supplied, the menu item is removed

menuitem(1, "restart puzzle", function() reset_puzzle() sfx(10) end)

P#20855 2016-05-19 11:18 ( Edited 2016-05-19 15:21)

Anyone noticed, that the 16kb limit for compressed code size is gone for good? Source code seems to be able to use the whole 65kb without any further limits now.

P#20860 2016-05-19 14:57 ( Edited 2016-05-19 18:57)

I'd like to request a couple of extra key aliases for the code editor.

In Windows, it's a tradition that, on top of ^x, ^c, and ^v, you can usually also do shf-del, ctl-ins, and shf-ins, respectively. I'm long since used to using them. Unfortunately, I keep deleting my code because pico-8's editor doesn't know those keystrokes. Would it be hard to catch them and send them to the same places ^x^c^v go?

Otherwise this is a lot of fun to play with. :)

P#20868 2016-05-19 18:25 ( Edited 2016-05-19 22:25)

Yes please, implement dos-old school keystroke: ctrl-ins, shift-ins, shift-del.
I've tried using autohotkey to simulate them but for some reasons it did not work.

P#20869 2016-05-19 18:48 ( Edited 2016-05-19 22:48)


The problem seems to be something to do with PICO-8 still thinking the shift key from, e.g., shift-Del is down, so when you send ctrl-x, it actually receives shift-ctrl-x and that doesn't work.

I managed to get ahk to work by using {blind} mode and manually lifting the appropriate shift key, then pressing ctrl and x, then releasing ctrl and x, then putting that same shift key back down where it was:

#if WinActive("ahk_exe pico8.exe")

    ;; ctrl-ins just works because it's already the right modifier
^Ins::Send ^c

    ;; have to release the correct shift key
    if GetKeyState("LShift", "P")
        Send {blind}{LShift up}{LCtrl down}{v down}{v up}{LCtrl up}{LShift down}
    else if GetKeyState("RShift", "P")
        Send {blind}{RShift up}{RCtrl down}{v down}{v up}{RCtrl up}{RShift down}

    ;; have to release the correct shift key
    if GetKeyState("LShift", "P")
        Send {blind}{LShift up}{LCtrl down}{x down}{x up}{LCtrl up}{LShift down}
    else if GetKeyState("RShift", "P")
        Send {blind}{RShift up}{RCtrl down}{x down}{x up}{RCtrl up}{RShift down}

    ;; old habits die hard :)
F5::Send ^r

It mostly works, but it fails sometimes, for some reason. Seems like using it again too quickly causes the problem. It's tolerable as a workaround, but it'd be a lot better if PICO-8 just handled those keystrokes natively.

P#20878 2016-05-20 00:22 ( Edited 2016-05-20 04:22)

That's clever ! Thanks, it works really well here.

P#20896 2016-05-20 04:35 ( Edited 2016-05-20 08:35)

SunSailor: the 16kb compressed size limit no longer applies to carts saved as .p8. It still affects .p8.png carts.

P#20900 2016-05-20 05:07 ( Edited 2016-05-20 09:07)

If I am in splore and find something online I like, can I save it from there directly into my carts?

P#22045 2016-06-01 16:16 ( Edited 2016-06-01 20:16)

Yes. Load the game. Type [Esc], select Splore, [Esc] again.
Then you can do want you want with the cartridge : edit, save....

P#22046 2016-06-01 16:19 ( Edited 2016-06-01 20:19)

Thanks, I see what my mistake was - I was looking under my carts folder, instead of the BBS folder.

P#22049 2016-06-01 16:29 ( Edited 2016-06-01 20:29)

SPLORE is the best feature ever! :D

Find a way to wrap that around an "arcade simulator" interface, and you're solid gold.

P#22143 2016-06-02 22:10 ( Edited 2016-06-03 02:10)

[Please log in to post a comment]