📄 bowl.c
字号:
block_masks[0].mask[1][1][2] = 1; block_masks[0].mask[1][2][2] = 1; block_masks[0].mask[2][1][1] = 1; block_masks[0].mask[2][2][1] = 1; block_masks[0].mask[2][1][2] = 1; block_masks[0].mask[2][2][2] = 1; block_masks[0].mask[3][1][1] = 1; block_masks[0].mask[3][2][1] = 1; block_masks[0].mask[3][1][2] = 1; block_masks[0].mask[3][2][2] = 1; block_masks[1].rx = 0; block_masks[1].ry = 0; block_masks[1].id = 1; memset(block_masks[1].mask, 0, sizeof( int ) * 4 * 4 * 4 ); block_masks[1].mask[0][0][2] = 1; block_masks[1].mask[0][1][2] = 1; block_masks[1].mask[0][2][2] = 1; block_masks[1].mask[0][3][2] = 1; block_masks[1].mask[1][1][0] = 1; block_masks[1].mask[1][1][1] = 1; block_masks[1].mask[1][1][2] = 1; block_masks[1].mask[1][1][3] = 1; block_masks[1].mask[2][0][2] = 1; block_masks[1].mask[2][1][2] = 1; block_masks[1].mask[2][2][2] = 1; block_masks[1].mask[2][3][2] = 1; block_masks[1].mask[3][1][0] = 1; block_masks[1].mask[3][1][1] = 1; block_masks[1].mask[3][1][2] = 1; block_masks[1].mask[3][1][3] = 1; block_masks[2].rx = 0; block_masks[2].ry = 1; block_masks[2].id = 2; memset(block_masks[2].mask, 0, sizeof( int ) * 4 * 4 * 4 ); block_masks[2].mask[0][0][1] = 1; block_masks[2].mask[0][1][1] = 1; block_masks[2].mask[0][2][1] = 1; block_masks[2].mask[0][1][2] = 1; block_masks[2].mask[1][1][0] = 1; block_masks[2].mask[1][1][1] = 1; block_masks[2].mask[1][1][2] = 1; block_masks[2].mask[1][0][1] = 1; block_masks[2].mask[2][0][1] = 1; block_masks[2].mask[2][1][0] = 1; block_masks[2].mask[2][1][1] = 1; block_masks[2].mask[2][2][1] = 1; block_masks[2].mask[3][1][0] = 1; block_masks[2].mask[3][1][1] = 1; block_masks[2].mask[3][1][2] = 1; block_masks[2].mask[3][2][1] = 1; block_masks[3].rx = 0; block_masks[3].ry = 1; block_masks[3].id = 3; memset(block_masks[3].mask, 0, sizeof( int ) * 4 * 4 * 4 ); block_masks[3].mask[0][0][2] = 1; block_masks[3].mask[0][1][1] = 1; block_masks[3].mask[0][1][2] = 1; block_masks[3].mask[0][2][1] = 1; block_masks[3].mask[1][0][1] = 1; block_masks[3].mask[1][0][2] = 1; block_masks[3].mask[1][1][2] = 1; block_masks[3].mask[1][1][3] = 1; block_masks[3].mask[2][0][2] = 1; block_masks[3].mask[2][1][1] = 1; block_masks[3].mask[2][1][2] = 1; block_masks[3].mask[2][2][1] = 1; block_masks[3].mask[3][0][1] = 1; block_masks[3].mask[3][0][2] = 1; block_masks[3].mask[3][1][2] = 1; block_masks[3].mask[3][1][3] = 1; block_masks[4].rx = 0; block_masks[4].ry = 1; block_masks[4].id = 4; memset(block_masks[4].mask, 0, sizeof( int ) * 4 * 4 * 4 ); block_masks[4].mask[0][0][1] = 1; block_masks[4].mask[0][1][1] = 1; block_masks[4].mask[0][1][2] = 1; block_masks[4].mask[0][2][2] = 1; block_masks[4].mask[1][1][1] = 1; block_masks[4].mask[1][1][2] = 1; block_masks[4].mask[1][0][2] = 1; block_masks[4].mask[1][0][3] = 1; block_masks[4].mask[2][0][1] = 1; block_masks[4].mask[2][1][1] = 1; block_masks[4].mask[2][1][2] = 1; block_masks[4].mask[2][2][2] = 1; block_masks[4].mask[3][1][1] = 1; block_masks[4].mask[3][1][2] = 1; block_masks[4].mask[3][0][2] = 1; block_masks[4].mask[3][0][3] = 1; block_masks[5].rx = 0; block_masks[5].ry = 1; block_masks[5].id = 5; memset(block_masks[5].mask, 0, sizeof( int ) * 4 * 4 * 4 ); block_masks[5].mask[0][0][1] = 1; block_masks[5].mask[0][1][1] = 1; block_masks[5].mask[0][2][1] = 1; block_masks[5].mask[0][0][2] = 1; block_masks[5].mask[1][0][0] = 1; block_masks[5].mask[1][1][0] = 1; block_masks[5].mask[1][1][1] = 1; block_masks[5].mask[1][1][2] = 1; block_masks[5].mask[2][0][1] = 1; block_masks[5].mask[2][1][1] = 1; block_masks[5].mask[2][2][1] = 1; block_masks[5].mask[2][2][0] = 1; block_masks[5].mask[3][1][0] = 1; block_masks[5].mask[3][1][1] = 1; block_masks[5].mask[3][1][2] = 1; block_masks[5].mask[3][2][2] = 1; block_masks[6].rx = 0; block_masks[6].ry = 1; block_masks[6].id = 6; memset(block_masks[6].mask, 0, sizeof( int ) * 4 * 4 * 4 ); block_masks[6].mask[0][2][2] = 1; block_masks[6].mask[0][0][1] = 1; block_masks[6].mask[0][1][1] = 1; block_masks[6].mask[0][2][1] = 1; block_masks[6].mask[1][0][2] = 1; block_masks[6].mask[1][1][0] = 1; block_masks[6].mask[1][1][1] = 1; block_masks[6].mask[1][1][2] = 1; block_masks[6].mask[2][0][0] = 1; block_masks[6].mask[2][0][1] = 1; block_masks[6].mask[2][1][1] = 1; block_masks[6].mask[2][2][1] = 1; block_masks[6].mask[3][1][0] = 1; block_masks[6].mask[3][1][1] = 1; block_masks[6].mask[3][1][2] = 1; block_masks[6].mask[3][2][0] = 1;}/*====================================================================Create a bowl at screen position x,y. Measurements are the same forall bowls. Controls are the player's controls defined in config.c.====================================================================*/Bowl *bowl_create( int x, int y, int preview_x, int preview_y, SDL_Surface *blocks, SDL_Surface *unknown_preview, char *name, Controls *controls ){ Bowl *bowl = calloc( 1, sizeof( Bowl ) ); bowl->mute = 0; bowl->blind = 0; bowl->sx = x; bowl->sy = y; bowl->block_size = BOWL_BLOCK_SIZE; bowl->w = BOWL_WIDTH; bowl->h = BOWL_HEIGHT; bowl->sw = bowl->w * bowl->block_size; bowl->sh = bowl->h * bowl->block_size; bowl->blocks = blocks; bowl->unknown_preview = unknown_preview; strcpy( bowl->name, name ); bowl->controls = controls; bowl->use_figures = ( config.gametype == 2 ); bowl->level = (config.gametype == 2 ) ? 0 : config.starting_level; bowl->stored_key = -1; bowl_reset_contents( bowl ); if ( config.same_blocks_for_all && !config.expert && config.gametype >= 3 ) { bowl->use_same_blocks = 1; bowl->next_block_id = next_blocks[bowl->next_blocks_pos++]; } else bowl->next_block_id = rand() % BLOCK_COUNT; delay_set( &bowl->block_hori_delay, config.hori_delay * 12 + 63 ); bowl->block_hori_vel = (float)bowl->block_size / bowl->block_hori_delay.limit; bowl->block_drop_vel = 0.8; bowl_set_vert_block_vel( bowl ); bowl->help_sw = bowl->help_sh = bowl->block_size * 4; bowl->preview_center_sx = preview_x; bowl->preview_center_sy = preview_y; bowl_create_next_block( bowl ); bowl->help_alpha_change = 1.2; bowl->preview_alpha_change = 0.4; bowl->font = load_fixed_font( "f_small_white.bmp", 32, 96, 8 );#ifdef SOUND bowl->wav_leftright = sound_chunk_load( "leftright.wav" ); bowl->wav_explosion = sound_chunk_load( "explosion.wav" ); bowl->wav_stop = sound_chunk_load( "stop.wav" ); bowl->wav_nextlevel = sound_chunk_load( "nextlevel.wav" ); bowl->wav_excellent = sound_chunk_load( "excellent.wav" );#endif return bowl;}void bowl_delete( Bowl *bowl ){ free_font( &bowl->font );#ifdef SOUND if ( bowl->wav_excellent ) sound_chunk_free( bowl->wav_excellent ); bowl->wav_excellent = 0; if ( bowl->wav_nextlevel ) sound_chunk_free( bowl->wav_nextlevel ); bowl->wav_nextlevel = 0; if ( bowl->wav_stop ) sound_chunk_free( bowl->wav_stop ); bowl->wav_stop = 0; if ( bowl->wav_leftright ) sound_chunk_free( bowl->wav_leftright ); bowl->wav_leftright = 0; if ( bowl->wav_explosion ) sound_chunk_free( bowl->wav_explosion ); bowl->wav_explosion = 0;#endif free( bowl );}/*====================================================================Check if key belongs to this bowl and store the value for use inbowl_update().====================================================================*/void bowl_store_key( Bowl *bowl, int keysym ){ if ( !bowl->controls ) return; /* CPU handles this bowl */ if ( bowl->controls->left == keysym ) bowl->stored_key = KEY_LEFT; else if ( bowl->controls->right == keysym ) bowl->stored_key = KEY_RIGHT; else if ( bowl->controls->rot_left == keysym ) bowl->stored_key = KEY_ROT_LEFT; else if ( bowl->controls->rot_right == keysym ) bowl->stored_key = KEY_ROT_RIGHT; else if ( bowl->controls->down == keysym ) bowl->stored_key = KEY_DOWN; else if ( bowl->controls->drop == keysym ) bowl->stored_key = KEY_DROP;}/*====================================================================Hide/show/update all animations handled by a bowl.====================================================================*/void bowl_hide( Bowl *bowl ){ /* block */ if ( !bowl->hide_block ) { DEST( sdl.screen, bowl->block.sx, bowl->block.sy, bowl->block.sw, bowl->block.sh ); SOURCE( offscreen, bowl->block.sx, bowl->block.sy ); blit_surf(); add_refresh_rect( bowl->block.sx, bowl->block.sy, bowl->block.sw, bowl->block.sh ); } /* help */ if ( config.help ) { DEST( sdl.screen, bowl->help_sx, bowl->help_sy, bowl->help_sw, bowl->help_sh ); SOURCE( offscreen, bowl->help_sx, bowl->help_sy ); blit_surf(); add_refresh_rect( bowl->help_sx, bowl->help_sy, bowl->help_sw, bowl->help_sh ); } /* preview */ if ( bowl->preview_center_sx != -1 ) { DEST( sdl.screen, bowl->preview_center_sx - ( bowl->block_size << 1 ), bowl->preview_center_sy - ( bowl->block_size << 1 ), bowl->block_size << 2, bowl->block_size << 2 ); SOURCE( offscreen, bowl->preview_center_sx - ( bowl->block_size << 1 ), bowl->preview_center_sy - ( bowl->block_size << 1 ) ); blit_surf(); add_refresh_rect( bowl->preview_center_sx - ( bowl->block_size << 1 ), bowl->preview_center_sy - ( bowl->block_size << 1 ), bowl->block_size << 2, bowl->block_size << 2 ); } /* score */ DEST( sdl.screen, bowl->score_sx, bowl->score_sy, bowl->score_sw, bowl->score_sh ); SOURCE( offscreen, bowl->score_sx, bowl->score_sy ); blit_surf(); add_refresh_rect( bowl->score_sx, bowl->score_sy, bowl->score_sw, bowl->score_sh ); /* remove help lines */ if ( !bowl->hide_block && (config.help == 2) ) { int i, j; int x = bowl->block.sx, y = bowl->block.sy; int tile_x = 0, tile_y = 0; int left = bowl->block.sx + bowl->block.sw - 1; int right = bowl->block.sx; /* left and right borders of current block */ for ( j = 0; j < 4; j++ ) { for ( i = 0; i < 4; i++ ) { if ( block_masks[bowl->block.id].mask[bowl->block.rot_id][i][j] ) { if ( x < left ) left = x; if ( x + bowl->block_size - 1 > right ) right = x + bowl->block_size - 1; } x += bowl->block_size; tile_x += bowl->block_size; } y += bowl->block_size; x = bowl->block.sx; tile_x = 0; tile_y += bowl->block_size; } DEST( sdl.screen, left, bowl->sy, 1, bowl->sh ); SOURCE( offscreen, left, bowl->sy ); blit_surf(); add_refresh_rect( left, bowl->sy, 1, bowl->sh ); DEST( sdl.screen, right, bowl->sy, 1, bowl->sh ); SOURCE( offscreen, right, bowl->sy ); blit_surf(); add_refresh_rect( right, bowl->sy, 1, bowl->sh ); }}void bowl_show( Bowl *bowl ){ int i, j; int x = bowl->block.sx, y = bowl->block.sy; int tile_x = 0, tile_y = 0; char aux[24]; /* start blocks for left and right helplines */ int left_x = 3; int left_y = 0; int right_x = 0; int right_y = 0; /* draw contents? */ if ( bowl->draw_contents ) { bowl->draw_contents = 0; bowl_draw_contents( bowl ); } /* block&help */ if ( !bowl->hide_block ) { for ( j = 0; j < 4; j++ ) { for ( i = 0; i < 4; i++ ) { if ( block_masks[bowl->next_block_id].mask[0][i][j] ) { /* preview */ if ( config.preview && bowl->preview_center_sx != -1 ) { DEST( sdl.screen, bowl->preview_sx + tile_x, bowl->preview_sy + tile_y, bowl->block_size, bowl->block_size ); SOURCE( bowl->blocks, bowl->next_block_id * bowl->block_size, 0 ); blit_surf(); add_refresh_rect( bowl->preview_sx + tile_x, bowl->preview_sy + tile_y, bowl->block_size, bowl->block_size ); } } if ( block_masks[bowl->block.id].mask[bowl->block.rot_id][i][j] ) { /* help */ if ( config.help == 1 ) { DEST( sdl.screen, bowl->help_sx + tile_x, bowl->help_sy + tile_y, bowl->block_size, bowl->block_size ); SOURCE( bowl->blocks, 10 * bowl->block_size, 0 ); alpha_blit_surf( bowl->help_alpha ); add_refresh_rect( bowl->help_sx + tile_x, bowl->help_sy + tile_y, bowl->block_size, bowl->block_size ); } /* block */ DEST( sdl.screen, x, y, bowl->block_size, bowl->block_size ); SOURCE( bowl->blocks, bowl->block.id * bowl->block_size, 0 ); blit_surf(); add_refresh_rect( x, y, bowl->block_size, bowl->block_size ); /* update helpline coordinates */ if ( i <= left_x ) { left_x = i; left_y = j; } if ( i >= right_x ) { right_x = i; right_y = j; } } x += bowl->block_size; tile_x += bowl->block_size; } y += bowl->block_size; x = bowl->block.sx; tile_x = 0; tile_y += bowl->block_size; } if ( config.help == 2 ) { /* draw help lines */ int i, x, y, y1, y2; int red = SDL_MapRGB( sdl.screen->format, 255, 0, 0 ); /* left help line */ x = bowl->block.sx + left_x * bowl->block_size; y1 = bowl->block.sy + (left_y+1) * bowl->block_size; i = bowl->block.y + left_y; if ( i < 0 ) i = 0; while ( i < bowl->h && bowl->contents[bowl->block.x + left_x][i] == -1 ) i++; y2 = bowl->sy + i * bowl->block_size - 1; if ( y1 < bowl->sy ) y1 = bowl->sy; for ( y = y1; y <= y2; y++ ) set_pixel( sdl.screen, x, y, red ); add_refresh_rect( x, y1, 1, y2-y1+1 ); /* right help line */ x = bowl->block.sx + (right_x+1) * bowl->block_size - 1; y1 = bowl->block.sy + (right_y+1) * bowl->block_size; i = bowl->block.y + right_y; if ( i < 0 ) i = 0; while ( i < bowl->h && bowl->contents[bowl->block.x + right_x][i] == -1 ) i++; y2 = bowl->sy + i * bowl->block_size - 1; if ( y1 < bowl->sy ) y1 = bowl->sy; for ( y = y1; y <= y2; y++ ) set_pixel( sdl.screen, x, y, red ); add_refresh_rect( x, y1, 1, y2-y1+1 ); } } /* check if question mark must be displayed */ if ( bowl->preview_center_sx != -1 && !config.preview ) { DEST( sdl.screen, bowl->preview_center_sx - bowl->unknown_preview->w / 2, bowl->preview_center_sy - bowl->unknown_preview->h / 2,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -