void outbreak(SDL_Surface * screen) { Outbreak outbreak; init_outbreak(&outbreak, screen); while (!outbreak.quit) { handle_input(&outbreak); update_gamestate(&outbreak); render(&outbreak); SDL_Delay(1); } cleanup_outbreak(&outbreak); }
int main(int argc, char **argv) { SDL_bool ok; char const *root = getenv(ROOTVAR); if (!root || !*root) { fprintf(stderr, "error: environment undefined\n"); fprintf(stderr, "set %s to the installation directory of Fridge Filler\n", ROOTVAR); return 1; } FILE *rp = 0; SDL_bool rp_play = SDL_FALSE; SDL_bool rp_save = SDL_FALSE; if (argc > 1) { if (streq(argv[1], "--save-replay") || streq(argv[1], "-s")) { char const *fname = "replay.txt"; if (argc == 3) { fname = argv[2]; } printf("saving replay to `%s'\n", fname); rp = fopen(fname, "w"); rp_save = SDL_TRUE; } if (streq(argv[1], "--replay") || streq(argv[1], "-r")) { char const *fname = "replay.txt"; if (argc == 3) { fname = argv[2]; } printf("loading replay `%s'\n", fname); rp = fopen(fname, "r"); rp_play = SDL_TRUE; } } session s; game_state gs; ok = init_game(&s, &gs, root); if (!ok) { return 1; } game_event ge; clear_event(&ge); unsigned ticks; unsigned old_ticks = SDL_GetTicks(); int have_ev; SDL_Event event; while (gs.run != MODE_EXIT) { if (!rp_play) { have_ev = SDL_PollEvent(&event); if (have_ev) { process_event(&event, &ge); } unsigned char const *keystate = SDL_GetKeyboardState(0); keystate_to_movement(keystate, &ge.player); } else { have_ev = SDL_PollEvent(&event); if (have_ev) { process_event(&event, &ge); if (ge.exit) { break; } clear_event(&ge); } } ticks = SDL_GetTicks(); if (ticks - old_ticks >= TICK) { if (rp_save) { print_event(rp, &ge); } else if (rp_play) { read_event(rp, &ge); } update_gamestate(&s, &gs, &ge); clear_event(&ge); /* printf("%d\n", ticks - old_ticks); */ old_ticks = ticks; } render(&s, &gs); SDL_Delay(TICK / 4); } int i; for (i = 0; i < NGROUPS; i++) { free(gs.entities[i].e); } destroy_level(&s.level); SDL_DestroyTexture(s.level.background); if (gs.debug.font) { TTF_CloseFont(gs.debug.font); }; if (rp) { fclose(rp); } free(s.msg.msgs); SDL_DestroyRenderer(s.r); SDL_DestroyWindow(s.w); SDL_Quit(); return 0; }