mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-08-27 17:59:28 +02:00
something
I don't remember what these updates contain anymore
This commit is contained in:
parent
94ad9d2ba2
commit
bdef9ece22
@ -3999,6 +3999,88 @@ function applyAbAttrsInternal<TAttr extends AbAttr>(attrType: Constructor<TAttr>
|
|||||||
applyNextAbAttr();
|
applyNextAbAttr();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
function applyAbAttrsInternalNoApply<TAttr extends AbAttr>(attrType: Constructor<TAttr>,
|
||||||
|
pokemon: Pokemon, applyFunc: AbAttrApplyFunc<TAttr>, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise<void> {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
if (!pokemon.canApplyAbility(passive)) {
|
||||||
|
if (!passive) {
|
||||||
|
args[0].value = 0
|
||||||
|
return resolve();
|
||||||
|
return applyAbAttrsInternal(attrType, pokemon, applyFunc, args, isAsync, showAbilityInstant, quiet, true).then(() => resolve());
|
||||||
|
} else {
|
||||||
|
return resolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const ability = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility());
|
||||||
|
const attrs = ability.getAttrs(attrType);
|
||||||
|
|
||||||
|
const clearSpliceQueueAndResolve = () => {
|
||||||
|
pokemon.scene?.clearPhaseQueueSplice();
|
||||||
|
if (!passive) {
|
||||||
|
args[0].value = 0
|
||||||
|
return resolve()
|
||||||
|
return applyAbAttrsInternal(attrType, pokemon, applyFunc, args, isAsync, showAbilityInstant, quiet, true).then(() => resolve());
|
||||||
|
} else {
|
||||||
|
return resolve();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return resolve();
|
||||||
|
const applyNextAbAttr = () => {
|
||||||
|
if (attrs.length) {
|
||||||
|
applyAbAttr(attrs.shift());
|
||||||
|
} else {
|
||||||
|
clearSpliceQueueAndResolve();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const applyAbAttr = (attr: TAttr) => {
|
||||||
|
if (!canApplyAttr(pokemon, attr)) {
|
||||||
|
return applyNextAbAttr();
|
||||||
|
}
|
||||||
|
pokemon.scene.setPhaseQueueSplice();
|
||||||
|
const onApplySuccess = () => {
|
||||||
|
if (pokemon.summonData && !pokemon.summonData.abilitiesApplied.includes(ability.id)) {
|
||||||
|
pokemon.summonData.abilitiesApplied.push(ability.id);
|
||||||
|
}
|
||||||
|
if (pokemon.battleData && !pokemon.battleData.abilitiesApplied.includes(ability.id)) {
|
||||||
|
pokemon.battleData.abilitiesApplied.push(ability.id);
|
||||||
|
}
|
||||||
|
if (attr.showAbility && !quiet) {
|
||||||
|
if (showAbilityInstant) {
|
||||||
|
pokemon.scene.abilityBar.showAbility(pokemon, passive);
|
||||||
|
} else {
|
||||||
|
queueShowAbility(pokemon, passive);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!quiet) {
|
||||||
|
const message = attr.getTriggerMessage(pokemon, (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name, args);
|
||||||
|
if (message) {
|
||||||
|
if (isAsync) {
|
||||||
|
pokemon.scene.ui.showText(message, null, () => pokemon.scene.ui.showText(null, 0), null, true);
|
||||||
|
} else {
|
||||||
|
pokemon.scene.queueMessage(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const result = applyFunc(attr, passive);
|
||||||
|
if (result instanceof Promise) {
|
||||||
|
result.then(success => {
|
||||||
|
if (success) {
|
||||||
|
onApplySuccess();
|
||||||
|
}
|
||||||
|
applyNextAbAttr();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
if (result) {
|
||||||
|
onApplySuccess();
|
||||||
|
}
|
||||||
|
applyNextAbAttr();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
applyNextAbAttr();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export function applyAbAttrs(attrType: Constructor<AbAttr>, pokemon: Pokemon, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> {
|
export function applyAbAttrs(attrType: Constructor<AbAttr>, pokemon: Pokemon, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> {
|
||||||
return applyAbAttrsInternal<AbAttr>(attrType, pokemon, (attr, passive) => attr.apply(pokemon, passive, cancelled, args), args);
|
return applyAbAttrsInternal<AbAttr>(attrType, pokemon, (attr, passive) => attr.apply(pokemon, passive, cancelled, args), args);
|
||||||
@ -4014,6 +4096,11 @@ export function applyPreDefendAbAttrs(attrType: Constructor<PreDefendAbAttr>,
|
|||||||
const simulated = args.length > 1 && args[1];
|
const simulated = args.length > 1 && args[1];
|
||||||
return applyAbAttrsInternal<PreDefendAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, attacker, move, cancelled, args), args, false, false, simulated);
|
return applyAbAttrsInternal<PreDefendAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, attacker, move, cancelled, args), args, false, false, simulated);
|
||||||
}
|
}
|
||||||
|
export function applyPreDefendAbAttrsNoApply(attrType: Constructor<PreDefendAbAttr>,
|
||||||
|
pokemon: Pokemon, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, ...args: any[]): Promise<void> {
|
||||||
|
const simulated = args.length > 1 && args[1];
|
||||||
|
return applyAbAttrsInternalNoApply<PreDefendAbAttr>(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, attacker, move, cancelled, args), args, false, false, simulated);
|
||||||
|
}
|
||||||
|
|
||||||
export function applyPostDefendAbAttrs(attrType: Constructor<PostDefendAbAttr>,
|
export function applyPostDefendAbAttrs(attrType: Constructor<PostDefendAbAttr>,
|
||||||
pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult, ...args: any[]): Promise<void> {
|
pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult, ...args: any[]): Promise<void> {
|
||||||
|
@ -1590,7 +1590,7 @@ export class IncrementMovePriorityAttr extends MoveAttr {
|
|||||||
* @see {@linkcode apply}
|
* @see {@linkcode apply}
|
||||||
*/
|
*/
|
||||||
export class MultiHitAttr extends MoveAttr {
|
export class MultiHitAttr extends MoveAttr {
|
||||||
private multiHitType: MultiHitType;
|
public multiHitType: MultiHitType;
|
||||||
|
|
||||||
constructor(multiHitType?: MultiHitType) {
|
constructor(multiHitType?: MultiHitType) {
|
||||||
super();
|
super();
|
||||||
|
@ -2994,6 +2994,8 @@ export class TurnStartPhase extends FieldPhase {
|
|||||||
this.scene.pushPhase(new BerryPhase(this.scene));
|
this.scene.pushPhase(new BerryPhase(this.scene));
|
||||||
this.scene.pushPhase(new TurnEndPhase(this.scene));
|
this.scene.pushPhase(new TurnEndPhase(this.scene));
|
||||||
|
|
||||||
|
this.scene.arenaFlyout.updateFieldText()
|
||||||
|
|
||||||
this.end();
|
this.end();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ import { Stat } from "#app/data/pokemon-stat.js";
|
|||||||
import { Abilities } from "#app/enums/abilities.js";
|
import { Abilities } from "#app/enums/abilities.js";
|
||||||
import { WeatherType } from "#app/data/weather.js";
|
import { WeatherType } from "#app/data/weather.js";
|
||||||
import { Moves } from "#app/enums/moves.js";
|
import { Moves } from "#app/enums/moves.js";
|
||||||
import { AddSecondStrikeAbAttr, AllyMoveCategoryPowerBoostAbAttr, AlwaysHitAbAttr, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, ConditionalCritAbAttr, DamageBoostAbAttr, FieldMoveTypePowerBoostAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentEvasionAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, MultCritAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, StabBoostAbAttr, TypeImmunityAbAttr, UserFieldMoveTypePowerBoostAbAttr, VariableMovePowerAbAttr, WonderSkinAbAttr } from "#app/data/ability.js";
|
import { AddSecondStrikeAbAttr, AllyMoveCategoryPowerBoostAbAttr, AlwaysHitAbAttr, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreDefendAbAttrsNoApply, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, ConditionalCritAbAttr, DamageBoostAbAttr, FieldMoveTypePowerBoostAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentEvasionAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, MultCritAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, StabBoostAbAttr, TypeImmunityAbAttr, UserFieldMoveTypePowerBoostAbAttr, VariableMovePowerAbAttr, WonderSkinAbAttr } from "#app/data/ability.js";
|
||||||
import { ArenaTagType } from "#app/enums/arena-tag-type.js";
|
import { ArenaTagType } from "#app/enums/arena-tag-type.js";
|
||||||
import { ArenaTagSide, WeakenMoveScreenTag, WeakenMoveTypeTag } from "#app/data/arena-tag.js";
|
import { ArenaTagSide, WeakenMoveScreenTag, WeakenMoveTypeTag } from "#app/data/arena-tag.js";
|
||||||
import { BattlerTagLapseType, HelpingHandTag, SemiInvulnerableTag, TypeBoostTag } from "#app/data/battler-tags.js";
|
import { BattlerTagLapseType, HelpingHandTag, SemiInvulnerableTag, TypeBoostTag } from "#app/data/battler-tags.js";
|
||||||
@ -236,7 +236,10 @@ export default class FightUiHandler extends UiHandler {
|
|||||||
power.value *= typeChangeMovePowerMultiplier.value;
|
power.value *= typeChangeMovePowerMultiplier.value;
|
||||||
|
|
||||||
if (!typeless) {
|
if (!typeless) {
|
||||||
applyPreDefendAbAttrs(TypeImmunityAbAttr, user, target, move, cancelled, typeMultiplier);
|
if (target.hasAbilityWithAttr(TypeImmunityAbAttr)) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
applyPreDefendAbAttrsNoApply(TypeImmunityAbAttr, user, target, move, cancelled, typeMultiplier);
|
||||||
MoveData.applyMoveAttrs(MoveData.NeutralDamageAgainstFlyingTypeMultiplierAttr, user, target, move, typeMultiplier);
|
MoveData.applyMoveAttrs(MoveData.NeutralDamageAgainstFlyingTypeMultiplierAttr, user, target, move, typeMultiplier);
|
||||||
}
|
}
|
||||||
if (!cancelled.value) {
|
if (!cancelled.value) {
|
||||||
@ -404,8 +407,8 @@ export default class FightUiHandler extends UiHandler {
|
|||||||
applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, user, target, move, cancelled, damage1);
|
applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, user, target, move, cancelled, damage1);
|
||||||
applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, user, target, move, cancelled, damage2);
|
applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, user, target, move, cancelled, damage2);
|
||||||
|
|
||||||
console.log("damage (min)", damage1.value, move.name, power.value, sourceAtk, targetDef);
|
//console.log("damage (min)", damage1.value, move.name, power.value, sourceAtk, targetDef);
|
||||||
console.log("damage (max)", damage2.value, move.name, power.value, sourceAtkCrit, targetDefCrit);
|
//console.log("damage (max)", damage2.value, move.name, power.value, sourceAtkCrit, targetDefCrit);
|
||||||
|
|
||||||
// In case of fatal damage, this tag would have gotten cleared before we could lapse it.
|
// In case of fatal damage, this tag would have gotten cleared before we could lapse it.
|
||||||
const destinyTag = target.getTag(BattlerTagType.DESTINY_BOND);
|
const destinyTag = target.getTag(BattlerTagType.DESTINY_BOND);
|
||||||
@ -425,7 +428,7 @@ export default class FightUiHandler extends UiHandler {
|
|||||||
break;
|
break;
|
||||||
case MoveData.MoveCategory.STATUS:
|
case MoveData.MoveCategory.STATUS:
|
||||||
if (!typeless) {
|
if (!typeless) {
|
||||||
applyPreDefendAbAttrs(TypeImmunityAbAttr, target, user, move, cancelled, typeMultiplier);
|
applyPreDefendAbAttrsNoApply(TypeImmunityAbAttr, target, user, move, cancelled, typeMultiplier);
|
||||||
}
|
}
|
||||||
if (!cancelled.value) {
|
if (!cancelled.value) {
|
||||||
applyPreDefendAbAttrs(MoveImmunityAbAttr, target, user, move, cancelled, typeMultiplier);
|
applyPreDefendAbAttrs(MoveImmunityAbAttr, target, user, move, cancelled, typeMultiplier);
|
||||||
@ -631,8 +634,35 @@ export default class FightUiHandler extends UiHandler {
|
|||||||
// dmgLow = (((2*user.level/5 + 2) * power * myAtk / theirDef)/50 + 2) * 0.85 * modifiers
|
// dmgLow = (((2*user.level/5 + 2) * power * myAtk / theirDef)/50 + 2) * 0.85 * modifiers
|
||||||
// dmgHigh = (((2*user.level/5 + 2) * power * myAtkC / theirDefC)/50 + 2) * 1.5 * modifiers
|
// dmgHigh = (((2*user.level/5 + 2) * power * myAtkC / theirDefC)/50 + 2) * 1.5 * modifiers
|
||||||
var out = this.simulateAttack(scene, user, target, move.getMove())
|
var out = this.simulateAttack(scene, user, target, move.getMove())
|
||||||
dmgLow = out[0]
|
var minHits = 1
|
||||||
dmgHigh = out[1]
|
var maxHits = 1
|
||||||
|
var mh = move.getMove().getAttrs(MoveData.MultiHitAttr)
|
||||||
|
for (var i = 0; i < mh.length; i++) {
|
||||||
|
var mh2 = mh[i] as MoveData.MultiHitAttr
|
||||||
|
switch (mh2.multiHitType) {
|
||||||
|
case MoveData.MultiHitType._2:
|
||||||
|
minHits = 2;
|
||||||
|
maxHits = 2;
|
||||||
|
case MoveData.MultiHitType._2_TO_5:
|
||||||
|
minHits = 2;
|
||||||
|
maxHits = 5;
|
||||||
|
case MoveData.MultiHitType._3:
|
||||||
|
minHits = 3;
|
||||||
|
maxHits = 3;
|
||||||
|
case MoveData.MultiHitType._10:
|
||||||
|
minHits = 10;
|
||||||
|
maxHits = 10;
|
||||||
|
case MoveData.MultiHitType.BEAT_UP:
|
||||||
|
const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty();
|
||||||
|
// No status means the ally pokemon can contribute to Beat Up
|
||||||
|
minHits = party.reduce((total, pokemon) => {
|
||||||
|
return total + (pokemon.id === user.id ? 1 : pokemon?.status && pokemon.status.effect !== StatusEffect.NONE ? 0 : 1);
|
||||||
|
}, 0);
|
||||||
|
maxHits = minHits
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dmgLow = out[0] * minHits
|
||||||
|
dmgHigh = out[1] * maxHits
|
||||||
/*
|
/*
|
||||||
if (user.hasAbility(Abilities.PARENTAL_BOND)) {
|
if (user.hasAbility(Abilities.PARENTAL_BOND)) {
|
||||||
// Second hit deals 0.25x damage
|
// Second hit deals 0.25x damage
|
||||||
@ -1062,11 +1092,6 @@ export function simulateAttack(scene: BattleScene, user: Pokemon, target: Pokemo
|
|||||||
MoveData.applyMoveAttrs(MoveData.ModifiedDamageAttr, user, target, move, damage2);
|
MoveData.applyMoveAttrs(MoveData.ModifiedDamageAttr, user, target, move, damage2);
|
||||||
applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, user, target, move, cancelled, damage1);
|
applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, user, target, move, cancelled, damage1);
|
||||||
applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, user, target, move, cancelled, damage2);
|
applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, user, target, move, cancelled, damage2);
|
||||||
|
|
||||||
//console.log("damage (min)", damage1.value, move.name, power.value, sourceAtk, targetDef);
|
|
||||||
//console.log("damage (max)", damage2.value, move.name, power.value, sourceAtkCrit, targetDefCrit);
|
|
||||||
|
|
||||||
// In case of fatal damage, this tag would have gotten cleared before we could lapse it.
|
|
||||||
const destinyTag = target.getTag(BattlerTagType.DESTINY_BOND);
|
const destinyTag = target.getTag(BattlerTagType.DESTINY_BOND);
|
||||||
|
|
||||||
const oneHitKo = result === HitResult.ONE_HIT_KO;
|
const oneHitKo = result === HitResult.ONE_HIT_KO;
|
||||||
@ -1100,80 +1125,6 @@ export function simulateAttack(scene: BattleScene, user: Pokemon, target: Pokemo
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function calcDamage(scene: BattleScene, user: PlayerPokemon, target: Pokemon, move: PokemonMove) {
|
export function calcDamage(scene: BattleScene, user: PlayerPokemon, target: Pokemon, move: PokemonMove) {
|
||||||
/*
|
|
||||||
var power = move.getMove().power
|
|
||||||
var myAtk = 0
|
|
||||||
var theirDef = 0
|
|
||||||
var myAtkC = 0
|
|
||||||
var theirDefC = 0
|
|
||||||
switch (move.getMove().category) {
|
|
||||||
case MoveData.MoveCategory.PHYSICAL:
|
|
||||||
myAtk = user.getBattleStat(Stat.ATK, target, move.getMove())
|
|
||||||
myAtkC = user.getBattleStat(Stat.ATK, target, move.getMove(), true)
|
|
||||||
theirDef = target.getBattleStat(Stat.DEF, user, move.getMove())
|
|
||||||
theirDefC = target.getBattleStat(Stat.DEF, user, move.getMove(), true)
|
|
||||||
break;
|
|
||||||
case MoveData.MoveCategory.SPECIAL:
|
|
||||||
myAtk = user.getBattleStat(Stat.SPATK, target, move.getMove())
|
|
||||||
myAtkC = user.getBattleStat(Stat.SPATK, target, move.getMove(), true)
|
|
||||||
theirDef = target.getBattleStat(Stat.SPDEF, user, move.getMove())
|
|
||||||
theirDefC = target.getBattleStat(Stat.SPDEF, user, move.getMove(), true)
|
|
||||||
break;
|
|
||||||
case MoveData.MoveCategory.STATUS:
|
|
||||||
return "---"
|
|
||||||
}
|
|
||||||
var stabBonus = 1
|
|
||||||
var types = user.getTypes()
|
|
||||||
// Apply STAB bonus
|
|
||||||
for (var i = 0; i < types.length; i++) {
|
|
||||||
if (types[i] == move.getMove().type) {
|
|
||||||
stabBonus = 1.5
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Apply Tera Type bonus
|
|
||||||
if (stabBonus == 1.5) {
|
|
||||||
// STAB
|
|
||||||
if (move.getMove().type == user.getTeraType()) {
|
|
||||||
stabBonus = 2
|
|
||||||
}
|
|
||||||
} else if (move.getMove().type == user.getTeraType()) {
|
|
||||||
stabBonus = 1.5
|
|
||||||
}
|
|
||||||
// Apply adaptability
|
|
||||||
if (stabBonus == 2) {
|
|
||||||
// Tera-STAB
|
|
||||||
if (move.getMove().type == user.getTeraType()) {
|
|
||||||
stabBonus = 2.25
|
|
||||||
}
|
|
||||||
} else if (stabBonus == 1.5) {
|
|
||||||
// STAB or Tera
|
|
||||||
if (move.getMove().type == user.getTeraType()) {
|
|
||||||
stabBonus = 2
|
|
||||||
}
|
|
||||||
} else if (move.getMove().type == user.getTeraType()) {
|
|
||||||
// Adaptability
|
|
||||||
stabBonus = 1.5
|
|
||||||
}
|
|
||||||
var weatherBonus = 1
|
|
||||||
if (scene.arena.weather.weatherType == WeatherType.RAIN || scene.arena.weather.weatherType == WeatherType.HEAVY_RAIN) {
|
|
||||||
if (move.getMove().type == Type.WATER) {
|
|
||||||
weatherBonus = 1.5
|
|
||||||
}
|
|
||||||
if (move.getMove().type == Type.FIRE) {
|
|
||||||
weatherBonus = scene.arena.weather.weatherType == WeatherType.HEAVY_RAIN ? 0 : 0.5
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (scene.arena.weather.weatherType == WeatherType.SUNNY || scene.arena.weather.weatherType == WeatherType.HARSH_SUN) {
|
|
||||||
if (move.getMove().type == Type.FIRE) {
|
|
||||||
weatherBonus = 1.5
|
|
||||||
}
|
|
||||||
if (move.getMove().type == Type.WATER) {
|
|
||||||
weatherBonus = scene.arena.weather.weatherType == WeatherType.HARSH_SUN ? 0 : (move.moveId == Moves.HYDRO_STEAM ? 1.5 : 0.5)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var typeBonus = target.getAttackMoveEffectiveness(user, move)
|
|
||||||
var modifiers = stabBonus * weatherBonus
|
|
||||||
*/
|
|
||||||
var dmgHigh = 0
|
var dmgHigh = 0
|
||||||
var dmgLow = 0
|
var dmgLow = 0
|
||||||
// dmgLow = (((2*user.level/5 + 2) * power * myAtk / theirDef)/50 + 2) * 0.85 * modifiers
|
// dmgLow = (((2*user.level/5 + 2) * power * myAtk / theirDef)/50 + 2) * 0.85 * modifiers
|
||||||
|
Loading…
Reference in New Issue
Block a user