And after detouring to see if I could extract the music (I got stuck in the 'convert .hca to a real file format' step), I come back to this.
Damage.
damage for this card = [servantAtk * npDamageMultiplier * (firstCardBonus + (cardDamageValue * (1 + cardMod))) * classAtkBonus * triangleModifier * attributeModifier * randomModifier * 0.23 * (1 + atkMod - defMod) * criticalModifier * extraCardModifier * {1 + powerMod + selfDamageMod + (critDamageMod * isCrit) + (npDamageMod * isNP)} * {1 + (traitModifier * hasSuperEffectiveTrait) + (statusTraitModifier * hasSuperEffectiveStatus)}] + dmgPlusAdd + selfDmgCutAdd + (servantAtk * busterChainMod)
FROM YOUR SERVANT
* servantAtk = {Your servant's current Atk value}
* classAtkBonus = {
class bonus}
* triangleModifier = {
triangle bonus}
* attributeModifier = {
attribute bonus}
FROM CARDS (None of these apply if it's an NP card)
* firstCardBonus = {0.5 if first card is a Buster card, 0 otherwise}
* cardDamageValue = {1 if Arts, 0.8 if Quick, 1.5 if Buster} * {1 if first, 1.2 if second, 1.4 if third}
** cardDamageValue for Extra card is 1
* busterChainMod = {0.2 if it's a Buster Chain, 0 otherwise}
* extraCardModifier = {2 if Extra card in a Brave Chain, 3.5 if Extra card in a Buster/Quick/Arts Brave Chain, 1 if neither}
FROM RNG
* randomModifier = {random from 0.9 to 1.1}
* criticalModifier = {2 if crit, 1 if not}
FROM NP PROPERTIES (I'll document these later)
* npDamageMultiplier = {NP's damage multiplier (or 1 if it's not an NP)}
* traitModifier = {NP super effective modifier}
* statusTraitModifier = {NP super effective modifier}
* hasSuperEffectiveTrait = {1 if the enemy has a trait the NP aims for, 0 otherwise}
* hasSuperEffectiveStatus = {1 if the enemy has a buff with a trait the NP aims for, 0 otherwise}
FROM BUFFS
* cardMod = {+-X% [Card] Power ([Card] Up & [Card] Up <Attack>)}
* atkMod = {+-X% Attack (Attack Up)}
* defMod = {+-X% Defense (Defense Up, Defense Up [Anti-X])}
* powerMod = {+-X% Power (Power Up, Power Up [Anti-X])}
* selfDamageMod = {No buff currently uses this. It's like Power Up but on the enemy's side.}
* isCrit = {1 if crit, 0 otherwise}
* critDamageMod = {+-X% Critical Power (Critical Power Up)}
* isNP = {1 if NP attack, 0 otherwise}
* npDamageMod = {+-X% NP Power (NP Power Up)}
* dmgPlusAdd = {+-X Extra Damage (Damage Plus, Damage Minus)} // Note the lack of %
* selfDmgCutAdd = {-+X Damage Taken (Damage Cut, Damage Up)} // Lack of % as well
Remember, 10% = 0.1.
* Oddly, I can't find any logic wrt NPs that are supposed to ignore defense.
It'd be great if people could test out NPs that ignore Def vs Nps that don't and see if it actually works. This might be worth bug-reporting to DW. (Japanese players I know you've been reading my blog. Please help too) (FYI: Excalibur/Caliburn/Romulus and UBW/Bathory have the same power. Compare their NPs (with Atk as close to each other as possible) against an enemy with a def buff and neutral in the attribute and triangle charts. Other options are Excalibur Morgan vs Nero NP and God Force vs Nine Lives)
** Or just compare UBW/Bathory/God Force/Laus St. Claudios with and without Def buffs.
* You'll note Attack and Defense buffs are direct and opposite buffs. +10% attack is straight +10% damage and +10% def is -10% damage.
* Just so you know: Balmung, Enuma Elish, Phantom Iron Maiden and Eye of Euryale are super-effective against specific traits. (Dragon, Servant, Female, Male).
* Yew Bow is super effective against enemies with the Poison status.
* [Anti-X] buffs will obviously only count if they match you/the enemy. So Power Up [Anti-Dragon] only works if you're hitting an enemy with the Dragon trait and so on.
* Minimum damage is 1 lol.