2-minute picovania
This is a short little metroidvania, with several weapons, unlockable abilities (obviously), and character upgrades, packed into a small map.
hope you enjoy it - I sure enjoyed making it!
I am still learning pico-8 and there is so much more to learn. This cart taught me a ton, and especially the value of tokens. I ended up at 8175/8192 after cutting as much as I could, and skipping functionality I wanted to add. I realize that if I want to make bigger games, I have to be more aggressive with both serializing from strings, and also loading maps/logic from strings as well. Also, pixel art and music is incredibly difficult -_-
Update: Fixed a small bug that made the boss' HP bar go down too slow (only a visual bug, boss HP was working as intended).
![](/gfx/set_like0.png)
![](/gfx/top_drop.png)
Nice metroidvania. Took me way too long to figure out that hearts were mana potions and not health. That will teach me to read the in-game instructions before playing (who am I kidding, I'll never learn than ;p )
Regarding tokens, since your style of programming is object oriented, you could learn to (ab)use _env
https://www.lexaloffle.com/bbs/?tid=49047
If the price of readability is not too high to pay for you, there's also a lot to gain by abusing how LUA treats booleans :
NIL is false, false is false, and EVERYTHING ELSE is true, including {}, 0, ""...
Consequences :
- any missing property in an object can be used as already assigned to false (beware typos)
- A function that doesn't return anything can be considered to return false since accessing the non existing return value will get you NIL.
- A function that returns an object (even {}) can be considered to return true.
Example :
function rs:draw() if abs(self.mx-player.mx) < 10 and abs(self.my-player.my) < 10 then create_object(self.id, self.fid, self.mx, self.my) return false end return true end |
Could become
function rs:draw() return not( abs(self.mx-player.mx) < 10 and abs(self.my-player.my) < 10 and create_object(self.id, self.fid, self.mx, self.my)) end |
Here I'm (ab)using the returned object as a true value.
For that function, _env would save you even more ( self. everywhere)
If after that you still want more data, look for multi-cart game examples, and if it's more code you are after, check (parens-8)
https://www.lexaloffle.com/bbs/?pid=135521
That turns your token hungry LUA into plain strings of Lisp code to be interpreted. (significant CPU tradeoff, so keep CPU heavy parts that runs every frame as LUA).
![](/gfx/set_like0.png)
![](/gfx/top_drop.png)
Thanks for the tips RealShadowCaster, _env was really interesting, I can see it making some things a lot easier. Read the post and it gave me some ideas already!
But I also see just having to be a lot more careful with tokens in general. Opt out of some object-oriented stuff, use more serialisation, and just be smarter with my code.
And thanks for playing Bloodbane! :) I bet you missed the health pot (you have to backtrack to where you found the slide, after finding the super jump)
[Please log in to post a comment]