DragonNest/GameCommon/DnCostumeMixDataMgr.cpp

483 lines
14 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "DnCommonDef.h"
#include "DnCostumeMixDataMgr.h"
#ifdef _CLIENT
#include "DnItem.h"
#include "DnParts.h"
#include "DnCommonUtil.h"
#endif // _CLIENT
#include "Log.h"
extern CLog g_Log;
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CDnCostumeMixDataMgr::CDnCostumeMixDataMgr()
{
#ifdef _CLIENT
m_CurrentClassId = -1;
#endif
#if defined _JP || defined _TW || defined _RDEBUG || defined _DEBUG || defined _WORK || defined _KR || defined _KRAZ
m_bEnableCostumeMix = true;
#else
m_bEnableCostumeMix = false;
#endif
#if defined _JP || defined _RDEBUG || defined _DEBUG || defined _WORK || defined _KR || defined _KRAZ
m_bEnableCostumeDesignMix = true;
#else
m_bEnableCostumeDesignMix = false;
#endif
}
CDnCostumeMixDataMgr::MIX_RESULT_LIST& CDnCostumeMixDataMgr::GetResultItemList(int classType, int equipType)
{
std::map<int, MIXPARTS_RESULT_LIST>::iterator resIter = m_CostumeResultList.find(classType);
if (resIter != m_CostumeResultList.end())
{
MIXPARTS_RESULT_LIST& mixList = (*resIter).second;
MIXPARTS_RESULT_LIST::iterator partsResIter = mixList.find(equipType);
if (partsResIter != mixList.end())
return (*partsResIter).second;
MIX_RESULT_LIST curList;
mixList.insert(std::make_pair(equipType, curList));
MIXPARTS_RESULT_LIST::iterator retIter = mixList.find(equipType);
return (*retIter).second;
}
MIXPARTS_RESULT_LIST resultList;
MIX_RESULT_LIST itemList;
resultList.insert(std::make_pair(equipType, itemList));
m_CostumeResultList.insert(std::make_pair(classType, resultList));
std::map<int, MIXPARTS_RESULT_LIST>::iterator tmpIter = m_CostumeResultList.find(classType);
MIXPARTS_RESULT_LIST& tmpList = (*tmpIter).second;
MIXPARTS_RESULT_LIST::iterator retIter = tmpList.find(equipType);
return (*retIter).second;
}
const CDnCostumeMixDataMgr::MIX_RESULT_LIST* CDnCostumeMixDataMgr::GetMixResultItemList(int classType, int equipType) const
{
std::map<int, MIXPARTS_RESULT_LIST>::const_iterator resIter = m_CostumeResultList.find(classType);
if (resIter != m_CostumeResultList.end())
{
const MIXPARTS_RESULT_LIST& mixList = (*resIter).second;
MIXPARTS_RESULT_LIST::const_iterator partsResIter = mixList.find(equipType);
if (partsResIter != mixList.end())
return &((*partsResIter).second);
}
return NULL;
}
#if defined (_WORK) && defined (_SERVER)
bool CDnCostumeMixDataMgr::LoadData(bool bReload/* = false*/)
#else //#if defined (_WORK) && defined (_SERVER)
bool CDnCostumeMixDataMgr::LoadData()
#endif //#if defined (_WORK) && defined (_SERVER)
{
if (IsEnableCostumeMix() == false)
return true;
#if defined (_WORK) && defined (_SERVER)
DNTableFileFormat* pItemDropTable;
if (bReload)
pItemDropTable = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TITEMDROP);
else
pItemDropTable = GetDNTable(CDnTableDB::TITEMDROP);
if (pItemDropTable == NULL)
{
g_Log.Log( LogType::_FILELOG, L"ItemDropTable.ext failed\r\n");
return false;
}
DNTableFileFormat* pCosMixSox;
if (bReload)
pCosMixSox = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TCOSMIX);
else
pCosMixSox = GetDNTable(CDnTableDB::TCOSMIX);
if (pCosMixSox == NULL)
{
g_Log.Log( LogType::_FILELOG, L"CosmixTable.ext.ext failed\r\n");
return false;
}
#else //#if defined (_WORK) && defined (_SERVER)
DNTableFileFormat* pItemDropTable = GetDNTable(CDnTableDB::TITEMDROP);
if (pItemDropTable == NULL)
{
g_Log.Log( LogType::_FILELOG, L"ItemDropTable.ext failed\r\n");
return false;
}
DNTableFileFormat* pCosMixSox = GetDNTable(CDnTableDB::TCOSMIX);
if (pCosMixSox == NULL)
{
g_Log.Log( LogType::_FILELOG, L"CosmixTable.ext.ext failed\r\n");
return false;
}
#endif //#if defined (_WORK) && defined (_SERVER)
#if defined (_WORK) && defined (_SERVER)
if (bReload)
{
m_CosMixDropList.clear();
m_CostumeResultList.clear();
}
#endif //#if defined (_WORK) && defined (_SERVER)
#ifndef _CLIENT
int nPrevMinScore = 0;
#endif
int id = 0;
for (; id < pCosMixSox->GetItemCount(); ++id)
{
int nTableID = pCosMixSox->GetItemID(id);
int nClassType = pCosMixSox->GetFieldFromLablePtr(nTableID, "_Class")->GetInteger();
nClassType++; // note by kalliste : class type<70><65> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD><EBB0AA> <20>ҽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EBB0AA> <20>ٸ<EFBFBD><D9B8><EFBFBD>
int nEquipType = pCosMixSox->GetFieldFromLablePtr(nTableID, "_EquipType")->GetInteger();
int nDropID = pCosMixSox->GetFieldFromLablePtr(nTableID, "_DropID")->GetInteger();
#ifndef _CLIENT
TCostumeMix mixData;
mixData.nMinScore = pCosMixSox->GetFieldFromLablePtr(nTableID, "_MinScore")->GetInteger();
mixData.nDropID = nDropID;
m_CosMixDropList.insert(std::make_pair(std::make_pair(nClassType, nEquipType), mixData));
#endif
MIX_RESULT_LIST& addItemList = GetResultItemList(nClassType, nEquipType);
std::set<int> tempItemDropGroupList;
FillList(&addItemList, tempItemDropGroupList, pItemDropTable, nDropID, 0);
}
#if defined (_WORK) && defined (_SERVER)
DNTableFileFormat* pAbilitySox;
if (bReload)
pAbilitySox = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TCOSMIXABILITY);
else
pAbilitySox = GetDNTable(CDnTableDB::TCOSMIXABILITY);
#else //#if defined (_WORK) && defined (_SERVER)
DNTableFileFormat* pAbilitySox = GetDNTable(CDnTableDB::TCOSMIXABILITY);
#endif //#if defined (_WORK) && defined (_SERVER)
if (pAbilitySox == NULL)
{
g_Log.Log( LogType::_FILELOG, L"CosMixAbilityTable.ext failed\r\n");
return false;
}
#if defined (_WORK) && defined (_SERVER)
if (bReload)
{
m_PotentialList.clear();
}
#endif //#if defined (_WORK) && defined (_SERVER)
#ifdef _CLIENT
DNTableFileFormat* pPotenSox = GetDNTable(CDnTableDB::TPOTENTIAL);
if (pPotenSox == NULL)
{
_ASSERT(0);
return false;
}
int presentPotenId = -1;
for (id = 0; id < pAbilitySox->GetItemCount(); ++id)
{
int nTableID = pAbilitySox->GetItemID(id);
int rank = pAbilitySox->GetFieldFromLablePtr(nTableID, "_Rank")->GetInteger();
int partsId = pAbilitySox->GetFieldFromLablePtr(nTableID, "_Parts")->GetInteger();
if (rank == ITEMRANK_C)
{
presentPotenId = pAbilitySox->GetFieldFromLablePtr(nTableID, "_PotentialID")->GetInteger();
if (presentPotenId < 0)
{
_ASSERT(0);
continue;
}
std::vector<int> nVecItemID;
pPotenSox->GetItemIDListFromField("_PotentialID", presentPotenId, nVecItemID);
std::string str;
std::vector<SAddAbility> addAbilityUnitList;
int i = 1;
std::vector<int>::const_iterator iter = nVecItemID.begin();
for (; iter != nVecItemID.end(); ++iter, ++i)
{
int itemId = *iter;
int nStateType = pPotenSox->GetFieldFromLablePtr(itemId, "_State1")->GetInteger();
if (nStateType == -1) break;
char *szValue = pPotenSox->GetFieldFromLablePtr(itemId, "_State1Value")->GetString();
SAddAbility ability;
ability.abilityNum = nStateType;
ability.abilityValue = (float)atof(szValue);
ability.potenOffset = i;
addAbilityUnitList.push_back(ability);
}
m_CostumeAddAbility.insert(std::make_pair(partsId, addAbilityUnitList));
}
}
#else // _CLIENT
for (id = 0; id < pAbilitySox->GetItemCount(); ++id)
{
int nTableID = pAbilitySox->GetItemID(id);
int rank = pAbilitySox->GetFieldFromLablePtr(nTableID, "_Rank")->GetInteger();
int potentialID = pAbilitySox->GetFieldFromLablePtr(nTableID, "_PotentialID")->GetInteger();
int partsId = pAbilitySox->GetFieldFromLablePtr(nTableID, "_Parts")->GetInteger();
m_PotentialList.insert(std::make_pair(std::pair<int, int>(partsId, rank), potentialID));
}
#ifdef _WORK
DNTableFileFormat* pGachaInfoTable;
if (bReload)
pGachaInfoTable = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TGACHAINFO);
else
pGachaInfoTable = GetDNTable(CDnTableDB::TGACHAINFO);
#else //#ifdef _WORK
DNTableFileFormat* pGachaInfoTable = GetDNTable(CDnTableDB::TGACHAINFO);
#endif //#ifdef _WORK
if (pGachaInfoTable == NULL)
{
g_Log.Log( LogType::_FILELOG, L"gachatable.ext failed\r\n");
return false;
}
#ifdef _WORK
if (bReload)
{
m_CosDesignMixEnableMap.clear();
}
#endif //#ifdef _WORK
for (id = 0; id < pGachaInfoTable->GetItemCount(); ++id)
{
int nTableID = pGachaInfoTable->GetItemID(id);
int nEnableDesignMix = pGachaInfoTable->GetFieldFromLablePtr(nTableID, "_UseCompound")->GetInteger();
m_CosDesignMixEnableMap.insert(std::make_pair(nTableID, nEnableDesignMix));
}
#endif // _CLIENT
return true;
}
bool CDnCostumeMixDataMgr::FillList(CDnCostumeMixDataMgr::MIX_RESULT_LIST* addItemList, std::set<int>& tempGroupList, DNTableFileFormat* pItemDropSox, int nDropID, int depthCounter)
{
int dropIdIdx = 1;
for (; dropIdIdx < MAXITEMDROPFIELD + 1; ++dropIdIdx)
{
std::string groupField = FormatA("_IsGroup%d", dropIdIdx);
std::string itemFieldString = FormatA("_Item%dIndex", dropIdIdx);
DNTableCell* pItemField = pItemDropSox->GetFieldFromLablePtr(nDropID, itemFieldString.c_str());
DNTableCell* pGroupField = pItemDropSox->GetFieldFromLablePtr(nDropID, groupField.c_str());
if (pItemField == NULL || pGroupField == NULL)
{
_ASSERT(0);
g_Log.Log(LogType::_ERROR, L"[COSTUMEMIX_ERROR] dropId:%d - dropItemField:_Item%dIndex or dropGroupField NOT FOUND\r\n", nDropID, dropIdIdx);
return false;
}
int itemId = pItemField->GetInteger();
bool bGroup = pGroupField->GetInteger() ? true : false;
if (itemId != ITEMCLSID_NONE)
{
if (bGroup)
{
std::set<int>::iterator tgIter = std::find(tempGroupList.begin(), tempGroupList.end(), itemId);
if (tgIter != tempGroupList.end())
continue;
if (depthCounter + 1 > ITEMDROP_DEPTH)
{
g_Log.Log(LogType::_ERROR, L"[COSTUMEMIX_ERROR] itemId(%d) depthCounter(%d) is over the ITEMDROP_DEPTH(%d)\r\n", itemId, depthCounter, ITEMDROP_DEPTH);
continue;
}
tempGroupList.insert(itemId);
FillList(addItemList, tempGroupList, pItemDropSox, itemId, depthCounter + 1);
}
else
{
DNTableFileFormat* pSox = GetDNTable(CDnTableDB::TITEM);
if (pSox == NULL)
return false;
DNTableFileFormat* pGachaInfoTable = GetDNTable(CDnTableDB::TGACHAINFO);
if (pGachaInfoTable == NULL)
return false;
if (pSox->IsExistItem(itemId))
{
// todo by kalliste : item table<6C><65><EFBFBD><EFBFBD> _ComposeType üũ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> Ȯ<><C8AE>
#ifdef _CLIENT
eItemRank itemRank = (eItemRank)(pSox->GetFieldFromLablePtr(itemId, "_Rank" )->GetInteger());
if (itemRank >= ITEMRANK_D && itemRank < ITEMRANK_B)
{
SResultItemInfo info;
info.itemId = itemId;
const DNTableCell* pField = pGachaInfoTable->GetFieldFromLablePtr(itemId, "_sort");
if (pField == NULL)
{
//_ASSERT(0);
//g_Log.Log(LogType::_ERROR, L"[COSTUMEMIX_ERROR] ItemId:%d item NOT FOUND in TCOSMIXSORT\r\n", itemId);
continue;
}
info.showPriority = pField->GetInteger();
//TODO(Cussrro): <20><><EFBFBD><EFBFBD><EBB2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>
//addItemList->insert(info);
}
#else // _CLIENT
eItemRank itemRank = (eItemRank)(pSox->GetFieldFromLablePtr(itemId, "_Rank" )->GetInteger());
if (itemRank >= ITEMRANK_D && itemRank < ITEMRANK_B)
{
SResultItemInfo info;
info.itemId = itemId;
const DNTableCell* pField = pGachaInfoTable->GetFieldFromLablePtr(itemId, "_sort");
if (pField == NULL)
{
//_ASSERT(0);
//g_Log.Log(LogType::_ERROR, L"[COSTUMEMIX_ERROR] ItemId:%d item NOT FOUND in TCOSMIXSORT\r\n", itemId);
continue;
}
info.showPriority = pField->GetInteger();
//TODO(Cussrro): <20><><EFBFBD><EFBFBD><EBB2BB>
//addItemList.insert(info);
}
#endif
}
else
{
//_ASSERT(0);
g_Log.Log(LogType::_ERROR, L"[COSTUMEMIX_ERROR] ItemId:%d item NOT FOUND in ITEMTABLE\r\n", itemId);
return false;
}
}
}
}
return true;
}
#ifdef _CLIENT
void CDnCostumeMixDataMgr::SetCurrentClassId(int classId)
{
if (CommonUtil::IsValidCharacterClassId(classId) == false)
{
m_CurrentClassId = -1;
return;
}
m_CurrentClassId = classId;
}
const std::vector<CDnCostumeMixDataMgr::SAddAbility>* CDnCostumeMixDataMgr::GetMixAbilityList(int partsId) const
{
std::map<int, std::vector<SAddAbility> >::const_iterator iter = m_CostumeAddAbility.find(partsId);
if (iter != m_CostumeAddAbility.end())
{
const std::vector<SAddAbility>& abilityList = (*iter).second;
return &abilityList;
}
return NULL;
}
#else
int CDnCostumeMixDataMgr::GetMixDropTableID(int classType, int equipType, int weight) const
{
int result = -1;
std::multimap<std::pair<int, int>, TCostumeMix>::const_iterator iter = m_CosMixDropList.lower_bound(std::pair<int, int>(classType, equipType));
for (; iter != m_CosMixDropList.upper_bound(std::pair<int, int>(classType, equipType)); ++iter)
{
const TCostumeMix& mixData = (*iter).second;
if (weight >= mixData.nMinScore)
result = mixData.nDropID;
}
return result;
}
int CDnCostumeMixDataMgr::GetPotentialID(int partsId, int rank) const
{
std::map<std::pair<int, int>, int>::const_iterator iter = m_PotentialList.find(std::pair<int, int>(partsId, rank));
if (iter != m_PotentialList.end())
return (*iter).second;
return -1;
}
#endif // _CLIENT
#ifdef _CLIENT
bool CDnCostumeMixDataMgr::IsEnableCostumeDesignMixStuff(const CDnItem* pStuff) const
#else
bool CDnCostumeMixDataMgr::IsEnableCostumeDesignMixStuff(const TItem* pStuff) const
#endif
{
if (pStuff == NULL)
return false;
#ifdef _CLIENT
DNTableFileFormat* pGachaSox = GetDNTable( CDnTableDB::TGACHAINFO );
if (pGachaSox == NULL)
return false;
DNTableCell* pField = pGachaSox->GetFieldFromLablePtr(pStuff->GetClassID(), "_UseCompound");
if (pField == NULL)
return false;
bool bEnableStuff = (pField->GetInteger()) ? true : false;
if (bEnableStuff == false || pStuff->IsEternityItem() == false || pStuff->GetLookItemID() != 0)
return false;
return true;
#else
std::map<int, int>::const_iterator iter = m_CosDesignMixEnableMap.find(pStuff->nItemID);
if (iter != m_CosDesignMixEnableMap.end())
{
int enableStuff = (*iter).second;
return (enableStuff > 0 && pStuff->bEternity && pStuff->nLookItemID == 0);
}
return false;
#endif
}
#ifdef _CLIENT
bool CDnCostumeMixDataMgr::IsEnableCostumeMixStuff(const CDnParts* pStuff) const
{
if (pStuff == NULL)
return false;
bool bRet = true;
if (pStuff->IsEnableCostumeMixItem() == false)
return false;
if (pStuff->GetLookItemID() != 0)
return false;
int classId = GetCurrentClassId();
const CDnCostumeMixDataMgr::MIX_RESULT_LIST* pItemList = GetMixResultItemList(classId, pStuff->GetPartsType());
if (pItemList && pItemList->size() <= 0)
bRet = false;
return bRet;
}
#endif