diff --git a/docs/progress.svg b/docs/progress.svg index 364b7c3..7062448 100644 --- a/docs/progress.svg +++ b/docs/progress.svg @@ -69,10 +69,10 @@ Tomb2.exe progress according to the physical function order: -60.26% (734) · 37.27% (454) · 0% (0) · 2.46% (30) +60.34% (735) · 37.19% (453) · 0% (0) · 2.46% (30) - - + + @@ -416,7 +416,7 @@ void __cdecl RingNotActive(INVENTORY_ITEM *inv_item); void __cdecl RingActive(void); int32_t __cdecl Inv_AddItem(GAME_OBJECT_ID object_num); -void __cdecl Inv_InsertItem(INVENTORY_ITEM *inv_item); +void __cdecl Inv_InsertItem(INVENTORY_ITEM *inv_item); int32_t __cdecl Inv_RequestItem(GAME_OBJECT_ID object_num); void __cdecl Inv_RemoveAllItems(void); int32_t __cdecl Inv_RemoveItem(GAME_OBJECT_ID object_num); @@ -1298,10 +1298,10 @@ Tomb2.exe progress according to the function sizes: -64.16% · 35.51% · 0% · 0.33% +64.25% · 35.43% · 0% · 0.33% - - + + @@ -1620,7 +1620,7 @@ int32_t __cdecl Lara_TestSlide(ITEM_INFO *item, COLL_INFO *coll); void __cdecl DrawSphereOfDoom(ITEM_INFO *item); void __cdecl Output_InsertLine_Sorted(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t z, uint8_t color_idx); -void __cdecl Inv_InsertItem(INVENTORY_ITEM *inv_item); +void __cdecl Inv_InsertItem(INVENTORY_ITEM *inv_item); void __cdecl SphereOfDoomCollision(int16_t item_num, ITEM_INFO *lara_item, COLL_INFO *coll); int32_t __cdecl Collide_TestCollision(ITEM_INFO *item, const ITEM_INFO *lara_item); void __cdecl HWR_InitState(void); diff --git a/docs/progress.txt b/docs/progress.txt index 6ba99d5..c7b4dd9 100644 --- a/docs/progress.txt +++ b/docs/progress.txt @@ -3214,7 +3214,7 @@ typedef enum { 0x00423E40 0x0369 -R void __cdecl RingNotActive(INVENTORY_ITEM *inv_item); 0x004242B0 0x0032 -R void __cdecl RingActive(void); 0x004242F0 0x06BE + int32_t __cdecl Inv_AddItem(GAME_OBJECT_ID object_num); -0x00424B00 0x0129 - void __cdecl Inv_InsertItem(INVENTORY_ITEM *inv_item); +0x00424B00 0x0129 + void __cdecl Inv_InsertItem(INVENTORY_ITEM *inv_item); 0x00424C30 0x0077 - int32_t __cdecl Inv_RequestItem(GAME_OBJECT_ID object_num); 0x00424CB0 0x001B - void __cdecl Inv_RemoveAllItems(void); 0x00424CD0 0x0110 - int32_t __cdecl Inv_RemoveItem(GAME_OBJECT_ID object_num); @@ -4664,8 +4664,8 @@ typedef enum { 0x00521BE0 - uint32_t g_SaveGameReqFlags2[24]; // MAX_REQUESTER_ITEMS 0x004D9EC8 - int32_t g_SaveCounter; 0x00466B80 - int16_t g_SavedLevels[24]; // MAX_LEVELS -0x004654E8 - int16_t g_InvMainQtys[]; -0x00465578 - int16_t g_InvKeysQtys[]; +0x004654E8 - int16_t g_Inv_MainQtys[]; +0x00465578 - int16_t g_Inv_KeysQtys[]; 0x0046773C - int32_t g_DetailLevel; 0x0051A250 - int32_t g_LayoutPage; 0x0051A24C + int32_t g_KeySelector; diff --git a/src/game/inventory/backpack.c b/src/game/inventory/backpack.c index 5cc6294..ea089bd 100644 --- a/src/game/inventory/backpack.c +++ b/src/game/inventory/backpack.c @@ -5,6 +5,41 @@ #include "global/funcs.h" #include "global/vars.h" +void __cdecl Inv_InsertItem(INVENTORY_ITEM *const inv_item) +{ + int32_t n; + + if (inv_item->inv_pos < 100) { + for (n = 0; n < g_Inv_MainObjectsCount; n++) { + if (g_Inv_MainList[n]->inv_pos > inv_item->inv_pos) { + break; + } + } + + for (int32_t i = g_Inv_MainObjectsCount; i > n - 1; i--) { + g_Inv_MainList[i + 1] = g_Inv_MainList[i]; + g_Inv_MainQtys[i + 1] = g_Inv_MainQtys[i]; + } + g_Inv_MainList[n] = inv_item; + g_Inv_MainQtys[n] = 1; + g_Inv_MainObjectsCount++; + } else { + for (n = 0; n < g_Inv_KeyObjectsCount; n++) { + if (g_Inv_KeysList[n]->inv_pos > inv_item->inv_pos) { + break; + } + } + + for (int i = g_Inv_KeyObjectsCount; i > n - 1; i--) { + g_Inv_KeysList[i + 1] = g_Inv_KeysList[i]; + g_Inv_KeysQtys[i + 1] = g_Inv_KeysQtys[i]; + } + g_Inv_KeysList[n] = inv_item; + g_Inv_KeysQtys[n] = 1; + g_Inv_KeyObjectsCount++; + } +} + int32_t __cdecl Inv_AddItem(const GAME_OBJECT_ID object_id) { const GAME_OBJECT_ID inv_object_id = Inv_GetItemOption(object_id); @@ -16,7 +51,7 @@ int32_t __cdecl Inv_AddItem(const GAME_OBJECT_ID object_id) const INVENTORY_ITEM *const inv_item = g_Inv_MainList[i]; if (inv_item->obj_num == inv_object_id) { const int32_t qty = object_id == O_FLARES_ITEM ? FLARE_AMMO_QTY : 1; - g_InvMainQtys[i] += qty; + g_Inv_MainQtys[i] += qty; return true; } } @@ -24,7 +59,7 @@ int32_t __cdecl Inv_AddItem(const GAME_OBJECT_ID object_id) for (int32_t i = 0; i < g_Inv_KeyObjectsCount; i++) { const INVENTORY_ITEM *const inv_item = g_Inv_KeysList[i]; if (inv_item->obj_num == inv_object_id) { - g_InvKeysQtys[i]++; + g_Inv_KeysQtys[i]++; return true; } } diff --git a/src/game/inventory/backpack.h b/src/game/inventory/backpack.h index c85babf..c7103fa 100644 --- a/src/game/inventory/backpack.h +++ b/src/game/inventory/backpack.h @@ -2,5 +2,6 @@ #include "global/types.h" +void __cdecl Inv_InsertItem(INVENTORY_ITEM *inv_item); int32_t __cdecl Inv_AddItem(GAME_OBJECT_ID object_id); void Inv_AddItemNTimes(GAME_OBJECT_ID object_num, int32_t qty); diff --git a/src/global/funcs.h b/src/global/funcs.h index 2a6799d..109dbae 100644 --- a/src/global/funcs.h +++ b/src/global/funcs.h @@ -100,7 +100,6 @@ #define RingIsNotOpen ((void __cdecl (*)(RING_INFO *ring))0x00423DB0) #define RingNotActive ((void __cdecl (*)(INVENTORY_ITEM *inv_item))0x00423E40) #define RingActive ((void __cdecl (*)(void))0x004242B0) -#define Inv_InsertItem ((void __cdecl (*)(INVENTORY_ITEM *inv_item))0x00424B00) #define Inv_RequestItem ((int32_t __cdecl (*)(GAME_OBJECT_ID object_num))0x00424C30) #define Inv_RemoveAllItems ((void __cdecl (*)(void))0x00424CB0) #define Inv_RemoveItem ((int32_t __cdecl (*)(GAME_OBJECT_ID object_num))0x00424CD0) diff --git a/src/global/vars_decomp.h b/src/global/vars_decomp.h index 18746c1..0732791 100644 --- a/src/global/vars_decomp.h +++ b/src/global/vars_decomp.h @@ -62,9 +62,9 @@ #define g_Inv_Item_Controls (*(INVENTORY_ITEM*)0x00465440) #define g_Inv_Item_Photo (*(INVENTORY_ITEM*)0x00465490) #define g_Inv_MainObjectsCount (*(int16_t*)0x004654E0) // = 8 -#define g_InvMainQtys (*(int16_t(*)[])0x004654E8) +#define g_Inv_MainQtys (*(int16_t(*)[])0x004654E8) #define g_Inv_MainList (*(INVENTORY_ITEM *(*)[])0x00465518) -#define g_InvKeysQtys (*(int16_t(*)[])0x00465578) +#define g_Inv_KeysQtys (*(int16_t(*)[])0x00465578) #define g_Inv_KeysList (*(INVENTORY_ITEM *(*)[])0x004655A8) #define g_GymInvOpenEnabled (*(BOOL*)0x00465618) // = TRUE #define g_LoadGameRequester (*(REQUEST_INFO*)0x00465620) diff --git a/src/inject_exec.c b/src/inject_exec.c index 170842d..54b4284 100644 --- a/src/inject_exec.c +++ b/src/inject_exec.c @@ -622,6 +622,7 @@ static void Inject_Inventory(const bool enable) INJECT(enable, 0x00423500, Inv_AnimateInventoryItem); INJECT(enable, 0x00423590, Inv_DrawInventoryItem); INJECT(enable, 0x004242F0, Inv_AddItem); + INJECT(enable, 0x00424B00, Inv_InsertItem); INJECT(enable, 0x00424DE0, Inv_GetItemOption); INJECT(enable, 0x00425000, Inv_Ring_Init); INJECT(enable, 0x00425110, Inv_Ring_GetView);