Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

Tiny Cat Adventure (Devlog) - Finished!

A topic by Arkia created Aug 01, 2019 Views: 613 Replies: 15
Viewing posts 1 to 16
Submitted (1 edit) (+2)

Well it's that time of year again. LOWREZJAM is here and I'm excited to make a super tiny game. This year I'm making a simple 2D platformer called Tiny Cat Adventure. In Tiny Cat Adventure you'll control a cute little cat head a complete a series of levels by dashing into enemies and unlocking elemental powers.

Before the jam started I watched a video about character design and the appeal of cute characters. So I decided to try my hand at creating one. Being a cat person my brain immediately wanted a make a kitten, but I'm not much of an artist and there's no way I'd be able to draw a full cat small enough to use in a 64x64 game while still being recognizable. Instead I thought it would be easier to simply draw the head of a cat and after several attempts I came up with something like this.


And I added a tail for good measure. I think the end result looks pretty decent and it's something I can draw fairly easily so it's perfect for this project.

With a character designed we need some mechanics to go with it. Originally I was thinking of making a game like Zelda but after some thought I settled on a simple platformer. I decided this character should have a dash ability and then changed that into an air dash that can damage enemies. I also thought it would be fun if you could chain air dashes over multiple enemies to reach certain areas. Finally since I'm a bit of a fan of elemental systems I started coming up with some elemental forms the character could have and abilities they'd give the player. Currently I've settled on the four classical elements with Fire giving a power boost, Water giving protection from water damage, Air allowing the player to dash through waterfalls and similar obstacles, and Earth offering a boost to defense.

As for implementing this game I'd recently been working on a retro style game engine in C. It has a graphics system consisting with tilemap layers and sprite objects capable of simple raster effects, basic input and resource management, and as of today an audio system that produces chip-tune style sounds.

So that's it for today! Hopefully I'll have something to submit by the end of the jam and I hope you look forward to playing it! Until then here's a little mockup I made of what the game might look like.


Submitted

Day 2 wasn't as productive as I had hoped, but I did get a few decent things done. Firstly I went back to the mockup and redid some of the graphics. The player is now slightly smaller, the terrain tiles have a simpler design that hopefully makes it clearer what is and isn't solid, and the status bar lost the score element in favor a few additional health...things. Don't actually have a name for those yet. After those changest I ended up with a new mockup that looks like this.


Afterwards I went back my engine and added a few more features to the sound system that I had previously overlooked. Mostly just being able to pause audio streams and, since the sound system runs on a separate thread from the rest of the program, some better ways to interact with the system atomically.

Then it was time to take the mockups and starting importing all of the graphics into the engine. My engine takes images as a set of 8x8x3bpp tiles in an interleaved format similar to that of the SNES. As such I wrote a short Python script to convert PNGs into this format. After fixing a few bugs along the way I have some tile and palettes imported and a very basic input test written up. The end result looks like this.


Now I just need to start implementing some mechanics and designing some levels, but that will have to wait for tomorrow.

Submitted

Before getting to work on some gameplay I need to clean up my current testing code. Right now it's just kinda thrown together to get things working and make sure the engine works as expected. I prefer using an ECS inspired design that I used in a previous LOWREZJAM so I grabbed some paper and started listing out some components and systems I'd probably need. Definitely not a complete list, but should be good enough to get started. I also wrote down some ideas for level themes and made a diagram for game state management.


Afterwards I took the test from yesterday and updated it to use the new system instead. Of course this also means the major changes were behind the scenes so there isn't much to actually show for this. What can be shown is a proper title screen.


And that's it for today. This should hopefully be the last things I need to do before implementing levels and gameplay so I can get started on that tomorrow.

Submitted

Today's word is: Disaster. So at the very end of yesterday my graphics card died rendering my main computer less usable than I'd prefer. The good news though is that I have a laptop I can use as a backup. The bad news is that the laptop runs Linux and my main computer runs Windows which is what my game has been developed for up til now. I'd planned on leaving ports like this until near the end of the jam, but I guess I'm doing this one now. Thus today was spent writing a port of my engine for Linux, while at the same time desperately trying to get my main computer up and running again.

Fortunately my engine has a very small layer of platform specific code so the port didn't take nearly as long as it could have. Here it is running on Linux, with a bonus cat who came by to watch.


The day isn't quite over yet though so I should still be able to get something more productive done today.

Submitted

At the end of the day here and I've made an okay amount of progress. The good news is I installed a spare graphics card into my main computer and while it still seems to have some issues I should be able to continue using for the jam. In the mean time I've also drafted up a data format for my level files and a brief list of objects to be used in those levels. I'll likely add more object types as the game is developed but these will give me some clear goals and direction on what I should be implementing.


Submitted

A usable version of the level format is done and the game can now load a screen from a simple level file. I can also start cleaning up how many data files I have laying around since the level file contains all the data a level needs including tiles, palettes, and music sequences. Levels are laid out pretty much as written in the previous log. There are fixed blocks of data for the level name, music pointers, tile data, and palettes at the start of the file followed by a variable length table with pointers to screen data and a set of coordinates for arranging the screens onto a larger grid. Music sequences and screen data then fill the rest of the file. As a result a single screen test level takes up a little over 2 KB with most of that being used for tiles.

While working on level loading I also added a fancy scene transition animation and create a small animation where the name of the level is briefly shown when it begins.


Submitted

Today my goal was to finish implementing levels. Levels need to be larger than a single screen for the game I'm designing so this means I not only need to load multiple screens from my level files, but I also need a camera that will scroll across them following the player. Loading multiple screens is simple enough for now. After loading the first screen from the screen table the program simply goes over each adjacent screen coordinate and then if a screen exists in the screen table with those coordinates it gets added to a list of screens to be loaded. Then every game update a set number of screens from the list get read into the background layers and eventually the objects placed on that screen be will spawned in.

Next up is the camera system and while I was working on that I also got to work on basic physics and collisions. The movement and collision system isn't terribly fancy. It simply decomposes movement into X-axis movement and Y-axis movement, then for each it scans along the objects movement vector to see if there is a solid tile blocking the way. If there is then the object moves up to the solid tile, otherwise it just moves across the entire movement vector. Despite being simple I still had a some trouble working it out and had to write some of it out on paper and refer to previous projects to finally get it working.


For the camera system I wanted the camera to smoothly follow the player and also not react much to small movements. So I defined some boundaries that if the player moves outside of the camera will move to be centered over the player again. Another important thing was to make sure the camera doesn't move into screens that don't exist in the level. The background that screens get loaded into is only big enough to fit 16 screens on each axis and since levels will likely be much larger than this. When the level wraps around the background it'll only overwrite screens if they exist within the level file so it's possible that sometimes screens from earlier in the level may still be hanging around. So I want to make sure that the camera won't make these visible.


And finally putting it all together. The player can now move, jump, and collide with the terrain and the camera will follow the player as they move across the level. Also at some point I added a small menu to the title screen. Still left to do is vertical camera movement and loading more screens as the player travels through the level. My next goals in no particular order are.

  • Finish player control by adding an air dash
  • Create an animation system
  • Draw animations for the player
  • Finish camera movement
  • Finish screen loading
  • Create game objects

However those will all have to wait for the next day.

Submitted (1 edit)

Only managed to get to the smaller items on the list today, but they're still just as important as everything else. First up was to finish dynamic level loading. All screens adjacent to those that the camera can currently see are constantly being added to the list of screens to load. To ensure they only get loaded once however a 16x16 grid is used to keep track of which screens have already been loaded. Once a screen gets loaded it's added to the grid and won't be loaded again unless the player has traveled far enough for another screen to overwrite it.

Next I finished camera movement so that the camera can follow the player vertically as well as horizontally. While doing this I needed to build a vertically oriented part in my test level and realized that it's quite difficult to do so with only solid tiles in such a small space. So I also added functionality for semisolid platforms which only have collision from above.

Finally I gave the player a mid-air dash as the original design calls for. Took quite a bit of tweaking to get what I was looking for but it's finally in. Here what is looks like when put all together.


My next goal will likely be an animation system and implementing some animations for the player. Player animations have already been planned out on paper as well and are pictured below. So I just need to turn them into actual sprites and then build an animation system capable of playing them.


Submitted

The animation system is done! Probably a bit more complicated than it should be but that's fine. Animations are defined using a byte-code similar to what the sound system uses for music and sound effects. However to facilitate jumping into the middle of an animation sequence each byte-code instruction has a time stamp indicating how many frames into the animation it should be executed at. Currently it can only modify an object's current sprite but it can easily be extended to modify all of an object's properties and possibly do additional things such as creating particles or spawning new objects.


And as noted on that page my next goal is probably going to be to make some actual tools for content creation. Currently I only have a small python script to convert .PNG images which works well enough, but I have some fairly complicated data formats. Putting these together by hand in a hex editor is a very time consuming and error prone process and that simply won't do if I want to actually have some decent content in time for the jam.

However one other thing I did today was package up some test builds! They aren't terribly exciting as there's nothing to actually do in them just yet, but I do need to make sure that they actually run for other people. So make sure to check them out and let me know if they have any problems.

https://arkia.itch.io/tiny-cat-adventure

Submitted

I spent the last few hours yesterday figuring out what tools I wanted and getting a general idea of what they should be capable of and what they might look like. By the end of the day I was mostly satisfied with what I had and would be ready to start implementing them the next day.


And so began the terrible slog that is trying to write GUI applications. Surprisingly it wasn't as terrible as I had anticipated this time. I ended up creating a small subset of a custom GUI library for myself that ended up being loosely based on the Immediate Mode GUI model. It still took quite a while though so at the end of the day I only have one tool actually completed. A tile and palette editor!


Not exactly the best tool ever made, but it works and it's better than my current workflow which is all that really matters. Hopefully having a small GUI framework written will make creating the rest of the toolset much quicker.

Submitted

Very slow progress. While making new tools may have gotten somewhat faster, the tools are naturally getting more complicated which cancels that out. I would like to get back to working on the actual game by the end of tomorrow though so I'm making some cuts. Instead of fully fledged editors for animations and audio sequences I've opted to write simple byte-code assembler for them. I've written these several times before and in a few hours I have Python scripts that can assemble both of them. Combine that with a full editor for putting sprites together and I only have one more editor left to build which means I should be able to meet my goal of making actual content by the end of tomorrow.


Submitted

Well it has taken much longer than I would have liked but it's finally over. I now have a level editor giving me a full set of actual tools for creating content. Which means I can finally go back to building and improving on the actual game! 


Before that however I do have to tweak some of the routines that load resources as some formats had to change slightly so that they could be loaded into editing programs. But once that's done we're back to my original goals which were to make animations for the player and start creating objects to be placed in levels. With over 5 days still left in the jam I think I should be able to at least make one polished level and then finish the rest of the game post-jam.

Submitted

So making these tools along with some private matters left me very demotivated for a while. Was starting to worry I might not be able to finish, but I managed to get myself back to work. Unfortunately the first thing I had to do was fix bugs with the tools I had made as they didn't quite export assets properly. But after tracking down and fixing these bugs and changing the engine to work with some of the tweaked formats it's all finally working. I can create things in my editors and get them into the game with far less issues than before.

Since we're nearing the end of the jam the first thing I did upon picking up this project again was to write down a list of all the things that need to be done before I can really call my entry finished. Turns out there are still many things left to do but if I can consistently work on them until the end of the jam I'm sure I can get through them all. And some of them might not be completely necessary for me to be able to submit.


Once I had a list of all the things I wanted to have done I got straight to work on the first item, player animations. Unfortunately my first attempt wasn't very good and I spent much of this time tracking down the bugs I mentioned earlier. However after refocusing and trying again I managed to make a decent walking animation for the player. Along the way I also realized that getting these animations to work in game is going to be complicated and started planning out how I'll try to implement them. However it's the end of the day so that will have to wait.


Submitted

Today has by far been the most productive day in a while. As much as making the new tools sucked it seems having them has caused the breakthrough I was hoping for. Making new content is now very quick and easy, even when I screw up and have to redo things several times in a row.

Going down the list of things to do my first order of business was to finish off animating the player. First I had to draw some more frames for the rest of the moves the player can perform. These include jumping, dashing in all 8 directions, and a small little flip at the end of a dash. After a few iterations I had something that looked like this.


These were then composed into sprites and had animation sequences written for them. After which is was time to write an actual animation controller for the player. This took the form of a simple state machine that runs at the start of each update. While getting the animations up a running I also ended up tweaking the dash a bit as it was very short which didn't let you see the animation for it at all. It's now been made somewhat slower. Now almost all of the animations for the player are finished. The only one left requires some enemies to interact with.

So the next item on the list was the make some basic enemies. First I made some new tiles based on the enemies I drew in a small sketch a while back. I then gave the floating one a small animation to make it hover up and down slightly. I wrote a small function to spawn them into the game to test out and now the game looks like this.


And with a small tweak to the editor and the screen loading function I can now place these anywhere in the level. Still some work to do however. The player and enemies need to interact with each other, and enemies should also despawn when they get scrolled far enough off screen. But it looks like those things will be dealt with tomorrow.

Submitted

Tons of progress made today! First off the player can now interact with the enemies. This includes taking damage from them and defeating them. And a new enemy type was added. Another basic one, this one moves back and forth along the ground.


Also finished today were the pause and game over screens. These include a color tint effect that can be applied to the palette. And finally a goal to be placed at the end of the level and a level clear animation sequence have been created.


Tomorrow I hope to finish off the level clear sequence with some kind of ending for the jam version, then build a full level. Then hopefully I'll be able to add some music and sound effects, and maybe some extra effects like explosions for a final bit of polish before the deadline.

Submitted

Most of today was spent doing audio. While I had a basic menu blip and a short loop to make sure the audio system was working that simply wasn't going to be good enough to release. Unfortunately I don't really know that much when it comes to making sounds and music so I had expected this to take too much time. However I managed to get the hang of things fairly quickly and was able to get some okay music and sound effects done with plenty of time to spare.


Also done today was a full, albeit short, level for the jam version of the game, and also a small ending sequence. After finishing these things and fixing a number of bugs my jam entry is finally finished! Be sure to check it out here: https://itch.io/jam/lowrezjam-2019/rate/459323