From face37e8f3d87a695681f13f2035883a446c2eca Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 13 May 2025 09:54:54 -0400 Subject: [PATCH] Battle TV expansion (#6826) --- src/battle_tv.c | 485 ++++++++++++++++----------------- src/data/battle_move_effects.h | 4 +- 2 files changed, 239 insertions(+), 250 deletions(-) diff --git a/src/battle_tv.c b/src/battle_tv.c index 0758bf4107..8879fcde59 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -27,10 +27,10 @@ enum { PTS_RAIN, PTS_SUN, PTS_SANDSTORM, - PTS_HAIL, + PTS_HAIL_SNOW, PTS_ELECTRIC, PTS_STATUS_DMG, - PTS_STATUS, + PTS_STATUS_SKIP_TURN, PTS_SPIKES, PTS_WATER_SPORT, PTS_MUD_SPORT, @@ -45,9 +45,11 @@ enum { PTS_FLINCHED, PTS_STAT_INCREASE_1, PTS_STAT_INCREASE_2, + PTS_STAT_INCREASE_3, PTS_STAT_DECREASE_SELF, PTS_STAT_DECREASE_1, PTS_STAT_DECREASE_2, + PTS_STAT_DECREASE_3, PTS_STAT_INCREASE_NOT_SELF, }; @@ -100,89 +102,6 @@ static const u16 sPoints_SetUp[] = 6, 2 // Ingrain }; -static const u16 sPoints_RainMoves[] = -{ - MOVE_BUBBLE, 3, - MOVE_WHIRLPOOL, 3, - MOVE_OCTAZOOKA, 3, - MOVE_CLAMP, 3, - MOVE_WITHDRAW, 3, - MOVE_CRABHAMMER, 3, - MOVE_WATER_SPOUT, 3, - MOVE_DIVE, 3, - MOVE_WATERFALL, 3, - MOVE_MUDDY_WATER, 3, - MOVE_SURF, 3, - MOVE_HYDRO_CANNON, 3, - MOVE_HYDRO_PUMP, 3, - MOVE_BUBBLE_BEAM, 3, - MOVE_WATER_SPORT, 0, // Unnecessary, unlisted moves are already given 0 points - MOVE_WATER_GUN, 3, - MOVE_WATER_PULSE, 3, - MOVE_WEATHER_BALL, 3, - MOVE_THUNDER, 3, - MOVE_SOLAR_BEAM, -4, - MOVE_OVERHEAT, -4, - MOVE_FLAME_WHEEL, -4, - MOVE_FLAMETHROWER, -4, - MOVE_SACRED_FIRE, -4, - MOVE_FIRE_BLAST, -4, - MOVE_HEAT_WAVE, -4, - MOVE_EMBER, -4, - MOVE_BLAST_BURN, -4, - MOVE_BLAZE_KICK, -4, - MOVE_ERUPTION, -4, - MOVE_FIRE_SPIN, -4, - MOVE_FIRE_PUNCH, -4, - MOVE_SOLAR_BEAM, -4, // Repeated - TABLE_END, 0 -}; -static const u16 sPoints_SunMoves[] = -{ - MOVE_OVERHEAT, 3, - MOVE_FLAME_WHEEL, 3, - MOVE_FLAMETHROWER, 3, - MOVE_SACRED_FIRE, 3, - MOVE_FIRE_BLAST, 3, - MOVE_HEAT_WAVE, 3, - MOVE_EMBER, 3, - MOVE_BLAST_BURN, 3, - MOVE_BLAZE_KICK, 3, - MOVE_ERUPTION, 3, - MOVE_FIRE_SPIN, 3, - MOVE_FIRE_PUNCH, 3, - MOVE_SOLAR_BEAM, 5, - MOVE_SYNTHESIS, 3, - MOVE_MORNING_SUN, 3, - MOVE_MOONLIGHT, 3, - MOVE_WEATHER_BALL, 3, - TABLE_END, 0 -}; -static const u16 sPoints_SandstormMoves[] = -{ - MOVE_WEATHER_BALL, 3, - MOVE_SOLAR_BEAM, -3, - TABLE_END, 0 -}; -static const u16 sPoints_HailMoves[] = -{ - MOVE_WEATHER_BALL, 3, - MOVE_SOLAR_BEAM, -3, - TABLE_END, 0 -}; -static const u16 sPoints_ElectricMoves[] = -{ - MOVE_THUNDERBOLT, 3, - MOVE_THUNDER_PUNCH, 3, - MOVE_SPARK, 3, - MOVE_THUNDER_SHOCK, 3, - MOVE_ZAP_CANNON, 3, - MOVE_SHOCK_WAVE, 3, - MOVE_THUNDER_WAVE, 0, // Unnecessary, unlisted moves are already given 0 points - MOVE_THUNDER, 3, - MOVE_VOLT_TACKLE, 3, - TABLE_END, 0 -}; static const u16 sPoints_StatusDmg[] = { 5, // Curse @@ -193,117 +112,12 @@ static const u16 sPoints_StatusDmg[] = 3, // Nightmare 3 // Wrap (Trapping move) }; -static const u16 sPoints_Status[] = -{ - 5, // Attraction - 5, // Confusion - 5, // Paralysis - 5, // Sleep - 5 // Freeze -}; - -static const u16 sPoints_Spikes[] = { 4 }; -static const u16 sPoints_WaterSport[] = { 5 }; -static const u16 sPoints_MudSport[] = { 5 }; -static const u16 sPoints_Reflect[] = { 3 }; -static const u16 sPoints_LightScreen[] = { 3 }; -static const u16 sPoints_Safeguard[] = { 4 }; -static const u16 sPoints_Mist[] = { 3 }; -static const u16 sPoints_BreakWall[] = { 6 }; -static const u16 sPoints_CriticalHit[] = { 6 }; -static const u16 sPoints_Faint[] = { 6 }; -static const u16 sPoints_Flinched[] = { 4 }; - -static const u16 sPoints_StatIncrease1[NUM_BATTLE_STATS - 1] = -{ - [STAT_ATK - 1] = 2, - [STAT_DEF - 1] = 2, - [STAT_SPEED - 1] = 2, - [STAT_SPATK - 1] = 2, - [STAT_SPDEF - 1] = 2, - [STAT_ACC - 1] = 2, - [STAT_EVASION - 1] = 2 -}; -static const u16 sPoints_StatIncrease2[NUM_BATTLE_STATS - 1] = -{ - [STAT_ATK - 1] = 4, - [STAT_DEF - 1] = 4, - [STAT_SPEED - 1] = 4, - [STAT_SPATK - 1] = 4, - [STAT_SPDEF - 1] = 4, - [STAT_ACC - 1] = 4, - [STAT_EVASION - 1] = 4 -}; -static const u16 sPoints_StatDecreaseSelf[NUM_BATTLE_STATS - 1] = -{ - [STAT_ATK - 1] = -1, - [STAT_DEF - 1] = -1, - [STAT_SPEED - 1] = -1, - [STAT_SPATK - 1] = -1, - [STAT_SPDEF - 1] = -1, - [STAT_ACC - 1] = -1, - [STAT_EVASION - 1] = -1 -}; -static const u16 sPoints_StatDecrease1[NUM_BATTLE_STATS - 1] = -{ - [STAT_ATK - 1] = 2, - [STAT_DEF - 1] = 2, - [STAT_SPEED - 1] = 2, - [STAT_SPATK - 1] = 2, - [STAT_SPDEF - 1] = 2, - [STAT_ACC - 1] = 2, - [STAT_EVASION - 1] = 2 -}; -static const u16 sPoints_StatDecrease2[NUM_BATTLE_STATS - 1] = -{ - [STAT_ATK - 1] = 4, - [STAT_DEF - 1] = 4, - [STAT_SPEED - 1] = 4, - [STAT_SPATK - 1] = 4, - [STAT_SPDEF - 1] = 4, - [STAT_ACC - 1] = 4, - [STAT_EVASION - 1] = 4 -}; -static const u16 sPoints_StatIncreaseNotSelf[NUM_BATTLE_STATS - 1] = -{ - [STAT_ATK - 1] = -2, - [STAT_DEF - 1] = -2, - [STAT_SPEED - 1] = -2, - [STAT_SPATK - 1] = -2, - [STAT_SPDEF - 1] = -2, - [STAT_ACC - 1] = -2, - [STAT_EVASION - 1] = -2 -}; static const u16 *const sPointsArray[] = { [PTS_EFFECTIVENESS] = sPoints_Effectiveness, [PTS_SET_UP] = sPoints_SetUp, - [PTS_RAIN] = sPoints_RainMoves, - [PTS_SUN] = sPoints_SunMoves, - [PTS_SANDSTORM] = sPoints_SandstormMoves, - [PTS_HAIL] = sPoints_HailMoves, - [PTS_ELECTRIC] = sPoints_ElectricMoves, [PTS_STATUS_DMG] = sPoints_StatusDmg, - [PTS_STATUS] = sPoints_Status, - [PTS_SPIKES] = sPoints_Spikes, - [PTS_WATER_SPORT] = sPoints_WaterSport, - [PTS_MUD_SPORT] = sPoints_MudSport, - [PTS_REFLECT] = sPoints_Reflect, - [PTS_LIGHT_SCREEN] = sPoints_LightScreen, - [PTS_SAFEGUARD] = sPoints_Safeguard, - [PTS_MIST] = sPoints_Mist, - [PTS_BREAK_WALL] = sPoints_BreakWall, - [PTS_CRITICAL_HIT] = sPoints_CriticalHit, - [PTS_FAINT] = sPoints_Faint, - [PTS_FAINT_SET_UP] = sPoints_Faint, - [PTS_FLINCHED] = sPoints_Flinched, - [PTS_STAT_INCREASE_1] = sPoints_StatIncrease1, - [PTS_STAT_INCREASE_2] = sPoints_StatIncrease2, - [PTS_STAT_DECREASE_SELF] = sPoints_StatDecreaseSelf, - [PTS_STAT_DECREASE_1] = sPoints_StatDecrease1, - [PTS_STAT_DECREASE_2] = sPoints_StatDecrease2, - [PTS_STAT_INCREASE_NOT_SELF] = sPoints_StatIncreaseNotSelf }; // Points will always be calculated for these messages @@ -359,16 +173,19 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) switch (stringId) { case STRINGID_ITDOESNTAFFECT: + case STRINGID_ITDOESNTAFFECTTWOFOES: AddMovePoints(PTS_EFFECTIVENESS, moveSlot, 2, 0); if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) TrySetBattleSeminarShow(); break; case STRINGID_NOTVERYEFFECTIVE: + case STRINGID_NOTVERYEFFECTIVETWOFOES: AddMovePoints(PTS_EFFECTIVENESS, moveSlot, 1, 0); if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && GetMonData(defMon, MON_DATA_HP, NULL) != 0) TrySetBattleSeminarShow(); break; case STRINGID_SUPEREFFECTIVE: + case STRINGID_SUPEREFFECTIVETWOFOES: AddMovePoints(PTS_EFFECTIVENESS, moveSlot, 0, 0); break; case STRINGID_PKMNFORESAWATTACK: @@ -441,7 +258,9 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) case STRINGID_ATTACKERSSTATROSE: if (gBattleTextBuff1[2] != 0) { - if (*statStringId == STRINGID_STATSHARPLY) + if (*statStringId == STRINGID_DRASTICALLY) + AddMovePoints(PTS_STAT_INCREASE_3, moveSlot, gBattleTextBuff1[2] - 1, 0); + else if (*statStringId == STRINGID_STATSHARPLY) AddMovePoints(PTS_STAT_INCREASE_2, moveSlot, gBattleTextBuff1[2] - 1, 0); else AddMovePoints(PTS_STAT_INCREASE_1, moveSlot, gBattleTextBuff1[2] - 1, 0); @@ -452,7 +271,9 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) { if (gBattlerAttacker == gBattlerTarget) { - if (*statStringId == STRINGID_STATSHARPLY) + if (*statStringId == STRINGID_DRASTICALLY) + AddMovePoints(PTS_STAT_INCREASE_3, moveSlot, gBattleTextBuff1[2] - 1, 0); + else if (*statStringId == STRINGID_STATSHARPLY) AddMovePoints(PTS_STAT_INCREASE_2, moveSlot, gBattleTextBuff1[2] - 1, 0); else AddMovePoints(PTS_STAT_INCREASE_1, moveSlot, gBattleTextBuff1[2] - 1, 0); @@ -470,7 +291,9 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) case STRINGID_DEFENDERSSTATFELL: if (gBattleTextBuff1[2] != 0) { - if (*statStringId == STRINGID_STATHARSHLY) + if (*statStringId == STRINGID_SEVERELY) + AddMovePoints(PTS_STAT_DECREASE_3, moveSlot, gBattleTextBuff1[2] - 1, 0); + else if (*statStringId == STRINGID_STATHARSHLY) AddMovePoints(PTS_STAT_DECREASE_2, moveSlot, gBattleTextBuff1[2] - 1, 0); else AddMovePoints(PTS_STAT_DECREASE_1, moveSlot, gBattleTextBuff1[2] - 1, 0); @@ -569,7 +392,7 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) break; case STRINGID_PKMNIMMOBILIZEDBYLOVE: if (tvPtr->pos[atkSide][atkFlank].attractMonId != 0) - AddMovePoints(PTS_STATUS, 0, tvPtr->pos[atkSide][atkFlank].attractMonId - 1, tvPtr->pos[atkSide][atkFlank].attractMoveSlot); + AddMovePoints(PTS_STATUS_SKIP_TURN, 0, tvPtr->pos[atkSide][atkFlank].attractMonId - 1, tvPtr->pos[atkSide][atkFlank].attractMoveSlot); break; case STRINGID_PKMNWASPARALYZED: tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].prlzMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -577,7 +400,7 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) break; case STRINGID_PKMNISPARALYZED: if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMonId != 0) - AddMovePoints(PTS_STATUS, 2, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMoveSlot); + AddMovePoints(PTS_STATUS_SKIP_TURN, 2, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMoveSlot); break; case STRINGID_PKMNFELLASLEEP: tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].slpMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -585,9 +408,9 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) break; case STRINGID_PKMNFASTASLEEP: if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMonId != 0 - && gBattleMsgDataPtr->currentMove != MOVE_SNORE - && gBattleMsgDataPtr->currentMove != MOVE_SLEEP_TALK) - AddMovePoints(PTS_STATUS, 3, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMoveSlot); + && GetMoveEffect(gBattleMsgDataPtr->currentMove) != EFFECT_SNORE + && GetMoveEffect(gBattleMsgDataPtr->currentMove) != EFFECT_SLEEP_TALK) + AddMovePoints(PTS_STATUS_SKIP_TURN, 3, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMoveSlot); break; case STRINGID_PKMNWASFROZEN: tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].frzMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -595,7 +418,7 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) break; case STRINGID_PKMNISFROZEN: if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMonId != 0) - AddMovePoints(PTS_STATUS, 4, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMoveSlot); + AddMovePoints(PTS_STATUS_SKIP_TURN, 4, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMoveSlot); break; case STRINGID_PKMNWASCONFUSED: tvPtr->pos[effSide][effFlank].confusionMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -603,7 +426,7 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) break; case STRINGID_ITHURTCONFUSION: if (tvPtr->pos[atkSide][atkFlank].confusionMonId != 0) - AddMovePoints(PTS_STATUS, 1, tvPtr->pos[atkSide][atkFlank].confusionMonId - 1, tvPtr->pos[atkSide][atkFlank].confusionMoveSlot); + AddMovePoints(PTS_STATUS_SKIP_TURN, 1, tvPtr->pos[atkSide][atkFlank].confusionMonId - 1, tvPtr->pos[atkSide][atkFlank].confusionMoveSlot); tvPtr->side[atkSide].faintCause = FNT_CONFUSION; break; case STRINGID_SPIKESSCATTERED: @@ -924,85 +747,251 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) struct BattleTv *tvPtr = &gBattleStruct->tv; u32 atkSide = GetBattlerSide(gBattlerAttacker); u32 defSide = GetBattlerSide(gBattlerTarget); - const u16 *ptr; s32 i; switch (caseId) { +#define move arg2 case PTS_MOVE_EFFECT: // arg1 -> move slot, arg2 -> move { - u8 baseFromEffect = gBattleMoveEffects[GetMoveEffect(arg2)].battleTvScore; + enum BattleMoveEffects effect = GetMoveEffect(move); + u8 baseFromEffect = gBattleMoveEffects[effect].battleTvScore; - // Various cases to add/remove points - if (GetMoveRecoil(arg2) > 0) - baseFromEffect++; // Recoil moves - if (GetMoveEffect(arg2) == EFFECT_RAPID_SPIN) + // Changes depending on the effect + switch (effect) + { + case EFFECT_FIXED_DAMAGE_ARG: + baseFromEffect *= (GetMoveFixedDamage(move) / 20); + break; + case EFFECT_TWO_TURNS_ATTACK: + for (i = 0; i < GetMoveAdditionalEffectCount(move); i++) + { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + switch ((enum MoveEffects)additionalEffect->moveEffect) + { + case MOVE_EFFECT_ATK_PLUS_1: + case MOVE_EFFECT_DEF_PLUS_1: + case MOVE_EFFECT_SP_ATK_PLUS_1: + case MOVE_EFFECT_SP_DEF_PLUS_1: + case MOVE_EFFECT_SPD_PLUS_1: + case MOVE_EFFECT_ACC_PLUS_1: + case MOVE_EFFECT_EVS_PLUS_1: + if (additionalEffect->self == TRUE && (additionalEffect->chance == 100 || additionalEffect->chance == 0)) + baseFromEffect += 2; + break; + case MOVE_EFFECT_ATK_PLUS_2: + case MOVE_EFFECT_DEF_PLUS_2: + case MOVE_EFFECT_SP_ATK_PLUS_2: + case MOVE_EFFECT_SP_DEF_PLUS_2: + case MOVE_EFFECT_SPD_PLUS_2: + case MOVE_EFFECT_ACC_PLUS_2: + case MOVE_EFFECT_EVS_PLUS_2: + if (additionalEffect->self == TRUE && (additionalEffect->chance == 100 || additionalEffect->chance == 0)) + baseFromEffect += 3; + break; + case MOVE_EFFECT_FLINCH: + if (additionalEffect->self == FALSE) + baseFromEffect += 3; + break; + default: + break; + } + } + break; + case EFFECT_FIRST_TURN_ONLY: + if (MoveHasAdditionalEffectWithChance(move, MOVE_EFFECT_FLINCH, 100)) + baseFromEffect += 3; + break; + case EFFECT_CONFUSE: + if (GetMoveTarget(move) == MOVE_TARGET_FOES_AND_ALLY) + baseFromEffect += 2; + break; + default: + break; + } + + // Guaranteed hit but without negative priority + if (GetMoveAccuracy(move) == 0 && GetMovePriority(move) >= 0) baseFromEffect++; - if (MoveHasAdditionalEffect(arg2, MOVE_EFFECT_SP_ATK_MINUS_2) || MoveHasAdditionalEffect(arg2, MOVE_EFFECT_ATK_DEF_DOWN)) - baseFromEffect += 2; // Overheat, Superpower, etc. - if (MoveHasAdditionalEffect(arg2, MOVE_EFFECT_STEAL_ITEM)) - baseFromEffect += 3; - if (MoveHasAdditionalEffect(arg2, MOVE_EFFECT_WRAP) || MoveHasAdditionalEffectSelf(arg2, MOVE_EFFECT_THRASH)) - baseFromEffect += 3; - if (MoveHasAdditionalEffect(arg2, MOVE_EFFECT_RECHARGE)) - baseFromEffect += 4; + // User recoil damage + if (GetMoveRecoil(move) > 0) + baseFromEffect++; + + // Additional move effects in any move + for (i = 0; i < GetMoveAdditionalEffectCount(move); i++) + { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + switch (additionalEffect->moveEffect) + { + case MOVE_EFFECT_STEAL_ITEM: + if ((additionalEffect->chance == 100 || additionalEffect->chance == 0)) + baseFromEffect += 3; + break; + case MOVE_EFFECT_THRASH: + if (additionalEffect->self == TRUE) + baseFromEffect += 3; + break; + case MOVE_EFFECT_WRAP: + if (additionalEffect->self == FALSE) + baseFromEffect += 3; + break; + case MOVE_EFFECT_RECHARGE: + if (additionalEffect->self == TRUE) + baseFromEffect += 4; + break; + case MOVE_EFFECT_ATK_DEF_DOWN: + case MOVE_EFFECT_ATK_MINUS_2: + case MOVE_EFFECT_DEF_MINUS_2: + case MOVE_EFFECT_SP_ATK_MINUS_2: + case MOVE_EFFECT_SP_DEF_MINUS_2: + case MOVE_EFFECT_SPD_MINUS_2: + case MOVE_EFFECT_ACC_MINUS_2: + case MOVE_EFFECT_EVS_MINUS_2: + if (additionalEffect->self == TRUE && (additionalEffect->chance == 100 || additionalEffect->chance == 0)) + baseFromEffect += 2; + break; + } + } movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += baseFromEffect; break; } +#undef move case PTS_EFFECTIVENESS: - case PTS_CRITICAL_HIT: - case PTS_STAT_INCREASE_1: - case PTS_STAT_INCREASE_2: - case PTS_STAT_DECREASE_SELF: - case PTS_STAT_DECREASE_1: - case PTS_STAT_DECREASE_2: - case PTS_STAT_INCREASE_NOT_SELF: movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += sPointsArray[caseId][arg2]; break; + case PTS_STAT_INCREASE_1: + case PTS_STAT_DECREASE_1: + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += 2; + break; + case PTS_STAT_INCREASE_2: + case PTS_STAT_DECREASE_2: + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += 4; + break; + case PTS_STAT_INCREASE_3: + case PTS_STAT_DECREASE_3: + case PTS_CRITICAL_HIT: + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += 6; + break; + case PTS_STAT_DECREASE_SELF: + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] -= 1; + break; + case PTS_STAT_INCREASE_NOT_SELF: + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] -= 2; + break; #define move arg1 case PTS_RAIN: - case PTS_SUN: - case PTS_SANDSTORM: - case PTS_HAIL: - case PTS_ELECTRIC: - i = 0; - ptr = sPointsArray[caseId]; - do + { + s32 points = 0; + + if (!IsBattleMoveStatus(move)) { - if (move == ptr[i]) + switch (GetMoveType(move)) { - movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg2] += ptr[i+1]; - break; + case TYPE_WATER: points += 3; break; + case TYPE_FIRE: points -= 4; break; + default: break; } - i += 2; - } while (ptr[i] != TABLE_END); + } + else if (move == MOVE_WITHDRAW) // For some reason, vanilla gives points to it + { + points += 3; + } + + switch (GetMoveEffect(move)) + { + case EFFECT_WEATHER_BALL: + case EFFECT_THUNDER: + points += 3; + break; + case EFFECT_SOLAR_BEAM: + points -= 4; + break; + default: + break; + } + + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg2] += points; + break; + } + case PTS_SUN: + { + s32 points = 0; + + if (!IsBattleMoveStatus(move) && GetMoveType(move) == TYPE_FIRE) + points += 3; + + switch (GetMoveEffect(move)) + { + case EFFECT_SOLAR_BEAM: + points += 5; + break; + case EFFECT_WEATHER_BALL: + case EFFECT_SYNTHESIS: + case EFFECT_MORNING_SUN: + case EFFECT_MOONLIGHT: + points += 3; + break; + default: + break; + } + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg2] += points; + break; + } + case PTS_SANDSTORM: + case PTS_HAIL_SNOW: + { + s32 points = 0; + switch (GetMoveEffect(move)) + { + case EFFECT_WEATHER_BALL: + points += 3; + break; + case EFFECT_SOLAR_BEAM: + points -= 3; + break; + default: + break; + } + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg2] += points; + break; + } + case PTS_ELECTRIC: + if (!IsBattleMoveStatus(move) && GetMoveType(move) == TYPE_ELECTRIC) + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg2] += 3; break; #undef move case PTS_FAINT: - tvPtr->side[arg2 ^ 1].faintCause = FNT_NONE; - movePoints->points[arg2][0 * 4 + arg3] += sPointsArray[caseId][arg1]; + tvPtr->side[arg2 ^ BIT_SIDE].faintCause = FNT_NONE; + movePoints->points[arg2][0 * 4 + arg3] += 6; break; case PTS_FAINT_SET_UP: tvPtr->side[arg2].faintCause = FNT_NONE; - // fallthrough + movePoints->points[arg2][0 * 4 + arg3] += 6; + break; case PTS_SET_UP: movePoints->points[arg2][0 * 4 + arg3] += sPointsArray[caseId][arg1]; break; case PTS_BREAK_WALL: - movePoints->points[atkSide][arg2 * 4 + arg3] += sPointsArray[caseId][arg1]; + movePoints->points[atkSide][arg2 * 4 + arg3] += 6; break; case PTS_STATUS_DMG: - case PTS_STATUS: - case PTS_SAFEGUARD: - case PTS_MIST: - case PTS_FLINCHED: movePoints->points[atkSide ^ BIT_SIDE][arg2 * 4 + arg3] += sPointsArray[caseId][arg1]; break; + case PTS_STATUS_SKIP_TURN: + movePoints->points[atkSide ^ BIT_SIDE][arg2 * 4 + arg3] += 5; + break; + case PTS_MIST: + movePoints->points[atkSide ^ BIT_SIDE][arg2 * 4 + arg3] += 3; + break; + case PTS_SAFEGUARD: + case PTS_FLINCHED: + movePoints->points[atkSide ^ BIT_SIDE][arg2 * 4 + arg3] += 4; + break; case PTS_SPIKES: - movePoints->points[arg1][arg2 * 4 + arg3] += sPointsArray[caseId][0]; + movePoints->points[arg1][arg2 * 4 + arg3] += 4; break; #define move arg1 @@ -1014,12 +1003,12 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) if (tvPtr->pos[defSide][0].waterSportMonId != 0) { u32 id = (tvPtr->pos[defSide][0].waterSportMonId - 1) * 4; - movePoints->points[defSide][id + tvPtr->pos[defSide][0].waterSportMoveSlot] += sPointsArray[caseId][0]; + movePoints->points[defSide][id + tvPtr->pos[defSide][0].waterSportMoveSlot] += 5; } if (tvPtr->pos[defSide][1].waterSportMonId != 0) { u32 id = (tvPtr->pos[defSide][1].waterSportMonId - 1) * 4; - movePoints->points[defSide][id + tvPtr->pos[defSide][1].waterSportMoveSlot] += sPointsArray[caseId][0]; + movePoints->points[defSide][id + tvPtr->pos[defSide][1].waterSportMoveSlot] += 5; } } break; @@ -1030,12 +1019,12 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) if (tvPtr->pos[defSide][0].mudSportMonId != 0) { u32 id = (tvPtr->pos[defSide][0].mudSportMonId - 1) * 4; - movePoints->points[defSide][id + tvPtr->pos[defSide][0].mudSportMoveSlot] += sPointsArray[caseId][0]; + movePoints->points[defSide][id + tvPtr->pos[defSide][0].mudSportMoveSlot] += 5; } if (tvPtr->pos[defSide][1].mudSportMonId != 0) { u32 id = (tvPtr->pos[defSide][1].mudSportMonId - 1) * 4; - movePoints->points[defSide][id + tvPtr->pos[defSide][1].mudSportMoveSlot] += sPointsArray[caseId][0]; + movePoints->points[defSide][id + tvPtr->pos[defSide][1].mudSportMoveSlot] += 5; } } break; @@ -1044,7 +1033,7 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) if (IsBattleMovePhysical(move) && power != 0 && tvPtr->side[defSide].reflectMonId != 0) { u32 id = (tvPtr->side[defSide].reflectMonId - 1) * 4; - movePoints->points[defSide][id + tvPtr->side[defSide].reflectMoveSlot] += sPointsArray[caseId][0]; + movePoints->points[defSide][id + tvPtr->side[defSide].reflectMoveSlot] += 3; } break; case PTS_LIGHT_SCREEN: @@ -1387,5 +1376,5 @@ static void AddPointsBasedOnWeather(u16 weatherFlags, u16 moveId, u8 moveSlot) else if (weatherFlags & B_WEATHER_SANDSTORM) AddMovePoints(PTS_SANDSTORM, moveId, moveSlot, 0); else if (weatherFlags & (B_WEATHER_HAIL | B_WEATHER_SNOW)) - AddMovePoints(PTS_HAIL, moveId, moveSlot, 0); + AddMovePoints(PTS_HAIL_SNOW, moveId, moveSlot, 0); } diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 9e29b064d3..f034d8953d 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -2149,7 +2149,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_BLIZZARD] = { .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points + .battleTvScore = 1, }, [EFFECT_RAIN_ALWAYS_HIT] = @@ -2238,7 +2238,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_RAPID_SPIN] = { .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points + .battleTvScore = 2, }, [EFFECT_SPECTRAL_THIEF] =