diff --git a/Source/Contents/JobCodeForItem.cpp b/Source/Contents/JobCodeForItem.cpp new file mode 100644 index 00000000..21306ad4 --- /dev/null +++ b/Source/Contents/JobCodeForItem.cpp @@ -0,0 +1,125 @@ +#include "Contents/JobCodeForItem.h" +#include "Contents/Jobs/JobId.h" + +// OFFSET: 0x006C7720 +// OFFSET: 0x006C7920 +// OFFSET: 0x006C7B30 +// OFFSET: 0x006C7D40 +// OFFSET: 0x006C7F60 +// OFFSET: 0x006C8180 +// OFFSET: 0x006C83A0 +// OFFSET: 0x006C85D0 +// OFFSET: 0x006C8810 +// FUNCTION: fn_06421 +// FUNCTION: fn_06422 +// FUNCTION: fn_06423 +// FUNCTION: fn_06424 +// FUNCTION: fn_06425 +// FUNCTION: fn_06426 +// FUNCTION: fn_06427 +// FUNCTION: fn_06428 +// FUNCTION: fn_06429 +template +void CJobCodeForItem::AddJobCodeFromGroups(unsigned long code, Groups... groups) { + std::set groupSet = {static_cast(groups)...}; + if (!groupSet.empty()) { + std::set jobs; + for (const unsigned int& group : groupSet) { + auto groupIt = this->m_jobGroups.find(group); + if (groupIt != this->m_jobGroups.end()) { + jobs.merge(std::set(groupIt->second)); + } + } + + auto it = this->m_jobCodes.find(code); + if (it == this->m_jobCodes.end()) { + this->m_jobCodes[code] = jobs; + } else { + it->second.merge(jobs); + } + } +} + +template void CJobCodeForItem::AddJobCodeFromGroups(unsigned long, int, int, int, int, int, int, int, int, int, int, int); +template void CJobCodeForItem::AddJobCodeFromGroups(unsigned long, int, int, int, int, int, int, int, int, int); +template void CJobCodeForItem::AddJobCodeFromGroups(unsigned long, int, int, int, int, int, int, int); +template void CJobCodeForItem::AddJobCodeFromGroups(unsigned long, int, int, int, int, int, int); +template void CJobCodeForItem::AddJobCodeFromGroups(unsigned long, int, int, int, int, int); +template void CJobCodeForItem::AddJobCodeFromGroups(unsigned long, int, int, int, int); +template void CJobCodeForItem::AddJobCodeFromGroups(unsigned long, int, int, int); +template void CJobCodeForItem::AddJobCodeFromGroups(unsigned long, int, int); +template void CJobCodeForItem::AddJobCodeFromGroups(unsigned long, int); + +// OFFSET: 0x006C8A50 +// OFFSET: 0x006C8B10 +// OFFSET: 0x006C8BD0 +// OFFSET: 0x006C8CB0 +// OFFSET: 0x006C8D90 +// OFFSET: 0x006C8F60 +// OFFSET: 0x006C9050 +// FUNCTION: fn_06430 +// FUNCTION: fn_06431 +// FUNCTION: fn_06432 +// FUNCTION: fn_06433 +// FUNCTION: fn_06434 +// FUNCTION: fn_06435 +// FUNCTION: fn_06436 +template +void CJobCodeForItem::AddJobCode(unsigned long code, Jobs... jobs) { + std::set jobSet = {jobs...}; + if (!jobSet.empty()) { + auto it = this->m_jobCodes.find(code); + if (it == this->m_jobCodes.end()) { + this->m_jobCodes[code] = jobSet; + } else { + it->second.merge(jobSet); + } + } +} + +template void CJobCodeForItem::AddJobCode(unsigned long, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId); +template void CJobCodeForItem::AddJobCode(unsigned long, JobId, JobId, JobId, JobId, JobId, JobId, JobId); +template void CJobCodeForItem::AddJobCode(unsigned long, JobId, JobId, JobId, JobId, JobId); +template void CJobCodeForItem::AddJobCode(unsigned long, JobId, JobId, JobId, JobId); +template void CJobCodeForItem::AddJobCode(unsigned long, JobId, JobId, JobId); +template void CJobCodeForItem::AddJobCode(unsigned long, JobId, JobId); +template void CJobCodeForItem::AddJobCode(unsigned long, JobId); + +// OFFSET: 0x006C9270 +// OFFSET: 0x006C9350 +// OFFSET: 0x006C9430 +// OFFSET: 0x006C9510 +// OFFSET: 0x006C9600 +// OFFSET: 0x006C96F0 +// OFFSET: 0x006C98F0 +// OFFSET: 0x006C9A00 +// FUNCTION: fn_06437 +// FUNCTION: fn_06438 +// FUNCTION: fn_06439 +// FUNCTION: fn_06440 +// FUNCTION: fn_06441 +// FUNCTION: fn_06442 +// FUNCTION: fn_06443 +// FUNCTION: fn_06444 +template +void CJobCodeForItem::AddJobGroup(unsigned int group, Jobs... jobs) { + std::set jobSet = {jobs...}; + if (!jobSet.empty()) { + auto it = this->m_jobGroups.find(group); + if (it == this->m_jobGroups.end()) { + this->m_jobGroups[group] = jobSet; + } else { + it->second.merge(jobSet); + } + } +} + +template void CJobCodeForItem::AddJobGroup(unsigned int, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId, + JobId, JobId, JobId); +template void CJobCodeForItem::AddJobGroup(unsigned int, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId); +template void CJobCodeForItem::AddJobGroup(unsigned int, JobId, JobId, JobId, JobId, JobId, JobId, JobId, JobId); +template void CJobCodeForItem::AddJobGroup(unsigned int, JobId, JobId, JobId, JobId, JobId, JobId, JobId); +template void CJobCodeForItem::AddJobGroup(unsigned int, JobId, JobId, JobId, JobId, JobId, JobId); +template void CJobCodeForItem::AddJobGroup(unsigned int, JobId, JobId, JobId, JobId, JobId); +template void CJobCodeForItem::AddJobGroup(unsigned int, JobId, JobId, JobId, JobId); +template void CJobCodeForItem::AddJobGroup(unsigned int, JobId, JobId, JobId); diff --git a/Source/Contents/JobCodeForItem.h b/Source/Contents/JobCodeForItem.h new file mode 100644 index 00000000..70b6f08a --- /dev/null +++ b/Source/Contents/JobCodeForItem.h @@ -0,0 +1,26 @@ +#ifndef RAGNAROK_SOURCE_CONTENTS_JOBCODEFORITEM_H +#define RAGNAROK_SOURCE_CONTENTS_JOBCODEFORITEM_H + +#include "Utility/Singleton.h" + +#include +#include + +class CJobCodeForItem : public Singleton { +public: + /* 0004 */ std::map> m_jobGroups; + /* 000C */ std::map> m_jobCodes; + + template + void AddJobCodeFromGroups(unsigned long code, Groups... groups); + template + void AddJobCode(unsigned long code, Jobs... jobs); + template + void AddJobGroup(unsigned int group, Jobs... jobs); +}; + +#if defined(_WIN32) && !defined(_WIN64) +static_assert(sizeof(CJobCodeForItem) == 0x14); +#endif + +#endif diff --git a/data/compile.json b/data/compile.json index 9c870f91..8d78ccdd 100644 --- a/data/compile.json +++ b/data/compile.json @@ -478,6 +478,7 @@ "Source/Contents/Items/ItemResources.cpp": 4, "Source/Contents/Items/RuneSystem.cpp": 4, "Source/Contents/Items/SelectPackageItemMgr.cpp": 4, + "Source/Contents/JobCodeForItem.cpp": 4, "Source/Contents/Jobs/JobInheritance.cpp": 4, "Source/Contents/Jobs/JobNameInitialization.cpp": 4, "Source/Contents/Jobs/JobNames.cpp": 4,