Merge pull request #204 from Rainchus/master
Some checks failed
C/C++ CI / build (push) Has been cancelled

remove duplicate symbol name, label some dv/stat related code
This commit is contained in:
Revo 2025-08-15 22:29:43 -04:00 committed by GitHub
commit c57626d749
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 96 additions and 67 deletions

View File

@ -764,7 +764,7 @@ func_80022010 = 0x80022010; // type:func
func_80022084 = 0x80022084; // type:func func_80022084 = 0x80022084; // type:func
func_800220C4 = 0x800220C4; // type:func func_800220C4 = 0x800220C4; // type:func
func_800220CC = 0x800220CC; // type:func func_800220CC = 0x800220CC; // type:func
func_80022170 = 0x80022170; // type:func CalculateStatValue = 0x80022170; //
func_80022338 = 0x80022338; // type:func func_80022338 = 0x80022338; // type:func
func_8002240C = 0x8002240C; // type:func func_8002240C = 0x8002240C; // type:func
func_800224B8 = 0x800224B8; // type:func func_800224B8 = 0x800224B8; // type:func
@ -2744,7 +2744,7 @@ func_86C01D2C = 0x86C01D2C; // type:func
miniGetCloser2Diglett = 0x86C01FAC; // type:func miniGetCloser2Diglett = 0x86C01FAC; // type:func
func_86C021FC = 0x86C021FC; // type:func func_86C021FC = 0x86C021FC; // type:func
miniEkansAnycontrols = 0x86C022D8; // type:func miniEkansAnycontrols = 0x86C022D8; // type:func
miniEkansMinigameStateMachine = 0x86C02324; // type:func //miniEkansMinigameStateMachine = 0x86C02324; // type:func
miniEkansPlayersUpdate = 0x86C02514; // type:func miniEkansPlayersUpdate = 0x86C02514; // type:func
func_86C02610 = 0x86C02610; // type:func func_86C02610 = 0x86C02610; // type:func
initDiglettHole = 0x86C026F0; // type:func initDiglettHole = 0x86C026F0; // type:func

View File

@ -203,84 +203,88 @@ u16 func_80022084(u16 arg0) {
void func_800220C4(void) { void func_800220C4(void) {
} }
u16 func_800220CC(s32 arg0, u16 arg1) { u16 GetPokemonDV(s32 statId, u16 dvBits) { //GetPokemonDV
u16 sp6; u16 dvValue;
switch (arg0) { switch (statId) {
case 1: case STAT_HP: // HP DV (derived from the LSBs of other DVs)
sp6 = ((arg1 & 0x1000) >> 9) | ((arg1 & 0x100) >> 6) | ((arg1 & 0x10) >> 3) | (arg1 & 1); 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; break;
case 2: case STAT_SPECIAL: // Special DV
sp6 = (arg1 >> 0xC) & 0xF; dvValue = (dvBits >> 12) & 0xF;
break; break;
case 3: case STAT_SPEED: // Speed DV
sp6 = (arg1 >> 8) & 0xF; dvValue = (dvBits >> 8) & 0xF;
break; break;
case 4: case STAT_DEFENSE: // Defense DV
sp6 = (arg1 >> 4) & 0xF; dvValue = (dvBits >> 4) & 0xF;
break; break;
case 5: case STAT_ATTACK: // Attack DV
sp6 = arg1 & 0xF; dvValue = dvBits & 0xF;
break; break;
} }
return sp6; return dvValue;
} }
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) {
u16 sp1C; u16 statValue;
u16 sp24; u16 baseStat;
u16 sp22; u16 dvValue;
switch (arg0) { switch (statId) {
case 1: case STAT_HP:
sp24 = D_80070F84[arg1].unk_06; baseStat = D_80070F84[speciesId].baseHP;
break; break;
case STAT_SPECIAL:
case 2: baseStat = D_80070F84[speciesId].baseSpecial;
sp24 = D_80070F84[arg1].unk_07;
break; break;
case STAT_SPEED:
case 3: baseStat = D_80070F84[speciesId].baseSpeed;
sp24 = D_80070F84[arg1].unk_08;
break; break;
case STAT_DEFENSE:
case 4: baseStat = D_80070F84[speciesId].baseDefense;
sp24 = D_80070F84[arg1].unk_09;
break; break;
case STAT_ATTACK:
case 5: baseStat = D_80070F84[speciesId].baseAttack;
sp24 = D_80070F84[arg1].unk_0A[0];
break; 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; // Compute the preliminary stat value
if (arg0 == 1) { statValue = (((func_80022084(statModifier) / 4) + ((baseStat + dvValue) * 2)) * level) / 100;
sp1C += arg3 + 10;
// Add final adjustments
if (statId == STAT_HP) {
statValue += level + 10;
} else { } else {
sp1C += 5; statValue += 5;
} }
if (sp1C > 999) { // Cap at 999
sp1C = 999; if (statValue > 999) {
statValue = 999;
} }
return sp1C; return statValue;
} }
void func_80022338(unk_func_80026268_arg0* arg0) { void func_80022338(unk_func_80026268_arg0* arg0) {
arg0->unk_24 = func_800226C0(arg0->unk_00.unk_00, arg0->unk_10); 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_26 = CalculateStatValue(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_28 = CalculateStatValue(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_2A = CalculateStatValue(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_2C = CalculateStatValue(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_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) { 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; s32 tmp;
for (i = 1; i < 0xFFFF; i += 2) { 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) { if (arg2 < tmp) {
break; break;
} }

View File

@ -6,6 +6,31 @@
#include "29BA0.h" #include "29BA0.h"
#include "2D340.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 { typedef struct unk_D_80070F84 {
/* 0x00 */ u8 unk_00; /* 0x00 */ u8 unk_00;
/* 0x01 */ u8 unk_01; /* 0x01 */ u8 unk_01;
@ -17,16 +42,16 @@ typedef struct unk_D_80070F84 {
/* 0x07 */ u8 unk_07; /* 0x07 */ u8 unk_07;
/* 0x08 */ u8 unk_08; /* 0x08 */ u8 unk_08;
/* 0x09 */ u8 unk_09; /* 0x09 */ u8 unk_09;
/* 0x0A */ u8 unk_0A[1]; /* 0x0A */ u8 unk_0A[4];
/* 0x0B */ char unk0B[0x4]; /* 0x0E */ char unk0E[1];
/* 0x0F */ u8 unk_0F[1]; /* 0x0F */ u8 unk_0F[1];
/* 0x10 */ char unk10[0x3]; /* 0x10 */ char unk10[0x3];
/* 0x13 */ u8 unk_13; /* 0x13 */ u8 unk_13;
/* 0x14 */ char unk14[0x3]; /* 0x14 */ char unk14[0x3];
} unk_D_80070F84; // size = 0x17 } unk_D_80070F84; // size = 0x17
extern unk_D_80070F84 D_80070F84[]; extern PokemonStats D_80070F84[];
extern unk_D_80070F84 D_80070FA0[]; extern unk_D_80070F84 D_80070FA0[]; //TODO: is this typed correctly?
typedef struct unk_D_80071D88 { typedef struct unk_D_80071D88 {
/* 0x00 */ char* type_name; /* 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); u16 func_80022084(u16 arg0);
void func_800220C4(void); void func_800220C4(void);
u16 func_800220CC(s32 arg0, u16 arg1); 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); void func_80022338(unk_func_80026268_arg0* arg0);
u16 func_8002240C(s32 arg0, s32 arg1, u16 arg2, u16 arg3, u16 arg4); u16 func_8002240C(s32 arg0, s32 arg1, u16 arg2, u16 arg3, u16 arg4);
u32 func_800224B8(s32 arg0, u16 arg1); u32 func_800224B8(s32 arg0, u16 arg1);

View File

@ -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) { if (temp_s0->unk_14 >= 0x6401) {
temp_s0->unk_14 = 0x6400; 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; *arg3 = temp_s0->unk_26;
break; 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) { if (temp_s0->unk_16 >= 0x6401) {
temp_s0->unk_16 = 0x6400; 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; *arg3 = temp_s0->unk_28;
break; 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) { if (temp_s0->unk_18 >= 0x6401) {
temp_s0->unk_18 = 0x6400; 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; *arg3 = temp_s0->unk_2A;
break; 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) { if (temp_s0->unk_1A >= 0x6401) {
temp_s0->unk_1A = 0x6400; 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; *arg3 = temp_s0->unk_2C;
break; 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) { if (temp_s0->unk_1C >= 0x6401) {
temp_s0->unk_1C = 0x6400; 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; *arg3 = temp_s0->unk_2E;
break; break;

View File

@ -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) { s32 func_88311C64(s32 arg0, s32 arg1) {
static unk_D_80070F84 D_8831757C[] = { static PokemonStats D_8831757C[] = {
{ {
0x06, 0x06,
0x4E, 0x4E,
@ -3103,7 +3103,7 @@ s32 func_88311C64(s32 arg0, s32 arg1) {
}, },
}; };
unk_D_80070F84* var_v1; PokemonStats* var_v1;
s32 i; s32 i;
var_v1 = &D_80070FA0[arg0 - 1]; var_v1 = &D_80070FA0[arg0 - 1];

View File

@ -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_v0_3;
s32 temp_v1_2; s32 temp_v1_2;
u8 var_a0; u8 var_a0;
unk_D_80070F84* temp_s4; unk_D_80070F84* temp_s4; //TODO: this is definitely typed wrong
unk_D_800FCB18* temp_s5; unk_D_800FCB18* temp_s5;
temp_s5 = &arg0->unk_654.unk_38; 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) { if (temp_s5->unk_1F[i] != 0) {
temp_s4 = &D_80070FA0[arg1]; 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])) { if ((temp_s4->unk_0A[j] != 0) && (temp_s4->unk_0A[j] == temp_s5->unk_1F[i])) {
arg0->unk_654.unk_C1[i] = 0; arg0->unk_654.unk_C1[i] = 0;
} }

View File

@ -779,7 +779,7 @@ void func_84370B7C(unk_D_84390010* arg0) {
func_84370B0C(arg0); func_84370B0C(arg0);
func_84370B44(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_38 = sp34->unk_28;
sp24->unk_3A = sp34->unk_2A; sp24->unk_3A = sp34->unk_2A;
sp24->unk_3C = sp34->unk_2C; sp24->unk_3C = sp34->unk_2C;
@ -1204,9 +1204,9 @@ s32 func_84371C18(void) {
D_843C4DA5 = 0; D_843C4DA5 = 0;
if (D_8438AC60[0] == 1) { 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 { } 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) { if (D_843C5238->unk_44.unk_02 == 0) {

View File

@ -3759,7 +3759,7 @@ void func_8437E974(unk_D_800AE540_0004* arg0, unk_D_800AE540_0004* arg1, unk_D_8
u8 i; u8 i;
u8 var_v1; u8 var_v1;
u8 sp73; u8 sp73;
unk_D_80070F84* sp6C; PokemonStats* sp6C;
unk_func_80026268_arg0* sp64[2]; unk_func_80026268_arg0* sp64[2];
unk_func_80026268_arg0* temp_s7; unk_func_80026268_arg0* temp_s7;