I didn’t get nearly as much done as I wanted to this week, and not for lack time spent working, honestly. Just a lot of minor roadblocks, a couple big ones, and way too much time spent figuring out where the problem was. The plus side is these likely won’t trouble me again so much in the future. Plus, I think you’ll find a lot of these are issues that, once solved, permit me to make a more modular system, allowing me to develop faster in the future.
So first up, I’ll talk a bit about something I think more readers will care about: gameplay… at least in regards to what I was talking about this week and last week.
Overworld has a full scale job system. At the start of the game, you begin with one character on your team, Euclid, and he has two jobs available to him: fighter and philosopher (but not mathematician, go figure). In each town of the game, there is an object (as yet unnamed), that I currently just refer to as Build Orbs. These Build Orbs permit you to change jobs whenever you are near them. You can’t change them otherwise.
Each job that each character have levels that stand apart from their own. So Euclid’s character level might be 7, but his fighter level would be 15, and his philosopher level might be 12. Monsters grant you both regular experience and job experience, which is the value used to level jobs.
So what benefit do jobs grant? First and foremost, it alters stats. A philosopher tends to be a little smarter than people who are currently another job. Also, looking at the XML files I posted last week, you can probably see that as a job levels, it bestows special skills upon the character.
You can see that a level 100 fighter earns the powerful Juggernaut Blast. This is a powerful attack that drains a lot of a character’s health, all of their mana, and then deals damage based on the resources lost in addition to a multiplied amount of their usual damage. As the ultimate fighter ability, it is meant to hit like a truck. This is obviously an activated ability, but there are other types. A tad bit above Juggernaut Blast, you can see Muscle V, which just passively increases the character’s strength and constitution.
Here’s the catch with these skills you learn: you don’t benefit from them at all just by learning them. You have to equip them into your limited number of skill slots. The cool part is, however, nothing stops you from equipping them when you are currently another job. Learn Juggernaut Blast as a fighter, equip it, switch to being an archer, and then use it with your bow and arrow from afar, if you so desire. Or learn Muscle, then use the Constitution it grants to survive as a squishier job.
Somewhere around level 80-100, each job also gets a skill that, while capable of being turned on or off, does not occupy a skill slot to have. This is meant to be a major reward for getting so far in that job’s progression. The fighter gets Rapid Recovery at level 99, which heals the character for 1% of their max life per step they take while in a hostile area, greatly reducing the consumption of resources used for survivability.
You may find yourself asking what the point is to being a specific job then, if you can just take the skills you want and run away with them to become another job? Well, there’s a few perks to being loyal to a certain class, as well as few penalties for switching too much.
THE PERKS OF STAYING ONE JOB: At level 2, each job gets a scaling ability. This is there to ensure you are immediately benefiting from playing as this job, and are rewarded for leveling it, even if you don’t get a skill each level or if it’s a skill you don’t want. For instance, Fighter gets Brawn at level 2, which grants an extra point of physical damage per fighter level and one extra percentage of physical damage bonus per 7 fighter levels. However, these scaling abilities have their effects reduced by half if you are not currently their associated job. A philosopher equipped with brawn with get 1 extra physical damage per 2 levels in the fighter class and .5% extra physical damage per 7 levels. All other skills in the game take no penalty for not being equipped on a character of their associated class, but these scaling abilities are meant to be the prime perk of sticking to a core job.
THE DETRIMENTS TO SWITCHING A LOT: It sucks to see a game’s balance ruined by a bad grinding system. One of the first inherit flaws I noticed with Overworld’s was that when you get to later areas in the game, enemies will grant much higher Job Experience than in earlier areas, and so there’s no reason not to just jack up all the jobs you haven’t touched yet and unlock a whole new plethora of skills. To help counteract this, all jobs have the amount of experience required to level increased by 1% per job level the character has gained (with levels taken in philosopher not counted for reasons I’ll explain later). Maxing out one job (100 levels) means all other jobs now double up on their experience required to level. So while the player can switch to low-level jobs in high level areas and get, say, six jobs to level 30, they just upped the amount of experience their primary job will need to hit level 100 by 180%. Ouch. That being said, the player is warned of this penalty from the get-go and is given a full list of every skill offered by every job so they can know what path they want to go down.
So, question: how many skills can you equip? Well, a lot, actually. But the exact number is pending based on several factors. First, how many skills are there? I want characters to be able to equip a fair number of skills, as the whole fun of this system is the “create your own job by combining the pieces of other jobs” idea, but of course, they can’t just equip every one. There are roughly 20 jobs total planned, and I’m trying to scale it so you max out 3 and maybe specialize to a lesser degree in 3-4 others over the course of a single play through the game.
Also to be considered: you don’t start out with every skill slot unlocked. You will begin with somewhere between 5-8. You can unlock another 8-10 by leveling up your character, another 5-7 by upping your character’s Wisdom stat, and another 10 (this number I am sure of) by leveling up the Philosopher job. So depending on how many skills I wind up having and how I feel the game plays, it’ll be somewhere between 28 and 35, with the player potentially earning less depending on how they build themselves (and don’t worry, there are other methods of achieving power for a character besides having a crapload of skill slots).
You may have guessed already, but the Philosopher job is a bit special. Every job specializes in one aspect of gameplay (fighter being physical damage, for instance), and the philpsopher’s specialty is… jobs! The scaling ability they get is the only one in the game that stays the same even if you are not a philosopher and it grants a reduction in the aforementioned required job experience penalty, at a rate of .01% per 4 philosopher levels. Any character with a level 100 philosopher will thus increase the amount of job experience required to level up a job by .75% per job level obtained. A bit confusing, probably, but it’s hard to explain in this pure text format since I’m still just working on it all in .xml files and C# code right now. It’ll make a bit more sense with a GUI, I promise.
The Philosopher job also does not incur or give out the job experience penalty, and every 10 levels earned it in unlocks one new skill slot. It also has its own experience curve, that ends quite a bit higher than other jobs. This is for two reasons. First, to help offset the ease of leveling somewhat, since it doesn’t incur the experience penalty other jobs do. Second, to make it so philosopher, while incredibly useful for everyone to level at least a little bit, isn’t just some absolute required staple class that everyone should max out to beat the game. My goal is to have character’s who aren’t focused on it beat the game with it at about level 50 to 60, and characters who are beat the game with it around level 80-90. Players clearing extra content who grind a bit are the likely candidates for getting it to level 100.
And NOW it’s time for something fun. Here’s some of the classes I have designed so far, as well as some of the abilities they earn that I am most excited about. There are other types of effects based on aspects of the game I have yet to mention, but hopefully these perk some people’s interests.
- Piercing Arrows - 25% of all physical damage you deal to enemies is also dealt to any enemy in front of them.
- Nonretractable Blades - Critical strike damage increased to 225%.
- Focus Fire - Every party member deals 10% extra damage to the last enemy targeted by your physical attacks.
- Beckon - Forcefully begins a random encounter from the area you are currently in. This encounter will grant 3% bonus experience.
- Defensive Strike - Consumes mana to attack and defend at the same time.
- Pride - You cannot die to enemies above 75% life. For every other character in your party with this ability equipped, the amount is increased by 5% (95% if all five party members have it on).
- Afterlife - Chance upon dying to an instant death effect to return to life with the same amount of health and an extra 100 mana.
- Displacement - Enemies are harmed for 5% of any healing effects you perform.
- Ward - Reduces encounter rate for 50 steps
- Static Link - Consumes mana to create a link between you and the target, transferring some of the damage they take to you.
- Overload - Vastly damages all enemies for a percentage of their health plus a flat value, but leaves you unable to act for a short while.
- Flash - Teleport to any town you have previously visited.
- Heat Sink - Increases the damage dealt by your fire spells and ice spells by 10%.
- Weather Mastery - You take no penalty for travelling on the world map in extremely hot or cold environments.
- Frostburn - You can create burn effects on enemies with ice damage now, instead of just fire damage.
- When to Hold ‘Em - The Gambler’s scaling ability earned at level 2. Damage range for all effects is increased by 3 maximum and decreased by 2 minimum per Gambler level. Any inapplicable minimum damage (i.e. trying to go below 1 damage) is instead taken from the maximum damage. If not currently a Gambler, this applies 3 minimum damage per level.
- When to Fold ‘Em - Minimum damage is increased relative to the health you are missing. If you are killed by an enemy instant death effect, you attack three times for your highest possible damage before you die.
- Coin Flip - Consumes mana to either hit for your maximum damage or minimum damage.
So hopefully this gives you a good idea of what the jobs do and gets you a bit excited about combining these abilities. I think you already can see some power to mixing some Gambler and Fighter abilities, for instance.
But the question now is… how do I intend to implement this job and ability system fully? There was a minor preview of it last week, and I spent a lot of time this week agonizing over something that works, and I think I’ve gotten somewhere a bit. Be warned that this is about to talk a whee bit more about coding and other crap. I will try to keep it simple still.
So I had to make a few requirements on how this would all work and design it from there. I’m still keeping the number of abilities and jobs actually existing in code low until I’m sure I won’t wind up adding somewhere later than requires me to change it all. However, I think I’m close. Here’s some of the requirements:
- A job must be capable of giving a player more than 1 skill per job level.
- A skill, upon being learned, must be capable of deleting/overwriting an older version of that skill upon being learned.
- A skill must be capable of doing more than one thing, such as the Gambler’s When to Fold ‘Em skill.
- There should be no limit to the variety of effects skills are capable of performing, with a system in place that even lets me add possible effects later without fucking up code too much.
Do I have something in place that can do this? I think so. Here’s a rough drawing of the structure for this, with each square basically representing either a .xml file or the object class type the .xml file can be converted into.
The red dots represent unique identifiers for an object, the blue dots represent that they are unique identifiers for another object, used to find exactly which one of those objects we’re talking about, and the purple dots indicate a list of objects.
So a character gains a job level, and the XML reader looks up the .xml file for the corresponding job, and looks for any objects of the SkillGain type in its SkillGains list that have a (you guessed it) JobLevelEarned matching the level the character just achieved. A character hits level 2 as a fighter, it looks up the SkillGains and says “Oh, what the shit! Level 2 is when this dumbass is supposed to get Brawn”.
So now it knows it is dealing with the Brawn skill. It looks up Brawn’s .xml file, and first looks for foreign identifiers of skills to overwrite. In Brawn’s case, there is none, but if this were, for instance, Muscle II, it would know to delete that character’s Muscle ability to replace it with this. Next it looks whether or not Brawn is an ability you need to equip (which it is) or one you simple can have active for free, like the aforementioned Rapid Recovery. This information it is going to just remember rather than do anything with since it’s really just building the skill the character is going to gain right now.
Finally it hits a list of foreign identifiers for skill effects. For each one of these it is going to look at its ID and its type. You see, the base object class of SkillEffect can’t really do anything. It is merely there to have a lot of subclasses of it so they can all cleanly go into one list of SkillEffects. The example in the picture is good enough, so I’ll go with that.
One type of subclass I can create is an AlterStatSkillEffect, which will have two values: which stat to alter and how much to alter it by. The previously mentioned skill called Muscle would have two objects of this type in its SkillEffect list (and yes, if you look on the chart, you can see it is a list!): one for its increase to strength, one for its increase to constitution. Know When to Hold ‘Em might have something similar: two effects, with one being for raising max damage and the other being for lowering minimum damage.
You can do more with it. Want to have a Poison Blade move that deals damage and applies a poison effect? Easy enough. Create a ApplyStatusSkillEffect with the fields of which status to apply and the base chance to applyt it. Then create a DealDamageSkillEffect which has a value of how much damage to deal. Create one .xml file for each instance of these that would go in the Poison Blade move, and then apply the reference to these skill effects in the actual skill’s .xml file. Pretty easy, actually. Obviously I’m totally ignoring the actual code logic that has to be applied for telling the system exactly how to handle these effects and the values they entail, but that’s really not so hard due to how structured it all is. I’m very exciting about the power of this system.
Sadly, it took me way too long to get going. I spent a lot of time fucking around with the connection strings to the file paths only to realize that it all depends on whether or not I’m in debug mode. I didn’t want to have to specify whether I was in debug mode every time, so I’m now making an XMLHandler object that should take care of all that for me every time I try to access a .xml file. It’s slowed me down a lot and is very demotivating, but I won’t give up. I’ll be coding my ass off next week too, and hopefully in my next entry, I’ll be able to post a video of me in debug mode simulating a level up that successfully teaches a skill and lists of its effects and crap.
I might also edit this post later to include some sprite art or concept art for the game which is coming along nicely… or to just clean up the types I’m sure have been left abundant. I’ve been writing this for nearly two hours though, now, and I think I’ve imparted enough information about this game for now. Until next week! I truly hope you’ve enjoyed this, at least a little bit.