code: def _update_state(self):
      # extract all data from the current state
      state = self.game.get_state()
      if state is not None and state.screen_buffer is not None:
          self.measurements = state.game_variables
          self.state = {"measurements": self.measurements}
          for camera in self.cameras:
              observation = getattr(state, camera.value[1])
              if len(observation.shape) == 3:
                  self.state[camera.value[0]] = np.transpose(
                      observation, (1, 2, 0)
                  )
              elif len(observation.shape) == 2:
                  self.state[camera.value[0]] = np.repeat(
                      np.expand_dims(observation, -1), 3, axis=-1
                  )
  
      self.reward = self.game.get_last_reward()
      self.done = self.game.is_episode_finished()
  
imports: import os
  from enum import Enum
  from os import path, environ
  from typing import Union, List
  import numpy
  from rl_coach.base_parameters import VisualizationParameters
  from rl_coach.environments.environment import Environment, EnvironmentParameters, LevelSelection
  from rl_coach.filters.action.full_discrete_action_space_map import FullDiscreteActionSpaceMap
  from rl_coach.filters.filter import InputFilter, OutputFilter
  from rl_coach.filters.observation.observation_rescale_to_size_filter import ObservationRescaleToSizeFilter
  from rl_coach.filters.observation.observation_rgb_to_y_filter import ObservationRGBToYFilter
  from rl_coach.filters.observation.observation_stacking_filter import ObservationStackingFilter
  from rl_coach.filters.observation.observation_to_uint8_filter import ObservationToUInt8Filter
  from rl_coach.spaces import MultiSelectActionSpace, ImageObservationSpace, VectorObservationSpace, StateSpace
label_desc: Use image node_id 2 for calling the DoomEnvironment obj's underlying member method code with example usage: obj._update_state() without return types