Fix dynamic move power moves, get rid of gDynamicBasePower'

'
This commit is contained in:
DizzyEggg 2018-07-16 21:42:03 +02:00
parent f250436db0
commit 0852cba111
7 changed files with 49 additions and 100 deletions

View File

@ -892,7 +892,7 @@
.4byte \param0
.endm
.macro rolloutdamagecalculation
.macro handlerollout
.byte 0xb3
.endm
@ -902,11 +902,11 @@
.4byte \param1
.endm
.macro furycuttercalc
.macro handlefurycutter
.byte 0xb5
.endm
.macro happinesstodamagecalculation
.macro nop_B6
.byte 0xb6
.endm
@ -1066,7 +1066,7 @@
.4byte \param0
.endm
.macro scaledamagebyhealthratio
.macro nop_D9
.byte 0xd9
.endm

View File

@ -258,6 +258,9 @@ BattleScript_EffectLowKick:
BattleScript_EffectFlail:
BattleScript_EffectFacade:
BattleScript_EffectRevenge:
BattleScript_EffectReturn:
BattleScript_EffectFrustration:
BattleScript_EffectEruption:
jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler
jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler
orword gHitMarker, HITMARKER_IGNORE_UNDERWATER
@ -1417,7 +1420,6 @@ BattleScript_DoTripleKickAttack::
movevaluescleanup
addbyte sTRIPLE_KICK_POWER, 10
addbyte sMULTIHIT_STRING + 4, 0x1
copyhword gDynamicBasePower, sTRIPLE_KICK_POWER
critcalc
damagecalc
adjustdamage
@ -1622,7 +1624,7 @@ BattleScript_RolloutCheckAccuracy::
accuracycheck BattleScript_RolloutHit, ACC_CURR_MOVE
BattleScript_RolloutHit::
typecalc2
rolloutdamagecalculation
handlerollout
goto BattleScript_HitFromCritCalc
BattleScript_EffectSwagger::
@ -1654,7 +1656,7 @@ BattleScript_EffectFuryCutter::
ppreduce
accuracycheck BattleScript_FuryCutterHit, ACC_CURR_MOVE
BattleScript_FuryCutterHit::
furycuttercalc
handlefurycutter
critcalc
damagecalc
jumpifmovehadnoeffect BattleScript_FuryCutterHit
@ -1673,13 +1675,6 @@ BattleScript_EffectAttract::
waitmessage 0x40
goto BattleScript_MoveEnd
BattleScript_EffectReturn::
BattleScript_EffectFrustration::
attackcanceler
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
happinesstodamagecalculation
goto BattleScript_HitFromAtkString
BattleScript_EffectPresent::
attackcanceler
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
@ -2483,10 +2478,6 @@ BattleScript_EffectEndeavor::
adjustdamage
goto BattleScript_HitFromAtkAnimation
BattleScript_EffectEruption::
scaledamagebyhealthratio
goto BattleScript_EffectHit
BattleScript_EffectSkillSwap::
attackcanceler
attackstring

View File

@ -805,7 +805,6 @@ extern u16 gBattleWeather;
extern struct WishFutureKnock gWishFutureKnock;
extern u16 gIntroSlideFlags;
extern u8 gSentPokesToOpponent[2];
extern u16 gDynamicBasePower;
extern u16 gExpShareExp;
extern struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT];
extern struct BattleScripting gBattleScripting;

View File

@ -1308,7 +1308,6 @@ static void BattleAICmd_get_how_powerful_move_is(void)
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1
&& sDiscouragedPowerfulMoveEffects[i] == 0xFFFF)
{
gDynamicBasePower = 0;
*(&gBattleStruct->dynamicMoveType) = 0;
gMoveResultFlags = 0;
@ -1585,7 +1584,6 @@ static void BattleAICmd_get_highest_type_effectiveness(void)
s32 i;
u8 *dynamicMoveType;
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gMoveResultFlags = 0;
AI_THINKING_STRUCT->funcResult = 0;
@ -1633,7 +1631,6 @@ static void BattleAICmd_if_type_effectiveness(void)
u8 damageVar;
u32 effectivenessMultiplier;
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gMoveResultFlags = 0;
gCurrentMove = AI_THINKING_STRUCT->moveConsidered;
@ -1850,7 +1847,6 @@ static void BattleAICmd_if_can_faint(void)
return;
}
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gMoveResultFlags = 0;
dmg = AI_CalcDamage(AI_THINKING_STRUCT->moveConsidered, sBattler_AI, gBattlerTarget);
@ -1876,7 +1872,6 @@ static void BattleAICmd_if_cant_faint(void)
return;
}
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gMoveResultFlags = 0;
dmg = AI_CalcDamage(AI_THINKING_STRUCT->moveConsidered, sBattler_AI, gBattlerTarget);

View File

@ -710,7 +710,6 @@ u8 GetMostSuitableMonToSwitchInto(void)
}
}
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gMoveResultFlags = 0;
bestDmg = 0;

View File

@ -266,7 +266,6 @@ EWRAM_DATA u16 gBattleWeather = 0;
EWRAM_DATA struct WishFutureKnock gWishFutureKnock = {0};
EWRAM_DATA u16 gIntroSlideFlags = 0;
EWRAM_DATA u8 gSentPokesToOpponent[2] = {0};
EWRAM_DATA u16 gDynamicBasePower = 0;
EWRAM_DATA u16 gExpShareExp = 0;
EWRAM_DATA struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA struct BattleScripting gBattleScripting = {0};
@ -4922,12 +4921,7 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void)
TryClearRageStatuses();
gCurrentTurnActionNumber = 0;
{
// something stupid needed to match
u8 zero;
gCurrentActionFuncId = gActionsByTurnOrder[(zero = 0)];
}
gDynamicBasePower = 0;
gCurrentActionFuncId = gActionsByTurnOrder[0];
gBattleStruct->dynamicMoveType = 0;
gBattleMainFunc = RunTurnActionsFunctions;
gBattleCommunication[3] = 0;
@ -5842,7 +5836,6 @@ static void HandleAction_ActionFinished(void)
gLastLandedMoves[gBattlerAttacker] = 0;
gLastHitByType[gBattlerAttacker] = 0;
gBattleStruct->dynamicMoveType = 0;
gDynamicBasePower = 0;
gBattleScripting.atk49_state = 0;
gBattleCommunication[3] = 0;
gBattleCommunication[4] = 0;

View File

@ -269,10 +269,10 @@ static void atkAF_cursetarget(void);
static void atkB0_trysetspikes(void);
static void atkB1_setforesight(void);
static void atkB2_trysetperishsong(void);
static void atkB3_rolloutdamagecalculation(void);
static void atkB3_handlerollout(void);
static void atkB4_jumpifconfusedandstatmaxed(void);
static void atkB5_furycuttercalc(void);
static void atkB6_happinesstodamagecalculation(void);
static void atkB5_handlefurycutter(void);
static void atkB6_nop(void);
static void atkB7_presentdamagecalculation(void);
static void atkB8_setsafeguard(void);
static void atkB9_magnitudedamagecalculation(void);
@ -307,7 +307,7 @@ static void atkD5_trysetroots(void);
static void atkD6_nop(void);
static void atkD7_setyawn(void);
static void atkD8_setdamagetohealthdifference(void);
static void atkD9_scaledamagebyhealthratio(void);
static void atkD9_nop(void);
static void atkDA_tryswapabilities(void);
static void atkDB_tryimprision(void);
static void atkDC_trysetgrudge(void);
@ -521,10 +521,10 @@ void (* const gBattleScriptingCommandsTable[])(void) =
atkB0_trysetspikes,
atkB1_setforesight,
atkB2_trysetperishsong,
atkB3_rolloutdamagecalculation,
atkB3_handlerollout,
atkB4_jumpifconfusedandstatmaxed,
atkB5_furycuttercalc,
atkB6_happinesstodamagecalculation,
atkB5_handlefurycutter,
atkB6_nop,
atkB7_presentdamagecalculation,
atkB8_setsafeguard,
atkB9_magnitudedamagecalculation,
@ -559,7 +559,7 @@ void (* const gBattleScriptingCommandsTable[])(void) =
atkD6_nop,
atkD7_setyawn,
atkD8_setdamagetohealthdifference,
atkD9_scaledamagebyhealthratio,
atkD9_nop,
atkDA_tryswapabilities,
atkDB_tryimprision,
atkDC_trysetgrudge,
@ -8350,7 +8350,7 @@ static void atkB2_trysetperishsong(void)
gBattlescriptCurrInstr += 5;
}
static void atkB3_rolloutdamagecalculation(void)
static void atkB3_handlerollout(void)
{
if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
{
@ -8359,28 +8359,18 @@ static void atkB3_rolloutdamagecalculation(void)
}
else
{
s32 i;
if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) // first hit
if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) // First hit.
{
gDisableStructs[gBattlerAttacker].rolloutCounter1 = 5;
gDisableStructs[gBattlerAttacker].rolloutCounter2 = 5;
gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS;
gLockedMoves[gBattlerAttacker] = gCurrentMove;
}
if (--gDisableStructs[gBattlerAttacker].rolloutCounter1 == 0) // last hit
if (--gDisableStructs[gBattlerAttacker].rolloutCounter1 == 0) // Last hit.
{
gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_MULTIPLETURNS);
}
gDynamicBasePower = gBattleMoves[gCurrentMove].power;
for (i = 1; i < (5 - gDisableStructs[gBattlerAttacker].rolloutCounter1); i++)
gDynamicBasePower *= 2;
if (gBattleMons[gBattlerAttacker].status2 & STATUS2_DEFENSE_CURL)
gDynamicBasePower *= 2;
gBattlescriptCurrInstr++;
}
}
@ -8394,7 +8384,7 @@ static void atkB4_jumpifconfusedandstatmaxed(void)
gBattlescriptCurrInstr += 6;
}
static void atkB5_furycuttercalc(void)
static void atkB5_handlefurycutter(void)
{
if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
{
@ -8403,40 +8393,34 @@ static void atkB5_furycuttercalc(void)
}
else
{
s32 i;
if (gDisableStructs[gBattlerAttacker].furyCutterCounter != 5)
gDisableStructs[gBattlerAttacker].furyCutterCounter++;
gDynamicBasePower = gBattleMoves[gCurrentMove].power;
for (i = 1; i < gDisableStructs[gBattlerAttacker].furyCutterCounter; i++)
gDynamicBasePower *= 2;
gBattlescriptCurrInstr++;
}
}
static void atkB6_happinesstodamagecalculation(void)
static void atkB6_nop(void)
{
if (gBattleMoves[gCurrentMove].effect == EFFECT_RETURN)
gDynamicBasePower = 10 * (gBattleMons[gBattlerAttacker].friendship) / 25;
else // EFFECT_FRUSTRATION
gDynamicBasePower = 10 * (255 - gBattleMons[gBattlerAttacker].friendship) / 25;
gBattlescriptCurrInstr++;
}
static void atkB7_presentdamagecalculation(void)
{
s32 rand = Random() & 0xFF;
u32 rand = Random() & 0xFF;
if (rand < 102)
gDynamicBasePower = 40;
{
gBattleStruct->presentBasePower = 40;
}
else if (rand < 178)
gDynamicBasePower = 80;
{
gBattleStruct->presentBasePower = 80;
}
else if (rand < 204)
gDynamicBasePower = 120;
{
gBattleStruct->presentBasePower = 120;
}
else
{
gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 4;
@ -8444,10 +8428,15 @@ static void atkB7_presentdamagecalculation(void)
gBattleMoveDamage = 1;
gBattleMoveDamage *= -1;
}
if (rand < 204)
{
gBattlescriptCurrInstr = BattleScript_HitFromCritCalc;
}
else if (gBattleMons[gBattlerTarget].maxHP == gBattleMons[gBattlerTarget].hp)
{
gBattlescriptCurrInstr = BattleScript_AlreadyAtFullHp;
}
else
{
gMoveResultFlags &= ~(MOVE_RESULT_DOESNT_AFFECT_FOE);
@ -8475,52 +8464,52 @@ static void atkB8_setsafeguard(void)
static void atkB9_magnitudedamagecalculation(void)
{
s32 magnitude = Random() % 100;
u32 magnitude = Random() % 100;
if (magnitude < 5)
{
gDynamicBasePower = 10;
gBattleStruct->magnitudeBasePower = 10;
magnitude = 4;
}
else if (magnitude < 15)
{
gDynamicBasePower = 30;
gBattleStruct->magnitudeBasePower = 30;
magnitude = 5;
}
else if (magnitude < 35)
{
gDynamicBasePower = 50;
gBattleStruct->magnitudeBasePower = 50;
magnitude = 6;
}
else if (magnitude < 65)
{
gDynamicBasePower = 70;
gBattleStruct->magnitudeBasePower = 70;
magnitude = 7;
}
else if (magnitude < 85)
{
gDynamicBasePower = 90;
gBattleStruct->magnitudeBasePower = 90;
magnitude = 8;
}
else if (magnitude < 95)
{
gDynamicBasePower = 110;
gBattleStruct->magnitudeBasePower = 110;
magnitude = 9;
}
else
{
gDynamicBasePower = 150;
gBattleStruct->magnitudeBasePower = 150;
magnitude = 10;
}
PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 2, magnitude)
PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 2, magnitude);
for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++)
{
if (gBattlerTarget == gBattlerAttacker)
continue;
if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) // a valid target was found
if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) // A valid target was found.
break;
}
@ -8693,16 +8682,8 @@ static void atkC0_recoverbasedonsunlight(void)
static void atkC1_hiddenpowercalc(void)
{
u8 powerBits;
u8 typeBits;
powerBits = ((gBattleMons[gBattlerAttacker].hpIV & 2) >> 1)
| ((gBattleMons[gBattlerAttacker].attackIV & 2) << 0)
| ((gBattleMons[gBattlerAttacker].defenseIV & 2) << 1)
| ((gBattleMons[gBattlerAttacker].speedIV & 2) << 2)
| ((gBattleMons[gBattlerAttacker].spAttackIV & 2) << 3)
| ((gBattleMons[gBattlerAttacker].spDefenseIV & 2) << 4);
typeBits = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0)
| ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1)
| ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2)
@ -8710,8 +8691,6 @@ static void atkC1_hiddenpowercalc(void)
| ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4)
| ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5);
gDynamicBasePower = (40 * powerBits) / 63 + 30;
gBattleStruct->dynamicMoveType = (15 * typeBits) / 63 + 1;
if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY)
gBattleStruct->dynamicMoveType++;
@ -9155,15 +9134,8 @@ static void atkD8_setdamagetohealthdifference(void)
}
}
static void atkD9_scaledamagebyhealthratio(void)
static void atkD9_nop(void)
{
if (gDynamicBasePower == 0)
{
u8 power = gBattleMoves[gCurrentMove].power;
gDynamicBasePower = gBattleMons[gBattlerAttacker].hp * power / gBattleMons[gBattlerAttacker].maxHP;
if (gDynamicBasePower == 0)
gDynamicBasePower = 1;
}
gBattlescriptCurrInstr++;
}