Pokemon related decomp (#47)

* decompile last function in pokemon_1.s

* some pokemon related decomp

* more decomp

* decomp another function

* decompile function

* another one

* decompile GetPokemonLevelData

* decompile more

* more decomp

* more structure and decomp

* decomp another function (need to do some renaming)

* rename some stuff

* I cant do anything without committing these 2 files
This commit is contained in:
Dennis 2021-07-26 06:11:01 +02:00 committed by GitHub
parent bad7f7f688
commit 645c45431b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 1291 additions and 1924 deletions

View File

@ -320,7 +320,7 @@ _08027ED8:
movs r2, 0x8
ldrsh r0, [r1, r2]
adds r1, 0x14
bl sub_808D800
bl GivePokemonItem
movs r0, 0x6
bl sub_8027184
b _08027F82
@ -371,7 +371,7 @@ _08027F52:
movs r2, 0x8
ldrsh r0, [r1, r2]
adds r1, 0x14
bl sub_808D800
bl GivePokemonItem
movs r0, 0x7
bl sub_8027184
b _08027F82

View File

@ -2062,7 +2062,7 @@ sub_803C0DC:
push {lr}
lsls r0, 16
asrs r0, 16
bl sub_808E770
bl GetBaseSpecies
lsls r0, 16
asrs r2, r0, 16
ldr r1, _0803C0F0
@ -2100,7 +2100,7 @@ sub_803C110:
cmp r0, 0
beq _0803C180
adds r0, r4, 0
bl sub_808E770
bl GetBaseSpecies
lsls r0, 16
asrs r0, 16
cmp r4, r0

View File

@ -33850,7 +33850,7 @@ _08068922:
mov r9, r0
adds r0, r2, r0
mov r1, r10
bl sub_808DE30
bl xxx_pokemonstruct_index_to_unk_808DE30
ldr r0, _08068A68
ldr r0, [r0]
ldr r1, _08068A6C
@ -34079,7 +34079,7 @@ _08068B08:
adds r0, r4, 0
adds r1, r6, 0
ldr r2, _08068B74
bl sub_808DE50
bl xxx_pokemonstruct_to_unk_808DE50
ldrh r0, [r4]
movs r1, 0x1
movs r2, 0
@ -34293,7 +34293,7 @@ _08068CDC:
movs r3, 0xA
ldrsh r0, [r4, r3]
adds r1, r4, 0
bl sub_808DF2C
bl xxx_unk_to_pokemonstruct_index_808DF2C
b _08068CFE
_08068CE8:
ldr r0, [sp, 0x220]
@ -34401,7 +34401,7 @@ _08068D6A:
adds r0, r1
str r0, [r4]
adds r1, r5, 0
bl sub_808DF44
bl xxx_unk_to_pokemonstruct_808DF44
ldr r2, [r4]
ldrh r0, [r2]
movs r3, 0x80
@ -34997,7 +34997,7 @@ _08069228:
movs r2, 0xA
ldrsh r0, [r4, r2]
adds r1, r4, 0
bl sub_808DF2C
bl xxx_unk_to_pokemonstruct_index_808DF2C
_0806926E:
bl sub_8044210
lsls r0, 24
@ -35196,7 +35196,7 @@ _080693CC:
movs r2, 0xA
ldrsh r0, [r4, r2]
adds r1, r4, 0
bl sub_808DF2C
bl xxx_unk_to_pokemonstruct_index_808DF2C
_0806940E:
bl sub_8044210
lsls r0, 24
@ -38134,7 +38134,7 @@ sub_806AA0C:
cmp r0, 0
beq _0806AA40
adds r0, r4, 0
bl sub_808E770
bl GetBaseSpecies
lsls r0, 16
movs r1, 0xCF
lsls r1, 17
@ -40078,7 +40078,7 @@ sub_806B8CC:
str r0, [r1]
_0806B906:
adds r0, r4, 0
bl sub_808E770
bl GetBaseSpecies
lsls r0, 16
asrs r1, r0, 16
movs r0, 0xCF
@ -40598,7 +40598,7 @@ _0806BD20:
_0806BD24:
movs r4, 0x2
ldrsh r0, [r6, r4]
bl sub_808E770
bl GetBaseSpecies
lsls r0, 16
movs r1, 0xCF
lsls r1, 17
@ -40613,7 +40613,7 @@ _0806BD24:
_0806BD42:
movs r2, 0x2
ldrsh r0, [r6, r2]
bl sub_808E770
bl GetBaseSpecies
lsls r0, 16
asrs r0, 16
cmp r0, 0x97

View File

@ -10,7 +10,7 @@ sub_80978C8:
push {lr}
lsls r0, 16
asrs r0, 16
bl sub_808E858
bl GetBaseSpeciesNoUnown
lsls r0, 16
asrs r3, r0, 16
ldr r0, _080978FC
@ -42,7 +42,7 @@ sub_8097900:
push {lr}
lsls r0, 16
asrs r0, 16
bl sub_808E858
bl GetBaseSpeciesNoUnown
lsls r0, 16
asrs r3, r0, 16
ldr r0, _08097938

View File

@ -512,7 +512,7 @@ _0802782C:
movs r2, 0x8
ldrsh r0, [r1, r2]
adds r1, 0x14
bl sub_808D7DC
bl PeekPokemonItem
movs r0, 0x3
bl sub_8027184
b _080278AE
@ -538,7 +538,7 @@ _08027868:
movs r2, 0x8
ldrsh r0, [r1, r2]
adds r1, 0x14
bl sub_808D7DC
bl PeekPokemonItem
movs r0, 0x4
bl sub_8027184
b _080278AE
@ -707,7 +707,7 @@ _080279F0:
movs r2, 0x8
ldrsh r0, [r1, r2]
adds r1, 0x14
bl sub_808D800
bl GivePokemonItem
bl nullsub_104
_08027A0E:
movs r0, 0x2

View File

@ -3722,7 +3722,7 @@ _08020BD0:
ldr r0, [r0, 0x10]
movs r1, 0x8
ldrsh r0, [r0, r1]
bl sub_808E858
bl GetBaseSpeciesNoUnown
lsls r0, 16
movs r1, 0xCF
lsls r1, 17
@ -5591,7 +5591,7 @@ _08021A8E:
cmp r1, r0
bne _08021AC4
adds r0, r5, 0
bl sub_808E858
bl GetBaseSpeciesNoUnown
lsls r0, 16
asrs r0, 16
cmp r5, r0
@ -5686,7 +5686,7 @@ sub_8021B58:
push {r4,r5,lr}
lsls r0, 16
asrs r0, 16
bl sub_808E858
bl GetBaseSpeciesNoUnown
lsls r0, 16
asrs r4, r0, 16
movs r2, 0
@ -9086,7 +9086,7 @@ _080236B0:
cmp r0, 0
beq _080236E2
adds r0, r4, 0
bl sub_808E858
bl GetBaseSpeciesNoUnown
lsls r0, 16
asrs r0, 16
cmp r4, r0
@ -10802,7 +10802,7 @@ _080243A8:
ldrsh r0, [r5, r1]
movs r2, 0
ldrsh r1, [r4, r2]
bl sub_808D864
bl ComparePokemonNames
lsls r0, 24
cmp r0, 0
beq _080243C6
@ -11170,7 +11170,7 @@ sub_802465C:
bl sub_808D33C
ldr r1, [r5]
str r0, [r1, 0xC]
bl sub_808D824
bl IsPokemonRenamed
ldr r1, [r5]
strb r0, [r1, 0x10]
ldr r0, [r5]
@ -12590,7 +12590,7 @@ sub_8025204:
ldr r4, _0802522C
ldr r0, [r4]
ldr r0, [r0, 0xC]
bl sub_808D824
bl IsPokemonRenamed
ldr r1, [r4]
strb r0, [r1, 0x10]
movs r0, 0x3
@ -13351,7 +13351,7 @@ _08025810:
cmp r1, r0
bne _08025840
adds r0, r7, 0
bl sub_808D824
bl IsPokemonRenamed
lsls r0, 24
cmp r0, 0
beq _08025840
@ -13620,7 +13620,7 @@ _08025A0C:
movs r2, 0xE
ldrsh r0, [r1, r2]
adds r1, 0x18
bl sub_808D7DC
bl PeekPokemonItem
movs r0, 0x3
bl sub_8025434
b _08025A7E
@ -13643,7 +13643,7 @@ _08025A40:
movs r2, 0xE
ldrsh r0, [r1, r2]
adds r1, 0x18
bl sub_808D7DC
bl PeekPokemonItem
movs r0, 0x4
bl sub_8025434
b _08025A7E
@ -13751,7 +13751,7 @@ _08025B40:
movs r2, 0xE
ldrsh r0, [r1, r2]
adds r1, 0x18
bl sub_808D800
bl GivePokemonItem
bl nullsub_104
movs r0, 0xA
bl sub_8025434
@ -13990,7 +13990,7 @@ _08025D24:
movs r2, 0xE
ldrsh r0, [r1, r2]
adds r1, 0x14
bl sub_808D800
bl GivePokemonItem
bl sub_801A928
bl nullsub_104
adds r0, r6, 0
@ -14930,7 +14930,7 @@ sub_80264CC:
movs r3, 0xA
ldrsh r0, [r1, r3]
adds r1, 0x14
bl sub_808D7DC
bl PeekPokemonItem
mov r1, r8
ldrh r0, [r1]
lsrs r0, 1
@ -15577,7 +15577,7 @@ _08026A28:
movs r2, 0xA
ldrsh r0, [r1, r2]
adds r1, 0x14
bl sub_808D800
bl GivePokemonItem
bl nullsub_104
movs r0, 0x11
bl sub_8026074
@ -15893,7 +15893,7 @@ _08026C84:
movs r2, 0xA
ldrsh r0, [r1, r2]
adds r1, 0x10
bl sub_808D800
bl GivePokemonItem
bl sub_801A928
bl nullsub_104
adds r0, r6, 0
@ -16306,7 +16306,7 @@ _08026FC4:
movs r2, 0xA
ldrsh r0, [r1, r2]
adds r1, 0x14
bl sub_808D800
bl GivePokemonItem
movs r0, 0xA
bl sub_8026074
b _0802706E
@ -16357,7 +16357,7 @@ _0802703E:
movs r2, 0xA
ldrsh r0, [r1, r2]
adds r1, 0x14
bl sub_808D800
bl GivePokemonItem
movs r0, 0xB
bl sub_8026074
b _0802706E

View File

@ -1316,133 +1316,4 @@ _0808D7CE:
bx r1
thumb_func_end sub_808D750
thumb_func_start sub_808D7DC
sub_808D7DC:
lsls r0, 16
asrs r0, 16
ldr r3, _0808D7FC
movs r2, 0x58
muls r2, r0
ldr r0, [r3]
adds r0, r2
adds r2, r0, 0
adds r2, 0x28
ldrb r2, [r2]
strb r2, [r1]
adds r0, 0x29
ldrb r0, [r0]
strb r0, [r1, 0x1]
bx lr
.align 2, 0
_0808D7FC: .4byte gRecruitedPokemonRef
thumb_func_end sub_808D7DC
thumb_func_start sub_808D800
sub_808D800:
lsls r0, 16
asrs r0, 16
ldr r3, _0808D820
movs r2, 0x58
muls r2, r0
ldr r0, [r3]
adds r0, r2
ldrb r3, [r1]
adds r2, r0, 0
adds r2, 0x28
strb r3, [r2]
ldrb r1, [r1, 0x1]
adds r0, 0x29
strb r1, [r0]
bx lr
.align 2, 0
_0808D820: .4byte gRecruitedPokemonRef
thumb_func_end sub_808D800
thumb_func_start sub_808D824
sub_808D824:
push {r4,lr}
sub sp, 0x14
adds r4, r0, 0
movs r1, 0x8
ldrsh r0, [r4, r1]
bl GetMonSpecies
adds r1, r0, 0
mov r0, sp
bl CopyStringtoBuffer
movs r2, 0
adds r4, 0x4C
_0808D83E:
adds r0, r4, r2
mov r3, sp
adds r1, r3, r2
ldrb r0, [r0]
ldrb r1, [r1]
cmp r0, r1
beq _0808D850
movs r0, 0
b _0808D85C
_0808D850:
cmp r0, 0
beq _0808D85A
adds r2, 0x1
cmp r2, 0x9
ble _0808D83E
_0808D85A:
movs r0, 0x1
_0808D85C:
add sp, 0x14
pop {r4}
pop {r1}
bx r1
thumb_func_end sub_808D824
thumb_func_start sub_808D864
sub_808D864:
push {r4-r7,lr}
lsls r0, 16
asrs r0, 16
lsls r1, 16
asrs r1, 16
ldr r2, _0808D8A0
movs r3, 0x58
muls r0, r3
ldr r2, [r2]
adds r0, r2, r0
adds r6, r0, 0
adds r6, 0x4C
adds r0, r1, 0
muls r0, r3
adds r2, r0
adds r5, r2, 0
adds r5, 0x4C
movs r7, 0
_0808D888:
ldrb r0, [r6]
bl ReturnIntFromChar
adds r4, r0, 0
ldrb r0, [r5]
bl ReturnIntFromChar
cmp r4, r0
ble _0808D8A4
movs r0, 0x1
b _0808D8B4
.align 2, 0
_0808D8A0: .4byte gRecruitedPokemonRef
_0808D8A4:
cmp r4, r0
blt _0808D8B2
adds r6, 0x1
adds r5, 0x1
adds r7, 0x1
cmp r7, 0x9
ble _0808D888
_0808D8B2:
movs r0, 0
_0808D8B4:
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end sub_808D864
.align 2,0

View File

@ -1,72 +0,0 @@
.include "constants/gba_constants.inc"
.include "asm/macros.inc"
.syntax unified
.text
thumb_func_start sub_808DA44
sub_808DA44:
push {r4-r6,lr}
sub sp, 0x30
lsls r0, 16
asrs r4, r0, 16
lsls r1, 24
lsrs r2, r1, 24
cmp r2, 0xC
bls _0808DAA0
mov r1, sp
ldr r0, _0808DA98
ldm r0!, {r3,r5,r6}
stm r1!, {r3,r5,r6}
ldm r0!, {r3,r5,r6}
stm r1!, {r3,r5,r6}
ldm r0!, {r3,r5,r6}
stm r1!, {r3,r5,r6}
ldm r0!, {r3,r5,r6}
stm r1!, {r3,r5,r6}
mov r0, sp
movs r1, 0
ldrsh r0, [r0, r1]
cmp r0, 0
beq _0808DA92
mov r1, sp
add r3, sp, 0x48
_0808DA76:
movs r5, 0
ldrsh r0, [r1, r5]
cmp r0, r4
bne _0808DA84
ldr r0, [r1, 0x4]
cmp r0, r2
beq _0808DA9C
_0808DA84:
adds r1, 0x8
cmp r1, r3
bgt _0808DA92
movs r6, 0
ldrsh r0, [r1, r6]
cmp r0, 0
bne _0808DA76
_0808DA92:
movs r0, 0
b _0808DAA6
.align 2, 0
_0808DA98: .4byte gUnknown_8107654
_0808DA9C:
movs r0, 0x1
b _0808DAA6
_0808DAA0:
ldr r0, _0808DAB0
adds r0, r2, r0
ldrb r0, [r0]
_0808DAA6:
add sp, 0x30
pop {r4-r6}
pop {r1}
bx r1
.align 2, 0
_0808DAB0: .4byte gUnknown_8107645
thumb_func_end sub_808DA44
.align 2,0

File diff suppressed because it is too large Load Diff

View File

@ -5,71 +5,6 @@
.text
thumb_func_start sub_808ED00
sub_808ED00:
push {r4-r7,lr}
mov r7, r8
push {r7}
sub sp, 0x10
mov r0, sp
bl sub_808D580
adds r6, r0, 0
movs r4, 0
cmp r4, r6
bge _0808ED44
movs r0, 0x58
mov r8, r0
mov r7, sp
movs r5, 0
adds r4, r6, 0
_0808ED20:
ldr r0, _0808ED70
ldr r1, [r0]
adds r0, r1, r5
ldr r2, _0808ED74
adds r0, r2
ldm r7!, {r2}
mov r3, r8
muls r3, r2
adds r2, r3, 0
adds r1, r2
movs r2, 0x58
bl memcpy
adds r5, 0x58
subs r4, 0x1
cmp r4, 0
bne _0808ED20
adds r4, r6, 0
_0808ED44:
cmp r4, 0x3
bgt _0808ED64
ldr r5, _0808ED70
ldr r3, _0808ED74
movs r2, 0
movs r0, 0x58
adds r1, r4, 0
muls r1, r0
_0808ED54:
ldr r0, [r5]
adds r0, r1
adds r0, r3
strh r2, [r0]
adds r1, 0x58
adds r4, 0x1
cmp r4, 0x3
ble _0808ED54
_0808ED64:
add sp, 0x10
pop {r3}
mov r8, r3
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_0808ED70: .4byte gRecruitedPokemonRef
_0808ED74: .4byte 0x00008f88
thumb_func_end sub_808ED00
thumb_func_start SaveRecruitedPokemon
SaveRecruitedPokemon:
push {r4-r7,lr}

View File

@ -36,6 +36,7 @@ struct OpenedFile *OpenFile(const char *filename, const struct FileArchive *arc)
u8 *GetFileDataPtr(struct OpenedFile *openedFile, int unused);
struct OpenedFile *OpenFileAndGetFileDataPtr(const char *filename, const struct FileArchive *arc);
struct OpenedFile *Call_OpenFileAndGetFileDataPtr(const char *filename, const struct FileArchive *arc);
u32 DecompressATFile(char *result, s32 resultLength, struct OpenedFile *file);
void CloseFile(struct OpenedFile *openedFile);
#endif //GUARD_FILE_SYSTEM_H

View File

@ -362,6 +362,7 @@ bool8 xxx_insert_unk230_80919FC(u8);
u32 xxx_count_non_empty_inv_unk250_8091A48();
void sub_8091BB4(u8);
void sub_8090F58(void*, u8 *, struct ItemSlot *, struct unkStruct_8090F58*);
void SlotToHeldItem(struct HeldItem *held,struct ItemSlot *slot);
// some sort of weird memcpy's?
// not sure what the second argument should be typed as

View File

@ -5,34 +5,58 @@
#include "item.h"
#define OFFENSE_NRM 0
#define OFFENSE_SP 1
struct Offense {
/* 0x18: att */
/* 0x19: spatt */
/* 0x1a: def */
/* 0x1b: spdef */
u8 att[2];
u8 def[2];
};
struct unkPokeSubStruct_4 {
u8 unk4;
u8 unk5;
u16 fill6;
};
struct unkPokeSubStruct_2C
{
u8 unk0;
u8 fill1;
u16 unk2;
u32 fill4;
};
struct unkPokeSubStruct_C
{
u8 unk0;
u8 fill1[3];
};
struct PokemonStruct
{
// size: 0x58
u16 unk0; // recruited??
u8 unk2;
u8 unk3;
u8 unk4;
u8 unk5;
u8 fill6[0x8 - 0x6];
u8 unkHasNextStage; // set to a random value?
struct unkPokeSubStruct_4 unk4;
/* 0x8 */ s16 speciesNum; // species #
u8 fillA[0xC - 0xA];
u8 unkC;
u8 fillD[0x10 - 0xD];
u8 unk10;
u8 fill11[0x14 - 0x11];
struct unkPokeSubStruct_C unkC[2];
/* 0x14 */ s16 IQ;
/* 0x16 */ u16 pokeHP; // HP
/* 0x18 */ u8 pokeAtt; // attack
/* 0x19 */ u8 pokeSPAtt; // sp attack
/* 0x1A */ u8 pokeDef; // def
/* 0x1B */ u8 pokeSPDef; // spdef
/* 0x18 */ struct Offense offense;
u32 unk1C;
u8 unk20[4];
u32 unk20;
u8 unk24;
u8 fill25[3];
struct HeldItem heldItem;
u8 unk2C[4];
u8 fill30[0x4C - 0x30];
struct unkPokeSubStruct_2C unk2C[4];
/* 0x4C */ u8 name[0xA];
};
@ -43,22 +67,11 @@ struct PokemonStruct2
u8 fill[0x62];
};
struct PokemonStruct3
{
// size: 0x58
u16 unk0;
u16 unk2;
u16 unk4;
u16 unk6;
u16 unk8;
u8 fill[0x4E];
};
struct unkStruct_203B45C
{
/* 0x0 */ struct PokemonStruct pokemon[NUM_SPECIES];
/* 0x8DF8 */ struct PokemonStruct2 pokemon2[4];
/* 0x8F88 */ struct PokemonStruct3 pokemon3[4];
/* 0x8F88 */ struct PokemonStruct team[4];
};
struct EvolveStruct1
@ -117,6 +130,64 @@ struct gPokemon
/* 0x42 */ s16 alphabetParent[2]; // alphabetNo and parentNo
};
struct unkStruct_808E6F4
{
s16 unk0;
u8 unk2;
};
struct EvolveStage
{
s16 speciesNum;
u8 unkHasNextStage;
};
struct unkStruct_808DE50
{
u16 unk0; // corresponds to unk0 inPokemonStruct
u8 unk2; // unk2
u8 unkHasNextStage; // unk3
struct unkPokeSubStruct_4 unk4; // unk4
u16 IQ; // IQ (other offset)
u16 unkA;
u16 unkC;
s16 speciesNum; // speciesNum (other offset)
u16 unk10; // pokeHP
u16 unk12; // pokeHP
struct Offense offense; // offense (other offset)
u32 unk18; // unk1C
struct unkPokeSubStruct_2C unk1C[4]; // unk2C
u8 fill3c[4];
/* 40 */ struct ItemSlot itemSlot; // heldItem
u32 unk44; // some struct
u32 unk48; // some struct (same type as 44)
u32 unk4C; // unk20
u8 unk50; // unk24
u8 fill51[3];
struct unkStruct_808E6F4 unk54;
u8 name[10]; // name (other offset)
};
struct LevelData
{
// only size is known
u32 unk0[3];
};
struct unkStruct_808E218_arg
{
u16 unk0[NUM_SPECIES];
u32 count;
};
struct unkStruct_808E218
{
// leveldata? (same size)
struct unkStruct_808E6F4 unk0[3];
};
void LoadMonsterParameters(void);
struct unkStruct_203B45C *GetRecruitedPokemon(void);
void InitializeRecruitedPokemon(void);
@ -157,5 +228,8 @@ bool8 IsPokemonDialogueSpriteAvail(s16 index, s32 r1);
struct OpenedFile *OpenPokemonDialogueSpriteFile(s16 index);
struct OpenedFile *GetDialogueSpriteDataPtr(s16 index);
s32 GetUnownIndex(s16 index);
void sub_808E6F4(struct unkStruct_808E6F4* a1);
s32 GetEvolutionSequence(struct PokemonStruct* pokemon, struct EvolveStage* a2);
void xxx_pokemonstruct_to_unk_808DE50(struct unkStruct_808DE50* r0, struct PokemonStruct *r1, s32 r2);
#endif // GUARD_POKEMON_H

View File

@ -189,8 +189,6 @@ SECTIONS {
src/pokemon.o(.text);
asm/pokemon.o(.text);
src/pokemon_mid.o(.text);
asm/pokemon_1.o(.text);
src/pokemon_1.o(.text);
asm/pokemon_2.o(.text);
src/pokemon_3.o(.text);
asm/pokemon_3.o(.text);

View File

@ -32,7 +32,7 @@ struct unkStruct_203B490
extern bool8 sub_809095C(u8);
extern s32 sub_8090298(u8);
extern bool8 sub_809017C(u8 *);
extern s16 sub_808E770(s16);
extern s16 GetBaseSpecies(s16);
extern bool8 sub_8092040(u8);
extern u8 sub_803C1D0(u8 *, u8);
extern bool8 IsNotMoneyOrUsedTMItem(u8);
@ -127,14 +127,14 @@ bool8 ValidateWonderMail(struct WonderMail *data)
return FALSE;
if(data->clientPoke > SPECIES_RAYQUAZA_CUTSCENE)
return FALSE;
if(data->clientPoke != sub_808E770(data->clientPoke))
if(data->clientPoke != GetBaseSpecies(data->clientPoke))
return FALSE;
if(sub_803C0DC(data->clientPoke) == 0)
return FALSE;
if(data->targetPoke > SPECIES_RAYQUAZA_CUTSCENE)
return FALSE;
if(data->targetPoke != sub_808E770(data->targetPoke))
if(data->targetPoke != GetBaseSpecies(data->targetPoke))
return FALSE;
if(sub_803C0DC(data->targetPoke) == 0)
return FALSE;

View File

@ -56,7 +56,7 @@ void sub_803AFE8(void)
default:
break;
case 3:
gUnknown_203B3F8->pokemon->unk3 = gUnknown_203B3F8->unk60;
gUnknown_203B3F8->pokemon->unkHasNextStage = gUnknown_203B3F8->unk60;
// Fallthrough is needed to match
case 2:
sub_803ACD0(2);

View File

@ -155,7 +155,7 @@ void sub_803AD88(void)
gUnknown_203B3F8->unk70 = 3;
gUnknown_203B3F8->unk68 = 1;
gUnknown_203B3F8->unk6C = 0x64;
gUnknown_203B3F8->unk64 = gUnknown_203B3F8->pokemon->unk3;
gUnknown_203B3F8->unk64 = gUnknown_203B3F8->pokemon->unkHasNextStage;
gUnknown_203B3F8->unk74 = 3;
gUnknown_203B3F8->unk78 = &gUnknown_203B3F8->unkE0[3];
gUnknown_203B3F8->unk7C = 0x2C;

View File

@ -24,7 +24,7 @@ extern void nullsub_104();
extern void sub_8091274(u8 *);
extern void sub_801A928();
extern void sub_8099690(u32);
extern void sub_808D800(s16, struct HeldItem *);
extern void GivePokemonItem(s16, struct HeldItem *);
extern u32 sub_801A8AC();
extern u32 sub_801A6E8(u32);
@ -96,7 +96,7 @@ void sub_8027BD8(void)
if (gUnknown_203B2BC->unk14 != 0) {
sub_8091274(&gUnknown_203B2BC->unk14);
}
sub_808D800(gUnknown_203B2BC->unk8,&gUnknown_203B2BC->unk10);
GivePokemonItem(gUnknown_203B2BC->unk8,&gUnknown_203B2BC->unk10);
sub_801A928();
nullsub_104();
sub_8027184(2);

View File

@ -879,8 +879,8 @@ void GetGummiItemStatBoost(struct PokemonStruct* pokemon, u8 itemIndex, u8 a3, s
a4->unk2 = boost_flags;
boost_flags = a4->unk2;
if (a4->unk2 & 1) {
if (pokemon->pokeAtt < 255) {
pokemon->pokeAtt++;
if (pokemon->offense.att[OFFENSE_NRM] < 255) {
pokemon->offense.att[OFFENSE_NRM]++;
}
else {
// fix operand order
@ -890,24 +890,24 @@ void GetGummiItemStatBoost(struct PokemonStruct* pokemon, u8 itemIndex, u8 a3, s
}
}
if (a4->unk2 & 2) {
if (pokemon->pokeSPAtt < 255) {
pokemon->pokeSPAtt++;
if (pokemon->offense.att[OFFENSE_SP] < 255) {
pokemon->offense.att[OFFENSE_SP]++;
}
else {
a4->unk2 &= ~2;
}
}
if (a4->unk2 & 4) {
if (pokemon->pokeDef < 255) {
pokemon->pokeDef++;
if (pokemon->offense.def[OFFENSE_NRM] < 255) {
pokemon->offense.def[OFFENSE_NRM]++;
}
else {
a4->unk2 &= ~4;
}
}
if (a4->unk2 & 8) {
if (pokemon->pokeSPDef < 255) {
pokemon->pokeSPDef++;
if (pokemon->offense.def[OFFENSE_SP] < 255) {
pokemon->offense.def[OFFENSE_SP] ++;
}
else {
a4->unk2 &= ~8;

View File

@ -2,6 +2,7 @@
#include "pokemon.h"
#include "file_system.h"
extern struct FileArchive gSystemFileArchive;
extern const char gUnknown_81075F4;
EWRAM_DATA struct gPokemon *gMonsterParameters;
@ -10,6 +11,7 @@ EWRAM_DATA struct unkStruct_203B45C gRecruitedPokemon;
extern struct unkStruct_203B45C *gRecruitedPokemonRef;
EWRAM_DATA u16 gLevelCurrentPokeId;
void LoadMonsterParameters(void)
{
gRecruitedPokemonRef = &gRecruitedPokemon;
@ -39,7 +41,7 @@ void InitializeRecruitedPokemon(void)
for(iVar3 = 0; iVar3 < 4; iVar3++)
{
gRecruitedPokemonRef->pokemon3[iVar3].unk8 = 0;
gRecruitedPokemonRef->pokemon3[iVar3].unk0 = 0;
gRecruitedPokemonRef->team[iVar3].speciesNum = 0;
gRecruitedPokemonRef->team[iVar3].unk0 = 0;
}
}

View File

@ -1,200 +0,0 @@
#include "global.h"
#include "pokemon.h"
#include "file_system.h"
extern int sprintf(char *, const char *, ...);
extern struct gPokemon *gMonsterParameters;
extern struct FileArchive gMonsterFileArchive;
extern const char gUnknown_8107684[];
extern struct unkStruct_203B45C *gRecruitedPokemonRef;
extern void sub_808DE50(void* r0, struct PokemonStruct *r1, u32 r2, u32 r3);
u8 *GetCategoryString(s16 index)
{
return gMonsterParameters[index].category;
}
u8 GetPokemonSize(s16 index)
{
return gMonsterParameters[index].size;
}
u8 GetShadowSize(s16 index)
{
return gMonsterParameters[index].shadow_size;
}
s32 GetMoveSpeed(s16 index)
{
return gMonsterParameters[index].move_speed;
}
u8 GetWalkableTiles(s16 index)
{
return gMonsterParameters[index].walkable_tiles;
}
u8 GetUnk1B(s16 index)
{
return ((u8)(gMonsterParameters[index].unk1B) << 25) >> 24;
}
bool8 GetIsMoving(s16 index)
{
return gMonsterParameters[index].isMoving;
}
u8 GetUnk1D(s16 index)
{
return gMonsterParameters[index].unk1D;
}
u16 GetLowKickDmg(s16 index)
{
return gMonsterParameters[index].lowkick_dmg;
}
u16 GetSizeOrbDmg(s16 index)
{
return gMonsterParameters[index].sizeorb_dmg;
}
u8 GetFriendArea(s16 index)
{
return gMonsterParameters[index].friend_area;
}
u16 GetBaseHP(s16 index)
{
return gMonsterParameters[index].base_hp;
}
bool8 GetUnk33(s16 index)
{
return gMonsterParameters[index].unk33;
}
u8 GetUnk12(s16 index)
{
return gMonsterParameters[index].unk12;
}
s16 GetPokemonEvolveFrom(s16 index)
{
return gMonsterParameters[index].pre.evolve_from;
}
u16 GetPokemonAttSpatt(s16 index, u32 r1)
{
return gMonsterParameters[index].base_att_spatt[r1];
}
u16 GetPokemonDefSpdef(s16 index, u32 r1)
{
return gMonsterParameters[index].base_def_spdef[r1];
}
u8 GetPokemonType(s32 index, u32 typeIndex)
{
s16 newIndex = index;
return gMonsterParameters[newIndex].types[typeIndex];
}
u8 GetPokemonAbility(s16 index, u32 abilityIndex)
{
return gMonsterParameters[index].abilities[abilityIndex];
}
s16 GetDexInternalNo(s16 index, u32 r1)
{
return gMonsterParameters[index].dexInternal[r1];
}
s16 GetBaseRecruit(s16 index)
{
return gMonsterParameters[index].base_recruit;
}
s16 GetAlphabetParentNo(s16 index, s32 r1)
{
return gMonsterParameters[index].alphabetParent[r1];
}
s16 GetInternalNo(s16 index)
{
return gMonsterParameters[index].dexInternal[1];
}
s32 CalculateEXPGain(s16 index, s32 level)
{
s32 baseEXP = gMonsterParameters[index].base_exp;
return baseEXP + (baseEXP * (level - 1)) / 10;
}
s16 GetPokemonEvolveConditions(s16 index, struct unkEvolve *r1)
{
struct EvolveStruct1 temp2;
struct EvolveNeeds temp1;
temp1 = gMonsterParameters[index].need;
temp2 = gMonsterParameters[index].pre;
r1->conditions = temp2;
r1->needs = temp1;
// The return value is not used anywhere, but necessary for the function to match.
return index;
}
u8 GetPokemonOverworldPalette(s16 index, u32 r1)
{
// Had to have this cast to match
u32 temp;
temp = index;
if (r1 != 0)
{
return 10;
}
else
{
return gMonsterParameters[temp].overworld_palette;
}
}
struct OpenedFile *OpenPokemonDialogueSpriteFile(s16 index)
{
// Looks like this loads the dialogue sprite for the pokemon
char buffer[0xC];
if(gMonsterParameters[index].dialogue_sprites == 0)
{
return NULL;
}
sprintf(buffer, gUnknown_8107684, index); // "kao%03d"
return OpenFile(buffer, &gMonsterFileArchive);
}
struct OpenedFile *GetDialogueSpriteDataPtr(s16 index)
{
// Looks like this loads the dialogue sprite for the pokemon
char buffer[0xC];
if(gMonsterParameters[index].dialogue_sprites == 0)
{
return NULL;
}
sprintf(buffer, gUnknown_8107684, index); // "kao%03d"
return OpenFileAndGetFileDataPtr(buffer, &gMonsterFileArchive);
}
bool8 IsPokemonDialogueSpriteAvail(s16 index, s32 r1)
{
// checking to see if dialogue sprite is available??
return (gMonsterParameters[index].dialogue_sprites >> r1) & 1;
}
void sub_808DE30(void* r0, u32 r1)
{
sub_808DE50(r0, &gRecruitedPokemonRef->pokemon[r1], r1, r1 * sizeof(struct PokemonStruct));
}

View File

@ -1,5 +1,6 @@
#include "global.h"
#include "pokemon.h"
#include "random.h"
extern u32 gIQSkillNames[];
extern u32 gIQSkillDescriptions[];
@ -10,6 +11,7 @@ extern u8 gUnknown_810A36B[];
extern s16 gUnknown_810A378[];
extern s32 gUnknown_810A390[];
extern u32 gUnknown_81076E4[];
extern struct unkStruct_203B45C *gRecruitedPokemonRef;
struct unkStruct_808E9EC
{
@ -22,15 +24,185 @@ struct unkStruct_808E9EC
u8 unk12;
u8 unk13;
};
extern u32 gUnknown_81076C4[];
struct unkStruct_202F3E8
{
u16 unk0;
u16 unk2;
u16 unk4;
u16 unk6;
};
extern struct unkStruct_202F3E8 gUnknown_202F3E8[];
extern s16 gUnknown_810AC60; // 0xC
extern s16 gUnknown_810AC62; // 0xC
extern s16 gUnknown_810AC68; // 0x8
extern s16 gUnknown_810AC64; // 0x8
extern s16 gUnknown_810AC66; // 0x8
// 2, 4, 6, 7, 8, 9, 0xA, 0xD, 0xF, 0x11
extern s32 gUnknown_810AC90[10];
extern bool8 sub_808ECD0(u8 *, u32);
extern void sub_808EC30(u8 *, u32);
extern void AddSprite(u16 *, u32, u32, u32);
bool8 sub_808E668(s16 a1, s16* a2, s16* a3)
{
u32 shifted = a1 << 16;
if (((shifted - 0x320000) >> 16) > 1) {
u8 shadow_size = GetShadowSize(a1);
u32 unk2, unk6;
struct unkStruct_202F3E8* arg0;
unk2 = a2[0] + a3[8];
unk6 = a2[1] + a3[9];
unk2 += gUnknown_81076C4[shadow_size];
unk6 -= 4;
unk2 &= 0x1ff;
arg0 = &gUnknown_202F3E8[shadow_size];
arg0->unk2 = (arg0->unk2 & 0xfe00) | unk2;
unk6 &= 0xfff;
unk6 <<= 4;
arg0->unk6 = (arg0->unk6 & 0xf) | unk6;
AddSprite((u16*)arg0, 0, 0, 0);
}
return 1;
}
void sub_808E6F4(struct unkStruct_808E6F4* a1)
{
s32 i;
a1->unk0 = gUnknown_810AC90[RandomCapped(10)];
for (i = 0; i < 100; i++) {
a1->unk2 = RandomCapped(18);
if ( a1->unk2 )
break;
}
if ( i == 100 )
a1->unk2 = 2;
}
bool8 HasRecruitedMon(s16 species_) {
s32 species = species_;
s32 i = 0;
struct PokemonStruct *pokemon = gRecruitedPokemonRef->pokemon;
for (i = 0; i < 413; i++) {
if (((u8)pokemon->unk0 & 1)) {
if(pokemon->speciesNum == species)
return TRUE;
}
pokemon++;
}
return FALSE;
}
s32 GetBaseSpecies(s16 index) {
if (index == SPECIES_CASTFORM_SNOWY)
return SPECIES_CASTFORM;
if (index == SPECIES_CASTFORM_SUNNY)
return SPECIES_CASTFORM;
if (index == SPECIES_CASTFORM_RAINY)
return SPECIES_CASTFORM;
if(index == SPECIES_UNOWN_B)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_C)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_D)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_E)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_F)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_G)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_H)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_I)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_J)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_K)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_L)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_M)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_N)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_O)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_P)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_Q)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_R)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_S)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_T)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_U)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_V)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_W)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_X)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_Y)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_Z)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_EMARK)
return SPECIES_UNOWN;
if(index == SPECIES_UNOWN_QMARK)
return SPECIES_UNOWN;
if (index == SPECIES_DEOXYS_ATTACK)
return SPECIES_DEOXYS_NORMAL;
if (index == SPECIES_DEOXYS_DEFENSE)
return SPECIES_DEOXYS_NORMAL;
if (index == SPECIES_DEOXYS_SPEED)
return SPECIES_DEOXYS_NORMAL;
if (index == SPECIES_RAYQUAZA_CUTSCENE)
return SPECIES_RAYQUAZA;
return index;
}
s32 GetBaseSpeciesNoUnown(s16 index) {
register s32 a1_ asm("r2") = index;
if (index == SPECIES_CASTFORM_SNOWY) {
return SPECIES_CASTFORM;
}
if (index == SPECIES_CASTFORM_SUNNY) {
return SPECIES_CASTFORM;
}
if (index == SPECIES_CASTFORM_RAINY) {
return SPECIES_CASTFORM;
}
if (index == SPECIES_DEOXYS_ATTACK) {
return SPECIES_DEOXYS_NORMAL;
}
if (index == SPECIES_DEOXYS_DEFENSE) {
return SPECIES_DEOXYS_NORMAL;
}
if (index == SPECIES_DEOXYS_SPEED) {
return SPECIES_DEOXYS_NORMAL;
}
// these last 2 use r2 instead of just r0
if (a1_ == SPECIES_RAYQUAZA_CUTSCENE) {
return SPECIES_RAYQUAZA;
}
return a1_;
}
s32 GetUnownIndex(s16 index)
{
@ -452,3 +624,20 @@ u32 sub_808ECFC(void)
{
return 0;
}
extern s32 sub_808D580(s32*);
void sub_808ED00() {
s32 team[4];
s32 i;
s32 length = sub_808D580(team);
for (i = 0; i < length; i++) {
gRecruitedPokemonRef->team[i] = gRecruitedPokemonRef->pokemon[team[i]];
}
for (; i < 4; i++) {
gRecruitedPokemonRef->team[i].unk0 = 0;
}
}

View File

@ -1,5 +1,7 @@
#include "global.h"
#include "pokemon.h"
#include "item.h"
#include "file_system.h"
extern struct gPokemon *gMonsterParameters;
extern const char gUnknown_8107600[];
@ -8,12 +10,124 @@ extern const char gUnownLetters[];
extern const char gUnknown_8107630[];
extern const char gUnknown_8107638[];
extern const char gUnknown_810763C[];
extern const char gUnknown_810768C[]; // lvmp%03d\0
extern struct FileArchive gSystemFileArchive;
extern s16 gUnknown_810ACB8; // 0x14d
extern s16 gUnknown_810ACBA; // 0x14d
extern s16 gUnknown_810ACBC; // 0x14d
extern s16 gUnknown_810ACBE; // 0x14d
// wram data:
extern u16 gLevelCurrentPokeId;
extern struct LevelData gLevelCurrentData[];
extern void ExpandPlaceholdersBuffer(u8 *buffer, const char *r2, ...);
extern s16 sub_808E770(u32);
extern s16 GetBaseSpecies(u32);
extern void sub_80922B4(u8 *, u8 *, s32);
extern int sprintf(char *, const char *, ...);
extern u32 ReturnIntFromChar(u8 r0);
extern void CopyStringtoBuffer(char *r0, char *r1);
extern void sub_8093F50(void*, void*);
extern void sub_80943A0(void*, s32);
extern void xxx_unk_to_pokemonstruct_808DF44(struct PokemonStruct*, struct unkStruct_808DE50*);
extern u8* sub_8092B18(s16);
extern u8* sub_808E07C(u8* a1, u16* a2);
extern u8* sub_8092B54(s32);
extern void ExpandPlaceholdersBuffer(u8 *buffer, const char *r2, ...);
struct unkStruct_8107654 {
s16 unk0;
s16 fill2;
s32 unk4;
};
extern u8 gUnknown_8107645[12];
extern struct unkStruct_8107654 gUnknown_8107654[6];
extern struct gPokemon *gMonsterParameters;
extern struct FileArchive gMonsterFileArchive;
extern const char gUnknown_8107684[];
extern struct unkStruct_203B45C *gRecruitedPokemonRef;
// bool8 sub_808D750(s16 index_) {
// s32 i;
// register s32 index asm("r8") = index_;
// s32 count = 0;
// s32 size_count = 0;
// for (i = 0; i < 413; i++) {
// register struct PokemonStruct* pokemon = &i[gRecruitedPokemonRef->pokemon];
// register u16 unk0 = pokemon->unk0;
// if ((unk0 & 1) && ((pokemon->unk0 >> 1) & 1)) {
// size_count += GetPokemonSize(pokemon->speciesNum);
// count++;
// }
// }
// if (count < 4) {
// struct PokemonStruct* pokemon;
// pokemon = &gRecruitedPokemonRef->pokemon[index];
// size_count += GetPokemonSize(pokemon->speciesNum);
// if (size_count < 7) {
// return TRUE;
// }
// }
// return FALSE;
// }
void PeekPokemonItem(s16 index_, struct HeldItem* item) {
s32 index = index_;
struct PokemonStruct* pokemon = &gRecruitedPokemonRef->pokemon[index];
item->itemIndex = pokemon->heldItem.itemIndex;
item->numItems = pokemon->heldItem.numItems;
}
void GivePokemonItem(s16 index_, struct HeldItem* item) {
s32 index = index_;
struct PokemonStruct* pokemon = &gRecruitedPokemonRef->pokemon[index];
pokemon->heldItem.itemIndex = item->itemIndex;
pokemon->heldItem.numItems = item->numItems;
}
bool8 IsPokemonRenamed(struct PokemonStruct* pokemon) {
char species_name[20];
char* species = GetMonSpecies(pokemon->speciesNum);
s32 i;
CopyStringtoBuffer(species_name, species);
for (i = 0; i < 10; i++) {
if (pokemon->name[i] != species_name[i]) {
return FALSE;
}
if (!pokemon->name[i]) {
return TRUE;
}
}
return TRUE;
}
bool8 ComparePokemonNames(s16 a1, s16 a2) {
s32 index1 = a1;
s32 index2 = a2;
u8* name1 = gRecruitedPokemonRef->pokemon[index1].name;
u8* name2 = gRecruitedPokemonRef->pokemon[index2].name;
s32 i;
for (i = 0; i < 10; i++) {
s32 c1 = ReturnIntFromChar(*name1);
s32 c2 = ReturnIntFromChar(*name2);
if (c1 > c2) {
return TRUE;
}
if (c1 < c2) {
return FALSE;
}
name1++;
name2++;
}
return FALSE;
}
void CopySpeciesNametoBuffer(u8 * buffer, s16 index)
{
@ -40,7 +154,7 @@ void sub_808D930(u8 *buffer, s16 index)
const char *preload;
newIndex = index;
if (sub_808E770(newIndex) == SPECIES_UNOWN) {
if (GetBaseSpecies(newIndex) == SPECIES_UNOWN) {
preload = gUnknown_8107630; // %s%c
unownString = GetMonSpecies(SPECIES_UNOWN);
unownIndex = GetUnownIndex(newIndex);
@ -90,3 +204,570 @@ void sub_808DA34(u8 *buffer, struct PokemonStruct *pokemon)
{
sub_80922B4(buffer, pokemon->name, 10);
}
bool8 sub_808DA44(s32 a1_, u32 a2_)
{
// this is the dumbest thing ever, but just making a1 a s16 and
// a2 a u8 did weird stuff with shifting...
s32 a1 = (s16)a1_;
u32 a2 = (u8)a2_;
if (a2 > 0xc) {
s32 i;
struct unkStruct_8107654 data[6];
memcpy(data, gUnknown_8107654, 6 * sizeof(struct unkStruct_8107654));
for (i = 0; i < 10 && data[i].unk0; i++) {
if (data[i].unk0 == a1 && data[i].unk4 == a2) {
return 1;
}
}
return 0;
}
else {
return gUnknown_8107645[a2];
}
}
u8 *GetCategoryString(s16 index)
{
return gMonsterParameters[index].category;
}
u8 GetPokemonSize(s16 index)
{
return gMonsterParameters[index].size;
}
u8 GetShadowSize(s16 index)
{
return gMonsterParameters[index].shadow_size;
}
s32 GetMoveSpeed(s16 index)
{
return gMonsterParameters[index].move_speed;
}
u8 GetWalkableTiles(s16 index)
{
return gMonsterParameters[index].walkable_tiles;
}
u8 GetUnk1B(s16 index)
{
return ((u8)(gMonsterParameters[index].unk1B) << 25) >> 24;
}
bool8 GetIsMoving(s16 index)
{
return gMonsterParameters[index].isMoving;
}
u8 GetUnk1D(s16 index)
{
return gMonsterParameters[index].unk1D;
}
u16 GetLowKickDmg(s16 index)
{
return gMonsterParameters[index].lowkick_dmg;
}
u16 GetSizeOrbDmg(s16 index)
{
return gMonsterParameters[index].sizeorb_dmg;
}
u8 GetFriendArea(s16 index)
{
return gMonsterParameters[index].friend_area;
}
u16 GetBaseHP(s16 index)
{
return gMonsterParameters[index].base_hp;
}
bool8 GetUnk33(s16 index)
{
return gMonsterParameters[index].unk33;
}
u8 GetUnk12(s16 index)
{
return gMonsterParameters[index].unk12;
}
s16 GetPokemonEvolveFrom(s16 index)
{
return gMonsterParameters[index].pre.evolve_from;
}
u16 GetPokemonAttSpatt(s16 index, u32 r1)
{
return gMonsterParameters[index].base_att_spatt[r1];
}
u16 GetPokemonDefSpdef(s16 index, u32 r1)
{
return gMonsterParameters[index].base_def_spdef[r1];
}
u8 GetPokemonType(s32 index, u32 typeIndex)
{
s16 newIndex = index;
return gMonsterParameters[newIndex].types[typeIndex];
}
u8 GetPokemonAbility(s16 index, u32 abilityIndex)
{
return gMonsterParameters[index].abilities[abilityIndex];
}
s16 GetDexInternalNo(s16 index, u32 r1)
{
return gMonsterParameters[index].dexInternal[r1];
}
s16 GetBaseRecruit(s16 index)
{
return gMonsterParameters[index].base_recruit;
}
s16 GetAlphabetParentNo(s16 index, s32 r1)
{
return gMonsterParameters[index].alphabetParent[r1];
}
s16 GetInternalNo(s16 index)
{
return gMonsterParameters[index].dexInternal[1];
}
s32 CalculateEXPGain(s16 index, s32 level)
{
s32 baseEXP = gMonsterParameters[index].base_exp;
return baseEXP + (baseEXP * (level - 1)) / 10;
}
s16 GetPokemonEvolveConditions(s16 index, struct unkEvolve *r1)
{
struct EvolveStruct1 temp2;
struct EvolveNeeds temp1;
temp1 = gMonsterParameters[index].need;
temp2 = gMonsterParameters[index].pre;
r1->conditions = temp2;
r1->needs = temp1;
// The return value is not used anywhere, but necessary for the function to match.
return index;
}
u8 GetPokemonOverworldPalette(s16 index, u32 r1)
{
// Had to have this cast to match
u32 temp;
temp = index;
if (r1 != 0)
{
return 10;
}
else
{
return gMonsterParameters[temp].overworld_palette;
}
}
struct OpenedFile *OpenPokemonDialogueSpriteFile(s16 index)
{
// Looks like this loads the dialogue sprite for the pokemon
char buffer[0xC];
if(gMonsterParameters[index].dialogue_sprites == 0)
{
return NULL;
}
sprintf(buffer, gUnknown_8107684, index); // "kao%03d"
return OpenFile(buffer, &gMonsterFileArchive);
}
struct OpenedFile *GetDialogueSpriteDataPtr(s16 index)
{
// Looks like this loads the dialogue sprite for the pokemon
char buffer[0xC];
if(gMonsterParameters[index].dialogue_sprites == 0)
{
return NULL;
}
sprintf(buffer, gUnknown_8107684, index); // "kao%03d"
return OpenFileAndGetFileDataPtr(buffer, &gMonsterFileArchive);
}
bool8 IsPokemonDialogueSpriteAvail(s16 index, s32 r1)
{
// checking to see if dialogue sprite is available??
return (gMonsterParameters[index].dialogue_sprites >> r1) & 1;
}
void xxx_pokemonstruct_index_to_unk_808DE30(void* r0, u32 r1)
{
xxx_pokemonstruct_to_unk_808DE50(r0, &gRecruitedPokemonRef->pokemon[r1], r1);
}
void xxx_pokemonstruct_to_unk_808DE50(struct unkStruct_808DE50 * a1, struct PokemonStruct *pokemon, s32 a3)
{
s32 i;
struct HeldItem* held;
struct ItemSlot* slot;
u32 somestruct_80943A0;
u32 somestruct2_80943A0;
a1->unk0 = pokemon->unk0;
a1->unkHasNextStage = pokemon->unkHasNextStage;
a1->IQ = pokemon->IQ;
a1->unk4C = pokemon->unk20;
sub_808E6F4(&a1->unk54);
a1->unk4 = pokemon->unk4;
a1->unk2 = pokemon->unk2;
a1->unkA = a3;
a1->speciesNum = pokemon->speciesNum;
a1->unk50 = pokemon->unk24;
a1->unk12 = pokemon->pokeHP;
a1->unk10 = pokemon->pokeHP;
for (i = 0; i < 2; i++) {
a1->offense.att[i] = pokemon->offense.att[i];
a1->offense.def[i] = pokemon->offense.def[i];
}
a1->unk18 = pokemon->unk1C;
sub_8093F50(&a1->unk1C, &pokemon->unk2C);
for (i = 0; i < 10; i++) {
a1->name[i] = pokemon->name[i];
}
held = &pokemon->heldItem;
slot = &a1->itemSlot;
if ((u32)(-held->itemIndex | held->itemIndex) >> 31) {
HeldItemToSlot(slot, held);
}
else {
slot->itemIndex = 0;
slot->numItems = 0;
slot->unk0 = 0;
}
sub_80943A0(&somestruct_80943A0, 100);
a1->unk44 = somestruct_80943A0;
sub_80943A0(&somestruct2_80943A0, 100);
a1->unk48 = somestruct2_80943A0;
}
void xxx_unk_to_pokemonstruct_index_808DF2C(s32 a1, struct unkStruct_808DE50* a2)
{
xxx_unk_to_pokemonstruct_808DF44(&a1[gRecruitedPokemonRef->pokemon], a2);
}
extern void sub_8093FA8(struct unkPokeSubStruct_2C*, struct unkPokeSubStruct_2C*);
void xxx_unk_to_pokemonstruct_808DF44(struct PokemonStruct* pokemon, struct unkStruct_808DE50* a2)
{
s32 i;
pokemon->unk0 = a2->unk0;
pokemon->unkHasNextStage = a2->unkHasNextStage;
pokemon->IQ = a2->IQ;
pokemon->unk20 = a2->unk4C;
pokemon->unk4 = a2->unk4;
pokemon->unk2 = a2->unk2;
pokemon->speciesNum = a2->speciesNum;
pokemon->unk24 = a2->unk50;
pokemon->pokeHP = a2->unk12;
for (i = 0; i < 2; i++) {
pokemon->offense.att[i] = a2->offense.att[i];
pokemon->offense.def[i] = a2->offense.def[i];
}
pokemon->unk1C = a2->unk18;
sub_8093FA8(pokemon->unk2C, a2->unk1C);
for (i = 0; i < 10; i++) {
pokemon->name[i] = a2->name[i];
}
if (a2->itemSlot.unk0 & 1) {
SlotToHeldItem(&pokemon->heldItem, &a2->itemSlot);
}
else {
pokemon->heldItem.itemIndex = 0;
}
}
void sub_808DFDC(s32 a1, struct unkStruct_808DE50* a2)
{
// transfer item from unk to pokemon at index
struct PokemonStruct* pokemon = &gRecruitedPokemonRef->pokemon[a1];
if (a2->itemSlot.unk0 & 1) {
SlotToHeldItem(&pokemon->heldItem, &a2->itemSlot);
}
else {
pokemon->heldItem.itemIndex = 0;
}
}
void GetPokemonLevelData(struct LevelData* a1, s16 _id, s32 a3)
{
u8 buffer[12];
s32 id = _id;
if ((s16)gLevelCurrentPokeId != id)
{
struct OpenedFile *file;
gLevelCurrentPokeId = id;
// lvmp%03d\0
sprintf(buffer, gUnknown_810768C, id);
file = OpenFileAndGetFileDataPtr(buffer, &gSystemFileArchive);
DecompressATFile((char*)gLevelCurrentData, 0, file);
CloseFile(file);
}
a3 -= 1;
if ( a3 < 0 )
a3 = 0;
*a1 = gLevelCurrentData[a3];
}
u8* sub_808E07C(u8* a1, u16* a2)
{
u32 r1 = *a1++;
u32 r3;
if (r1 & 0x80) {
r3 = *a1++;
}
else {
r3 = r1;
r1 = 0;
}
#ifdef NONMATCHING
// wrong order
r1 &= 0x7f;
r3 &= 0x7f;
*a2 = (r1 << 7) | r3;
#else
{
register u32 mask asm("r0") = 0x7f;
r3 &= mask;
r1 &= mask;
*a2 = (r1 << 7) | r3;
}
#endif
return a1;
}
s32 sub_808E0AC(u16* a1, s16 species, s32 a3, s32 a4)
{
u8* stream;
u16 result; // struct?
s32 count;
register s32 _species asm("r2"); // weird regalloc
_species = (s16)species;
count = 0;
if (species == SPECIES_DECOY) return 0;
if (species == SPECIES_NONE) return 0;
if (species == SPECIES_MUNCHLAX) return 0;
// get stream
stream = sub_8092B18(_species);
while (*stream)
{
u8 v12;
// read from stream
stream = sub_808E07C(stream, &result);
v12 = *stream++;
if (v12 > a3)
break;
if (v12 == a3) {
bool8 cond = 1;
// I don't think these are species IDs
// the pokemon they would correspond to are pretty random if they are
// shuckle, heracross, pupitar, vibrava
if ((result == 238) && (a4 < gUnknown_810ACB8)) cond = 0;
if ((result == 239) && (a4 < gUnknown_810ACBA)) cond = 0;
if ((result == 272) && (a4 < gUnknown_810ACBC)) cond = 0;
if ((result == 354) && (a4 < gUnknown_810ACBE)) cond = 0;
if (cond) {
if (count < 16) {
*a1++ = result;
++count;
}
}
}
}
return count;
}
bool8 sub_808E190(u16 a1, s16 _species)
{
u16 result;
u16 result2;
s32 species = _species; // r4
u8* ptr;
if (species == SPECIES_DECOY) return 0;
if (species == SPECIES_NONE) return 0;
if (species == SPECIES_MUNCHLAX) return 0;
if (a1 == 352) return 0;
ptr = sub_8092B18(species);
while (*ptr) {
ptr = sub_808E07C(ptr, &result);
ptr++;
if (a1 == result) {
return 1;
}
}
ptr = sub_8092B54(species);
while (*ptr) {
ptr = sub_808E07C(ptr, &result2);
if (result2 == a1) {
return 1;
}
}
return 0;
}
s32 sub_808E218(struct unkStruct_808E218_arg* a1, struct PokemonStruct* pokemon)
{
s32 i;
s32 count;
struct EvolveStage evolve_sequence[3];
s32 sequence_length;
count = 0;
a1->count = 0;
if (pokemon->speciesNum == SPECIES_DECOY) return 0;
if (pokemon->speciesNum == SPECIES_NONE) return 0;
if (pokemon->speciesNum == SPECIES_MUNCHLAX) return 0;
sequence_length = GetEvolutionSequence(pokemon, evolve_sequence);
for (i = 0; i < sequence_length; i++) {
u8* ptr;
u16 result;
ptr = sub_8092B18(evolve_sequence[i].speciesNum);
while (*ptr) {
s32 value;
ptr = sub_808E07C(ptr, &result);
value = *ptr++;
if (value > evolve_sequence[i].unkHasNextStage) {
break;
}
if (count < NUM_SPECIES) {
s32 j;
bool8 cond = 1;
// I don't think these are species IDs
// the pokemon they would correspond to are pretty random if they are
// shuckle, heracross, pupitar, vibrava
if ((result == 238) && (pokemon->IQ < gUnknown_810ACB8)) cond = 0;
if ((result == 239) && (pokemon->IQ < gUnknown_810ACBA)) cond = 0;
if ((result == 272) && (pokemon->IQ < gUnknown_810ACBC)) cond = 0;
if ((result == 354) && (pokemon->IQ < gUnknown_810ACBE)) cond = 0;
for (j = 0; j < 4; j++) {
if ((pokemon->unk2C[j].unk0 & 1) && pokemon->unk2C[j].unk2 == result) {
cond = 0;
}
}
if (cond) {
s32 k;
for (k = 0; k < count && a1->unk0[k] != result; k++) {}
if (k == count) {
a1->unk0[count++] = result;
}
}
}
}
}
a1->count = count;
return count;
}
s32 GetEvolutionSequence(struct PokemonStruct* pokemon, struct EvolveStage* a2)
{
#ifdef NONMATCHING
s32 count;
s32 species;
s32 i;
a2[0].specesNum = pokemon->speciesNum;
a2[0].unkHasNextStage = pokemon->unkHasNextStage;
count = 1;
species = pokemon->speciesNum;
i = 0;
for (; i < 2; i++) {
if (!pokemon->unkC[i].unk0) {
break;
}
species = GetPokemonEvolveFrom(species);
if (!species) {
break;
}
a2[1 + i].speciesNum = species;
a2[1 + i].unkHasNextStage = pokemon->unkC[i].unk0;
// wrong increment order:
count++;
}
return count;
#else
s32 count;
s32 species;
s32 i;
struct EvolveStage* stage;
struct unkPokeSubStruct_C* has_next_stage;
a2[0].speciesNum = pokemon->speciesNum;
a2[0].unkHasNextStage = pokemon->unkHasNextStage;
count = 1;
species = pokemon->speciesNum;
i = 0;
has_next_stage = pokemon->unkC;
stage = &a2[1];
for (; i < 2; i++) {
if (!has_next_stage->unk0) {
break;
}
species = GetPokemonEvolveFrom(species);
if (!species) {
break;
}
stage->speciesNum = species;
stage->unkHasNextStage = has_next_stage->unk0;
stage++;
count++;
has_next_stage++;
}
return count;
#endif
}

View File

@ -1,128 +1,128 @@
// Copyright(c) 2015-2017 YamaArashi
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include <cstdio>
#include <cstdlib>
#include <list>
#include <queue>
#include <set>
#include <string>
#include "scaninc.h"
#include "source_file.h"
bool CanOpenFile(std::string path)
{
FILE *fp = std::fopen(path.c_str(), "rb");
if (fp == NULL)
return false;
std::fclose(fp);
return true;
}
const char *const USAGE = "Usage: scaninc [-I INCLUDE_PATH] FILE_PATH\n";
int main(int argc, char **argv)
{
std::queue<std::string> filesToProcess;
std::set<std::string> dependencies;
std::vector<std::string> includeDirs;
argc--;
argv++;
while (argc > 1)
{
std::string arg(argv[0]);
if (arg.substr(0, 2) == "-I")
{
std::string includeDir = arg.substr(2);
if (includeDir.empty())
{
argc--;
argv++;
includeDir = std::string(argv[0]);
}
if (!includeDir.empty() && includeDir.back() != '/')
{
includeDir += '/';
}
includeDirs.push_back(includeDir);
}
else
{
FATAL_ERROR(USAGE);
}
argc--;
argv++;
}
if (argc != 1) {
FATAL_ERROR(USAGE);
}
std::string initialPath(argv[0]);
filesToProcess.push(initialPath);
while (!filesToProcess.empty())
{
std::string filePath = filesToProcess.front();
SourceFile file(filePath);
filesToProcess.pop();
includeDirs.push_back(file.GetSrcDir());
for (auto incbin : file.GetIncbins())
{
dependencies.insert(incbin);
}
for (auto include : file.GetIncludes())
{
bool exists = false;
std::string path("");
for (auto includeDir : includeDirs)
{
path = includeDir + include;
if (CanOpenFile(path))
{
exists = true;
break;
}
}
if (!exists && file.FileType() == SourceFileType::Asm)
{
path = include;
}
bool inserted = dependencies.insert(path).second;
if (inserted && exists)
{
filesToProcess.push(path);
}
}
includeDirs.pop_back();
}
for (const std::string &path : dependencies)
{
std::printf("%s\n", path.c_str());
}
}
// Copyright(c) 2015-2017 YamaArashi
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include <cstdio>
#include <cstdlib>
#include <list>
#include <queue>
#include <set>
#include <string>
#include "scaninc.h"
#include "source_file.h"
bool CanOpenFile(std::string path)
{
FILE *fp = std::fopen(path.c_str(), "rb");
if (fp == NULL)
return false;
std::fclose(fp);
return true;
}
const char *const USAGE = "Usage: scaninc [-I INCLUDE_PATH] FILE_PATH\n";
int main(int argc, char **argv)
{
std::queue<std::string> filesToProcess;
std::set<std::string> dependencies;
std::vector<std::string> includeDirs;
argc--;
argv++;
while (argc > 1)
{
std::string arg(argv[0]);
if (arg.substr(0, 2) == "-I")
{
std::string includeDir = arg.substr(2);
if (includeDir.empty())
{
argc--;
argv++;
includeDir = std::string(argv[0]);
}
if (!includeDir.empty() && includeDir.back() != '/')
{
includeDir += '/';
}
includeDirs.push_back(includeDir);
}
else
{
FATAL_ERROR(USAGE);
}
argc--;
argv++;
}
if (argc != 1) {
FATAL_ERROR(USAGE);
}
std::string initialPath(argv[0]);
filesToProcess.push(initialPath);
while (!filesToProcess.empty())
{
std::string filePath = filesToProcess.front();
SourceFile file(filePath);
filesToProcess.pop();
includeDirs.push_back(file.GetSrcDir());
for (auto incbin : file.GetIncbins())
{
dependencies.insert(incbin);
}
for (auto include : file.GetIncludes())
{
bool exists = false;
std::string path("");
for (auto includeDir : includeDirs)
{
path = includeDir + include;
if (CanOpenFile(path))
{
exists = true;
break;
}
}
if (!exists && file.FileType() == SourceFileType::Asm)
{
path = include;
}
bool inserted = dependencies.insert(path).second;
if (inserted && exists)
{
filesToProcess.push(path);
}
}
includeDirs.pop_back();
}
for (const std::string &path : dependencies)
{
std::printf("%s\n", path.c_str());
}
}

View File

@ -1,130 +1,130 @@
// Copyright(c) 2019 Phlosioneer
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include <new>
#include "source_file.h"
SourceFileType GetFileType(std::string& path)
{
std::size_t pos = path.find_last_of('.');
if (pos == std::string::npos)
FATAL_ERROR("no file extension in path \"%s\"\n", path.c_str());
std::string extension = path.substr(pos + 1);
if (extension == "c")
return SourceFileType::Cpp;
else if (extension == "s")
return SourceFileType::Asm;
else if (extension == "h")
return SourceFileType::Header;
else if (extension == "inc")
return SourceFileType::Inc;
else
FATAL_ERROR("Unrecognized extension \"%s\"\n", extension.c_str());
// Unreachable
return SourceFileType::Cpp;
}
std::string GetDir(std::string& path)
{
std::size_t slash = path.rfind('/');
if (slash != std::string::npos)
return path.substr(0, slash + 1);
else
return std::string("");
}
SourceFile::SourceFile(std::string path)
{
m_file_type = GetFileType(path);
m_src_dir = GetDir(path);
if (m_file_type == SourceFileType::Cpp
|| m_file_type == SourceFileType::Header)
{
new (&m_source_file.c_file) CFile(path);
m_source_file.c_file.FindIncbins();
}
else
{
AsmFile file(path);
std::set<std::string> incbins;
std::set<std::string> includes;
IncDirectiveType incDirectiveType;
std::string outputPath;
while ((incDirectiveType = file.ReadUntilIncDirective(outputPath)) != IncDirectiveType::None)
{
if (incDirectiveType == IncDirectiveType::Include)
includes.insert(outputPath);
else
incbins.insert(outputPath);
}
new (&m_source_file.asm_wrapper) SourceFile::InnerUnion::AsmWrapper{incbins, includes};
}
}
SourceFileType SourceFile::FileType()
{
return m_file_type;
}
SourceFile::~SourceFile()
{
if (m_file_type == SourceFileType::Cpp || m_file_type == SourceFileType::Header)
{
m_source_file.c_file.~CFile();
}
else
{
m_source_file.asm_wrapper.asm_incbins.~set();
m_source_file.asm_wrapper.asm_includes.~set();
}
}
const std::set<std::string>& SourceFile::GetIncbins()
{
if (m_file_type == SourceFileType::Cpp || m_file_type == SourceFileType::Header)
return m_source_file.c_file.GetIncbins();
else
return m_source_file.asm_wrapper.asm_incbins;
}
const std::set<std::string>& SourceFile::GetIncludes()
{
if (m_file_type == SourceFileType::Cpp || m_file_type == SourceFileType::Header)
return m_source_file.c_file.GetIncludes();
else
return m_source_file.asm_wrapper.asm_includes;
}
std::string& SourceFile::GetSrcDir()
{
return m_src_dir;
}
// Copyright(c) 2019 Phlosioneer
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include <new>
#include "source_file.h"
SourceFileType GetFileType(std::string& path)
{
std::size_t pos = path.find_last_of('.');
if (pos == std::string::npos)
FATAL_ERROR("no file extension in path \"%s\"\n", path.c_str());
std::string extension = path.substr(pos + 1);
if (extension == "c")
return SourceFileType::Cpp;
else if (extension == "s")
return SourceFileType::Asm;
else if (extension == "h")
return SourceFileType::Header;
else if (extension == "inc")
return SourceFileType::Inc;
else
FATAL_ERROR("Unrecognized extension \"%s\"\n", extension.c_str());
// Unreachable
return SourceFileType::Cpp;
}
std::string GetDir(std::string& path)
{
std::size_t slash = path.rfind('/');
if (slash != std::string::npos)
return path.substr(0, slash + 1);
else
return std::string("");
}
SourceFile::SourceFile(std::string path)
{
m_file_type = GetFileType(path);
m_src_dir = GetDir(path);
if (m_file_type == SourceFileType::Cpp
|| m_file_type == SourceFileType::Header)
{
new (&m_source_file.c_file) CFile(path);
m_source_file.c_file.FindIncbins();
}
else
{
AsmFile file(path);
std::set<std::string> incbins;
std::set<std::string> includes;
IncDirectiveType incDirectiveType;
std::string outputPath;
while ((incDirectiveType = file.ReadUntilIncDirective(outputPath)) != IncDirectiveType::None)
{
if (incDirectiveType == IncDirectiveType::Include)
includes.insert(outputPath);
else
incbins.insert(outputPath);
}
new (&m_source_file.asm_wrapper) SourceFile::InnerUnion::AsmWrapper{incbins, includes};
}
}
SourceFileType SourceFile::FileType()
{
return m_file_type;
}
SourceFile::~SourceFile()
{
if (m_file_type == SourceFileType::Cpp || m_file_type == SourceFileType::Header)
{
m_source_file.c_file.~CFile();
}
else
{
m_source_file.asm_wrapper.asm_incbins.~set();
m_source_file.asm_wrapper.asm_includes.~set();
}
}
const std::set<std::string>& SourceFile::GetIncbins()
{
if (m_file_type == SourceFileType::Cpp || m_file_type == SourceFileType::Header)
return m_source_file.c_file.GetIncbins();
else
return m_source_file.asm_wrapper.asm_incbins;
}
const std::set<std::string>& SourceFile::GetIncludes()
{
if (m_file_type == SourceFileType::Cpp || m_file_type == SourceFileType::Header)
return m_source_file.c_file.GetIncludes();
else
return m_source_file.asm_wrapper.asm_includes;
}
std::string& SourceFile::GetSrcDir()
{
return m_src_dir;
}