Expand battle struct macros inline, 2

This commit is contained in:
PikalaxALT 2021-06-30 13:07:10 -04:00
parent 6444d16985
commit f6abfb424c
7 changed files with 143 additions and 137 deletions

View File

@ -375,13 +375,21 @@ struct BattleStruct /* 0x2000000 */
/*0x160C1*/ u8 hpScale;
/*0x160C2*/ u16 unk160C2;
/*0x160C4*/ MainCallback unk160C4;
// Buffers used by the AI are indexed using (battler / 2)
// i.e. the flank bit, because at no point in game is the
// player's partner in a multi battle controlled by the AI.
// This is changed in Emerald to support the Tabitha fight
// in the Space Center.
/*0x160C8*/ u8 AI_monToSwitchIntoId[2];
/*0x160CA*/ u8 synchroniseEffect;
/*0x160CB*/ u8 multiplayerId;
/*0x160CC*/ u16 usedHeldItems[MAX_BATTLERS_COUNT];
/*0x160D4*/ u8 unk160D4[MAX_BATTLERS_COUNT];
/*0x160D8*/ u8 unk160D8[2];
/*0x160DA*/ u8 unk160DA[2];
// Space is reserved for two u16s, one for each opponent in
// doubles. However, only the lower byte of each is ever used.
/*0x160D4*/ u16 AI_usedItemId[2];
/*0x160D8*/ u8 AI_usedItemType[2];
/*0x160DA*/ u8 AI_usedItemEffect[2];
/*0x160DC*/ u8 unk160DC;
/*0x160DD*/ u8 intimidateBank;
/*0x160DE*/ u8 unk160DE;

View File

@ -89,20 +89,10 @@ extern u8 gSharedMem[];
// Battle Struct
// For matching purposes, the struct is placed at 0x02000000 and
// there's a ton of filler.
// This macro ensures that any changes to the battle struct
// definition will not horribly break things in battle.
#define BSTRUCT_OFF(member) (offsetof(struct BattleStruct, member) + ((u8 *)gBattleStruct - gSharedMem))
#define ewram16060(battler) (gSharedMem[BSTRUCT_OFF(unk16060) + battler])
#define BATTLE_PARTY_ID(battler) (gSharedMem[BSTRUCT_OFF(unk16064) + battler])
#define ewram16068arr(i) (gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + i])
#define ewram1606Carr(i, a) (gSharedMem[BSTRUCT_OFF(unk1606C) + i + a * 3])
#define ewram16094arr(battler) (gSharedMem[BSTRUCT_OFF(unk16094) + battler])
#define eHpOnSwitchout(battler) (gSharedMem[BSTRUCT_OFF(HP_OnSwitchout) + battler * 2])
#define ewram160C8arr(battler) (gSharedMem[BSTRUCT_OFF(AI_monToSwitchIntoId) + (battler / 2)])
#define USED_HELD_ITEMS(battler) (*(u16 *)&gSharedMem[BSTRUCT_OFF(usedHeldItems) + 2 * (battler)])
#define ewram160D4(battler) (gSharedMem[BSTRUCT_OFF(unk160D4) + (battler / 2) * 2])
#define ewram160D8(battler) (gSharedMem[BSTRUCT_OFF(unk160D8) + (battler / 2)])
#define ewram160DA(battler) (gSharedMem[BSTRUCT_OFF(unk160DA) + (battler >> 1)])
#define ewram160E0(i) (gSharedMem[BSTRUCT_OFF(unk160E0) + i])
#define ewram16400 (gSharedMem + 0x16400)
// gBattleResources

View File

@ -13,6 +13,7 @@
#include "constants/items.h"
#include "constants/moves.h"
#include "constants/species.h"
#include "constants/item_effects.h"
extern u8 gUnknown_02023A14_50;
@ -39,7 +40,7 @@ static bool8 ShouldSwitchIfPerishSong(void)
if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG
&& gDisableStructs[gActiveBattler].perishSongTimer1 == 0)
{
ewram160C8arr(GetBattlerPosition(gActiveBattler)) = 6; // gBattleStruct->AI_monToSwitchIntoId[GetBattlerPosition(gActiveBattler)] = 6;
gSharedMem[BSTRUCT_OFF(AI_monToSwitchIntoId) + (GetBattlerPosition(gActiveBattler)) / 2] = 6;
BtlController_EmitTwoReturnValues(1, 2, 0);
return TRUE;
}
@ -92,7 +93,7 @@ static bool8 ShouldSwitchIfWonderGuard(void)
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % 3 < 2)
{
// We found a mon.
ewram160C8arr(GetBattlerPosition(gActiveBattler)) = i; // gBattleStruct->AI_monToSwitchIntoId[GetBattlerPosition(gActiveBattler)] = i;
gSharedMem[BSTRUCT_OFF(AI_monToSwitchIntoId) + (GetBattlerPosition(gActiveBattler) / 2)] = i;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
@ -158,9 +159,9 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
continue;
if (i == gBattlerPartyIndexes[battlerIn2])
continue;
if (i == ewram16068arr(battlerIn1))
if (i == gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + battlerIn1])
continue;
if (i == ewram16068arr(battlerIn2))
if (i == gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + battlerIn2])
continue;
species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES);
@ -172,7 +173,7 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
if (absorbingTypeAbility == monAbility && Random() & 1)
{
// we found a mon
ewram160C8arr(GetBattlerPosition(gActiveBattler)) = i;
gSharedMem[BSTRUCT_OFF(AI_monToSwitchIntoId) + (GetBattlerPosition(gActiveBattler) / 2)] = i;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
@ -192,13 +193,13 @@ static bool8 ShouldSwitchIfNaturalCure(void)
if ((gLastLandedMoves[gActiveBattler] == 0 || gLastLandedMoves[gActiveBattler] == 0xFFFF) && Random() & 1)
{
ewram160C8arr(GetBattlerPosition(gActiveBattler)) = 6;
gSharedMem[BSTRUCT_OFF(AI_monToSwitchIntoId) + (GetBattlerPosition(gActiveBattler) / 2)] = 6;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0 && Random() & 1)
{
ewram160C8arr(GetBattlerPosition(gActiveBattler)) = 6;
gSharedMem[BSTRUCT_OFF(AI_monToSwitchIntoId) + (GetBattlerPosition(gActiveBattler) / 2)] = 6;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
@ -209,7 +210,7 @@ static bool8 ShouldSwitchIfNaturalCure(void)
return TRUE;
if (Random() & 1)
{
ewram160C8arr(GetBattlerPosition(gActiveBattler)) = 6;
gSharedMem[BSTRUCT_OFF(AI_monToSwitchIntoId) + (GetBattlerPosition(gActiveBattler) / 2)] = 6;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
@ -328,9 +329,9 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
continue;
if (i == gBattlerPartyIndexes[battlerIn2])
continue;
if (i == ewram16068arr(battlerIn1))
if (i == gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + battlerIn1])
continue;
if (i == ewram16068arr(battlerIn2))
if (i == gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + battlerIn2])
continue;
species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES);
@ -353,7 +354,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
moveFlags = AI_TypeCalc(move, gBattleMons[battlerIn1].species, gBattleMons[battlerIn1].ability);
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % moduloPercent == 0)
{
ewram160C8arr(GetBattlerPosition(gActiveBattler)) = i;
gSharedMem[BSTRUCT_OFF(AI_monToSwitchIntoId) + (GetBattlerPosition(gActiveBattler) / 2)] = i;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
@ -413,9 +414,9 @@ static bool8 ShouldSwitch(void)
continue;
if (i == gBattlerPartyIndexes[battlerIn2])
continue;
if (i == ewram16068arr(battlerIn1))
if (i == gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + battlerIn1])
continue;
if (i == ewram16068arr(battlerIn2))
if (i == gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + battlerIn2])
continue;
availableToSwitch++;
@ -450,7 +451,7 @@ void AI_TrySwitchOrUseItem(void)
{
if (ShouldSwitch())
{
if (ewram160C8arr(GetBattlerPosition(gActiveBattler)) == 6)
if (gSharedMem[BSTRUCT_OFF(AI_monToSwitchIntoId) + (GetBattlerPosition(gActiveBattler) / 2)] == 6)
{
s32 monToSwitchId = GetMostSuitableMonToSwitchInto();
if (monToSwitchId == 6)
@ -474,19 +475,19 @@ void AI_TrySwitchOrUseItem(void)
continue;
if (monToSwitchId == gBattlerPartyIndexes[battlerIn2])
continue;
if (monToSwitchId == ewram16068arr(battlerIn1))
if (monToSwitchId == gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + battlerIn1])
continue;
if (monToSwitchId == ewram16068arr(battlerIn2))
if (monToSwitchId == gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + battlerIn2])
continue;
break;
}
}
ewram160C8arr(GetBattlerPosition(gActiveBattler)) = monToSwitchId;
gSharedMem[BSTRUCT_OFF(AI_monToSwitchIntoId) + (GetBattlerPosition(gActiveBattler) / 2)] = monToSwitchId;
}
ewram16068arr(gActiveBattler) = ewram160C8arr(GetBattlerPosition(gActiveBattler));
gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + gActiveBattler] = gSharedMem[BSTRUCT_OFF(AI_monToSwitchIntoId) + (GetBattlerPosition(gActiveBattler) / 2)];
return;
}
else
@ -573,8 +574,8 @@ u8 GetMostSuitableMonToSwitchInto(void)
&& !(gBitTable[i] & invalidMons)
&& gBattlerPartyIndexes[battlerIn1] != i
&& gBattlerPartyIndexes[battlerIn2] != i
&& i != ewram16068arr(battlerIn1)
&& i != ewram16068arr(battlerIn2))
&& i != gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + battlerIn1]
&& i != gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + battlerIn2])
{
u8 type1 = gBaseStats[species].type1;
u8 type2 = gBaseStats[species].type2;
@ -633,9 +634,9 @@ u8 GetMostSuitableMonToSwitchInto(void)
continue;
if (gBattlerPartyIndexes[battlerIn2] == i)
continue;
if (i == ewram16068arr(battlerIn1))
if (i == gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + battlerIn1])
continue;
if (i == ewram16068arr(battlerIn2))
if (i == gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + battlerIn2])
continue;
for (j = 0; j < 4; j++)
@ -711,9 +712,9 @@ static bool8 ShouldUseItem(void)
else
itemEffects = gItemEffectTable[item - 13];
ewram160D8(gActiveBattler) = GetAI_ItemType(item, itemEffects);
gSharedMem[BSTRUCT_OFF(AI_usedItemType) + (gActiveBattler / 2)] = GetAI_ItemType(item, itemEffects);
switch (ewram160D8(gActiveBattler))
switch (gSharedMem[BSTRUCT_OFF(AI_usedItemType) + (gActiveBattler / 2)])
{
case AI_ITEM_FULL_RESTORE:
if (gBattleMons[gActiveBattler].hp >= gBattleMons[gActiveBattler].maxHP / 4)
@ -732,54 +733,54 @@ static bool8 ShouldUseItem(void)
shouldUse = TRUE;
break;
case AI_ITEM_CURE_CONDITION:
ewram160DA(gActiveBattler) = 0;
if (itemEffects[3] & 0x20 && gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gActiveBattler / 2)] = 0;
if (itemEffects[3] & ITEM3_SLEEP && gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)
{
ewram160DA(gActiveBattler) |= 0x20;
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gActiveBattler / 2)] |= 0x20;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x10 && (gBattleMons[gActiveBattler].status1 & STATUS1_POISON || gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON))
if (itemEffects[3] & ITEM3_POISON && (gBattleMons[gActiveBattler].status1 & STATUS1_POISON || gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON))
{
ewram160DA(gActiveBattler) |= 0x10;
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gActiveBattler / 2)] |= 0x10;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x8 && gBattleMons[gActiveBattler].status1 & STATUS1_BURN)
if (itemEffects[3] & ITEM3_BURN && gBattleMons[gActiveBattler].status1 & STATUS1_BURN)
{
ewram160DA(gActiveBattler) |= 0x8;
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gActiveBattler / 2)] |= 0x8;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x4 && gBattleMons[gActiveBattler].status1 & STATUS1_FREEZE)
if (itemEffects[3] & ITEM3_FREEZE && gBattleMons[gActiveBattler].status1 & STATUS1_FREEZE)
{
ewram160DA(gActiveBattler) |= 0x4;
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gActiveBattler / 2)] |= 0x4;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x2 && gBattleMons[gActiveBattler].status1 & STATUS1_PARALYSIS)
if (itemEffects[3] & ITEM3_PARALYSIS && gBattleMons[gActiveBattler].status1 & STATUS1_PARALYSIS)
{
ewram160DA(gActiveBattler) |= 0x2;
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gActiveBattler / 2)] |= 0x2;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x1 && gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)
if (itemEffects[3] & ITEM3_CONFUSION && gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)
{
ewram160DA(gActiveBattler) |= 0x1;
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gActiveBattler / 2)] |= 0x1;
shouldUse = TRUE;
}
break;
case AI_ITEM_X_STAT:
ewram160DA(gActiveBattler) = 0;
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gActiveBattler / 2)] = 0;
if (gDisableStructs[gActiveBattler].isFirstTurn == 0)
break;
if (itemEffects[0] & 0xF)
ewram160DA(gActiveBattler) |= 0x1;
if (itemEffects[1] & 0xF0)
ewram160DA(gActiveBattler) |= 0x2;
if (itemEffects[1] & 0xF)
ewram160DA(gActiveBattler) |= 0x4;
if (itemEffects[2] & 0xF)
ewram160DA(gActiveBattler) |= 0x8;
if (itemEffects[2] & 0xF0)
ewram160DA(gActiveBattler) |= 0x20;
if (itemEffects[0] & 0x30)
ewram160DA(gActiveBattler) |= 0x80;
if (itemEffects[0] & ITEM0_X_ATTACK)
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gActiveBattler / 2)] |= 0x1;
if (itemEffects[1] & ITEM1_X_DEFEND)
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gActiveBattler / 2)] |= 0x2;
if (itemEffects[1] & ITEM1_X_SPEED)
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gActiveBattler / 2)] |= 0x4;
if (itemEffects[2] & ITEM2_X_SPATK)
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gActiveBattler / 2)] |= 0x8;
if (itemEffects[2] & ITEM2_X_ACCURACY)
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gActiveBattler / 2)] |= 0x20;
if (itemEffects[0] & ITEM0_DIRE_HIT)
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gActiveBattler / 2)] |= 0x80;
shouldUse = TRUE;
break;
case AI_ITEM_GUARD_SPECS:
@ -794,7 +795,11 @@ static bool8 ShouldUseItem(void)
if (shouldUse)
{
BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0);
ewram160D4(gActiveBattler) = item;
// The AI will only ever use an item whose ID fits in 8 bits.
// If you want the AI to use an item with a higher ID, uncomment the line below.
// See also: battle_controller_opponent.c:OpponentHandleOpenBag
gSharedMem[BSTRUCT_OFF(AI_usedItemId) + (gActiveBattler / 2) * 2] = item;
// gSharedMem[BSTRUCT_OFF(AI_usedItemId) + (gActiveBattler / 2) * 2 + 1] = item >> 8;
AI_BATTLE_HISTORY->trainerItems[i] = 0;
return shouldUse;
}

View File

@ -1800,8 +1800,10 @@ void OpponentHandlecmd20(void)
void OpponentHandleOpenBag(void)
{
// What is this?
BtlController_EmitOneReturnValue(1, ewram160D4(gActiveBattler));
// The AI will only ever use an item whose ID fits in 8 bits.
// If you want the AI to use an item with a higher ID, uncomment the code
// in the line below.
BtlController_EmitOneReturnValue(1, gSharedMem[BSTRUCT_OFF(AI_usedItemId) + (gActiveBattler / 2) * 2]/* | (gSharedMem[BSTRUCT_OFF(AI_usedItemId) + (gActiveBattler / 2) * 2 + 1] */);
OpponentBufferExecCompleted();
}
@ -1809,7 +1811,7 @@ void OpponentHandlecmd22(void)
{
s32 r4;
if (ewram160C8arr(GetBattlerPosition(gActiveBattler)) == 6)
if (gSharedMem[BSTRUCT_OFF(AI_monToSwitchIntoId) + (GetBattlerPosition(gActiveBattler) / 2)] == PARTY_SIZE)
{
u8 r6;
u8 r5;
@ -1838,10 +1840,10 @@ void OpponentHandlecmd22(void)
}
else
{
r4 = ewram160C8arr(GetBattlerPosition(gActiveBattler));
ewram160C8arr(GetBattlerPosition(gActiveBattler)) = 6;
r4 = gSharedMem[BSTRUCT_OFF(AI_monToSwitchIntoId) + (GetBattlerPosition(gActiveBattler) / 2)];
gSharedMem[BSTRUCT_OFF(AI_monToSwitchIntoId) + (GetBattlerPosition(gActiveBattler) / 2)] = PARTY_SIZE;
}
ewram16068arr(gActiveBattler) = r4;
gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + gActiveBattler] = r4;
BtlController_EmitChosenMonReturnValue(1, r4, 0);
OpponentBufferExecCompleted();
}

View File

@ -47,6 +47,7 @@
#include "scanline_effect.h"
#include "util.h"
#include "ewram.h"
#include "battle_string_ids.h"
struct UnknownStruct7
{
@ -4019,7 +4020,7 @@ void BattleBeginFirstTurn(void)
;
for (i = 0; i < 4; i++)
{
ewram16068arr(i) = 6;
gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + i] = PARTY_SIZE;
gActionForBanks[i] = 0xFF;
gChosenMovesByBanks[i] = 0;
}
@ -4111,7 +4112,7 @@ void BattleTurnPassed(void)
gChosenMovesByBanks[i] = 0;
}
for (i = 0; i < 4; i++)
ewram16068arr(i) = 6;
gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + i] = 6;
gBattleStruct->unk160A6 = gAbsentBattlerFlags;
gBattleMainFunc = sub_8012324;
gRandomTurnNumber = Random();
@ -4185,23 +4186,23 @@ void sub_8012258(u8 a)
u8 r1;
for (i = 0; i < 3; i++)
gUnknown_02038470[i] = ewram1606Carr(i, a);
gUnknown_02038470[i] = gSharedMem[BSTRUCT_OFF(unk1606C) + i + a * 3];
r4 = pokemon_order_func(gBattlerPartyIndexes[a]);
r1 = pokemon_order_func(ewram16068arr(a));
r1 = pokemon_order_func(gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + a]);
sub_8094C98(r4, r1);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
for (i = 0; i < 3; i++)
{
ewram1606Carr(i, a) = gUnknown_02038470[i];
ewram1606Carr(i, (a ^ 2)) = gUnknown_02038470[i];
gSharedMem[BSTRUCT_OFF(unk1606C) + i + a * 3] = gUnknown_02038470[i];
gSharedMem[BSTRUCT_OFF(unk1606C) + i + (a ^ BIT_FLANK) * 3] = gUnknown_02038470[i];
}
}
else
{
for (i = 0; i < 3; i++)
{
ewram1606Carr(i, a) = gUnknown_02038470[i];
gSharedMem[BSTRUCT_OFF(unk1606C) + i + a * 3] = gUnknown_02038470[i];
}
}
}
@ -4238,7 +4239,7 @@ void sub_8012324(void)
switch (gBattleCommunication[gActiveBattler])
{
case STATE_BEFORE_ACTION_CHOSEN:
ewram16068arr(gActiveBattler) = 6;
gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + gActiveBattler] = 6;
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)
&& (position & BIT_FLANK) != B_FLANK_LEFT
&& !(gBattleStruct->unk160A6 & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(position))])
@ -4279,8 +4280,8 @@ void sub_8012324(void)
if (AreAllMovesUnusable())
{
gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;
ewram16060(gActiveBattler) = FALSE;
ewram16094arr(gActiveBattler) = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
gSharedMem[BSTRUCT_OFF(unk16060) + gActiveBattler] = FALSE;
gSharedMem[BSTRUCT_OFF(unk16094) + gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
gSharedMem[BSTRUCT_OFF(moveTarget) + gActiveBattler] = gBattleBufferB[gActiveBattler][3];
return;
}
@ -4326,8 +4327,8 @@ void sub_8012324(void)
{
gSelectionBattleScripts[gActiveBattler] = BattleScript_ActionSelectionItemsCantBeUsed;
gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;
ewram16060(gActiveBattler) = FALSE;
ewram16094arr(gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN;
gSharedMem[BSTRUCT_OFF(unk16060) + gActiveBattler] = FALSE;
gSharedMem[BSTRUCT_OFF(unk16094) + gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;
return;
}
else
@ -4337,7 +4338,7 @@ void sub_8012324(void)
}
break;
case B_ACTION_SWITCH:
BATTLE_PARTY_ID(gActiveBattler) = gBattlerPartyIndexes[gActiveBattler];
gSharedMem[BSTRUCT_OFF(unk16064) + gActiveBattler] = gBattlerPartyIndexes[gActiveBattler];
if (gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)
|| gStatuses3[gActiveBattler] & STATUS3_ROOTED)
{
@ -4355,9 +4356,9 @@ void sub_8012324(void)
else
{
if (gActiveBattler == 2 && gActionForBanks[0] == B_ACTION_SWITCH)
BtlController_EmitChoosePokemon(0, PARTY_CHOOSE_MON, ewram16068arr(0), ABILITY_NONE, &gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * gActiveBattler + 0]);
BtlController_EmitChoosePokemon(0, PARTY_CHOOSE_MON, gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + 0], ABILITY_NONE, &gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * gActiveBattler + 0]);
else if (gActiveBattler == 3 && gActionForBanks[1] == B_ACTION_SWITCH)
BtlController_EmitChoosePokemon(0, PARTY_CHOOSE_MON, ewram16068arr(1), ABILITY_NONE, &gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * gActiveBattler + 0]);
BtlController_EmitChoosePokemon(0, PARTY_CHOOSE_MON, gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + 1], ABILITY_NONE, &gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * gActiveBattler + 0]);
else
BtlController_EmitChoosePokemon(0, PARTY_CHOOSE_MON, 6, ABILITY_NONE, &gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * gActiveBattler + 0]);
}
@ -4368,8 +4369,8 @@ void sub_8012324(void)
{
gSelectionBattleScripts[gActiveBattler] = BattleScript_PrintFullBox;
gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;
ewram16060(gActiveBattler) = FALSE;
ewram16094arr(gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN;
gSharedMem[BSTRUCT_OFF(unk16060) + gActiveBattler] = FALSE;
gSharedMem[BSTRUCT_OFF(unk16094) + gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;
return;
}
break;
@ -4397,8 +4398,8 @@ void sub_8012324(void)
{
gSelectionBattleScripts[gActiveBattler] = BattleScript_PrintCantEscapeFromBattle;
gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;
ewram16060(gActiveBattler) = FALSE;
ewram16094arr(gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN;
gSharedMem[BSTRUCT_OFF(unk16060) + gActiveBattler] = FALSE;
gSharedMem[BSTRUCT_OFF(unk16094) + gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;
return;
}
else
@ -4432,9 +4433,9 @@ void sub_8012324(void)
else if (TrySetCantSelectMoveBattleScript())
{
gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;
ewram16060(gActiveBattler) = FALSE;
gSharedMem[BSTRUCT_OFF(unk16060) + gActiveBattler] = FALSE;
gBattleBufferB[gActiveBattler][1] = 0;
ewram16094arr(gActiveBattler) = STATE_WAIT_ACTION_CHOSEN;
gSharedMem[BSTRUCT_OFF(unk16094) + gActiveBattler] = STATE_WAIT_ACTION_CHOSEN;
return;
}
else
@ -4465,7 +4466,7 @@ void sub_8012324(void)
}
else
{
ewram16068arr(gActiveBattler) = gBattleBufferB[gActiveBattler][1];
gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + gActiveBattler] = gBattleBufferB[gActiveBattler][1];
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
@ -4473,9 +4474,9 @@ void sub_8012324(void)
gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * gActiveBattler + 0] |= (gBattleBufferB[gActiveBattler][2] & 0xF0);
gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * gActiveBattler + 1] = gBattleBufferB[gActiveBattler][3];
ewram1606Carr(0, (gActiveBattler ^ BIT_FLANK)) &= (0xF0);
ewram1606Carr(0, (gActiveBattler ^ BIT_FLANK)) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4;
ewram1606Carr(2, (gActiveBattler ^ BIT_FLANK)) = gBattleBufferB[gActiveBattler][3];
gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * (gActiveBattler ^ BIT_FLANK) + 0] &= (0xF0);
gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * (gActiveBattler ^ BIT_FLANK) + 0] |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4;
gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * (gActiveBattler ^ BIT_FLANK) + 2] = gBattleBufferB[gActiveBattler][3];
}
gBattleCommunication[gActiveBattler]++;
}
@ -4537,9 +4538,9 @@ void sub_8012324(void)
}
break;
case STATE_SELECTION_SCRIPT:
if (ewram16060(gActiveBattler))
if (gSharedMem[BSTRUCT_OFF(unk16060) + gActiveBattler])
{
gBattleCommunication[gActiveBattler] = ewram16094arr(gActiveBattler);
gBattleCommunication[gActiveBattler] = gSharedMem[BSTRUCT_OFF(unk16094) + gActiveBattler];
}
else
{
@ -5366,7 +5367,7 @@ void HandleAction_Switch(void)
gActionSelectionCursor[gBattlerAttacker] = 0;
gMoveSelectionCursor[gBattlerAttacker] = 0;
PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, BATTLE_PARTY_ID(gBattlerAttacker))
PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gSharedMem[BSTRUCT_OFF(unk16064) + gBattlerAttacker])
gBattleStruct->scriptingActive = gBattlerAttacker;
gBattlescriptCurrInstr = BattleScript_ActionSwitch;
@ -5399,41 +5400,41 @@ void HandleAction_UseItem(void)
else
{
switch (ewram160D8((gBattleStruct->scriptingActive = gBattlerAttacker)))
switch (gSharedMem[BSTRUCT_OFF(AI_usedItemType) + ((gBattleStruct->scriptingActive = gBattlerAttacker) / 2)])
{
case AI_ITEM_FULL_RESTORE:
case AI_ITEM_HEAL_HP:
break;
case AI_ITEM_CURE_CONDITION:
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
if (ewram160DA(gBattlerAttacker) & 1)
if (gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gBattlerAttacker >> 1)] & 1)
{
if (ewram160DA(gBattlerAttacker) & 0x3E)
if (gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gBattlerAttacker >> 1)] & 0x3E)
gBattleCommunication[MULTISTRING_CHOOSER] = 5;
}
else
{
while (!(ewram160DA(gBattlerAttacker) & 1))
while (!(gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gBattlerAttacker >> 1)] & 1))
{
ewram160DA(gBattlerAttacker) >>= 1;
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gBattlerAttacker >> 1)] >>= 1;
gBattleCommunication[MULTISTRING_CHOOSER]++;
}
}
break;
case AI_ITEM_X_STAT:
gBattleCommunication[MULTISTRING_CHOOSER] = 4;
if (ewram160DA(gBattlerAttacker) & 0x80)
if (gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gBattlerAttacker >> 1)] & 0x80)
{
gBattleCommunication[MULTISTRING_CHOOSER] = 5;
}
else
{
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK)
PREPARE_STRING_BUFFER(gBattleTextBuff2, 0xD2)
PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE)
while (!(ewram160DA(gBattlerAttacker) & 1))
while (!(gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gBattlerAttacker >> 1)] & 1))
{
ewram160DA(gBattlerAttacker) >>= 1;
gSharedMem[BSTRUCT_OFF(AI_usedItemEffect) + (gBattlerAttacker >> 1)] >>= 1;
gBattleTextBuff1[2]++;
}
@ -5449,7 +5450,7 @@ void HandleAction_UseItem(void)
break;
}
gBattlescriptCurrInstr = gBattlescriptsForUsingItem[ewram160D8(gBattlerAttacker)];
gBattlescriptCurrInstr = gBattlescriptsForUsingItem[gSharedMem[BSTRUCT_OFF(AI_usedItemType) + (gBattlerAttacker / 2)]];
}
gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
}

View File

@ -2686,7 +2686,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg)
{gBattlescriptCurrInstr++; return;}
gLastUsedItem = gBattleMons[gBattlerTarget].item;
*USED_HELD_ITEM(gBattlerTarget) = gLastUsedItem;
*((u16 *)&gSharedMem[BSTRUCT_OFF(usedHeldItems) + gBattlerTarget * 2]) = gLastUsedItem;
gBattleMons[gBattlerTarget].item = 0;
gActiveBattler = gBattlerAttacker;
@ -2700,7 +2700,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg)
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_ItemSteal;
*CHOICED_MOVE(gBattlerTarget) = 0;
*((u16 *)&gSharedMem[BSTRUCT_OFF(choicedMove) + gBattlerTarget * 2]) = MOVE_NONE;
}
break;
case 32: //escape prevention
@ -6010,7 +6010,7 @@ static void atk43_jumpifabilitypresent(void)
static void atk44_endselectionscript(void)
{
ewram16060(gBattlerAttacker) = 1;
gSharedMem[BSTRUCT_OFF(unk16060) + gBattlerAttacker] = 1;
}
static void atk45_playanimation(void)
@ -6863,7 +6863,7 @@ static void atk4C_getswitchedmondata(void)
gActiveBattler = GetBattlerForBattleScript(T2_READ_8(gBattlescriptCurrInstr + 1));
gBattlerPartyIndexes[gActiveBattler] = ewram16068arr(gActiveBattler);
gBattlerPartyIndexes[gActiveBattler] = gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + gActiveBattler];
BtlController_EmitGetMonData(0, 0, gBitTable[gBattlerPartyIndexes[gActiveBattler]]);
MarkBattlerForControllerExec(gActiveBattler);
@ -7006,7 +7006,7 @@ static void atk4F_jumpifcantswitch(void)
void sub_8022A3C(u8 unkown)
{
BATTLE_PARTY_ID(gActiveBattler) = gBattlerPartyIndexes[gActiveBattler];
gSharedMem[BSTRUCT_OFF(unk16064) + gActiveBattler] = gBattlerPartyIndexes[gActiveBattler];
BtlController_EmitChoosePokemon(0, 1, unkown, 0, gBattleStruct->unk1606C[gActiveBattler]);
MarkBattlerForControllerExec(gActiveBattler);
}
@ -8094,7 +8094,7 @@ static void atk51_switchhandleorder(void)
for (i = 0; i < gBattlersCount; i++)
{
if (gBattleBufferB[i][0] == 0x22)
ewram16068arr(i) = gBattleBufferB[i][1];
gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + i] = gBattleBufferB[i][1];
}
break;
case 1:
@ -8103,15 +8103,15 @@ static void atk51_switchhandleorder(void)
break;
case 2:
gBattleCommunication[0] = gBattleBufferB[gActiveBattler][1];
ewram16068arr(gActiveBattler) = gBattleBufferB[gActiveBattler][1];
gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + gActiveBattler] = gBattleBufferB[gActiveBattler][1];
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * gActiveBattler + 0] &= 0xF;
gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * gActiveBattler + 0] |= (gBattleBufferB[gActiveBattler][2] & 0xF0);
gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * gActiveBattler + 1] = gBattleBufferB[gActiveBattler][3];
ewram1606Carr(0, (gActiveBattler ^ 2)) &= (0xF0);
ewram1606Carr(0, (gActiveBattler ^ 2)) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4;
ewram1606Carr(2, (gActiveBattler ^ 2)) = gBattleBufferB[gActiveBattler][3];
gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * (gActiveBattler ^ BIT_FLANK) + 0] &= (0xF0);
gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * (gActiveBattler ^ BIT_FLANK) + 0] |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4;
gSharedMem[BSTRUCT_OFF(unk1606C) + 3 * (gActiveBattler ^ BIT_FLANK) + 2] = gBattleBufferB[gActiveBattler][3];
}
else
sub_8012258(gActiveBattler);
@ -9038,7 +9038,7 @@ static void atk69_adjustsetdamage(void) //literally a copy of atk07 except there
void atk6A_removeitem(void)
{
gActiveBattler = GetBattlerForBattleScript(T2_READ_8(gBattlescriptCurrInstr + 1));
USED_HELD_ITEMS(gActiveBattler) = gBattleMons[gActiveBattler].item;
*((u16 *)&gSharedMem[BSTRUCT_OFF(usedHeldItems) + gActiveBattler * 2]) = gBattleMons[gActiveBattler].item;
gBattleMons[gActiveBattler].item = 0;
BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item);
@ -9570,7 +9570,7 @@ static void atk74_hpthresholds2(void)
{
gActiveBattler = GetBattlerForBattleScript(T2_READ_8(gBattlescriptCurrInstr + 1));
opposing_bank = gActiveBattler ^ 1;
hp_switchout = eHpOnSwitchout(GetBattlerSide(opposing_bank)); //gBattleStruct->HP_OnSwitchout[GetBattlerSide(opposing_bank)];
hp_switchout = gSharedMem[BSTRUCT_OFF(HP_OnSwitchout) + GetBattlerSide(opposing_bank) * 2];
result = (hp_switchout - gBattleMons[opposing_bank].hp) * 100 / hp_switchout;
if (gBattleMons[opposing_bank].hp >= hp_switchout)
@ -10294,7 +10294,7 @@ static bool8 sub_80264C0(void)
{
if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level)
{
BATTLE_PARTY_ID(gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget];
gSharedMem[BSTRUCT_OFF(unk16064) + gBattlerTarget] = gBattlerPartyIndexes[gBattlerTarget];
}
else
{
@ -10304,7 +10304,7 @@ static bool8 sub_80264C0(void)
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
return 0;
}
BATTLE_PARTY_ID(gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget];
gSharedMem[BSTRUCT_OFF(unk16064) + gBattlerTarget] = gBattlerPartyIndexes[gBattlerTarget];
}
gBattlescriptCurrInstr = BattleScript_SuccessForceOut;
return 1;
@ -10385,7 +10385,7 @@ static void atk8F_forcerandomswitch(void)
} while (i == gBattlerPartyIndexes[gBattlerTarget] || !MON_CAN_BATTLE(&party[i]));
}
}
ewram16068arr(gBattlerTarget) = i;
gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + gBattlerTarget] = i;
if (!IsLinkDoubleBattle())
sub_8012258(gBattlerTarget);
sub_8094B6C(gBattlerTarget, i, 0);
@ -13114,7 +13114,7 @@ static void atkE2_switchoutabilities(void)
{
case ABILITY_NATURAL_CURE:
gBattleMons[gActiveBattler].status1 = 0;
BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, gBitTable[BATTLE_PARTY_ID(gActiveBattler)], 4, &gBattleMons[gActiveBattler].status1);
BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, gBitTable[gSharedMem[BSTRUCT_OFF(unk16064) + gActiveBattler]], 4, &gBattleMons[gActiveBattler].status1);
MarkBattlerForControllerExec(gActiveBattler);
break;
}
@ -13266,7 +13266,7 @@ static void atkEA_tryrecycleitem(void)
{
u16* used_item;
gActiveBattler = gBattlerAttacker;
used_item = &USED_HELD_ITEMS(gActiveBattler);
used_item = ((u16 *)&gSharedMem[BSTRUCT_OFF(usedHeldItems) + gActiveBattler * 2]);
if (*used_item && gBattleMons[gActiveBattler].item == 0)
{
gLastUsedItem = *used_item;

View File

@ -1657,28 +1657,28 @@ bool8 sub_8018018(u8 bank, u8 r1, u8 r2)
}
else
{
if (GetBattlerSide(bank) == 1)
if (GetBattlerSide(bank) == B_SIDE_OPPONENT)
{
r7 = GetBattlerAtPosition(1);
r6 = GetBattlerAtPosition(3);
r7 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
r6 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
party = gEnemyParty;
}
else
{
r7 = GetBattlerAtPosition(0);
r6 = GetBattlerAtPosition(2);
r7 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
r6 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
party = gPlayerParty;
}
if (r1 == 6)
if (r1 == PARTY_SIZE)
r1 = gBattlerPartyIndexes[r7];
if (r2 == 6)
if (r2 == PARTY_SIZE)
r2 = gBattlerPartyIndexes[r6];
for (i = 0; i < 6; i++)
for (i = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(&party[i], MON_DATA_HP) && GetMonData(&party[i], MON_DATA_SPECIES2) && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG && i != r1 && i != r2 && i != ewram16068arr(r7) && i != ewram16068arr(r6))
if (GetMonData(&party[i], MON_DATA_HP) && GetMonData(&party[i], MON_DATA_SPECIES2) && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG && i != r1 && i != r2 && i != gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + r7] && i != gSharedMem[BSTRUCT_OFF(monToSwitchIntoId) + r6])
break;
}
return (i == 6);
return (i == PARTY_SIZE);
}
}