Supporting Games On Multiple Platforms (Part 2)

In my last post, I introduced and discussed the way we handle supporting our games on multiple platforms. While the last post’s focus was on the desktop (Windows, Mac, and Linux) version of our games, today we’ll discuss the mobile/tablet porting process.

Step Three: Porting to Android.

Our games are typically available for both Android and iOS, but Android is a lot easier to develop for, and it’s infinitely easier to publish games on the Google Play Store. Therefore, I usually start working on the Android port before the iOS version.

Obviously, phones and tablets have weaker hardware than desktop devices, so this is where it becomes very difficult to optimize our games. Android runs on thousands of different devices with various screen resolutions and hardware specs, and some people are still using phones from 5 years ago. With so little RAM to work with, I need to work hard to ensure the game is as optimized as possible. GMS2’s debugger isn’t quite as good at profiling mobile devices, so there’s a lot more guesswork involved with optimizing for mobile platforms as well.

Aside from that, I also need to add touch controls to our games. This is a lot more difficult than it sounds. While Siralim and Siralim 2 use on-screen touch controls (a directional pad and circular buttons, similar to a physical gamepad), they need to work for thousands of different devices and configurations. Some versions of Android (especially custom builds of Android – a trend that is becoming uncomfortably popular) randomly force our buttons to weird locations, so I need to hard-code fixes for certain popular devices. I currently own 11 Android phones and tablets with varying hardware specifications, screen resolutions, and Android builds in order to test our games as thoroughly as possible.

Once everything is ready, I can compile the game for Android and quickly publish it on the Google Play Store. The Google Play Store is by far the easiest storefront to work with, and it’s always a breath of fresh air to work with Google compared to Valve, Sony, and especially Apple. Contrary to popular belief, Google is also pretty good at filtering out the garbage apps/games and ensuring your game doesn’t get lost in a sea of junk software. For that reason, Android is one of our most profitable platforms to work on. Google charges a one-time fee to be able to distribute apps on the Google Play Store. I’m not sure how much it costs now, but it was $25 when I started my development account.

Yes, I know what you’re thinking: “RPG Game!? What an idiot!”. Yes yes, such nomenclature makes me uncomfortable as well. But it’s great for SEO (search engine optimization) and I’ve found that it improves our position in the search results rather than simply referring to the game as just an RPG.

Next, it’s time to work on the iOS port. I’ll need a drink or nine for this one. The good news is that the game itself is 90% ready for iOS since the Android version already allowed us to optimize the game and add touch controls. The bad news is…well, there’s a lot of it.

Step Four: Attempting to port to iOS.

I’m not going to sugar-coat it: I hate iOS, and I hate Apple. This company hates their developers even more than their customers, and I honestly cannot figure out why they’re so successful. This section is going to sound a little bitter, and for good reason: iOS accounts for the vast majority of my development/porting time (and headaches, and alcohol consumption, and…) while accounting for less than 1% of my annual sales. The only reason I still choose to port games to iOS is that I know a lot of people would be disappointed if Siralim was only available on Android. Plus, as an iPhone user myself, it’s nice to be able to play my own games when I’m not on the computer.

Let’s start by creating a development account. First, I have to pay around $100 per year just to be able to develop apps for the App Store. While that’s not necessarily a lot of money, it is by far the most expensive fee charged by any of the other platforms. I know that it’s meant to deter people from uploading garbage apps to the App Store, but let’s face it: 1) that doesn’t actually work at all, as you can see by browsing the App Store for a few minutes, and 2) $100 is not a lot of money for people who are making hundreds of dollars per day with their spam apps.

Next, we need to fill out some paperwork. A lot of paperwork. And you’d better make sure you get everything right the first time because they don’t allow you to change minor details such as your home address very easily. As of the time I’m writing this, I haven’t been paid by Apple in 8 months because I’m still trying to sort out a change of address from when I moved to a new house last year.

Aside from the typical paperwork, for whatever reason, we also need to sign a bunch of certificates and profiles and load them onto our computer. I won’t lie – I don’t know why we need these or what they even do. My guess is that they work as an encryption key to sign the final app. This process is very time-consuming, but it gets worse: these certificates expire after 1 year. That means that after one year goes by, I need to try to remember how to complete this process all over again. Tax season has nothing on this.

Now for the truly brutal part. You see, Apple decided that we’re not allowed to develop iOS software on Windows or Linux, so developers are forced to buy a computer that runs Macintosh first. Right now, I’m sitting next to a $1300 MacBook that I was forced to purchase just so I can compile my games. Apple forces its users to use a program called Xcode, which is all-inclusive software that allows you to import and compile code into an executable app file.

Unfortunately, I don’t use a Mac system to develop my games (I use Windows), so in order to get the code from my Windows system to my MacBook, I need to do some networking. And we all know that never works out as easily as it sounds. Here’s how the process works:

  1. Compile the game using GameMaker on Windows.
  2. GameMaker sends some raw code over the network to the MacBook.
  3. GameMaker tells the MacBook to launch Xcode, and tells it about the code we just sent over. Hey, this isn’t too bad so far! Wait…
  4. Xcode freaks out, tries to figure out what’s going on, but ultimately fails. It throws up a bunch of error messages, none of which are accurate or remotely helpful.
  5. I Google the error messages and find hundreds of forums filled with other confused developers. Eventually, one hero figures out the problem, and I hope it works for me as well. If not, repeat step 5 until the problems are resolved.
  6. Beg Xcode to upload the app file to Apple’s servers.
  7. “No”, says Xcode. “Your certificate is invalid. But I won’t tell you which one. It’s a game, you see.”
  8. I open up my Keychain, cringing as I try to imagine what the person looks like who decided to call it that. The Keychain contains a list of all my development profiles and certificates. “Ah, not bad” I squeak with a tear in my eye. “Only 27 certificates to go through.”
  9. After a few hours of fiddling with the dozens of options on each certificate file, I try to upload the game again and it randomly works. I have no idea what I did to solve the problem, but hey, at least it works now.
  10. I fill out some information on the Apple Developer website about the game, such as the name of the game, description, keywords, age rating information, etc. I also need to upload screenshots with oddly-specific specifications. For example, they need to be in a resolution that literally no other device in existence uses, and they need to be 72 dpi, RGB, flattened, and contain no transparency. Easier said than done, but let’s move on.
  11. The game is now submitted and waiting for approval. I am now at the mercy of some intern who will review my game and graciously grant me the opportunity to sell my game.
  12. The intern wasn’t trained properly, so he or she rejects the game because Siralim asks you to give your character a gender, and I’m obviously collecting that information so I can use it against you later on. I’m going to sell the gender of your character to a marketing firm and make millions of dollars. That’s it exactly.
  13. Loop back to step 1, and hope I get lucky with a more intelligent intern next time around.

I wish I was exaggerating some part of this process, but I’m honestly not. I have now released 3 games on the App Store and they’ve all been this obnoxiously difficult to create for iOS. And let’s not forget that whenever Apple releases a new iPhone (which always has some weird, new resolution that no other device has) or a new iOS update, it’s probably going to break most apps on the App Store and I’ll need to repeat this process all over again.


Next time, we’ll wrap up this three-part series with a look at what it’s like to develop a game for PlayStation 4 and PlayStation Vita. See you soon!

Supporting Games On Multiple Platforms (Part 1)

A lot of people ask how I (and many other developers) manage to support so many platforms at a time. After all, Siralim and Siralim 2 are available on Windows, Mac, Linux, Android, iOS, PlayStation 4, and PlayStation Vita – and that’s understandably a lot of work for one developer to handle. I’ve decided to write a blog post about this topic, as well as a brief overview of what it’s like to launch a game on each platform. I’ll break this topic down into 3 parts – the first will discuss the Steam release (Windows, Mac, and Linux), the second will discuss the mobile release (Android and iOS), and the third and final part will discuss the console release (PlayStation 4 and PlayStation Vita).

What engine do you use to create your games?

I use GameMaker Studio 2 to create all our games. GMS2 is, in my opinion, the best engine in existence for creating any 2D game. It comes with a lot of built-in functionality to handle what would otherwise be a major pain in the ass to accomplish with a homemade engine. For most independent developers, I find it hard to justify creating your own engine. It’s 2017, and engines like GameMaker and Unity have come a long way toward making game development more accessible for everyone.

Step One: Build the game for Windows.

I start by creating all my games only for Windows. That’s because I run Windows on my main development laptop, so it’s really easy to make a change to the game and quickly run a test version of it on that same computer.

After the Windows version of the game is relatively stable and complete, it’s time to enter Early Access on Steam. This gives players the opportunity to contribute feedback and report any bugs and crashes they find. The first week or two of Early Access is pretty rough – I normally work about 14-18 hours per day, doing nothing but combing through our forums, fixing game bugs, and releasing game patches to make sure everything is nice and stable. Particularly in the first week, I’ll release up to 10 updates per day to address bugs and crashes. This week is the only time my job becomes truly stressful – it’s a little disheartening for me to think that someone paid money for a product that doesn’t meet their expectations, Early Access or not. When I released Siralim 2 on Early Access, I remember finding a few solutions to major crashes and bugs while I was sleeping – that’s how entrenched in the code I was during that time. And yes, I still make time to shower every day.

Steam is sometimes a bit annoying to work with due to a very “user-unfriendly” backend. It’s very time-consuming to create achievements, especially since our games tend to offer hundreds of them. It also takes a lot of effort to create Steam backgrounds, badges, emoticons, and cards, because these assets have very rigid technical requirements from Valve. I’ve also found that Steam’s approval process is a little cumbersome – each game is reviewed by a human, which is great, but it means that you have to wait a few days for them to check everything over. If there are any issues, you need to correct them, re-submit the game, and wait for someone to review the game all over again.

Step Two: Porting to Mac and Linux.

After the Windows version of the game is relatively stable and I notice that the number of bug/crash reports have dwindled, and I’ve ensured there are no major flaws in the game mechanics that people dislike, it’s time to move on to porting the game to Mac and Linux. This is actually a lot easier than it sounds – GMS2 allows you to compile the exact same game for Windows as all the other platforms, so it’s pretty much just a few clicks of the mouse and I can create a version of the game for Mac and Linux.

One frustrating part of developing games for Mac, however, is that despite their high prices, Mac systems tend to be pretty weak from a hardware perspective. I’ve also found that people like to hang on to their same MacBook from 10 years ago and expect games to run perfectly well on it, so this is a good time for me to start optimizing the game to make it run more smoothly on lower-end hardware.

Many people think that, because Siralim has such primitive graphics, it should be able to run on any system, but that’s simply not true. Siralim has a lot going on behind the scenes: the game needs to manage thousands of objects at a time, generate random dungeons quickly, and process tens of thousands of lines of code during battles thanks to the hundreds of spells and traits available to players at all times. This means that the player’s CPU and RAM are the most significant bottlenecks. GMS2 has a nice debugger that allows me to profile the game and determine which functions take up the most RAM and tax the CPU the hardest. I can quickly find which functions need to be re-written to run faster. Sometimes, this means that I need to re-code entire game systems, but that’s usually not the case.

Linux tends to be a lot easier to work with. For obvious reasons, Linux users tend to be some of the most tech-savvy of all our players, so they’re really good at reporting bugs and crashes with a lot of detail. Linux users also tend to run this OS on higher-end systems, so optimization is typically not as big of an issue as it is with Mac devices.

Once the Mac and Linux versions of the game are ready, I upload them to Steam so Early Access users can play the game on these platforms as well. While I wait for users to report issues with the game on these platforms, I continue to fix any outstanding bugs and crashes, and implement changes based on feedback from our players.

Once I’m confident the game is relatively free of bugs and crashes, and the game is content-complete and the player base tends to be generally happy with what the game offers, it’s time to leave Early Access and officially launch the game on desktop devices. That’s as easy as pressing a “Launch” button in the Steam back-end. Then, it’s time to drink a bottle of bourbon (Woodford Reserve, if you must ask) and watch YouTube for a few days. This is also a great time for me to apologize to friends and family for falling off the face of the earth for a few weeks.


In part 2, we’ll explore the process of porting our games to Android and iOS. If you found this post helpful or interesting, feel free to let me know in the comments, or ask any questions you have!

See you next time!

The Negative: Devlog #22: Monster Spotlight – Wickerman

Moving forward, the devlog schedule for The Negative will change to every 4 weeks, rather than once per week. In turn, the devlogs will be a lot more detailed and will contain more pertinent information about the game outside of simple monster spotlights. Additionally, I’ll be announcing a new game soon which will have its own set of devlogs to fill in the gaps between the ones for The Negative.

The Wickerman is part of the Balance class and is one of the most useful disruptors in the game. This monster’s skills focus on turning your enemies’ positive effects into negative ones, and can even turn into quite a powerhouse thanks to its “Draw Power” skill.

 

Active Skills

Effigy: Deals a small amount of damage, and deals a small amount of damage to a random enemy.

Coalescence: Your monsters’ HP is redistributed so that each one has the same percentage of HP.

Draw Power: This monster’s stats are set to the highest of each of your other monsters’ stats.

Convergence: Enemies’ HP is redistributed so that each one has the same percentage of HP.

Passive Skills

Trickery: When an enemy damages one of your monsters with an attack, it has a 7% chance to heal them instead.

Despoil: When an enemy gains stats, it has a 15% chance to lose them instead.

Deface: When an enemy gains a buff, it has a 15% chance to gain a random debuff instead.

Misfortune: When an enemy is healed, it has a 15% chance to take damage instead.

The Negative: Devlog #21: Monster Spotlight – Coercer

The Coercer belongs to the Mind class, and I’m sure you can take a guess as to what its skills revolve around – convincing enemies to do your work for you! This monster doesn’t have a single skill that damages, heals, or buffs your monsters directly – instead, it forces its enemies to it for you.

Keep in mind that its skills also work on allies – for example, it can coerce an ally into healing your own party as well!

Active Skills

Telekinesis: Target deals a small amount of damage to a random enemy.

Kismet: Target increases your monsters’ Luck by a moderate amount.

Hidden Power: Target heals your monsters for a moderate amount.

Mind Rattle: Target deals a moderate amount of damage to all enemies.

Passive Skills

Mana Burn: When this monster uses a skill that targets an enemy, the enemy incurs 20% of the skill’s MP cost.

Clumsiness: When an enemy uses a Healing or Mana Draught, it has a 20% chance to use it on one of your monsters instead.

Self-Loathing: At the start of each enemy’s turn, they have a 10% chance to attack themselves.

Coerced Coexistence: Enemies’ healing effects are split between all enemies.

The Negative: Devlog #20: Monster Spotlight – Tokoloshe

The Tokoloshe is a Balance monster that harnesses evil voodoo magic to manipulate its foes in strange ways. This monster can force other monsters to attack themselves, shuffle their stats, and move them all around the battlefield at will. This monster also has a few reactive passive skills that cause it to deal damage when enemies perform certain actions, such as attacking or moving.

 

Active Skills

Evil Eye: Deals a small amount of damage, or a large amount of damage if the target is in the center position.

Discombobulation: Target’s stat values are shuffled.

Jinx: Target attacks itself.

Black Wind: Deals a moderate amount of damage to all enemies and moves them to random locations.

Passive Skills

Crossfade: This monster deals 15% more damage to enemies in the middle of their column or row.

Hex: At the start of battle, afflict a random enemy with Silence, and another random enemy with Scorn.

Voodoo: When an enemy attacks, they take a very small amount of damage.

Pressure: When an enemy is forced to move against its will, it takes a small amount of damage.

The Negative: Devlog #19: Monster Spotlight – Nix

This monster is definitely one of my favorites. The Nix is a psychic ninja that belongs to the Mind class. Its skills are all about dealing quick and clever damage or surviving incoming attacks in unconventional ways. This monster’s sole drawback is that its skills are “selfish” by nature – it doesn’t do much to help your other monsters in battle.

Active Skills

Backstab: Deals a small amount of damage, or a moderate amount of damage if the enemy isn’t in the front column.

Psychic Shurikens: 6 random enemies take a small amount of damage.

Preparation: This monster gains a moderate amount of Speed, then becomes Invisible.

Smoke Bomb: Enemies take a moderate amount of damage, and the weather is changed to fog. (Note: the “fog” weather effect causes all monsters to have a chance to miss attacks)

Passive Skills

Ambush: At the start of battle, this monster becomes Invisible.

Cloak of Shadows: Your monsters are immune to the adverse effects of fog and wind.

Shadow Focus: When an ally takes damage, this monster gains a small amount of Power. This skill can only activate once per turn.

Shadow Clone: When an enemy attacks, this monster has a 15% chance to summon a shadow clone of itself. The clone swaps positions with the enemy’s target before it attacks.

The Negative: Devlog #18: Monster Spotlight – Soulcaster

Today’s monster spotlight is all about the Soulcaster, a Life-class monster that interacts with its enemies’ stats for its own benefit. This monster is extremely useful when dealing with enemies who heavily rely on buffing their stats. In the hands of a skilled player, this monster is capable of dishing out some massive damage as well.

 

Active Skills

Soul Arrow: Deals a small amount of damage. An additional 20% of the target’s Power is used to determine the amount of damage dealt.

Manipulate Fear: Target loses a moderate amount of Luck, and takes damage equal to 50% of the amount of Luck lost.

Legendary Pain: Enemies take a massive amount of damage, plus damage equal to 7% of their Maximum HP.

Dark Metamorphosis: Swap location, stats, HP, and MP with the target ally.

Passive Skills

Rend Spirit: At the start of battle, this monster steals a very small amount of MP from each enemy.

Soul Shield: When this monster takes damage from an enemy, the damage is mitigated by 15% of the enemy’s Defense in addition to this monster’s own Defense.

Soul Mirror: When this monster takes damage from an enemy, and the enemy has a higher Resistance than this monster, the damage is mitigated by the enemy’s Resistance instead.

Muted Life: When an enemy is healed, this monster steals 15% of the amount healed.

The Negative: Devlog #17: Monster Spotlight – Asura

The Asura is a hard-hitting Chaos monster that specializes in attacking multiple times per turn. While this monster is capable of dishing out large amounts of damage to one target at a time, its area-of-effect abilities leave something to be desired. In addition, despite having a couple skills that enable it to recover HP, this monster is pretty easy to take down if the enemies focus their efforts toward killing it off.

 

Active Skills

One-Two Punch: Deals a small amount of damage, and has a 50% chance to cause this monster to attack the target afterward.

Doomfist: Deals a large amount of damage to the target and moves it to the back column. If a monster is in the way, it takes a moderate amount of damage.

Chakra: This monster recovers a moderate amount of HP and MP.

Barrage: This monster attacks the target, then attacks 2 random enemies for 50% normal damage.

Passive Skills

Crush Punch: After this monster attacks, the enemy takes a small amount of damage.

Remorseless: This monster has a 20% greater chance to deal critical damage with attacks.

Many-Faced: When this monster is healed or gains a stat, it has a 35% chance for the effect to be duplicated.

Fury: When this monster attacks, it has a 50% chance to attack again. This effect can only occur once per turn.