This update’s a doubleheader, including all the VFX rolled-back from 0.23 and the introduction of 3D Mesh cards!
They say the way you look at the world informs everything you experience. If this is true, update 0.24 is adding a whole new perspective to Gods Unchained, taking cards into an entirely new dimension as well as a big change to the network that runs underneath it all.
But first, this update’s a bit of a double header, including all the goodies from the rolled-back Update 0.23… and none of the bad. For a refresher these were:
- Lighting upgrades: a new way to render lighting to improve performance and make things more atmospheric.
- VFX upgrades: Introducing a cohesive VFX language, which gives new life to effects across the board and lays the groundwork for future upgrades,
- Shiny Summons: Cards summoned will now share the same quality as the cards that summoned them. EG: If a gold card summons another card, that card will also be of gold quality.
- Bug fixes: Bringing all the good bug fixes along for the ride and squashing the ones that surfaced alongside the previous update.
Above: Join Meals, GU Community Manager, for a bite-size look at the new features in 0.24
For a more in-depth take, let’s dive into what 0.24 has to offer, shall we? We’ve got a dev update dropping in 3, 2, 1…
Feature Spotlight: Mesh Cards
Hi, I’m Trev the Senior Tech Artist on Gods Unchained. For anyone not in the industry, I’m a programmer/artist hybrid and I handle a bunch of different things in the overlap between the two disciplines.
Over the last few months we’ve had some big changes in the works to how our cards look and feel while you’re in-game, as well as how we manage them under the hood and I’m really excited to be getting this into your hands with the 0.24 release.
Out with the Old Cards…
Our old cards were flat 2D planes and have been that way since the very beginning of Gods Unchained. There are two things you need a basic understanding of before we proceed:
Materials: These are used to display the correct textures on a card’s model. A card is basically a blank slate, but once the Material applies various textures, the result is the card you see in the game client or launcher.
Shaders: Are the ‘under the hood’ part of materials. They’re the logic part that tells the material what type of textures and variables it should be using. Is it a color texture? Is it a texture that controls how bumpy a surface should look? Shaders also handle cool effects like dissolving or glowing.
To compile the old cards, we used a library of card piece textures that were all fed into the card material. The shader for the card material assembled the card textures together, along with the card art, to make one visually complete card material. That material was then stuck on a flat 2D plane in-game.
That shader also handled stuff like card highlighting and a bunch of other functionality for VFX. Doing all this with one shader is pretty damn good on performance, as shaders are cheap on performance, in that they are handled entirely by the graphics card, but we’re kinda limited in what we can do with them. The more functionality you add to a shader, the harder it is to manage long term. It becomes, what we like to call in the biz, spaghetti.
So, the problems we faced with our old cards were:
- Exponential increase in complexity and time when we added new systems in both the code base and the shader.
- Exponential increase in performance costs per card. While shaders are cheap, adding new functionality to a shader has a knock-on effect: making each card more and more expensive as individual effects run on the GPU with every frame.
- Our code base has grown over time and the systems that manage card visuals were scattered throughout the project and our animation system. It was also spaghetti.
- We had 5 different templates (known as “prefabs”) that all cards are built from. These were:
- Spell + Godpower
- Card in opponent’s hand
- Creature on the board
This meant that we needed to carefully keep them in sync when making changes, and wasn’t the best when it came to “pooling” (storing blank assets to reuse later) for memory management.
- Any time a card was made to flip or move when it didn’t directly face the camera (like the animations seen when drawing or dragging cards) it hurt me on a deep level. It didn’t look great and I knew we could do better!
A lot of these problems were pretty manageable at this stage. Card performance was an overhead, but hadn’t presented itself as a huge problem… yet. The big overarching theme here? None of this was scalable. If we didn’t make changes soon, a few years down the line we’d have a proper (and I’ve been saving this pun) house of cards.
… and in with the New Cards!
All of these problems were completely solvable, we just needed to carve out a big chunk of time as we had to rewrite a pretty significant chunk of the codebase. Back when we were at the tail end of 0.22, I broke off from the rest of the team to start building a new system to manage our cards. I wasn’t alone though, I also stole one of our artists to start working on an idea that’s been floating around for a long while now.
“What if we made the cards fully 3D?”
After some quick and dirty art tests and some brainstorming with the programmers on how we’d manage a system for this, we decided to use this chunk of time as an opportunity to tackle as many problems as we could in one big pass. I then got to work on building a new system to manage our cards while our artist continued to build card pieces and iterate on these.
Over the course of weeks, the team working on this went from the two of us to six. We all felt really passionate about the project, and I’m really, really proud of what we built together.
We now have one self-contained system to manage the visual appearance of cards. Everything in the new system, start to end, is completely modular. The card models, the scripts that manage stuff, the shaders and materials. Everything. This is future-proofing us for where we’ll be in 5 years time with X number of sets released. If every set adds something new that cards need to be able to do, this new system can handle it and handle it easily.
One of the other big things that we’re doing is hot-swapping materials and shaders on the cards. While a card is idle, it uses a material with the most dirt simple, high-performance shader possible. When it needs to fade out, we’re swapping its whole material over to an equivalent material that has the fade functionality, if it needs to dissolve we swap it over to the dissolve material.
These effects, especially transparency-related ones, can get expensive on performance very quickly so with this change we’ll only be adding the performance cost when it’s actually needed. And let me say this again, this system is modular! From here on out, if we need a new visual thing that a card can do, we can keep that completely modular which makes adding new visual effects significantly easier.
The other sweet thing that we’re doing is that the card prefabs are loaded from asset bundles. That means that we can make updates to some things (like shaders, materials and models, but not scripts, unfortunately) on the fly without having to release a new version of the game. This means that we can make updates to some areas of it pretty safely without having to drag every team in and go through the entire release process. Sending an updated texture or a model to the public can be done in an afternoon now instead of having to wait for our next big release.
I can geek out about how much better this system is all day, but honestly the biggest improvement from adding this system is game feel. I can’t describe it in words (or in videos), as it’s something you have to experience for yourself. I highly recommend you all boot up the game and play around with it. Drag cards around and pay attention to how it feels: how they move, how they rotate, how they animate. I spent a ton of time just tweaking values to get it to feel good because I believe it’s really, really important. It just looks and feels better.
This system isn’t perfect, not yet at least. I’m a harsh critic of my own work and also a massive card game nerd. I know what I want this to look and feel like, how great it could be and I know that this isn’t quite there yet – but it is a massive step in the right direction. I can see us getting to that perfect game feel with this new system. It gives us room to grow, to polish, to build further, optimize further and make better. I’m proud of what we did and excited for what we can do next with it.
~ Trev, Senior Tech Artist
(Discord: Trev | Senior Tech Artist)
A New Network:
Underneath it all, there’s been a big change which you probably won’t notice in-game. We’ve replaced our entire network code. Yup, sounds scary, but in reality this will help improve stability & our visibility on network related issues moving forward. One major benefactor of this is the Gods Unchained Mobile build, which is still many many months away, but this new network allows us to finally move forward in this space.
A total of 125 bugs were fixed in this release! This is a combination of 45 bug fixes from 0.24 and an additional 80 bug fixes from 0.23. Here’re a few of the fixed issues that were reported by some very diligent mortals:
0.23 Bug Fixes
- Lost In The Depths – Fixed an issue that could cause Lost In The Depths’ card effect to appear delayed.
- Sanctum UI – Fixed an issue where players could open the Sanctum while a card selection screen is active, as it caused UI elements to become hard to select.
- Auto Attack Sequence – When multiple creatures that attack automatically (Spiral Golem, Broken Harvester & Underbrush Boar) are on the board, there is no longer a chance that subsequent auto attacks will target an opponent that has already died.
- Relics – Fixed an issue that caused Relics to occasionally leave their durability number visible on the board after being destroyed.
- Transformed Soulless – Creatures with Soulless that are transformed will no longer be put into the void.
- Burn Application – Creatures with innate Burn (e.g. card text that reads “Burn 1.”) that are copied into a player’s hand will no longer re-apply their burn when summoned to the board.
0.24 Bug Fixes
- Raise Dead/Half Life – Fixed a bug where summoning a creature from the void with either the Raise Dead or Half Life cards could occasionally cause the opponent’s game to soft lock.
- Leywraith – “Roar” now activates no matter how many creatures are on the board.
- Tooltips – Creature card tooltips no longer get stuck on screen after players hover a card for an extended period of time.
- Favor – Favor now updates at the correct times once a player reconnects to a match.
- Deathwish Thanetar – The mana cost of this card is now updated immediately when drawn to a player’s hand.
- When played in a specific order by both the player and the opponent, Exoscout and Pallbearer cards can trigger a game loop that causes the game client to get stuck.
- When a sleeping creature is pulled by Ambush and then targeted by Darkdream Hex, the action isn’t resolved until the end of the turn.
- Cards can occasionally appear out of alignment in an opponent’s hand, with one card appearing in front of the rest.
- When an opponent’s mana is reduced by Mana Bind’s effect, the reduction is not visibly reflected on-screen for the player.
- When in 16:10 resolution, the rightmost card in a player’s hand covers Bag of Tricks orbs once a player has more than 7 cards (although orbs are still selectable).
- If your device is running Mac OSX Catalina 10.15, this update will get stuck on “Retrieving User Cards”. To fix this you must grant the “gods” application “Full Disk Access” in your Privacy Settings. This issue is widely affecting a lot of software on Catalina. You can fix this by following our guide here. If you have already followed this process with the previous update, remove “gods” from “Full Disk Access” by using the “-” button and re-add “gods” by using the “+” button.
- Reconnecting to a match will sometimes cause the river’s water and the cards in the deck slot to disappear.