Log In  
[back to top]

Cart #26194 | 2016-07-31 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
7

Here's a 7500 word dictionary cart for making word games and whatnot. It contains the most common 3-6 letter words according to wiktionary.com, including proper names. The loader is 264 tokens, and the data is 11317, stored over the full map (including shared gfx), plus the last 44 SFX. So there are just 128 sprites and 20 SFX spare. The 5 most common and 10 least common words on the list are:

THE
AND
THAT
WAS
HIS

RADIUM
BAWL
LINTEL
WAFER
WELTER
AUNTY
OPTICS
SIKH
LIL
BARB

Technical details..

The data is generated using a convoluted toolchain process, that I'll post later on if I find time to organize it into something useful.

The compression works by enumerating every possible word in order of word size first, and then alphabetical order. So, A is 0, B is 1, AA is 26, and so on. This means that to store the whole dictionary, only the distances between each word's index is needed. There are many clusters of close words (e.g the distance between CAN and CAP is only 2), so the distances are sorted into range categories depending on how many bits are needed to store each range. Repeated categories are common and so can be encoded with a single bit -- otherwise a 3-bit value is used to store the category for each distance. The encoding utility greedy-searches sets of 5 category bit-lengths and a roman cypher to try to optimize the encoded size, which saved around 1k compared with hand-optimizing the parameter set.

P#26196 2016-07-31 02:23 ( Edited 2018-09-30 16:15)

UPDATE!

PX8 has been replaced by PX9: https://www.lexaloffle.com/bbs/?tid=34058

But I'll leave this here for reference, and for existing projects using PX8.


Cart #25919 | 2016-07-26 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
40

This is a library mostly for compressing graphics and maps, but can also be adapted to compress sfx. It is designed for data-heavy carts and requires around 450 tokens for decompression, although this can be reduced if needed by removing remap(), hard-coding parameters, and/or removing predicted spans at the cost of compression performance. If someone wants a smaller/weaker version, let me know!

To use it, compress a 2D rectangle to an address in memory, and supply a function for fetching the source values (normally SGET or MGET). For map data, you probably want to set p.cbits to something like 4 first.

COMP(0, 0, 128, 64, 0x2000, SGET)

0x2000 is the address of the top half of the map, so this will compress the top half of the sprite sheet (128 sprites) and write the compresed data over the map data.

DECOMP() takes the memory address of the compressed data, the top left corner of where to decompress to, and functions for getting and setting decompressed values. So to decompress this data at 0x2000 back to the screen, starting 32 pixels down:

DECOMP(0x2000, 0, 32, PGET, PSET)

Only the decompression section of the code is needed once you have compressed data stored on a cart. A typical workflow would be to make a utility cartridge that grabs data from multiple source cartridges (using RELOAD() with a 4th parameter to indicate where to read from), and then CSTORE them to a single cartridge (again, using CSTORE()'s 4th external cart parameter).

Here's an example that stores 2-byte lengths at the start of each compressed block, to allow seeking out the start of any given gfx. I've commented the cstore and reload lines so that it will work if you paste it at the end of the main PX8 cart example:

-- px8 workflow example:
-- storing multiple compressed images and fetching them

-- 1. make a utility cart that
-- compresses all the needed
-- data to a single cart

local base_offset = 0x2000
local offset = base_offset

-- compress some gfx and
-- add the length of the compressed
-- data at the start (2 bytes)
function add_gfx(x,y,w,h)

 local len = comp(x,y,w,h,offset+2,sget)
 poke(offset+0,len%256)
 poke(offset+1,len/256) 
 printh("wrote "..offset)
 offset += len+2

end

-- jelpi frames + mushroom
add_gfx(0,24,40,8)
add_gfx(40,0,8,8)

-- could load another cart's
-- spritesheet at any time
-- reload(0,0,0x1000,"blah.p8")

-- vegetation
add_gfx(48,16,32,16)

-- store in target cart
-- cstore(0x2000,0x2000,(offset-base_offset),"out.p8")

----------

-- 2. load the compressed data
-- (from the cart it was
-- compressed to)

base_offset = 0x2000

-- skip through compressed data
-- blocks and load the one at
-- index
function load_gfx(index,x,y)

 local offset=base_offset
 for i=0,index-1 do
  offset += peek(offset+0) + peek(offset+1)*256 + 2
 end

 -- use sget,sset to write back
 -- to the spritesheet instead
 -- of the screen
 decomp(offset+2,x,y,pget,pset)

end

-- test

cls()
load_gfx(0, 20,10)
load_gfx(1, 20,40)
load_gfx(2, 80,10)

The Algorithm


I started working on PX8 while working on PICO-8's specs, as an important question was how large a game could theoretically be for hard-core users who want to go to the trouble of compressing stuff. It became something of a brainworm, and releasing PX8 is a way to get this out of my system. I hope it is also useful to someone, or at least interesting.

PX8 is (AFAIK) a novel algorithm that appears to work well for typical PICO-8 data, and out-performs pngcrush -brute for the few 16-colour images I tested. Alternating spans of predicted and non-predicted values are stored:

  1. Predicted values (colours) are calculated by maintaing a table of the last encountered matching neighbours: if a match top & left is found, that is taken to be the prediction. Otherwise, a match for only top, and then only left are considered. Failing those, the value is taken to be non-predicted.

  2. Non-predicted values are stored as indexes into CLIST; a list of literal values that are stored in the order they were last encountered. This means that recently encountered values have smaller indexes, and the encoding exploits this, along with the fact that each index can not possibly be for the failed prediction (in which case it would be part of a predicted span).

Each span is strictly made of either all predicted or all non-predicted values. This means that for predicted spans, no additional information needs to be stored except the length of the span itself. And conversely for unpredicted values, the index into CLIST is known to not point at the predicted value. This means that no colour index data needs to be stored for 2 colour images at all, and the compressed data is composed entirely of span lengths.

P#25922 2016-07-26 12:59 ( Edited 2019-04-26 18:43)

Hey All -- PICO-8 0.1.8 builds are now live on Lexaloffle and Humble! Note that there was no 0.1.7 release for Desktop; there were in-development versions of 0.1.7 released early for web and Pocket C.H.I.P. to resolve pressing issues, so I'm calling this 0.1.8 to keep version numbers in sync across platforms. New stuff:

60 FPS support

This breaks the 'every cart runs the same on all PICO-8s' rule of PICO-8's design philosophy a little bit, but I think it's worth it! On all of the desktop host platforms, it is now possible to make cartridges that display and update at 60 frames per second instead of 30. You don't get any more CPU though, so that means half the usual CPU allowance per frame. From the manual:

:: Running PICO-8 at 60fps

If _update60() is defined instead of _update(), PICO-8 will run in 60fps mode:
    - both _update60() and _draw() are called at 60fps
    - half the PICO-8 CPU is available per frame before dropping down to 30fps

** please note that not all PICO-8s support 60fps. On machines that do not support it, _update60() will instead be called twice per frame and _draw() at 30fps. You can check the behaviour of your program running at 30fps by adding the following snippet to the bottom of your code:

    u60=_update60 _update60=nil function _update() u60() u60() end

Button Glyphs

The two action buttons on the PICO-8 controller are called O (BTN(4)) and X (BTN(5)). To make it easier to print instruction in-game explaining the controls, you can now insert glyph characters directly into strings in your code with Shift - U D L R O X.

Long GIFs

Adjust the maximum GIF length in config.txt or by running PICO-8 with -gif_len n switch, where n is the number of seconds to record for (maximum: 120). The GIF output is not optimized, so you might want to run it through an optimizer to get smaller file sizes.

Custom Menu Items

It is now also possible to add your own items to the pause menu to trigger things like 'RESTART PUZZLE' or 'EXIT TO OVERWORLD'. Here's an example program:

col=12

function _draw()
  cls()
  rectfill(0,20,127,107,col)
end

function changecol()
  col = (col+1)
end

menuitem(1, "change colour", changecol)

The first parameter is the position (1-5) in the menu to insert the item, the second is the item's label, and the 3rd is a function to be called when the item is selected. I opted to keep this simple and quite rigid, so there's no way to have extra stuff going on in the background while the cart is paused, or to re-appropriate the pause button as an in-game button.

Music Exporter

To record a .wav of a PICO-8 tune, first navigate to the pattern you'd like to start from in the music editing mode, then press escape to enter the console and type:

EXPORT SONG.WAV

If the song is looping, it will export around 4:30 that you can then manually trim in a [sound editing program](http s://sourceforge.net/projects/audacity/).

Pre-installed Games

There are now 5 BBS games that ship included with PICO-8, so that it's easy to get up and playing something more than the demo carts, even when internet access is not immediately available. To install them, use INSTALL_GAMES -- they will be accessible from your favourites list in SPLORE. The games are Celeste, Frog Home, Tower of Archeos, Hug Arena, and Dusk Child.

Linux Builds

I've included both statically and dynamically linked versions of the executables for i386, amd64 and Raspberry Pi. The RasPi build still depends on bcm, so it is tricky (impossible?) to get it up and running on Chromebooks.
I plan to look at better Chromebook support at some point, but it will probably have to be during beta. Pocket C.H.I.P. owners, and later on regular C.H.I.P. owners can expect updates too, of course --- but we are still sorting out details and it will take a while. o( )o

Next up, 0.1.9 will be mostly ongoing bugfixes, and improvements to the web player (optimization, fold-out touch controls for mobile, and controller instructions).

Full Changelog:

    v0.1.8

        Added: 60fps support
        Added: Music exporter
        Added: Custom GIF length (maximum 120 seconds)
        Added: -,+ to navigate sprite tabs, sfx, music patterns
        Added: sfx editor: navigate with home, end, pageup/down, mousewheel
        Added: <, > to modify sfx speed, or click and drag
        Added: Middle mouse button to pan around spritesheet / map
        Added: Shortcut command for splore: S
        Added: Pre-installed selection of BBS cart (use INSTALL_GAMES)
        Added: Warning when saving .p8.png with no label 
        Added: (OSX) logging to ~/Library/Logs (viewable with Console.app)
        Changed: Can not CTRL-S save over a loaded bbs cart
        Changed: Only .p8 files listed by dir() and by splore
        Changed: Command history increased to 256
        Changed: exit() / shutdown() have no effect while running cart
        Fixed: Memory useage (stat(0)) inconsistent across host platforms
        Fixed: Spinny disks shows when reloading current cart with load()
        Fixed: GIF saver does not respect 64x64 / mirrored modes
        Fixed: Miscellaneous multi-line comments / strings issues
        Fixed: Empty map cels cost cpu in mapdraw()
        Fixed: mapdraw() slowdown when drawing bottom half of map
        Fixed: preprocess changes semantics when += and : operators on same line
        Fixed: Identifiers starting with underscore counted as extra token
        Fixed: Saving .png exceeding compressed code limit fails silently
        Fixed: Right-clicking a sprite does not set the currently edited sprite
        Fixed: (Windows) extra space added to pasted lines
        Fixed: spr() expensive when drawn with low negative coordinates
        Fixed: pipe character identical to colon character
        Fixed: (Raspberry Pi) shift key appends a character when entering text
        Fixed: Editor mode buttons are still clickable during cart runtime
        Fixed: When loading a .p8.png file, label is reset and needs to be re-captured
        Fixed: export() does not report failure
        Fixed: mset()'d changes in shared memory not readable via peek() / sget()
        Fixed: cstore() saving edited code
        Fixed: audio pop between patterns during music playback

    v0.1.7

        Added: menuitem()
        Added: button glyphs in code (shift-L, R, U, D, X, O)
        Added: Customisable data directory (e.g. pico8 -home mydata)
        Added: Web gpio pins: read and write pico8_gpio[] in javscript 
        Fixed: SPLORE search doesn't reset
        Fixed: Splore skipping 33rd cart listing after loading more items
        Fixed: Crash when selecting a local binary file in splore
        Fixed: Semicolon can't be used as a list or statement separator 
        Fixed: Exported html can not cstore self

P#23669 2016-06-26 10:41 ( Edited 2016-08-01 19:29)

The theme for the second PICO-8 Jam was Chain Reaction, and there were 35 entries. Thanks to everyone who contributed and made this jam a another splendid event. I hope you'll join me in congratulating the winning entry, which received a whopping 7.3 PICO-8 star average.. theatrically opens invisible envelope

NuSan! With Combo Pool.

Cart #21659 | 2016-05-29 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
163

As a token of gratitude for laying down this most excellent cartridge, NuSan will be receiving a commemorative cross-stitch based on the cart.

Also highly rated by participants was another disarming production by JTE: Nora's Mouse Chase, and the beautifully chaotic SPACETANK 9000 by arnodick.

You can play all of the entries by clicking on this montage:

That was fun -- let's do it again sometime soon!

P#22395 2016-06-06 06:11 ( Edited 2017-12-09 14:29)

If you'd like to take part in P8JAM2, please select one or more themes by clicking on the PICO-8 star next to it (you need to be logged in). You can change it anytime before the 24h voting phase ends -- at 00:00 PST on Saturday the 21st. Check out the jam thread for more details.

Edit: times's up! The winning theme is Chain Reaction. You have 9 days! Good luck!

P#20883 2016-05-20 03:00 ( Edited 2016-05-20 07:00)

Hey All

I'm in the process of simplifying the website a little. In particular, I wanted to improve the experience of playing cartridges in threads by removing clutter. They now look more like a page dedicated to the cart:

  • The player starts open
  • There's a big obvious play button and large thumbnail
  • There's no banner at the top of each page

Cart #20430 | 2016-05-11 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
31

I removed the PLAY buttons from the thread previews, and autoplay, as I think they're no longer needed -- the whole playable region of a cart is now visible without scrolling after opening the cart's thread, and it's more obvious to new visitors what to do next.

There are still a few small things to finish, but let me know what you think of the new layout, and if there's anything that bugs you.

P#20716 2016-05-17 16:25 ( Edited 2016-05-17 20:25)

Time for another jam! EDIT: The theme is Chain Reaction.

EDIT2:
and... that's time! Thanks everyone who contributed a cartridge! If you submitted something with the p8jam2 tag, you can now rate other p8jam2-tagged carts at the top of the cart's thread.

P8JAM2 THREADS

If you'd like to continue working on your cartridges, feel free -- but please leave the compo version at the top of the p8jam2-tagged threads until voting finishes in one week (June 5, 24:00 PST). Good luck!

Cart #20430 | 2016-05-11 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
31

Same deal as last time, except with some limited theme voting:

Duration: The Jam will take place from 00:00 PST on Saturday the 21st of May 2016 and will finish at 24:00 PST on Sunday the 29th. So, it spans 2 weekends and 5 weekdays. You can spend as much or little time on your carts as you like. Tiny silly cartridges are more than welcome.

Theme: As is customary with other jams, a theme will be posted at the start and the goal is simply to make a cart (or some carts) during the jam that reflect your interpretation of the theme. Any type of cartridge is ok: games, toys, demos, music carts or pixels.

This time, the theme will be selected by a small twitter poll that begins 24 hours before the jam starts.

Submitting: To submit or update a jam cart before the deadline, just tag it with p8jam2. You can update your cartridge as often as you like before the deadline.

Voting: Jam participants will be able to use a voting widget on all p8jam2-tagged carts, and exactly 1 week after the jam finished, ratings will be tallied.

There will be a small mystery prize for the highest rated cart, but you should enter for glory and honor (or just for kicks).

During the jam, you'll be able to view all carts and posts tagged with p8jam2.

Rules: Teams / collaborations are allowed, in which case you should nominate one user to be the submitter (and voter). Re-using existing PICO-8 cart material is allowed as long as it is ok by the author, and that the carts are publicly available before the jam starts. Submissions should be mostly new material created during the jam, but it's ultimately up to other participants making ratings to decide what's cool and what's not.

P#20432 2016-05-11 09:06 ( Edited 2016-05-11 13:06)

If you're looking for a complete portable PICO-8 solution, good news! PICO-8 is going to ship pre-installed on Next Thing Co.'s upcoming PocketC.H.I.P. -- a complete portable mini-computer with built-in storage, wifi, keyboard, battery, touchscreen and everything else PICO-8 needs! The last few months, I've been working closely with the team at Next Thing Co. to create "PICO-8 C" -- a fully functioning and compatible edition designed to integrate nicely with NTC's hardware and software. It will be available to Kickstarter backers, or you can also pre-order one for just $49 bucks.

You can read more about the PocketC.H.I.P. over at getchip.com

P#20121 2016-05-03 09:19 ( Edited 2016-10-02 00:48)

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.

    v0.1.6

        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)

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

This is a demo of the new cartridge storing in 0.1.6. (you'll need to update to 0.1.6 if you load this in PICO-8)

Press O (mapped to Z or C) to save the screen, and X to restore it. The cursor position is not saved.

To save, the screen is copied to the sprite sheet and then stored for clarity -- but it could have just been a straight cstore(0x0, 0x6000, 0x2000), and same again in reverse when restoring.

 if (btn(4)) then
  memcpy(0x0,0x6000,0x2000)
  cstore()
 end

 if (btn(5)) then
  len = reload()
  memcpy(0x6000,0x0,0x2000)
 end

This should also work in your browser, even if you close it and run the cartridge again. Please let me know if it doesn't!

Note that in 0.1.6 you can also cstore to separate cartridge files, meaning we can have quite large save games, and also saved data shared between carts on the bbs.

P#19845 2016-04-17 18:41 ( Edited 2016-06-10 10:20)

A build of PICO-8 0.1.5 is now available for Raspberry Pi! Check your updates page or look in your Humble library under the Linux downloads section.

It works in fullscreen under either X Windows or directly from the terminal (using directfb). For speed, the default resolution is 280,280; you can set this with the -width and -height switches:

pico8 -width 720 -height 480

Known issues:

  • After quitting, keypresses during the session are sometimes dumped to terminal (annoying if you quit by typing shutdown instead of CTRL-Q!)
  • Freeze on exit (observed on a zero)
  • Some math-heavy cartridges (e.g. /demos/cast.p8) don't run at full speed on first generation models.

There are two builds included in the archive. pico8 is compiled statically (so no need to install SDL2), and pico8_dyn dynamically loads libraries, in case you'd like to supply your own SDL2.

Have fun, and please post pictures if you get pico-8 running on any cute displays!

P#18975 2016-02-26 17:14 ( Edited 2016-02-26 22:14)

This weekend (20th, 21st) I'll be at Tokyo Demo Fest 2016, giving a short PICO-8 seminar at 3pm on Sunday, and also making a wee demo for the Wild compo (also in PICO-8, naturally). If you're in Tokyo, come along! The venue is larger than last year -- 3331 Arts Chiyoda, which is around 8 minutes walk from Akihabara station. You can find the registration page and more information here.

Here's a 4k demo from last year (it won the combined pc section):

P#18833 2016-02-14 12:06 ( Edited 2016-02-26 12:49)

Hey All

Here's a quick update with music copying and keyboard configuration for controller buttons.

To configure buttons, use KEYCONFIG from the commandline.

To copy a song from one cartridge to another:

  1. In the song editor, click on the start pattern and then shift-click on the end pattern that you want to transport. They should light up green.
  2. Control-C to copy the pattern data, along with the sfx they point to.
  3. Load the cart you want to paste into, open the song view and click on the pattern index you want to paste to.
  4. CTRL-V to paste. When pasting a song, any SFX that are needed are written to unused slots and then the pattern indexes are adjusted accordingly.

Changelog:

v0.1.5
        Added: Keyboard configuration for player buttons (KEYCONFIG) 
        Added: Music tracker select / copy / paste
        Added: Single-level undo in audio tools
        Added: Live preview of frequencies in sound editor
        Fixed: Command history extends past last reboot
        Fixed: Sfx exporter broken
        Fixed: Slashes at end of path resolve to double slashes
        Fixed: Load cart from commandline under Windows
P#18656 2016-02-05 11:59 ( Edited 2016-02-05 16:59)

Every day, Professor Miggles goes to work. And every day he snoozes in bed until the last possible moment. To keep the points you get for snoozing, make sure to head out in time without forgetting to put your trousers on.

v1.1: Fixed high score bug, and added persistent high score (when played from pico-8)

P#18533 2016-01-30 13:43 ( Edited 2017-12-01 04:45)

Hey All, I hope you had a great new year!

PICO-8 0.1.4 builds are live on the updates page and on Humble. The main features of this update are:

Friendlier Token Counting

Pairs of brackets and block deliminations now count as one token each, and local declarations do not count at all. You can now fit in around 30% more code because of this, and there is less need for odd space-saving techniques (e.g. using blah"" instead of blah()), or getting rid of local variables. It does mean you're more likely to hit the compressed code limit (use INFO to check), but I don't think this will be a problem. The raw character limit has also been increased from 32k to 64k.

Importing / Exporting Data

import() and export() can now load and save the sprite sheet: export("something.png") and sfx: export("something.wav"). These aren't very flexible yet, but in future they'll be able to do things like grabbing particular sets of sprites, or only importing into empty slots.

External Cartridge Data Access

reload() and cstore() now take an optional 4th parameter: a filename to grab the data from or store the data to. This is useful for making custom tools, or doing fancy data management. It's intended at this point mainly as a development tool, and isn't supported by the exporter or BBS player. But of course, you can do what you like with it :P

Here's Let's Karate being gradually replaced with data from Jelpi during runtime:

Changelog:

    v0.1.4

        Added: spritesheet importing and exporting with import("blah.png"), export("blah.png")
        Added: sfx exporting with export("blah%d.wav")
        Added: External cartridge parameter for reload() and cstore()
        Added: Persistent cartridge data mapped to 0x5e00
        Added: Click token limit to toggle token & char limit display
        Added: assert(), type()
        Added: P to pause
        Changed: code char limit: 64k (was 32k)
        Changed: local declarations and semicolons not counted as tokens
        Changed: Pairs of brackets and block delimitations count as one token
        Changed: Only _update() or _draw() need to exist to enter main loop
        Changed: Allow forward-slash in code editor
        Changed: info() reports current (last loaded or saved) filename
        Changed: html5 version compiled with NO_DYNAMIC_EXECUTION 
        Fixed: Shift-drag-copy sprites -> paste only pastes 1x1
        Fixed: ".." should count as one token
        Fixed: Tracker displaying D instead of .
        Fixed: Multi-line comments
        Fixed: Crash on run when code close to char limit
        Fixed: When over token limit, can not run any command
        Fixed: Unused high bits in SFX section not saved in .p8 format
        Fixed: Camera position memory mapping out of sync
        Fixed: pico8.txt link broken in windows installer
        Fixed: print() crashes when parameter is not a string or numbers
        Fixed: Multi-line strings & escape chars mess up tokenizer and print()
        Fixed: Joystick not responding when left stick is up to the left
        Fixed: Alt-F4 saves screenshot before quitting
        Fixed: Sprite editor mode button doesn't show fullscreen mode
        Fixed: -sound parameter not working in html5 version 

P#18122 2016-01-02 18:14 ( Edited 2016-02-13 18:26)

Voxatron 0.3.4 builds are live on the updates page and on Humble.

This is a quick bug-fixing update, mostly responding to issues in the 0.3.3 thread.

Changes:


v0.3.4

Changed: Super-State conditions (S-STATE) apply to all actors including ones spawned by emitters
Changed: When pasting alias, activation controller parameters are copied from the original
Improved: More robust anti-stuck-in-a-wall method
Improved: Default object properties
Improved: Config file validation
Fixed: Aliased animation inside root of pickup renders pickup uncollectable
Fixed: Base weapon doesn't change with modifier
Fixed: Legacy sword has 0 attack damage
Fixed: Room editor: spacing between objects should be taken from object definition
Fixed: Zoot's weapon switching in Chaos Arena

P#18099 2015-12-30 16:39 ( Edited 2015-12-30 21:40)

Hey All

I've been doing some spring cleaning, and updated all of the older Lexaloffle games: Neko Puzzle (which is now free), Swarm Racer, Chocolate Castle, Zen Puzzle Garden, Swarm Racer and Swarm Racer 3000. If you had any trouble running these games on newer versions of OSX or 64-bit Linux, these versions should work out of the box.

SR3K also has some new wall rendering and analogue joystick support. I've been chipping away at it very sporadically but it's on slow burn until after Voxatron is finished. An 8-track preview is available to any Lexaloffle customers.

You can find downloads on the game pages, or your updates page / Humble Library page.

User-made ZPG and Chocolate Castle puzzles are also back up with new HTML5 players. You can post puzzles by saving them to clipboard and then pasting the puzzle text into a BBS post.

P#18087 2015-12-29 12:56 ( Edited 2018-09-25 15:51)

EDIT: 0.3.3b patch is now up; if you tried 0.3.3 from a clean install and got stuck on the title menu, see this post.

Voxatron 0.3.3 builds are now up! Check your updates page for downloads, now including a native 64-bit Linux version. Builds should be up on Humble soon too (check the version number on the files).

Main new features of interest are: integrated music tracker, custom inventories, multiplayer selection and room transition logic, new microscripting events and better activation control, improved water physics. Check out cartridges in the ALPHA CARTS menu: The Jelly Room, Chaos Fortress to see some of these in action. I'll post a more complex demo of custom inventories and weapon switching soon.

Cart #17809 | 2015-12-14 | Embed ▽ | License: CC4-BY-NC-SA
12

Bloot (also under ALPHA CARTS) is now completely playable as a 2P-4P game, with match scoring and end-game logic completely made from microscripting. To select a player, press action once to join, and then once more to select the player (or left / right to change selection). If you want to try it out without a second human around to play with, you can join P2 and then hoist and carry them through the door to begin the game.

There's a script editor in this version (under the new NEW OBJECT fold-out menu), but it doesn't do much yet. Scripting is the last major component of Voxatron engine, and v0.3.3 contains a lot of new code to get it working -- all of the interactions between objects now run through an abstracted event layer because of this. This affected many legacy carts, and I'm still working on improving backwards compatibility.

For a top-level view of the project's progress and what's coming up, check out the new feature-wise Development Map. In the short term, check back for more demos, tutorials and documentation!

Changelog:


v0.3.3

Added: Custom inventories
Added: Music pattern sequencer
Added: Multiplayer selection
Added: Bloot: Title page, match logic, music
Added: The Jelly Room
Added: PREV field in activation controller
Added: Audio chooser
Added: Fold-out item creation menu
Added: Scrollwheel / mb3 camera control
Added: Script editor (scripts don't run yet though!)
Added: Shortcut keys for looping in prop editor
Added: Emitters can spawn props, audio and doors
Added: Trigger conditions host:inventory and actor:modifier
Added: Activation controllers for audio and aliases
Added: Total play time displayed on cart completion
Added: Emitted objects can optionally inherit heading and facing rotations
Changed: Can now sink in water by increasing object gravity
Changed: .pov exporter merges sequential voxels of same colour
Changed: Animation completion does not cause parent activation controller to expire
Changed: Can use go_to_room internal script with current room number
Changed: Hoisting is stiffer / more reliable
Changed: Can press button to restart after dying after only 1 second (was 2)
Changed: Doors do not warp in if they are occupied or triggered at t==0
Changed: Legacy sword particle attack damage taken to be player attack damage
Fixed: Doors only reporting occupied event on room entry
Fixed: Water: more robust wading, transitioning between swimming and standing.
Fixed: rand bullet duration
Fixed: incremental item collection
Fixed: aliased modifiers evaluating dereferenced parent
Fixed: emitter id == 0 clobbered on paste
Fixed: cut and pasting object definitions generates new ids
Fixed: actor:time in microscript statements
Fixed: actor:m_state.* called from room object activation controller
Fixed: Inactive modifier attribute values shown from incorrect parent
Fixed: Monsters don't run at full speed at player 2
Fixed: restarting room clobbers total_time_taken
Fixed: broken wall connectivity in small rooms
Fixed: actor state flags not set on zeroth frame
Fixed: Stand-alone emitter remains dormant forever even when duration/bursts have expired
Fixed: Barrel sometimes explodes when thrown from fast run
Fixed: Crash event triggered by carrying actor
Fixed: Walls do not extend down in liquid based rooms
Fixed: Player:super_state:died query sometimes gives false negative
Fixed: Pickups warping in inside player sometimes not immediately collected
Fixed: Room switching sometimes not triggered when carrying other player through door
Fixed: audio editor state is initialised with bad values after new sound created
Fixed: monster accel halved when mode:wandering
Fixed: Joystick not responding when left stick is up to the left
Fixed: death-triggered events don't fire when death caused by actor collision event

P#17811 2015-12-14 18:18 ( Edited 2016-01-22 03:22)

Cart #17809 | 2015-12-14 | Embed ▽ | License: CC4-BY-NC-SA
12

"A Jelly is nothing but Jelly with more Jelly" -- Nietzsche

A silly demo cartridge for Voxatron 0.3.3 -- collect the jellies to become more powerful and make it back to the jelly room.

if it doesn't load for you in the offline binaries, you need to update!

P#17810 2015-12-14 17:34 ( Edited 2018-04-23 15:38)

Hey All,

Here's the final changelog for 0.3.3, which will be live on Monday.


Voxatron v0.3.3

Added: Custom inventories
Added: Music pattern sequencer
Added: Multiplayer selection
Added: Bloot: Title page, match logic, music
Added: The Jelly Room
Added: PREV field in activation controller
Added: Audio chooser
Added: Fold-out item creation menu
Added: Scrollwheel / mb3 camera control
Added: Script editor (scripts don't run yet though!)
Added: Shortcut keys for looping in prop editor
Added: Emitters can spawn props, audio and doors
Added: Trigger conditions host:inventory and actor:modifier
Added: Activation controllers for audio and aliases
Added: Total play time displayed on cart completion
Added: Emitted objects can optionally inherit heading and facing rotations
Changed: Can now sink in water by increasing object gravity
Changed: .pov exporter merges sequential voxels of same colour
Changed: Animation completion does not cause parent activation controller to expire
Changed: Can use go_to_room internal script with current room number
Changed: Hoisting is stiffer / more reliable
Changed: Can press button to restart after dying after only 1 second (was 2)
Changed: Doors do not warp in if they are occupied or triggered at t==0
Fixed: Doors only reporting occupied event on room entry
Fixed: Water: more robust wading, transitioning between swimming and standing.
Fixed: rand bullet duration
Fixed: incremental item collection
Fixed: aliased modifiers evaluating dereferenced parent
Fixed: emitter id == 0 clobbered on paste
Fixed: cut and pasting object definitions generates new ids
Fixed: actor:time in microscript statements
Fixed: actor:m_state.* called from room object activation controller
Fixed: Inactive modifier attribute values shown from incorrect parent
Fixed: Monsters don't run at full speed at player 2
Fixed: restarting room clobbers total_time_taken
Fixed: broken wall connectivity in small rooms
Fixed: actor state flags not set on zeroth frame
Fixed: Stand-alone emitter remains dormant forever even when duration/bursts have expired
Fixed: Barrel sometimes explodes when thrown from fast run
Fixed: Crash event triggered by carrying actor
Fixed: Walls do not extend down in liquid based rooms
Fixed: Player:super_state:died query sometimes gives false negative
Fixed: Pickups warping in inside player sometimes not immediately collected
Fixed: Room switching sometimes not triggered when carrying other player through door
Fixed: audio editor state is initialised with bad values after new sound created
Fixed: monster accel halved when mode:wandering
Fixed: Joystick not responding when left stick is up to the left
Fixed: death-triggered events don't fire when death caused by actor collision event

P#17711 2015-12-11 17:23 ( Edited 2015-12-14 16:05)

View Older Posts
Follow Lexaloffle:        
Generated 2020-08-12 21:15 | 0.146s | 4194k | Q:125