inventory: fix improper ring shutdown

Resolves #1460.
This commit is contained in:
Marcin Kurczewski 2024-08-30 00:52:13 +02:00
parent 936cd4a8fa
commit f0a6fbd630
No known key found for this signature in database
GPG key ID: CC65E6FD28CAE42A
21 changed files with 139 additions and 64 deletions

View file

@ -4,6 +4,7 @@
- fixed cameras with glide values sometimes moving in the wrong direction (#1451, regression from 4.3) - fixed cameras with glide values sometimes moving in the wrong direction (#1451, regression from 4.3)
- fixed `/give` console command giving duplicate items under some circumstances (#1463, regression from 3.0) - fixed `/give` console command giving duplicate items under some circumstances (#1463, regression from 3.0)
- fixed `/give` console command confusing logging around mismatched items (#1463, regression from 3.0) - fixed `/give` console command confusing logging around mismatched items (#1463, regression from 3.0)
- fixed console commands causing improper ring shutdown with selected inventory item (#1460, regression from 3.0)
- improved logs module names readability - improved logs module names readability
- improved crash debug information on Windows - improved crash debug information on Windows

View file

@ -3,10 +3,12 @@
#include "config_map.h" #include "config_map.h"
#include "game/input.h" #include "game/input.h"
#include "game/music.h" #include "game/music.h"
#include "game/requester.h"
#include "game/sound.h" #include "game/sound.h"
#include "global/const.h" #include "global/const.h"
#include "global/enum_str.h" #include "global/enum_str.h"
#include "global/types.h" #include "global/types.h"
#include "global/vars.h"
#include <libtrx/config/config_file.h> #include <libtrx/config/config_file.h>
#include <libtrx/filesystem.h> #include <libtrx/filesystem.h>
@ -293,6 +295,8 @@ bool Config_Read(void)
Input_CheckConflicts(CM_CONTROLLER, g_Config.input.cntlr_layout); Input_CheckConflicts(CM_CONTROLLER, g_Config.input.cntlr_layout);
Music_SetVolume(g_Config.music_volume); Music_SetVolume(g_Config.music_volume);
Sound_SetMasterVolume(g_Config.sound_volume); Sound_SetMasterVolume(g_Config.sound_volume);
Requester_Shutdown(&g_SavegameRequester);
Requester_Init(&g_SavegameRequester, g_Config.maximum_save_slots);
return result; return result;
} }

View file

@ -127,7 +127,7 @@ void Inv_Ring_InitHeader(RING_INFO *ring)
} }
} }
void Inv_Ring_RemoveHeader(RING_INFO *ring) void Inv_Ring_RemoveHeader(void)
{ {
if (!g_InvRingText) { if (!g_InvRingText) {
return; return;
@ -152,6 +152,7 @@ void Inv_Ring_RemoveHeader(RING_INFO *ring)
void Inv_Ring_RemoveAllText(void) void Inv_Ring_RemoveAllText(void)
{ {
Inv_Ring_RemoveHeader();
for (int i = 0; i < IT_NUMBER_OF; i++) { for (int i = 0; i < IT_NUMBER_OF; i++) {
if (g_InvItemText[i]) { if (g_InvItemText[i]) {
Text_Remove(g_InvItemText[i]); Text_Remove(g_InvItemText[i]);
@ -302,6 +303,21 @@ void Inv_Ring_Active(INVENTORY_ITEM *inv_item)
} }
} }
void Inv_Ring_ResetItem(INVENTORY_ITEM *const inv_item)
{
inv_item->drawn_meshes = inv_item->which_meshes;
inv_item->current_frame = 0;
inv_item->goal_frame = inv_item->current_frame;
inv_item->pt_xrot = 0;
inv_item->x_rot = 0;
inv_item->y_rot = 0;
inv_item->ytrans = 0;
inv_item->ztrans = 0;
if (inv_item->object_number == O_PASSPORT_OPTION) {
inv_item->object_number = O_PASSPORT_CLOSED;
}
}
void Inv_Ring_GetView(RING_INFO *ring, XYZ_32 *view_pos, XYZ_16 *view_rot) void Inv_Ring_GetView(RING_INFO *ring, XYZ_32 *view_pos, XYZ_16 *view_rot)
{ {
PHD_ANGLE angles[2]; PHD_ANGLE angles[2];

View file

@ -9,9 +9,10 @@ void Inv_Ring_Init(
int16_t current, IMOTION_INFO *imo); int16_t current, IMOTION_INFO *imo);
void Inv_Ring_InitHeader(RING_INFO *ring); void Inv_Ring_InitHeader(RING_INFO *ring);
void Inv_Ring_RemoveHeader(RING_INFO *ring); void Inv_Ring_RemoveHeader(void);
void Inv_Ring_RemoveAllText(void); void Inv_Ring_RemoveAllText(void);
void Inv_Ring_Active(INVENTORY_ITEM *inv_item); void Inv_Ring_Active(INVENTORY_ITEM *inv_item);
void Inv_Ring_ResetItem(INVENTORY_ITEM *inv_item);
void Inv_Ring_GetView(RING_INFO *ring, XYZ_32 *view_pos, XYZ_16 *view_rot); void Inv_Ring_GetView(RING_INFO *ring, XYZ_32 *view_pos, XYZ_16 *view_rot);
void Inv_Ring_Light(RING_INFO *ring); void Inv_Ring_Light(RING_INFO *ring);

View file

@ -3,5 +3,4 @@
#include "global/types.h" #include "global/types.h"
void Option_DoInventory(INVENTORY_ITEM *inv_item); void Option_DoInventory(INVENTORY_ITEM *inv_item);
void Option_Init(void); void Option_Shutdown(INVENTORY_ITEM *inv_item);
void Option_Shutdown(void);

View file

@ -11,14 +11,36 @@
static CONTROL_MODE m_ControlMode = CM_PICK; static CONTROL_MODE m_ControlMode = CM_PICK;
void Option_Init(void) void Option_Shutdown(INVENTORY_ITEM *inv_item)
{ {
Option_PassportInit(); switch (inv_item->object_number) {
} case O_PASSPORT_OPTION:
Option_Passport_Shutdown();
break;
void Option_Shutdown(void) case O_MAP_OPTION:
{ Option_Compass_Shutdown();
Option_PassportShutdown(); break;
case O_DETAIL_OPTION:
Option_Graphics_Shutdown();
break;
case O_SOUND_OPTION:
Option_Sound_Shutdown();
break;
case O_CONTROL_OPTION:
if (m_ControlMode == CM_PICK) {
Option_ControlPick_Shutdown();
} else {
Option_Control_Shutdown();
}
break;
default:
break;
}
} }
void Option_DoInventory(INVENTORY_ITEM *inv_item) void Option_DoInventory(INVENTORY_ITEM *inv_item)

View file

@ -104,6 +104,14 @@ static void Option_Compass_InitText(void)
} }
} }
static void Option_Compass_ShutdownText(void)
{
for (int i = 0; i < TEXT_NUMBER_OF; i++) {
Text_Remove(m_Text[i]);
m_Text[i] = NULL;
}
}
void Option_Compass(INVENTORY_ITEM *inv_item) void Option_Compass(INVENTORY_ITEM *inv_item)
{ {
if (g_Config.enable_compass_stats) { if (g_Config.enable_compass_stats) {
@ -131,11 +139,13 @@ void Option_Compass(INVENTORY_ITEM *inv_item)
} }
if (g_InputDB.menu_confirm || g_InputDB.menu_back) { if (g_InputDB.menu_confirm || g_InputDB.menu_back) {
for (int i = 0; i < TEXT_NUMBER_OF; i++) { Option_Compass_ShutdownText();
Text_Remove(m_Text[i]);
m_Text[i] = NULL;
}
inv_item->goal_frame = inv_item->frames_total - 1; inv_item->goal_frame = inv_item->frames_total - 1;
inv_item->anim_direction = 1; inv_item->anim_direction = 1;
} }
} }
void Option_Compass_Shutdown(void)
{
Option_Compass_ShutdownText();
}

View file

@ -3,3 +3,4 @@
#include "global/types.h" #include "global/types.h"
void Option_Compass(INVENTORY_ITEM *inv_item); void Option_Compass(INVENTORY_ITEM *inv_item);
void Option_Compass_Shutdown(void);

View file

@ -792,3 +792,8 @@ CONTROL_MODE Option_Control(INVENTORY_ITEM *inv_item, CONTROL_MODE mode)
return mode; return mode;
} }
void Option_Control_Shutdown(void)
{
Option_Control_ShutdownText();
}

View file

@ -5,3 +5,4 @@
#include <stdbool.h> #include <stdbool.h>
CONTROL_MODE Option_Control(INVENTORY_ITEM *inv_item, CONTROL_MODE mode); CONTROL_MODE Option_Control(INVENTORY_ITEM *inv_item, CONTROL_MODE mode);
void Option_Control_Shutdown(void);

View file

@ -102,3 +102,8 @@ CONTROL_MODE Option_ControlPick(void)
return CM_PICK; return CM_PICK;
} }
void Option_ControlPick_Shutdown(void)
{
Option_ControlPick_ShutdownText();
}

View file

@ -3,3 +3,4 @@
#include "global/types.h" #include "global/types.h"
CONTROL_MODE Option_ControlPick(void); CONTROL_MODE Option_ControlPick(void);
void Option_ControlPick_Shutdown(void);

View file

@ -100,7 +100,6 @@ static void Option_Graphics_MenuUp(void);
static void Option_Graphics_MenuDown(void); static void Option_Graphics_MenuDown(void);
static void Option_Graphics_InitText(void); static void Option_Graphics_InitText(void);
static void Option_Graphics_UpdateText(void); static void Option_Graphics_UpdateText(void);
static void Option_Graphics_Shutdown(void);
static void Option_Graphics_UpdateArrows( static void Option_Graphics_UpdateArrows(
GRAPHICS_OPTION_NAME option_name, TEXTSTRING value_text, bool more_up, GRAPHICS_OPTION_NAME option_name, TEXTSTRING value_text, bool more_up,
bool more_down); bool more_down);
@ -248,24 +247,6 @@ static void Option_Graphics_UpdateText(void)
} }
} }
static void Option_Graphics_Shutdown(void)
{
for (int i = 0; i < TEXT_NUMBER_OF; i++) {
Text_Remove(m_Text[i]);
m_Text[i] = NULL;
}
for (int i = 0; i < OPTION_NUMBER_OF; i++) {
Text_Remove(m_GraphicsMenu.option_texts[i]);
m_GraphicsMenu.option_texts[i] = NULL;
Text_Remove(m_GraphicsMenu.value_texts[i]);
m_GraphicsMenu.value_texts[i] = NULL;
}
m_IsTextInit = false;
m_HideArrowLeft = false;
m_HideArrowRight = false;
Option_Graphics_InitMenu();
}
static void Option_Graphics_UpdateArrows( static void Option_Graphics_UpdateArrows(
GRAPHICS_OPTION_NAME option_name, TEXTSTRING value_text, bool more_up, GRAPHICS_OPTION_NAME option_name, TEXTSTRING value_text, bool more_up,
bool more_down) bool more_down)
@ -666,3 +647,21 @@ void Option_Graphics(INVENTORY_ITEM *inv_item)
Config_Write(); Config_Write();
} }
} }
void Option_Graphics_Shutdown(void)
{
for (int i = 0; i < TEXT_NUMBER_OF; i++) {
Text_Remove(m_Text[i]);
m_Text[i] = NULL;
}
for (int i = 0; i < OPTION_NUMBER_OF; i++) {
Text_Remove(m_GraphicsMenu.option_texts[i]);
m_GraphicsMenu.option_texts[i] = NULL;
Text_Remove(m_GraphicsMenu.value_texts[i]);
m_GraphicsMenu.value_texts[i] = NULL;
}
m_IsTextInit = false;
m_HideArrowLeft = false;
m_HideArrowRight = false;
Option_Graphics_InitMenu();
}

View file

@ -3,3 +3,4 @@
#include "global/types.h" #include "global/types.h"
void Option_Graphics(INVENTORY_ITEM *inv_item); void Option_Graphics(INVENTORY_ITEM *inv_item);
void Option_Graphics_Shutdown(void);

View file

@ -96,6 +96,7 @@ REQUEST_INFO g_SavegameRequester = {
.items = NULL, .items = NULL,
}; };
static void Option_Passport_InitRequesters(void);
static void Option_Passport_InitText(void); static void Option_Passport_InitText(void);
static void Option_Passport_ShutdownText(void); static void Option_Passport_ShutdownText(void);
static void Option_Passport_Close(INVENTORY_ITEM *inv_item); static void Option_Passport_Close(INVENTORY_ITEM *inv_item);
@ -113,18 +114,12 @@ static void Option_Passport_Restart(INVENTORY_ITEM *inv_item);
static void Option_Passport_FlipRight(INVENTORY_ITEM *inv_item); static void Option_Passport_FlipRight(INVENTORY_ITEM *inv_item);
static void Option_Passport_FlipLeft(INVENTORY_ITEM *inv_item); static void Option_Passport_FlipLeft(INVENTORY_ITEM *inv_item);
void Option_Passport_Init(void) void Option_Passport_InitRequesters(void)
{ {
Requester_Init(&g_SavegameRequester, g_Config.maximum_save_slots);
Requester_Init(&m_SelectLevelRequester, g_GameFlow.level_count + 1);
Requester_Init(&m_NewGameRequester, MAX_GAME_MODES);
}
void Option_Passport_Shutdown(void)
{
Requester_Shutdown(&g_SavegameRequester);
Requester_Shutdown(&m_SelectLevelRequester); Requester_Shutdown(&m_SelectLevelRequester);
Requester_Shutdown(&m_NewGameRequester); Requester_Shutdown(&m_NewGameRequester);
Requester_Init(&m_SelectLevelRequester, g_GameFlow.level_count + 1);
Requester_Init(&m_NewGameRequester, MAX_GAME_MODES);
} }
static void Option_Passport_InitText(void) static void Option_Passport_InitText(void)
@ -595,6 +590,7 @@ static void Option_Passport_FlipLeft(INVENTORY_ITEM *inv_item)
void Option_Passport(INVENTORY_ITEM *inv_item) void Option_Passport(INVENTORY_ITEM *inv_item)
{ {
if (!m_IsTextInit) { if (!m_IsTextInit) {
Option_Passport_InitRequesters();
Text_Remove(g_InvItemText[IT_NAME]); Text_Remove(g_InvItemText[IT_NAME]);
g_InvItemText[IT_NAME] = NULL; g_InvItemText[IT_NAME] = NULL;
Text_Remove(g_InvRingText); Text_Remove(g_InvRingText);
@ -690,3 +686,11 @@ void Option_Passport(INVENTORY_ITEM *inv_item)
Option_Passport_Close(inv_item); Option_Passport_Close(inv_item);
} }
} }
void Option_Passport_Shutdown(void)
{
Option_Passport_ShutdownText();
Requester_Shutdown(&m_SelectLevelRequester);
Requester_Shutdown(&m_NewGameRequester);
Requester_ClearTextstrings(&g_SavegameRequester);
}

View file

@ -3,5 +3,4 @@
#include "global/types.h" #include "global/types.h"
void Option_Passport(INVENTORY_ITEM *inv_item); void Option_Passport(INVENTORY_ITEM *inv_item);
void Option_Passport_Init(void);
void Option_Passport_Shutdown(void); void Option_Passport_Shutdown(void);

View file

@ -163,9 +163,14 @@ void Option_Sound(INVENTORY_ITEM *inv_item)
} }
if (g_InputDB.menu_confirm || g_InputDB.menu_back) { if (g_InputDB.menu_confirm || g_InputDB.menu_back) {
for (int i = 0; i < TEXT_NUMBER_OF; i++) { Option_Sound_Shutdown();
Text_Remove(m_Text[i]); }
m_Text[i] = NULL; }
}
void Option_Sound_Shutdown(void)
{
for (int i = 0; i < TEXT_NUMBER_OF; i++) {
Text_Remove(m_Text[i]);
m_Text[i] = NULL;
} }
} }

View file

@ -3,3 +3,4 @@
#include "global/types.h" #include "global/types.h"
void Option_Sound(INVENTORY_ITEM *inv_item); void Option_Sound(INVENTORY_ITEM *inv_item);
void Option_Sound_Shutdown(void);

View file

@ -176,18 +176,11 @@ static void Inv_Construct(void)
} }
for (int i = 0; i < g_InvMainObjects; i++) { for (int i = 0; i < g_InvMainObjects; i++) {
INVENTORY_ITEM *inv_item = g_InvMainList[i]; Inv_Ring_ResetItem(g_InvMainList[i]);
inv_item->drawn_meshes = inv_item->which_meshes;
inv_item->current_frame = 0;
inv_item->goal_frame = inv_item->current_frame;
inv_item->y_rot = 0;
} }
for (int i = 0; i < g_InvOptionObjects; i++) { for (int i = 0; i < g_InvOptionObjects; i++) {
INVENTORY_ITEM *inv_item = g_InvOptionList[i]; Inv_Ring_ResetItem(g_InvOptionList[i]);
inv_item->current_frame = 0;
inv_item->goal_frame = 0;
inv_item->y_rot = 0;
} }
g_InvMainCurrent = 0; g_InvMainCurrent = 0;
@ -1070,7 +1063,7 @@ static GAMEFLOW_COMMAND Phase_Inventory_ControlFrame(void)
} }
Inv_Ring_InitHeader(ring); Inv_Ring_InitHeader(ring);
} else { } else {
Inv_Ring_RemoveHeader(ring); Inv_Ring_RemoveHeader();
} }
if (!motion->status || motion->status == RNG_CLOSING if (!motion->status || motion->status == RNG_CLOSING
@ -1109,6 +1102,11 @@ static GAMEFLOW_COMMAND Phase_Inventory_Control(int32_t nframes)
static void Phase_Inventory_End(void) static void Phase_Inventory_End(void)
{ {
INVENTORY_ITEM *const inv_item = m_Ring.list[m_Ring.current_object];
if (inv_item != NULL) {
Option_Shutdown(inv_item);
}
Inv_Destroy(); Inv_Destroy();
if (g_Config.enable_buffering) { if (g_Config.enable_buffering) {
g_OldInputDB.any = 0; g_OldInputDB.any = 0;

View file

@ -49,8 +49,10 @@ void Requester_Shutdown(REQUEST_INFO *req)
Requester_ClearTextstrings(req); Requester_ClearTextstrings(req);
Memory_FreePointer(&req->heading_text); Memory_FreePointer(&req->heading_text);
for (int i = 0; i < req->max_items; i++) { if (req->items != NULL) {
Memory_FreePointer(&req->items[i].content_text); for (int i = 0; i < req->max_items; i++) {
Memory_FreePointer(&req->items[i].content_text);
}
} }
Memory_FreePointer(&req->items); Memory_FreePointer(&req->items);
} }
@ -66,9 +68,11 @@ void Requester_ClearTextstrings(REQUEST_INFO *req)
Text_Remove(req->moredown); Text_Remove(req->moredown);
req->moredown = NULL; req->moredown = NULL;
for (int i = 0; i < req->max_items; i++) { if (req->items != NULL) {
Text_Remove(req->items[i].content); for (int i = 0; i < req->max_items; i++) {
req->items[i].content = NULL; Text_Remove(req->items[i].content);
req->items[i].content = NULL;
}
} }
req->items_used = 0; req->items_used = 0;

View file

@ -135,7 +135,6 @@ void Shell_Init(const char *gameflow_path)
return; return;
} }
Option_Init();
Savegame_ScanSavedGames(); Savegame_ScanSavedGames();
Savegame_HighlightNewestSlot(); Savegame_HighlightNewestSlot();
@ -151,7 +150,6 @@ void Shell_Shutdown(void)
Sound_Shutdown(); Sound_Shutdown();
Music_Shutdown(); Music_Shutdown();
Savegame_Shutdown(); Savegame_Shutdown();
Option_Shutdown();
Console_Shutdown(); Console_Shutdown();
Log_Shutdown(); Log_Shutdown();
} }