KNUCKLEBONES ON PICO-8!
I absolutely loved playing Knucklebones on Cult of the Lamb. So much so that I made a 3D-printable travel case. The next thing I wanted to do was to be able to play it on my 3DS. First, I tried developing an original DS game. That was not fun. There was not enough documentation. Then, I stumbled upon FAKE08 for the 3DS and subsequently, Pico-8. Now we’re here.
Rules
- The game consists of two 3x3 boards, each belonging to their respective player.
- The players (you and CPU) take turns. On a player's turn, they roll a single 6-sided die, and must place it in a column on their board using left arrow, right arrow, and Z. A filled column does not accept any more dice.
Speaking?
This is your commander, captain. A Verco 1020 bot ship has been destroying our bases, and the damage is getting serious. I need you to destroy the space creatures and the smaller bots. Your jet is the strongest ship we have currently.
Yes, Sir!
However, proceed with great caution. The Verco may come after you, so avoid contact unless neccesary. Understood?
Yes, Commander.
Good luck. We are counting on you.
Controls
Battery barrage
Sometimes when defeating an enemy, a battery that you can pick up will spawn. When you have any batteries, hold Z + X to unleash a barrage of bullets. Pick up ten batteries, and you gain an extra life.
PLEASE PLEASE PLEASE pay careful attention to the warning at the start. This was all amateur research done for a gift for a friend using potentially harmful information on the internet. Exercise extreme caution when identifying plants. Things that have medicinal or illicit uses listed in the game may also be poisonous if ingested or used improperly.
This game was made for my dear friend Hilda, while she was recovering from burnout. She also made a really lovely game for me because I was also recovering from burnout. I think it says something about us both as artists that we did this.
If you type "Help", it will bring up a list of keywords

-Instructions-
-Arrow keys to move
-X to interact (or swing a cool sword for no reason)
-Click on stuff and talk to the guy!
Baby's first game!!
Light Knight will be a horror-themed top-down dungeon-crawler adventure game heavily inspired by the FNAF 2 minigames. This here is a short scripted intro, about two minutes long.
You play as Father Mullet, hardened exorcist with eccentric taste in hairstyle. The church has tasked him with chasing out evil spirits from a failing local arcade and restaurant, Charcoal's Woodfire Pizza. But as he walks in, it seems at least they've still got the lights on...
This demo is just a walking sim but you can still use a completely worthless sword attack with X when not interacting with anything just because I wanted to leave the animation in. Combat in the final game will be a sequence of stunning ghosts with your flashlight then closing in and using the sword to banish them. But for now it just looks cool. And if you spam it you can turn into furniture.

My first finished PICO-8 game! I did 80% of the work a couple of years ago, and finally decided to pick it back up and do the other 80% 😉
Supports pass & play with up to 6 players, or play against 4 different difficulties of CPU
Controls:
- X + direction: Look around
- Left/Right: Change shot angle
- O: Start shot, press a 2nd time to shoot
This version follows "backyard croquet" rules:
- Gain 1 extra shot when scoring the next wicket or pole
- Gain 2 bonus shots when you hit another ball. These are only granted once per scored wicket/pole, and are reset when scoring the next one. These are shown as outlined balls, and as empty outlines once used.

I'm trying to add object clean up to my game, but I'm not sure where to write the code.
--enemies
function spawn_enemy(x,y)
local enemy = {}
enemy.x = x
enemy.y = y
enemy.spd = 1
enemy.spr = 19
add(enemies,enemy)
end
function spawn_wave()
for i=0,8 do
spawn_enemy(-8,i*16)
end
end
function move_enemies()
spawntimer+=1
if spawntimer>130 then
spawn_wave()
spawntimer=0
end
for enemy in all(enemies) do
enemy.x += enemy.spd
enemy.spr += .1
if enemy.spr > 20 then
enemy.spr = 19
end
-- player collision
if col(enemy,player) and invuln < 0 then
health-=1
invuln=30
if health < 0 then
state="gameover"
end
end
-- projectile collision
for projectile in all(projectiles) do
if col(projectile,enemy) then
del(enemies,enemy)
del(projectiles,projectile)
score+=10
sfx(1)
end
end
end
end
function draw_enemies()
for enemy in all(enemies) do
spr(enemy.spr,enemy.x,enemy.y)
end
end
I’m currently working on the shipyard section of my first multi-cart PICO-8 project and wanted to share the plan so far:
Planned Carts
- Cart 1: Ship Creation (Shipyard)
- Cart 2: Space Station
- Cart 3: Space Travel & Combat
- Cart 4: Planets
This is my first time splitting a game across multiple carts, so I’m figuring things out as I go. If you’ve got ideas, suggestions, or lessons learned from similar projects, I’d really like to hear them!
Storage added, next save file and load from another cart.
Old Versions
This is a for a GameJam with the theme "Abandoned"
(1.0) UPDATE
- Added a Gauntlet room
- Added a proper end to the game
- Figured out how to add different enemy types
- Changed the life pickup in the lava room to be a +1 life pickup. increasing hp to 4.
- Added a checkpoint so you don't have to run the entire thing to finish the gauntlet.


I made a simple game with a very flexible level system, there is currently no collition, so the game craches when you go oob.
I am happy with this demo, i am happy that it is so flexible that you can create non-eucidian levels
Added collition so you cannot go to unexisting levels to second cartridge

BBCode is the text-based type formatting engine in the BBS, name as seen in the Profile settings.
Whereas the Formatting Help menu have referred some of the contents, still some more things are not mentioned. This thread is an unofficial collection of the BBCode, and it will keep on extending indefinitely. Anyone is welcome to add!
Contents
- Escape Letters
- Horizontal Lines
- Text Types(WIP)
- Extended Headings(WIP)
- Lists(WIP)
- Tables(WIP)
- SFX Snippets(WIP)
Escape Letters
Almost all the codes have to use escape letters to explain literal special characters without messing the output. BBCode uses \ for simple escape:
| Code | Text | |||
| *italics* |
Backslash escape will be omitted when explained in a code snippet:
`\[hidden\]` |

In a fractured America, war is no longer fought with soldiers—but on the field. States have become independent powers, and conflict is settled through Cyberball: a brutal, high-stakes sport where massive machines clash for control of territory, resources, and military authority.
These aren’t athletes—they’re towering cybernetic giants, built for speed, power, and destruction. Every play is a calculated act of war. Every game shifts the balance of power.
Tennessee stands at the center of it all.
The Volts are known across the league for their relentless, hard-hitting style—built on raw strength, aggressive offense, and machines designed to break through anything in their path. They don’t play for finesse. They play to dominate.

Personally, I wish for Voxatron EDU, just like Pico-8 EDU exists...
@zep can you make an EDU version of Voxatron

After watching a recent LazyDevs video, I thought I would try to implement smooth diagonal player movement into one of my old games (Nodes). However, when implemented, the only diagonal that works is up/left. Normal left, right, up, down are unaffected. I've been staring at this code for quite a while now and have to admit that I am completely stumped! The code in question is in the tab(1) of the attached cart, this bit in particular:
--diagonal normalise pl_move = ((btn(1)!=btn(0)) and (btn(3) != btn(2))) and 0.7071 or 1 --store old pos for anti-cobble local old_x,old_y=pl_x1,pl_y1 --horizontal movement if btn(⬅️) then if prev_h_dir != -1 then p_flp() end pl_flp, pl_draw_offset=false,2 crect_tmp.x=pl_x1-pl_move if pl_x1>9 and (current_room!=1 or not intersect(crect_tmp,cage_crect)) then pl_x1-=pl_move end prev_h_dir=-1 elseif btn(➡️) then if prev_h_dir != 1 then p_flp() end pl_flp, pl_draw_offset=true,1 crect_tmp.x=pl_x1+pl_move if pl_x1<109.7071 and (current_room!=1 or not intersect(crect_tmp,cage_crect)) then pl_x1+=pl_move end prev_h_dir=1 else prev_h_dir=0 end --scenery collision pl_crect1.x=pl_x1+1 --cage collision crect_tmp.x=pl_x1 --vertical movement if btn(⬆️) then crect_tmp.y=pl_y1-pl_move if pl_y1>17 and (current_room!=1 or not intersect(crect_tmp,cage_crect)) then pl_y1-=pl_move end prev_v_dir=-1 elseif btn(⬇️) then crect_tmp.y=pl_y1+pl_move if pl_y1<110.7071 and (current_room!=1 or not intersect(crect_tmp,cage_crect)) then pl_y1+=pl_move end prev_v_dir=1 else prev_v_dir=0 end -- animate only if moved if pl_x1!=old_x or pl_y1!=old_y then anim_flip(pl) end -- anti-cobble per-axis if pl_x1!=old_x then pl_x1=flr(pl_x1) end if pl_y1!=old_y then pl_y1=flr(pl_y1) end |

A previous version of this cart:
Version 0.3
Controls:
UP for SFX #64
DOWN for SFX #1
LEFT for previous SFX
RIGHT for next SFX
O to play current SFX
X to stop currently playing SFX
Updates:
Changed counter to say v0.3 instead of v3

A previous version of this cart:
Version 0.3
Controls:
UP for SFX #64
DOWN for SFX #1
LEFT for previous SFX
RIGHT for next SFX
O to play current SFX
X to stop currently playing SFX
Updates:
Added 2 more SFX
Previous version here.
Next version doesn't exist yet.





0 comments


