| 1007 | } |
| 1008 | |
| 1009 | void Map::Tick( const Time current_time, const Time last_tick_delta ) |
| 1010 | { |
| 1011 | const Time prev_tick_time= current_time - last_tick_delta; |
| 1012 | const unsigned int death_ticks= |
| 1013 | static_cast<unsigned int>( GameConstants::death_ticks_per_second * current_time .ToSeconds() ) - |
| 1014 | static_cast<unsigned int>( GameConstants::death_ticks_per_second * prev_tick_time.ToSeconds() ); |
| 1015 | |
| 1016 | const float last_tick_delta_s= last_tick_delta.ToSeconds(); |
| 1017 | |
| 1018 | // Update state of procedures |
| 1019 | for( unsigned int p= 0u; p < procedures_.size(); p++ ) |
| 1020 | { |
| 1021 | const MapData::Procedure& procedure= map_data_->procedures[p]; |
| 1022 | ProcedureState& procedure_state= procedures_[p]; |
| 1023 | |
| 1024 | const Time time_since_last_state_change= current_time - procedure_state.last_state_change_time; |
| 1025 | const float new_stage= |
| 1026 | procedure.speed > 0.0f |
| 1027 | ? ( time_since_last_state_change.ToSeconds() * procedure.speed * GameConstants::procedures_speed_scale ) |
| 1028 | : 1.0f; |
| 1029 | |
| 1030 | // Check map end |
| 1031 | if( procedure_state.movement_state != ProcedureState::MovementState::None && |
| 1032 | procedure.end_delay_s > 0.0f && |
| 1033 | time_since_last_state_change.ToSeconds() >= procedure.end_delay_s ) |
| 1034 | map_end_triggered_= true; |
| 1035 | |
| 1036 | switch( procedure_state.movement_state ) |
| 1037 | { |
| 1038 | case ProcedureState::MovementState::None: |
| 1039 | break; |
| 1040 | |
| 1041 | case ProcedureState::MovementState::StartWait: |
| 1042 | if( time_since_last_state_change.ToSeconds() >= procedure.start_delay_s ) |
| 1043 | { |
| 1044 | ActivateProcedureSwitches( procedure, true, current_time ); |
| 1045 | DoProcedureImmediateCommands( procedure, current_time ); |
| 1046 | EmitProcedureSound( procedure ); |
| 1047 | procedure_state.movement_state= ProcedureState::MovementState::Movement; |
| 1048 | procedure_state.movement_stage= 0.0f; |
| 1049 | procedure_state.last_state_change_time= current_time; |
| 1050 | } |
| 1051 | else |
| 1052 | procedure_state.movement_stage= new_stage; |
| 1053 | break; |
| 1054 | |
| 1055 | case ProcedureState::MovementState::Movement: |
| 1056 | if( new_stage >= 1.0f ) |
| 1057 | { |
| 1058 | // TODO - do it at the end of movement? |
| 1059 | // Maybe, do this at end of reverse-movement? |
| 1060 | DoProcedureDeactivationCommands( procedure ); |
| 1061 | |
| 1062 | procedure_state.movement_state= ProcedureState::MovementState::BackWait; |
| 1063 | procedure_state.movement_stage= 0.0f; |
| 1064 | procedure_state.last_state_change_time= current_time; |
| 1065 | } |
| 1066 | else |
no test coverage detected