void replay_stage_sync_player_state(ReplayStage *stg, Player *plr) { plr->points = stg->plr_points; plr->continues_used = stg->plr_continues_used; plr->mode = plrmode_find(stg->plr_char, stg->plr_shot); plr->pos = stg->plr_pos_x + I * stg->plr_pos_y; plr->focus = stg->plr_focus; plr->lives = stg->plr_lives; plr->life_fragments = stg->plr_life_fragments; plr->bombs = stg->plr_bombs; plr->bomb_fragments = stg->plr_bomb_fragments; plr->power = stg->plr_power; plr->inputflags = stg->plr_inputflags; }
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); }
PlayerMode* plrmode_parse(const char *name) { CharacterID char_id = (CharacterID)-1; ShotModeID shot_id = (ShotModeID)-1; char buf[strlen(name) + 1]; strcpy(buf, name); for(int i = 0; i < sizeof(buf); ++i) { buf[i] = tolower(buf[i]); } if(!*buf) { log_debug("Got an empty string"); return NULL; } char shot = buf[sizeof(buf) - 2]; if(shot < 'a' || shot >= 'a' + NUM_SHOT_MODES_PER_CHARACTER) { log_debug("Got invalid shotmode: %c", shot); return NULL; } shot_id = shot - 'a'; buf[sizeof(buf) - 2] = 0; for(int i = 0; i < NUM_CHARACTERS; ++i) { PlayerCharacter *chr = player_characters[i]; if(!strcmp(buf, chr->lower_name)) { char_id = chr->id; } } if(char_id == (CharacterID)-1) { log_debug("Got invalid character: %s", buf); return NULL; } return plrmode_find(char_id, shot_id); }