Log In  


Cart #37216 | 2017-02-06 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
184

Here's our latest game we made as Tic Tac Toad. Please enjoy!

THE STORY SO FAR

Life has been tough on mining colony w4ge-514v3, but you are tougher. Don the helmet of Spaceman 8 and mine the labyrinthine busom of icy spacerocks for gems and haul them back to company collectors. The oxygen supply is scarce and depleting fast, so you have to keep your visits brief. Luckily, your trusty hummingbird-class jetpack is highly manouverable, and will get you to the exit quickly.

Use the hard-earned credits to upgrade your gear in the shop at the end of each day. How much can you earn in a week? Will you even survive or will greed get the best of you? Only one way to find out!

CREDITS

Code & Design by kometbomb
Graphics & Sound by iLKke

184


1

Phew so glad this is finally out :D

The struggle for tokens was real!


My best was $465.

This a really well-made game!


Thanks! It was definitely very fun to make it. PICO-8 is magic that way. :)


This is a first class game, great mechanics, wonderful graphics. It's a pleasure to the eyes to play! Can't wait for your future collaborations!


There is some really impressive programming in this game. I especially love how all the physics in the game work exactly as you expect it to. Everything "feels" right, and I'm especially impressed with how you were able to get the the mechanic of tethered objects getting snagged on things to be so realistic.

Also, the shop screen is adorable.

Thanks for adding another gem to the Pico 8 library!


This game is incredible, just got through my first week. I know to get the compass earlier on next time :) Kudos on a great game Kometbomb! Any chance we could see a version where we could play on after the week is done?


amazing! very addictive! but quite hard and unforgiving. think of the children! ;)

a few bugs:

  • painful stomping on the game over screen.
  • collision bug on sharp corners, guy and gems can get stuck there.
  • should be "rebreather & oxygen tanks" give you time to explore" and "rocket boost helps you lift heavy gems", right?

a few peeves:

  • why does dropping a gem take so long? feels way better on a single btnp().
  • I spend most of my time searching for the exit. shouldn't I spawn near it ? didn't I enter through it ? give me a limited compass from the start? btw a gps would be handy in the bigger mazes ;)
  • I often hit the exit with my freshly dead body! maybe give me one 'choking' second before I can't be saved?
    (could be a nice "YES! I made it!" moment)
  • that's too short! why stop me at the weekend ? my gear is brand new and I'm having fun!

that's easily one of the best games on pico8, and something I would gladly pay for. but easy/normal/hard modes would be welcome.


Echoing all the comments suggesting an 'endless' mode. Also all of @ultrabrite's sentiments - this is definitely one of the best games ever released for Pico-8, but there are a few small things that could improved, seemingly pretty easily(?) Keep up the great work!


Thank you for the comments, everyone!

Endless mode sounds like a good idea, I hope we can find some tokens to add even that simple a feature! There is certainly capacity in the maze generator for many more levels, though they will of course start to repeat itself a bit. Definitely something we will think about.

About the bugs: the "stomping" i.e. the guy bouncing over and over is there because I simply ran out of tokens to add a check that stops the action behind the game over screen even though the screen freezes! The skull helmet thing was a quite late addition so needed to cut some corners.

The collision is a bit buggy - it needs an extra pass that somehow pushes the objects outwards. Now it just puts them back to the previous spot that was no colliding with anything and adds some bounce. Again, probably need to cut something to make it fit!

The difference between the tank and the rebreather is that oxygen tank gives you more O2 so you have more time overall... but the rebreather only gives you more time to explore, the O2 will run out as fast as before when you are actually carrying a gem. Thus the tank helps you to carry stuff just like the boost, and the rebreather doesn't. :) But yeah, it's a bit misleading (and can't explain it away with tokens...).

Dropping a gem takes a while because you can tap the same button to switch compass modes. Maybe the delay could be shorter or it could be switched to the other button.

Hitting exit with the dead body... that might be fun and there actually is a check that checks if you are dead and stops you completing the level in case you just manage to almost exit. So, removing that check might give me more tokens to add something else (endless mode!!)

Thanks for the insights, we at the TTT HQ are quite happy that people like the game. :)


Hello! Wonderful and funny game!
I'm learning how to use this awesome pico-8 for making my games and I'm looking inside the heart of the games and there are some things that crashes my mind.
The first one is the incredible title game. In the code I looked in to know how did you do without that sprites and saw a function call "decode". Is something for art made in .c extension or something like this?
second is... I see in some games, on the map editor you draw random tiles on places where don't look logic but works as well. How do you do that?


1.) Thanks. :)

2.) The title screen (and the shop and all other large graphics) are done with iLKke's Pillbox (I think it's not out yet). This means the gfx are just a series of instructions like "draw a rectangle at x,y" and this can be compressed very efficiently. The decode() function takes such compressed data and then outputs a table that has coordinates and widths and heights for the image elements ("pillboxes"). This list can then be drawn on screen reasonably fast. It is very easy to scale the coordinates as well, they don't get blocky like scaled sprites will. It is not as fast as using map() or spr(), though. Ask iLKke about the tool if you're interested. :)

Also, I would like to underline that everything nice you see in the game is by iLKke.

3.) All of the map data is generated on the fly. I have a relatively simple routine that creates mazes and then upscales them while adding some random variations. The data is then converted to a PICO-8 map, trying to find the correct tiles for corners and so on. Each level in the game has its own parameters for this level generator that basically tell how large the maze should be, how many gems there are etc. Basically, what you see in the map editor is actually some random stuff left in there and also the shared data from the sprite banks 2 and 3.


OMG.
Thank you for your quick and clarify response. Then if I reset card the map will change, do it?
I will study a bit more of this engine.
Regards!


Every map will be different every time. :) In fact, check out this gif (sorry I can only find it in an old tweet of mine):

https://twitter.com/kometbomb/status/736097064891748354


Nice!
And the thing I'm trying to say is more like "Celeste" cartridge.
If you look into the sprite/map editor, you will see some random and colour sprites that Idk what are them since sprite 128


This is bloody glorious. Great work.


Nice work (as usual)! Got to $1245 instead of working on my own game :)

The oxygen mechanic is kind of strange - as I understand after playing a while, you use different amounts of oxygen depending on whether you're carrying a gem or not. Rebreathers only help when you're not, oxygen tanks, when you do?

It feels like this could be simplified to one more straightforward oxygen item - maybe to save some tokens for other stuff? :)


This is scarily addictive. Super impressive job.


had a look at the code and ended up reclaiming tokens,
mostly in the pillarbox decode (awesome stuff btw):

(135 tokens gained)

function pillbox(x,y,w,h,c,re)
 color(c)
 -- fix negative size
 --if (h<0) y,h=y+h,-h --not happening here?
 --if (w<0) x,w=x+w,-w
	local x2,y2=x+w,y+h
	local r
	--// rounded --or else
	if re!=0 then
		if h<w then
			r=h/2
			rectfill(x+r,y,x2-r,y2)
		else
			r=w/2
			rectfill(x,y+r,x2,y2-r)
		end
		circfill(x+r,y+r,r)
		circfill(x2-r,y2-r,r)
	else
		rectfill(x,y,x2,y2)
	end
end

enc_chars="abcdefghijklmnopqrstuvwxyz0123456789-_.,!@#$%&/()=+?'*:;<>{}[]^~"
function num(s,i)
 local c=sub(s,i,i)
	for i=1,#enc_chars do
		if sub(enc_chars,i,i)==c then
			return i-1
		end
	end
end

function decode(s)
	local o = {}
	for i=1,#s,7 do
		local e=num(s,i+4)
		local f=num(s,i+5)
		local g=num(s,i+6)
		local x=num(s,i)*2+e%2
		local y=num(s,i+1)*2+band(e/2,1)
--local y=num(s,i+1)*2+e/2%2--wrong mantissa
		if (g%2>0) x=-x
		if (g%4>1) y=-y
		add(o,{x,y,
		num(s,i+2)*2+band(e/4,1),
		num(s,i+3)*2+band(e/8,1),
		f/2%15,--(color->mantissa ignored)
		f%2 })
	end
	return o
end

function drawpb(p,z)
	for e in all(p) do
		pillbox((e[1]-64)*z+64,(e[2]-64)*z+64,e[3]*z,e[4]*z,e[5],e[6])
	end
end


Given the crew behind this, it's not surprising how polished this is...but nonetheless, top of the pops to both of you. A showcase game for Pico-8 for sure!

Really makes me wish I had a true pixel artist to work with...

After playing only for a second did I have flashbacks to the pain and frustration Solar Jetman gave me as a kid...but now, that's not so bad :)

I'm not very good at this yet but it's mostly because the controls keep tripping me up...my brain wants the D-pad to control the direction the jetpack fires, not the direction I want the dude to go. I just gotten untrain my brain.

And it's solid on the PocketCHIP too, so this will be one I can play on break at work too.

Bravo, gents, bravo!


Thanks for all the kind words, peeps <3

@ultrabrite cheers for the optimization! I will include the decoder with Pillbox when I get it ready for release, hopefully soon

@morningtoast maybe you should just ask people to collab, you'd be surprised :)


@kometbomb when I was working on my entry for Collab16 2, I learned a TON of very valuable little tips for shaving tokens off, provided by all the people here and in the Discord. Many of them don't require refactoring the code much.

For example, you can do stuff like: dget"0" for 2 tokens, instead of dget(0) which is 3. The same works for any internal function that takes a single argument (btn, btnp, sfx, etc.)

You can see some other optimizations in my entry here, such as how I initialize variables: https://github.com/josefnpat/pico8collab16/blob/master/collab_2/lua/09.lua

I've thought about writing a tool that optimizes code automatically with these little tweaks. I'm not sure though if it would be something people would be interested in except those who make games large enough where they struggle with the token limit.


@ultrabrite: Thanks, this will be more than enough for that endless mode and other fixes! Hats off.

@Scathe: Is that dget"0" thing just clever parser abuse or is there a case where it makes sense in Lua? Useful tips, thanks!


I'm pretty sure it's just parser abuse and doesn't work at all in "real" Lua. More or less a bug that'll likely never get fixed because fixing it would break a lot of legacy games.


This is an amazing game. To me it feels a lot like solar jetman, which is one of my favorite games ever.

If you don't mind, I'd like to ask you a question.

I've been looking at the code and I'm puzzled because I don't understand how you got collisions with non-squared tiles since you don't seem to be doing anything special besides the usual mget() fset().

However, somehow it handles collisions with "triangular" tiles.

How do you do it?


@UnsignedFoo: Sorry forgot to answer but I think you are seeing the shared data (sprite banks 2 and 3 overlap with the lower half of the map - try drawing in the last sprites and see what happens in the map!).

@makz: Collisions are still "blocky", I don't check for tile shapes. The collision is checked against a single point in the sprite so it's not that evident that the empty tile pixels also collide with the sprites (they overlap). The tiles have a "normal vector", that is the tiles have the sprite flags set so that you always know which way is outwards from the tile (the flags form a 3-bit direction) so e.g. the collision with diagonal tiles works like how you would expect it to work. Maybe that also adds to the illusion? (BTW, it doesn't do reflection vector calculation but it works fine enough)


This is really wonderful!


Added that endless mode. I.e. the game continues after weekend, until you die - just like in real life. Also fixed some collision issues, hopefully.


hum. the game still stops at weekend, the gems still stick on corners, the compass looks like an older version. did you post the right cart?


Oops! It should be the latest version now.


My best was 1190$

Good Game!


Thanks! That's a fine score. I think my best is in the $1300 range or something like that.


Thanks for replying!

but the game still stops at the end of the week, is that normal?


Great game, only made $515 for now. I don't know if anybody already said this, game threw some runtime error at the end:

x-=#str*2
line 224: attempt to get length of local 'str' (a nil value)
in text line 224
in ? line 1317
in _draw line 1802


OK I guess I still managed to upload the wrong file! It should continue indefinitely.


It didn't update if you updated it today. The version listed here is from January 29th.


I think I overwrote the fixes with an earlier file at some point and then uploaded it. I just tested and I got to the next week (no errors either). The 1.2 version I just put up should finally be that version 1.1 claimed to be!


Pico-8 games are definitely getting more complex and genuinely good games on their own. This one is a new favorite for me :D


Not sure if it has been mentioned, but the compass didn't reset to show the exit after dropping a gem.


You can use the other button to switch compass modes, perhaps it's not that well explained. Makes sense that it should change the mode when dropping a gem though.


I love this game! It makes me think of Lander (the 3D one on Windows 95) crossed with Air Fortress (on the NES).

I love how you did the full screen artwork with the circle tool etc. to save on cart memory :) Very clever!


Thank you. :)

The pillbox pics by ilkke are amazing! We even considered using the tech for sprites, it should be about fast enough for a few zoomable "hires" sprites.


week 1 finish = $1345


See that? I couldnt move at ALL jajaja


a fun title that reminds me of sega's sub-terrania! the physics and pull of the gems feel spot on. so satisfying to get a big gold gem into a 3x deposit slot!

i was able to get through to the middle of week 3 or so when this error hit, ending my run:

runtime error line 869 tab 0
obj.x += obj.dx
attempt to perform arithmetic on field 'dx' (a nil value)
in moveobj line 869 (tab 0)
in updategame line 1491 (tab 0)
in _update line 1344 (tab 0)
at line 0 (tab 0)

still, i enjoyed what i played and am grateful for the fun while it lasted. thank you for the joy!


Oof sorry for that


1

Been addicted to this game. I've hit the same error as @anydayhappyday a few times. It happens if you pick up any gold gem in week 3. All the other gems work fine, so for folks trying to go forever, just ignore your instincts week 3 and avoid the gold gems.

Thanks for the awesome work!


After years of not understanding how to play this game I picked it up again and actually won and enjoyed it!
Fun game.



[Please log in to post a comment]