void config_load( ) { char file_name[512]; PData *pd, *sub; /* set to defaults */ config_check_dir(); config_reset(); /* load config */ sprintf( file_name, "%s/%s", config.dir_name, CONFIG_FILE_NAME ); if ( ( pd = parser_read_file( "config", file_name ) ) == 0 ) { fprintf( stderr, "%s\n", parser_get_error() ); return; } /* parse config */ parser_get_int( pd, "gametype", &config.gametype ); parser_get_int( pd, "starting_level", &config.starting_level ); if (config.starting_level > 9 || config.starting_level < 0) { config.starting_level = 0; } parser_get_int( pd, "preview", &config.preview ); parser_get_int( pd, "help", &config.help ); parser_get_int( pd, "expert", &config.expert ); parser_get_int( pd, "center_preview", &config.center_preview ); parser_get_int( pd, "holes", &config.holes ); parser_get_int( pd, "rand_holes", &config.rand_holes ); parser_get_int( pd, "send_all", &config.send_all ); parser_get_int( pd, "send_tetris", &config.send_tetris ); if ( parser_get_pdata( pd, "player1", &sub ) ) parse_player( sub, &config.player1 ); if ( parser_get_pdata( pd, "player2", &sub ) ) parse_player( sub, &config.player2 ); if ( parser_get_pdata( pd, "player3", &sub ) ) parse_player( sub, &config.player3 ); parser_get_int( pd, "clear_keystate", &config.clear_keystate ); parser_get_int( pd, "cpu_aggr", &config.cpu_aggr ); parser_get_int( pd, "cpu_delay", &config.cpu_delay ); parser_get_int( pd, "cpu_rot_delay", &config.cpu_rot_delay ); parser_get_int( pd, "sound", &config.sound ); parser_get_int( pd, "volume", &config.volume ); parser_get_int( pd, "transparency", &config.trp ); parser_get_int( pd, "animations", &config.anim ); parser_get_int( pd, "fullscreen", &config.fullscreen ); parser_get_int( pd, "fading", &config.fade ); parser_get_int( pd, "fps", &config.fps ); parser_get_int( pd, "background", &config.bkgnd ); parser_get_int( pd, "static_background", &config.keep_bkgnd ); parser_get_int( pd, "smooth_hori", &config.smooth_hori ); parser_get_int( pd, "hori_delay", &config.hori_delay ); parser_get_int( pd, "vert_delay", &config.vert_delay ); parser_get_int( pd, "pause_key", &config.pause_key ); parser_get_int( pd, "block_by_block", &config.block_by_block ); parser_get_int( pd, "motion_mod", &config.motion_mod ); parser_get_int( pd, "relative_motion", &config.rel_motion ); parser_get_int( pd, "grap_input", &config.grab ); parser_get_int( pd, "invert_mouse", &config.invert ); parser_get_int( pd, "quick_help", &config.quick_help ); parser_get_int( pd, "async_collision_check", &config.async_col_check ); parser_free( &pd ); }
/* load config */ static void parse_player( PData *pd, Player *player ) { char *str; PData *sub; if ( parser_get_value( pd, "name", &str, 0 ) ) strcpy( player->name, str ); if ( parser_get_pdata( pd, "controls", &sub ) ) { parser_get_int( sub, "left", &player->controls.left ); parser_get_int( sub, "right", &player->controls.right ); parser_get_int( sub, "rot_left", &player->controls.rot_left ); parser_get_int( sub, "rot_right", &player->controls.rot_right ); parser_get_int( sub, "down", &player->controls.down ); parser_get_int( sub, "drop", &player->controls.drop ); } }
int parser_get_values ( PData *pd, const char *name, List **result ) { PData *entry; *result = 0; if ( !parser_get_pdata( pd, name, &entry ) ) { sprintf( parser_sub_error, "parser_get_values:\n %s", parser_error ); strcpy( parser_error, parser_sub_error ); return 0; } if ( !entry->values || entry->values->count == 0 ) { sprintf( parser_error, tr("parser_get_values: %s/%s: no values"), pd->name, name ); return 0; } *result = entry->values; return 1; }
/* ==================================================================== Load terrain types, weather information and hex tile icons. ==================================================================== */ int terrain_load( char *fname ) { int i, j, k; PData *pd, *sub, *subsub, *subsubsub; List *entries, *flags; char path[512], transitionPath[512]; char *flag, *str; char *domain = 0; int count; /* log info */ int log_dot_limit = 40; /* maximum of dots */ char log_str[128]; sprintf( transitionPath, "Scenario/%s", fname ); search_file_name_exact( path, transitionPath, config.mod_name ); if ( ( pd = parser_read_file( fname, path ) ) == 0 ) goto parser_failure; // domain = determine_domain(pd, fname); // locale_load_domain(domain, 0/*FIXME*/); /* get weather */ if ( !parser_get_entries( pd, "weather", &entries ) ) goto parser_failure; weather_type_count = entries->count; weather_types = calloc( weather_type_count, sizeof( Weather_Type ) ); list_reset( entries ); i = 0; while ( ( sub = list_next( entries ) ) ) { weather_types[i].id = strdup( sub->name ); // if ( !parser_get_localized_string( sub, "name", domain, &weather_types[i].name ) ) goto parser_failure; if ( !parser_get_value( sub, "name", &str, 0 ) ) goto parser_failure; weather_types[i].name = strdup( str ); if ( !parser_get_value( sub, "ground_cond", &str, 0 ) ) goto parser_failure; weather_types[i].ground_conditions = strdup( str ); if ( !parser_get_values( sub, "flags", &flags ) ) goto parser_failure; list_reset( flags ); while ( ( flag = list_next( flags ) ) ) weather_types[i].flags |= check_flag( flag, fct_terrain ); i++; } /* hex tile geometry */ if ( !parser_get_int( pd, "hex_width", &hex_w ) ) goto parser_failure; if ( !parser_get_int( pd, "hex_height", &hex_h ) ) goto parser_failure; if ( !parser_get_int( pd, "hex_x_offset", &hex_x_offset ) ) goto parser_failure; if ( !parser_get_int( pd, "hex_y_offset", &hex_y_offset ) ) goto parser_failure; /* terrain icons */ terrain_icons = calloc( 1, sizeof( Terrain_Icons ) ); if ( !parser_get_value( pd, "fog", &str, 0 ) ) goto parser_failure; sprintf( transitionPath, "Graphics/%s", str ); search_file_name_exact( path, transitionPath, config.mod_name ); if ( ( terrain_icons->fog = load_surf( path, SDL_SWSURFACE, 0, 0, 0, 0 ) ) == 0 ) goto failure; if ( !parser_get_value( pd, "danger", &str, 0 ) ) goto parser_failure; sprintf( transitionPath, "Graphics/%s", str ); search_file_name_exact( path, transitionPath, config.mod_name ); if ( ( terrain_icons->danger = load_surf( path, SDL_SWSURFACE, 0, 0, 0, 0 ) ) == 0 ) goto failure; if ( !parser_get_value( pd, "grid", &str, 0 ) ) goto parser_failure; sprintf( transitionPath, "Graphics/%s", str ); search_file_name_exact( path, transitionPath, config.mod_name ); if ( ( terrain_icons->grid = load_surf( path, SDL_SWSURFACE, 0, 0, 0, 0 ) ) == 0 ) goto failure; if ( !parser_get_value( pd, "frame", &str, 0 ) ) goto parser_failure; sprintf( transitionPath, "Graphics/%s", str ); search_file_name_exact( path, transitionPath, config.mod_name ); if ( ( terrain_icons->select = load_surf( path, SDL_SWSURFACE, 0, 0, 0, 0 ) ) == 0 ) goto failure; if ( !parser_get_value( pd, "crosshair", &str, 0 ) ) goto parser_failure; sprintf( transitionPath, "Graphics/%s", str ); search_file_name_exact( path, transitionPath, config.mod_name ); if ( ( terrain_icons->cross = anim_create( load_surf( path, SDL_SWSURFACE, 0, 0, 0, 0 ), 1000/config.anim_speed, hex_w, hex_h, sdl.screen, 0, 0 ) ) == 0 ) goto failure; anim_hide( terrain_icons->cross, 1 ); if ( !parser_get_value( pd, "explosion", &str, 0 ) ) goto parser_failure; sprintf( transitionPath, "Graphics/%s", str ); search_file_name_exact( path, transitionPath, config.mod_name ); if ( ( terrain_icons->expl1 = anim_create( load_surf( path, SDL_SWSURFACE, 0, 0, 0, 0 ), 50/config.anim_speed, hex_w, hex_h, sdl.screen, 0, 0 ) ) == 0 ) goto failure; anim_hide( terrain_icons->expl1, 1 ); if ( ( terrain_icons->expl2 = anim_create( load_surf( path, SDL_SWSURFACE, 0, 0, 0, 0 ), 50/config.anim_speed, hex_w, hex_h, sdl.screen, 0, 0 ) ) == 0 ) goto failure; anim_hide( terrain_icons->expl2, 1 ); /* terrain sounds */ #ifdef WITH_SOUND if ( parser_get_value( pd, "explosion_sound", &str, 0 ) ) { snprintf( transitionPath, 512, "Sound/%s", str ); search_file_name_exact( path, transitionPath, config.mod_name ); terrain_icons->wav_expl = wav_load( path, 2 ); } if ( parser_get_value( pd, "select_sound", &str, 0 ) ) { snprintf( transitionPath, 512, "Sound/%s", str ); search_file_name_exact( path, transitionPath, config.mod_name ); terrain_icons->wav_select = wav_load( path, 1 ); } #endif /* terrain data image columns */ if ( !parser_get_int( pd, "terrain_columns", &terrain_columns ) ) goto parser_failure; /* terrain data image rows */ if ( !parser_get_int( pd, "terrain_rows", &terrain_rows ) ) goto parser_failure; /* each ground condition type got its own image -- if it's named 'default' we point towards the image of weather_type 0 */ terrain_images = calloc( 1, sizeof( Terrain_Images ) ); terrain_images->images = calloc( weather_type_count / 4, sizeof( SDL_Surface* ) ); for ( j = 0; j < weather_type_count / 4; j++ ) { terrain_images->ground_conditions = strdup( weather_types[4*j].ground_conditions ); sprintf( path, "image/%s", weather_types[4*j].ground_conditions ); if ( !parser_get_value( pd, path, &str, 0 ) ) goto parser_failure; if ( STRCMP( "default", str ) && j > 0 ) { /* just a pointer */ terrain_images->images[j] = terrain_images->images[0]; } else { sprintf( transitionPath, "Graphics/%s", str ); search_file_name_exact( path, transitionPath, config.mod_name ); if ( ( terrain_images->images[j] = load_surf( path, SDL_SWSURFACE, 0, 0, 0, 0 ) ) == 0 ) goto parser_failure; SDL_SetColorKey( terrain_images->images[j], SDL_SRCCOLORKEY, get_pixel( terrain_images->images[j], 0, 0 ) ); } } /* fog image */ terrain_images->images_fogged = calloc( weather_type_count / 4, sizeof( SDL_Surface* ) ); for ( j = 0; j < weather_type_count / 4; j++ ) { if ( terrain_images->images[j] == terrain_images->images[0] && j > 0 ) { /* just a pointer */ terrain_images->images_fogged[j] = terrain_images->images_fogged[0]; } else { terrain_images->images_fogged[j] = create_surf( terrain_images->images[j]->w, terrain_images->images[j]->h, SDL_SWSURFACE ); FULL_DEST( terrain_images->images_fogged[j] ); FULL_SOURCE( terrain_images->images[j] ); blit_surf(); count = terrain_images->images[j]->w / hex_w; for ( i = 0; i < terrain_rows; i++ ) for ( k = 0; k < terrain_columns; k++ ) { DEST( terrain_images->images_fogged[j], k * hex_w, i * hex_h, hex_w, hex_h ); SOURCE( terrain_icons->fog, 0, 0 ); alpha_blit_surf( FOG_ALPHA ); } SDL_SetColorKey( terrain_images->images_fogged[j], SDL_SRCCOLORKEY, get_pixel( terrain_images->images_fogged[j], 0, 0 ) ); } } /* terrain types */ if ( !parser_get_entries( pd, "terrain", &entries ) ) goto parser_failure; terrain_type_count = entries->count; terrain_types = calloc( terrain_type_count, sizeof( Terrain_Type ) ); list_reset( entries ); i = 0; while ( ( sub = list_next( entries ) ) ) { /* id */ terrain_types[i].id = sub->name[0]; /* name */ if ( !parser_get_localized_string( sub, "name", domain, &terrain_types[i].name ) ) goto parser_failure; /* spot cost */ terrain_types[i].spt = calloc( weather_type_count, sizeof( int ) ); if ( !parser_get_pdata( sub, "spot_cost", &subsub ) ) goto parser_failure; for ( j = 0; j < weather_type_count; j++ ) if ( !parser_get_int( subsub, weather_types[j].id, &terrain_types[i].spt[j] ) ) goto parser_failure; /* image */ terrain_types[i].images = terrain_images->images; /* fog image */ terrain_types[i].images_fogged = terrain_images->images_fogged; /* mov cost */ terrain_types[i].mov = calloc( mov_type_count * weather_type_count, sizeof( int ) ); if ( !parser_get_pdata( sub, "move_cost", &subsub ) ) goto parser_failure; for ( k = 0; k < mov_type_count; k++ ) { if ( !parser_get_pdata( subsub, mov_types[k].id, &subsubsub ) ) goto parser_failure; for ( j = 0; j < weather_type_count; j++ ) { if ( !parser_get_value( subsubsub, weather_types[j].id, &str, 0 ) ) goto parser_failure; if ( str[0] == 'X' ) terrain_types[i].mov[j + k * weather_type_count] = 0; /* impassable */ else if ( str[0] == 'A' ) terrain_types[i].mov[j + k * weather_type_count] = -1; /* costs all */ else terrain_types[i].mov[j + k * weather_type_count] = atoi( str ); /* normal cost */ } } /* entrenchment */ if ( !parser_get_int( sub, "min_entr", &terrain_types[i].min_entr ) ) goto parser_failure; if ( !parser_get_int( sub, "max_entr", &terrain_types[i].max_entr ) ) goto parser_failure; /* initiative modification */ if ( !parser_get_int( sub, "max_init", &terrain_types[i].max_ini ) ) goto parser_failure; /* flags */ terrain_types[i].flags = calloc( weather_type_count, sizeof( int ) ); if ( !parser_get_pdata( sub, "flags", &subsub ) ) goto parser_failure; for ( j = 0; j < weather_type_count; j++ ) { if ( !parser_get_values( subsub, weather_types[j].id, &flags ) ) goto parser_failure; list_reset( flags ); while ( ( flag = list_next( flags ) ) ) terrain_types[i].flags[j] |= check_flag( flag, fct_terrain ); } /* next terrain */ i++; /* LOG */ strcpy( log_str, " [ ]" ); for ( k = 0; k < i * log_dot_limit / entries->count; k++ ) log_str[3 + k] = '*'; write_text( log_font, sdl.screen, log_x, log_y, log_str, 255 ); SDL_UpdateRect( sdl.screen, log_font->last_x, log_font->last_y, log_font->last_width, log_font->last_height ); } parser_free( &pd ); /* LOG */ write_line( sdl.screen, log_font, log_str, log_x, &log_y ); refresh_screen( 0, 0, 0, 0 ); free(domain); return 1; parser_failure: fprintf( stderr, "%s\n", parser_get_error() ); failure: terrain_delete(); if ( pd ) parser_free( &pd ); free(domain); printf(tr("If data seems to be missing, please re-run the converter lgc-pg.\n")); return 0; }
int scen_extract( struct PData *pd, struct Translateables *xl ) { PData *sub, *subsub; PData *pd_vcond; List *entries; /* get scenario info */ if ( !parser_get_pdata( pd, "name", &sub ) ) goto parser_failure; translateables_add_pdata(xl, sub); if ( !parser_get_pdata( pd, "desc", &sub ) ) goto parser_failure; translateables_add_pdata(xl, sub); if ( !parser_get_pdata( pd, "authors", &sub ) ) goto parser_failure; translateables_add_pdata(xl, sub); /* nations */ /* unit libs */ if ( !parser_get_pdata( pd, "unit_db", &sub ) ) { unit_lib_extract(pd, xl); } /* map and weather */ if ( !parser_get_pdata( pd, "map", &sub ) ) { map_extract(pd, xl); } /* players */ if ( !parser_get_entries( pd, "players", &entries ) ) goto parser_failure; list_reset( entries ); while ( ( sub = list_next( entries ) ) ) { /* create player */ if ( !parser_get_pdata( sub, "name", &subsub ) ) goto parser_failure; translateables_add_pdata(xl, subsub); } /* set alliances */ /* flags */ /* victory conditions */ /* check type */ if ( !parser_get_entries( pd, "result", &entries ) ) goto parser_failure; /* reset vic conds may not be done in scen_delete() as this is called before the check */ /* count conditions */ /* create conditions */ list_reset( entries ); while ( ( pd_vcond = list_next( entries ) ) ) { if ( strcmp( pd_vcond->name, "cond" ) == 0 ) { if ( parser_get_pdata( pd_vcond, "message", &subsub ) ) translateables_add_pdata(xl, subsub); /* and linkage */ /* or linkage */ /* no sub conditions at all? */ /* next condition */ } } /* else condition (used if no other condition is fullfilled and scenario ends) */ translateables_add(xl, "Defeat", ""); if ( parser_get_pdata( pd, "result/else", &pd_vcond ) ) { if ( parser_get_pdata( pd_vcond, "message", &subsub ) ) translateables_add_pdata(xl, subsub); } /* units */ /* load deployment hexes */ return 1; parser_failure: fprintf( stderr, "%s\n", parser_get_error() ); return 0; }