Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
487
GameTools/GLOBALSCRIPT/Skill/SkillMgr.cpp
Normal file
487
GameTools/GLOBALSCRIPT/Skill/SkillMgr.cpp
Normal file
@@ -0,0 +1,487 @@
|
||||
#include "stdafx.h"
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Utility/Math/Math.h>
|
||||
#include <Utility/Compress/MiniLZO/MiniLZOWrapper.h>
|
||||
#include <Utility/Resource/EnsureCleanup.h>
|
||||
#include <Network/XORCrypt/XORCrypt.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include "SkillMgr.h"
|
||||
#include "../Utility/DelimitedFile.h"
|
||||
|
||||
#define DECODE_HEADER(Start_In, Length_In, PageVer_In, PageNum_In) CXORCrypt::GetInstance().DecodeHeader((Start_In),(Length_In),(PageVer_In),(PageNum_In))
|
||||
#define ENCODE_HEADER(Start_In, Length_In, PageVer_In, PageNum_In) CXORCrypt::GetInstance().EncodeHeader((Start_In),(Length_In),(PageVer_In),(PageNum_In))
|
||||
#define COMPRESS(In, In_len, Out, Out_len) CMiniLZOCompress::Compress((In), (In_len), (Out), (Out_len))
|
||||
#define DECOMPRESS(In, In_len, Out, Out_len) CMiniLZOCompress::Decompress((In), (In_len), (Out), (Out_len))
|
||||
|
||||
|
||||
CSkillMgr CSkillMgr::ms_this;
|
||||
|
||||
|
||||
#ifdef _TEST_SERVER_
|
||||
const char* CSkillMgr::ms_szSkillScriptFileName = "TestSkillScript.txt";
|
||||
#else
|
||||
const char* CSkillMgr::ms_szSkillScriptFileName = "SkillScript.txt";
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
CSkillMgr::CSkillMgr()
|
||||
: m_ProtoTypeArray(NULL)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CSkillMgr::~CSkillMgr()
|
||||
{
|
||||
ClearProtoType();
|
||||
}
|
||||
|
||||
void CSkillMgr::ClearProtoType()
|
||||
{
|
||||
if(NULL != m_ProtoTypeArray)
|
||||
{
|
||||
delete [] m_ProtoTypeArray;
|
||||
m_ProtoTypeArray = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool CSkillMgr::LoadSkillsFromFile(const char* szFileName)
|
||||
{
|
||||
using namespace Skill;
|
||||
|
||||
// <20>ӽú<D3BD><C3BA><EFBFBD><EFBFBD><EFBFBD>
|
||||
const int SKILL_ID_LEN = 32;
|
||||
char szBuffer[SKILL_ID_LEN];
|
||||
unsigned char chTempValue;
|
||||
|
||||
int nLineCount = 0;
|
||||
int nSkillCount = 0;
|
||||
CDelimitedFile DelimitedFile; // <20><>ü <20>Ҹ<EFBFBD><D2B8><EFBFBD>, <20>ڵ<EFBFBD> Close.
|
||||
|
||||
ProtoTypeArray tempProtoType;
|
||||
|
||||
// <20><>ũ<EFBFBD>ο<EFBFBD> <20>α<EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>.
|
||||
// <20><>ũ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD> \<5C>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
|
||||
// ( '<27>̽<EFBFBD><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>' <20><><EFBFBD><EFBFBD> <20><EFBFBD> )
|
||||
#define READ_DATA(ColumnName, Argument) \
|
||||
if(!DelimitedFile.ReadData(ColumnName, Argument)) \
|
||||
{ \
|
||||
ERRLOG2(g_Log, "<22><>ų <20><>ũ<EFBFBD><C5A9>Ʈ <20>б<EFBFBD> <20><><EFBFBD><EFBFBD> : %d<><64> %s<>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD>!", nLineCount, #ColumnName); \
|
||||
return false; \
|
||||
}
|
||||
|
||||
#define READ_STRING(ColumnName, Buffer, BufferSize) \
|
||||
if(!DelimitedFile.ReadString(ColumnName, Buffer, BufferSize)) \
|
||||
{\
|
||||
ERRLOG2(g_Log, "<22><>ų <20><>ũ<EFBFBD><C5A9>Ʈ <20>б<EFBFBD> <20><><EFBFBD><EFBFBD> : %d<><64> %s<>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD>!", nLineCount, #ColumnName);\
|
||||
return false;\
|
||||
}
|
||||
|
||||
#define READ_STRING_TO_TYPE_VALUE(saveType, saveValue, szColumn, TypeArray, nMaxType)\
|
||||
saveValue = static_cast<saveType>(ReadStringToTypeValue(DelimitedFile, szColumn, TypeArray, nMaxType));\
|
||||
if(nMaxType == saveValue)\
|
||||
{\
|
||||
ERRLOG2(g_Log, "<22><>ų <20><>ũ<EFBFBD><C5A9>Ʈ <20>б<EFBFBD> <20><><EFBFBD><EFBFBD> : %d<><64> %s<>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD>!", nLineCount, #szColumn); \
|
||||
return false;\
|
||||
}
|
||||
|
||||
if (!DelimitedFile.Open(szFileName ? szFileName : ms_szSkillScriptFileName, 1 /* HeadLine */))
|
||||
{
|
||||
ERRLOG1(g_Log, "%s <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.", szFileName ? szFileName : ms_szSkillScriptFileName);
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<ProtoTypeArray> ProtoTypeVector;
|
||||
|
||||
|
||||
while(DelimitedFile.ReadLine())
|
||||
{
|
||||
++nLineCount;
|
||||
|
||||
READ_STRING("ID", szBuffer, SKILL_ID_LEN);
|
||||
tempProtoType.m_ProtoTypes[nSkillCount].m_usSkill_ID = Math::Convert::StrToHex16(szBuffer);
|
||||
|
||||
READ_STRING_TO_TYPE_VALUE(Skill::Type::Type, tempProtoType.m_ProtoTypes[nSkillCount].m_eSkillType,
|
||||
"Type", Type::SkillTypes, Type::MAX_SKILL_TYPE);
|
||||
|
||||
READ_DATA("ClassSkill", chTempValue); tempProtoType.m_ProtoTypes[nSkillCount].m_bIsClassSkill = chTempValue != 0;
|
||||
READ_STRING("Name[5]", tempProtoType.m_ProtoTypes[nSkillCount].m_SpriteInfo.m_szName, ProtoType::MAX_SKILL_NAME);
|
||||
READ_STRING_TO_TYPE_VALUE(Skill::UseLimit::Type, tempProtoType.m_ProtoTypes[nSkillCount].m_eUseLimit,
|
||||
"Limit", UseLimit::UseLimits, UseLimit::MAX_USE_LIMIT);
|
||||
|
||||
READ_STRING_TO_TYPE_VALUE(unsigned char, tempProtoType.m_ProtoTypes[nSkillCount].m_StatusLimitType[0],
|
||||
"Stat[0]", StatusLimit::StatusLimits, StatusLimit::MAX_STATUS_LIMIT);
|
||||
READ_DATA("Value[0]", tempProtoType.m_ProtoTypes[nSkillCount].m_StatusLimitValue[0]);
|
||||
|
||||
READ_STRING_TO_TYPE_VALUE(unsigned char, tempProtoType.m_ProtoTypes[nSkillCount].m_StatusLimitType[1],
|
||||
"Stat[1]", StatusLimit::StatusLimits, StatusLimit::MAX_STATUS_LIMIT);
|
||||
READ_DATA("Value[1]", tempProtoType.m_ProtoTypes[nSkillCount].m_StatusLimitValue[1]);
|
||||
|
||||
READ_STRING_TO_TYPE_VALUE(Skill::Target::Type, tempProtoType.m_ProtoTypes[nSkillCount].m_eTargetType,
|
||||
"Target", Target::TargetTypes, Target::MAX_TARGET_TYPE);
|
||||
|
||||
READ_DATA("Range", tempProtoType.m_ProtoTypes[nSkillCount].m_EffectDistance);
|
||||
READ_DATA("Region", tempProtoType.m_ProtoTypes[nSkillCount].m_EffectExtent);
|
||||
READ_DATA("StartMP", tempProtoType.m_ProtoTypes[nSkillCount].m_StartMP);
|
||||
READ_DATA("LevelMP", tempProtoType.m_ProtoTypes[nSkillCount].m_LevelMP);
|
||||
READ_DATA("Starttick", tempProtoType.m_ProtoTypes[nSkillCount].m_StartTick);
|
||||
READ_DATA("LevelTick", tempProtoType.m_ProtoTypes[nSkillCount].m_LevelTick);
|
||||
READ_STRING("CastingFlag", tempProtoType.m_ProtoTypes[nSkillCount].m_szCastingFileName, ProtoType::MAX_FILE_NAME);
|
||||
READ_STRING("EffectFlag", tempProtoType.m_ProtoTypes[nSkillCount].m_szEffectFileName, ProtoType::MAX_FILE_NAME);
|
||||
READ_STRING("HitFlag", tempProtoType.m_ProtoTypes[nSkillCount].m_szHitFileName, ProtoType::MAX_FILE_NAME);
|
||||
READ_DATA("CoolDownTime", tempProtoType.m_ProtoTypes[nSkillCount].m_usCoolDownTime);
|
||||
READ_DATA("EndCoolDown", tempProtoType.m_ProtoTypes[nSkillCount].m_cEndCoolDown);
|
||||
READ_STRING("dds", tempProtoType.m_ProtoTypes[nSkillCount].m_SpriteInfo.m_szSpriteName, ProtoType::MAX_FILE_NAME);
|
||||
READ_DATA("MinX", tempProtoType.m_ProtoTypes[nSkillCount].m_SpriteInfo.m_nSpriteMinX);
|
||||
READ_DATA("MinY", tempProtoType.m_ProtoTypes[nSkillCount].m_SpriteInfo.m_nSpriteMinY);
|
||||
READ_DATA("MaxX", tempProtoType.m_ProtoTypes[nSkillCount].m_SpriteInfo.m_nSpriteMaxX);
|
||||
READ_DATA("MaxY", tempProtoType.m_ProtoTypes[nSkillCount].m_SpriteInfo.m_nSpriteMaxY);
|
||||
READ_DATA("Hit", tempProtoType.m_ProtoTypes[nSkillCount].m_cStrikeNum);
|
||||
READ_DATA("EndScript", tempProtoType.m_ProtoTypes[nSkillCount].m_cEndScript);
|
||||
READ_DATA("Protection", chTempValue); tempProtoType.m_ProtoTypes[nSkillCount].m_bProtection = chTempValue != 0;
|
||||
READ_DATA("Interrupt", chTempValue); tempProtoType.m_ProtoTypes[nSkillCount].m_bInterrupt = chTempValue != 0;
|
||||
|
||||
READ_DATA("Gauge", chTempValue); tempProtoType.m_ProtoTypes[nSkillCount].m_bGauge = chTempValue != 0;
|
||||
READ_DATA("MinRange", tempProtoType.m_ProtoTypes[nSkillCount].m_cMinRange);
|
||||
READ_DATA("MaxRange", tempProtoType.m_ProtoTypes[nSkillCount].m_cMaxRange);
|
||||
|
||||
if(tempProtoType.m_ProtoTypes[0].m_usSkill_ID != tempProtoType.m_ProtoTypes[nSkillCount].m_usSkill_ID)
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>ų <20><><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD>, <20><> <20><>ų<EFBFBD><C5B3> <20>ݵ<EFBFBD><DDB5><EFBFBD> <20><><EFBFBD><EFBFBD> ID<49><44>"
|
||||
" 5<><35><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD>;<EFBFBD> <20>մϴ<D5B4>. <20><><EFBFBD><EFBFBD> <20><>ų <20><>ȣ<EFBFBD><C8A3> %d, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d<>Դϴ<D4B4>.",
|
||||
tempProtoType.m_ProtoTypes[nSkillCount].m_usSkill_ID, nSkillCount);
|
||||
return false;
|
||||
}
|
||||
|
||||
tempProtoType.m_ProtoTypes[nSkillCount].m_cSpell_LockCount = nSkillCount;
|
||||
++nSkillCount;
|
||||
|
||||
if (MAX_SKILL_LOCKCOUNT == nSkillCount || tempProtoType.m_ProtoTypes[0].m_bIsClassSkill)
|
||||
{
|
||||
ProtoTypeVector.push_back(tempProtoType);
|
||||
|
||||
for(int nIndex = 0; nIndex < nSkillCount; ++nIndex)
|
||||
{
|
||||
tempProtoType.m_ProtoTypes[nIndex].Initialize();
|
||||
}
|
||||
|
||||
nSkillCount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
std::sort(ProtoTypeVector.begin(), ProtoTypeVector.end());
|
||||
|
||||
for(std::vector<ProtoTypeArray>::iterator itr = ProtoTypeVector.begin();
|
||||
itr != ProtoTypeVector.end() - 1; ++itr)
|
||||
{
|
||||
if(itr->m_ProtoTypes[0].m_usSkill_ID == (itr+1)->m_ProtoTypes[0].m_usSkill_ID)
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> ID<49><44> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD>ID:%d", itr->m_ProtoTypes[0].m_usSkill_ID);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
m_nSkillNum = ProtoTypeVector.size();
|
||||
m_ProtoTypeArray = new ProtoTypeArray[m_nSkillNum];
|
||||
if(NULL == m_ProtoTypeArray)
|
||||
{
|
||||
ERRLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ翡 <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.");
|
||||
return false;
|
||||
}
|
||||
|
||||
std::copy(ProtoTypeVector.begin(), ProtoTypeVector.end(), m_ProtoTypeArray);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
unsigned char CSkillMgr::ReadStringToTypeValue(CDelimitedFile& DelimitedFile, const char* szColumn,
|
||||
const CTypeName* TypeArray, const unsigned char nMaxType)
|
||||
{
|
||||
char szReadData[MAX_PATH];
|
||||
unsigned char nCount = 0;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>б<EFBFBD>.
|
||||
if (!DelimitedFile.ReadString(szColumn, szReadData, MAX_PATH))
|
||||
{
|
||||
ERRLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>б <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.");
|
||||
return nMaxType; // <20><><EFBFBD>н<EFBFBD> nMaxType<70><65> <20><><EFBFBD><EFBFBD>.
|
||||
}
|
||||
|
||||
for (nCount = 0; nCount < nMaxType; ++nCount)
|
||||
{
|
||||
if (0 == strcmp(szReadData, TypeArray[nCount].GetTypeName()))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (nCount == nMaxType)
|
||||
{
|
||||
ERRLOG0(g_Log, "<EFBFBD>о<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8> <20>迭<EFBFBD><E8BFAD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.");
|
||||
return nMaxType;
|
||||
}
|
||||
|
||||
return TypeArray[nCount].GetTypeValue();
|
||||
}
|
||||
|
||||
|
||||
|
||||
const Skill::ProtoType* CSkillMgr::GetSkillProtoType(unsigned short usSkill_ID)
|
||||
{
|
||||
ProtoTypeArray* lpFirst = m_ProtoTypeArray;
|
||||
ProtoTypeArray* lpLast = m_ProtoTypeArray + m_nSkillNum;
|
||||
ProtoTypeArray* lpMid = NULL;
|
||||
|
||||
size_t nCount = m_nSkillNum;
|
||||
size_t nCount2 = 0;
|
||||
|
||||
for (; 0 < nCount; )
|
||||
{
|
||||
nCount2 = nCount / 2;
|
||||
lpMid = lpFirst + nCount2;
|
||||
|
||||
if(lpMid->m_ProtoTypes[0].m_usSkill_ID < usSkill_ID)
|
||||
{
|
||||
lpFirst = ++lpMid, nCount -= nCount2 + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
nCount = nCount2;
|
||||
}
|
||||
}
|
||||
|
||||
return (lpFirst != lpLast && !(usSkill_ID < lpFirst->m_ProtoTypes[0].m_usSkill_ID)) ?
|
||||
lpFirst->m_ProtoTypes : NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool CSkillMgr::LoadSkillsFromBinary(const char* szFileNameBinary)
|
||||
{
|
||||
HANDLE hFile = CreateFile((0 == szFileNameBinary) ? ms_szSkillScriptFileName : szFileNameBinary,
|
||||
GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
|
||||
if (hFile == INVALID_HANDLE_VALUE) { return false; }
|
||||
|
||||
CEnsureCloseHandle hfile(hFile);
|
||||
|
||||
DWORD dwRead = 0;
|
||||
DWORD dwFileHighSize = 0;
|
||||
DWORD dwFileSize = GetFileSize(hFile, &dwFileHighSize);
|
||||
|
||||
char* lpAllocated = new char[dwFileSize];
|
||||
CEnsureDeleteArray<char> allocated(lpAllocated);
|
||||
|
||||
if(NULL == lpAllocated)
|
||||
{
|
||||
ERRLOG0(g_Log, "<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!ReadFile(hFile, lpAllocated, dwFileSize, &dwRead, NULL))
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD>б<EFBFBD> <20><><EFBFBD><EFBFBD> : %d<><64><EFBFBD><EFBFBD>", GetLastError());
|
||||
return false;
|
||||
}
|
||||
|
||||
DWORD dwHeaderSize = sizeof(DWORD) + *reinterpret_cast<DWORD*>(lpAllocated) + sizeof(DWORD);
|
||||
DWORD dwDecompressedSize = *reinterpret_cast<DWORD*>(lpAllocated + dwHeaderSize - sizeof(DWORD));
|
||||
|
||||
ClearProtoType();
|
||||
|
||||
m_nSkillNum = dwDecompressedSize/sizeof(ProtoTypeArray);
|
||||
m_ProtoTypeArray = new ProtoTypeArray[m_nSkillNum];
|
||||
if(NULL == m_ProtoTypeArray)
|
||||
{
|
||||
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>ų <20><>ũ<EFBFBD><C5A9>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҷ<EFBFBD><D2B7><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20><DEB8> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.");
|
||||
return false;
|
||||
}
|
||||
|
||||
DECOMPRESS(lpAllocated + dwHeaderSize, dwFileSize - dwHeaderSize,
|
||||
reinterpret_cast<char*>(m_ProtoTypeArray), &dwDecompressedSize);
|
||||
|
||||
DECODE_HEADER(reinterpret_cast<char*>(m_ProtoTypeArray), dwDecompressedSize, 0, 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CSkillMgr::SaveSkillsToBinary(const char* szFileNameBinary, const char* szTrashFile)
|
||||
{
|
||||
HANDLE hFile = CreateFile((0 == szFileNameBinary) ? ms_szSkillScriptFileName : szFileNameBinary,
|
||||
GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
|
||||
if (hFile == INVALID_HANDLE_VALUE) { return false; }
|
||||
|
||||
CEnsureCloseHandle file(hFile);
|
||||
|
||||
DWORD dwSkillSize = static_cast<DWORD>(sizeof(ProtoTypeArray) * m_nSkillNum);
|
||||
DWORD dwCompressSize = dwSkillSize;
|
||||
|
||||
char* lpSkill_Info = new char[dwSkillSize];
|
||||
char* lpCompressedInfo = new char[dwSkillSize];
|
||||
|
||||
if(NULL == lpSkill_Info || NULL == lpCompressedInfo)
|
||||
{
|
||||
ERRLOG0(g_Log, "<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.");
|
||||
return false;
|
||||
}
|
||||
|
||||
CEnsureDeleteArray<char> skill_info(lpSkill_Info);
|
||||
CEnsureDeleteArray<char> compress_info(lpCompressedInfo);
|
||||
|
||||
memcpy(lpSkill_Info, m_ProtoTypeArray, dwSkillSize);
|
||||
ENCODE_HEADER(lpSkill_Info, dwSkillSize, 0, 1);
|
||||
COMPRESS(lpSkill_Info, dwSkillSize, lpCompressedInfo, &dwCompressSize);
|
||||
|
||||
DWORD dwWritten = 0;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>) <20>ڷ<EFBFBD>
|
||||
HANDLE hTrashFile = CreateFile(szTrashFile, GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
|
||||
if (hTrashFile == INVALID_HANDLE_VALUE) { return false; }
|
||||
|
||||
CEnsureCloseHandle trashFile(hTrashFile);
|
||||
|
||||
DWORD dwRead = 0;
|
||||
DWORD dwFileHighSize = 0;
|
||||
DWORD dwFileSize = GetFileSize(hTrashFile, &dwFileHighSize);
|
||||
|
||||
char* lpAllocated = new char[dwFileSize];
|
||||
CEnsureDeleteArray<char> allocated(lpAllocated);
|
||||
|
||||
if (!ReadFile(hTrashFile, lpAllocated, dwFileSize, &dwRead, NULL))
|
||||
{
|
||||
ERRLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.");
|
||||
return false;
|
||||
}
|
||||
|
||||
WriteFile(hFile, &dwFileSize, sizeof(DWORD), &dwWritten, 0);
|
||||
WriteFile(hFile, lpAllocated, dwFileSize, &dwWritten, 0);
|
||||
|
||||
// <20>ùٸ<C3B9> <20>ڷ<EFBFBD>
|
||||
WriteFile(hFile, &dwSkillSize, sizeof(DWORD), &dwWritten, 0);
|
||||
WriteFile(hFile, lpCompressedInfo, dwCompressSize, &dwWritten, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
#ifndef _RYL_GAME_CLIENT_
|
||||
|
||||
void CSkillMgr::ProcessSkillException(SKILL* pSkill, unsigned short cClass)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8><EFBFBD> <20>α뿡<D7BF><EBBFA1> <20><><EFBFBD>ؽſ<D8BD><C5BF><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2>鼭 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ƾ
|
||||
bool IsDaggerMastery = false;
|
||||
for (int nSkillIndex = 0; nSkillIndex < pSkill->wSlotNum; nSkillIndex++)
|
||||
{
|
||||
if (pSkill->SSlot[nSkillIndex].SKILLINFO.wSkill == 0x8202)
|
||||
{
|
||||
pSkill->wSkillNum -= (pSkill->SSlot[nSkillIndex].SKILLINFO.cLockCount * (SKILLSLOT::MAX_SKILL_LEVEL - 1) +
|
||||
pSkill->SSlot[nSkillIndex].SKILLINFO.cSkillLevel);
|
||||
IsDaggerMastery = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (true == IsDaggerMastery) {
|
||||
pSkill->SSlot[nSkillIndex-1] = pSkill->SSlot[nSkillIndex];
|
||||
}
|
||||
}
|
||||
|
||||
if (true == IsDaggerMastery)
|
||||
{
|
||||
pSkill->SSlot[nSkillIndex-1] = SKILLSLOT();
|
||||
pSkill->wSlotNum--;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20>Ĺ<EFBFBD><C4B9><EFBFBD>Ʈ<EFBFBD>뿡<EFBFBD><EBBFA1> <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2>鼭 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ƾ
|
||||
bool IsNet = false;
|
||||
for (int nSkillIndex = 0; nSkillIndex < pSkill->wSlotNum; nSkillIndex++)
|
||||
{
|
||||
if (pSkill->SSlot[nSkillIndex].SKILLINFO.wSkill == 0x9101)
|
||||
{
|
||||
IsNet = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (true == IsNet) {
|
||||
pSkill->SSlot[nSkillIndex-1] = pSkill->SSlot[nSkillIndex];
|
||||
}
|
||||
}
|
||||
|
||||
if (true == IsNet)
|
||||
{
|
||||
pSkill->SSlot[nSkillIndex-1] = SKILLSLOT();
|
||||
pSkill->wSlotNum--;
|
||||
}
|
||||
|
||||
// Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>ų <20>־<EFBFBD><D6BE>ֱ<EFBFBD>
|
||||
unsigned short usClassSkillID = NULL;
|
||||
bool IsClassSkill = false;
|
||||
|
||||
usClassSkillID = CClass::GetClassSkillID(static_cast<unsigned char>(cClass));
|
||||
if (NULL != usClassSkillID)
|
||||
{
|
||||
for (int nSkillIndex = 0; nSkillIndex < pSkill->wSlotNum; nSkillIndex++)
|
||||
{
|
||||
if (pSkill->SSlot[nSkillIndex].SKILLINFO.wSkill == usClassSkillID)
|
||||
{
|
||||
IsClassSkill = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (false == IsClassSkill)
|
||||
{
|
||||
pSkill->SSlot[pSkill->wSlotNum] = SKILLSLOT(usClassSkillID, 0, 1);
|
||||
pSkill->wSlotNum++;
|
||||
}
|
||||
}
|
||||
|
||||
usClassSkillID = NULL;
|
||||
IsClassSkill = false;
|
||||
|
||||
if (CClass::JOB_CHANGE_1ST == CClass::GetJobLevel(static_cast<unsigned char>(cClass)))
|
||||
{
|
||||
usClassSkillID = CClass::GetClassSkillID(CClass::GetPreviousJob(static_cast<unsigned char>(cClass)));
|
||||
if (NULL != usClassSkillID)
|
||||
{
|
||||
for (int nSkillIndex = 0; nSkillIndex < pSkill->wSlotNum; nSkillIndex++)
|
||||
{
|
||||
if (pSkill->SSlot[nSkillIndex].SKILLINFO.wSkill == usClassSkillID)
|
||||
{
|
||||
IsClassSkill = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (false == IsClassSkill)
|
||||
{
|
||||
pSkill->SSlot[pSkill->wSlotNum] = SKILLSLOT(usClassSkillID, 0, 1);
|
||||
pSkill->wSlotNum++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
pSkill->wSkillNum = 0;
|
||||
for (int nSkillIndex = 0; nSkillIndex < pSkill->wSlotNum; nSkillIndex++)
|
||||
{
|
||||
Skill::LPProtoType lpProtoType = GetSkillProtoType(pSkill->SSlot[nSkillIndex].SKILLINFO.wSkill);
|
||||
if (NULL != lpProtoType)
|
||||
{
|
||||
if (false == lpProtoType->m_bIsClassSkill)
|
||||
{
|
||||
pSkill->wSkillNum += (pSkill->SSlot[nSkillIndex].SKILLINFO.cLockCount *
|
||||
(SKILLSLOT::MAX_SKILL_LEVEL - 1) + pSkill->SSlot[nSkillIndex].SKILLINFO.cSkillLevel);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
*/
|
||||
70
GameTools/GLOBALSCRIPT/Skill/SkillMgr.h
Normal file
70
GameTools/GLOBALSCRIPT/Skill/SkillMgr.h
Normal file
@@ -0,0 +1,70 @@
|
||||
#ifndef _SKILL_MGR_H_
|
||||
#define _SKILL_MGR_H_
|
||||
|
||||
#define g_SkillMgr CSkillMgr::GetInstance()
|
||||
#include <limits>
|
||||
#include <Pattern/Singleton.h>
|
||||
#include "SkillStructure.h"
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
class CDelimitedFile;
|
||||
|
||||
|
||||
class CSkillMgr : public CSingleton<CSkillMgr>
|
||||
{
|
||||
public:
|
||||
|
||||
enum _Const
|
||||
{
|
||||
MAX_SKILL_LOCKCOUNT = 5, // <20><>ų<EFBFBD><C5B3> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> (<28><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŭ ProtoType<70><65> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>)
|
||||
MAX_SKILL_LEVEL = 7, // <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD>
|
||||
|
||||
PARTY_SPELL = 0x80, // <20><>Ƽ <20>ֹ<EFBFBD><D6B9><EFBFBD> <20><>Ʈ
|
||||
MAX_SKILL_PER_STATUS = 16, // æƮ<C3A6><C6AE> <20><>æƮ<C3A6><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
NORMAL_SKILL = -1,
|
||||
MULTI_TARGET_SKILL = 1 // Ÿ<><C5B8> Ÿ<><C5B8> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD> MP<4D><50> <20>Ҹ<EFBFBD><D2B8>Ѵ<EFBFBD>)
|
||||
};
|
||||
|
||||
unsigned int GetRange(unsigned short usSkill_ID);
|
||||
|
||||
bool LoadSkillsFromFile(const char* szFileName = 0);
|
||||
bool LoadSkillsFromBinary(const char* szFileNameBinary = 0);
|
||||
bool SaveSkillsToBinary(const char* szFileNameBinary = 0, const char* szTrashFile = 0);
|
||||
|
||||
void ClearProtoType();
|
||||
|
||||
const Skill::ProtoType* GetSkillProtoType(unsigned short usSkill_ID);
|
||||
|
||||
/*
|
||||
// <20><>Ÿ <20>ҵ<DEBC>
|
||||
#ifndef _RYL_GAME_CLIENT_
|
||||
void ProcessSkillException(SKILL* pSkill, unsigned short cClass);
|
||||
#endif
|
||||
*/
|
||||
|
||||
~CSkillMgr();
|
||||
|
||||
private:
|
||||
|
||||
CSkillMgr();
|
||||
|
||||
struct ProtoTypeArray
|
||||
{
|
||||
Skill::ProtoType m_ProtoTypes[MAX_SKILL_LOCKCOUNT];
|
||||
inline bool operator < (ProtoTypeArray& rhs)
|
||||
{ return m_ProtoTypes[0].m_usSkill_ID < rhs.m_ProtoTypes[0].m_usSkill_ID; }
|
||||
};
|
||||
|
||||
static const char* ms_szSkillScriptFileName;
|
||||
static CSkillMgr ms_this;
|
||||
|
||||
ProtoTypeArray* m_ProtoTypeArray;
|
||||
size_t m_nSkillNum;
|
||||
|
||||
// <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>, <20>˸<EFBFBD><CBB8><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD>н<EFBFBD> nMaxType<70><65> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
unsigned char ReadStringToTypeValue(CDelimitedFile& DelimitedFile, const char* szColumn,
|
||||
const CTypeName* TypeArray, const unsigned char nMaxType);
|
||||
};
|
||||
|
||||
#endif
|
||||
86
GameTools/GLOBALSCRIPT/Skill/SkillStructure.cpp
Normal file
86
GameTools/GLOBALSCRIPT/Skill/SkillStructure.cpp
Normal file
@@ -0,0 +1,86 @@
|
||||
#include "stdafx.h"
|
||||
#include <algorithm>
|
||||
#include "SkillStructure.h"
|
||||
|
||||
|
||||
const CTypeName Skill::Type::SkillTypes[MAX_SKILL_TYPE] =
|
||||
{
|
||||
CTypeName(Skill::Type::NONE, "NONE"),
|
||||
CTypeName(Skill::Type::PASSIVE, "PASSIVE"),
|
||||
CTypeName(Skill::Type::INSTANCE, "INSTANCE"),
|
||||
CTypeName(Skill::Type::CAST, "CAST"),
|
||||
CTypeName(Skill::Type::CHANT, "CHANT"),
|
||||
CTypeName(Skill::Type::ENCHANT, "ENCHANT")
|
||||
};
|
||||
|
||||
|
||||
const CTypeName Skill::UseLimit::UseLimits[MAX_USE_LIMIT] =
|
||||
{
|
||||
CTypeName(Skill::UseLimit::NONE, "NONE"),
|
||||
CTypeName(Skill::UseLimit::FOR_FIGHTER, "FORFIGHTER"),
|
||||
CTypeName(Skill::UseLimit::WITH_SHIELD, "WITHSHIELD"),
|
||||
CTypeName(Skill::UseLimit::FOR_FIGHTER_TWOHANDED, "FORFIGHTERTWOHAND"),
|
||||
CTypeName(Skill::UseLimit::FOR_ALL_ONEHAND, "FORALLONEHAND"),
|
||||
CTypeName(Skill::UseLimit::WITH_DAGGER, "WITHDAGGER"),
|
||||
CTypeName(Skill::UseLimit::WITH_THROWING_DAGGER, "WITHTHROWINGDAGGER"),
|
||||
CTypeName(Skill::UseLimit::RANGED, "RANGED"),
|
||||
CTypeName(Skill::UseLimit::LEFT_ARM, "LEFTARM"),
|
||||
CTypeName(Skill::UseLimit::GUARD_ARM, "GUARDARM"),
|
||||
CTypeName(Skill::UseLimit::WITH_WEAPON, "WITHWEAPON"),
|
||||
CTypeName(Skill::UseLimit::ATTACK_ARM, "ATTACKARM"),
|
||||
CTypeName(Skill::UseLimit::GUN_ARM, "GUNARM"),
|
||||
CTypeName(Skill::UseLimit::KNIFE_ARM, "KNIFEARM"),
|
||||
CTypeName(Skill::UseLimit::WITH_CLOW, "WITHCLOW")
|
||||
};
|
||||
|
||||
|
||||
const CTypeName Skill::StatusLimit::StatusLimits[MAX_STATUS_LIMIT] =
|
||||
{
|
||||
CTypeName(Skill::StatusLimit::NONE, "NONE"),
|
||||
CTypeName(Skill::StatusLimit::STR, "STR"),
|
||||
CTypeName(Skill::StatusLimit::DEX, "DEX"),
|
||||
CTypeName(Skill::StatusLimit::CON, "CON"),
|
||||
CTypeName(Skill::StatusLimit::INT, "INT"),
|
||||
CTypeName(Skill::StatusLimit::WIS, "WIS")
|
||||
};
|
||||
|
||||
|
||||
const CTypeName Skill::Target::TargetTypes[MAX_TARGET_TYPE] =
|
||||
{
|
||||
CTypeName(Skill::Target::NONE, "NONE"),
|
||||
CTypeName(Skill::Target::MELEE, "MELEE"),
|
||||
CTypeName(Skill::Target::FRIEND, "FRIEND"),
|
||||
CTypeName(Skill::Target::ENEMY, "ENEMY"),
|
||||
CTypeName(Skill::Target::DEAD_FRIEND, "FRDEAD"),
|
||||
CTypeName(Skill::Target::DEAD_ENEMY, "ENDEAD"),
|
||||
CTypeName(Skill::Target::FRIEND_OBJECT, "FROBJ"),
|
||||
CTypeName(Skill::Target::ENEMY_OBJECT, "ENOBJ"),
|
||||
CTypeName(Skill::Target::PARTY, "PARTY"),
|
||||
CTypeName(Skill::Target::FRIEND_EXCEPT_SELF, "FREXME"),
|
||||
CTypeName(Skill::Target::LINE_ENEMY, "ENLINE")
|
||||
};
|
||||
|
||||
|
||||
Skill::ProtoType::ProtoType() { Initialize(); }
|
||||
|
||||
void Skill::ProtoType::Initialize()
|
||||
{
|
||||
m_eSkillType = Type::NONE;
|
||||
m_eUseLimit = UseLimit::NONE;
|
||||
m_eTargetType = Target::NONE;
|
||||
|
||||
m_EffectDistance = m_EffectExtent = 0.0f;
|
||||
|
||||
m_bInterrupt = m_bProtection = m_bGauge = m_bIsClassSkill = false;
|
||||
m_cStrikeNum = m_cSpell_LockCount = m_cEndScript = m_cEndCoolDown = m_cMinRange = m_cMaxRange = 0;
|
||||
m_usSkill_ID = m_StartMP = m_LevelMP = m_StartTick = m_LevelTick = m_usCoolDownTime = 0;
|
||||
|
||||
m_SpriteInfo.Initialize();
|
||||
|
||||
std::fill_n(&m_StatusLimitType[0], int(MAX_LIMIT_NUM), 0);
|
||||
std::fill_n(&m_StatusLimitValue[0], int(MAX_LIMIT_NUM), 0);
|
||||
|
||||
std::fill_n(&m_szEffectFileName[0], int(MAX_FILE_NAME), 0);
|
||||
std::fill_n(&m_szHitFileName[0], int(MAX_FILE_NAME), 0);
|
||||
std::fill_n(&m_szCastingFileName[0], int(MAX_FILE_NAME), 0);
|
||||
}
|
||||
162
GameTools/GLOBALSCRIPT/Skill/SkillStructure.h
Normal file
162
GameTools/GLOBALSCRIPT/Skill/SkillStructure.h
Normal file
@@ -0,0 +1,162 @@
|
||||
#ifndef _SKILL_STRUCTURE_H_
|
||||
#define _SKILL_STRUCTURE_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "../Utility/TypeArray.h"
|
||||
#include "../Item/ItemStructure.h"
|
||||
|
||||
#pragma pack(8)
|
||||
|
||||
namespace Skill
|
||||
{
|
||||
enum { SkillMask = 0x8000 };
|
||||
|
||||
namespace Type
|
||||
{
|
||||
enum Type
|
||||
{
|
||||
NONE = 0,
|
||||
PASSIVE = 1,
|
||||
INSTANCE = 2,
|
||||
CAST = 3,
|
||||
CHANT = 4,
|
||||
ENCHANT = 5,
|
||||
MAX_SKILL_TYPE = 6
|
||||
};
|
||||
|
||||
extern const CTypeName SkillTypes[MAX_SKILL_TYPE];
|
||||
};
|
||||
|
||||
namespace UseLimit
|
||||
{
|
||||
enum Type
|
||||
{
|
||||
NONE = 0,
|
||||
|
||||
// <20>ΰ<EFBFBD>
|
||||
FOR_FIGHTER = 1, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǽ<EFBFBD> Ȱ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ұ<EFBFBD>
|
||||
WITH_SHIELD = 2, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><><EFBFBD>а<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
|
||||
FOR_FIGHTER_TWOHANDED = 3, // <20><><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) : <20><><EFBFBD>չ<EFBFBD><D5B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>쿡<EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
FOR_ALL_ONEHAND = 4, // <20>Ѽչ<D1BC><D5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><><EFBFBD>չ<EFBFBD><D5B9>⳪ <20>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD>δ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
WITH_DAGGER = 5, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
WITH_THROWING_DAGGER = 6, // <20><><EFBFBD><EFBFBD><EFBFBD>״<EFBFBD><D7B4>żҸ<C5BC> : <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ű<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. (<28>տ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD>.)
|
||||
RANGED = 7, // Ȱ/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ȭ<><C8AD><EFBFBD>Ҹ<EFBFBD> : Ȱ<>̳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20>ְ<EFBFBD> <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> ȭ<><C8AD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
|
||||
// <20><>ĭ
|
||||
LEFT_ARM = 8, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
GUARD_ARM = 9, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
WITH_WEAPON = 10, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǽ<EFBFBD><C7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
ATTACK_ARM = 11, // <20><><EFBFBD>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD> : <20><><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
GUN_ARM = 12, // <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> ź<><C5BA><EFBFBD>Ҹ<EFBFBD> : <20><><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> ź<><C5BA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
KNIFE_ARM = 13, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
WITH_CLOW = 14, // Ŭ<>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD> : Ŭ<>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
|
||||
MAX_USE_LIMIT = 15
|
||||
};
|
||||
|
||||
extern const CTypeName UseLimits[MAX_USE_LIMIT];
|
||||
};
|
||||
|
||||
namespace StatusLimit // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
{
|
||||
enum Type
|
||||
{
|
||||
NONE = 0, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
STR = 1, // STR<54><52> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD> <20>ʿ<EFBFBD>
|
||||
DEX = 2, // DEX<45><58> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD> <20>ʿ<EFBFBD>
|
||||
CON = 3, // CON<4F><4E> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD> <20>ʿ<EFBFBD>
|
||||
INT = 4, // INT<4E><54> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD> <20>ʿ<EFBFBD>
|
||||
WIS = 5, // WIS<49><53> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD> <20>ʿ<EFBFBD>
|
||||
MAX_STATUS_LIMIT = 6
|
||||
};
|
||||
|
||||
extern const CTypeName StatusLimits[MAX_STATUS_LIMIT];
|
||||
};
|
||||
|
||||
namespace Target
|
||||
{
|
||||
enum Type
|
||||
{
|
||||
NONE = 0,
|
||||
MELEE = 1,
|
||||
FRIEND = 2,
|
||||
ENEMY = 3,
|
||||
DEAD_FRIEND = 4,
|
||||
DEAD_ENEMY = 5,
|
||||
FRIEND_OBJECT = 6,
|
||||
ENEMY_OBJECT = 7,
|
||||
PARTY = 8,
|
||||
FRIEND_EXCEPT_SELF = 9,
|
||||
LINE_ENEMY = 10,
|
||||
MAX_TARGET_TYPE = 11
|
||||
};
|
||||
|
||||
extern const CTypeName TargetTypes[MAX_TARGET_TYPE];
|
||||
};
|
||||
|
||||
|
||||
struct ProtoType
|
||||
{
|
||||
enum { MAX_LIMIT_NUM = 2, MAX_FILE_NAME = 32, MAX_SKILL_NAME = 32 };
|
||||
|
||||
//-----------------------------------
|
||||
|
||||
char m_szEffectFileName[MAX_FILE_NAME];
|
||||
char m_szHitFileName[MAX_FILE_NAME];
|
||||
char m_szCastingFileName[MAX_FILE_NAME];
|
||||
Item::SpriteData m_SpriteInfo;
|
||||
|
||||
//-----------------------------------
|
||||
|
||||
Type::Type m_eSkillType; // See Namespace Type
|
||||
Target::Type m_eTargetType; // See Namespace Target
|
||||
UseLimit::Type m_eUseLimit; // See Namespace UseLimit
|
||||
|
||||
unsigned char m_StatusLimitType[MAX_LIMIT_NUM];
|
||||
char m_StatusLimitValue[MAX_LIMIT_NUM];
|
||||
|
||||
//-----------------------------------
|
||||
|
||||
unsigned short m_usSkill_ID;
|
||||
unsigned short m_StartMP;
|
||||
unsigned short m_LevelMP;
|
||||
unsigned short m_StartTick;
|
||||
|
||||
//-----------------------------------
|
||||
|
||||
unsigned short m_LevelTick;
|
||||
unsigned short m_usCoolDownTime;
|
||||
|
||||
//-----------------------------------
|
||||
|
||||
float m_EffectDistance;
|
||||
float m_EffectExtent;
|
||||
|
||||
//-----------------------------------
|
||||
|
||||
bool m_bProtection;
|
||||
bool m_bGauge;
|
||||
bool m_bIsClassSkill;
|
||||
bool m_bInterrupt;
|
||||
unsigned char m_cEndScript;
|
||||
unsigned char m_cEndCoolDown;
|
||||
unsigned char m_cMinRange;
|
||||
unsigned char m_cMaxRange;
|
||||
|
||||
//-----------------------------------
|
||||
|
||||
unsigned char m_cStrikeNum;
|
||||
unsigned char m_cSpell_LockCount;
|
||||
unsigned char m_cPadding[6];
|
||||
|
||||
//-----------------------------------
|
||||
|
||||
ProtoType();
|
||||
void Initialize();
|
||||
};
|
||||
}
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user