Dont clear AI flags on move choose. Will come in handy in smart ai switch logic

This commit is contained in:
DizzyEggg 2018-12-22 20:57:12 +01:00
parent f7a7ddde0c
commit 53b9d4a224
5 changed files with 43 additions and 52 deletions

View File

@ -298,7 +298,6 @@ struct AI_ThinkingStruct
u32 aiFlags; u32 aiFlags;
u8 aiAction; u8 aiAction;
u8 aiLogicId; u8 aiLogicId;
u8 filler12[6];
u8 simulatedRNG[4]; u8 simulatedRNG[4];
struct AI_SavedBattleMon saved[4]; struct AI_SavedBattleMon saved[4];
}; };
@ -580,8 +579,6 @@ struct BattleStruct
u8 roostTypes[MAX_BATTLERS_COUNT][3]; u8 roostTypes[MAX_BATTLERS_COUNT][3];
u8 savedBattlerTarget; u8 savedBattlerTarget;
bool8 ateBoost[MAX_BATTLERS_COUNT]; bool8 ateBoost[MAX_BATTLERS_COUNT];
u32 debugAIFlags;
bool8 notfirstTimeAIFlags;
u8 activeAbilityPopUps; // as bits for each battler u8 activeAbilityPopUps; // as bits for each battler
bool8 throwingPokeBall; bool8 throwingPokeBall;
struct MegaEvolutionData mega; struct MegaEvolutionData mega;

View File

@ -9,7 +9,8 @@
s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef); s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef);
s32 AI_CalcPartyMonDamage(u16 move, u8 battlerAtk, u8 battlerDef, struct Pokemon *mon); s32 AI_CalcPartyMonDamage(u16 move, u8 battlerAtk, u8 battlerDef, struct Pokemon *mon);
u16 AI_GetTypeEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef); u16 AI_GetTypeEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef);
void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves); void BattleAI_SetupItems(void);
void BattleAI_SetupFlags(void);
void BattleAI_SetupAIData(u8 defaultScoreMoves); void BattleAI_SetupAIData(u8 defaultScoreMoves);
u8 BattleAI_ChooseMoveOrAction(void); u8 BattleAI_ChooseMoveOrAction(void);
void ClearBattlerMoveHistory(u8 battlerId); void ClearBattlerMoveHistory(u8 battlerId);

View File

@ -291,7 +291,7 @@ static const u16 sDiscouragedPowerfulMoveEffects[] =
}; };
// code // code
void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves) void BattleAI_SetupItems(void)
{ {
s32 i; s32 i;
u8 *data = (u8 *)BATTLE_HISTORY; u8 *data = (u8 *)BATTLE_HISTORY;
@ -316,19 +316,40 @@ void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves)
} }
} }
} }
}
BattleAI_SetupAIData(defaultScoreMoves); void BattleAI_SetupFlags(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
AI_THINKING_STRUCT->aiFlags = GetAiScriptsInRecordedBattle();
else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_SAFARI;
else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER)
AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_ROAMING;
else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_FIRST_BATTLE;
else if (gBattleTypeFlags & BATTLE_TYPE_FACTORY)
AI_THINKING_STRUCT->aiFlags = GetAiScriptsInBattleFactory();
else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_SECRET_BASE))
AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_CHECK_VIABILITY | AI_SCRIPT_TRY_TO_FAINT;
else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags | gTrainers[gTrainerBattleOpponent_B].aiFlags;
else
AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE || gTrainers[gTrainerBattleOpponent_A].doubleBattle)
AI_THINKING_STRUCT->aiFlags |= AI_SCRIPT_DOUBLE_BATTLE; // Act smart in doubles and don't attack your partner.
} }
void BattleAI_SetupAIData(u8 defaultScoreMoves) void BattleAI_SetupAIData(u8 defaultScoreMoves)
{ {
s32 i; s32 i;
u8 *data = (u8 *)AI_THINKING_STRUCT;
u8 moveLimitations; u8 moveLimitations;
// Clear AI data. // Clear AI data but preserve the flags.
for (i = 0; i < sizeof(struct AI_ThinkingStruct); i++) u32 flags = AI_THINKING_STRUCT->aiFlags;
data[i] = 0; memset(AI_THINKING_STRUCT, 0, sizeof(struct AI_ThinkingStruct));
AI_THINKING_STRUCT->aiFlags = flags;
// Conditional score reset, unlike Ruby. // Conditional score reset, unlike Ruby.
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
@ -367,37 +388,6 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves)
{ {
gBattlerTarget = sBattler_AI ^ BIT_SIDE; gBattlerTarget = sBattler_AI ^ BIT_SIDE;
} }
// Choose proper trainer ai scripts.
if (!gBattleStruct->notfirstTimeAIFlags || !USE_BATTLE_DEBUG)
{
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
AI_THINKING_STRUCT->aiFlags = GetAiScriptsInRecordedBattle();
else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_SAFARI;
else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER)
AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_ROAMING;
else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_FIRST_BATTLE;
else if (gBattleTypeFlags & BATTLE_TYPE_FACTORY)
AI_THINKING_STRUCT->aiFlags = GetAiScriptsInBattleFactory();
else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_SECRET_BASE))
AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_CHECK_VIABILITY | AI_SCRIPT_TRY_TO_FAINT;
else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags | gTrainers[gTrainerBattleOpponent_B].aiFlags;
else
AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE || gTrainers[gTrainerBattleOpponent_A].doubleBattle)
AI_THINKING_STRUCT->aiFlags |= AI_SCRIPT_DOUBLE_BATTLE; // Act smart in doubles and don't attack your partner.
gBattleStruct->debugAIFlags = AI_THINKING_STRUCT->aiFlags;
gBattleStruct->notfirstTimeAIFlags = TRUE;
}
else
{
AI_THINKING_STRUCT->aiFlags = gBattleStruct->debugAIFlags;
}
} }
u8 BattleAI_ChooseMoveOrAction(void) u8 BattleAI_ChooseMoveOrAction(void)
@ -420,17 +410,18 @@ static u8 ChooseMoveOrAction_Singles(void)
u8 consideredMoveArray[4]; u8 consideredMoveArray[4];
u8 numOfBestMoves; u8 numOfBestMoves;
s32 i; s32 i;
u32 flags = AI_THINKING_STRUCT->aiFlags;
RecordLastUsedMoveByTarget(); RecordLastUsedMoveByTarget();
while (AI_THINKING_STRUCT->aiFlags != 0) while (flags != 0)
{ {
if (AI_THINKING_STRUCT->aiFlags & 1) if (flags & 1)
{ {
AI_THINKING_STRUCT->aiState = AIState_SettingUp; AI_THINKING_STRUCT->aiState = AIState_SettingUp;
BattleAI_DoAIProcessing(); BattleAI_DoAIProcessing();
} }
AI_THINKING_STRUCT->aiFlags >>= 1; flags >>= 1;
AI_THINKING_STRUCT->aiLogicId++; AI_THINKING_STRUCT->aiLogicId++;
AI_THINKING_STRUCT->movesetIndex = 0; AI_THINKING_STRUCT->movesetIndex = 0;
} }
@ -470,7 +461,7 @@ static u8 ChooseMoveOrAction_Doubles(void)
{ {
s32 i; s32 i;
s32 j; s32 j;
s32 scriptsToRun; u32 flags;
s16 bestMovePointsForTarget[4]; s16 bestMovePointsForTarget[4];
s8 mostViableTargetsArray[4]; s8 mostViableTargetsArray[4];
u8 actionOrMoveIndex[4]; u8 actionOrMoveIndex[4];
@ -501,15 +492,15 @@ static u8 ChooseMoveOrAction_Doubles(void)
AI_THINKING_STRUCT->aiLogicId = 0; AI_THINKING_STRUCT->aiLogicId = 0;
AI_THINKING_STRUCT->movesetIndex = 0; AI_THINKING_STRUCT->movesetIndex = 0;
scriptsToRun = AI_THINKING_STRUCT->aiFlags; flags = AI_THINKING_STRUCT->aiFlags;
while (scriptsToRun != 0) while (flags != 0)
{ {
if (scriptsToRun & 1) if (flags & 1)
{ {
AI_THINKING_STRUCT->aiState = AIState_SettingUp; AI_THINKING_STRUCT->aiState = AIState_SettingUp;
BattleAI_DoAIProcessing(); BattleAI_DoAIProcessing();
} }
scriptsToRun >>= 1; flags >>= 1;
AI_THINKING_STRUCT->aiLogicId++; AI_THINKING_STRUCT->aiLogicId++;
AI_THINKING_STRUCT->movesetIndex = 0; AI_THINKING_STRUCT->movesetIndex = 0;
} }

View File

@ -60,7 +60,9 @@ void SetUpBattleVarsAndBirchZigzagoon(void)
gBattleControllerExecFlags = 0; gBattleControllerExecFlags = 0;
ClearBattleAnimationVars(); ClearBattleAnimationVars();
ClearBattleMonForms(); ClearBattleMonForms();
BattleAI_HandleItemUseBeforeAISetup(0xF); BattleAI_SetupItems();
BattleAI_SetupFlags();
BattleAI_SetupAIData(0xF);
if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
{ {

View File

@ -1405,8 +1405,8 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data)
data->modifyArrows.typeOfVal = VAL_BITFIELD_32; data->modifyArrows.typeOfVal = VAL_BITFIELD_32;
goto CASE_ITEM_STATUS; goto CASE_ITEM_STATUS;
case LIST_ITEM_AI: case LIST_ITEM_AI:
data->modifyArrows.modifiedValPtr = &gBattleStruct->debugAIFlags; data->modifyArrows.modifiedValPtr = &gBattleResources->ai->aiFlags;
data->modifyArrows.currValue = GetBitfieldValue(gBattleStruct->debugAIFlags, data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); data->modifyArrows.currValue = GetBitfieldValue(gBattleResources->ai->aiFlags, data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount);
data->modifyArrows.typeOfVal = VAL_BITFIELD_32; data->modifyArrows.typeOfVal = VAL_BITFIELD_32;
goto CASE_ITEM_STATUS; goto CASE_ITEM_STATUS;
CASE_ITEM_STATUS: CASE_ITEM_STATUS: