diff --git a/linker_scripts/us/symbol_addrs_code.txt b/linker_scripts/us/symbol_addrs_code.txt index 27211fd..b5ce780 100644 --- a/linker_scripts/us/symbol_addrs_code.txt +++ b/linker_scripts/us/symbol_addrs_code.txt @@ -764,7 +764,7 @@ func_80022010 = 0x80022010; // type:func func_80022084 = 0x80022084; // type:func func_800220C4 = 0x800220C4; // type:func func_800220CC = 0x800220CC; // type:func -func_80022170 = 0x80022170; // type:func +CalculateStatValue = 0x80022170; // func_80022338 = 0x80022338; // type:func func_8002240C = 0x8002240C; // type:func func_800224B8 = 0x800224B8; // type:func @@ -2744,7 +2744,7 @@ func_86C01D2C = 0x86C01D2C; // type:func miniGetCloser2Diglett = 0x86C01FAC; // type:func func_86C021FC = 0x86C021FC; // type:func miniEkansAnycontrols = 0x86C022D8; // type:func -miniEkansMinigameStateMachine = 0x86C02324; // type:func +//miniEkansMinigameStateMachine = 0x86C02324; // type:func miniEkansPlayersUpdate = 0x86C02514; // type:func func_86C02610 = 0x86C02610; // type:func initDiglettHole = 0x86C026F0; // type:func diff --git a/src/22630.c b/src/22630.c index 519a203..1055a63 100644 --- a/src/22630.c +++ b/src/22630.c @@ -203,84 +203,88 @@ u16 func_80022084(u16 arg0) { void func_800220C4(void) { } -u16 func_800220CC(s32 arg0, u16 arg1) { - u16 sp6; +u16 GetPokemonDV(s32 statId, u16 dvBits) { //GetPokemonDV + u16 dvValue; - switch (arg0) { - case 1: - sp6 = ((arg1 & 0x1000) >> 9) | ((arg1 & 0x100) >> 6) | ((arg1 & 0x10) >> 3) | (arg1 & 1); + switch (statId) { + case STAT_HP: // HP DV (derived from the LSBs of other DVs) + dvValue = ((dvBits & 0x1000) >> 9) // Special DV bit 0 → HP DV bit 0 + | ((dvBits & 0x0100) >> 6) // Speed DV bit 0 → HP DV bit 1 + | ((dvBits & 0x0010) >> 3) // Defense DV bit 0 → HP DV bit 2 + | (dvBits & 0x0001); // Attack DV bit 0 → HP DV bit 3 break; - case 2: - sp6 = (arg1 >> 0xC) & 0xF; + case STAT_SPECIAL: // Special DV + dvValue = (dvBits >> 12) & 0xF; break; - case 3: - sp6 = (arg1 >> 8) & 0xF; + case STAT_SPEED: // Speed DV + dvValue = (dvBits >> 8) & 0xF; break; - case 4: - sp6 = (arg1 >> 4) & 0xF; + case STAT_DEFENSE: // Defense DV + dvValue = (dvBits >> 4) & 0xF; break; - case 5: - sp6 = arg1 & 0xF; + case STAT_ATTACK: // Attack DV + dvValue = dvBits & 0xF; break; } - return sp6; + return dvValue; } -u32 func_80022170(s32 arg0, s32 arg1, u16 arg2, u16 arg3, u16 arg4) { - u16 sp1C; - u16 sp24; - u16 sp22; +u32 CalculateStatValue(s32 statId, s32 speciesId, u16 statModifier, u16 level, u16 dvBits) { + u16 statValue; + u16 baseStat; + u16 dvValue; - switch (arg0) { - case 1: - sp24 = D_80070F84[arg1].unk_06; + switch (statId) { + case STAT_HP: + baseStat = D_80070F84[speciesId].baseHP; break; - - case 2: - sp24 = D_80070F84[arg1].unk_07; + case STAT_SPECIAL: + baseStat = D_80070F84[speciesId].baseSpecial; break; - - case 3: - sp24 = D_80070F84[arg1].unk_08; + case STAT_SPEED: + baseStat = D_80070F84[speciesId].baseSpeed; break; - - case 4: - sp24 = D_80070F84[arg1].unk_09; + case STAT_DEFENSE: + baseStat = D_80070F84[speciesId].baseDefense; break; - - case 5: - sp24 = D_80070F84[arg1].unk_0A[0]; + case STAT_ATTACK: + baseStat = D_80070F84[speciesId].baseAttack; break; } - sp22 = func_800220CC(arg0, arg4); + // Get the Pokémon's DV for the stat (or HP DV) + dvValue = GetPokemonDV(statId, dvBits); - sp1C = (((func_80022084(arg2) / 4) + ((sp24 + sp22) * 2)) * arg3) / 100; - if (arg0 == 1) { - sp1C += arg3 + 10; + // Compute the preliminary stat value + statValue = (((func_80022084(statModifier) / 4) + ((baseStat + dvValue) * 2)) * level) / 100; + + // Add final adjustments + if (statId == STAT_HP) { + statValue += level + 10; } else { - sp1C += 5; + statValue += 5; } - if (sp1C > 999) { - sp1C = 999; + // Cap at 999 + if (statValue > 999) { + statValue = 999; } - return sp1C; + return statValue; } void func_80022338(unk_func_80026268_arg0* arg0) { arg0->unk_24 = func_800226C0(arg0->unk_00.unk_00, arg0->unk_10); - arg0->unk_26 = func_80022170(1, arg0->unk_00.unk_00, arg0->unk_14, arg0->unk_24, arg0->unk_1E); - arg0->unk_28 = func_80022170(2, arg0->unk_00.unk_00, arg0->unk_16, arg0->unk_24, arg0->unk_1E); - arg0->unk_2A = func_80022170(3, arg0->unk_00.unk_00, arg0->unk_18, arg0->unk_24, arg0->unk_1E); - arg0->unk_2C = func_80022170(4, arg0->unk_00.unk_00, arg0->unk_1A, arg0->unk_24, arg0->unk_1E); - arg0->unk_2E = func_80022170(5, arg0->unk_00.unk_00, arg0->unk_1C, arg0->unk_24, arg0->unk_1E); + arg0->unk_26 = CalculateStatValue(1, arg0->unk_00.unk_00, arg0->unk_14, arg0->unk_24, arg0->unk_1E); + arg0->unk_28 = CalculateStatValue(2, arg0->unk_00.unk_00, arg0->unk_16, arg0->unk_24, arg0->unk_1E); + arg0->unk_2A = CalculateStatValue(3, arg0->unk_00.unk_00, arg0->unk_18, arg0->unk_24, arg0->unk_1E); + arg0->unk_2C = CalculateStatValue(4, arg0->unk_00.unk_00, arg0->unk_1A, arg0->unk_24, arg0->unk_1E); + arg0->unk_2E = CalculateStatValue(5, arg0->unk_00.unk_00, arg0->unk_1C, arg0->unk_24, arg0->unk_1E); } u16 func_8002240C(s32 arg0, s32 arg1, u16 arg2, u16 arg3, u16 arg4) { @@ -288,7 +292,7 @@ u16 func_8002240C(s32 arg0, s32 arg1, u16 arg2, u16 arg3, u16 arg4) { s32 tmp; for (i = 1; i < 0xFFFF; i += 2) { - tmp = func_80022170(arg0, arg1, i + 2, arg3, arg4); + tmp = CalculateStatValue(arg0, arg1, i + 2, arg3, arg4); if (arg2 < tmp) { break; } diff --git a/src/22630.h b/src/22630.h index ca6e6fd..8ce5f31 100644 --- a/src/22630.h +++ b/src/22630.h @@ -6,6 +6,31 @@ #include "29BA0.h" #include "2D340.h" +#define STAT_HP 1 +#define STAT_SPECIAL 2 +#define STAT_SPEED 3 +#define STAT_DEFENSE 4 +#define STAT_ATTACK 5 + +typedef struct PokemonStats { + /* 0x00 */ u8 unk_00; + /* 0x01 */ u8 unk_01; + /* 0x02 */ u8 unk_02; + /* 0x03 */ u8 unk_03; + /* 0x04 */ u8 unk_04; + /* 0x05 */ u8 unk_05; + /* 0x06 */ u8 baseHP; + /* 0x07 */ u8 baseSpecial; + /* 0x08 */ u8 baseSpeed; + /* 0x09 */ u8 baseDefense; + /* 0x0A */ u8 baseAttack; + /* 0x0B */ char unk0B[0x4]; + /* 0x0F */ u8 unk_0F[1]; + /* 0x10 */ char unk10[0x3]; + /* 0x13 */ u8 unk_13; + /* 0x14 */ char unk14[0x3]; +} PokemonStats; // size = 0x17 + typedef struct unk_D_80070F84 { /* 0x00 */ u8 unk_00; /* 0x01 */ u8 unk_01; @@ -17,16 +42,16 @@ typedef struct unk_D_80070F84 { /* 0x07 */ u8 unk_07; /* 0x08 */ u8 unk_08; /* 0x09 */ u8 unk_09; - /* 0x0A */ u8 unk_0A[1]; - /* 0x0B */ char unk0B[0x4]; + /* 0x0A */ u8 unk_0A[4]; + /* 0x0E */ char unk0E[1]; /* 0x0F */ u8 unk_0F[1]; /* 0x10 */ char unk10[0x3]; /* 0x13 */ u8 unk_13; /* 0x14 */ char unk14[0x3]; } unk_D_80070F84; // size = 0x17 -extern unk_D_80070F84 D_80070F84[]; -extern unk_D_80070F84 D_80070FA0[]; +extern PokemonStats D_80070F84[]; +extern unk_D_80070F84 D_80070FA0[]; //TODO: is this typed correctly? typedef struct unk_D_80071D88 { /* 0x00 */ char* type_name; @@ -204,7 +229,7 @@ void func_80022010(unk_func_88205880_00D0* arg0, unk_D_800AC910_050_9AC_008* arg u16 func_80022084(u16 arg0); void func_800220C4(void); u16 func_800220CC(s32 arg0, u16 arg1); -u32 func_80022170(s32 arg0, s32 arg1, u16 arg2, u16 arg3, u16 arg4); +u32 CalculateStatValue(s32 statId, s32 speciesId, u16 statModifier, u16 level, u16 dvBits); void func_80022338(unk_func_80026268_arg0* arg0); u16 func_8002240C(s32 arg0, s32 arg1, u16 arg2, u16 arg3, u16 arg4); u32 func_800224B8(s32 arg0, u16 arg1); diff --git a/src/fragments/24/fragment24_1CEA00.c b/src/fragments/24/fragment24_1CEA00.c index 815c951..6cf8804 100644 --- a/src/fragments/24/fragment24_1CEA00.c +++ b/src/fragments/24/fragment24_1CEA00.c @@ -1700,7 +1700,7 @@ s32 func_883058C4(unk_func_8830867C_02C_0CC_000* arg0, unk_func_8830867C_04C_030 if (temp_s0->unk_14 >= 0x6401) { temp_s0->unk_14 = 0x6400; } - temp_s0->unk_26 = func_80022170(1, temp_s0->unk_00, temp_s0->unk_14, temp_s0->unk_24, temp_s0->unk_1E); + temp_s0->unk_26 = CalculateStatValue(STAT_HP, temp_s0->unk_00, temp_s0->unk_14, temp_s0->unk_24, temp_s0->unk_1E); *arg3 = temp_s0->unk_26; break; @@ -1711,7 +1711,7 @@ s32 func_883058C4(unk_func_8830867C_02C_0CC_000* arg0, unk_func_8830867C_04C_030 if (temp_s0->unk_16 >= 0x6401) { temp_s0->unk_16 = 0x6400; } - temp_s0->unk_28 = func_80022170(2, temp_s0->unk_00, temp_s0->unk_16, temp_s0->unk_24, temp_s0->unk_1E); + temp_s0->unk_28 = CalculateStatValue(STAT_SPECIAL, temp_s0->unk_00, temp_s0->unk_16, temp_s0->unk_24, temp_s0->unk_1E); *arg3 = temp_s0->unk_28; break; @@ -1722,7 +1722,7 @@ s32 func_883058C4(unk_func_8830867C_02C_0CC_000* arg0, unk_func_8830867C_04C_030 if (temp_s0->unk_18 >= 0x6401) { temp_s0->unk_18 = 0x6400; } - temp_s0->unk_2A = func_80022170(3, temp_s0->unk_00, temp_s0->unk_18, temp_s0->unk_24, temp_s0->unk_1E); + temp_s0->unk_2A = CalculateStatValue(STAT_SPEED, temp_s0->unk_00, temp_s0->unk_18, temp_s0->unk_24, temp_s0->unk_1E); *arg3 = temp_s0->unk_2A; break; @@ -1733,7 +1733,7 @@ s32 func_883058C4(unk_func_8830867C_02C_0CC_000* arg0, unk_func_8830867C_04C_030 if (temp_s0->unk_1A >= 0x6401) { temp_s0->unk_1A = 0x6400; } - temp_s0->unk_2C = func_80022170(4, temp_s0->unk_00, temp_s0->unk_1A, temp_s0->unk_24, temp_s0->unk_1E); + temp_s0->unk_2C = CalculateStatValue(STAT_DEFENSE, temp_s0->unk_00, temp_s0->unk_1A, temp_s0->unk_24, temp_s0->unk_1E); *arg3 = temp_s0->unk_2C; break; @@ -1744,7 +1744,7 @@ s32 func_883058C4(unk_func_8830867C_02C_0CC_000* arg0, unk_func_8830867C_04C_030 if (temp_s0->unk_1C >= 0x6401) { temp_s0->unk_1C = 0x6400; } - temp_s0->unk_2E = func_80022170(5, temp_s0->unk_00, temp_s0->unk_1C, temp_s0->unk_24, temp_s0->unk_1E); + temp_s0->unk_2E = CalculateStatValue(STAT_ATTACK, temp_s0->unk_00, temp_s0->unk_1C, temp_s0->unk_24, temp_s0->unk_1E); *arg3 = temp_s0->unk_2E; break; diff --git a/src/fragments/24/fragment24_1D7B40.c b/src/fragments/24/fragment24_1D7B40.c index e07484e..757ac78 100644 --- a/src/fragments/24/fragment24_1D7B40.c +++ b/src/fragments/24/fragment24_1D7B40.c @@ -2803,7 +2803,7 @@ void func_883112B0(unk_func_8830867C_04C* arg0, s32 arg1, s32 arg2, unk_func_880 } s32 func_88311C64(s32 arg0, s32 arg1) { - static unk_D_80070F84 D_8831757C[] = { + static PokemonStats D_8831757C[] = { { 0x06, 0x4E, @@ -3103,7 +3103,7 @@ s32 func_88311C64(s32 arg0, s32 arg1) { }, }; - unk_D_80070F84* var_v1; + PokemonStats* var_v1; s32 i; var_v1 = &D_80070FA0[arg0 - 1]; diff --git a/src/fragments/62/fragment62_2EC3C0.c b/src/fragments/62/fragment62_2EC3C0.c index 422c592..1feecbf 100644 --- a/src/fragments/62/fragment62_2EC3C0.c +++ b/src/fragments/62/fragment62_2EC3C0.c @@ -261,7 +261,7 @@ void func_843021E8(unk_D_84390010* arg0, u16 arg1, unk_D_84390010_94C* arg2, unk s32 temp_v0_3; s32 temp_v1_2; u8 var_a0; - unk_D_80070F84* temp_s4; + unk_D_80070F84* temp_s4; //TODO: this is definitely typed wrong unk_D_800FCB18* temp_s5; temp_s5 = &arg0->unk_654.unk_38; @@ -270,7 +270,7 @@ void func_843021E8(unk_D_84390010* arg0, u16 arg1, unk_D_84390010_94C* arg2, unk if (temp_s5->unk_1F[i] != 0) { temp_s4 = &D_80070FA0[arg1]; - for (j = 0; j < 4; j++) { + for (j = 0; j < ARRAY_COUNT(temp_s4->unk_0A); j++) { if ((temp_s4->unk_0A[j] != 0) && (temp_s4->unk_0A[j] == temp_s5->unk_1F[i])) { arg0->unk_654.unk_C1[i] = 0; } diff --git a/src/fragments/62/fragment62_359F90.c b/src/fragments/62/fragment62_359F90.c index bb1b4b9..3cb7a73 100644 --- a/src/fragments/62/fragment62_359F90.c +++ b/src/fragments/62/fragment62_359F90.c @@ -779,7 +779,7 @@ void func_84370B7C(unk_D_84390010* arg0) { func_84370B0C(arg0); func_84370B44(arg0); - sp24->unk_36 = D_80070F84[sp24->unk_0B].unk_06; + sp24->unk_36 = D_80070F84[sp24->unk_0B].baseHP; sp24->unk_38 = sp34->unk_28; sp24->unk_3A = sp34->unk_2A; sp24->unk_3C = sp34->unk_2C; @@ -1204,9 +1204,9 @@ s32 func_84371C18(void) { D_843C4DA5 = 0; if (D_8438AC60[0] == 1) { - sp18 = (D_80070F84[D_843C5238->unk_0B].unk_09 + 0x4C) >> 2; + sp18 = (D_80070F84[D_843C5238->unk_0B].baseDefense + 0x4C) >> 2; } else { - sp18 = D_80070F84[D_843C5238->unk_0B].unk_09 >> 1; + sp18 = D_80070F84[D_843C5238->unk_0B].baseDefense >> 1; } if (D_843C5238->unk_44.unk_02 == 0) { diff --git a/src/fragments/62/fragment62_361050.c b/src/fragments/62/fragment62_361050.c index 46bcb0b..bc276e3 100644 --- a/src/fragments/62/fragment62_361050.c +++ b/src/fragments/62/fragment62_361050.c @@ -3759,7 +3759,7 @@ void func_8437E974(unk_D_800AE540_0004* arg0, unk_D_800AE540_0004* arg1, unk_D_8 u8 i; u8 var_v1; u8 sp73; - unk_D_80070F84* sp6C; + PokemonStats* sp6C; unk_func_80026268_arg0* sp64[2]; unk_func_80026268_arg0* temp_s7;