Bugfixes
Just a couple little fixes
Just a couple little fixes

Just a couple little fixes
Just a couple little fixes
There are moments during development when the game changes for you. The most important one for me is when the game is first fun. This update isn't about that, that one happened years ago. But there was another one recently when I switched from text-rendered characters to pixel ar
There are moments during development when the game changes for you. The most important one for me is when the game is first fun. This update isn't about that, that one happened years ago. But there was another one recently when I switched from text-rendered characters to pixel art images.
Today is another change like that. I know how the game works intimately... obviously. So it's never a huge deal when the game isn't clear in telling me what's going on. Feedback from players during playtests always called out that they can't figure out what's going on. Some of that is expected. The game is intentionally complicated, and it takes some time to learn it.
Today's change is a small delay whenever a panel is created. It's a small change, but it makes a big difference. I think it's a big step-change in understandability. I hope you enjoy!
You can now turn the page back! Yay! This is one of the most obvious UX implications of framing the game as a comic book, and yet, it took me until today to get it right. It turns out it's quite complicated! You may have noticed that I missed my update last week. It was because t
You can now turn the page back! Yay! This is one of the most obvious UX implications of framing the game as a comic book, and yet, it took me until today to get it right. It turns out it's quite complicated! You may have noticed that I missed my update last week. It was because the page turn stuff was just not done. Unity threw me some curveballs, but I eventually got everything cleaned up.
This patch also comes with a small rebalance to the challenge order. Indigo Cobra was way too hard to be the 4th enemy. There are a few other little nuggets and bugfixes in here, but the big thing was the page turning.
This is going to be a bit of a tech deep dive into why it works the way it does. I've mentioned in the past that the panels (the code refers to them as "logs" for historical reasons) have been through a lot of revisions. Surprisingly, many of those revisions were driven by performance problems.
I don't like to solve performance problems before they occur. If you wait until they actually happen, you can see exactly what the problem is, and you don't end up fixing things that aren't problems. It's a lot more efficient, from a development perspective, even if it is a little less clean, from an architecture perspective.
My first solution for logs was to create a game object with a text rendering component in a scrolling view. This worked for a while, but as the game developed, more and more text was being dumped into that view, and it did end up being a problem. The original solution to this was to move it to one game object and concatenate the text together, but that scaled poorly for a number of reasons.
Eventually, I had to move towards a system that removed old log lines. This system is still present today in the pagination. Only the most recent 6 panels are displayed. Another important step in the evolution of the logs was the introduction of popups.
I got a little crazy with those popups. For example, if you mouse over a skill, you can recursively mouse over popups to go into great detail about how that skill works. Truly unnecessary detail. Regardless, each of those popups is at least one (realistically many) text field. To be able to display so many potential text boxes, I needed to reach into my bag of engineering tricks.
The two main tools are object pooling and latent constructors. That means that the text boxes are reused, rather than being recreated. It also means that the in-memory representation of a text box that isn't being shown is very minimal, with little more than just the text to allow the text box to get re-filled when needed.
However, because there are SO MANY POPUPS, even the tiny in-memory representations needed to get disposed of eventually. And so they are! Every time you turn the page, the popups associated with the content on that page are destroyed. That's why you can't mouse over the panels after you turn the page back.
Hooray! Zero to Hero is in Early access now! Ok, back to work making it better... Zero to Hero is super data-driven. All of the information about the bosses, the levels, the skills, and even the characters comes from little data files shipped with the game. Now you can edit those
Hooray! Zero to Hero is in Early access now! Ok, back to work making it better...
Zero to Hero is super data-driven. All of the information about the bosses, the levels, the skills, and even the characters comes from little data files shipped with the game. Now you can edit those!
This will still be an involved process with multiple tools. I'm not shipping a tool to unpack the game data, for example. But for someone comfortable with modding games, this should be everything you need: https://github.com/foxor/VBModTools
Let's take a little tour through the serialization format:
Each ".tbes" file, as well as each ScriptableSerailizable asset stored in the unity resources, has a shared format. The first 2 bytes of the file specify the version number, so that I can run data migrations, if we need to reinterpret the file contents in a different way later. Next, 4 bytes describe the length of the file. The length is probably not necessary, since each has it's own file at the moment, but it's "polite" and useful for knowing how big to make the buffer. Then, there's a whole big binary chunk of data describing one object:
Each object is encoded the same way: A header describing the type, and then a big data block. Some data types list the size, but some have fixed size that can be inferred from the type alone. Most objects are lists, so most of the time, the first element is a 4 byte int specifying the number of elements in the list.
If the type was something simple, like SInt. The payload is just the int data.
If there are any sub-objects, they are serialized the same way: type + payload.
There is an editor in that github link that will let you change those files. If you inject your own types into the game assemblies, you'll be able to serialize them the same way.
In fact, that github contains a little mini-game engine for making turn-based strategy games. If you'd like, you can toss away the whole Zero to Hero thing and make your own game. Have fun!
Fix a crash that only happens when you lose. I didn't find this because I never lose.
Fix a crash that only happens when you lose. I didn't find this because I never lose.

Hello! We're getting really close to early access launch now. Current plan is NEXT WEEK. This update is focused on one of the features of the game that has had the most iteration, but still wasn't up to the quality level I wanted to ship. Now it is! Let's go on a little journey a
Hello!
We're getting really close to early access launch now. Current plan is NEXT WEEK. This update is focused on one of the features of the game that has had the most iteration, but still wasn't up to the quality level I wanted to ship. Now it is!
Let's go on a little journey and talk about these panels. For your reference, they look like this:

Years ago, nearer the beginning of this project, this was a text-rendered proc-gen roguelike. After my first playtest, the player was very confused. He was confused because there was no feedback about what he did, whether anything had happened, etc. To communicate better, I added a temporary little log system where it spits a little bit of text on the screen.
A million tiny iterations later, those bits of text are now comic panels. This update changes those panels in a few ways:
While we're here talking about the panels, let's talk about the rendering a little. The little dots you see are commonly called "Ben Day dots". You may recognize them from the work of Roy Lichtenstein, or his contemporary pop artists. They originated as an artifact of a lithographic printing process called halftone printing.
The basic idea is to chemically etch away parts of a metal plate. You would use a mesh to protect some parts of the metal surface from the etching chemicals. The holes in that mesh (or their negatives) would become the places where paint could attach to the plate, and then get passed along to the print. The higher the density of the dots (or the smaller the gaps in paint), the more intense the color. Mix a few colors of paint together, and you can reach a large number of colors. This is the origin of the cymk color space that printers still often use today.
The rendering in game isn't completely faithful to the time period. For example, colorists would have to choose one of 4 color intensities for each colored section, whereas I've chosen to have a larger array. I've also significantly increased the size of the dots, for style.
I think they look really nice now. Getting this system right has been a surprisingly large part of this project, so I'm really happy I've gotten to this point. But I'm not done yet! More changes to come as I continue to iterate during early access.
Your powers are really important! While most of the build-defining features of your powers will come from upgrades during your run, your initial powers really set the stage. How powerful each upgrade is depends greatly on the context of the game. What your other power is, and wha
Your powers are really important! While most of the build-defining features of your powers will come from upgrades during your run, your initial powers really set the stage. How powerful each upgrade is depends greatly on the context of the game. What your other power is, and what fights do you have in front of you are a huge part of that context.
Let's talk first about what changed in this update, and then I'll finish up with some thoughts about what that means, why I did it, and some ideas for future work.
What changed:
Your first powers will now all be from different characters. Depending on which power you choose, you'll be picking a character for the run, so your sprite will change. Your second power choice will be 2 other powers from that character, and 1 random power from another character.
Why I did that:
The main reason is what I talked about last week. Some skills aren't meant to work together, and others are. This guarantees that 2 of the powers you're offered for the second choice are designed to work together with your first skill.
However, even within an individual character's power set, not all choices are equally difficult. Some powers are designed to be powerful early, and some powers are designed with powerful upgrades in mind. Pick two powers with great upgrades, and you might have trouble saving up enough pellets at the beginning of the game to get to those upgrades. Pick two powers that are great early, and you might find yourself without a way to beat the later bosses.
Additionally, it's important that the game have a lot of variety from run to run. To discourage players from always picking skills in specific pairs, this design doesn't always offer you the powers you want. Since each character will have 5 powers, you have a 50% chance to find a specific power with your second choice. It won't be rare, but you can't depend on it if you want to win a lot.
Tying into this work, I'd like to implement a stamp book in the future where you can see which skill pairs you've won with, and which you've never tried. Take a look at Monster train for a good idea of what I'm thinking. Additionally, I'd like to have achievements for things like: "Get a win streak that includes every power without repeating". That would be a pretty difficult achievement.
Some skills aren't very good together. If you take smelling salts and time skip, you can run circles around anyone, but you have no offensive ability. That's because those powers aren't supposed to work together. They belong to different characters! This is part of a broader meta
Some skills aren't very good together. If you take smelling salts and time skip, you can run circles around anyone, but you have no offensive ability. That's because those powers aren't supposed to work together. They belong to different characters!
This is part of a broader metagame overhaul that lays the groundwork for the difficulty system, a tutorial, and a bunch more content.
The next step is to crank out a bunch more powers. Currently there are 10 in the game, but I want to turn that up to 28 - 7 per character. That way, after you pick your first power, you'll only have a 50% chance of seeing a specific other power from that character.
With this update, 2 new powers are being introduced! Nutmeg and Suplex. Both are 0-cost tactical tools, but with different flavors. Nutmeg is when Cole runs between his opponent's legs, and the upgrades focus on letting Cole escape to accomplish more mischief. Suplex is when Black Eagle slams his opponent over his shoulder, and the upgrades make it do damage and encourage Black Eagle to continue the attack.
Each power has about 10 associated upgrades, so it'll take a few weeks for me to implement all that new content. To stay up to date with the game's development, check out the twitch stream: twitch.tv/vegetablebread

The game has more art now! Previously, characters were represented by single text character, with like... font rendering. Now the game is full of happy little pixel art characters. Even as a person who has played the game a thousand times, and is intimately familiar with all the
The game has more art now! Previously, characters were represented by single text character, with like... font rendering. Now the game is full of happy little pixel art characters.
Even as a person who has played the game a thousand times, and is intimately familiar with all the little details (since I made them), having them represented by art makes them much more appealing.
Gone are the days in playtests when people would ask: "what is that thing". Now they can see that it's a rose bush, or a bear, or a witch.
Here's a sample:

This is just one of the major features I wanted to get done before early access. Next up... Player characters? Head over to twitch.tv/vegetablebread if you want to vote.