docs: @Override
      protected StateEpisode getStateEpisodeForState(IState state)
      {
          if (!(state instanceof ClientState))
              return null;
  
          ClientState cs = (ClientState) state;
          switch (cs) {
              case WAITING_FOR_MOD_READY:
                  return new InitialiseClientModEpisode(this);
              case DORMANT:
                  return new DormantEpisode(this);
              case CREATING_HANDLERS:
                  return new CreateHandlersEpisode(this);
              case EVALUATING_WORLD_REQUIREMENTS:
                  return new EvaluateWorldRequirementsEpisode(this);
              case PAUSING_OLD_SERVER:
                  return new PauseOldServerEpisode(this);
              case CLOSING_OLD_SERVER:
                  return new CloseOldServerEpisode(this);
              case CREATING_NEW_WORLD:
                  return new CreateWorldEpisode(this);
              case WAITING_FOR_SERVER_READY:
                  return new WaitingForServerEpisode(this);
              case RUNNING:
                  return new MissionRunningEpisode(this);
              case IDLING:
                  return new MissionIdlingEpisode(this);
              case MISSION_ENDED:
                  return new MissionEndedEpisode(this, MissionResult.ENDED, false, false, true);
              case ERROR_DUFF_HANDLERS:
                  return new MissionEndedEpisode(this, MissionResult.MOD_FAILED_TO_INSTANTIATE_HANDLERS, true, true, true);
              case ERROR_INTEGRATED_SERVER_UNREACHABLE:
                  return new MissionEndedEpisode(this, MissionResult.MOD_SERVER_UNREACHABLE, true, true, true);
              case ERROR_NO_WORLD:
                  return new MissionEndedEpisode(this, MissionResult.MOD_HAS_NO_WORLD_LOADED, true, true, true);
              case ERROR_CANNOT_CREATE_WORLD:
                  return new MissionEndedEpisode(this, MissionResult.MOD_FAILED_TO_CREATE_WORLD, true, true, true);
              case ERROR_CANNOT_START_AGENT: // run-ons deliberate
              case ERROR_LOST_AGENT:
              case ERROR_LOST_VIDEO:
                  return new MissionEndedEpisode(this, MissionResult.MOD_HAS_NO_AGENT_AVAILABLE, true, true, false);
              case ERROR_LOST_NETWORK_CONNECTION: // run-on deliberate
              case ERROR_CANNOT_CONNECT_TO_SERVER:
                  return new MissionEndedEpisode(this, MissionResult.MOD_CONNECTION_FAILED, true, false, true); // No point trying to inform the server - we can't reach it anyway!
              case ERROR_TIMED_OUT_WAITING_FOR_EPISODE_START: // run-ons deliberate
              case ERROR_TIMED_OUT_WAITING_FOR_EPISODE_PAUSE:
              case ERROR_TIMED_OUT_WAITING_FOR_EPISODE_CLOSE:
              case ERROR_TIMED_OUT_WAITING_FOR_MISSION_END:
              case ERROR_TIMED_OUT_WAITING_FOR_WORLD_CREATE:
                  return new MissionEndedEpisode(this, MissionResult.MOD_CONNECTION_FAILED, true, true, true);
              case MISSION_ABORTED:
                  return new MissionEndedEpisode(this, MissionResult.MOD_SERVER_ABORTED_MISSION, true, false, true);  // Don't inform the server - it already knows (we're acting on its notification)
              case WAITING_FOR_SERVER_MISSION_END:
                  return new WaitingForServerMissionEndEpisode(this);
              default:
                  break;
          }
          return null;
      }