Document BattleScript_CalcEffortValues

This commit is contained in:
lhearachel 2023-10-12 20:54:10 -07:00
parent 57a0b5fcc4
commit ad15d7ce16
6 changed files with 83 additions and 66 deletions

View File

@ -92,7 +92,7 @@ enum {
#define HOLD_EFFECT_RECOIL_SPECIAL 47
#define HOLD_EFFECT_ACC_REDUCE 48
#define HOLD_EFFECT_STATDOWN_RESTORE 49
#define HOLD_EFFECT_EXP_UP_SPEED_DOWN 50
#define HOLD_EFFECT_EVS_UP_SPEED_DOWN 50
#define HOLD_EFFECT_EXP_SHARE 51
#define HOLD_EFFECT_SOMETIMES_PRIORITY 52
#define HOLD_EFFECT_FRIENDSHIP_UP 53

View File

@ -37,12 +37,17 @@ enum PokemonStats {
STAT_DEFENSE,
STAT_SPEED,
STAT_SPECIAL_ATTACK,
STAT_SPECIAL_DEFENSE
STAT_SPECIAL_DEFENSE,
STAT_MAX
};
#define MAX_PARTY_SIZE 6
#define NUM_BOOSTABLE_STATS 8
#define MAX_EVS_SINGLE_STAT 255
#define MAX_EVS_ALL_STATS 510
enum PokemonGender {
MON_GENDER_MALE,
MON_GENDER_FEMALE,

View File

@ -708,7 +708,7 @@ s8 Pokemon_GetFlavorAffinityOf(u32 monPersonality, int flavor);
int Pokemon_LoadLevelUpMoveIdsOf(int monSpecies, int monForm, u16 *monLevelUpMoveIDs);
void Pokemon_ApplyPokerus(Party *party);
u8 sub_02077758(Party *party, u8 param1);
u8 Pokemon_HasPokerus(Party *party, u8 param1);
void sub_020777B4(Party *party, s32 param1);
void Pokemon_ValidatePokerus(Party *party);
BOOL sub_020778D8(Pokemon *mon);

View File

@ -192,7 +192,7 @@ ITEM_JABOCA_BERRY,20,HOLD_EFFECT_RECOIL_PHYSICAL,8,0,0,10,80,TYPE_DRAGON,false,f
ITEM_ROWAP_BERRY,20,HOLD_EFFECT_RECOIL_SPECIAL,8,0,0,10,80,TYPE_DARK,false,false,POCKET_BERRIES,0,8,0,1,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
ITEM_BRIGHTPOWDER,10,HOLD_EFFECT_ACC_REDUCE,10,0,0,10,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
ITEM_WHITE_HERB,100,HOLD_EFFECT_STATDOWN_RESTORE,0,0,24,10,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
ITEM_MACHO_BRACE,3000,HOLD_EFFECT_EXP_UP_SPEED_DOWN,0,0,0,60,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
ITEM_MACHO_BRACE,3000,HOLD_EFFECT_EVS_UP_SPEED_DOWN,0,0,0,60,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
ITEM_EXP_SHARE,3000,HOLD_EFFECT_EXP_SHARE,0,0,0,30,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
ITEM_QUICK_CLAW,100,HOLD_EFFECT_SOMETIMES_PRIORITY,20,0,0,80,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0
ITEM_SOOTHE_BELL,100,HOLD_EFFECT_FRIENDSHIP_UP,0,0,0,10,0,31,false,false,POCKET_ITEMS,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false,0,0,0,0,0,0,0,0,0,0,0

1 item price holdEffect holdEffectParam pluckEffect flingEffect flingPower naturalGiftPower naturalGiftType prevent_toss selectable fieldPocket battlePocket fieldUseFunc battleUseFunc partyUse healSleep healPoison healBurn healFreeze healParalysis healConfusion healAttract guardSpec revive reviveAll levelUp evolve atkStages defStages spatkStages spdefStages speedStages accStages critStages ppUp ppMax ppRestore ppRestoreAll hpRestore giveHPEVs giveAtkEVs giveDefEVs giveSpeedEVs giveSpAtkEVs giveSpDefEVs giveFriendshipLow giveFriendshipMed giveFriendshipHigh hpEVs atkEVs defEVs speedEVs spatkEVs spdefEVs hpRestored ppRestored friendshipLow friendshipMed friendshipHigh
192 ITEM_ROWAP_BERRY 20 HOLD_EFFECT_RECOIL_SPECIAL 8 0 0 10 80 TYPE_DARK false false POCKET_BERRIES 0 8 0 1 false false false false false false false false false false false false 0 0 0 0 0 0 0 false false false false false false false false false false false false false false 0 0 0 0 0 0 0 0 0 0 0
193 ITEM_BRIGHTPOWDER 10 HOLD_EFFECT_ACC_REDUCE 10 0 0 10 0 31 false false POCKET_ITEMS 0 0 0 0 false false false false false false false false false false false false 0 0 0 0 0 0 0 false false false false false false false false false false false false false false 0 0 0 0 0 0 0 0 0 0 0
194 ITEM_WHITE_HERB 100 HOLD_EFFECT_STATDOWN_RESTORE 0 0 24 10 0 31 false false POCKET_ITEMS 0 0 0 0 false false false false false false false false false false false false 0 0 0 0 0 0 0 false false false false false false false false false false false false false false 0 0 0 0 0 0 0 0 0 0 0
195 ITEM_MACHO_BRACE 3000 HOLD_EFFECT_EXP_UP_SPEED_DOWN HOLD_EFFECT_EVS_UP_SPEED_DOWN 0 0 0 60 0 31 false false POCKET_ITEMS 0 0 0 0 false false false false false false false false false false false false 0 0 0 0 0 0 0 false false false false false false false false false false false false false false 0 0 0 0 0 0 0 0 0 0 0
196 ITEM_EXP_SHARE 3000 HOLD_EFFECT_EXP_SHARE 0 0 0 30 0 31 false false POCKET_ITEMS 0 0 0 0 false false false false false false false false false false false false 0 0 0 0 0 0 0 false false false false false false false false false false false false false false 0 0 0 0 0 0 0 0 0 0 0
197 ITEM_QUICK_CLAW 100 HOLD_EFFECT_SOMETIMES_PRIORITY 20 0 0 80 0 31 false false POCKET_ITEMS 0 0 0 0 false false false false false false false false false false false false 0 0 0 0 0 0 0 false false false false false false false false false false false false false false 0 0 0 0 0 0 0 0 0 0 0
198 ITEM_SOOTHE_BELL 100 HOLD_EFFECT_FRIENDSHIP_UP 0 0 0 10 0 31 false false POCKET_ITEMS 0 0 0 0 false false false false false false false false false false false false 0 0 0 0 0 0 0 false false false false false false false false false false false false false false 0 0 0 0 0 0 0 0 0 0 0

View File

@ -348,7 +348,7 @@ static int BattleMessage_TrainerClassTag(BattleSystem *battleSys, BattleContext
static int BattleMessage_TrainerNameTag(BattleSystem *battleSys, BattleContext *battleCtx, int battlerIn);
static u32 ov16_022431BC(BattleSystem * param0, BattleContext * param1, int param2);
static void BattleScript_CalcEffortValues(Party * param0, int param1, int param2, int param3);
static void BattleScript_CalcEffortValues(Party *party, int slot, int species, int form);
static int ov16_0224A724(BattleSystem * param0, BattleContext * param1);
static void BattleScript_LoadPartyLevelUpIcon(BattleSystem * param0, BattleScriptTaskData * param1, Pokemon * param2);
static void BattleScript_FreePartyLevelUpIcon(BattleSystem * param0, BattleScriptTaskData * param1);
@ -8654,102 +8654,114 @@ static void ov16_02248E74 (SysTask * param0, void * param1)
}
}
static void BattleScript_CalcEffortValues (Party * param0, int param1, int param2, int param3)
/**
* @brief Compute the effort-value payout for a given party member, considering
* that they participating in the defeat of an opponent with the given species
* and form.
*
* @param party The Party struct
* @param slot Slot in the party deserving EV payout
* @param species The species of the defeated foe
* @param form The form of the defeated foe
*/
static void BattleScript_CalcEffortValues(Party *party, int slot, int species, int form)
{
int v0;
s16 v1 = 0;
u8 v2[6];
u16 v3;
u16 v4;
int v5;
int v6;
Pokemon * v7;
PokemonPersonalData * v8;
// must declare C89-style to match
int stat;
s16 tmp = 0;
u8 curEVs[6];
u16 sumEVs;
u16 item;
int itemEffect;
int itemPower;
Pokemon *mon;
PokemonPersonalData *personal;
v8 = PokemonPersonalData_FromMonForm(param2, param3, 5);
v7 = Party_GetPokemonBySlotIndex(param0, param1);
v4 = Pokemon_GetValue(v7, MON_DATA_HELD_ITEM, NULL);
v5 = Item_LoadParam(v4, 1, 5);
v6 = Item_LoadParam(v4, 2, 5);
v3 = 0;
personal = PokemonPersonalData_FromMonForm(species, form, HEAP_ID_BATTLE);
mon = Party_GetPokemonBySlotIndex(party, slot);
item = Pokemon_GetValue(mon, MON_DATA_HELD_ITEM, NULL);
itemEffect = Item_LoadParam(item, ITEM_PARAM_HOLD_EFFECT, HEAP_ID_BATTLE);
itemPower = Item_LoadParam(item, ITEM_PARAM_HOLD_EFFECT_PARAM, HEAP_ID_BATTLE);
sumEVs = 0;
for (v0 = 0; v0 < 6; v0++) {
v2[v0] = Pokemon_GetValue(v7, MON_DATA_HP_EV + v0, NULL);
v3 += v2[v0];
for (stat = 0; stat < STAT_MAX; stat++) {
curEVs[stat] = Pokemon_GetValue(mon, MON_DATA_HP_EV + stat, NULL);
sumEVs += curEVs[stat];
}
for (v0 = 0; v0 < 6; v0++) {
if (v3 >= 510) {
for (stat = 0; stat < STAT_MAX; stat++) {
if (sumEVs >= MAX_EVS_ALL_STATS) {
break;
}
switch (v0) {
case 0:
v1 = PokemonPersonalData_GetValue(v8, 10);
if (v5 == 122) {
v1 += v6;
switch (stat) {
case STAT_HP:
tmp = PokemonPersonalData_GetValue(personal, MON_DATA_PERSONAL_EV_HP_YIELD);
if (itemEffect == HOLD_EFFECT_LVLUP_HP_EV_UP) {
tmp += itemPower;
}
break;
case 1:
v1 = PokemonPersonalData_GetValue(v8, 11);
if (v5 == 117) {
v1 += v6;
case STAT_ATTACK:
tmp = PokemonPersonalData_GetValue(personal, MON_DATA_PERSONAL_EV_ATK_YIELD);
if (itemEffect == HOLD_EFFECT_LVLUP_ATK_EV_UP) {
tmp += itemPower;
}
break;
case 2:
v1 = PokemonPersonalData_GetValue(v8, 12);
if (v5 == 118) {
v1 += v6;
case STAT_DEFENSE:
tmp = PokemonPersonalData_GetValue(personal, MON_DATA_PERSONAL_EV_DEF_YIELD);
if (itemEffect == HOLD_EFFECT_LVLUP_DEF_EV_UP) {
tmp += itemPower;
}
break;
case 3:
v1 = PokemonPersonalData_GetValue(v8, 13);
if (v5 == 121) {
v1 += v6;
case STAT_SPEED:
tmp = PokemonPersonalData_GetValue(personal, MON_DATA_PERSONAL_EV_SPEED_YIELD);
if (itemEffect == HOLD_EFFECT_LVLUP_SPEED_EV_UP) {
tmp += itemPower;
}
break;
case 4:
v1 = PokemonPersonalData_GetValue(v8, 14);
if (v5 == 119) {
v1 += v6;
case STAT_SPECIAL_ATTACK:
tmp = PokemonPersonalData_GetValue(personal, MON_DATA_PERSONAL_EV_SP_ATK_YIELD);
if (itemEffect == HOLD_EFFECT_LVLUP_SPATK_EV_UP) {
tmp += itemPower;
}
break;
case 5:
v1 = PokemonPersonalData_GetValue(v8, 15);
if (v5 == 120) {
v1 += v6;
case STAT_SPECIAL_DEFENSE:
tmp = PokemonPersonalData_GetValue(personal, MON_DATA_PERSONAL_EV_SP_DEF_YIELD);
if (itemEffect == HOLD_EFFECT_LVLUP_SPDEF_EV_UP) {
tmp += itemPower;
}
break;
}
if (sub_02077758(param0, FlagIndex(param1))) {
v1 = v1 * 2;
if (Pokemon_HasPokerus(party, FlagIndex(slot))) {
tmp *= 2;
}
if (v5 == 50) {
v1 = v1 * 2;
if (itemEffect == HOLD_EFFECT_EVS_UP_SPEED_DOWN) {
tmp *= 2;
}
if (v3 + v1 > 510) {
v1 -= ((v3 + v1) - 510);
// Don't let the sum of all EVs exceed the sum max
if (sumEVs + tmp > MAX_EVS_ALL_STATS) {
tmp -= (sumEVs + tmp - MAX_EVS_ALL_STATS);
}
if (v2[v0] + v1 > 255) {
v1 -= ((v2[v0] + v1) - 255);
// Don't let the sum of EVs for this stat exceed the stat-local max
if (curEVs[stat] + tmp > MAX_EVS_SINGLE_STAT) {
tmp -= (curEVs[stat] + tmp - MAX_EVS_SINGLE_STAT);
}
v2[v0] += v1;
v3 += v1;
Pokemon_SetValue(v7, 13 + v0, (u8 *)&v2[v0]);
curEVs[stat] += tmp;
sumEVs += tmp;
Pokemon_SetValue(mon, MON_DATA_HP_EV + stat, &curEVs[stat]);
}
PokemonPersonalData_Free(v8);
PokemonPersonalData_Free(personal);
}
static void ov16_02249B80 (SysTask * param0, void * param1)

View File

@ -3657,7 +3657,7 @@ void Pokemon_ApplyPokerus(Party *party)
}
} while (partySlot == currentPartyCount);
if (sub_02077758(party, FlagIndex(partySlot)) == 0) {
if (Pokemon_HasPokerus(party, FlagIndex(partySlot)) == 0) {
u8 monPokerus;
do {
monPokerus = LCRNG_Next() & 0xff;
@ -3676,7 +3676,7 @@ void Pokemon_ApplyPokerus(Party *party)
}
}
u8 sub_02077758(Party *party, u8 param1)
u8 Pokemon_HasPokerus(Party *party, u8 param1)
{
int partySlot = 0;
int v1 = 1;