static int client_render_pause_chatter( int x, int y, SDL_Surface *buffer ) { char *ptr = 0, *name_end = 0; StkFont *font = 0; if ( y < 0 || y >= CHAT_LINE_COUNT ) return 0; if ( pause_chatter[y][0] == '!' ) { font = chat_font_error; ptr = pause_chatter[y] + 1; } else { ptr = pause_chatter[y]; font = chat_font_normal; } font->align = STK_FONT_ALIGN_LEFT; stk_font_write( font, buffer, 2,0, STK_OPAQUE, ptr ); if ( pause_chatter[y][0] == '<' ) if ( ( name_end = strchr( pause_chatter[y], '>' ) ) ) { name_end[1] = 0; stk_font_write( chat_font_name, buffer, 2,0, STK_OPAQUE, pause_chatter[y] ); name_end[1] = ' '; } return 1; }
/* ==================================================================== Display text blinking. ==================================================================== */ void write_text_with_cursor( StkFont *fnt, SDL_Surface *dest, int x, int y, char *str, int alpha) { static int cursor_on = 0; static Uint32 last_tick = 0; // create temporary space for cursor and text char *text_with_cursor = calloc(strlen(str) + 2, sizeof(char)); if (text_with_cursor) { strcpy(text_with_cursor, str); // Time to blink cursor on/off? if (SDL_GetTicks() - last_tick > 500) { last_tick = SDL_GetTicks(); cursor_on = ! cursor_on; } // Tack on cursor to end of text if (cursor_on) { strcat(text_with_cursor, "_"); } else { strcat(text_with_cursor, " "); } stk_font_write(fnt,dest,x,y,alpha,text_with_cursor); free(text_with_cursor); } }
GuiWidget* gui_radiogroup_create( GuiWidget *parent, int x, int y, int width, int height, int with_frame, void (*user_event_handler)(GuiWidget*,GuiEvent*), int item_count, char **items, int min, int max ) { int px, py, i, j, gap = 4; GuiWidget *widget = gui_widget_create( parent, GUI_RADIOGROUP, x, y, width, height, default_event_handler, user_event_handler ); /* events */ gui_widget_enable_event( widget, GUI_CLICKED ); /* create surface, wallpaper and frame it */ widget->surface = stk_surface_create( SDL_SWSURFACE, width, height ); SDL_SetColorKey( widget->surface, 0,0 ); stk_surface_apply_wallpaper( widget->surface, 0,0,-1,-1, gui_theme->widget_wallpaper, -1 ); if ( with_frame ) widget->border = stk_surface_apply_frame( widget->surface, 0, 0, -1, -1, gui_theme->widget_frame ); /* size w/o border */ widget->width -= 2 * widget->border; widget->height -= 2 * widget->border; /* various */ widget->spec.radiogroup.size = item_count; widget->spec.radiogroup.min = min; widget->spec.radiogroup.max = max; widget->spec.radiogroup.single_check = -1; /* compute offset of single items */ widget->spec.radiogroup.offset = (height - 2 * widget->border) / item_count; /* position of first checkbox */ widget->spec.radiogroup.x = widget->border + gap; widget->spec.radiogroup.y = widget->border + (widget->spec.radiogroup.offset - gui_theme->checkbox_size) / 2; /* add empty checkboxes and labels */ gui_theme->label_font->align = STK_FONT_ALIGN_CENTER_Y; px = widget->spec.radiogroup.x; py = widget->spec.radiogroup.y; for ( i = 0, j = 0; i < widget->spec.radiogroup.size; i++, py += widget->spec.radiogroup.offset, j++ ) { stk_surface_blit( gui_theme->checkbox, 0, 0, gui_theme->checkbox_size, gui_theme->checkbox_size, widget->surface, px, py ); stk_font_write( gui_theme->label_font, widget->surface, px + gui_theme->checkbox_size + gap, py + gui_theme->checkbox_size/2, -1, items[j] ); } /* create empty checkers */ widget->spec.radiogroup.checks = calloc( item_count, sizeof( int ) ); if ( widget->spec.radiogroup.checks == 0 ) GUI_ABORT( "Out Of Memory" ); return widget; }
/* ==================================================================== Enter a string and return True if ENTER received and False if ESCAPE received. ==================================================================== */ int enter_string( StkFont *font, char *caption, char *edit, int limit ) { SDL_Event event; int go_on = 1; int ret = 0; SDL_Surface *buffer = stk_surface_create( SDL_SWSURFACE, stk_display->w, stk_display->h ); int length = strlen( edit ); SDL_SetColorKey(buffer, 0, 0); stk_surface_blit( stk_display, 0,0,-1,-1, buffer, 0,0 ); font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_CENTER_Y; while ( go_on && !stk_quit_request ) { stk_surface_fill( stk_display, 0,0,-1,-1, 0x0 ); stk_surface_alpha_blit( buffer, 0,0,-1,-1, stk_display, 0,0, 128 ); stk_font_write(font, stk_display, stk_display->w / 2, stk_display->h / 2, STK_OPAQUE, caption); write_text_with_cursor(font, stk_display, stk_display->w / 2, stk_display->h / 2 + font->height, edit, STK_OPAQUE); stk_display_update( STK_UPDATE_ALL ); event.type = SDL_NOEVENT; SDL_PollEvent(&event); /* TEST */ switch ( event.type ) { case SDL_QUIT: stk_quit_request = 1; break; case SDL_KEYDOWN: switch ( event.key.keysym.sym ) { case SDLK_ESCAPE: ret = 0; go_on = 0; break; case SDLK_RETURN: ret = 1; go_on = 0; break; case SDLK_BACKSPACE: if ( length > 0 ) edit[--length] = 0; break; default: if ( event.key.keysym.sym >= 32 && event.key.keysym.sym < 128 && length < limit ) { edit[length++] = event.key.keysym.unicode; edit[length] = 0; } break; } break; } } 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; }
/* ==================================================================== Draw highscores centered in regio x,y,w,h ==================================================================== */ void chart_show( Set_Chart *chart, int x, int y, int w, int h ) { char number_buffer[24]; int entry_offset; /* y offset of entries */ StkFont *font; int i; /* adjust x,y so it's centered */ chart_pos.x = x + ( w - chart_pos.w ) / 2; chart_pos.y = y + ( h - chart_pos.h ) / 2; /* title = name of levelset */ ccfont->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_TOP; stk_font_write( ccfont, stk_display, chart_pos.x + ( chart_pos.w >> 1 ), chart_pos.y, -1, chart->name ); /* caption */ ccfont->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP; char *cheader = _("Name Level Score"); stk_font_write( ccfont, stk_display, chart_pos.x, chart_pos.y + ccfont->height + chart_gap, -1, cheader ); /* get entry offset */ entry_offset = ( ccfont->height + chart_gap ) * 2 + chart_pos.y; /* entries */ for ( i = 0; i < CHART_ENTRY_COUNT; i++ ) { font = cfont; if ( chart->entries[i].new_entry ) font = chfont; /* name */ font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP; stk_font_write( font, stk_display, chart_pos.x, entry_offset, -1, chart->entries[i].name ); /* level */ font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_TOP; sprintf( number_buffer, "%i", chart->entries[i].level ); stk_font_write( font, stk_display, chart_pos.x + chart_level_offset, entry_offset, -1, number_buffer ); /* score */ font->align = STK_FONT_ALIGN_RIGHT | STK_FONT_ALIGN_TOP; sprintf( number_buffer, "%i", chart->entries[i].score ); stk_font_write( font, stk_display, chart_pos.x + chart_pos.w, entry_offset, -1, number_buffer ); /* change offset */ entry_offset += font->height; } stk_display_store_rect( &chart_pos ); }
/* ==================================================================== Render channel. ==================================================================== */ static int client_render_channel( int x, int y, SDL_Surface *buffer ) { if ( y >= client_channels->count ) return 0; chat_font_normal->align = STK_FONT_ALIGN_LEFT; stk_font_write( chat_font_normal, buffer, 2,0, STK_OPAQUE, (char*)list_get( client_channels, y ) ); return 1; }
/* ==================================================================== Render help topic. ==================================================================== */ static int client_render_topic( int x, int y, SDL_Surface *buffer ) { if ( y >= client_topic_count ) return 0; chat_font_normal->align = STK_FONT_ALIGN_LEFT; stk_font_write( chat_font_normal, buffer, 2,0, STK_OPAQUE, client_topics[y] ); return 1; }
/* ==================================================================== Render help topic. ==================================================================== */ static int client_render_help( int x, int y, SDL_Surface *buffer ) { if ( !client_help_text ) return 0; if ( y >= client_help_text->count ) return 0; chat_font_normal->align = STK_FONT_ALIGN_LEFT; stk_font_write( chat_font_normal, buffer, 2,0, STK_OPAQUE, client_help_text->lines[y] ); return 1; }
/* ==================================================================== Render user ==================================================================== */ static int client_render_user( int x, int y, SDL_Surface *buffer ) { ClientUser *user; StkFont *font; if ( y >= client_users->count ) return 0; if ( ( user = list_get( client_users, y ) ) == 0 ) return 0; if ( user->id == client_id ) font = chat_font_name; else font = chat_font_normal; font->align = STK_FONT_ALIGN_LEFT; stk_font_write( font, buffer, 2,0, STK_OPAQUE, user->name ); return 1; }
/* ==================================================================== Confirm request. Darkens screen a bit and display text. Return Value: True if successful ==================================================================== */ void draw_confirm_screen( StkFont *font, SDL_Surface *buffer, char *str ) { int i, y, x; Text *text = create_text( str, 60 ); stk_surface_fill( stk_display, 0,0,-1,-1, 0x0 ); stk_surface_alpha_blit( buffer, 0,0,-1,-1, stk_display, 0,0, 128 ); font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_TOP; y = (stk_display->h - text->count * font->height) / 2; x = stk_display->w / 2; for ( i = 0; i < text->count; i++ ) { stk_font_write(font, stk_display, x, y, STK_OPAQUE, text->lines[i]); y += font->height; } delete_text( text ); }
static void default_event_handler( GuiWidget *widget, GuiEvent *event ) { switch ( event->type ) { case GUI_DESTROY: break; case GUI_DRAW: /* display surface */ stk_surface_blit( widget->surface, 0,0,-1,-1, stk_display, widget->screen_region.x, widget->screen_region.y ); /* add progress */ stk_surface_apply_wallpaper( stk_display, widget->screen_region.x + widget->border, widget->screen_region.y + widget->border, widget->spec.progressbar.length, widget->screen_region.h - (widget->border<<1), widget->spec.progressbar.wallpaper, -1 ); /* if focused add info */ if ( widget->focused ) { gui_theme->progressbar_font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_CENTER_Y; snprintf( progressbar_hint, 32, "%i/%i", widget->spec.progressbar.value, widget->spec.progressbar.max ); stk_font_write( gui_theme->progressbar_font, stk_display, widget->screen_region.x + widget->screen_region.w/2, widget->screen_region.y + widget->screen_region.h/2, -1, progressbar_hint ); } break; case GUI_FOCUS_IN: case GUI_FOCUS_OUT: gui_widget_draw( widget ); break; } }
/* gray screen and display a formatted text, directly update the * screen */ void display_text( StkFont *font, char *format, ... ) { int i, y, x; Text *text; char buf[512]; va_list args; va_start( args, format ); vsnprintf( buf, 512, format, args ); va_end( args ); stk_surface_gray( stk_display, 0,0,-1,-1, 2 ); text = create_text( buf, 60 ); font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_TOP; y = (stk_display->h - text->count * font->height) / 2; x = stk_display->w / 2; for ( i = 0; i < text->count; i++ ) { stk_font_write(font, stk_display, x, y, STK_OPAQUE, text->lines[i]); y += font->height; } delete_text( text ); stk_display_update( STK_UPDATE_ALL ); }
/* ==================================================================== Load theme by name or delete current theme (is done by load too so it might be used to change a theme as well.) ==================================================================== */ void theme_load( char *name ) { SDL_Surface *surf; struct stat filestat; char aux[128]; int i; printf( "Loading theme '%s'\n", name ); /* clear resources */ theme_delete(); /* set theme directory */ theme_set_dir( name ); /* load resources */ /* explosions */ exp_pic = theme_load_surf( "explosions.png" ); exp_dark_pic = theme_load_surf( "explosions_dark.png" ); /* main game font */ font = theme_load_font_fixed( "f_game.png", 32, 96, 10 ); font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_CENTER_Y; /* normal chat font (messages by server) */ chat_font_normal = theme_load_font_fixed( "f_small_yellow.png", 32, 96, 8 ); /* error font (messages by server) */ chat_font_error = theme_load_font_fixed( "f_small_red.png", 32, 96, 8 ); /* username font (also for server) */ chat_font_name = theme_load_font_fixed( "f_small_white.png", 32, 96, 8 ); /* main game sounds */ #ifdef AUDIO_ENABLED wav_click = theme_load_sound( "click.wav" ); wav_damn = theme_load_sound( "damn.wav" ); wav_dammit = theme_load_sound( "dammit.wav" ); wav_wontgiveup = theme_load_sound( "wontgiveup.wav" ); wav_excellent = theme_load_sound( "excellent.wav" ); wav_verygood = theme_load_sound( "verygood.wav" ); #endif /* brick pics and shadow template */ brick_pic = theme_load_surf( "bricks.png" ); /* default color key is: BLACK but you may specify a special key by adding a column of one pixel width at the end of the file */ if ( brick_pic->w & 1 ) SDL_SetColorKey( brick_pic, SDL_SRCCOLORKEY, stk_surface_get_pixel( brick_pic, brick_pic->w - 1, 0 ) ); brick_shadow = create_shadow( brick_pic, 0, 0, brick_pic->w, brick_pic->h ); /* brick destruction sound */ #ifdef AUDIO_ENABLED wav_boom = theme_load_sound( "exp.wav" ); #endif /* paddle and weapon */ paddle_pic = theme_load_surf( "paddle.png" ); SDL_SetColorKey( paddle_pic, SDL_SRCCOLORKEY, stk_surface_get_pixel( paddle_pic, 0, 0 ) ); if ( paddle_pic->w < 6 * paddle_cw ) { /* no top paddle specified so duplicate first one */ surf = stk_surface_create( SDL_SWSURFACE, paddle_pic->w*2, paddle_pic->h ); SDL_SetColorKey( surf, SDL_SRCCOLORKEY, paddle_pic->format->colorkey ); SDL_FillRect( surf, 0, paddle_pic->format->colorkey ); stk_surface_blit( paddle_pic, 0,0,-1,-1, surf, 0,0 ); stk_surface_blit( paddle_pic, 0,0,-1,-1, surf, paddle_pic->w,0 ); stk_surface_free( &paddle_pic ); paddle_pic = surf; } weapon_pic = theme_load_surf( "weapon.png" ); paddle_shadow = create_shadow( paddle_pic, 0, 0, paddle_pic->w, paddle_pic->h ); weapon_shadow = create_shadow( weapon_pic, 0, 0, weapon_pic->w, weapon_pic->h ); ammo_pic = theme_load_surf( "ammo.png" ); SDL_SetColorKey( ammo_pic, SDL_SRCCOLORKEY, 0x0 ); /* paddle sounds */ #ifdef AUDIO_ENABLED wav_expand = theme_load_sound( "expand.wav" ); wav_shrink = theme_load_sound( "shrink.wav" ); wav_frozen = theme_load_sound( "freeze.wav" ); #endif /* ball gfx */ ball_pic = theme_load_surf( "ball.png" ); SDL_SetColorKey( ball_pic, SDL_SRCCOLORKEY, stk_surface_get_pixel( ball_pic, 0, 0 ) ); ball_shadow = create_shadow( ball_pic, 0, 0, ball_w, ball_h ); /* ball sounds */ #ifdef AUDIO_ENABLED wav_reflect_brick = theme_load_sound( "reflect_brick.wav" ); wav_reflect_paddle = theme_load_sound( "reflect_paddle.wav" ); wav_attach = theme_load_sound( "attach.wav" ); #endif /* shot gfx */ shot_pic = theme_load_surf( "shot.png" ); shot_shadow = create_shadow( shot_pic, 0, 0, shot_w, shot_h ); #ifdef AUDIO_ENABLED wav_shot = theme_load_sound( "shot.wav" ); #endif /* extra pic */ extra_pic = theme_load_surf( "extras.png" ); SDL_SetColorKey( extra_pic, 0, 0 ); /* default color key is: disabled but you may specify a special key by adding a column of one pixel width at the end of the file */ if ( extra_pic->w & 1 ) SDL_SetColorKey( extra_pic, SDL_SRCCOLORKEY, stk_surface_get_pixel( extra_pic, extra_pic->w - 1, 0 ) ); extra_shadow = create_shadow( extra_pic, 0, 0, extra_pic->w, extra_pic->h ); /* extra sounds */ #ifdef AUDIO_ENABLED wav_score = theme_load_sound( "score.wav" ); wav_metal = theme_load_sound( "metal.wav" ); wav_speedup = theme_load_sound( "speedup.wav" ); wav_speeddown = theme_load_sound( "speeddown.wav" ); wav_std = theme_load_sound( "standard.wav" ); wav_wall = theme_load_sound( "wall.wav" ); wav_joker = theme_load_sound( "joker.wav" ); wav_goldshower = theme_load_sound( "goldshower.wav" ); wav_chaos = theme_load_sound( "chaos.wav" ); wav_darkness = theme_load_sound( "darkness.wav" ); wav_ghost = theme_load_sound( "ghost.wav" ); wav_timeadd = theme_load_sound( "timeadd.wav" ); wav_expl_ball = theme_load_sound( "expl_ball.wav" ); wav_weak_ball = theme_load_sound( "weak_ball.wav" ); wav_bonus_magnet = theme_load_sound( "bonus_magnet.wav" ); wav_malus_magnet = theme_load_sound( "malus_magnet.wav" ); wav_disable = theme_load_sound( "disable.wav" ); #endif /* shine pic */ shine_pic = theme_load_surf( "shine.png" ); /* chatroom */ cr_up = theme_load_surf( "scroll_up.png" ); cr_down = theme_load_surf( "scroll_down.png" ); cr_track = theme_load_surf( "scroll_track.png" ); cr_wallpaper = theme_load_surf( "cr_back.png" ); SDL_SetColorKey( cr_wallpaper, 0,0 ); /* frame box */ fr_hori = theme_load_surf( "fr_hori.png" ); fr_vert = theme_load_surf( "fr_vert.png" ); fr_luc = theme_load_surf( "fr_luc.png" ); fr_llc = theme_load_surf( "fr_llc.png" ); fr_ruc = theme_load_surf( "fr_ruc.png" ); fr_rlc = theme_load_surf( "fr_rlc.png" ); /* frame */ theme_load_frame(); /* wall */ sprintf( theme_path, "%s/floor.png", theme_dir ); if ( stat( theme_path, &filestat ) == -1 ) { /* build default floor */ wall_pic = stk_surface_create( SDL_SWSURFACE, stk_display->w - 2 * BRICK_WIDTH, BRICK_HEIGHT ); /* bricks must have been loaded at this point! */ for ( i = 0; i < MAP_WIDTH - 2; i++ ) stk_surface_blit( brick_pic, 0, 0, BRICK_WIDTH, BRICK_HEIGHT, wall_pic, i * BRICK_WIDTH, 0 ); } else { /* load floor */ wall_pic = theme_load_surf( "floor.png" ); } /* backgrounds */ theme_load_bkgnds(); /* build nuke bkgnd */ nuke_bkgnd = stk_surface_create( SDL_SWSURFACE, stk_display->w, stk_display->h ); surf = stk_surface_load( SDL_SWSURFACE, "nukeback.png" ); stk_surface_apply_wallpaper( nuke_bkgnd, 0,0,-1,-1, surf, 128 ); stk_surface_free( &surf ); stk_surface_gray( nuke_bkgnd, 0,0,-1,-1, 0 ); /* manager */ mbkgnd = theme_load_surf( "menuback.png" ); SDL_SetColorKey( mbkgnd, 0, 0 ); mfont = theme_load_font_fixed( "f_small_yellow.png", 32, 96, 8 ); mhfont = theme_load_font_fixed( "f_white.png", 32, 96, 10 ); mcfont = theme_load_font_fixed( "f_yellow.png", 32, 96, 10 ); #ifdef AUDIO_ENABLED wav_menu_click = theme_load_sound( "menu_click.wav" ); wav_menu_motion = theme_load_sound( "menu_motion.wav" ); #endif /* add version to background */ mfont->align = STK_FONT_ALIGN_RIGHT | STK_FONT_ALIGN_BOTTOM; sprintf( aux, "v%s", VERSION ); stk_font_write( mfont, mbkgnd, mbkgnd->w - 4, stk_display->h - 4 - mfont->height, STK_OPAQUE, aux ); stk_font_write( mfont, mbkgnd, mbkgnd->w - 4, stk_display->h - 4, STK_OPAQUE, "http://lgames.sf.net" ); /* charts */ /* load resources */ cfont = theme_load_font_fixed( "f_small_yellow.png", 32, 96, 8 ); chfont = theme_load_font_fixed( "f_small_white.png", 32, 96, 8 ); ccfont = theme_load_font_fixed( "f_yellow.png", 32, 96, 10 ); /* warp picture */ warp_pic = theme_load_surf( "warp.png" ); }
/* ==================================================================== Enter nuke mode and allow player to disintegrate single bricks by spending 5% of his/her score. ==================================================================== */ void game_nuke( void ) { char buf[128]; SDL_Event event; int x,y,i,j,leave = 0; SDL_Surface *buffer = stk_surface_create( SDL_SWSURFACE, stk_display->w, stk_display->h ); SDL_Surface *red_mask = stk_surface_create( SDL_SWSURFACE, BRICK_WIDTH, BRICK_HEIGHT ); stk_surface_fill( red_mask, 0,0,-1,-1, 0xFF0000 ); SDL_SetAlpha( red_mask, SDL_SRCALPHA, 128 ); SDL_SetColorKey(buffer, 0, 0); #ifdef AUDIO_ENABLED stk_sound_play( wav_click ); #endif SDL_SetEventFilter(0); event_clear_sdl_queue(); /* backup screen contents */ stk_surface_blit( stk_display, 0,0,-1,-1, buffer, 0,0 ); /* display bricks darkened */ stk_surface_blit( nuke_bkgnd, 0,0,-1,-1, stk_display, 0,0 ); for ( i = 1; i < MAP_WIDTH - 1; i++ ) for ( j = 1; j < MAP_HEIGHT - 1; j++ ) if ( game->bricks[i][j].id >= 0 ) stk_surface_alpha_blit( brick_pic, game->bricks[i][j].id * BRICK_WIDTH, 0, BRICK_WIDTH, BRICK_HEIGHT, stk_display, i*BRICK_WIDTH, j*BRICK_HEIGHT, 128 ); /* info */ font->align = STK_FONT_ALIGN_LEFT; sprintf( buf, "Plane Of Inner Stability entered (Score: %i)", l_paddle->player->stats.total_score + l_paddle->score ); stk_font_write( font, stk_display, BRICK_WIDTH, (MAP_HEIGHT-1)*BRICK_HEIGHT, 128, buf ); /* show score of player */ stk_display_update( STK_UPDATE_ALL ); x = y = -1; while (!leave && !stk_quit_request) { SDL_WaitEvent(&event); switch ( event.type ) { case SDL_QUIT: stk_quit_request = 1; break; case SDL_MOUSEBUTTONDOWN: if ( x != -1 ) if ( confirm( font, "Disintegrate Brick? (Costs 5% of your score.) y/n", CONFIRM_YES_NO ) ) { /* implant a bomb to this brick and return */ game_set_current( local_game ); brick_start_expl( x,y, BRICK_EXP_TIME, local_game->paddles[0] ); local_game->bricks[x][y].score = 0; game_set_current( game ); l_paddle->player->stats.total_score -= (int)(0.05 * (l_paddle->score + l_paddle->player->stats.total_score)); leave = 1; } break; case SDL_MOUSEMOTION: if ( x != -1 ) { /* clear old selection */ stk_surface_blit( nuke_bkgnd, x*BRICK_WIDTH, y*BRICK_HEIGHT, BRICK_WIDTH, BRICK_HEIGHT, stk_display, x*BRICK_WIDTH, y*BRICK_HEIGHT ); stk_surface_alpha_blit( brick_pic, game->bricks[x][y].id * BRICK_WIDTH, 0, BRICK_WIDTH, BRICK_HEIGHT, stk_display, x*BRICK_WIDTH, y*BRICK_HEIGHT, 128 ); stk_display_store_drect(); x = y = -1; } /* make new selection if brick */ i = event.motion.x / BRICK_WIDTH; j = event.motion.y / BRICK_HEIGHT; if ( i >= 1 && i <= MAP_WIDTH -2 ) if ( j >= 1 && j <= MAP_HEIGHT - 2 ) if ( game->bricks[i][j].id >= 0 ) { x = i; y = j; stk_surface_blit( red_mask, 0,0,-1,-1, stk_display,x*BRICK_WIDTH, y*BRICK_HEIGHT ); stk_display_store_drect(); } break; case SDL_KEYDOWN: if ( event.key.keysym.sym == SDLK_ESCAPE ) leave = 1; break; } stk_display_update( STK_UPDATE_RECTS ); } stk_surface_blit( buffer, 0,0,-1,-1, stk_display, 0,0 ); stk_display_update( STK_UPDATE_ALL ); SDL_FreeSurface(red_mask); SDL_FreeSurface(buffer); SDL_SetEventFilter(event_filter); }