⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bowl.c

📁 LTris a tetris clone for Linux
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -