🤑 Indie game store🙌 Free games😂 Fun games😨 Horror games
👷 Game development🎨 Assets📚 Comics
🎉 Sales🎁 Bundles

MTDF - QaziJam 9.5 Dev Log

A topic by Fishagon LLC created 11 days ago Views: 85 Replies: 2
Viewing posts 1 to 3
(Edited 10 times) (+1)

Jam: https://itch.io/jam/qazijam9point5
Game: https://fishagon.itch.io/my-tutorial-dungeon-fodder-jam-edition

Hey! My name is Sky and I'm currently participating in QaziJam 9.5. In the last QaziJam I made a very ambitious game titled Card Battle that had a scope WAY too large for a game jam, however it ended up quite nice in my own opinion and got tons of positive feedback during the jam (some people even bug me still about if I'm still working on it, ps I'm not, sorry).

Once again the jam is going to be a week long so I've begun development on another overly ambitious concept for this one! This time around I'm making a combination of Tamagatchi, Pokemon, and a fantasy RPG. This has been a game design I've wanted to make for about a year now and finally I have the free time to do so (my studio's primary project is currently in the hands of contractors).

  • Day 1 - Monday the 17th

I actually forgot that QaziJam 9.5 was on the 17th haha... And I hadn't yet decided if I was going to participate. Bit past mid-day and almost "night" I decided that I would do MTDF for the jam. I'm currently keeping the actual game under-wraps as to not spoil it for Qazi and others, but if you follow along the devlog, I guess you'll find out haha. I spent the rest of the night posting ads to find an art partner to work with.

  • Day 2 - Tuesday the 18th

Upon waking up and checking reddit, emails, discord, etc... I had received a message from a wonderfully skilled artist named Mila Pokorny. She specializes in 2D artwork and has experience in UI design as well. Which is even more perfect as it means the game won't have to suffer horrible grey blocks for UI.

After spending a bit of time talking with her about all the features of the game and the theme (showed her the Game Design Document I'll share once the jam is over), I begun working on the actual programming of the game.

As with each jam I take this as a chance to check out the newest versions of Unity. So I downloaded Unity 5.6, installed it, opened up the Asset Store and grabbed my normal 'every project' assets such as DOTween Pro, Rewired, and Pro Camera 2D. (I highly recommend Pro Camera 2D for any 2D game, I picked it up just before GGJ 2017 and used it with my group than to make Bathoven's awesome camera.)

My first task was to create 2d top down movement that felt similar to the original Pokemon games or even the first few Zelda games. I knew I wanted it to be only four directional, but still not feel like it's snapping to a grid. Feeling fluid was crucial. The first challenge I encounter with that is that using Vector3.up, Vector3.left would mean the player would ignore walls.

The key to finishing a hugely ambitious jam game is to immediately find solutions if possible (good artists create, great artists steal), so I googled it. I found only ONE solution to the problem and guess what? It didn't even work. However, it was a good basis that I could work with. I broke down their very complicated code and came out with a rather small weight solution to faking collision with walls and other objects. Check out this gif of how it turned out!

The movement system took a majority of my day with figuring out how to work the collision (not to mention seven a few matches of csgo). Next I knew that I needed a dialogue system in the game that would double as the tutorial system. During Global Game Jam 2017, I made a dialogue system for Bathoven that was never actually used. So I pulled up my git and copied over the system I had prevously developed. Turns out that dialogue system wasn't very generic and required quite a bit of changes to get working in a more generic manner. I trigger the ability to speak with NPCs using a 2D Polygon Collider making a semi-cross around the NPC acting as a trigger. See how it looks below! I do know however that I'll need to return to this system later in the jam to make it work for tutorials, dialogue options, and having it launch menus such as shops.

And lastly for the first day I wanted to get in the transition scene from the "overworld" to battle scene. MTDF is very similar in that combat works the same way as Pokemon. So in the game you'd walk into an opponent and it would launch a battle. To get there it would do a transition blending from one scene to another. In order to keep my location and the overworld from not needing to waste time saving and loading between Unity Scenes, I just made the battle scene a Canvas.

I came across a cool example of Pokemon transitions on a Youtube channel called " Makin' Stuff Look Good" and it even included the project files for the shader! So I downloaded that and used it as the basis of my transition system. I had to create a manger to handle it, which wasn't too hard but certainly not something I had done before. Thankfully DOTween made it a pretty trivial task. Check out how cool it is below! I hope to add a few more transitions to the system before the end of the jam, but currently there are 9 randomized between each change.

  • Day 3 - Wednesday the 19th

My goals today were to start the pet and battle systems. And to be honest, I'm not happy with how far I got. I woke up today at mid-day as normal and noticed the artist hasn't sent the initial sketches over yet. Which didn't worry me much, she said "tomorrow" and there was still plenty of time left in the day. However, I'm writing this now and have yet to hear from her. This kinda thing happens in game jams. Heck, I don't blame her, something important probably came up in her life that she has to deal with. There's still plenty of days if she gets the chance.

In the case she doesn't return, I went and bought some RPG Maker tile sets and decided they would be sufficient for the jam. They don't look as good as I would like, but they are workable.

My first programming task was to figure out how to setup the pet system. I spent a lot of time looking up examples of how Pokemon clones have done it in Unity, but all of those were way too bloated and even the best examples were overly dated and spaghetti code tot he point I couldn't understand them easily. I decided I would go for a hacky, but workable solution of using Enums and hard coded pet progression. The next hurdle was making movesets and how I would keep track of them all.

For that I went back to my Card Battle github and copied over the Card system. It's an XML based card database that loads during runtime and has plenty of ease-of-access functions already coded. I'm quite proud of this system. I spent about an hour or so refactoring it to work as a moveset database and creating some additional specific functions that'll be useful for the battle handler.

Next I went to setting up multiple handlers that would be placed on my creatures, so that each section of it would be in their own scripts and easy to find. So far that includes a MovesetHandler and LevelHandler. I already kinda described the MovesetHandler above, it just checks moveset ids to the moveset database and refers it back to the game. The LevelHandler checks the creature's current level, tells the game how much experience is needed for the next level and also tells the exp earned from defeating this creature. That second bit of information isn't useful for the player pet, but will be for enemy creatures.

Lastly for programming I setup a basic Battle System that currently only contains the ability to display information about the player. It isn't nearly finished and will be my goal for tomorrow.

It was getting pretty late so I spent the last hour or so of my day making the tavern look "okay" with the RPG Maker tilesets. You can see all of what I said above just below!

  • Day 4 - Thursday the 20th

Man this day was long... So my goal for today was to work on finishing the Battle System... however aside from adding a background to it, I actually didn't work on it at all today. Instead I was distracted with other systems that for some reason in my mind took priority.

First was the game's intro. When I ported over my dialogue system from Bathoven and adjusted it to work with this game it was still nothing more than a very simple and rough dialogue system. Originally I wanted to rewrite some of it to allow dialogue options for the player, however this would be quite time consuming and I'm already worried if I'll finish the concept in time for entering the jam. (Plus I plan to buy Dialogue System in the "Biggest Sale Ever" lol.)

So I wrote a "CutsceneHandler". Normally my DialogueManager gets called by a "DialogueEntity" component on NPCs (which only allows an NPC to have 1 set of dialogue sadly), however on my CutsceneHandler object I made child objects that were separately each a DialogueEntity, that way I would be able to trigger dialogue without the player having to start it. As well I linked the CutsceneHandler to my player's movement and made it so controls could be locked from the player. Then with IEnumerators I could script out entire cutscenes and trigger the dialogues. Which by the way, I'm pretty happy with.

As you could see in the gif, I also integrated a very simple main menu to go with it! If you start a new game you walk into the tavern and approach the "Barkeep" looking for work, but if you just click Continue than the game simply walks you into the tavern. The next task was making Continue and New Game have actual meaning though.

So I set out on one of my least favorite things to do. Write a Saving system. This was something I did extensively in Card Battle so setting up a pretty nice XML-based saving system wasn't too hard to do. In single player games I'm pretty open with the format I use and I don't try to encrypt it or anything, if they want to cheat they can go ahead and do so. Whatever makes it more fun for them. (I know I used to go into the save file for Prison Architect and give myself tons of money!)

The player was actually very easy to save, he just has some simple strings, ints, and bools. Plus his data doesn't derive from MonoBehaviour so it was completely 1-2-Check for getting that information to stream into an XML. The creature however needs MonoBehaviour... so in a very hacky manner I simply made an exact replica of the Creature script except without MonoBehavior. That is the one that gets saved and loaded. When I load I just assign everything in the CreatureData to Creature and whenever I save I assign everything from Creature to CreatureData and then stream. Easy pea-sy!

And lastly for the day I worked on scene transitions. To make everything easier on me and to save time, I simply made everything DontDestroyOnLoad(). So everything just carries over, even the player. I've already written out the dialogue for the "Tutorial Dungeon", but I can't progress all the way though it yet without the Battle System, so I need that next for sure.

News update! The artist messaged me today haha. I was right in that she had an important matter to attend to first, but she says tomorrow she'll start drawing. Perhaps tomorrow's devlog will include some fancy new artwork?

  • Day 5 - Friday the 21st

Day 5 was some good progress! I had thought the entire day would be spent working on just the basics of the Battle System and then I'd spent some of tomorrow on the more complicated parts such as Capturing or Leveling up at the end. However it all worked out and more in just today!

I started the day working on doing a "My turn" "AI turn" back and forth using coroutines. Then I added in some connections with my BattleHandler and the MovesetHandlers for both the Player and Enemy Creature where I could reference my move names selected with the buttons to the corresponding move in the moveDB and then returning all the information about that attack. Then for dealing damage I do some algorithms of the move's base attack modified by the attacker's ATK stat and the attacked's DEF stat. The outcome of balance is yet to see fully haha.

Then implemented some end of battle checks that would see if a winner has been found and what should happen in that case. As well I was able to add the support for if you're out of energy and when you attempt to capture your companion! The only things left to implement in the battle system are the "Use Item" and "Run" options, which neither are usable during the tutorial anyways.

From there I spent time making more cutscenes and within a few hours I realized I not only finished the entire tutorial but had also implemented giving your pet a nickname haha. From there I spent about an hour or so sprucing up the Tavern Celler with decorations, moved the Save Bed down there (making it the player's "base"/"home"), and added the door that would be used for the actual game dungeon access.

I'm surprisingly happy with my barrel stacking!

I don't have much to show for today... most of it was implementing that battle system and the huge amount of time that is spent writing step for step the cutscenes and dialogue of the tutorial. Now though the large amount of the leg-work is complete.

The last few days ahead will be implementing smaller systems and populating content into the game. From my game design document a lot will probably be cut, but at the moment I think systems I'll still implement will be Pet Care (basics such as Food and Resting), Barkeeper Shop, Bug Reporting System (using a beta asset), multiple control options, and a basic Options menu. Aside from that I'll probably be making between three to five dungeons for you to send your pet to grind in depending on the amount of time I have left.

It's looking like my full GDD won't be fulfilled during this jam, but at least a MVP of it perhaps. I wish I had time to implement Quests for example, but I don't want to work refactoring even more of my dialogue system (especially considering I just bought the fancy Dialogue System asset from the UAS, which I'll replace mine with after the jam).

(Edited 3 times)
  • Day 6 - Saturday the 22nd

Getting closer and closer to the end of the jam. At the time of updating my devlog now, there is about 36 hours remaining in the jam. Which when you add in sleep, breaks, and the obvious internet distractions (especially CS_Summit that has been distracting me today and the past 2) it is likely I have less than 15 hours remaining of time to finish the jam entry. At the end of today's update I'll include a list of what I still hope to achieve in that time.

Today I woke up and was a bit taken back on what I wanted to implement next. There were a ton of little system that needed to be done before I could start just making filler content. I decided to start with the Options Menu. In every jam I take part in and each project I do I always implement the options menus in different ways. I've yet to find a specific method in which I'm satisfied with the code and the outcome.

This is definitely not the exception. I made it very simple. I wanted the ability to change the resolution and fullscreen/window mode from runtime as well adjust the volume of the background music. While working on these options I also setup an Audio Mixer (this was a first for me, and I'm surprisingly happy with the system Unity has made). Previously I did arrow button based menus where you could click an arrow next to an option and it would go to the next (or previous) step in the setting. This time I wanted to try using a Dropdown box and Slider.

I used a slider for the audio, which was simple and probably the most generic but elegant way to handle that setting. Then I wanted to use the Dropbox for Resolution. I wrote a script that cycle'd through all the possible resolutions of the current display and added them to the Dropbox.options list. However, I couldn't find a way to set the default value of the dropdown to be the current resolution of the monitor. I'm sure it wouldn't even be a hard thing to code, but my brain has completely blanked on such a simple thing.

After that I wanted to setup the system that would allow the player to send their companion into dungeons to train and progress through the dungeon system. I used the door in the celler as the launching area for the dungeon delving and the space above it for a World Space UI. I thought this was a unique way to use some of that empty space. There are currently 4 levels of a dungeon that I plan to include in the jam entry, each one you'll need to get the key for which can be found on the previous level's floor.

And as you could see at the end of that gif (pronounced like gift, without the t), I also have made the first dungeon floor. The first creature in the dungeon is a level 1 rat, which the players can use for some easy experience. The players really shouldn't have much of a challenge defeating it. After that is another rat, this one is level 2, but still not much of a challenge. However, the slime is a level 2 and has a high defense stat. It does however have low attack and HP. So it shouldn't be too hard of a challenge for the player, but it will teach them that sometimes the player can't defeat a whole dungeon on the first attempt.

If you fight all three of them you will either be knocked out before you get the key OR you will run out of energy before you finish the fight with the Slime. The actual optimal way to clear this floor would be defeating the first two rats and then returning to the celler to save (which progresses "time" and rests your pet back to full stat). Do this one or twice to gain a few levels. Than you would be able to defeat them all easily. If the player decides to just avoid fights and get the key, that's also an option, but floor 2 will have a hallway guarded by multiple level 3 - 4 enemies that can't be avoided and they will defeat you unless you get a bit of training in.

Ugh.. I wish I could have got a better key sprite... but I'm working with Creative Commons that I can find online unfortunately.

After getting those two systems setup I did get quite distracted by watching CS_Summit as well doing some research into writing Reddit bots... which I plan to do as my next free time project for my portfolio. So once I was finally finished being distracted I didn't have much time to implement another system today. So I spent some time doing each part of the game, trying to break it, and fixing some bugs that people would have inevitably found during the jam. (One even forced you to redo the entire tutorial!)

Now I know that tomorrow I will need to REALLY step up my focus and game if I want to finish this in time. My very first goal is going to be implementing the Sleep / Pet Maintenance systems. This will include having to go to sleep to have your pet recover it's health and energy. Currently if you're defeated in battle, nothing actually happens which is also major. So I need to add into the Battle System that if your HP hits zero you're returned to the celler automatically and that you can't re-enter until you've slept.

After that I'll be implementing the Shop system with the Barkeep. He'll sell foods that you can buy and feed to your pet. Feeding your pet will allow it to FULLY recover when it sleeps and modifies the way that it's stats will increase when it levels up. So managing your pet's diet will become crucial.

And I'll need to have enemies you defeat start dropping gold at the end of battles so you don't run out of money. Originally I wanted a quest system that would provide income, but it looks like I don't have time for that. Anyways, wish me luck on the most important day of the jam, the crunch!

  • Day 7 - Sunday the 23rd

Today I got all the work I wanted to get done actually done. Although it was all done rather hacky, I'm satisfied with a simplified and cutdown implementation to fit the time frame I have.

I started with the shop system so that I could start buying food for my pet. Without the even smallest amount of Pet Care system in the game this was just an RPG style Pokemon game, which is not what I wanted. If I were to FULLY make this game design there would be a lot more elements from Tamagatchi apparent, but time constrains *sigh*. So I copypasted the MoveSet system and rewrote it to be used for the Item system. In reality didn't take that long, was just a lot of refactoring. Then I setup a very simple and straightforward UI for the barkeeper to sell you food.

Then I wrote a system were once a day you could feed your pet. Just some bool flipping. However, I integrated that into the Save system so that if you fed your pet that day when you went to bed it would restore your pet's health and energy points back to full. Then I fixed up the Sleep system so that it would have some visual feedback that a day is passing with a quick fade out and in.

Those were the last two systems to be implemented. So I was pretty happy. Next was to finish the last remaining parts of the Battle System. Firstly was being able to be defeated, previously you could just keep battling once you reached 0 hp. Now it'll end the battle and have your player exit back out of the dungeon door. You'll be unable to re-enter the dungeon until you feed your pet and sleep to recover.

And lastly I made it so when you defeated enemies they would drop between 1 and 100 gold for you. That was the final touch needed to finish the Battle System. I was pretty happy, it's not pretty, but it is functional.

Then for a bit of polish points I made a pause menu with the ability to Resume and Quit the game. Then a viewer of a fellow Twitch stream named TooOverRated offered to make a logo for the game, which I happily accepted. You can see it just below.

And with that I just started to play the game. I didn't run into bugs in a few runs, but I did notice that after getting a level or two you became completely over-powered and even to the point that the slime in the first floor couldn't even deal damage to my level 3 rat. So I'll be spending the next few hours (already the next day by the way when I write these around 12-1am) balancing the game and making the next three dungeon floors.

Then I'll write up a shop page and upload it for the jam! I'll be writing one final update after I upload the game to give a few thoughts and in about a week I'll write a post-morteum.

  • Day 7.5 - Monday the 24 (call it 7.5 because submitting deadline is 12pm)

And at 3AM, I've submit the game with four levels ending with a level 10 "King Rat". I wonder if anyone will be able to beat it? Overall, I've enjoyed this jam and liked doing my very first devlog along with it. In the future I'll probably do these again, maybe a bit more in-depth about my coding process?

Anyways, thanks for following along and if you like the game please do leave feedback on it's comment section! :D

-Reserved for Post Morteum-