Hey everyone!
Today I present a few simple functions for managing tables!
strtab()
local t=strtab[[ dark=false, red=lala, 5=32, kiss={ me,before,you,go } ]] |
a whitespace agnostic function for converting strings into tables. numbers and booleans are cast into their respective types. this lets you write tables out in a human readable way, making it a powerful tool for data-driven development. note that because it removes all white space, there is currently no way to include strings with white space.
tblcpy()
local t2=tblcpy(t,{ kiss={ please=don't } }) result: { dark=false, red=lala, 5=32, kiss={ me,before,you,go,please=don't } } |
this function (optionally) deep copies any table, and can optionally take another table as a parameter to overwrite values into it. combined with strtab(), this can form a simple yet powerful entity and inheritance system, which I am using in a current project.
tass()
print(tass(t2)) |
convert a table into a whitespace-formatted string. great for debugging!
rmchr()
str=rmchr("hyuck","h") result: "yuck" |
removes a character from a given string. this is primarily a helper function for strtab().
I hope these may be useful for you! happy pico-8'ing! 💖
What future do you believe in?
ESPER//EXILE is a vertical scrolling shmup I jammed in about 2 months. It features a light narrative and a unique HEAT system where you derive your score and shot power from grazing enemy bullets!
O: Primary fire, X: Reflect bullets (hold)
If you enjoyed the game, you can follow me at @evergreengames on Bsky and Mastodon, or at itch.io!
If you'd like to support me, you can check out my Patreon 💖
Happy gaming!
Evergreen Games Pico-8 Entity Component System (EGG-ECS)
I was inspired to have another go at writing a simple ECS for pico-8.
This one takes only 270 tokens and is quite efficient and extensible.
It is a very traditional and otherwise minimal ECS that I created to have a simple and flexible interface. For example, systems are called on user demand, letting you create coupled systems in a simple way and have direct and flexible control over your code execution.
Full documentation is within the cartridge!
I hope it can be of use.
hey everyone, I was watching this video going over the basics of ECS, and I was inspired to try a lightweight pico-8 implementation of the concept. this is pretty rough and unoptimized, but I thought I'd post it here in case it's of use to anyone or happens to spark a conversation.
I implemented it slightly differently, with the "systems" and "relations" part bundled into one system I refer inside as "relations". essentially, you can easily specify pairs of entity types to call a function over. this is the part that isn't super optimized, since there's no caching going on. but the upside is the whole thing is only 242 tokens atm.
This has been my little baby over the past week or so. It started with jotting down the train game by @PROGRAM_IX from the Pico-8 zine #1, and then making it my own. I ended up using over half my tokens, two sprite banks, and the entire map space. I will leave it to you to discover its mysteries. Playing alongside a warm beverage recommended.
v1.1: Small update to effectively double the rate you gain resources.






function mchk(x, y) return mget(flr(x/8),flr(y/8)) end function move(x, y, w, h, dx, dy, col) w-=1 h-=1 if dx < 0 and mchk(x+dx, y) != col and mchk(x+dx, y+h) != col then x += dx elseif dx > 0 and mchk(x+w+dx, y) != col and mchk(x+w+dx, y+h) != col then x += dx end if dy < 0 and mchk(x, y+dy) != col and mchk(x+w, y+dy) != col then y += dy elseif dy > 0 and mchk(x, y+h+dy) != col and mchk(x+w, y+h+dy) != col then y += dy end return x, y end |
As an exercise, I wrote a small general-purpose collision script and thought I'd offer it up for folks new to P8 or relatively inexperienced with programming.
This is purposefully not a one-stop solution, but it may get you going. It is probably more in the spirit of PICO-8 to come up with specified collision routines yourself. At the very least, there's some study value here.
Things to consider:
- This was built to collide bodies <= 8 pixels wide and tall. With some thoughtful fiddling you can get it to accommodate bodies of any size, but I kept it this way for brevity.
- It takes up 226 memory.
- This is made for colliding against maps only.





