Battle TV expansion (#6826)

This commit is contained in:
Eduardo Quezada 2025-05-13 09:54:54 -04:00 committed by GitHub
parent de79d6de48
commit face37e8f3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 239 additions and 250 deletions

View File

@ -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);
}

View File

@ -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] =