| 145 | } |
| 146 | |
| 147 | bool Host::Loop() |
| 148 | { |
| 149 | // Events processing |
| 150 | InputState input_state; |
| 151 | if( system_window_ != nullptr ) |
| 152 | { |
| 153 | events_.clear(); |
| 154 | system_window_->GetInput( events_ ); |
| 155 | system_window_->GetInputState( input_state ); |
| 156 | } |
| 157 | |
| 158 | // Special host key events. |
| 159 | for( const SystemEvent& event : events_ ) |
| 160 | { |
| 161 | if( event.type == SystemEvent::Type::Quit ) |
| 162 | quit_requested_= true; |
| 163 | |
| 164 | if( event.type == SystemEvent::Type::Key && event.event.key.pressed ) |
| 165 | { |
| 166 | if( event.event.key.key_code == SystemEvent::KeyEvent::KeyCode::BackQuote && |
| 167 | console_ != nullptr ) |
| 168 | console_->Toggle(); |
| 169 | if( event.event.key.key_code == SystemEvent::KeyEvent::KeyCode::Pause && |
| 170 | is_single_player_ ) |
| 171 | paused_= !paused_; |
| 172 | } |
| 173 | } |
| 174 | |
| 175 | const bool input_goes_to_console= console_ != nullptr && console_->IsActive(); |
| 176 | const bool input_goes_to_menu= !input_goes_to_console && menu_ != nullptr && menu_->IsActive(); |
| 177 | |
| 178 | const bool really_paused= paused_ || ( is_single_player_ && menu_ != nullptr && menu_->IsActive() ); |
| 179 | const bool needs_pause_server= client_ != nullptr && client_->PlayingCutscene(); |
| 180 | |
| 181 | system_window_->CaptureMouse( !input_goes_to_console && !input_goes_to_menu ); |
| 182 | |
| 183 | if( input_goes_to_console ) |
| 184 | console_->ProcessEvents( events_ ); |
| 185 | |
| 186 | if( |
| 187 | menu_ != nullptr && !input_goes_to_console && |
| 188 | !( client_ != nullptr && client_->PlayingCutscene() ) /* We must no disable menu, when cutscene played. */ ) |
| 189 | menu_->ProcessEvents( events_ ); |
| 190 | |
| 191 | if( menu_ != nullptr && !input_goes_to_menu && !input_goes_to_console ) |
| 192 | menu_->ProcessEventsWhileNonactive( events_ ); |
| 193 | |
| 194 | if( client_ != nullptr && !input_goes_to_console && !input_goes_to_menu && !really_paused ) |
| 195 | client_->ProcessEvents( events_ ); |
| 196 | |
| 197 | if( sound_engine_ != nullptr ) |
| 198 | sound_engine_->Tick(); |
| 199 | |
| 200 | // Loop operations |
| 201 | if( local_server_ != nullptr ) |
| 202 | local_server_->Loop( really_paused || needs_pause_server ); |
| 203 | |
| 204 | if( client_ != nullptr ) |
no test coverage detected