|
|
|
|
|
using System;
|
|
|
|
|
|
using Qoo.File;
|
|
|
|
|
|
using Qoo.Memory;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Qoo.Ks
|
|
|
|
|
|
{
|
|
|
|
|
|
// Token: 0x02000033 RID: 51
|
|
|
|
|
|
public static class Akb
|
|
|
|
|
|
{
|
|
|
|
|
|
// Token: 0x0600018F RID: 399 RVA: 0x00006CEC File Offset: 0x00004EEC
|
|
|
|
|
|
public static void Create(byte[] data)
|
|
|
|
|
|
{
|
|
|
|
|
|
Akb.Release();
|
|
|
|
|
|
MemFile memFile = new MemFile(data);
|
|
|
|
|
|
Akb.m_Fh.FourCC = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Fh.nNumOfDir = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Fh.nNumOfFile = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Fh.nNumOfLabel = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Fh.nStringOffset = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Fh.nMaxTagNum = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Fh.nMaxMsgTagNum = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Fh.nMaxParamNum = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Fh.nMaxMsgNum = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Fh.nMaxTextSize = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Fh.nMaxLabelNum = memFile.GetUInt32();
|
|
|
|
|
|
int pos = memFile.Pos;
|
|
|
|
|
|
memFile.SetPos((int)Akb.m_Fh.nStringOffset);
|
|
|
|
|
|
int size = memFile.Length() - memFile.Pos;
|
|
|
|
|
|
string @string = memFile.GetString(size);
|
|
|
|
|
|
memFile.SetPos(pos);
|
|
|
|
|
|
Akb.m_Dirs = new AKB_DIRINFO[Akb.m_Fh.nNumOfDir];
|
|
|
|
|
|
int num = 0;
|
|
|
|
|
|
while ((long)num != (long)((ulong)Akb.m_Fh.nNumOfDir))
|
|
|
|
|
|
{
|
|
|
|
|
|
Akb.m_Dirs[num].Name = Akb.GetString(@string, (int)memFile.GetUInt32());
|
|
|
|
|
|
Akb.m_Dirs[num].nNameCRC = memFile.GetUInt32();
|
|
|
|
|
|
num++;
|
|
|
|
|
|
}
|
|
|
|
|
|
Akb.m_Files = new AKB_FILEINFO[Akb.m_Fh.nNumOfFile];
|
|
|
|
|
|
int num2 = 0;
|
|
|
|
|
|
while ((long)num2 != (long)((ulong)Akb.m_Fh.nNumOfFile))
|
|
|
|
|
|
{
|
|
|
|
|
|
Akb.m_Files[num2].nDirNo = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Files[num2].Name = Akb.GetString(@string, (int)memFile.GetUInt32());
|
|
|
|
|
|
Akb.m_Files[num2].nNameCRC = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Files[num2].nLabelPos = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Files[num2].nLabelNum = memFile.GetInt32();
|
|
|
|
|
|
Akb.m_Files[num2].nTagNum = memFile.GetInt32();
|
|
|
|
|
|
Akb.m_Files[num2].nMsgTagNum = memFile.GetInt32();
|
|
|
|
|
|
Akb.m_Files[num2].nParamNum = memFile.GetInt32();
|
|
|
|
|
|
Akb.m_Files[num2].nMsgNum = memFile.GetInt32();
|
|
|
|
|
|
Akb.m_Files[num2].nTextSize = memFile.GetInt32();
|
|
|
|
|
|
num2++;
|
|
|
|
|
|
}
|
|
|
|
|
|
Akb.m_Labels = new AKB_LABELINFO[Akb.m_Fh.nNumOfLabel];
|
|
|
|
|
|
int num3 = 0;
|
|
|
|
|
|
while ((long)num3 != (long)((ulong)Akb.m_Fh.nNumOfLabel))
|
|
|
|
|
|
{
|
|
|
|
|
|
Akb.m_Labels[num3].nFileNo = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Labels[num3].Name = Akb.GetString(@string, (int)memFile.GetUInt32());
|
|
|
|
|
|
Akb.m_Labels[num3].nNameCRC = memFile.GetUInt32();
|
|
|
|
|
|
Akb.m_Labels[num3].nTagNum = memFile.GetInt32();
|
|
|
|
|
|
num3++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000190 RID: 400 RVA: 0x00007010 File Offset: 0x00005210
|
|
|
|
|
|
public static bool Release()
|
|
|
|
|
|
{
|
|
|
|
|
|
Akb.m_Fh.Init();
|
|
|
|
|
|
Akb.m_Dirs = null;
|
|
|
|
|
|
Akb.m_Files = null;
|
|
|
|
|
|
Akb.m_Labels = null;
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000191 RID: 401 RVA: 0x00007030 File Offset: 0x00005230
|
|
|
|
|
|
public static int GetDirNum()
|
|
|
|
|
|
{
|
|
|
|
|
|
return Akb.m_Dirs.Length;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000192 RID: 402 RVA: 0x0000703C File Offset: 0x0000523C
|
|
|
|
|
|
public static int GetFileNum()
|
|
|
|
|
|
{
|
|
|
|
|
|
return Akb.m_Files.Length;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000193 RID: 403 RVA: 0x00007048 File Offset: 0x00005248
|
|
|
|
|
|
public static int GetLabelNum()
|
|
|
|
|
|
{
|
|
|
|
|
|
return Akb.m_Labels.Length;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000194 RID: 404 RVA: 0x00007054 File Offset: 0x00005254
|
|
|
|
|
|
public static AKB_FILEHEADER GetHeader()
|
|
|
|
|
|
{
|
|
|
|
|
|
return Akb.m_Fh;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000195 RID: 405 RVA: 0x0000705C File Offset: 0x0000525C
|
|
|
|
|
|
public static AKB_DIRINFO GetDirInfo(int nDirNo)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Akb.m_Dirs[nDirNo];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000196 RID: 406 RVA: 0x00007070 File Offset: 0x00005270
|
|
|
|
|
|
public static AKB_FILEINFO GetFileInfo(int nFileNo)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Akb.m_Files[nFileNo];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000197 RID: 407 RVA: 0x00007084 File Offset: 0x00005284
|
|
|
|
|
|
public static AKB_LABELINFO GetLabelInfo(int nLabelNo)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Akb.m_Labels[nLabelNo];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000198 RID: 408 RVA: 0x00007098 File Offset: 0x00005298
|
|
|
|
|
|
public static bool CheckFile(string name)
|
|
|
|
|
|
{
|
|
|
|
|
|
FileId fileId = new FileId(name);
|
|
|
|
|
|
return Akb.SearchFile(fileId.Name) != -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000199 RID: 409 RVA: 0x000070C0 File Offset: 0x000052C0
|
|
|
|
|
|
public static int SearchFile(string name)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < Akb.m_Files.Length; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (Akb.m_Files[i].Name.CompareTo(name) == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
return i;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x0600019A RID: 410 RVA: 0x00007104 File Offset: 0x00005304
|
|
|
|
|
|
public static int SearchLabel(int nFileNo, string labelName)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (labelName.Length > 0 && labelName[0] == '*')
|
|
|
|
|
|
{
|
|
|
|
|
|
labelName = labelName.Substring(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
AKB_FILEINFO fileInfo = Akb.GetFileInfo(nFileNo);
|
|
|
|
|
|
for (int i = 0; i < fileInfo.nLabelNum; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (Akb.m_Labels[(int)(checked((IntPtr)(unchecked((long)i + (long)((ulong)fileInfo.nLabelPos)))))].Name.CompareTo(labelName) == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
return i;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x0600019B RID: 411 RVA: 0x0000717C File Offset: 0x0000537C
|
|
|
|
|
|
public static bool GetFileLabel(ref int KsNo, ref int LabelNo, string FileName, string LabelName)
|
|
|
|
|
|
{
|
|
|
|
|
|
FileId fileId = new FileId(FileName);
|
|
|
|
|
|
KsNo = Akb.SearchFile(fileId.Name);
|
|
|
|
|
|
if (KsNo < 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Assert(KsNo != 0, string.Format("AKB内に指定KSファイルが見つかりません({0})\n", FileName));
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
LabelNo = 0;
|
|
|
|
|
|
if (LabelName != null && LabelName.Length > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (LabelName.IndexOf('*') == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
LabelName = LabelName.Substring(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
LabelNo = Akb.SearchLabel(KsNo, LabelName);
|
|
|
|
|
|
Debug.Assert(LabelNo >= 0, string.Format("AKB内に指定ラベルが見つかりません({0}:{1})\n", FileName, LabelName));
|
|
|
|
|
|
}
|
|
|
|
|
|
return LabelNo >= 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x0600019C RID: 412 RVA: 0x00007218 File Offset: 0x00005418
|
|
|
|
|
|
private static string GetString(string str, int pos)
|
|
|
|
|
|
{
|
|
|
|
|
|
int num = str.IndexOf('\0', pos);
|
|
|
|
|
|
return str.Substring(pos, num - pos);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x04000153 RID: 339
|
|
|
|
|
|
private static AKB_FILEHEADER m_Fh;
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x04000154 RID: 340
|
|
|
|
|
|
private static AKB_DIRINFO[] m_Dirs;
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x04000155 RID: 341
|
|
|
|
|
|
private static AKB_FILEINFO[] m_Files;
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x04000156 RID: 342
|
|
|
|
|
|
private static AKB_LABELINFO[] m_Labels;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|