Project: Replicating D&D 5e Systems in MV

Discussion in 'General Discussion' started by Dirge, May 12, 2018.

Thread Status:
Not open for further replies.
  1. Dirge

    Dirge Sound Engineer Veteran

    Likes Received:
    First Language:
    English, German
    Primarily Uses:
    Hi everyone!

    I decided it would be fun to take my D&D group's adventures and turn them into an MV game, just for our own amusement. But being the person I am, I wanted it to feel and function as close to 5e as possible. That meant scrapping pretty much everything about how stats and combat and whatnot are handled and replacing them. Yay!

    I also have minimal coding knowledge, certainly not enough to be able to pull off an actual plugin. YAY!

    This thread is gonna be a journal/discussion about how this is going.

    Plugins Used So Far:
    - ICFSoft core engine, Params Core and Status Menu
    - Yanfly stuff (particularly Hit Accuracy and AutoPassiveStates) (note: not Equip Core or Status Menu Core, as they override ICFSoft's Status Menu plugin)
    - HimeWorks Equip Slots Core

    Stage 1: Core Concepts and Stats

    So the basic way 5e functions is that a character has six main stats: Strength, Dexterity, Constitution, Intelligence, Wisdom and Charisma. In D&D, these are represented by scores from 1 to 20 (well, 24 if you wanna get technical, but 20 is the highest a mortal can achieve without using wish magic....but I digress). However, those scores themselves have nearly no impact on the game - rather, they're used to calculate an ability bonus. Which goes up to +5. (Basically the math is the ability score -10 then halved, rounded down).

    In the interest of simplifying it at least a little, I scrapped scores and just am working purely with modifiers. So rather than, say a Strength of 16 with a bonus of +3, a character would just have Strength Bonus of 3.

    Clearly, I need new parameters. The sheer stat-heaviness of the system means we can't use the base parameters in MV. Oh well, I never liked Luck anyway...

    So! I grabbed ICFSoft's Core Engine, Params Core and Status Menu (whee, saves tons of work later!). And I've created a whack of parameters in it! Note that we're setting the "Base" for each of these parameters as "0 0" as we don't want it to grow organically by level - we'll be handling it all manually.

    Base Stats:
    str - Strength Bonus
    dex - Dexterity Bonus
    con - Constitution Bonus
    int - Intelligence Bonus
    wis - Wisdom Bonus
    cha - Charisma Bonus
    Save Bonuses:
    strs - Strength Save
    dexs - Dexterity Save
    cons - Constitution Save
    ints - Intelligence Save
    wiss - Wisdom Save
    chas - Charisma Save
    Misc other modifiers:
    prof - Proficiency Bonus
    ini - Initiative Bonus
    ac - Armour Class
    inib - Misc initiative modifier
    Item Parameters:
    wdmg - Max Weapon Damage
    wmin - Min Weapon Damage
    armr - Armour Bonus

    AWESOME. That looks great. Now we just gotta do something with it.

    But we'll get back to that. First, we need to consider what else is crucial to a character's stats that we're missing...


    Ooookay. So at this point, it's worth noting that I'm not building a custom D&D character builder thingy in MV (though this could well form a basis for one at some point, that's a tad beyond my capability). The characters exist already. I'm literally copying their stats over from their sheets, which I confiscated from my players for this purpose. As for HP, well...

    Each class in D&D gets a certain type of die they get to roll every level beyond first for more max HP (plus their Con modifier). (First is always maxed out because the devs finally took mercy on uber-squishy-anyway casters...). This ranges from d6 (six-sided die) for most casters, to d10 (10-sided die) for martial fightery-dudes.. and barbarians get d12s but since we don't have one in our campaign, that's neither here nor there. (My shirtless barbarian Ivor the Relentless may make an appearance at some point, polishing his armour...well, oiling his pecs, anyway...)

    A second option, instead of rolling the die each level, is to take average-plus-one and add the con modifier. So for a d8, it's 5+Con mod. So... I just took the average for every single level and manually plugged that in to the classes. We don't need to do crazy parameter stuff for everything.

    Stage 2: Secondary Stats and Saves

    The eagle-eyed, razor-minded reader will have noticed that my parameter list in the previous section had more than just base stats. Indeed, we have other things to tinker with. Let us examine them.

    The first and foremost important secondary stat is the proficiency bonus. This is a flat bonus that increases by 1 every four character levels, and it is applied to pretty much any check/roll on something the character is proficient in - for example, an attack using a weapon they are proficient with. This will be incremented as the characters level up - in my D&D game, this happens at milestone points rather than using EXP calculations, so EXP is not a factor in this project. Levelling will be triggered manually with events. Could go either way with it though.

    Things that happen to a character in combat can basically be boiled down to two things: either they're getting attacked, in which case the enemy is rolling an attack roll (accuracy check) against their Armour Class, or they're being subjected to a direct effect, in which case the enemy is not rolling anything. Rather, it's up to the character to resist it/dodge out of the way/whatever. The former case, we'll look at in a minute. The latter is called a save, and there are six types of these, each associated with one of the main stats. Which save gets used is determined by the effect - for example, the fireball spell lets everyone in the area made a dex save with a particular threshold, and if they roll above that threshold, they get out of the way quick enough to only take half damage. Another example might be a poison - if a character gets poisoned, their body needs to resist it, which entails a constitution save. You get the point.

    Each character class is better at particular types of saves - for example, rogues are extra good at dex saves - and this is reflected in their proficiencies. Each class gets to add its proficiency modifier to a couple saves.

    So, the formula for a save is simple:
    ability modifier + proficiency (if applicable)
    Right, okay, seems simple. But how can we tell if a character has proficiency in a thing? It's not like in D&D where you just color in a little dot on the paper.

    Yanfly to the rescue (as usual, really)! Grab AutoPassiveStates and now create a dummy state for each proficiency. "StrSaveProf" "DexSaveProf" and so on.

    Now, go over to your classes and tag them with the appropriate proficiency states (referencing the Players Handbook or whatever source material you're using).

    Here's where we start gettin' a little fancier. In our "saves" parameters (strs, dexs and so on), we will put the following in the Base Eval field:
    this.str + (this.isStateAffected(12) ? : 0)
    For me, StrSaveProf is state number 12 in my database. This eval is exactly the formula we get from the sourcebook, just in MV-speak.

    Replicate that across all the Save parameters, changing the attribute and state as appropriate, and voila, your saves now auto-eval themselves.

    Ooooookay! Cool! This is definitely getting theory. Now, what about when we want to hit things with sharp objects until they give us their loot?!

    Combat stats! Okay, we have a few important things here:
    - Attack Bonus (accuracy check)
    - Armor Class (threshold for that accuracy check)
    - Initiative (turn order)
    - Damage

    A melee attack in D&D looks like this:
    Character A wants to hit Character B with a sword. We're not sure why. Maybe he insulted their parentage.
    Character A rolls a d20 (20-sided die), and adds their sword's Attack Bonus to the results.
    If the total equals or surpasses Character B's Armor Class value, the attack hits. If not, Character A needs to make better choices.
    On a hit, Character A rolls the damage die given by his sword (let's say a longsword, so 1d8) and adds his Strength modifier to that (some melee weapons can use Dexterity for attacks instead of Strength, ranged weapons always do).

    An Attack Bonus is calculated by:
    Appropriate ability modifier (str for melee weapons, dex for ranged/finesse-able melee) + proficiency (if proficient).

    Here, for the first time, we're gonna use a couple default parameters. Atk and Mat.

    For our purposes, Atk can be defined as "the ability modifier this character uses for weapon attacks"
    And Mat can be defined as "the ability modifier this character uses for magic attacks".

    Here, we'll pull up Yanfly's Hit Accuracy plugin and craft our attack stuff in there.
    Accuracy Formula: skillHitRate * (((Math.randomInt(20)+1) + userHitRate + 1) - targetEvadeRate)
    Evade Formula: 0
    User Physical Hit: + user.atk
    User Magical Hit: + user.mat
    User Certain Hit: 1.00
    Target Physical Evade:
    Target Magical Evade:
    Target Certain Evade: 0.00
    Again, each class's atk and mat have been predefined in the database level by level (and will continue to do so to reflect the real-world game's stat changes, currently they're only level 4...level 5 on Monday if they don't die to their current boss battle...)

    Okay, so there we have accurately modeled D&D's attack system. The extra +1 in the accuracy formula is because without it, having an attack roll equal to the target's AC would be a miss, so we're just bumping it up by 1 to offset that.

    We haven't defined AC yet, though. The formula for AC in D&D is:
    Equipped Armour Bonus + Shield Bonus (if applicable) + Dexterity Bonus (up to armour's allowed cap)
    Armour in D&D has a maximum amount of Dex you're allowed to add to your total AC, to replicate how much particular armour restricts your movement. We're dropping that entirely for this adaptation.

    Worth noting, also, that unarmored AC in D&D is 10 + Dex mod. This is also gonna be reflected in our system, just in case that becomes a thing we need in the future.

    Head on over to our ac parameter and add this as the base eval:
    this.armr + this.dex + 10
    Now, in the database, for each armour, add its listed armour score minus 10 (because we've taken that into consideration in the formula already). Using notetags like so:
    <NPARAM: armr 4>
    This would be for Chainmail for example, which has a listed armour score of 14 + Dex (max 2).

    Ooookay, the one thing that's missing from being able to successfully wallop beasties with weapons is damage!

    Every weapon has a listed damage die/dice. For your weapons, let's say a Greataxe (which has 1d12 damage), calculate out how much damage that is. Hint: the first number is the minimum, and the first times the second is the maximum). So 1d12 is 1 to 12 damage, and 2d6 is 2 to 12 damage. Add these notetags to the weapon:
    <NPARAM: wmin 1>
    <NPARAM: wdmg 12>
    Now, mosey on over to your skills. We're defining two different types of basic attack: a melee attack and a ranged attack. These will only be different in the action sequences used (i.e. running up and hitting versus standing back and firing an arrow).

    Here's our damage formula:
    a.atk + Math.randomInt(a.wdmg)+a.wmin
    Make sure crit is set to yes and variance is 0. The variance is already built in.

    Speaking of crits - make sure each of your classes has the Critical Rate Ex-Param at 5%. In D&D, you crit when you roll a 20 - i.e. a 5% chance.

    Whoooh. We're well on our way to getting this ironed out. There's some major stuff we haven't touched on yet though - initiative and spells come to mind. Initiative is simple. Spells ... not so bloody much.

    Initiative is easy enough. It's a character's Dex plus whatever misc modifier they might have.
    this.dex + this.inib
    Now, one thing we need to do here is to change the system to determine turn order based on Initiative instead of Agility. I'll be coming back to that, I'm still working on this bit.

    For now, what I've done is in Yanfly's Battle Engine Core, I've set the action speed formula to agi + (Math.randomInt(20)+1), and have set everyone's Agi to their Ini scores manually, so the effect is the same.

    Tune in next time for.......Spells! OH BOY THIS WILL BE FUN. We'll be replicating the D&D spells-per-day system using variables, skill show conditions, SRD's skill extender plugin, and more.
    Last edited: May 12, 2018
  2. Kes

    Kes Global Moderators Global Mod

    Likes Received:
    First Language:
    Primarily Uses:
    Sorry, but 'General Discussion' cannot be used as a development journal. It is not for individual projects, but for examing broad themes that relate to game making.

    I suggest you start a game thread - either in 'Ideas and Prototypes' or, if you have enough material, in 'Games in Development'.

    As this thread cannot be moved, I am closing it.

Thread Status:
Not open for further replies.

Share This Page