void Handle_One_Event() { static const long twentyTicks = time_in_ticks(20).asMilliseconds(); static const long fortyTicks = time_in_ticks(40).asMilliseconds(); through_sending(); Handle_Update(); //(cur_time - last_anim_time > 42) if((animTimer.getElapsedTime().asMilliseconds() >= fortyTicks) && (overall_mode != MODE_STARTUP) && (anim_onscreen) && get_bool_pref("DrawTerrainAnimation", true) && (!gInBackground)) { animTimer.restart(); draw_terrain(); } if((animTimer.getElapsedTime().asMilliseconds() > twentyTicks) && (overall_mode == MODE_STARTUP)) { animTimer.restart(); draw_startup_anim(true); } clear_sound_memory(); if(map_visible && mini_map.pollEvent(event)){ if(event.type == sf::Event::Closed) { mini_map.setVisible(false); map_visible = false; } else if(event.type == sf::Event::GainedFocus) makeFrontWindow(mainPtr); } if(!mainPtr.pollEvent(event)) { if(changed_display_mode) { changed_display_mode = false; adjust_window_mode(); } flushingInput = false; redraw_screen(REFRESH_NONE); return; } switch(event.type) { case sf::Event::KeyPressed: if(flushingInput) return; if(!(event.key.*systemKey)) handle_keystroke(event); break; case sf::Event::MouseButtonPressed: if(flushingInput) return; Mouse_Pressed(); break; case sf::Event::MouseLeft: // Make sure we don't have an arrow cursor when it's outside the window make_cursor_sword(); break; case sf::Event::GainedFocus: Handle_Update(); makeFrontWindow(mainPtr); case sf::Event::MouseMoved: if(!gInBackground) { location where(event.mouseMove.x, event.mouseMove.y); change_cursor(where); } break; case sf::Event::MouseWheelMoved: if(flushingInput) return; handle_scroll(event); break; case sf::Event::Closed: if(overall_mode == MODE_STARTUP) { if(party_in_memory) { std::string choice = cChoiceDlog("quit-confirm-save", {"save","quit","cancel"}).show(); if(choice == "cancel") break; if(choice == "save") { fs::path file = nav_put_party(); if(!file.empty()) break; save_party(file, univ); } } All_Done = true; break; } if(overall_mode > MODE_TOWN){ std::string choice = cChoiceDlog("quit-confirm-nosave", {"quit", "cancel"}).show(); if(choice == "cancel") break; } else { std::string choice = cChoiceDlog("quit-confirm-save", {"save", "quit", "cancel"}).show(); if(choice == "cancel") break; if(choice == "save") save_party(univ.file, univ); } All_Done = true; default: break; // There's several events we don't need to handle at all } flushingInput = false; // TODO: Could there be a case when the key and mouse input that needs to be flushed has other events interspersed? }
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; POINT press; HMENU menu; RECT dlg_rect; RECT wind_rect; short handled = 0; short store_ulx; short store_uly; short sbar_pos; short which_sbar; short old_setting; short smin; short smax; // First, handle window size GetWindowRect(mainPtr,&wind_rect); switch (display_mode) { //case 0 is center case 1: store_ulx = 0; store_uly = 0; break; case 2: store_ulx = wind_rect.right - 550 - 21; store_uly = 0; break; case 3: store_ulx = 0; store_uly = wind_rect.bottom - 422 - 24 - 21; break; case 4: store_ulx = wind_rect.right - 550 - 21; store_uly = wind_rect.bottom - 422 - 24 - 21; break; case 5: store_ulx = 0; store_uly = 0; break; default: store_ulx = ((wind_rect.right - wind_rect.left) - 536) / 2 - 30; store_uly = ((wind_rect.bottom - wind_rect.top) - 478) / 2 + 8; break; } store_ulx -= store_ulx % 8; store_uly -= store_uly % 8; if ((store_ulx != ulx) || (store_uly != uly)) { ulx = store_ulx; uly = store_uly; adjust_window_mode(); } switch (message) { case WM_KEYDOWN: if (hwnd != mainPtr) check_cd_event(hwnd,message,wParam,lParam); else { cursor_go(); All_Done = handle_syskeystroke(wParam,lParam,&handled); check_game_done(); } if (handled == 1) FlushEvents(0); return 0; case WM_CHAR: if (hwnd != mainPtr) check_cd_event(hwnd,message,wParam,lParam); else { cursor_go(); All_Done = handle_keystroke(wParam,lParam); check_game_done(); } return 0; case WM_LBUTTONDOWN: cursor_stay(); if (hwnd != mainPtr) check_cd_event(hwnd,message,wParam,lParam); else { SetFocus(hwnd); press = MAKEPOINT(lParam); if (in_startup_mode == false) All_Done = handle_action(press, wParam,lParam); else All_Done = handle_startup_press(press); change_cursor(press); check_game_done(); } return 0; break; case WM_RBUTTONDOWN: cursor_stay(); if (hwnd != mainPtr) check_cd_event(hwnd,message,wParam,lParam); else { SetFocus(hwnd); press = MAKEPOINT(lParam); if (in_startup_mode == false) All_Done = handle_action(press, wParam,-2); else All_Done = handle_startup_press(press); change_cursor(press); check_game_done(); } return 0; break; case WM_ACTIVATE: if (hwnd == mainPtr) { WORD fActive = LOWORD(wParam); if ((fActive == WA_ACTIVE) ||(fActive == WA_CLICKACTIVE)) { window_in_front = true; GetClientRect(hwnd,&dlg_rect); InvalidateRect(hwnd,&dlg_rect,false); } if (fActive == WA_INACTIVE) { cursor_stay(); anim_onscreen = false; window_in_front = false; } } return 0; case WM_ERASEBKGND: if (hwnd != mainPtr) break; block_erase = false; return 1; case WM_MOUSEMOVE: if (store_mouse != lParam) cursor_stay(); store_mouse = lParam; press = MAKEPOINT(lParam); if (hwnd == mainPtr) { change_cursor(press); if ((overall_mode > MODE_COMBAT) && (overall_mode < MODE_TALKING)) draw_targeting_line(press); } return 0; case WM_PAINT: if ((block_erase == true) && (hwnd == mainPtr)) { block_erase = false; } BeginPaint(hwnd,&ps); EndPaint(hwnd,&ps); if (hwnd != mainPtr) check_cd_event(hwnd,message,wParam,lParam); else { string_added = true; reset_text_bar(); if (in_startup_mode == true) draw_startup(0); else if (first_update == true) { first_update = false; if (overall_mode == MODE_OUTDOORS) redraw_screen(0); if ((overall_mode > MODE_OUTDOORS) & (overall_mode < MODE_COMBAT)) redraw_screen(1); // 1st update never combat } else refresh_screen(overall_mode); } return 0; case WM_TIMER: switch(wParam) { case 1: if ((in_startup_mode == false) && (anim_onscreen == true) && (window_in_front == true) && (give_delays == false)) { if(PSD[SDF_NO_TER_ANIM] != 1) anim_ticks++; initiate_redraw(); } break; case 2: if ((overall_mode > MODE_COMBAT) && (overall_mode < MODE_TALKING)) { GetCursorPos(&press); press.x -= wind_rect.left + 3; press.y -= wind_rect.top + 41; draw_targeting_line(press); } if ((in_startup_mode == true) && (window_in_front == true)) draw_startup_anim(); break; } return 0; case WM_COMMAND: // 1006 is dummy event // creation events 2000 spend xp 2001 pick graphic 2002 finish up if (hwnd == mainPtr) { menu = GetMenu(mainPtr); All_Done = handle_menu((short) LOWORD(wParam), menu); check_game_done(); } else check_cd_event(hwnd,message,wParam,lParam); return 0; case WM_VSCROLL: which_sbar = GetWindowLong((HWND) lParam, GWL_ID); switch (which_sbar) {// 1 text 2 items 3 shop case 1: sbar_pos = GetScrollPos(text_sbar,SB_CTL); switch (wParam ) { case SB_PAGEDOWN: sbar_pos += 11; break; case SB_LINEDOWN: sbar_pos++; break; case SB_PAGEUP: sbar_pos -= 11; break; case SB_LINEUP: sbar_pos--; break; case SB_TOP: sbar_pos = 0; break; case SB_BOTTOM: sbar_pos = 57; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: sbar_pos = LOWORD(lParam); break; } if (sbar_pos < 0) sbar_pos = 0; if (sbar_pos > 58) sbar_pos = 58; { // SetScrollPos(text_sbar,SB_CTL,sbar_pos,true); lpsi.nPos = sbar_pos; lpsi.fMask = SIF_POS; SetScrollInfo(text_sbar,SB_CTL,&lpsi,true); } string_added = true; print_buf(); break; case 2: old_setting = sbar_pos = GetScrollPos(item_sbar,SB_CTL); GetScrollRange(item_sbar,SB_CTL,(int *) &smin,(int *) &smax); switch (wParam ) { case SB_PAGEDOWN: sbar_pos += (stat_window == 7) ? 2 : 8; break; case SB_LINEDOWN: sbar_pos++; break; case SB_PAGEUP: sbar_pos -= (stat_window == 7) ? 2 : 8; break; case SB_LINEUP: sbar_pos--; break; case SB_TOP: sbar_pos = 0; break; case SB_BOTTOM: sbar_pos = smax; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: sbar_pos = LOWORD(lParam); break; } if (sbar_pos < 0) sbar_pos = 0; if (sbar_pos > smax) sbar_pos = smax; { // SetScrollPos(item_sbar,SB_CTL,sbar_pos,true); lpsi.nPos = sbar_pos; lpsi.fMask = SIF_POS; SetScrollInfo(item_sbar,SB_CTL,&lpsi,true); } if (sbar_pos != old_setting) put_item_screen(stat_window,1); break; case 3: old_setting = sbar_pos = GetScrollPos(shop_sbar,SB_CTL); GetScrollRange(shop_sbar,SB_CTL,(int *) &smin,(int *) &smax); switch (wParam ) { case SB_PAGEDOWN: sbar_pos += 8; break; case SB_LINEDOWN: sbar_pos++; break; case SB_PAGEUP: sbar_pos -= 8; break; case SB_LINEUP: sbar_pos--; break; case SB_TOP: sbar_pos = 0; break; case SB_BOTTOM: sbar_pos = smax; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: sbar_pos = LOWORD(lParam); break; } if (sbar_pos < 0) sbar_pos = 0; if (sbar_pos > smax) sbar_pos = smax; { // SetScrollPos(shop_sbar,SB_CTL,sbar_pos,true); lpsi.nPos = sbar_pos; lpsi.fMask = SIF_POS; SetScrollInfo(shop_sbar,SB_CTL,&lpsi,true); } if (sbar_pos != old_setting) draw_shop_graphics(0,shop_sbar_rect); break; } SetFocus(mainPtr); return 0; case WM_DESTROY: case WM_CLOSE: if (hwnd == mainPtr) { lose_graphics(); PostQuitMessage(0); } return 0; case WM_QUIT: if (hwnd == mainPtr) lose_graphics(); break; } return DefWindowProc(hwnd,message,wParam,lParam); }