void MainReadSocket(HWND hwnd, int SelectType, SOCKET s, int error) { switch (SelectType) { case FD_CONNECT: if (state != STATE_CONNECTING) { debug(("MainReadSocket got connect in wrong state (%d)\n", state)); return; } ConnectingDone(error); break; case FD_CLOSE: // When guest server denies us during login, don't abort if (config.guest && (state == STATE_CONNECTING || state == STATE_LOGIN)) return; MainSetState(STATE_OFFLINE); /* Kill off dialogs, etc. */ connection = CON_NONE; ClientError(hInst, hMain, IDS_LOSTSERVER); return; case FD_READ: /* Read stuff from server */ ReadServer(); MainProcessBuffer(); break; default: ClientError(hInst, hMain, IDS_SOCKETMESSAGE); break; } }
/* * AddCharsStartup: We got some stuff from the server; see what it is. */ void AddCharsStartup(char *message, int len) { int i; Bool done = False; for (i=0; i < len; i++) { /* If character doesn't match code, start over */ if (server_string[pos] != (unsigned char) message[i]) { pos = 0; continue; } pos++; /* If we reach end of server string, win */ if (pos == INITSTR_LENGTH) { done = True; break; } } if (!done) return; debug(("Got response from server\n")); /* We found server's code string. Send response and go into correct mode. */ AbortStartupTimer(); WriteServer((char *) client_string2, INITSTR_LENGTH); switch (dest_state) { case STATE_LOGIN: MainSetState(STATE_LOGIN); break; case STATE_GAME: /* We're already in game state, so don't do MainSetState--just get new game data */ ResetUserData(); break; } }
/* * DownloadFiles: Bring up download dialog. */ void DownloadFiles(DownloadInfo *params) { int retval, dialog, i; info = params; info->current_file = 0; MainSetState(STATE_DOWNLOAD); debug(("machine = %s\n", info->machine)); debug(("path = %s\n", info->path)); for (i = 0; i < info->num_files; i++) debug(("file = %s, time = %d, flags = %d\n", info->files[i].filename, info->files[i].time, info->files[i].flags)); // If downloading only advertisements, show a different dialog to avoid the appearance // of a "real" download. dialog = IDD_DOWNLOADAD; for (i = 0; i < info->num_files; i++) if (DownloadLocation(info->files[i].flags) != DF_ADVERTISEMENT) { dialog = IDD_DOWNLOAD; break; } advert = (IDD_DOWNLOADAD == dialog); if (!advert && !config.avoidDownloadAskDialog) { retval = DialogBox(hInst, MAKEINTRESOURCE(IDD_ASKDOWNLOAD), NULL, AskDownloadDialogProc); switch (retval) { case 3: // do the demo button WebLaunchBrowser(info->demoPath); SendMessage(hMain,WM_SYSCOMMAND,SC_CLOSE,0); return; case IDOK: // proceed with download retval = DialogBox(hInst, MAKEINTRESOURCE(dialog), NULL, DownloadDialogProc); advert = FALSE; if (retval == IDOK) { MainSetState(STATE_LOGIN); i = (((MAJOR_REV * 100) + MINOR_REV) * P_CATCH) + P_CATCH; RequestGame(config.download_time,i,config.comm.hostname); return; } break; case IDCANCEL: // cancel default: break; } } abort_download = True; config.quickstart = FALSE; //MainSetState(STATE_OFFLINE); Logoff(); ShowWindow(hMain, SW_SHOW); UpdateWindow(hMain); #if 0 // If we were hung up, just leave if (state != STATE_DOWNLOAD) return; MainSetState(STATE_LOGIN); switch (retval) { case IDOK: RequestGame(config.download_time); break; case IDCANCEL: Logoff(); break; } #endif }
/* * MenuCommand: A menu item has been selected. */ void MenuCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { // Set last action time to now, to prevent keypress from being interpreted as a game action. KeySetLastNorepeatTime(); // See if module wants to handle menu selection if (ModuleEvent(EVENT_MENUITEM, id) == False) return; /* Handle menu selections */ switch (id) { case ID_GAME_EXIT: if (connection != CON_NONE && !AreYouSure(hInst, hMain, NO_BUTTON, IDS_LOGOFF)) break; MainQuit(hwnd); break; case ID_GAME_PRINTMAP: if (state == STATE_GAME) PrintMap(FALSE); break; case ID_GAME_CONNECT: OfflineConnect(); break; case ID_GAME_DISCONNECT: if (!AreYouSure(hInst, hMain, NO_BUTTON, IDS_LOGOFF)) break; Logoff(); MainSetState(STATE_OFFLINE); break; case ID_GAME_SETTINGS: if (DialogBox(hInst, MAKEINTRESOURCE(IDD_SETTINGS), hMain, PreferencesDialogProc) == IDOK) { ModuleEvent(EVENT_CONFIGCHANGED); MenuDisplaySettings(hMain); } break; case ID_CONFIGMENU: ConfigMenuLaunch(); break; case ID_GAME_PASSWORD: PerformAction(A_CHANGEPASSWORD, NULL); break; case ID_OPTIONS_TIMEOUT: UserSetTimeout(); break; case ID_OPTIONS_MUSIC: config.play_music = !config.play_music; CheckMenuItem(menu, ID_OPTIONS_MUSIC, config.play_music ? MF_CHECKED : MF_UNCHECKED); UserToggleMusic(config.play_music); break; case ID_OPTIONS_SOUND: config.play_sound = !config.play_sound; CheckMenuItem(menu, ID_OPTIONS_SOUND, config.play_sound ? MF_CHECKED : MF_UNCHECKED); if (!config.play_sound) SoundStopAll(); break; case ID_OPTIONS_SAVENOW: SaveSettings(); break; case ID_OPTIONS_SAVEEXIT: config.save_settings = !config.save_settings; CheckMenuItem(menu, ID_OPTIONS_SAVEEXIT, config.save_settings ? MF_CHECKED : MF_UNCHECKED); break; case ID_OPTIONS_AREA: // due to issues with certain D3D drivers, this no longer immediately updates the config // it now sets a temporary variable that will update the config on shutdown // this means a shutdown and restart are necessary for window size changes MessageBox(hMain, "You must shutdown and restart Meridian 59 for these changes to take effect", "Direct3D", MB_OK); // config.large_area = !config.large_area; gLargeArea = !gLargeArea; CheckMenuItem(menu, ID_OPTIONS_AREA, gLargeArea ? MF_CHECKED : MF_UNCHECKED); /* if (state == STATE_GAME) // Send ourselves a resize message ResizeAll(); RedrawAll();*/ break; case ID_OPTIONS_FONT_MAP_TITLE: UserSelectFont(FONT_MAP_TITLE); break; case ID_OPTIONS_FONT_MAP_LABEL: UserSelectFont(FONT_MAP_LABEL); break; case ID_OPTIONS_FONT_MAP_TEXT: UserSelectFont(FONT_MAP_TEXT); break; case ID_FONT_GAMETEXT: UserSelectFont(FONT_EDIT); break; case ID_FONT_LIST: UserSelectFont(FONT_LIST); break; case ID_FONT_MAIL: UserSelectFont(FONT_MAIL); break; case ID_FONT_TITLES: UserSelectFont(FONT_TITLES); break; case ID_FONT_STATISTICS: UserSelectFont(FONT_STATS); break; case ID_FONT_INPUT: UserSelectFont(FONT_INPUT); break; case ID_FONT_LABELS: UserSelectFont(FONT_LABELS); break; case ID_FONT_DEFAULTS: FontsRestoreDefaults(); break; case ID_COLOR_MAIN: UserSelectColors(COLOR_FGD, COLOR_BGD); break; case ID_COLOR_LIST: UserSelectColors(COLOR_LISTFGD, COLOR_LISTBGD); break; case ID_COLOR_LISTSEL: UserSelectColors(COLOR_LISTSELFGD, COLOR_LISTSELBGD); break; case ID_COLOR_MAGIC: UserSelectColor(COLOR_ITEM_MAGIC_FG); break; case ID_COLOR_HIGHLIGHT: UserSelectColor(COLOR_HIGHLITE); break; case ID_COLOR_MAIL: UserSelectColors(COLOR_MAILFGD, COLOR_MAILBGD); break; case ID_COLOR_TEXT: UserSelectColors(COLOR_MAINEDITFGD, COLOR_MAINEDITBGD); break; case ID_COLOR_EDIT: UserSelectColors(COLOR_EDITFGD, COLOR_EDITBGD); break; case ID_COLOR_SYSMSG: UserSelectColor(COLOR_SYSMSGFGD); case ID_COLOR_QUESTHEADER: UserSelectColor(COLOR_QUEST_HEADER); break; break; case ID_COLOR_STATS: UserSelectColors(COLOR_STATSFGD, COLOR_STATSBGD); break; case ID_COLOR_BAR1: UserSelectColor(COLOR_BAR1); break; case ID_COLOR_BAR2: UserSelectColor(COLOR_BAR2); break; case ID_COLOR_BAR3: UserSelectColor(COLOR_BAR3); break; case ID_COLOR_BAR4: UserSelectColor(COLOR_BAR4); break; case ID_COLOR_INVNUM: UserSelectColors(COLOR_INVNUMFGD, COLOR_INVNUMBGD); break; case ID_COLOR_DEFAULTS: ColorsRestoreDefaults(); break; case ID_HELP_CONTENTS: StartHelp(); break; case ID_HOMEPAGE: WebLaunchBrowser(GetString(hInst, IDS_HOMEPAGEURL)); break; case ID_FORUM: WebLaunchBrowser(GetString(hInst, IDS_FORUMURL)); break; case ID_WIKI: WebLaunchBrowser(GetString(hInst, IDS_WIKIURL)); break; case ID_HELP_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), hMain, AboutDialogProc); break; } }