mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2025-02-06 03:20:01 +01:00
Couple bug fixes
This commit is contained in:
parent
f126585e71
commit
674d35861c
@ -469,8 +469,8 @@
|
||||
|
||||
.macro if_move_flag flag jumpptr
|
||||
.byte 0x52
|
||||
.hword \flag
|
||||
.word \jumpptr
|
||||
.2byte \flag
|
||||
.4byte \jumpptr
|
||||
.endm
|
||||
|
||||
.macro if_field_status flag jumpptr
|
||||
@ -479,16 +479,20 @@
|
||||
.word \jumpptr
|
||||
.endm
|
||||
|
||||
.macro nullsub_54
|
||||
.macro get_move_accuracy
|
||||
.byte 0x54
|
||||
.endm
|
||||
|
||||
.macro nullsub_55
|
||||
.macro call_if_eq value, ptr
|
||||
.byte 0x55
|
||||
.2byte \value
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro nullsub_56
|
||||
.byte 0x56
|
||||
.macro call_if_move_flag flag ptr
|
||||
.byte 0x52
|
||||
.2byte \flag
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro nullsub_57
|
||||
@ -621,3 +625,8 @@
|
||||
.macro if_any_move_encored bank, ptr
|
||||
if_any_move_disabled_or_encored \bank, 1, \ptr
|
||||
.endm
|
||||
|
||||
.macro call_if_always_hit ptr
|
||||
get_move_accuracy
|
||||
call_if_eq 0, \ptr
|
||||
.endm
|
||||
|
@ -1454,6 +1454,11 @@
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro jumpifbattleend ptr
|
||||
various BS_ATTACKER, VARIOUS_JUMP_IF_BATTLE_END
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
@ helpful macros
|
||||
.macro setstatchanger stat, stages, down
|
||||
setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7
|
||||
|
@ -656,6 +656,8 @@ Score_Plus10:
|
||||
|
||||
AI_TryToFaint:
|
||||
if_target_is_ally AI_Ret
|
||||
call_if_always_hit AI_CV_AlwaysHit
|
||||
call_if_move_flag FLAG_HIGH_CRIT, AI_CV_HighCrit
|
||||
if_effect EFFECT_HIT, AI_CV_Hit
|
||||
if_effect EFFECT_SLEEP, AI_CV_Sleep
|
||||
if_effect EFFECT_ABSORB, AI_CV_Absorb
|
||||
@ -669,7 +671,6 @@ AI_TryToFaint:
|
||||
if_effect EFFECT_SPECIAL_DEFENSE_UP, AI_CV_SpDefUp
|
||||
if_effect EFFECT_ACCURACY_UP, AI_CV_AccuracyUp
|
||||
if_effect EFFECT_EVASION_UP, AI_CV_EvasionUp
|
||||
if_effect EFFECT_ALWAYS_HIT, AI_CV_AlwaysHit
|
||||
if_effect EFFECT_ATTACK_DOWN, AI_CV_AttackDown
|
||||
if_effect EFFECT_DEFENSE_DOWN, AI_CV_DefenseDown
|
||||
if_effect EFFECT_SPEED_DOWN, AI_CV_SpeedDown
|
||||
@ -779,7 +780,6 @@ AI_TryToFaint:
|
||||
end
|
||||
|
||||
AI_CV_Hit:
|
||||
if_move_flag FLAG_HIGH_CRIT AI_CV_HighCrit
|
||||
end
|
||||
|
||||
AI_CV_Sleep: @ 82DCA92
|
||||
|
@ -31,7 +31,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8
|
||||
.4byte BattleScript_EffectSpecialDefenseUp
|
||||
.4byte BattleScript_EffectAccuracyUp
|
||||
.4byte BattleScript_EffectEvasionUp
|
||||
.4byte BattleScript_EffectAlwaysHit
|
||||
.4byte BattleScript_EffectUnused17
|
||||
.4byte BattleScript_EffectAttackDown
|
||||
.4byte BattleScript_EffectDefenseDown
|
||||
.4byte BattleScript_EffectSpeedDown
|
||||
@ -291,6 +291,11 @@ gBattleScriptsForMoveEffects:: @ 82D86A8
|
||||
.4byte BattleScript_EffectHurricane
|
||||
.4byte BattleScript_EffectTwoTypedMove
|
||||
.4byte BattleScript_EffectMeFirst
|
||||
.4byte BattleScript_EffectSpeedUpHit
|
||||
|
||||
BattleScript_EffectSpeedUpHit:
|
||||
setmoveeffect MOVE_EFFECT_SPD_PLUS_1 | MOVE_EFFECT_AFFECTS_USER
|
||||
goto BattleScript_EffectHit
|
||||
|
||||
BattleScript_EffectMeFirst:
|
||||
attackcanceler
|
||||
@ -794,7 +799,7 @@ BattleScript_EffectHitEscape:
|
||||
tryfaintmon BS_TARGET, FALSE, NULL
|
||||
setbyte sMOVEEND_STATE, 0x0
|
||||
moveend 0x0, 0x0
|
||||
atk24 BattleScript_HitEscapeEnd
|
||||
jumpifbattleend BattleScript_HitEscapeEnd
|
||||
jumpifbyte CMP_NOT_EQUAL gBattleOutcome 0 BattleScript_HitEscapeEnd
|
||||
jumpifcantswitch ATK4F_DONT_CHECK_STATUSES | BS_ATTACKER, BattleScript_HitEscapeEnd
|
||||
openpartyscreen 0x1, BattleScript_HitEscapeEnd
|
||||
@ -817,7 +822,7 @@ BattleScript_EffectPlaceholder:
|
||||
printstring STRINGID_NOTDONEYET
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
BattleScript_EffectAlwaysHit:
|
||||
BattleScript_EffectUnused17:
|
||||
BattleScript_EffectEvasionDownHit:
|
||||
BattleScript_EffectVitalThrow:
|
||||
BattleScript_EffectUnused60:
|
||||
@ -1671,7 +1676,7 @@ BattleScript_EffectPoison::
|
||||
waitmessage 0x40
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
BattleScript_EffectParalyze::
|
||||
BattleScript_EffectParalyze:
|
||||
attackcanceler
|
||||
attackstring
|
||||
ppreduce
|
||||
@ -1684,6 +1689,7 @@ BattleScript_EffectParalyze::
|
||||
jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed
|
||||
accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE
|
||||
jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected
|
||||
bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE
|
||||
attackanimation
|
||||
waitanimation
|
||||
setmoveeffect MOVE_EFFECT_PARALYSIS
|
||||
@ -1692,7 +1698,7 @@ BattleScript_EffectParalyze::
|
||||
waitmessage 0x40
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
BattleScript_AlreadyParalyzed::
|
||||
BattleScript_AlreadyParalyzed:
|
||||
various23 BS_ATTACKER
|
||||
pause 0x20
|
||||
printstring STRINGID_PKMNISALREADYPARALYZED
|
||||
@ -2219,11 +2225,12 @@ BattleScript_EffectSpikes::
|
||||
waitmessage 0x40
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
BattleScript_EffectForesight::
|
||||
BattleScript_EffectForesight:
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||
attackstring
|
||||
ppreduce
|
||||
accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON
|
||||
jumpifstatus2 BS_TARGET, STATUS2_FORESIGHT, BattleScript_ButItFailed
|
||||
setforesight
|
||||
BattleScript_IdentifiedFoe:
|
||||
attackanimation
|
||||
|
@ -128,6 +128,7 @@ BattleScript_OpponentUsesHealItem::
|
||||
playse SE_KAIFUKU
|
||||
printstring STRINGID_TRAINER1USEDITEM
|
||||
waitmessage 0x40
|
||||
bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT
|
||||
useitemonopponent
|
||||
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
|
||||
healthbarupdate BS_ATTACKER
|
||||
|
@ -60,7 +60,7 @@ u8 DoFieldEndTurnEffects(void);
|
||||
u8 DoBattlerEndTurnEffects(void);
|
||||
bool8 HandleWishPerishSongOnTurnEnd(void);
|
||||
bool8 HandleFaintedMonActions(void);
|
||||
void TryClearRageStatuses(void);
|
||||
void TryClearRageAndFuryCutter(void);
|
||||
u8 AtkCanceller_UnableToUseMove(void);
|
||||
bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2);
|
||||
u8 CastformDataTypeChange(u8 battlerId);
|
||||
|
@ -18,7 +18,7 @@
|
||||
#define EFFECT_SPECIAL_DEFENSE_UP 14
|
||||
#define EFFECT_ACCURACY_UP 15
|
||||
#define EFFECT_EVASION_UP 16
|
||||
#define EFFECT_ALWAYS_HIT 17
|
||||
#define EFFECT_UNUSED_17 17
|
||||
#define EFFECT_ATTACK_DOWN 18
|
||||
#define EFFECT_DEFENSE_DOWN 19
|
||||
#define EFFECT_SPEED_DOWN 20
|
||||
@ -280,5 +280,6 @@
|
||||
#define EFFECT_HURRICANE 274
|
||||
#define EFFECT_TWO_TYPED_MOVE 275
|
||||
#define EFFECT_ME_FIRST 276
|
||||
#define EFFECT_SPEED_UP_HIT 277
|
||||
|
||||
#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H
|
||||
|
@ -93,6 +93,7 @@
|
||||
#define VARIOUS_INVERT_STAT_STAGES 44
|
||||
#define VARIOUS_SET_TERRAIN 45
|
||||
#define VARIOUS_TRY_ME_FIRST 46
|
||||
#define VARIOUS_JUMP_IF_BATTLE_END 47
|
||||
|
||||
// atk80, dmg manipulation
|
||||
#define ATK80_DMG_CHANGE_SIGN 0
|
||||
|
@ -1669,7 +1669,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] =
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.priority = 0,
|
||||
.flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
|
||||
.split = SPLIT_PHYSICAL,
|
||||
.split = SPLIT_SPECIAL,
|
||||
},
|
||||
{ // MOVE_POISON_GAS
|
||||
.effect = EFFECT_POISON,
|
||||
@ -2323,7 +2323,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] =
|
||||
.effect = EFFECT_FORESIGHT,
|
||||
.power = 0,
|
||||
.type = TYPE_NORMAL,
|
||||
.accuracy = 100,
|
||||
.accuracy = 0,
|
||||
.pp = 40,
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
@ -3799,7 +3799,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] =
|
||||
.effect = EFFECT_FORESIGHT,
|
||||
.power = 0,
|
||||
.type = TYPE_NORMAL,
|
||||
.accuracy = 100,
|
||||
.accuracy = 0,
|
||||
.pp = 40,
|
||||
.secondaryEffectChance = 0,
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
@ -5860,7 +5860,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] =
|
||||
.split = SPLIT_STATUS,
|
||||
},
|
||||
{ // MOVE_FLAME_CHARGE
|
||||
.effect = EFFECT_SPEED_UP,
|
||||
.effect = EFFECT_SPEED_UP_HIT,
|
||||
.power = 50,
|
||||
.type = TYPE_FIRE,
|
||||
.accuracy = 100,
|
||||
|
@ -138,9 +138,9 @@ static void BattleAICmd_get_move_effect_from_result(void);
|
||||
static void BattleAICmd_get_protect_count(void);
|
||||
static void BattleAICmd_if_move_flag(void);
|
||||
static void BattleAICmd_if_field_status(void);
|
||||
static void BattleAICmd_nullsub_54(void);
|
||||
static void BattleAICmd_nullsub_55(void);
|
||||
static void BattleAICmd_nullsub_56(void);
|
||||
static void BattleAICmd_get_move_accuracy(void);
|
||||
static void BattleAICmd_call_if_eq(void);
|
||||
static void BattleAICmd_call_if_move_flag(void);
|
||||
static void BattleAICmd_nullsub_57(void);
|
||||
static void BattleAICmd_call(void);
|
||||
static void BattleAICmd_goto(void);
|
||||
@ -247,9 +247,9 @@ static const BattleAICmdFunc sBattleAICmdTable[] =
|
||||
BattleAICmd_get_protect_count, // 0x51
|
||||
BattleAICmd_if_move_flag, // 0x52
|
||||
BattleAICmd_if_field_status, // 0x53
|
||||
BattleAICmd_nullsub_54, // 0x54
|
||||
BattleAICmd_nullsub_55, // 0x55
|
||||
BattleAICmd_nullsub_56, // 0x56
|
||||
BattleAICmd_get_move_accuracy, // 0x54
|
||||
BattleAICmd_call_if_eq, // 0x55
|
||||
BattleAICmd_call_if_move_flag, // 0x56
|
||||
BattleAICmd_nullsub_57, // 0x57
|
||||
BattleAICmd_call, // 0x58
|
||||
BattleAICmd_goto, // 0x59
|
||||
@ -2255,12 +2255,7 @@ static void BattleAICmd_get_used_held_item(void)
|
||||
else
|
||||
battlerId = gBattlerTarget;
|
||||
|
||||
// This is likely a leftover from Ruby's code and its ugly ewram access.
|
||||
#ifdef NONMATCHING
|
||||
AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[battlerId];
|
||||
#else
|
||||
AI_THINKING_STRUCT->funcResult = *(u8*)((u8*)(gBattleStruct) + offsetof(struct BattleStruct, usedHeldItems) + (battlerId * 2));
|
||||
#endif // NONMATCHING
|
||||
AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[battlerId];
|
||||
|
||||
gAIScriptPtr += 2;
|
||||
}
|
||||
@ -2320,16 +2315,39 @@ static void BattleAICmd_if_field_status(void)
|
||||
gAIScriptPtr += 9;
|
||||
}
|
||||
|
||||
static void BattleAICmd_nullsub_54(void)
|
||||
static void BattleAICmd_get_move_accuracy(void)
|
||||
{
|
||||
AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].accuracy;
|
||||
|
||||
gAIScriptPtr++;
|
||||
}
|
||||
|
||||
static void BattleAICmd_nullsub_55(void)
|
||||
static void BattleAICmd_call_if_eq(void)
|
||||
{
|
||||
if (AI_THINKING_STRUCT->funcResult == T1_READ_16(gAIScriptPtr + 1))
|
||||
{
|
||||
AIStackPushVar(gAIScriptPtr + 7);
|
||||
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
gAIScriptPtr += 7;
|
||||
}
|
||||
}
|
||||
|
||||
static void BattleAICmd_nullsub_56(void)
|
||||
static void BattleAICmd_call_if_move_flag(void)
|
||||
{
|
||||
u16 flag = T1_READ_16(gAIScriptPtr + 1);
|
||||
|
||||
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].flags & flag)
|
||||
{
|
||||
AIStackPushVar(gAIScriptPtr + 7);
|
||||
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
gAIScriptPtr += 7;
|
||||
}
|
||||
}
|
||||
|
||||
static void BattleAICmd_nullsub_57(void)
|
||||
|
@ -3008,6 +3008,9 @@ static void BattleStartClearSetData(void)
|
||||
gPalaceSelectionBattleScripts[i] = 0;
|
||||
}
|
||||
|
||||
gFieldStatuses = 0;
|
||||
memset(&gFieldTimers, 0, sizeof(gFieldTimers));
|
||||
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
gSideStatuses[i] = 0;
|
||||
@ -4960,7 +4963,7 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void)
|
||||
}
|
||||
}
|
||||
|
||||
TryClearRageStatuses();
|
||||
TryClearRageAndFuryCutter();
|
||||
gCurrentTurnActionNumber = 0;
|
||||
gCurrentActionFuncId = gActionsByTurnOrder[0];
|
||||
gBattleStruct->dynamicMoveType = 0;
|
||||
|
@ -1138,7 +1138,8 @@ static bool32 AccuracyCalcHelper(u16 move)
|
||||
gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER;
|
||||
|
||||
if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE))
|
||||
|| (gBattleMoves[move].effect == EFFECT_ALWAYS_HIT || gBattleMoves[move].effect == EFFECT_VITAL_THROW))
|
||||
|| (gBattleMoves[move].effect == EFFECT_VITAL_THROW)
|
||||
|| (gBattleMoves[move].accuracy == 0))
|
||||
{
|
||||
JumpIfMoveFailed(7, move);
|
||||
return TRUE;
|
||||
@ -1154,7 +1155,7 @@ static void atk01_accuracycheck(void)
|
||||
if (move == ACC_CURR_MOVE)
|
||||
move = gCurrentMove;
|
||||
|
||||
if (move == NO_ACC_CALC_CHECK_LOCK_ON || gBattleMoves[move].accuracy == 0)
|
||||
if (move == NO_ACC_CALC_CHECK_LOCK_ON)
|
||||
{
|
||||
if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker)
|
||||
gBattlescriptCurrInstr += 7;
|
||||
@ -6512,6 +6513,12 @@ static void atk76_various(void)
|
||||
}
|
||||
}
|
||||
return;
|
||||
case VARIOUS_JUMP_IF_BATTLE_END:
|
||||
if (IsBattleLostForPlayer() || IsBattleWonForPlayer())
|
||||
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
|
||||
else
|
||||
gBattlescriptCurrInstr += 7;
|
||||
return;
|
||||
}
|
||||
|
||||
gBattlescriptCurrInstr += 3;
|
||||
|
@ -1945,13 +1945,15 @@ bool8 HandleFaintedMonActions(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void TryClearRageStatuses(void)
|
||||
void TryClearRageAndFuryCutter(void)
|
||||
{
|
||||
s32 i;
|
||||
for (i = 0; i < gBattlersCount; i++)
|
||||
{
|
||||
if ((gBattleMons[i].status2 & STATUS2_RAGE) && gChosenMoveByBattler[i] != MOVE_RAGE)
|
||||
gBattleMons[i].status2 &= ~(STATUS2_RAGE);
|
||||
if (gDisableStructs[i].furyCutterCounter != 0 && gChosenMoveByBattler[i] != MOVE_FURY_CUTTER)
|
||||
gDisableStructs[i].furyCutterCounter = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -5008,7 +5010,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b
|
||||
else
|
||||
atkStat = gBattleMons[battlerAtk].spAttack;
|
||||
|
||||
atkStage = gBattleMons[battlerAtk].statStages[STAT_ATK];
|
||||
atkStage = gBattleMons[battlerAtk].statStages[STAT_SPATK];
|
||||
}
|
||||
|
||||
// critical hits ignore attack stat's stage drops
|
||||
|
Loading…
x
Reference in New Issue
Block a user