Log In  

Maturity is nice, isn't it.

Weirdo YouTuber Wish Volo. Please subscribe. Please. Do it.

If I treat you with any brutal criticism (which, I try to keep reasonable, so sorry if I make a mistake): You're the one who's making the game. There might be a reason behind everything. Opinions are opinions.
Ultimately, it's your choice. PLEASE disregard me, if you want.

Map Command Tool
by aKidCalledAris
:: Unfold ::

if there's something I forgot, let me know

No, you probably won't know what I forgot, but if something messes up, or something's really weird and confusing, let me know.


Cart #wvm_mapc_tool-0 | 2023-03-04 | Code ▽ | Embed ▽ | No License

Code licensed under CC BY 4.0. Yeah, that's right, steal the freaking code!!!!!

About - MCT, Map Command Tool

This is a cartridge that can help fit large maps in an extremely small space via the use of two byte commands that fill in or remove large sections at a time.
It doesn't do so automatically, but you are given a little interface to do the work.
You can also edit the maker code itself to create extra commands (there's five dedicated 2 byte commands available, and you can probably go crazy with the alternate commands).

It's not a compression system like PX9, but it still puts large amounts of data in a smaller space.
Still, it might not be what you're looking for, as it requires you to simplify quite a lot of the data and (as of right now) costs about 500 tokens to implement (which is kind of a lot).
In return, theoretically, you get a significant savings in map space. The above gif's map is in 10% of the usual space. I have not tested this against any other compression system.

Just think really hard about what kind of maps you have before you pick a compression system.

I really want to work towards making it super editable & good for whatever, so if you have any suggestions, let me know!! Please!

Data to command table costs ~229 tokens
Unmodified commands to map costs ~263 tokens
Make sure you have a screens = {} declaration.

You can see an example implementation down below in the OTHER section!

Some limitations

  • There are only 14 main commands, 15 usable alternate commands.
  • Currently it only supports nibbles for each main command value. Thus it can really only support 16x16 maps.
  • It can only use 63 tile values without adding an extra byte (though you can use commands A-E to add extra tiles).
  • Fills only use one tile at a time.
  • If two maps use the same screen space, that's on you, dingus.
  • Binary export messes with commands if they have too much zero
  • The cart doesn't use devkit keyboard.


D>T 229t, T>M 263t

How to Use

Download the cart and place tiles in the spritesheet representing tiles from your game. Run the cart. Start editing!
Use arrow keys to move.
O and X are modifiers, and holding them will change what your arrow keys do - X will change what part of the screen you work with, and O will let you change a specific value.
O is also used as the "accept" button.

You can export it at any time by going to the bottom bar, hitting EXPORT, and then selecting either binary or hex.
Hexadecimal prints something like hf037, and is safe to put in any text editor. Binary instead gives you one-byte characters, along the lines of bユs that are meant to be put in a PICO-8 string, can contain weird characters that could possibly mess with other text editors, and will break if you have a command with "zero parameters" (see Commands documentation).
After hitting O on an export type, hit CTRL-C up to 12 times (just in case) and paste it somewhere safe.

To import, copy the entirety of a map string, paste into the app up to 12 times (just in case), then hit IMPORT 3 or 4 times.



Top Bar
Use left and right to change the screen.
O opens up the banner, where you can add and delete screens, or go to the map preview (which uses the bigmap space).
On the banner, hit O to perform the action selected and use arrows to change selection.
Deletion is an irreversible action. Be careful.
The bar also shows how many bytes the current screen uses.

Arrows change the selection. Holding O makes them change a value instead.
To add a new command, go to NEW, hold O, and use up/down to choose where to place the new command.
All commands are put in the map in order, starting with "G" (which can't be changed as that marks where a new map is).
On a null command, you can press left and then O to delete it.

Bottom Bar
When unselected, the bar shows the total bytes this set of screens is using, compared to how many bytes it would take up uncompressed. It also shows the compression rate.
When selected, a banner opens up allowing you to import and export the map. To use import, you have to paste while the cart is in focus.
Importing is an irreversible action. Make sure your data is backed up well.
Exporting opens up the export menu and lets you export to hex or binary. You have to press CTRL-C to copy once you hit O on an export option.


Normal command parameters are sorted COMMAND, X, Y, V

Binary Conditions
If a command does not follow these conditions, it will be changed or removed on binary export. If you wanna use a lot of zeroes, you need to use hex export.
For normal commands, Y or V must be non-zero.
For F0, you must have one non-zero value. THIS COMMAND WILL DEFAULT TO X=F and Y=F OTHERWISE
For F1, you must have one non-zero value.
For F2, X or Y must be non-zero, and V must be non-zero.


0 - null, ignored on export

**Normal Commands**
two bytes, all 4 bits per parameter

1   - erase one line
  x,v - start, end
  y   - y position

2   - fill from bottom
  x,v - start, end
  y   - y position

3   - fill one line
  x,v - start, end
  y   - y position

4-7 - place one tile
  x,y - position
  v   - tile:
  4 is 0-15
  5 is 16-31
  6 is 32-47
  7 is 48-63

8   - fill from top
  x,v - start, end
  y   - y position

9   - erase from bottom
  x,v - start, end
  y   - y position

a-e - unused

f   - ALT MODE

**Alternate Commands**
alternate commands use a different parameter format

f0  - new screen (2 bytes, always one per screen)
  x,y - screen position on bigmap
  however, you don't have to use this as screen position
  idk what else you'd use it for though

f1  - change fill brush (2b - f1, 8v)
  v   - tile to use as brush

f2  - place one tile (3b - f2, 4x 4y, 8v)
  x,y - position
  v   - tile to use


I created this so that I could compress my map data without having to put BY-NC-SA, a license I didn't want on a game I'm making. So I'm making all of this cartridge under a CC-BY license. That includes the map loading code, but all you have to do is put a -- by wish volo comment right before it and you'll be good.

I completely encourage you to do whatever the heck you want. That's what this is meant for.


Yes, it works:

Cart #wvm_mct_test-0 | 2023-03-04 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

I think a good way to use the "tiles" in the cart is as representations - it doesn't have to look exactly as it does in the editor. You can make it look different during import, like changing a tile based on possible variations or whatever.
example: Tile 1, no matter what it is in the normal cart, represents all and any ground tiles of type X. When loading to map data, if it detects value 1, then it will pick a random tile from group X and draw it!
easy peasy.

You can put a PAL() call at the bottom of DRAW(), cause that's where the map preview code is, if you want to see a different palette to match what your tiles will actually look like.

If you don't use a specific command, feel free to comment it out.
If you stick to using only hex or binary, then you can cut a few extra tokens out of the functions.

at some point i need to add base 64
the only issue with base 64 is that it might actually cost more tokens to do so, but it'd save more space than hex

Dev ramble

okay so i made this thing based on Super Mario Bros' maps, or at least what i heard about them.

i didn't want to bother with finding a compression system on PICO-8, and i didn't want to use PX9 because it's under a fairly restrictive license
(nothing wrong with it, i just don't want to worry about what i can and can't do. like, uh. make money.)

at first i was just going to make something that tallied up all the tiles in byte order, then shove it to two bytes
it'd say the tile, then the amount of times that tile appeared, counting horizontally. does that make sense?

and i made it, and it did okay.

then i thought about "how big are SMB maps?" so i tried to look it up but then i found "hey, this game uses a bunch of commands that say to draw a fill pattern here or whatever"

so i decided to do something based on that! and that's the story.

oh also one time i forgot about 0x8000's existence, and there was a bunch of other stupid stuff i did because i didn't think 100% of the way, but i don't remember much beyond "oh crap, big maps exist"
that doesn't really have anything to do with the editor, that was just me worrying about how many tokens i'd have to spend to have a dynamically loading map

also yes, the ui is (coincidentally) like LSDJ's if you noticed

If this sucks, then it's perfectly fine cause it was fun to put it together, write the documentation, interestingly enough. I finally made a relatively smart thing! that has a purpose! woo!
and i'm still gonna use this cart anyways lol

do whatever you want with it lol

P#126521 2023-03-04 01:43

:: Unfold ::

I found a minor (except that to me it's kinda major) bug concerning puny font.

It seems to only affect PICO-8 when loading or reloading - whenever I save in an external source and reload, or when I boot up the console, all the puny font disappears.

EDIT: Never mind, turns out it was that _ENV thing. Thanks zep lexaloffle!

P#122367 2022-12-14 00:59 ( Edited 2022-12-14 13:30)

:: Unfold ::

Hello, I'm Wish Volo. I made a game about sorting orbs.

And it's in PICO-8!

Cart #wvm_orbsort_sort-5 | 2022-12-14 | Code ▽ | Embed ▽ | No License

old versions

Cart #wvm_orbsort_sort-4 | 2022-12-11 | Code ▽ | Embed ▽ | No License

Cart #wvm_orbsort_sort-1 | 2022-11-22 | Code ▽ | Embed ▽ | No License

Z/C/N/Tab/Lshift to swap / "yes"
X/V/M/Q/A to cancel combotimer / "no"
Enter pauses (you're gonna have to hold it to bring up the PICO-8 pause menu)

It's got four gamemodes!

  • Infinite: sort forever
  • Blitz: sort quickly for a high score in a short time
  • Clear: get as many capsules cleared as quickly as you can
  • Knockout: splitscreen multiplayer

It's also got 12 tracks of music (5 casual, 4 tense, 2 KO)!

It's also got a little bit of contrast assistance. It's there.

You can also change the combotimer length and the orbcount with no penalty :)

Oh, and it's on itch.io too. https://wish-volo.itch.io/orbsort

if you don't mind, check it out for a little bit!

last note: This version of the game is only on Lexaloffle / Splore. The A version is found only on itch.io. If either version is found anywhere else, it’s been copied. Have a nice day :)

P#121141 2022-11-22 15:37 ( Edited 2022-12-14 00:37)

:: Unfold ::

What I'm trying to do is make a typewriter script, but when checking to see that the third line has less characters than the dialogue, I keep running into the same odd error. Is this not a string?

-- typewriter

dialogue = {d1={
c_text_1 = "."
c_text_2 = "."
c_text_3 = "."
c_dia = 1

function typewriter(string,wait)
    if frame > wait and #c_text_3 != #tostr(dialogue[("d"..c_dia)[l3]]) then
        frame = 0
P#74563 2020-04-08 13:44 ( Edited 2020-04-08 13:45)

:: Unfold ::

So I'm working on another game

The previous ones I worked on were a little... I guess... too much for my current PICO-8 skill. This new one will not be as big as the others.
Guess I'm both worried about my skill and the amount of coding I'd need for it.

P#64782 2019-05-27 16:50

:: Unfold ::

So I was working on the map in PICO-8 when I found some tiles I never placed, so I started erasing them. Later I saw a chunk of my spritesheet was erased, so I fixed that manually. Later the same thing happened and found that the tiles are related to the colors in the sprites. Why is this?

P#64747 2019-05-25 20:40

:: Unfold ::

🤔 what could I be presenting?
what could possibly concern me so much I require the changing of keys?
who is Aris? (wait, I'm the one making this post...)

Random bird and random person said bird will be attacking.


P#63499 2019-04-14 13:28

:: Unfold ::

In ROBLOX I am also learning how to code, but one thing stands out that I feel should be necessary.

What is supposed to happen is that it runs:

function _init()

But it errors with
"Runtime error line 4 tab 0
Attempt to call global 'wait' (a nil value)
In _init line 4 (tab 0)
At line 1 (tab 1)"

Is there a way to make the program wait a few seconds without taking too much space?

Thanks :)

P#63498 2019-04-14 13:10 ( Edited 2019-04-15 13:53)

Follow Lexaloffle:          
Generated 2023-10-02 08:39:16 | 0.103s | Q:28