As I started to type from an AirBnb room in Sao Paulo, I realized this will be a really, really long update. Lots of things to talk about and some tech details I want to get into. I will try to point what I’m going to talk about on each section of this update, so feel free to read the points you would like.
Where I was last month?
A month seems like a big measure of time, to the point I feel the need to read my last update and remember where I was back then
- Made happily(never)after for the Weekly Game Jam
- I took a break from some projects (I didn’t even remember that!)
- Made Cult Cultivation for another Weekly Game Jam – Said that I was coding an Idle Framework that I wanted to sell on the Unity Asset Store.
- Released an Update for Pizza Clicker (V3.7) and said I was going to get back to it in February.
- Said I was working on a new mobile game, temporarily named Mobile Dreamlands.
- Announced I started an Internship on a local game dev company
- Said I liked to work on Udemy courses
Cult Cultivation, the Idle Game Framework and Pizza Clicker
Yup, I’m grouping all the idle ones in a single topic.
Being very straight to the point here, I’m at that point where someone gets a lot of things to do and can’t handle everything. My original plans was to finish the Idle Framework before the end of February, which I didn’t, so I had to put this on hold.
Also, it’s already February 15th and I haven’t even touched Pizza Clicker V4.
About the Internship
Talking a little more about the Internship, it is on a company called Gilp Studios and I’m working on a game called Upside Down.
The project was originally on Unity 2017.1, we tried to upgrade for the 2018.3 version, everything was broken. Then we tried 2018.2. Everything was broken. Then we settled for 2017.4 LTS and it worked out well. Important Note: The game used to run on 30fps (not locked) and, just by upgrading the version, it runs on ~40fps, which is a good margin and should result in not having frame drops on the live version if we lock on 30fps, which is the default for Android Devices.
Me and the other intern made some things like developing a Colorblindness Mode, which was really well received since the game relies so much on colors. We had to also integrate that into the Localization Module, which was interesting because I had not ever seen how localization worked before. Another thing we made was some Interface Improvement, for example, changing some texts, recompile the Chinese Font to have the Colorblindness Mode in Chinese, adding some juicing on the UI buttons and fixing a transition on the music when you lost the game.
The music on the game was made using FMOD, I had never tried FMOD before, and boy, if you know how regret feels you know how I feel. It is so simple to work with and to integrate with the game to the point you have Dynamic Music very easily. I fell in love with FMOD and want to use it on every project now. In the end the transitions were just some minor transition timing thing, the lesson is that I love FMOD.
After all that I started working on the iOS Port, which is something I always wanted to try and, guess what, every dependency had broken while porting to iOS, I had to upgrade Google Play Games Services from 0.9.39 to 0.9.60, upgrade Firebase Version and Google AdMob version. After doing all that and refactoring some code (thanks #if macros) I finally got it to work on iOS.
After some more refactoring and code writing I managed to integrate Game Services on the game and add a Leaderboard, the remaining tasks would be doing the Achievements and IAP on iOS.
If you plan to release mobiles games, this paragraph is important. I’m currently stuck on the Achievements thing. The thing is that the way achievements works on Google Play and Apple Game Center are different. Google Play Games have three kind of achievements (Locked/Unlocked, Steps, Percentages) whereas Apple Game Center only deals with percentages, and when an achievement reaches 100% it is automatically completed and awarded (which does not happen on Google Play Games). So, how to effectively work with Achievements on Google Play and App Store? The answer is pretty simple! You build your own Achievement System and create interfaces to get percentages for ALL OF THEM, this way you can also display the achievements with your own UI, but that’s not the point. The point is to have your own small achievement system and have interfaces to send their data to Google Play and App Store. It’s really not that complex but needs to be planned ahead.
Anyway, back to what I was doing, Upside Down was originally only for Android, so there’s no underlying achievement system and all the code relies on Google Play. What I’ve done? Nothing. The story reached the present moment. I’m thinking on building an achievement system mirroring the Google Play Achievements and use them for the iOS Version.
These stories are not the most exciting, in fact, as someone who aims to be a Gameplay Programmer, they are pretty boring, but integrating with the stores, having achievements, leaderboards, having analytics with firebase, handling all dependencies and project version are very important tasks, it is that final 5% that gets the attention to your game. These are not really my cup of tea but doing them makes me value the ones who does them (I’m having flashbacks about my last job as a QA right now)
This was not even the longest part of the update.
Announcing Freshman’s Quest
Some months ago I talked about a game development club I was a part of at the University, after a year messing with a lot of different things we started a real project, recently we decided to go public and start to gain some visibility to a project, the next goal is to have 2 polished levels and release a demo.
Here’s and old gameplay footage (the level design and level art are pretty much all different now);
It is a platformer, as simple as it can get. Our team currently consists of 1 Designer, 3 Programmers (which some of them sometimes dabble in art and design), 2 artists (which one of them also do Level Design) and a musician. The inspirations are, obviously, Celeste, Mario, Shovel Knight, Owlboy, Hollow Knight and all the recent games with some kind of platforming action.
The goal is to have a polished finished product and sell it on itch.io or Steam, if possible. The price would no more than $5. As we run to finish and polish the game, now we have to build a website, presskits, trailers, and all those things.
But it is a project that I’m proud of and teached me A LOT on working with groups, something that is really valuable. I’m thinking of setting its own Development Blog and creating a post explaining more about the project, if I don’t do that, I will post on Fourth Dimension Studio Devlog.
Now here comes the long part
MOBILE DREAMLANDS HYPE
Being direct to the point: Mobile Dreamlands first playable is ready! (CLICK TO PLAY!!!!) – I made an early build to spread the word across and try to get some early feedback, keep in mind it’s not polished yet.
Mobile Dreamlands (temporary name) is some sort of mobile turn based roguelike game, the objective is to kill monsters, collect gold and go further down the dungeon. Your “success” is going to be measured by how far on Y axis you go and by how much monsters you kill. The amount of monsters you kill influences the amount of gold your earn.
I wanted to finish this game by the end of February and then work on a PC Roguelike game, which would be Dreamlands, but I ended up liking this project so much that I think I will stick with it until the end of April.
A basic core gameplay loop is done, I still have to polish and add content to it, but the 80% is done there. When I say I want to stick with it for a couple more months I’m saying I want to make it a REAL mobile game. I want to have it on Android and iOS, I want to have leaderboards, achievements, integration with Google Play Games and Apple’s Game Center, I want it to have monetization, but not in an intrusive way (which I hate about mobile games) and I’m even reasoning about searching for publishers, trying something with Gilp would be a good fit as I could make a more friendly contract.
I know that a roguelike mobile game seems a little bit weird but this project could really reflect some of my values on gameplay, how much fun it could give, how it could be a “real game” (i.e. not a casual money grab) on mobile, using ADS and IAP but not in a way that makes your experience worse if you don’t want to watch/spend. On a more personal level, I love turn based games and I’m thinking on having the aesthetics resembling Lord of the Rings, which is also something I love.
Talking about the art, I’m going to have a partnership for the art on Mobile Dreamlands! It is one of the artists from the game above (Freshman’s Quest), her name is Barbara Franco and she has an art studio in my city, called Hovel 102.
About the Monetization, what I’m thinking is pretty straightforward, about watching advertisement, it could give a second chance after watching, giving a temporary buff or maybe doubling the amount of gold in a run. Other than that, the gold is going to be persistent and you can maybe buy temporary buffs (i.e. having 2x gold for a run, 2x damage for a run, 2 turns for a run, more life, etc…), with that, having the option to buy gold with real money is also a thing.
Still on the Monetization topic, I’m thinking on having some sort of “DLCs” – For example, you can pay for $1 a new land with new enemies, new traps, new styles of design, different art, new music, etc…
Another idea is to have an In Game Shop, and my idea with this one (besides the buffs) is to have many different playable characters that can be unlocked with gold. I could make every character have a particular trait (more life, two movements per turn, more damage, etc…), but this is something I’m still thinking about, the real plan with the unlockable characters is to have aesthetically different playable characters, such as elves, dwarves, aliens (??) and maybe I can try the idea of having characters of different color, race and gender to add a little bit of representation on the game.
By working on this game for more time, I could also try to create some music for it, which is something I’ve been studying on the side and really enjoying.
I want to get technical about Mobile Dreamlands. It has basically two big systems: a level generation system and a turn based system. As I stated previously, one of my goals was to have an asset published in 2019, and the Level Generation System is a possible candidate, so I made some extra effort to have something good and reusable.
The Level Generation System
The Level Generation System is composed simply by three scripts: the Room, the RoomInstance and the LevelManager, besides that, there are three ScriptableObjects, the ColorToGameObject, RoomTypeToInstance and RoomGenerationMapping.
Room: It’s the abstract representation of a 9×17 grid, what is important is that it has a type, some examples of types is Start, Easy, Reward, Rest, Medium, Hard, …
RoomInstance: It’s the representation of a room on the Scene, it has a template and a ColorToGameObject – The way it works is that it receives a template, a template is a 9×17 image where each pixel represents a tile (I do them on Photoshop), then the RoomInstance iterates through this image and for each pixel, it gets its color, searches the color on the ColorToGameObject and instantiates the equivalent GameObject for that color, if there’s more than one GameObject, it chooses a random one.
Here’s an example of a template, the way it is configured, every black instantiates a random ground Prefab, the red points instantiates a random enemy and the yellow instantiates a “border”.
LevelManager: The LevelManager is the Big Boss. It has a RoomTypeToInstance and a RoomGenerationMapping – The RoomGenerationMapping is a ScriptableObject that maps a single room into an array of rooms.
When the level is initialized, it just adds a Start Room to the list, after that it searches on the RoomGenerationMapping for the mappings that starts on the Start Room, let’s pretend it adds an Easy Room and a Reward Room, the next step would be searching on the mappings for one that maps a Reward Room on something else.
I do this on the initialization until I have 5 rooms (totally arbitrary number), after that I do the same but on runtime while player progresses.
Having the Rooms List, the Level Manager has to create their Instances, it uses the RoomTypeToInstance to do that – which is a Scriptable Object that matches a room type to a prefab of a room Instance.
I liked the way this system turned out because I can add new rooms, new mappings, add more content simply by creating more ScriptableObjects, without having to hard code the logic. Even someone who doesn’t understand programming could use, although a Level Generation System would totally be aimed for programmers.
Smart pieces of code I couldn’t live without
As you could see, I’ve used a lot of Scriptable Objects lately, it happens that I learned how to use them better recently and I added them everywhere I could on this project. Scriptable Objects are really good for configurations.
Something I’ve been using a lot recently is Linq, a Query/Set Library which helps a lot, all these matches I talked about I’ve made using Linq, but the real smart boy I did this month, the month’s MVP is the RandomOrDefault():
I’ve had this idea when using Linq, the idea is simple, it returns a Random element from an array or a list, the beauty of this code is that it works for both data structures. If the list/array is empty, returns the default for that type.
Anyway, I’ve been writing for more than 2 hours straight. I’ll finish this update here! It was a long long one because I had a lot to report and a lot I wanted to talk about, but hopefully some of the things are useful!