//----------------------------------------------------------------- /// <summary> /// 세션 로드 /// </summary> /// <param name="filepath"></param> /// <returns></returns> public static FSNSession Load(string filepath) { var newsession = new FSNSession(); var rawdata = FSNUtils.LoadTextData(filepath); JSONObject json = JSONObject.Create(rawdata); if (json != null) { // Script 관련 newsession.ScriptName = json[c_field_scriptName].str; newsession.ScriptHashKey = json[c_field_scriptHash].str; newsession.SnapshotIndex = (int)json[c_field_snapshotIndex].n; // 플래그 테이블 var flagtable = json[c_field_flagTable]; foreach (var key in flagtable.keys) { newsession.SetFlagValue(key, flagtable[key].b, true); } // 값 테이블 var valuetable = json[c_field_valueTable]; foreach (var key in valuetable.keys) { newsession.SetNumberValue(key, valuetable[key].n, true); } } else { Debug.LogErrorFormat("[FSNSession] error loading session file : {0}", filepath); } return(newsession); }
//--------------------------------------------------------------------------------------- /// <summary> /// 헤더 정보 먼저 처리 /// </summary> /// <param name="scriptData"></param> /// <param name="session"></param> static void ProcessHeaders(string scriptData, FSNScriptSequence sequence, FSNSession session) { var strstream = new System.IO.StringReader(scriptData); string line = null; int linenumber = 0; // 줄 번호 while ((line = strstream.ReadLine()) != null) // 줄 단위로 읽는다. { linenumber++; FSNDebug.currentProcessingScriptLine = linenumber; // 디버깅 정보 설정 if (line.Length > 0 && line.Substring(0, 1) == c_token_PreProcessor) // 프리프로세서 기호에만 반응한다 { var commandAndParam = line.Substring(1).Split(c_whiteSpaceArray, 2); // 명령어 파라미터 구분 var command = commandAndParam[0]; var paramStr = commandAndParam.Length > 1? commandAndParam[1] : ""; // 아직까지는 header 커맨드밖에 없으므로 간단하게 if로만 체크한다. 더 늘어나면 리팩토링이 필요해질듯... if (command == "헤더" || command == "header") { sequence.Header.FromAsset(paramStr.Trim()); } else { Debug.LogErrorFormat("[FSNSequence] line {0} : unknown preprocessor command {1}", linenumber, command); } } } // 읽어들인 헤더 정보를 바탕으로 플래그/변수 기본값들 세팅하기 (선언되어있지 않은 경우에만) foreach (var pair in sequence.Header.FlagDeclarations) // 플래그 선언 { if (!session.FlagIsDeclared(pair.Key)) // 아직 선언되지 않은 경우만 세팅 { bool value = string.IsNullOrEmpty(pair.Value)? false : FSNUtils.StringToValue <bool>(pair.Value); // 초기값까지 선언한 경우 값 해독, 아니면 기본값 false session.SetFlagValue(pair.Key, value, true); } } foreach (var pair in sequence.Header.ValueDeclarations) // 값 선언 { if (!session.ValueIsDeclared(pair.Key)) // 아직 선언되지 않은 경우만 세팅 { float value = string.IsNullOrEmpty(pair.Value)? 0 : FSNUtils.StringToValue <float>(pair.Value); // 초기값까지 선언한 경우 값 해독, 아니면 기본값 false session.SetNumberValue(pair.Key, value, true); } } }
//--------------------------------------------------------------------------------------- /// <summary> /// 헤더 정보 먼저 처리 /// </summary> /// <param name="scriptData"></param> /// <param name="session"></param> static void ProcessHeaders(string scriptData, FSNScriptSequence sequence, FSNSession session) { var strstream = new System.IO.StringReader(scriptData); string line = null; int linenumber = 0; // 줄 번호 while ((line = strstream.ReadLine()) != null) // 줄 단위로 읽는다. { linenumber++; FSNDebug.currentProcessingScriptLine = linenumber; // 디버깅 정보 설정 if (line.Length > 0 && line.Substring(0,1) == c_token_PreProcessor) // 프리프로세서 기호에만 반응한다 { var commandAndParam = line.Substring(1).Split(c_whiteSpaceArray, 2); // 명령어 파라미터 구분 var command = commandAndParam[0]; var paramStr = commandAndParam.Length > 1? commandAndParam[1] : ""; // 아직까지는 header 커맨드밖에 없으므로 간단하게 if로만 체크한다. 더 늘어나면 리팩토링이 필요해질듯... if (command == "헤더" || command == "header") { sequence.Header.FromAsset(paramStr.Trim()); } else { Debug.LogErrorFormat("[FSNSequence] line {0} : unknown preprocessor command {1}", linenumber, command); } } } // 읽어들인 헤더 정보를 바탕으로 플래그/변수 기본값들 세팅하기 (선언되어있지 않은 경우에만) foreach (var pair in sequence.Header.FlagDeclarations) // 플래그 선언 { if (!session.FlagIsDeclared(pair.Key)) // 아직 선언되지 않은 경우만 세팅 { bool value = string.IsNullOrEmpty(pair.Value)? false : FSNUtils.StringToValue<bool>(pair.Value); // 초기값까지 선언한 경우 값 해독, 아니면 기본값 false session.SetFlagValue(pair.Key, value, true); } } foreach (var pair in sequence.Header.ValueDeclarations) // 값 선언 { if (!session.ValueIsDeclared(pair.Key)) // 아직 선언되지 않은 경우만 세팅 { float value = string.IsNullOrEmpty(pair.Value)? 0 : FSNUtils.StringToValue<float>(pair.Value); // 초기값까지 선언한 경우 값 해독, 아니면 기본값 false session.SetNumberValue(pair.Key, value, true); } } }
//----------------------------------------------------------------- /// <summary> /// 세션 로드 /// </summary> /// <param name="filepath"></param> /// <returns></returns> public static FSNSession Load(string filepath) { var newsession = new FSNSession(); var rawdata = FSNUtils.LoadTextData(filepath); JSONObject json = JSONObject.Create(rawdata); if (json != null) { // Script 관련 newsession.ScriptName = json[c_field_scriptName].str; newsession.ScriptHashKey = json[c_field_scriptHash].str; newsession.SnapshotIndex = (int)json[c_field_snapshotIndex].n; // 플래그 테이블 var flagtable = json[c_field_flagTable]; foreach(var key in flagtable.keys) { newsession.SetFlagValue(key, flagtable[key].b, true); } // 값 테이블 var valuetable = json[c_field_valueTable]; foreach(var key in valuetable.keys) { newsession.SetNumberValue(key, valuetable[key].n, true); } } else { Debug.LogErrorFormat("[FSNSession] error loading session file : {0}", filepath); } return newsession; }