diff --git a/.vscode/settings.json b/.vscode/settings.json index 6d6548057..bdded2ab4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -30,6 +30,25 @@ "string": "c", "string_view": "c", "objects.h": "c", - "cstdio": "c" + "cstdio": "c", + "atomic": "c", + "cstddef": "c", + "memory_resource": "c", + "fstream": "c", + "memory": "c", + "typeinfo": "c", + "complex": "c", + "iosfwd": "c", + "sstream": "c", + "streambuf": "c", + "cstdlib": "c", + "algorithm": "c", + "sfx.h": "c", + "libc.h": "c", + "cwchar": "cpp", + "vector": "cpp", + "initializer_list": "cpp", + "new": "cpp", + "stdexcept": "cpp" }, } \ No newline at end of file diff --git a/Makefile b/Makefile index e517b450e..cf3fdc267 100644 --- a/Makefile +++ b/Makefile @@ -224,6 +224,10 @@ decompile: $(M2C_APP) $(M2CTX) $(SOURCE) $(M2C_APP) $(M2C_ARGS) --target mipsel-gcc-c --context ctx.c $(FUNC) $(ASSEMBLY) +context: + $(M2CTX) $(SOURCE) + @echo ctx.c has been updated. + require-tools: $(SPLAT_APP) $(ASMDIFFER_APP) $(GO) update-dependencies: require-tools $(M2CTX_APP) $(M2C_APP) pip3 install -r $(TOOLS_DIR)/requirements-python.txt diff --git a/README.md b/README.md index f9954eb76..6660e3abb 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This is a WIP decompilation of Castlevania Symphony of the Night for the PSX. The purpose of the project is to recreate a source code base for the game from scratch, using information found inside the game along with static and/or dynamic analysis. We aim to produce a codebase that compiles byte-for-byte to the same binaries of the game, this type of approach is called Matching Decompilation. The game is divided into three modules: -`SLUS_000.67` is the game engine of the game. It contains all the necessary logic to interact with the gamepad, CD, memory card, the SPU and to render the sprites on-screen. It appears to not contain any game logic by itself. +`SLUS_000.67` is the main engine of the game. It contains all the necessary logic to interact with the gamepad, CD, memory card, the SPU and to render the sprites on-screen. It appears to not contain any game logic by itself. `DRA` is the game itself. It contains the gameloop and the necessary API to draw maps, entities, load levels, handle entities, animations and collisions. It also contains some common data such as Alucard's sprites, candle's sprites and the common rooms (save, loading, teleport) layout. `ST/` are the overlays for each area. An area (eg. Castle's entrance, Alchemy Laboratory, etc.) contains all the unique logic to handle map specific events, cutscenes, enemy AI, collisions and more. It also contains the rooms and entities layout. @@ -60,7 +60,7 @@ You will probably have some differences from your compiled code to the original; There are a few tricks to make the process more streamlined: 1. Use [decomp.me](https://decomp.me/) with GCC 2.7.2 for PS1. Be aware that the repo is using GCC 2.6.x, so decomp.me will sometimes give a slightly different output. -1. The “context” section of decomp.me, is provided by the cmd `SOURCE=src/st/wrp/6FD0.c make ctx.c` as mentionned in the how to decompile. +1. The “context” section of decomp.me, is provided by the cmd `SOURCE=src/dra/42398.c make context` as mentioned in the how to decompile. 1. Use [decomp-permuter](https://github.com/simonlindholm/decomp-permuter) to solve some mismatches. 1. Use [this](https://github.com/mkst/sssv/wiki/Jump-Tables) and [this](https://github.com/pmret/papermario/wiki/GCC-2.8.1-Tips-and-Tricks) guide to understand how some compiler patterns work. 1. Use the `#ifndef NON_MATCHING` if your code is logically equivalent but you cannot yet fully match it. diff --git a/config/splat.main.yaml b/config/splat.main.yaml index d83dd4007..1c5498664 100644 --- a/config/splat.main.yaml +++ b/config/splat.main.yaml @@ -33,7 +33,7 @@ segments: - [0x5E60, c, psxsdk/libetc] - [0x5E78, c] - [0x6864, hasm, psxsdk/libc] - - [0x6934, c, psxsdk/fprintf] + - [0x6934, c, psxsdk/sprintf] - [0x7190, c] - [0x720C, hasm, psxsdk/libcard] - [0x72A4, c] diff --git a/config/symbols.txt b/config/symbols.txt index e0f0bb33a..f5e5fff2b 100644 --- a/config/symbols.txt +++ b/config/symbols.txt @@ -226,7 +226,7 @@ srand = 0x800160F4; malloc = 0x80016104; free = 0x80016114; printf = 0x80016124; -fprintf = 0x80016134; +sprintf = 0x80016134; memchr = 0x80016990; memmove = 0x800169A0; _card_info = 0x80016A0C; diff --git a/include/dra.h b/include/dra.h index 35ca3bdd0..c3e5d615d 100644 --- a/include/dra.h +++ b/include/dra.h @@ -80,6 +80,12 @@ typedef union { } modeU8; } unkUnion3; +typedef union { + byte typeByte; + short typeShort; + int typeInt; +} MultiType; + typedef struct Entity { /* 0x00 */ UnkUnion1 posX; /* 0x04 */ UnkUnion1 posY; @@ -167,7 +173,8 @@ typedef struct Entity { /* 0xAD */ s8 unkAD; /* 0xAE */ s8 unkAE; /* 0xAF */ s8 unkAF; - /* 0xB0 */ s32 unkB0; + /* 0xB0 */ s16 unkB0; + /* 0xB2 */ s16 unkB2; /* 0xB4 */ s16 unkB4; /* 0xB6 */ s16 unkB6; union { @@ -181,11 +188,6 @@ typedef struct Entity { } unkB8; } Entity; // size = 0xBC -typedef struct playerHeart { - s32 current; - s32 max; -} playerHeart; - typedef struct { /* 0x00 */ u16 animationSet; /* 0x02 */ u16 zPriority; @@ -201,19 +203,21 @@ typedef struct { typedef struct unkStruct3 { /* 0x00 */ struct unkStruct3* unk0; - /* 0x04 */ char pad4[0x3]; + /* 0x04 */ s8 unk4; + /* 0x04 */ char pad4[0x1]; + /* 0x05 */ s8 unk6; /* 0x07 */ s8 unk7; /* 0x08 */ s16 unk8; /* 0x0A */ s16 unkA; /* 0x0C */ s16 unkC; /* 0x0E */ s16 unkE; - /* 0x10 */ s16 unk10; + /* 0x10 */ UnkUnion2 unk10; /* 0x12 */ UnkUnion2 unk12; /* 0x14 */ s16 unk14; /* 0x16 */ s16 unk16; /* 0x18 */ s16 unk18; /* 0x1A */ s16 unk1A; - /* 0x1C */ s16 unk1C; + /* 0x1C */ UnkUnion2 unk1C; /* 0x1E */ UnkUnion2 unk1E; /* 0x20 */ s16 unk20; /* 0x22 */ s16 unk22; @@ -222,7 +226,7 @@ typedef struct unkStruct3 { /* 0x26 */ char pad26[0x2]; /* 0x28 */ s8 unk28; /* 0x29 */ char pad[0x1]; - /* 0x2A */ s8 unk2A; + /* 0x2A */ u8 unk2A; /* 0x2B */ u8 unk2B; /* 0x2C */ u16 unk2C; /* 0x2E */ char pad2E[4]; @@ -264,20 +268,6 @@ typedef struct { /* 0x2 */ s16 y; } Unkstruct6; // size = 0x4 -typedef struct { - /* 0x00 */ s32 sp10; - /* 0x04 */ s32 sp14; - /* 0x08 */ s32 sp18; - /* 0x0C */ s32 sp1C; - /* 0x10 */ s32 sp20; - /* 0x14 */ s16 sp24; - /* 0x18 */ s16 sp26; - /* 0x1C */ s16 sp28; - /* 0x20 */ s16 sp2A; - /* 0x24 */ s32 sp2C; - /* 0x28 */ s32 sp30; -} Unkstruct7; // size = 0x2C - typedef struct { /* 0x0 */ void* addr1; /* 0x4 */ void* addr2; @@ -320,15 +310,24 @@ typedef struct { DISPENV disp; // display environment } DisplayBuffer; +typedef struct PlayerHeart { + s32 current; + s32 max; +} PlayerHeart; + +typedef struct PlayerHP { + s32 current; + s32 max; +} PlayerHP; + typedef struct PlayerMp { s32 current; s32 max; } PlayerMp; -extern unkstruct_80072FA0 D_80072FA0[]; - // main extern s32 D_8003C0EC[4]; +extern s32 D_8003C0F8; extern Unkstruct5* D_8003C704; extern u16 D_8003C708; extern s32 D_8003C730; @@ -346,7 +345,7 @@ extern s32 g_roomCount; extern s32 g_CurrentPlayableCharacter; extern s32 g_blinkTimer; extern s32 g_menuMainCursorIndex; -extern s32 g_menuRelicsCursorIndex; +extern s32 g_menuRelicsCursorIndex[]; extern s32 g_SettingsCloakMode; extern s32 g_SettingsSoundMode; extern s32 D_8003CACC; @@ -444,10 +443,13 @@ extern s8 D_8005436D; #define LBA_STAGE_NP3_VH 0x91FF #define LBA_STAGE_NP3_BIN 0x9235 -extern s32 aBu1d1dS; +extern const char* aBu1d1dS; +extern const char* aBu1d1d; extern s32 D_8006BAFC; extern s32 D_8006BB00; extern s32 D_8006C374; +extern s32 D_8006C3AC; +extern u16 D_8006C3C4; extern GpuBufferUnk* D_8006C37C; extern s32 D_8006C398; extern s32 g_backbufferX; @@ -462,9 +464,15 @@ extern u16 D_80072EF6; extern s32 D_80072EFC; extern s16 D_80072F00[]; extern s16 D_80072F0A; +extern s16 D_80072F0C; +extern s16 D_80072F16[2]; extern s16 D_80072F18; +extern s16 D_80072F1A[]; +extern s16 D_80072F1C[]; extern s32 D_80072F20; -extern s32 D_80072F2C; +extern s32 D_80072F24; +extern u32 D_80072F2C; +extern u16 D_80072F70; extern u16 D_80072F92; // Probably part of the same array / struct @@ -473,6 +481,8 @@ extern s16 D_80072F66; extern u16 D_80072F68[]; extern u16 D_80072F6C; extern u16 D_80072F6E; +extern s16 D_80072F86; +extern unkstruct_80072FA0 D_80072FA0[]; extern s32 D_80073060; extern s32 D_80073080; extern u16 D_8007308E; @@ -494,6 +504,7 @@ extern s32 g_CurrentRoomWidth; extern s32 g_CurrentRoomHeight; extern Entity D_800733D8[TOTAL_ENTITY_COUNT]; extern s16 D_800733DA; +extern s32 D_800733DC[]; extern s16 D_800733DE; extern s32 D_800733E0; extern s32 D_800733E4; @@ -501,13 +512,17 @@ extern u16 D_800733EC; extern u16 D_800733EE; extern s8 D_800733F0; extern u8 D_800733F1; +extern s16 D_800733F6[]; +extern u16 D_800733FC; +extern s16 D_800733FE; extern u16 D_80073404; extern u16 D_80073406; extern u16 D_8007340A; extern u16 D_8007341C; extern /*?*/ s32* D_80073424; -extern s16 D_80073428; +extern MultiType D_80073428; extern s16 D_8007342A; +extern s16 D_8007342C; extern u16 D_8007342E; extern u8 D_80073484; extern s8 D_80073510; @@ -516,6 +531,9 @@ extern s8 D_80073512; extern s8 D_80073513; extern Entity D_800736C8; extern Entity D_80073F98; +extern u16 D_80073FBE; +extern Entity D_80073FC4; // unconfirmed / weird +extern Entity D_80074C08[]; extern Entity D_800762D8[]; // D_800733D8 + 0x40 extern Unkstruct8 g_CurrentRoomTileLayout; extern Entity D_8007A958[]; @@ -526,8 +544,8 @@ extern Entity D_8007EF1C; extern s32 D_8007EFDC; extern s32 D_8007EFE0; extern s32 D_8007EFE4; -extern void* D_8007EFD8; -extern s32 D_80082FE4; +extern unsigned long D_8007EFD8; +extern s8 D_80082FE4; extern s32 D_80086FE4; extern POLY_GT4 D_80086FEC[]; extern s32 playerX; @@ -540,13 +558,17 @@ extern POLY_GT4 D_800973B8[]; extern s32 D_800973FC; extern s32 D_80097410; extern s32 D_80097414; +extern s32 D_80097420; extern Pad g_pads[]; +extern u16 D_80097494; // related to g_menuRelicsCursorIndex extern s16 D_80097496; +extern u16 D_8009749C[]; extern s32 g_mapProgramId; extern s32 D_800974AC; extern s32 D_800978F8; extern s32 D_80097908; extern s32 D_8009790C; +extern s32 D_80097914; extern s32 D_8009792C; extern s32 D_80097934; extern u8 D_80097964[]; @@ -558,22 +580,37 @@ extern s32 g_playerLevel; extern s32 g_playerExp; extern s32 g_playerGold; extern s32 g_killCount; -extern playerHeart g_playerHeart[]; +extern PlayerHeart g_playerHeart[]; extern s32 g_playerHeartMax; -extern s32 g_playerHp; +extern PlayerHP g_playerHp; extern s32 g_playerHpMax; extern PlayerMp g_playerMp; extern s32 g_playerMpMax; +extern s32 D_80097C1C[]; extern s32 D_80097C20; extern s32 D_80097C24; extern s32 g_timeHours; extern s32 g_timeMinutes; extern s32 g_timeSeconds; extern s32 D_80097C98; +extern s8 D_80097D37; extern s32 D_800A04EC; +extern s32 D_800A0510[]; extern u16 D_800A0518[][0x10]; extern s32 D_800A1F18[]; extern s32 D_800A2438; +extern u8 D_800A2EE8[]; +extern u8 D_800A2EED; +extern u8 D_800A2EF8[]; +extern u8 D_800A2EFD; +extern u8 D_800A2F08[]; +extern u8 D_800A2F18[]; +extern u8 D_800A2F28[]; +extern u8 D_800A2F2D; +extern u8 D_800A2F38[]; +extern u8 D_800A2F3D; +extern u16 D_800A2F48[]; +extern u16 D_800A2F64[]; extern s32 D_800A2FBC[]; extern s32 D_800A2FC0[]; extern s32 player_equip_ring2; @@ -623,7 +660,9 @@ extern s8 D_800A841C[]; // related to player MP extern s32 D_800ACC64[]; // probably a struct extern RECT D_800ACD80; extern RECT D_800ACD90; +extern Unkstruct_800ACEC6 D_800ACEC6; extern u8 D_800ACF4C[]; +extern s16 D_800ACF60[]; extern const char* c_strEquip; extern const char* c_strSpells; extern const char* c_strRelics; @@ -637,11 +676,16 @@ extern s16 D_800BD07C[]; extern s16 D_80136460[]; extern s16 D_80136C60[]; extern u8 D_80137460; +extern s32 D_80137470; +extern s32 D_80137474; extern u16 D_80137478[]; extern u16 D_801374B8[]; extern s16 D_801374F8; extern u8* D_80137578; +extern u8* D_8013757C; extern s32 D_80137580; +extern s32 D_80137584; +extern s32* D_80137590; extern RoomLoadDef* D_801375BC; extern s16 D_80137538; extern s32 D_801375C8; @@ -662,12 +706,17 @@ extern s32 D_80137840; extern s32 D_80137844; extern s32 D_80137848; extern s32 D_8013784C; -extern s32* D_8013794C; +extern s32 g_someValue; +extern s32 D_80137930; +extern s32 D_80137934; +extern s32 D_80137938[]; +extern s8* D_8013794C; // Pointer to texture pattern extern s32 D_80137950; extern s32 D_80137954; extern s32 D_80137960; extern s32 D_80137964; extern s32 D_80137968; +extern s32 D_8013796C; extern s32 D_80137970; extern s32 D_80137974; extern u32 D_80137978; @@ -677,6 +726,7 @@ extern s32 D_80137984; extern u32 D_80137988; extern u32 D_8013798C; extern s32 D_80137994; +extern s32 D_80137998; extern u32 D_8013799C; extern s32 D_80137E40; extern s32 D_80137E44; @@ -687,6 +737,7 @@ extern s32 D_80137E68; extern s32 D_80137F6C; extern void* D_80137F7C; extern s32 D_80137F9C; +extern const char* D_80138784[487]; extern s32 D_80138F20; extern s32 D_80138F28; extern s32 D_80138F7C; @@ -696,11 +747,9 @@ extern s16 D_8013901C; extern u8 D_80139020; extern s8 D_801390C4; extern u8 D_801390D8; -extern s16 D_801390DC; -extern s16 D_801390DE; -extern s16 D_801390E0; +extern Unkstruct_801390DC D_801390DC[]; extern u16 D_801396E4; -extern u16 D_801396E6; +extern MultiType D_801396E6; extern u16 D_801396E8; extern s16 D_801396EA; extern u16 D_801396F4; @@ -710,36 +759,48 @@ extern s32 D_8013980C; extern u8 D_80139810; extern s32 D_80139828[]; extern s32 D_80139834[]; - extern s16 D_80139A70; extern s16 D_8013AE8C; +extern s16 D_8013AE84[]; +extern s16 D_8013AEA0[]; +extern s16 D_8013AE94; extern s32 D_8013AE9C; extern s16 D_8013AED4[]; extern s16 g_volumeL; extern s16 g_volumeR; extern s16 D_8013B698; +extern s16 D_8013AEE0; extern u8 D_8013AEEC; extern s32 D_8013B158; extern s32 D_8013B3D0; extern s16 D_8013B3E8[]; extern s32 D_8013B5E8; +extern s8 D_8013B5EC[]; +extern s8 D_8013B614[]; extern s32 D_8013B61C; +extern s16 D_8013B620[]; +extern s32 D_8013B628[]; +extern s16 D_8013B648[]; extern s16 D_8013B650[]; extern s16 D_8013B658; extern s32 D_8013B660; extern s16 D_8013B664; extern s16 D_8013B668; +extern s16 D_8013B66C[]; extern u8 D_8013B680; extern s8 D_8013B684; extern s8 D_8013B690; extern s32 D_8013B694; -extern const char* D_80138784[487]; +extern void (*D_8013C00C)(void); extern void (*D_80170000)(void); extern ImgSrc* g_imgUnk8013C200; extern ImgSrc* g_imgUnk8013C270; extern s32 D_801EC000[]; -s32 func_80019444(); +void SetRoomForegroundLayer(s32 /* ? */); +void SetRoomBackgroundLayer(s32 /* ? */, s32 /* ? */); +void PlaySfx(s16 sfxId); +s32 func_80019444(void); void func_8002A09C(void*); void func_800E346C(void); void func_800E34A4(s8 arg0); @@ -747,27 +808,38 @@ void func_800E34DC(s32 arg0); void func_800E4124(s32 arg0); void func_800E8D24(void); void func_800E8DF0(void); +s32 func_800E912C(void); +s32 func_800E9208(void); +void func_800E928C(void); void func_800E92E4(void); void func_800E92F4(void); void func_800EA5E4(s32); void func_800EA538(s32); +void func_800EAD7C(void); +void func_800EAEEC(void); void func_800EB534(u16, u16, s32); +void func_800ECE2C(void); void func_800EDA70(s32* arg0); +void func_800EDA94(void); void func_800EDAE4(void); s16 func_800EDC80(u8 arg0, s32 arg1); s32 func_800EDD9C(u8 arg0, s32 arg1); +void func_800EFBF8(void); void FreePolygons(s32 index); +void func_800F0334(s32); s32 func_800F087C(u32, u32); bool SetNextRoomToLoad(u32 chunkX, u32 chunkY); +void func_800F180C(s32, s32, void*); +void func_800F1868(s32, s32, void*); void func_800F1EB0(s32, s32, s32); void func_800F2120(void); void func_800F223C(void); void func_800F4994(void); +s32 func_800F4D38(s32, s32); void func_800F4F48(void); void func_800F4FD0(void); bool IsAlucart(void); s32 SquareRoot12(s32, s32); -void TestEvent(s32); void func_800F53A4(void); bool ScissorSprite(SPRT* arg0, MenuContext* arg1); void func_800F5904(void*, s32 x, s32 y, s32 w, u32 h, s32 u, s32 v, s32 unk1, @@ -791,9 +863,10 @@ u8* func_800FD744(s32 arg0); u8* func_800FD760(s32 arg0); s32 func_800FD77C(s32 arg0, s32 arg1); bool func_800FD7C0(s32, s32); -; void func_800FD874(u16 arg0, s32 arg1); +s16 func_800FDB18(s32, s32); void func_800FDE00(void); +void func_800FE3C4(Unkstruct_8011A290*, s32, s32); void func_800FF0A0(s32 arg0); void func_80102DEC(s32 arg0); void func_80103EAC(void); @@ -804,12 +877,20 @@ void func_80107250(POLY_GT4* poly, s32 arg1); void func_80107360(POLY_GT4* poly, s32 x, s32 y, s32 width, s32 height, s32 u, s32 v); void func_801073C0(void); +void func_801092E8(s32); void SetPolyRect(POLY_GT4* poly, s32 x, s32 y, s32 width, s32 height); void func_8010D584(s16 arg0); +void func_8010DFF0(s32, s32); void func_8010E0A8(void); void func_8010E0B8(void); +void func_8010E470(s32, s32); +void func_8010E83C(s32 arg0); void func_80111928(void); -void func_8011AAFC(Entity* entity, s32, s32); +void func_80111CC0(void); +void func_80118894(Entity*); +void func_80118C28(s32 arg0); +s32 func_80111D24(void); +Entity* func_8011AAFC(Entity* entity, s32, s32); void func_80131EBC(const char* str, s16 arg1); void func_80131ED8(s32 value); void func_80131EE8(void); @@ -818,8 +899,8 @@ s32 func_80131F28(void); u16 func_80131F38(void); bool func_80131F68(void); s16 func_80131F94(void); -void func_8013216C(); -void func_801321FC(); +void func_8013216C(void); +void func_801321FC(void); void func_80132134(void); s32 func_80132264(void); s32 func_801326D8(void); @@ -828,7 +909,7 @@ void func_80132760(void); void func_801337B4(void); s32 func_80133940(void); s32 func_80133950(void); -void func_80133FCC(); +void func_80133FCC(void); void func_8013415C(void); void func_801361F8(void); #endif diff --git a/include/main.h b/include/main.h index 5c8b6a4dd..b0d17fd90 100644 --- a/include/main.h +++ b/include/main.h @@ -1,6 +1,8 @@ #ifndef MAIN_H #define MAIN_H #include +#include +#include #include #include #include diff --git a/include/objects.h b/include/objects.h index 1260edb13..a1169e9a5 100644 --- a/include/objects.h +++ b/include/objects.h @@ -21,5 +21,6 @@ typedef enum { /* 0x0C */ ENTITY_COLLECTABLE, /* 0x0D */ ENTITY_ENEMY_BLOOD, /* 0x0E */ ENTITY_0E, - /* 0x0F */ ENTITY_0F + /* 0x0F */ ENTITY_0F, + /* 0x13 */ ENTITY_13 = 0x13 } SotnEntityIds; \ No newline at end of file diff --git a/include/psxsdk/libapi.h b/include/psxsdk/libapi.h index 072aceca1..a59b0fc0c 100644 --- a/include/psxsdk/libapi.h +++ b/include/psxsdk/libapi.h @@ -18,12 +18,43 @@ extern long Load(char*, struct EXEC*); extern long Exec(struct EXEC*, long, char**); // GPU_cw extern void _bu_init(void); -extern long open(char*, unsigned long); + +/* + * Opens a device for low-level input/output and returns + * the descriptor. Returns -1 on failure. + */ +extern long open(char* devname, // Pointer to a filename + int flag // Open mode +); + extern long lseek(long, long, long); -extern long read(long, void*, long); + +/* + * Reads n bytes from the descriptor + * fd to the are specified by buf. + * Returns the actual number of bytes + * read into the are. An error returns -1 + */ +extern long read(long fd, // File descriptor + void* buf, // Pointer to read buffer address + long n // Number of bytes to read +); extern long write(long, void*, long); -extern long close(long); -extern long format(char*); + +/* + * Close releases the file descriptor. + * fd is returned when successful, and -1 in all other cases. + */ +extern int close(int fd // File descriptor +); + +/* + * Initializes the file system + * Returns 1 if successful, 0 in all other cases. + */ +extern long format(char* fs // File system name +); + extern struct DIRENTRY* firstfile(char*, struct DIRENTRY*); extern struct DIRENTRY* nextfile(struct DIRENTRY*); extern long erase(char*); @@ -34,7 +65,15 @@ int PAD_init(s32 /*??*/, s32* /*??*/); // PAD_dr extern void FlushCache(void); extern void DeliverEvent(unsigned long, unsigned long); -extern long TestEvent(long); + +/* + * Checks to see whether or not the event specified by the descriptor + * event has occurred. If so, the function restores the event state to + * EvStACTIVE. + * Returns 1 if the event is found to have occurred, 0 otherwise. + */ +extern long TestEvent(unsigned long event // Event descriptor +); extern long OpenEvent(unsigned long, long, long, long (*func)()); extern long EnableEvent(long); // ChangeClearRCnt diff --git a/include/psxsdk/libc.h b/include/psxsdk/libc.h index 4c75a122a..8552daa46 100644 --- a/include/psxsdk/libc.h +++ b/include/psxsdk/libc.h @@ -6,8 +6,13 @@ extern char* strcpy(char*, char*); extern int strlen(char*); extern void* memcpy(unsigned char*, unsigned char*, int); extern void* memset(unsigned char*, unsigned char, int); + +/* + * Returns a pseudo-random number from 0 to RAND_MAX (0x7FFF=32767). + */ extern int rand(void); extern void srand(unsigned int); -extern void* malloc(size_t); +extern void* malloc(size_t // Size of memory block to be allocated +); extern void free(void*); -int printf(char*, ...) +int printf(char*, ...); diff --git a/include/psxsdk/libgpu.h b/include/psxsdk/libgpu.h index 8e18c83f3..d8af88720 100644 --- a/include/psxsdk/libgpu.h +++ b/include/psxsdk/libgpu.h @@ -180,6 +180,13 @@ typedef struct { /* 0x04 */ u_long code[2]; } DR_MODE; /* Drawing Mode, size = 0x0C */ +typedef struct PixPattern { + u8 w; + u8 h; + u8 x; + u8 y; +} PixPattern; + // clang-format off /* @@ -189,7 +196,7 @@ typedef struct { * represents the number of pixels, not the actual size of the transfer area in * the frame buffer. */ -extern u_short LoadTPage(u_long* pix, // Pointer to texture pattern start address +extern u_short LoadTPage(PixPattern* pix, // Pointer to texture pattern start address int tp, // Bit depth (0 = 4-bit; 1 = 8-bit; 2 = 16-bit) int abr, // Semitransparency rate int x, int y, // Destination frame buffer address @@ -198,13 +205,6 @@ extern u_short LoadTPage(u_long* pix, // Pointer to texture pattern start addre // clang-format on -typedef struct PixPattern { - u8 w; - u8 h; - u8 x; - u8 y; -} PixPattern; - extern void AddPrim(void* ot, void* p); extern void SetShadeTex(void* p, int tge); extern void SetPolyGT3(POLY_GT3* p); diff --git a/include/types.h b/include/types.h index c4653e857..ff7a98685 100644 --- a/include/types.h +++ b/include/types.h @@ -12,7 +12,7 @@ typedef unsigned long long uint64_t; typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_long; - +typedef unsigned int size_t; typedef signed char s8; typedef signed short s16; typedef signed int s32; @@ -24,8 +24,8 @@ typedef unsigned long long u64; typedef float f32; typedef double f64; -typedef int bool; -enum { false, true }; +typedef signed char byte; +typedef enum { false, true } bool; #ifndef NULL #define NULL (0) diff --git a/include/unkstruct.h b/include/unkstruct.h index 565713f26..0a764ed4c 100644 --- a/include/unkstruct.h +++ b/include/unkstruct.h @@ -5,9 +5,9 @@ */ typedef struct unkstruct_80072FA0 { - /* 0x00 */ char unk0[0x4]; + /* 0x00 */ char pad0[0x4]; /* 0x04 */ u16 unk4; - /* 0x08 */ char unk8[0x6]; + /* 0x08 */ char pad8[0x6]; } unkstruct_80072FA0; // size = 0xC typedef struct unkStruct_800A872C { @@ -15,10 +15,22 @@ typedef struct unkStruct_800A872C { /* 0x04 */ char unk4[0xC]; } unkStruct_800A872C; // size = 0x10 +typedef struct Unkstruct_8003C794 { + /* 0x00 */ s32 unk00; + /* 0x04 */ s32 unk04; +} Unkstruct_8003C794; + +typedef struct Unkstruct_800ECE2C_sub { + /* 0x00 */ s32 unk00[2]; + /* 0x08 */ char pad8[0x28]; +} Unkstruct_800ECE2C_sub; // size = 0x30 + typedef struct Unkstruct_800ECE2C { - /* 0x00 */ s32 unk0; - /* 0x04 */ s32 unk4; - /* 0x08 */ u8 pad8[0x30 - 0x8]; + /* 0x00 */ s32 unk00; + /* 0x04 */ char unk04[0x38]; + /* 0x3C */ s32 unk3C; + /* 0x40 */ char unk40[0x14]; + /* 0x54 */ Unkstruct_800ECE2C_sub unk54[16]; } Unkstruct_800ECE2C; typedef struct Unkstruct_80137638 { @@ -29,19 +41,19 @@ typedef struct Unkstruct_80137638 { typedef struct Unkstruct_800A4B12 { /* 0x00 */ u8 unk0; - /* 0x01 */ char unk1[0x34 - 0x1]; -} Unkstruct_800A4B12; + /* 0x01 */ char pad1[0x33]; +} Unkstruct_800A4B12; // size = 0x34 typedef struct Unkstruct_80086FFA { /* 0x00 */ u16 unk0; - /* 0x02 */ char unk2[0x32]; + /* 0x02 */ char pad2[0x32]; } Unkstruct_80086FFA; // size = 0x34 typedef struct Unkstruct_80138094 { /* 0x00 */ s32 unk0; /* 0x04 */ s32 unk4; - char pad[12]; -} Unkstruct_80138094; + /* 0x08 */ char pad8[0xC]; +} Unkstruct_80138094; // size = 0x14 typedef struct Unkstruct_80138FB4 { /* 0x00 */ s32 unk0; @@ -54,7 +66,94 @@ typedef struct Unkstruct_80137990 { /* 0x00 */ s32 unk0; } Unkstruct_80137990; -typedef struct struct_8013B15C { +typedef struct Unkstruct_8013B15C { /* 0x000 */ s32 unk000; - /* 0x004 */ char unk008[0x274]; -} struct_8013B15C; // size = 0x278 \ No newline at end of file + /* 0x004 */ char pad004[0x274]; +} Unkstruct_8013B15C; // size = 0x278 + +typedef struct Unkstruct_8006C3CC { + /* 0x00 */ u16 unk0; + /* 0x02 */ char pad2[0x6]; + /* 0x8 */ u16 unk8; + /* 0xA */ char padA[0x36]; +} Unkstruct_8006C3CC; // size = 0x40 + +typedef struct Unkstruct_8011A290 { + /* 0x00 */ u16 sp10; + /* 0x02 */ char pad2[0x2]; + /* 0x04 */ u16 sp14; + /* 0x06 */ char pad6[0x1]; + /* 0x07 */ u8 sp17; + /* 0x08 */ u16 sp18; + /* 0x0A */ char padA[0x2]; + /* 0x0C */ u16 sp1C; + /* 0x0E */ u16 sp1E; + /* 0x10 */ u8 sp20; + /* 0x11 */ char pad11[0x1]; + /* 0x12 */ u16 sp22; +} Unkstruct_8011A290; + +typedef struct { + /* 0x00 */ s32 sp10; + /* 0x04 */ s32 sp14; + /* 0x08 */ s32 sp18; + /* 0x0C */ s32 sp1C; + /* 0x10 */ s32 sp20; + /* 0x14 */ s16 sp24; + /* 0x18 */ s16 sp26; + /* 0x1C */ s16 sp28; + /* 0x20 */ s16 sp2A; + /* 0x24 */ s32 sp2C; + /* 0x28 */ s32 sp30; +} Unkstruct7; // size = 0x2C + +typedef struct Unkstruct_8011A328 { + /* 0x00 */ char pad0[0xD]; + /* 0x0D */ s8 sp1D; + /* 0x0E */ s16 sp1E; + /* 0x10 */ s16 sp20; + /* 0x12 */ s16 sp22; + /* 0x14 */ s16 sp24; + /* 0x16 */ s16 sp26; + /* 0x18 */ s16 sp28; +} Unkstruct_8011A328; + +typedef struct Unkstruct_800ACEC6 { + /* 0x00 */ s16 unk0; /* D_800ACEC6 */ + /* 0x02 */ char pad2[0xE]; + /* 0x10 */ s16 unk10; /* D_800ACED6 */ + /* 0x12 */ char pad12[0x8]; + /* 0x1A */ s16 unk1A; /* D_800ACEE0 */ + /* 0x1C */ s16 unk1C; /* D_800ACEE2 */ +} Unkstruct_800ACEC6; + +typedef struct Unkstruct_8010BF64 { + /* 0x00 */ char pad0[0x14]; + /* 0x14 */ s32 unk14; + /* 0x18 */ s32 unk18; + /* 0x1C */ s32 unk1C; + /* 0x20 */ s32 unk20; +} Unkstruct_8010BF64; + +// related to SFX +typedef struct Unkstruct_801390DC { + /* 0x00 */ u16 unk00; + /* 0x02 */ u16 unk02; + /* 0x04 */ u16 unk04; +} Unkstruct_801390DC; + +typedef struct Unkstruct_800FD5BC { + /* 0x00 */ s32 arg0; + /* 0x04 */ s32 arg4; + /* 0x08 */ s32 arg8; +} Unkstruct_800FD5BC; + +typedef struct Unkstruct_80128BBC_Sub { + /* 0x00 */ u8 unk00[3]; + /* 0x03 */ char unk03[9]; +} Unkstruct_80128BBC_Sub; + +typedef struct Unkstruct_80128BBC { + /* 0x00 */ char unk00[4]; + /* 0x04 */ Unkstruct_80128BBC_Sub unk04[4]; +} Unkstruct_80128BBC; \ No newline at end of file diff --git a/src/dra/42398.c b/src/dra/42398.c index 9c35e01b2..30a7969c2 100644 --- a/src/dra/42398.c +++ b/src/dra/42398.c @@ -17,7 +17,6 @@ s32 func_8010E27C(void); void func_801324B4(s8 s_num, s16 arg1, s16 arg2); s32 func_80136010(void); void func_801353A0(void); -void func_800F9808(s32); void func_801026BC(s32); void func_8010E390(s32); @@ -233,7 +232,23 @@ void func_800E493C(void) { } } -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800E4970); +void func_800E4970(void) { + func_800E4124(4); + D_80073060 = 2; + ClearBackbuffer(); + func_800E3574(); + func_800EAD7C(); + func_801065F4(0); + func_800EDA94(); + func_800EA538(0); + func_800ECE2C(); + func_800EAEEC(); + func_800EDAE4(); + PlaySfx(0x12); + PlaySfx(0xB); + func_80132760(); + func_800E493C(); +} void func_800E4A04(void) { s32 a[3]; } @@ -260,7 +275,7 @@ extern unkStruct_800A872C D_800A872C[]; s32 func_800E6300(void) { s32 i; - for (i = 0; i < 0x1E; i++) { + for (i = 0; i < 30; i++) { if ((D_800A872C[i].unk0 > 0) && ((D_80097964[i] & 2) != 0)) { return D_800A872C[i].unk0; } @@ -302,19 +317,16 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800E7E08); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800E81FC); void func_800E8D24(void) { - s8* phi_v1; - s32 phi_v0; - s8 a0; + s8* ptr; + s32 i; D_80097496 = 0; - phi_v1 = &D_80137460; - a0 = 0x10; - phi_v0 = 0xF; - do { - *phi_v1 = a0; - phi_v1 += 1; - phi_v0--; - } while (phi_v0 >= 0); + ptr = &D_80137460; + + for (i = 0; i < 16; i++) { + *ptr = 0x10; + ptr++; + } } // https://decomp.me/scratch/YhofM @@ -353,7 +365,20 @@ void ReadPads(void) { INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800E8EE4); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800E908C); +s32 func_800E908C(void) { + if (TestEvent(D_80073068) == 1) { + return 1; + } else if (TestEvent(D_8007306C) == 1) { + return 2; + } else if (TestEvent(D_80073070) == 1) { + return 3; + } else if (TestEvent(D_80073078) == 1) { + return 4; + } else if (D_80137470-- < 0) { + return 2; + } + return 0; +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800E912C); @@ -382,7 +407,7 @@ void func_800E92F4(void) { INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800E930C); -extern struct_8013B15C D_8013B15C[]; +extern Unkstruct_8013B15C D_8013B15C[]; s32 func_800E9508(s32 arg0) { s32 temp = D_8013B15C[arg0].unk000; @@ -393,23 +418,79 @@ s32 func_800E9508(s32 arg0) { INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800E9530); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800E9610); +int sprintf(char* str, const char* format, ...); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800E9640); +s32 func_800E9640(s32 arg0, s32 arg1, s32 arg2, s32* readBufferAddress, + s32 fd) { + char file[32]; + s32 nBytes; + s32 ret; + + sprintf(file, &aBu1d1dS, arg0, arg1, arg2); + nBytes = fd << 0xD; + + if (fd == 0) { + nBytes = 0x2B8; + } + + fd = open(file, 0x8001); + ret = -1; + + if (fd != (-1)) { + D_80137474 = fd; + func_800E91B0(); + read(fd, readBufferAddress, nBytes); + ret = 0; + } + return ret; +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800E96E8); s32 func_800E97BC(s32 arg0, s32 arg1, s32 arg2) { char buffer[0x20]; - fprintf(buffer, &aBu1d1dS, arg0, arg1, arg2); + sprintf(buffer, &aBu1d1dS, arg0, arg1, arg2); return -(erase(buffer) == 0); } -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800E9804); +s32 func_800E9804(s32 arg0) { + s32 funcRet = func_800E912C(); + s32 ret = 0; + + if (funcRet != 0) { + close(D_80137474); + if (funcRet == 1) { + D_8006C3AC |= funcRet << arg0; + return 1; + } + ret = -3; + return ret; + } + return ret; +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800E9880); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800E9B18); +s32 func_800E9B18(s32 arg0, s32 arg1) { + char sp10; + s32 ret; + + D_8006C3AC &= D_800A0510[arg0]; + sprintf(&sp10, &aBu1d1d, arg0, arg1); + func_800E928C(); + format(&sp10); + ret = func_800E9208(); + + if (ret != 1) { + if (ret == 3) { + ret = -1; + } else { + ret = -3; + } + } + return ret; +} // https://decomp.me/scratch/kHOQh match with struct @@ -430,7 +511,7 @@ void func_800E9BDC(u8* arg0, s32 arg1) { s32 i; u8* var_a1; - var_a1 = D_800A1F18[arg1]; + var_a1 = (u8*)D_800A1F18[arg1]; for (i = 0; i < 384; i++) { *arg0 = *var_a1; @@ -445,7 +526,35 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800EA2B0); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800EA48C); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800EA538); +extern Unkstruct_8006C3CC D_8006C3CC[]; + +void func_800EA538(s32 arg0) { + Unkstruct_8006C3CC* var_v0; + s32 temp; + s32 v1; + s32 i; + + // !FAKE: 0x8000 inside a temp is weird + temp = 0x8000; + v1 = (temp >> (arg0 - 1)); + + if (arg0 != 0) { + for (i = 0; i < 32; i++) { + if (v1 & D_8006C3CC[i].unk0) { + D_8006C3CC[i].unk0 = 0; + } + } + return; + } + + D_8003C0F8 = 0; + var_v0 = (Unkstruct_8006C3CC*)&D_8006C3C4; + + for (i = 0; i < 32; i++) { + var_v0->unk8 = 0; + var_v0++; + } +} void func_800EA5AC(u16 arg0, u8 arg1, u8 arg2, u8 arg3) { D_8003C0EC[3] = arg0; @@ -467,7 +576,8 @@ s32 func_800EAD0C(void) { // the return type is needed for matching func_800EA5E4(7); func_800EA5E4(8); - if ((g_CurrentPlayableCharacter == 0) && (g_mapProgramId != PROGRAM_ST0)) { + if ((g_CurrentPlayableCharacter == PLAYER_ALUCARD) && + (g_mapProgramId != PROGRAM_ST0)) { func_800EA5E4(0x17); } } @@ -492,7 +602,7 @@ void func_800EAEA4(void) { } void func_800EAEEC(void) { - unkstruct_80072FA0* var_v1 = &D_80072FA0; + unkstruct_80072FA0* var_v1 = &D_80072FA0[0]; s32 i; for (i = 0; i < 16; i++, var_v1++) { @@ -504,7 +614,18 @@ void func_800EAEEC(void) { INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800EAF28); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800EAFC8); +void func_800EAFC8(s32 arg0) { + u8 temp = arg0; + + if (D_80137584 == 0) { + D_80137584 = 1; + *D_8013757C = temp; + } else { + D_80137584 = 0; + *D_8013757C += arg0 * 16; + D_8013757C++; + } +} u32 func_800EB03C(void) { u8 temp_v1; @@ -542,8 +663,8 @@ void func_800EB6B4(void) { // https://decomp.me/scratch/n0Z3p match with -fforce-addr bool func_800EB720(void) { - s32 i; unkstruct_80072FA0* temp = D_80072FA0; + s32 i; for (i = 0; i < 0x10; i++) { if (temp[i].unk4 != 0) { @@ -577,15 +698,14 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800EBBAC); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800ECBF8); -extern s32 D_800730A0; -extern Unkstruct_800ECE2C D_800730F4[]; +extern Unkstruct_800ECE2C D_800730A0; void func_800ECE2C(void) { s32 i; - D_800730A0 = 0; + D_800730A0.unk00 = 0; for (i = 0; i < 16; i++) { - D_800730F4[i].unk0 = 0; + D_800730A0.unk54[i].unk00[0] = 0; } } @@ -595,7 +715,18 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", SetRoomForegroundLayer); INCLUDE_ASM("asm/dra/nonmatchings/42398", SetRoomBackgroundLayer); -INCLUDE_ASM("asm/dra/nonmatchings/42398", LoadRoomLayer); +extern Unkstruct_8003C794* D_8003C794; + +void LoadRoomLayer(s32 arg0) { + s32 i; + + SetRoomForegroundLayer(D_8003C794[arg0].unk00); + SetRoomBackgroundLayer(0, D_8003C794[arg0].unk04); + + for (i = 1; i < 16; i++) { + D_800730A0.unk54[i].unk00[0] = 0; + } +} void func_800EDA70(s32* context) { s32 i; @@ -611,7 +742,7 @@ void func_800EDA94(void) { s32 i; i = 0; - poly = &D_80086FEC; + poly = D_80086FEC; for (; i < 1280; i++) { func_800EDA70((s32*)poly); @@ -745,7 +876,26 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F0334); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F04A4); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F0578); +void func_800F0578(s32 arg0) { + D_80137590 = (s32*)0x801E8000; + *((s32*)0x801E8000) = 0; + + func_800EFBF8(); + + switch (arg0) { + case 0: + case 2: + func_800F0334(arg0); + D_80097914 = arg0 == 0 ? 1 : 4; + break; + + case 1: + D_80097914 = 2; + + default: + break; + } +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F0608); @@ -756,22 +906,18 @@ typedef struct { extern Unkstruct_800F087C D_800A297C; s32 func_800F087C(u32 chunkX, u32 chunkY) { - s32 temp_a0; - s32 temp_v1; Unkstruct_800F087C* phi_s1; Unkstruct_800F087C* phi_s0; phi_s1 = &D_800A297C; phi_s0 = (Unkstruct_800F087C*)((u32*)&D_800A297C + 4); loop_1: - temp_v1 = phi_s1->foo[0]; - if (temp_v1 == 0x80) + if (phi_s1->foo[0] == 0x80) return 0; - if (temp_v1 == chunkX && phi_s0->foo[-3] == chunkY && + if (phi_s1->foo[0] == chunkX && phi_s0->foo[-3] == chunkY && phi_s0->foo[-2] == g_mapProgramId) { - temp_a0 = phi_s0->foo[-1]; - if (temp_a0 == 0xFF || func_800FD4C0(temp_a0, 0) == 0) + if (phi_s0->foo[-1] == 0xFF || func_800FD4C0(phi_s0->foo[-1], 0) == 0) return phi_s0->foo[0] + 2; } @@ -818,7 +964,17 @@ loop_3: INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F0CD8); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F1424); +void func_800F1424(void) { + if (D_8009749C[0] & 8) { + D_800730A0.unk00 ^= 2; + } + if (D_8009749C[0] & 4) { + D_800730A0.unk00 ^= 1; + } + if ((D_8009749C[0] & 1) && (D_800730A0.unk3C != 0)) { + D_800730A0.unk54[0].unk00[0] ^= 1; + } +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F14CC); @@ -864,7 +1020,20 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F180C); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F1868); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F18C4); +void func_800F18C4(s32 arg0, s32 arg1) { + s8 sp10[20]; + s32 i; + s32 j; + + func_800F180C(arg0, arg1, &sp10); + + for (i = 0; i < 4; i++) { + for (j = 0; j < 5; j++) { + func_800F1770(sp10, j, i, 0); + } + } + func_800F1868(arg0, arg1, &sp10); +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F1954); @@ -952,17 +1121,15 @@ block_18: INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F2658); -s32 func_800F27F4(s32 arg0) { +bool func_800F27F4(s32 arg0) { if (arg0 == 0) { - if ((D_800973FC == 0) && (D_8006BB00 == 0) && (!(D_8003C708 & 0x60))) { - D_801375C8 = 1; - return true; - } else { + if (D_800973FC != 0 || D_8006BB00 != 0 || (D_8003C708 & 0x60)) { return false; } - } else { - D_801375C8 = 8; + D_801375C8 = 1; + return true; } + D_801375C8 = 8; } INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F2860); @@ -982,7 +1149,14 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F4994); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F4D38); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F4F48); +void func_800F4F48(void) { + s32 i; + + for (i = 0; i < 2; i++) { + player_equip_head[i + 7] = + func_800F4D38(player_equip_head[i], player_equip_head[1 - i]); + } +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F4FD0); @@ -1284,9 +1458,8 @@ void func_800F6568(MenuContext* arg0) { // Draw equip menu cursor void func_800F6618(s32 menuContextIndex, s32 bColorMode) { - s32 temp_v1; s32 r; - MenuContext* context = &D_8013761C[menuContextIndex * 0x1E]; + MenuContext* context = (MenuContext*)&D_8013761C[menuContextIndex * 0x1E]; if (bColorMode != 0) { r = 0x80; @@ -1297,7 +1470,7 @@ void func_800F6618(s32 menuContextIndex, s32 bColorMode) { r = 0x5F - (g_blinkTimer & 0x1F); } } - DrawMenuRect(context, 0x70, (g_menuRelicsCursorIndex * 0xD) + 0x1C, 0x71, + DrawMenuRect(context, 0x70, (*g_menuRelicsCursorIndex * 0xD) + 0x1C, 0x71, 0xB, r, 0, 0); } @@ -1422,7 +1595,17 @@ u8 func_800F7218(u16 arg0, u16 arg1) { } } -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F7244); +void func_800F7244(void) { + s32 i; + + g_someValue = D_80097C1C[0]; + D_80137930 = D_80097C20; + D_80137934 = D_80097C24; + + for (i = 0; i < 4; i++) { + D_80137938[i] = D_80097C1C[i - 0x19] + D_80097C1C[i - 0x15]; + } +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F72BC); @@ -1723,12 +1906,26 @@ void func_800F9690(void) { INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F96F4); void func_800F97DC(void) { - D_8013794C = &D_8007EFE4; + D_8013794C = (s8*)&D_8007EFE4; D_80137950 = 0x180; D_80137954 = 0; } -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F9808); +void func_800F9808(u32 arg0) { + s32 temp_s0; + s32 i; + PixPattern* oldPos; + + temp_s0 = (arg0 == 2) ? 32 : 0; + arg0 = func_800F548C(arg0); + oldPos = (PixPattern*)D_8013794C; + + for (i = 0; i < ((temp_s0 + 0x100) * 8); i++) { + *D_8013794C++ = 0; + } + + LoadTPage(oldPos, 0, 0, 0x180, arg0, temp_s0 + 256, 16); +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800F98AC); @@ -1820,9 +2017,34 @@ void func_800FAC48(void) { void func_800FAC98(void) { func_800F9808(2); } -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800FACB8); +bool func_800FACB8(void) { + if (D_80097494 & 2) { + (*g_menuRelicsCursorIndex)++; + if (*g_menuRelicsCursorIndex == 7) { + *g_menuRelicsCursorIndex = 0; + } + return true; + } + if (D_80097494 & 1) { + g_menuRelicsCursorIndex[0]--; + if (*g_menuRelicsCursorIndex == -1) { + *g_menuRelicsCursorIndex = 6; + } + return true; + } + return false; +} -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800FAD34); +void func_800FAD34(s32 arg0, u8 arg1, u16 arg2, u16 arg3) { + D_80137608 = 0; + func_800F9808(2); + + if (arg1) { + D_80137608 = 1; + func_800F99B8(arg0, 2, 0); + func_800EB534(arg2, arg3, 0x1F); + } +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800FADC0); @@ -1866,7 +2088,30 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800FD39C); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800FD4C0); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800FD5BC); +s32 func_800FD5BC(Unkstruct_800FD5BC* arg0) { + s32 temp; + + if (arg0->arg4 != 5) { + if (((u32)arg0->arg4) >= 0x10U) { + temp = g_playerHp.max; + if (g_playerHp.max < 0) { + temp += 7; + } + arg0->arg8 = temp >> 3; + } else if (g_playerHp.max >= (arg0->arg8 * 0x14)) { + arg0->arg4 = 3; + } else { + arg0->arg4 = 2; + } + } + if (g_playerHp.current <= arg0->arg8) { + g_playerHp.current = 0; + return 1; + } else { + g_playerHp.current -= arg0->arg8; + return 0; + } +} s32 func_800FD664(s32 context) { s32 phi_a0 = context; @@ -1985,6 +2230,7 @@ bool func_800FDC94(s32 arg0) { } } +// https://decomp.me/scratch/5ufgy INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800FDCE0); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800FDD44); @@ -2047,7 +2293,7 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_800FE97C); // !FAKE: explicitly casting two pointers to s32 // before comparing them, that's weird void func_800FEE6C(void) { - s32* var_v1 = &D_80139828; + s32* var_v1 = D_80139828; do { if (*var_v1 != 0) { @@ -2267,47 +2513,33 @@ bool func_8010183C(s32 arg0) { } return true; } - -#ifndef NON_MATCHING -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010189C); -#else -extern u8 D_800A2EE8[]; -extern u8 D_800A2EED; -extern u8 D_800A2EF8[]; -extern u8 D_800A2EFD; -extern u8 D_800A2F08[]; -extern u8 D_800A2F18[]; -extern u8 D_800A2F28[]; -extern u8 D_800A2F2D; -extern u8 D_800A2F38[]; -extern u8 D_800A2F3D; -extern u16 D_800A2F48[]; -extern u16 D_800A2F64[]; -extern s32 D_8013796C; -extern s32 D_80137970; -extern s32 D_80137998; +void DrawHudRichter(void); void func_8010189C() { POLY_GT4* poly; s32 i; + u16* new_var; D_8013B5E8 = 0; D_80137998 = 0; - D_8013796C = g_playerHp; - if (g_mapProgramId == PROGRAM_ST0 || g_CurrentPlayableCharacter != 0) { + D_8013796C = g_playerHp.current; + + if ((g_mapProgramId == PROGRAM_ST0) || + (g_CurrentPlayableCharacter != PLAYER_ALUCARD)) { DrawHudRichter(); return; } - D_80137970 = func_800EDD9C(4U, 14); + D_80137970 = func_800EDD9C(4, 14); poly = &D_80086FEC[D_80137970]; - i = 0; + if (poly != NULL) { - do { + for (i = 0; poly != NULL; i++) { func_80107360(poly, D_800A2EE8[i], D_800A2EF8[i], D_800A2F28[i], D_800A2F38[i], D_800A2F08[i], D_800A2F18[i]); poly->tpage = 0x1F; - poly->clut = D_800A2F48[i]; + new_var = &D_800A2F48[i]; + poly->clut = *new_var; poly->pad2 = 0x1F0; poly->pad3 = D_800A2F64[i]; @@ -2323,15 +2555,13 @@ void func_8010189C() { if (i == 1) { poly->p1 = 0; poly->p2 = rand() + 8; - poly->p3 = (rand() & 7) + 1; + poly->p3 = (7 & rand()) + 1; } - poly = poly->tag; - i++; - } while (poly != NULL); + poly = (POLY_GT4*)poly->tag; + } } } -#endif INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80101A80); @@ -2341,7 +2571,30 @@ extern Unkstruct_80086FFA D_80086FFA[]; u16 func_801025F4(void) { return D_80086FFA[D_8013799C].unk0; } -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80102628); +void func_80102628(s32 arg0) { + POLY_GT4* poly; + s32 temp; + s32 i = 0; + + poly = &D_80086FEC[D_8013799C]; + + if (poly != NULL) { + temp = arg0 / 2; + while (poly != NULL) { + poly->y0 = 0; + poly->u0 = (u8)temp; + poly->v0 = 0xF0; + poly->b0 = 0; + poly->g0 = 0; + poly->r0 = 0; + poly->pad2 = 0x1FD; + poly->pad3 = 8; + poly->x0 = temp * (i & 1); + poly = (POLY_GT4*)poly->tag; + i++; + } + } +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_801026BC); @@ -2380,7 +2633,35 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80102E04); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80102EB8); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_801030B4); +void func_801030B4(s32 arg0, unkStruct3* unkstruct3, s32 arg2) { + s32 var_v1; + + if (arg2 == arg0) { + if (g_blinkTimer & 0x20) { + var_v1 = (g_blinkTimer & 0x1F) + 0x60; + } else { + var_v1 = 0x7F - (g_blinkTimer & 0x1F); + } + + unkstruct3->unk4 = unkstruct3->unk10.data1.unk0 = var_v1 - 0x10; + unkstruct3->unk1C.data1.unk0 = unkstruct3->unk28 = var_v1 + 0x10; + unkstruct3->unk2A = 0; + unkstruct3->unk1E.data1.unk0 = 0; + unkstruct3->unk12.data1.unk0 = 0; + unkstruct3->unk6 = 0; + unkstruct3->unk32 = 0x404; + } else { + unkstruct3->unk12.data1.unk0 = 0x60; + unkstruct3->unk6 = 0x60; + unkstruct3->unk2A = 0x80; + unkstruct3->unk1E.data1.unk0 = 0x80; + unkstruct3->unk28 = 0; + unkstruct3->unk1C.data1.unk0 = 0; + unkstruct3->unk10.data1.unk0 = 0; + unkstruct3->unk4 = 0; + unkstruct3->unk32 = 0x415; + } +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80103148); @@ -2441,7 +2722,30 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80106A28); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010715C); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_801071CC); +void func_801071CC(POLY_GT4* poly, u8 arg1, s32 arg2) { + switch (arg2) { + case 0: + poly->b0 = arg1; + poly->g0 = arg1; + poly->r0 = arg1; + break; + case 1: + poly->b1 = arg1; + poly->g1 = arg1; + poly->r1 = arg1; + break; + case 2: + poly->b2 = arg1; + poly->g2 = arg1; + poly->r2 = arg1; + break; + case 3: + poly->b3 = arg1; + poly->g3 = arg1; + poly->r3 = arg1; + break; + } +} void func_80107250(POLY_GT4* poly, s32 arg1) { func_801071CC(poly, arg1, 0); @@ -2458,12 +2762,15 @@ void func_801072FC(POLY_G4* poly) { poly->r0 = 0; poly->g0 = 0; poly->b0 = 0; + poly->r1 = 0; poly->g1 = 0; poly->b1 = 0; + poly->r2 = 0; poly->g2 = 0; poly->b2 = 0; + poly->r3 = 0; poly->g3 = 0; poly->b3 = 0; @@ -2579,7 +2886,29 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80108448); // https://decomp.me/scratch/QZk8K INCLUDE_ASM("asm/dra/nonmatchings/42398", func_801092E8); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80109328); +// clang-format off + +void func_80109328(void) { + s16* new_var; + + D_80072F86 = 0; +// !FAKE: + new_var = &D_800733F6[0]; + if ((*new_var == 0x800) && (D_80073404 == 8)) { +// !FAKE: +do { D_800733F6[0] = 0; } while (0); + D_8007342E = 0x9D; + D_800733EC = (D_800733EC + 1) & 1; + } + + if (D_80072F16[0] != 0) { + D_80072F16[0] = 0; + func_801092E8(0); + } + D_800733F0 = 0; +} + +// clang-format on INCLUDE_ASM("asm/dra/nonmatchings/42398", func_801093C4); @@ -2597,7 +2926,16 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010A4A4); INCLUDE_ASM("asm/dra/nonmatchings/42398", UpdateEntityAlucard); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010BF64); +void func_8010BF64(Unkstruct_8010BF64* arg0) { + if (g_CurrentPlayableCharacter == PLAYER_ALUCARD) { + arg0->unk14 = D_800ACEC6.unk1A - ((D_80072F2C >> 1) & 2); + arg0->unk1C = D_800ACEC6.unk1C + ((D_80072F2C >> 1) & 2); + arg0->unk18 = D_800ACEC6.unk10 - 1; + arg0->unk20 = D_800ACEC6.unk0 + 1; + return; + } + D_8013C00C(); +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010BFFC); @@ -2649,9 +2987,35 @@ void func_8010E0B8(void) { D_80073510 = 0; } -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010E0D0); +void func_8010E0D0(s32 arg0) { + Entity* entity; -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010E168); + if (arg0 == 1) { + entity = func_8011AAFC(D_800733D8, 0x47002C, 0); + + if (entity != NULL) { + entity->unk34 = entity->unk34 | 0x10000; + } + + entity = func_8011AAFC(D_800733D8, 0x40002C, 0); + + if (entity != NULL) { + entity->unk34 = entity->unk34 | 0x10000; + } + } + func_8010DFF0(1, 1); +} + +void func_8010E168(s32 arg0, s16 arg1) { + if (arg0 == 0) { + func_8011AAFC(D_8006C3B8, 0x15002C, 0); + if (arg1 >= D_80072F1A[0]) { + D_80072F1A[0] = arg1; + } + } else if (D_80072F1C[0] <= arg1) { + D_80072F1C[0] = arg1; + } +} void func_8010E1EC(s32 speed) { if (D_8006C3B8->accelerationX < 0) { @@ -2763,14 +3127,49 @@ void func_8010E470(s32 arg0, s32 arg1) { } #endif -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010E4D0); +void func_8010E4D0(void) { + func_80111CC0(); + + D_800733EE = 0x8100; + D_800733FC = g_zEntityCenter; + + if ((u32)(D_80072F92 - 1) < 2U) { + func_8010DA48(0xC7); + D_800733E4 = 0; + D_800733E0 = 0; + func_8010D584(6); + func_80111CC0(); + PlaySfx(0x6F2); + return; + } + func_80111CC0(); + func_8010E470(0, 0); +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010E570); -/*?*/ void func_8010E570(/*?*/ s32); +void func_8010E570(/*?*/ s32); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010E6AC); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010E7AC); +void func_8010E7AC(void) { + func_8010D584(3); + + if (D_80072F70 != 1) { + func_8010DA48(0x1C); + } + + D_800733E4 = 0x20000; + D_800733E0 = 0; + D_80072F0C = 8; + + if (D_80072F24 & 1) { + D_80072F0A = 8; + } else { + D_80072F0A = 0; + } + + D_80072F64[0] = 0x10; +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010E83C); @@ -2786,9 +3185,55 @@ void func_8010E940(void) { INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010E9A4); +// https://decomp.me/scratch/9jKqU +// matching in decomp.me, probably aspsx +// TODO: aspatch div macro +// https://discord.com/channels/710646040331681844/815529862604390411/1051628313073958992 +#ifndef NON_MATCHING INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010EA54); +#else +void func_8010EA54(s32 arg0) { + s16 temp_hi; -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010EADC); + if (arg0 != 0) { + temp_hi = rand() % arg0; + + if (temp_hi < 4) { + PlaySfx(D_800ACF60[temp_hi]); + } + } +} +#endif + +s32 func_8010EADC(s16 arg0, s16 arg1) { + Entity* var_v1; + s32 var_a2; + s32 ret; + s32 i; + + i = 0; + var_a2 = 0; + ret = 0; + var_v1 = D_80074C08; + + for (; i < 16; i++) { + if (var_v1[i - 1].objectRoomIndex == 0) { + ret++; + } + + if (var_v1[i].posX.Data.low != 0) { + if (var_v1[i].posX.Data.low == arg0) { + var_a2++; + } + } + + if (var_a2 >= arg1) { + return -1; + } + } + + return (ret == 0) ? -1 : 0; +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010EB5C); @@ -2818,7 +3263,19 @@ void func_8010FB24(void) { func_8010E3E0(); } -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8010FB68); +void func_8010FB68(void) { + D_800733E4 = 0; + D_800733E0 = 0; + func_8010D584(0x20); + func_8010E3E0(); + func_8010DA48(0xBA); + PlaySfx(0x6F3); + PlaySfx(0x67D); + D_80072F16[0] = func_800FDB18(3, 0x400); + func_801092E8(1); + func_8011AAFC(D_8006C3B8, 0x110028, 0); + func_80118C28(0xB); +} void func_8010FBF4(void) { D_800733E4 = 0; @@ -2904,12 +3361,17 @@ void func_80111928(void) { D_801396EA = 0; } void func_80111938(void) { D_801396EA = 1; D_801396E4 = D_8007342E; - D_801396E6 = D_800733F1; + D_801396E6.typeShort = D_800733F1; D_801396E8 = D_800733EE; } -// D_801396E6 wants to be a s8 in this function -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8011197C); +void func_8011197C(void) { + D_801396EA = 0; + D_8007341C = 0; + D_8007342E = D_801396E4; + D_800733F1 = D_801396E6.typeByte; + D_800733EE = D_801396E8; +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_801119C4); @@ -2926,11 +3388,27 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80111D24); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80111DE8); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8011203C); +bool func_8011203C(void) { + s32 funcRet = func_80111D24(); + + if ((u16)D_80073FC4.posX.Data.low == 5) { + if (funcRet == 0) { + func_80106590((Entity*)(&D_80073FC4.posX.Data.low - 0x16)); + return true; + } + return false; + } else if ((u16)D_80073FC4.posX.Data.low < 3) { + if ((u16)D_80073FC4.posX.Data.low != 0) { + D_80072F66 = 0; + D_80073FC4.posX.Data.low = 3; + } + } + return false; +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_801120B4); -void func_80112B64() { +void func_80112B64(void) { if (func_8010FDF8(0x4301C) == 0) { func_8010E390(0x18000); if (func_8010E27C() == 0) { @@ -2975,7 +3453,21 @@ s16 func_80113E68(void) { return (temp_v0 - ((var_a1 >> 4) * 0x10)); } -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80113EE0); +void func_80113EE0(void) { + D_800733F1 &= 0xF3; + D_8007342C = 1; + D_8007342A = 0; + D_80073428.typeShort = 0; + D_800733FE = 0; + D_800733F0 = 0; + *D_80072F64 = 0; + D_80072F66 = 0; + *D_800733F6 = 0; + D_800733FC = g_zEntityCenter; + if (D_80073FBE == 0x22) { + func_8010FAF4(); + } +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80113F7C); @@ -2985,7 +3477,22 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80114DF4); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80115394); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80115BB0); +void func_80115BB0(void) { + D_800733F1 = 4; + D_800733E4 = 0; + D_800733E0 = 0; + D_8007342A = 4; + + if (D_80097420 == 0) { + if (D_80072F20 & 1) { + func_8010E570(0); + } else { + func_8010E7AC(); + } + func_8011AAFC(D_8006C3B8, 0x4A0000 | 0x2C, 0); + D_80097D37 = 0; + } +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80115C50); @@ -3011,7 +3518,20 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_801167D0); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80116838); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8011690C); +void func_8011690C(s16 arg0) { + if (D_800733F6[0] < arg0) { + D_800733F6[0] += 16; + if (arg0 < D_800733F6[0]) { + D_800733F6[0] = arg0; + } + } + if (arg0 < D_800733F6[0]) { + D_800733F6[0] -= 16; + if (D_800733F6[0] < arg0) { + D_800733F6[0] = arg0; + } + } +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80116994); @@ -3039,7 +3559,16 @@ void func_80118640(void) { } } -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80118670); +void func_80118670(void) { + if (D_80073428.typeInt == 0x10007) { + func_8011AAFC(D_8006C3B8, 0x160028, 0); + PlaySfx(0x67D); + func_8011AAFC(D_8006C3B8, 0x70, 0); + } + if (D_8007342A < 0) { + func_8010E570(0); + } +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_801186EC); @@ -3092,7 +3621,20 @@ void func_80118C28(s32 arg0) { } #endif -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80118C84); +s32 func_80118C84(s16 arg0, s16 arg1) { + Entity* entity = func_8011879C(0x38, 0x40); + + if (entity != NULL) { + func_80106590(entity); + entity->objectId = ENTITY_13; + entity->posX.value = D_800733D8->posX.value; + entity->posY.value = D_800733DC[0]; + entity->unk80.modeS16.unk0 = arg0; + entity->unk80.modeS16.unk2 = arg1; + return 0; + } + return -1; +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80118D0C); @@ -3104,9 +3646,36 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80119E78); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80119F70); -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8011A290); +void func_8011A290(Entity* entity) { + Unkstruct_8011A290 sp10; -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8011A328); + func_800FE3C4(&sp10, entity->unkB0, 0); + entity->unk40 = sp10.sp10; + entity->unk42 = sp10.sp14; + entity->unk3C = sp10.sp1C; + entity->unk49 = sp10.sp17; + entity->unk58 = sp10.sp18; + entity->unk6A = sp10.sp1E; + entity->objectRoomIndex = sp10.sp22; + entity->unkB2 = sp10.sp20; + func_80118894(entity); +} + +void func_800FD9D4(Unkstruct_8011A328*, s32 arg1); + +void func_8011A328(Entity* entity, s32 arg1) { + Unkstruct_8011A328 sp10; + + func_800FD9D4(&sp10, arg1); + entity->unk40 = sp10.sp28; + entity->unk42 = sp10.sp26; + entity->unk3C = sp10.sp20; + entity->unk49 = sp10.sp1D; + entity->unk58 = sp10.sp1E; + entity->unk6A = sp10.sp22; + entity->objectRoomIndex = sp10.sp24; + func_80118894(entity); +} INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8011A3AC); @@ -3177,7 +3746,7 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80121980); extern Unkstruct_80138094 D_80138094[]; void func_80121F14(s32 arg0, s32 arg1) { - Unkstruct_80138094* ptr = &D_80138094; + Unkstruct_80138094* ptr = D_80138094; s32 i; for (i = 0; i < 16; i++, ptr++) { @@ -3256,33 +3825,23 @@ INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80127F40); INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80128714); -//! FAKE -s32 func_80128BBC(s32 arg0, u8 value) { +s32 func_80128BBC(Unkstruct_80128BBC* arg0, u8 value) { u8 ret = 0; - u8* var_a0; - u8* var_v1; s32 i; + s32 j; + Unkstruct_80128BBC_Sub* temp = arg0->unk04; - var_a0 = arg0 + 4; + for (i = 0; i < 4; i++, temp++) { + for (j = 0; j < 3; j++) { + temp->unk00[j] -= value; - for (i = 0; i < 4; i++) { - var_v1 = var_a0; - - do { - *var_v1 -= value; - - if (*var_v1 < 16) { - *var_v1 = 16; + if (temp->unk00[j] < 16) { + temp->unk00[j] = 16; } else { ret |= 1; } - - var_v1++; - } while ((s32)var_v1 < (s32)(var_a0 + 3)); - - var_a0 += 0xC; + } } - return ret; } @@ -3316,7 +3875,7 @@ void func_8012CB0C(void) { D_80073484 = 0xDE; D_800733E4 = 0; D_800B0914 = 0; - D_80073428 = 0; + D_80073428.typeShort = 0; D_8007342A = 0; D_80073406 = 7; } @@ -3448,7 +4007,20 @@ void func_80132134(void) { SsSetMVol(g_volumeL, g_volumeR); } -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8013216C); +void func_8013216C(void) { + s32 i; + + for (i = 0; i < 4; i++) { + D_8013B620[i] = 0; + D_8013B614[i] = 0; + D_8013AE84[i] = 0; + D_8013B66C[i] = 0; + D_8013B5EC[i] = 0; + D_8013B628[i] = 0; + D_8013B648[i] = 0; + D_8013AEA0[i] = 0; + } +} void func_801321FC(void) { s32 i; @@ -3625,52 +4197,78 @@ void func_8013461C(void) { D_80138F28 |= 0xC00000; } -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80134678); +s32 func_80134678(s16 arg0, u16 arg1) { + s32 ret = -2; + u16 temp; -INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80134714); + if (D_80139804 != 0) { + ret = 0; + temp = arg1 + 8; -#ifndef NON_EQUIVALENT -INCLUDE_ASM("asm/dra/nonmatchings/42398", PlaySfx); -#else -void PlaySfx(s32 arg0) { - if (D_8013AEEC == 0) - return; - - if (((arg0 - 0x601) & 0xFFFF) < 0x2E0) { - s16 playerLevel = D_80139000; - s32 temp_v0 = playerLevel * 3; - *(&D_801390DC + temp_v0) = arg0 - 0x600; - D_80139000 = ++playerLevel; - *(&D_801390DE + temp_v0) = 0xFFFF; - *(&D_801390E0 + temp_v0) = 0; - if (playerLevel == 0x100) { - D_80139000 = 0; - } - } else { - s16 temp_v0_2; - s16 temp_v0_3; - if (arg0 < 0x85) { - if (arg0 < 0x80) { - if (arg0 < 0x12 && arg0 >= 0x10) { - D_8013980C = 1; - } - } else { - D_8013B61C = 1; - } - } else if (arg0 < 0x95 && arg0 >= 0x90) { - D_8013B61C = 1; + if ((temp) >= 0x11) { + arg1 = 0; + ret = -1; } - temp_v0_2 = D_80139A70; - temp_v0_3 = temp_v0_2 + 1; - D_80139A70 = temp_v0_3; - D_8013B3E8[temp_v0_2] = arg0; - if (temp_v0_3 == 0x100) { + D_8013AE94 = arg1; + D_8013AEE0 = arg0; + D_8013B3E8[D_80139A70] = 1; + D_80139A70++; + + if (D_80139A70 == 0x100) { D_80139A70 = 0; } } + return ret; +} + +INCLUDE_ASM("asm/dra/nonmatchings/42398", func_80134714); + +void PlaySfx(s16 sfxId) { + u16 offset; + + if (D_8013AEEC != 0) { + offset = (u32)(sfxId - 0x601); + if (offset < 0x2E0) { + D_801390DC[D_80139000].unk00 = sfxId - 0x600; + D_801390DC[D_80139000].unk02 = 0xFFFF; + D_801390DC[D_80139000].unk04 = 0; + D_80139000++; + if (D_80139000 == 0x100) { + D_80139000 = 0; + } + } else { + switch (sfxId) { + case 0x10: + case 0x11: + D_8013980C = 1; + break; + + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x90: + case 0x91: + case 0x92: + case 0x93: + case 0x94: + D_8013B61C = 1; + break; + + default: + break; + } + + D_8013B3E8[D_80139A70] = sfxId; + D_80139A70++; + if (D_80139A70 == 0x100) { + D_80139A70 = 0; + } + } + } } -#endif INCLUDE_ASM("asm/dra/nonmatchings/42398", func_8013493C); @@ -3690,11 +4288,11 @@ void func_80134F50(); #ifndef NON_EQUIVALENT INCLUDE_ASM("asm/dra/nonmatchings/42398", func_801353A0); #else -void func_801353A0() { +void func_801353A0(void) { if (D_801396F4 == 0) return; - switch (D_80139868) { + switch (D_80139868[0]) { case 2: func_80133604(); break; @@ -3772,4 +4370,4 @@ void func_801361F8(void) { } } -void nullsub_10(void) {} +void nullsub_10(void) {} \ No newline at end of file diff --git a/src/main/5A38.c b/src/main/5A38.c index 3f108e9c6..c3b5bbb28 100644 --- a/src/main/5A38.c +++ b/src/main/5A38.c @@ -1,6 +1,5 @@ #include "common.h" #include -#include #include INCLUDE_ASM("asm/main/nonmatchings/5A38", PadInit); diff --git a/src/main/psxsdk/fprintf.c b/src/main/psxsdk/fprintf.c deleted file mode 100644 index b613146c9..000000000 --- a/src/main/psxsdk/fprintf.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "common.h" - -INCLUDE_ASM("asm/main/nonmatchings/psxsdk/fprintf", fprintf); diff --git a/src/main/psxsdk/sprintf.c b/src/main/psxsdk/sprintf.c new file mode 100644 index 000000000..dbce48d57 --- /dev/null +++ b/src/main/psxsdk/sprintf.c @@ -0,0 +1,3 @@ +#include "common.h" + +INCLUDE_ASM("config/../asm/main/nonmatchings/psxsdk/sprintf", sprintf); diff --git a/src/ric/1AC60.c b/src/ric/1AC60.c index 1a787e94e..e1da5df95 100644 --- a/src/ric/1AC60.c +++ b/src/ric/1AC60.c @@ -12,7 +12,6 @@ s32 func_8015E380(); void func_8015CDE0(s32); void func_801606BC(Entity*, s32, s32); -extern s16 D_80072F16; // main.h? extern u16 D_80072F9A; // main.h? extern s32 D_801554B0; extern s32 D_801553BC; @@ -108,7 +107,7 @@ INCLUDE_ASM("asm/ric/nonmatchings/1AC60", func_80159670); void func_80159BC8(void) { D_8007342A = 0; - D_80073428 = 0; + D_80073428.typeShort = 0; D_80072F64[0] = 0; D_80072F66 = 0; D_800733F1 = D_800733F1 & 0xFB; @@ -213,6 +212,7 @@ INCLUDE_ASM("asm/ric/nonmatchings/1AC60", func_8015C9CC); void func_8015CA84(s32 speed) { Entity* entity = D_8006C3B8; s32 modX = speed; + if (entity->unk14 == 1) modX = -speed; entity->accelerationX = modX; @@ -242,7 +242,7 @@ void func_8015CC70(s16 arg0) { D_80073406 = arg0; D_80073404 = 0x0020; D_8007342A = 0; - D_80073428 = 0; + D_80073428.typeShort = 0; if (arg0 & 1) { D_80073424 = &D_80155950; } else { @@ -287,7 +287,7 @@ void func_8015CE7C(void) { func_8015C908(0x19); func_8015C920(&D_80155670); func_8015CA84(0x24000); - D_80072F16 = 0x28; + D_80072F16[0] = 0x28; D_800733E4 = 0; func_801606BC(D_8006C3B8, 0x50001, 0); } @@ -520,7 +520,25 @@ INCLUDE_ASM("asm/ric/nonmatchings/1AC60", func_8016B97C); INCLUDE_ASM("asm/ric/nonmatchings/1AC60", func_8016C1BC); -INCLUDE_ASM("asm/ric/nonmatchings/1AC60", func_8016C6C4); +s32 func_8016C6C4(Unkstruct_80128BBC* arg0, u8 value) { + u8 ret = 0; + s32 i; + s32 j; + Unkstruct_80128BBC_Sub* temp = arg0->unk04; + + for (i = 0; i < 4; i++, temp++) { + for (j = 0; j < 3; j++) { + temp->unk00[j] -= value; + + if (temp->unk00[j] < 16) { + temp->unk00[j] = 16; + } else { + ret |= 1; + } + } + } + return ret; +} INCLUDE_ASM("asm/ric/nonmatchings/1AC60", func_8016C734); diff --git a/src/st/cen/D600.c b/src/st/cen/D600.c index af5584dfc..c8023e621 100644 --- a/src/st/cen/D600.c +++ b/src/st/cen/D600.c @@ -397,10 +397,10 @@ void func_8019C540(unkStruct3* arg0) { arg0->unk0->unkE = 0; arg0->unk0->unkC = 0; arg0->unk0->unk12.data = 0; - arg0->unk0->unk10 = 0; + arg0->unk0->unk10.data = 0; arg0->unk0->unk18 = 0; arg0->unk0->unk1A = 0; - arg0->unk0->unk1C = 0; + arg0->unk0->unk1C.data = 0; arg0->unk0->unk1E.data = 0; arg0->unk0->unk24 = 0; arg0->unk0->unk25 = 0; diff --git a/src/st/dre/11A64.c b/src/st/dre/11A64.c index 8f08212e8..0a2f57275 100644 --- a/src/st/dre/11A64.c +++ b/src/st/dre/11A64.c @@ -1216,10 +1216,10 @@ void func_801A2684(unkStruct3* arg0) { arg0->unk0->unkE = 0; arg0->unk0->unkC = 0; arg0->unk0->unk12.data = 0; - arg0->unk0->unk10 = 0; + arg0->unk0->unk10.data = 0; arg0->unk0->unk18 = 0; arg0->unk0->unk1A = 0; - arg0->unk0->unk1C = 0; + arg0->unk0->unk1C.data = 0; arg0->unk0->unk1E.data = 0; arg0->unk0->unk24 = 0; arg0->unk0->unk25 = 0; diff --git a/src/st/mad/D8C8.c b/src/st/mad/D8C8.c index e9d6ab175..b052f7d56 100644 --- a/src/st/mad/D8C8.c +++ b/src/st/mad/D8C8.c @@ -1431,32 +1431,22 @@ void func_80199740(POLY_GT4* arg0) { ((POLY_GT4*)arg0->tag)->pad3 = 8; } -//! FAKE -s32 func_8019976C(s32 arg0, u8 value) { +s32 func_8019976C(Unkstruct_80128BBC* arg0, u8 value) { u8 ret = 0; - u8* phi_v1; - u8* phi_a0; s32 i; + s32 j; + Unkstruct_80128BBC_Sub* temp = arg0->unk04; - phi_a0 += 4; + for (i = 0; i < 4; i++, temp++) { + for (j = 0; j < 3; j++) { + temp->unk00[j] -= value; - for (i = 0; i < 4; i++) { - phi_v1 = phi_a0; - - do { - *phi_v1 -= value; - - if ((u32)*phi_v1 >= 0xF9) { - *phi_v1 = 0; + if (temp->unk00[j] > 248) { + temp->unk00[j] = 0; } else { ret |= 1; } - - phi_v1++; - } while ((s32)phi_v1 < (s32)(phi_a0 + 3)); - - phi_a0 += 0xC; + } } - return ret; } diff --git a/src/st/nz0/394D4.c b/src/st/nz0/394D4.c index 66f73e368..8d059fa78 100644 --- a/src/st/nz0/394D4.c +++ b/src/st/nz0/394D4.c @@ -1421,10 +1421,10 @@ void func_801C9F9C(unkStruct3* arg0) { arg0->unk0->unkE = 0; arg0->unk0->unkC = 0; arg0->unk0->unk12.data = 0; - arg0->unk0->unk10 = 0; + arg0->unk0->unk10.data = 0; arg0->unk0->unk18 = 0; arg0->unk0->unk1A = 0; - arg0->unk0->unk1C = 0; + arg0->unk0->unk1C.data = 0; arg0->unk0->unk1E.data = 0; arg0->unk0->unk24 = 0; arg0->unk0->unk25 = 0;