I wrote a script for Aseprite which takes the selected pixels (or the entire image)
and encodes it into PICO-8 GFX format, such that it can be pasted in the sprite editor or the BBS.
// i couldn't figure out how to arrange it in a cleaner layout, sorry
The script, and instructions on how to use it, can be found here: asep8 git repo
(click to expand)
Heeey, it's Squiddy! This is a game made in 1017 bytes for PICO-1k Jam, co-designed and pixelled by @castpixel (twitter). This is our second production as pod; you can find the first one here. Squiddy is also up on itch.
Technical Details
1024 bytes is an interesting size limit for a game; it's large enough to try for some relatively detailed game logic or visuals, but small enough that you need to execute some weird programming tricks and design pivots to get everything to fit. If you found this post because you heard that PICO-8 is a nice introduction to game programming, I apologize for the following code snippets! First up, here is the full source code for the game that includes the graphics and map data. It can be pasted into PICO-8 0.2.3 or later:
➡️=0t=8⬇️=7for x=0,3800do ➡️-=1if(➡️<1)➡️=2r=3⬇️=7-⬇️ while r>2do r=ord("○ュ?\0゜ョヤャ◝◝⁷ツん¹ュ=◝に◝+ンョャヤ○る³ユ\n <◝エ𝘤ムもにュよ◝トラ⁙⁴よ░²リムリᵇ³ト■𝘨○ワ;◝エらョ0\0pクシチ◜◝=ュoれ/ウワ◝モャいユ𝘪ゆ?=0◝cりdオトは⁷ト?⁵\0𝘴リ◆○☉6サ¹6ア?ュ◝❎。。ユユ◝ャヤ2v\0q○¹\0ワw3v\0001よ¹\0◝?𝘰v⁴ャ゜⁴ら█pタp⁵ュ?オ; <○○ヨ◝oに◝𝘰ュ?1░ろヲア◝ᵇp○\0s³ヲュひ\0|れツ◝リツ𝘰゜6ト⁴ュ?p◜◝モpᶜオん▶○◜ャ\r○𝘣◝▶トリに1◝⁷ョ_ンん゜ョょ737⬇️○ョ¹ュのら◜-エs○ユト⁴らメ\0³•~◝エろヨ/゜3\0な?𝘯ュ◝よ▮ラヨsクろ?リトンミエセろ⁵ᵇムり3オ◝𝘮rユ⁷ワ>pンᶠ゜シてン>ナレ◝𝘰⁙ュuワ◝シ◝1゛ュ4チ◝?◝◝𝘰\0゜ᵇユ◝エ◝4◀0○ ◝◝◝◝◝\0ら𝘬\0",t\8)>>t%8&3t+=2➡️+=r end sset(x%95,x\95,⬇️)end o=128w=256f=0r=4128🐱=cos ➡️=0 ❎=64🅾️=r*2s=spr::_::t+=.03camera(❎,🅾️)map()v=0for i=0,t/2do x=i\32y=i%32v/=2v+=sget(r%o+x/4,r\o+y/4-🐱(i/870)/2)&4mset(x,y,v)p=i%4y=i\4*5%31 if(mget(x,y+1)==4)s(0,x*8+🐱(p/4-t),y*8-p*4) if(r%5==2and i<o)s(i&2,-t*i%w,i*i%w+🐱(i/9+t)*3)➡️-=1>>12 end if(r==4136)s(8,92,112,5,5) s(20,o+🐱(t/2)*9,90+r+🐱(t)*5,1.5,2)b=btn()n=b&32f=f/2+n/20k=b%4\2-b%2if(f>n)➡️+=f*k ⬇️-=f f=0 ❎+=➡️ 🅾️+=⬇️ ➡️=-➡️ ⬇️=-⬇️?"ᶜe\^wfin ♥",108,60+r if(mget(❎/4,🅾️/4)<1)➡️*=-.95⬇️=.05-⬇️*.9 r+=(❎\o+🅾️\o*o)*8❎%=o 🅾️%=o s(16+(f&2)+k%2*32,❎*2-8,🅾️*2-8,2,2,k<0)?"⁶1⁶c" goto _ |
Sprite Storage
Here's the 95x40 spritesheet (hidden for spoilers).
by Meep
🎵 Music by RubyRed
🗺️ Maps by Meep, gonengazit, taco360, RubyRed, Lord SNEK, Beeb, and cominixo
A fan-game of Celeste Classic
by Maddy Thorson
and Noel Berry
Plot
Oh mighty @zep, a quest for thee: to fix this bug in oh-two-three.
Time's very fabric has been torn, and monsters from the past reborn!
A pumpkin army's impossible roll befouls our once cozy console.
Its humbled clock refunds too much, permitting Cauldron's villain's touch.
Relentlessly they spin and taunt, they dare thee to remove their haunt.
Please help us take our console back and save us from their cycle hack!
Their jeering eyes provide the clue, all stars show what you must do.
A table's count below sixteen, as low as any number's been,
Negate it and they'll mock you more... the wellspring of this wretched flaw!
About
An entry in 1023 chars to the #pico1k jam. See
Arena Shooter
Destroy the spawning enemies and defeat the boss at the end of each wave. This is an endless top down arena shooter. It features:
- Four enemy types and a boss. Each with unique attacks.
- Bullet lock controls (hold fire to keep shooting in current direction)
- Ghost control - press the other button to ghost through enemies and walls and get a speed boost. Ghosting also reloads.
- Defeat the boss at the end of each wave for big scores.
- Bottom left shows you wave, and countdown to the boss appearing.
- High scores.
Good luck! This started as a bit of an experiment for some control schemes for a platformer...and ended up this. It could use a bit more polish- but for this project, I'm moving on. I might come back to it one day and add a few more boss types and polish.
Hi guys.
I have an enemy that moves towards the player.
I have the usual set up with DX, DY, X, Y. Where X and Y are the co-ordinates of enemy, DX & DY are the direction of movement.
I thought it would be good to have it set up like this:
e.dx and e.dy are the enemies dx and dy.
e.x and e.y are the enemies x and y cords.
plyr.x and plyr.y are the players co-ords...
If the plyr.x MINUS the enemy.x is a positive sign in the result, move the dx 1 or right.
If the plyr.x MINUS the enemy.x is a negative sign in the result, move the dx negative 1 or left.
If the plyr.y, minus 2 (so the enemy is slightly higher) MINUS the enemy.y is a positive sign in the result, move the dy 1 or down.
If the plyr.y, minus 2 (so the enemy is slightly higher) MINUS the enemy.y is a negative sign in the result, move the dy -1 or up.
e.dx=sgn(plyr.x-e.x) e.dy=sgn((plyr.y-2)-e.y) |
This works very well and I was pleased with myself for shortening the code.
However, my problem is (especially on the y) that if the enemy and the player are the same y value, the enemy wiggles up and down and the sign of the maths goes -1,1,-1,1,-1,1,-1 etc...
Free Cell, in 1022 characters of code, and no sprites! twitter | itch
CONTROLS:
- click and drag cards around
- you cannot move stacks of cards; one at a time only!
- stack descending cards of alternating colors in the main play area
- any card may be placed in an empty column of the main area
- store any card in the four "free cells" at the top left
- make a stack of each suit A->K in the top right to win
- reset the cart to start a new game
ONE AT A TIME?
You can only move one card at a time; if you want to move a stack of cards you have to take it apart and put it back together manually. This is different from "standard" solitaire, and it makes Free Cell particularly interesting! It also makes the implementation a bit easier to fit into the tiny code-size constraint ;)
controls:
This is a niche tool to help you save characters when writing carts that are codesize-constrained.
- type in a number; press enter
- then press up/down and ctrl-c/enter to copy a code
- navigate back up (or press backspace) to start typing a new number
Example: 0x6000 can be written as 0x6000 (6 chars), 24576 (5 chars), 6^13 (4 chars) or ⌂-🐱 (3 chars!)
The tool sorts the results by character count (on twitter), so the top results are your best bet.
Update: The latest versions of pico8 have special P8SCII codes for poking which are often fewer characters than calling poke directly (even after using this tool). e.g. ?"\^!5f10249?"
instead of poke(0x5f10,50,52,57,63)
. Consider using that instead! But this tool might still be useful sometimes, and at the very least, it's an interesting artifact.
This is a half-completed demake of the Sega Genesis title Shining Force. I played the game for the first time early this year, and I found myself fascinated with the turn-based battle system. My biggest annoyance with Shining Force was that characters take a movement turn on the map, then combat takes place in a battle screen for only one turn. As enjoyable as it is to see higher quality graphics of the characters and terrain on the battle screen, there's a lot of time wasted moving between the two views in larger battles. I decided to write a similar battle system, but have all combat take place on the map instead.
Here's how combat works: Characters on the map are sorted by their speed to determine turn order, then each character gets a movement and action turn. Playable characters have HP and MP bars that appear at the bottom of the screen during their turn. Depending on their class, a character may have ranged or melee attacks, as well as one or more magic spells. There are also potions hidden on the map, which characters can pick up by standing on them, and can drink as an action. There isn't a win condition implemented, but I found it fun to try and get my party to the castle in the center of the map while testing the mechanics.
Hi so I'm quite new to pico-8 so I'm sorry if this is a silly question to ask, but I was wondering if there was a way to wait until something happens. Like the scratch block wait-until. I don't want this to be in an _update() loop as I only want it to happen once, but I also don't want to create too many variables.
My idea was that you were asked a question. You choose and it comes up with a different dialogue depending on your answer.
In the end I want something like this:
if btnp(4) then <----(in an update loop) if qna==false then nexttext() return else nexttext() a=hovertxt qna=false return end end if qna==true then <----- also in update loop if btnp(2) or btn(3) then hovertxt+=1 end if hovertxt>1 then hovertxt==0 end end textdisplay("Hi so, do you think,",function()<----just a custom function that tells the code to run whatever is inside after the dialogue finished. qna=true a=2 <------ in an init loop end) textdisplay("Yes Or No") wait until a==1 or 0 if a==1 textdisplay("you said no!") else textdisplay("you said yes!") end |
if you can help me solve this, it would be very appreciated!
GFXedit for Pico8
Short
GFXedit is a small tool to handle the sprite, map und label data from a p8-file with many features, like export and import as png or lua-data, copy&paste, display the usage of sprite and many more.
Download
Sprite-Overview (left side)
You can simple select an sprite with a left click. If you hold down the mouse button, you can select a group of sprites.
With a right click you can Copy the current selected sprite to the "red border" place. When you have selected only one sprite, shift + right click will replace every appearance in the map.
Over/Under the Sprite overviews are Tabs. "Low" to show the sprites <= 127, "High" for sprites >=128 and "Minimap" to activate the minimap.
Under the Sprite-overview you can find the coordinates in the world (if the cursor is in the Worldmap, the ID of the sprite under the cursor and the flags of the ID under the cursor. You can also sets flags of the current selected sprite here.
Latest version posted here.
Update:
- Cannon now works. Stuff those bunnies in and let mayhem ensue
- Grabbing works with cannon. Use it as your own personal toad gun.
13/10/21
- Now there's an evil fairy set on taking over the land (by flying up and down in a line)
- Added grabbing and cannon physics to the evil fairy because..... well just because.