Show better error messages for some reasons plugins fail to load, fixes #1076

This commit is contained in:
UnknownShadow200 2023-10-17 08:12:38 +11:00
parent 09bfca5217
commit 9bbee1cb8f
4 changed files with 48 additions and 32 deletions

View File

@ -221,13 +221,7 @@ static void UseModeEnhanced(void* w) { ChooseMode_Click(false, false); }
static void UseModeClassicHax(void* w) { ChooseMode_Click(true, true); } static void UseModeClassicHax(void* w) { ChooseMode_Click(true, true); }
static void UseModeClassic(void* w) { ChooseMode_Click(true, false); } static void UseModeClassic(void* w) { ChooseMode_Click(true, false); }
static void ChooseModeScreen_Show(struct LScreen* s_) { static void ChooseModeScreen_AddWidgets(struct ChooseModeScreen* s) {
struct ChooseModeScreen* s = (struct ChooseModeScreen*)s_;
s->widgets = chooseMode_widgets;
s->maxWidgets = Array_Elems(chooseMode_widgets);
s->numWidgets = 0;
LLine_Init(s, &s->seps[0], 490, mode_seps0); LLine_Init(s, &s->seps[0], 490, mode_seps0);
LLine_Init(s, &s->seps[1], 490, mode_seps1); LLine_Init(s, &s->seps[1], 490, mode_seps1);
@ -254,6 +248,15 @@ static void ChooseModeScreen_Show(struct LScreen* s_) {
} }
} }
static void ChooseModeScreen_Show(struct LScreen* s_) {
struct ChooseModeScreen* s = (struct ChooseModeScreen*)s_;
s->widgets = chooseMode_widgets;
s->maxWidgets = Array_Elems(chooseMode_widgets);
s->numWidgets = 0;
ChooseModeScreen_AddWidgets(s);
}
void ChooseModeScreen_SetActive(cc_bool firstTime) { void ChooseModeScreen_SetActive(cc_bool firstTime) {
struct ChooseModeScreen* s = &ChooseModeScreen; struct ChooseModeScreen* s = &ChooseModeScreen;
LScreen_Reset((struct LScreen*)s); LScreen_Reset((struct LScreen*)s);
@ -417,8 +420,8 @@ static void ColoursScreen_Init(struct LScreen* s_) {
LButton_Init(s, &s->btnBack, 80, 35, "Back", LButton_Init(s, &s->btnBack, 80, 35, "Back",
SwitchToThemes, clr_btnBack); SwitchToThemes, clr_btnBack);
LCheckbox_Init(s, &s->cbClassic, "Classic style", clr_cbClassic); LCheckbox_Init(s, &s->cbClassic, "Classic style",
s->cbClassic.ValueChanged = ColoursScreen_ToggleBG; ColoursScreen_ToggleBG, clr_cbClassic);
} }
static void ColoursScreen_Show(struct LScreen* s_) { static void ColoursScreen_Show(struct LScreen* s_) {
@ -1401,13 +1404,17 @@ static void SettingsScreen_AddWidgets(struct SettingsScreen* s) {
} }
#if defined CC_BUILD_MOBILE #if defined CC_BUILD_MOBILE
LCheckbox_Init(s, &s->cbExtra, "Force landscape", set_cbExtra); LCheckbox_Init(s, &s->cbExtra, "Force landscape",
SettingsScreen_LockOrientation, set_cbExtra);
#else #else
LCheckbox_Init(s, &s->cbExtra, "Close this after game starts", set_cbExtra); LCheckbox_Init(s, &s->cbExtra, "Close this after game starts",
SettingsScreen_AutoClose, set_cbExtra);
#endif #endif
LCheckbox_Init(s, &s->cbEmpty, "Show empty servers in list", set_cbEmpty); LCheckbox_Init(s, &s->cbEmpty, "Show empty servers in list",
LCheckbox_Init(s, &s->cbScale, "Use display scaling", set_cbScale); SettingsScreen_ShowEmpty, set_cbEmpty);
LCheckbox_Init(s, &s->cbScale, "Use display scaling",
SettingsScreen_DPIScaling, set_cbScale);
LButton_Init(s, &s->btnBack, 80, 35, "Back", LButton_Init(s, &s->btnBack, 80, 35, "Back",
SwitchToMain, set_btnBack); SwitchToMain, set_btnBack);
} }
@ -1421,17 +1428,12 @@ static void SettingsScreen_Show(struct LScreen* s_) {
SettingsScreen_AddWidgets(s); SettingsScreen_AddWidgets(s);
#if defined CC_BUILD_MOBILE #if defined CC_BUILD_MOBILE
s->cbExtra.ValueChanged = SettingsScreen_LockOrientation;
LCheckbox_Set(&s->cbExtra, Options_GetBool(OPT_LANDSCAPE_MODE, false)); LCheckbox_Set(&s->cbExtra, Options_GetBool(OPT_LANDSCAPE_MODE, false));
#else #else
s->cbExtra.ValueChanged = SettingsScreen_AutoClose;
LCheckbox_Set(&s->cbExtra, Options_GetBool(LOPT_AUTO_CLOSE, false)); LCheckbox_Set(&s->cbExtra, Options_GetBool(LOPT_AUTO_CLOSE, false));
#endif #endif
s->cbEmpty.ValueChanged = SettingsScreen_ShowEmpty;
LCheckbox_Set(&s->cbEmpty, Launcher_ShowEmptyServers); LCheckbox_Set(&s->cbEmpty, Launcher_ShowEmptyServers);
s->cbScale.ValueChanged = SettingsScreen_DPIScaling;
LCheckbox_Set(&s->cbScale, DisplayInfo.DPIScaling); LCheckbox_Set(&s->cbScale, DisplayInfo.DPIScaling);
} }
@ -1679,11 +1681,8 @@ static void UpdatesScreen_Rel_1(void* w) { UpdatesScreen_Get(true, 1); }
static void UpdatesScreen_Dev_0(void* w) { UpdatesScreen_Get(false, 0); } static void UpdatesScreen_Dev_0(void* w) { UpdatesScreen_Get(false, 0); }
static void UpdatesScreen_Dev_1(void* w) { UpdatesScreen_Get(false, 1); } static void UpdatesScreen_Dev_1(void* w) { UpdatesScreen_Get(false, 1); }
static void UpdatesScreen_Init(struct LScreen* s_) { static void UpdatesScreen_AddWidgets(struct UpdatesScreen* s) {
struct UpdatesScreen* s = (struct UpdatesScreen*)s_; int builds = Updater_Info.numBuilds;
int builds = Updater_Info.numBuilds;
s->widgets = updates_widgets;
s->maxWidgets = Array_Elems(updates_widgets);
LLine_Init(s, &s->seps[0], 320, upd_seps0); LLine_Init(s, &s->seps[0], 320, upd_seps0);
LLine_Init(s, &s->seps[1], 320, upd_seps1); LLine_Init(s, &s->seps[1], 320, upd_seps1);
@ -1716,6 +1715,11 @@ static void UpdatesScreen_Show(struct LScreen* s_) {
cc_uint64 buildTime; cc_uint64 buildTime;
cc_result res; cc_result res;
s->widgets = updates_widgets;
s->maxWidgets = Array_Elems(updates_widgets);
s->numWidgets = 0;
UpdatesScreen_AddWidgets(s);
/* Initially fill out with update check result from main menu */ /* Initially fill out with update check result from main menu */
if (CheckUpdateTask.Base.completed && CheckUpdateTask.Base.success) { if (CheckUpdateTask.Base.completed && CheckUpdateTask.Base.success) {
UpdatesScreen_FormatBoth(s); UpdatesScreen_FormatBoth(s);
@ -1748,10 +1752,9 @@ static void UpdatesScreen_Free(struct LScreen* s_) {
void UpdatesScreen_SetActive(void) { void UpdatesScreen_SetActive(void) {
struct UpdatesScreen* s = &UpdatesScreen; struct UpdatesScreen* s = &UpdatesScreen;
LScreen_Reset((struct LScreen*)s); LScreen_Reset((struct LScreen*)s);
s->Init = UpdatesScreen_Init; s->Show = UpdatesScreen_Show;
s->Show = UpdatesScreen_Show; s->Tick = UpdatesScreen_Tick;
s->Tick = UpdatesScreen_Tick; s->Free = UpdatesScreen_Free;
s->Free = UpdatesScreen_Free;
s->title = "Update game"; s->title = "Update game";
s->onEscapeWidget = (struct LWidget*)&s->btnBack; s->onEscapeWidget = (struct LWidget*)&s->btnBack;

View File

@ -147,11 +147,12 @@ static const struct LWidgetVTABLE lcheckbox_VTABLE = {
NULL, NULL /* Select */ NULL, NULL /* Select */
}; };
void LCheckbox_Init(void* screen, struct LCheckbox* w, const char* text, void LCheckbox_Init(void* screen, struct LCheckbox* w, const char* text,
const struct LLayout* layouts) { LCheckboxChanged onChanged, const struct LLayout* layouts) {
w->VTABLE = &lcheckbox_VTABLE; w->VTABLE = &lcheckbox_VTABLE;
w->type = LWIDGET_CHECKBOX; w->type = LWIDGET_CHECKBOX;
w->layouts = layouts; w->layouts = layouts;
w->autoSelectable = true; w->autoSelectable = true;
w->ValueChanged = onChanged;
w->text = String_FromReadonly(text); w->text = String_FromReadonly(text);
LBackend_CheckboxInit(w); LBackend_CheckboxInit(w);

View File

@ -44,7 +44,6 @@ struct LWidgetVTABLE {
}; };
#define LWidget_Layout \ #define LWidget_Layout \
const struct LWidgetVTABLE* VTABLE; /* General widget functions */ \ const struct LWidgetVTABLE* VTABLE; /* General widget functions */ \
int x, y, width, height; /* Top left corner and dimensions of this widget */ \ int x, y, width, height; /* Top left corner and dimensions of this widget */ \
@ -78,14 +77,15 @@ CC_NOINLINE void LButton_SetConst(struct LButton* w, const char* text);
CC_NOINLINE void LButton_DrawBackground(struct Context2D* ctx, int x, int y, int width, int height, cc_bool active); CC_NOINLINE void LButton_DrawBackground(struct Context2D* ctx, int x, int y, int width, int height, cc_bool active);
struct LCheckbox; struct LCheckbox;
typedef void (*LCheckboxChanged)(struct LCheckbox* cb);
struct LCheckbox { struct LCheckbox {
LWidget_Layout LWidget_Layout
cc_bool value; cc_bool value;
cc_string text; cc_string text;
void (*ValueChanged)(struct LCheckbox* w); LCheckboxChanged ValueChanged;
}; };
CC_NOINLINE void LCheckbox_Init(void* screen, struct LCheckbox* w, const char* text, CC_NOINLINE void LCheckbox_Init(void* screen, struct LCheckbox* w, const char* text,
const struct LLayout* layouts); LCheckboxChanged onChanged, const struct LLayout* layouts);
CC_NOINLINE void LCheckbox_Set(struct LCheckbox* w, cc_bool value); CC_NOINLINE void LCheckbox_Set(struct LCheckbox* w, cc_bool value);
struct LInput; struct LInput;

View File

@ -785,9 +785,21 @@ cc_bool DynamicLib_DescribeError(cc_string* dst) {
/* Plugin may have been compiled to load symbols from ClassiCube.exe, */ /* Plugin may have been compiled to load symbols from ClassiCube.exe, */
/* but the user might have renamed it to something else */ /* but the user might have renamed it to something else */
if (res == ERROR_MOD_NOT_FOUND && loadingPlugin) { if (res == ERROR_MOD_NOT_FOUND && loadingPlugin) {
String_AppendConst(dst, "\n Make sure the ClassiCube executable is named ClassiCube.exe"); String_AppendConst(dst, "\n Make sure the ClassiCube executable is named ClassiCube.exe");
} }
if (res == ERROR_PROC_NOT_FOUND && loadingPlugin) {
String_AppendConst(dst, "\n The plugin or your game may be outdated");
}
/* User might be trying to use 32 bit plugin with 64 bit executable, or vice versa */
if (res == ERROR_BAD_EXE_FORMAT && loadingPlugin) {
if (sizeof(cc_uintptr) == 4) {
String_AppendConst(dst, "\n Try using a 32 bit version of the plugin instead");
} else {
String_AppendConst(dst, "\n Try using a 64 bit version of the plugin instead");
}
}
return true; return true;
} }