Log In  
[back to top]

[ :: Read More :: ]

Cart #newcompress-4 | 2022-12-19 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

(v04 12-18-22)
TO LOAD THIS PICO-8 CART, in immediate mode, type: load #newcompress


I have need of a data compressor for the 2023 project I'm working on now so I wrote one. And it's better than a 6-bit or 7-bit because once again, this is an 8-bit compressor.

Now this is different from the picture compressor I wrote which you can find HERE:


That compressor is looking for Pico-8 pixels specifically.

No, THIS compressor is looking for raw data. While I am demonstrating it with pictures it is in fact geared for byte data, maps, PCM sound, and what have you.


There are 2-functions all squeezed down to a single programming line each.

The first is the compressor. It can be used 2-ways.

(251 tokens in size)

It uses 4-arguments and the string in the beginning is optional. By default it will save your compressed data to the clipboard for immediate use. If you want to save it to a string then put that variable in front.

The first is "M" the memory location to start where you want to begin your compression. You can also use 0x8000 high memory if you so choose.

The second is "E" the length to read. For instance the screen at 0x0000 is 0x2000 or 8192-bytes in length. You can also use a length greater than 0x2000 if you so choose.

The next is "S" for shift. Now by default this is zero. With some fiddling of it you can shave off a few bytes from your string compression. Basically it SHIFTS the value so for instance if you had a bunch of "\0" in your code, by shifting it 128 you would then get █ instead which registers as a single character whereas "\0" registers as 2-characters from your 64k available.

However you should never find \0\0\0 beside itself ever in the final compressed data. Everything gets compressed when a pattern is found.

If you don't want to mess with it, don't enter a value or if you need the next argument, leave it at zero.

The last argument is "F" for flag. If it is anything except NIL then it will not convert to a clipboard friendly string, instead it will save the image to a true 8-bit string that can only be output but not pasted in your code. You will need the starting variable for this.

It is for debugging and you shouldn't need it unless you come across some data that is not compressing properly and you need to show this to me so I can isolate the problem.

However if you are not debugging and just using the compressor normally, after you have called the compressor it is ready for use !

In a line of your code, press CTRL+P, CTRL+V, then CTRL+P again followed by the ENTER key to confirm. That will save your data to the string in your code, and of course, you can rename the variable data to whatever you want.

It will look something like this:

data="\0 ¥たみまたみまたみまたみまたみまたみまたみまたみまたみま█ ... etc "

Then you are ready to decompress it as described in the next function to follow.

(126 tokens in size)

The 1st argument is for the string that you created with compres8(). It will be a series of odd characters within 2-quote marks. See code sample above.

The "O" (oh) variable is for the memory you wish to start writing it to. You are not limited to 0x0000 or 0x6000, you can also write to 0x8000 if you so choose.

The "S" is exactly as above. It SHIFTS the value. So if you recorded using compres8() with a shift of 64, then you need to use decompres8() also with the value shift of 64.

And that's it ! Please see the sourcecode for the sample cartridge above for further information, especially on usage of the 2-functions.

Now I wrote these functions for myself as I need them for the main project I'm working on. However if you find them of use yourself or have any questions to this point, please let me know.

Thanks !

P#122669 2022-12-19 02:11

[ :: Read More :: ]


I would like to suggest, @zep, please, that you add the cursor's X-location to the editor.

There is some screen real estate not being used HERE:

This would help me as I'm now working on some data tables of different lengths across.

Additionally a way of getting the true length of a string before converting it to untypables.

For instance:



Is there room for a 3rd request ?

The other is more technical. I'd like this:

\07 to convert to chr(0).."7" instead of chr(7).

For instance if you want chr(0) and chr(7) it would be: \0\7 or \0⁷
or chr(7) by itself would be, \7 or

\00543 would convert to chr(0).."0543" instead of "63"

Quite simply do not allow a prefix zero to be included in a numerical argument "\" for P8SCII or lower ASCII commands. A "\0" always denotes chr(0). This is only true for CHR(0), no other, "\111" for instance does not give chr(1)..chr(1)..chr(1), it gives "O" (letter oh).

Naturally normal \ without a prefix of zero is fine.

\48 = "0"
\64 = "@"
\13 = chr(13) or \r

But once again something like, \013 would not return a CR but chr(0).."13"

P#122659 2022-12-18 21:05 ( Edited 2022-12-19 02:16)

[ :: Read More :: ]

It seems to me that some of the latest versions you have of Pico-8 are in fact breaking existing previously working Pico-8 carts.

May I suggest that the cart be read, especially the 2nd line down:

pico-8 cartridge // http://www.pico-8.com
version 37

Which denotes the version and online and in Splore at least, run THAT particular version of Pico-8 so all previously existing carts will run correctly ?

Then we can sift through the newest versions of Pico-8, carefully, and deal with whatever problems they are causing - without affecting previously running perfect code.

Also to add a new command to Pico-8, ver which will state the version # you are currently running. The latest if you are running the EXE, or a different version entirely if you load it from # or splore or it is online.

Also to bring back info() so it can be used in code. Currently it is ignored yet in previous versions it works properly. I used that in my Mildew Manor game to show system specs at the start.

P#122613 2022-12-17 19:34 ( Edited 2022-12-17 19:37)

[ :: Read More :: ]


This is what I hope is a pretty simple request, @zep.

Currently if you click PLAY on any Pico-8 project included in a BBS post, it is up to the user, me, to manually scroll the screen so it all fits as it can definitely be just half-on the screen.

Could you please automatically scroll and center the Pico-8 window when you click the PLAY button so we don't have to ?

Also to have an option to sleep or not. That is if the cursor ever leaves the Pico-8 frame while being run from a BBS, it could go silent and freeze up or run as normal, through user configuration.

Thanks !

P#122483 2022-12-15 18:33 ( Edited 2022-12-15 19:33)

[ :: Read More :: ]


As I'm experimenting with 8-bit compression, I came across an anomaly that I feel deserves some attention.

Try this code:


I created the ⁶ by typing in immediate mode, printh(chr(6),"@clip") and then in the source-code pressing CTRL+V.

My question is how can BOTH of these be the same character and - is this an error of some kind ?

Because if you type out in immediate mode, print(chr(6)) you won't get that symbol back. You can only get that symbol if you use printh()

Because if for some reason this is correct, it means that you are NOT saving a single byte per character in your source-code, that you are in fact using an extended unknown set to create that special character of 6, yes ?

The bug is this. You cannot get a visual for printing a character < ASCII of 16, however you CAN if you transfer it solely to the clipboard and then use CTRL+V. There is still no way to print it. It should appear either way you access it for output or at least give you an option of doing so with an obscure poke() or direct extcmd().

It would also be useful to have total access of 256-characters in a string. Use LENGTH of string for storage instead of locking out chars #0, #9, #10, and #13 which cannot be included even via printh() This is just something requested though, it is not a bug.

The extra characters could appear like this:

It would also allow you to use quote " and backslash. So the string itself would be pretty special. Maybe a new command:

data=rawstring("all kinds of characters.")

It would require " and ) on the end and likely giving the string length at the front of the definition in memory and you could not use .. or anything else to add to it on the END lest it be accidentally thought of as more 8-bit string for data. Yet the unprintable characters would be completely allowed, #0-15, #34, and #92 allowing true 8-bit storage to a string on a single programming line.

So, let's see. You could have this:

pet = rawstring("dog")
memory: p=112, e=101, t=116, ==61,
(2-bytes for command type, in this case, `rawstring`),
3 (number of bytes in this string), d=100, o=111, g=103.
No CR or zero to denote end, the length in bytes was
already given so we are done with this single
programming line.
P#122442 2022-12-15 02:32 ( Edited 2022-12-15 19:08)

[ :: Read More :: ]

Cart #slowdown-0 | 2022-12-10 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

(v00 12-10-22)
TO LOAD THIS PICO-8 CART, in immediate mode, type: load #slowdown

In this demo use the LEFT and RIGHT arrow keys to control actual runtime speed of the cart. Examine the code to see how it is done.


As you know conventional code allows you to run your cart in 30fps or 60fps.

However making use of the seldom known command, _set_fps() you can set any of these values or an arbitrary one.

Is there a way of setting FPS <30 inside a cart that does make use of _update() or _update60() ?

P#122196 2022-12-10 23:52

[ :: Read More :: ]

Hello there.

No, that's not Total Recall. Tabber Recall.

As you may be aware you can press the UP arrow key when you are in immediate mode and it will recall the last commands you have typed.

However the feature I would like to request is engaged when you press the TAB key and depending upon what you've already typed, it will match.

Example. Let's say you've typed all this in immediate mode:

save exact-12-10-22

Now if you wanted to save your code again you could press the UP arrow key twice and press ENTER. However suppose you have entered 100 or more commands since then. Well you'd be pressing that UP arrow key quite a few times to find it.

What I suggest is this.

Much like being able to press TAB when you select, load {filename} instead of showing you the files it shows you the commands. So if you typed out s in immediate mode and the TAB key you would get:

save exact-12-10-22
> s

If you pressed a and v from here and pressed TAB again, as there is only one instance of this, it would auto-complete it for you.

> save exact-12-10-22

Then you just press ENTER to accept.

This feature already exists in files. Try typing out load in immediate mode followed by space and a few characters of files you know exist in that directory. This is the feature I would like for immediate mode, not just LOAD but any commands you may have typed.

How about it, @zep ?

P#122166 2022-12-10 18:53 ( Edited 2022-12-20 17:32)

[ :: Read More :: ]


No this is clearly a bug inconvenience.

If you make use of RUN(string) where you can recall it with STAT(6) later, If you press CTRL+R anywhere during the cart, or select Reset Cart from the system menu, or even have just RUN() in your code, it will not reset STAT(6) fouling up the results you were using to look for it.

It would be helpful if a new EXTCMD() was chosen that could be used to reset the argument specifically for the RUN() command WITHOUT having to RUN().

P#122062 2022-12-09 00:59 ( Edited 2022-12-09 07:24)

[ :: Read More :: ]

Cart #xmaspp-3 | 2022-12-09 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

(v03 12-08-22)
TO LOAD THIS PICO-8 CART, in immediate mode, type: load #xmaspp

  • 12-08-22 Thanks to @kimiyoribaka for "quick new game" suggestion. In the system menu.
  • 12-08-22 Thanks to @extar for finding a bug in the name entry. Corrected.
  • 12-08-22 Show high-scores after entering your name. Game continues from there.

@ScrubSandwich: Greeting humanoids, this is the first game release from the group of SORCERY. We hope that you enjoy our humble release filled with Christmas cheer and winter shenanigans.

12-07-22: Hello ! I thought I would update this joint project Sorcery and myself worked on years ago with new Pico-8 v0.2.5c abilities.

For "Quick new game" press "P" anywhere, select it, and go straight to a new game.

Additionally after this you can select "P" then Reset Normal to reset the game to normal boot operation.

You can find the original post HERE:


Instructions are as follows:

Shoot the presents with Santa's teleporter Candy Cane gun to beam them directly to Santa's Sleigh.

Use LEFT and RIGHT arrow keys to position Santa's cane gun.
Press 🅾️ to shoot with auto-fire.
Press ❎ for a single well-placed shot.

You get a bonus man if you can hit all presents without missing a hit on a level. Use the ❎ key for this for accurate shooting so you don't accidentally shoot again and miss for a close target.

Press DOWN for force-field for Santa's cane gun. Only good for the first few levels. If you lose a cane though on any level, you automatically get the force-field back though it vanishes again once you shoot.

It is possible to hit a single present and complete that whole level. I'll let you figure out how that is done. :)

If you can reach "Ceiling Zero" then the game is won, the wonky robot is destroyed, and you get the big gala ending story with a special note from Santa just for you. And yes, this game is a tribute to an old Apple ][ game called Ceiling Zero with mods to make it Christmas themed.


And please let us know if you found this game to be of fun !

Thank you !

P#121988 2022-12-07 18:21 ( Edited 2022-12-09 04:19)

[ :: Read More :: ]

Cart #p8mtoo-1 | 2022-12-06 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

(v01 12-05-22)
, in immediate mode, type: load #p8mtoo

This cart is designed for offline use and will let you select any area from your spritesheet and draw it in any other code or even a different cart - without using the spritesheet.

Use the arrow keys to navigate.
Try selecting any of the color rectangles to test the system.
Hold down the CTRL key to jump in a grid of 8x8.
Hold down the SHIFT key to start selecting an area. The area is inclusive so the cursor must touch the area borders you want to select.

Hold down BOTH CTRL and SHIFT to select in fields of 8x8 where the box is 8*size-1

Press SPACEBAR to save it to the clipboard and you are all set !

Hello there.

I am working on a cart where I have need of both sprite space and mapper space for data yet I need to draw a few elements on the screen. It doesn't need to be very fast for me though.

So I came up with "More Than One Off." Essentially it is a simple program that lets you select any area in the spritesheet, not limited to 8x8 grid, you can select pixels as small as a 2x2 area, save it to a simple string, then let you draw it later.

You are encouraged to run more than one Pico-8 task at a time to get the most benefit from this cart.

It is also geared to work with more than one-color at a time is why it's called, "More than one off."

Also you can import your own spritesheet if you like to here. You are not limited to the selection I have here and this cart will work in any size, it is not limited to 8x8 or even 8x8 areas. 1x15 pixels or even 117x1 pixels are also possible.

For instance, here is a sprite, 8x8 pixels in size:



Yet for my program we only need the 7x7, not the far bottom or right pixels, so it's actually a bit smaller than copying a single sprite cel, 49x49 versus 64x64.


Then to plot it it's, strspr(pic,x,y) and that's it !

To import your own spritesheet use: import spritesheet.png

Then run this program. Once you have selected the area you want, hit SPACEBAR and it saves that area to the clipboard where it can be pasted in this code or another.

Then you just call the strspr() function which is 72-tokens or 145-characters in size to recall the 16-color image clipping.

-- p = sprite image string
-- x = x-coordinates
-- y = y-coordinates
-- v = if yes, overwrite black
--  72-tokens
-- 145-characters
function strspr(p,x,y,v)

It is not geared for speed but brevity and should cover your needs if you too need to use the entire spritesheet for something other than drawing.

The animated dotted bar pattern was made with this tool:


If you find this program good and useful, please let me know !

Thanks !

P#121879 2022-12-06 00:11 ( Edited 2022-12-06 05:04)

[ :: Read More :: ]


I was writing some code and came across this curiosity.

Now we all know that if you place a comparison inside parentheses that you neither need the THEN or END command.

if (a==b) print("match")

However I am doing a comparison inside the comparison, nested, and it does not seem to work.

if (x<0) y=y-1 x=5 if (y==12) y=16

Any ideas on how to get this to work, guys, without using THEN or END, or is this a BUG ?

P#121727 2022-12-02 16:42 ( Edited 2022-12-02 18:54)

[ :: Read More :: ]

I am running into a curious situation, @zep, regarding Pico-8 when it comes to lowercase letters.

For instance, in new code type this:

To type the lowercase letters you will need to press CTRL+P first, then type the letters, then press CTRL+P afterwards to return to normal uppercase letter mode.

Now highlight the code. The easiest way to do this is to triple-click it. Press CTRL+C to copy it.

Now paste it in any text editor like Notepad or even a message in here with CTRL+V. You will get the following:

a="abcdefg 𝘢𝘣𝘤𝘥𝘦𝘧𝘨"

Why is the text italicized ?

If you run the code and then use printh(a,"@clip") and then CTRL+V in the same text editor, you get this:

abcdefg ABCDEFG

Which is think is more correct. What do you guys think is going on here and are you getting the same results I do ?

P#121499 2022-11-27 23:44 ( Edited 2022-11-27 23:55)

[ :: Read More :: ]

Hello, @zep.

You have seen that loading pause that appears in the top-left-hand corner of the screen every time you use CSTORE(), RELOAD(), or EXPORT (PNG) in your code. This is voluntary. I'm certain you chose it for a good reason. Sometimes I can't see the reasons you do. Yet it's not from not trying to.

I feel, however, the delay is artificial and unnecessary. You can prove this by IMPORTING a PNG image and it loads immediately with no delay at all, inside your code or out.

So how about this ? You have the pause when you use it the first time running if you must. Then you can continue to have the pause each time for every time you change the filename. However, if it were used in such a way that only =1= filename were used, for instance, to make it a random access file to save your current work, then it would be most helpful to me, perhaps to others, to remove that pause.

So your work may be saved automatically every minute or so minus the icon and timeout animation.

{beginning of code ...}
cstore(0,0,8192,"stream") -- expect delay + animation

{start of loop}
every 1-minute, cstore(0,0,8192,"stream") -- no delay or animation because the filename is the same
{end of loop}

So the 2nd, 3rd, and more cstore() would not bring up the pause delay. Once the filename is established, there is no further need for the animation and delay.

As it is now you get the pause even if you load or save a single byte. One byte ! 2-second delay every time. You see my annoyance with it.

OKAY, as always, all of these suggestion we make as a community - is up to you, ZEP.

Please remove this artificial delay. I am trying to work on a cart that requires these commands to not pause every time they are called, especially if it is the self-same filename.

The only thing I can add is that it would help me if it were passed, and I could write more amazing code.

I'm here because you hear. A great listener. And I mean that. Thank you for your time.

. . .

For those of you people who think I am being a difficult person. I apologize. Yet you should never ever think that my mood is based solely and 100% on this forum. I have many other difficulties running in my real life and family that all contribute to how I present myself.

Zep. I remember the words you used to encourage me recently. And you made me smile when you did that, knowing that I was important enough for you to support. We're all in this together.

Have a good Sunday and I will return.

Happy Holidays ...


P#121489 2022-11-27 20:25 ( Edited 2022-11-27 23:21)

[ :: Read More :: ]

Cart #travwomoving2-0 | 2022-11-24 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

(v00 11-23-22)
TO LOAD THIS PICO-8 CART, in immediate mode, type: load #travwomoving2

Run this cart. Now before you view the source-code, THINK of what it might be. Do you think it's using an array to keep track of the stars ? OK. Perhaps the acceleration speed is being recorded from another floating point array. Fine. How about the color of each star to make sure they stay the same for each row in the display. That would be the regular way to do it, yes.

So that's 3-arrays we need to keep track of, right ? Let's list them out:

  1. The Star's X-position.
  2. The Star's acceleration speed.
  3. and the Star's constant color.

Now let's consider something else.

. . .

Here is a scene inside the movie, "DUNE" where Paul, son of Duke Leto of the House Atreides is commenting to himself about what is to follow. They must travel a great distance, farther than any conventional starship can reach, and it is done by the Navigators, fantastic beings with vast powers who have ingested the gas of the spice Melange for many years.

Leto speaks to his son, "Soon they will begin to fold space."

Paul thinks to himself, "Far off in the control rooms of spice gas. Traveling without moving."

. . .

That is much what is happening here. Traveling without moving ...

Like being able to enter any universe at any given time. Like being able to travel through time in the past.

"As long as we know what the results have BEEN, we know what the results will be NOW."

Now let's get back to the code. Do you still think it is 3-arrays controlling the stars ?

No, would you be surprised if I told you NO arrays are controlling the stars ? None whatsoever.

Instead the stars' position, acceleration, and color are all being controlled by one very powerful and often underestimated ability.

That ability is called SEED RANDOM. NOW look at the source-code to see how it was done. I'll wait for you here ...

So in definition, just what does is happening ?

First off the program does not rely on RND() or SRAND() from Pico-8, instead it has my own random number generator based upon a true random number from the beginning that is within the range of -32768.9999 to 32767.9999.

In this in calling the RNND() function, a 'random' number is generated based upon 'shuffling' these values and returning one that matches what we need.

This can be quite useful if you want to have a random set of events occur yet you want those random items to be the same every time. For instance, try this code:

for i=1,12 do
-- my nifty random function!
function rnnd(a)
  return seed%a

Well even before you run it you know there will be 12-random numbers each a value of 1-6 that will be printed. Yet if you run this program OVER and OVER again, you will get the exact same results every time.

NOW you can see how powerful seeding is ! Not just for saving you from arrays but being able to build procedurally generated maps and worlds that can be repeated and reproduced on the fly with a chosen seed value leading the first random value and that follows to it all.

And using zero variable space in the process. Being able and capable to build whole planets and galaxies of definition and not being forced to use any arrays besides.

Or as above I am repeating the seeded value so the stars will appear in their correct position and are all only being adjusted by a single variable.

Try including my function within your code. See if it doesn't inspire you in your cart and game design and open your mind to new ways of programming and coding ...


If you are looking for the earlier version which uses true RND() and true SRAND(), that can be found HERE:

Cart #travwomoving-0 | 2022-11-23 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

P#121250 2022-11-23 20:53 ( Edited 2022-11-24 00:07)

[ :: Read More :: ]

Cart #beyond32767-2 | 2022-11-21 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

(v02 11-21-22)
TO LOAD THIS PICO-8 CART, in immediate mode, type: load #beyond32767

Use the joystick to navigate this cart.

Press UP to increase the score with a random value of 1 to 1000.
Press DOWN to decrease the score with a random value of 1 to 1000.
Press LEFT to reset the score back to zero (0).
Press RIGHT to set the score to exactly 32767. The standard upper limit.

Be aware that the score is saved every single frame. This is not a slow process and occurs almost immediately. So when you reboot the cart or come back to it later, it will contain the last value you had in it. Please see the sourcecode for more notes and details.

Run the code above and see that it is indeed counting beyond 32767 and in fact can go all the way up to 2,147,483,647 - so 2-billion and then some is not so bad to keep track of a player's score ! :)

The other method is given to us thanks to @GPI. While this has been used many times over in previous games for different systems and consoles all the way back to the original arcade, it is important for you to understand how it works, its method and simplicity of coding.

Quite simply you are visually adding 00 to the end of your score so when you add 1 to SCORE it appears as if you added 100. A sample cart follows:

Cart #doublezeroes-1 | 2022-11-21 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

(v01 11-21-22)
TO LOAD THIS PICO-8 CART, in immediate mode, type: load #doublezeroes

Press UP to visually increase the score by 100.
Press DOWN to visually decrease the score by 100.
Press LEFT to reset the score back to zero (0).
Press RIGHT to set the score to appear as 32700.

Be aware when you press RIGHT it is only changing the score to 327, not 32700. So you can =count= past 32767 this way.

The first cart above takes advantage of the fact that ZEP has already granted us long integer numbers already, albeit a little tricky to access through the tostr() and tonum() function.

Examine the code to both of these and you might find it simpler to code than the standard method of writing a function that saves 2-different variables for the 8-digits of a score to get past the 32767 number limit.


P#121134 2022-11-21 20:45

[ :: Read More :: ]

While HELP is indeed informative it is missing some commands that are used in Pico-8. I'm not going to mark these as errors, @zep, as they may just be overlooked. This includes:

goto count setmetatable getmetatable rawset rawget rawequal rawlen assert . Likely there are others.

While not required for help it would be nice if there was HELP for these single-key shortcuts:

? # @ % $ \

If you ask for help on do it does not give a code example which is odd as all the other commands do.

Further the HELP could also appear if you are one-character to the right of the command.


Where the cursor is on the ( Pressing CTRL+U does not give help on it.

Should also work if the cursor is directly on the ) which is linked to that same command.

P#120963 2022-11-18 21:55 ( Edited 2022-11-18 22:32)

[ :: Read More :: ]

Cart #pickapoint-0 | 2022-11-17 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

(v00 11-17-22)
TO LOAD THIS PICO-8 CART, in immediate mode, type: load #pickapoint
^^ This version is for examining and learning from. The way I will mostly code from now on.

Cart #pickapoint_shr-2 | 2022-11-17 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

TO LOAD THIS PICO-8 CART, in immediate mode, type: load #pickapoint_shr
^^ This version is for use in your own code. It's a lot smaller in size. If you use CLIPBOARD to copy and paste, be sure to press CTRL+P prior to pressing CTRL+V to paste and after CTRL+V as well.


Too often I have needed a tool to align elements on the screen. While years ago I wrote a quick & dirty program to do this, I felt it was time to make a good and proper one. PickAPoint !

And while the code above is quite large with lots of information on what is happening and what the code does, the one beneath has been Shrinko-8ed and is quite small, using less than 2% of your total character space and less than 7% of your total token space for your program.

Call it as a function either in immediate mode or your own code.

Hold down the SHIFT key + arrows to change the size of your grid.
Hold down the CTRL key + arrows to jump around the grid.

Use the arrow keys normally to navigate the area.

Press QUOTE key by itself to enter TEXT MODE where you can type text and it adjusts that centered on the cursor.

Press "\" by itself to jump to the center. If you are in TEXT MODE then the text will be centered on the 64x64 coordinates and you can see in the information panel below precisely how to code that.

If you are in not and instead in pixel mode, the cursor will jump to 64x64 exactly.

Press CTRL+A to flip between using a resolution of 128x128 matching most grid divisions or to see the grid entirely on the screen with 127x127.

Press CTRL+K to change the grid-color (Kolor). By default it chooses color #1, dark blue. However when you call it as a function, the single argument used there changes the grid color to this.

Press TAB key to exit out and return back to your program. There are no worries about losing your screen data, that is all saved prior to the main code and recovered at the end.

Be aware if you call it as a function in immediate mode instead of from your own code, the key repeat will be faster than normal. Something for @zep to look into possibly.

And there you have it ! A useful utility to help you align text and graphics, PickAPoint !

P#120882 2022-11-17 23:57 ( Edited 2022-12-12 21:49)

[ :: Read More :: ]


@zep, could you please add a hotkey like CTRL+W to turn on and off word-wrap for code ?

For instance we have this one line which extends beyond the screen:

However, if you press CTRL+W then it would wrap around the screen like so, showing the at the beginning to let you know it is a wrapped line and you can navigate the area and easily edit all 4-lines. When done, press CTRL+W again to return it back to a full and single line that scrolls off the edge of the screen.

Ignore the color changes above, this is just me putting that character in front of the code to show what it would look like.

Now I know this isn't perfect, I mean Pico-8 only has 32-characters across using a 3x5 pixeled font. Yet I think this will help some of us work on large lines.

It could also be that you do not see this word-wrap except for lines that do exceed 32-characters AND the cursor must be on that line in order to access it.

Just an idea that would help me and possibly help others using the Pico-8 GUI for their editor as I do.

P#120878 2022-11-17 22:04 ( Edited 2022-11-18 06:18)

[ :: Read More :: ]

Cart #reconfig_arrow_keys-2 | 2022-11-16 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

(v02 11-16-22)
TO LOAD THIS PICO-8 CART, in immediate mode, type:
load #reconfig_arrow_keys

VVhat's New ?

  • 11-16-22: Changed the default keystrokes to normal arrow keys. Should work now.
  • 11-16-22: Got a nice doodle for the covert art.

Use the arrow keys to navigate and press 🅾️ to reconfigure the arrow keys to anything you like.


One thing I noticed about new Pico-8 is that KeyConfig() no longer works inside code. Now this is not something recent. I think it was years ago that it =DID= work, however.

So as coders we must find a workaround. Here now is one I have written to examine full of many remarks and comments explaining what is going on. Not only does it let you choose SHIFT and other non-standard keys for your arrows, it also records them so even if you shut it down and bring it back up later it remembers what you recorded.

What keys should you choose ? Well of course there is the classic arrow keys. But how about W A S D or I J K M. In Ultima 1 for the Apple ][ computer it was the the , . ENTER and / keys to move West, East, North, and South.

If you want to see a raw key viewer which will show you the numeric value for every single key on your keyboard, I wrote a tool for that you can find HERE:


Just for fun, here is the Shrinko-8'ed version of the reconfigure cart. :)

Cart #gasorugeza-0 | 2022-11-16 | Code ▽ | Embed ▽ | No License


P#120777 2022-11-15 22:19 ( Edited 2022-11-16 19:42)

[ :: Read More :: ]


I'm not sure if this was asked before, @zep, but it sure would help me to have CATEGORIES or TYPES for games.

I can certainly rattle off a few from my collection:

Adventure, 3D, topview, sideview, use joystick, keyboard, mouse
Battle Cards + digital card collector.
Battlers (map scrolls, fight many opponents).
Balancing, Rotating, and Gravity.
Board Games, Chess, Checkers, Gomuku, Nim, Sorry, Monopoly, Candyland, dice.
Bowling + ball hitting pins.
Casino, either cards, dice, roulette, lotto, etc.
Catch + Release + Avoid.
Celeste Clone (based upon the original).
Classic Arcade, Pac-Man, Space-Invaders, etc.
Click Puzzles + Mysteries, using items or not.
Clickers, Reaction, Cookie.
Coloring Books + Stickers.
Creative, Painting and writing.
Dance + Rhythm + Patterns + Recall.
Dating Sim. Virtual dates.
Demos, team animations + music showcasing programming, art, and musical talent.
Dressup, put the clothes on the bunny. ZEP wrote one of these.
Educational, Edutainment.
Exergame, fitness, Dance Aerobics.
Fighters, usually (1 on 1), fixed background graphics. Slug-fest.
Gambling, 5-Card Stud, Poker, Blackjack.
Horror, jumpscare games. Stuff like that.
Just Graphics. Showing off your artistic talent.
Just Music. Showing off your musical prowess.
Simulation, Flight, etc.
Foreign (game is difficult albeit impossible to play for English speaking without translation).
Gacha. Gets its own category.
Game Shows.
Golf. (yes I give this a category to itself as I like it so much). :)
Hidden Object Games.
Idle games. (These almost play themselves).
Jigsaw + Reveal-The-Picture.
Kids + Educational.
Life simulation.
Logical + Brain Games.
Match-3 + Tile-Matching Games.
Mazes + Snakes.
Monster tamer + Battles (Pokemon).
Multigames (where there are small timed games, like 5 seconds each).
Music Loops.
Music Videos.
NSFW Games + Videos (may not apply to Lexaloffle).
Party Games, 2 or more players expected.
Photography, virtual camera + film.
Pick-Your-Own-Path (like the books).
Pinball + Breakout.
Platformers, 3D, Topview, or Sideview.
Programming + Coding. The Fantasy Console within a Fantasy Console.
Puzzles, action or relaxed play.
Quizzes + Tests.
Racing, 3D, topview, sideview, rotating vehicle or not.
Realtime Strategy.
RPGs, action, MORPG, Rogue, turn-based, relaxed play, tactical, 3D, Topview, Sideview, saves game or not.
Runners. (usually sideview, player is constantly running).
Sandbox, Open World, Creative.
Shooters, 3D, topview, sideview, rotating player, uses mouse or not, constant walking or not.
Simulation, Construction + Management.
Social deduction, Clue.
Solitaire, Klondike.
Space Strategy + Selling + Trading.
Sports + Air Hockey. Football, Baseball, Soccer, Basketball, Hockey.
Strategy, 4x, artillery, auto, RTS, RTT, TBS, TBT.
Survival Horror, 3D, topview, or sideview.
Survival Island, limited resources.
Text Adventures.
Time Management + Simulators.
Tower defense, topview or sideview.
Trial & Error + Exploration.
Tribute (give tribute to known game).
Visual Novel.
War Games (Global Thermonuclear War).
Zen + Greeting Cards + Tests + Fakes.

Likely there are many many more and I'm certain some I listed above may clone other in certain respects.

. . .

So what I would like in Lexaloffle and SPLORE is the ability to search for TYPE or CATEGORY of game. Where you have the general and go to specific.

Puzzle > Match-3 > Relaxed Play > Halloween-Theme Based > (author) > (date written)
RPG > Turn-Based > Relaxed Play > Classic D&D Theme > (author) > (date written)


P#120761 2022-11-15 17:39 ( Edited 2022-11-21 18:08)

View Older Posts