I discovered the Pico-8 a few months ago, and have absolutely fallen in love with this project! I realize the intentions of the creator were to make a simple and comforting console for people to enjoy, but I can't help thinking that Lexaloffle doesn't really understand how important a Pico-16 would be to the gaming community as a whole.
Having the ability to create new games with slightly better capabilities would be absolutely game-changing (pun intended). I can just imagine how many designers would build amazing new games and even bring classic games back to life with a tasteful remaster. Unfortunately I don't think that would ever happen with a standard Pico-8, because the specs simply don't allow for this to happen. Don't get me wrong, I absolutely love the games that are available on the Pico-8 (as well as the limitations), but I can only imagine what a 16 bit version might look like! I think I speak for a lot of people when I say that a Pico 16 would make for the perfect fantasy console of all time!
picocade: The PICO-8 Arcade Controller
I designed and build an Arcade Controller to play PICO-8 games!
As many, I also dream of playing PICO-8 with real hardware. And, as a first step, I designed the picocade. It is also Open Source, so you can build your own!
The list of parts, circuit design and code are here: See on GitHub
Features:
- An
esc
andsplore
button to find and select PICO-8 games from the controller (no keyboard needed)! O
andX
buttons for gameplay (can be customize with Python)- USB-C connection (can be replace with a different type of USB port)
- Power LED that indicates the controllers is on/off
The controller connects to the computer to play the games. Plug and play, no configuration needed!
If you like the project, please give it a star on GitHub. :)
Hope someone builds it and finds it fun!
~isaac
XanShot is a mod of Stray Shot that adds some new features and modifies gameplay. I tinkered with this a long time ago when I was first learning pico8 but decided to update and release it!
Features:
- A turbo button (X) which adds a speed boost and faster shooting, but quickly drains score. Useful for getting out of dangerous situations!
- Gain an extra 15 seconds of time per 500 points
- Diagonal player movement
- A new 'DASHR' enemy is added which dashes forward quickly in short bursts.
- Green Squid enemy: it shoots faster but has a shorter bullet range. No shield, less HP.
- Orange Guard enemy: less shield
- Enemies spawn in a semi-ordered and proportional fashion with some randomization.
Hop, step, and jump your way to gold in this Track & Field inspired game.
Controls
Alternate S and F to or the left and right arrow keys to run.
Press X to jump.
Rules
You must start your jump before the foul line and then jump two more times before landing in the sand pit. Running across the foul line, in between jumps, or into the sand pit will result in a foul.
Credits
Programming, music, and art by me.
Playtesting by szunami and Liam.
Hello, I need some help with an error that I have been encountering in my code. I started coding a few days ago but I have been working on someone else's game. For some weird reason when I call cartdata() in the init function and later in the update60() function I get a error "DGET CALLED BEFORE CARTDATA() IN _INIT LINE 287 (TAB 0) AT LINE 1 (TAB 3) you can see it for yourself if you run the game and chose "TIMED" and collect 25 flowers.
Credit to Lucatron for creating the base game: https://www.lexaloffle.com/bbs/?tid=36520
The cartdata() function is in init so I do not get why the error is occuring.
🏐 PICOBALL 🏐
Play against a bot 🤖 or your friend 👴🏼!
Controls
Player 1 ⬅/⬆/➡
Player 2 S/E/F
Thanks a lot to @cheesemug 🧀☕️ for remaking the game!
Go follow him
RAIDOUZ
Raidouz is a really simple shoot-em-up type game, you can shoot, you can upgrade and you can even change weapon, but for now not everything is balanced as all things should be. It is a work in progress ! There is still some little bugs but the game is playable and you can get fun with it !
Controls
Z to shoot.
X to change between two weapons.
Arrow keys to move.
The Goal
Have fun, kill everyone and try to score as much as possible !
Controls
◀ ▲ ▼ ▶: to move.
z/o: make selection.
Orion CORP. General Pilot Contract:
You will be using a rental Star Catcher vessel. You are welcome to choose whichever craft that suits you from the ship-lot. This document binds you until completion of a full tour of duty. you will be billed for any towing services if you run out of fuel. you will be responsible for the maintenance of your craft. Awards will be given to those who meet the assigned quota. Sign below if you agree.
ORION CORPORATION ltd.
....................
This game is intended to be less grindy and slow version of the NES Elite, suited more for an evening of fun rather than a week of space-trucking. If you're wondering how to play, I've written a Game Manual
Holding down the (X) button and pressing Left or Right is how you navigate menus. Double-tap (X) to select a menu option.
Basically, I’m working on a digging game and am revisiting something I have worked with in the past: marching squares. I recommend looking it up, but basically the way it works in this project is for each “tile” a table of tables is examined and depending on whether each of the tiles coordinates are on or off the algorithm figure out which sides does the line on the square intersect. Sometime marching squares also uses linear interpolation, but since my screen is stored in binary instead of floating point values I am storing intersection points in separate nested tables. The main thing is that each square is checked, and depending on stored values a specific line might be drawn through it.
I made this tool for myself, for reordering levels to fix difficulty curves. But I thought I'd share it in case anyone else finds it useful.
How it works:
- Press X to select a room, and then X again to swap the two rooms
- Press C to preview a room
- Maps are imported/exported manually using
cstore
. Cry about it :(
Note: Mapshuffle cannot import/export maps in the web player. You must download the cart and use it in immediate mode.
Instructions:
- Back up your project in case something goes wrong.
- Download mapshuffle.p8 and place the cart in the same folder as your project.
- Open your project, type the following line into the terminal, and hit enter:
people often ask about object orientation (OOP) and inheritance, but can get confusing or incomplete guides. I want to help everyone understand how prototypes work!
lua does support object-oriented programming (but does not require it), based on prototype inheritance — not classes.
metatables are part of this but also often misunderstood. this is a complete explainer that I wrote on discord and keep not putting here in a clean way. so I am putting it here as it is!
so what is a prototype?
goblin={ sp=42, } function goblin:new(x,y) local obj={x=x, y=y} return setmetatable(obj, {__index=self}) end function goblin:draw() spr(self.sp,self.x,self.y) end gob1=goblin:new(40,40) gob2=goblin:new(60,70) |
alright so this is like 6 different things working together.
1) table with methods: goblin
is a table with property sp
and methods new
and draw
(a method is a function attached to an object)
calling goblin:new(40,40)
is the same as goblin.new(self,40,40)
; self is «the object we are working on»; defining function goblin:draw()
is the same as function goblin.draw(self)
and the same as goblin={sp=42, draw=function(self) spr(...) end, somethingelse=true}
there is a difference between the two methods in my example: when we call goblin:new
, the self
param inside it will be the goblin
table itself (the prototype), but when we have gob1:draw()
then self inside draw will refer to gob1.
2) metatables. there are special methods that lua uses to implement operators (+
, /
, ..
, etc). the method for addition for example is __add
(we call these metamethods). if I want to be able to do vector1 + vector2
for my custom vector tables for example, I need to define a method named __add
but I can’t do it in the vector
prototype table, lua will not look it there; it is required to define these metamethods in a table’s metatable. (the metatable is similar to a class in other object-oriented languages: it is the template, or the definition, or the model for many tables.) so that’s what happens in goblin:new
: I define a metatable with one metamethod and set it on my goblin object.
3) prototype. these are great! if I have 50 goblins on screen and they have different health and coordinates but the same properties for sprite, width, height, etc, and the same methods for update, attack, draw, etc, I would like to define all the shared things in one place, then have custom things in each goblin table. that’s what a prototype is for! here in goblin
example we have sp
and draw
shared, and in a specific goblin table (it starts as obj
on line 6, then it’s gob1
or gob2
in my example) we have specific data like x and y.
much more info on this really useful site: https://gameprogrammingpatterns.com/prototype.html
alright so how do I say «gob1 and gob2 should delegate to goblin prototype for some properties»? I define a metatable with an __index
property. it is called by lua when I do gob1.sp
and sp
is not found inside gob1
. it can be a function (can be useful to have a dynamic property that’s computed from other properties) or another table: the prototype!
more: https://www.lua.org/pil/13.4.1.html
now this is the cool thing with prototype-based object-oriented language that you don’t have in such a nice way with class-based OO languages
what if I want 40 goblins on screen and 10 archer goblins? these should have a different sprite and different attack method.
archer=goblin:new() archer.sp=52 function archer:attack(target) --use the bow end arcgob1=archer:new(20,50) arcgob2=archer:new(40,70) |
look at this from bottom to top:
arcgob1.x
will be 20,y
50- arcgob1’s and arcgob2’s prototype is
archer
, because when we callarcher:new
,self
on line 6 of my first code block points toarcher
arcgob1.sp
is 52 (the value comes from the prototype)arcgob1:attack(hero)
will use ourarcher:attack
method.arcgob1:draw()
will usegoblin:draw
! archer itself is a table that has goblin for prototype
draw
is not found in arcgob1, look at its prototype archer, not found, look at its prototype goblin, found! call it withself
pointing to arcgob1.
result:
--REBOOTER--
Ordered by Elevated Recovery
Made by Charlie Boudchicha (https://www.fiverr.com/charlie_boud)
You need to complete every achievements to win the game :
- make a bad decision
- make a productive decision
- do something to rest
- unlock the 4 blue rooms
- go through 15 rooms
- survive 3 trap rooms