705 lines
30 KiB
C#
Executable File
705 lines
30 KiB
C#
Executable File
using System.Collections.Generic;
|
|
using System.IO;
|
|
using CSNetwork.GPDataType;
|
|
|
|
// using ModelViewer.Scene.SceneObject;
|
|
using UnityEngine;
|
|
|
|
namespace ModelViewer.Common
|
|
{
|
|
public static class A3DCombinedActionConst
|
|
{
|
|
public static uint DEFAULT_GFX_FADE_OUT_TIME = 1000;
|
|
public static int EVENT_TYPE_NONE = -1;
|
|
public static int EVENT_TYPE_BASE = 100;
|
|
public const int EVENT_TYPE_GFX = 100;
|
|
public const int EVENT_TYPE_SFX = 101;
|
|
public const int EVENT_TYPE_CHLDACT = 102;
|
|
public const int EVENT_TYPE_MATCHG = 103;
|
|
public const int EVENT_TYPE_ATT_PT = 104;
|
|
public const int EVENT_TYPE_SCRIPT = 105;
|
|
public const int EVENT_TYPE_CAM_PT = 106;
|
|
public const int EVENT_TYPE_MODELSCLCHG = 107;
|
|
public const int EVENT_TYPE_MATTRANS = 108;
|
|
public const int EVENT_TYPE_AUDIOEVENT = 109;
|
|
|
|
// when add new type, change this definition
|
|
public const int EVENT_TYPE_END = 109;
|
|
|
|
public static string _format_cact_name = "CombineActName: ";
|
|
public static string _format_act_count = "BaseActCount: ";
|
|
public static string _format_act_name = "BaseActName: ";
|
|
public static string _format_act_start_time = "ActStartTime: ";
|
|
public static string _format_act_LoopCount = "LoopCount: ";
|
|
public static string _format_act_LoopMinNum = "LoopMinNum: ";
|
|
public static string _format_act_LoopMaxNum = "LoopMaxNum: ";
|
|
public static string _format_start_time = "StartTime: ";
|
|
public static string _format_time_span = "TimeSpan: ";
|
|
public static string _format_rank_count = "RankCount: ";
|
|
public static string _format_rank = "Channel: "; // "Channel: %d, Rank: %d"
|
|
public static string _format_event_channel = "EventChannel: ";
|
|
public static string _format_play_speed = "PlaySpeed: ";
|
|
public static string _format_stopchildact = "StopChildAct: ";
|
|
public static string _format_resetmtlonstop = "ResetMtl: ";
|
|
public static string _format_once = "Once: ";
|
|
public static string _format_fx_count = "FxCount: ";
|
|
public static string _format_fx_type = "FxType: ";
|
|
public static string _format_fx_start_time = "FxStartTime: ";
|
|
public static string _format_fx_path_num = "FxFileNum: ";
|
|
public static string _format_fx_path = "FxFilePath: ";
|
|
public static string _format_hook_name = "HookName: ";
|
|
public static string _format_hook_offset = "HookOffset: ";
|
|
public static string _format_hook_yaw = "HookYaw: ";
|
|
public static string _format_hook_pitch = "HookPitch: ";
|
|
public static string _format_hook_rot = "HookRot: ";
|
|
public static string _format_bind_parent = "BindParent: ";
|
|
public static string _format_fadeout = "FadeOut: ";
|
|
public static string _format_model_alpha = "UseModelAlpha: ";
|
|
public static string _format_custom_path = "CustomPath: ";
|
|
public static string _format_atk_path = "AtkPath: ";
|
|
public static string _format_divisions = "Divisions: ";
|
|
public static string _format_atk_usedelay = "AtkUseDelay: ";
|
|
public static string _format_atk_delaycount = "AtkDelayNum: ";
|
|
public static string _format_atk_delaytime = "AtkDelayTime: ";
|
|
public static string _format_atk_orientation = "AtkOrient: ";
|
|
public static string _format_custom_data = "CustomData: ";
|
|
public static string _format_gfx_scale = "GfxScale: ";
|
|
public static string _format_gfx_alpha = "GfxAlpha: ";
|
|
public static string _format_gfx_play_speed = "GfxSpeed: ";
|
|
public static string _format_gfx_outer_path = "GfxOuterPath: ";
|
|
public static string _format_gfx_rel_ecm = "GfxRelToECM: ";
|
|
public static string _format_gfx_param_count = "GfxParamCount: ";
|
|
public static string _format_gfx_delay_time = "GfxDelayTime: ";
|
|
public static string _format_gfx_rot_with_model = "GfxRotWithModel: ";
|
|
public static string _format_param_ele_name = "ParamEleName: ";
|
|
public static string _format_param_id = "ParamId: ";
|
|
public static string _format_param_type = "ParamDataType: ";
|
|
public static string _format_param_is_cmd = "ParamDataIsCmd: ";
|
|
public static string _format_param_cmd = "ParamDataCmd: ";
|
|
public static string _format_param_pos = "ParamDataPos: ";
|
|
public static string _format_param_hook = "ParamDataHook: ";
|
|
public static string _format_child_act_count = "ChildActCount: ";
|
|
public static string _format_child_act_name = "ChildActName: ";
|
|
public static string _format_chld_hhname = "HHName: ";
|
|
public static string _format_transtime = "TransTime: ";
|
|
public static string _format_chld_istrail = "IsTrail: ";
|
|
public static string _format_chld_span = "TrailSpan: ";
|
|
public static string _format_chld_segs = "Segs: ";
|
|
public static string _format_pos = "Pos: ";
|
|
public static string _format_dir = "Dir: ";
|
|
public static string _format_matchg = "ColorValue: ";
|
|
public static string _format_apply_child = "ApplyChild: ";
|
|
public static string _format_mst_orgcol = "OrgColor: ";
|
|
public static string _format_mst_destnum = "DestNum: ";
|
|
public static string _format_mst_destcol = "Col: ";
|
|
public static string _format_mst_desttime = "Time: ";
|
|
public static string _format_event_type = "EventType: ";
|
|
public static string _format_event_count = "EventCount: ";
|
|
public static string _format_script_lines = "ScriptLines: ";
|
|
public static string _format_script_cfg_state = "ScriptCfgState: ";
|
|
public static string _format_script_usage = "ScriptUsage: ";
|
|
public static string _format_cam_dist2host = "Dist2Host: ";
|
|
public static string _format_cam_yaw2host = "Yaw2Host: ";
|
|
public static string _format_cam_pitch = "Pitch: ";
|
|
public static string _format_cam_yawacc = "YawAcc: ";
|
|
public static string _format_cam_pitchacc = "PitchAcc: ";
|
|
public static string _format_cam_angleacc = "AngleAcc: ";
|
|
public static string _format_cam_linearacc = "LinearAcc: ";
|
|
public static string _format_cam_isinterp = "IsInterp: ";
|
|
public static string _format_cam_beziernum = "BezierNum: ";
|
|
public static string _format_cam_beziervert = "";
|
|
public static string _format_audioevent = "AudioEvent: ";
|
|
public static string _format_audiomindist = "MinDist: ";
|
|
public static string _format_audiomaxdist = "MaxDist: ";
|
|
public static string _format_audiousecustom = "Custom: ";
|
|
public static string _format_audiovolume = "Volume: ";
|
|
|
|
public static int _trail_delta = 3;
|
|
}
|
|
|
|
[System.Serializable]
|
|
public class ACTION_INFO
|
|
{
|
|
public string m_strName;
|
|
public uint m_dwStartTime;
|
|
public uint m_dwEndTime;
|
|
public uint m_dwSpan;
|
|
public int m_nMinLoops;
|
|
public int m_nMaxLoops;
|
|
|
|
public bool IsInfinite() { return m_nMinLoops == -1 || m_nMaxLoops == -1; }
|
|
public int CalcLoopNum() { return IsInfinite() ? -1 : Random.Range(m_nMinLoops, m_nMaxLoops); }
|
|
public bool Load(FileStream fileStream, StreamReader file, uint dwVersion)
|
|
{
|
|
bool isBinary = fileStream != null;
|
|
|
|
if (isBinary)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
string szLine = string.Empty;
|
|
string tagValue;
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_act_name, out tagValue);
|
|
m_strName = tagValue;
|
|
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_act_start_time, out tagValue);
|
|
uint.TryParse(tagValue, out m_dwStartTime);
|
|
|
|
if (dwVersion < 6)
|
|
{
|
|
szLine = file.ReadLine();
|
|
}
|
|
else if (dwVersion >= 9 && dwVersion < 36)
|
|
{
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_act_LoopCount, out tagValue);
|
|
int nLoops;
|
|
int.TryParse(tagValue, out nLoops);
|
|
m_nMinLoops = m_nMaxLoops = nLoops;
|
|
}
|
|
else if (dwVersion >= 36)
|
|
{
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_act_LoopMinNum, out tagValue);
|
|
int.TryParse(tagValue, out m_nMinLoops);
|
|
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_act_LoopMaxNum, out tagValue);
|
|
int.TryParse(tagValue, out m_nMaxLoops);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
public uint GetTimeSpan() { return m_dwSpan; }
|
|
public void SetTimeSpan(uint dwTimeSpan)
|
|
{
|
|
m_dwSpan = dwTimeSpan;
|
|
m_dwEndTime = m_dwStartTime + m_dwSpan;
|
|
}
|
|
}
|
|
|
|
|
|
public class ACTIONDYN_DATA
|
|
{
|
|
private int m_nLoopNum;
|
|
ACTION_INFO m_pInfo;
|
|
public ACTIONDYN_DATA(int nLoopNum = 0, ACTION_INFO pInfo = null)
|
|
{
|
|
m_nLoopNum = nLoopNum;
|
|
m_pInfo = pInfo;
|
|
}
|
|
public int GetLoopNum() { return m_nLoopNum; }
|
|
public ACTION_INFO GetActInfo() { return m_pInfo; }
|
|
public int GetTimeSpan() { return (int)m_pInfo.GetTimeSpan(); }
|
|
public int GetTotalTime() { return GetLoopNum() * GetTimeSpan(); }
|
|
}
|
|
[System.Serializable]
|
|
public class EVENT_INFO
|
|
{
|
|
public int m_nType;
|
|
public uint m_dwStartTime;
|
|
public int m_dwTimeSpan;
|
|
public bool m_bOnce;
|
|
public A3DCombinedAction m_pAct;
|
|
|
|
public static EVENT_INFO LoadFromFile(A3DCombinedAction pAct, AFile pFile, StreamReader pTextFile, uint dwVersion)
|
|
{
|
|
string szLine = string.Empty;
|
|
string tagValue;
|
|
long dwReadLen;
|
|
int nType = A3DCombinedActionConst.EVENT_TYPE_NONE;
|
|
|
|
if (pFile != null)
|
|
{
|
|
// pFile->Read(&nType, sizeof(nType), &dwReadLen);
|
|
}
|
|
else
|
|
{
|
|
// pFile->ReadLine(szLine, AFILE_LINEMAXLEN, &dwReadLen);
|
|
// sscanf(szLine, _format_event_type, &nType);
|
|
szLine = pTextFile.ReadLine();
|
|
while(!szLine.Contains(A3DCombinedActionConst._format_event_type))
|
|
{
|
|
szLine = pTextFile.ReadLine();
|
|
}
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_event_type,out tagValue);
|
|
nType = int.TryParse(tagValue, out nType) ? nType : A3DCombinedActionConst.EVENT_TYPE_NONE;
|
|
}
|
|
|
|
EVENT_INFO pEvent = CreateEventByType(pAct, nType);
|
|
if (pEvent == null) return null;
|
|
|
|
if (dwVersion >= 18 && !pEvent.LoadEventBase(pFile, pTextFile, dwVersion)
|
|
|| !pEvent.Load(pFile, pTextFile, dwVersion))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return pEvent;
|
|
}
|
|
|
|
public static EVENT_INFO CreateEventByType(A3DCombinedAction pAct, int nType)
|
|
{
|
|
switch (nType)
|
|
{
|
|
case A3DCombinedActionConst.EVENT_TYPE_GFX:
|
|
return new FX_BASE_INFO();
|
|
case A3DCombinedActionConst.EVENT_TYPE_SFX:
|
|
return new FX_BASE_INFO();
|
|
// case A3DCombinedActionConst.EVENT_TYPE_CHLDACT:
|
|
// return new ChildActInfo(pAct);
|
|
// case A3DCombinedActionConst.EVENT_TYPE_MATCHG:
|
|
// return new MaterialScaleChange(pAct);
|
|
// case A3DCombinedActionConst.EVENT_TYPE_ATT_PT:
|
|
// return new SGCAttackPointMark(pAct);
|
|
// case A3DCombinedActionConst.EVENT_TYPE_SCRIPT:
|
|
// return new GfxScriptEvent(pAct);
|
|
// case A3DCombinedActionConst.EVENT_TYPE_CAM_PT:
|
|
// return new CameraControlEvent(pAct);
|
|
// case A3DCombinedActionConst.EVENT_TYPE_MODELSCLCHG:
|
|
// return new BoneScaleChange(pAct);
|
|
// case A3DCombinedActionConst.EVENT_TYPE_MATTRANS:
|
|
// return new MaterialScaleTrans(pAct);
|
|
// case A3DCombinedActionConst.EVENT_TYPE_AUDIOEVENT:
|
|
// return new AUDIOEVENT_INFO(pAct);
|
|
}
|
|
|
|
return new EVENT_INFO();
|
|
}
|
|
|
|
public bool LoadEventBase(AFile pFile, StreamReader pTextFile, uint dwVersion)
|
|
{
|
|
string szLine = string.Empty;
|
|
string tagValue;
|
|
long dwReadLen;
|
|
|
|
if (pFile != null)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
szLine = pTextFile.ReadLine();
|
|
while(!szLine.Contains(A3DCombinedActionConst._format_start_time))
|
|
{
|
|
szLine = pTextFile.ReadLine();
|
|
}
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_start_time, out tagValue);
|
|
|
|
if (dwVersion >= 20)
|
|
{
|
|
szLine = pTextFile.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_time_span, out tagValue);
|
|
int.TryParse(tagValue, out m_dwTimeSpan);
|
|
}
|
|
|
|
szLine = pTextFile.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_once, out tagValue);
|
|
int.TryParse(tagValue, out int nBool);
|
|
m_bOnce = (nBool != 0);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public virtual bool Load(AFile pFile, StreamReader pTextFile, uint dwVersion)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
[System.Serializable]
|
|
public class FX_BASE_INFO : EVENT_INFO
|
|
{
|
|
// public RandStringContainer m_pFiles;
|
|
// Then you have to random from this list to play the fx file (Can be VFX or SFX)
|
|
public List<string> m_strFilePaths = new();
|
|
public string m_strHookName;
|
|
public A3DVECTOR3 m_vOffset;
|
|
public float m_fYaw;
|
|
public float m_fPitch;
|
|
public float m_fRot;
|
|
public bool m_bBindParent;
|
|
public bool m_bModelAlpha;
|
|
public bool m_bCustomFilePath;
|
|
public bool m_bUseECMHook;
|
|
public A3DMATRIX4 m_matTran;
|
|
public uint m_dwFadeOutTime;
|
|
public int m_nCustomData;
|
|
|
|
public static FX_BASE_INFO LoadFromFile(A3DCombinedAction pAct, FileStream fileStream, StreamReader file, uint dwVersion)
|
|
{
|
|
bool isBinary = fileStream != null;
|
|
if (isBinary)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
string szLine = string.Empty;
|
|
string tagValue;
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_fx_type, out tagValue);
|
|
int nType = int.TryParse(tagValue, out nType) ? nType : 0;
|
|
}
|
|
|
|
// TODO: There are 3 types: GFX_INFO, SFX_INFO, AUDIOEVENT_INFO
|
|
return new FX_BASE_INFO();
|
|
}
|
|
|
|
public bool LoadBase(FileStream fileStream, StreamReader file, uint dwVersion)
|
|
{
|
|
bool isBinary = fileStream != null;
|
|
if (isBinary)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
string szLine = string.Empty;
|
|
string tagValue;
|
|
|
|
if (dwVersion < 18)
|
|
{
|
|
szLine = file.ReadLine();
|
|
while(!szLine.Contains(A3DCombinedActionConst._format_fx_start_time))
|
|
{
|
|
szLine = file.ReadLine();
|
|
}
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_fx_start_time, out tagValue);
|
|
uint.TryParse(tagValue, out m_dwStartTime);
|
|
}
|
|
|
|
if (dwVersion < 53)
|
|
{
|
|
szLine = file.ReadLine();
|
|
while(!szLine.Contains(A3DCombinedActionConst._format_fx_path))
|
|
{
|
|
szLine = file.ReadLine();
|
|
}
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_fx_path, out tagValue);
|
|
if (tagValue.EndsWith(".wav"))
|
|
tagValue = tagValue.Replace(".wav", "");
|
|
m_strFilePaths.Add(tagValue);
|
|
}
|
|
else // dwVersion >= 53
|
|
{
|
|
int iNum = 0;
|
|
szLine = file.ReadLine();
|
|
while(!szLine.Contains(A3DCombinedActionConst._format_fx_path_num))
|
|
{
|
|
szLine = file.ReadLine();
|
|
}
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_fx_path_num, out tagValue);
|
|
int.TryParse(tagValue, out iNum);
|
|
|
|
for (int iIdx = 0; iIdx < iNum; ++iIdx)
|
|
{
|
|
szLine = file.ReadLine();
|
|
while(!szLine.Contains(A3DCombinedActionConst._format_fx_path))
|
|
{
|
|
szLine = file.ReadLine();
|
|
}
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_fx_path, out tagValue);
|
|
if (tagValue.EndsWith(".wav"))
|
|
tagValue = tagValue.Replace(".wav", "");
|
|
m_strFilePaths.Add(tagValue);
|
|
}
|
|
}
|
|
|
|
while(!szLine.Contains(A3DCombinedActionConst._format_hook_name))
|
|
{
|
|
szLine = file.ReadLine();
|
|
}
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_hook_name, out tagValue);
|
|
m_strHookName = tagValue;
|
|
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_hook_offset, out tagValue);
|
|
string[] values = tagValue.Split(',');
|
|
if (values.Length >= 3)
|
|
{
|
|
float.TryParse(values[0].Trim(), out m_vOffset.x);
|
|
float.TryParse(values[1].Trim(), out m_vOffset.y);
|
|
float.TryParse(values[2].Trim(), out m_vOffset.z);
|
|
}
|
|
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_hook_yaw, out tagValue);
|
|
float.TryParse(tagValue, out m_fYaw);
|
|
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_hook_pitch, out tagValue);
|
|
float.TryParse(tagValue, out m_fPitch);
|
|
|
|
if (dwVersion >= 19)
|
|
{
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_hook_rot, out tagValue);
|
|
float.TryParse(tagValue, out m_fRot);
|
|
}
|
|
|
|
if (dwVersion > 1)
|
|
{
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_bind_parent, out tagValue);
|
|
int.TryParse(tagValue, out int nBool);
|
|
m_bBindParent = (nBool != 0);
|
|
}
|
|
|
|
if (dwVersion >= 15 && dwVersion < 50)
|
|
{
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_fadeout, out tagValue);
|
|
int.TryParse(tagValue, out int nBool);
|
|
bool bFadeOut = (nBool != 0);
|
|
if (bFadeOut)
|
|
m_dwFadeOutTime = A3DCombinedActionConst.DEFAULT_GFX_FADE_OUT_TIME;
|
|
else
|
|
m_dwFadeOutTime = 0;
|
|
}
|
|
else if (dwVersion >= 50)
|
|
{
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_fadeout, out tagValue);
|
|
uint.TryParse(tagValue, out m_dwFadeOutTime);
|
|
}
|
|
|
|
// Èç¹ûµ³öʱ¼äΪ¸ºÊý£¬Ö±½ÓÖÃΪ0
|
|
if (m_dwFadeOutTime >= 0x80000000)
|
|
m_dwFadeOutTime = 0;
|
|
|
|
if (dwVersion >= 17)
|
|
{
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_model_alpha, out tagValue);
|
|
int.TryParse(tagValue, out int nBool);
|
|
m_bModelAlpha = (nBool != 0);
|
|
}
|
|
|
|
if (dwVersion >= 58)
|
|
{
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_custom_path, out tagValue);
|
|
int.TryParse(tagValue, out int nBool);
|
|
m_bCustomFilePath = (nBool != 0);
|
|
}
|
|
|
|
if( dwVersion >= 62 )
|
|
{
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_custom_data, out tagValue);
|
|
int.TryParse(tagValue, out m_nCustomData);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public override bool Load(AFile pFile, StreamReader pTextFile, uint dwVersion)
|
|
{
|
|
LoadBase(null, pTextFile, dwVersion);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
[System.Serializable]
|
|
public class A3DCombinedAction
|
|
{
|
|
|
|
public string m_strName;
|
|
public int m_nLoops;
|
|
|
|
public bool IsLooping()
|
|
{
|
|
if (m_ActLst.Count == 0)
|
|
return false;
|
|
return m_ActLst[0].m_nMinLoops == -1 || m_ActLst[0].m_nMaxLoops == -1;
|
|
}
|
|
public List<ACTION_INFO> m_ActLst = new();
|
|
|
|
[SerializeReference]
|
|
public List<EVENT_INFO> m_EventInfoLst = new();
|
|
|
|
// Original, this property describes the comact's span time, now the span time may change randomly,
|
|
// so this property only define the min span time
|
|
// And rename it from m_dwComActSpan -> m_dwComActMinSpan
|
|
public uint m_dwComActMinSpan;
|
|
public bool m_bInfinite;
|
|
//public byte[] m_Ranks = new byte[CECModelConst.ACTCHA_MAX];
|
|
public int[] m_aEventCounter = new int[A3DCombinedActionConst.EVENT_TYPE_END - A3DCombinedActionConst.EVENT_TYPE_BASE + 1];
|
|
public int m_nEventChannel;
|
|
public float m_fPlaySpeed;
|
|
public bool m_bResetMaterialScale; // Whether to reset color change state when action stops (default is true)
|
|
public bool m_bStopChildrenAct; // Whether to stop child model actions when action stops (default is false)
|
|
|
|
public bool Load(FileStream fileStream, StreamReader file, uint dwVersion)
|
|
{
|
|
int nActCount = 0;
|
|
int nFxCount = 0;
|
|
int nChildCount = 0;
|
|
int nEventCount = 0;
|
|
bool isBinary = fileStream != null;
|
|
|
|
if (isBinary)
|
|
{
|
|
|
|
}
|
|
else
|
|
{
|
|
string szLine = string.Empty;
|
|
string tagValue;
|
|
szLine = file.ReadLine();
|
|
while(!szLine.Contains(A3DCombinedActionConst._format_cact_name))
|
|
{
|
|
szLine = file.ReadLine();
|
|
}
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_cact_name, out tagValue);
|
|
m_strName = tagValue;
|
|
|
|
if (dwVersion >= 3)
|
|
{
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_act_LoopCount, out tagValue);
|
|
int.TryParse(tagValue, out m_nLoops);
|
|
}
|
|
else
|
|
m_nLoops = 1;
|
|
|
|
if (dwVersion >= 30)
|
|
{
|
|
int rank_count = 0;
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_rank_count, out tagValue);
|
|
int.TryParse(tagValue, out rank_count);
|
|
|
|
for (int i = 0; i < rank_count; i++)
|
|
{
|
|
int channel = 0;
|
|
int rank = 0;
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_rank, out tagValue);
|
|
//Output look like this: 2, Rank: 1
|
|
string[] values = tagValue.Split(',');
|
|
if (values.Length >= 2)
|
|
{
|
|
int.TryParse(values[0].Trim(), out channel);
|
|
int.TryParse(values[1].Substring(values[1].LastIndexOf(' ') + 1).Trim(), out rank);
|
|
}
|
|
|
|
// if (channel >= 0 && channel < CECModelConst.ACTCHA_MAX)
|
|
// {
|
|
// m_Ranks[channel] = (byte)rank;
|
|
// }
|
|
}
|
|
}
|
|
|
|
if (dwVersion >= 32)
|
|
{
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_event_channel, out tagValue);
|
|
int.TryParse(tagValue, out m_nEventChannel);
|
|
}
|
|
|
|
if (dwVersion >= 40)
|
|
{
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_play_speed, out tagValue);
|
|
float.TryParse(tagValue, out m_fPlaySpeed);
|
|
}
|
|
|
|
if (dwVersion >= 49)
|
|
{
|
|
int iRead = 0;
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_stopchildact, out tagValue);
|
|
int.TryParse(tagValue, out iRead);
|
|
m_bStopChildrenAct = (iRead != 0);
|
|
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_resetmtlonstop, out tagValue);
|
|
int.TryParse(tagValue, out iRead);
|
|
m_bResetMaterialScale = (iRead != 0);
|
|
}
|
|
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_act_count, out tagValue);
|
|
int.TryParse(tagValue, out nActCount);
|
|
|
|
|
|
for (int i = 0; i < nActCount; i++)
|
|
{
|
|
ACTION_INFO pInfo = new ACTION_INFO();
|
|
pInfo.Load(fileStream, file, dwVersion);
|
|
m_ActLst.Add(pInfo);
|
|
}
|
|
|
|
if (m_nLoops == -1 && nActCount == 1 && m_ActLst.Count > 0)
|
|
m_ActLst[0].m_nMinLoops = m_ActLst[0].m_nMaxLoops = -1;
|
|
|
|
if (dwVersion < 7)
|
|
{
|
|
szLine = file.ReadLine();
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_fx_count, out tagValue);
|
|
int.TryParse(tagValue, out nFxCount);
|
|
|
|
for (int i = 0; i < nFxCount; i++)
|
|
{
|
|
FX_BASE_INFO pInfo = FX_BASE_INFO.LoadFromFile(this, fileStream, file, dwVersion);
|
|
if (pInfo == null) continue;
|
|
//TODO: Implement Load function
|
|
// pInfo.Load(fileStream, file, dwVersion);
|
|
pInfo.LoadBase(fileStream, file, dwVersion); // this should be called inside of each type of FX_BASE_INFO (GFX_INFO, SFX_INFO, AUDIOEVENT_INFO)
|
|
m_EventInfoLst.Add(pInfo);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// pFile->ReadLine(szLine, AFILE_LINEMAXLEN, &dwReadLen);
|
|
// sscanf(szLine, _format_event_count, &nEventCount);
|
|
szLine = file.ReadLine();
|
|
while(!szLine.Contains(A3DCombinedActionConst._format_event_count))
|
|
{
|
|
szLine = file.ReadLine();
|
|
}
|
|
AAssit.GetStringAfter(szLine, A3DCombinedActionConst._format_event_count, out tagValue);
|
|
int.TryParse(tagValue, out nEventCount);
|
|
|
|
EVENT_INFO pEvent = null;
|
|
for (int i = 0; i < nEventCount; i++)
|
|
{
|
|
pEvent = EVENT_INFO.LoadFromFile(this, null, file, dwVersion);
|
|
if (pEvent == null) continue;
|
|
m_EventInfoLst.Add(pEvent);
|
|
|
|
if (pEvent.m_nType > A3DCombinedActionConst.EVENT_TYPE_END)
|
|
continue;
|
|
|
|
// TODO: Maybe we need to implement this in the future
|
|
// m_aEventCounter[pEvent.m_nType - A3DCombinedActionConst.EVENT_TYPE_BASE]++;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*/ TODO: Maybe we need to implement this in the future
|
|
ALISTPOSITION pos = m_EventInfoLst.GetHeadPosition();
|
|
while (pos) m_EventInfoLst.GetNext(pos)->Init(pDev);
|
|
|
|
pos = m_ActLst.GetHeadPosition();
|
|
while (pos)
|
|
{
|
|
if (m_ActLst.GetNext(pos)->IsInfinite()//*GetLoops() == -1)
|
|
{
|
|
m_bInfinite = true;
|
|
break;
|
|
}
|
|
}
|
|
//*/
|
|
|
|
|
|
|
|
return true;
|
|
}
|
|
}
|
|
} |