class_docstr: A Starcraft II environment.
  
  The implementation details of the action and observation specs are in
  lib/features.py
docstr: Apply actions, step the world forward, and return observations.
  
  Args:
    actions: A list of actions meeting the action spec, one per agent, or a
        list per agent. Using a list allows multiple actions per frame, but
        will still check that they're valid, so disabling
        ensure_available_actions is encouraged.
    step_mul: If specified, use this rather than the environment's default.
  
  Returns:
    A tuple of TimeStep namedtuples, one per agent.
docstr_tok: ["Apply","actions",",","step","the","world","forward",",","and","return","observations",".","Args",":","actions",":","A","list","of","actions","meeting","the","action","spec",",","one","per","agent",",","or","a","list","per","agent",".","Using","a","list","allows","multiple","actions","per","frame",",","but","will","still","check","that","they","'re","valid",",","so","disabling","ensure_available_actions","is","encouraged",".","step_mul",":","If","specified",",","use","this","rather","than","the","environment","'s","default",".","Returns",":","A","tuple","of","TimeStep","namedtuples",",","one","per","agent","."]
code: def step(self, actions, step_mul=None):
      """Apply actions, step the world forward, and return observations.
  
      Args:
        actions: A list of actions meeting the action spec, one per agent, or a
            list per agent. Using a list allows multiple actions per frame, but
            will still check that they're valid, so disabling
            ensure_available_actions is encouraged.
        step_mul: If specified, use this rather than the environment's default.
  
      Returns:
        A tuple of TimeStep namedtuples, one per agent.
      """
      if self._state == environment.StepType.LAST:
          return self.reset()
  
      skip = not self._ensure_available_actions
      actions = [
          [
              f.transform_action(o.observation, a, skip_available=skip)
              for a in to_list(acts)
          ]
          for f, o, acts in zip(self._features, self._obs, actions)
      ]
  
      if not self._realtime:
          actions = self._apply_action_delays(actions)
  
      self._parallel.run(
          (c.actions, sc_pb.RequestAction(actions=a))
          for c, a in zip(self._controllers, actions)
      )
  
      self._state = environment.StepType.MID
      return self._step(step_mul)
  
imports: import collections
  import copy
  import random
  import time
  from absl import logging
  from pysc2 import maps
  from pysc2 import run_configs
  from pysc2.env import enums
  from pysc2.env import environment
  from pysc2.lib import actions
  from pysc2.lib import features
  from pysc2.lib import metrics
  from pysc2.lib import portspicker
  from pysc2.lib import renderer_human
  from pysc2.lib import run_parallel
  from pysc2.lib import stopwatch
  from s2clientprotocol import sc2api_pb2
label_desc: Use image node_id 14 for calling the SC2Env obj's underlying member method code with example usage: obj.step(actions, step_mul) and returns: self, self