Thwimbly - Kepler's Platformer Dev Thread

KeplerElectronics

Well-known member
Joined
Sep 18, 2023
Messages
123
Reaction score
463
Location
the north™
Website
keplerelectronics.com
Gold
2,460
Blurb Style Contest - Participant
serverBACKUP - Style 3
Starfall
Lounge Access
Grunglr Name
ThwimblyCover.webp



Howdy everyone!

I've seen some gamedev threads here on the forum and really enjoyed reading through them as a hobbyist game dev myself. I've been toying with making one myself, and figured that, now that the demo is out, I should just go for it.

Thwimbly has been in development off and on since summer 2021 based on what's been going on with school and stuff. It's made in TIC-80, a fantasy console (similar to PICO-8), which aims to limit the developer on various metrics (number of colors on screen, number of sprites, music, map size), and I've been using every trick in the book to break past those limitations. I've really been trying to design the game so it doesn't feel like a tech demo or normal fantasy console game.

JUICE-export.webp

The game itself is a pretty standard 2D platformer, but I've tried to optimize it for the kind of game I like to play: Fast paced, colorful, and fluid. I've had a lot of fun trying to optimize routes through each level to beat them as fast as possible. It's particularly inspired by Kaizo Mario World and Celeste, but with a simpler moveset on the player side.

Hopefully it lives up to that goal, but a lot of the reason for the demo release is to try and get an idea of what might need to be changed for a full release. This is only about 1/7th of the content in the full game, but I think it's enough to get the vibe across.

If you want to give it a try for yourself, you can play it in the browser, either at my website: https://keplerelectronics.com/Wiki/Thwimbly

or at Itch.io: https://kepler-softworks.itch.io/thwimbly

If you want to see some of what my development process has looked like, I have a bit of a devlog on my site as well (I need to update it soon -_-): https://keplerelectronics.com/Wiki/Thwimbly_Dev

Please let me know what you think, or if you run into any bugs! I'm open to constructive feedback, I want to make sure that all the time I've poured into this game is worth it.
 
i got a similar slow down after dying a few times. the same thing corrected it, but it was still a little strange to have happened
 
Just made a new version after doing some tests, but I think the web export is just having some problems. Even before starting gameplay it was just super sluggish. It runs fine when downloaded, but when attempting to run it in firefox on my laptop it's just super slow, even with the new low spec option I added. If you're on desktop it seems to run perfectly fine, probably just a significant performance penalty that my desktop has enough power to handle.

There are new downloadable versions that can be accessed through itch (https://kepler-softworks.itch.io/thwimbly) that seem to run significantly better on lower spec hardware, but I can only test on one laptop right now. It's running with a super stable framerate on my 2015 macbook pro (running KDE Neon linux) so it should be able to be played on pretty much anything from the last decade when downloaded, but I'm willing to be proven wrong.

I have a hunch that the slowdown @kevin supermarket was experiencing was from the particles building up upon dying to the munchers, so the new version reduces the life of those particles so they don't stick around as long.

This brings the official version number to 0.1.1, full changelog can be seen at https://keplerelectronics.com/Wiki/Thwimbly_Changelog.html

Please let me know if you have any more feedback :)
 
I've been doing a lot of thinking about Thwimbly over the last couple days, and have come to the realization that I definitely need to pivot in some direction.

The game is closing in on being "feature complete" in the sense that most of the underlying mechanics are done, it's just pixelart, level design, and music that need to be completed. Realistically, I can probably get the rest of the game done in 100-200 hours of solid work, but with working full-time and trying to balance my other creative outlets and responsibilities, that could still be a year off.

This game is closing in on being in development for four years (sometime in June 2021 was when I started working on it). While I haven't been working consistently on it over that whole time, it's really been a part of me. it feels wrong to put it out in a subpar state after how much of my time and energy I've spent on it.

That brings me to the current problems, most of which are caused by the engine. It's a fantasy console, so it's trying to lock you into a set of limitations that mimic retro consoles (16 colors, limited code size, 256 tiles, 256 sprites, limited map memory, etc). This can be good, and helped a lot in the early days: having code/sprite/map editors built in was excellent for prototyping. The problem now is that the game can't be all that I want it to be because of the limitations.

Problem 1:
The audio engine in TIC-80 is too limiting. I'm limited to four channels, each monophonic. It's slightly less limiting than the original gameboy, as each channel can be any waveform including noise, but you're still effectively limited to gameboy sound. While there are a lot of phenomenal albums and tracks made on the gameboy (Spectra by Chipzel is an incredible achievement), those don't have to contend with sound effects.

If you've played the demo and picked up a bunch of coins in quick succession, you might have noticed that it sounded glitchy, that's because the sfx for coin collection is overwriting the sound on channel 3. I tried to mask it by making channel 3 the drum channel, but I think it's still noticeable.

Besides just chopping the music down to three channels and leaving one for SFX, I can't see an easy path forwards living within the engine. Music is one of my favorite parts of games, and I would like Thwimbly to have some bangers without getting overwritten by the .


Problem 2:
The map limitations are pretty rough. I'm currently limited to 28 levels of exactly the same length as those in the demo. I can make them shorter, but they can't be any longer because that's where the map size ends. I actually don't think that the levels are too short, I like how long they are, but it would be nice to have more of them. I really wanted to have a sort of "Master Quest" "Kaizo" mode that was super ultra difficult after the main game was complete, but I just won't have room for that without making a fully new executable or trying to encode level data in text and pull it in at runtime.

I'd like the game to be longer than 1.5 hours, but even if I make the levels pretty difficult, I don't think it'll take an average player much longer than that for a first playthrough.


Problem 3:
TIC-80 does not support Steamworks. I would like achievements for one, as I really enjoy hunting for them. This basically requires modifying the engine to overcome.

Big Solution 1:
Port the game to Löve2D. TIC-80 is Lua based, Löve2D is as well. Graphics calls and map data would be more complex, as primitives like lines, circles, triangles etc would need to be recreated, but this would effectively solve all of my problems in one swoop.

Löve2D also already has a library to integrate Steamworks, and is running LuaJIT, which is a much faster version of Lua that would help me squeeze more performance out of the current code without rewriting much of anything.

I won't be able to have a web app anymore, but the current web app is way too resource intensive anyways.

Big Solution 2:
Fork TIC-80 and compile a custom version that breaks some of the restrictions. If it's simple to just add on a couple more channels that I can route SFX to, even if I can't use or edit them for music, that would be great. Similarly, if I can't already just paste extra banks of sprites/maps at the end of the .lua file, breaking that restriction so I can would be great. Even if I can't edit those sprites in the engine, being able to copy them from a different project would be fine. Steamworks will have to manually be grafted on later.

Big Solution 3:
Just deal with it and stay true to the fantasy console limitations. I'm confident in saying that Thwimbly is one of the frontrunners in terms of high-effort games made with TIC-80. Emuurom is the other high effort game I'm aware of, and it would be cool to push the engine to the limits. Emuurom does have a Steam page, but does not take advantage of Steamworks or any of that stuff.

If I take this road, I'll have to trim back my musical compositions to allow an extra channel for the SFX, which could leave things feeling a bit empty (even fewer chords than I can do with 4 channels). I'll also have to lock in to 28 levels and just accept that.


The Road Ahead:
If any of y'all have any input, I'd love to hear it. Solutions 1 and 2 are probably going to require me commissioning or hiring someone to help with that process, so if you or anyone you know is interested in helping or can maybe even just give me an estimate of how long / expensive that might be, I'm all ears.

I'm reaching the desperation stage of this project. I need it to be done so I can clear out all of the brain RAM it's taking up. But I also don't want to release something I'm not proud of. The current web export performance problems and general audio problems are not something I'm proud of.

I also really should refactor my collision code, but the engine decision should really be made first.
 
Currently too lazy to rewrite the engine or port the game to anything else, so I'll just go ahead with the original plan of sticking to the limitations. I might just distribute level packs as separate executables? anyways, scope creep can wait for another time.

I haven't been doing much lately on Thwimbly because my day job has become mostly programming and it's been really busy (like 60h a week busy, things are looking to slow down again and I am hype) but I suddenly got the motivation to break it open again tonight and wanted to share some screenshots!

1744673909851.webp

1744673692902.webp

World 2 is a spooky mansion/forest zone, with a number of gimmicks inspired by Super Mario World (including 1F0-type tiles that the player falls through but NPCs do not), and some less mario-y gimmicks that I won't spoil :)

Music has been in this world since summer 2023 or so. Very Henry Homesweet inspired. Definitely needs some more work, but it's one of my favorites of whats in the game right now.

I'm so heckin close to finishing this game, it's just level design and sprite design and music and overworld design remaining... at least the programming is pretty close to being done unless I actually rip out all the collision code and start over. I'm really hoping that sharing some of what's coming incentivizes me to put more time into it over the coming months. I'd really like to get this out before the year is done.
 
doin some work on the platformer again

The main bottleneck is just inspiration with worlds 4-7 in terms of level design. I have gimmicks/mechanics implemented but need to figure out how to combine them into cohesive/fun levels that aren't brutally hard. My tendency is towards Meatboy/Celeste/I wanna be the guy levels of difficulty, and I'm trying to hold off on that for the moment. I'm thinking of Kaizo-hacking my own game once this is done, maybe with a new world theme... I've been thinking of some sort of cherry blossom/Torii gate/Edo period Japan themed level that I don't have room for in the base game.

...I've also been thinking of scope creep. (-_-)

Pushed a new update to itch today, getting rid of the web exports since the webassembly conversion takes way too much of a toll on performance. It runs fine in the browser on my desktop (ie. Ryzen 5 Titan XP beast), but it's basically unplayable on anything else. Local versions run fine though.

Download at https://kepler-softworks.itch.io/thwimbly if you dare :3

the new version features minor changes, such as a death sound effect and fixing a potential frustrating level design quirk in 1-2. I also got rid of the settings screen from 0.1.1

Wanted to share a look at what the tileset looks like for world 1. There's a fair amount of empty space (more than immediately obvious because most of the bright orange bushes aren't used anywhere anymore). If anyone has any ideas for things I could add to the tileset for this world using just the colors available in the bottom left, let me know :)

1748545289389.webp

Also, here's what the world map looks like for W2. It could definitely use something, but I'm not sure what yet. more, different plants? pillars? better blending between the left and right halves of the screen?

Finishing the map and making it look decent is going to be a brawl with the tileset, since all seven worlds need to use the same graphics. I'm using palette swaps to switch between them as the player free-roams the map to match the graphics and palette seen in each world, but this part of the game definitely needs more polish.

1748545441708.webp
 
I've done more work on Thwimbly in the past three days than I've done in the past six months I think. it's not what I was supposed to be doing, but it is what I did (I have so much laundry and cleaning to do :embarrassed:)

Some of that work will come out in the next update to the demo, but a lot of it is level design for the later worlds (hecking finally I have ideas for this thing). And what I've come to realize is just how much of a house of cards this game is code-wise.

Some of that is to be expected, with the game's first mechanics being programmed by me FOUR YEARS AGO in summer 2021. My only other major gamedev projects when I started this experiment were my Space Invaders clone Gravitaz (link to play in browser), and a twin-stick shooter I really want to get back to sometime. Neither of those games come even close to Thwimbly in terms of complexity. Gravitaz topped out at 1500 lines of code (though if I was programming it elegantly it should probably be closer to 1000). Thwimbly is currently at 6002 lines, plus some 1300 sprites (incl. dupes)? it's got to be close to a thousand hours into this thing at this point? 347 commits tracked in Github since I uploaded it in spring 2022.

Part of the problem with the house of cards is inheriting 19-year old me's garbage code practices. Thankfully I started the game with object-oriented principles so various entity types share a common data type (compared to Gravitaz where each projectile type is a completely separate code structure, adding to the bloat).

Thwimbly was also never supposed to hecking get this big, it was supposed to be a small project while I waited for the Picotron framework to come out. Between having too many ideas and Picotron not getting released till last spring, I had plenty of time to scope creep myself slowly enough that I wouldn't notice until it was too late. At this point I've basically capped out the amount of space in TIC-80, so thankfully there's a hard limit on how far I can scope creep, and the end is in sight.

Anyways, there is truly some garbage in the codebase. like the entity draw calls specifically avoiding certain entity types (all hard coded because of course they hecking are) because I need to draw them in a different way later. What I should have done was use some sort of layer system or flag to draw this entity type differently later, but at this point I'd rather not change it since it technically works.

1748916999723.webp

also I've done 99% of the code in this low-res pixel editor because it's just way too easy to just Ctrl+R to run the game and test, then Esc to change a val and then repeat. It's super fast to iterate and honestly probably half the reason I've kept going as long as I have.

The thing that made me realize how "house of cards" this codebase is was attempting to make these jumping plant guys work with conveyor belts. here's a funny gif of me not realizing what the jump trajectory would look like.

conveyor problem-export.gif
please ignore the blurriness, I scaled this gif down because it was too large to upload otherwise.

Anyways, I don't have flags for groups and each entity is basically just running a script for just that entity type (i.e. no children anywhere ever, partly because this game was never supposed to get this big and partly because Lua does not support object oriented coding, you have to hack it in yourself). Because of this, using the conveyor to move all entities would move ALL entities. Only about half of the entities behave as expected when applying velocity. There's a lot of really messed up code in there for platforms, portals, static bouncepads, etc because I didn't realize how easy it would have been to organize things better.

What I ended up doing to make the conveyors work is to basically hardcode them to only work with these jumping plant guys. There's just not enough consistency in how entities behave when being given an x velocity to trust it to not implode.

I was originally planning on doing some sort of level design competition when the game came out, daring people to hack it and do all sorts of weird stuff with it, but there's just so many things like this where it only works in very specific contexts. this game was not meant to have minecraft-core inter-entity interactivity initially (try saying that five times fast). It's slowly moved that way over time, and me trying to stretch 19-year old me's code is causing me to cringe so hard because there are so many ways I could have made this more flexible and prevented so many headaches. It's like I was afraid of functions or something.

and like, I totally should cringe at my code from 4 years ago, it's proof that I'm learning and growing.

heck man, since I started this project I graduated with a mechanical engineering degree, took classes where I had to write computational fluid dynamics algorithms to solve partial differential equations. I'm so hecking excited to start on a new project with a blank slate where I can put what I've learned to the test.

that's part of the reason I don't want to go back through and fix all of these things, just try and finish this darn project so I can move on rather than scope creep and take another year to refactor the entire codebase. if it doesn't impact the player experience then it isn't worth fixing. (I really should refactor the player collision code though)

in other cringe, here's a comparison between the original art for level one and where it is now:

1748917921296.webp

1748917968284.webp

anyways, go make something bad and learn from it so you can do it better next time. I can't hecking wait
 
Suddenly hit a wall with level design and stalled out with about 7 levels left to make. There are graphical changes I need to make as well (the world map is so ugly everywhere but world 1), but I decided to turn my attention towards music today (drawing is hard).

All music is now made using three channels instead of the maximum of four, which means that I can only have a maximum of three things playing at once (melody, bass, drum, or melody, melody, bass, etc). This lets me allocate channel 4 to just SFX so it hopefully improves the auditory experience when collecting coins. It will force some tracks to be a bit more minimalist, W1's music sounds emptier now :( but I think that's a worthwhile concession to make. As much as I love TIC80, I do definitely feel like the audio system is underpowered relative to the other restrictions.

Anyways, I worked on a handful of tracks today, including reducing repetition on W7 and starting a sketch for W3, but W4 is where I think I'm the happiest.


W4 is a cowboy world, and level 4 is called Slingshot! after the Good Kid song (also because the main mechanic is a slingshot), and I figured that since I couldn't come up with anything western for the OST I'd try something reminiscent of Slingshot!

The beginning based around dual eighth note melodies that harmonize, very similar to the intro of Slingshot!, but veers off for the second half. I need to build a third section or something to add more variation, but this is a good start. I caught myself looping it while browsing the internet, so that's a good sign it isn't too repetitive? Not sure, I'm always paranoid about stuff being too stale.

Desperately trying to hold on to the motivation to work on this thing despite it all. After the total inspiration-fest that was last weekend, I appear to have mostly run out of easy dopamine farming tasks.

At some point I need to put together a real marketing plan for this thing, bite the bullet and sign up for a steam dev acct, make a trailer, and maybe try and get it into some sort of indie showcase. Not sure how much longer it'll take to do the last dev work, don't want to start promoting it too early. Argh I should probably get back on Bsky and posting about it.

Remaining major goals (no major order):
  • Finish basic level design so I can start sending the full game to testers
    • 7 levels
    • Incorporate collectible wrenches into a bunch of "complete" levels (15 or so levels)
  • Finish level graphics
    • W7 overhaul
    • W6 needs more variation and character
    • Misc BGs and polish
  • Finish mechanics
    • W5 needs one more mechanic, or to polish up an unused one
  • Finish music
    • W3 needs to be fleshed out
    • Start W5 music
    • World Map music
    • Title screen music
    • Polish/extend everything else
  • Finish world map
    • Graphics
      • W6 graphics are extremely unfinished
      • W7 graphics haven't been started
      • W3 graphics are extremely rough
      • W5/W2 graphics are kind of decent
    • Lock player out of next world if current has not been completed
      • Physical lockout and graphical blockade
  • Misc JUICE
    • Moar SFX
    • Jingle for level transition
    • Polish level transition animation
    • Title screen animation
    • Procedural tile animations
    • Background elements
  • Some sort of ending
    • How to make game satisfying to complete?
      • Credits?
      • Cutscene?
  • Improve collision code
    • Not sure if I want a complete rewrite or just some more checks to prevent/save player from clipping into walls if moving too fast.
      • I don't want a hard speed cap but also don't want people getting backrooms'ed lmao
        • or just kill the player if they get trapped in a wall
  • Marketing
    • Add screenshots to itch page
    • Trailer
    • Talk to someone about indie showcases
 
Back
Top