void scene_tick(scene *scene) { // Remove finished players scene_clean_ani_players(scene); // Tick all players iterator it; animationplayer *tmp = 0; list_iter_begin(&scene->child_players, &it); while((tmp = iter_next(&it)) != NULL) { animationplayer_run(tmp); } list_iter_begin(&scene->root_players, &it); while((tmp = iter_next(&it)) != NULL) { animationplayer_run(tmp); } // Run custom tick function, if defined if(scene->tick != NULL) { scene->tick(scene); } // If no animations to play, jump to next scene (if any) // TODO: Hackish, make this nicer. if(list_size(&scene->root_players) <= 0 && scene->this_id != SCENE_MELEE && scene->this_id != SCENE_VS && scene->this_id != SCENE_MECHLAB) { if (scene->this_id == SCENE_CREDITS) { scene->next_id = SCENE_NONE; } else { scene->next_id = SCENE_MENU; } DEBUG("NEXT ID!"); } }
void scene_clean_ani_players(void *userdata) { scene *sc = (scene*)userdata; iterator it; animationplayer *tmp = 0; list_iter_begin(&sc->child_players, &it); while((tmp = iter_next(&it)) != NULL) { if(tmp->finished) { animationplayer_free(tmp); list_delete(&sc->child_players, &it); } } list_iter_begin(&sc->root_players, &it); while((tmp = iter_next(&it)) != NULL) { if(tmp->finished) { // if their probability is 1, go around again if (sc->loop && sc->bk->anims[tmp->id]->probability == 1) { animationplayer_reset(tmp); } else { animationplayer_free(tmp); list_delete(&sc->root_players, &it); } } } }
void scene_render(scene *scene) { // Render background video_render_background(&scene->background); // Render objects iterator it; animationplayer *tmp = 0; list_iter_begin(&scene->child_players, &it); while((tmp = iter_next(&it)) != NULL) { animationplayer_render(tmp); } list_iter_begin(&scene->root_players, &it); while((tmp = iter_next(&it)) != NULL) { animationplayer_render(tmp); } // Run custom render function, if defined if(scene->render != NULL) { scene->render(scene); } }
void scene_set_ani_finished(void *userdata, int id) { scene *sc = userdata; iterator it; animationplayer *tmp = 0; list_iter_begin(&sc->child_players, &it); while((tmp = iter_next(&it)) != NULL) { if(tmp->id == id) { tmp->finished = 1; return; } } list_iter_begin(&sc->root_players, &it); while((tmp = iter_next(&it)) != NULL) { if(tmp->id == id) { tmp->finished = 1; return; } } }
void scene_free(scene *scene) { if(!scene) return; // Deinit scene if(scene->deinit != NULL) { scene->deinit(scene); } // Release background texture_free(&scene->background); // Free players iterator it; animationplayer *tmp = 0; list_iter_begin(&scene->child_players, &it); while((tmp = iter_next(&it)) != NULL) { animationplayer_free(tmp); } list_iter_begin(&scene->root_players, &it); while((tmp = iter_next(&it)) != NULL) { animationplayer_free(tmp); } list_free(&scene->child_players); list_free(&scene->root_players); // Free animations animation *ani = 0; array_iter_begin(&scene->animations, &it); while((ani = iter_next(&it)) != 0) { animation_free(ani); free(ani); } array_free(&scene->animations); // XXX do NOT free hars/controllers here! // Free BK sd_bk_delete(scene->bk); }
int console_cmd_history(game_state *gs, int argc, char **argv) { iterator it; char *input; char buf[sizeof(con->input)]; int i = 1; list_iter_begin(&con->history, &it); while((input = iter_next(&it)) != NULL) { sprintf(buf, "%d. %s", i, input); console_output_addline(buf); i++; } return 0; }
int db_scan(struct state *s) { struct scan_state ss; /* init scan_state */ ss.state = s; ss.year = s->rc.data_begin.year; ss.begin_week = WEEK_ID_BEGIN; ss.end_week = WEEK_ID_END; ss.last_week = INT_MIN; memset(ss.filenames, 0, DB_MAX_WEEKS_PER_YEAR); /* build path to sport in database file layout */ snprintf(ss.pathbuf, DB_MAX_PATH, "%s/%s", s->rc.data_dir, s->rc.sport); ss.pathbuf[DB_MAX_PATH-1] = '\0'; /* make sure the expected dir exists */ if (access(ss.pathbuf, R_OK)) { fprintf(stderr, "%s: error reading dir '%s': %s\n", progname, ss.pathbuf, strerror(errno)); return -1; } /* if begin year is unset, find the earliest */ if (s->rc.data_begin.year == WEEK_ID_BEGIN) { ss.year = find_earliest_year(ss.pathbuf); if (ss.year == INT_MAX) return -2; } /* for each year given in the rc, * build scan_state and call scan_year() */ for (; ss.year <= s->rc.data_end.year; ss.year++) { /* set begin week */ if (ss.year == s->rc.data_begin.year) ss.begin_week = s->rc.data_begin.week; else ss.begin_week = 1; /* set end week */ if (ss.year == s->rc.data_end.year) ss.end_week = s->rc.data_end.week; else ss.end_week = WEEK_ID_END; ss.last_week = INT_MIN; /* scan files for year */ if (scan_year(&ss) < 0) return -3; } /* print scanned files */ if (verbose) { struct list_iter iter; list_iter_begin(&s->db->game_files, &iter); while (!list_iter_end(&iter)) { fprintf(stderr, "db: %s\n", (char *)list_iter_data(&iter)); list_iter_next(&iter); } fprintf(stderr, "db: %d game files\n", s->db->game_files.length); } return 0; }
static void print_rc(const struct rc *rc) { const char *action = "unknown"; /* * map action to string * if not analyze, predict, or rank, then exit */ switch (rc->action) { case ACTION_ANALYZE: action = "analyze"; break; case ACTION_PREDICT: action = "predict"; break; case ACTION_RANK: action = "rank"; break; default: return; } /* heading */ fputs("***** run control *****\n", stderr); /* print action */ fprintf(stderr, "action: %s\n", action); /* print sport */ fprintf(stderr, "sport: %s\n", rc->sport); /* print data-begin week */ fputs("data-begin: ", stderr); print_week(stderr, &rc->data_begin); fputc('\n', stderr); /* print end week */ fputs("data-end: ", stderr); print_week(stderr, &rc->data_end); fputc('\n', stderr); /* print target week/range */ fputs("target-begin: ", stderr); print_week(stderr, &rc->target_begin); fputc('\n', stderr); fputs("target-end: ", stderr); print_week(stderr, &rc->target_end); fputc('\n', stderr); /* print algos */ fputs("algos: [ ", stderr); struct list_iter iter; char *algo; list_iter_begin(&rc->user_algorithms, &iter); while (!list_iter_end(&iter)) { algo = list_iter_data(&iter); fprintf(stderr, "%s ", algo); list_iter_next(&iter); } fputs("]\n", stderr); /* footer */ fputs("***********************\n", stderr); }