# Damage Formulas 101

#### Solar_Flare

##### Veteran Code:
``Math.min(5, your formula here)``

#### Oddball

##### Veteran does this work in MZ as well?

• MetalKing11417

#### Solar_Flare

##### Veteran Math.min will work in MZ, at least. It's part of core JavaScript.

#### Oddball

##### Veteran Math.min will work in MZ, at least. It's part of core JavaScript.
I was talking about everything in general

• MetalKing11417

#### MerlinCross

##### Veteran How would I avoid getting a Decimal in my numbers?

Example; I have a skill that cuts TP in half. But it will leave me with say .5 at times. So

a.setTp(a.tp / 2)

Used at 5 TP will make the user's TP, 2.5. I'd like to avoid that but how?

#### MetalKing11417

##### Veteran How would I avoid getting a Decimal in my numbers?

Example; I have a skill that cuts TP in half. But it will leave me with say .5 at times. So

a.setTp(a.tp / 2)

Used at 5 TP will make the user's TP, 2.5. I'd like to avoid that but how?
Are you talking about within the formula or once the formula has ended? Because after the formula is finished, the system automatically rounds the result, because items like HP and TP only accept integers.

#### MerlinCross

##### Veteran Are you talking about within the formula or once the formula has ended? Because after the formula is finished, the system automatically rounds the result, because items like HP and TP only accept integers.

Guard Skill
Formula: a.setTp(a.tp / 2)

This should cut TP in half. What happens when it's left over as a Decimal? Well I don't know what the fix is but would like to as I get this. Not sure what would happen if I tried it for HP as well. #### Soulrender @MerlinCross
Math.floor( a.setTp(a.tp / 2) ) but preferable way is

Math.floor( a.setTp(a.tp * 0.5) )

#### MerlinCross

##### Veteran @MerlinCross
Math.floor( a.setTp(a.tp / 2) ) but preferable way is

Math.floor( a.setTp(a.tp * 0.5) )

No that still doesn't seem to work. And it's not a plugin problem before people suggest that, I'm trying this with an empty new project.

#### Soulrender Aaahhh now I see where is error:

a.gainTp(Math.floor( a.maxTp()*0.5) )

#### MerlinCross

##### Veteran Aaahhh now I see where is error:

a.gainTp(Math.floor( a.maxTp()*0.5) )

And now I just gain a flat 50.

I'm just gonna deal with Decimal being there for this little demo idea thing. Hopefully shouldn't break the game.

#### Solar_Flare

##### Veteran Try `a.setTp(Math.floor(a.tp / 2))`, or maybe `a.gainTp(-Math.floor(a.tp / 2))`.

#### Titanor

##### Veteran ok so I have done something wrong with my formula and I have no idea what,
my formula is (a.atk * 4 * (Math.floor (Math.random() * v ) + 1)) - (b.def * 2),
but I know for a fact it is not working because on the test enemy it is giving a solid 50 to 60 each time with actor attack being 18 and enemy defense 25 with the dice variable (v) being at 48, now it should be randomized with the maths between 22 and 3406 but it is not, does anyone know what is going on here.

ps. the dice variable is controlled by a custom armor slot with different types of dice and in this example, I am using a pair of 24 sided dice and I know that function works.

edit. ok, I am an idiot, I did not realize there was an error in my code the several times I looked at it. Last edited:

#### Andyest

##### Villager I was wondering how I could get a weapon that completely ignores the user's physical/magical attack stat when dealing damage (like a gun for instance), as well as a skill that lets the user deal damage while ignoring the enemy's physical/magical defense (think Luna Λ from Fire Emblem: Three Houses).

I will give a little simplified explanation, but...

Being "i" the weapon ('cause you can use 2):

JavaScript:
``````for (j=0; j<a.weapons()[i].traits.length; j++){
if (a.weapons()[i].traits[j].code == 31){
if (a.weapons()[i].traits[j].dataId == 1){ /*DO THINGS HERE */ }; //Element Physical
if (a.weapons()[i].traits[j].dataId == 2){ /*DO THINGS HERE */ }; //Element Earth
if (a.weapons()[i].traits[j].dataId == 3){ /*DO THINGS HERE */ }; //Element Ranged
};
};``````

Hope it helps someone.

#### Frostorm

##### []D[][]V[][]D aka "Staf00" Are there any good programs/tools for visualizing a 3 variable function? (i.e. ATK, AGI, & LVL)

• LTB-Dude

#### Frostorm

##### []D[][]V[][]D aka "Staf00" So I've been thinking about changing my base damage formula that I would base most physical skills on. I currently use this simple formula: `(a.atk + a.atk + a.agi) * n` where "n" would be a coefficient that varies depending on the skill in question (e.g. normal attack might use n = 0.5). Oh, and these formulas won't contain any defensive modifiers since mitigation will be handle by Yanfly's ArmorScaling plugin. Anyway, my goal overall is to create a formula that is mostly affected by ATK but also minorly/secondarily affected by AGI. So here's a couple I'm considering:
• `a.atk ** 2 / a.level + a.agi`
• `a.atk * a.agi / a.level + a.atk`
• `Math.sqrt(a.atk * a.agi) + a.atk`
• `Math.cbrt(a.atk ** 2 * a.agi)`
• `Math.cbrt(a.atk ** 2 * a.agi) + a.level`
• `Math.cbrt(a.atk ** 2 * a.agi) + a.atk`
• `a.atk * (a.atk + a.agi) / a.level`
What are your guys' thoughts on these potential formulas? Should I stick w/ what I'm currently using or switch to one of these? I'm kind of leaning towards the formula in the last bullet point. Keep in mind, I can wrap the entire formula in parenthesis to add a coefficient to scale for various skills.

Edit: Maybe this one?
`Math.cbrt(a.atk ** 2 * a.agi) + (a.atk + a.agi / 2)`

Here's what I want from my formulas...
• ATK & AGI synergy (i.e. greater effect if both ATK/AGI are high)
• ATK should contribute the majority of dmg, AGI a minor boost
• Bonus if we can get a Sigmoid function going lol
Update: Ok, I finally settled on a formula... `(a.atk * a.agi) / (a.atk + a.level) + a.atk`
It checks all the boxes for me, making sure that Strength contributes more damage than Dexterity while also including an instance of `a.atk*a.agi` somewhere for some synergistic oomph.

Last edited:
• LTB-Dude

#### Solar_Flare

##### Veteran • `a.atk^2 / a.level + a.agi`
• `Math.cbrt(a.atk^2 * a.agi)`
• `Math.cbrt(a.atk^2 * a.agi) + a.level`
• `Math.cbrt(a.atk^2 * a.agi) + a.atk`

Edit: Maybe this one? `Math.cbrt(a.atk^2 * a.agi) + (a.atk + a.agi / 2)`
I realize you didn't end up going with any of these formulas, but in case someone else sees this, I feel I have to point out that they don't do what you probably think they do. The error you seem to have made is that `^2` does not means "squared". It is valid JavaScript, but what it means is probably not useful for damage calculations (it performs what's called a "bitwise xor" of the attack value with the value 2).

If you want to square the attack value, you need to write `Math.pow(a.atk, 2)` or `a.atk ** 2`.

#### Frostorm

##### []D[][]V[][]D aka "Staf00" I realize you didn't end up going with any of these formulas, but in case someone else sees this, I feel I have to point out that they don't do what you probably think they do. The error you seem to have made is that `^2` does not means "squared". It is valid JavaScript, but what it means is probably not useful for damage calculations (it performs what's called a "bitwise xor" of the attack value with the value 2).

If you want to square the attack value, you need to write `Math.pow(a.atk, 2)` or `a.atk ** 2`.
Yea I was writing that in mathematical/Excel notation, not javascript. Trust me, I didn't copy-paste that into the formula box lol. I just had Excel open w/ all the potential formulas I was considering, so I used that (then I just tacked on "Math."). In my database, it shows as `a.atk ** (1 + a.agi / 1000)`. I assumed people were smart enough to tell the difference lol. I fixed it in case someone came along and tried to copy-paste.

• LTB-Dude

#### Gorgutz777

##### Warper Until now, one of the damage formulas I've been using is something like this:
a.atk * 1 * (a.isStateAffected(10) ? 2 : 1)
so as long as the character is affected by that state, the skill will double its damage. Now I've been wondering if there is a way to make a damage formula that checks for multiple states instead of one. Basically, what i'm trying to figure it out is one of the following (or both if possible).

1) Check if the character/target has one of two possible state, and if it does, then increase damage. For example, if a character is afflicted with poison OR blind then the skill does double damage (not stacking)

2) Similar to the previous one, but in this case, the damage will be boosted for each state. For example, if the character is afflicted with poison, increase the damage +20% (or whatever value). Then, if it's also affected by blind, increase another 20%. If it's also affected by silence, another 20% and... etc.

• LTB-Dude

#### Frostorm

##### []D[][]V[][]D aka "Staf00" It would look something like this:
`a.atk * 1 * (a.isStateAffected(10) || a.isStateAffected(11) ? 2 : 1)`

• LTB-Dude

### Latest Profile Posts

To be released 2021/10/21
Now that I made this "What the MZ RTP is missing" spreadsheet it's itching me to fill some the gaps D:
Aaaaand I completely forgot about the RMMV Chicken Rave my brother decided to implement in a parody of my VERY FIRST UNFINISHED project. We could not escape the chicken rave... The chickens would block the ladder...
I love how I can look up a problem I'm having with my game, find a post from like six years ago that addresses the issue, and the solution provided still works in RPG Maker.
It's times like those that my life feels really easy XD
Change costumes with equipment！