#include "options.h" #include "color.h" #include "combat.h" #include "combat_ai.h" #include "core.h" #include "cycle.h" #include "debug.h" #include "draw.h" #include "game.h" #include "game_config.h" #include "game_mouse.h" #include "game_sound.h" #include "grayscale.h" #include "loadsave.h" #include "memory.h" #include "scripts.h" #include "text_font.h" #include "text_object.h" #include "tile.h" #include "window_manager.h" #include #include #include // 0x48FBD0 const int _row1Ytab[PRIMARY_PREF_COUNT] = { 48, 125, 203, 286, 363, }; // 0x48FBDA const int _row2Ytab[SECONDARY_PREF_COUNT] = { 49, 116, 181, 247, 313, 380, }; // 0x48FBE6 const int _row3Ytab[RANGE_PREF_COUNT] = { 19, 94, 165, 216, 268, 319, 369, 420, }; // x offsets for primary preferences from the knob position // 0x48FBF6 const short word_48FBF6[PRIMARY_OPTION_VALUE_COUNT] = { 2, 25, 46, 46, }; // y offsets for primary preference option values from the knob position // 0x48FBFE const short word_48FBFE[PRIMARY_OPTION_VALUE_COUNT] = { 10, -4, 10, 31, }; // x offsets for secondary prefrence option values from the knob position // 0x48FC06 const short word_48FC06[SECONDARY_OPTION_VALUE_COUNT] = { 4, 21, }; // 0x48FC0C const int gPauseWindowFrmIds[PAUSE_WINDOW_FRM_COUNT] = { 208, // charwin.frm - character editor 209, // donebox.frm - character editor 8, // lilredup.frm - little red button up 9, // lilreddn.frm - little red button down }; // y offsets for secondary preferences // 0x48FC30 const int dword_48FC30[SECONDARY_PREF_COUNT] = { 66, // combat messages 133, // combat taunts 200, // language filter 264, // running 331, // subtitles 397, // item highlight }; // y offsets for primary preferences // 0x48FC1C const int dword_48FC1C[PRIMARY_PREF_COUNT] = { 66, // game difficulty 143, // combat difficulty 222, // violence level 304, // target highlight 382, // combat looks }; // 0x50C168 const double dbl_50C168 = 1.17999267578125; // 0x50C170 const double dbl_50C170 = 0.01124954223632812; // 0x50C178 const double dbl_50C178 = -0.01124954223632812; // 0x50C180 const double dbl_50C180 = 1.17999267578125; // 0x50C2D0 const double dbl_50C2D0 = -1.0; // 0x50C2D8 const double dbl_50C2D8 = 0.2; // 0x50C2E0 const double dbl_50C2E0 = 2.0; // 0x5197C0 const int gOptionsWindowFrmIds[OPTIONS_WINDOW_FRM_COUNT] = { 220, // opbase.frm - character editor 222, // opbtnon.frm - character editor 221, // opbtnoff.frm - character editor }; // 0x5197CC const int gPreferencesWindowFrmIds[PREFERENCES_WINDOW_FRM_COUNT] = { 240, // prefscrn.frm - options screen 241, // prfsldof.frm - options screen 242, // prfbknbs.frm - options screen 243, // prflknbs.frm - options screen 244, // prfxin.frm - options screen 245, // prfxout.frm - options screen 246, // prefcvr.frm - options screen 247, // prfsldon.frm - options screen 8, // lilredup.frm - little red button up 9, // lilreddn.frm - little red button down }; // 0x5197F8 PreferenceDescription gPreferenceDescriptions[PREF_COUNT] = { { 3, 0, 76, 71, 0, 0, { 203, 204, 205, 0 }, 0, GAME_CONFIG_GAME_DIFFICULTY_KEY, 0, 0, &gPreferencesGameDifficulty1 }, { 3, 0, 76, 149, 0, 0, { 206, 204, 208, 0 }, 0, GAME_CONFIG_COMBAT_DIFFICULTY_KEY, 0, 0, &gPreferencesCombatDifficulty1 }, { 4, 0, 76, 226, 0, 0, { 214, 215, 204, 216 }, 0, GAME_CONFIG_VIOLENCE_LEVEL_KEY, 0, 0, &gPreferencesViolenceLevel1 }, { 3, 0, 76, 309, 0, 0, { 202, 201, 213, 0 }, 0, GAME_CONFIG_TARGET_HIGHLIGHT_KEY, 0, 0, &gPreferencesTargetHighlight1 }, { 2, 0, 76, 387, 0, 0, { 202, 201, 0, 0 }, 0, GAME_CONFIG_COMBAT_LOOKS_KEY, 0, 0, &gPreferencesCombatLooks1 }, { 2, 0, 299, 74, 0, 0, { 211, 212, 0, 0 }, 0, GAME_CONFIG_COMBAT_MESSAGES_KEY, 0, 0, &gPreferencesCombatMessages1 }, { 2, 0, 299, 141, 0, 0, { 202, 201, 0, 0 }, 0, GAME_CONFIG_COMBAT_TAUNTS_KEY, 0, 0, &gPreferencesCombatTaunts1 }, { 2, 0, 299, 207, 0, 0, { 202, 201, 0, 0 }, 0, GAME_CONFIG_LANGUAGE_FILTER_KEY, 0, 0, &gPreferencesLanguageFilter1 }, { 2, 0, 299, 271, 0, 0, { 209, 219, 0, 0 }, 0, GAME_CONFIG_RUNNING_KEY, 0, 0, &gPreferencesRunning1 }, { 2, 0, 299, 338, 0, 0, { 202, 201, 0, 0 }, 0, GAME_CONFIG_SUBTITLES_KEY, 0, 0, &gPreferencesSubtitles1 }, { 2, 0, 299, 404, 0, 0, { 202, 201, 0, 0 }, 0, GAME_CONFIG_ITEM_HIGHLIGHT_KEY, 0, 0, &gPreferencesItemHighlight1 }, { 2, 0, 374, 50, 0, 0, { 207, 210, 0, 0 }, 0, GAME_CONFIG_COMBAT_SPEED_KEY, 0.0, 50.0, &gPreferencesCombatSpeed1 }, { 3, 0, 374, 125, 0, 0, { 217, 209, 218, 0 }, 0, GAME_CONFIG_TEXT_BASE_DELAY_KEY, 1.0, 6.0, NULL }, { 4, 0, 374, 196, 0, 0, { 202, 221, 209, 222 }, 0, GAME_CONFIG_MASTER_VOLUME_KEY, 0, 32767.0, &gPreferencesMasterVolume1 }, { 4, 0, 374, 247, 0, 0, { 202, 221, 209, 222 }, 0, GAME_CONFIG_MUSIC_VOLUME_KEY, 0, 32767.0, &gPreferencesMusicVolume1 }, { 4, 0, 374, 298, 0, 0, { 202, 221, 209, 222 }, 0, GAME_CONFIG_SNDFX_VOLUME_KEY, 0, 32767.0, &gPreferencesSoundEffectsVolume1 }, { 4, 0, 374, 349, 0, 0, { 202, 221, 209, 222 }, 0, GAME_CONFIG_SPEECH_VOLUME_KEY, 0, 32767.0, &gPreferencesSpeechVolume1 }, { 2, 0, 374, 400, 0, 0, { 207, 223, 0, 0 }, 0, GAME_CONFIG_BRIGHTNESS_KEY, 1.0, 1.17999267578125, NULL }, { 2, 0, 374, 451, 0, 0, { 207, 218, 0, 0 }, 0, GAME_CONFIG_MOUSE_SENSITIVITY_KEY, 1.0, 2.5, NULL }, }; // 0x6637D0 Size gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_COUNT]; // 0x6637E8 MessageList gOptionsMessageList; // 0x6637F0 Size gPreferencesWindowFrmSizes[PREFERENCES_WINDOW_FRM_COUNT]; // 0x663840 MessageListItem gOptionsMessageListItem; // 0x663850 unsigned char* gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_COUNT]; // 0x663878 unsigned char* _opbtns[OPTIONS_WINDOW_BUTTONS_COUNT]; // 0x6638A0 CacheEntry* gPreferencesWindowFrmHandles[PREFERENCES_WINDOW_FRM_COUNT]; // 0x6638C8 double gPreferencesTextBaseDelay2; // 0x6638D0 double gPreferencesBrightness1; // 0x6638D8 double gPreferencesBrightness2; // 0x6638E0 double gPreferencesTextBaseDelay1; // 0x6638E8 double gPreferencesMouseSensitivity1; // 0x6638F0 double gPreferencesMouseSensitivity2; // 0x6638F8 unsigned char* gPreferencesWindowBuffer; // 0x6638FC bool gOptionsWindowGameMouseObjectsWasVisible; // 0x663900 int gOptionsWindow; // 0x663904 int gPreferencesWindow; // 0x663908 unsigned char* gOptionsWindowBuffer; // 0x66390C CacheEntry* gOptionsWindowFrmHandles[OPTIONS_WINDOW_FRM_COUNT]; // 0x663918 unsigned char* gOptionsWindowFrmData[OPTIONS_WINDOW_FRM_COUNT]; // 0x663924 int gPreferencesGameDifficulty2; // 0x663928 int gPreferencesCombatDifficulty2; // 0x66392C int gPreferencesViolenceLevel2; // 0x663930 int gPreferencesTargetHighlight2; // 0x663934 int gPreferencesCombatLooks2; // 0x663938 int gPreferencesCombatMessages2; // 0x66393C int gPreferencesCombatTaunts2; // 0x663940 int gPreferencesLanguageFilter2; // 0x663944 int gPreferencesRunning2; // 0x663948 int gPreferencesSubtitles2; // 0x66394C int gPreferencesItemHighlight2; // 0x663950 int gPreferencesCombatSpeed2; // 0x663954 int gPreferencesPlayerSpeedup2; // 0x663958 int gPreferencesMasterVolume2; // 0x66395C int gPreferencesMusicVolume2; // 0x663960 int gPreferencesSoundEffectsVolume2; // 0x663964 int gPreferencesSpeechVolume2; // 0x663970 int gPreferencesSoundEffectsVolume1; // 0x663974 int gPreferencesSubtitles1; // 0x663978 int gPreferencesLanguageFilter1; // 0x66397C int gPreferencesSpeechVolume1; // 0x663980 int gPreferencesMasterVolume1; // 0x663984 int gPreferencesPlayerSpeedup1; // 0x663988 int gPreferencesCombatTaunts1; // 0x66398C int gOptionsWindowOldFont; // 0x663990 int gPreferencesMusicVolume1; // 0x663994 bool gOptionsWindowIsoWasEnabled; // 0x663998 int gPreferencesRunning1; // 0x66399C int gPreferencesCombatSpeed1; // int _plyrspdbid; // 0x6639A4 int gPreferencesItemHighlight1; // 0x6639A8 bool _changed; // 0x6639AC int gPreferencesCombatMessages1; // 0x6639B0 int gPreferencesTargetHighlight1; // 0x6639B4 int gPreferencesCombatDifficulty1; // 0x6639B8 int gPreferencesViolenceLevel1; // 0x6639BC int gPreferencesGameDifficulty1; // 0x6639C0 int gPreferencesCombatLooks1; // 0x48FC48 int showOptions() { return showOptionsWithInitialKeyCode(-1); } // 0x48FC50 int showOptionsWithInitialKeyCode(int initialKeyCode) { if (optionsWindowInit() == -1) { debugPrint("\nOPTION MENU: Error loading option dialog data!\n"); return -1; } int rc = -1; while (rc == -1) { int keyCode = _get_input(); bool showPreferences = false; if (initialKeyCode != -1) { keyCode = initialKeyCode; rc = 1; } if (keyCode == KEY_ESCAPE || keyCode == 504 || _game_user_wants_to_quit != 0) { rc = 0; } else { switch (keyCode) { case KEY_RETURN: case KEY_UPPERCASE_O: case KEY_LOWERCASE_O: case KEY_UPPERCASE_D: case KEY_LOWERCASE_D: soundPlayFile("ib1p1xx1"); rc = 0; break; case KEY_UPPERCASE_S: case KEY_LOWERCASE_S: case 500: if (lsgSaveGame(1) != 1) { rc = 1; } break; case KEY_UPPERCASE_L: case KEY_LOWERCASE_L: case 501: if (lsgLoadGame(LOAD_SAVE_MODE_NORMAL) == 1) { rc = 1; } break; case KEY_UPPERCASE_P: case KEY_LOWERCASE_P: soundPlayFile("ib1p1xx1"); // FALLTHROUGH case 502: // PREFERENCES showPreferences = true; break; case KEY_PLUS: case KEY_EQUAL: brightnessIncrease(); break; case KEY_UNDERSCORE: case KEY_MINUS: brightnessDecrease(); break; } } if (showPreferences) { _do_prefscreen(); } else { switch (keyCode) { case KEY_F12: takeScreenshot(); break; case KEY_UPPERCASE_E: case KEY_LOWERCASE_E: case KEY_CTRL_Q: case KEY_CTRL_X: case KEY_F10: case 503: showQuitConfirmationDialog(); break; } } } optionsWindowFree(); return rc; } // 0x48FE14 int optionsWindowInit() { gOptionsWindowOldFont = fontGetCurrent(); if (!messageListInit(&gOptionsMessageList)) { return -1; } char path[MAX_PATH]; sprintf(path, "%s%s", asc_5186C8, "options.msg"); if (!messageListLoad(&gOptionsMessageList, path)) { return -1; } for (int index = 0; index < OPTIONS_WINDOW_FRM_COUNT; index++) { int fid = buildFid(6, gOptionsWindowFrmIds[index], 0, 0, 0); gOptionsWindowFrmData[index] = artLockFrameDataReturningSize(fid, &(gOptionsWindowFrmHandles[index]), &(gOptionsWindowFrmSizes[index].width), &(gOptionsWindowFrmSizes[index].height)); if (gOptionsWindowFrmData[index] == NULL) { while (--index >= 0) { artUnlock(gOptionsWindowFrmHandles[index]); } messageListFree(&gOptionsMessageList); return -1; } } int cycle = 0; for (int index = 0; index < OPTIONS_WINDOW_BUTTONS_COUNT; index++) { _opbtns[index] = internal_malloc(gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].width * gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].height + 1024); if (_opbtns[index] == NULL) { while (--index >= 0) { internal_free(_opbtns[index]); } for (int index = 0; index < OPTIONS_WINDOW_FRM_COUNT; index++) { artUnlock(gOptionsWindowFrmHandles[index]); } messageListFree(&gOptionsMessageList); return -1; } cycle = cycle ^ 1; memcpy(_opbtns[index], gOptionsWindowFrmData[cycle + 1], gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].width * gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].height); } int optionsWindowX = (screenGetWidth() - gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BACKGROUND].width) / 2; int optionsWindowY = (screenGetHeight() - gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BACKGROUND].height) / 2 - 60; gOptionsWindow = windowCreate(optionsWindowX, optionsWindowY, gOptionsWindowFrmSizes[0].width, gOptionsWindowFrmSizes[0].height, 256, WINDOW_FLAG_0x10 | WINDOW_FLAG_0x02); if (gOptionsWindow == -1) { for (int index = 0; index < OPTIONS_WINDOW_BUTTONS_COUNT; index++) { internal_free(_opbtns[index]); } for (int index = 0; index < OPTIONS_WINDOW_FRM_COUNT; index++) { artUnlock(gOptionsWindowFrmHandles[index]); } messageListFree(&gOptionsMessageList); return -1; } gOptionsWindowIsoWasEnabled = isoDisable(); gOptionsWindowGameMouseObjectsWasVisible = gameMouseObjectsIsVisible(); if (gOptionsWindowGameMouseObjectsWasVisible) { gameMouseObjectsHide(); } gameMouseSetCursor(MOUSE_CURSOR_ARROW); gOptionsWindowBuffer = windowGetBuffer(gOptionsWindow); memcpy(gOptionsWindowBuffer, gOptionsWindowFrmData[OPTIONS_WINDOW_FRM_BACKGROUND], gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BACKGROUND].width * gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BACKGROUND].height); fontSetCurrent(103); int textY = (gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].height - fontGetLineHeight()) / 2 + 1; int buttonY = 17; for (int index = 0; index < OPTIONS_WINDOW_BUTTONS_COUNT; index += 2) { char text[128]; const char* msg = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, index / 2); strcpy(text, msg); int textX = (gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].width - fontGetStringWidth(text)) / 2; if (textX < 0) { textX = 0; } fontDrawText(_opbtns[index] + gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].width * textY + textX, text, gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].width, gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].width, _colorTable[18979]); fontDrawText(_opbtns[index + 1] + gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].width * textY + textX, text, gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].width, gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].width, _colorTable[14723]); int btn = buttonCreate(gOptionsWindow, 13, buttonY, gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].width, gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].height, -1, -1, -1, index / 2 + 500, _opbtns[index], _opbtns[index + 1], NULL, 32); if (btn != -1) { buttonSetCallbacks(btn, _gsound_lrg_butt_press, _gsound_lrg_butt_release); } buttonY += gOptionsWindowFrmSizes[OPTIONS_WINDOW_FRM_BUTTON_ON].height + 3; } fontSetCurrent(101); windowRefresh(gOptionsWindow); return 0; } // 0x490244 int optionsWindowFree() { windowDestroy(gOptionsWindow); fontSetCurrent(gOptionsWindowOldFont); messageListFree(&gOptionsMessageList); for (int index = 0; index < OPTIONS_WINDOW_BUTTONS_COUNT; index++) { internal_free(_opbtns[index]); } for (int index = 0; index < OPTIONS_WINDOW_FRM_COUNT; index++) { artUnlock(gOptionsWindowFrmHandles[index]); } if (gOptionsWindowGameMouseObjectsWasVisible) { gameMouseObjectsShow(); } if (gOptionsWindowIsoWasEnabled) { isoEnable(); } return 0; } // 0x4902B0 int showPause(bool a1) { int graphicIds[PAUSE_WINDOW_FRM_COUNT]; unsigned char* frmData[PAUSE_WINDOW_FRM_COUNT]; CacheEntry* frmHandles[PAUSE_WINDOW_FRM_COUNT]; Size frmSizes[PAUSE_WINDOW_FRM_COUNT]; static_assert(sizeof(graphicIds) == sizeof(gPauseWindowFrmIds), "wrong size"); memcpy(graphicIds, gPauseWindowFrmIds, sizeof(gPauseWindowFrmIds)); bool gameMouseWasVisible; if (!a1) { gOptionsWindowIsoWasEnabled = isoDisable(); colorCycleDisable(); gameMouseWasVisible = gameMouseObjectsIsVisible(); if (gameMouseWasVisible) { gameMouseObjectsHide(); } } gameMouseSetCursor(MOUSE_CURSOR_ARROW); _ShadeScreen(a1); for (int index = 0; index < PAUSE_WINDOW_FRM_COUNT; index++) { int fid = buildFid(6, graphicIds[index], 0, 0, 0); frmData[index] = artLockFrameDataReturningSize(fid, &(frmHandles[index]), &(frmSizes[index].width), &(frmSizes[index].height)); if (frmData[index] == NULL) { while (--index >= 0) { artUnlock(frmHandles[index]); } debugPrint("\n** Error loading pause window graphics! **\n"); return -1; } } if (!messageListInit(&gOptionsMessageList)) { // FIXME: Leaking graphics. return -1; } char path[MAX_PATH]; sprintf(path, "%s%s", asc_5186C8, "options.msg"); if (!messageListLoad(&gOptionsMessageList, path)) { // FIXME: Leaking graphics. return -1; } int x = (640 - frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].width) / 2; int y = (480 - frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].height) / 2; if (a1) { x -= 65; y -= 24; } else { y -= 54; } int window = windowCreate(x, y, frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].width, frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].height, 256, WINDOW_FLAG_0x10 | WINDOW_FLAG_0x02); if (window == -1) { for (int index = 0; index < PAUSE_WINDOW_FRM_COUNT; index++) { artUnlock(frmHandles[index]); } messageListFree(&gOptionsMessageList); debugPrint("\n** Error opening pause window! **\n"); return -1; } unsigned char* windowBuffer = windowGetBuffer(window); memcpy(windowBuffer, frmData[PAUSE_WINDOW_FRM_BACKGROUND], frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].width * frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].height); blitBufferToBufferTrans(frmData[PAUSE_WINDOW_FRM_DONE_BOX], frmSizes[PAUSE_WINDOW_FRM_DONE_BOX].width, frmSizes[PAUSE_WINDOW_FRM_DONE_BOX].height, frmSizes[PAUSE_WINDOW_FRM_DONE_BOX].width, windowBuffer + frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].width * 42 + 13, frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].width); gOptionsWindowOldFont = fontGetCurrent(); fontSetCurrent(103); char* messageItemText; messageItemText = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, 300); fontDrawText(windowBuffer + frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].width * 45 + 52, messageItemText, frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].width, frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].width, _colorTable[18979]); fontSetCurrent(104); messageItemText = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, 301); strcpy(path, messageItemText); int length = fontGetStringWidth(path); fontDrawText(windowBuffer + frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].width * 10 + 2 + (frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].width - length) / 2, path, frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].width, frmSizes[PAUSE_WINDOW_FRM_BACKGROUND].width, _colorTable[18979]); int doneBtn = buttonCreate(window, 26, 46, frmSizes[PAUSE_WINDOW_FRM_LITTLE_RED_BUTTON_UP].width, frmSizes[PAUSE_WINDOW_FRM_LITTLE_RED_BUTTON_UP].height, -1, -1, -1, 504, frmData[PAUSE_WINDOW_FRM_LITTLE_RED_BUTTON_UP], frmData[PAUSE_WINDOW_FRM_LITTLE_RED_BUTTON_DOWN], NULL, BUTTON_FLAG_TRANSPARENT); if (doneBtn != -1) { buttonSetCallbacks(doneBtn, _gsound_red_butt_press, _gsound_red_butt_release); } windowRefresh(window); bool done = false; while (!done) { int keyCode = _get_input(); switch (keyCode) { case KEY_PLUS: case KEY_EQUAL: brightnessIncrease(); break; case KEY_MINUS: case KEY_UNDERSCORE: brightnessDecrease(); break; default: if (keyCode != -1 && keyCode != -2) { done = true; } if (_game_user_wants_to_quit != 0) { done = true; } } } if (!a1) { tileWindowRefresh(); } windowDestroy(window); for (int index = 0; index < PAUSE_WINDOW_FRM_COUNT; index++) { artUnlock(frmHandles[index]); } messageListFree(&gOptionsMessageList); if (!a1) { if (gameMouseWasVisible) { gameMouseObjectsShow(); } if (gOptionsWindowIsoWasEnabled) { isoEnable(); } colorCycleEnable(); gameMouseSetCursor(MOUSE_CURSOR_ARROW); } fontSetCurrent(gOptionsWindowOldFont); return 0; } // 0x490748 void _ShadeScreen(bool a1) { if (a1) { mouseHideCursor(); } else { mouseHideCursor(); tileWindowRefresh(); int windowHeight = windowGetHeight(gIsoWindow); unsigned char* windowBuffer = windowGetBuffer(gIsoWindow); grayscalePaletteApply(windowBuffer, 640, windowHeight, 640); windowRefresh(gIsoWindow); } mouseShowCursor(); } // 0x492AA8 void _SetSystemPrefs() { preferencesSetDefaults(false); configGetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_GAME_DIFFICULTY_KEY, &gPreferencesGameDifficulty1); configGetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_COMBAT_DIFFICULTY_KEY, &gPreferencesCombatDifficulty1); configGetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_VIOLENCE_LEVEL_KEY, &gPreferencesViolenceLevel1); configGetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_TARGET_HIGHLIGHT_KEY, &gPreferencesTargetHighlight1); configGetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_COMBAT_MESSAGES_KEY, &gPreferencesCombatMessages1); configGetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_COMBAT_LOOKS_KEY, &gPreferencesCombatLooks1); configGetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_COMBAT_TAUNTS_KEY, &gPreferencesCombatTaunts1); configGetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_LANGUAGE_FILTER_KEY, &gPreferencesLanguageFilter1); configGetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_RUNNING_KEY, &gPreferencesRunning1); configGetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_SUBTITLES_KEY, &gPreferencesSubtitles1); configGetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_ITEM_HIGHLIGHT_KEY, &gPreferencesItemHighlight1); configGetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_COMBAT_SPEED_KEY, &gPreferencesCombatSpeed1); configGetDouble(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_TEXT_BASE_DELAY_KEY, &gPreferencesTextBaseDelay1); configGetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_PLAYER_SPEEDUP_KEY, &gPreferencesPlayerSpeedup1); configGetInt(&gGameConfig, GAME_CONFIG_SOUND_KEY, GAME_CONFIG_MASTER_VOLUME_KEY, &gPreferencesMasterVolume1); configGetInt(&gGameConfig, GAME_CONFIG_SOUND_KEY, GAME_CONFIG_MUSIC_VOLUME_KEY, &gPreferencesMusicVolume1); configGetInt(&gGameConfig, GAME_CONFIG_SOUND_KEY, GAME_CONFIG_SNDFX_VOLUME_KEY, &gPreferencesSoundEffectsVolume1); configGetInt(&gGameConfig, GAME_CONFIG_SOUND_KEY, GAME_CONFIG_SPEECH_VOLUME_KEY, &gPreferencesSpeechVolume1); configGetDouble(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_BRIGHTNESS_KEY, &gPreferencesBrightness1); configGetDouble(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_MOUSE_SENSITIVITY_KEY, &gPreferencesMouseSensitivity1); _JustUpdate_(); } // Copy options (1) to (2). // // 0x493054 void _SaveSettings() { gPreferencesGameDifficulty2 = gPreferencesGameDifficulty1; gPreferencesCombatDifficulty2 = gPreferencesCombatDifficulty1; gPreferencesViolenceLevel2 = gPreferencesViolenceLevel1; gPreferencesTargetHighlight2 = gPreferencesTargetHighlight1; gPreferencesCombatLooks2 = gPreferencesCombatLooks1; gPreferencesCombatMessages2 = gPreferencesCombatMessages1; gPreferencesCombatTaunts2 = gPreferencesCombatTaunts1; gPreferencesLanguageFilter2 = gPreferencesLanguageFilter1; gPreferencesRunning2 = gPreferencesRunning1; gPreferencesSubtitles2 = gPreferencesSubtitles1; gPreferencesItemHighlight2 = gPreferencesItemHighlight1; gPreferencesCombatSpeed2 = gPreferencesCombatSpeed1; gPreferencesPlayerSpeedup2 = gPreferencesPlayerSpeedup1; gPreferencesMasterVolume2 = gPreferencesMasterVolume1; gPreferencesTextBaseDelay2 = gPreferencesTextBaseDelay1; gPreferencesMusicVolume2 = gPreferencesMusicVolume1; gPreferencesBrightness2 = gPreferencesBrightness1; gPreferencesSoundEffectsVolume2 = gPreferencesSoundEffectsVolume1; gPreferencesMouseSensitivity2 = gPreferencesMouseSensitivity1; gPreferencesSpeechVolume2 = gPreferencesSpeechVolume1; } // Copy options (2) to (1). // // 0x493128 void _RestoreSettings() { gPreferencesGameDifficulty1 = gPreferencesGameDifficulty2; gPreferencesCombatDifficulty1 = gPreferencesCombatDifficulty2; gPreferencesViolenceLevel1 = gPreferencesViolenceLevel2; gPreferencesTargetHighlight1 = gPreferencesTargetHighlight2; gPreferencesCombatLooks1 = gPreferencesCombatLooks2; gPreferencesCombatMessages1 = gPreferencesCombatMessages2; gPreferencesCombatTaunts1 = gPreferencesCombatTaunts2; gPreferencesLanguageFilter1 = gPreferencesLanguageFilter2; gPreferencesRunning1 = gPreferencesRunning2; gPreferencesSubtitles1 = gPreferencesSubtitles2; gPreferencesItemHighlight1 = gPreferencesItemHighlight2; gPreferencesCombatSpeed1 = gPreferencesCombatSpeed2; gPreferencesPlayerSpeedup1 = gPreferencesPlayerSpeedup2; gPreferencesMasterVolume1 = gPreferencesMasterVolume2; gPreferencesTextBaseDelay1 = gPreferencesTextBaseDelay2; gPreferencesMusicVolume1 = gPreferencesMusicVolume2; gPreferencesBrightness1 = gPreferencesBrightness2; gPreferencesSoundEffectsVolume1 = gPreferencesSoundEffectsVolume2; gPreferencesMouseSensitivity1 = gPreferencesMouseSensitivity2; gPreferencesSpeechVolume1 = gPreferencesSpeechVolume2; _JustUpdate_(); } // 0x492F60 void preferencesSetDefaults(bool a1) { gPreferencesCombatDifficulty1 = COMBAT_DIFFICULTY_NORMAL; gPreferencesViolenceLevel1 = VIOLENCE_LEVEL_MAXIMUM_BLOOD; gPreferencesTargetHighlight1 = TARGET_HIGHLIGHT_TARGETING_ONLY; gPreferencesCombatMessages1 = 1; gPreferencesCombatLooks1 = 0; gPreferencesCombatTaunts1 = 1; gPreferencesRunning1 = 0; gPreferencesSubtitles1 = 0; gPreferencesItemHighlight1 = 1; gPreferencesCombatSpeed1 = 0; gPreferencesPlayerSpeedup1 = 0; gPreferencesTextBaseDelay1 = 3.5; gPreferencesBrightness1 = 1.0; gPreferencesMouseSensitivity1 = 1.0; gPreferencesGameDifficulty1 = 1; gPreferencesLanguageFilter1 = 0; gPreferencesMasterVolume1 = 22281; gPreferencesMusicVolume1 = 22281; gPreferencesSoundEffectsVolume1 = 22281; gPreferencesSpeechVolume1 = 22281; if (a1) { for (int index = 0; index < PREF_COUNT; index++) { _UpdateThing(index); } _win_set_button_rest_state(_plyrspdbid, gPreferencesPlayerSpeedup1, 0); windowRefresh(gPreferencesWindow); _changed = true; } } // 0x4931F8 void _JustUpdate_() { gPreferencesGameDifficulty1 = min(max(gPreferencesGameDifficulty1, 0), 2); gPreferencesCombatDifficulty1 = min(max(gPreferencesCombatDifficulty1, 0), 2); gPreferencesViolenceLevel1 = min(max(gPreferencesViolenceLevel1, 0), 3); gPreferencesTargetHighlight1 = min(max(gPreferencesTargetHighlight1, 0), 2); gPreferencesCombatMessages1 = min(max(gPreferencesCombatMessages1, 0), 1); gPreferencesCombatLooks1 = min(max(gPreferencesCombatLooks1, 0), 1); gPreferencesCombatTaunts1 = min(max(gPreferencesCombatTaunts1, 0), 1); gPreferencesLanguageFilter1 = min(max(gPreferencesLanguageFilter1, 0), 1); gPreferencesRunning1 = min(max(gPreferencesRunning1, 0), 1); gPreferencesSubtitles1 = min(max(gPreferencesSubtitles1, 0), 1); gPreferencesItemHighlight1 = min(max(gPreferencesItemHighlight1, 0), 1); gPreferencesCombatSpeed1 = min(max(gPreferencesCombatSpeed1, 0), 50); gPreferencesPlayerSpeedup1 = min(max(gPreferencesPlayerSpeedup1, 0), 1); gPreferencesTextBaseDelay1 = min(max(gPreferencesTextBaseDelay1, 1.0), 6.0); gPreferencesMasterVolume1 = min(max(gPreferencesMasterVolume1, 0), VOLUME_MAX); gPreferencesMusicVolume1 = min(max(gPreferencesMusicVolume1, 0), VOLUME_MAX); gPreferencesSoundEffectsVolume1 = min(max(gPreferencesSoundEffectsVolume1, 0), VOLUME_MAX); gPreferencesSpeechVolume1 = min(max(gPreferencesSpeechVolume1, 0), VOLUME_MAX); gPreferencesBrightness1 = min(max(gPreferencesBrightness1, 1.0), 1.17999267578125); gPreferencesMouseSensitivity1 = min(max(gPreferencesMouseSensitivity1, 1.0), 2.5); textObjectsSetBaseDelay(gPreferencesTextBaseDelay1); gameMouseLoadItemHighlight(); double textLineDelay = (gPreferencesTextBaseDelay1 + (-1.0)) * 0.2 * 2.0; textLineDelay = min(max(textLineDelay, 0.0), 2.0); textObjectsSetLineDelay(textLineDelay); aiMessageListReloadIfNeeded(); _scr_message_free(); gameSoundSetMasterVolume(gPreferencesMasterVolume1); backgroundSoundSetVolume(gPreferencesMusicVolume1); soundEffectsSetVolume(gPreferencesSoundEffectsVolume1); speechSetVolume(gPreferencesSpeechVolume1); mouseSetSensitivity(gPreferencesMouseSensitivity1); colorSetBrightness(gPreferencesBrightness1); } // init_options_menu // 0x4928B8 int _init_options_menu() { for (int index = 0; index < 11; index++) { gPreferenceDescriptions[index].direction = 0; } _SetSystemPrefs(); grayscalePaletteUpdate(0, 255); return 0; } // 0x491A68 void _UpdateThing(int index) { fontSetCurrent(101); PreferenceDescription* meta = &(gPreferenceDescriptions[index]); if (index >= FIRST_PRIMARY_PREF && index <= LAST_PRIMARY_PREF) { int primaryOptionIndex = index - FIRST_PRIMARY_PREF; int offsets[PRIMARY_PREF_COUNT]; memcpy(offsets, dword_48FC1C, sizeof(dword_48FC1C)); blitBufferToBuffer(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_BACKGROUND] + 640 * offsets[primaryOptionIndex] + 23, 160, 54, 640, gPreferencesWindowBuffer + 640 * offsets[primaryOptionIndex] + 23, 640); for (int valueIndex = 0; valueIndex < meta->valuesCount; valueIndex++) { const char* text = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, meta->labelIds[valueIndex]); char copy[100]; // TODO: Size is probably wrong. strcpy(copy, text); int x = meta->knobX + word_48FBF6[valueIndex]; int len = fontGetStringWidth(copy); switch (valueIndex) { case 0: x -= fontGetStringWidth(copy); meta->minX = x; break; case 1: x -= len / 2; meta->maxX = x + len; break; case 2: case 3: meta->maxX = x + len; break; } char* p = copy; while (*p != '\0' && *p != ' ') { p++; } int y = meta->knobY + word_48FBFE[valueIndex]; const char* s; if (*p != '\0') { *p = '\0'; fontDrawText(gPreferencesWindowBuffer + 640 * y + x, copy, 640, 640, _colorTable[18979]); s = p + 1; y += fontGetLineHeight(); } else { s = copy; } fontDrawText(gPreferencesWindowBuffer + 640 * y + x, s, 640, 640, _colorTable[18979]); } int value = *(meta->valuePtr); blitBufferToBufferTrans(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_PRIMARY_SWITCH] + (46 * 47) * value, 46, 47, 46, gPreferencesWindowBuffer + 640 * meta->knobY + meta->knobX, 640); } else if (index >= FIRST_SECONDARY_PREF && index <= LAST_SECONDARY_PREF) { int secondaryOptionIndex = index - FIRST_SECONDARY_PREF; int offsets[SECONDARY_PREF_COUNT]; memcpy(offsets, dword_48FC30, sizeof(dword_48FC30)); blitBufferToBuffer(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_BACKGROUND] + 640 * offsets[secondaryOptionIndex] + 251, 113, 34, 640, gPreferencesWindowBuffer + 640 * offsets[secondaryOptionIndex] + 251, 640); // Secondary options are booleans, so it's index is also it's value. for (int value = 0; value < 2; value++) { const char* text = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, meta->labelIds[value]); int x; if (value) { x = meta->knobX + word_48FC06[value]; meta->maxX = x + fontGetStringWidth(text); } else { x = meta->knobX + word_48FC06[value] - fontGetStringWidth(text); meta->minX = x; } fontDrawText(gPreferencesWindowBuffer + 640 * (meta->knobY - 5) + x, text, 640, 640, _colorTable[18979]); } int value = *(meta->valuePtr); if (index == PREF_COMBAT_MESSAGES) { value ^= 1; } blitBufferToBufferTrans(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_SECONDARY_SWITCH] + (22 * 25) * value, 22, 25, 22, gPreferencesWindowBuffer + 640 * meta->knobY + meta->knobX, 640); } else if (index >= FIRST_RANGE_PREF && index <= LAST_RANGE_PREF) { blitBufferToBuffer(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_BACKGROUND] + 640 * (meta->knobY - 12) + 384, 240, 24, 640, gPreferencesWindowBuffer + 640 * (meta->knobY - 12) + 384, 640); switch (index) { case PREF_COMBAT_SPEED: if (1) { double value = *meta->valuePtr; value = min(max(value, 0.0), 50.0); int x = (int)((value - meta->minValue) * 219.0 / (meta->maxValue - meta->minValue) + 384.0); blitBufferToBufferTrans(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_KNOB_OFF], 21, 12, 21, gPreferencesWindowBuffer + 640 * meta->knobY + x, 640); } break; case PREF_TEXT_BASE_DELAY: if (1) { gPreferencesTextBaseDelay1 = min(max(gPreferencesTextBaseDelay1, 1.0), 6.0); int x = (int)((6.0 - gPreferencesTextBaseDelay1) * 43.8 + 384.0); blitBufferToBufferTrans(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_KNOB_OFF], 21, 12, 21, gPreferencesWindowBuffer + 640 * meta->knobY + x, 640); double value = (gPreferencesTextBaseDelay1 - 1.0) * 0.2 * 2.0; value = min(max(value, 0.0), 2.0); textObjectsSetBaseDelay(gPreferencesTextBaseDelay1); textObjectsSetLineDelay(value); } break; case PREF_MASTER_VOLUME: case PREF_MUSIC_VOLUME: case PREF_SFX_VOLUME: case PREF_SPEECH_VOLUME: if (1) { double value = *meta->valuePtr; value = min(max(value, meta->minValue), meta->maxValue); int x = (int)((value - meta->minValue) * 219.0 / (meta->maxValue - meta->minValue) + 384.0); blitBufferToBufferTrans(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_KNOB_OFF], 21, 12, 21, gPreferencesWindowBuffer + 640 * meta->knobY + x, 640); switch (index) { case PREF_MASTER_VOLUME: gameSoundSetMasterVolume(gPreferencesMasterVolume1); break; case PREF_MUSIC_VOLUME: backgroundSoundSetVolume(gPreferencesMusicVolume1); break; case PREF_SFX_VOLUME: soundEffectsSetVolume(gPreferencesSoundEffectsVolume1); break; case PREF_SPEECH_VOLUME: speechSetVolume(gPreferencesSpeechVolume1); break; } } break; case PREF_BRIGHTNESS: if (1) { gPreferencesBrightness1 = min(max(gPreferencesBrightness1, 1.0), 1.17999267578125); int x = (int)((gPreferencesBrightness1 - meta->minValue) * (219.0 / (meta->maxValue - meta->minValue)) + 384.0); blitBufferToBufferTrans(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_KNOB_OFF], 21, 12, 21, gPreferencesWindowBuffer + 640 * meta->knobY + x, 640); colorSetBrightness(gPreferencesBrightness1); } break; case PREF_MOUSE_SENSITIVIY: if (1) { gPreferencesMouseSensitivity1 = min(max(gPreferencesMouseSensitivity1, 1.0), 2.5); int x = (int)((gPreferencesMouseSensitivity1 - meta->minValue) * (219.0 / (meta->maxValue - meta->minValue)) + 384.0); blitBufferToBufferTrans(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_KNOB_OFF], 21, 12, 21, gPreferencesWindowBuffer + 640 * meta->knobY + x, 640); mouseSetSensitivity(gPreferencesMouseSensitivity1); } break; } for (int optionIndex = 0; optionIndex < meta->valuesCount; optionIndex++) { const char* str = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, meta->labelIds[optionIndex]); int x; switch (optionIndex) { case 0: // 0x4926AA x = 384; // TODO: Incomplete. break; case 1: // 0x4926F3 switch (meta->valuesCount) { case 2: x = 624 - fontGetStringWidth(str); break; case 3: // This code path does not use floating-point arithmetic x = 504 - fontGetStringWidth(str) / 2 - 2; break; case 4: // Uses floating-point arithmetic x = 444 + fontGetStringWidth(str) / 2 - 8; break; } break; case 2: // 0x492766 switch (meta->valuesCount) { case 3: x = 624 - fontGetStringWidth(str); break; case 4: // Uses floating-point arithmetic x = 564 - fontGetStringWidth(str) - 4; break; } break; case 3: // 0x49279E x = 624 - fontGetStringWidth(str); break; } fontDrawText(gPreferencesWindowBuffer + 640 * (meta->knobY - 12) + x, str, 640, 640, _colorTable[18979]); } } else { // return false; } // TODO: Incomplete. // return true; } // 0x492CB0 int _SavePrefs(bool save) { configSetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_GAME_DIFFICULTY_KEY, gPreferencesGameDifficulty1); configSetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_COMBAT_DIFFICULTY_KEY, gPreferencesCombatDifficulty1); configSetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_VIOLENCE_LEVEL_KEY, gPreferencesViolenceLevel1); configSetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_TARGET_HIGHLIGHT_KEY, gPreferencesTargetHighlight1); configSetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_COMBAT_MESSAGES_KEY, gPreferencesCombatMessages1); configSetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_COMBAT_LOOKS_KEY, gPreferencesCombatLooks1); configSetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_COMBAT_TAUNTS_KEY, gPreferencesCombatTaunts1); configSetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_LANGUAGE_FILTER_KEY, gPreferencesLanguageFilter1); configSetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_RUNNING_KEY, gPreferencesRunning1); configSetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_SUBTITLES_KEY, gPreferencesSubtitles1); configSetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_ITEM_HIGHLIGHT_KEY, gPreferencesItemHighlight1); configSetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_COMBAT_SPEED_KEY, gPreferencesCombatSpeed1); configSetDouble(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_TEXT_BASE_DELAY_KEY, gPreferencesTextBaseDelay1); double textLineDelay = (gPreferencesTextBaseDelay1 + dbl_50C2D0) * dbl_50C2D8 * dbl_50C2E0; if (textLineDelay >= 0.0) { if (textLineDelay > dbl_50C2E0) { textLineDelay = 2.0; } configSetDouble(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_TEXT_LINE_DELAY_KEY, textLineDelay); } else { configSetDouble(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_TEXT_LINE_DELAY_KEY, 0.0); } configSetInt(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_PLAYER_SPEEDUP_KEY, gPreferencesPlayerSpeedup1); configSetInt(&gGameConfig, GAME_CONFIG_SOUND_KEY, GAME_CONFIG_MASTER_VOLUME_KEY, gPreferencesMasterVolume1); configSetInt(&gGameConfig, GAME_CONFIG_SOUND_KEY, GAME_CONFIG_MUSIC_VOLUME_KEY, gPreferencesMusicVolume1); configSetInt(&gGameConfig, GAME_CONFIG_SOUND_KEY, GAME_CONFIG_SNDFX_VOLUME_KEY, gPreferencesSoundEffectsVolume1); configSetInt(&gGameConfig, GAME_CONFIG_SOUND_KEY, GAME_CONFIG_SPEECH_VOLUME_KEY, gPreferencesSpeechVolume1); configSetDouble(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_BRIGHTNESS_KEY, gPreferencesBrightness1); configSetDouble(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_MOUSE_SENSITIVITY_KEY, gPreferencesMouseSensitivity1); if (save) { gameConfigSave(); } return 0; } // 0x493224 int preferencesSave(File* stream) { float textBaseDelay = (float)gPreferencesTextBaseDelay1; float brightness = (float)gPreferencesBrightness1; float mouseSensitivity = (float)gPreferencesMouseSensitivity1; if (fileWriteInt32(stream, gPreferencesGameDifficulty1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesCombatDifficulty1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesViolenceLevel1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesTargetHighlight1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesCombatLooks1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesCombatMessages1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesCombatTaunts1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesLanguageFilter1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesRunning1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesSubtitles1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesItemHighlight1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesCombatSpeed1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesPlayerSpeedup1) == -1) goto err; if (fileWriteFloat(stream, textBaseDelay) == -1) goto err; if (fileWriteInt32(stream, gPreferencesMasterVolume1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesMusicVolume1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesSoundEffectsVolume1) == -1) goto err; if (fileWriteInt32(stream, gPreferencesSpeechVolume1) == -1) goto err; if (fileWriteFloat(stream, brightness) == -1) goto err; if (fileWriteFloat(stream, mouseSensitivity) == -1) goto err; return 0; err: debugPrint("\nOPTION MENU: Error save option data!\n"); return -1; } // 0x49340C int preferencesLoad(File* stream) { float textBaseDelay; float brightness; float mouseSensitivity; preferencesSetDefaults(false); if (fileReadInt32(stream, &gPreferencesGameDifficulty1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesCombatDifficulty1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesViolenceLevel1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesTargetHighlight1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesCombatLooks1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesCombatMessages1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesCombatTaunts1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesLanguageFilter1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesRunning1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesSubtitles1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesItemHighlight1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesCombatSpeed1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesPlayerSpeedup1) == -1) goto err; if (fileReadFloat(stream, &textBaseDelay) == -1) goto err; if (fileReadInt32(stream, &gPreferencesMasterVolume1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesMusicVolume1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesSoundEffectsVolume1) == -1) goto err; if (fileReadInt32(stream, &gPreferencesSpeechVolume1) == -1) goto err; if (fileReadFloat(stream, &brightness) == -1) goto err; if (fileReadFloat(stream, &mouseSensitivity) == -1) goto err; gPreferencesBrightness1 = brightness; gPreferencesMouseSensitivity1 = mouseSensitivity; gPreferencesTextBaseDelay1 = textBaseDelay; _JustUpdate_(); _SavePrefs(0); return 0; err: debugPrint("\nOPTION MENU: Error loading option data!, using defaults.\n"); preferencesSetDefaults(false); _JustUpdate_(); _SavePrefs(0); return -1; } // 0x4928E4 void brightnessIncrease() { gPreferencesBrightness1 = 1.0; configGetDouble(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_BRIGHTNESS_KEY, &gPreferencesBrightness1); if (gPreferencesBrightness1 < dbl_50C168) { gPreferencesBrightness1 += dbl_50C170; if (gPreferencesBrightness1 >= 1.0) { if (gPreferencesBrightness1 > dbl_50C168) { gPreferencesBrightness1 = dbl_50C168; } } else { gPreferencesBrightness1 = 1.0; } colorSetBrightness(gPreferencesBrightness1); configSetDouble(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_BRIGHTNESS_KEY, gPreferencesBrightness1); gameConfigSave(); } } // 0x4929C8 void brightnessDecrease() { gPreferencesBrightness1 = 1.0; configGetDouble(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_BRIGHTNESS_KEY, &gPreferencesBrightness1); if (gPreferencesBrightness1 > 1.0) { gPreferencesBrightness1 += dbl_50C178; if (gPreferencesBrightness1 >= 1.0) { if (gPreferencesBrightness1 > dbl_50C180) { gPreferencesBrightness1 = dbl_50C180; } } else { gPreferencesBrightness1 = 1.0; } colorSetBrightness(gPreferencesBrightness1); configSetDouble(&gGameConfig, GAME_CONFIG_PREFERENCES_KEY, GAME_CONFIG_BRIGHTNESS_KEY, gPreferencesBrightness1); gameConfigSave(); } } // 0x4908A0 int preferencesWindowInit() { int i; int fid; char* messageItemText; int x; int y; int width; int height; int messageItemId; int btn; _SaveSettings(); for (i = 0; i < PREFERENCES_WINDOW_FRM_COUNT; i++) { fid = buildFid(6, gPreferencesWindowFrmIds[i], 0, 0, 0); gPreferencesWindowFrmData[i] = artLockFrameDataReturningSize(fid, &(gPreferencesWindowFrmHandles[i]), &(gPreferencesWindowFrmSizes[i].width), &(gPreferencesWindowFrmSizes[i].height)); if (gPreferencesWindowFrmData[i] == NULL) { for (; i != 0; i--) { artUnlock(gPreferencesWindowFrmHandles[i - 1]); } return -1; } } _changed = false; gPreferencesWindow = windowCreate(0, 0, 640, 480, 256, WINDOW_FLAG_0x10 | WINDOW_FLAG_0x02); if (gPreferencesWindow == -1) { for (i = 0; i < PREFERENCES_WINDOW_FRM_COUNT; i++) { artUnlock(gPreferencesWindowFrmHandles[i]); } return -1; } gPreferencesWindowBuffer = windowGetBuffer(gPreferencesWindow); memcpy(gPreferencesWindowBuffer, gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_BACKGROUND], gPreferencesWindowFrmSizes[PREFERENCES_WINDOW_FRM_BACKGROUND].width * gPreferencesWindowFrmSizes[PREFERENCES_WINDOW_FRM_BACKGROUND].height); fontSetCurrent(104); messageItemText = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, 100); fontDrawText(gPreferencesWindowBuffer + 640 * 10 + 74, messageItemText, 640, 640, _colorTable[18979]); fontSetCurrent(103); messageItemId = 101; for (i = 0; i < PRIMARY_PREF_COUNT; i++) { messageItemText = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, messageItemId++); x = 99 - fontGetStringWidth(messageItemText) / 2; fontDrawText(gPreferencesWindowBuffer + 640 * _row1Ytab[i] + x, messageItemText, 640, 640, _colorTable[18979]); } for (i = 0; i < SECONDARY_PREF_COUNT; i++) { messageItemText = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, messageItemId++); fontDrawText(gPreferencesWindowBuffer + 640 * _row2Ytab[i] + 206, messageItemText, 640, 640, _colorTable[18979]); } for (i = 0; i < RANGE_PREF_COUNT; i++) { messageItemText = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, messageItemId++); fontDrawText(gPreferencesWindowBuffer + 640 * _row3Ytab[i] + 384, messageItemText, 640, 640, _colorTable[18979]); } // DEFAULT messageItemText = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, 120); fontDrawText(gPreferencesWindowBuffer + 640 * 449 + 43, messageItemText, 640, 640, _colorTable[18979]); // DONE messageItemText = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, 4); fontDrawText(gPreferencesWindowBuffer + 640 * 449 + 169, messageItemText, 640, 640, _colorTable[18979]); // CANCEL messageItemText = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, 121); fontDrawText(gPreferencesWindowBuffer + 640 * 449 + 283, messageItemText, 640, 640, _colorTable[18979]); // Affect player speed messageItemText = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, 122); fontDrawText(gPreferencesWindowBuffer + 640 * 72 + 405, messageItemText, 640, 640, _colorTable[18979]); for (i = 0; i < PREF_COUNT; i++) { _UpdateThing(i); } for (i = 0; i < PREF_COUNT; i++) { int mouseEnterEventCode; int mouseExitEventCode; int mouseDownEventCode; int mouseUpEventCode; if (i >= FIRST_RANGE_PREF) { x = 384; y = gPreferenceDescriptions[i].knobY - 12; width = 240; height = 23; mouseEnterEventCode = 526; mouseExitEventCode = 526; mouseDownEventCode = 505 + i; mouseUpEventCode = 526; } else if (i >= FIRST_SECONDARY_PREF) { x = gPreferenceDescriptions[i].minX; y = gPreferenceDescriptions[i].knobY - 5; width = gPreferenceDescriptions[i].maxX - x; height = 28; mouseEnterEventCode = -1; mouseExitEventCode = -1; mouseDownEventCode = -1; mouseUpEventCode = 505 + i; } else { x = gPreferenceDescriptions[i].minX; y = gPreferenceDescriptions[i].knobY - 4; width = gPreferenceDescriptions[i].maxX - x; height = 48; mouseEnterEventCode = -1; mouseExitEventCode = -1; mouseDownEventCode = -1; mouseUpEventCode = 505 + i; } gPreferenceDescriptions[i].btn = buttonCreate(gPreferencesWindow, x, y, width, height, mouseEnterEventCode, mouseExitEventCode, mouseDownEventCode, mouseUpEventCode, NULL, NULL, NULL, 32); } _plyrspdbid = buttonCreate(gPreferencesWindow, 383, 68, gPreferencesWindowFrmSizes[PREFERENCES_WINDOW_FRM_CHECKBOX_OFF].width, gPreferencesWindowFrmSizes[PREFERENCES_WINDOW_FRM_CHECKBOX_ON].height, -1, -1, 524, 524, gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_CHECKBOX_OFF], gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_CHECKBOX_ON], NULL, BUTTON_FLAG_TRANSPARENT | BUTTON_FLAG_0x01 | BUTTON_FLAG_0x02); if (_plyrspdbid != -1) { _win_set_button_rest_state(_plyrspdbid, gPreferencesPlayerSpeedup1, 0); } buttonSetCallbacks(_plyrspdbid, _gsound_med_butt_press, _gsound_med_butt_press); // DEFAULT btn = buttonCreate(gPreferencesWindow, 23, 450, gPreferencesWindowFrmSizes[PREFERENCES_WINDOW_FRM_LITTLE_RED_BUTTON_UP].width, gPreferencesWindowFrmSizes[PREFERENCES_WINDOW_FRM_LITTLE_RED_BUTTON_DOWN].height, -1, -1, -1, 527, gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_LITTLE_RED_BUTTON_UP], gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_LITTLE_RED_BUTTON_DOWN], NULL, BUTTON_FLAG_TRANSPARENT); if (btn != -1) { buttonSetCallbacks(btn, _gsound_red_butt_press, _gsound_red_butt_release); } // DONE btn = buttonCreate(gPreferencesWindow, 148, 450, gPreferencesWindowFrmSizes[PREFERENCES_WINDOW_FRM_LITTLE_RED_BUTTON_UP].width, gPreferencesWindowFrmSizes[PREFERENCES_WINDOW_FRM_LITTLE_RED_BUTTON_DOWN].height, -1, -1, -1, 504, gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_LITTLE_RED_BUTTON_UP], gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_LITTLE_RED_BUTTON_DOWN], NULL, BUTTON_FLAG_TRANSPARENT); if (btn != -1) { buttonSetCallbacks(btn, _gsound_red_butt_press, _gsound_red_butt_release); } // CANCEL btn = buttonCreate(gPreferencesWindow, 263, 450, gPreferencesWindowFrmSizes[PREFERENCES_WINDOW_FRM_LITTLE_RED_BUTTON_UP].width, gPreferencesWindowFrmSizes[PREFERENCES_WINDOW_FRM_LITTLE_RED_BUTTON_DOWN].height, -1, -1, -1, 528, gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_LITTLE_RED_BUTTON_UP], gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_LITTLE_RED_BUTTON_DOWN], NULL, BUTTON_FLAG_TRANSPARENT); if (btn != -1) { buttonSetCallbacks(btn, _gsound_red_butt_press, _gsound_red_butt_release); } fontSetCurrent(101); windowRefresh(gPreferencesWindow); return 0; } // 0x492870 int preferencesWindowFree() { if (_changed) { _SavePrefs(1); _JustUpdate_(); _combat_highlight_change(); } windowDestroy(gPreferencesWindow); for (int index = 0; index < PREFERENCES_WINDOW_FRM_COUNT; index++) { artUnlock(gPreferencesWindowFrmHandles[index]); } return 0; } // 0x490798 int _do_prefscreen() { if (preferencesWindowInit() == -1) { debugPrint("\nPREFERENCE MENU: Error loading preference dialog data!\n"); return -1; } int rc = -1; while (rc == -1) { int eventCode = _get_input(); switch (eventCode) { case KEY_RETURN: case KEY_UPPERCASE_P: case KEY_LOWERCASE_P: soundPlayFile("ib1p1xx1"); // FALLTHROUGH case 504: rc = 1; break; case KEY_CTRL_Q: case KEY_CTRL_X: case KEY_F10: showQuitConfirmationDialog(); break; case KEY_EQUAL: case KEY_PLUS: brightnessIncrease(); break; case KEY_MINUS: case KEY_UNDERSCORE: brightnessDecrease(); break; case KEY_F12: takeScreenshot(); break; case 527: preferencesSetDefaults(true); break; default: if (eventCode == KEY_ESCAPE || eventCode == 528 || _game_user_wants_to_quit != 0) { _RestoreSettings(); rc = 0; } else if (eventCode >= 505 && eventCode <= 524) { _DoThing(eventCode); } break; } } preferencesWindowFree(); return rc; } // 0x490E8C void _DoThing(int eventCode) { int x; int y; mouseGetPosition(&x, &y); // This preference index also contains out-of-bounds value 19, // which is the only preference expressed as checkbox. int preferenceIndex = eventCode - 505; if (preferenceIndex >= FIRST_PRIMARY_PREF && preferenceIndex <= LAST_PRIMARY_PREF) { PreferenceDescription* meta = &(gPreferenceDescriptions[preferenceIndex]); int* valuePtr = meta->valuePtr; int value = *valuePtr; bool valueChanged = false; int v1 = meta->knobX + 23; int v2 = meta->knobY + 21; if (sqrt(pow((double)x - (double)v1, 2) + pow((double)y - (double)v2, 2)) > 16.0) { if (y > meta->knobY) { int v14 = meta->knobY + word_48FBFE[0]; if (y >= v14 && y <= v14 + fontGetLineHeight()) { if (x >= meta->minX && x <= meta->knobX) { *valuePtr = 0; meta->direction = 0; valueChanged = true; } else { if (meta->valuesCount >= 3 && x >= meta->knobX + word_48FBF6[2] && x <= meta->maxX) { *valuePtr = 2; meta->direction = 0; valueChanged = true; } } } } else { if (x >= meta->knobX + 9 && x <= meta->knobX + 37) { *valuePtr = 1; if (value != 0) { meta->direction = 1; } else { meta->direction = 0; } valueChanged = true; } } if (meta->valuesCount == 4) { int v19 = meta->knobY + word_48FBFE[3]; if (y >= v19 && y <= v19 + 2 * fontGetLineHeight() && x >= meta->knobX + word_48FBF6[3] && x <= meta->maxX) { *valuePtr = 3; meta->direction = 1; valueChanged = true; } } } else { if (meta->direction != 0) { if (value == 0) { meta->direction = 0; } } else { if (value == meta->valuesCount - 1) { meta->direction = 1; } } if (meta->direction != 0) { *valuePtr = value - 1; } else { *valuePtr = value + 1; } valueChanged = true; } if (valueChanged) { soundPlayFile("ib3p1xx1"); coreDelay(70); soundPlayFile("ib3lu1x1"); _UpdateThing(preferenceIndex); windowRefresh(gPreferencesWindow); _changed = true; return; } } else if (preferenceIndex >= FIRST_SECONDARY_PREF && preferenceIndex <= LAST_SECONDARY_PREF) { PreferenceDescription* meta = &(gPreferenceDescriptions[preferenceIndex]); int* valuePtr = meta->valuePtr; int value = *valuePtr; bool valueChanged = false; int v1 = meta->knobX + 11; int v2 = meta->knobY + 12; if (sqrt(pow((double)x - (double)v1, 2) + pow((double)y - (double)v2, 2)) > 10.0) { int v23 = meta->knobY - 5; if (y >= v23 && y <= v23 + fontGetLineHeight() + 2) { if (x >= meta->minX && x <= meta->knobX) { *valuePtr = preferenceIndex == PREF_COMBAT_MESSAGES ? 1 : 0; valueChanged = true; } else if (x >= meta->knobX + 22.0 && x <= meta->maxX) { *valuePtr = preferenceIndex == PREF_COMBAT_MESSAGES ? 0 : 1; valueChanged = true; } } } else { *valuePtr ^= 1; valueChanged = true; } if (valueChanged) { soundPlayFile("ib2p1xx1"); coreDelay(70); soundPlayFile("ib2lu1x1"); _UpdateThing(preferenceIndex); windowRefresh(gPreferencesWindow); _changed = true; return; } } else if (preferenceIndex >= FIRST_RANGE_PREF && preferenceIndex <= LAST_RANGE_PREF) { PreferenceDescription* meta = &(gPreferenceDescriptions[preferenceIndex]); int* valuePtr = meta->valuePtr; soundPlayFile("ib1p1xx1"); double value; switch (preferenceIndex) { case PREF_TEXT_BASE_DELAY: value = 6.0 - gPreferencesTextBaseDelay1 + 1.0; break; case PREF_BRIGHTNESS: value = gPreferencesBrightness1; break; case PREF_MOUSE_SENSITIVIY: value = gPreferencesMouseSensitivity1; break; default: value = *valuePtr; break; } int knobX = (int)(219.0 / (meta->maxValue - meta->minValue)); int v31 = (int)((value - meta->minValue) * (219.0 / (meta->maxValue - meta->minValue)) + 384.0); blitBufferToBuffer(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_BACKGROUND] + 640 * meta->knobY + 384, 240, 12, 640, gPreferencesWindowBuffer + 640 * meta->knobY + 384, 640); blitBufferToBufferTrans(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_KNOB_ON], 21, 12, 21, gPreferencesWindowBuffer + 640 * meta->knobY + v31, 640); windowRefresh(gPreferencesWindow); int sfxVolumeExample = 0; int speechVolumeExample = 0; while (true) { _get_input(); int tick = _get_time(); mouseGetPosition(&x, &y); if (mouseGetEvent() & 0x10) { soundPlayFile("ib1lu1x1"); _UpdateThing(preferenceIndex); windowRefresh(gPreferencesWindow); _changed = true; return; } if (v31 + 14 > x) { if (v31 + 6 > x) { v31 = x - 6; if (v31 < 384) { v31 = 384; } } } else { v31 = x - 6; if (v31 > 603) { v31 = 603; } } double newValue = ((double)v31 - 384.0) / (219.0 / (meta->maxValue - meta->minValue)) + meta->minValue; int v52 = 0; switch (preferenceIndex) { case PREF_COMBAT_SPEED: *meta->valuePtr = (int)newValue; break; case PREF_TEXT_BASE_DELAY: gPreferencesTextBaseDelay1 = 6.0 - newValue + 1.0; break; case PREF_MASTER_VOLUME: *meta->valuePtr = (int)newValue; gameSoundSetMasterVolume(gPreferencesMasterVolume1); v52 = 1; break; case PREF_MUSIC_VOLUME: *meta->valuePtr = (int)newValue; backgroundSoundSetVolume(gPreferencesMusicVolume1); v52 = 1; break; case PREF_SFX_VOLUME: *meta->valuePtr = (int)newValue; soundEffectsSetVolume(gPreferencesSoundEffectsVolume1); v52 = 1; if (sfxVolumeExample == 0) { soundPlayFile("butin1"); sfxVolumeExample = 7; } else { sfxVolumeExample--; } break; case PREF_SPEECH_VOLUME: *meta->valuePtr = (int)newValue; speechSetVolume(gPreferencesSpeechVolume1); v52 = 1; if (speechVolumeExample == 0) { speechLoad("narrator\\options", 12, 13, 15); speechVolumeExample = 40; } else { speechVolumeExample--; } break; case PREF_BRIGHTNESS: gPreferencesBrightness1 = newValue; colorSetBrightness(newValue); break; case PREF_MOUSE_SENSITIVIY: gPreferencesMouseSensitivity1 = newValue; break; } if (v52) { int off = 640 * (meta->knobY - 12) + 384; blitBufferToBuffer(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_BACKGROUND] + off, 240, 24, 640, gPreferencesWindowBuffer + off, 640); for (int optionIndex = 0; optionIndex < meta->valuesCount; optionIndex++) { const char* str = getmsg(&gOptionsMessageList, &gOptionsMessageListItem, meta->labelIds[optionIndex]); int x; switch (optionIndex) { case 0: // 0x4926AA x = 384; // TODO: Incomplete. break; case 1: // 0x4926F3 switch (meta->valuesCount) { case 2: x = 624 - fontGetStringWidth(str); break; case 3: // This code path does not use floating-point arithmetic x = 504 - fontGetStringWidth(str) / 2 - 2; break; case 4: // Uses floating-point arithmetic x = 444 + fontGetStringWidth(str) / 2 - 8; break; } break; case 2: // 0x492766 switch (meta->valuesCount) { case 3: x = 624 - fontGetStringWidth(str); break; case 4: // Uses floating-point arithmetic x = 564 - fontGetStringWidth(str) - 4; break; } break; case 3: // 0x49279E x = 624 - fontGetStringWidth(str); break; } fontDrawText(gPreferencesWindowBuffer + 640 * (meta->knobY - 12) + x, str, 640, 640, _colorTable[18979]); } } else { int off = 640 * meta->knobY + 384; blitBufferToBuffer(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_BACKGROUND] + off, 240, 12, 640, gPreferencesWindowBuffer + off, 640); } blitBufferToBufferTrans(gPreferencesWindowFrmData[PREFERENCES_WINDOW_FRM_KNOB_ON], 21, 12, 21, gPreferencesWindowBuffer + 640 * meta->knobY + v31, 640); windowRefresh(gPreferencesWindow); while (getTicksSince(tick) < 35) ; } } else if (preferenceIndex == 19) { gPreferencesPlayerSpeedup1 ^= 1; } _changed = true; } // 0x48FC48 int _do_options() { return showOptionsWithInitialKeyCode(-1); }