mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2025-02-09 14:53:01 +01:00
Dont clear AI flags on move choose. Will come in handy in smart ai switch logic
This commit is contained in:
parent
f7a7ddde0c
commit
53b9d4a224
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user