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).