@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;
    }
@ 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 : 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 : case ERROR_CANNOT_CONNECT_TO_SERVER : return new MissionEndedEpisode ( this , MissionResult . MOD_CONNECTION_FAILED , true , false , true ) ; case ERROR_TIMED_OUT_WAITING_FOR_EPISODE_START : 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 ) ; case WAITING_FOR_SERVER_MISSION_END : return new WaitingForServerMissionEndEpisode ( this ) ; default : break ; } return null ; }
Create the episode object for the requested state.

@param state the state the mod is entering
@return a MissionStateEpisode that localises all the logic required to run this state