Battle files - review changes

This commit is contained in:
DizzyEggg 2018-07-16 20:47:30 +02:00
parent ea5ffa3375
commit bf0178238a
13 changed files with 95 additions and 82 deletions

View File

@ -214,8 +214,8 @@ struct SpecialStatus
{ {
u8 statLowered:1; // 0x1 u8 statLowered:1; // 0x1
u8 lightningRodRedirected:1; // 0x2 u8 lightningRodRedirected:1; // 0x2
u8 restoredBankSprite: 1; // 0x4 u8 restoredBattlerSprite: 1; // 0x4
u8 intimidatedPoke:1; // 0x8 u8 intimidatedMon:1; // 0x8
u8 traced:1; // 0x10 u8 traced:1; // 0x10
u8 flag20:1; u8 flag20:1;
u8 flag40:1; u8 flag40:1;
@ -607,8 +607,8 @@ struct BattleScripting
// rom_80A5C6C // rom_80A5C6C
u8 GetBattlerSide(u8 battler); u8 GetBattlerSide(u8 battler);
u8 GetBattlerPosition(u8 bank); u8 GetBattlerPosition(u8 battler);
u8 GetBattlerAtPosition(u8 bank); u8 GetBattlerAtPosition(u8 battler);
struct BattleSpriteInfo struct BattleSpriteInfo
{ {

View File

@ -81,7 +81,7 @@ enum
#define INSTANT_HP_BAR_DROP 32767 #define INSTANT_HP_BAR_DROP 32767
// Special return values in gBattleBufferB from Battle Controller functions. // Special return values in gBattleBufferB from Battle Controller functions.
#define RET_VALUE_LEVELLED_UP 11 #define RET_VALUE_LEVELED_UP 11
struct UnusedControllerStruct struct UnusedControllerStruct
{ {

View File

@ -862,9 +862,9 @@
// Special Trainer Ids. // Special Trainer Ids.
#define TRAINER_FRONTIER_BRAIN 1022 #define TRAINER_FRONTIER_BRAIN 1022
#define TRAINER_SECRET_BASE 1024 #define TRAINER_SECRET_BASE 1024
#define TRAINER_LINK_OPPONENT 0x800 #define TRAINER_LINK_OPPONENT 2048
#define TRAINER_OPPONENT_C00 0xC00 #define TRAINER_OPPONENT_C00 3072
#define TRAINER_STEVEN_PARTNER 0xC03 #define TRAINER_STEVEN_PARTNER 3075
#define TRAINER_PIC_HIKER 0 #define TRAINER_PIC_HIKER 0
#define TRAINER_PIC_AQUA_GRUNT_M 1 #define TRAINER_PIC_AQUA_GRUNT_M 1

View File

@ -582,6 +582,7 @@
#define BLDCNT_TGT1_BG3 (1 << 3) #define BLDCNT_TGT1_BG3 (1 << 3)
#define BLDCNT_TGT1_OBJ (1 << 4) #define BLDCNT_TGT1_OBJ (1 << 4)
#define BLDCNT_TGT1_BD (1 << 5) #define BLDCNT_TGT1_BD (1 << 5)
#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD)
// Bits 6-7 select the special effect // Bits 6-7 select the special effect
#define BLDCNT_EFFECT_NONE (0 << 6) // no special effect #define BLDCNT_EFFECT_NONE (0 << 6) // no special effect
#define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA) #define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA)
@ -594,6 +595,7 @@
#define BLDCNT_TGT2_BG3 (1 << 11) #define BLDCNT_TGT2_BG3 (1 << 11)
#define BLDCNT_TGT2_OBJ (1 << 12) #define BLDCNT_TGT2_OBJ (1 << 12)
#define BLDCNT_TGT2_BD (1 << 13) #define BLDCNT_TGT2_BD (1 << 13)
#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD)
// BLDALPHA // BLDALPHA
#define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1)) #define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1))

View File

@ -352,7 +352,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves)
if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])
gBattlerTarget ^= BIT_FLANK; gBattlerTarget ^= BIT_FLANK;
} }
// There's only one choice in signle battles. // There's only one choice in single battles.
else else
{ {
gBattlerTarget = sBattler_AI ^ BIT_SIDE; gBattlerTarget = sBattler_AI ^ BIT_SIDE;
@ -774,7 +774,7 @@ static void BattleAICmd_if_status(void)
status = T1_READ_32(gAIScriptPtr + 2); status = T1_READ_32(gAIScriptPtr + 2);
if ((gBattleMons[battlerId].status1 & status)) if (gBattleMons[battlerId].status1 & status)
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6);
else else
gAIScriptPtr += 10; gAIScriptPtr += 10;
@ -846,7 +846,7 @@ static void BattleAICmd_if_status3(void)
status = T1_READ_32(gAIScriptPtr + 2); status = T1_READ_32(gAIScriptPtr + 2);
if ((gStatuses3[battlerId] & status)) if (gStatuses3[battlerId] & status)
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6);
else else
gAIScriptPtr += 10; gAIScriptPtr += 10;
@ -883,7 +883,7 @@ static void BattleAICmd_if_side_affecting(void)
side = GET_BATTLER_SIDE(battlerId); side = GET_BATTLER_SIDE(battlerId);
status = T1_READ_32(gAIScriptPtr + 2); status = T1_READ_32(gAIScriptPtr + 2);
if ((gSideStatuses[side] & status)) if (gSideStatuses[side] & status)
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6);
else else
gAIScriptPtr += 10; gAIScriptPtr += 10;
@ -1949,7 +1949,7 @@ static void BattleAICmd_if_curr_move_disabled_or_encored(void)
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else else
gAIScriptPtr += 6; gAIScriptPtr += 6;
break;; break;
case 1: case 1:
if (gDisableStructs[gActiveBattler].encoredMove == AI_THINKING_STRUCT->moveConsidered) if (gDisableStructs[gActiveBattler].encoredMove == AI_THINKING_STRUCT->moveConsidered)
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);

View File

@ -1169,7 +1169,7 @@ static void Task_GiveExpToMon(u8 taskId)
gainedExp -= nextLvlExp - currExp; gainedExp -= nextLvlExp - currExp;
savedActiveBattler = gActiveBattler; savedActiveBattler = gActiveBattler;
gActiveBattler = battlerId; gActiveBattler = battlerId;
BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELLED_UP, gainedExp); BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp);
gActiveBattler = savedActiveBattler; gActiveBattler = savedActiveBattler;
if (IsDoubleBattle() == TRUE if (IsDoubleBattle() == TRUE
@ -1248,7 +1248,7 @@ static void sub_8059400(u8 taskId)
gainedExp -= expOnNextLvl - currExp; gainedExp -= expOnNextLvl - currExp;
savedActiveBattler = gActiveBattler; savedActiveBattler = gActiveBattler;
gActiveBattler = battlerId; gActiveBattler = battlerId;
BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELLED_UP, gainedExp); BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp);
gActiveBattler = savedActiveBattler; gActiveBattler = savedActiveBattler;
gTasks[taskId].func = Task_LaunchLvlUpAnim; gTasks[taskId].func = Task_LaunchLvlUpAnim;
} }

View File

@ -345,7 +345,7 @@ static void Task_GiveExpToMon(u8 taskId)
gainedExp -= nextLvlExp - currExp; gainedExp -= nextLvlExp - currExp;
savedActiveBank = gActiveBattler; savedActiveBank = gActiveBattler;
gActiveBattler = battlerId; gActiveBattler = battlerId;
BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELLED_UP, gainedExp); BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp);
gActiveBattler = savedActiveBank; gActiveBattler = savedActiveBank;
if (IsDoubleBattle() == TRUE if (IsDoubleBattle() == TRUE
@ -424,7 +424,7 @@ static void sub_81BB4E4(u8 taskId)
gainedExp -= expOnNextLvl - currExp; gainedExp -= expOnNextLvl - currExp;
savedActiveBank = gActiveBattler; savedActiveBank = gActiveBattler;
gActiveBattler = battlerId; gActiveBattler = battlerId;
BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELLED_UP, gainedExp); BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp);
gActiveBattler = savedActiveBank; gActiveBattler = savedActiveBank;
gTasks[taskId].func = sub_81BB628; gTasks[taskId].func = sub_81BB628;
} }

View File

@ -1710,8 +1710,8 @@ void Task_HidePartyStatusSummary(u8 taskId)
for (i = 0; i < PARTY_SIZE; i++) for (i = 0; i < PARTY_SIZE; i++)
ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i); ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i);
SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
SetGpuReg(REG_OFFSET_BLDALPHA, 0x10); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
gTasks[taskId].tData15 = 16; gTasks[taskId].tData15 = 16;

View File

@ -2940,19 +2940,19 @@ static void ChooseTypeOfMoveUsedString(u8* dst)
void BattlePutTextOnWindow(const u8 *text, u8 windowId) void BattlePutTextOnWindow(const u8 *text, u8 windowId)
{ {
const struct BattleWindowText *textInfo = sBattleTextOnWindowsInfo[gBattleScripting.windowsType]; const struct BattleWindowText *textInfo = sBattleTextOnWindowsInfo[gBattleScripting.windowsType];
bool32 toVram; bool32 copyToVram;
struct TextSubPrinter textSubPrinter; struct TextSubPrinter textSubPrinter;
u8 speed; u8 speed;
if (windowId & 0x80) if (windowId & 0x80)
{ {
windowId &= ~(0x80); windowId &= ~(0x80);
toVram = FALSE; copyToVram = FALSE;
} }
else else
{ {
FillWindowPixelBuffer(windowId, textInfo[windowId].fillValue); FillWindowPixelBuffer(windowId, textInfo[windowId].fillValue);
toVram = TRUE; copyToVram = TRUE;
} }
textSubPrinter.current_text_offset = text; textSubPrinter.current_text_offset = text;
@ -3005,7 +3005,7 @@ void BattlePutTextOnWindow(const u8 *text, u8 windowId)
AddTextPrinter(&textSubPrinter, speed, NULL); AddTextPrinter(&textSubPrinter, speed, NULL);
if (toVram) if (copyToVram)
{ {
PutWindowTilemap(windowId); PutWindowTilemap(windowId);
CopyWindowToVram(windowId, 3); CopyWindowToVram(windowId, 3);

View File

@ -3449,7 +3449,7 @@ static void atk23_getexp(void)
if (gBattleControllerExecFlags == 0) if (gBattleControllerExecFlags == 0)
{ {
gActiveBattler = gBattleStruct->expGetterBattlerId; gActiveBattler = gBattleStruct->expGetterBattlerId;
if (gBattleBufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES && gBattleBufferB[gActiveBattler][1] == RET_VALUE_LEVELLED_UP) if (gBattleBufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES && gBattleBufferB[gActiveBattler][1] == RET_VALUE_LEVELED_UP)
{ {
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId) if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId)
HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
@ -4649,14 +4649,14 @@ static void atk49_moveend(void)
BtlController_EmitSpriteInvisibility(0, FALSE); BtlController_EmitSpriteInvisibility(0, FALSE);
MarkBattlerForControllerExec(gActiveBattler); MarkBattlerForControllerExec(gActiveBattler);
gStatuses3[gBattlerAttacker] &= ~(STATUS3_SEMI_INVULNERABLE); gStatuses3[gBattlerAttacker] &= ~(STATUS3_SEMI_INVULNERABLE);
gSpecialStatuses[gBattlerAttacker].restoredBankSprite = 1; gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = 1;
gBattleScripting.atk49_state++; gBattleScripting.atk49_state++;
return; return;
} }
gBattleScripting.atk49_state++; gBattleScripting.atk49_state++;
break; break;
case 10: // make target sprite visible case 10: // make target sprite visible
if (!gSpecialStatuses[gBattlerTarget].restoredBankSprite && gBattlerTarget < gBattlersCount if (!gSpecialStatuses[gBattlerTarget].restoredBattlerSprite && gBattlerTarget < gBattlersCount
&& !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE)) && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE))
{ {
gActiveBattler = gBattlerTarget; gActiveBattler = gBattlerTarget;
@ -6632,7 +6632,7 @@ static void atk76_various(void)
gBattleCommunication[0] = 0; gBattleCommunication[0] = 0;
break; break;
case VARIOUS_RESET_INTIMIDATE_TRACE_BITS: case VARIOUS_RESET_INTIMIDATE_TRACE_BITS:
gSpecialStatuses[gActiveBattler].intimidatedPoke = 0; gSpecialStatuses[gActiveBattler].intimidatedMon = 0;
gSpecialStatuses[gActiveBattler].traced = 0; gSpecialStatuses[gActiveBattler].traced = 0;
break; break;
case VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP: case VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP:

View File

@ -470,11 +470,11 @@ u8 GetImprisonedMovesCount(u8 battlerId, u16 move)
{ {
s32 i; s32 i;
u8 imprisionedMoves = 0; u8 imprisionedMoves = 0;
u8 BattlerSide = GetBattlerSide(battlerId); u8 battlerSide = GetBattlerSide(battlerId);
for (i = 0; i < gBattlersCount; i++) for (i = 0; i < gBattlersCount; i++)
{ {
if (BattlerSide != GetBattlerSide(i) && gStatuses3[i] & STATUS3_IMPRISONED_OTHERS) if (battlerSide != GetBattlerSide(i) && gStatuses3[i] & STATUS3_IMPRISONED_OTHERS)
{ {
s32 j; s32 j;
for (j = 0; j < 4; j++) for (j = 0; j < 4; j++)
@ -1840,10 +1840,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
} }
break; break;
case ABILITY_INTIMIDATE: case ABILITY_INTIMIDATE:
if (!(gSpecialStatuses[battler].intimidatedPoke)) if (!(gSpecialStatuses[battler].intimidatedMon))
{ {
gStatuses3[battler] |= STATUS3_INTIMIDATE_POKES; gStatuses3[battler] |= STATUS3_INTIMIDATE_POKES;
gSpecialStatuses[battler].intimidatedPoke = 1; gSpecialStatuses[battler].intimidatedMon = 1;
} }
break; break;
case ABILITY_FORECAST: case ABILITY_FORECAST:
@ -2511,32 +2511,32 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
int i = 0; int i = 0;
u8 effect = ITEM_NO_EFFECT; u8 effect = ITEM_NO_EFFECT;
u8 changedPP = 0; u8 changedPP = 0;
u8 BattlerHoldEffect, atkHoldEffect, defHoldEffect; u8 battlerHoldEffect, atkHoldEffect, defHoldEffect;
u8 BattlerQuality, atkQuality, defQuality; u8 battlerHoldEffectParam, atkHoldEffectParam, defHoldEffectParam;
u16 atkItem, defItem; u16 atkItem, defItem;
gLastUsedItem = gBattleMons[battlerId].item; gLastUsedItem = gBattleMons[battlerId].item;
if (gLastUsedItem == ITEM_ENIGMA_BERRY) if (gLastUsedItem == ITEM_ENIGMA_BERRY)
{ {
BattlerHoldEffect = gEnigmaBerries[battlerId].holdEffect; battlerHoldEffect = gEnigmaBerries[battlerId].holdEffect;
BattlerQuality = gEnigmaBerries[battlerId].holdEffectParam; battlerHoldEffectParam = gEnigmaBerries[battlerId].holdEffectParam;
} }
else else
{ {
BattlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); battlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem);
BattlerQuality = ItemId_GetHoldEffectParam(gLastUsedItem); battlerHoldEffectParam = ItemId_GetHoldEffectParam(gLastUsedItem);
} }
atkItem = gBattleMons[gBattlerAttacker].item; atkItem = gBattleMons[gBattlerAttacker].item;
if (atkItem == ITEM_ENIGMA_BERRY) if (atkItem == ITEM_ENIGMA_BERRY)
{ {
atkHoldEffect = gEnigmaBerries[gBattlerAttacker].holdEffect; atkHoldEffect = gEnigmaBerries[gBattlerAttacker].holdEffect;
atkQuality = gEnigmaBerries[gBattlerAttacker].holdEffectParam; atkHoldEffectParam = gEnigmaBerries[gBattlerAttacker].holdEffectParam;
} }
else else
{ {
atkHoldEffect = ItemId_GetHoldEffect(atkItem); atkHoldEffect = ItemId_GetHoldEffect(atkItem);
atkQuality = ItemId_GetHoldEffectParam(atkItem); atkHoldEffectParam = ItemId_GetHoldEffectParam(atkItem);
} }
// def variables are unused // def variables are unused
@ -2544,18 +2544,18 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
if (defItem == ITEM_ENIGMA_BERRY) if (defItem == ITEM_ENIGMA_BERRY)
{ {
defHoldEffect = gEnigmaBerries[gBattlerTarget].holdEffect; defHoldEffect = gEnigmaBerries[gBattlerTarget].holdEffect;
defQuality = gEnigmaBerries[gBattlerTarget].holdEffectParam; defHoldEffectParam = gEnigmaBerries[gBattlerTarget].holdEffectParam;
} }
else else
{ {
defHoldEffect = ItemId_GetHoldEffect(defItem); defHoldEffect = ItemId_GetHoldEffect(defItem);
defQuality = ItemId_GetHoldEffectParam(defItem); defHoldEffectParam = ItemId_GetHoldEffectParam(defItem);
} }
switch (caseID) switch (caseID)
{ {
case ITEMEFFECT_ON_SWITCH_IN: case ITEMEFFECT_ON_SWITCH_IN:
switch (BattlerHoldEffect) switch (battlerHoldEffect)
{ {
case HOLD_EFFECT_DOUBLE_PRIZE: case HOLD_EFFECT_DOUBLE_PRIZE:
if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
@ -2583,13 +2583,13 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case 1: case 1:
if (gBattleMons[battlerId].hp) if (gBattleMons[battlerId].hp)
{ {
switch (BattlerHoldEffect) switch (battlerHoldEffect)
{ {
case HOLD_EFFECT_RESTORE_HP: case HOLD_EFFECT_RESTORE_HP:
if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
{ {
gBattleMoveDamage = BattlerQuality; gBattleMoveDamage = battlerHoldEffectParam;
if (gBattleMons[battlerId].hp + BattlerQuality > gBattleMons[battlerId].maxHP) if (gBattleMons[battlerId].hp + battlerHoldEffectParam > gBattleMons[battlerId].maxHP)
gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
gBattleMoveDamage *= -1; gBattleMoveDamage *= -1;
BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
@ -2618,10 +2618,10 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
if (i != 4) if (i != 4)
{ {
u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i); u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i);
if (changedPP + BattlerQuality > maxPP) if (changedPP + battlerHoldEffectParam > maxPP)
changedPP = maxPP; changedPP = maxPP;
else else
changedPP = changedPP + BattlerQuality; changedPP = changedPP + battlerHoldEffectParam;
PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); PREPARE_MOVE_BUFFER(gBattleTextBuff1, move);
@ -2660,7 +2660,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
gBattleMoveDamage *= -1; gBattleMoveDamage *= -1;
BattleScriptExecute(BattleScript_ItemHealHP_End2); BattleScriptExecute(BattleScript_ItemHealHP_End2);
effect = ITEM_HP_CHANGE; effect = ITEM_HP_CHANGE;
RecordItemEffectBattle(battlerId, BattlerHoldEffect); RecordItemEffectBattle(battlerId, battlerHoldEffect);
} }
break; break;
// nice copy/paste there gamefreak, making a function for confuse berries was too much eh? // nice copy/paste there gamefreak, making a function for confuse berries was too much eh?
@ -2669,7 +2669,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
{ {
PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SPICY); PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SPICY);
gBattleMoveDamage = gBattleMons[battlerId].maxHP / BattlerQuality; gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
if (gBattleMoveDamage == 0) if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1; gBattleMoveDamage = 1;
if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
@ -2687,7 +2687,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
{ {
PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_DRY); PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_DRY);
gBattleMoveDamage = gBattleMons[battlerId].maxHP / BattlerQuality; gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
if (gBattleMoveDamage == 0) if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1; gBattleMoveDamage = 1;
if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
@ -2705,7 +2705,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
{ {
PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SWEET); PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SWEET);
gBattleMoveDamage = gBattleMons[battlerId].maxHP / BattlerQuality; gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
if (gBattleMoveDamage == 0) if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1; gBattleMoveDamage = 1;
if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
@ -2723,7 +2723,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
{ {
PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_BITTER); PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_BITTER);
gBattleMoveDamage = gBattleMons[battlerId].maxHP / BattlerQuality; gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
if (gBattleMoveDamage == 0) if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1; gBattleMoveDamage = 1;
if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
@ -2741,7 +2741,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
{ {
PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SOUR); PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SOUR);
gBattleMoveDamage = gBattleMons[battlerId].maxHP / BattlerQuality; gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
if (gBattleMoveDamage == 0) if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1; gBattleMoveDamage = 1;
if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
@ -2756,7 +2756,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
break; break;
// copy/paste again, smh // copy/paste again, smh
case HOLD_EFFECT_ATTACK_UP: case HOLD_EFFECT_ATTACK_UP:
if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / BattlerQuality && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < 0xC) if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < 0xC)
{ {
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK);
PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE);
@ -2770,7 +2770,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
} }
break; break;
case HOLD_EFFECT_DEFENSE_UP: case HOLD_EFFECT_DEFENSE_UP:
if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / BattlerQuality && !moveTurn && gBattleMons[battlerId].statStages[STAT_DEF] < 0xC) if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_DEF] < 0xC)
{ {
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_DEF); PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_DEF);
@ -2783,7 +2783,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
} }
break; break;
case HOLD_EFFECT_SPEED_UP: case HOLD_EFFECT_SPEED_UP:
if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / BattlerQuality && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPEED] < 0xC) if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPEED] < 0xC)
{ {
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPEED); PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPEED);
@ -2796,7 +2796,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
} }
break; break;
case HOLD_EFFECT_SP_ATTACK_UP: case HOLD_EFFECT_SP_ATTACK_UP:
if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / BattlerQuality && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPATK] < 0xC) if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPATK] < 0xC)
{ {
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK);
@ -2809,7 +2809,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
} }
break; break;
case HOLD_EFFECT_SP_DEFENSE_UP: case HOLD_EFFECT_SP_DEFENSE_UP:
if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / BattlerQuality && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPDEF] < 0xC) if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPDEF] < 0xC)
{ {
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPDEF); PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPDEF);
@ -2822,7 +2822,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
} }
break; break;
case HOLD_EFFECT_CRITICAL_UP: case HOLD_EFFECT_CRITICAL_UP:
if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / BattlerQuality && !moveTurn && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY)) if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY))
{ {
gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY; gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY;
BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2);
@ -2830,7 +2830,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
} }
break; break;
case HOLD_EFFECT_RANDOM_STAT_UP: case HOLD_EFFECT_RANDOM_STAT_UP:
if (!moveTurn && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / BattlerQuality) if (!moveTurn && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam)
{ {
for (i = 0; i < 5; i++) for (i = 0; i < 5; i++)
{ {
@ -2996,15 +2996,15 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
gLastUsedItem = gBattleMons[battlerId].item; gLastUsedItem = gBattleMons[battlerId].item;
if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY) if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY)
{ {
BattlerHoldEffect = gEnigmaBerries[battlerId].holdEffect; battlerHoldEffect = gEnigmaBerries[battlerId].holdEffect;
BattlerQuality = gEnigmaBerries[battlerId].holdEffectParam; battlerHoldEffectParam = gEnigmaBerries[battlerId].holdEffectParam;
} }
else else
{ {
BattlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); battlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem);
BattlerQuality = ItemId_GetHoldEffectParam(gLastUsedItem); battlerHoldEffectParam = ItemId_GetHoldEffectParam(gLastUsedItem);
} }
switch (BattlerHoldEffect) switch (battlerHoldEffect)
{ {
case HOLD_EFFECT_CURE_PAR: case HOLD_EFFECT_CURE_PAR:
if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)
@ -3146,7 +3146,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_FLINCH: case HOLD_EFFECT_FLINCH:
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
&& TARGET_TURN_DAMAGED && TARGET_TURN_DAMAGED
&& (Random() % 100) < atkQuality && (Random() % 100) < atkHoldEffectParam
&& gBattleMoves[gCurrentMove].flags & FLAG_KINGSROCK_AFFECTED && gBattleMoves[gCurrentMove].flags & FLAG_KINGSROCK_AFFECTED
&& gBattleMons[gBattlerTarget].hp) && gBattleMons[gBattlerTarget].hp)
{ {
@ -3167,7 +3167,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
gLastUsedItem = atkItem; gLastUsedItem = atkItem;
gPotentialItemEffectBattler = gBattlerAttacker; gPotentialItemEffectBattler = gBattlerAttacker;
gBattleScripting.battler = gBattlerAttacker; gBattleScripting.battler = gBattlerAttacker;
gBattleMoveDamage = (gSpecialStatuses[gBattlerTarget].dmg / atkQuality) * -1; gBattleMoveDamage = (gSpecialStatuses[gBattlerTarget].dmg / atkHoldEffectParam) * -1;
if (gBattleMoveDamage == 0) if (gBattleMoveDamage == 0)
gBattleMoveDamage = -1; gBattleMoveDamage = -1;
gSpecialStatuses[gBattlerTarget].dmg = 0; gSpecialStatuses[gBattlerTarget].dmg = 0;

View File

@ -7,6 +7,7 @@
#include "task.h" #include "task.h"
#include "field_effect.h" #include "field_effect.h"
#include "constants/flags.h" #include "constants/flags.h"
#include "constants/maps.h"
extern void MapGridSetMetatileIdAt(s32 x, s32 y, u16 metatileId); // fieldmap extern void MapGridSetMetatileIdAt(s32 x, s32 y, u16 metatileId); // fieldmap
extern void DrawWholeMapView(); // field_camera extern void DrawWholeMapView(); // field_camera
@ -205,14 +206,25 @@ void SealedChamberShakingEffect(u8 taskId)
// moved later in the function because it was rewritten. // moved later in the function because it was rewritten.
bool8 ShouldDoBrailleStrengthEffect(void) bool8 ShouldDoBrailleStrengthEffect(void)
{ {
if (!FlagGet(FLAG_SYS_BRAILLE_STRENGTH) && (gSaveBlock1Ptr->location.mapGroup == 0x18 && gSaveBlock1Ptr->location.mapNum == 0x06)) if (!FlagGet(FLAG_SYS_BRAILLE_STRENGTH)
&& gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(DESERT_RUINS)
&& gSaveBlock1Ptr->location.mapNum == MAP_NUM(DESERT_RUINS))
{ {
if (gSaveBlock1Ptr->pos.x == 6 && gSaveBlock1Ptr->pos.y == 23) if (gSaveBlock1Ptr->pos.x == 6 && gSaveBlock1Ptr->pos.y == 23)
{ sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE; return TRUE; } {
sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE;
return TRUE;
}
else if (gSaveBlock1Ptr->pos.x == 5 && gSaveBlock1Ptr->pos.y == 23) else if (gSaveBlock1Ptr->pos.x == 5 && gSaveBlock1Ptr->pos.y == 23)
{ sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE; return TRUE; } {
sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE;
return TRUE;
}
else if (gSaveBlock1Ptr->pos.x == 7 && gSaveBlock1Ptr->pos.y == 23) else if (gSaveBlock1Ptr->pos.x == 7 && gSaveBlock1Ptr->pos.y == 23)
{ sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE; return TRUE; } {
sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE;
return TRUE;
}
} }
return FALSE; return FALSE;

View File

@ -2265,7 +2265,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if (attackerHoldEffect == sHoldEffectToType[i][0] if (attackerHoldEffect == sHoldEffectToType[i][0]
&& type == sHoldEffectToType[i][1]) && type == sHoldEffectToType[i][1])
{ {
if (type <= 8) if (IS_MOVE_PHYSICAL(type))
attack = (attack * (attackerHoldEffectParam + 100)) / 100; attack = (attack * (attackerHoldEffectParam + 100)) / 100;
else else
spAttack = (spAttack * (attackerHoldEffectParam + 100)) / 100; spAttack = (spAttack * (attackerHoldEffectParam + 100)) / 100;
@ -2293,9 +2293,9 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
spAttack /= 2; spAttack /= 2;
if (attacker->ability == ABILITY_HUSTLE) if (attacker->ability == ABILITY_HUSTLE)
attack = (150 * attack) / 100; attack = (150 * attack) / 100;
if (attacker->ability == ABILITY_PLUS && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MINUS, 0, 0)) if (attacker->ability == ABILITY_PLUS && ABILITY_ON_FIELD2(ABILITY_MINUS))
spAttack = (150 * spAttack) / 100; spAttack = (150 * spAttack) / 100;
if (attacker->ability == ABILITY_MINUS && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_PLUS, 0, 0)) if (attacker->ability == ABILITY_MINUS && ABILITY_ON_FIELD2(ABILITY_PLUS))
spAttack = (150 * spAttack) / 100; spAttack = (150 * spAttack) / 100;
if (attacker->ability == ABILITY_GUTS && attacker->status1) if (attacker->ability == ABILITY_GUTS && attacker->status1)
attack = (150 * attack) / 100; attack = (150 * attack) / 100;
@ -2316,7 +2316,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if (gBattleMoves[gCurrentMove].effect == EFFECT_EXPLOSION) if (gBattleMoves[gCurrentMove].effect == EFFECT_EXPLOSION)
defense /= 2; defense /= 2;
if (type < TYPE_MYSTERY) // is physical if (IS_MOVE_PHYSICAL(type) && type != TYPE_MYSTERY)
{ {
if (gCritMultiplier == 2) if (gCritMultiplier == 2)
{ {
@ -2366,7 +2366,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if (type == TYPE_MYSTERY) if (type == TYPE_MYSTERY)
damage = 0; // is ??? type. does 0 damage. damage = 0; // is ??? type. does 0 damage.
if (type > TYPE_MYSTERY) // is special? if (IS_MOVE_SPECIAL(type))
{ {
if (gCritMultiplier == 2) if (gCritMultiplier == 2)
{ {
@ -2406,8 +2406,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
damage /= 2; damage /= 2;
// are effects of weather negated with cloud nine or air lock // are effects of weather negated with cloud nine or air lock
if (!AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_CLOUD_NINE, 0, 0) if (WEATHER_HAS_EFFECT2)
&& !AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_AIR_LOCK, 0, 0))
{ {
if (gBattleWeather & WEATHER_RAIN_TEMPORARY) if (gBattleWeather & WEATHER_RAIN_TEMPORARY)
{ {
@ -4514,7 +4513,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
holdEffect = ItemId_GetHoldEffect(heldItem); holdEffect = ItemId_GetHoldEffect(heldItem);
if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && type != 3) if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && type != 3)
return 0; return SPECIES_NONE;
switch (type) switch (type)
{ {
@ -4522,7 +4521,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
level = GetMonData(mon, MON_DATA_LEVEL, 0); level = GetMonData(mon, MON_DATA_LEVEL, 0);
friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0);
for (i = 0; i < 5; i++) for (i = 0; i < EVOS_PER_MON; i++)
{ {
switch (gEvolutionTable[species][i].method) switch (gEvolutionTable[species][i].method)
{ {
@ -4579,7 +4578,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
} }
break; break;
case 1: case 1:
for (i = 0; i < 5; i++) for (i = 0; i < EVOS_PER_MON; i++)
{ {
switch (gEvolutionTable[species][i].method) switch (gEvolutionTable[species][i].method)
{ {
@ -4599,7 +4598,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
break; break;
case 2: case 2:
case 3: case 3:
for (i = 0; i < 5; i++) for (i = 0; i < EVOS_PER_MON; i++)
{ {
if (gEvolutionTable[species][i].method == EVO_ITEM if (gEvolutionTable[species][i].method == EVO_ITEM
&& gEvolutionTable[species][i].param == evolutionItem) && gEvolutionTable[species][i].param == evolutionItem)