/* ==================================================================== Update screen without menu itself as this is shown next frame. ==================================================================== */ void manager_show() { stk_display_apply_fullscreen( config.fullscreen ); stk_surface_blit( mbkgnd, 0,0,-1,-1, stk_display, 0,0 ); chart_show( chart_set_query_id( chart_id ), cx, cy, cw, ch ); stk_display_update( STK_UPDATE_ALL ); }
int confirm( StkFont *font, char *str, int type ) { SDL_Event event; int go_on = 1; int ret = 0; SDL_Surface *buffer = stk_surface_create( SDL_SWSURFACE, stk_display->w, stk_display->h ); SDL_SetColorKey(buffer, 0, 0); #ifdef AUDIO_ENABLED stk_sound_play( wav_click ); #endif event_clear_sdl_queue(); stk_surface_blit( stk_display, 0,0,-1,-1, buffer, 0,0 ); if ( type == CONFIRM_PAUSE ) stk_surface_gray( stk_display, 0,0,-1,-1,0 ); else draw_confirm_screen( font, buffer, str ); stk_display_update( STK_UPDATE_ALL ); while (go_on && !stk_quit_request) { SDL_WaitEvent(&event); /* TEST */ switch ( event.type ) { case SDL_QUIT: stk_quit_request = 1; break; case SDL_MOUSEBUTTONUP: if ( type == CONFIRM_ANY_KEY ) { ret = 1; go_on = 0; } /* else if ( type == CONFIRM_YES_NO ) { if ( event.button.button == LEFT_BUTTON ) ret = 1; else ret = 0; go_on = 0; }*/ break; case SDL_KEYDOWN: if ( type == CONFIRM_ANY_KEY ) { ret = 1; go_on = 0; break; } else if ( type == CONFIRM_PAUSE ) { if ( event.key.keysym.sym == SDLK_p ) { ret = 1; go_on = 0; break; } else if ( event.key.keysym.sym == SDLK_f ) { config.fullscreen = !config.fullscreen; stk_display_apply_fullscreen( config.fullscreen ); draw_confirm_screen( font, buffer, str ); stk_display_update( STK_UPDATE_ALL ); } } else switch (event.key.keysym.sym) { case SDLK_y: go_on = 0; ret = 1; break; case SDLK_ESCAPE: case SDLK_n: go_on = 0; ret = 0; default: break; } break; } } #ifdef AUDIO_ENABLED stk_sound_play( wav_click ); #endif stk_surface_blit( buffer, 0,0,-1,-1, stk_display, 0,0 ); stk_display_update( STK_UPDATE_ALL ); SDL_FreeSurface(buffer); /* reset the relative position so paddle wont jump */ SDL_GetRelativeMouseState(0,0); return ret; }
/* ==================================================================== Run menu until request sent ==================================================================== */ int manager_run() { SDL_Event event; int result = ACTION_NONE; int ms; /* draw highscores */ chart_show( chart_set_query_id( chart_id ), cx, cy, cw, ch ); /* loop */ stk_timer_reset(); while ( result == ACTION_NONE && !stk_quit_request ) { menu_hide( cur_menu ); hint_hide(); /* fullscreen if no item selected */ if ( SDL_PollEvent( &event ) ) { if ( cur_menu->cur_item == 0 || (cur_menu->cur_item->type != ITEM_EDIT && cur_menu->cur_item->type != ITEM_KEY ) ) if ( event.type == SDL_KEYDOWN ) if ( event.key.keysym.sym == SDLK_f ) { config.fullscreen = !config.fullscreen; stk_display_apply_fullscreen( config.fullscreen ); stk_surface_blit( mbkgnd, 0,0,-1,-1, stk_display, 0,0 ); stk_display_update( STK_UPDATE_ALL ); } /* check if clicked on highscore */ if ( event.type == SDL_MOUSEBUTTONDOWN ) if ( event.button.x >= cx && event.button.y >= cy ) if ( event.button.x < cx + cw && event.button.y < cy + ch ) { #ifdef AUDIO_ENABLED stk_sound_play( wav_menu_click ); #endif /* set chart id */ if ( event.button.button == STK_BUTTON_LEFT ) { chart_id++; if ( chart_id == charts->count ) chart_id = 0; } else { chart_id--; if ( chart_id == -1 ) chart_id = charts->count - 1; } /* redraw */ stk_surface_blit( mbkgnd, 0,0,-1,-1, stk_display, 0,0 ); chart_show( chart_set_query_id( chart_id ), cx, cy, cw, ch ); } result = menu_handle_event( cur_menu, &event ); } else #ifdef ANDROID stk_surface_blit( mbkgnd, 0,0,-1,-1, stk_display, 0,0 ); #endif menu_handle_event( cur_menu, 0 ); /* update motion */ ms = stk_timer_get_time(); menu_update( cur_menu, ms ); hint_update( ms ); menu_show( cur_menu ); chart_show( chart_set_query_id( chart_id ), cx, cy, cw, ch ); hint_show(); stk_display_update( STK_UPDATE_RECTS ); SDL_Delay( 5 ); } return result; }
/* modify the client and its state according to the key pressed */ static int handle_default_key( int key, int *abort ) { SDL_Surface *buffer; switch ( key ) { case SDLK_F1: case SDLK_h: if ( client_state != CS_PLAY ) break; if ( game->game_type == GT_NETWORK ) break; /* only for single player */ grab_input(0); help_run(); grab_input(1); return 1; case SDLK_q: case SDLK_ESCAPE: /* recv_stats or final_stats means we already broke up * the game so ESC will directly quit */ if ( client_state == CS_RECV_STATS || client_state == CS_FINAL_STATS ) { *abort = 1; break; } if ( client_state == CS_CONFIRM_QUIT ) break; if ( client_state == CS_PAUSE ) break; if ( players_count() == 0 ) break; set_state(CS_CONFIRM_QUIT); if ( game->game_type == GT_LOCAL && game_set != 0 /*not testing a level*/ ) display_text( font, "Quit Game? y/n#(If yes, this game may be resumed later.#No highscore entry is created yet.)" ); else display_text( font, "Quit Game? y/n" ); return 1; case SDLK_r: if ( client_state != CS_PLAY ) break; if ( game->game_type == GT_NETWORK ) break; /* only for single player */ if ( game_set == 0 ) break; /* test level */ if ( cur_player->lives < 2 ) break; set_state(CS_CONFIRM_RESTART); display_text( font, "Restart Level? y/n" ); return 1; case SDLK_d: if ( client_state != CS_PLAY ) break; if ( game->game_type == GT_NETWORK ) break; /* only for single player */ if ( !allow_disintegrate ) break; if ( game->level_type != LT_NORMAL ) break; /* not in bonus levels */ grab_input(0); game_nuke(); grab_input(1); return 1; case SDLK_f: buffer = stk_surface_create( SDL_SWSURFACE, 640, 480 ); SDL_BlitSurface( stk_display, 0, buffer, 0 ); config.fullscreen = !config.fullscreen; stk_display_apply_fullscreen( config.fullscreen ); SDL_BlitSurface( buffer, 0, stk_display, 0 ); stk_display_update( STK_UPDATE_ALL); SDL_FreeSurface( buffer ); return 1; case SDLK_s: #ifdef AUDIO_ENABLED config.sound = !config.sound; stk_audio_enable_sound( config.sound ); #endif return 1; case SDLK_a: config.anim++; if ( config.anim >= 4 ) config.anim = 0; return 1; case SDLK_TAB: stk_display_take_screenshot(); return 1; case SDLK_t: return 0; case SDLK_p: if ( client_state == CS_PLAY ) client_set_pause(1); else if (client_state==CS_PAUSE) client_set_pause(0); return 1; default: if ( client_state != CS_PLAY ) break; if ( game->game_type != GT_LOCAL ) break; if ( game->bricks_left > game->warp_limit ) break; if ( game_set == 0 ) break; /* test level */ if ( game->level_type != LT_NORMAL ) break; /* not in bonus levels */ if ( key == config.k_warp ) { set_state(CS_CONFIRM_WARP); display_text( font, "Warp to next level? y/n" ); return 1; } break; } return 0; }