Battle TV expansion (#6826)
This commit is contained in:
parent
de79d6de48
commit
face37e8f3
485
src/battle_tv.c
485
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);
|
||||
}
|
||||
|
||||
@ -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] =
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user