static void add_archives(const char *path) { Array archives; int i; if ((archives = dir_scan(path, is_archive, NULL, NULL))) { array_sort(archives, cmp_dir_items); for (i = 0; i < array_len(archives); i++) fs_add_path(DIR_ITEM_GET(archives, i)->path); dir_free(archives); } }
int main(int argc, char *argv[]) { SDL_Joystick *joy = NULL; int t1, t0, uniform; if (!fs_init(argv[0])) { fprintf(stderr, "Failure to initialize virtual file system: %s\n", fs_error()); return 1; } lang_init("neverball"); parse_args(argc, argv); config_paths(data_path); make_dirs_and_migrate(); /* Initialize SDL system and subsystems */ if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) == -1) { fprintf(stderr, "%s\n", SDL_GetError()); return 1; } /* Intitialize the configuration */ config_init(); config_load(); /* Initialize the joystick. */ if (config_get_d(CONFIG_JOYSTICK) && SDL_NumJoysticks() > 0) { joy = SDL_JoystickOpen(config_get_d(CONFIG_JOYSTICK_DEVICE)); if (joy) SDL_JoystickEventState(SDL_ENABLE); } /* Initialize the audio. */ audio_init(); tilt_init(); /* Initialize the video. */ if (!video_init(TITLE, ICON)) return 1; init_state(&st_null); /* Initialise demo playback. */ if (demo_path && fs_add_path(dir_name(demo_path)) && progress_replay(base_name(demo_path, NULL))) { demo_play_goto(1); goto_state(&st_demo_play); } else goto_state(&st_title); /* Run the main game loop. */ uniform = config_get_d(CONFIG_UNIFORM); t0 = SDL_GetTicks(); while (loop()) { t1 = SDL_GetTicks(); if (uniform) { /* Step the game uniformly, as configured. */ int u; for (u = 0; u < abs(uniform); ++u) { st_timer(DT); t0 += (int) (DT * 1000); } } else { /* Step the game state at least up to the current time. */ while (t1 > t0) { st_timer(DT); t0 += (int) (DT * 1000); } } /* Render. */ st_paint(0.001f * t0); video_swap(); if (uniform < 0) shot(); if (config_get_d(CONFIG_NICE)) SDL_Delay(1); } /* Gracefully close the game */ if (joy) SDL_JoystickClose(joy); tilt_free(); SDL_Quit(); config_save(); return 0; }
int fs_add_path_with_archives(const char *path) { add_archives(path); return fs_add_path(path); }
int main(int argc, char *argv[]) { SDL_Joystick *joy = NULL; int t1, t0; if (!fs_init(argv[0])) { fprintf(stderr, "Failure to initialize virtual file system (%s)\n", fs_error()); return 1; } opt_parse(argc, argv); config_paths(opt_data); log_init("Neverball", "neverball.log"); make_dirs_and_migrate(); /* Initialize SDL. */ if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) == -1) { log_printf("Failure to initialize SDL (%s)\n", SDL_GetError()); return 1; } /* Intitialize configuration. */ config_init(); config_load(); /* Initialize localization. */ lang_init(); /* Initialize joystick. */ if (config_get_d(CONFIG_JOYSTICK) && SDL_NumJoysticks() > 0) { joy = SDL_JoystickOpen(config_get_d(CONFIG_JOYSTICK_DEVICE)); if (joy) SDL_JoystickEventState(SDL_ENABLE); } /* Initialize audio. */ audio_init(); tilt_init(); /* Initialize video. */ if (!video_init()) return 1; /* Material system. */ mtrl_init(); /* Screen states. */ init_state(&st_null); /* Initialize demo playback or load the level. */ if (opt_replay && fs_add_path(dir_name(opt_replay)) && progress_replay(base_name(opt_replay))) { demo_play_goto(1); goto_state(&st_demo_play); } else if (opt_level) { const char *path = fs_resolve(opt_level); int loaded = 0; if (path) { /* HACK: must be around for the duration of the game. */ static struct level level; if (level_load(path, &level)) { progress_init(MODE_STANDALONE); if (progress_play(&level)) { goto_state(&st_level); loaded = 1; } } } else log_printf("File %s is not in game path\n", opt_level); if (!loaded) goto_state(&st_title); } else goto_state(&st_title); /* Run the main game loop. */ t0 = SDL_GetTicks(); while (loop()) { if ((t1 = SDL_GetTicks()) > t0) { /* Step the game state. */ st_timer(0.001f * (t1 - t0)); t0 = t1; /* Render. */ hmd_step(); st_paint(0.001f * t0); video_swap(); if (config_get_d(CONFIG_NICE)) SDL_Delay(1); } } config_save(); mtrl_quit(); if (joy) SDL_JoystickClose(joy); tilt_free(); hmd_free(); SDL_Quit(); return 0; }