/* create a one level game context for testing a level */ int client_game_init_testing( Level *level ) { local_game = game_create( GT_LOCAL, config.diff, 100 ); game_set_current( local_game ); game_set_convex_paddle( config.convex ); game_set_ball_auto_return( !config.return_on_click ); game_set_ball_random_angle( config.random_angle ); game_set_ball_accelerated_speed( config.maxballspeed_float ); local_game->localServerGame = 1; game = game_create( GT_LOCAL, config.diff, 100 ); game_set_current( game ); players_clear(); player_add( config.player_names[0], game->diff->lives, level ); cur_player = players_get_first(); bkgnd_ids[0] = 0; init_level( cur_player, PADDLE_BOTTOM ); client_state = CS_NONE; set_state( CS_PLAY ); return 1; }
int client_game_init_network( char *opponent_name, int diff ) { /* create an empty one level levelset. the server will send * the data into the level everytime we play. */ game_set = levelset_create_empty( 1, "empty", "empty" ); /* create client game context */ game = game_create( GT_NETWORK, diff, 100 ); game_set_current( game ); game_round = 0; /* will be increased by init_next_round() */ game_over = 0; /* a network game communicates every 25 ms by default */ client_comm_delay = 25; no_comm_since = 0; /* initiate players */ players_clear(); player_add( client_name, game->diff->lives, levelset_get_first( game_set ) ); player_add( opponent_name, game->diff->lives, levelset_get_first( game_set ) ); cur_player = players_get_first(); display_text( font, "Receiving level data..." ); set_state( CS_RECV_LEVEL ); return 1; }
void level_unload(void) /* Unloads current level, if there is one */ { if (current_level) { /* Kill all sprites */ objlist_killall(mech_group); objlist_killall(bullet_group); objlist_killall(effects_group); objlist_killall(foreground_group); objlist_killall(ui_group); /* Kill all triggers/generators */ objlist_killall(generator_group); objlist_killall(trigger_group); if (current_level->reason) free(current_level->reason); image_free(current_level->bg_image); if (current_level->free) current_level->free(current_level); else free(current_level); current_level = NULL; /* clear other level specific options */ bonuses_clear(); players_clear(); objdict_clear(sprite_tags); objdict_clear(trigger_tags); } }
/* finalize a game and free anything allocated by init process */ void client_game_finalize() { players_clear(); if ( game && game->game_type == GT_LOCAL ) { game_delete( &local_game ); levelset_delete( &game_set ); } game_delete( &game ); }
/* create local game context and initiate game state * as given from slot 'slot_id'. */ int client_game_resume_local( int slot_id ) { int i; GameSlot gs; /* load saved game */ if ( !slot_load( slot_id, &gs ) ) return 0; /* FIXME: config settings are overwritten for this */ config.diff = gs.diff; config.player_count = gs.player_count; for ( i = 0; i < config.player_count; i++ ) strcpy( config.player_names[i], gs.player_names[i] ); gameSeed = gs.gameSeed; /* create local game where all players have full lives */ if ( !client_game_init_local( gs.setname ) ) return 0; /* re-initiate players */ players_clear(); for ( i = 0; i < config.player_count; i++ ) { /* name + lives */ player_add( config.player_names[i], gs.player_lives[i], levelset_get_first( game_set ) ); /* level */ player_init_level( &players[i], game_set->levels[gs.player_cur_level_id[i]], gs.player_cur_level_id[i] ); /* score */ players[i].stats.total_score = gs.player_scores[i]; } cur_player = players_set_current( gs.cur_player ); /* init first level */ init_level( cur_player, PADDLE_BOTTOM ); return 1; }
/* create network/local game context and initiate game state: * network needs to receive the level data and a local game * has to load the next level */ int client_game_init_local( char *setname ) { Set_Chart *chart; int i, warp_limit; warp_limit = config.rel_warp_limit; allow_disintegrate = 1; /* the original levelsets do not need these workarounds */ if ( STRCMP( setname, "LBreakout2" ) || STRCMP( setname, "LBreakout1" ) ) { warp_limit = 100; allow_disintegrate = 0; } /* the approach for a local game is to use the same * settings as a network game. the receiving of packets * is simply faked by a local_game context that * runs the game locally. but to use only one game loop * we do not use it directly but apply its modificiations * to game which is visualized */ local_game = game_create( GT_LOCAL, config.diff, warp_limit ); game_set_current( local_game ); game_set_convex_paddle( config.convex ); game_set_ball_auto_return( !config.return_on_click ); game_set_ball_random_angle( config.random_angle ); game_set_ball_accelerated_speed( config.maxballspeed_float ); local_game->localServerGame = 1; /* load levels: * only required for local games. in network both players * just require a single level that can store the incoming * data that is send by the server via the net. */ if ( !strcmp( setname, TOURNAMENT ) ) game_set = levelset_load_all( levelset_names, gameSeed, config.addBonusLevels ); else game_set = levelset_load( setname, ((config.addBonusLevels)?gameSeed:0) ); if ( game_set == 0 ) return 0; /* load highest score so far if any */ chart = chart_set_query(setname); strcpy(best_name,"nobody"); best_score = 0; if (chart) { strcpy(best_name,chart->entries[0].name); best_score = chart->entries[0].score; } /* create client game context */ game = game_create( GT_LOCAL, config.diff, warp_limit ); game_set_current( game ); /* a local game is not limited in its communication */ client_comm_delay = 0; no_comm_since = 0; /* prepare warp icon at frame */ warp_blinks = 4; warp_blink = 1; /* set list of level background ids */ for ( i = 0; i < MAX_LEVELS; i++ ) bkgnd_ids[i] = rand() % bkgnd_count; /* initiate players */ players_clear(); for ( i = 0; i < config.player_count; i++ ) player_add( config.player_names[i], game->diff->lives, levelset_get_first( game_set ) ); cur_player = players_get_first(); /* init first level */ init_level( cur_player, PADDLE_BOTTOM ); /* if only one player don't show score table */ client_state = CS_NONE; if ( player_count > 1 ) set_state( CS_SCORE_TABLE ); else set_state( CS_PLAY ); /* one player starts immediately */ return 1; }