diff --git a/strafe-client/src/session.rs b/strafe-client/src/session.rs index 721402c..2edccfd 100644 --- a/strafe-client/src/session.rs +++ b/strafe-client/src/session.rs @@ -276,9 +276,60 @@ impl InstructionConsumer> for Session{ } _=self.simulation.timer.set_paused(ins.time,false); }, - Instruction::Playback(_)=>{ - println!("[session] todo: Playback instructions"); + Instruction::Playback(SessionPlaybackInstruction::IncreaseTimescale)=>{ + match &self.view_state{ + ViewState::Play=>{ + // allow simulation timescale for fun + let scale=self.simulation.timer.get_scale(); + self.simulation.timer.set_scale(ins.time,scale*5/4); + }, + ViewState::Replay(bot_id)=>if let Some(replay)=self.replays.get_mut(bot_id){ + let scale=replay.simulation.timer.get_scale(); + replay.simulation.timer.set_scale(ins.time,scale*5/4); + }, + } }, + Instruction::Playback(SessionPlaybackInstruction::DecreaseTimescale)=>{ + match &self.view_state{ + ViewState::Play=>{ + // allow simulation timescale for fun + let scale=self.simulation.timer.get_scale(); + self.simulation.timer.set_scale(ins.time,scale*4/5); + }, + ViewState::Replay(bot_id)=>if let Some(replay)=self.replays.get_mut(bot_id){ + let scale=replay.simulation.timer.get_scale(); + replay.simulation.timer.set_scale(ins.time,scale*4/5); + }, + } + }, + Instruction::Playback(SessionPlaybackInstruction::SkipForward)=>{ + match &self.view_state{ + ViewState::Play=>(), + ViewState::Replay(bot_id)=>if let Some(replay)=self.replays.get_mut(bot_id){ + let time=replay.simulation.timer.time(ins.time+SessionTime::from_secs(5)); + replay.simulation.timer.set_time(ins.time,time); + }, + } + }, + Instruction::Playback(SessionPlaybackInstruction::SkipBack)=>{ + match &self.view_state{ + ViewState::Play=>(), + ViewState::Replay(bot_id)=>if let Some(replay)=self.replays.get_mut(bot_id){ + let time=replay.simulation.timer.time(ins.time+SessionTime::from_secs(5)); + replay.simulation.timer.set_time(ins.time,time); + // resimulate the entire playback lol + replay.last_instruction_id=0; + }, + } + }, + Instruction::Playback(SessionPlaybackInstruction::TogglePaused)=>{ + match &self.view_state{ + ViewState::Play=>(), + ViewState::Replay(bot_id)=>if let Some(replay)=self.replays.get_mut(bot_id){ + _=replay.simulation.timer.set_paused(ins.time,!replay.simulation.timer.is_paused()); + }, + } + } Instruction::ChangeMap(complete_map)=>{ self.clear_recording(); self.change_map(complete_map);