void start_replay(void *arg) { ReplayStage *rstg; StageInfo *gstg; int i; replay_copy(&global.replay, (Replay*)arg); global.replaymode = REPLAY_PLAY; if(global.replay.stgcount == 1) pickedstage = 0; init_player(&global.plr); for(i = pickedstage; i < global.replay.stgcount; ++i) { replay_select(&global.replay, i); rstg = global.replay.current; gstg = stage_get(rstg->stage); if(!gstg) { printf("start_replay(): Invalid stage %d in replay at %i skipped.\n", rstg->stage, i); continue; } gstg->loop(); if(global.game_over == GAMEOVER_ABORT) break; global.game_over = 0; } global.game_over = 0; global.replaymode = REPLAY_RECORD; replay_destroy(&global.replay); replayview->instantselect = False; }
MenuData* replayview_stageselect(Replay *rpy) { MenuData *m = malloc(sizeof(MenuData)); int i; create_menu(m); m->context = rpy; for(i = 0; i < rpy->stgcount; ++i) { add_menu_entry(m, stage_get(rpy->stages[i].stage)->title, start_replay, rpy); } return m; }
void replay_play(Replay *rpy, int firstidx) { if(rpy != &global.replay) { replay_copy(&global.replay, rpy, true); } if(firstidx >= global.replay.numstages || firstidx < 0) { log_warn("No stage #%i in the replay", firstidx); return; } global.replaymode = REPLAY_PLAY; for(int i = firstidx; i < global.replay.numstages; ++i) { ReplayStage *rstg = global.replay_stage = global.replay.stages+i; StageInfo *gstg = stage_get(rstg->stage); if(!gstg) { log_warn("Invalid stage %x in replay at %i skipped.", rstg->stage, i); continue; } global.plr.mode = plrmode_find(rstg->plr_char, rstg->plr_shot); stage_loop(gstg); if(global.game_over == GAMEOVER_ABORT) { break; } if(global.game_over == GAMEOVER_RESTART) { --i; } global.game_over = 0; } global.game_over = 0; global.replaymode = REPLAY_RECORD; replay_destroy(&global.replay); global.replay_stage = NULL; free_resources(false); }
void stage4_loop() { ShaderRule shaderrules[] = { stage4_fog, NULL }; stage_loop(stage_get(4), stage4_start, stage4_end, stage4_draw, stage4_events, shaderrules, 5550); }