| 2044 | } |
| 2045 | |
| 2046 | void Map::TryActivateProcedure( |
| 2047 | unsigned int procedure_number, |
| 2048 | const Time current_time, |
| 2049 | Player& player, |
| 2050 | MessagesSender& messages_sender ) |
| 2051 | { |
| 2052 | // Hack for bad PROCEDURE.XX files, specially for map06 |
| 2053 | if( procedure_number >= procedures_.size() ) |
| 2054 | return; |
| 2055 | |
| 2056 | const MapData::Procedure& procedure= map_data_->procedures[ procedure_number ]; |
| 2057 | ProcedureState& procedure_state= procedures_[ procedure_number ]; |
| 2058 | |
| 2059 | // Abort reverse movement if check_back. |
| 2060 | // TODO - if player tries activate procedure, not revert in and left in BackWait state. |
| 2061 | if( procedure.check_back && |
| 2062 | procedure_state.movement_state == ProcedureState::MovementState::ReverseMovement ) |
| 2063 | { |
| 2064 | float dt_s; |
| 2065 | if( procedure.speed > 0.0f ) |
| 2066 | dt_s= |
| 2067 | std::max( |
| 2068 | 1.0f / ( procedure.speed * GameConstants::procedures_speed_scale ) - |
| 2069 | ( current_time - procedure_state.last_state_change_time ).ToSeconds(), |
| 2070 | 0.0f ); |
| 2071 | else |
| 2072 | dt_s= 0.0f; |
| 2073 | |
| 2074 | procedure_state.last_state_change_time= current_time - Time::FromSeconds( dt_s ); |
| 2075 | procedure_state.movement_state= ProcedureState::MovementState::Movement; |
| 2076 | return; |
| 2077 | } |
| 2078 | |
| 2079 | // TODO - make activation filter better. |
| 2080 | if( !player.TryActivateProcedure( procedure_number, current_time ) ) |
| 2081 | return; |
| 2082 | |
| 2083 | const bool have_necessary_keys= |
| 2084 | ( !procedure. red_key_required || player.HaveRedKey() ) && |
| 2085 | ( !procedure.green_key_required || player.HaveGreenKey() ) && |
| 2086 | ( !procedure. blue_key_required || player.HaveBlueKey() ); |
| 2087 | |
| 2088 | if( |
| 2089 | // Can open if have keys, procedure not locked. |
| 2090 | // All proceduras are unlocked in deathmatch. |
| 2091 | ( ( have_necessary_keys && !procedure_state.locked ) || game_rules_ == GameRules::Deathmatch ) && |
| 2092 | procedure_state.movement_state == ProcedureState::MovementState::None ) |
| 2093 | { |
| 2094 | ActivateProcedure( procedure_number, current_time ); |
| 2095 | |
| 2096 | if( procedure.on_message_number != 0u ) |
| 2097 | { |
| 2098 | Messages::TextMessage text_message; |
| 2099 | text_message.text_message_number= procedure.on_message_number; |
| 2100 | messages_sender.SendUnreliableMessage( text_message ); |
| 2101 | } |
| 2102 | } // if activated |
| 2103 |
nothing calls this directly
no test coverage detected