17885 lines
550 KiB
C++
17885 lines
550 KiB
C++
#include "StdAfx.h"
|
|
#include "DNGameDataManager.h"
|
|
#include "EtResourceMng.h"
|
|
#include "XmlParser.h"
|
|
#include "EtUIXML.h"
|
|
#include "Log.h"
|
|
#include "Util.h"
|
|
#include "./boost/lexical_cast.hpp"
|
|
#include "DNQuestCondition.h"
|
|
#include "DNQuest.h"
|
|
#include "DNQuestManager.h"
|
|
#include "DnUIString.h"
|
|
#include "DnWorldGateStruct.h"
|
|
#include "TimeSet.h"
|
|
#include "DNMissionSystem.h"
|
|
#if defined(_VILLAGESERVER)
|
|
#include "DNFieldManager.h"
|
|
#include "DNFieldDataManager.h"
|
|
#include "DnItemCompounder.h"
|
|
|
|
extern TVillageConfig g_Config;
|
|
|
|
#elif defined(_GAMESERVER)
|
|
#include "DNDLGameRoom.h"
|
|
#include "DnWorld.h"
|
|
#include "DNSchedule.h"
|
|
extern TGameConfig g_Config;
|
|
|
|
#endif // _GAMESERVER
|
|
|
|
#ifdef _DEBUG
|
|
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
|
|
#endif
|
|
|
|
CDNGameDataManager* g_pDataManager = NULL;
|
|
|
|
CDNGameDataManager::CDNGameDataManager(void)
|
|
{
|
|
memset(&m_UpdateLocalTime, 0, sizeof(m_UpdateLocalTime));
|
|
|
|
m_pSkillTreeSystem = NULL;
|
|
|
|
m_pPvpSkills.clear();
|
|
m_pMapInfo.clear();
|
|
m_pSkillData.clear();
|
|
m_pItemData.clear();
|
|
m_pActorData.clear();
|
|
m_pNpcData.clear();
|
|
m_pWeaponData.clear();
|
|
m_pPartData.clear();
|
|
m_pPotentialJewelData.clear();
|
|
m_pEnchantJewelData.clear();
|
|
m_pSkillShop.clear();
|
|
m_pEnchantTable.clear();
|
|
m_pPotentialTable.clear();
|
|
m_pTaxData.clear();
|
|
m_pPCBangData.clear();
|
|
m_pMapCoinCount.clear();
|
|
// PvP
|
|
m_PvPMapTable.clear();
|
|
m_PvPGameModeTable.clear();
|
|
m_PvPGameStartConditionTable.clear();
|
|
m_PvPRankTable.clear();
|
|
m_pItemCompounder = NULL;
|
|
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
m_pCashCommodityData.clear();
|
|
m_pCashPackageData.clear();
|
|
}
|
|
|
|
#ifdef PRE_ADD_GACHA_JAPAN
|
|
m_mapGachaData.clear();
|
|
#endif // PRE_ADD_GACHA_JAPAN
|
|
m_pVecLevelupEvent.clear();
|
|
#if defined(PRE_ADD_VIP)
|
|
m_pVecVIPData.clear();
|
|
#endif // #if defined(PRE_ADD_VIP)
|
|
m_ItemOptionTableData.clear();
|
|
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
m_ReputeTableData.clear();
|
|
m_PresentTableData.clear();
|
|
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
m_CombinedShopTableData.clear();
|
|
m_MapGlyphSkill.clear();
|
|
m_VecGlyphSlot.clear();
|
|
m_VecGlyphCharge.clear();
|
|
m_MapCharmKeyItem.clear();
|
|
m_MapCharmItem.clear();
|
|
|
|
m_GuildLevel.clear();
|
|
m_nMaxGuildExp = 0;
|
|
m_nMaxGuildLevel = 0;
|
|
m_GuildLimitItem.clear();
|
|
m_GuildLimitCoin.clear();
|
|
|
|
m_MapVehicle.clear();
|
|
m_MapVehicleParts.clear();
|
|
|
|
m_pPetLevelData.clear();
|
|
|
|
m_mPeriodAppellation.clear();
|
|
|
|
m_MapCollectionBookData.clear();
|
|
m_MapAppellationData.clear();
|
|
|
|
#ifdef _WORK
|
|
m_bAllLoaded = false;
|
|
#endif //#ifdef _WORK
|
|
m_nMaxPlayerLevel = 0;
|
|
m_mGuildAppellation.clear();
|
|
m_mGuildRewardItemTableData.clear();
|
|
#if defined( PRE_ADD_BESTFRIEND )
|
|
m_mBestFriendAppellation.clear();
|
|
#endif
|
|
#if defined(PRE_ADD_SALE_COUPON)
|
|
m_mSaleCouponItemTableData.clear();
|
|
#endif
|
|
m_MapPetFoodData.clear();
|
|
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
|
|
m_mNamedItemTableData.clear();
|
|
#endif
|
|
#if defined( PRE_WORLDCOMBINE_PARTY )
|
|
m_mWorldCombinePartyData.clear();
|
|
#endif
|
|
#if defined(PRE_ADD_PCBANG_RENTAL_ITEM)
|
|
m_mPcBangRentItemData.clear();
|
|
#endif
|
|
#ifdef PRE_MOD_PVPRANK
|
|
m_nThresholdPvPExpValue = 0;
|
|
#endif //#ifdef PRE_MOD_PVPRANK
|
|
#if defined(PRE_ADD_WEEKLYEVENT)
|
|
m_pMapWeeklyEvent.clear();
|
|
#endif // #if defined(PRE_ADD_WEEKLYEVENT)
|
|
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
|
|
m_MapTotalSkillLevelTabel.clear();
|
|
m_MapTotalSkillSlotTabel.clear();
|
|
m_MapTotalSkillBlow.clear();
|
|
#endif
|
|
#if defined(PRE_SPECIALBOX)
|
|
m_pMapKeepBoxProvideItemData.clear();
|
|
#endif // #if defined(PRE_SPECIALBOX)
|
|
#if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
|
|
m_MapBonusDropTable.clear();
|
|
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
|
|
#if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
m_MapItemDropEnchantTable.clear();
|
|
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
#if defined( PRE_ADD_STAMPSYSTEM )
|
|
m_MapStampTableData.clear();
|
|
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
|
|
#if defined( PRE_ALTEIAWORLD_EXPLORE )
|
|
m_MapAlteiaWorldMapInfo.clear();
|
|
m_nAlteiaWorldMapMaxCount = 0;
|
|
m_tAlteiaWorldBeginTime = 0;
|
|
#endif
|
|
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
m_pTalismanSlotTable.clear();
|
|
#endif
|
|
#if defined( PRE_PVP_GAMBLEROOM )
|
|
m_MapPvPGambleRoom.clear();
|
|
#endif
|
|
#if defined( PRE_ADD_STAGE_WEIGHT )
|
|
m_MapStageWeightData.clear();
|
|
#endif // #if defined( PRE_ADD_STAGE_WEIGHT )
|
|
}
|
|
|
|
CDNGameDataManager::~CDNGameDataManager(void)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapItemDropData, m_pItemDropTable );
|
|
SAFE_DELETE_PMAP( TMapInfoMap, m_pMapInfo );
|
|
SAFE_DELETE_PMAP( TMapItemData, m_pItemData );
|
|
SAFE_DELETE_PMAP( TMapActorData, m_pActorData );
|
|
SAFE_DELETE_PMAP( TMapNpcData, m_pNpcData );
|
|
SAFE_DELETE_PMAP( TMapWeaponData, m_pWeaponData );
|
|
SAFE_DELETE_PMAP( TMapPartData, m_pPartData );
|
|
SAFE_DELETE_PMAP( TMapPotentialJewelData, m_pPotentialJewelData );
|
|
SAFE_DELETE_PMAP( TMapEnchantJewelData, m_pEnchantJewelData );
|
|
SAFE_DELETE_PMAP( TMapShopData, m_pShopData );
|
|
SAFE_DELETE_PMAP( TMapSkillData, m_pSkillData );
|
|
SAFE_DELETE_PMAP( TMapSkillShopData, m_pSkillShop );
|
|
SAFE_DELETE_PMAP( TMapSkillTreeData, m_pSkillTreeData );
|
|
SAFE_DELETE_PMAP( TPvPMapTableData, m_PvPMapTable );
|
|
SAFE_DELETE_PMAP( TPvPGameModeTableData, m_PvPGameModeTable );
|
|
SAFE_DELETE_PMAP( TPvPGameStartConditionData, m_PvPGameStartConditionTable );
|
|
SAFE_DELETE_PMAP( TPvPRankTableData, m_PvPRankTable );
|
|
SAFE_DELETE_PVEC( m_pMissionTable );
|
|
SAFE_DELETE_PMAP( TMapDailyMissionData, m_pDailyMissionTable );
|
|
SAFE_DELETE_PVEC( m_pTaxData );
|
|
SAFE_DELETE_PMAP( TMapPCBangData, m_pPCBangData );
|
|
SAFE_DELETE_PMAP( TMapCoinCount, m_pMapCoinCount );
|
|
SAFE_DELETE_PMAP( TMapQuestConditionData, m_QuestConditionData );
|
|
|
|
SAFE_DELETE_PMAPF( TMapEnchantData, m_pEnchantTable, SAFE_DELETE_PMAP( TMapEnchantLevelData, TMapEnchantData_iter->second->pMapLevelData ) );
|
|
SAFE_DELETE_PMAPF( TMapPotentialData, m_pPotentialTable, SAFE_DELETE_PVEC( TMapPotentialData_iter->second->pVecItemData ) );
|
|
SAFE_DELETE_PVEC( m_pGuildWarRewardData );
|
|
|
|
SAFE_DELETE( m_pItemCompounder );
|
|
SAFE_DELETE( m_pSkillTreeSystem );
|
|
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
SAFE_DELETE_PMAP(TMapCashCommodityData, m_pCashCommodityData);
|
|
SAFE_DELETE_PMAP(TMapCashPackageData, m_pCashPackageData);
|
|
}
|
|
|
|
#ifdef PRE_ADD_GACHA_JAPAN
|
|
SAFE_DELETE_PMAP( TMapGachaData_JP, m_mapGachaData );
|
|
#endif
|
|
SAFE_DELETE_PVEC(m_pVecLevelupEvent);
|
|
#if defined(PRE_ADD_VIP)
|
|
SAFE_DELETE_PVEC(m_pVecVIPData);
|
|
#endif // #if defined(PRE_ADD_VIP)
|
|
SAFE_DELETE_PVEC( m_pSealCountData );
|
|
SAFE_DELETE_PVEC( m_vLvPromotion );
|
|
SAFE_DELETE_PMAP( TMapDLMapData, m_pDLMapTable );
|
|
SAFE_DELETE_PMAPF( TMapDLClearData, m_pDLClearTable, SAFE_DELETE_PVEC( TMapDLClearData_iter->second->pVecClearItem ) );
|
|
SAFE_DELETE_PMAP(TMapPetLevelData, m_pPetLevelData);
|
|
#if defined(PRE_ADD_MULTILANGUAGE)
|
|
for (std::map <int, TProhibitWord>::iterator ii = m_ProhibitWordList.begin(); ii != m_ProhibitWordList.end(); ii++)
|
|
(*ii).second.clear();
|
|
m_ProhibitWordList.clear();
|
|
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
m_ProhibitWordList.clear();
|
|
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
#if defined(PRE_ADD_WEEKLYEVENT)
|
|
SAFE_DELETE_PMAP( TMapWeeklyEvent, m_pMapWeeklyEvent );
|
|
#endif // #if defined(PRE_ADD_WEEKLYEVENT)
|
|
#if defined(PRE_ADD_REMOTE_QUEST)
|
|
SAFE_DELETE_PVEC(m_pQuestRemoteTable);
|
|
SAFE_DELETE_MAP(m_MapRemoteQuestID);
|
|
#endif
|
|
#if defined(PRE_SPECIALBOX)
|
|
SAFE_DELETE_PMAP(TMapKeepBoxProvideItemData, m_pMapKeepBoxProvideItemData);
|
|
#endif // #if defined(PRE_SPECIALBOX)
|
|
#if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
SAFE_DELETE_MAP(m_MapItemDropEnchantTable);
|
|
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
#if defined(PRE_ADD_ACTIVEMISSION)
|
|
SAFE_DELETE_PVEC( m_pActiveMissionTable );
|
|
#endif
|
|
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
SAFE_DELETE_PVEC( m_pTalismanSlotTable );
|
|
#endif
|
|
}
|
|
|
|
bool CDNGameDataManager::AllLoad()
|
|
{
|
|
int iLoadFailCount = 0;
|
|
|
|
if( !LoadMapInfo() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadSkillData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadItemData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadActorData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadNpcData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadWeaponData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadPartData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadPotentialJewelData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadTalkData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadShopData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadSkillShopData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadQuestReward() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadEnchantData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadPotentialData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadItemDropData() )
|
|
++iLoadFailCount;
|
|
#if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
|
|
if( !LoadBonusDropTable() )
|
|
++iLoadFailCount;
|
|
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
|
|
if( !LoadAppellationData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadMissionData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadDailyMissionData() )
|
|
++iLoadFailCount;
|
|
|
|
#if defined(PRE_ADD_ACTIVEMISSION)
|
|
if( !LoadActiveMissionData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadActiveSetData() )
|
|
++iLoadFailCount;
|
|
#endif
|
|
|
|
#if defined(PRE_ADD_CHAT_MISSION)
|
|
if( !LoadTypingData() )
|
|
++iLoadFailCount;
|
|
#endif
|
|
|
|
if( !LoadTaxData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadPCBangData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadCoinCount() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadSealData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadItemCompoundData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadSkillTreeData() )
|
|
++iLoadFailCount;
|
|
|
|
// PvP
|
|
if( !LoadPvPMapTable() )
|
|
++iLoadFailCount;
|
|
if( !LoadPvPGameModeTable() )
|
|
++iLoadFailCount;
|
|
if( !LoadPvPGameStartConditionTable() )
|
|
++iLoadFailCount;
|
|
if( !LoadPvPRankTable() )
|
|
++iLoadFailCount;
|
|
//Channel & Merit
|
|
if(!LoadChannelInfo())
|
|
++iLoadFailCount;
|
|
if( !LoadCashCommodityData() )
|
|
++iLoadFailCount;
|
|
if( !LoadCashPackageData() )
|
|
++iLoadFailCount;
|
|
if( !LoadDarkLairMapData() )
|
|
++iLoadFailCount;
|
|
if( !LoadDarkLairClearData() )
|
|
++iLoadFailCount;
|
|
|
|
#ifdef PRE_ADD_GACHA_JAPAN
|
|
if( !LoadGachaData_JP() )
|
|
++iLoadFailCount;
|
|
#endif // PRE_ADD_GACHA_JAPAN
|
|
|
|
if( !LoadLevelupEvent() )
|
|
++iLoadFailCount;
|
|
|
|
if(LoadPromotionData() == false)
|
|
++iLoadFailCount;
|
|
|
|
#if defined(PRE_ADD_VIP)
|
|
if( !LoadVIPData() )
|
|
++iLoadFailCount;
|
|
#endif // #if defined(PRE_ADD_VIP)
|
|
if( !LoadItemOptionTableData() )
|
|
++iLoadFailCount;
|
|
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
if( !LoadReputeTableData() )
|
|
++iLoadFailCount;
|
|
if( !LoadPresentTableData() )
|
|
++iLoadFailCount;
|
|
if( !LoadMailTableData() )
|
|
++iLoadFailCount;
|
|
if( !LoadStoreBenefitData() )
|
|
++iLoadFailCount;
|
|
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
if( !LoadCombinedShopTableData() )
|
|
++iLoadFailCount;
|
|
|
|
#ifdef _WORK
|
|
if(!m_CosMixDataMgr.LoadData(m_bAllLoaded))
|
|
#else //#ifdef _WORK
|
|
if(!m_CosMixDataMgr.LoadData())
|
|
#endif //#ifdef _WORK
|
|
++iLoadFailCount;
|
|
|
|
#ifdef PRE_ADD_COSRANDMIX
|
|
if (!LoadCostumeRandomMixData())
|
|
++iLoadFailCount;
|
|
#endif
|
|
if( !LoadMasterSystemDecreaseTableData() )
|
|
++iLoadFailCount;
|
|
if( !LoadMasterSystemGainTableData() )
|
|
++iLoadFailCount;
|
|
#if defined( PRE_ADD_SECONDARY_SKILL )
|
|
if( !LoadSecondarySkillTableData() )
|
|
++iLoadFailCount;
|
|
if( !LoadSecondarySkillLevelTableData() )
|
|
++iLoadFailCount;
|
|
if( !LoadSecondarySkillRecipeTableData() )
|
|
++iLoadFailCount;
|
|
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
|
|
if( !LoadInstantItemTableData() )
|
|
++iLoadFailCount;
|
|
if( !LoadFarmCultivateTableData() )
|
|
++iLoadFailCount;
|
|
if(!LoadFishingTableData())
|
|
++iLoadFailCount;
|
|
if(!LoadFishingPointTableData())
|
|
++iLoadFailCount;
|
|
if(!LoadFishingAreaTableData())
|
|
++iLoadFailCount;
|
|
if( !LoadJobTableData() )
|
|
++iLoadFailCount;
|
|
if (!LoadGlyphSkillData())
|
|
++iLoadFailCount;
|
|
if (!LoadGlyphSlotData())
|
|
++iLoadFailCount;
|
|
if (!LoadGlyphChargeData())
|
|
++iLoadFailCount;
|
|
if (!LoadCharmItemData())
|
|
++iLoadFailCount;
|
|
if (!LoadCharmItemKeyData())
|
|
++iLoadFailCount;
|
|
#if defined(PRE_ADD_GETITEM_WITH_RANDOMVALUE)
|
|
if (!LoadCharmCountData())
|
|
++iLoadFailCount;
|
|
#endif // #if defined(PRE_ADD_GETITEM_WITH_RANDOMVALUE)
|
|
if (!LoadVehicleData())
|
|
++iLoadFailCount;
|
|
if (!LoadVehiclePartsData())
|
|
++iLoadFailCount;
|
|
if (!LoadPetLevelData())
|
|
++iLoadFailCount;
|
|
if (!LoadPetFoodData())
|
|
++iLoadFailCount;
|
|
|
|
#if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
if(!LoadDropItemEnchant())
|
|
++iLoadFailCount;
|
|
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
|
|
if (!LoadGuildWareData())
|
|
++iLoadFailCount;
|
|
|
|
#if defined(PRE_ADD_MULTILANGUAGE)
|
|
CLfhHeap::GetInstance()->InitPool();
|
|
|
|
std::string strFilePath;
|
|
for (int i = 0; i < MultiLanguage::SupportLanguage::NationMax; i++)
|
|
{
|
|
strFilePath.clear();
|
|
strFilePath = g_Config.szResourcePath;
|
|
strFilePath.append("/Resource/UIString/ProhibitWord");
|
|
if (i != 0) //老窜 0锅篮 叼弃飘
|
|
strFilePath.append(MultiLanguage::NationString[i]);
|
|
strFilePath.append(".xml");
|
|
LoadProhibitWord(i, strFilePath.c_str());
|
|
}
|
|
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
CLfhHeap::GetInstance()->InitPool();
|
|
if (!LoadProhibitWord())
|
|
++iLoadFailCount;
|
|
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
|
|
if (!LoadExchangeTradeData())
|
|
++iLoadFailCount;
|
|
|
|
if (!LoadCollectionBookData())
|
|
++iLoadFailCount;
|
|
|
|
if (!LoadEnchantJewelData())
|
|
++iLoadFailCount;
|
|
if (!LoadPVPMissionRoom())
|
|
++iLoadFailCount;
|
|
|
|
if (!LoadMonsterMutationGroupData())
|
|
++iLoadFailCount;
|
|
|
|
if (!LoadMonsterMutationData())
|
|
++iLoadFailCount;
|
|
|
|
if (!LoadMonsterMutationSkillData())
|
|
++iLoadFailCount;
|
|
|
|
if (!LoadGhoulModeCondition())
|
|
++iLoadFailCount;
|
|
|
|
#if defined( _GAMESERVER )
|
|
if( !LoadPvPGameModeSkillSetting() )
|
|
++iLoadFailCount;
|
|
#endif // #if defined( _GAMESERVER )
|
|
|
|
#if defined(_GAMESERVER)
|
|
if(!LoadBattleGroundMode())
|
|
++iLoadFailCount;
|
|
|
|
if(!LoadBattleGroundResourceArea())
|
|
++iLoadFailCount;
|
|
|
|
if(!LoadBattleGroundSkillSet())
|
|
++iLoadFailCount;
|
|
#endif //#if defined(_GAMESERVER)
|
|
if(!LoadGuildWarRewardData())
|
|
++iLoadFailCount;
|
|
if(!LoadReputeBenefitData())
|
|
++iLoadFailCount;
|
|
|
|
if(!LoadGuildMarkData())
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadPlayerCommonLeaveTable() )
|
|
++iLoadFailCount;
|
|
|
|
if (!LoadMonsterLevel())
|
|
++iLoadFailCount;
|
|
if( !LoadMasterSysFeelTable() )
|
|
++iLoadFailCount;
|
|
if( !LoadGlobalEventData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadEveryDayEventData() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadPlayerCustomEventUI() )
|
|
++iLoadFailCount;
|
|
|
|
if( !LoadGuildLevelData() )
|
|
++iLoadFailCount;
|
|
if( !LoadGuildWarPointData() )
|
|
++iLoadFailCount;
|
|
if( !LoadGuildRewardItemData() )
|
|
++iLoadFailCount;
|
|
|
|
if (!LoadQuestLevelCapReward())
|
|
++iLoadFailCount;
|
|
#if defined(PRE_ADD_SALE_COUPON)
|
|
if(!LoadSaleCouponData())
|
|
++iLoadFailCount;
|
|
#endif // #if defined(PRE_ADD_SALE_COUPON)
|
|
|
|
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
|
|
if( !LoadNamedItemData() )
|
|
++iLoadFailCount;
|
|
#endif
|
|
|
|
#ifdef PRE_ADD_EXCHANGE_POTENTIAL
|
|
if (!LoadPotentialTransferData())
|
|
++iLoadFailCount;
|
|
#endif //#ifdef PRE_ADD_EXCHANGE_POTENTIAL
|
|
|
|
#if defined( PRE_PARTY_DB )
|
|
if( LoadPartySortWeightTable() == false )
|
|
++iLoadFailCount;
|
|
if( LoadDungeonSortWeightTable() == false )
|
|
++iLoadFailCount;
|
|
#endif // #if defined( PRE_PARTY_DB )
|
|
if( LoadCashErasableType() == false )
|
|
++iLoadFailCount;
|
|
#if defined (PRE_ADD_CHAOSCUBE)
|
|
if( LoadChaosCubeStuffData() == false )
|
|
++iLoadFailCount;
|
|
if( LoadChaosCubeResultData() == false )
|
|
++iLoadFailCount;
|
|
#endif // #if defined (PRE_ADD_CHAOSCUBE)
|
|
#if defined( PRE_WORLDCOMBINE_PARTY )
|
|
if( LoadCombinePartyData() == false )
|
|
++iLoadFailCount;
|
|
#endif
|
|
#if defined( PRE_ADD_PCBANG_RENTAL_ITEM )
|
|
if( LoadPcCafeRentData() == false )
|
|
++iLoadFailCount;
|
|
#endif
|
|
#if defined(PRE_ADD_INSTANT_CASH_BUY)
|
|
if( LoadCashBuyShortcut() == false )
|
|
++iLoadFailCount;
|
|
#endif // #if defined(PRE_ADD_INSTANT_CASH_BUY)
|
|
#if defined(PRE_ADD_EXCHANGE_ENCHANT)
|
|
if( LoadEnchantTransferData() == false )
|
|
++iLoadFailCount;
|
|
#endif
|
|
#if defined(PRE_ADD_WEEKLYEVENT)
|
|
if( LoadWeeklyEvent() == false )
|
|
++iLoadFailCount;
|
|
#endif // #if defined(PRE_ADD_WEEKLYEVENT)
|
|
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
|
|
if( LoadTotalLevelSkill() == false)
|
|
++iLoadFailCount;
|
|
#endif
|
|
|
|
#ifdef PRE_ADD_JOINGUILD_SUPPORT
|
|
if (LoadGuildSupport() == false)
|
|
++iLoadFailCount;
|
|
#endif //#ifdef PRE_ADD_JOINGUILD_SUPPORT
|
|
|
|
#if defined(PRE_ADD_REMOTE_QUEST)
|
|
if( LoadRemoteQuestData() == false)
|
|
++iLoadFailCount;
|
|
#endif
|
|
#if defined(PRE_SPECIALBOX)
|
|
if( LoadKeepBoxProvideItem() == false )
|
|
++iLoadFailCount;
|
|
#endif // #if defined(PRE_SPECIALBOX)
|
|
|
|
#if defined( PRE_WORLDCOMBINE_PVP )
|
|
if( LoadWorldPVPMissionRoom() == false )
|
|
++iLoadFailCount;
|
|
#endif
|
|
|
|
#if defined( PRE_ALTEIAWORLD_EXPLORE )
|
|
if( LoadAlteiaWorldMapInfo() == false )
|
|
++iLoadFailCount;
|
|
#endif // #if defined( PRE_ALTEIAWORLD_EXPLORE )
|
|
|
|
#if defined( PRE_ADD_STAMPSYSTEM )
|
|
if( LoadStampTable() == false )
|
|
++ iLoadFailCount;
|
|
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
|
|
|
|
#if defined( PRE_ADD_TALISMAN_SYSTEM )
|
|
if( LoadTalismanSlotData() == false )
|
|
++ iLoadFailCount;
|
|
#endif // #if defined( PRE_ADD_TALISMAN_SYSTEM )
|
|
|
|
#if defined( PRE_PVP_GAMBLEROOM )
|
|
if( LoadPVPGambleRoomData() == false )
|
|
++ iLoadFailCount;
|
|
#endif
|
|
|
|
#if defined( PRE_ADD_STAGE_WEIGHT )
|
|
if( LoadStageWeightData() == false )
|
|
++ iLoadFailCount;
|
|
#endif // #if defined( PRE_ADD_STAGE_WEIGHT )
|
|
|
|
if( iLoadFailCount != 0 )
|
|
return false;
|
|
|
|
#if defined(PRE_FIX_NEXTSKILLINFO)
|
|
InitSkillLevelTableIDList();
|
|
#endif // PRE_FIX_NEXTSKILLINFO
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
g_Log.Log(LogType::_FILELOG, L"Reloadext complete\n");
|
|
m_bAllLoaded = true;
|
|
#endif //#ifdef _WORK
|
|
return true;
|
|
}
|
|
|
|
void CDNGameDataManager::DoUpdate(DWORD dwCurTick, int nThreadIndex)
|
|
{
|
|
if (nThreadIndex >= 30) return;
|
|
|
|
#if defined(PRE_ADD_WEEKLYEVENT)
|
|
if (m_UpdateLocalTime[nThreadIndex].dwUpdateTick + 10*1000 <= dwCurTick){ // 10檬 付促 茄锅究..
|
|
m_UpdateLocalTime[nThreadIndex].dwUpdateTick = dwCurTick;
|
|
|
|
time_t Time;
|
|
time(&Time);
|
|
localtime_s(&m_UpdateLocalTime[nThreadIndex].pCurLocalTime, &Time);
|
|
}
|
|
#endif // #if defined(PRE_ADD_WEEKLYEVENT)
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// Map(MapTable.dnt - TMapInfo)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadMapInfo()
|
|
{
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded) //累诀篮 登绢 乐栏唱 甘包访篮 府肺靛 窍瘤 臼嚼聪促. 鞘靛唱 霸烙冯 捞固 积己登绢柳 惑怕扼辑 怖 鞘夸窍促搁 眠啊 累诀捞 鞘夸秦焊烙
|
|
return true;
|
|
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TMAP );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TMAP );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TMAP );
|
|
#endif //#ifdef _WORK
|
|
if (!pSox)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MapTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if (pSox->GetItemCount() <= 0)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MapTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
char szTemp[256] = { 0, };
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _MapType;
|
|
int _MapSubType;
|
|
int _WorldLevel;
|
|
std::vector<int> _ToolName;
|
|
std::vector<int> _GateMapIndex;
|
|
std::vector<int> _GateStartGate;
|
|
int _MaxClearCount;
|
|
int _AllowMapType;
|
|
int _MapAreaIndex;
|
|
int _Expandable;
|
|
int _UserReturnSystem;
|
|
int _VehicleMode;
|
|
int _PetMode;
|
|
int _AllowFreePass;
|
|
int _IncludeBuild;
|
|
#if defined( PRE_PARTY_DB )
|
|
int _MapNameID;
|
|
int _EnterConditionTable;
|
|
#endif // #if defined( PRE_PARTY_DB )
|
|
#if defined( PRE_NORMALSTAGE_REGULATION )
|
|
int _RevisionNum;
|
|
#endif
|
|
#if defined(PRE_ADD_VEHICLE_SPECIAL_ACTION)
|
|
bool _VehicleSpecialActionMode;
|
|
#endif
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._MapType = pSox->GetFieldNum( "_MapType" );
|
|
sFieldNum._MapSubType = pSox->GetFieldNum( "_MapSubType" );
|
|
sFieldNum._WorldLevel = pSox->GetFieldNum( "_WorldLevel" );
|
|
sFieldNum._AllowMapType = pSox->GetFieldNum( "_AllowMapType" );
|
|
sFieldNum._ToolName.reserve( 10 );
|
|
for( int j=0 ; j<10 ; ++j )
|
|
{
|
|
sprintf_s( szTemp, "_ToolName%d", j+1 );
|
|
sFieldNum._ToolName.push_back( pSox->GetFieldNum( szTemp ) );
|
|
}
|
|
|
|
sFieldNum._GateMapIndex.reserve(WORLDMAP_GATECOUNT);
|
|
sFieldNum._GateStartGate.reserve(WORLDMAP_GATECOUNT);
|
|
for( int j=0 ; j<WORLDMAP_GATECOUNT ; ++j )
|
|
{
|
|
sprintf_s( szTemp, "_Gate%d_MapIndex_txt", j+1 );
|
|
sFieldNum._GateMapIndex.push_back( pSox->GetFieldNum( szTemp) );
|
|
sprintf_s( szTemp, "_Gate%d_StartGate_txt", j+1);
|
|
sFieldNum._GateStartGate.push_back( pSox->GetFieldNum( szTemp) );
|
|
}
|
|
sFieldNum._MaxClearCount = pSox->GetFieldNum("_MaxClearCount");
|
|
sFieldNum._MapAreaIndex = pSox->GetFieldNum("_MapArea");
|
|
sFieldNum._Expandable = pSox->GetFieldNum("_Expandable");
|
|
sFieldNum._UserReturnSystem = pSox->GetFieldNum( "_UserReturnSystem" );
|
|
sFieldNum._VehicleMode = pSox->GetFieldNum("_VehicleMode");
|
|
sFieldNum._PetMode = pSox->GetFieldNum("_PetMode");
|
|
sFieldNum._AllowFreePass = pSox->GetFieldNum("_AllowFreePass");
|
|
sFieldNum._IncludeBuild = pSox->GetFieldNum("_IncludeBuild");
|
|
#if defined( PRE_PARTY_DB )
|
|
sFieldNum._MapNameID = pSox->GetFieldNum("_MapNameID");
|
|
sFieldNum._EnterConditionTable = pSox->GetFieldNum("_EnterConditionTableID");
|
|
#endif // #if defined( PRE_PARTY_DB )
|
|
#if defined( PRE_NORMALSTAGE_REGULATION )
|
|
sFieldNum._RevisionNum = pSox->GetFieldNum("_RevisionNum");
|
|
#endif
|
|
#if defined(PRE_ADD_VEHICLE_SPECIAL_ACTION)
|
|
sFieldNum._VehicleSpecialActionMode = pSox->GetFieldNum("_USEVehicleSpecialmotion") ? true : false;
|
|
#endif
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
#ifdef _WORK
|
|
DNTableFileFormat * pGateSox;
|
|
if (m_bAllLoaded)
|
|
pGateSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TMAPGATE );
|
|
else
|
|
pGateSox = GetDNTable( CDnTableDB::TMAPGATE );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat * pGateSox = GetDNTable( CDnTableDB::TMAPGATE );
|
|
#endif //#ifdef _WORK
|
|
if (!pGateSox)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MapGateTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if (pGateSox->GetItemCount() <= 0)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MapGateTable.dnt Count(%d)\r\n", pGateSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP(TMapInfoMap, m_pMapInfo);
|
|
m_pMapInfo.clear();
|
|
m_vVillagePermitLevel.clear();
|
|
m_vPermitPartyCount.clear();
|
|
m_vVillageMaps.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
#if defined(_GAMESERVER)
|
|
std::vector <std::string> vFailMap;
|
|
MAGAReqRoomID Packet;
|
|
memset( &Packet, 0, sizeof(Packet) );
|
|
CDNGameRoom* pRoom = new CDNGameRoom( NULL, 0, &Packet );
|
|
CDnWorld* pCheckWorld = new CDnWorld(pRoom);
|
|
#endif // #if defined(_GAMESERVER)
|
|
bool IsIncludeBuild = false;
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; i++ )
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
TMapInfo* pMapInfo = new TMapInfo;
|
|
memset(pMapInfo, 0, sizeof(TMapInfo));
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
pMapInfo->nMapID = nItemID;
|
|
pMapInfo->MapType = (GlobalEnum::eMapTypeEnum)pSox->GetFieldFromLablePtr( iIdx, sFieldNum._MapType )->GetInteger();
|
|
pMapInfo->MapSubType = (GlobalEnum::eMapSubTypeEnum)pSox->GetFieldFromLablePtr( iIdx, sFieldNum._MapSubType )->GetInteger();
|
|
pMapInfo->nWorldLevel = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._WorldLevel )->GetInteger();
|
|
pMapInfo->nAllowMapType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._AllowMapType )->GetInteger();
|
|
IsIncludeBuild = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._IncludeBuild )->GetInteger() ? true : false;
|
|
#if defined( PRE_PARTY_DB )
|
|
pMapInfo->wstrMapName = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, pSox->GetFieldFromLablePtr( iIdx, sFieldNum._MapNameID )->GetInteger() );
|
|
pMapInfo->iEnterConditionTable = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._EnterConditionTable )->GetInteger();
|
|
#endif // #if defined( PRE_PARTY_DB )
|
|
#if defined( PRE_NORMALSTAGE_REGULATION )
|
|
pMapInfo->cRevisionNum = (char)pSox->GetFieldFromLablePtr( iIdx, sFieldNum._RevisionNum )->GetInteger();
|
|
#endif
|
|
|
|
#if defined( _GAMESERVER )
|
|
if ( pMapInfo->nMapID >= DarkLair::TopFloorAbstractMapIndex )
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"MapID:%d overflow TopFloorAbstractMapIndex!\r\n", pMapInfo->nMapID );
|
|
delete pMapInfo;
|
|
return false;
|
|
}
|
|
#endif // #if defined( _GAMESERVER )
|
|
|
|
for( int j=0 ; j<10 ; ++j )
|
|
{
|
|
_strcpy(pMapInfo->szMapName[j], _countof(pMapInfo->szMapName[j]), pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ToolName[j] )->GetString(), (int)strlen(pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ToolName[j] )->GetString()) );
|
|
if ( strlen( pMapInfo->szMapName[j] ) == 0 )
|
|
continue;
|
|
|
|
#if defined(_VILLAGESERVER)
|
|
CDNFieldData *pFieldData = g_pFieldDataManager->AddFieldData(pMapInfo->szMapName[j], pMapInfo->nMapID);
|
|
if (!pFieldData)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"MapID:%d, %S, FieldData NULL!\r\n", pMapInfo->nMapID, pMapInfo->szMapName[j]);
|
|
continue;
|
|
}
|
|
#endif
|
|
|
|
#if defined(_GAMESERVER)
|
|
if (IsIncludeBuild)
|
|
{
|
|
bool bResult = pCheckWorld->Initialize( CEtResourceMng::GetInstance().GetFullPath( "MapData" ).c_str(), pMapInfo->szMapName[j]);
|
|
if (!bResult)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"[Map] Grid:%S does not existed \r\n", pMapInfo->szMapName[j] );
|
|
vFailMap.push_back(pMapInfo->szMapName[j]);
|
|
}
|
|
}
|
|
#endif // #if defined(_GAMESERVER)
|
|
}
|
|
|
|
for( int j=0 ; j<WORLDMAP_GATECOUNT ; ++j )
|
|
{
|
|
char* pszGateMapIndexs = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._GateMapIndex[j] )->GetString();
|
|
std::vector<string> vGateMapIndexs;
|
|
TokenizeA(pszGateMapIndexs, vGateMapIndexs, ";");
|
|
|
|
char* pszGateStartIndexs = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._GateStartGate[j] )->GetString();
|
|
std::vector<string> vGateStartIndexs;
|
|
TokenizeA(pszGateStartIndexs, vGateStartIndexs, ";");
|
|
|
|
for (int k=0; k<(int)vGateMapIndexs.size(); k++)
|
|
{
|
|
if (k < WORLDMAP_GATECOUNT)
|
|
{
|
|
pMapInfo->GateMapIndexs[j][k] = (USHORT)atoi(vGateMapIndexs[k].c_str());
|
|
pMapInfo->GateStartIndexs[j][k] = (BYTE)atoi(vGateStartIndexs[k].c_str());
|
|
pMapInfo->GateMapCount[j] = k+1;
|
|
}
|
|
}
|
|
}
|
|
|
|
pMapInfo->nMaxClearCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._MaxClearCount )->GetInteger();
|
|
|
|
std::string areaString = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._MapAreaIndex )->GetString();
|
|
if (areaString.empty() == false)
|
|
{
|
|
std::vector<std::string> tokens;
|
|
TokenizeA(areaString, tokens, ";");
|
|
|
|
std::vector<std::string>::const_iterator iter = tokens.begin();
|
|
for(; iter != tokens.end(); ++iter)
|
|
{
|
|
const std::string& MapIDString = (*iter);
|
|
pMapInfo->vMapAreaIndex.push_back(atoi(MapIDString.c_str()));
|
|
}
|
|
}
|
|
pMapInfo->bExpandable = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Expandable )->GetInteger() ? true : false;
|
|
pMapInfo->bUserReturnSystem = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._UserReturnSystem )->GetInteger() ? true : false;
|
|
pMapInfo->bVehicleMode = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._VehicleMode )->GetInteger() ? true : false;
|
|
pMapInfo->bPetMode = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._PetMode )->GetInteger() ? true : false;
|
|
pMapInfo->bAllowFreePass = pSox->GetFieldFromLablePtr(iIdx, sFieldNum._AllowFreePass)->GetInteger() ? true : false;
|
|
#if defined(PRE_ADD_VEHICLE_SPECIAL_ACTION)
|
|
pMapInfo->bVehicleSpecalActionMode = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._VehicleSpecialActionMode )->GetInteger() ? true : false;
|
|
#endif
|
|
|
|
if (!(m_pMapInfo.insert(make_pair(pMapInfo->nMapID, pMapInfo)).second))
|
|
delete pMapInfo;
|
|
else
|
|
{
|
|
if (pMapInfo->MapType == GlobalEnum::MAP_VILLAGE)
|
|
{
|
|
std::vector<int> nVecItemList;
|
|
pGateSox->GetItemIDListFromField( "_MapIndex", pMapInfo->nMapID, nVecItemList );
|
|
|
|
if (!nVecItemList.empty())
|
|
{
|
|
std::vector<int>::iterator ii;
|
|
for(ii = nVecItemList.begin(); ii != nVecItemList.end(); ii++)
|
|
{
|
|
bool bCheck = false;
|
|
TVecVillagePermitLevel::iterator verifyItor;
|
|
for(verifyItor = m_vVillagePermitLevel.begin(); verifyItor != m_vVillagePermitLevel.end(); verifyItor++)
|
|
{
|
|
if ((*verifyItor).first == pMapInfo->nMapID)
|
|
bCheck = true;
|
|
}
|
|
|
|
if (bCheck == false)
|
|
{
|
|
int nPermitLevel = pGateSox->GetFieldFromLablePtr((*ii), "_PermitPlayerLevel" )->GetInteger();
|
|
m_vVillagePermitLevel.push_back(std::make_pair(pMapInfo->nMapID, nPermitLevel));
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pSox->GetFieldFromLablePtr(pMapInfo->nMapID, "_IncludeBuild")->GetInteger() == 1)
|
|
m_vVillageMaps.push_back(pMapInfo->nMapID);
|
|
}
|
|
|
|
std::vector<int> nVecItemList;
|
|
pGateSox->GetItemIDListFromField( "_MapIndex", pMapInfo->nMapID, nVecItemList );
|
|
|
|
if (!nVecItemList.empty())
|
|
{
|
|
std::vector<int>::iterator ii;
|
|
for(ii = nVecItemList.begin(); ii != nVecItemList.end(); ii++)
|
|
{
|
|
bool bCheck = false;
|
|
TVecPermitPartyCount::iterator verifyItor;
|
|
for(verifyItor = m_vPermitPartyCount.begin(); verifyItor != m_vPermitPartyCount.end(); verifyItor++)
|
|
{
|
|
if ((*verifyItor).first == pMapInfo->nMapID)
|
|
bCheck = true;
|
|
}
|
|
|
|
if (bCheck == false)
|
|
{
|
|
int nPermitCount = pGateSox->GetFieldFromLablePtr((*ii), "_PartyLimit" )->GetInteger();
|
|
if (nPermitCount > 0)
|
|
m_vPermitPartyCount.push_back(std::make_pair(pMapInfo->nMapID, nPermitCount));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#if defined(_GAMESERVER)
|
|
SAFE_DELETE (pCheckWorld);
|
|
SAFE_DELETE (pRoom);
|
|
#if defined( _FINAL_BUILD )
|
|
if (vFailMap.size() > 0){
|
|
g_Log.Log(LogType::_FILELOG, L"[MapTable] vFailMap.size(): %d\r\n", (int)vFailMap.size());
|
|
return false;
|
|
}
|
|
#endif // #if defined( _FINAL_BUILD )
|
|
#endif // #if defined(_GAMESERVER)
|
|
return true;
|
|
}
|
|
|
|
const TMapInfo * CDNGameDataManager::GetMapInfo(int nMapID) const
|
|
{
|
|
TMapInfoMap::const_iterator ii = m_pMapInfo.find(nMapID);
|
|
if (ii != m_pMapInfo.end())
|
|
return(*ii).second;
|
|
return NULL;
|
|
}
|
|
|
|
int CDNGameDataManager::GetMapIndexByGateNo(int nMapIndex, int nGateNo, int nSelect)
|
|
{
|
|
if (nMapIndex < 0) return -1;
|
|
if (nGateNo <= 0) return -1;
|
|
if (nSelect < 0) return -1;
|
|
|
|
TMapInfoMap::iterator iter = m_pMapInfo.find(nMapIndex);
|
|
if (iter != m_pMapInfo.end())
|
|
{
|
|
if (nSelect < iter->second->GateMapCount[nGateNo-1])
|
|
return iter->second->GateMapIndexs[nGateNo-1][nSelect];
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
int CDNGameDataManager::GetGateNoByGateNo( int nMapIndex, int nGateNo, int nSelect )
|
|
{
|
|
if (nMapIndex < 0) return -1;
|
|
if (nGateNo <= 0) return -1;
|
|
if (nSelect < 0) return -1;
|
|
|
|
const TMapInfo *pMapInfo = GetMapInfo(nMapIndex);
|
|
if (!pMapInfo) return -1;
|
|
|
|
if (nSelect < pMapInfo->GateMapCount[nGateNo-1])
|
|
return pMapInfo->GateStartIndexs[nGateNo-1][nSelect];
|
|
|
|
return -1;
|
|
}
|
|
|
|
GlobalEnum::eMapTypeEnum CDNGameDataManager::GetMapType(int nMapIndex)
|
|
{
|
|
if (nMapIndex < 0) return GlobalEnum::MAP_UNKNOWN;
|
|
|
|
const TMapInfo *pMapInfo = GetMapInfo(nMapIndex);
|
|
if (!pMapInfo) return GlobalEnum::MAP_UNKNOWN;
|
|
|
|
return pMapInfo->MapType;
|
|
}
|
|
|
|
GlobalEnum::eMapSubTypeEnum CDNGameDataManager::GetMapSubType( int nMapIndex )
|
|
{
|
|
if (nMapIndex < 0)
|
|
return GlobalEnum::MAPSUB_NONE;
|
|
|
|
const TMapInfo *pMapInfo = GetMapInfo(nMapIndex);
|
|
if (!pMapInfo) return GlobalEnum::MAPSUB_NONE;
|
|
|
|
return pMapInfo->MapSubType;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsFindValidMap( const TMapInfo* pMapInfo, int nTargetIndex )
|
|
{
|
|
USHORT wMapIndex = 0;
|
|
int nTemp;
|
|
char szLabel[64];
|
|
DNTableFileFormat *pDungeonSox = GetDNTable( CDnTableDB::TDUNGEONMAP );
|
|
|
|
for( int i=0; i<WORLDMAP_GATECOUNT; i++ )
|
|
{
|
|
for (int j=0; j<pMapInfo->GateMapCount[i]; j++)
|
|
{
|
|
wMapIndex = pMapInfo->GateMapIndexs[i][j];
|
|
if( wMapIndex == 0 ) continue;
|
|
|
|
if( wMapIndex < DUNGEONGATE_OFFSET )
|
|
{
|
|
if( wMapIndex == nTargetIndex )
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
// 胶抛捞瘤 悸栏肺 八荤
|
|
for( int k=0; k<5; k++ )
|
|
{
|
|
sprintf_s( szLabel, "_MapIndex%d", k + 1 );
|
|
nTemp = pDungeonSox->GetFieldFromLablePtr( wMapIndex, szLabel )->GetInteger();
|
|
if( nTemp < 1 ) continue;
|
|
|
|
if( nTemp == nTargetIndex )
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if( pMapInfo->vMapAreaIndex.empty() == false )
|
|
{
|
|
std::vector<int>::const_iterator iter = pMapInfo->vMapAreaIndex.begin();
|
|
for( ; iter != pMapInfo->vMapAreaIndex.end(); ++iter )
|
|
{
|
|
wMapIndex = (*iter);
|
|
if( wMapIndex == nTargetIndex )
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::CheckChangeMap( int nPrevMapIndex, int nNextMapIndex )
|
|
{
|
|
// 某腐磐 积己且 版快
|
|
if( nPrevMapIndex == 0)
|
|
return true;
|
|
|
|
if( nPrevMapIndex == nNextMapIndex )
|
|
return true;
|
|
|
|
// 街规氢栏肺 八荤茄促.
|
|
const TMapInfo* pPrevMapInfo = GetMapInfo( nPrevMapIndex );
|
|
if( !pPrevMapInfo) return false; // 捞傈 甘 单捞磐啊 绝促
|
|
|
|
if( IsFindValidMap(pPrevMapInfo, nNextMapIndex) )
|
|
return true;
|
|
|
|
const TMapInfo* pNextMapInfo = GetMapInfo( nNextMapIndex );
|
|
if( !pNextMapInfo ) return false; // 促澜 甘 单捞磐啊 绝促
|
|
|
|
if( IsFindValidMap( pNextMapInfo, nPrevMapIndex) )
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsMapExpandable(int nMapIndex)
|
|
{
|
|
if (nMapIndex < 0) return false;
|
|
|
|
const TMapInfo *pMapInfo = GetMapInfo(nMapIndex);
|
|
if (!pMapInfo) return false;
|
|
|
|
return pMapInfo->bExpandable;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsVehicleMode(int nMapIndex)
|
|
{
|
|
if (nMapIndex < 0) return false;
|
|
|
|
const TMapInfo *pMapInfo = GetMapInfo(nMapIndex);
|
|
if (!pMapInfo) return false;
|
|
|
|
return pMapInfo->bVehicleMode;
|
|
}
|
|
|
|
#if defined(PRE_ADD_VEHICLE_SPECIAL_ACTION)
|
|
bool CDNGameDataManager::IsVehicleSpecialActionMode(int nMapIndex)
|
|
{
|
|
if (nMapIndex < 0) return false;
|
|
|
|
const TMapInfo *pMapInfo = GetMapInfo(nMapIndex);
|
|
if (!pMapInfo) return false;
|
|
|
|
return pMapInfo->bVehicleSpecalActionMode ? true : false;
|
|
}
|
|
#endif
|
|
|
|
|
|
bool CDNGameDataManager::IsPetMode(int nMapIndex)
|
|
{
|
|
if (nMapIndex < 0) return false;
|
|
|
|
const TMapInfo *pMapInfo = GetMapInfo(nMapIndex);
|
|
if (!pMapInfo) return false;
|
|
|
|
return pMapInfo->bPetMode;
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// Item(ItemTable.dnt - TItemData)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadItemData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox, *pPeriodSox;
|
|
if (m_bAllLoaded){
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TITEM );
|
|
pPeriodSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TITEMPERIOD );
|
|
}
|
|
else{
|
|
pSox = GetDNTable( CDnTableDB::TITEM );
|
|
pPeriodSox = GetDNTable( CDnTableDB::TITEMPERIOD );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TITEM );
|
|
DNTableFileFormat *pPeriodSox = GetDNTable( CDnTableDB::TITEMPERIOD );
|
|
#endif //#ifdef _WORK
|
|
if (!pSox){
|
|
g_Log.Log( LogType::_FILELOG, L"ItemTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
if (pSox->GetItemCount() <= 0){
|
|
g_Log.Log(LogType::_FILELOG, L"ItemTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
if (!pPeriodSox){
|
|
g_Log.Log( LogType::_FILELOG, L"itemperiod.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
if (pPeriodSox->GetItemCount() <= 0){
|
|
g_Log.Log(LogType::_FILELOG, L"itemperiod.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapItemData, m_pItemData );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _NameID;
|
|
int _NameIDParam;
|
|
int _Type;
|
|
int _TypeParam1;
|
|
int _TypeParam2;
|
|
int _TypeParam3;
|
|
int _LevelLimit;
|
|
int _Rank;
|
|
int _Reversion;
|
|
int _IsCash;
|
|
int _IsAuthentication;
|
|
int _IsDestruction;
|
|
int _Amount;
|
|
int _SellAmount;
|
|
int _OverlapCount;
|
|
int _SkillID;
|
|
int _SkillLevel;
|
|
int _SkillUsingType;
|
|
int _AllowMapTypes;
|
|
int _NeedJobClass;
|
|
int _EnchantID;
|
|
int _SealCount;
|
|
int _SealID;
|
|
int _NeedBuyItem;
|
|
int _NeedBuyItemCount;
|
|
int _NeedPvPRank;
|
|
int _IsSealed;
|
|
int _CashTradeCount;
|
|
int _IsEnableCostumeMix;
|
|
int _ApplicableValue;
|
|
int _IsCollectingEvent;
|
|
int _ExchangeType;
|
|
int _NeedBuyLadderPoint;
|
|
int _UseLevelLimit;
|
|
int _NeedUnionPoint;
|
|
int _NeedBuyGuildWarPoint;
|
|
int _isRebuyable;
|
|
#if defined( PRE_ADD_SERVER_WAREHOUSE )
|
|
int _IsWStorage;
|
|
#endif
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._NameID = pSox->GetFieldNum( "_NameID" );
|
|
sFieldNum._NameIDParam = pSox->GetFieldNum( "_NameIDParam" );
|
|
sFieldNum._Type = pSox->GetFieldNum( "_Type" );
|
|
sFieldNum._TypeParam1 = pSox->GetFieldNum( "_TypeParam1" );
|
|
sFieldNum._TypeParam2 = pSox->GetFieldNum( "_TypeParam2" );
|
|
sFieldNum._TypeParam3 = pSox->GetFieldNum( "_TypeParam3" );
|
|
sFieldNum._LevelLimit = pSox->GetFieldNum( "_LevelLimit" );
|
|
sFieldNum._Rank = pSox->GetFieldNum( "_Rank" );
|
|
sFieldNum._Reversion = pSox->GetFieldNum( "_Reversion" );
|
|
sFieldNum._IsCash = pSox->GetFieldNum( "_IsCash" );
|
|
sFieldNum._IsAuthentication = pSox->GetFieldNum( "_IsAuthentication" );
|
|
sFieldNum._IsDestruction = pSox->GetFieldNum( "_IsDestruction" );
|
|
sFieldNum._Amount = pSox->GetFieldNum( "_Amount" );
|
|
sFieldNum._SellAmount = pSox->GetFieldNum( "_SellAmount" );
|
|
sFieldNum._OverlapCount = pSox->GetFieldNum( "_OverlapCount" );
|
|
sFieldNum._SkillID = pSox->GetFieldNum( "_SkillID" );
|
|
sFieldNum._SkillLevel = pSox->GetFieldNum( "_SkillLevel" );
|
|
sFieldNum._SkillUsingType = pSox->GetFieldNum( "_SkillUsingType" );
|
|
sFieldNum._AllowMapTypes = pSox->GetFieldNum( "_AllowMapTypes" );
|
|
sFieldNum._NeedJobClass = pSox->GetFieldNum( "_NeedJobClass" );
|
|
sFieldNum._EnchantID = pSox->GetFieldNum( "_EnchantID" );
|
|
sFieldNum._SealCount = pSox->GetFieldNum( "_SealCount" );
|
|
sFieldNum._SealID = pSox->GetFieldNum( "_SealID" );
|
|
sFieldNum._NeedBuyItem = pSox->GetFieldNum( "_NeedBuyItem" );
|
|
sFieldNum._NeedBuyItemCount = pSox->GetFieldNum( "_NeedBuyItemCount" );
|
|
sFieldNum._NeedPvPRank = pSox->GetFieldNum( "_NeedPvPRank" );
|
|
sFieldNum._IsSealed = pSox->GetFieldNum( "_IsSealed" );
|
|
sFieldNum._CashTradeCount = pSox->GetFieldNum( "_CashTradeCount" );
|
|
sFieldNum._IsEnableCostumeMix= pSox->GetFieldNum( "_Compose" );
|
|
sFieldNum._ApplicableValue = pSox->GetFieldNum( "_ApplicableValue" );
|
|
sFieldNum._IsCollectingEvent = pSox->GetFieldNum("_IsCollectingEvent");
|
|
sFieldNum._ExchangeType = pSox->GetFieldNum("_ExchangeType");
|
|
sFieldNum._NeedBuyLadderPoint = pSox->GetFieldNum("_NeedBuyLadderPoint");
|
|
sFieldNum._UseLevelLimit = pSox->GetFieldNum( "_UseLevelLimit" );
|
|
sFieldNum._NeedUnionPoint = pSox->GetFieldNum( "_NeedUnionPoint" );
|
|
sFieldNum._NeedBuyGuildWarPoint = pSox->GetFieldNum( "_NeedGuildFestPoint" );
|
|
sFieldNum._isRebuyable = pSox->GetFieldNum( "_IsRebuyable" );
|
|
#if defined( PRE_ADD_SERVER_WAREHOUSE )
|
|
sFieldNum._IsWStorage = pSox->GetFieldNum( "_AbleWStorage");
|
|
#endif
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
int nJob = 0;
|
|
int nNameID = 0;
|
|
char *szNameParam = NULL;
|
|
wstring wszName;
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); i++)
|
|
{
|
|
TItemData* pItemData = new TItemData;
|
|
pItemData->Reset();
|
|
|
|
pItemData->nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( pItemData->nItemID );
|
|
|
|
nNameID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NameID )->GetInteger();
|
|
szNameParam = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NameIDParam )->GetString();
|
|
MakeUIStringUseVariableParam( wszName, nNameID, szNameParam );
|
|
|
|
_wcscpy(pItemData->wszItemName, _countof(pItemData->wszItemName), wszName.c_str(), (int)wcslen(wszName.c_str()) );
|
|
|
|
pItemData->nType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Type )->GetInteger();
|
|
pItemData->nTypeParam[0] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._TypeParam1 )->GetInteger();
|
|
pItemData->nTypeParam[1] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._TypeParam2 )->GetInteger();
|
|
pItemData->nTypeParam[2] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._TypeParam3 )->GetInteger();
|
|
pItemData->cLevelLimit = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._LevelLimit )->GetInteger();
|
|
pItemData->cRank = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Rank )->GetInteger();
|
|
pItemData->cReversion = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Reversion )->GetInteger();
|
|
pItemData->IsCash = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._IsCash )->GetInteger() ? true : false;
|
|
pItemData->IsAuthentication = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._IsAuthentication )->GetInteger() ? true : false;
|
|
pItemData->IsDestruction = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._IsDestruction )->GetInteger() ? true : false;
|
|
pItemData->nAmount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Amount )->GetInteger();
|
|
pItemData->nSellAmount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SellAmount )->GetInteger();
|
|
pItemData->nOverlapCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._OverlapCount )->GetInteger();
|
|
pItemData->nSkillID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SkillID )->GetInteger();
|
|
pItemData->cSkillLevel = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SkillLevel )->GetInteger();
|
|
pItemData->cSkillUsingType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SkillUsingType )->GetInteger();
|
|
pItemData->nAllowMapType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._AllowMapTypes )->GetInteger();
|
|
pItemData->nNeedBuyItemID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NeedBuyItem )->GetInteger();
|
|
pItemData->nNeedBuyItemCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NeedBuyItemCount )->GetInteger();
|
|
pItemData->nNeedPvPRank = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NeedPvPRank )->GetInteger();
|
|
pItemData->IsSealed = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._IsSealed)->GetInteger() ? true : false;
|
|
pItemData->nCashTradeCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._CashTradeCount )->GetInteger();
|
|
pItemData->IsEnableCostumeMix = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._IsEnableCostumeMix)->GetInteger() ? true : false;
|
|
pItemData->nApplicableValue = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ApplicableValue )->GetInteger();
|
|
pItemData->IsCollectingEvent = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._IsCollectingEvent)->GetInteger() ? true : false;
|
|
pItemData->nExchangeCode = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ExchangeType )->GetInteger();
|
|
pItemData->iNeedBuyLadderPoint = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NeedBuyLadderPoint )->GetInteger();
|
|
pItemData->iUseLevelLimit = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._UseLevelLimit )->GetInteger();
|
|
pItemData->iNeedBuyUnionPoint = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NeedUnionPoint )->GetInteger();
|
|
pItemData->iNeedBuyGuildWarPoint = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NeedBuyGuildWarPoint )->GetInteger();
|
|
pItemData->bRebuyable = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._isRebuyable )->GetInteger() ? true : false;
|
|
#if defined( PRE_ADD_SERVER_WAREHOUSE )
|
|
pItemData->IsWStorage = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._IsWStorage )->GetInteger() ? true : false;
|
|
#endif
|
|
|
|
std::vector<std::string> JobTokens;
|
|
|
|
char *pStr = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NeedJobClass )->GetString();
|
|
TokenizeA(pStr, JobTokens, ";");
|
|
|
|
for (int j = 0; j < (int)JobTokens.size(); j++)
|
|
{
|
|
int iJob = atoi(JobTokens[j].c_str());
|
|
if( iJob > 0 )
|
|
pItemData->nNeedJobClassList.push_back(iJob);
|
|
}
|
|
|
|
pItemData->nMaxCoolTime = GetSkillDelayTime(pItemData->nSkillID, pItemData->cSkillLevel);
|
|
pItemData->nEnchantID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._EnchantID)->GetInteger();
|
|
|
|
pItemData->cSealCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SealCount )->GetInteger();
|
|
pItemData->nSealID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SealID )->GetInteger();
|
|
|
|
pItemData->nPeriod = pPeriodSox->GetFieldFromLablePtr( pItemData->nItemID, "_Period" )->GetInteger();
|
|
|
|
std::pair<TMapItemData::iterator,bool> Ret = m_pItemData.insert(make_pair(pItemData->nItemID, pItemData));
|
|
|
|
if( pItemData->cReversion == ITEMREVERSION_GUILD )
|
|
m_GuildReversionTableData.insert( make_pair(pItemData->nItemID, 1) );
|
|
if( Ret.second == false )
|
|
delete pItemData;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TItemData* CDNGameDataManager::GetItemData(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return NULL;
|
|
|
|
TMapItemData::iterator iter = m_pItemData.find(nItemID);
|
|
if (iter != m_pItemData.end()){
|
|
return iter->second;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
const TItemData* CDNGameDataManager::GetItemData(int nItemID) const
|
|
{
|
|
if (nItemID <= 0) return NULL;
|
|
|
|
TMapItemData::const_iterator iter = m_pItemData.find(nItemID);
|
|
if (iter != m_pItemData.end()){
|
|
return iter->second;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsItemNeedJob(int nItemID, int nJob)
|
|
{
|
|
if (nItemID <= 0) return false;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return false;
|
|
if (pItemData->nNeedJobClassList.empty()) return true;
|
|
|
|
for (int i = 0; i <(int)pItemData->nNeedJobClassList.size(); i++){
|
|
if (pItemData->nNeedJobClassList[i] == nJob) return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsPermitItemJob(int nItemID, BYTE *cJobArray)
|
|
{
|
|
if (nItemID <= 0) return false;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return false;
|
|
if (pItemData->nNeedJobClassList.empty()) return true;
|
|
|
|
for (int j = 0; j < JOBMAX; j++){
|
|
if (cJobArray[j] <= 0) continue;
|
|
for (int i = 0; i <(int)pItemData->nNeedJobClassList.size(); i++){
|
|
if (pItemData->nNeedJobClassList[i] == cJobArray[j]) return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsItemNeedJobHistory( int nItemID, const BYTE* cJobArray, bool bForDice )
|
|
{
|
|
if ( nItemID <= 0 ) return false;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return false;
|
|
if (pItemData->nNeedJobClassList.empty())
|
|
return bForDice ? false : true;
|
|
|
|
for (int i = 0; i <(int)pItemData->nNeedJobClassList.size(); i++)
|
|
{
|
|
for( int k = 0; k < JOBMAX; ++k )
|
|
{
|
|
if( 0 < cJobArray[ k ] )
|
|
{
|
|
if(pItemData->nNeedJobClassList[ i ] == cJobArray[ k ])
|
|
return true;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsItemOnlyNeedJob(int nItemID, int nJob) const
|
|
{
|
|
if (nItemID <= 0)
|
|
return false;
|
|
|
|
const TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData)
|
|
return false;
|
|
|
|
if (pItemData->nNeedJobClassList.empty())
|
|
return false;
|
|
|
|
for (int i = 0; i <(int)pItemData->nNeedJobClassList.size(); i++)
|
|
{
|
|
if (pItemData->nNeedJobClassList[i] == nJob)
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
int CDNGameDataManager::GetItemMainType(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return 0;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return 0;
|
|
|
|
return pItemData->nType;
|
|
}
|
|
|
|
BYTE CDNGameDataManager::GetItemDetailType(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return 0;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return 0;
|
|
|
|
return GetItemDetailType(pItemData);
|
|
}
|
|
|
|
BYTE CDNGameDataManager::GetItemDetailType(TItemData * pItemData)
|
|
{
|
|
if (pItemData == NULL)
|
|
return 0;
|
|
|
|
switch(pItemData->nType)
|
|
{
|
|
case ITEMTYPE_WEAPON: // 公扁/傍拜焊炼备
|
|
{
|
|
TWeaponData *pWeapon = GetWeaponData(pItemData->nItemID);
|
|
if (!pWeapon) break;
|
|
return pWeapon->cEquipType;
|
|
}
|
|
break;
|
|
|
|
case ITEMTYPE_PARTS: // 规绢备
|
|
{
|
|
TPartData *pPart = GetPartData(pItemData->nItemID);
|
|
if (!pPart) break;
|
|
return pPart->nParts;
|
|
}
|
|
break;
|
|
|
|
case ITEMTYPE_NORMAL: // 扁鸥
|
|
break;
|
|
|
|
case ITEMTYPE_SKILL:
|
|
break;
|
|
|
|
case ITEMTYPE_JEWEL: // 焊苛
|
|
break;
|
|
|
|
case ITEMTYPE_PLATE: // 巩厘(敲饭捞飘)
|
|
break;
|
|
|
|
case ITEMTYPE_INSTANT: //
|
|
break;
|
|
case ITEMTYPE_GLYPH: // 巩厘
|
|
{
|
|
return GetGlyphType(pItemData->nItemID);
|
|
}
|
|
break;
|
|
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
case ITEMTYPE_TALISMAN: // 呕府胶父
|
|
break;
|
|
#endif
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
BYTE CDNGameDataManager::GetItemRank(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return 0;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return 0;
|
|
|
|
return pItemData->cRank;
|
|
}
|
|
|
|
int CDNGameDataManager::GetItemOverlapCount(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return 0;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return 0;
|
|
|
|
return pItemData->nOverlapCount;
|
|
}
|
|
|
|
BYTE CDNGameDataManager::GetItemReversion(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return 0;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return 0;
|
|
|
|
return pItemData->cReversion;
|
|
}
|
|
|
|
int CDNGameDataManager::GetItemPrice(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return 0;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return 0;
|
|
|
|
return pItemData->nAmount;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsItemDestruction(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return 0;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return 0;
|
|
|
|
return pItemData->IsDestruction;
|
|
}
|
|
|
|
char CDNGameDataManager::GetItemSkillUsingType(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return 0;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return 0;
|
|
|
|
return pItemData->cSkillUsingType;
|
|
}
|
|
|
|
int CDNGameDataManager::GetItemTypeParam1(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return 0;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return 0;
|
|
|
|
return pItemData->nTypeParam[0];
|
|
}
|
|
|
|
int CDNGameDataManager::GetItemTypeParam2(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return 0;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return 0;
|
|
|
|
return pItemData->nTypeParam[1];
|
|
}
|
|
|
|
bool CDNGameDataManager::IsCashItem(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return false;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return false;
|
|
|
|
return pItemData->IsCash;
|
|
}
|
|
|
|
int CDNGameDataManager::GetItemCashTradeCount(int nItemID)
|
|
{
|
|
#if defined(_JP)
|
|
return 0; // 老夯篮 救敬促
|
|
#endif // _JP
|
|
|
|
if (nItemID <= 0) return 0;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return 0;
|
|
|
|
return pItemData->nCashTradeCount;
|
|
}
|
|
|
|
BYTE CDNGameDataManager::GetItemLevelLimit(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return 0;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return 0;
|
|
|
|
return pItemData->cLevelLimit;
|
|
}
|
|
|
|
char CDNGameDataManager::GetItemSealCount(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return 0;
|
|
|
|
TItemData *pItemData = GetItemData(nItemID);
|
|
if (!pItemData) return 0;
|
|
|
|
return pItemData->cSealCount;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsUseItemAllowMapTypeCheck(int iItemID, int iMapIndex)
|
|
{
|
|
TItemData* pItemData = GetItemData( iItemID );
|
|
if( pItemData == NULL )
|
|
return false;
|
|
|
|
const TMapInfo* pMapData = GetMapInfo( iMapIndex );
|
|
if( pMapData == NULL )
|
|
return false;
|
|
|
|
return (pItemData->nAllowMapType&pMapData->nAllowMapType) ? true : false;
|
|
}
|
|
|
|
int CDNGameDataManager::GetMapPermitLevel(int nMapID)
|
|
{
|
|
TVecVillagePermitLevel::iterator ii;
|
|
for (ii = m_vVillagePermitLevel.begin(); ii != m_vVillagePermitLevel.end(); ii++)
|
|
{
|
|
if ((*ii).first == nMapID)
|
|
return(*ii).second;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
#if defined(PRE_ADD_CHALLENGE_DARKLAIR)
|
|
bool CDNGameDataManager::IsCloseGateByTime(int nMapIndex)
|
|
{
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TMAPGATE );
|
|
|
|
std::vector<int> nVecDeungeonItemList;
|
|
pSox->GetItemIDListFromField( "_MapIndex", nMapIndex, nVecDeungeonItemList );
|
|
|
|
for( DWORD i=0; i<nVecDeungeonItemList.size(); i++ )
|
|
{
|
|
int nItemID = nVecDeungeonItemList[i];
|
|
if (nItemID <= 0)
|
|
continue;
|
|
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TMAPGATE );
|
|
char* pszDateTime = pSox->GetFieldFromLablePtr( nItemID, "_DateTime" )->GetString();
|
|
if(!pszDateTime )
|
|
continue;
|
|
|
|
std::vector<string> vGateDateTime;
|
|
TokenizeA(pszDateTime , vGateDateTime, ":");
|
|
|
|
int nType = 0, nAttr1 = 0, nAttr2 = 0, nAttr3 = 0;
|
|
if (vGateDateTime.size() > 0)
|
|
{
|
|
CTimeSet LocalSet;
|
|
nType = atoi(vGateDateTime[0].c_str());
|
|
//坷锹 矫埃
|
|
if (nType == MapGateCondition::oDailyHours && vGateDateTime.size() == 3) // 矫埃
|
|
{
|
|
nAttr1 = atoi(vGateDateTime[1].c_str());
|
|
nAttr2 = atoi(vGateDateTime[2].c_str());
|
|
|
|
if (nAttr1 <= LocalSet.GetHour() && LocalSet.GetHour() < nAttr2)
|
|
continue;
|
|
else
|
|
return true;
|
|
}
|
|
else if (nType == MapGateCondition::oDayOfWeek && vGateDateTime.size() == 2) // 夸老
|
|
{
|
|
nAttr1 = atoi(vGateDateTime[1].c_str());
|
|
if (LocalSet.GetDayOfWeek() != nAttr1)
|
|
return true;
|
|
}
|
|
else if (nType == MapGateCondition::oDayOfWeekAndHours && vGateDateTime.size() == 4) // 夸老 & 矫埃
|
|
{
|
|
nAttr1 = atoi(vGateDateTime[1].c_str());
|
|
nAttr2 = atoi(vGateDateTime[2].c_str());
|
|
nAttr3 = atoi(vGateDateTime[3].c_str());
|
|
|
|
if (LocalSet.GetDayOfWeek() != nAttr1)
|
|
return true;
|
|
|
|
if (nAttr2 <= LocalSet.GetHour() && LocalSet.GetHour() < nAttr3)
|
|
continue;
|
|
else
|
|
return true;
|
|
}
|
|
else if (nType == MapGateCondition::oDayOfWeekDuringFatigueTime && vGateDateTime.size() == 2) // 夸老 乔肺档 矫埃
|
|
{
|
|
nAttr1 = atoi(vGateDateTime[1].c_str());
|
|
if( LocalSet.GetDayOfWeek() != nAttr1 && LocalSet.GetDayOfWeek() != (nAttr1+1)%7 )
|
|
return true;
|
|
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TSCHEDULE );
|
|
if( !pSox )
|
|
return true;
|
|
|
|
int nItemID = CDNSchedule::ResetFatigue +1;
|
|
if( !pSox->IsExistItem( nItemID ) ) return true;
|
|
int nHour = pSox->GetFieldFromLablePtr( nItemID, "_Hour" )->GetInteger();
|
|
int nMinute = pSox->GetFieldFromLablePtr( nItemID, "_Minute" )->GetInteger();
|
|
|
|
if( LocalSet.GetDayOfWeek() == nAttr1 ) //檬扁拳 矫埃 捞饶 牢瘤 玭
|
|
{
|
|
if( LocalSet.GetHour() >= nHour && LocalSet.GetMinute() >= nMinute )
|
|
continue;
|
|
else
|
|
return true;
|
|
}
|
|
else if( LocalSet.GetDayOfWeek() == (nAttr1+1)%7 ) //檬扁拳 矫埃 傈 牢瘤 玭
|
|
{
|
|
if( LocalSet.GetHour() < nHour || (LocalSet.GetMinute() < nMinute && LocalSet.GetHour() <= nHour) )
|
|
continue;
|
|
else
|
|
return true;
|
|
}
|
|
}
|
|
//努肺令 矫埃
|
|
else if (nType == MapGateCondition::cMonthlyHours && vGateDateTime.size() == 4) // 概岿 秦寸老 & 矫埃父 *努肺令*
|
|
{
|
|
nAttr1 = atoi(vGateDateTime[1].c_str());
|
|
nAttr2 = atoi(vGateDateTime[2].c_str());
|
|
nAttr3 = atoi(vGateDateTime[3].c_str());
|
|
|
|
if (LocalSet.GetDay() != nAttr1)
|
|
continue;
|
|
|
|
if (LocalSet.GetHour() >= nAttr2 && LocalSet.GetHour() < nAttr3)
|
|
return true;
|
|
else
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
#endif
|
|
|
|
int CDNGameDataManager::GetMapPermitPartyCount(int nMapID)
|
|
{
|
|
TVecPermitPartyCount::iterator ii;
|
|
for (ii = m_vPermitPartyCount.begin(); ii != m_vPermitPartyCount.end(); ii++)
|
|
{
|
|
if ((*ii).first == nMapID)
|
|
return(*ii).second;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// Actor(ActorTable.dnt - TActorData)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadActorData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TACTOR );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TACTOR );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TACTOR );
|
|
#endif //#ifdef _WORK
|
|
if (!pSox){
|
|
g_Log.Log(LogType::_FILELOG, L"ActorTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pSox->GetItemCount() <= 0){
|
|
g_Log.Log(LogType::_ERROR, L"ActorTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapActorData, m_pActorData );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TActorData* pActorData = new TActorData;
|
|
memset(pActorData, 0, sizeof(TActorData));
|
|
|
|
pActorData->nActorID = pSox->GetItemID(i);
|
|
std::pair<TMapActorData::iterator,bool> Ret = m_pActorData.insert(make_pair(pActorData->nActorID, pActorData));
|
|
if( Ret.second == false )
|
|
delete pActorData;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TActorData* CDNGameDataManager::GetActorData(int nActorIndex)
|
|
{
|
|
if (nActorIndex <= 0) return NULL;
|
|
if (m_pActorData.empty()) return NULL;
|
|
|
|
TMapActorData::iterator iter = m_pActorData.find(nActorIndex);
|
|
if (iter != m_pActorData.end()){
|
|
return iter->second;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// Npc(NPCTable.dnt - TNpcData, TActorData)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadNpcData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TNPC );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TNPC );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TNPC );
|
|
#endif //#ifdef _WORK
|
|
if (!pSox)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"NPCTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pSox->GetItemCount() <= 0)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"NPCTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef PRE_FIX_MEMOPT_EXT
|
|
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pFileNameSox;
|
|
if (m_bAllLoaded)
|
|
pFileNameSox = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TFILE);
|
|
else
|
|
pFileNameSox = GetDNTable(CDnTableDB::TFILE);
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pFileNameSox = GetDNTable(CDnTableDB::TFILE);
|
|
#endif //#ifdef _WORK
|
|
if (!pFileNameSox)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"FileTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pFileNameSox->GetItemCount() <= 0)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"FileTable.dnt Count(%d)\r\n", pFileNameSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#endif //#ifdef PRE_FIX_MEMOPT_EXT
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapNpcData, m_pNpcData );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[256];
|
|
memset( szTemp, 0, sizeof(szTemp) );
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _NameID;
|
|
int _ActorIndex;
|
|
int _TalkFile;
|
|
int _ScriptFile;
|
|
int _Param[2];
|
|
std::vector<int> _Quest;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._NameID = pSox->GetFieldNum( "_NameID" );
|
|
sFieldNum._ActorIndex = pSox->GetFieldNum( "_ActorIndex" );
|
|
sFieldNum._TalkFile = pSox->GetFieldNum( "_TalkFile" );
|
|
sFieldNum._ScriptFile = pSox->GetFieldNum( "_ScriptFile" );
|
|
sFieldNum._Param[0] = pSox->GetFieldNum( "_Param1" );
|
|
sFieldNum._Param[1] = pSox->GetFieldNum( "_Param2" );
|
|
sFieldNum._Quest.reserve( QUEST_MAX_CNT );
|
|
for( int j=0 ; j<QUEST_MAX_CNT ; ++j )
|
|
{
|
|
sprintf_s( szTemp, "_Quest%d", j+1 );
|
|
sFieldNum._Quest.push_back( pSox->GetFieldNum( szTemp ) );
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); i++)
|
|
{
|
|
TNpcData* pNpcData = new TNpcData;
|
|
memset(pNpcData, 0, sizeof(TNpcData));
|
|
|
|
pNpcData->nNpcID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( pNpcData->nNpcID );
|
|
|
|
#if defined(PRE_ADD_MULTILANGUAGE)
|
|
//npc包访郴侩篮 粱歹 积阿秦 毫具茄促. 老窜篮 叼迄飘攫绢蔼栏肺汲沥
|
|
_wcscpy( pNpcData->wszName, _countof(pNpcData->wszName), GetEtUIXML().GetUIString( CEtUIXML::idCategory1, pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NameID )->GetInteger(), MultiLanguage::eDefaultLanguage ),
|
|
(int)wcslen(GetEtUIXML().GetUIString( CEtUIXML::idCategory1, pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NameID )->GetInteger(), MultiLanguage::eDefaultLanguage )) );
|
|
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
_wcscpy( pNpcData->wszName, _countof(pNpcData->wszName), GetEtUIXML().GetUIString( CEtUIXML::idCategory1, pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NameID )->GetInteger() ),
|
|
(int)wcslen(GetEtUIXML().GetUIString( CEtUIXML::idCategory1, pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NameID )->GetInteger() )) );
|
|
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
int ActorIndex = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ActorIndex )->GetInteger();
|
|
TActorData* pActorData = GetActorData(ActorIndex);
|
|
if( pActorData )
|
|
pNpcData->ActorData = *pActorData;
|
|
//else
|
|
// g_Log.g( L"[NpcID:%d ActorID:%d] ActorID not found!!\r\n", pNpcData->nNpcID, ActorIndex);
|
|
|
|
pNpcData->nParam[0] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Param[0] )->GetInteger();
|
|
pNpcData->nParam[1] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Param[1] )->GetInteger();
|
|
_strcpy( pNpcData->szTalkFile, _countof(pNpcData->szTalkFile), pSox->GetFieldFromLablePtr( iIdx, sFieldNum._TalkFile )->GetString(), (int)strlen(pSox->GetFieldFromLablePtr( iIdx, sFieldNum._TalkFile )->GetString()));
|
|
_strcpy( pNpcData->szScriptFile, _countof(pNpcData->szScriptFile), pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ScriptFile )->GetString(), (int)strlen(pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ScriptFile )->GetString()));
|
|
|
|
for( int j=0 ; j<QUEST_MAX_CNT ; ++j )
|
|
pNpcData->QuestIndexArr[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Quest[j] )->GetInteger();
|
|
|
|
std::pair<TMapNpcData::iterator,bool> Ret = m_pNpcData.insert(make_pair(pNpcData->nNpcID, pNpcData));
|
|
if( Ret.second == false )
|
|
delete pNpcData;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TNpcData* CDNGameDataManager::GetNpcData( int nNpcIndex )
|
|
{
|
|
if (m_pNpcData.empty()) return NULL;
|
|
|
|
TMapNpcData::iterator iter = m_pNpcData.find(nNpcIndex);
|
|
if (iter != m_pNpcData.end()){
|
|
return iter->second;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// Weapon(WeaponTable.dnt - TWeaponData)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadWeaponData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
DNTableFileFormat *pItemSox;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TWEAPON );
|
|
pItemSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TITEM );
|
|
}
|
|
else
|
|
{
|
|
pSox = GetDNTable( CDnTableDB::TWEAPON );
|
|
pItemSox = GetDNTable( CDnTableDB::TITEM );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TWEAPON );
|
|
DNTableFileFormat *pItemSox = GetDNTable( CDnTableDB::TITEM );
|
|
#endif
|
|
if (!pSox){
|
|
g_Log.Log(LogType::_FILELOG, L"WeaponTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pSox->GetItemCount() <= 0){
|
|
g_Log.Log(LogType::_FILELOG, L"WeaponTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapWeaponData, m_pWeaponData );
|
|
}
|
|
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _EquipType;
|
|
int _Length;
|
|
int _Durability;
|
|
int _DurabilityRepairCoin;
|
|
int _OneType;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._EquipType = pSox->GetFieldNum( "_EquipType" );
|
|
sFieldNum._Length = pSox->GetFieldNum( "_Length" );
|
|
sFieldNum._Durability = pSox->GetFieldNum( "_Durability" );
|
|
sFieldNum._DurabilityRepairCoin = pSox->GetFieldNum( "_DurabilityRepairCoin" );
|
|
sFieldNum._OneType = pSox->GetFieldNum( "_OneType" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
DNTableCell Field;
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); i++)
|
|
{
|
|
TWeaponData* pWeaponData = new TWeaponData;
|
|
memset(pWeaponData, 0, sizeof(TWeaponData));
|
|
|
|
pWeaponData->nWeaponIndex = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( pWeaponData->nWeaponIndex );
|
|
|
|
pWeaponData->cEquipType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._EquipType )->GetInteger();
|
|
pWeaponData->nLength = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Length )->GetInteger();
|
|
pWeaponData->nDurability = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Durability )->GetInteger();
|
|
pWeaponData->nDurabilityRepairCoin = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._DurabilityRepairCoin )->GetInteger();
|
|
pWeaponData->bOneType = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum._OneType )->GetInteger() == TRUE ) ? true : false;
|
|
|
|
memset( pWeaponData->nPermitJob, 0, sizeof(pWeaponData->nPermitJob) );
|
|
|
|
if( pItemSox->GetFieldFromLable( pWeaponData->nWeaponIndex, "_NeedJobClass", Field ) == false )
|
|
{
|
|
SAFE_DELETE( pWeaponData );
|
|
continue;
|
|
}
|
|
char *szNeedJob = Field.GetString();
|
|
|
|
for( int j=0;; j++ )
|
|
{
|
|
const char *pStr = _GetSubStrByCount( j, szNeedJob, ';' );
|
|
if( pStr == NULL )
|
|
break;
|
|
pWeaponData->nPermitJob[j] = atoi(pStr);
|
|
}
|
|
|
|
std::pair<TMapWeaponData::iterator,bool> Ret = m_pWeaponData.insert(make_pair(pWeaponData->nWeaponIndex, pWeaponData));
|
|
if( Ret.second == false )
|
|
delete pWeaponData;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TWeaponData* CDNGameDataManager::GetWeaponData(int nWeaponIndex)
|
|
{
|
|
if (m_pWeaponData.empty()) return NULL;
|
|
|
|
TMapWeaponData::iterator iter = m_pWeaponData.find(nWeaponIndex);
|
|
if (iter != m_pWeaponData.end()){
|
|
return iter->second;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// Part(PartsTable.dnt - TPartData)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadPartData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
DNTableFileFormat *pItemSox;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPARTS );
|
|
pItemSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TITEM );
|
|
}
|
|
else
|
|
{
|
|
pSox = GetDNTable( CDnTableDB::TPARTS );
|
|
pItemSox = GetDNTable( CDnTableDB::TITEM );
|
|
}
|
|
|
|
#ifdef PRE_FIX_MEMOPT_EXT
|
|
DNTableFileFormat *pFileNameSox;
|
|
if (m_bAllLoaded)
|
|
pFileNameSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TFILE );
|
|
else
|
|
pFileNameSox = GetDNTable( CDnTableDB::TFILE );
|
|
|
|
if (!pFileNameSox ||(pFileNameSox->GetItemCount() <= 0))
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"FileTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
#endif //#ifdef PRE_FIX_MEMOPT_EXT
|
|
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TPARTS );
|
|
DNTableFileFormat *pItemSox = GetDNTable( CDnTableDB::TITEM );
|
|
#ifdef PRE_FIX_MEMOPT_EXT
|
|
DNTableFileFormat *pFileNameSox = GetDNTable( CDnTableDB::TFILE );
|
|
if (!pFileNameSox ||(pFileNameSox->GetItemCount() <= 0))
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"FileTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
#endif //#ifdef PRE_FIX_MEMOPT_EXT
|
|
|
|
#endif //#ifdef _WORK
|
|
if (!pSox){
|
|
g_Log.Log(LogType::_FILELOG, L"PartsTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pSox->GetItemCount() <= 0){
|
|
g_Log.Log(LogType::_FILELOG, L"PartsTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapPartData, m_pPartData );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _Parts;
|
|
int _Durability;
|
|
int _DurabilityRepairCoin;
|
|
int _SubParts[4];
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._Parts = pSox->GetFieldNum( "_Parts" );
|
|
sFieldNum._Durability = pSox->GetFieldNum( "_Durability" );
|
|
sFieldNum._DurabilityRepairCoin = pSox->GetFieldNum( "_DurabilityRepairCoin" );
|
|
sFieldNum._SubParts[0] = pSox->GetFieldNum( "_SubParts1" );
|
|
sFieldNum._SubParts[1] = pSox->GetFieldNum( "_SubParts2" );
|
|
sFieldNum._SubParts[2] = pSox->GetFieldNum( "_SubParts3" );
|
|
sFieldNum._SubParts[3] = pSox->GetFieldNum( "_SubParts4" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
DNTableCell Field;
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); i++)
|
|
{
|
|
TPartData* pPartData = new TPartData;
|
|
//2010.10.7 haling STL 焊龋 困秦 积己磊肺 函券
|
|
//memset(pPartData, 0, sizeof(TPartData));
|
|
|
|
pPartData->nPartIndex = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( pPartData->nPartIndex );
|
|
|
|
pPartData->nParts = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Parts )->GetInteger();
|
|
pPartData->nDurability = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Durability )->GetInteger();
|
|
pPartData->nDurabilityRepairCoin = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._DurabilityRepairCoin )->GetInteger();
|
|
for (int j = 0; j < 4; j++){
|
|
int nSubParts = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SubParts[j] )->GetInteger();
|
|
if (nSubParts > 0)
|
|
pPartData->nSubPartsList.push_back(nSubParts);
|
|
}
|
|
|
|
memset( pPartData->nPermitJob, 0, sizeof(pPartData->nPermitJob) );
|
|
if( pItemSox->GetFieldFromLable( pPartData->nPartIndex, "_NeedJobClass", Field ) == false )
|
|
{
|
|
SAFE_DELETE( pPartData );
|
|
continue;
|
|
}
|
|
|
|
char *szNeedJob = Field.GetString();
|
|
for( int j=0; j<10; j++ )
|
|
{
|
|
const char *pStr = _GetSubStrByCount( j, szNeedJob, ';' );
|
|
if( pStr == NULL )
|
|
break;
|
|
pPartData->nPermitJob[j] = atoi(pStr);
|
|
}
|
|
|
|
std::pair<TMapPartData::iterator,bool> Ret = m_pPartData.insert(make_pair(pPartData->nPartIndex, pPartData));
|
|
if( Ret.second == false )
|
|
delete pPartData;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TPartData* CDNGameDataManager::GetPartData(int nPartIndex)
|
|
{
|
|
if (m_pPartData.empty()) return NULL;
|
|
|
|
TMapPartData::iterator iter = m_pPartData.find(nPartIndex);
|
|
if (iter != m_pPartData.end()){
|
|
return iter->second;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
const TPartData* CDNGameDataManager::GetPartData(int nPartIndex) const
|
|
{
|
|
if (m_pPartData.empty()) return NULL;
|
|
|
|
TMapPartData::const_iterator iter = m_pPartData.find(nPartIndex);
|
|
if (iter != m_pPartData.end()){
|
|
return iter->second;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsSubParts(int nPartIndex)
|
|
{
|
|
TPartData *pPartData = GetPartData(nPartIndex);
|
|
if (!pPartData) return false;
|
|
if (pPartData->nSubPartsList.empty()) return false;
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsFaceParts(int nPartIndex)
|
|
{
|
|
TPartData *pPartData = GetPartData(nPartIndex);
|
|
if (!pPartData) return false;
|
|
|
|
if (pPartData->nParts == EQUIP_FACE) return true;
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsHairParts(int nPartIndex)
|
|
{
|
|
TPartData *pPartData = GetPartData(nPartIndex);
|
|
if (!pPartData) return false;
|
|
|
|
if (pPartData->nParts == EQUIP_HAIR) return true;
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadPotentialJewelData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPOTENTIALJEWEL );
|
|
}
|
|
else
|
|
{
|
|
pSox = GetDNTable( CDnTableDB::TPOTENTIALJEWEL );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TPOTENTIALJEWEL );
|
|
#endif //#ifdef _WORK
|
|
if (!pSox){
|
|
g_Log.Log(LogType::_FILELOG, L"PotentialJewelTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pSox->GetItemCount() <= 0){
|
|
g_Log.Log(LogType::_FILELOG, L"PotentialJewelTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapPotentialJewelData, m_pPotentialJewelData );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _ApplicableValue;
|
|
int _PotentialNo;
|
|
int _IsErasable;
|
|
int _CanApplySealedItem;
|
|
|
|
#if defined(PRE_ADD_REMOVE_PREFIX)
|
|
int _IsSuffix;
|
|
#endif // PRE_ADD_REMOVE_PREFIX
|
|
#if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
|
|
int _nRollbackAmount;
|
|
#endif // #if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._ApplicableValue = pSox->GetFieldNum( "_ApplicableValue" );
|
|
sFieldNum._PotentialNo = pSox->GetFieldNum( "_PotentialNo" );
|
|
sFieldNum._IsErasable = pSox->GetFieldNum( "_IsErasable" );
|
|
sFieldNum._CanApplySealedItem = pSox->GetFieldNum( "_CanApplySealedItem" );
|
|
|
|
#if defined(PRE_ADD_REMOVE_PREFIX)
|
|
sFieldNum._IsSuffix = pSox->GetFieldNum( "_Issuffix" );
|
|
#endif // PRE_ADD_REMOVE_PREFIX
|
|
#if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
|
|
sFieldNum._nRollbackAmount = pSox->GetFieldNum("_Charge");
|
|
#endif // #if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); i++)
|
|
{
|
|
TPotentialJewelData* pPotentialData = new TPotentialJewelData;
|
|
memset(pPotentialData, 0, sizeof(TPotentialJewelData));
|
|
|
|
pPotentialData->nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( pPotentialData->nItemID );
|
|
|
|
pPotentialData->nApplyApplicableValue = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ApplicableValue )->GetInteger();
|
|
pPotentialData->nPotentialNo = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._PotentialNo )->GetInteger();
|
|
pPotentialData->bErasable = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum._IsErasable )->GetInteger() == TRUE ) ? true : false;
|
|
pPotentialData->bCanApplySealedItem = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum._CanApplySealedItem )->GetInteger() == TRUE ) ? true : false;
|
|
|
|
#if defined(PRE_ADD_REMOVE_PREFIX)
|
|
pPotentialData->bSuffix = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum._IsSuffix )->GetInteger() == TRUE ) ? true : false;
|
|
#endif // PRE_ADD_REMOVE_PREFIX
|
|
#if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
|
|
pPotentialData->nRollbackAmount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._nRollbackAmount )->GetInteger();
|
|
#endif // #if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
|
|
std::pair<TMapPotentialJewelData::iterator,bool> Ret = m_pPotentialJewelData.insert(make_pair(pPotentialData->nItemID, pPotentialData));
|
|
if( Ret.second == false )
|
|
delete pPotentialData;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TPotentialJewelData *CDNGameDataManager::GetPotentialJewelData( int nItemID )
|
|
{
|
|
if (m_pPotentialJewelData.empty()) return NULL;
|
|
|
|
TMapPotentialJewelData::iterator iter = m_pPotentialJewelData.find(nItemID);
|
|
if (iter != m_pPotentialJewelData.end()){
|
|
return iter->second;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadEnchantJewelData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TENCHANTJEWEL );
|
|
}
|
|
else
|
|
{
|
|
pSox = GetDNTable( CDnTableDB::TENCHANTJEWEL );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TENCHANTJEWEL );
|
|
#endif //#ifdef _WORK
|
|
if (!pSox){
|
|
g_Log.Log(LogType::_FILELOG, L"EnchantJewelTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pSox->GetItemCount() <= 0){
|
|
g_Log.Log(LogType::_FILELOG, L"EnchantJewelTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapEnchantJewelData, m_pEnchantJewelData );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _ApplicableValue; // Potential苞 付蛮啊瘤
|
|
int _RequireMaxItemLevel; // 捞 力茄饭骇 捞窍 酒捞袍俊父 利侩啊瓷(困 _ApplicableValue客 般摹绰 扁瓷捞唱 技何炼例阑 困秦 眠啊)
|
|
int _RequireEnchantLevel; // 捞 碍拳荐摹焊促 臭霸 碍拳等 酒捞袍俊父 利侩啊瓷
|
|
int _EnchantLevel; // 捞 碍拳饭骇肺 函版.
|
|
int _CanApplySealedItem;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._ApplicableValue = pSox->GetFieldNum( "_ApplicableValue" );
|
|
sFieldNum._RequireMaxItemLevel = pSox->GetFieldNum( "_RequireMaxItemLevel" );
|
|
sFieldNum._RequireEnchantLevel = pSox->GetFieldNum( "_RequireEnchantLevel" );
|
|
sFieldNum._EnchantLevel = pSox->GetFieldNum( "_EnchantLevel" );
|
|
sFieldNum._CanApplySealedItem = pSox->GetFieldNum( "_CanApplySealedItem" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); i++)
|
|
{
|
|
TEnchantJewelData* pEnchantJewelData = new TEnchantJewelData;
|
|
memset(pEnchantJewelData, 0, sizeof(TEnchantJewelData));
|
|
|
|
pEnchantJewelData->nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( pEnchantJewelData->nItemID );
|
|
|
|
pEnchantJewelData->nApplyApplicableValue = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ApplicableValue )->GetInteger();
|
|
pEnchantJewelData->nRequireMaxItemLevel = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._RequireMaxItemLevel )->GetInteger();
|
|
pEnchantJewelData->nRequireEnchantLevel = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._RequireEnchantLevel )->GetInteger();
|
|
pEnchantJewelData->nEnchantLevel = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._EnchantLevel )->GetInteger();
|
|
pEnchantJewelData->bCanApplySealedItem = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum._CanApplySealedItem )->GetInteger() == TRUE ) ? true : false;
|
|
|
|
std::pair<TMapEnchantJewelData::iterator,bool> Ret = m_pEnchantJewelData.insert(make_pair(pEnchantJewelData->nItemID, pEnchantJewelData));
|
|
if( Ret.second == false )
|
|
delete pEnchantJewelData;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TEnchantJewelData *CDNGameDataManager::GetEnchantJewelData( int nItemID )
|
|
{
|
|
if (m_pEnchantJewelData.empty()) return NULL;
|
|
|
|
TMapEnchantJewelData::iterator iter = m_pEnchantJewelData.find(nItemID);
|
|
if (iter != m_pEnchantJewelData.end()){
|
|
return iter->second;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
int CDNGameDataManager::GetItemDurability( int nItemID )
|
|
{
|
|
// 郴备档 备秦辑 悸泼茄促.
|
|
int nDurability = 0;
|
|
TItemData *pItemData = GetItemData( nItemID );
|
|
if( pItemData ) {
|
|
switch( pItemData->nType ) {
|
|
case ITEMTYPE_WEAPON:
|
|
{
|
|
TWeaponData *pWeapon = GetWeaponData( nItemID );
|
|
if( pWeapon ) nDurability = pWeapon->nDurability;
|
|
}
|
|
break;
|
|
case ITEMTYPE_PARTS:
|
|
{
|
|
TPartData *pParts = GetPartData( nItemID );
|
|
if( pParts ) nDurability = pParts->nDurability;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return nDurability;
|
|
}
|
|
|
|
int CDNGameDataManager::GetItemDurabilityRepairCoin(int nItemID)
|
|
{
|
|
int nPrice = 0;
|
|
|
|
TItemData *pItemData = GetItemData( nItemID );
|
|
|
|
if( pItemData ) {
|
|
switch( pItemData->nType ) {
|
|
case ITEMTYPE_WEAPON:
|
|
{
|
|
TWeaponData *pWeapon = GetWeaponData( nItemID );
|
|
if( pWeapon ) nPrice = pWeapon->nDurabilityRepairCoin;
|
|
}
|
|
break;
|
|
case ITEMTYPE_PARTS:
|
|
{
|
|
TPartData *pParts = GetPartData( nItemID );
|
|
if( pParts ) nPrice = pParts->nDurabilityRepairCoin;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return nPrice;
|
|
}
|
|
|
|
int CDNGameDataManager::GetExp(int nClass, BYTE cLevel)
|
|
{
|
|
if ((cLevel <= 0) ||(cLevel > CHARLEVELMAX)) return 0;
|
|
|
|
return CPlayerLevelTable::GetInstance().GetValue( nClass, cLevel, CPlayerLevelTable::Experience );
|
|
}
|
|
|
|
int CDNGameDataManager::GetFatigue(int nClass, char cLevel)
|
|
{
|
|
if ((cLevel <= 0) ||(cLevel > CHARLEVELMAX)) return 0;
|
|
|
|
return CPlayerLevelTable::GetInstance().GetValue( nClass, cLevel, CPlayerLevelTable::Fatigue );
|
|
}
|
|
|
|
int CDNGameDataManager::GetWeeklyFatigue(int nClass, char cLevel)
|
|
{
|
|
if ((cLevel <= 0) ||(cLevel > CHARLEVELMAX)) return 0;
|
|
return CPlayerLevelTable::GetInstance().GetValue( nClass, cLevel, CPlayerLevelTable::WeekFatigue );
|
|
}
|
|
|
|
BYTE CDNGameDataManager::GetLevel(int nClass, int nCurExp)
|
|
{
|
|
if (nCurExp <= 0) return 0;
|
|
|
|
int nValue = 0, nLevel = 0;
|
|
int nExp;
|
|
for (int i = 0; i < CHARLEVELMAX; i++){
|
|
nExp = CPlayerLevelTable::GetInstance().GetValue( nClass, i + 1, CPlayerLevelTable::Experience );
|
|
if( nExp <= nCurExp ) nLevel = i + 1;
|
|
else break;
|
|
}
|
|
|
|
return nLevel;
|
|
}
|
|
|
|
#if defined(PRE_ADD_VIP)
|
|
int CDNGameDataManager::GetVIPExp(int nClass, int nLevel)
|
|
{
|
|
if ((nLevel <= 0) ||(nLevel > CHARLEVELMAX)) return 0;
|
|
return CPlayerLevelTable::GetInstance().GetValue( nClass, nLevel, CPlayerLevelTable::VIPExp );
|
|
}
|
|
|
|
int CDNGameDataManager::GetVIPFatigue(int nClass, int nLevel)
|
|
{
|
|
if ((nLevel <= 0) ||(nLevel > CHARLEVELMAX)) return 0;
|
|
return CPlayerLevelTable::GetInstance().GetValue( nClass, nLevel, CPlayerLevelTable::VIPFatigue );
|
|
}
|
|
|
|
#endif // #if defined(PRE_ADD_VIP)
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// CoinData(TCoinCountData)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadCoinCount()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TREBIRTHCOIN );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TREBIRTHCOIN );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TREBIRTHCOIN );
|
|
#endif //#ifdef _WORK
|
|
if (!pSox){
|
|
g_Log.Log(LogType::_FILELOG, L"ext(CoinTable.dnt) failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pSox->GetItemCount() <= 0){
|
|
g_Log.Log(LogType::_FILELOG, L"CoinTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapCoinCount, m_pMapCoinCount );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
std::vector<int> _WorldCoin;
|
|
std::vector<int> _WorldCashCoin;
|
|
int _CoinLimit;
|
|
int _CashCoinLimit;
|
|
#if defined(PRE_ADD_VIP)
|
|
int _VIPCoin;
|
|
#endif // #if defined(PRE_ADD_VIP)
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._WorldCoin.reserve( WORLDCOUNTMAX );
|
|
sFieldNum._WorldCashCoin.reserve( WORLDCOUNTMAX );
|
|
for( int j=0 ; j<WORLDCOUNTMAX ; ++j )
|
|
{
|
|
sprintf_s( szTemp, "_World%dCoin", j+1);
|
|
sFieldNum._WorldCoin.push_back( pSox->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_World%dCashCoin", j+1);
|
|
sFieldNum._WorldCashCoin.push_back( pSox->GetFieldNum(szTemp) );
|
|
}
|
|
sFieldNum._CoinLimit = pSox->GetFieldNum( "_CoinLimit" );
|
|
sFieldNum._CashCoinLimit = pSox->GetFieldNum( "_CashCoinLimit" );
|
|
#if defined(PRE_ADD_VIP)
|
|
sFieldNum._VIPCoin = pSox->GetFieldNum( "_VIPCoin" );
|
|
#endif // #if defined(PRE_ADD_VIP)
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i)
|
|
{
|
|
TCoinCountData* pCoinCount = new TCoinCountData;
|
|
memset(pCoinCount, 0, sizeof(TCoinCountData));
|
|
|
|
int nIndex = pSox->GetItemID(i);
|
|
pCoinCount->cLevel = nIndex;
|
|
|
|
int iIdx = pSox->GetIDXprimary( nIndex );
|
|
|
|
// CoinCount
|
|
for (int j = 0; j < WORLDCOUNTMAX; j++){
|
|
pCoinCount->nRebirthCoin[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._WorldCoin[j] )->GetInteger();
|
|
pCoinCount->nCashRebirthCoin[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._WorldCashCoin[j] )->GetInteger();
|
|
}
|
|
pCoinCount->nRebirthCoinLimit = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._CoinLimit )->GetInteger();
|
|
pCoinCount->nCashRebirthCoinLimit = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._CashCoinLimit )->GetInteger();
|
|
#if defined(PRE_ADD_VIP)
|
|
pCoinCount->nVIPRebirthCoin = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._VIPCoin )->GetInteger();
|
|
#endif // #if defined(PRE_ADD_VIP)
|
|
|
|
m_pMapCoinCount.insert(make_pair(pCoinCount->cLevel, pCoinCount));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetCoinCount(BYTE cLevel, char cWorldID)
|
|
{
|
|
if ((cLevel <= 0) ||(cLevel > CHARLEVELMAX)) return -1;
|
|
if ((cWorldID <= 0) ||(cWorldID > WORLDCOUNTMAX)) return -1;
|
|
|
|
TMapCoinCount::iterator iter = m_pMapCoinCount.find(cLevel);
|
|
if (iter != m_pMapCoinCount.end()){
|
|
return iter->second->nRebirthCoin[cWorldID - 1];
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int CDNGameDataManager::GetCashCoinCount(BYTE cLevel, char cWorldID)
|
|
{
|
|
if ((cLevel <= 0) ||(cLevel > CHARLEVELMAX)) return -1;
|
|
if ((cWorldID <= 0) ||(cWorldID > WORLDCOUNTMAX)) return -1;
|
|
|
|
TMapCoinCount::iterator iter = m_pMapCoinCount.find(cLevel);
|
|
if (iter != m_pMapCoinCount.end()){
|
|
return iter->second->nCashRebirthCoin[cWorldID - 1];
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#if defined(PRE_ADD_VIP)
|
|
int CDNGameDataManager::GetVIPRebirthCoinCount(BYTE cLevel)
|
|
{
|
|
if ((cLevel <= 0) ||(cLevel > CHARLEVELMAX)) return -1;
|
|
|
|
TMapCoinCount::iterator iter = m_pMapCoinCount.find(cLevel);
|
|
if (iter != m_pMapCoinCount.end()){
|
|
return iter->second->nVIPRebirthCoin;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif // #if defined(PRE_ADD_VIP)
|
|
|
|
int CDNGameDataManager::GetCoinLimit(BYTE cLevel)
|
|
{
|
|
if ((cLevel <= 0) ||(cLevel > CHARLEVELMAX)) return -1;
|
|
|
|
TMapCoinCount::iterator iter = m_pMapCoinCount.find(cLevel);
|
|
if (iter != m_pMapCoinCount.end()){
|
|
return iter->second->nRebirthCoinLimit;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int CDNGameDataManager::GetCashCoinLimit(BYTE cLevel)
|
|
{
|
|
if ((cLevel <= 0) ||(cLevel > CHARLEVELMAX)) return -1;
|
|
|
|
TMapCoinCount::iterator iter = m_pMapCoinCount.find(cLevel);
|
|
if (iter != m_pMapCoinCount.end()){
|
|
return iter->second->nCashRebirthCoinLimit;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// NpcTalk
|
|
//---------------------------------------------------------------------------------
|
|
bool CDNGameDataManager::ReadTalkFile(const char* szFolderName)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, "%s...Folder : %s\n", szFolderName, CEtResourceMng::GetInstance().GetFullPath( szFolderName ).c_str());
|
|
|
|
std::vector<CFileNameString> FileList;
|
|
CEtResourceMng::GetInstance().FindFileListAll_IgnoreExistFile( szFolderName, "*.xml", FileList );
|
|
|
|
for( size_t i = 0 ; i < FileList.size() ; i++ )
|
|
{
|
|
WCHAR wszFile[2048] = {0,};
|
|
if ((int)FileList[i].size() >= 2048)
|
|
_ASSERT(0);
|
|
MultiByteToWideChar(CP_ACP, 0, FileList[i].c_str(), -1, wszFile, (int)FileList[i].size() );
|
|
|
|
// 20100624 颇老傈眉版肺俊辑捞抚父眠免窍档废眠啊(b4nfter)
|
|
{
|
|
TCHAR szFileName[MAX_PATH] = { _T('\0'), };
|
|
TCHAR szExecName[MAX_PATH] = { _T('\0'), };
|
|
|
|
errno_t nRetVal = _wsplitpath_s(wszFile, NULL, 0, NULL, 0, szFileName, _countof(szFileName), szExecName, _countof(szExecName));
|
|
if (nRetVal) {
|
|
// 坷幅惯积
|
|
g_Log.Log( LogType::_FILELOG, L"%s(%s) failed\r\n", szFolderName, szFileName);
|
|
return false;
|
|
}
|
|
|
|
_sntprintf_s(wszFile, _countof(wszFile), _T("%s%s"), szFileName, szExecName);
|
|
}
|
|
|
|
AddTalk(wszFile);
|
|
}
|
|
|
|
g_Log.Log( LogType::_FILELOG, "%s...Size : %d\n", szFolderName, (int)FileList.size());
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadTalkData()
|
|
{
|
|
#if defined (_WORK) && defined (PRE_ADD_SERVER_LOAD_SHORTENING)
|
|
if (g_ConfigWork.HasCommand(L"ExceptScript"))
|
|
return true;
|
|
#endif // #if defined (_WORK) && defined (PRE_ADD_SERVER_LOAD_SHORTENING)
|
|
|
|
m_XMLFileMap.clear();
|
|
m_XMLIndexMap.clear();
|
|
|
|
// 盖贸澜龋免登绰start 牢郸胶绰荐悼栏肺殿废
|
|
std::wstring _szStart(L"start");
|
|
DWORD nHashCode = GetStringHashCode(_szStart.c_str());
|
|
m_XMLIndexMap.insert( make_pair(nHashCode, _szStart ) );
|
|
|
|
m_TalkMap.clear();
|
|
|
|
if (!ReadTalkFile ("Talk_Npc"))
|
|
return false;
|
|
|
|
if (!ReadTalkFile ("Talk_Quest"))
|
|
return false;
|
|
|
|
#if defined (_WORK)
|
|
if (!ReadTalkFile ("ignore_npc"))
|
|
return false;
|
|
|
|
if (!ReadTalkFile ("ignore_quest"))
|
|
return false;
|
|
#endif
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::AddTalk(const WCHAR* _wszTalkFileName)
|
|
{
|
|
TALK_PARAGRAPH_MAP TalkParagraphMap;
|
|
TALK_ANSWER_SET TalkAnswerSet;
|
|
|
|
std::wstring wszTalkFileName;
|
|
wszTalkFileName = _wszTalkFileName;
|
|
|
|
std::transform(wszTalkFileName.begin(), wszTalkFileName.end(), wszTalkFileName.begin(), towlower);
|
|
|
|
// 捞固 粮犁窍搁
|
|
if( GetTalk(wszTalkFileName.c_str(), TalkParagraphMap) == true )
|
|
return true;
|
|
|
|
char szTalkFileName[2048] = { 0,} ;
|
|
WideCharToMultiByte( CP_ACP, 0, _wszTalkFileName, -1, szTalkFileName, 1024, NULL, NULL );
|
|
|
|
CFileStream Stream( CEtResourceMng::GetInstance().GetFullName(szTalkFileName).c_str(), CFileStream::OPEN_READ );
|
|
if( Stream.IsValid() == false )
|
|
{
|
|
g_Log.Log(LogType::_ERROR, L"Cannot open file : %s\n" , wszTalkFileName);
|
|
return false;
|
|
}
|
|
|
|
// 颇老疙栏肺 秦浆内靛甫 父甸绢辑 甘俊 历厘秦初绰促.
|
|
std::wstring __wsz(_wszTalkFileName);
|
|
ToLowerW(__wsz);
|
|
DWORD nHashCode = GetStringHashCode(__wsz.c_str());
|
|
TXMLFileMap::iterator it = m_XMLFileMap.find(nHashCode);
|
|
if( it != m_XMLFileMap.end() )
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"Already added hash code. code : %u file : %s\n" , nHashCode, __wsz.c_str());
|
|
return false;
|
|
}
|
|
m_XMLFileMap.insert( make_pair(nHashCode, __wsz));
|
|
|
|
int nLen = Stream.Size();
|
|
|
|
int nDummy = 256;
|
|
char* pBuffer = new char[nLen+nDummy];
|
|
ZeroMemory(pBuffer, nLen+nDummy);
|
|
|
|
class __Temp
|
|
{
|
|
public:
|
|
__Temp(char* p) { m_p = p; }
|
|
~__Temp()
|
|
{
|
|
if( m_p )
|
|
delete[] m_p;
|
|
m_p = NULL;
|
|
}
|
|
char* m_p;
|
|
};
|
|
__Temp ScopeDelete(pBuffer);
|
|
|
|
|
|
int nReadSize = Stream.Read(pBuffer, nLen);
|
|
|
|
TiXmlDocument doc;
|
|
doc.ClearError();
|
|
|
|
doc.Parse(pBuffer, 0, TIXML_ENCODING_UTF8 );
|
|
if( doc.Error() )
|
|
{
|
|
std::wstring msg;
|
|
msg = L"xml 颇老 颇教 角菩 : ";
|
|
msg += wszTalkFileName;
|
|
msg += L" error msg : ";
|
|
const char* errmsg = doc.ErrorDesc();
|
|
WCHAR buff[1024] = {0,};
|
|
MultiByteToWideChar(CP_ACP, 0, errmsg, -1, buff, 512 );
|
|
msg += buff;
|
|
g_Log.Log(LogType::_FILELOG, L"%s", msg.c_str());
|
|
|
|
return false;
|
|
}
|
|
|
|
TiXmlElement* pElement;
|
|
pElement = doc.RootElement();
|
|
|
|
if( !pElement )
|
|
{
|
|
std::wstring msg;
|
|
msg = L"xml 颇老 颇教 角菩. root element 绝澜";
|
|
msg += wszTalkFileName;
|
|
msg += L" error msg : ";
|
|
const char* errmsg = doc.ErrorDesc();
|
|
WCHAR buff[1024] = {0,};
|
|
MultiByteToWideChar(CP_ACP, 0, errmsg, -1, buff, 512 );
|
|
msg += buff;
|
|
g_Log.Log(LogType::_FILELOG, L"%s", msg.c_str());
|
|
return false;
|
|
}
|
|
TiXmlNode* pNode = pElement->FirstChild("talk_paragraph");
|
|
|
|
if( !pNode ) return false;
|
|
|
|
pElement = pNode->ToElement();
|
|
|
|
if(!pElement) return false;
|
|
|
|
const int ___BUF_SIZE = 4096;
|
|
WCHAR buff[___BUF_SIZE] = L"";
|
|
const char* sz = NULL;
|
|
|
|
for( pElement ; pElement != NULL ; pElement = pElement->NextSiblingElement() )
|
|
{
|
|
sz = pElement->Value();
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
std::wstring szString(buff);
|
|
|
|
// question
|
|
if( szString != L"talk_paragraph" )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
TALK_PARAGRAPH talk;
|
|
|
|
const char* szTalkIndex = pElement->Attribute("index");
|
|
|
|
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, szTalkIndex, -1, buff, ___BUF_SIZE );
|
|
|
|
|
|
talk.szIndex = buff;
|
|
|
|
TiXmlElement* pTalkElement = pElement->FirstChildElement();
|
|
|
|
for( pTalkElement ; pTalkElement != NULL ; pTalkElement = pTalkElement->NextSiblingElement() )
|
|
{
|
|
sz = pTalkElement->Value();
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
std::wstring szLocalString(buff);
|
|
|
|
// question
|
|
if( szLocalString == L"talk_question" )
|
|
{
|
|
sz = pTalkElement->GetText();
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
talk.Question.szQuestion = buff;
|
|
|
|
}
|
|
// talk_answer
|
|
else if( szLocalString == L"talk_answer" )
|
|
{
|
|
TALK_ANSWER answer;
|
|
sz = pTalkElement->Attribute("link_index");
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
answer.szLinkIndex = buff;
|
|
|
|
// 阿 牢郸喊肺 秦浆内靛甫 父甸绢 敌促.
|
|
std::wstring _wsz;
|
|
_wsz = answer.szLinkIndex;
|
|
ToLowerW(_wsz);
|
|
DWORD nLocalHashCode = GetStringHashCode(_wsz.c_str());
|
|
m_XMLIndexMap.insert( make_pair(nLocalHashCode, _wsz) );
|
|
|
|
|
|
sz = pTalkElement->Attribute("link_target");
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
answer.szLinkTarget = buff;
|
|
|
|
if( answer.szLinkTarget.empty() )
|
|
{
|
|
answer.szLinkTarget = wszTalkFileName;
|
|
answer.bOtherTargetLink = false;
|
|
}
|
|
else if( answer.szLinkTarget != wszTalkFileName )
|
|
{
|
|
answer.bOtherTargetLink = true;
|
|
}
|
|
else
|
|
{
|
|
answer.bOtherTargetLink = true;
|
|
}
|
|
|
|
sz = pTalkElement->GetText();
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
answer.szAnswer = buff;
|
|
|
|
talk.Answers.push_back(answer);
|
|
TalkAnswerSet.insert(_wsz);
|
|
}
|
|
else
|
|
{
|
|
//return false;
|
|
}
|
|
}
|
|
|
|
TALK_PARAGRAPH_MAP_IT iter = TalkParagraphMap.find(talk.szIndex);
|
|
if( iter != TalkParagraphMap.end() )
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
TalkParagraphMap.insert(make_pair(talk.szIndex, talk));
|
|
|
|
// 阿 牢郸喊肺 秦浆内靛甫 父甸绢 敌促.
|
|
ToLowerW(talk.szIndex);
|
|
DWORD nLocalHashCode = GetStringHashCode(talk.szIndex.c_str());
|
|
m_XMLIndexMap.insert( make_pair(nLocalHashCode, talk.szIndex) );
|
|
}
|
|
}
|
|
|
|
CDNQuest* pQuest = g_pQuestManager->GetQuest(std::wstring(wszTalkFileName));
|
|
if( pQuest )
|
|
{
|
|
int nQuestID = pQuest->GetQuestInfo().nQuestIndex;
|
|
|
|
TiXmlElement* pRoot = doc.RootElement();
|
|
|
|
TiXmlNode* pLocalNode = pRoot->FirstChild("journal_data");
|
|
|
|
if( !pLocalNode )
|
|
return false;
|
|
|
|
TiXmlElement* pLocalElement = pLocalNode->ToElement();
|
|
|
|
if(!pLocalElement)
|
|
return false;
|
|
|
|
// const int ___BUF_SIZE = 4096;
|
|
WCHAR Localbuff[___BUF_SIZE] = {0,};
|
|
const char* Localsz = NULL;
|
|
|
|
Localsz = pLocalElement->Attribute("use_item_list");
|
|
ZeroMemory(&Localbuff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, Localsz, -1, Localbuff, ___BUF_SIZE );
|
|
std::wstring szList = Localbuff;
|
|
|
|
std::vector<std::wstring> tokens;
|
|
TokenizeW(szList, tokens, std::wstring(L",") );
|
|
|
|
for( size_t i = 0 ; i < tokens.size() ; i++ )
|
|
{
|
|
int nItemId = _wtoi(tokens[i].c_str());
|
|
|
|
TMapQuestItemDataIt Localit = m_QuestItemData.find(nQuestID);
|
|
if( Localit == m_QuestItemData.end() )
|
|
{
|
|
std::set<int> questItemSet;
|
|
questItemSet.insert(nItemId);
|
|
|
|
m_QuestItemData.insert(make_pair(nQuestID, questItemSet));
|
|
}
|
|
else
|
|
{
|
|
std::set<int>& questItemSet = Localit->second;
|
|
questItemSet.insert(nItemId);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Load "Condition_data"
|
|
if( pQuest )
|
|
{
|
|
int nQuestID = pQuest->GetQuestInfo().nQuestIndex;
|
|
TiXmlElement* pRoot = doc.RootElement();
|
|
|
|
LoadQuestCondition( pRoot, nQuestID );
|
|
}
|
|
|
|
m_TalkMap.insert(make_pair(std::wstring(wszTalkFileName), TalkParagraphMap));
|
|
m_TalkAnswerMap.insert(make_pair(std::wstring(wszTalkFileName), TalkAnswerSet));
|
|
|
|
return true;
|
|
}
|
|
|
|
void CDNGameDataManager::LoadQuestCondition(TiXmlElement* pRootElement, UINT nQuestID)
|
|
{
|
|
TiXmlNode* pNode = pRootElement->FirstChild("condition_data");
|
|
|
|
if( !pNode ) return;
|
|
|
|
|
|
TiXmlElement* pElement = pNode->ToElement();
|
|
|
|
if(!pElement) return;
|
|
|
|
const int ___BUF_SIZE = 4096;
|
|
WCHAR buff[___BUF_SIZE] = L"";
|
|
const char* sz = NULL;
|
|
|
|
QuestCondition* pQuestCondition = new QuestCondition;
|
|
|
|
pQuestCondition->nQuestIndex = nQuestID;
|
|
|
|
TiXmlElement* pChildElement = pElement->FirstChildElement();
|
|
|
|
for( pChildElement ; pChildElement != NULL ; pChildElement = pChildElement->NextSiblingElement() )
|
|
{
|
|
sz = pChildElement->Value();
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
std::wstring szString(buff);
|
|
|
|
// Quest Item
|
|
if( szString == L"have_normal_item" )
|
|
{
|
|
sz = pChildElement->GetText();
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
|
|
__HaveNormalItem* pConBase = new __HaveNormalItem;
|
|
pConBase->Init(std::wstring(buff));
|
|
pQuestCondition->ConditionList.push_back(pConBase);
|
|
}
|
|
// 龋皑档
|
|
else if( szString == L"npc_favor" )
|
|
{
|
|
sz = pChildElement->GetText();
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
|
|
__Reputation_Favor* pConBase = new __Reputation_Favor;
|
|
pConBase->Init(std::wstring(buff));
|
|
pQuestCondition->ConditionList.push_back(pConBase);
|
|
}
|
|
// 厚龋皑档
|
|
else if( szString == L"npc_malice" )
|
|
{
|
|
sz = pChildElement->GetText();
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
|
|
__Reputation_Hatred* pConBase = new __Reputation_Hatred;
|
|
pConBase->Init(std::wstring(buff));
|
|
pQuestCondition->ConditionList.push_back(pConBase);
|
|
}
|
|
// user_level
|
|
else if( szString == L"user_level" )
|
|
{
|
|
sz = pChildElement->GetText();
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
|
|
__UserLevel* pConBase = new __UserLevel;
|
|
pConBase->Init(std::wstring(buff));
|
|
pQuestCondition->ConditionList.push_back(pConBase);
|
|
}
|
|
else if( szString == L"user_class" )
|
|
{
|
|
sz = pChildElement->GetText();
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
|
|
__UserClass* pConBase = new __UserClass;
|
|
pConBase->Init(std::wstring(buff));
|
|
pQuestCondition->ConditionList.push_back(pConBase);
|
|
}
|
|
// prev_quest
|
|
else if( szString == L"prev_quest" )
|
|
{
|
|
sz = pChildElement->GetText();
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
|
|
__PrevQuest* pConBase = new __PrevQuest;
|
|
pConBase->Init(std::wstring(buff));
|
|
pQuestCondition->ConditionList.push_back(pConBase);
|
|
}
|
|
// have_normal_item
|
|
else if( szString == L"have_normal_item" )
|
|
{
|
|
sz = pChildElement->GetText();
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
|
|
__HaveNormalItem* pConBase = new __HaveNormalItem;
|
|
pConBase->Init(std::wstring(buff));
|
|
pQuestCondition->ConditionList.push_back(pConBase);
|
|
}
|
|
#if defined(PRE_ADD_QUEST_CHECKCAHEITEM)
|
|
// have_cash_item
|
|
else if( szString == L"have_cash_item" )
|
|
{
|
|
sz = pChildElement->GetText();
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
|
|
__HaveCashItem* pConBase = new __HaveCashItem;
|
|
pConBase->Init(std::wstring(buff));
|
|
pQuestCondition->ConditionList.push_back(pConBase);
|
|
}
|
|
#endif
|
|
// have_symbol_item
|
|
//else if( szString == L"have_symbol_item" )
|
|
//{
|
|
// sz = pChildElement->GetText();
|
|
// ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
// MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
|
|
// __HaveSymbolItem* pConBase = new __HaveSymbolItem;
|
|
// pConBase->Init(std::wstring(buff));
|
|
// pQuestCondition->ConditionList.push_back(pConBase);
|
|
//}
|
|
else if( szString == L"complete_mission" )
|
|
{
|
|
sz = pChildElement->GetText();
|
|
ZeroMemory(&buff, sizeof(WCHAR)*___BUF_SIZE);
|
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, buff, ___BUF_SIZE );
|
|
|
|
__CompleteMission* pConBase = new __CompleteMission;
|
|
pConBase->Init(std::wstring(buff));
|
|
pQuestCondition->ConditionList.push_back(pConBase);
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
m_QuestConditionData.insert( make_pair(pQuestCondition->nQuestIndex, pQuestCondition ));
|
|
}
|
|
|
|
QuestCondition * CDNGameDataManager::GetQuestCondition(UINT nQuestID)
|
|
{
|
|
TMapQuestConditionDataIt iter = m_QuestConditionData.find( nQuestID );
|
|
if( iter != m_QuestConditionData.end() )
|
|
return iter->second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::RemoveTalk(const WCHAR* _wszTalkFileName)
|
|
{
|
|
std::wstring wszTalkFileName(_wszTalkFileName);
|
|
std::transform(wszTalkFileName.begin(), wszTalkFileName.end(), wszTalkFileName.begin(), towlower);
|
|
|
|
TALK_MAP_IT iter = m_TalkMap.find( wszTalkFileName );
|
|
if( iter != m_TalkMap.end() )
|
|
{
|
|
m_TalkMap.erase( iter );
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetTalk(const WCHAR* _wszTalkFileName, OUT TALK_PARAGRAPH_MAP& TalkParagraphMap )
|
|
{
|
|
std::wstring wszTalkFileName(_wszTalkFileName);
|
|
std::transform(wszTalkFileName.begin(), wszTalkFileName.end(), wszTalkFileName.begin(), towlower);
|
|
|
|
TALK_MAP_IT iter = m_TalkMap.find( wszTalkFileName );
|
|
if( iter != m_TalkMap.end() )
|
|
{
|
|
TalkParagraphMap = iter->second;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetTalkParagraph(IN std::wstring& wszIndex, IN std::wstring& wszTarget, OUT TALK_PARAGRAPH& talk )
|
|
{
|
|
TALK_MAP_IT iter = m_TalkMap.find(wszTarget);
|
|
if( iter == m_TalkMap.end() )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
TALK_PARAGRAPH_MAP& paragraph_map = iter->second;
|
|
TALK_PARAGRAPH_MAP_IT it = paragraph_map.find(wszIndex);
|
|
if( it == paragraph_map.end() )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
talk = it->second;
|
|
return true;
|
|
}
|
|
|
|
TALK_PARAGRAPH & CDNGameDataManager::GetEmptyTalkParagraph()
|
|
{
|
|
static TALK_PARAGRAPH sEmptyPara;
|
|
return sEmptyPara;
|
|
}
|
|
|
|
void CDNGameDataManager::GetTalkFileList(IN OUT std::vector<std::wstring>& TalkFileList)
|
|
{
|
|
TalkFileList.clear();
|
|
TalkFileList.reserve(m_TalkMap.size()+1);
|
|
TALK_MAP_IT iter = m_TalkMap.begin();
|
|
|
|
for( ; iter != m_TalkMap.end() ; iter++ )
|
|
{
|
|
TalkFileList.push_back( iter->first );
|
|
}
|
|
}
|
|
|
|
DWORD CDNGameDataManager::GetStringHashCode(const WCHAR* pString)
|
|
{
|
|
std::wstring __wsz(pString);
|
|
ToLowerW(__wsz);
|
|
const WCHAR* pChar = __wsz.c_str();
|
|
|
|
DWORD ch;
|
|
DWORD len = (DWORD)wcslen( pChar );
|
|
DWORD result = 5381;
|
|
for( DWORD i = 0 ; i < len ; i++ )
|
|
{
|
|
ch = (unsigned long)pChar[i];
|
|
result = ((result<< 5) + result) + ch; // hash * 33 + ch
|
|
}
|
|
return result;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetTalkFileName(DWORD nHashCode, OUT std::wstring& wszIndex)
|
|
{
|
|
TXMLFileMap::iterator it = m_XMLFileMap.find(nHashCode);
|
|
if( it == m_XMLFileMap.end() )
|
|
{
|
|
wszIndex = L"Error";
|
|
return false;
|
|
}
|
|
|
|
wszIndex = it->second;
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetTalkIndexName(DWORD nHashCode, OUT std::wstring& wszIndex)
|
|
{
|
|
TXMLIndexMap::iterator it = m_XMLIndexMap.find(nHashCode);
|
|
if( it == m_XMLIndexMap.end() )
|
|
{
|
|
wszIndex = L"Error";
|
|
return false;
|
|
}
|
|
wszIndex = it->second;
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::CheckTalkAnswer(IN std::wstring& wszIndex, IN std::wstring& wszTarget)
|
|
{
|
|
TALK_ANSWER_MAP_IT iter = m_TalkAnswerMap.find(wszTarget);
|
|
if(m_TalkAnswerMap.end() == iter) {
|
|
return false;
|
|
}
|
|
|
|
TALK_ANSWER_SET& answer_set = iter->second;
|
|
TALK_ANSWER_SET_IT it = answer_set.find(wszIndex);
|
|
if(answer_set.end() == it) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// ShopData(ShopTable.dnt - TShopData)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadShopData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TSHOP );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TSHOP );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TSHOP );
|
|
#endif //#ifdef _WORK
|
|
if (!pSox){
|
|
g_Log.Log( LogType::_FILELOG, L"ShopTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pSox->GetItemCount() <= 0){
|
|
g_Log.Log( LogType::_FILELOG, L"ShopTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapShopData, m_pShopData );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _nShopID;
|
|
int _nTabID;
|
|
std::vector<int> _ItemIndex;
|
|
std::vector<int> _Quantity;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._nShopID = pSox->GetFieldNum( "_ShopID" );
|
|
sFieldNum._nTabID = pSox->GetFieldNum( "_TabID" );
|
|
sFieldNum._ItemIndex.reserve( SHOPITEMMAX );
|
|
sFieldNum._Quantity.reserve( SHOPITEMMAX );
|
|
|
|
char szTemp[MAX_PATH];
|
|
for( int j=0 ; j<SHOPITEMMAX ; ++j )
|
|
{
|
|
sprintf( szTemp, "_itemindex%d", j+1 );
|
|
sFieldNum._ItemIndex.push_back( pSox->GetFieldNum(szTemp) );
|
|
sprintf( szTemp, "_Quantity%d", j+1);
|
|
sFieldNum._Quantity.push_back( pSox->GetFieldNum(szTemp) );
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
//2010.10.7 haling STL 焊龋 困秦 函券
|
|
TShopTabData ShopTabData;
|
|
TShopItem ShopItem = { 0, };
|
|
vector<int> vShopTabList;
|
|
|
|
std::vector<int> vAbuseItemID;
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
int nShopID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nShopID)->GetInteger();
|
|
if (nShopID <= 0) continue;
|
|
|
|
TShopData *pShopData = GetShopData(nShopID);
|
|
if (!pShopData){
|
|
pShopData = new TShopData;
|
|
//2010.10.7 haling STL 焊龋 困秦 积己磊肺 函券
|
|
//memset(pShopData, 0, sizeof(TShopData));
|
|
pShopData->nShopID = nShopID;
|
|
}
|
|
|
|
TItemData *pItemData = NULL;
|
|
|
|
//memset(&ShopTabData, 0, sizeof(TShopTabData));
|
|
ShopTabData.Clear();
|
|
ShopTabData.nTabID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nTabID)->GetInteger();
|
|
if (ShopTabData.nTabID <= 0) continue;
|
|
|
|
ShopTabData.vShopItem.clear();
|
|
ShopTabData.vShopItem.resize(SHOPITEMMAX);
|
|
memset(&ShopItem, 0, sizeof(TShopItem));
|
|
for (int j = 0; j < SHOPITEMMAX; ++j){
|
|
ShopItem.nItemID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ItemIndex[j])->GetInteger();
|
|
if (ShopItem.nItemID <= 0) continue;
|
|
ShopItem.nCount = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Quantity[j])->GetInteger();
|
|
pItemData = GetItemData(ShopItem.nItemID);
|
|
if (!pItemData) continue;
|
|
ShopItem.nMaxCount = pItemData->nOverlapCount;
|
|
ShopItem.nPrice = pItemData->nAmount;
|
|
|
|
ShopTabData.vShopItem[j] = ShopItem;
|
|
if (pItemData->nAmount > 0)
|
|
{
|
|
int nItemBuyPrice = pItemData->nAmount - (int)(pItemData->nAmount * MAX_ITEMPRICE_RATE);
|
|
if (pItemData->nSellAmount > nItemBuyPrice) {
|
|
//TODO(Cussrro): 价格不合理,先跳过
|
|
//vAbuseItemID.push_back(nItemID);
|
|
}
|
|
}
|
|
}
|
|
|
|
pShopData->vShopTabData.push_back(ShopTabData);
|
|
|
|
m_pShopData[nShopID] = pShopData;
|
|
}
|
|
|
|
if (vAbuseItemID.size() > 0)
|
|
{
|
|
WCHAR szTemp[1024];
|
|
std::wstring szError = L"Invalid ShopTable\n\n";
|
|
|
|
for(UINT i=0; i<vAbuseItemID.size(); i++)
|
|
{
|
|
swprintf_s( szTemp, L"ItemID : %d\n", vAbuseItemID[i] );
|
|
szError += szTemp;
|
|
}
|
|
|
|
MessageBox( NULL, szError.c_str(), L"Critical Error!!", MB_OK );
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TShopData* CDNGameDataManager::GetShopData(int nShopID)
|
|
{
|
|
if (nShopID <= 0) return NULL;
|
|
|
|
TMapShopData::iterator iter = m_pShopData.find(nShopID);
|
|
if (iter != m_pShopData.end()){
|
|
return iter->second;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
TShopItem* CDNGameDataManager::GetShopItem(int nShopID, int nShopTabID, int nIndex)
|
|
{
|
|
if (nShopID <= 0)
|
|
return NULL;
|
|
if ((nShopTabID <= 0) || (nShopTabID > SHOPTABMAX))
|
|
return NULL;
|
|
if (nIndex >= SHOPITEMMAX)
|
|
return NULL;
|
|
|
|
TShopData *pShopData = GetShopData(nShopID);
|
|
if (!pShopData) return NULL;
|
|
|
|
for (int i = 0; i <(int)pShopData->vShopTabData.size(); i++){
|
|
if (pShopData->vShopTabData[i].nTabID == nShopTabID)
|
|
return &(pShopData->vShopTabData[i].vShopItem[nIndex]);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// SkillShopData(SkillShopTable.dnt - TSkillShopData)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadSkillShopData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TSKILLSHOP );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TSKILLSHOP );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TSKILLSHOP );
|
|
#endif //#ifdef _WORK
|
|
if (!pSox){
|
|
g_Log.Log( LogType::_FILELOG, L"SkillShopTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pSox->GetItemCount() <= 0){
|
|
g_Log.Log( LogType::_FILELOG, L"SkillShopTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapSkillShopData, m_pSkillShop );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
std::vector<int> _SkillIndex;
|
|
std::vector<int> _SkillCost;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._SkillIndex.reserve( SKILLSHOPITEMMAX );
|
|
sFieldNum._SkillCost.reserve( SKILLSHOPITEMMAX );
|
|
|
|
for( int j=0 ; j<SKILLSHOPITEMMAX ; ++j )
|
|
{
|
|
sprintf( szTemp, "_SkillIndex%d", j+1);
|
|
sFieldNum._SkillIndex.push_back( pSox->GetFieldNum(szTemp) );
|
|
|
|
sprintf( szTemp, "_SkillCost%d", j+1);
|
|
sFieldNum._SkillCost.push_back( pSox->GetFieldNum(szTemp) );
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TSkillShopData* pSkillShopData = new TSkillShopData;
|
|
memset(pSkillShopData, 0, sizeof(TSkillShopData));
|
|
|
|
pSkillShopData->nShopID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( pSkillShopData->nShopID );
|
|
|
|
for( int j=0 ; j<SKILLSHOPITEMMAX ; ++j )
|
|
{
|
|
pSkillShopData->SkillShopItem[j].nSkillID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SkillIndex[j] )->GetInteger();
|
|
if (pSkillShopData->SkillShopItem[j].nSkillID <= 0)
|
|
continue;
|
|
|
|
pSkillShopData->SkillShopItem[j].nPrice = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SkillCost[j] )->GetInteger();
|
|
}
|
|
|
|
std::pair<TMapSkillShopData::iterator,bool> Ret = m_pSkillShop.insert(make_pair(pSkillShopData->nShopID, pSkillShopData));
|
|
if ( Ret.second == false )
|
|
delete pSkillShopData;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TSkillShopData* CDNGameDataManager::GetSkillShopData(int nShopID)
|
|
{
|
|
if (nShopID <= 0) return NULL;
|
|
|
|
TMapSkillShopData::iterator iter = m_pSkillShop.find(nShopID);
|
|
if (iter != m_pSkillShop.end()){
|
|
return iter->second;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
// Skill
|
|
bool CDNGameDataManager::LoadSkillData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSkillTable;
|
|
if (m_bAllLoaded)
|
|
pSkillTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TSKILL );
|
|
else
|
|
pSkillTable = GetDNTable( CDnTableDB::TSKILL );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSkillTable = GetDNTable( CDnTableDB::TSKILL );
|
|
#endif //#ifdef _WORK
|
|
if (!pSkillTable){
|
|
g_Log.Log(LogType::_FILELOG, L"SkillTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pSkillTable->GetItemCount() <= 0){
|
|
g_Log.Log(LogType::_FILELOG, L"SkillTable.dnt Count(%d)\r\n", pSkillTable->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSkillLevelTable;
|
|
if (m_bAllLoaded)
|
|
pSkillLevelTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TSKILLLEVEL );
|
|
else
|
|
pSkillLevelTable = GetDNTable( CDnTableDB::TSKILLLEVEL );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSkillLevelTable = GetDNTable( CDnTableDB::TSKILLLEVEL );
|
|
#endif //#ifdef _WORK
|
|
if (!pSkillLevelTable){
|
|
g_Log.Log( LogType::_FILELOG, L"SkillLevelTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pSkillLevelTable->GetItemCount() <= 0){
|
|
g_Log.Log(LogType::_FILELOG, L"SkillLevelTable.dnt Count(%d)\r\n", pSkillLevelTable->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP(TMapSkillData, m_pSkillData);
|
|
m_mapDefaultCreateData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _NeedWeaponType[ 2 ];
|
|
int _MaxLevel;
|
|
int _SkillType;
|
|
int _DurationType;
|
|
int _TargetType;
|
|
int _Dissolvable;
|
|
int _NeedJob;
|
|
int _Lock;
|
|
int _UnlockSkillBookItemID;
|
|
int _UnlockPrice;
|
|
int _DuplicatedSkillType;
|
|
int _GlobalCoolTime;
|
|
int _GlobalSkillGroup;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._NeedWeaponType[ 0 ] = pSkillTable->GetFieldNum( "_NeedWeaponType1" );
|
|
sFieldNum._NeedWeaponType[ 1 ] = pSkillTable->GetFieldNum( "_NeedWeaponType2" );
|
|
sFieldNum._MaxLevel = pSkillTable->GetFieldNum( "_MaxLevel" );
|
|
sFieldNum._SkillType = pSkillTable->GetFieldNum( "_SkillType" );
|
|
sFieldNum._DurationType = pSkillTable->GetFieldNum( "_DurationType" );
|
|
sFieldNum._TargetType = pSkillTable->GetFieldNum( "_TargetType" );
|
|
sFieldNum._Dissolvable = pSkillTable->GetFieldNum( "_Dissolvable" );
|
|
sFieldNum._NeedJob = pSkillTable->GetFieldNum( "_NeedJob" );
|
|
sFieldNum._Lock = pSkillTable->GetFieldNum( "_Lock" );
|
|
sFieldNum._UnlockSkillBookItemID = pSkillTable->GetFieldNum( "_UnlockSkillBookItemID" );
|
|
sFieldNum._UnlockPrice = pSkillTable->GetFieldNum( "_UnlockPrice" );
|
|
sFieldNum._DuplicatedSkillType = pSkillTable->GetFieldNum( "_DuplicatedSkillType" );
|
|
sFieldNum._GlobalCoolTime = pSkillTable->GetFieldNum( "_GlobalCoolTime" );
|
|
sFieldNum._GlobalSkillGroup = pSkillTable->GetFieldNum("_GlobalSkillGroup");
|
|
|
|
struct LevelFieldNum
|
|
{
|
|
int _SkillLevel;
|
|
int _LevelLimit;
|
|
//int _NeedJobClass; // 胶懦抛捞喉肺 颗败咙.
|
|
int _DelayTime;
|
|
int _AddRange;
|
|
int _NeedItem;
|
|
int _NeedItemDecreaseCount;
|
|
int _DecreaseHP;
|
|
int _DecreaseSP;
|
|
int _NeedSkillPoint;
|
|
int _EffectClassValue1Duration;
|
|
int _PDamage;
|
|
int _MDamage;
|
|
};
|
|
|
|
LevelFieldNum sLevelFieldNum;
|
|
sLevelFieldNum._SkillLevel = pSkillLevelTable->GetFieldNum( "_SkillLevel" );
|
|
sLevelFieldNum._LevelLimit = pSkillLevelTable->GetFieldNum( "_LevelLimit" );
|
|
//sLevelFieldNum._NeedJobClass = pSkillLevelTable->GetFieldNum( "_NeedJobClass" );
|
|
sLevelFieldNum._DelayTime = pSkillLevelTable->GetFieldNum( "_DelayTime" );
|
|
sLevelFieldNum._AddRange = pSkillLevelTable->GetFieldNum( "_AddRange" );
|
|
sLevelFieldNum._NeedItem = pSkillLevelTable->GetFieldNum( "_NeedItem" );
|
|
sLevelFieldNum._NeedItemDecreaseCount = pSkillLevelTable->GetFieldNum( "_NeedItemDecreaseCount" );
|
|
sLevelFieldNum._DecreaseHP = pSkillLevelTable->GetFieldNum( "_DecreaseHP" );
|
|
sLevelFieldNum._DecreaseSP = pSkillLevelTable->GetFieldNum( "_DecreaseSP" );
|
|
sLevelFieldNum._NeedSkillPoint = pSkillLevelTable->GetFieldNum( "_NeedSkillPoint" );
|
|
sLevelFieldNum._EffectClassValue1Duration = pSkillLevelTable->GetFieldNum("_EffectClassValue1Duration");
|
|
sLevelFieldNum._PDamage = pSkillLevelTable->GetFieldNum("_PDamage");
|
|
sLevelFieldNum._MDamage = pSkillLevelTable->GetFieldNum("_MDamage");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
TSkillLevelData SkillLevelData;
|
|
vector<int> vlSkillLevelList;
|
|
|
|
for( int i=0 ; i<pSkillTable->GetItemCount() ; ++i )
|
|
{
|
|
TSkillData* pSkillData = new TSkillData;
|
|
//2010.10.7 haling STL 焊龋 困秦 积己磊肺 函券
|
|
//memset(pSkillData, 0, sizeof(TSkillData));
|
|
|
|
pSkillData->nSkillID = pSkillTable->GetItemID(i);
|
|
|
|
int iIdx = pSkillTable->GetIDXprimary( pSkillData->nSkillID );
|
|
|
|
pSkillData->cNeedWeaponType[ 0 ] = pSkillTable->GetFieldFromLablePtr( iIdx, sFieldNum._NeedWeaponType[ 0 ] )->GetInteger();
|
|
pSkillData->cNeedWeaponType[ 1 ] = pSkillTable->GetFieldFromLablePtr( iIdx, sFieldNum._NeedWeaponType[ 1 ] )->GetInteger();
|
|
pSkillData->nMaxLevel = pSkillTable->GetFieldFromLablePtr( iIdx, sFieldNum._MaxLevel )->GetInteger();
|
|
pSkillData->cSkillType = pSkillTable->GetFieldFromLablePtr( iIdx, sFieldNum._SkillType )->GetInteger();
|
|
pSkillData->cDurationType = pSkillTable->GetFieldFromLablePtr( iIdx, sFieldNum._DurationType )->GetInteger();
|
|
pSkillData->cTargetType = pSkillTable->GetFieldFromLablePtr( iIdx, sFieldNum._TargetType )->GetInteger();
|
|
pSkillData->cDissolvable = pSkillTable->GetFieldFromLablePtr( iIdx, sFieldNum._Dissolvable )->GetInteger();
|
|
pSkillData->nNeedJobID = pSkillTable->GetFieldFromLablePtr( iIdx, sFieldNum._NeedJob )->GetInteger();
|
|
pSkillData->bDefaultLocked = (pSkillTable->GetFieldFromLablePtr( iIdx, sFieldNum._Lock )->GetInteger() == 1) ? true : false;
|
|
pSkillData->nUnlockSkillBookItemID = pSkillTable->GetFieldFromLablePtr( iIdx, sFieldNum._UnlockSkillBookItemID )->GetInteger();
|
|
pSkillData->nUnlockPrice = pSkillTable->GetFieldFromLablePtr( iIdx, sFieldNum._UnlockPrice )->GetInteger();
|
|
pSkillData->nExclusiveID = pSkillTable->GetFieldFromLablePtr( iIdx, sFieldNum._DuplicatedSkillType )->GetInteger();
|
|
pSkillData->nGlobalCoolTime = pSkillTable->GetFieldFromLablePtr( iIdx, sFieldNum._GlobalCoolTime )->GetInteger();
|
|
pSkillData->nGlobalSkillGroup = pSkillTable->GetFieldFromLablePtr( iIdx, sFieldNum._GlobalSkillGroup )->GetInteger();
|
|
|
|
if (pSkillLevelTable->GetItemIDListFromField("_SkillIndex", pSkillData->nSkillID, vlSkillLevelList) > 0)
|
|
{
|
|
pSkillData->vLevelDataList.clear();
|
|
|
|
for (int j = 0; j <(int)vlSkillLevelList.size(); ++j)
|
|
{
|
|
// pve 胶懦 饭骇 抛捞喉父 佬绢咳.
|
|
if ( 0 < pSkillLevelTable->GetFieldFromLablePtr( vlSkillLevelList.at( j ), "_ApplyType" )->GetInteger() )
|
|
continue;
|
|
|
|
memset(&SkillLevelData, 0, sizeof(TSkillLevelData));
|
|
|
|
iIdx = pSkillLevelTable->GetIDXprimary( vlSkillLevelList.at(j) );
|
|
|
|
SkillLevelData.cSkillLevel = pSkillLevelTable->GetFieldFromLablePtr( iIdx, sLevelFieldNum._SkillLevel )->GetInteger();
|
|
SkillLevelData.cLevelLimit = pSkillLevelTable->GetFieldFromLablePtr( iIdx, sLevelFieldNum._LevelLimit )->GetInteger();
|
|
//SkillLevelData.nNeedJobClass = pSkillLevelTable->GetFieldFromLablePtr( iIdx, sLevelFieldNum._NeedJobClass )->GetInteger(); //胶懦 抛捞喉肺 颗败咙.
|
|
SkillLevelData.nDelayTime = pSkillLevelTable->GetFieldFromLablePtr( iIdx, sLevelFieldNum._DelayTime )->GetInteger();
|
|
SkillLevelData.nAddRange = pSkillLevelTable->GetFieldFromLablePtr( iIdx, sLevelFieldNum._AddRange )->GetInteger();
|
|
SkillLevelData.nNeedItemID = pSkillLevelTable->GetFieldFromLablePtr( iIdx, sLevelFieldNum._NeedItem )->GetInteger();
|
|
SkillLevelData.nNeedItemDecreaseCount = pSkillLevelTable->GetFieldFromLablePtr( iIdx, sLevelFieldNum._NeedItemDecreaseCount )->GetInteger();
|
|
SkillLevelData.nDecreaseHP = pSkillLevelTable->GetFieldFromLablePtr( iIdx, sLevelFieldNum._DecreaseHP )->GetInteger();
|
|
SkillLevelData.nDecreaseSP = pSkillLevelTable->GetFieldFromLablePtr( iIdx, sLevelFieldNum._DecreaseSP )->GetInteger();
|
|
SkillLevelData.nNeedSkillPoint = pSkillLevelTable->GetFieldFromLablePtr( iIdx, sLevelFieldNum._NeedSkillPoint )->GetInteger();
|
|
SkillLevelData.nEffectClassValue1Duration = pSkillLevelTable->GetFieldFromLablePtr( iIdx, sLevelFieldNum._EffectClassValue1Duration )->GetInteger();
|
|
SkillLevelData.nPhyDamage = pSkillLevelTable->GetFieldFromLablePtr(iIdx, sLevelFieldNum._PDamage)->GetFloat();
|
|
SkillLevelData.nMagicDamage = pSkillLevelTable->GetFieldFromLablePtr(iIdx, sLevelFieldNum._MDamage)->GetFloat();
|
|
|
|
pSkillData->vLevelDataList.push_back(SkillLevelData);
|
|
}
|
|
}
|
|
|
|
std::pair<TMapSkillData::iterator,bool> Ret = m_pSkillData.insert(make_pair(pSkillData->nSkillID, pSkillData));
|
|
if( Ret.second == false )
|
|
delete pSkillData;
|
|
}
|
|
|
|
|
|
// 胶懦 府悸 且 锭 叼弃飘 胶懦牢瘤 酒囱瘤 备盒窍扁 困秦 叼弃飘 胶懦甸阑 葛酒狄
|
|
char szLabel[64] = { 0, };
|
|
DNTableFileFormat *pDefaultCreateTable = GetDNTable( CDnTableDB::TDEFAULTCREATE );
|
|
int iNumDefaultCreateTalbleItem = pDefaultCreateTable->GetItemCount();
|
|
for( int i = 0; i < iNumDefaultCreateTalbleItem; ++i )
|
|
{
|
|
int iItemID = pDefaultCreateTable->GetItemID( i );
|
|
TDefaultCreateData DefaultData;
|
|
|
|
int iClassID = pDefaultCreateTable->GetFieldFromLablePtr( iItemID, "_ClassID" )->GetInteger();
|
|
|
|
for (int k = 0; k < DEFAULTSKILLMAX; k++ )
|
|
{
|
|
sprintf_s(szLabel, "_DefaultSkill%d", k+1);
|
|
DefaultData.nDefaultSkillID[ k ] = pDefaultCreateTable->GetFieldFromLablePtr( iItemID, szLabel )->GetInteger();
|
|
}
|
|
|
|
m_mapDefaultCreateData.insert( make_pair(iClassID, DefaultData) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TSkillData* CDNGameDataManager::GetSkillData(int nSkillID)
|
|
{
|
|
if (nSkillID <= 0) return NULL;
|
|
|
|
TMapSkillData::iterator iter = m_pSkillData.find(nSkillID);
|
|
if (iter != m_pSkillData.end()){
|
|
return iter->second;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
TSkillLevelData* CDNGameDataManager::GetSkillLevelData(int nSkillID, char cSkillLevel)
|
|
{
|
|
if (nSkillID <= 0) return NULL;
|
|
if (cSkillLevel <= 0) return NULL;
|
|
|
|
TSkillData *pSkill = GetSkillData(nSkillID);
|
|
if (!pSkill) return NULL;
|
|
|
|
for (int i = 0; i <(int)pSkill->vLevelDataList.size(); i++){
|
|
if (pSkill->vLevelDataList[i].cSkillLevel == cSkillLevel){
|
|
return &pSkill->vLevelDataList[i];
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
TSkillTreeData* CDNGameDataManager::GetSkillTreeData( int nSkillID )
|
|
{
|
|
if( nSkillID <= 0 ) return NULL;
|
|
|
|
TMapSkillTreeData::iterator iter = m_pSkillTreeData.find( nSkillID );
|
|
if( iter != m_pSkillTreeData.end() )
|
|
{
|
|
return iter->second;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
TSkillTreeData* CDNGameDataManager::GetSkillTreeDataByIndex( int iIndex )
|
|
{
|
|
TSkillTreeData* pResult = NULL;
|
|
|
|
if( 0 <= iIndex && iIndex <(int)m_vlpSkillTreeData.size() )
|
|
pResult = m_vlpSkillTreeData.at( iIndex );
|
|
|
|
return pResult;
|
|
}
|
|
|
|
|
|
int CDNGameDataManager::GetSkillDelayTime(int nSkillID, char cSkillLevel)
|
|
{
|
|
if (nSkillID <= 0) return NULL;
|
|
if (cSkillLevel <= 0) return NULL;
|
|
|
|
TSkillLevelData *pData = GetSkillLevelData(nSkillID, cSkillLevel);
|
|
if (!pData) return 0;
|
|
|
|
return pData->nDelayTime;
|
|
}
|
|
|
|
int CDNGameDataManager::GetSkillGlobalCoolTime( int nSkillID )
|
|
{
|
|
int iResult = 0;
|
|
if( 0 < nSkillID )
|
|
{
|
|
TSkillData* pData = GetSkillData( nSkillID );
|
|
|
|
// 弊缝栏肺 弓牢 胶懦父 蜡瓤茄 蔼烙.
|
|
if( pData &&
|
|
0 < pData->nGlobalSkillGroup )
|
|
{
|
|
iResult = pData->nGlobalCoolTime;
|
|
}
|
|
}
|
|
|
|
return iResult;
|
|
}
|
|
|
|
int CDNGameDataManager::GetSkillGlobalGroupID( int nSkillID )
|
|
{
|
|
int iResult = 0;
|
|
if( 0 < nSkillID )
|
|
{
|
|
TSkillData* pData = GetSkillData( nSkillID );
|
|
if( pData )
|
|
{
|
|
iResult = pData->nGlobalSkillGroup;
|
|
}
|
|
}
|
|
|
|
return iResult;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsSkillNeedJob(int nSkillID, char cSkillLevel, int nJob)
|
|
{
|
|
TSkillData *pSkillData = GetSkillData(nSkillID);
|
|
if (!pSkillData) return false;
|
|
// 流诀 力茄 沥焊绰 胶懦饭骇抛捞喉俊辑 胶懦抛捞喉肺 颗败咙.
|
|
return(pSkillData->nNeedJobID == nJob);
|
|
}
|
|
|
|
bool CDNGameDataManager::IsSkillLevel(int nSkillID, char cSkillLevel, BYTE cLevel)
|
|
{
|
|
TSkillData *pSkillData = GetSkillData(nSkillID);
|
|
if (!pSkillData) return false;
|
|
if ((cSkillLevel <= 0) ||(cSkillLevel >(char)pSkillData->vLevelDataList.size())) return false;
|
|
if (pSkillData->vLevelDataList[cSkillLevel - 1].cLevelLimit > cLevel) return false;
|
|
return true;
|
|
}
|
|
|
|
// 胶懦讥篮 荤扼龙 抗沥.
|
|
bool CDNGameDataManager::IsSkillShopData(int nSkillID, int nJob, BYTE cLevel)
|
|
{
|
|
TSkillData *pSkillData = GetSkillData(nSkillID);
|
|
if (!pSkillData) return false;
|
|
|
|
// 胶懦饭骇 1楼府父 迫扁锭巩俊 0父 茫栏搁 等促
|
|
if (pSkillData->vLevelDataList[0].cLevelLimit > cLevel) return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetNeedSkillPoint(int nSkillID, char cSkillLevel)
|
|
{
|
|
TSkillData *pSkillData = GetSkillData(nSkillID);
|
|
if (!pSkillData) return 0;
|
|
if ((cSkillLevel <= 0) ||(cSkillLevel >(char)pSkillData->vLevelDataList.size())) return 0;
|
|
|
|
return pSkillData->vLevelDataList[cSkillLevel - 1].nNeedSkillPoint;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadQuestReward()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TQUESTREWARD );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TQUESTREWARD );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TQUESTREWARD );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"QuestRewardTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
m_QuestRewardMap.clear();
|
|
m_MapQuestCommonRewardID.clear();
|
|
|
|
char szTemp[MAX_PATH];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _Gold;
|
|
int _StringIndex;
|
|
int _Exp;
|
|
int _Type;
|
|
int _SelectMax;
|
|
int _QuestID;
|
|
int _QuestStep;
|
|
int _Class;
|
|
std::vector<int> _ItemIndex;
|
|
std::vector<int> _ItemCount;
|
|
int _MailID;
|
|
int _Fatigue;
|
|
std::vector<int> _ItemOptionID;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._Gold = pSox->GetFieldNum( "_Gold" );
|
|
sFieldNum._StringIndex = pSox->GetFieldNum( "_StringIndex" );
|
|
sFieldNum._Exp = pSox->GetFieldNum( "_Exp" );
|
|
sFieldNum._Type = pSox->GetFieldNum( "_Type" );
|
|
sFieldNum._SelectMax = pSox->GetFieldNum( "_SelectMax" );
|
|
sFieldNum._ItemIndex.reserve( QUESTREWARD_INVENTORYITEMMAX );
|
|
sFieldNum._ItemCount.reserve( QUESTREWARD_INVENTORYITEMMAX );
|
|
sFieldNum._QuestID = pSox->GetFieldNum( "_questID" );
|
|
sFieldNum._QuestStep = pSox->GetFieldNum( "_step" );
|
|
sFieldNum._Class = pSox->GetFieldNum( "_class" );
|
|
sFieldNum._MailID = pSox->GetFieldNum( "_MailID" );
|
|
sFieldNum._Fatigue = pSox->GetFieldNum( "_GiveFTG" );
|
|
|
|
for( int j=0 ; j<QUESTREWARD_INVENTORYITEMMAX ; ++j )
|
|
{
|
|
sprintf_s( szTemp, "_ItemIndex%d", j+1 );
|
|
sFieldNum._ItemIndex.push_back( pSox->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_ItemCount%d", j+1 );
|
|
sFieldNum._ItemCount.push_back( pSox->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_ItemOptionID%d", j+1 );
|
|
sFieldNum._ItemOptionID.push_back( pSox->GetFieldNum(szTemp) );
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TQuestReward RewardData;
|
|
ZeroMemory(&RewardData, sizeof(TQuestReward));
|
|
|
|
int nIndex = pSox->GetItemID(i);
|
|
RewardData.nIndex = nIndex;
|
|
|
|
int iIdx = pSox->GetIDXprimary( nIndex );
|
|
|
|
if( pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Gold ) == NULL )
|
|
continue;
|
|
|
|
RewardData.nCoin = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Gold )->GetInteger();
|
|
RewardData.nStringIndex = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._StringIndex )->GetInteger();
|
|
RewardData.nExp = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Exp )->GetInteger();
|
|
RewardData.cType = (char)pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Type )->GetInteger();
|
|
RewardData.cSelectMax = (char)pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SelectMax )->GetInteger();
|
|
RewardData.nQuestID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._QuestID )->GetInteger();
|
|
RewardData.nQuestStep = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._QuestStep )->GetInteger();
|
|
RewardData.nClass = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Class )->GetInteger();
|
|
RewardData.nMailID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._MailID )->GetInteger();
|
|
RewardData.nFatigue = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Fatigue )->GetInteger();
|
|
|
|
if( RewardData.cType == 2 && ( RewardData.cSelectMax < 1 || RewardData.cSelectMax > QUESTREWARD_INVENTORYITEMMAX ) )
|
|
{
|
|
_ASSERT( false && "Quest Reward table Error");
|
|
g_Log.Log(LogType::_FILELOG, L"Quest Reward table Error at index [%d]\n", nIndex);
|
|
return false;
|
|
}
|
|
|
|
for( int j=0 ; j<QUESTREWARD_INVENTORYITEMMAX ; ++j )
|
|
{
|
|
RewardData.ItemArray[j].nItemID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ItemIndex[j] )->GetInteger();
|
|
RewardData.ItemArray[j].nItemCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ItemCount[j] )->GetInteger();
|
|
RewardData.ItemArray[j].nItemOptionTableID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ItemOptionID[j] )->GetInteger();
|
|
}
|
|
|
|
m_QuestRewardMap.insert(make_pair(nIndex, RewardData));
|
|
if(RewardData.nClass == 0)
|
|
m_MapQuestCommonRewardID.insert(make_pair(RewardData.nQuestID, nIndex));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetQuestReward(UINT nRewardCheck, OUT TQuestReward& recom)
|
|
{
|
|
TMapQuestRewardIt it = m_QuestRewardMap.find(nRewardCheck);
|
|
if( it == m_QuestRewardMap.end() )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
CopyMemory(&recom, &(it->second), sizeof(TQuestReward));
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetQuestCommonRewardByQuestID(int nQuestID, OUT TQuestReward& recom)
|
|
{
|
|
TMapQuestRewardID::iterator iter = m_MapQuestCommonRewardID.find(nQuestID);
|
|
if(iter == m_MapQuestCommonRewardID.end())
|
|
return false;
|
|
|
|
int nIndex = iter->second;
|
|
|
|
return GetQuestReward(nIndex, recom);
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadPlayerCustomEventUI()
|
|
{
|
|
DNTableFileFormat * pSox = GetDNTable(CDnTableDB::TPLAYERCUSTOMEVENTUI);
|
|
if (!pSox)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"playercustomeventui.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
m_EventTable.clear();
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _Activate;
|
|
int _MissionID;
|
|
int _UIString;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._Activate = pSox->GetFieldNum( "_Activate" );
|
|
sFieldNum._MissionID = pSox->GetFieldNum( "_Param1" );
|
|
sFieldNum._UIString = pSox->GetFieldNum( "_Param2" );
|
|
|
|
int nItemID, nActivate, nMissionID, nUIString;
|
|
for( int i = 0; i < pSox->GetItemCount(); ++i )
|
|
{
|
|
nItemID = nActivate = nMissionID = nUIString = 0;
|
|
|
|
int nItemID = pSox->GetItemID( i );
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
nActivate = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Activate )->GetInteger();
|
|
nMissionID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._MissionID )->GetInteger();
|
|
nUIString = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._UIString )->GetInteger();
|
|
|
|
if (nActivate > 0)
|
|
m_EventTable.push_back(nMissionID);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void CDNGameDataManager::GetPlayerCustomEventUIList(std::vector <int> &vList)
|
|
{
|
|
if (m_EventTable.empty())
|
|
return;
|
|
|
|
vList = m_EventTable;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadQuestLevelCapReward()
|
|
{
|
|
DNTableFileFormat *pSox = GetDNTable(CDnTableDB::TQUEST_LEVELCAP_REWARD);
|
|
if (!pSox)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"QuestLevelCapRewardTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
m_QuestLevelCapRewards.clear();
|
|
|
|
char szTemp[MAX_PATH];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
char _Type;
|
|
char _ClassID;
|
|
UINT _StringIndex;
|
|
vector<int> _ItemID;
|
|
vector<int> _ItemCount;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._Type = pSox->GetFieldNum("_QuestType");
|
|
sFieldNum._ClassID = pSox->GetFieldNum("_class");
|
|
sFieldNum._ItemID.reserve(MAX_QUEST_LEVEL_CAP_REWARD);
|
|
sFieldNum._ItemCount.reserve(MAX_QUEST_LEVEL_CAP_REWARD);
|
|
|
|
for (int i = 0; i < MAX_QUEST_LEVEL_CAP_REWARD; ++i)
|
|
{
|
|
sprintf_s(szTemp, "_ItemIndex%d", i + 1);
|
|
sFieldNum._ItemID.push_back(pSox->GetFieldNum(szTemp));
|
|
sprintf_s(szTemp, "_ItemCount%d", i + 1);
|
|
sFieldNum._ItemCount.push_back(pSox->GetFieldNum(szTemp));
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
TQuestLevelCapReward Reward;
|
|
ZeroMemory(&Reward, sizeof(Reward));
|
|
|
|
Reward.uIndex = pSox->GetItemID(i);
|
|
int iIdx = pSox->GetIDXprimary(Reward.uIndex);
|
|
Reward.cType = (char)pSox->GetFieldFromLablePtr(iIdx, sFieldNum._Type)->GetInteger();
|
|
Reward.cClassID = (char)pSox->GetFieldFromLablePtr(iIdx, sFieldNum._ClassID)->GetInteger();
|
|
|
|
for (int j = 0; j < MAX_QUEST_LEVEL_CAP_REWARD; ++j)
|
|
{
|
|
Reward.Items[j].nItemID = pSox->GetFieldFromLablePtr(iIdx, sFieldNum._ItemID[j])->GetInteger();
|
|
Reward.Items[j].nItemCount = pSox->GetFieldFromLablePtr(iIdx, sFieldNum._ItemCount[j])->GetInteger();
|
|
}
|
|
|
|
m_QuestLevelCapRewards.insert(make_pair(tr1::make_tuple(Reward.cType, Reward.cClassID), Reward));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
const TQuestLevelCapReward* CDNGameDataManager::GetQuestLevelCapReward(char cType, char cClassID) const
|
|
{
|
|
TMapQuestLevelCapReward::const_iterator it = m_QuestLevelCapRewards.find(tr1::make_tuple(cType, cClassID));
|
|
if (it == m_QuestLevelCapRewards.end())
|
|
return NULL;
|
|
|
|
return &(it->second);
|
|
}
|
|
|
|
bool CDNGameDataManager::GetQuestItemSet(UINT nQuestID, OUT std::set<int>& questItemSet)
|
|
{
|
|
TMapQuestItemDataIt it = m_QuestItemData.find(nQuestID);
|
|
if( it == m_QuestItemData.end() )
|
|
return false;
|
|
|
|
questItemSet = it->second;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadItemCompoundData( void )
|
|
{
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
if (m_pItemCompounder)
|
|
SAFE_DELETE(m_pItemCompounder);
|
|
}
|
|
|
|
m_pItemCompounder = new CDnItemCompounder;
|
|
return m_pItemCompounder->InitializeTable(m_bAllLoaded);
|
|
#else //#ifdef _WORK
|
|
m_pItemCompounder = new CDnItemCompounder;
|
|
return m_pItemCompounder->InitializeTable();
|
|
#endif //#ifdef _WORK
|
|
}
|
|
|
|
#if defined( _GAMESERVER )
|
|
|
|
void CDNGameDataManager::ItemCompound( CMultiRoom* pRoom, CDnItemCompounder::S_ITEM_SETTING_INFO& ItemSetting, CDnItemCompounder::S_OUTPUT* pOutput )
|
|
{
|
|
m_pItemCompounder->Compound( pRoom, ItemSetting, pOutput );
|
|
}
|
|
|
|
void CDNGameDataManager::EmblemCompound( CMultiRoom* pRoom, int iPlateItemID, CDnItemCompounder::S_ITEM_SETTING_INFO& ItemSetting, CDnItemCompounder::S_OUTPUT* pOutput )
|
|
{
|
|
m_pItemCompounder->EmblemCompound( pRoom, iPlateItemID, ItemSetting, pOutput );
|
|
}
|
|
|
|
#else
|
|
void CDNGameDataManager::ItemCompound( CDnItemCompounder::S_ITEM_SETTING_INFO& ItemSetting, CDnItemCompounder::S_OUTPUT* pOutput )
|
|
{
|
|
m_pItemCompounder->Compound( ItemSetting, pOutput );
|
|
}
|
|
|
|
void CDNGameDataManager::EmblemCompound( int iPlateItemID, CDnItemCompounder::S_ITEM_SETTING_INFO& ItemSetting, CDnItemCompounder::S_OUTPUT* pOutput )
|
|
{
|
|
m_pItemCompounder->EmblemCompound( iPlateItemID, ItemSetting, pOutput );
|
|
}
|
|
|
|
#endif // #if defined( _GAMESERVER )
|
|
|
|
|
|
bool CDNGameDataManager::LoadSkillTreeData( void )
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSkillTreeTable;
|
|
if (m_bAllLoaded)
|
|
pSkillTreeTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TSKILLTREE );
|
|
else
|
|
pSkillTreeTable = GetDNTable( CDnTableDB::TSKILLTREE );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSkillTreeTable = GetDNTable( CDnTableDB::TSKILLTREE );
|
|
#endif //#ifdef _WORK
|
|
if( !pSkillTreeTable )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"SkillTreeTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSkillTreeTable->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"SkillTreeTable.dnt Count(%d)\r\n", pSkillTreeTable->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapSkillTreeData, m_pSkillTreeData );
|
|
SAFE_DELETE(m_pSkillTreeSystem);
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _SkillTableID;
|
|
int _TreeSlotIndex;
|
|
int _ParentSkillID1;
|
|
int _ParentSkillID2;
|
|
int _ParentSkillID3;
|
|
int _NeedParentSkillLevel1;
|
|
int _NeedParentSkillLevel2;
|
|
int _NeedParentSkillLevel3;
|
|
#if defined(PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP)
|
|
int _NeedBasicSP;
|
|
int _NeedFirstSP;
|
|
int _NeedSecondSP;
|
|
#endif // #if defined(PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP)
|
|
#if defined( PRE_ADD_ONLY_SKILLBOOK )
|
|
int _NeedSkillBook;
|
|
#endif // #if defined( PRE_ADD_ONLY_SKILLBOOK )
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._SkillTableID = pSkillTreeTable->GetFieldNum( "_SkillTableID" );
|
|
sFieldNum._TreeSlotIndex = pSkillTreeTable->GetFieldNum( "_TreeSlotIndex" );
|
|
sFieldNum._ParentSkillID1 = pSkillTreeTable->GetFieldNum( "_ParentSkillID1" );
|
|
sFieldNum._ParentSkillID2 = pSkillTreeTable->GetFieldNum( "_ParentSkillID2" );
|
|
sFieldNum._ParentSkillID3 = pSkillTreeTable->GetFieldNum( "_ParentSkillID3" );
|
|
sFieldNum._NeedParentSkillLevel1 = pSkillTreeTable->GetFieldNum( "_NeedParentSkillLevel1" );
|
|
sFieldNum._NeedParentSkillLevel2 = pSkillTreeTable->GetFieldNum( "_NeedParentSkillLevel2" );
|
|
sFieldNum._NeedParentSkillLevel3 = pSkillTreeTable->GetFieldNum( "_NeedParentSkillLevel3" );
|
|
#if defined(PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP)
|
|
sFieldNum._NeedBasicSP = pSkillTreeTable->GetFieldNum( "_NeedBasicSP1" );
|
|
sFieldNum._NeedFirstSP = pSkillTreeTable->GetFieldNum( "_NeedFirstSP1" );
|
|
sFieldNum._NeedSecondSP = pSkillTreeTable->GetFieldNum( "_NeedSecondSP1" );
|
|
#endif // #if defined(PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP)
|
|
#if defined( PRE_ADD_ONLY_SKILLBOOK )
|
|
sFieldNum._NeedSkillBook = pSkillTreeTable->GetFieldNum( "_NeedSkillBook" );
|
|
#endif // #if defined( PRE_ADD_ONLY_SKILLBOOK )
|
|
|
|
for( int i = 0; i < pSkillTreeTable->GetItemCount(); ++i )
|
|
{
|
|
TSkillTreeData* pSkillTreeData = new TSkillTreeData;
|
|
memset( pSkillTreeData, 0, sizeof(TSkillTreeData) );
|
|
|
|
int iSkillTreeTableID = pSkillTreeTable->GetItemID( i );
|
|
int iIdx = pSkillTreeTable->GetIDXprimary( iSkillTreeTableID );
|
|
pSkillTreeData->nSkillID = pSkillTreeTable->GetFieldFromLablePtr( iIdx, sFieldNum._SkillTableID )->GetInteger();
|
|
pSkillTreeData->nTreeSlotIndex = pSkillTreeTable->GetFieldFromLablePtr( iIdx, sFieldNum._TreeSlotIndex )->GetInteger();
|
|
pSkillTreeData->nParentSkillID[ 0 ] = pSkillTreeTable->GetFieldFromLablePtr( iIdx, sFieldNum._ParentSkillID1 )->GetInteger();
|
|
pSkillTreeData->nParentSkillID[ 1 ] = pSkillTreeTable->GetFieldFromLablePtr( iIdx, sFieldNum._ParentSkillID2 )->GetInteger();
|
|
pSkillTreeData->nParentSkillID[ 2 ] = pSkillTreeTable->GetFieldFromLablePtr( iIdx, sFieldNum._ParentSkillID3 )->GetInteger();
|
|
pSkillTreeData->nNeedParentSkillLevel[ 0 ] = pSkillTreeTable->GetFieldFromLablePtr( iIdx, sFieldNum._NeedParentSkillLevel1 )->GetInteger();
|
|
pSkillTreeData->nNeedParentSkillLevel[ 1 ] = pSkillTreeTable->GetFieldFromLablePtr( iIdx, sFieldNum._NeedParentSkillLevel2 )->GetInteger();
|
|
pSkillTreeData->nNeedParentSkillLevel[ 2 ] = pSkillTreeTable->GetFieldFromLablePtr( iIdx, sFieldNum._NeedParentSkillLevel3 )->GetInteger();
|
|
|
|
#if defined(PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP)
|
|
pSkillTreeData->nNeedBasicSP = pSkillTreeTable->GetFieldFromLablePtr( iIdx, sFieldNum._NeedBasicSP )->GetInteger();
|
|
pSkillTreeData->nNeedFirstSP = pSkillTreeTable->GetFieldFromLablePtr( iIdx, sFieldNum._NeedFirstSP )->GetInteger();
|
|
pSkillTreeData->nNeedSecondSP = pSkillTreeTable->GetFieldFromLablePtr( iIdx, sFieldNum._NeedSecondSP )->GetInteger();
|
|
#endif // #if defined(PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP)
|
|
#if defined( PRE_ADD_ONLY_SKILLBOOK )
|
|
pSkillTreeData->bNeedSkillBook = pSkillTreeTable->GetFieldFromLablePtr( iIdx, sFieldNum._NeedSkillBook )->GetInteger();
|
|
#endif // #if defined( PRE_ADD_ONLY_SKILLBOOK )
|
|
if( 0 < pSkillTreeData->nSkillID )
|
|
{
|
|
std::pair<TMapSkillTreeData::iterator, bool> Ret = m_pSkillTreeData.insert( make_pair(pSkillTreeData->nSkillID, pSkillTreeData) );
|
|
if( Ret.second == false )
|
|
delete pSkillTreeData;
|
|
else
|
|
m_vlpSkillTreeData.push_back( pSkillTreeData );
|
|
}
|
|
else delete pSkillTreeData;
|
|
}
|
|
|
|
m_pSkillTreeSystem = new CDnSkillTreeSystem;
|
|
return m_pSkillTreeSystem->InitializeTableUsingDataManager( this );
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// PvPMapTable(PvPMaptable.dnt - TPvPMapTable)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadPvPMapTable()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPVPMAP );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TPVPMAP );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPVPMAP );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPMapTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPMapTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TPvPMapTableData, m_PvPMapTable );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int MapTableID;
|
|
int GameModeType;
|
|
std::vector<int> GameModeTableID;
|
|
std::vector<int> NumOfPlayersOption;
|
|
int Allow_Breakin_PlayingGame;
|
|
int ItemUsageType;
|
|
int AllowItemDrop;
|
|
int IsGuildBattleGround;
|
|
int ReleaseShow;
|
|
int LadderType;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.MapTableID = pSox->GetFieldNum( "MapTableID" );
|
|
sFieldNum.GameModeType = pSox->GetFieldNum( "GameModeType" );
|
|
sFieldNum.Allow_Breakin_PlayingGame = pSox->GetFieldNum( "Allow_Breakin_PlayingGame" );
|
|
sFieldNum.ItemUsageType = pSox->GetFieldNum( "ItemUsageType" );
|
|
sFieldNum.AllowItemDrop = pSox->GetFieldNum( "AllowItemDrop" );
|
|
sFieldNum.IsGuildBattleGround = pSox->GetFieldNum( "IsGuildBattleGround" );
|
|
sFieldNum.ReleaseShow = pSox->GetFieldNum( "ReleaseShow" );
|
|
sFieldNum.LadderType = pSox->GetFieldNum( "_LadderType" );
|
|
|
|
sFieldNum.GameModeTableID.reserve(10);
|
|
for( int j=1 ; j<=10 ; ++j )
|
|
{
|
|
sprintf_s( szTemp, "GameModeTableID_%d", j );
|
|
sFieldNum.GameModeTableID.push_back( pSox->GetFieldNum(szTemp) );
|
|
}
|
|
|
|
sFieldNum.NumOfPlayersOption.reserve(5);
|
|
for( int j=1 ; j<= 5 ; ++j )
|
|
{
|
|
sprintf_s( szTemp, "NumOfPlayersOption%d", j );
|
|
sFieldNum.NumOfPlayersOption.push_back( pSox->GetFieldNum(szTemp) );
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
int nMapTableID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MapTableID )->GetInteger();
|
|
if( nMapTableID == 0 )
|
|
continue;
|
|
|
|
// _ASSERT( nMapTableID == nItemID );
|
|
|
|
TPvPMapTable* pPvPMapTable = new TPvPMapTable;
|
|
pPvPMapTable->vGameModeTableID.reserve( 10 );
|
|
pPvPMapTable->vNumOfPlayerOption.reserve( 5 );
|
|
|
|
// GameType
|
|
pPvPMapTable->uiGameType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.GameModeType )->GetInteger();
|
|
_ASSERT( pPvPMapTable->uiGameType < PvPCommon::GameType::Max );
|
|
|
|
// GameMode
|
|
for( int j=1 ; j<=10 ; ++j )
|
|
{
|
|
int iTableID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.GameModeTableID[j-1] )->GetInteger();
|
|
if( iTableID == 0 )
|
|
continue;
|
|
|
|
pPvPMapTable->vGameModeTableID.push_back( iTableID );
|
|
}
|
|
_ASSERT( pPvPMapTable->vGameModeTableID.size() );
|
|
|
|
// 牢盔荐
|
|
for( int j=1 ; j<= 5 ; ++j )
|
|
{
|
|
int nCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.NumOfPlayersOption[j-1] )->GetInteger();
|
|
if( nCount <= 0 )
|
|
break;
|
|
|
|
_ASSERT( nCount <= PvPCommon::Common::MaxPlayer );
|
|
pPvPMapTable->vNumOfPlayerOption.push_back( nCount );
|
|
}
|
|
_ASSERT( pPvPMapTable->vNumOfPlayerOption.size() );
|
|
|
|
// 抄涝啊瓷Flag
|
|
pPvPMapTable->bIsBreakInto = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Allow_Breakin_PlayingGame )->GetInteger() == 0 ) ? false : true;
|
|
|
|
// PvPCommon::ItemUsageType
|
|
int nItemUsageType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.ItemUsageType )->GetInteger();
|
|
_ASSERT( nItemUsageType >= 0 && nItemUsageType < PvPCommon::ItemUsageType::Max );
|
|
|
|
// 酒捞袍靛酚 Flag
|
|
pPvPMapTable->bIsAllowItemDrop = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.AllowItemDrop )->GetInteger() == 0 ) ? false : true;
|
|
|
|
// 辨靛傈俊辑 荤侩且荐 乐绰瘤 Flag
|
|
pPvPMapTable->bIsGuildBattleGround = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.IsGuildBattleGround )->GetInteger() == 0 ) ? false : true;
|
|
|
|
// 副府令滚傈俊辑畴免
|
|
pPvPMapTable->bIsReleaseShow = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.ReleaseShow )->GetInteger() == 0 ) ? false : true;
|
|
|
|
pPvPMapTable->MatchType = static_cast<LadderSystem::MatchType::eCode>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.LadderType )->GetInteger() );
|
|
|
|
if( pPvPMapTable->MatchType > LadderSystem::MatchType::None )
|
|
{
|
|
std::map<LadderSystem::MatchType::eCode,std::vector<int>>::iterator itor = m_LadderMatchTypeMapIndex.find( pPvPMapTable->MatchType );
|
|
if( itor == m_LadderMatchTypeMapIndex.end() )
|
|
{
|
|
std::vector<int> vList;
|
|
vList.push_back( nMapTableID );
|
|
m_LadderMatchTypeMapIndex.insert( std::make_pair(pPvPMapTable->MatchType,vList) );
|
|
}
|
|
else
|
|
{
|
|
(*itor).second.push_back( nMapTableID );
|
|
}
|
|
}
|
|
|
|
std::pair<TPvPMapTableData::iterator,bool> Ret = m_PvPMapTable.insert( make_pair( nMapTableID, pPvPMapTable ) );
|
|
if( Ret.second == false )
|
|
delete pPvPMapTable;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
const TPvPMapTable* CDNGameDataManager::GetPvPMapTable( const int nItemID )
|
|
{
|
|
TPvPMapTableData::iterator itor = m_PvPMapTable.find( nItemID );
|
|
if( itor != m_PvPMapTable.end() )
|
|
return itor->second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
#ifdef PRE_MOD_PVPRANK
|
|
UINT CDNGameDataManager::GetPvPExpThreshold()
|
|
{
|
|
return m_nThresholdPvPExpValue;
|
|
}
|
|
|
|
int CDNGameDataManager::GetRelativePvPRank(int nExpAbsoluteRank, float fExpRateRank)
|
|
{
|
|
if (nExpAbsoluteRank == 0 && fExpRateRank == 0.0f)
|
|
return 0;
|
|
|
|
//if (PvPCommon::Common::PvPAbsoluteRankCountMax < nExpAbsoluteRank)
|
|
// return -1;
|
|
|
|
TPvPRankTableData::iterator itor;
|
|
if (fExpRateRank > 0.0f)
|
|
{
|
|
for (itor = m_PvPRankTable.begin(); itor != m_PvPRankTable.end(); itor++)
|
|
{
|
|
if ((*itor).second->cType != PvPCommon::RankTable::RateValue) continue;
|
|
if ((*itor).second->cMinRange <= (BYTE)fExpRateRank && (*itor).second->cMaxRange >= (BYTE)fExpRateRank)
|
|
return (*itor).first;
|
|
}
|
|
}
|
|
else if (nExpAbsoluteRank > 0)
|
|
{
|
|
for (itor = m_PvPRankTable.begin(); itor != m_PvPRankTable.end(); itor++)
|
|
{
|
|
if ((*itor).second->cType != PvPCommon::RankTable::AbsoluteRankValue) continue;
|
|
if ((*itor).second->cMinRange <= nExpAbsoluteRank && (*itor).second->cMaxRange >= nExpAbsoluteRank)
|
|
return (*itor).first;
|
|
}
|
|
}
|
|
|
|
return -2;
|
|
}
|
|
|
|
#if defined(PRE_ADD_PVP_RANKING)
|
|
void CDNGameDataManager::SetRelativePvPRank( BYTE *cPvPLevel, UINT uiExp, int iPvPRank, float fPvPRaito )
|
|
{
|
|
if( uiExp >= g_pDataManager->GetPvPExpThreshold() )
|
|
{
|
|
int nRetLevel = g_pDataManager->GetRelativePvPRank(iPvPRank, fPvPRaito);
|
|
if (nRetLevel > 0)
|
|
*cPvPLevel = static_cast<BYTE>(nRetLevel);
|
|
}
|
|
}
|
|
#endif //#if defined(PRE_ADD_PVP_RANKING)
|
|
#endif //#ifdef PRE_MOD_PVPRANK
|
|
|
|
int CDNGameDataManager::GetRandomLadderMapIndex( LadderSystem::MatchType::eCode MatchType )
|
|
{
|
|
std::map<LadderSystem::MatchType::eCode,std::vector<int>>::iterator itor = m_LadderMatchTypeMapIndex.find( MatchType );
|
|
if( itor != m_LadderMatchTypeMapIndex.end() )
|
|
{
|
|
CMtRandom Random;
|
|
Random.srand( timeGetTime() );
|
|
|
|
return(*itor).second[Random.rand()%(*itor).second.size()];
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// PvPGameModeTable(PvPGameModetable.dnt - TPvPGameModeTable)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadPvPGameModeTable()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPVPGAMEMODE );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TPVPGAMEMODE );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPVPGAMEMODE );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPGameModeTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPGameModeTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TPvPGameModeTableData, m_PvPGameModeTable );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int GamemodeID;
|
|
std::vector<int> WinCondition;
|
|
std::vector<int> PlayTime;
|
|
int Respawn_Time;
|
|
int Respawn_Nodamage_Time;
|
|
int Respawn_HP_Percent;
|
|
int Respawn_MP_Percent;
|
|
int WinXP_PerRound;
|
|
int LoseXP_PerRound;
|
|
int KOItemDropTableID;
|
|
int StartRegulation;
|
|
int ReleaseShow;
|
|
int MedalExp;
|
|
std::vector<int> VictoryExp;
|
|
std::vector<int> VicrotyBonusRate;
|
|
std::vector<int> DefeatExp;
|
|
std::vector<int> DefeatBonusRate;
|
|
int NumOfPlayersMin;
|
|
int NumOfPlayersMax;
|
|
int LadderType;
|
|
int ItemID;
|
|
int FatigueConTime;
|
|
int FatigueConValue;
|
|
int FatigueConExp;
|
|
int FatigueConMedal;
|
|
int NeedInven;
|
|
int SkillSetting;
|
|
int SelectableRevision;
|
|
int DefaultRevision;
|
|
int nBattleGroundTableID;
|
|
int nAllowedUserCreateMode;
|
|
#if defined( PRE_ADD_RACING_MODE )
|
|
int DefaultRewardItem;
|
|
int DefaultRewardValue;
|
|
std::vector<int> RankRewardItem;
|
|
std::vector<int> RankRewardValue;
|
|
#endif
|
|
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.GamemodeID = pSox->GetFieldNum( "GamemodeID" );
|
|
sFieldNum.Respawn_Time = pSox->GetFieldNum( "Respawn_Time" );
|
|
sFieldNum.Respawn_Nodamage_Time = pSox->GetFieldNum( "Respawn_Nodamage_Time" );
|
|
sFieldNum.Respawn_HP_Percent = pSox->GetFieldNum( "Respawn_HP_Percent" );
|
|
sFieldNum.Respawn_MP_Percent = pSox->GetFieldNum( "Respawn_MP_Percent" );
|
|
sFieldNum.WinXP_PerRound = pSox->GetFieldNum( "WinXP_PerRound" );
|
|
sFieldNum.LoseXP_PerRound = pSox->GetFieldNum( "LoseXP_PerRound" );
|
|
sFieldNum.KOItemDropTableID = pSox->GetFieldNum( "KOItemDropTableID" );
|
|
sFieldNum.StartRegulation = pSox->GetFieldNum( "StartRegulation" );
|
|
sFieldNum.ReleaseShow = pSox->GetFieldNum( "ReleaseShow" );
|
|
sFieldNum.MedalExp = pSox->GetFieldNum( "MedalExp" );
|
|
sFieldNum.NumOfPlayersMin = pSox->GetFieldNum( "NumOfPlayers_Min" );
|
|
sFieldNum.NumOfPlayersMax = pSox->GetFieldNum( "NumOfPlayers_Max" );
|
|
sFieldNum.LadderType = pSox->GetFieldNum( "LadderType" );
|
|
sFieldNum.ItemID = pSox->GetFieldNum( "_ItemID" );
|
|
sFieldNum.FatigueConTime = pSox->GetFieldNum( "_FatigueConTime" );
|
|
sFieldNum.FatigueConValue = pSox->GetFieldNum( "_FatigueConValue" );
|
|
sFieldNum.FatigueConExp = pSox->GetFieldNum( "_FatigueConExp" );
|
|
sFieldNum.FatigueConMedal = pSox->GetFieldNum( "_FatigueConMedal" );
|
|
sFieldNum.NeedInven = pSox->GetFieldNum( "_NeedInven" );
|
|
sFieldNum.SkillSetting = pSox->GetFieldNum( "_SkillSetting" );
|
|
sFieldNum.SelectableRevision = pSox->GetFieldNum( "_SelectableRevision" );
|
|
sFieldNum.DefaultRevision = pSox->GetFieldNum( "_DefaultRevision" );
|
|
sFieldNum.nBattleGroundTableID = pSox->GetFieldNum( "_BattleGroundID" );
|
|
sFieldNum.nAllowedUserCreateMode = pSox->GetFieldNum( "_UserCreate" );
|
|
|
|
sFieldNum.WinCondition.reserve(5);
|
|
for( int j=1 ; j<=5 ; ++j )
|
|
{
|
|
sprintf_s( szTemp, "WinCondition_%d", j );
|
|
sFieldNum.WinCondition.push_back( pSox->GetFieldNum(szTemp) );
|
|
}
|
|
sFieldNum.PlayTime.reserve(5);
|
|
for( int j=1 ; j<= 5 ; ++j )
|
|
{
|
|
sprintf_s( szTemp, "PlayTime_%d", j );
|
|
sFieldNum.PlayTime.push_back( pSox->GetFieldNum(szTemp) );
|
|
}
|
|
|
|
sFieldNum.VictoryExp.reserve(5);
|
|
for( int j=1 ; j<= 5 ; ++j )
|
|
{
|
|
sprintf_s( szTemp, "VictoryExp_%d", j );
|
|
sFieldNum.VictoryExp.push_back( pSox->GetFieldNum(szTemp) );
|
|
}
|
|
|
|
sFieldNum.VicrotyBonusRate.reserve(5);
|
|
for( int j=1 ; j<= 5 ; ++j )
|
|
{
|
|
sprintf_s( szTemp, "VictoryBonusRate_%d", j );
|
|
sFieldNum.VicrotyBonusRate.push_back( pSox->GetFieldNum(szTemp) );
|
|
}
|
|
|
|
sFieldNum.DefeatExp.reserve(5);
|
|
for( int j=1 ; j<= 5 ; ++j )
|
|
{
|
|
sprintf_s( szTemp, "DefeatExp_%d", j );
|
|
sFieldNum.DefeatExp.push_back( pSox->GetFieldNum(szTemp) );
|
|
}
|
|
|
|
sFieldNum.DefeatBonusRate.reserve(5);
|
|
for( int j=1 ; j<= 5 ; ++j )
|
|
{
|
|
sprintf_s( szTemp, "DefeatBonusRate_%d", j );
|
|
sFieldNum.DefeatBonusRate.push_back( pSox->GetFieldNum(szTemp) );
|
|
}
|
|
#if defined(PRE_ADD_RACING_MODE)
|
|
sFieldNum.DefaultRewardItem = pSox->GetFieldNum( "_ModeDefaultRewardItem" );
|
|
sFieldNum.DefaultRewardValue = pSox->GetFieldNum( "_ModeDefaultRewardValue" );
|
|
sFieldNum.RankRewardItem.reserve(8);
|
|
for( int j=1; j<=8; ++ j )
|
|
{
|
|
sprintf_s( szTemp, "_RankRewardItem%d", j );
|
|
sFieldNum.RankRewardItem.push_back( pSox->GetFieldNum(szTemp) );
|
|
}
|
|
sFieldNum.RankRewardValue.reserve(8);
|
|
for( int j=1; j<=8; ++ j )
|
|
{
|
|
sprintf_s( szTemp, "_RankRewardValue%d", j );
|
|
sFieldNum.RankRewardValue.push_back( pSox->GetFieldNum(szTemp) );
|
|
}
|
|
#endif
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
|
|
_ASSERT( nItemID > 0 );
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
int iGameMode = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.GamemodeID )->GetInteger();
|
|
if( iGameMode == -1 || iGameMode >= PvPCommon::GameMode::Max )
|
|
continue;
|
|
|
|
_ASSERT( iGameMode < PvPCommon::GameMode::Max );
|
|
|
|
TPvPGameModeTable* pPvPGameModeTable = new TPvPGameModeTable;
|
|
pPvPGameModeTable->nItemID = nItemID;
|
|
pPvPGameModeTable->vWinCondition.reserve( 5 );
|
|
pPvPGameModeTable->vPlayTimeSec.reserve( 5 );
|
|
|
|
pPvPGameModeTable->uiGameMode = iGameMode;
|
|
|
|
// 铰府炼扒
|
|
for( int j=1 ; j<=5 ; ++j )
|
|
{
|
|
int iWinCondition = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.WinCondition[j-1] )->GetInteger();
|
|
if( iWinCondition == 0 )
|
|
break;
|
|
_ASSERT( iWinCondition > 0 );
|
|
|
|
pPvPGameModeTable->vWinCondition.push_back( iWinCondition );
|
|
}
|
|
//_ASSERT( pPvPGameModeTable->vWinCondition.size() );
|
|
|
|
// 敲饭捞矫埃
|
|
for( int j=1 ; j<= 5 ; ++j )
|
|
{
|
|
int iSec = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PlayTime[j-1] )->GetInteger();
|
|
if( iSec == 0 )
|
|
break;
|
|
_ASSERT( iSec > 0 );
|
|
|
|
pPvPGameModeTable->vPlayTimeSec.push_back( iSec );
|
|
}
|
|
//_ASSERT( pPvPGameModeTable->vPlayTimeSec.size() );
|
|
// LadderType
|
|
pPvPGameModeTable->LadderMatchType = static_cast<LadderSystem::MatchType::eCode>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.LadderType )->GetInteger());
|
|
// 何劝措扁矫埃
|
|
pPvPGameModeTable->uiRespawnTimeSec = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Respawn_Time )->GetInteger();
|
|
// 何劝公利矫埃
|
|
pPvPGameModeTable->uiRespawnNoDamageTimeSec = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Respawn_Nodamage_Time )->GetInteger();
|
|
// 何劝 矫 雀汗登绰 HP%
|
|
pPvPGameModeTable->uiRespawnHPPercent = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Respawn_HP_Percent )->GetInteger();
|
|
// 何劝 矫 雀汗登绰 MP%
|
|
pPvPGameModeTable->uiRespawnMPPercent = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Respawn_MP_Percent )->GetInteger();
|
|
// 铰府 焊呈胶 痢荐
|
|
pPvPGameModeTable->uiWinXPPerRound = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.WinXP_PerRound )->GetInteger();
|
|
// 菩硅 焊呈胶 痢荐
|
|
pPvPGameModeTable->uiLoseXPPerRound = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.LoseXP_PerRound )->GetInteger();
|
|
// 利KO矫靛酚酒捞袍
|
|
pPvPGameModeTable->uiItemDropTableID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.KOItemDropTableID )->GetInteger();
|
|
// 饭骇焊沥矫胶袍ON/OFF
|
|
pPvPGameModeTable->bIsLevelRegulation = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.StartRegulation )->GetInteger() == 1 ) ? true : false;
|
|
// 副府令滚傈俊辑畴免
|
|
pPvPGameModeTable->bIsReleaseShow = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.ReleaseShow )->GetInteger() == 1 ) ? true : false;
|
|
// 皋崔瘤鞭痢荐
|
|
pPvPGameModeTable->uiMedalExp = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MedalExp )->GetInteger();
|
|
pPvPGameModeTable->uiNumOfPlayersMin = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.NumOfPlayersMin )->GetInteger();
|
|
pPvPGameModeTable->uiNumOfPlayersMax = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.NumOfPlayersMax )->GetInteger();
|
|
pPvPGameModeTable->iRewardItemID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.ItemID )->GetInteger();
|
|
pPvPGameModeTable->nFatigueConTime = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.FatigueConTime)->GetInteger();
|
|
pPvPGameModeTable->nFatigueConValue = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.FatigueConValue)->GetInteger();
|
|
pPvPGameModeTable->nFatigueConExp = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.FatigueConExp)->GetInteger();
|
|
pPvPGameModeTable->nFatigueConMedal = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.FatigueConMedal)->GetInteger();
|
|
pPvPGameModeTable->iNeedInven = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.NeedInven)->GetInteger();
|
|
pPvPGameModeTable->iSkillSetting = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SkillSetting)->GetInteger();
|
|
pPvPGameModeTable->bIsSelectableRegulation = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SelectableRevision )->GetInteger() == TRUE ) ? true : false;
|
|
pPvPGameModeTable->bIsDefaultRegulation = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.DefaultRevision )->GetInteger() == TRUE ) ? true : false;
|
|
pPvPGameModeTable->nBattleGroundTableID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nBattleGroundTableID)->GetInteger();
|
|
pPvPGameModeTable->bAllowedUserCreateMode = (pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nAllowedUserCreateMode)->GetInteger() > 0) ? true : false;
|
|
|
|
// 铰府矫 掘绰 PvPExp 痢荐
|
|
for( int j=1 ; j<= 5 ; ++j )
|
|
{
|
|
int iExp = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.VictoryExp[j-1] )->GetInteger();
|
|
pPvPGameModeTable->vVictoryExp.push_back( iExp );
|
|
}
|
|
|
|
// 铰府矫 掘绰 PvPExp 焊呈胶 痢荐
|
|
for( int j=1 ; j<= 5 ; ++j )
|
|
{
|
|
int iExp = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.VicrotyBonusRate[j-1] )->GetInteger();
|
|
pPvPGameModeTable->vVictoryBonusRate.push_back( iExp );
|
|
}
|
|
|
|
// 菩硅矫 掘绰 PvPExp 痢荐
|
|
for( int j=1 ; j<= 5 ; ++j )
|
|
{
|
|
int iExp = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.DefeatExp[j-1] )->GetInteger();
|
|
pPvPGameModeTable->vDefeatExp.push_back( iExp );
|
|
}
|
|
|
|
// 菩硅矫 掘绰 PvPExp 焊呈胶 痢荐
|
|
for( int j=1 ; j<= 5 ; ++j )
|
|
{
|
|
int iExp = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.DefeatBonusRate[j-1] )->GetInteger();
|
|
pPvPGameModeTable->vDefeatBonusRate.push_back( iExp );
|
|
}
|
|
#if defined( PRE_ADD_RACING_MODE ) || defined( PRE_ADD_PVP_TOURNAMENT )
|
|
pPvPGameModeTable->nDefaultRewardItem = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.DefaultRewardItem)->GetInteger();
|
|
pPvPGameModeTable->nDefaultRewardValue = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.DefaultRewardValue)->GetInteger();
|
|
// 惑困鼻 焊惑 酒捞袍 ID
|
|
for( int j=1 ; j<= 8 ; ++j )
|
|
{
|
|
int iRewardItem = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.RankRewardItem[j-1] )->GetInteger();
|
|
pPvPGameModeTable->vRankRewardItem.push_back( iRewardItem );
|
|
}
|
|
// 惑困鼻 焊惑 酒捞袍 荐樊
|
|
for( int j=1 ; j<= 8 ; ++j )
|
|
{
|
|
int iRewardValue = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.RankRewardValue[j-1] )->GetInteger();
|
|
pPvPGameModeTable->vRankRewardValue.push_back( iRewardValue );
|
|
}
|
|
#endif // #if defined( PRE_ADD_RACING_MODE ) || defined( PRE_ADD_PVP_TOURNAMENT )
|
|
std::pair<TPvPGameModeTableData::iterator,bool> Ret = m_PvPGameModeTable.insert( make_pair( nItemID, pPvPGameModeTable ) );
|
|
if( Ret.second == false )
|
|
delete pPvPGameModeTable;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
const TPvPGameModeTable* CDNGameDataManager::GetPvPGameModeTable( const int nItemID )
|
|
{
|
|
TPvPGameModeTableData::iterator itor = m_PvPGameModeTable.find( nItemID );
|
|
if( itor != m_PvPGameModeTable.end() )
|
|
return itor->second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
#if defined( _GAMESERVER )
|
|
//---------------------------------------------------------------------------------
|
|
//(pvpgamemodeitemsetting.dnt)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadPvPGameModeSkillSetting()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPVPGAMEMODESKILLSETTING );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TPVPGAMEMODESKILLSETTING );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPVPGAMEMODESKILLSETTING );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"pvpgamemodeitemsetting.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"pvpgamemodeitemsetting.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_mPvPGameModeSkillSetting.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _GroupID;
|
|
int _BaseClass;
|
|
std::pair<int,int> _SkillIndexLevel[30];
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._GroupID = pSox->GetFieldNum( "_GroupID" );
|
|
sFieldNum._BaseClass = pSox->GetFieldNum( "_BaseClass" );
|
|
for( UINT i=0 ; i<_countof(sFieldNum._SkillIndexLevel) ; ++i )
|
|
{
|
|
char szBuf[MAX_PATH];
|
|
sprintf_s( szBuf, "_SkillIndex%d", i+1 );
|
|
sFieldNum._SkillIndexLevel[i].first = pSox->GetFieldNum( szBuf );
|
|
sprintf_s( szBuf, "_SkillLevel%d", i+1 );
|
|
sFieldNum._SkillIndexLevel[i].second = pSox->GetFieldNum( szBuf );
|
|
}
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
|
|
_ASSERT( nItemID > 0 );
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
int iGroupID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._GroupID )->GetInteger();
|
|
int iClassID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._BaseClass )->GetInteger()+1; // 抛捞喉俊辑绰 Index 啊 ZeroBase 捞扁 锭巩俊 +1 秦霖促.
|
|
|
|
std::vector<std::pair<int,int>> vData;
|
|
|
|
for( UINT j=0 ; j<_countof(sFieldNum._SkillIndexLevel) ; ++j )
|
|
{
|
|
int iSkillIndex = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SkillIndexLevel[j].first )->GetInteger();
|
|
if( iSkillIndex <= 0 )
|
|
continue;
|
|
int iSkillLevel = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SkillIndexLevel[j].second )->GetInteger();
|
|
_ASSERT( iSkillLevel < 1 );
|
|
|
|
vData.push_back( std::make_pair(iSkillIndex,iSkillLevel) );
|
|
}
|
|
|
|
m_mPvPGameModeSkillSetting.insert( std::make_pair( std::make_pair(iGroupID,iClassID),vData ) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetPvPGameModeSkillSetting( int iGroupID, int iClassID, std::vector<std::pair<int,int>>& vData )
|
|
{
|
|
map<pair<int,int>,vector<pair<int,int>>>::iterator itor = m_mPvPGameModeSkillSetting.find( std::make_pair(iGroupID,iClassID) );
|
|
if( itor != m_mPvPGameModeSkillSetting.end() )
|
|
{
|
|
vData = (*itor).second;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
#endif // #if defined( _GAMESERVER )
|
|
|
|
bool CDNGameDataManager::LoadBattleGroundMode()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TBATTLEGROUNDMODE );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TBATTLEGROUNDMODE );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TBATTLEGROUNDMODE );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"battlegroundmodesetting.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"battlegroundmodesetting.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_mBattleGroundModeInfo.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
////##################################################################
|
|
//// FieldNum 固府 祸牢
|
|
////##################################################################
|
|
struct TempFieldNum
|
|
{
|
|
int nID;
|
|
int nWaitingMin;
|
|
int nFinishingMin;
|
|
int nPvPSkillPoint;
|
|
int nVictoryCondition[PvPCommon::Common::MaximumVitoryCondition]; //PvPCommon::BattleGroundVictoryState
|
|
int nVictoryParam[PvPCommon::Common::MaximumVitoryCondition]; //PvPCommon::BattleGroundVictoryState
|
|
int nBossID[PvPCommon::TeamIndex::Max]; //积己焊胶酒捞叼
|
|
int nBossSpawnAreaID[PvPCommon::TeamIndex::Max]; //焊胶积己矫 胶迄困摹
|
|
int nMaximumResourceLimit;
|
|
int nAllOcuupationBonusGain;
|
|
int nOccupationBonusGain[PvPCommon::Common::MaximumCapturePosition];
|
|
int nCaptureScore;
|
|
int nStealScore;
|
|
int nKillScore;
|
|
int nClimaxTime;
|
|
int nClimaxRespawnTime;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nWaitingMin = pSox->GetFieldNum("_WaitingTime");
|
|
sFieldNum.nFinishingMin = pSox->GetFieldNum("_WarFinishTime");
|
|
sFieldNum.nPvPSkillPoint = pSox->GetFieldNum("_GuildSkillPoint");
|
|
|
|
char szTemp[MAX_PATH];
|
|
for (int i = 0; i < PvPCommon::Common::MaximumVitoryCondition; i++)
|
|
{
|
|
memset(&szTemp, 0, sizeof(szTemp));
|
|
sprintf_s( szTemp, "_VictoryRule%d", i+1 );
|
|
sFieldNum.nVictoryCondition[i] = pSox->GetFieldNum(szTemp);
|
|
|
|
memset(&szTemp, 0, sizeof(szTemp));
|
|
sprintf_s( szTemp, "_VictoryRule%dParam", i+1 );
|
|
sFieldNum.nVictoryParam[i] = pSox->GetFieldNum(szTemp);
|
|
}
|
|
|
|
for (int i = 0; i < PvPCommon::TeamIndex::Max; i++)
|
|
{
|
|
sFieldNum.nBossID[i] = pSox->GetFieldNum(i == 0 ? "_CosmosBossID" : "_ChaosBossID");
|
|
sFieldNum.nBossSpawnAreaID[i] = pSox->GetFieldNum(i == 0 ? "_CosmosBossPlaceID" : "_ChaosBossPlaceID");
|
|
}
|
|
|
|
sFieldNum.nMaximumResourceLimit = pSox->GetFieldNum("_MaxResourceSave");
|
|
sFieldNum.nAllOcuupationBonusGain = pSox->GetFieldNum("_CaptureResourceAll");
|
|
for (int i = 0; i < PvPCommon::Common::MaximumCapturePosition; i++)
|
|
{
|
|
memset(&szTemp, 0, sizeof(szTemp));
|
|
sprintf_s( szTemp, "_CaptureResource%d", i+1 );
|
|
sFieldNum.nOccupationBonusGain[i] = pSox->GetFieldNum(szTemp);
|
|
}
|
|
|
|
sFieldNum.nCaptureScore = pSox->GetFieldNum("_Conquest_Score");
|
|
sFieldNum.nStealScore = pSox->GetFieldNum("_Conquest_StealScore");
|
|
sFieldNum.nKillScore = pSox->GetFieldNum("_Conquest_KillScore");
|
|
sFieldNum.nClimaxTime = pSox->GetFieldNum("_ClimaxTime");
|
|
sFieldNum.nClimaxRespawnTime = pSox->GetFieldNum("_Cl_Respawn_Time");
|
|
|
|
////##################################################################
|
|
//// Load
|
|
////##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TBattleGourndModeInfo Info;
|
|
memset(&Info, 0, sizeof(TBattleGourndModeInfo));
|
|
|
|
Info.nID = nItemID;
|
|
Info.nWaitingMin = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nWaitingMin)->GetInteger();
|
|
Info.nFinishingMin = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nFinishingMin)->GetInteger();
|
|
Info.nPvPSkillPoint = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nPvPSkillPoint)->GetInteger();
|
|
|
|
for (int j = 0; j < PvPCommon::Common::MaximumVitoryCondition; j++)
|
|
{
|
|
Info.ModeInfo.nVictoryCondition[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nVictoryCondition[j])->GetInteger();
|
|
Info.ModeInfo.nVictoryParam[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nVictoryParam[j])->GetInteger();
|
|
}
|
|
|
|
for (int j = 0; j < PvPCommon::TeamIndex::Max; j++)
|
|
{
|
|
Info.ModeInfo.nBossID[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nBossID[j])->GetInteger();
|
|
Info.ModeInfo.nBossSpawnAreaID[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nBossSpawnAreaID[j])->GetInteger();
|
|
}
|
|
|
|
Info.nMaximumResourceLimit = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMaximumResourceLimit)->GetInteger();
|
|
Info.nAllOcuupationBonusGain = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nAllOcuupationBonusGain)->GetInteger();
|
|
|
|
for (int j = 0; j < PvPCommon::Common::MaximumCapturePosition; j++)
|
|
Info.nOccupationBonusGain[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nOccupationBonusGain[j])->GetInteger();
|
|
|
|
Info.nCaptureScore = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nCaptureScore)->GetInteger();
|
|
Info.nStealScore = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nStealScore)->GetInteger();
|
|
Info.nKillScore = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nKillScore)->GetInteger();
|
|
Info.nClimaxTime = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nClimaxTime)->GetInteger();
|
|
Info.nClimaxRespawnTime = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nClimaxRespawnTime)->GetInteger();
|
|
|
|
if(m_mBattleGroundModeInfo.find(Info.nID) == m_mBattleGroundModeInfo.end())
|
|
m_mBattleGroundModeInfo.insert(std::make_pair(Info.nID, Info));
|
|
else
|
|
{
|
|
_ASSERT_EXPR(0, L"鞍篮 甘酒捞叼啊 粮犁窃 甘酒捞叼绰 蜡聪农秦具窃");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetBattleGroundModeInfo(int nPvPModeID, TBattleGourndModeInfo &ModeInfo)
|
|
{
|
|
std::map <int, TBattleGourndModeInfo>::iterator ii = m_mBattleGroundModeInfo.find(nPvPModeID);
|
|
if(ii != m_mBattleGroundModeInfo.end())
|
|
{
|
|
ModeInfo = (*ii).second;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadBattleGroundResourceArea()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TBATTLEGROUNDRESWAR );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TBATTLEGROUNDRESWAR );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TBATTLEGROUNDRESWAR );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"battlegroundresourcewar.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"battlegroundresourcewar.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_mBattleGroundPositionInfo.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
////##################################################################
|
|
//// FieldNum 固府 祸牢
|
|
////##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nID;
|
|
int nMapID;
|
|
int nPvPModeID;
|
|
int nAreaID;
|
|
int nGainResourceTermTick;
|
|
int nGainResource;
|
|
int nRequireTryTick;
|
|
int nCompleteOccupationTick;
|
|
int nBonusBuffID;
|
|
int nClimaxTick;
|
|
int nClimaxGainTermTick;
|
|
int nClimaxGainVal;
|
|
int nClimaxTryTick;
|
|
int nClimaxCompleteOccupationTick;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nMapID = pSox->GetFieldNum( "_MapID" );
|
|
sFieldNum.nPvPModeID = pSox->GetFieldNum( "_PvPGamemodeId" );
|
|
sFieldNum.nAreaID = pSox->GetFieldNum( "_EventAreaID" );
|
|
sFieldNum.nGainResourceTermTick = pSox->GetFieldNum( "_ResourceAddTic" );
|
|
sFieldNum.nGainResource = pSox->GetFieldNum( "_AddTicResource" );
|
|
sFieldNum.nRequireTryTick = pSox->GetFieldNum( "_ClickKeepTime" );
|
|
sFieldNum.nCompleteOccupationTick = pSox->GetFieldNum( "_CaptureKeepTime" );
|
|
sFieldNum.nBonusBuffID = pSox->GetFieldNum( "_CaptureBounersBuffID" );
|
|
sFieldNum.nClimaxGainTermTick = pSox->GetFieldNum( "_Cl_ResourceAddTic" );
|
|
sFieldNum.nClimaxGainVal = pSox->GetFieldNum( "_Cl_AddTicResource" );
|
|
sFieldNum.nClimaxTryTick = pSox->GetFieldNum( "_Cl_ClickKeepTime" );
|
|
sFieldNum.nClimaxCompleteOccupationTick = pSox->GetFieldNum( "_Cl_CaptureKeepTime" );
|
|
|
|
////##################################################################
|
|
//// Load
|
|
////##################################################################
|
|
|
|
std::vector<TPositionAreaInfo> vArea;
|
|
std::vector<TPositionAreaInfo>::iterator iArea;
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TPositionAreaInfo Info;
|
|
memset(&Info, 0, sizeof(TPositionAreaInfo));
|
|
|
|
Info.nID = nItemID;
|
|
Info.nMapID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMapID)->GetInteger();
|
|
Info.nPvPModeID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nPvPModeID)->GetInteger();
|
|
Info.nAreaID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nAreaID)->GetInteger();
|
|
Info.nGainResourceTermTick = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nGainResourceTermTick)->GetInteger();
|
|
Info.nGainResource = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nGainResource)->GetInteger();
|
|
Info.nRequireTryTick = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nRequireTryTick)->GetInteger();
|
|
Info.nCompleteOccupationTick = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nCompleteOccupationTick)->GetInteger();
|
|
Info.nBonusBuffID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nBonusBuffID)->GetInteger();
|
|
Info.nClimaxGainTermTick = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nClimaxGainTermTick)->GetInteger();
|
|
Info.nClimaxGainVal = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nClimaxGainVal)->GetInteger();
|
|
Info.nClimaxTryTick = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nClimaxTryTick)->GetInteger();
|
|
Info.nClimaxCompleteOccupationTick = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nClimaxCompleteOccupationTick)->GetInteger();
|
|
|
|
std::map <int, std::vector<TPositionAreaInfo>>::iterator ii = m_mBattleGroundPositionInfo.find(Info.nPvPModeID);
|
|
if(ii == m_mBattleGroundPositionInfo.end())
|
|
{
|
|
vArea.clear();
|
|
vArea.push_back(Info);
|
|
m_mBattleGroundPositionInfo.insert(std::make_pair(Info.nPvPModeID, vArea));
|
|
}
|
|
else
|
|
{
|
|
for(iArea = (*ii).second.begin(); iArea != (*ii).second.end(); iArea++)
|
|
{
|
|
if(Info.nAreaID == (*iArea).nAreaID)
|
|
{
|
|
_ASSERT_EXPR(0, L"捞亥飘康开ID 吝汗! 且寸登绢 乐绰 甘酒捞叼郴 捞亥飘康开ID绰 蜡聪农 秦具钦聪促!");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
(*ii).second.push_back(Info);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetBattleGroundResourceAreaInfo(int nMapID, int nPvPModeID, std::vector<TPositionAreaInfo> &vList)
|
|
{
|
|
std::map <int, std::vector<TPositionAreaInfo>>::iterator ii = m_mBattleGroundPositionInfo.find(nPvPModeID);
|
|
if(ii != m_mBattleGroundPositionInfo.end())
|
|
{
|
|
vList = (*ii).second;
|
|
return true;
|
|
}
|
|
|
|
//绝栏搁 甘酒捞叼肺档 茫酒夯促
|
|
bool bCheck = false;
|
|
for(ii = m_mBattleGroundPositionInfo.begin(); ii != m_mBattleGroundPositionInfo.end(); ii++)
|
|
{
|
|
std::vector<TPositionAreaInfo>::iterator ij;
|
|
for(ij = (*ii).second.begin(); ij != (*ii).second.end(); ij++)
|
|
{
|
|
if((*ij).nMapID == nMapID)
|
|
{
|
|
vList.push_back((*ij));
|
|
}
|
|
}
|
|
}
|
|
return bCheck;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadBattleGroundSkillSet()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pTreeSox;
|
|
if (m_bAllLoaded)
|
|
pTreeSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TBATTLEGROUNDSKILLTREE );
|
|
else
|
|
pTreeSox = GetDNTable( CDnTableDB::TBATTLEGROUNDSKILLTREE );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pTreeSox = GetDNTable( CDnTableDB::TBATTLEGROUNDSKILLTREE );
|
|
#endif //#ifdef _WORK
|
|
if( !pTreeSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"battlegroundskilltreetable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pTreeSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"battlegroundskilltreetable.dnt Count(%d)\r\n", pTreeSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//胶懦飘府抛捞喉阑 扁霖栏肺 痢飞傈俊 荤侩窍绰 胶懦府胶飘甫 掘绢滴磊
|
|
std::vector <int> vBGSkillList;
|
|
for (int i = 0; i < pTreeSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pTreeSox->GetItemID(i);
|
|
int nIdx = pTreeSox->GetIDXprimary(nItemID);
|
|
|
|
int nBGSkillID = pTreeSox->GetFieldFromLablePtr(nIdx, pTreeSox->GetFieldNum("_SkillTableID"))->GetInteger();
|
|
|
|
if(std::find(vBGSkillList.begin(), vBGSkillList.end(), nBGSkillID) == vBGSkillList.end())
|
|
{
|
|
if(nBGSkillID > 0)
|
|
vBGSkillList.push_back(nBGSkillID);
|
|
}
|
|
else
|
|
{
|
|
_ASSERT_EXPR(0, L"吝汗酒捞叼啊 乐澜");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSkillSox;
|
|
if (m_bAllLoaded)
|
|
pSkillSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TBATTLEGROUNDSKILL );
|
|
else
|
|
pSkillSox = GetDNTable( CDnTableDB::TBATTLEGROUNDSKILL );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSkillSox = GetDNTable( CDnTableDB::TBATTLEGROUNDSKILL );
|
|
#endif //#ifdef _WORK
|
|
if( !pSkillSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"battlegroundskilltable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSkillSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"battlegroundskilltable.dnt Count(%d)\r\n", pSkillSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_vBattleGroundSkill.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
////##################################################################
|
|
//// FieldNum 固府 祸牢
|
|
////##################################################################
|
|
|
|
struct TempSkillFieldNum
|
|
{
|
|
int nSkillMaxLevel;
|
|
int nSkillType; //CDnSkill::SkillTypeEnum //痢飞傈 胶懦篮 胶懦鸥涝俊 弊蹿 康氢阑 罐瘤 臼瘤父 眠啊犬厘矫 鞘夸且鳖 秦辑 佬绢狄
|
|
int nSkillDurationType; //CDnSkill::DurationTypeEnum
|
|
int nSkillTargetType; //CDnSkill::TargetTypeEnum
|
|
int nEffectType[PvPCommon::Common::MaximumEffectCount];
|
|
int nEffectApplyType[PvPCommon::Common::MaximumEffectCount];
|
|
int nProcess;
|
|
int nCanDuplicate;
|
|
};
|
|
|
|
TempSkillFieldNum sSkillFieldNum;
|
|
sSkillFieldNum.nSkillMaxLevel = pSkillSox->GetFieldNum( "_MaxLevel" );
|
|
sSkillFieldNum.nSkillType = pSkillSox->GetFieldNum( "_SkillType" );
|
|
sSkillFieldNum.nSkillDurationType = pSkillSox->GetFieldNum( "_DurationType" );
|
|
sSkillFieldNum.nSkillTargetType = pSkillSox->GetFieldNum( "_TargetType" );
|
|
|
|
char szTemp[MAX_PATH];
|
|
for (int i = 0; i < PvPCommon::Common::MaximumEffectCount; i++)
|
|
{
|
|
memset(&szTemp, 0, sizeof(szTemp));
|
|
sprintf_s( szTemp, "_EffectClass%d", i+1 );
|
|
sSkillFieldNum.nEffectType[i] = pSkillSox->GetFieldNum(szTemp);
|
|
|
|
memset(&szTemp, 0, sizeof(szTemp));
|
|
sprintf_s( szTemp, "_EffectClass%dApplyType", i+1 );
|
|
sSkillFieldNum.nEffectApplyType[i] = pSkillSox->GetFieldNum(szTemp);
|
|
}
|
|
|
|
sSkillFieldNum.nCanDuplicate = pSkillSox->GetFieldNum( "_SkillDuplicate" );
|
|
sSkillFieldNum.nProcess = pSkillSox->GetFieldNum( "_Processor1" );
|
|
|
|
////##################################################################
|
|
//// Load
|
|
////##################################################################
|
|
|
|
for (int i = 0; i < pSkillSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSkillSox->GetItemID(i);
|
|
int nIdx = pSkillSox->GetIDXprimary(nItemID);
|
|
|
|
TBattleGroundSkillInfo SkillInfo;
|
|
memset(&SkillInfo, 0, sizeof(TBattleGroundSkillInfo));
|
|
|
|
SkillInfo.nSkillID = nItemID;
|
|
SkillInfo.nSkillMaxLevel = pSkillSox->GetFieldFromLablePtr(nIdx, sSkillFieldNum.nSkillMaxLevel)->GetInteger();
|
|
SkillInfo.nSkillType = pSkillSox->GetFieldFromLablePtr(nIdx, sSkillFieldNum.nSkillType)->GetInteger();
|
|
SkillInfo.nSkillDurationType = pSkillSox->GetFieldFromLablePtr(nIdx, sSkillFieldNum.nSkillDurationType)->GetInteger();
|
|
SkillInfo.nSkillTargetType = pSkillSox->GetFieldFromLablePtr(nIdx, sSkillFieldNum.nSkillTargetType)->GetInteger();
|
|
|
|
for (int j = 0; j < PvPCommon::Common::MaximumEffectCount; j++)
|
|
{
|
|
SkillInfo.nEffectType[j] = pSkillSox->GetFieldFromLablePtr(nIdx, sSkillFieldNum.nEffectType[j])->GetInteger();
|
|
SkillInfo.nEffectApplyType[j] = pSkillSox->GetFieldFromLablePtr(nIdx, sSkillFieldNum.nEffectApplyType[j])->GetInteger();
|
|
}
|
|
|
|
SkillInfo.nCanDuplicate = pSkillSox->GetFieldFromLablePtr(nIdx, sSkillFieldNum.nCanDuplicate)->GetInteger();
|
|
SkillInfo.nProcess = pSkillSox->GetFieldFromLablePtr(nIdx, sSkillFieldNum.nProcess)->GetInteger();
|
|
|
|
for(std::vector <TBattleGroundSkillInfo>::iterator ii = m_vBattleGroundSkill.begin(); ii != m_vBattleGroundSkill.end(); ii++)
|
|
{
|
|
if(SkillInfo.nSkillID == (*ii).nSkillID)
|
|
{
|
|
_ASSERT_EXPR(0, L"battlegroundskilltable.dnt 吝汗酒捞叼!");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
std::vector <int>::iterator iverify = std::find(vBGSkillList.begin(), vBGSkillList.end(), SkillInfo.nSkillID);
|
|
if(iverify != vBGSkillList.end())
|
|
m_vBattleGroundSkill.push_back(SkillInfo);
|
|
}
|
|
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSkillLevelSox;
|
|
if (m_bAllLoaded)
|
|
pSkillLevelSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TBATTLEGROUNDSKILLLEVEL );
|
|
else
|
|
pSkillLevelSox = GetDNTable( CDnTableDB::TBATTLEGROUNDSKILLLEVEL );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSkillLevelSox = GetDNTable( CDnTableDB::TBATTLEGROUNDSKILLLEVEL );
|
|
#endif //#ifdef _WORK
|
|
if( !pSkillLevelSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"battlegroundskillleveltable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSkillLevelSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"battlegroundskillleveltable.dnt Count(%d)\r\n", pSkillLevelSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_vBattleGroundSkillLevel.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
////##################################################################
|
|
//// FieldNum 固府 祸牢
|
|
////##################################################################
|
|
|
|
struct TempSkillLevelField
|
|
{
|
|
int nSkillID;
|
|
int nSkillLevel;
|
|
int nNeedSkillPoint; //裙垫矫鞘夸器牢飘
|
|
int nUseResPoint; //胶懦荤侩矫 家葛 痢飞傈 器牢飘
|
|
int nEffectValue[PvPCommon::Common::MaximumEffectCount];
|
|
int nEffectValueDuration[PvPCommon::Common::MaximumEffectCount];
|
|
//int nMonsterID;
|
|
//int nSummonPos;
|
|
int nActionName;
|
|
int nCoolTime;
|
|
};
|
|
|
|
TempSkillLevelField sSkillLevelFieldNum;
|
|
sSkillLevelFieldNum.nSkillID = pSkillLevelSox->GetFieldNum( "_SkillIndex" );
|
|
sSkillLevelFieldNum.nSkillLevel = pSkillLevelSox->GetFieldNum( "_SkillLevel" );
|
|
sSkillLevelFieldNum.nUseResPoint = pSkillLevelSox->GetFieldNum( "_DecreaseTIC" );
|
|
sSkillLevelFieldNum.nNeedSkillPoint = pSkillLevelSox->GetFieldNum( "_NeedSkillPoint" );
|
|
|
|
for (int i = 0; i < PvPCommon::Common::MaximumEffectCount; i++)
|
|
{
|
|
memset(&szTemp, 0, sizeof(szTemp));
|
|
sprintf_s( szTemp, "_EffectClassValue%d", i+1 );
|
|
sSkillLevelFieldNum.nEffectValue[i] = pSkillLevelSox->GetFieldNum(szTemp);
|
|
|
|
memset(&szTemp, 0, sizeof(szTemp));
|
|
sprintf_s( szTemp, "_EffectClassValue%dDuration", i+1 );
|
|
sSkillLevelFieldNum.nEffectValueDuration[i] = pSkillLevelSox->GetFieldNum(szTemp);
|
|
}
|
|
|
|
//sSkillLevelFieldNum.nMonsterID = pSkillLevelSox->GetFieldNum( "_SummonMonsterID" );
|
|
//sSkillLevelFieldNum.nSummonPos = pSkillLevelSox->GetFieldNum( "_SummonMonsterPosition" );
|
|
sSkillLevelFieldNum.nCoolTime = pSkillLevelSox->GetFieldNum( "_DelayTime" );
|
|
sSkillLevelFieldNum.nActionName = pSkillLevelSox->GetFieldNum( "_ProcessParam1" );
|
|
|
|
////##################################################################
|
|
//// Load
|
|
////##################################################################
|
|
|
|
for (int i = 0; i < pSkillLevelSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSkillLevelSox->GetItemID(i);
|
|
int nIdx = pSkillLevelSox->GetIDXprimary(nItemID);
|
|
|
|
TBattleGroundEffectValue SkillLevel;
|
|
SkillLevel.Reset();
|
|
|
|
SkillLevel.nSkillID = pSkillLevelSox->GetFieldFromLablePtr(nIdx, sSkillLevelFieldNum.nSkillID)->GetInteger();
|
|
SkillLevel.nSkillLevel = pSkillLevelSox->GetFieldFromLablePtr(nIdx, sSkillLevelFieldNum.nSkillLevel)->GetInteger();
|
|
SkillLevel.nUseResPoint = pSkillLevelSox->GetFieldFromLablePtr(nIdx, sSkillLevelFieldNum.nUseResPoint)->GetInteger();
|
|
SkillLevel.nNeedSkillPoint = pSkillLevelSox->GetFieldFromLablePtr(nIdx, sSkillLevelFieldNum.nNeedSkillPoint)->GetInteger();
|
|
|
|
for (int j = 0; j < PvPCommon::Common::MaximumEffectCount; j++)
|
|
{
|
|
SkillLevel.strEffectValue[j] = pSkillLevelSox->GetFieldFromLablePtr(nIdx, sSkillLevelFieldNum.nEffectValue[j])->GetString();
|
|
SkillLevel.nEffectValueDuration[j] = pSkillLevelSox->GetFieldFromLablePtr(nIdx, sSkillLevelFieldNum.nEffectValueDuration[j])->GetInteger();
|
|
}
|
|
|
|
//SkillLevel.nMonsterID = pSkillLevelSox->GetFieldFromLablePtr(nIdx, sSkillLevelFieldNum.nMonsterID)->GetInteger();
|
|
//SkillLevel.nSummonDist = pSkillLevelSox->GetFieldFromLablePtr(nIdx, sSkillLevelFieldNum.nSummonPos)->GetInteger();
|
|
SkillLevel.nCoolTime = pSkillLevelSox->GetFieldFromLablePtr(nIdx, sSkillLevelFieldNum.nCoolTime)->GetInteger();
|
|
SkillLevel.strActionName = pSkillLevelSox->GetFieldFromLablePtr(nIdx, sSkillLevelFieldNum.nActionName)->GetString();
|
|
|
|
for(std::vector <TBattleGroundEffectValue>::iterator ii = m_vBattleGroundSkillLevel.begin(); ii != m_vBattleGroundSkillLevel.end(); ii++)
|
|
{
|
|
if(SkillLevel.nSkillID == (*ii).nSkillID && SkillLevel.nSkillLevel == (*ii).nSkillLevel)
|
|
{
|
|
_ASSERT_EXPR(0, L"battlegroundskilltable.dnt 酒捞叼客 饭骇 吝汗!!");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
std::vector <int>::iterator iverify = std::find(vBGSkillList.begin(), vBGSkillList.end(), SkillLevel.nSkillID);
|
|
if(iverify != vBGSkillList.end())
|
|
m_vBattleGroundSkillLevel.push_back(SkillLevel);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TBattleGroundSkillInfo * CDNGameDataManager::GetBattleGroundSkill(int nSkillID)
|
|
{
|
|
if(nSkillID <= 0)
|
|
return NULL;
|
|
|
|
for(std::vector <TBattleGroundSkillInfo>::iterator ii = m_vBattleGroundSkill.begin(); ii != m_vBattleGroundSkill.end(); ii++)
|
|
{
|
|
if((*ii).nSkillID == nSkillID)
|
|
return &(*ii);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
TBattleGroundEffectValue * CDNGameDataManager::GetBattleGroundSkillLevel(int nSkillID, int nLevel)
|
|
{
|
|
if(nSkillID <= 0 || nLevel <= 0)
|
|
return NULL;
|
|
|
|
for(std::vector <TBattleGroundEffectValue>::iterator ii = m_vBattleGroundSkillLevel.begin(); ii != m_vBattleGroundSkillLevel.end(); ii ++)
|
|
{
|
|
if((*ii).nSkillID == nSkillID && (*ii).nSkillLevel == nLevel)
|
|
return &(*ii);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// PvPGameStartConditionTable(PvPGameStartConditiontable.dnt - TPvPGameStartConditionTable)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadPvPGameStartConditionTable()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPVPGAMESTARTCONDITION );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TPVPGAMESTARTCONDITION );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPVPGAMESTARTCONDITION );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPGameStartConditionTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPGameStartConditionTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TPvPGameStartConditionData, m_PvPGameStartConditionTable );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int PlayerNumber;
|
|
int Min_TeamPlayerNum_Needed;
|
|
int Max_TeamPlayerNum_Difference;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.PlayerNumber = pSox->GetFieldNum( "PlayerNumber" );
|
|
sFieldNum.Min_TeamPlayerNum_Needed = pSox->GetFieldNum( "Min_TeamPlayerNum_Needed" );
|
|
sFieldNum.Max_TeamPlayerNum_Difference = pSox->GetFieldNum( "Max_TeamPlayerNum_Difference" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
int iMaxPlayerNum = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PlayerNumber )->GetInteger();
|
|
if( iMaxPlayerNum <= 0 )
|
|
continue;
|
|
|
|
_ASSERT( iMaxPlayerNum <= PvPCommon::Common::MaxPlayer );
|
|
|
|
TPvPGameStartConditionTable* pPvPGameStartConditionTable = new TPvPGameStartConditionTable;
|
|
|
|
pPvPGameStartConditionTable->uiMinTeamPlayerNum = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Min_TeamPlayerNum_Needed )->GetInteger();
|
|
pPvPGameStartConditionTable->uiMaxTeamPlayerDiff = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Max_TeamPlayerNum_Difference )->GetInteger();
|
|
|
|
std::pair<TPvPGameStartConditionData::iterator,bool> Ret = m_PvPGameStartConditionTable.insert( make_pair( iMaxPlayerNum, pPvPGameStartConditionTable ) );
|
|
if( Ret.second == false )
|
|
delete pPvPGameStartConditionTable;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
const TPvPGameStartConditionTable* CDNGameDataManager::GetPvPGameStartConditionTable( const UINT uiMaxUser )
|
|
{
|
|
TPvPGameStartConditionData::iterator itor = m_PvPGameStartConditionTable.find( uiMaxUser );
|
|
if( itor != m_PvPGameStartConditionTable.end() )
|
|
return itor->second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// PvPRankTable(PvPRankTable.dnt - TPvPRankTable)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadPvPRankTable()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPVPRANK );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TPVPRANK );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPVPRANK );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPRankTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPRankTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TPvPRankTableData, m_PvPRankTable );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int PvPRank;
|
|
int PvPRankEXP;
|
|
#ifdef PRE_MOD_PVPRANK
|
|
int PvPRankType;
|
|
int PvPRankValue;
|
|
#endif //#ifdef PRE_MOD_PVPRANK
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.PvPRank = pSox->GetFieldNum( "PvPRank" );
|
|
sFieldNum.PvPRankEXP = pSox->GetFieldNum( "PvPRankEXP" );
|
|
#ifdef PRE_MOD_PVPRANK
|
|
sFieldNum.PvPRankType = pSox->GetFieldNum( "RankType" );
|
|
sFieldNum.PvPRankValue = pSox->GetFieldNum( "PVPRankValue" );
|
|
|
|
std::string strRankVal;
|
|
std::vector<std::string> tokens;
|
|
#endif //#ifdef PRE_MOD_PVPRANK
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
int iPvPRank = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PvPRank )->GetInteger();
|
|
|
|
if( iPvPRank <= 0 || nItemID != iPvPRank )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPRankTable.dnt nItemID(%d) iPvPRand(%d)\r\n", nItemID, iPvPRank );
|
|
return false;
|
|
}
|
|
|
|
_ASSERT( iPvPRank <= PvPCommon::Common::MaxRank );
|
|
|
|
TPvPRankTable* pPvPRankTable = new TPvPRankTable;
|
|
|
|
pPvPRankTable->uiXP = static_cast<UINT>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PvPRankEXP )->GetInteger());
|
|
#ifdef PRE_MOD_PVPRANK
|
|
if (pPvPRankTable->uiXP > 0 && pPvPRankTable->uiXP > m_nThresholdPvPExpValue)
|
|
m_nThresholdPvPExpValue = pPvPRankTable->uiXP;
|
|
|
|
pPvPRankTable->cType = static_cast<UINT>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PvPRankType )->GetInteger());
|
|
if (pPvPRankTable->cType != PvPCommon::RankTable::ExpValue)
|
|
{
|
|
tokens.clear();
|
|
strRankVal = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PvPRankValue )->GetString();
|
|
TokenizeA(strRankVal, tokens, ";");
|
|
if (tokens.size() != 2)
|
|
{
|
|
_ASSERT_EXPR(0, L"PvPRankTable Error");
|
|
return false;
|
|
}
|
|
|
|
pPvPRankTable->cMinRange = atoi(tokens[0].c_str());
|
|
pPvPRankTable->cMaxRange = atoi(tokens[1].c_str());
|
|
}
|
|
#endif //#ifdef PRE_MOD_PVPRANK
|
|
|
|
std::pair<TPvPRankTableData::iterator,bool> Ret = m_PvPRankTable.insert( make_pair( iPvPRank, pPvPRankTable) );
|
|
if( Ret.second == false )
|
|
delete pPvPRankTable;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
const TPvPRankTable* CDNGameDataManager::GetPvPRankTable( const UINT uiLevel )
|
|
{
|
|
TPvPRankTableData::iterator itor = m_PvPRankTable.find( uiLevel );
|
|
if( itor != m_PvPRankTable.end() )
|
|
return itor->second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadEnchantData()
|
|
{
|
|
#ifdef _WORK
|
|
// 牢镁飘 抛捞喉 佬扁
|
|
DNTableFileFormat *pEnchantTable;
|
|
#ifdef PRE_FIX_MEMOPT_ENCHANT
|
|
CDnTableDB::TableEnum eTableEnum = CDnTableDB::TENCHANT_MAIN;
|
|
#else //#ifdef PRE_FIX_MEMOPT_ENCHANT
|
|
CDnTableDB::TableEnum eTableEnum = CDnTableDB::TENCHANT;
|
|
#endif //#ifdef PRE_FIX_MEMOPT_ENCHANT
|
|
if (m_bAllLoaded)
|
|
pEnchantTable = CDnTableDB::GetInstance().ReLoadSox( eTableEnum );
|
|
else
|
|
pEnchantTable = GetDNTable( eTableEnum );
|
|
|
|
#else //#ifdef _WORK
|
|
// 牢镁飘 抛捞喉 佬扁
|
|
#ifdef PRE_FIX_MEMOPT_ENCHANT
|
|
DNTableFileFormat *pEnchantTable = GetDNTable( CDnTableDB::TENCHANT_MAIN );
|
|
if( !pEnchantTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"enchantmaintable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
#else //#ifdef PRE_FIX_MEMOPT_ENCHANT
|
|
DNTableFileFormat *pEnchantTable = GetDNTable( CDnTableDB::TENCHANT );
|
|
if( !pEnchantTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"EnchantTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
#endif //#ifdef PRE_FIX_MEMOPT_ENCHANT
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
if( pEnchantTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log(LogType::_FILELOG, L"EnchantTable.dnt Count(%d)\r\n", pEnchantTable->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAPF( TMapEnchantData, m_pEnchantTable, SAFE_DELETE_PMAP( TMapEnchantLevelData, TMapEnchantData_iter->second->pMapLevelData ) );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
#ifdef PRE_FIX_MEMOPT_ENCHANT
|
|
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pEnchantNeedItemTable = NULL;
|
|
if (m_bAllLoaded)
|
|
pEnchantNeedItemTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TENCHANT_NEEDITEM );
|
|
else
|
|
pEnchantNeedItemTable = GetDNTable( CDnTableDB::TENCHANT_NEEDITEM );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pEnchantNeedItemTable = GetDNTable( CDnTableDB::TENCHANT_NEEDITEM );
|
|
#endif //#ifdef _WORK
|
|
|
|
if (!pEnchantNeedItemTable)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"enchantneeditemtable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
LoadEnchantMainTable(*pEnchantTable);
|
|
LoadEnchantNeedItemTable(*pEnchantNeedItemTable);
|
|
#else // PRE_FIX_MEMOPT_ENCHANT
|
|
char szTemp[MAX_PATH];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _EnchantID;
|
|
int _EnchantLevel;
|
|
int _EnchantRatio;
|
|
std::vector<int> _NeedItem;
|
|
std::vector<int> _NeedItemCount;
|
|
int _NeedCoin;
|
|
int _FailResultDropItemTableID;
|
|
int _PotentialID;
|
|
int _PotentialRatio;
|
|
int _BreakRatio;
|
|
int _MinDown;
|
|
int _MaxDown;
|
|
int _ProtectItemCount;
|
|
#if defined(PRE_ADD_ENCHANTSHIELD_CASHITEM)
|
|
int _ShieldItemCount; // 惑困 碍拳焊龋俩府
|
|
#endif
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._EnchantID = pEnchantTable->GetFieldNum( "_EnchantID" );
|
|
sFieldNum._EnchantLevel = pEnchantTable->GetFieldNum( "_EnchantLevel" );
|
|
sFieldNum._EnchantRatio = pEnchantTable->GetFieldNum( "_EnchantRatio" );
|
|
sFieldNum._NeedCoin = pEnchantTable->GetFieldNum( "_NeedCoin" );
|
|
sFieldNum._FailResultDropItemTableID = pEnchantTable->GetFieldNum( "_FailResultDropItemTableID" );
|
|
sFieldNum._PotentialID = pEnchantTable->GetFieldNum( "_PotentialID" );
|
|
sFieldNum._PotentialRatio = pEnchantTable->GetFieldNum( "_PotentialRatio" );
|
|
sFieldNum._BreakRatio = pEnchantTable->GetFieldNum( "_BreakRatio" );
|
|
sFieldNum._MinDown = pEnchantTable->GetFieldNum( "_MinDown" );
|
|
sFieldNum._MaxDown = pEnchantTable->GetFieldNum( "_MaxDown" );
|
|
sFieldNum._ProtectItemCount = pEnchantTable->GetFieldNum( "_ProtectItemCount" );
|
|
#if defined(PRE_ADD_ENCHANTSHIELD_CASHITEM)
|
|
sFieldNum._ShieldItemCount = pEnchantTable->GetFieldNum( "_ShieldItemCount" );
|
|
#endif
|
|
|
|
sFieldNum._NeedItem.reserve(ENCHANTITEMMAX);
|
|
sFieldNum._NeedItemCount.reserve(ENCHANTITEMMAX);
|
|
for( int j=0; j<ENCHANTITEMMAX; j++ )
|
|
{
|
|
sprintf_s( szTemp, "_NeedItemID%d", j + 1 );
|
|
sFieldNum._NeedItem.push_back( pEnchantTable->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_NeedItemCount%d", j + 1 );
|
|
sFieldNum._NeedItemCount.push_back( pEnchantTable->GetFieldNum(szTemp) );
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pEnchantTable->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pEnchantTable->GetItemID(i);
|
|
|
|
int iIdx = pEnchantTable->GetIDXprimary( nItemID );
|
|
|
|
int nEnchantID = pEnchantTable->GetFieldFromLablePtr( iIdx, sFieldNum._EnchantID )->GetInteger();
|
|
if( nEnchantID < 1 )
|
|
continue;
|
|
char cLevel = (char)pEnchantTable->GetFieldFromLablePtr( iIdx, sFieldNum._EnchantLevel )->GetInteger();
|
|
if( cLevel < 1 )
|
|
continue;
|
|
|
|
TEnchantData *pData = NULL;
|
|
TMapEnchantData::iterator it = m_pEnchantTable.find(nEnchantID);
|
|
if( it != m_pEnchantTable.end() )
|
|
{
|
|
pData = it->second;
|
|
if( pData->pMapLevelData.find(cLevel) != pData->pMapLevelData.end() )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"EnchantTable.dnt 鞍篮 饭骇狼 牢镁飘 惯斑. 第俊巴 公矫邓聪促.( EnchantID : %d, TableID : %d, Level : %d\r\n", nEnchantID, nItemID, cLevel );
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pData = new TEnchantData;
|
|
pData->nEnchantID = nEnchantID;
|
|
pData->cCount = 0;
|
|
m_pEnchantTable.insert( make_pair( nEnchantID, pData ) );
|
|
}
|
|
|
|
TEnchantLevelData *pLevelData = new TEnchantLevelData;
|
|
pLevelData->nItemID = nItemID;
|
|
pLevelData->cLevel = cLevel;
|
|
_fpreset();
|
|
pLevelData->cEnchantProb = (char)(( pEnchantTable->GetFieldFromLablePtr( iIdx, sFieldNum._EnchantRatio )->GetFloat() + 0.0001f ) * 100.f );
|
|
for( int j=0; j<ENCHANTITEMMAX; j++ )
|
|
{
|
|
pLevelData->nNeedItemID[j] = pEnchantTable->GetFieldFromLablePtr( iIdx, sFieldNum._NeedItem[j] )->GetInteger();
|
|
pLevelData->nNeedItemCount[j] = pEnchantTable->GetFieldFromLablePtr( iIdx, sFieldNum._NeedItemCount[j] )->GetInteger();
|
|
}
|
|
pLevelData->nNeedCoin = pEnchantTable->GetFieldFromLablePtr( iIdx, sFieldNum._NeedCoin )->GetInteger();
|
|
pLevelData->nFailResultItemID = pEnchantTable->GetFieldFromLablePtr( iIdx, sFieldNum._FailResultDropItemTableID )->GetInteger();
|
|
if(pLevelData->nFailResultItemID > 0)
|
|
{
|
|
pLevelData->nFailResultItemID = 0;
|
|
//hgoori
|
|
//泅犁 抛胶飘侩 牢忙飘 1锅捞 捞 蔼阑 荤侩窍绊 乐瘤父, 霸烙俊辑绰 静捞瘤 臼嚼聪促.
|
|
//阂鞘夸茄 肺弊甫 嘛绊 乐扁俊 鞘夸俊 蝶扼 捞 饶俊 肺弊甫 眠啊窍档废 窍摆嚼聪促.
|
|
//g_Log.Log(LogType::_FILELOG, L"Not available enchant fail result item.( EnchantID : %d, TableID : %d, Level : %d\r\n", nEnchantID, nItemID, cLevel );
|
|
}
|
|
pLevelData->nPotentialID = pEnchantTable->GetFieldFromLablePtr( iIdx, sFieldNum._PotentialID )->GetInteger();
|
|
_fpreset();
|
|
pLevelData->cPotentialProb = (char)(( pEnchantTable->GetFieldFromLablePtr( iIdx, sFieldNum._PotentialRatio )->GetFloat() + 0.0001f ) * 100.f );
|
|
_fpreset();
|
|
pLevelData->cBreakRatio = (char)(( pEnchantTable->GetFieldFromLablePtr( iIdx, sFieldNum._BreakRatio )->GetFloat() + 0.0001f ) * 100.f );
|
|
pLevelData->cMinDownLevel = (char)pEnchantTable->GetFieldFromLablePtr( iIdx, sFieldNum._MinDown )->GetInteger();
|
|
pLevelData->cMaxDownLevel = (char)pEnchantTable->GetFieldFromLablePtr( iIdx, sFieldNum._MaxDown )->GetInteger();
|
|
pLevelData->nProtectItemCount = pEnchantTable->GetFieldFromLablePtr( iIdx, sFieldNum._ProtectItemCount )->GetInteger();
|
|
#if defined(PRE_ADD_ENCHANTSHIELD_CASHITEM)
|
|
pLevelData->nShieldItemCount = pEnchantTable->GetFieldFromLablePtr( iIdx, sFieldNum._ShieldItemCount )->GetInteger();
|
|
#endif
|
|
|
|
pData->pMapLevelData.insert( make_pair( cLevel, pLevelData ) );
|
|
pData->cCount++;
|
|
}
|
|
#endif // PRE_FIX_MEMOPT_ENCHANT
|
|
|
|
return true;
|
|
}
|
|
|
|
#ifdef PRE_FIX_MEMOPT_ENCHANT
|
|
bool CDNGameDataManager::LoadEnchantMainTable(const DNTableFileFormat& mainTable)
|
|
{
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _EnchantID;
|
|
int _EnchantLevel;
|
|
int _NeedItemTableID;
|
|
int _StateTableID;
|
|
int _NeedCoin;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._EnchantID = mainTable.GetFieldNum( "_EnchantID" );
|
|
sFieldNum._EnchantLevel = mainTable.GetFieldNum( "_EnchantLevel" );
|
|
sFieldNum._NeedItemTableID = mainTable.GetFieldNum( "_NeedItemTableID" );
|
|
sFieldNum._StateTableID = mainTable.GetFieldNum( "_StateID" );
|
|
sFieldNum._NeedCoin = mainTable.GetFieldNum( "_NeedCoin" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
int i = 0;
|
|
for (; i < mainTable.GetItemCount(); i++ )
|
|
{
|
|
int nItemID = mainTable.GetItemID(i);
|
|
|
|
int iIdx = mainTable.GetIDXprimary( nItemID );
|
|
|
|
int nEnchantID = mainTable.GetFieldFromLablePtr(iIdx, sFieldNum._EnchantID)->GetInteger();
|
|
if (nEnchantID < 1)
|
|
continue;
|
|
char cLevel = (char)mainTable.GetFieldFromLablePtr(iIdx, sFieldNum._EnchantLevel)->GetInteger();
|
|
if (cLevel < 1)
|
|
continue;
|
|
|
|
TEnchantData *pData = NULL;
|
|
TMapEnchantData::iterator it = m_pEnchantTable.find(nEnchantID);
|
|
if (it != m_pEnchantTable.end())
|
|
{
|
|
pData = it->second;
|
|
if (pData->pMapLevelData.find(cLevel) != pData->pMapLevelData.end())
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"EnchantTable.dnt 鞍篮 饭骇狼 牢镁飘 惯斑. 第俊巴 公矫邓聪促.( EnchantID : %d, TableID : %d, Level : %d\r\n", nEnchantID, nItemID, cLevel);
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pData = new TEnchantData;
|
|
pData->nEnchantID = nEnchantID;
|
|
pData->cCount = 0;
|
|
m_pEnchantTable.insert(make_pair(nEnchantID, pData));
|
|
}
|
|
|
|
TEnchantLevelData *pLevelData = new TEnchantLevelData;
|
|
pLevelData->nItemID = nItemID;
|
|
pLevelData->cLevel = cLevel;
|
|
pLevelData->nNeedItemTableID = mainTable.GetFieldFromLablePtr(iIdx, sFieldNum._NeedItemTableID)->GetInteger();
|
|
pLevelData->nStateTableID = mainTable.GetFieldFromLablePtr(iIdx, sFieldNum._StateTableID)->GetInteger();
|
|
pLevelData->nNeedCoin = mainTable.GetFieldFromLablePtr(iIdx, sFieldNum._NeedCoin)->GetInteger();
|
|
|
|
pData->pMapLevelData.insert(make_pair(cLevel, pLevelData));
|
|
pData->cCount++;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadEnchantNeedItemTable(const DNTableFileFormat& needItemTable)
|
|
{
|
|
m_EnchantNeedItemTable.clear();
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
struct TempFieldNum
|
|
{
|
|
int _EnchantRatio;
|
|
int _BreakRatio;
|
|
int _MinDown;
|
|
int _MaxDown;
|
|
std::vector<int> _NeedItem;
|
|
std::vector<int> _NeedItemCount;
|
|
int _UpStateRatio;
|
|
int _FailResultDropItemTableID;
|
|
int _ProtectItemCount;
|
|
#if defined(PRE_ADD_ENCHANTSHIELD_CASHITEM)
|
|
int _ShieldItemCount; // 惑困 碍拳焊龋俩府
|
|
#endif
|
|
};
|
|
|
|
char szTemp[MAX_PATH];
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._EnchantRatio = needItemTable.GetFieldNum("_EnchantRatio");
|
|
sFieldNum._BreakRatio = needItemTable.GetFieldNum("_EnchantLevel");
|
|
sFieldNum._MinDown = needItemTable.GetFieldNum("_MinDown");
|
|
sFieldNum._MaxDown = needItemTable.GetFieldNum("_MaxDown");
|
|
sFieldNum._NeedItem.reserve(ENCHANTITEMMAX);
|
|
sFieldNum._NeedItemCount.reserve(ENCHANTITEMMAX);
|
|
for (int j = 0; j < ENCHANTITEMMAX; j++)
|
|
{
|
|
sprintf_s(szTemp, "_NeedItemID%d", j + 1);
|
|
sFieldNum._NeedItem.push_back(needItemTable.GetFieldNum(szTemp));
|
|
sprintf_s(szTemp, "_NeedItemCount%d", j + 1);
|
|
sFieldNum._NeedItemCount.push_back(needItemTable.GetFieldNum(szTemp));
|
|
}
|
|
sFieldNum._UpStateRatio = needItemTable.GetFieldNum("_UpStateRatio");
|
|
sFieldNum._FailResultDropItemTableID = needItemTable.GetFieldNum("_FailResultDropItemTableID");
|
|
sFieldNum._ProtectItemCount = needItemTable.GetFieldNum("_ProtectItemCount");
|
|
#if defined(PRE_ADD_ENCHANTSHIELD_CASHITEM)
|
|
sFieldNum._ShieldItemCount = needItemTable.GetFieldNum("_ShieldItemCount"); // 惑困 碍拳焊龋俩府
|
|
#endif
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
int i = 0;
|
|
for (; i < needItemTable.GetItemCount(); i++ )
|
|
{
|
|
TEnchantNeedItemData curData;
|
|
int nItemID = needItemTable.GetItemID(i);
|
|
int iIdx = needItemTable.GetIDXprimary(nItemID);
|
|
|
|
_fpreset();
|
|
curData.cEnchantProb = (char)((needItemTable.GetFieldFromLablePtr(iIdx, sFieldNum._EnchantRatio)->GetFloat() + 0.0001f) * 100.f);
|
|
_fpreset();
|
|
curData.cBreakRatio = (char)((needItemTable.GetFieldFromLablePtr(iIdx, sFieldNum._BreakRatio)->GetFloat() + 0.0001f) * 100.f);
|
|
|
|
curData.cMinDownLevel = needItemTable.GetFieldFromLablePtr(iIdx, sFieldNum._MinDown)->GetInteger();
|
|
curData.cMaxDownLevel = needItemTable.GetFieldFromLablePtr(iIdx, sFieldNum._MaxDown)->GetInteger();
|
|
|
|
int j = 0;
|
|
for (; j < ENCHANTITEMMAX; j++)
|
|
{
|
|
curData.nNeedItemID[j] = needItemTable.GetFieldFromLablePtr(iIdx, sFieldNum._NeedItem[j])->GetInteger();
|
|
curData.nNeedItemCount[j] = needItemTable.GetFieldFromLablePtr(iIdx, sFieldNum._NeedItemCount[j])->GetInteger();
|
|
}
|
|
|
|
curData.fUpStateRatio = needItemTable.GetFieldFromLablePtr(iIdx, sFieldNum._UpStateRatio)->GetFloat();
|
|
curData.nFailResultItemID = needItemTable.GetFieldFromLablePtr(iIdx, sFieldNum._FailResultDropItemTableID)->GetInteger();
|
|
if (curData.nFailResultItemID > 0)
|
|
{
|
|
curData.nFailResultItemID = 0;
|
|
//hgoori
|
|
//泅犁 抛胶飘侩 牢忙飘 1锅捞 捞 蔼阑 荤侩窍绊 乐瘤父, 霸烙俊辑绰 静捞瘤 臼嚼聪促.
|
|
//阂鞘夸茄 肺弊甫 嘛绊 乐扁俊 鞘夸俊 蝶扼 捞 饶俊 肺弊甫 眠啊窍档废 窍摆嚼聪促.
|
|
//g_Log.Log(LogType::_FILELOG, L"Not available enchant fail result item.( EnchantID : %d, TableID : %d, Level : %d\r\n", nEnchantID, nItemID, cLevel );
|
|
}
|
|
|
|
curData.nProtectItemCount = needItemTable.GetFieldFromLablePtr(iIdx, sFieldNum._ProtectItemCount)->GetInteger();
|
|
#if defined(PRE_ADD_ENCHANTSHIELD_CASHITEM)
|
|
curData.nShieldItemCount = needItemTable.GetFieldFromLablePtr(iIdx, sFieldNum._ShieldItemCount)->GetInteger();
|
|
#endif
|
|
|
|
m_EnchantNeedItemTable.insert(std::make_pair(nItemID, curData));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
#endif // PRE_FIX_MEMOPT_ENCHANT
|
|
|
|
bool CDNGameDataManager::LoadPotentialData()
|
|
{
|
|
#ifdef _WORK
|
|
// 器刨既 抛捞喉 佬扁
|
|
DNTableFileFormat *pPotentialTable;
|
|
if (m_bAllLoaded)
|
|
pPotentialTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPOTENTIAL );
|
|
else
|
|
pPotentialTable = GetDNTable( CDnTableDB::TPOTENTIAL );
|
|
#else //#ifdef _WORK
|
|
// 器刨既 抛捞喉 佬扁
|
|
DNTableFileFormat *pPotentialTable = GetDNTable( CDnTableDB::TPOTENTIAL );
|
|
#endif //#ifdef _WORK
|
|
if( !pPotentialTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"PotentialTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pPotentialTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log(LogType::_FILELOG, L"PotentialTable.dnt Count(%d)\r\n", pPotentialTable->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAPF( TMapPotentialData, m_pPotentialTable, SAFE_DELETE_PVEC( TMapPotentialData_iter->second->pVecItemData ) );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _PotentialID;
|
|
int _PotentialRatio;
|
|
int _PotentialNo;
|
|
|
|
int _PotentialSkillID;
|
|
int _PotentialSkillLevel;
|
|
int _PotentialSkillUsingType;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._PotentialID = pPotentialTable->GetFieldNum( "_PotentialID" );
|
|
sFieldNum._PotentialRatio = pPotentialTable->GetFieldNum( "_PotentialRatio" );
|
|
sFieldNum._PotentialNo = pPotentialTable->GetFieldNum( "_PotentialNo" );
|
|
|
|
sFieldNum._PotentialSkillID = pPotentialTable->GetFieldNum( "_SkillID" );
|
|
sFieldNum._PotentialSkillLevel = pPotentialTable->GetFieldNum( "_SkillLevel" );
|
|
sFieldNum._PotentialSkillUsingType = pPotentialTable->GetFieldNum( "_SkillUsingType" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pPotentialTable->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pPotentialTable->GetItemID(i);
|
|
|
|
int iIdx = pPotentialTable->GetIDXprimary( nItemID );
|
|
|
|
int nPotentialID = pPotentialTable->GetFieldFromLablePtr( iIdx, sFieldNum._PotentialID )->GetInteger();
|
|
if( nPotentialID < 1 )
|
|
continue;
|
|
|
|
TPotentialData *pData = NULL;
|
|
TMapPotentialData::iterator it = m_pPotentialTable.find( nPotentialID );
|
|
if( it != m_pPotentialTable.end() )
|
|
{
|
|
pData = it->second;
|
|
}
|
|
else
|
|
{
|
|
pData = new TPotentialData;
|
|
pData->nPotentialID = nPotentialID;
|
|
pData->nTotalProb = 0;
|
|
m_pPotentialTable.insert( make_pair( nPotentialID, pData ) );
|
|
}
|
|
|
|
TPotentialDataItem *pItem = new TPotentialDataItem;
|
|
pItem->nItemID = nItemID;
|
|
_fpreset();
|
|
int nProb = (int)(( pPotentialTable->GetFieldFromLablePtr( iIdx, sFieldNum._PotentialRatio )->GetFloat() + 0.001f ) * 100.f );
|
|
pItem->nPotentailOffset = pData->nTotalProb + nProb;
|
|
pItem->nPotentialNo = pPotentialTable->GetFieldFromLablePtr( iIdx, sFieldNum._PotentialNo )->GetInteger();
|
|
pItem->nProb = nProb;
|
|
pData->nTotalProb += nProb;
|
|
|
|
pItem->nSkillID = pPotentialTable->GetFieldFromLablePtr( iIdx, sFieldNum._PotentialSkillID )->GetInteger();
|
|
pItem->nSkillLevel = pPotentialTable->GetFieldFromLablePtr( iIdx, sFieldNum._PotentialSkillLevel )->GetInteger();
|
|
pItem->nSkillUsingType = pPotentialTable->GetFieldFromLablePtr( iIdx, sFieldNum._PotentialSkillUsingType )->GetInteger();
|
|
|
|
pData->pVecItemData.push_back( pItem );
|
|
}
|
|
return true;
|
|
}
|
|
|
|
TEnchantData *CDNGameDataManager::GetEnchantData( int nEnchantID ) const
|
|
{
|
|
TMapEnchantData::const_iterator it = m_pEnchantTable.find( nEnchantID );
|
|
if( it == m_pEnchantTable.end() ) return NULL;
|
|
return it->second;
|
|
}
|
|
|
|
TEnchantLevelData *CDNGameDataManager::GetEnchantLevelData( int nEnchantID, char cLevel )
|
|
{
|
|
TEnchantData *pData = GetEnchantData( nEnchantID );
|
|
if( !pData ) return NULL;
|
|
std::map<char, TEnchantLevelData*>::iterator it = pData->pMapLevelData.find( cLevel );
|
|
if( it == pData->pMapLevelData.end() ) return NULL;
|
|
return it->second;
|
|
}
|
|
|
|
#ifdef PRE_FIX_MEMOPT_ENCHANT
|
|
const TEnchantNeedItemData* CDNGameDataManager::GetEnchantNeedItemData(int nEnchantID, char cLevel) const
|
|
{
|
|
const TEnchantData* pData = GetEnchantData(nEnchantID);
|
|
if (pData == NULL)
|
|
return NULL;
|
|
|
|
std::map<char, TEnchantLevelData*>::const_iterator it = pData->pMapLevelData.find(cLevel);
|
|
if (it == pData->pMapLevelData.end())
|
|
return NULL;
|
|
|
|
const TEnchantLevelData* pLevelData = (it->second);
|
|
if (pLevelData == NULL)
|
|
return NULL;
|
|
|
|
TMapEnchantNeedItemData::const_iterator needItemDataIter = m_EnchantNeedItemTable.find(pLevelData->nNeedItemTableID);
|
|
if (needItemDataIter == m_EnchantNeedItemTable.end())
|
|
return NULL;
|
|
|
|
return &(needItemDataIter->second);
|
|
}
|
|
|
|
const TEnchantNeedItemData* CDNGameDataManager::GetEnchantNeedItemData(const TEnchantLevelData& levelData) const
|
|
{
|
|
TMapEnchantNeedItemData::const_iterator needItemDataIter = m_EnchantNeedItemTable.find(levelData.nNeedItemTableID);
|
|
if (needItemDataIter == m_EnchantNeedItemTable.end())
|
|
return NULL;
|
|
|
|
return &(needItemDataIter->second);
|
|
}
|
|
#endif
|
|
|
|
int CDNGameDataManager::GetEnchantMaxLevel( int nEnchantID )
|
|
{
|
|
TEnchantData *pData = GetEnchantData( nEnchantID );
|
|
if( !pData ) return 0;
|
|
|
|
return pData->cCount;
|
|
}
|
|
|
|
TPotentialData *CDNGameDataManager::GetPotentialData( int nPotentailID )
|
|
{
|
|
TMapPotentialData::iterator it = m_pPotentialTable.find( nPotentailID );
|
|
if( it == m_pPotentialTable.end() ) return NULL;
|
|
|
|
return it->second;
|
|
}
|
|
|
|
|
|
bool CDNGameDataManager::LoadItemDropData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TITEMDROP );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TITEMDROP );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TITEMDROP );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox ) {
|
|
g_Log.Log(LogType::_FILELOG, L"ItemDropTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 ) {
|
|
g_Log.Log(LogType::_FILELOG, L"ItemDropTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapItemDropData, m_pItemDropTable );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szLabel[32];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _IsGroup;
|
|
int _ItemIndex;
|
|
int _ItemProb;
|
|
int _ItemInfo;
|
|
};
|
|
|
|
std::vector<TempFieldNum> vFieldNum;
|
|
vFieldNum.reserve( 20 );
|
|
|
|
for( int j=0; j<20; j++ )
|
|
{
|
|
TempFieldNum Temp;
|
|
|
|
sprintf_s( szLabel, "_IsGroup%d", j + 1 );
|
|
Temp._IsGroup = pSox->GetFieldNum( szLabel );
|
|
|
|
sprintf_s( szLabel, "_Item%dIndex", j + 1 );
|
|
Temp._ItemIndex = pSox->GetFieldNum( szLabel );
|
|
|
|
sprintf_s( szLabel, "_Item%dProb", j + 1 );
|
|
Temp._ItemProb = pSox->GetFieldNum( szLabel );
|
|
|
|
sprintf_s( szLabel, "_Item%dInfo", j + 1 );
|
|
Temp._ItemInfo = pSox->GetFieldNum( szLabel );
|
|
|
|
vFieldNum.push_back( Temp );
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pSox->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
if( nItemID < 1 )
|
|
continue;
|
|
|
|
TItemDropData *pData = new TItemDropData;
|
|
|
|
pData->nItemDropID = nItemID;
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
for( int j=0; j<20; j++ )
|
|
{
|
|
pData->bIsGroup[j] = ( pSox->GetFieldFromLablePtr( iIdx, vFieldNum[j]._IsGroup )->GetInteger() == TRUE ) ? true : false;
|
|
pData->nIndex[j] = pSox->GetFieldFromLablePtr( iIdx, vFieldNum[j]._ItemIndex )->GetInteger();
|
|
pData->nProb[j] = pSox->GetFieldFromLablePtr( iIdx, vFieldNum[j]._ItemProb )->GetInteger();
|
|
pData->nInfo[j] = pSox->GetFieldFromLablePtr( iIdx, vFieldNum[j]._ItemInfo )->GetInteger();
|
|
}
|
|
m_pItemDropTable.insert( make_pair( nItemID, pData ) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TItemDropData *CDNGameDataManager::GetItemDropData( int nDropItemTableID )
|
|
{
|
|
TMapItemDropData::iterator it = m_pItemDropTable.find( nDropItemTableID );
|
|
if( it == m_pItemDropTable.end() ) return NULL;
|
|
|
|
return it->second;
|
|
}
|
|
|
|
// Appellation
|
|
int CDNGameDataManager::LoadAppellationData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pAppellationTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pAppellationTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TAPPELLATION );
|
|
}
|
|
else
|
|
{
|
|
pAppellationTable = GetDNTable( CDnTableDB::TAPPELLATION );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pAppellationTable = GetDNTable( CDnTableDB::TAPPELLATION );
|
|
#endif //#ifdef _WORK
|
|
if( !pAppellationTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"AppellationTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pAppellationTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log( LogType::_FILELOG, L"AppellationTable.dnt Count(%d)\r\n", pAppellationTable->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _LevelLimit;
|
|
int _Color;
|
|
int _Type;
|
|
#if defined( PRE_ADD_NEWCOMEBACK )
|
|
int _SkillLinkItemID;
|
|
#endif
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._LevelLimit = pAppellationTable->GetFieldNum( "_LevelLimit" );
|
|
sFieldNum._Color = pAppellationTable->GetFieldNum( "_Color" );
|
|
sFieldNum._Type = pAppellationTable->GetFieldNum( "_Type" );
|
|
#if defined( PRE_ADD_NEWCOMEBACK )
|
|
sFieldNum._SkillLinkItemID = pAppellationTable->GetFieldNum( "_SkillLinkItemID" );
|
|
#endif
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pAppellationTable->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pAppellationTable->GetItemID(i);
|
|
int iIdx = pAppellationTable->GetIDXprimary( nItemID );
|
|
|
|
TAppellationData AppellationData = {0,};
|
|
|
|
AppellationData.nAppellationID = nItemID;
|
|
AppellationData.nArrayIndex = pAppellationTable->GetArrayIndex( nItemID );
|
|
AppellationData.nColor = pAppellationTable->GetFieldFromLablePtr( iIdx, sFieldNum._Color )->GetInteger();
|
|
AppellationData.nLevelLimit = pAppellationTable->GetFieldFromLablePtr( iIdx, sFieldNum._LevelLimit )->GetInteger();
|
|
AppellationData.nType = pAppellationTable->GetFieldFromLablePtr( iIdx, sFieldNum._Type )->GetInteger();
|
|
#if defined( PRE_ADD_NEWCOMEBACK )
|
|
AppellationData.nSkillItemID = pAppellationTable->GetFieldFromLablePtr( iIdx, sFieldNum._SkillLinkItemID )->GetInteger();
|
|
#endif
|
|
|
|
m_MapAppellationData.insert(make_pair(AppellationData.nAppellationID, AppellationData));
|
|
|
|
switch (AppellationData.nType)
|
|
{
|
|
case AppellationType::Type::Normal:
|
|
break;
|
|
|
|
case AppellationType::Type::Cash:
|
|
break;
|
|
|
|
case AppellationType::Type::Period:
|
|
#if defined( PRE_ADD_NEWCOMEBACK )
|
|
case AppellationType::Type::ComeBack:
|
|
#endif
|
|
{
|
|
m_mPeriodAppellation.insert( std::make_pair(AppellationData.nAppellationID, AppellationData.nArrayIndex) );
|
|
}
|
|
break;
|
|
|
|
case AppellationType::Type::Guild:
|
|
{
|
|
m_mGuildAppellation.insert( std::make_pair(AppellationData.nAppellationID, AppellationData.nArrayIndex) );
|
|
}
|
|
break;
|
|
#if defined( PRE_ADD_BESTFRIEND )
|
|
case AppellationType::Type::BestFriend:
|
|
{
|
|
m_mBestFriendAppellation.insert( std::make_pair(AppellationData.nAppellationID, AppellationData.nArrayIndex) );
|
|
}
|
|
break;
|
|
#endif // #if defined( PRE_ADD_BESTFRIEND )
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TAppellationData *CDNGameDataManager::GetAppellationData(int nAppellationItemID)
|
|
{
|
|
TMapAppellationData::iterator iter = m_MapAppellationData.find(nAppellationItemID);
|
|
if (iter == m_MapAppellationData.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
int CDNGameDataManager::GetAppellationArrayIndex(int nAppellationItemID)
|
|
{
|
|
int nIndex = -1;
|
|
TAppellationData *pData = GetAppellationData(nAppellationItemID);
|
|
if (pData)
|
|
nIndex = pData->nArrayIndex;
|
|
|
|
return nIndex;
|
|
}
|
|
|
|
int CDNGameDataManager::GetAppellationLevelLimit(int nAppellationItemID)
|
|
{
|
|
int nLevel = 0;
|
|
TAppellationData *pData = GetAppellationData(nAppellationItemID);
|
|
if (pData)
|
|
nLevel = pData->nLevelLimit;
|
|
|
|
return nLevel;
|
|
}
|
|
|
|
void CDNGameDataManager::ResetPeriodAppellation(char *Appellation, std::map<int, int> &mapDelAppellation)
|
|
{
|
|
for(TMapPeriodAppellationID::iterator itor = m_mPeriodAppellation.begin(); itor != m_mPeriodAppellation.end(); itor++)
|
|
{
|
|
if( GetBitFlag(Appellation, itor->second) == true )
|
|
{
|
|
SetBitFlag( Appellation, itor->second, false );
|
|
mapDelAppellation.insert( std::make_pair(itor->second,itor->first) );
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
int CDNGameDataManager::GetPeriodAppellationArrayID(int nItemID)
|
|
{
|
|
TMapPeriodAppellationID::iterator itor = m_mPeriodAppellation.find(nItemID);
|
|
if(itor == m_mPeriodAppellation.end())
|
|
return -1;
|
|
|
|
return itor->second;
|
|
}
|
|
|
|
void CDNGameDataManager::ResetGuildAppellation(char *Appellation, std::map<int, int> &mapDelAppellation)
|
|
{
|
|
for(TMapGuildAppellationID::iterator itor = m_mGuildAppellation.begin(); itor != m_mGuildAppellation.end(); itor++)
|
|
{
|
|
if( GetBitFlag(Appellation, itor->second) == true )
|
|
{
|
|
SetBitFlag( Appellation, itor->second, false );
|
|
mapDelAppellation.insert( std::make_pair(itor->second,itor->first) );
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
#if defined( PRE_ADD_BESTFRIEND )
|
|
void CDNGameDataManager::ResetBestFriendAppellation(char *Appellation, std::map<int, int> &mapDelAppellation)
|
|
{
|
|
for(TMapBestFriendAppellationID::iterator itor = m_mBestFriendAppellation.begin(); itor != m_mBestFriendAppellation.end(); itor++)
|
|
{
|
|
if( GetBitFlag(Appellation, itor->second) == true )
|
|
{
|
|
SetBitFlag( Appellation, itor->second, false );
|
|
mapDelAppellation.insert( std::make_pair(itor->second,itor->first) );
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
bool CDNGameDataManager::LoadMissionData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TMISSION );
|
|
}
|
|
else
|
|
{
|
|
pTable = GetDNTable( CDnTableDB::TMISSION );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TMISSION );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"MissionTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log( LogType::_FILELOG, L"MissionTable.dnt Count(%d)\r\n", pTable->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PVEC( m_pMissionTable );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _Activate;
|
|
int _Type;
|
|
int _nMailID;
|
|
int _RewardAppellation;
|
|
int _RewardPoint;
|
|
int _GainEvent;
|
|
int _AchieveEvent;
|
|
int _IsAchieveNotice;
|
|
std::vector<int> _GainType;
|
|
std::vector<int> _GainParam;
|
|
std::vector<int> _GainOperator;
|
|
int _GainCheckType;
|
|
std::vector<int> _AchieveType;
|
|
std::vector<int> _AchieveParam;
|
|
std::vector<int> _AchieveOperator;
|
|
int _AchieveCheckType;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._Activate = pTable->GetFieldNum( "_Activate" );
|
|
sFieldNum._Type = pTable->GetFieldNum( "_Type" );
|
|
sFieldNum._nMailID = pTable->GetFieldNum( "_MailID" );
|
|
sFieldNum._RewardAppellation = pTable->GetFieldNum( "_RewardAppellation" );
|
|
sFieldNum._RewardPoint = pTable->GetFieldNum( "_RewardPoint" );
|
|
sFieldNum._IsAchieveNotice = pTable->GetFieldNum( "_IsAchieveNotice" );
|
|
sFieldNum._GainEvent = pTable->GetFieldNum( "_GainEvent" );
|
|
sFieldNum._AchieveEvent = pTable->GetFieldNum( "_AchieveEvent" );
|
|
|
|
sFieldNum._GainType.reserve(5);
|
|
sFieldNum._GainParam.reserve(5);
|
|
sFieldNum._GainOperator.reserve(5);
|
|
sFieldNum._AchieveType.reserve(5);
|
|
sFieldNum._AchieveParam.reserve(5);
|
|
sFieldNum._AchieveOperator.reserve(5);
|
|
|
|
for( int j=0; j<5; j++ )
|
|
{
|
|
sprintf_s( szTemp, "_Gain%dType", j + 1 );
|
|
sFieldNum._GainType.push_back( pTable->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_Gain%dParam", j + 1 );
|
|
sFieldNum._GainParam.push_back( pTable->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_Gain%dOperator", j + 1 );
|
|
sFieldNum._GainOperator.push_back( pTable->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_Achieve%dType", j + 1 );
|
|
sFieldNum._AchieveType.push_back( pTable->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_Achieve%dParam", j + 1 );
|
|
sFieldNum._AchieveParam.push_back( pTable->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_Achieve%dOperator", j + 1 );
|
|
sFieldNum._AchieveOperator.push_back( pTable->GetFieldNum(szTemp) );
|
|
}
|
|
|
|
sFieldNum._GainCheckType = pTable->GetFieldNum( "_GainCheckType" );
|
|
sFieldNum._AchieveCheckType = pTable->GetFieldNum( "_AchieveCheckType" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pTable->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pTable->GetItemID(i);
|
|
|
|
int iIdx = pTable->GetIDXprimary( nItemID );
|
|
|
|
TMissionData *pData = new TMissionData;
|
|
memset( pData, 0, sizeof(TMissionData) );
|
|
|
|
pData->bActivate = ( pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Activate )->GetInteger() == TRUE ) ? true : false;
|
|
pData->nType = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Type )->GetInteger();
|
|
pData->nMailID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._nMailID )->GetInteger();
|
|
int nRewardAppellationID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._RewardAppellation )->GetInteger();
|
|
pData->nRewardAppellation = ( nRewardAppellationID < 1 ) ? -1 : GetAppellationArrayIndex( nRewardAppellationID );
|
|
pData->bIsAchieveNotice = ( pTable->GetFieldFromLablePtr( iIdx, sFieldNum._IsAchieveNotice )->GetInteger() == TRUE ) ? true : false;
|
|
pData->nRewardPoint = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._RewardPoint )->GetInteger();
|
|
pData->GainCondition.cEvent = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._GainEvent )->GetInteger();
|
|
pData->AchieveCondition.cEvent = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveEvent )->GetInteger();
|
|
|
|
if (pData->bActivate)
|
|
{
|
|
if (pData->GainCondition.cEvent >= EventSystem::EventTypeEnum_Amount)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MissionTable.dnt Invalid GainEvent ID: %d \n",pData->GainCondition.cEvent);
|
|
return false;
|
|
}
|
|
if (pData->AchieveCondition.cEvent >= EventSystem::EventTypeEnum_Amount)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MissionTable.dnt Invalid AchieveEvent ID: %d \n",pData->AchieveCondition.cEvent);
|
|
//TODO(Cusrro):可能是资源版本不匹配
|
|
//return false;
|
|
}
|
|
}
|
|
|
|
for( int j=0; j<5; j++ )
|
|
{
|
|
pData->GainCondition.cType[j] = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._GainType[j] )->GetInteger();
|
|
pData->GainCondition.nParam[j] = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._GainParam[j] )->GetInteger();
|
|
pData->GainCondition.cOperator[j] = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._GainOperator[j] )->GetInteger();
|
|
pData->AchieveCondition.cType[j] = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveType[j] )->GetInteger();
|
|
pData->AchieveCondition.nParam[j] = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveParam[j] )->GetInteger();
|
|
pData->AchieveCondition.cOperator[j] = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveOperator[j] )->GetInteger();
|
|
|
|
if (pData->bActivate)
|
|
{
|
|
if (pData->GainCondition.nParam[j] < 0)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MissionTable.dnt, GainParm < 0 [ItemID:%d]\n", nItemID);
|
|
return false;
|
|
}
|
|
|
|
if (pData->AchieveCondition.nParam[j] < 0)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MissionTable.dnt, AchieveParam < 0 [ItemID:%d]\n", nItemID);
|
|
return false;
|
|
}
|
|
|
|
if (pData->GainCondition.cType[j] >= EventSystem::EventValueTypeEnum_Amount)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MissionTable.dnt, Invalid GainType\n");
|
|
return false;
|
|
}
|
|
|
|
if (CDNEventSystem::s_EventValueFuncList[pData->GainCondition.cType[j]].pFunc == NULL && pData->GainCondition.cType[j] > 0)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MissionTable.dnt, Invalid s_EventValueFuncList[GainType], please check MissionAPI\n");
|
|
return false;
|
|
}
|
|
|
|
if (pData->AchieveCondition.cType[j] >= EventSystem::EventValueTypeEnum_Amount)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MissionTable.dnt, Invalid AchieveType\n");
|
|
//TODO(Cusrro):可能是资源版本不匹配
|
|
//return false;
|
|
}
|
|
#pragma message("disable s_EventValueFuncList temprarly")
|
|
if (CDNEventSystem::s_EventValueFuncList[pData->AchieveCondition.cType[j]].pFunc == NULL && pData->AchieveCondition.cType[j] > 0)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MissionTable.dnt, Invalid s_EventValueFuncList[AchieveType], please check MissionAPI\n");
|
|
//return false;
|
|
}
|
|
}
|
|
}
|
|
pData->GainCondition.bCheckType = ( pTable->GetFieldFromLablePtr( iIdx, sFieldNum._GainCheckType )->GetInteger() == TRUE ) ? true : false;
|
|
pData->AchieveCondition.bCheckType = ( pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveCheckType )->GetInteger() == TRUE ) ? true : false;
|
|
|
|
// 单捞磐 啊傍
|
|
if( pData->nType == MissionType_MetaShow || pData->nType == MissionType_MetaHide )
|
|
{
|
|
// 皋鸥诀利捞扼搁 AchieveParam阑 固记 牢郸胶肺 官层敌促.
|
|
for( int l=0; l<5; l++ )
|
|
pData->AchieveCondition.nParam[l] = pTable->GetArrayIndex( pData->AchieveCondition.nParam[l] );
|
|
}
|
|
|
|
m_pMissionTable.push_back( pData );
|
|
|
|
//TODO(Cusrro):???
|
|
//if (nItemID != m_pMissionTable.size()) //巩力 绝绰瘤 犬牢秦毫具凳
|
|
//{
|
|
// g_Log.Log( LogType::_FILELOG, L"MissionTable.dnt, missing MissionData [ItemID:%d]\n", nItemID-1);
|
|
// return false;
|
|
//}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
TMissionData *CDNGameDataManager::GetMissionData( int nArrayIndex )
|
|
{
|
|
if( nArrayIndex < 0 || nArrayIndex >= (int)m_pMissionTable.size() ) return NULL;
|
|
return m_pMissionTable[nArrayIndex];
|
|
}
|
|
|
|
char CDNGameDataManager::GetMissionType(int nArrayIndex)
|
|
{
|
|
if( nArrayIndex < 0 || nArrayIndex >= (int)m_pMissionTable.size() ) return NULL;
|
|
return m_pMissionTable[nArrayIndex]->nType;
|
|
}
|
|
|
|
int CDNGameDataManager::GetMissionMailID(int nArrayIndex)
|
|
{
|
|
if( nArrayIndex < 0 || nArrayIndex >= (int)m_pMissionTable.size() ) return NULL;
|
|
return m_pMissionTable[nArrayIndex]->nMailID;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadDailyMissionData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TDAILYMISSION );
|
|
}
|
|
else
|
|
{
|
|
pTable = GetDNTable( CDnTableDB::TDAILYMISSION );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TDAILYMISSION );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"DailyMissionTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log(LogType::_FILELOG, L"DailyMissionTable.dnt Count(%d)\r\n", pTable->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_pGuildWarMissionTable.clear();
|
|
m_pGuildCommonMissionTable.clear();
|
|
m_pWeekendRepeatMissionTable.clear();
|
|
|
|
SAFE_DELETE_PMAP( TMapDailyMissionData, m_pDailyMissionTable );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _MailID;
|
|
int _RewardAppellation;
|
|
int _RewardPoint;
|
|
int _AchieveEvent;
|
|
std::vector<int> _AchieveType;
|
|
std::vector<int> _AchieveParam;
|
|
std::vector<int> _AchieveOperator;
|
|
int _AchieveCheckType;
|
|
int _CounterParam;
|
|
int _CounterOperator;
|
|
int _type;
|
|
int _typeParam;
|
|
int _StartTime;
|
|
#if defined(PRE_ADD_WEEKLYEVENT_MISSION_ENDTIME)
|
|
int _EndTime;
|
|
#endif // #if defined(PRE_ADD_WEEKLYEVENT_MISSION_ENDTIME)
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._MailID = pTable->GetFieldNum( "_MailID" );
|
|
sFieldNum._RewardAppellation = pTable->GetFieldNum( "_RewardAppellation" );
|
|
sFieldNum._RewardPoint = pTable->GetFieldNum( "_RewardPoint" );
|
|
sFieldNum._AchieveEvent = pTable->GetFieldNum( "_AchieveEvent" );
|
|
|
|
sFieldNum._AchieveType.reserve(5);
|
|
sFieldNum._AchieveParam.reserve(5);
|
|
sFieldNum._AchieveOperator.reserve(5);
|
|
|
|
for( int j=0; j<5; j++ )
|
|
{
|
|
sprintf_s( szTemp, "_Achieve%dType", j + 1 );
|
|
sFieldNum._AchieveType.push_back( pTable->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_Achieve%dParam", j + 1 );
|
|
sFieldNum._AchieveParam.push_back( pTable->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_Achieve%dOperator", j + 1 );
|
|
sFieldNum._AchieveOperator.push_back( pTable->GetFieldNum(szTemp) );
|
|
}
|
|
|
|
sFieldNum._AchieveCheckType = pTable->GetFieldNum( "_AchieveCheckType" );
|
|
sFieldNum._CounterParam = pTable->GetFieldNum( "_CounterParam" );
|
|
sFieldNum._CounterOperator = pTable->GetFieldNum( "_CounterOperator" );
|
|
sFieldNum._type = pTable->GetFieldNum( "_type" );
|
|
sFieldNum._typeParam = pTable->GetFieldNum( "_typeParam" );
|
|
sFieldNum._StartTime = pTable->GetFieldNum( "_StartTime" );
|
|
#if defined(PRE_ADD_WEEKLYEVENT_MISSION_ENDTIME)
|
|
sFieldNum._EndTime = pTable->GetFieldNum( "_EndTime" );
|
|
#endif // #if defined(PRE_ADD_WEEKLYEVENT_MISSION_ENDTIME)
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pTable->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pTable->GetItemID(i);
|
|
int iIdx = pTable->GetIDXprimary( nItemID );
|
|
|
|
TDailyMissionData *pData = new TDailyMissionData;
|
|
memset( pData, 0, sizeof(TDailyMissionData) );
|
|
|
|
pData->nMailID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._MailID )->GetInteger();
|
|
int nRewardAppellationID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._RewardAppellation )->GetInteger();
|
|
pData->nRewardAppellation = ( nRewardAppellationID < 1 ) ? -1 : GetAppellationArrayIndex( nRewardAppellationID );
|
|
pData->nRewardPoint = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._RewardPoint )->GetInteger();
|
|
pData->AchieveCondition.cEvent = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveEvent )->GetInteger();
|
|
if (pData->AchieveCondition.cEvent >= EventSystem::EventTypeEnum_Amount)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"DailyMissionTable.dnt Invalid AchieveEvent [ItemID:%d]\n", nItemID);
|
|
return false;
|
|
}
|
|
|
|
for( int j=0; j<5; j++ )
|
|
{
|
|
pData->AchieveCondition.cType[j] = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveType[j] )->GetInteger();
|
|
pData->AchieveCondition.nParam[j] = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveParam[j] )->GetInteger();
|
|
pData->AchieveCondition.cOperator[j] = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveOperator[j] )->GetInteger();
|
|
if (pData->AchieveCondition.nParam[j] < 0)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"DailyMissionTable.dnt, AchieveParam < 0 [ItemID:%d]\n", nItemID);
|
|
return false;
|
|
}
|
|
|
|
if (pData->AchieveCondition.cType[j] >= EventSystem::EventValueTypeEnum_Amount)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"DailyMissionTable.dnt, Invalid AchieveType [ItemID:%d][Type:%d]\n", nItemID,pData->AchieveCondition.cType[j]);
|
|
return false;
|
|
}
|
|
|
|
if (CDNEventSystem::s_EventValueFuncList[pData->AchieveCondition.cType[j]].pFunc == NULL &&pData->AchieveCondition.cType[j] > 0)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"DailyMissionTable.dnt, Invalid s_EventValueFuncList[AchieveType], please check MissionAPI [ItemID:%d]\n", nItemID);
|
|
//TODO(Cusrro):可能是资源版本不匹配
|
|
//return false;
|
|
}
|
|
}
|
|
pData->AchieveCondition.bCheckType = ( pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveCheckType )->GetInteger() == TRUE ) ? true : false;
|
|
pData->nCounterParam = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._CounterParam )->GetInteger();
|
|
pData->cCounterOperator = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._CounterOperator )->GetInteger();
|
|
|
|
pData->nItemID = nItemID;
|
|
pData->nType = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._type )->GetInteger();
|
|
pData->nTypeParam = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._typeParam )->GetInteger();
|
|
CTimeSet tStartSet(pTable->GetFieldFromLablePtr( iIdx, sFieldNum._StartTime )->GetString(), true);
|
|
pData->tStartDate = tStartSet.GetTimeT64_LC();
|
|
#if defined(PRE_ADD_WEEKLYEVENT_MISSION_ENDTIME)
|
|
CTimeSet tEndSet(pTable->GetFieldFromLablePtr( iIdx, sFieldNum._EndTime )->GetString(), true);
|
|
pData->tEndDate = tEndSet.GetTimeT64_LC();
|
|
#endif // #if defined(PRE_ADD_WEEKLYEVENT_MISSION_ENDTIME)
|
|
|
|
if(pData->nType == DAILYMISSION_GUILDWAR)
|
|
m_pGuildWarMissionTable.push_back(pData);
|
|
else if(pData->nType == DAILYMISSION_GUILDCOMMON)
|
|
m_pGuildCommonMissionTable.push_back(pData);
|
|
else if(pData->nType == DAILYMISSION_WEEKENDREPEAT)
|
|
{
|
|
if (!tStartSet.CheckIntegrity())
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"DailyMissionTable.dnt WEEKENDREPEAT Invalid StartTime failed [ItemID:%d]\r\n", nItemID);
|
|
#if defined (_FINAL_BUILD)
|
|
return false;
|
|
#endif
|
|
}
|
|
#if defined(PRE_ADD_WEEKLYEVENT_MISSION_ENDTIME)
|
|
if (!tEndSet.CheckIntegrity())
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"DailyMissionTable.dnt WEEKENDREPEAT Invalid EndTime failed [ItemID:%d]\r\n", nItemID);
|
|
#if defined (_FINAL_BUILD)
|
|
return false;
|
|
#endif
|
|
}
|
|
#endif // #if defined(PRE_ADD_WEEKLYEVENT_MISSION_ENDTIME)
|
|
m_pWeekendRepeatMissionTable.push_back(pData);
|
|
}
|
|
else if(pData->nType == DAILYMISSION_WEEKENDEVENT)
|
|
{
|
|
if (!tStartSet.CheckIntegrity())
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"DailyMissionTable.dnt WEEKENDEVENT Invalid StartTime failed [ItemID:%d]\r\n", nItemID);
|
|
#if defined (_FINAL_BUILD)
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
#if defined(PRE_ADD_WEEKLYEVENT_MISSION_ENDTIME)
|
|
if (!tEndSet.CheckIntegrity())
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"DailyMissionTable.dnt WEEKENDEVENT Invalid EndTime failed [ItemID:%d]\r\n", nItemID);
|
|
#if defined (_FINAL_BUILD)
|
|
|
|
//[debug3] 检查每周任务的结束时间 这里暂时不检查
|
|
#if 0
|
|
return false;
|
|
#endif
|
|
|
|
|
|
#endif
|
|
}
|
|
#endif // #if defined(PRE_ADD_WEEKLYEVENT_MISSION_ENDTIME)
|
|
m_pWeekendEventMissionTable.push_back(pData);
|
|
}
|
|
|
|
m_pDailyMissionTable.insert( make_pair( nItemID, pData ) );
|
|
}
|
|
return true;
|
|
}
|
|
|
|
TDailyMissionData *CDNGameDataManager::GetDailyMissionData( int nItemID )
|
|
{
|
|
TMapDailyMissionData::iterator it = m_pDailyMissionTable.find( nItemID );
|
|
if( it == m_pDailyMissionTable.end() ) return NULL;
|
|
return it->second;
|
|
}
|
|
|
|
int CDNGameDataManager::GetDailyMissionRewarePoint(int nMissionID)
|
|
{
|
|
TDailyMissionData *pMission = GetDailyMissionData(nMissionID);
|
|
if(pMission) return pMission->nRewardPoint;
|
|
return 0;
|
|
}
|
|
|
|
TDailyMissionData *CDNGameDataManager::GetWeekendEventMissionData( int nArrayIndex )
|
|
{
|
|
if( nArrayIndex < 0 || nArrayIndex >= (int)m_pWeekendEventMissionTable.size() ) return NULL;
|
|
return m_pWeekendEventMissionTable[nArrayIndex];
|
|
}
|
|
|
|
TDailyMissionData *CDNGameDataManager::GetGuildCommonMissionData( int nArrayIndex )
|
|
{
|
|
if( nArrayIndex < 0 || nArrayIndex >= (int)m_pGuildCommonMissionTable.size() ) return NULL;
|
|
return m_pGuildCommonMissionTable[nArrayIndex];
|
|
}
|
|
|
|
TDailyMissionData *CDNGameDataManager::GetWeekendRepeatMissionData( int nArrayIndex )
|
|
{
|
|
if( nArrayIndex < 0 || nArrayIndex >= (int)m_pWeekendRepeatMissionTable.size() ) return NULL;
|
|
return m_pWeekendRepeatMissionTable[nArrayIndex];
|
|
}
|
|
|
|
TDailyMissionData *CDNGameDataManager::GetGuildWarMissionData( int nArrayIndex )
|
|
{
|
|
if( nArrayIndex < 0 || nArrayIndex >= (int)m_pGuildWarMissionTable.size() ) return NULL;
|
|
return m_pGuildWarMissionTable[nArrayIndex];
|
|
}
|
|
#if defined(PRE_ADD_WEEKLYEVENT_MISSION_ENDTIME)
|
|
int CDNGameDataManager::GetWeekendMissionCount(eDailyMissionType eMissionType)
|
|
{
|
|
switch(eMissionType)
|
|
{
|
|
case DAILYMISSION_WEEKENDEVENT: return (int)m_pWeekendEventMissionTable.size();
|
|
case DAILYMISSION_WEEKENDREPEAT:return (int)m_pWeekendRepeatMissionTable.size();
|
|
}
|
|
return -1;
|
|
}
|
|
#endif // #if defined(PRE_ADD_WEEKLYEVENT_MISSION_ENDTIME)
|
|
|
|
void CDNGameDataManager::GetRandomGuildMission( int nRandomSeed, int* vGuildMissionID )
|
|
{
|
|
std::vector<int> vMissionID[GUILDWARMISSION_MAXGROUP];
|
|
std::vector<TDailyMissionData*>::iterator iter = m_pGuildWarMissionTable.begin();
|
|
for(; iter!= m_pGuildWarMissionTable.end(); iter++)
|
|
{
|
|
TDailyMissionData* pMission = (*iter);
|
|
if(!pMission) continue;
|
|
if(pMission->nTypeParam >= GUILDWARMISSION_MAXGROUP) continue;
|
|
|
|
vMissionID[pMission->nTypeParam].push_back(pMission->nItemID);
|
|
}
|
|
|
|
int nSize = 0;
|
|
int nRandomValue = 0;
|
|
for (int i=0; i<GUILDWARMISSION_MAXGROUP; i++)
|
|
{
|
|
nSize = (int)vMissionID[i].size();
|
|
if(nSize <= 0) continue;
|
|
|
|
nRandomValue = nRandomSeed % nSize;
|
|
|
|
vGuildMissionID[i] = vMissionID[i][nRandomValue];
|
|
}
|
|
}
|
|
|
|
#if defined(PRE_ADD_CHAT_MISSION)
|
|
bool CDNGameDataManager::LoadTypingData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TMISSIONTYPING );
|
|
}
|
|
else
|
|
{
|
|
pTable = GetDNTable( CDnTableDB::TMISSIONTYPING );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TMISSIONTYPING );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"TypingTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log( LogType::_FILELOG, L"TypingTable.dnt Count(%d)\r\n", pTable->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_VEC( m_pTypingTable );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _Activate;
|
|
int _UIString;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._Activate = pTable->GetFieldNum( "_Activate" );
|
|
sFieldNum._UIString = pTable->GetFieldNum( "_UIString" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pTable->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pTable->GetItemID(i);
|
|
|
|
int iIdx = pTable->GetIDXprimary( nItemID );
|
|
if( pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Activate )->GetInteger() == TRUE )
|
|
{
|
|
m_pTypingTable.push_back(pTable->GetFieldFromLablePtr( iIdx, sFieldNum._UIString )->GetInteger());
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::CheckTypingData(int nUIStringMid)
|
|
{
|
|
for( int i = 0 ; i < m_pTypingTable.size() ; i++)
|
|
{
|
|
if(m_pTypingTable[i] == nUIStringMid)
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
#endif
|
|
|
|
bool CDNGameDataManager::LoadGuildWarRewardData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
if (m_bAllLoaded)
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TGUILDWARREWARD );
|
|
else
|
|
pTable = GetDNTable( CDnTableDB::TGUILDWARREWARD );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TGUILDWARREWARD );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"guildwarmailtable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log(LogType::_FILELOG, L"guildwarmailtable.dnt Count(%d)\r\n", pTable->GetItemCount());
|
|
//return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PVEC( m_pGuildWarRewardData );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _ResultType;
|
|
int _ClassID;
|
|
int _MailID1;
|
|
int _MailID2;
|
|
int _GuildFestPoint;
|
|
int _GuildPoint;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._ResultType = pTable->GetFieldNum("_ResultType");
|
|
sFieldNum._ClassID = pTable->GetFieldNum("_ClassID");
|
|
sFieldNum._MailID1 = pTable->GetFieldNum("_MailID1");
|
|
sFieldNum._MailID2 = pTable->GetFieldNum("_MailID2");
|
|
sFieldNum._GuildFestPoint = pTable->GetFieldNum("_GuildFestPoint");
|
|
sFieldNum._GuildPoint = pTable->GetFieldNum("_GuildPoint");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pTable->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pTable->GetItemID(i);
|
|
int iIdx = pTable->GetIDXprimary( nItemID );
|
|
|
|
TGuildWarRewardData* Data = new TGuildWarRewardData;
|
|
memset( Data, 0, sizeof(TGuildWarRewardData) );
|
|
Data->cType = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._ResultType )->GetInteger();
|
|
Data->cClass = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._ClassID )->GetInteger();
|
|
Data->nMailID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._MailID1 )->GetInteger();
|
|
Data->nPresentID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._MailID2 )->GetInteger();
|
|
Data->nGuildFestivalPoint = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._GuildFestPoint)->GetInteger();
|
|
Data->nGuildPoint = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._GuildPoint)->GetInteger();
|
|
|
|
m_pGuildWarRewardData.push_back(Data);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
TGuildWarRewardData* CDNGameDataManager::GetGuildWarRewardData(char cType, char cClass)
|
|
{
|
|
std::vector<TGuildWarRewardData*>::iterator iter;
|
|
for( iter=m_pGuildWarRewardData.begin(); iter!=m_pGuildWarRewardData.end(); ++iter)
|
|
{
|
|
TGuildWarRewardData* pRewardData = (*iter);
|
|
if( pRewardData->cType == cType && pRewardData->cClass == cClass )
|
|
return pRewardData;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
// CollectionBook
|
|
bool CDNGameDataManager::LoadCollectionBookData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TCOLLECTIONBOOK );
|
|
}
|
|
else
|
|
{
|
|
pTable = GetDNTable( CDnTableDB::TCOLLECTIONBOOK );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TCOLLECTIONBOOK );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"collectionbooktable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log(LogType::_FILELOG, L"collectionbooktable.dnt Count(%d)\r\n", pTable->GetItemCount());
|
|
//return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapCollectionBookData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
std::vector<int> _Appellation;
|
|
int _RewardAppellation;
|
|
#if defined(PRE_MOD_APPELLATIONBOOK_RENEWAL)
|
|
int _MailID[2];
|
|
#endif // #if defined(PRE_MOD_APPELLATIONBOOK_RENEWAL)
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
for (int k = 0; k < CollectionAppellationMax; k++)
|
|
{
|
|
sprintf_s(szTemp, "_Appellation%d", k + 1);
|
|
sFieldNum._Appellation.push_back(pTable->GetFieldNum(szTemp));
|
|
}
|
|
sFieldNum._RewardAppellation = pTable->GetFieldNum("_Reward");
|
|
#if defined(PRE_MOD_APPELLATIONBOOK_RENEWAL)
|
|
sFieldNum._MailID[0] = pTable->GetFieldNum("_Mail1");
|
|
sFieldNum._MailID[1] = pTable->GetFieldNum("_Mail2");
|
|
#endif // #if defined(PRE_MOD_APPELLATIONBOOK_RENEWAL)
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pTable->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pTable->GetItemID(i);
|
|
int iIdx = pTable->GetIDXprimary( nItemID );
|
|
|
|
TCollectionBookData Data;
|
|
memset( &Data, 0, sizeof(TCollectionBookData) );
|
|
#if defined(PRE_MOD_APPELLATIONBOOK_RENEWAL)
|
|
int nRewardAppellationID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._RewardAppellation )->GetInteger();
|
|
Data.nRewardAppellationArrayIndex = ( nRewardAppellationID < 1 ) ? -1 : GetAppellationArrayIndex( nRewardAppellationID );
|
|
#endif // #if defined(PRE_MOD_APPELLATIONBOOK_RENEWAL)
|
|
Data.nID = nItemID;
|
|
for( int k=0; k<CollectionAppellationMax; k++ )
|
|
{
|
|
int nAppellationID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Appellation[k] )->GetInteger();
|
|
if (nAppellationID > 0)
|
|
{
|
|
#if defined(PRE_MOD_APPELLATIONBOOK_RENEWAL)
|
|
TMapAppellationData::iterator iter = m_MapAppellationData.find(nAppellationID);
|
|
if (iter == m_MapAppellationData.end())
|
|
{
|
|
//俊矾. 妮泛记 莫龋甫 掘扁 困茄 炼扒俊 乐瘤父 角力 单捞磐俊 绝绰 版快烙
|
|
g_Log.Log(LogType::_FILELOG, L"Error! LoadCollectionBookData() - CollectionID : %d, NotData AppellationID : %d\n", Data.nID, nAppellationID);
|
|
continue;
|
|
}
|
|
//拿泛记合 莫龋甫 裙垫窍扁 困茄 炼扒捞 登绰 莫龋俊霸 沥焊 历厘
|
|
iter->second.nUseCollectionBookIndex.push_back(Data.nID);
|
|
Data.nVecAppellationArrayIndex.push_back(GetAppellationArrayIndex(nAppellationID));
|
|
}
|
|
}
|
|
Data.nMailID[0] = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._MailID[0])->GetInteger();
|
|
Data.nMailID[1] = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._MailID[1])->GetInteger();
|
|
#else
|
|
Data.nVecAppellationArrayIndex.push_back(GetAppellationArrayIndex(nAppellationID));
|
|
}
|
|
}
|
|
|
|
int nRewardAppellationID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._RewardAppellation )->GetInteger();
|
|
Data.nRewardAppellationArrayIndex = ( nRewardAppellationID < 1 ) ? -1 : GetAppellationArrayIndex( nRewardAppellationID );
|
|
#endif // #if defined(PRE_MOD_APPELLATIONBOOK_RENEWAL)
|
|
m_MapCollectionBookData.insert( make_pair( nItemID, Data ) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TCollectionBookData *CDNGameDataManager::GetCollectionBookData(int nID)
|
|
{
|
|
TMapCollectionBook::iterator iter = m_MapCollectionBookData.find(nID);
|
|
if (iter == m_MapCollectionBookData.end()) return NULL;
|
|
return &(iter->second);
|
|
}
|
|
|
|
// Tax
|
|
bool CDNGameDataManager::LoadTaxData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TTAX );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TTAX );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TTAX );
|
|
#endif //#ifdef _WORK
|
|
if (!pSox){
|
|
g_Log.Log(LogType::_FILELOG, L"TaxTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pSox->GetItemCount() <= 0){
|
|
g_Log.Log(LogType::_FILELOG, L"TaxTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PVEC( m_pTaxData );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _TaxSort;
|
|
int _LevelS;
|
|
int _LevelE;
|
|
int _AmountS;
|
|
int _AmountE;
|
|
int _Rate;
|
|
int _TaxAmount;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._TaxSort = pSox->GetFieldNum( "_TaxSort" );
|
|
sFieldNum._LevelS = pSox->GetFieldNum( "_LevelS" );
|
|
sFieldNum._LevelE = pSox->GetFieldNum( "_LevelE" );
|
|
sFieldNum._AmountS = pSox->GetFieldNum( "_AmountS" );
|
|
sFieldNum._AmountE = pSox->GetFieldNum( "_AmountE" );
|
|
sFieldNum._Rate = pSox->GetFieldNum( "_Rate" );
|
|
sFieldNum._TaxAmount = pSox->GetFieldNum( "_TaxAmount" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TTaxData* pTaxData = new TTaxData;
|
|
memset(pTaxData, 0, sizeof(TTaxData));
|
|
|
|
int iIdx = pSox->GetIDXprimary( pSox->GetItemID(i) );
|
|
|
|
pTaxData->cTaxType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._TaxSort )->GetInteger();
|
|
pTaxData->nLevelStart = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._LevelS )->GetInteger();
|
|
pTaxData->nLevelEnd = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._LevelE )->GetInteger();
|
|
pTaxData->nAmountStart = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._AmountS )->GetInteger();
|
|
pTaxData->nAmountEnd = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._AmountE )->GetInteger();
|
|
pTaxData->fRate = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Rate )->GetFloat();
|
|
pTaxData->nTaxAmount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._TaxAmount )->GetInteger();
|
|
|
|
m_pTaxData.push_back(pTaxData);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
float CDNGameDataManager::GetTaxRate(int nTaxType, int nLevel, INT64 nPrice)
|
|
{
|
|
for (int i = 0; i <(int)m_pTaxData.size(); i++){
|
|
if (m_pTaxData[i]->cTaxType != nTaxType) continue;
|
|
|
|
int nGold = (int)(nPrice / 10000);
|
|
if ((m_pTaxData[i]->nLevelStart > nLevel) ||(m_pTaxData[i]->nLevelEnd < nLevel)) continue;
|
|
if ((m_pTaxData[i]->nAmountStart > nGold) ||(m_pTaxData[i]->nAmountEnd < nGold)) continue;
|
|
|
|
return m_pTaxData[i]->fRate;
|
|
}
|
|
|
|
return 0.f;
|
|
}
|
|
|
|
int CDNGameDataManager::GetTaxAmount(int nTaxType, int nLevel, INT64 nPrice)
|
|
{
|
|
for (int i = 0; i <(int)m_pTaxData.size(); i++){
|
|
if (m_pTaxData[i]->cTaxType != nTaxType) continue;
|
|
|
|
int nGold = (int)(nPrice / 10000);
|
|
if ((m_pTaxData[i]->nLevelStart > nLevel) ||(m_pTaxData[i]->nLevelEnd < nLevel)) continue;
|
|
#if defined(PRE_ADD_SERVER_WAREHOUSE)
|
|
if( nPrice > 0)
|
|
#endif // #if defined(PRE_ADD_SERVER_WAREHOUSE)
|
|
{
|
|
if ((m_pTaxData[i]->nAmountStart > nGold) ||(m_pTaxData[i]->nAmountEnd < nGold)) continue;
|
|
}
|
|
return m_pTaxData[i]->nTaxAmount;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
INT64 CDNGameDataManager::CalcTax(int nTaxType, int nLevel, INT64 nPrice)
|
|
{
|
|
float fTaxRate = GetTaxRate(nTaxType, nLevel, nPrice);
|
|
return(INT64)(nPrice * fTaxRate + 0.5f);
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadSealData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TSEALCOUNT );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TSEALCOUNT );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TSEALCOUNT );
|
|
#endif //#ifdef _WORK
|
|
if (!pSox){
|
|
g_Log.Log(LogType::_FILELOG, L"SealCountTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PVEC( m_pSealCountData );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH] = { 0, };
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _Type1;
|
|
int _Type2;
|
|
std::vector<int> _Level;
|
|
std::vector<int> _SuccessRate;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._Type1 = pSox->GetFieldNum( "_Type1" );
|
|
sFieldNum._Type2 = pSox->GetFieldNum( "_Type2" );
|
|
sFieldNum._Level.reserve(SEALENCHANTMAX);
|
|
for (int j = 0; j < SEALENCHANTMAX; ++j){
|
|
sprintf_s(szTemp, "_Count%d", j);
|
|
sFieldNum._Level.push_back(pSox->GetFieldNum(szTemp));
|
|
sprintf_s(szTemp, "_SuccessRate%d", j);
|
|
sFieldNum._SuccessRate.push_back(pSox->GetFieldNum(szTemp));
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TSealCountData* pSealCountData = new TSealCountData;
|
|
memset(pSealCountData, 0, sizeof(TSealCountData));
|
|
|
|
int iIdx = pSox->GetIDXprimary( pSox->GetItemID(i) );
|
|
|
|
pSealCountData->nType1 = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Type1 )->GetInteger();
|
|
pSealCountData->nType2 = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Type2 )->GetInteger();
|
|
|
|
for (int j = 0; j < SEALENCHANTMAX; j++){
|
|
pSealCountData->nLevel[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Level[j] )->GetInteger();
|
|
}
|
|
if (pSealCountData->nType1 == 2){
|
|
for (int k = 0; k < SEALENCHANTMAX; k++)
|
|
pSealCountData->cSuccessRate[k] = (char)(( pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SuccessRate[k] )->GetFloat() + 0.0001f ) * 100.f );
|
|
}
|
|
|
|
m_pSealCountData.push_back(pSealCountData);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetTotalSealNeeds(int nTypeParam, int nType2, char cItemLevel)
|
|
{
|
|
for (int i = 0; i <(int)m_pSealCountData.size(); i++){
|
|
if (m_pSealCountData[i]->nType1 != nTypeParam) continue;
|
|
if (m_pSealCountData[i]->nType2 != nType2) continue;
|
|
if (SEALENCHANTMAX <= cItemLevel) continue;
|
|
|
|
return m_pSealCountData[i]->nLevel[cItemLevel];
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
char CDNGameDataManager::GetSealSuccessRate(int nTypeParam, int nType2, char cItemLevel)
|
|
{
|
|
for (int i = 0; i <(int)m_pSealCountData.size(); i++){
|
|
if (m_pSealCountData[i]->nType1 != nTypeParam) continue;
|
|
if (m_pSealCountData[i]->nType2 != nType2) continue;
|
|
if (SEALENCHANTMAX <= cItemLevel) continue;
|
|
|
|
return m_pSealCountData[i]->cSuccessRate[cItemLevel];
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadPCBangData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPCCAFE );
|
|
}
|
|
else
|
|
{
|
|
pSox = GetDNTable( CDnTableDB::TPCCAFE );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TPCCAFE );
|
|
#endif //#ifdef _WORK
|
|
if (!pSox){
|
|
g_Log.Log(LogType::_FILELOG, L"PCCafeTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pSox->GetItemCount() <= 0){
|
|
g_Log.Log(LogType::_FILELOG, L"PCCafeTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapPCBangData, m_pPCBangData );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _Type;
|
|
int _PCParam[PCParamMax];
|
|
int _PremiumPCParam[PCParamMax];
|
|
int _GoldPCParam[PCParamMax];
|
|
int _SilverPCParam[PCParamMax];
|
|
int _RedPCParam[PCParamMax];
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._Type = pSox->GetFieldNum( "_Type" );
|
|
sFieldNum._PCParam[0] = pSox->GetFieldNum( "_PCParam1" );
|
|
sFieldNum._PCParam[1] = pSox->GetFieldNum( "_PCParam2" );
|
|
sFieldNum._PremiumPCParam[0] = pSox->GetFieldNum( "_PremiumPCParam1" );
|
|
sFieldNum._PremiumPCParam[1] = pSox->GetFieldNum( "_PremiumPCParam2" );
|
|
sFieldNum._GoldPCParam[0] = pSox->GetFieldNum( "_GoldPCParam1" );
|
|
sFieldNum._GoldPCParam[1] = pSox->GetFieldNum( "_GoldPCParam2" );
|
|
sFieldNum._SilverPCParam[0] = pSox->GetFieldNum( "_SilverPCParam1" );
|
|
sFieldNum._SilverPCParam[1] = pSox->GetFieldNum( "_SilverPCParam2" );
|
|
sFieldNum._RedPCParam[0] = pSox->GetFieldNum( "_RedPCParam1" );
|
|
sFieldNum._RedPCParam[1] = pSox->GetFieldNum( "_RedPCParam2" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
int iIdx = pSox->GetIDXprimary( pSox->GetItemID(i) );
|
|
int nType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Type )->GetInteger();
|
|
|
|
TPCBangData *pPCBangData = GetPCBangData(nType);
|
|
if (!pPCBangData){
|
|
pPCBangData = new TPCBangData;
|
|
pPCBangData->cType = nType;
|
|
m_pPCBangData.insert(make_pair(nType, pPCBangData));
|
|
}
|
|
|
|
TPCBangParam Normal = {0,}, Premium = {0,}, Gold = {0,}, Silver = {0,}, Red = {0,};
|
|
for (int j = 0; j < PCParamMax; j++){
|
|
Normal.nParam[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._PCParam[j] )->GetInteger();
|
|
Premium.nParam[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._PremiumPCParam[j] )->GetInteger();
|
|
Gold.nParam[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._GoldPCParam[j] )->GetInteger();
|
|
Silver.nParam[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SilverPCParam[j] )->GetInteger();
|
|
Red.nParam[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._RedPCParam[j] )->GetInteger();
|
|
}
|
|
if (Normal.nParam[0] > 0)
|
|
pPCBangData->VecPCBangParam.push_back(Normal);
|
|
if (Premium.nParam[0] > 0)
|
|
pPCBangData->VecPremiumPCBangParam.push_back(Premium);
|
|
if (Gold.nParam[0] > 0)
|
|
pPCBangData->VecGoldPCBangParam.push_back(Gold);
|
|
if (Silver.nParam[0] > 0)
|
|
pPCBangData->VecSilverPCBangParam.push_back(Silver);
|
|
if (Red.nParam[0] > 0)
|
|
pPCBangData->VecRedPCBangParam.push_back(Red);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetPCBangDataCount()
|
|
{
|
|
return (int)m_pPCBangData.size();
|
|
}
|
|
|
|
TPCBangData *CDNGameDataManager::GetPCBangData(int nPCBangType)
|
|
{
|
|
if (m_pPCBangData.empty()) return NULL;
|
|
|
|
TMapPCBangData::iterator iter = m_pPCBangData.find(nPCBangType);
|
|
if (iter == m_pPCBangData.end()) return NULL;
|
|
|
|
return iter->second;
|
|
}
|
|
|
|
int CDNGameDataManager::GetPCBangParam1(int nPCBangType, int nPCBangGrade)
|
|
{
|
|
TPCBangData *pPCBangData = GetPCBangData(nPCBangType);
|
|
if (!pPCBangData) return 0;
|
|
|
|
int nValue = 0;
|
|
switch (nPCBangGrade)
|
|
{
|
|
case PCBang::Grade::None: // 乔揪规捞电 酒聪电 扁夯蔼篮 持绢拎具窃(老馆俊辑 乔揪规 艾阑锭 蔼 掘绢客具窃)
|
|
case PCBang::Grade::Normal:
|
|
{
|
|
if (!pPCBangData->VecPCBangParam.empty())
|
|
nValue = pPCBangData->VecPCBangParam[0].nParam[0];
|
|
}
|
|
break;
|
|
|
|
case PCBang::Grade::Premium:
|
|
{
|
|
if (!pPCBangData->VecPremiumPCBangParam.empty())
|
|
nValue = pPCBangData->VecPremiumPCBangParam[0].nParam[0];
|
|
}
|
|
break;
|
|
|
|
case PCBang::Grade::Gold:
|
|
{
|
|
if (!pPCBangData->VecGoldPCBangParam.empty())
|
|
nValue = pPCBangData->VecGoldPCBangParam[0].nParam[0];
|
|
}
|
|
break;
|
|
|
|
case PCBang::Grade::Silver:
|
|
{
|
|
if (!pPCBangData->VecSilverPCBangParam.empty())
|
|
nValue = pPCBangData->VecSilverPCBangParam[0].nParam[0];
|
|
}
|
|
break;
|
|
|
|
case PCBang::Grade::Red:
|
|
{
|
|
if (!pPCBangData->VecRedPCBangParam.empty())
|
|
nValue = pPCBangData->VecRedPCBangParam[0].nParam[0];
|
|
}
|
|
break;
|
|
}
|
|
|
|
return nValue;
|
|
}
|
|
|
|
int CDNGameDataManager::GetPCBangParam2(int nPCBangType, int nPCBangGrade)
|
|
{
|
|
TPCBangData *pPCBangData = GetPCBangData(nPCBangType);
|
|
if (!pPCBangData) return 0;
|
|
|
|
int nValue = 0;
|
|
switch (nPCBangGrade)
|
|
{
|
|
case PCBang::Grade::None: // 乔揪规捞电 酒聪电 扁夯蔼篮 持绢拎具窃(老馆俊辑 乔揪规 艾阑锭 蔼 掘绢客具窃)
|
|
case PCBang::Grade::Normal:
|
|
{
|
|
if (!pPCBangData->VecPCBangParam.empty())
|
|
nValue = pPCBangData->VecPCBangParam[0].nParam[1];
|
|
}
|
|
break;
|
|
|
|
case PCBang::Grade::Premium:
|
|
{
|
|
if (!pPCBangData->VecPremiumPCBangParam.empty())
|
|
nValue = pPCBangData->VecPremiumPCBangParam[0].nParam[1];
|
|
}
|
|
break;
|
|
|
|
case PCBang::Grade::Gold:
|
|
{
|
|
if (!pPCBangData->VecGoldPCBangParam.empty())
|
|
nValue = pPCBangData->VecGoldPCBangParam[0].nParam[1];
|
|
}
|
|
break;
|
|
|
|
case PCBang::Grade::Silver:
|
|
{
|
|
if (!pPCBangData->VecSilverPCBangParam.empty())
|
|
nValue = pPCBangData->VecSilverPCBangParam[0].nParam[1];
|
|
}
|
|
break;
|
|
|
|
case PCBang::Grade::Red:
|
|
{
|
|
if (!pPCBangData->VecRedPCBangParam.empty())
|
|
nValue = pPCBangData->VecRedPCBangParam[0].nParam[1];
|
|
}
|
|
break;
|
|
}
|
|
|
|
return nValue;
|
|
}
|
|
|
|
int CDNGameDataManager::GetPCBangNestClearCount(int nPCBangGrade, int nMapID)
|
|
{
|
|
TPCBangData *pPCBangData = GetPCBangData(PCBang::Type::NestClearCount);
|
|
if (!pPCBangData) return 0;
|
|
|
|
int nClearCount = 0;
|
|
switch (nPCBangGrade)
|
|
{
|
|
case PCBang::Grade::None:
|
|
break;
|
|
|
|
case PCBang::Grade::Normal:
|
|
{
|
|
if (!pPCBangData->VecPCBangParam.empty()){
|
|
for (int i = 0; i < (int)pPCBangData->VecPCBangParam.size(); i++){
|
|
if (pPCBangData->VecPCBangParam[i].nParam[0] == nMapID){
|
|
nClearCount = pPCBangData->VecPCBangParam[i].nParam[1];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case PCBang::Grade::Premium:
|
|
{
|
|
if (!pPCBangData->VecPremiumPCBangParam.empty()){
|
|
for (int i = 0; i < (int)pPCBangData->VecPremiumPCBangParam.size(); i++){
|
|
if (pPCBangData->VecPremiumPCBangParam[i].nParam[0] == nMapID){
|
|
nClearCount = pPCBangData->VecPremiumPCBangParam[i].nParam[1];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case PCBang::Grade::Gold:
|
|
{
|
|
if (!pPCBangData->VecGoldPCBangParam.empty()){
|
|
for (int i = 0; i < (int)pPCBangData->VecGoldPCBangParam.size(); i++){
|
|
if (pPCBangData->VecGoldPCBangParam[i].nParam[0] == nMapID){
|
|
nClearCount = pPCBangData->VecGoldPCBangParam[i].nParam[1];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case PCBang::Grade::Silver:
|
|
{
|
|
if (!pPCBangData->VecSilverPCBangParam.empty()){
|
|
for (int i = 0; i < (int)pPCBangData->VecSilverPCBangParam.size(); i++){
|
|
if (pPCBangData->VecSilverPCBangParam[i].nParam[0] == nMapID){
|
|
nClearCount = pPCBangData->VecSilverPCBangParam[i].nParam[1];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case PCBang::Grade::Red:
|
|
{
|
|
if (!pPCBangData->VecRedPCBangParam.empty()){
|
|
for (int i = 0; i < (int)pPCBangData->VecRedPCBangParam.size(); i++){
|
|
if (pPCBangData->VecRedPCBangParam[i].nParam[0] == nMapID){
|
|
nClearCount = pPCBangData->VecRedPCBangParam[i].nParam[1];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
return nClearCount;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetPCBangClearBoxFlag(int nPCBangGrade)
|
|
{
|
|
if (nPCBangGrade == PCBang::Grade::None) return false;
|
|
|
|
int nValue = GetPCBangParam1(PCBang::Type::ClearBox, nPCBangGrade);
|
|
return (nValue == 1) ? true : false;
|
|
}
|
|
|
|
bool CDNGameDataManager::CheckPcbangAppellation(int nAppllationIndex)
|
|
{
|
|
TPCBangData *pData = GetPCBangData(PCBang::Type::Appellation);
|
|
if (!pData) return false;
|
|
|
|
if (!pData->VecPCBangParam.empty()){
|
|
for (int i = 0; i < (int)pData->VecPCBangParam.size(); i++){
|
|
if (GetAppellationArrayIndex(pData->VecPCBangParam[i].nParam[0]) == nAppllationIndex)
|
|
return true;
|
|
}
|
|
}
|
|
if (!pData->VecPremiumPCBangParam.empty()){
|
|
for (int i = 0; i < (int)pData->VecPremiumPCBangParam.size(); i++){
|
|
if (GetAppellationArrayIndex(pData->VecPremiumPCBangParam[i].nParam[0]) == nAppllationIndex)
|
|
return true;
|
|
}
|
|
}
|
|
if (!pData->VecGoldPCBangParam.empty()){
|
|
for (int i = 0; i < (int)pData->VecGoldPCBangParam.size(); i++){
|
|
if (GetAppellationArrayIndex(pData->VecGoldPCBangParam[i].nParam[0]) == nAppllationIndex)
|
|
return true;
|
|
}
|
|
}
|
|
if (!pData->VecSilverPCBangParam.empty()){
|
|
for (int i = 0; i < (int)pData->VecSilverPCBangParam.size(); i++){
|
|
if (GetAppellationArrayIndex(pData->VecSilverPCBangParam[i].nParam[0]) == nAppllationIndex)
|
|
return true;
|
|
}
|
|
}
|
|
if (!pData->VecRedPCBangParam.empty()){
|
|
for (int i = 0; i < (int)pData->VecRedPCBangParam.size(); i++){
|
|
if (GetAppellationArrayIndex(pData->VecRedPCBangParam[i].nParam[0]) == nAppllationIndex)
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// CashShop
|
|
bool CDNGameDataManager::LoadCashCommodityData(bool bReload)
|
|
{
|
|
DNTableFileFormat *pSox = NULL;
|
|
#ifdef _WORK
|
|
if (bReload || m_bAllLoaded)
|
|
#else //#ifdef _WORK
|
|
if (bReload)
|
|
#endif //#ifdef _WORK
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TCASHCOMMODITY );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TCASHCOMMODITY );
|
|
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"CashCommodity.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"CashCommodity.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
//归诀侩 牧抛捞呈 积己
|
|
TMapCashCommodityData pBackupCashCommodityData;
|
|
#ifdef _WORK
|
|
if (bReload || m_bAllLoaded)
|
|
#else //#ifdef _WORK
|
|
if (bReload)
|
|
#endif //#ifdef _WORK
|
|
{
|
|
//府肺靛扼搁 牧抛捞呈 归诀秦滴绊 牧抛捞呈甫 厚款促.
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
pBackupCashCommodityData = m_pCashCommodityData;
|
|
m_pCashCommodityData.clear();
|
|
}
|
|
|
|
char szTemp[MAX_PATH] = { 0, };
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _SN;
|
|
#if defined(_JP)
|
|
int _SNJPN;
|
|
#endif // #if defined(_JP)
|
|
int _Category;
|
|
int _SubCategory;
|
|
std::vector<int> _ItemID;
|
|
std::vector<int> _LinkSN;
|
|
int _Period;
|
|
int _Price;
|
|
int _Count;
|
|
int _Priority;
|
|
int _OnSale;
|
|
int _State;
|
|
int _Limit;
|
|
int _ReserveGive;
|
|
int _Reserve;
|
|
int _validity;
|
|
int _ReserveAble;
|
|
int _PresentAble;
|
|
int _ItemSort;
|
|
int _PriceFix;
|
|
int _CartAble;
|
|
#if defined(PRE_ADD_VIP)
|
|
int _VIPSell;
|
|
int _VIPLevel;
|
|
int _Pay;
|
|
int _PaySale;
|
|
int _VIPPoint;
|
|
#endif // #if defined(PRE_ADD_VIP)
|
|
int _OverlapBuy;
|
|
#if defined(PRE_ADD_CASH_REFUND)
|
|
int _NoRefund;
|
|
#endif
|
|
#if defined(PRE_ADD_CASHSHOP_CREDIT)
|
|
int _CreditAble;
|
|
int _CreditAbleLV;
|
|
#endif // #if defined(PRE_ADD_CASHSHOP_CREDIT)
|
|
#if defined(PRE_ADD_SALE_COUPON)
|
|
int _UseCoupon;
|
|
#endif
|
|
#if defined( PRE_ADD_NEW_MONEY_SEED )
|
|
int _SeedAble;
|
|
int _Seed;
|
|
int _SeedGive;
|
|
#endif
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._SN = pSox->GetFieldNum("_SN");
|
|
#if defined(_JP)
|
|
sFieldNum._SNJPN = pSox->GetFieldNum("_SNJPN");
|
|
#endif // #if defined(_JP)
|
|
sFieldNum._Category = pSox->GetFieldNum("_Category");
|
|
sFieldNum._SubCategory = pSox->GetFieldNum("_SubCategory");
|
|
sFieldNum._ItemID.reserve(COMMODITYITEMMAX);
|
|
for (int j = 0; j < COMMODITYITEMMAX; ++j){
|
|
sprintf_s(szTemp, "_ItemID%02d", j + 1);
|
|
sFieldNum._ItemID.push_back(pSox->GetFieldNum(szTemp));
|
|
}
|
|
sFieldNum._LinkSN.reserve(COMMODITYLINKMAX);
|
|
for (int j = 0; j < COMMODITYLINKMAX; ++j){
|
|
sprintf_s(szTemp, "_LinkSN%02d", j + 1);
|
|
sFieldNum._LinkSN.push_back(pSox->GetFieldNum(szTemp));
|
|
}
|
|
sFieldNum._Period = pSox->GetFieldNum("_Period");
|
|
sFieldNum._Price = pSox->GetFieldNum("_Price");
|
|
sFieldNum._Count = pSox->GetFieldNum("_Count");
|
|
sFieldNum._Priority = pSox->GetFieldNum("_Priority");
|
|
sFieldNum._OnSale = pSox->GetFieldNum("_OnSale");
|
|
sFieldNum._State = pSox->GetFieldNum("_State");
|
|
sFieldNum._Limit = pSox->GetFieldNum("_Limit");
|
|
sFieldNum._ReserveGive = pSox->GetFieldNum("_ReserveGive");
|
|
sFieldNum._Reserve = pSox->GetFieldNum("_Reserve");
|
|
sFieldNum._validity = pSox->GetFieldNum("_validity");
|
|
sFieldNum._ReserveAble = pSox->GetFieldNum("_ReserveAble");
|
|
sFieldNum._PresentAble = pSox->GetFieldNum("_PresentAble");
|
|
sFieldNum._ItemSort = pSox->GetFieldNum("_ItemSort");
|
|
sFieldNum._PriceFix = pSox->GetFieldNum("_PriceFix");
|
|
sFieldNum._CartAble = pSox->GetFieldNum("_CartAble");
|
|
#if defined(PRE_ADD_VIP)
|
|
sFieldNum._VIPSell = pSox->GetFieldNum("_VIPSell");
|
|
sFieldNum._VIPLevel = pSox->GetFieldNum("_VIPLevel");
|
|
sFieldNum._Pay = pSox->GetFieldNum("_Pay");
|
|
sFieldNum._PaySale = pSox->GetFieldNum("_PaySale");
|
|
sFieldNum._VIPPoint = pSox->GetFieldNum("_VIPPoint");
|
|
#endif // #if defined(PRE_ADD_VIP)
|
|
sFieldNum._OverlapBuy = pSox->GetFieldNum("_OverlapBuy");
|
|
#if defined(PRE_ADD_CASH_REFUND)
|
|
sFieldNum._NoRefund = pSox->GetFieldNum("_NoRefund");
|
|
#endif
|
|
#if defined(PRE_ADD_CASHSHOP_CREDIT)
|
|
sFieldNum._CreditAble = pSox->GetFieldNum("_CreditAble");
|
|
sFieldNum._CreditAbleLV = pSox->GetFieldNum("_CreditAbleLV");
|
|
#endif // #if defined(PRE_ADD_CASHSHOP_CREDIT)
|
|
#if defined(PRE_ADD_SALE_COUPON)
|
|
sFieldNum._UseCoupon = pSox->GetFieldNum("_UseCoupon");
|
|
#endif
|
|
#if defined( PRE_ADD_NEW_MONEY_SEED )
|
|
sFieldNum._SeedAble = pSox->GetFieldNum("_SeedAble");
|
|
sFieldNum._Seed = pSox->GetFieldNum("_Seed");
|
|
sFieldNum._SeedGive = pSox->GetFieldNum("_SeedGive");
|
|
#endif
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
char *pStr = NULL, Dest[256] = {0,};
|
|
int nJob = 0;
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); i++){
|
|
TCashCommodityData *pCashData = new TCashCommodityData;
|
|
//2010.10.7 haling STL 焊龋 困秦 积己磊肺 函券
|
|
//memset(pCashData, 0, sizeof(TCashCommodityData));
|
|
|
|
int nID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nID);
|
|
|
|
pCashData->nSN = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SN)->GetInteger();
|
|
#if defined(_JP)
|
|
pCashData->strJPSN = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SNJPN)->GetString();
|
|
#endif // #if defined(_JP)
|
|
pCashData->cCategory = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Category)->GetInteger();
|
|
pCashData->nSubCategory = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SubCategory)->GetInteger();
|
|
|
|
for (int j = 0; j < COMMODITYITEMMAX; j++){
|
|
pCashData->nItemID[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ItemID[j])->GetInteger();
|
|
}
|
|
|
|
for (int j = 0; j < COMMODITYLINKMAX; j++){
|
|
pCashData->nLinkSN[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._LinkSN[j])->GetInteger();
|
|
}
|
|
|
|
pCashData->wPeriod = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Period)->GetInteger();
|
|
pCashData->nPrice = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Price)->GetInteger();
|
|
pCashData->nCount = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Count)->GetInteger();
|
|
pCashData->nPriority = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Priority)->GetInteger();
|
|
pCashData->bOnSale = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._OnSale)->GetInteger() ? true : false;
|
|
pCashData->cState = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._State)->GetInteger();
|
|
pCashData->bLimit = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Limit)->GetInteger() ? true : false;
|
|
pCashData->bReserveGive = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ReserveGive)->GetInteger() ? true : false;
|
|
pCashData->nReserve = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Reserve)->GetInteger();
|
|
pCashData->nValidity = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._validity)->GetInteger();
|
|
pCashData->bReserveAble = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ReserveAble)->GetInteger() ? true : false;
|
|
pCashData->bPresentAble = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PresentAble)->GetInteger() ? true : false;
|
|
pCashData->cItemSort = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ItemSort)->GetInteger();
|
|
pCashData->nPriceFix = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PriceFix)->GetInteger();
|
|
pCashData->bCartAble = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._CartAble)->GetInteger() ? true : false;
|
|
|
|
#if defined(PRE_ADD_VIP)
|
|
pCashData->bVIPSell = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VIPSell)->GetInteger() ? true : false;
|
|
pCashData->nVIPLevel = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VIPLevel)->GetInteger();
|
|
pCashData->bAutomaticPay = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Pay)->GetInteger() ? true : false;
|
|
pCashData->nAutomaticPaySale = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PaySale)->GetInteger();
|
|
pCashData->nVIPPoint = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VIPPoint)->GetInteger();
|
|
#endif // #if defined(PRE_ADD_VIP)
|
|
pCashData->nOverlapBuy = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._OverlapBuy)->GetInteger();
|
|
#if defined(PRE_ADD_CASH_REFUND)
|
|
pCashData->bNoRefund = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._NoRefund)->GetInteger() ? true : false;
|
|
#endif
|
|
#if defined(PRE_ADD_CASHSHOP_CREDIT)
|
|
pCashData->bCreditAble = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._CreditAble)->GetInteger() ? true : false;
|
|
pCashData->nCreditAbleLevel = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._CreditAbleLV)->GetInteger();
|
|
#endif // #if defined(PRE_ADD_CASHSHOP_CREDIT)
|
|
#if defined(PRE_ADD_SALE_COUPON)
|
|
pCashData->bUseCoupon = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._UseCoupon)->GetInteger() ? true : false;
|
|
#endif //#if defined(PRE_ADD_SALE_COUPON)
|
|
#if defined( PRE_ADD_NEW_MONEY_SEED )
|
|
pCashData->bSeedAble = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SeedAble)->GetInteger() ? true : false;
|
|
pCashData->bSeedGive = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SeedGive)->GetInteger() ? true : false;
|
|
if( pCashData->bSeedGive )
|
|
pCashData->nSeed = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Seed)->GetInteger();
|
|
#endif
|
|
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
std::pair<TMapCashCommodityData::iterator, bool> Ret = m_pCashCommodityData.insert(make_pair(pCashData->nSN, pCashData));
|
|
if (Ret.second == false) delete pCashData;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (bReload || m_bAllLoaded)
|
|
#else //#ifdef _WORK
|
|
if (bReload)
|
|
#endif //#ifdef _WORK
|
|
{
|
|
//扁粮狼 单捞磐甫 瘤款促.
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
SAFE_DELETE_PMAP(TMapCashCommodityData, pBackupCashCommodityData);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetCashCommodityData(int nSN, TCashCommodityData &Data)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
TMapCashCommodityData::iterator iter = m_pCashCommodityData.find(nSN);
|
|
if (m_pCashCommodityData.end() != iter)
|
|
{
|
|
Data = *(*iter).second;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int CDNGameDataManager::GetCashCommodityPrice(int nSN)
|
|
{
|
|
TCashCommodityData CashData;
|
|
if (!GetCashCommodityData(nSN, CashData)) return 0;
|
|
|
|
return CashData.nPrice;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsReserveCommodity(int nSN)
|
|
{
|
|
TCashCommodityData CashData;
|
|
if (!GetCashCommodityData(nSN, CashData)) return false;
|
|
|
|
return CashData.bReserveAble;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsPresentCommodity(int nSN)
|
|
{
|
|
TCashCommodityData CashData;
|
|
if (!GetCashCommodityData(nSN, CashData)) return false;
|
|
|
|
return CashData.bPresentAble;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsLimitCommodity(int nSN)
|
|
{
|
|
TCashCommodityData CashData;
|
|
if (!GetCashCommodityData(nSN, CashData)) return false;
|
|
|
|
return CashData.bLimit;
|
|
}
|
|
|
|
int CDNGameDataManager::GetCashCommodityPeriod(int nSN)
|
|
{
|
|
TCashCommodityData CashData;
|
|
if (!GetCashCommodityData(nSN, CashData)) return 0;
|
|
|
|
return CashData.wPeriod;
|
|
}
|
|
|
|
int CDNGameDataManager::GetCashCommodityCount(int nSN)
|
|
{
|
|
TCashCommodityData CashData;
|
|
if (!GetCashCommodityData(nSN, CashData)) return 0;
|
|
|
|
return CashData.nCount;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsValidCashCommodityItemID(int nItemSN, int nItemID)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
TMapCashCommodityData::iterator iter = m_pCashCommodityData.find(nItemSN);
|
|
if (m_pCashCommodityData.end() != iter)
|
|
{
|
|
for (int i = 0; i < COMMODITYITEMMAX; i++)
|
|
{
|
|
if ((*iter).second->nItemID[i] == nItemID)
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
#if defined(PRE_ADD_VIP)
|
|
|
|
int CDNGameDataManager::GetCashCommodityVIPPoint(int nSN)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
TMapCashCommodityData::iterator iter = m_pCashCommodityData.find(nSN);
|
|
if (m_pCashCommodityData.end() != iter)
|
|
return(*iter).second->nVIPPoint;
|
|
return 0;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetCashCommodityPay(int nSN)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
TMapCashCommodityData::iterator iter = m_pCashCommodityData.find(nSN);
|
|
if (m_pCashCommodityData.end() != iter)
|
|
return(*iter).second->bAutomaticPay;
|
|
return false;
|
|
}
|
|
|
|
int CDNGameDataManager::GetCashCommodityVIPAutomaticPaySalePrice(int nSN)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
TMapCashCommodityData::iterator iter = m_pCashCommodityData.find(nSN);
|
|
if (m_pCashCommodityData.end() != iter)
|
|
return(*iter).second->nPrice -(int)((*iter).second->nPrice *(*iter).second->nAutomaticPaySale / 100);
|
|
return 0;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsVIPSell(int nSN)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
TMapCashCommodityData::iterator iter = m_pCashCommodityData.find(nSN);
|
|
if (m_pCashCommodityData.end() != iter)
|
|
return(*iter).second->bVIPSell;
|
|
return false;
|
|
}
|
|
|
|
int CDNGameDataManager::GetCashCommodityVIPLevel(int nSN)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
TMapCashCommodityData::iterator iter = m_pCashCommodityData.find(nSN);
|
|
if (m_pCashCommodityData.end() != iter)
|
|
return(*iter).second->nVIPLevel;
|
|
return 0;
|
|
}
|
|
|
|
#endif // #if defined(PRE_ADD_VIP)
|
|
|
|
int CDNGameDataManager::GetCashCommodityItem0(int nSN)
|
|
{
|
|
TCashCommodityData CashData;
|
|
if (!GetCashCommodityData(nSN, CashData)) return 0;
|
|
|
|
return CashData.nItemID[0];
|
|
}
|
|
|
|
int CDNGameDataManager::GetCashCommodityOverlapBuy(int nSN)
|
|
{
|
|
TCashCommodityData CashData;
|
|
if (!GetCashCommodityData(nSN, CashData)) return 0;
|
|
|
|
return CashData.nOverlapBuy;
|
|
}
|
|
|
|
int CDNGameDataManager::GetCashCommodityItemIDCount(int nSN)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
TMapCashCommodityData::iterator iter = m_pCashCommodityData.find(nSN);
|
|
if (m_pCashCommodityData.end() != iter)
|
|
{
|
|
int nRet = 0;
|
|
for( int i=0; i<COMMODITYITEMMAX; i++)
|
|
{
|
|
if ((*iter).second->nItemID[i] > 0)
|
|
nRet++;
|
|
}
|
|
return nRet;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
bool CDNGameDataManager::CheckCashSNItemID(int nItemSN, int nItemID)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
TMapCashCommodityData::iterator iter = m_pCashCommodityData.find(nItemSN);
|
|
if (m_pCashCommodityData.end() != iter)
|
|
{
|
|
for( int i=0; i<COMMODITYITEMMAX; i++)
|
|
{
|
|
if ((*iter).second->nItemID[i] == nItemID )
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
#if defined(PRE_ADD_CASH_REFUND)
|
|
bool CDNGameDataManager::GetCashCommodityNoRefund(int nID, int nSN)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
TCashCommodityData * pCashData = NULL;
|
|
TMapCashCommodityData::iterator iter = m_pCashCommodityData.find(nSN);
|
|
if (m_pCashCommodityData.end() != iter)
|
|
pCashData = (*iter).second;
|
|
|
|
bool bResult;
|
|
if (!pCashData)
|
|
{
|
|
bResult = true; // 阂啊瓷..
|
|
return bResult;
|
|
}
|
|
|
|
bResult = pCashData->bNoRefund;
|
|
if( !bResult ) // 券阂 啊瓷老锭 鸥涝栏肺 茄锅 歹 犬牢窍磊..扁裙评 角荐 规瘤..
|
|
{
|
|
switch(GetItemMainType(nID))
|
|
{
|
|
case ITEMTYPE_REBIRTH_COIN :
|
|
case ITEMTYPE_INVENTORY_SLOT :
|
|
case ITEMTYPE_WAREHOUSE_SLOT :
|
|
case ITEMTYPE_GESTURE :
|
|
case ITEMTYPE_GUILDWARE_SLOT :
|
|
case ITEMTYPE_FARM_VIP:
|
|
case ITEMTYPE_GLYPH_SLOT:
|
|
case ITEMTYPE_PERIOD_PLATE:
|
|
bResult = true;
|
|
break;
|
|
}
|
|
}
|
|
return bResult;
|
|
}
|
|
#endif
|
|
|
|
#if defined(PRE_ADD_CASHSHOP_CREDIT)
|
|
bool CDNGameDataManager::GetCashCommodityCreditAble(int nSN)
|
|
{
|
|
TCashCommodityData CashData;
|
|
if (!GetCashCommodityData(nSN, CashData)) return false;
|
|
|
|
return CashData.bCreditAble;
|
|
}
|
|
|
|
int CDNGameDataManager::GetCashCommodityCreditAbleLevel(int nSN)
|
|
{
|
|
TCashCommodityData CashData;
|
|
if (!GetCashCommodityData(nSN, CashData)) return false;
|
|
|
|
return CashData.nCreditAbleLevel;
|
|
}
|
|
#endif // #if defined(PRE_ADD_CASHSHOP_CREDIT)
|
|
#if defined(PRE_ADD_SALE_COUPON)
|
|
bool CDNGameDataManager::IsSaleCouponByItem(int nSN)
|
|
{
|
|
TCashCommodityData CashData;
|
|
if (!GetCashCommodityData(nSN, CashData)) return false;
|
|
|
|
return CashData.bUseCoupon;
|
|
}
|
|
#endif
|
|
|
|
#if defined(PRE_ADD_NEW_MONEY_SEED)
|
|
bool CDNGameDataManager::IsSeedCommodity(int nSN)
|
|
{
|
|
TCashCommodityData CashData;
|
|
if (!GetCashCommodityData(nSN, CashData)) return false;
|
|
|
|
return CashData.bSeedAble;
|
|
}
|
|
#endif
|
|
|
|
bool CDNGameDataManager::LoadCashPackageData(bool bReload)
|
|
{
|
|
DNTableFileFormat *pSox = NULL;
|
|
#ifdef _WORK
|
|
if (bReload || m_bAllLoaded)
|
|
#else //#ifdef _WORK
|
|
if (bReload)
|
|
#endif //#ifdef _WORK
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TCASHPACKAGE );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TCASHPACKAGE );
|
|
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"CashPackage.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"CashPackage.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
//归诀侩 牧抛捞呈 积己
|
|
TMapCashPackageData pBackupCashPackageData;
|
|
#ifdef _WORK
|
|
if (bReload || m_bAllLoaded)
|
|
#else //#ifdef _WORK
|
|
if (bReload)
|
|
#endif //#ifdef _WORK
|
|
{
|
|
//府肺靛扼搁 牧抛捞呈 归诀秦滴绊 牧抛捞呈甫 厚款促.
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
pBackupCashPackageData = m_pCashPackageData;
|
|
m_pCashPackageData.clear();
|
|
}
|
|
|
|
char szTemp[MAX_PATH] = { 0, };
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _SN;
|
|
std::vector<int> _CommodityID;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._SN = pSox->GetFieldNum("_SN");
|
|
sFieldNum._CommodityID.reserve(PACKAGEITEMMAX);
|
|
for (int j = 0; j < PACKAGEITEMMAX; ++j){
|
|
sprintf_s(szTemp, "_CommodityID%02d", j);
|
|
sFieldNum._CommodityID.push_back(pSox->GetFieldNum(szTemp));
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); i++){
|
|
TCashPackageData *pCashData = new TCashPackageData;
|
|
//2010.10.7 haling STL 焊龋 困秦 积己磊肺 函券
|
|
//memset(pCashData, 0, sizeof(TCashPackageData));
|
|
|
|
int nID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nID);
|
|
|
|
pCashData->nSN = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SN)->GetInteger();
|
|
|
|
for (int j = 0; j < PACKAGEITEMMAX; j++){
|
|
int nItemSN = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._CommodityID[j])->GetInteger();
|
|
if (nItemSN > 0)
|
|
pCashData->nVecCommoditySN.push_back(nItemSN);
|
|
}
|
|
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
std::pair<TMapCashPackageData::iterator,bool> Ret = m_pCashPackageData.insert(make_pair(pCashData->nSN, pCashData));
|
|
if (Ret.second == false) delete pCashData;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (bReload || m_bAllLoaded)
|
|
#else //#ifdef _WORK
|
|
if (bReload)
|
|
#endif //#ifdef _WORK
|
|
{
|
|
//扁粮狼 单捞磐甫 瘤款促.
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
SAFE_DELETE_PMAP(TMapCashPackageData, pBackupCashPackageData);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetCashPackageData(int nSN, TCashPackageData &Data)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
TMapCashPackageData::iterator iter = m_pCashPackageData.find(nSN);
|
|
if (iter != m_pCashPackageData.end())
|
|
{
|
|
Data = *(*iter).second;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsCashPackageData(int nSN)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
TMapCashPackageData::iterator iter = m_pCashPackageData.find(nSN);
|
|
if (iter != m_pCashPackageData.end()) return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetCashCommodityItemSNListByPackage(int nPackageSN, std::vector<DBPacket::TItemSNIDOption> &VecItemSNIDList)
|
|
{
|
|
TCashPackageData Package;
|
|
if (!GetCashPackageData(nPackageSN, Package)) return false;
|
|
if (Package.nVecCommoditySN.empty()) return false;
|
|
if (VecItemSNIDList.empty()) return false;
|
|
if (Package.nVecCommoditySN.size() != VecItemSNIDList.size()) return false;
|
|
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
TCashCommodityData CashData;
|
|
for (int i = 0; i < (int)Package.nVecCommoditySN.size(); i++){
|
|
if (VecItemSNIDList[i].nItemSN > 0) continue;
|
|
|
|
memset(&CashData, 0, sizeof(TCashCommodityData));
|
|
bool bRet = GetCashCommodityData(Package.nVecCommoditySN[i], CashData);
|
|
if (!bRet) continue;
|
|
|
|
for (int j = 0; j < COMMODITYITEMMAX; j++){
|
|
if (CashData.nItemID[j] == VecItemSNIDList[i].nItemID){
|
|
VecItemSNIDList[i].nItemSN = CashData.nSN;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetCashPackageCount(int nPackageSN)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
TMapCashPackageData::iterator iter = m_pCashPackageData.find(nPackageSN);
|
|
if (iter != m_pCashPackageData.end())
|
|
(int)(*iter).second->nVecCommoditySN.size();
|
|
return 0;
|
|
}
|
|
|
|
#if defined(PRE_ADD_VIP)
|
|
// 吝惫 VIP
|
|
bool CDNGameDataManager::LoadVIPData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TVIP );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TVIP );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TVIP );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox ) {
|
|
g_Log.Log(LogType::_FILELOG, L"VIPTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 ) {
|
|
g_Log.Log(LogType::_FILELOG, L"VIPTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PVEC(m_pVecVIPData);
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH] = { 0, };
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _VipID; // VIPTable俊辑狼 ID
|
|
int _MonthItem; // 某矫 酒捞袍 惑前 逞滚(30老 搬力矫 茄锅 林扁)
|
|
std::vector<int> _MailID; // 焊尘 皋老甸
|
|
int _AutoPay;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._VipID = pSox->GetFieldNum("_VipID");
|
|
sFieldNum._MonthItem = pSox->GetFieldNum("_MonthItem");
|
|
sFieldNum._MailID.reserve(4);
|
|
for (int j = 0; j < 4; ++j){
|
|
sprintf_s(szTemp, "_MailID%d", j + 1);
|
|
sFieldNum._MailID.push_back(pSox->GetFieldNum(szTemp));
|
|
}
|
|
sFieldNum._AutoPay = pSox->GetFieldNum("_AutoPay");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); i++){
|
|
TVIPData *pVIPData = new TVIPData;
|
|
memset(pVIPData, 0, sizeof(TVIPData));
|
|
|
|
int nID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nID);
|
|
|
|
pVIPData->nVipID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VipID)->GetInteger();
|
|
pVIPData->nMonthItemSN = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._MonthItem)->GetInteger();
|
|
|
|
for (int j = 0; j < 4; j++){
|
|
pVIPData->nMailID[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._MailID[j])->GetInteger();
|
|
}
|
|
|
|
pVIPData->nAutoPayItemSN = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._AutoPay)->GetInteger();
|
|
|
|
m_pVecVIPData.push_back(pVIPData);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TVIPData *CDNGameDataManager::GetVIPData()
|
|
{
|
|
if (m_pVecVIPData.empty()) return NULL;
|
|
return m_pVecVIPData[0];
|
|
}
|
|
|
|
int CDNGameDataManager::GetVIPAutoPayItemSN()
|
|
{
|
|
if (m_pVecVIPData.empty()) return 0;
|
|
return m_pVecVIPData[0]->nAutoPayItemSN;
|
|
}
|
|
|
|
int CDNGameDataManager::GetVIP7DaysLeftMailID()
|
|
{
|
|
if (m_pVecVIPData.empty()) return 0;
|
|
return m_pVecVIPData[0]->nMailID[0];
|
|
}
|
|
|
|
int CDNGameDataManager::GetVIP1DayLeftMailID()
|
|
{
|
|
if (m_pVecVIPData.empty()) return 0;
|
|
return m_pVecVIPData[0]->nMailID[1];
|
|
}
|
|
|
|
int CDNGameDataManager::GetVIPCloseMailID()
|
|
{
|
|
if (m_pVecVIPData.empty()) return 0;
|
|
return m_pVecVIPData[0]->nMailID[2];
|
|
}
|
|
|
|
int CDNGameDataManager::GetVIPShortCashMailID()
|
|
{
|
|
if (m_pVecVIPData.empty()) return 0;
|
|
return m_pVecVIPData[0]->nMailID[3];
|
|
}
|
|
|
|
#endif // #if defined(PRE_ADD_VIP)
|
|
|
|
bool CDNGameDataManager::LoadDarkLairMapData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TDLMAP );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TDLMAP );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TDLMAP );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox ) {
|
|
g_Log.Log(LogType::_FILELOG, L"DLMapTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
if(pSox->GetItemCount() <= 0){
|
|
g_Log.Log(LogType::_FILELOG, L"DLMapTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapDLMapData, m_pDLMapTable );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _TotalRound;
|
|
int _FloorCount;
|
|
|
|
#if defined( PRE_ADD_CHALLENGE_DARKLAIR )
|
|
int _ChallengeType;
|
|
#endif // #if defined( PRE_ADD_CHALLENGE_DARKLAIR )
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._TotalRound = pSox->GetFieldNum( "_StageCount" );
|
|
sFieldNum._FloorCount = pSox->GetFieldNum( "_FloorCount" );
|
|
|
|
#if defined( PRE_ADD_CHALLENGE_DARKLAIR )
|
|
sFieldNum._ChallengeType = pSox->GetFieldNum( "_ChallengeType" );
|
|
#endif // #if defined( PRE_ADD_CHALLENGE_DARKLAIR )
|
|
|
|
// Load
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TDLMapData *pMapData = new TDLMapData;
|
|
memset( pMapData, 0, sizeof(TDLMapData) );
|
|
|
|
int nItemID = pSox->GetItemID(i);
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
pMapData->nTotalRound = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._TotalRound )->GetInteger();
|
|
pMapData->nFloor = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._FloorCount )->GetInteger();
|
|
|
|
#if defined( PRE_ADD_CHALLENGE_DARKLAIR )
|
|
pMapData->bChallengeDarkLair = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ChallengeType )->GetInteger() == 0 ? false : true;
|
|
#endif // #if defined( PRE_ADD_CHALLENGE_DARKLAIR )
|
|
|
|
m_pDLMapTable.insert( make_pair( nItemID, pMapData ) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
const TDLMapData *CDNGameDataManager::GetDLMapData( int nItemID )
|
|
{
|
|
TMapDLMapData::iterator it = m_pDLMapTable.find( nItemID );
|
|
if( it == m_pDLMapTable.end() ) return NULL;
|
|
|
|
return it->second;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadDarkLairClearData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TDLDUNGEONCLEAR );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TDLDUNGEONCLEAR );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TDLDUNGEONCLEAR );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox ) {
|
|
g_Log.Log(LogType::_FILELOG, L"DLStageClearTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
if (pSox->GetItemCount() <= 0){
|
|
g_Log.Log(LogType::_FILELOG, L"DLStageClearTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAPF( TMapDLClearData, m_pDLClearTable, SAFE_DELETE_PVEC( TMapDLClearData_iter->second->pVecClearItem ) );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _ClearTableID;
|
|
int _LevelMin;
|
|
int _LevelMax;
|
|
int _RoundMin;
|
|
int _RoundMax;
|
|
int _RewardExperience;
|
|
int _ShowBoxCount;
|
|
int _SelectBoxCount;
|
|
int _TreasureBoxRatio[4];
|
|
int _RewardItemID[4];
|
|
int _ReturnWorldID;
|
|
int _ReturnWorldGateID;
|
|
int _RewardGP;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._ClearTableID = pSox->GetFieldNum( "_ClearTableID" );
|
|
sFieldNum._LevelMin = pSox->GetFieldNum( "_FromLevel" );
|
|
sFieldNum._LevelMax = pSox->GetFieldNum( "_ToLevel" );
|
|
sFieldNum._RoundMin = pSox->GetFieldNum( "_FromRound" );
|
|
sFieldNum._RoundMax = pSox->GetFieldNum( "_ToRound" );
|
|
sFieldNum._RewardExperience = pSox->GetFieldNum( "_ClearRewardExp" );
|
|
sFieldNum._ShowBoxCount = pSox->GetFieldNum( "_ShowBoxNum" );
|
|
sFieldNum._SelectBoxCount = pSox->GetFieldNum( "_SelectBoxNum" );
|
|
static char *szBoxStr[] = { "_Bronze", "_Silver", "_Gold", "_Platinum" };
|
|
char szLabel[32];
|
|
for( int i=0; i<4; i++ ) {
|
|
sprintf_s( szLabel, "%sTreasureBoxRatioDL", szBoxStr[i] );
|
|
sFieldNum._TreasureBoxRatio[i] = pSox->GetFieldNum( szLabel );
|
|
sprintf_s( szLabel, "%sItemTableID", szBoxStr[i] );
|
|
sFieldNum._RewardItemID[i] = pSox->GetFieldNum( szLabel );
|
|
}
|
|
sFieldNum._ReturnWorldID = pSox->GetFieldNum( "_ReturnWorldID" );
|
|
sFieldNum._ReturnWorldGateID = pSox->GetFieldNum( "_ReturnWorldStartPos" );
|
|
sFieldNum._RewardGP = pSox->GetFieldNum( "_RewardGP" );
|
|
|
|
// Load
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TDLClearDataItem *pData = new TDLClearDataItem;
|
|
memset( pData, 0, sizeof(TDLClearDataItem) );
|
|
|
|
int nItemID = pSox->GetItemID(i);
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
int nClearTablEID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ClearTableID )->GetInteger();
|
|
pData->nLevelMin = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._LevelMin )->GetInteger();
|
|
pData->nLevelMax = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._LevelMax )->GetInteger();
|
|
pData->nRoundMin = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._RoundMin )->GetInteger();
|
|
pData->nRoundMax = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._RoundMax )->GetInteger();
|
|
pData->nRewardExperience = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._RewardExperience )->GetInteger();
|
|
pData->nShowBoxCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ShowBoxCount )->GetInteger();
|
|
pData->nSelectBoxCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SelectBoxCount )->GetInteger();
|
|
for( int j=0; j<4; j++ ) {
|
|
pData->cTreasureBoxRatio[j] = (char)(( pSox->GetFieldFromLablePtr( iIdx, sFieldNum._TreasureBoxRatio[j] )->GetFloat() + 0.0001f ) * 100.f );
|
|
pData->nRewardItemID[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._RewardItemID[j] )->GetInteger();
|
|
}
|
|
pData->nReturnWorldSetID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ReturnWorldID )->GetInteger();
|
|
pData->nReturnWorldGateID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ReturnWorldGateID )->GetInteger();
|
|
pData->nRewardGP = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._RewardGP )->GetInteger();
|
|
|
|
TMapDLClearData::iterator it = m_pDLClearTable.find( nClearTablEID );
|
|
if( it != m_pDLClearTable.end() ) {
|
|
it->second->pVecClearItem.push_back( pData );
|
|
}
|
|
else {
|
|
TDLClearData *pClearData = new TDLClearData;
|
|
pClearData->pVecClearItem.push_back( pData );
|
|
m_pDLClearTable.insert( make_pair( nClearTablEID, pClearData ) );
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TDLClearDataItem *CDNGameDataManager::GetDLClearData( int nItemID, int nLevel, int nRound )
|
|
{
|
|
TMapDLClearData::iterator it = m_pDLClearTable.find( nItemID );
|
|
if( it == m_pDLClearTable.end() ) return NULL;
|
|
|
|
TDLClearDataItem *pItem;
|
|
for( DWORD i=0; i<it->second->pVecClearItem.size(); i++ ) {
|
|
pItem = it->second->pVecClearItem[i];
|
|
if( nLevel >= pItem->nLevelMin && nLevel <= pItem->nLevelMax && nRound >= pItem->nRoundMin && nRound <= pItem->nRoundMax ) return pItem;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetCreateDefaultSkill( char cClassID, int* aDefaultSkills )
|
|
{
|
|
if( !aDefaultSkills )
|
|
return false;
|
|
|
|
map<int, TDefaultCreateData>::iterator iter = m_mapDefaultCreateData.find( cClassID );
|
|
if( m_mapDefaultCreateData.end() == iter )
|
|
return false;
|
|
|
|
|
|
memcpy( aDefaultSkills, iter->second.nDefaultSkillID, sizeof(int) * DEFAULTSKILLMAX );
|
|
return true;
|
|
}
|
|
|
|
|
|
#ifdef PRE_ADD_GACHA_JAPAN
|
|
bool CDNGameDataManager::LoadGachaData_JP( void )
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TGACHA_JP );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TGACHA_JP );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGACHA_JP );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"GachaJp.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"GachaJp.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
// return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP( TMapGachaData_JP, m_mapGachaData );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _GachaNum;
|
|
int _LinkedDrop[ CASHEQUIPMAX ];
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
SecureZeroMemory( &sFieldNum, sizeof(TempFieldNum) );
|
|
|
|
sFieldNum._GachaNum = pSox->GetFieldNum( "_GachaNum" );
|
|
sFieldNum._LinkedDrop[ CASHEQUIP_HELMET ] = pSox->GetFieldNum( "_LinkedDrop1" );
|
|
sFieldNum._LinkedDrop[ CASHEQUIP_BODY ] = pSox->GetFieldNum( "_LinkedDrop2" );
|
|
sFieldNum._LinkedDrop[ CASHEQUIP_LEG ] = pSox->GetFieldNum( "_LinkedDrop3" );
|
|
sFieldNum._LinkedDrop[ CASHEQUIP_HAND ] = pSox->GetFieldNum( "_LinkedDrop4" );
|
|
sFieldNum._LinkedDrop[ CASHEQUIP_FOOT ] = pSox->GetFieldNum( "_LinkedDrop5" );
|
|
sFieldNum._LinkedDrop[ CASHEQUIP_NECKLACE ] = pSox->GetFieldNum( "_LinkedDrop6" );
|
|
|
|
// Load
|
|
for( int iIndex = 0; iIndex < pSox->GetItemCount(); )
|
|
{
|
|
TGachaponData_JP* pData = NULL;
|
|
|
|
int iItemID = pSox->GetItemID( iIndex );
|
|
int iIdx = pSox->GetIDXprimary( iItemID );
|
|
int nGachaShopIndex = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._GachaNum )->GetInteger();
|
|
|
|
if( m_mapGachaData.end() == m_mapGachaData.find( nGachaShopIndex ) )
|
|
{
|
|
m_mapGachaData[ nGachaShopIndex ] = new TGachaponData_JP;
|
|
SecureZeroMemory( m_mapGachaData[ nGachaShopIndex ], sizeof(TGachaponData_JP) );
|
|
}
|
|
|
|
TGachaponData_JP* pGachaponData= m_mapGachaData[ nGachaShopIndex ];
|
|
pGachaponData->nGachaponIndex = nGachaShopIndex;
|
|
|
|
// 流诀 牢郸胶 鉴辑措肺 4俺 蔼捞 乐澜. 酒墨单雇 眠啊登搁 5俺. 风橇 牢郸胶绰 1何磐 矫累茄促.
|
|
for( int nClassID = 1; nClassID <= CLASSKINDMAX; ++nClassID )
|
|
{
|
|
#ifdef PRE_FIX_LOAD_GACHA_DATA
|
|
// 泅犁 1瞒何磐 15瞒鳖瘤绰 CLASS:4 / 16瞒何磐绰 CLASS:5 肺 甸绢啊 乐澜. 辑滚绰 阿 瞒荐狼 单捞磐甫 傈何 佬绢林绰 屈侥栏肺 登绢乐绢 酒贰 内靛啊 乐瘤 臼栏搁 index啊 剐府绰 泅惑 惯积.
|
|
int nGachaponTableId = pSox->GetItemID(iIndex);
|
|
int iCurGachaponIDXPrimary = pSox->GetIDXprimary( nGachaponTableId );
|
|
int nCurGachaShopIndex = pSox->GetFieldFromLablePtr( iCurGachaponIDXPrimary, sFieldNum._GachaNum )->GetInteger();
|
|
if (nCurGachaShopIndex != nGachaShopIndex)
|
|
break;
|
|
#endif
|
|
|
|
TGachaponShopInfoByJob_JP& GachaShopInfoByJob = pGachaponData->GachaponShopInfo[ nClassID-1 ];
|
|
GachaShopInfoByJob.nGachaponIndex = nGachaShopIndex;
|
|
GachaShopInfoByJob.nGachaponTableID = pSox->GetItemID( iIndex );
|
|
GachaShopInfoByJob.nJobClassID = nClassID;
|
|
|
|
for( int nPart = CASHEQUIPMIN; nPart < CASHEQUIPMAX; ++nPart )
|
|
{
|
|
// 泅犁鳖瘤绰 格吧捞 鳖瘤父 抛捞喉捞 沥狼登绢乐促. 眠饶俊 抛捞喉捞 荐沥登搁 鞍捞 荐沥秦拎具 窃.
|
|
if( CASHEQUIP_NECKLACE < nPart )
|
|
break;
|
|
|
|
iItemID = pSox->GetItemID( iIndex );
|
|
iIdx = pSox->GetIDXprimary( iItemID );
|
|
GachaShopInfoByJob.nPartsLinkDropTableID[ nPart ] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._LinkedDrop[ nPart ] )->GetInteger();
|
|
}
|
|
|
|
++iIndex;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TGachaponData_JP* CDNGameDataManager::GetGachaponData_JP( int nGachaShopID )
|
|
{
|
|
TMapGachaData_JP::iterator iter = m_mapGachaData.find( nGachaShopID );
|
|
if( m_mapGachaData.end() != iter )
|
|
return iter->second;
|
|
|
|
return NULL;
|
|
}
|
|
#endif // PRE_ADD_GACHA_JAPAN
|
|
|
|
bool CDNGameDataManager::LoadLevelupEvent()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TLEVELUPEVENT );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TLEVELUPEVENT );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TLEVELUPEVENT );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox ) {
|
|
g_Log.Log(LogType::_FILELOG, L"LevelupEventTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 ) {
|
|
g_Log.Log(LogType::_FILELOG, L"LevelupEventTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
// return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PVEC(m_pVecLevelupEvent);
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH] = { 0, };
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _PCLevel;
|
|
int _ClassID;
|
|
int _Job;
|
|
int _EventType;
|
|
int _MailID;
|
|
int _CashMailID;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._PCLevel = pSox->GetFieldNum("_PCLevel");
|
|
sFieldNum._ClassID = pSox->GetFieldNum("_ClassID");
|
|
sFieldNum._Job = pSox->GetFieldNum("_Job");
|
|
sFieldNum._EventType = pSox->GetFieldNum("_EventType");
|
|
|
|
sFieldNum._MailID = pSox->GetFieldNum("_MailID");
|
|
sFieldNum._CashMailID = pSox->GetFieldNum("_CashMailID");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); i++){
|
|
TLevelupEvent *pLevelupEvent = new TLevelupEvent;
|
|
//2010.10.7 haling STL 焊龋 困秦 积己磊肺 函券
|
|
//memset(pLevelupEvent, 0, sizeof(TLevelupEvent));
|
|
|
|
int nID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nID);
|
|
|
|
pLevelupEvent->nLevel = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PCLevel)->GetInteger();
|
|
pLevelupEvent->cClassID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ClassID)->GetInteger();
|
|
pLevelupEvent->cJob = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Job)->GetInteger();
|
|
pLevelupEvent->nEventType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._EventType)->GetInteger();
|
|
pLevelupEvent->nMailID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._MailID)->GetInteger();
|
|
pLevelupEvent->nCashMailID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._CashMailID)->GetInteger();
|
|
|
|
m_pVecLevelupEvent.push_back(pLevelupEvent);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void CDNGameDataManager::GetLevelupEvent(int nLevel, int nClass, int nJob, std::vector<TLevelupEvent*> &VecEventList)
|
|
{
|
|
VecEventList.clear();
|
|
if(m_pVecLevelupEvent.empty()) return;
|
|
|
|
for (int i = 0; i <(int)m_pVecLevelupEvent.size(); i++){
|
|
if (m_pVecLevelupEvent[i]->nLevel != nLevel) continue;
|
|
if( m_pVecLevelupEvent[i]->cJob > 0 )
|
|
{
|
|
if( m_pVecLevelupEvent[i]->cJob != nJob )
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if ((m_pVecLevelupEvent[i]->cClassID != 0) && (m_pVecLevelupEvent[i]->cClassID != nClass))
|
|
continue; // classid 0捞搁 葛滴 器窃
|
|
}
|
|
|
|
VecEventList.push_back(m_pVecLevelupEvent[i]);
|
|
}
|
|
}
|
|
|
|
bool CDNGameDataManager::GetLevelupEventbyType(int nLevel, TLevelupEvent::eEventType eType, TLevelupEvent &Event)
|
|
{
|
|
//酒坷 部芬秦~ 汗蓖蜡历 包访秦辑 漂沥 皋老酒捞叼 笛镑捞 绝绢辑 咯扁俊 持栏继翠聪促. 鸥涝3锅 饭骇诀抛捞喉阑 佬扁绰 窍瘤父 汗蓖蜡历 捞亥飘侩烙!
|
|
//鸥涝栏肺 佬绢辑 荤侩秦具茄促搁 快霖全揪客 捞具扁 秦具窃
|
|
if (m_pVecLevelupEvent.empty()) return false;
|
|
for (int i = 0; i <(int)m_pVecLevelupEvent.size(); i++)
|
|
{
|
|
if (m_pVecLevelupEvent[i]->nLevel != nLevel) continue;
|
|
if (m_pVecLevelupEvent[i]->nEventType == eType)
|
|
{
|
|
Event = *m_pVecLevelupEvent[i];
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadPromotionData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TLEVELPROMO );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TLEVELPROMO );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TLEVELPROMO );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox ) {
|
|
g_Log.Log(LogType::_FILELOG, L"WelfareTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
g_Log.Log(LogType::_FILELOG, L"WelfareTable.dnt Count(%d)\r\n", pSox->GetItemCount());
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PVEC( m_vLvPromotion );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); i++)
|
|
{
|
|
TPromotionData * pPromo = new TPromotionData;
|
|
memset(pPromo, 0, sizeof(TPromotionData));
|
|
|
|
pPromo->nID = pSox->GetItemID(i);
|
|
pPromo->nConditionType = pSox->GetFieldFromLablePtr(pPromo->nID, "_UserConditionType1")->GetInteger();
|
|
pPromo->nConditionValue = atoi(pSox->GetFieldFromLablePtr(pPromo->nID, "_UserConditionValue1")->GetString());
|
|
pPromo->nPromotionType = pSox->GetFieldFromLablePtr(pPromo->nID, "_RewardType1")->GetInteger();
|
|
float fTemp = (float)atof(pSox->GetFieldFromLablePtr(pPromo->nID, "_RewardValue1")->GetString());
|
|
pPromo->nRewardValue = (int)(fTemp * 100);
|
|
|
|
m_vLvPromotion.push_back(pPromo);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetPromotionCount()
|
|
{
|
|
return(int)m_vLvPromotion.size();
|
|
}
|
|
|
|
const TPromotionData * CDNGameDataManager::GetPromotionByIdx(int nIndex)
|
|
{
|
|
if( nIndex < 0 || nIndex >= (int)m_vLvPromotion.size() ) return NULL;
|
|
return m_vLvPromotion[nIndex];
|
|
}
|
|
|
|
const TPromotionData * CDNGameDataManager::GetPromotionByIID(int nID)
|
|
{
|
|
if (nID < 0 || m_vLvPromotion.empty()) return NULL;
|
|
TVecPromotion::iterator ii;
|
|
for(ii = m_vLvPromotion.begin(); ii != m_vLvPromotion.end(); ii++)
|
|
{
|
|
if ((*ii)->nID == nID)
|
|
return(*ii);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// ItemOptionTable(ItemOptionTable.dnt - TItemOptionTableData)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadItemOptionTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TITEMOPTION );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TITEMOPTION );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TITEMOPTION );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"ItemOption.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"ItemOption.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_ItemOptionTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int Enchant;
|
|
int Potential1;
|
|
int Potential2;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.Enchant = pSox->GetFieldNum( "_Enchant" );
|
|
sFieldNum.Potential1 = pSox->GetFieldNum( "_Potential1" );
|
|
sFieldNum.Potential2 = pSox->GetFieldNum( "_Potential2" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TItemOptionTableData Data;
|
|
int nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
Data.iEnchant = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Enchant )->GetInteger();
|
|
Data.iOption = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Potential1 )->GetInteger();
|
|
Data.iPotential = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Potential2 )->GetInteger();
|
|
|
|
m_ItemOptionTableData.insert( std::make_pair(nItemID,Data) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
const TItemOptionTableData* CDNGameDataManager::GetItemOptionTableData( int iItemID )
|
|
{
|
|
TMapItemOptionTableData::iterator itor = m_ItemOptionTableData.find( iItemID );
|
|
if( itor != m_ItemOptionTableData.end() )
|
|
return &itor->second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// CombinedShopTable(CombiedShopTable.dnt - TCombinedShopTableData)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadCombinedShopTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TCOMBINEDSHOP );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TCOMBINEDSHOP );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TCOMBINEDSHOP );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"CombinedShopTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"CombinedShopTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_CombinedShopTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int ShopID;
|
|
int TabID;
|
|
int ListID;
|
|
int ItemIndex;
|
|
int Quantity;
|
|
int PurchaseType[Shop::Max::PurchaseType];
|
|
int PurchaseItem[Shop::Max::PurchaseType];
|
|
int PurchaseItemValue[Shop::Max::PurchaseType];
|
|
int PurchaseLimitType;
|
|
int PurchaseLimitValue;
|
|
int buyLimitCount; // 备概 俺荐 力茄.
|
|
#if defined (PRE_ADD_COMBINEDSHOP_PERIOD)
|
|
int Period; // 扁埃力 酒捞袍
|
|
#endif
|
|
#if defined( PRE_ADD_LIMITED_SHOP )
|
|
int ShopLimitReset;
|
|
#endif
|
|
#if defined(PRE_SAMPLEITEMNPC)
|
|
int SampleID;
|
|
#endif // #if defined(PRE_SAMPLEITEMNPC)
|
|
};
|
|
|
|
char szBuf[MAX_PATH];
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.ShopID = pSox->GetFieldNum( "_ShopID" );
|
|
sFieldNum.TabID = pSox->GetFieldNum( "_TabID" );
|
|
sFieldNum.ListID = pSox->GetFieldNum( "_ListID" );
|
|
sFieldNum.ItemIndex = pSox->GetFieldNum( "_itemindex" );
|
|
sFieldNum.Quantity = pSox->GetFieldNum( "_Quantity" );
|
|
sFieldNum.PurchaseLimitType = pSox->GetFieldNum( "_PurchaseLimitType" );
|
|
sFieldNum.PurchaseLimitValue = pSox->GetFieldNum( "_PurchaseLimitValue" );
|
|
|
|
for( int i=1 ; i<=Shop::Max::PurchaseType ; ++i )
|
|
{
|
|
sprintf_s( szBuf, "_PurchaseType%d", i );
|
|
sFieldNum.PurchaseType[i-1] = pSox->GetFieldNum( szBuf );
|
|
sprintf_s( szBuf, "_PurchaseItem%d", i );
|
|
sFieldNum.PurchaseItem[i-1] = pSox->GetFieldNum( szBuf );
|
|
sprintf_s( szBuf, "_PurchaseItemValue%d", i );
|
|
sFieldNum.PurchaseItemValue[i-1] = pSox->GetFieldNum( szBuf );
|
|
}
|
|
sFieldNum.buyLimitCount = pSox->GetFieldNum( "_buyLimitCount" );
|
|
#if defined (PRE_ADD_COMBINEDSHOP_PERIOD)
|
|
sFieldNum.Period = pSox->GetFieldNum( "_Period" );
|
|
#endif
|
|
#if defined( PRE_ADD_LIMITED_SHOP )
|
|
sFieldNum.ShopLimitReset = pSox->GetFieldNum( "_ShopLimitReset" );
|
|
#endif
|
|
#if defined(PRE_SAMPLEITEMNPC)
|
|
sFieldNum.SampleID = pSox->GetFieldNum( "_SampleID" );
|
|
#endif // #if defined(PRE_SAMPLEITEMNPC)
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
std::vector<int> vAbuseItemID;
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TCombinedShopTableData Data;
|
|
memset( &Data, 0, sizeof(Data) );
|
|
|
|
int nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
int iShopID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.ShopID )->GetInteger();
|
|
if( iShopID <= 0 )
|
|
continue;
|
|
|
|
int iTabID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.TabID )->GetInteger();
|
|
int iListID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.ListID )->GetInteger();
|
|
Data.ShopItem.nItemID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.ItemIndex )->GetInteger();
|
|
Data.ShopItem.nCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Quantity )->GetInteger();
|
|
Data.ShopItem.buyLimitCount = pSox->GetFieldFromLablePtr(iIdx, sFieldNum.buyLimitCount)->GetInteger();
|
|
|
|
#if defined (PRE_ADD_COMBINEDSHOP_PERIOD)
|
|
Data.ShopItem.nPeriod = pSox->GetFieldFromLablePtr(iIdx, sFieldNum.Period)->GetInteger();
|
|
#endif
|
|
#if defined( PRE_ADD_LIMITED_SHOP )
|
|
Data.ShopItem.nShopLimitReset = pSox->GetFieldFromLablePtr(iIdx, sFieldNum.ShopLimitReset)->GetInteger();
|
|
#endif
|
|
const TItemData* pItemData = GetItemData( Data.ShopItem.nItemID );
|
|
if( !pItemData )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"CombinedShopTable.dnt ShopID:%d ItemID:%d Invalid\r\n", iShopID, Data.ShopItem.nItemID );
|
|
return false;
|
|
}
|
|
|
|
Data.ShopItem.nMaxCount = pItemData->nOverlapCount;
|
|
Data.PurchaseLimitType = static_cast<Shop::PurchaseLimitType::eCode>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PurchaseLimitType )->GetInteger());
|
|
Data.iPurchaseLimitValue = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PurchaseLimitValue )->GetInteger();
|
|
#if defined(PRE_SAMPLEITEMNPC)
|
|
Data.nSampleVersion = pSox->GetFieldFromLablePtr(iIdx, sFieldNum.SampleID)->GetInteger();
|
|
#endif // #if defined(PRE_SAMPLEITEMNPC)
|
|
|
|
for( int k=0 ; k<Shop::Max::PurchaseType ; ++k )
|
|
{
|
|
Data.PurchaseType[k].PurchaseType = static_cast<Shop::PurchaseType::eCode>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PurchaseType[k] )->GetInteger());
|
|
Data.PurchaseType[k].iPurchaseItemID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PurchaseItem[k] )->GetInteger();
|
|
Data.PurchaseType[k].iPurchaseItemValue = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PurchaseItemValue[k] )->GetInteger();
|
|
|
|
#if defined( PRE_UNIONSHOP_RENEWAL )
|
|
if( Data.PurchaseType[k].PurchaseType == Shop::PurchaseType::UnionPoint )
|
|
{
|
|
if( Data.PurchaseType[k].iPurchaseItemID < 0 || Data.PurchaseType[k].iPurchaseItemID >= NpcReputation::UnionType::Etc )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"CombinedShopTable.dnt ShopID:%d ItemID:%d UnionPoint PurchaseItemID:%d Error\r\n", iShopID, Data.ShopItem.nItemID, Data.PurchaseType[k].iPurchaseItemID );
|
|
return false;
|
|
}
|
|
}
|
|
#endif // #if defined( PRE_UNIONSHOP_RENEWAL )
|
|
|
|
if( Data.PurchaseType[k].PurchaseType == Shop::PurchaseType::Gold )
|
|
{
|
|
Data.ShopItem.nPrice = Data.PurchaseType[k].iPurchaseItemValue;
|
|
int nItemBuyPrice = Data.ShopItem.nPrice - (int)(Data.ShopItem.nPrice * MAX_ITEMPRICE_RATE);
|
|
if (pItemData->nSellAmount > nItemBuyPrice)
|
|
vAbuseItemID.push_back(nItemID);
|
|
}
|
|
|
|
// 吝汗 PurchaseType 八荤
|
|
if( k>0 && Data.PurchaseType[k].PurchaseType != Shop::PurchaseType::None )
|
|
{
|
|
for( int j=0 ; j<k ; ++j )
|
|
{
|
|
if( Data.PurchaseType[j].PurchaseType == Data.PurchaseType[k].PurchaseType )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"CombinedShopTable.dnt ShopID:%d ItemID:%d Duplicate PurchaseType\r\n", iShopID, Data.ShopItem.nItemID );
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
TMapCombinedShopTableData::iterator itor = m_CombinedShopTableData.find( std::tr1::make_tuple(iShopID,iTabID,iListID) );
|
|
if( itor == m_CombinedShopTableData.end() )
|
|
{
|
|
m_CombinedShopTableData.insert( std::make_pair(std::tr1::make_tuple(iShopID,iTabID,iListID),Data) );
|
|
}
|
|
else
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"CombinedShopTable.dnt ShopID:%d TabID:%d ListID:%d Duplicated\r\n", iShopID, iTabID, iListID );
|
|
return false;
|
|
}
|
|
|
|
{
|
|
std::map<int,int>::iterator itor = m_CombinedShopIndex.find( iShopID );
|
|
if( itor == m_CombinedShopIndex.end() )
|
|
{
|
|
m_CombinedShopIndex.insert( std::make_pair(iShopID,1) );
|
|
}
|
|
else
|
|
{
|
|
++(*itor).second;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (vAbuseItemID.size() > 0)
|
|
{
|
|
WCHAR szTemp[1024];
|
|
std::wstring szError = L"Invalid CombinedShopTable\n\n";
|
|
|
|
for(UINT i=0; i<vAbuseItemID.size(); i++)
|
|
{
|
|
swprintf_s( szTemp, L"ItemID : %d\n", vAbuseItemID[i] );
|
|
szError += szTemp;
|
|
}
|
|
|
|
MessageBox( NULL, szError.c_str(), L"Critical Error!!", MB_OK );
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
const TCombinedShopTableData* CDNGameDataManager::GetCombinedShopItemTableData( int iShopID, int iTabID, int iListID )
|
|
{
|
|
TMapCombinedShopTableData::iterator itor = m_CombinedShopTableData.find( std::tr1::make_tuple(iShopID,iTabID,iListID) );
|
|
if( itor != m_CombinedShopTableData.end() )
|
|
return &(*itor).second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsCombinedShop( int iShopID )
|
|
{
|
|
std::map<int,int>::iterator itor = m_CombinedShopIndex.find( iShopID );
|
|
if( itor != m_CombinedShopIndex.end() )
|
|
return((*itor).second>0);
|
|
|
|
return false;
|
|
}
|
|
|
|
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// ReputeTable(ReputeTable.dnt - TReputeTableData)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadReputeTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TREPUTE );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TREPUTE );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TREPUTE );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"ReputeTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"ReputeTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_ReputeTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int NpcID;
|
|
#if defined( PRE_ADD_REPUTATION_EXPOSURE )
|
|
int Mission;
|
|
int NpcPresentRepute1;
|
|
int NpcPresentRepute2;
|
|
int NpcPresentID1;
|
|
int NpcPresentID2;
|
|
#else
|
|
int QuestID;
|
|
#endif // #if defined( PRE_ADD_REPUTATION_EXPOSURE )
|
|
int MaxFavor;
|
|
int TakeFavor;
|
|
int MaxMalice;
|
|
int AddMalice;
|
|
int PresentID[6];
|
|
int FavorNpc;
|
|
int FavorGroupBomb;
|
|
int MaliceNpc;
|
|
int MaliceGroupBomb;
|
|
int MailID[NpcReputation::Common::MaxMailCount];
|
|
int MailRand[NpcReputation::Common::MaxMailCount];
|
|
int PlusItemID;
|
|
int PlusProb;
|
|
int UnionID;
|
|
int PresentPoint[6];
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.NpcID = pSox->GetFieldNum( "_NpcID" );
|
|
#if defined( PRE_ADD_REPUTATION_EXPOSURE )
|
|
sFieldNum.Mission = pSox->GetFieldNum( "_Mission" );
|
|
sFieldNum.NpcPresentRepute1 = pSox->GetFieldNum( "_NpcPresentRepute1" );
|
|
sFieldNum.NpcPresentRepute2 = pSox->GetFieldNum( "_NpcPresentRepute2" );
|
|
sFieldNum.NpcPresentID1 = pSox->GetFieldNum( "_NpcPresentID1" );
|
|
sFieldNum.NpcPresentID2 = pSox->GetFieldNum( "_NpcPresentID2" );
|
|
#else
|
|
sFieldNum.QuestID = pSox->GetFieldNum( "_QuestID2" );
|
|
#endif // #if defined( PRE_ADD_REPUTATION_EXPOSURE )
|
|
sFieldNum.MaxFavor = pSox->GetFieldNum( "_MaxFavor" );
|
|
sFieldNum.TakeFavor = pSox->GetFieldNum( "_TakeFavor" );
|
|
sFieldNum.MaxMalice = pSox->GetFieldNum( "_MaxMalice" );
|
|
sFieldNum.AddMalice = pSox->GetFieldNum( "_AddMalice" );
|
|
for( UINT i=0 ; i<_countof(sFieldNum.PresentID) ; ++i )
|
|
{
|
|
char szBuf[MAX_PATH];
|
|
sprintf_s( szBuf, "_PresentID%d", i+1 );
|
|
sFieldNum.PresentID[i] = pSox->GetFieldNum( szBuf );
|
|
}
|
|
for( UINT i=0 ; i<NpcReputation::Common::MaxMailCount ; ++i )
|
|
{
|
|
char szBuf[MAX_PATH];
|
|
sprintf_s( szBuf, "_MailID%d", i+1 );
|
|
sFieldNum.MailID[i] = pSox->GetFieldNum( szBuf );
|
|
sprintf_s( szBuf, "_Probability%d", i+1 );
|
|
sFieldNum.MailRand[i] = pSox->GetFieldNum( szBuf );
|
|
}
|
|
sFieldNum.FavorNpc = pSox->GetFieldNum( "_FavorNpc" );
|
|
sFieldNum.FavorGroupBomb = pSox->GetFieldNum( "_FavorGroupBomb" );
|
|
sFieldNum.MaliceNpc = pSox->GetFieldNum( "_MaliceNpc" );
|
|
sFieldNum.MaliceGroupBomb = pSox->GetFieldNum( "_MaliceGroupBomb" );
|
|
sFieldNum.PlusItemID = pSox->GetFieldNum( "_PlusItemID" );
|
|
sFieldNum.PlusProb = pSox->GetFieldNum( "_PlusProb" );
|
|
sFieldNum.UnionID = pSox->GetFieldNum( "_UnionID" );
|
|
for( UINT i=0 ; i<_countof(sFieldNum.PresentPoint) ; ++i )
|
|
{
|
|
char szBuf[MAX_PATH];
|
|
sprintf_s( szBuf, "_PresentPointID%d", i+1 );
|
|
sFieldNum.PresentPoint[i] = pSox->GetFieldNum( szBuf );
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TReputeTableData Data;
|
|
int nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
int iNpcID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.NpcID )->GetInteger();
|
|
if( iNpcID == 0 )
|
|
continue;
|
|
|
|
#if defined( PRE_ADD_REPUTATION_EXPOSURE )
|
|
Data.iMissionID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Mission )->GetInteger();
|
|
Data.iNpcPresentRepute1 = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.NpcPresentRepute1 )->GetInteger();
|
|
Data.iNpcPresentRepute2 = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.NpcPresentRepute2 )->GetInteger();
|
|
Data.iNpcPresentID1 = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.NpcPresentID1 )->GetInteger();
|
|
Data.iNpcPresentID2 = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.NpcPresentID2 )->GetInteger();
|
|
#else
|
|
std::vector<std::string> questTokens;
|
|
|
|
std::string szReputeClearQuestString = pSox->GetFieldFromLablePtr(iIdx, sFieldNum.QuestID)->GetString();
|
|
TokenizeA(szReputeClearQuestString, questTokens, ",");
|
|
|
|
std::vector<std::string>::iterator iter = questTokens.begin();
|
|
for(; iter != questTokens.end(); ++iter)
|
|
{
|
|
std::string& token = (*iter);
|
|
int questId = atoi(token.c_str());
|
|
Data.iQuestIDs.push_back(questId);
|
|
}
|
|
#endif // #if defined( PRE_ADD_REPUTATION_EXPOSURE )
|
|
|
|
Data.iMaxFavor = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MaxFavor )->GetInteger();
|
|
Data.iTakeFavorPerDay = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.TakeFavor )->GetInteger();
|
|
Data.iMaxMalice = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MaxMalice )->GetInteger();
|
|
Data.iAddMalicePerDay = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.AddMalice )->GetInteger();
|
|
for( UINT j=0 ; j<_countof(sFieldNum.PresentID) ; ++j )
|
|
Data.iPresentIDArr[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PresentID[j] )->GetInteger();
|
|
for( UINT j=0 ; j<NpcReputation::Common::MaxMailCount ; ++j )
|
|
{
|
|
Data.iMailID[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailID[j] )->GetInteger();
|
|
if( Data.iMailID[j] <= 0 )
|
|
break;
|
|
Data.iMailRand[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailRand[j] )->GetInteger();
|
|
|
|
if( Data.iMailRand[j] <= 0 || Data.iMailRand[j] > NpcReputation::Common::MaxMailRandValue )
|
|
{
|
|
_ASSERT(0);
|
|
g_Log.Log( LogType::_FILELOG, L"ReputeTable.dnt MailID:%d 犬伏捞惑\r\n", Data.iMailID[j] );
|
|
//return false;
|
|
}
|
|
}
|
|
|
|
char* szStr = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.FavorNpc )->GetString();
|
|
std::vector<std::string> tokens;
|
|
TokenizeA( szStr, tokens, ";" );
|
|
_ASSERT( tokens.size() <= NpcReputation::Common::MaxFavorEffectNpcCount );
|
|
for( UINT j=0 ; j<tokens.size() ; ++j )
|
|
Data.vFavorNpcID.push_back( atoi(tokens[j].c_str()) );
|
|
|
|
szStr = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MaliceNpc )->GetString();
|
|
tokens.clear();
|
|
TokenizeA( szStr, tokens, ";" );
|
|
_ASSERT( tokens.size() <= NpcReputation::Common::MaxMaliceEffectNpcCount );
|
|
for( UINT j=0 ; j<tokens.size() ; ++j )
|
|
Data.vMaliceNpcID.push_back( atoi(tokens[j].c_str()) );
|
|
|
|
Data.iFavorGroupBomb = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.FavorGroupBomb )->GetInteger();
|
|
Data.iMaliceGroupBomb = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MaliceGroupBomb )->GetInteger();
|
|
Data.iPlusItemID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PlusItemID )->GetInteger();
|
|
Data.iPlusProb = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PlusProb )->GetInteger();
|
|
Data.iUnionID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.UnionID )->GetInteger();
|
|
for( UINT j=0 ; j<_countof(sFieldNum.PresentPoint) ; ++j )
|
|
Data.iPresentPointArr[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PresentPoint[j] )->GetInteger();
|
|
|
|
m_ReputeTableData.insert( std::make_pair(iNpcID,Data) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TReputeTableData* CDNGameDataManager::GetReputeTableData( int iItemID )
|
|
{
|
|
TMapReputeTableData::iterator itor = m_ReputeTableData.find( iItemID );
|
|
if( itor != m_ReputeTableData.end() )
|
|
return &itor->second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// PresentTable(PresentTable.dnt - TPresentTableData)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadPresentTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPRESENT );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TPRESENT );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPRESENT );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PresentTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PresentTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_PresentTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int PresentType;
|
|
int PresentTypeID;
|
|
int Count;
|
|
int AddFavorPoint;
|
|
int TakeMalicePoint;
|
|
int FavorGroupPoint;
|
|
int MaliceGroupPoint;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.PresentType = pSox->GetFieldNum( "_PresentType" );
|
|
sFieldNum.PresentTypeID = pSox->GetFieldNum( "_PresentTypeID" );
|
|
sFieldNum.Count = pSox->GetFieldNum( "_Count" );
|
|
sFieldNum.AddFavorPoint = pSox->GetFieldNum( "_AddFavorPoint" );
|
|
sFieldNum.TakeMalicePoint = pSox->GetFieldNum( "_TakeMalicePoint" );
|
|
sFieldNum.FavorGroupPoint = pSox->GetFieldNum( "_FavorGroupPoint" );
|
|
sFieldNum.MaliceGroupPoint = pSox->GetFieldNum( "_MaliceGroupPoint" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TPresentTableData Data;
|
|
int nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
Data.Type = static_cast<TPresentTableData::eType>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PresentType )->GetInteger());
|
|
Data.iTypeID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PresentTypeID )->GetInteger();
|
|
Data.iCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Count )->GetInteger();
|
|
Data.iAddFavorPoint = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.AddFavorPoint )->GetInteger();
|
|
Data.iTakeMalicePoint = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.TakeMalicePoint )->GetInteger();
|
|
Data.iFavorGroupPoint = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.FavorGroupPoint )->GetInteger();
|
|
Data.iMaliceGroupPoint = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MaliceGroupPoint )->GetInteger();
|
|
|
|
_ASSERT( Data.iFavorGroupPoint >= 0 );
|
|
_ASSERT( Data.iMaliceGroupPoint >= 0 );
|
|
|
|
m_PresentTableData.insert( std::make_pair(nItemID,Data) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TPresentTableData* CDNGameDataManager::GetPresentTableData( int iItemID )
|
|
{
|
|
TMapPresentTableData::iterator itor = m_PresentTableData.find( iItemID );
|
|
if( itor != m_PresentTableData.end() )
|
|
return &itor->second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// MailTable(MailTable.dnt - TMailTableData)
|
|
//---------------------------------------------------------------------------------
|
|
|
|
bool CDNGameDataManager::LoadMailTableData()
|
|
{
|
|
if( m_pItemData.empty() )
|
|
{
|
|
_ASSERT( 0 );
|
|
g_Log.Log( LogType::_FILELOG, L"ItemTable阑 刚历 肺靛秦具钦聪促.\r\n" );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TMAIL );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TMAIL );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TMAIL );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MailTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MailTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MailTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int MailType;
|
|
int MailSender;
|
|
int MailTitle;
|
|
int MailText;
|
|
int MailPresentItem[MAILATTACHITEMMAX];
|
|
int Count[MAILATTACHITEMMAX];
|
|
int MailPresentMoney;
|
|
int IsCash;
|
|
#if defined(PRE_SPECIALBOX)
|
|
int KeepBoxReceive;
|
|
int KeepBoxType;
|
|
int KeepBoxLevelMin;
|
|
int KeepBoxLevelMax;
|
|
int KeepBoxClass;
|
|
#endif // #if defined(PRE_SPECIALBOX)
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.MailType = pSox->GetFieldNum( "_MailType" );
|
|
sFieldNum.MailSender = pSox->GetFieldNum( "_MailSender" );
|
|
sFieldNum.MailTitle = pSox->GetFieldNum( "_MailTitle" );
|
|
sFieldNum.MailText = pSox->GetFieldNum( "_MailText" );
|
|
sFieldNum.MailPresentMoney = pSox->GetFieldNum( "_MailPresentMoney" );
|
|
sFieldNum.IsCash = pSox->GetFieldNum( "_IsCash" );
|
|
#if defined(PRE_SPECIALBOX)
|
|
sFieldNum.KeepBoxReceive = pSox->GetFieldNum( "_KeepBoxReceive" );
|
|
sFieldNum.KeepBoxType = pSox->GetFieldNum( "_KeepBoxType" );
|
|
sFieldNum.KeepBoxLevelMin = pSox->GetFieldNum( "_KeepBoxLevelMin" );
|
|
sFieldNum.KeepBoxLevelMax = pSox->GetFieldNum( "_KeepBoxLevelMax" );
|
|
sFieldNum.KeepBoxClass = pSox->GetFieldNum( "_KeepBoxClass" );
|
|
#endif // #if defined(PRE_SPECIALBOX)
|
|
|
|
for( int i=1 ; i<=MAILATTACHITEMMAX ; ++i )
|
|
{
|
|
char szBuf[MAX_PATH];
|
|
|
|
sprintf( szBuf, "_MailPresentItem%d", i );
|
|
sFieldNum.MailPresentItem[i-1] = pSox->GetFieldNum( szBuf );
|
|
sprintf( szBuf, "_Count%d", i );
|
|
sFieldNum.Count[i-1] = pSox->GetFieldNum( szBuf );
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TMailTableData Data;
|
|
int nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
Data.Code = static_cast<DBDNWorldDef::MailTypeCode::eCode>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailType )->GetInteger());
|
|
Data.nSenderUIStringIndex = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailSender )->GetInteger();
|
|
Data.nTitleUIStringIndex = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailTitle )->GetInteger();
|
|
Data.nTextUIStringIndex = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailText )->GetInteger();
|
|
Data.IsCash = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.IsCash )->GetInteger() ? true : false;
|
|
#if defined(PRE_SPECIALBOX)
|
|
Data.nKeepBoxReceive = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.KeepBoxReceive )->GetInteger();
|
|
Data.nKeepBoxType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.KeepBoxType )->GetInteger();
|
|
Data.nKeepBoxLevelMin = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.KeepBoxLevelMin )->GetInteger();
|
|
Data.nKeepBoxLevelMax = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.KeepBoxLevelMax )->GetInteger();
|
|
Data.nKeepBoxClass = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.KeepBoxClass )->GetInteger();
|
|
#endif // #if defined(PRE_SPECIALBOX)
|
|
|
|
for( int i=0 ; i<MAILATTACHITEMMAX ; ++i )
|
|
{
|
|
if(Data.IsCash){
|
|
Data.ItemSNArr[i] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailPresentItem[i] )->GetInteger();
|
|
}
|
|
else{
|
|
Data.ItemIDArr[i] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailPresentItem[i] )->GetInteger();
|
|
if( Data.ItemIDArr[i] <= 0 )
|
|
continue;
|
|
_ASSERT( GetItemData( Data.ItemIDArr[i] ) );
|
|
if( GetItemData( Data.ItemIDArr[i] ) == NULL )
|
|
{
|
|
WCHAR wszBuf[MAX_PATH];
|
|
wsprintf( wszBuf, L"MailTable ID:%d ItemID:%d not found!!\r\n", nItemID, Data.ItemIDArr[i] );
|
|
g_Log.Log( LogType::_FILELOG, wszBuf );
|
|
return false;
|
|
}
|
|
Data.ItemCountArr[i] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Count[i] )->GetInteger();
|
|
}
|
|
}
|
|
|
|
Data.nPresentMoney = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailPresentMoney )->GetInteger();
|
|
|
|
m_MailTableData.insert( std::make_pair(nItemID,Data) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TMailTableData* CDNGameDataManager::GetMailTableData( int iItemID )
|
|
{
|
|
TMapMailTableData::iterator itor = m_MailTableData.find( iItemID );
|
|
if( itor != m_MailTableData.end() )
|
|
return &itor->second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadStoreBenefitData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TSTOREBENEFIT );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TSTOREBENEFIT );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TSTOREBENEFIT );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
_ASSERT( 0 );
|
|
g_Log.Log( LogType::_FILELOG, L"StoreBenefit.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"StoreBenefit.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_StoreBenefitData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
struct TempFieldNum
|
|
{
|
|
int iNpcID;
|
|
int iBenefitType;
|
|
int aiFavorThreshold[ STORE_BENEFIT_MAX ];
|
|
int aiDiscountPercent[ STORE_BENEFIT_MAX ];
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.iNpcID = pSox->GetFieldNum( "_NpcID" );
|
|
sFieldNum.iBenefitType = pSox->GetFieldNum( "_Benefit" );
|
|
|
|
for( int i = 0; i < STORE_BENEFIT_MAX; ++i )
|
|
{
|
|
CHAR szBuf[ MAX_PATH ] = { 0 };
|
|
sprintf_s( szBuf, "_Favor%d", (i+1) );
|
|
sFieldNum.aiFavorThreshold[ i ] = pSox->GetFieldNum( szBuf );
|
|
sprintf_s( szBuf, "_Discount%d", (i+1) );
|
|
sFieldNum.aiDiscountPercent[ i ] = pSox->GetFieldNum( szBuf );
|
|
}
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i = 0; i < pSox->GetItemCount(); ++i )
|
|
{
|
|
TStoreBenefitData Data;
|
|
int iItemID = pSox->GetItemID( i );
|
|
|
|
int iIdx = pSox->GetIDXprimary( iItemID );
|
|
|
|
Data.iNpcID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.iNpcID )->GetInteger();
|
|
Data.Type = static_cast<TStoreBenefitData::eType>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.iBenefitType )->GetInteger());
|
|
|
|
for( int k = 0; k < STORE_BENEFIT_MAX; ++k )
|
|
{
|
|
Data.aiFavorThreshold[ k ] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.aiFavorThreshold[ k ] )->GetInteger();
|
|
Data.aiAdjustPercent[ k ] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.aiDiscountPercent[ k ] )->GetInteger();
|
|
}
|
|
|
|
m_StoreBenefitData.insert( make_pair(Data.iNpcID, Data) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void CDNGameDataManager::GetStoreBenefitData( int iNpcID, vector<TStoreBenefitData*>& vlpDatas )
|
|
{
|
|
pair<TMapStoreBenefitData::iterator, TMapStoreBenefitData::iterator> iter_pair = m_StoreBenefitData.equal_range( iNpcID );
|
|
|
|
TMapStoreBenefitData::iterator iter = iter_pair.first;
|
|
for( iter; iter != iter_pair.second; ++iter )
|
|
vlpDatas.push_back( &(iter->second) );
|
|
}
|
|
|
|
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
bool CDNGameDataManager::LoadMasterSystemDecreaseTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TMASTERSYSTEM_DECREASE );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TMASTERSYSTEM_DECREASE );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TMASTERSYSTEM_DECREASE );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MasterSysDecreaseTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MasterSysDecreaseTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MasterSystemDecreaseTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int PupilLevel;
|
|
int PupilFeel;
|
|
int FeelUPDecreaseRespect;
|
|
int FeelDownDecreaseRespect;
|
|
int MasterSuccessMailID;
|
|
int MasterFailureMailID;
|
|
int PupilSuccessMailID;
|
|
int PupilFailuserMailID;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.PupilLevel = pSox->GetFieldNum( "_PupilLevel" );
|
|
sFieldNum.PupilFeel = pSox->GetFieldNum( "_PupilFeel" );
|
|
sFieldNum.FeelUPDecreaseRespect = pSox->GetFieldNum( "_FeelUPDecreaseRespect" );
|
|
sFieldNum.FeelDownDecreaseRespect = pSox->GetFieldNum( "_FeelDownDecreaseRespect" );
|
|
sFieldNum.MasterSuccessMailID = pSox->GetFieldNum( "_MasterSuccessMailID" );
|
|
sFieldNum.MasterFailureMailID = pSox->GetFieldNum( "_MasterFailureMailID" );
|
|
sFieldNum.PupilSuccessMailID = pSox->GetFieldNum( "_PupilSuccessMailID" );
|
|
sFieldNum.PupilFailuserMailID = pSox->GetFieldNum( "_PupilFailureMailID" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TMasterSystemDecreaseTableData Data;
|
|
int nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
Data.iPupilLevel = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PupilLevel )->GetInteger();
|
|
Data.iPupilFavor = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PupilFeel )->GetInteger();
|
|
Data.iFavorUpDecreaseRespectPoint = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.FeelUPDecreaseRespect )->GetInteger();
|
|
Data.iFavorDownDecreaseRespectPoint = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.FeelDownDecreaseRespect )->GetInteger();
|
|
Data.iMasterSuccessMailID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MasterSuccessMailID )->GetInteger();
|
|
Data.iMasterFailureMailID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MasterFailureMailID )->GetInteger();
|
|
Data.iPupilSuccessMailID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PupilSuccessMailID )->GetInteger();
|
|
Data.iPupilFailureMailID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.PupilFailuserMailID )->GetInteger();
|
|
|
|
m_MasterSystemDecreaseTableData.insert( std::make_pair(Data.iPupilLevel, Data) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TMasterSystemDecreaseTableData* CDNGameDataManager::GetMasterSystemDecreaseTableData( int iPupilLevel )
|
|
{
|
|
TMapMasterSystemDecreaseTableData::iterator itor = m_MasterSystemDecreaseTableData.find( iPupilLevel );
|
|
if( itor != m_MasterSystemDecreaseTableData.end() )
|
|
return &itor->second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadMasterSystemGainTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TMASTERSYSTEM_GAIN );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TMASTERSYSTEM_GAIN );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TMASTERSYSTEM_GAIN );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MasterSysGainTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MasterSysGainTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MasterSystemGainTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int LvlMin;
|
|
int StageGrade;
|
|
int GainFeel;
|
|
int GainRespect;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.LvlMin = pSox->GetFieldNum( "_LvlMin" );
|
|
sFieldNum.StageGrade = pSox->GetFieldNum( "_StageGrade" );
|
|
sFieldNum.GainFeel = pSox->GetFieldNum( "_GainFeel" );
|
|
sFieldNum.GainRespect = pSox->GetFieldNum( "_GainRespect" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TMasterSystemGainTableData Data;
|
|
int nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
int LvlMin = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.LvlMin )->GetInteger();
|
|
int StageGrade = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.StageGrade )->GetInteger();
|
|
|
|
if( LvlMin <= 0 )
|
|
continue;
|
|
|
|
Data.iFavorPoint = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.GainFeel )->GetInteger();
|
|
Data.iRepectPoint = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.GainRespect )->GetInteger();
|
|
|
|
m_MasterSystemGainTableData.insert( std::make_pair( std::make_pair(LvlMin,static_cast<Dungeon::Difficulty::eCode>(StageGrade)), Data) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TMasterSystemGainTableData* CDNGameDataManager::GetMasterSystemGainTableData( int iLevel, TDUNGEONDIFFICULTY StageDifficulty )
|
|
{
|
|
TMapMasterSystemGainTableData::iterator itor = m_MasterSystemGainTableData.find( std::make_pair(iLevel,StageDifficulty) );
|
|
if( itor != m_MasterSystemGainTableData.end() )
|
|
return &itor->second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
#if defined( PRE_ADD_SECONDARY_SKILL )
|
|
|
|
bool CDNGameDataManager::LoadSecondarySkillTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TSecondarySkill );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TSecondarySkill );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TSecondarySkill );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"SecondarySkillTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"SecondarySkillTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_SecondarySkillTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int SecondarySkillKind;
|
|
int SecondarySkillType;
|
|
int SecondarySkillCharacter;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.SecondarySkillKind = pSox->GetFieldNum( "_SecondarySkillKind" );
|
|
sFieldNum.SecondarySkillType = pSox->GetFieldNum( "_SecondarySkillType" );
|
|
sFieldNum.SecondarySkillCharacter = pSox->GetFieldNum( "_SecondarySkillCharacter" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TSecondarySkillTableData Data;
|
|
int nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
Data.iSkillID = nItemID;
|
|
Data.Type = static_cast<SecondarySkill::Type::eType>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillKind )->GetInteger());
|
|
Data.SubType = static_cast<SecondarySkill::SubType::eType>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillType )->GetInteger());
|
|
Data.ExecuteType = static_cast<SecondarySkill::ExecuteType::eType>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillCharacter )->GetInteger());
|
|
|
|
m_SecondarySkillTableData.insert( std::make_pair(Data.iSkillID,Data) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TSecondarySkillTableData* CDNGameDataManager::GetSecondarySkillTableData( int iSecondarySkillID )
|
|
{
|
|
TMapSecondarySkillTableData::iterator itor = m_SecondarySkillTableData.find( iSecondarySkillID );
|
|
if( itor != m_SecondarySkillTableData.end() )
|
|
return &itor->second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadSecondarySkillLevelTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TSecondarySkillLevel );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TSecondarySkillLevel );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TSecondarySkillLevel );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"SecondarySkillLevelTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"SecondarySkillLevelTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_SecondarySkillLevelTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int NextID;
|
|
int SecondarySkillID;
|
|
int SecondarySkillClass;
|
|
int SecondarySkillLevel;
|
|
int SecondarySkillExp;
|
|
int SecondarySkillParam;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.NextID = pSox->GetFieldNum( "NextID" );
|
|
sFieldNum.SecondarySkillID = pSox->GetFieldNum( "_SecondarySkillID" );
|
|
sFieldNum.SecondarySkillClass = pSox->GetFieldNum( "_SecondarySkillClass" );
|
|
sFieldNum.SecondarySkillLevel = pSox->GetFieldNum( "_SecondarySkillLevel" );
|
|
sFieldNum.SecondarySkillExp = pSox->GetFieldNum( "_SecondarySkillExp" );
|
|
sFieldNum.SecondarySkillParam = pSox->GetFieldNum( "_SecondarySkillParam" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
int iSumExp = 0;
|
|
|
|
TSecondarySkillLevelTableData Data;
|
|
int nItemID = pSox->GetItemID(i);
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
Data.iNextID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.NextID )->GetInteger();
|
|
Data.iSkillID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillID )->GetInteger();
|
|
Data.Grade = static_cast<SecondarySkill::Grade::eType>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillClass )->GetInteger());
|
|
Data.iLevel = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillLevel )->GetInteger();
|
|
Data.iExp = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillExp )->GetInteger();
|
|
Data.iParam = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillParam )->GetInteger();
|
|
|
|
// Head 佬扁
|
|
if( !(Data.Grade == SecondarySkill::Grade::Beginning && Data.iLevel == 1) )
|
|
continue;
|
|
|
|
iSumExp += Data.iExp;
|
|
|
|
std::vector<TSecondarySkillLevelTableData> vData;
|
|
vData.push_back( Data );
|
|
|
|
// Tail 佬扁
|
|
while( Data.iNextID > 0 )
|
|
{
|
|
iIdx = pSox->GetIDXprimary( Data.iNextID );
|
|
|
|
Data.iNextID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.NextID )->GetInteger();
|
|
Data.iSkillID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillID )->GetInteger();
|
|
Data.Grade = static_cast<SecondarySkill::Grade::eType>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillClass )->GetInteger());
|
|
Data.iLevel = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillLevel )->GetInteger();
|
|
Data.iExp = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillExp )->GetInteger();
|
|
Data.iParam = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillParam )->GetInteger();
|
|
|
|
iSumExp += Data.iExp;
|
|
Data.iExp = iSumExp;
|
|
|
|
vData.push_back( Data );
|
|
}
|
|
|
|
m_SecondarySkillLevelTableData.insert( std::make_pair(Data.iSkillID,vData) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TSecondarySkillLevelTableData* CDNGameDataManager::GetSecondarySkillLevelTableData( int iSecondarySkillID, SecondarySkill::Grade::eType Grade, int iSkillLevel )
|
|
{
|
|
TMapSecondarySkillLevelTableData::iterator itor = m_SecondarySkillLevelTableData.find( iSecondarySkillID );
|
|
if( itor != m_SecondarySkillLevelTableData.end() )
|
|
{
|
|
for( UINT i=0 ; i<(*itor).second.size() ; ++i )
|
|
{
|
|
if((*itor).second[i].Grade == Grade && (*itor).second[i].iLevel == iSkillLevel )
|
|
return &(*itor).second[i];
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
TSecondarySkillLevelTableData* CDNGameDataManager::GetSecondarySkillLevelTableData( int iSecondarySkillID, int iExp )
|
|
{
|
|
TMapSecondarySkillLevelTableData::iterator itor = m_SecondarySkillLevelTableData.find( iSecondarySkillID );
|
|
if( itor == m_SecondarySkillLevelTableData.end() )
|
|
return NULL;
|
|
|
|
if( (*itor).second.empty() )
|
|
return NULL;
|
|
|
|
for( UINT i=0 ; i<(*itor).second.size() ; ++i )
|
|
{
|
|
if( iExp <(*itor).second[i].iExp )
|
|
return &(*itor).second[i];
|
|
}
|
|
|
|
// 付瘤阜 Table Return
|
|
return &(*itor).second[(*itor).second.size()-1];
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadSecondarySkillRecipeTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TSecondarySkillRecipe );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TSecondarySkillRecipe );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TSecondarySkillRecipe );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"makeitemrecipetable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"makeitemrecipetable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_SecondarySkillRecipeTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int MakeItemID[SecondarySkill::ManufactureSkill::MaxManufactureItemTypeCount];
|
|
int MinExp[SecondarySkill::ManufactureSkill::MaxManufactureItemTypeCount];
|
|
int MaxExp[SecondarySkill::ManufactureSkill::MaxManufactureItemTypeCount];
|
|
int SecondarySkillClass;
|
|
int SecondarySkillLevel;
|
|
int ToolItemID[SecondarySkill::ManufactureSkill::MaxToolItemCount];
|
|
int MasterExp;
|
|
int MaxTime;
|
|
int SuccessProbability;
|
|
int SuccessUpExp;
|
|
int RecipeUpExp;
|
|
int MaterialItemID[SecondarySkill::ManufactureSkill::MaxMaterialItemCount];
|
|
int MaterialItemCount[SecondarySkill::ManufactureSkill::MaxMaterialItemCount];
|
|
int StartExp;
|
|
int SuccessCount;
|
|
};
|
|
|
|
char szBuf[MAX_PATH];
|
|
TempFieldNum sFieldNum;
|
|
for( UINT i=0 ; i<_countof(sFieldNum.MakeItemID) ; ++i )
|
|
{
|
|
sprintf_s( szBuf, "_MakeItem%dID", i+1 );
|
|
sFieldNum.MakeItemID[i] = pSox->GetFieldNum( szBuf );
|
|
sprintf_s( szBuf, "_MinExp%d", i+1 );
|
|
sFieldNum.MinExp[i] = pSox->GetFieldNum( szBuf );
|
|
sprintf_s( szBuf, "_MaxExp%d", i+1 );
|
|
sFieldNum.MaxExp[i] = pSox->GetFieldNum( szBuf );
|
|
}
|
|
sFieldNum.SecondarySkillClass = pSox->GetFieldNum( "_SecondarySkillClass" );
|
|
sFieldNum.SecondarySkillLevel = pSox->GetFieldNum( "_SecondarySkillLevel" );
|
|
for( UINT i=0 ; i<_countof(sFieldNum.ToolItemID) ; ++i )
|
|
{
|
|
sprintf_s( szBuf, "_ToolItem%dID", i+1 );
|
|
sFieldNum.ToolItemID[i] = pSox->GetFieldNum( szBuf );
|
|
}
|
|
|
|
sFieldNum.MasterExp = pSox->GetFieldNum( "_MasterExp" );
|
|
sFieldNum.MaxTime = pSox->GetFieldNum( "_MaxTime" );
|
|
sFieldNum.SuccessProbability = pSox->GetFieldNum( "_SuccessProbability" );
|
|
sFieldNum.SuccessUpExp = pSox->GetFieldNum( "_SuccessUpExp" );
|
|
sFieldNum.RecipeUpExp = pSox->GetFieldNum( "_RecipeUpExp" );
|
|
|
|
for( UINT i=0 ; i<_countof(sFieldNum.MakeItemID) ; ++i )
|
|
{
|
|
sprintf_s( szBuf, "_MaterialItem%dID", i+1 );
|
|
sFieldNum.MaterialItemID[i] = pSox->GetFieldNum( szBuf );
|
|
sprintf_s( szBuf, "_Count%d", i+1 );
|
|
sFieldNum.MaterialItemCount[i] = pSox->GetFieldNum( szBuf );
|
|
}
|
|
|
|
sFieldNum.StartExp = pSox->GetFieldNum( "_StartExp" );
|
|
sFieldNum.SuccessCount = pSox->GetFieldNum( "_SuccessCount" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TSecondarySkillRecipeTableData Data;
|
|
|
|
int nItemID = pSox->GetItemID(i);
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
for( UINT j=0 ; j<_countof(Data.iManufactureItemID) ; ++j )
|
|
{
|
|
Data.iManufactureItemID[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MakeItemID[j] )->GetInteger();
|
|
Data.iMinExp[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MinExp[j] )->GetInteger();
|
|
Data.iMaxExp[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MaxExp[j] )->GetInteger();
|
|
}
|
|
for( UINT j=0 ; j<_countof(Data.iToolItemID) ; ++j )
|
|
Data.iToolItemID[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.ToolItemID[j] )->GetInteger();
|
|
for( UINT j=0 ; j<_countof(Data.iMaterialItemID) ; ++j )
|
|
{
|
|
Data.iMaterialItemID[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MaterialItemID[j] )->GetInteger();
|
|
Data.iMaterialItemCount[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MaterialItemCount[j] )->GetInteger();
|
|
}
|
|
Data.RequireGrade = static_cast<SecondarySkill::Grade::eType>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillClass)->GetInteger());
|
|
Data.iRequireSkillLevel = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SecondarySkillLevel )->GetInteger();
|
|
Data.iMasterExp = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MasterExp )->GetInteger();
|
|
Data.iMaxTime = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MaxTime )->GetInteger();
|
|
Data.iSuccessProbability = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SuccessProbability )->GetInteger();
|
|
Data.iSuccessUpExp = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SuccessUpExp )->GetInteger();
|
|
Data.iRecipeUpExp = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.RecipeUpExp )->GetInteger();
|
|
Data.iStartExp = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.StartExp )->GetInteger();
|
|
Data.iSuccessCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SuccessCount )->GetInteger();
|
|
if( Data.iSuccessCount <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"makeitemrecipetable.dnt ItemID:%d SuccessCount:%d Invalid\r\n", nItemID, Data.iSuccessCount );
|
|
_ASSERT(0);
|
|
return false;
|
|
}
|
|
|
|
m_SecondarySkillRecipeTableData.insert( std::make_pair(nItemID,Data) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TSecondarySkillRecipeTableData* CDNGameDataManager::GetSecondarySkillRecipeTableData( int iItemID )
|
|
{
|
|
TMapSecondarySkillRecipeTableData::iterator itor = m_SecondarySkillRecipeTableData.find( iItemID );
|
|
if( itor != m_SecondarySkillRecipeTableData.end() )
|
|
return &(*itor).second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
|
|
|
|
bool CDNGameDataManager::LoadInstantItemTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TINSTANTITEM );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TINSTANTITEM );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TINSTANTITEM );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"instantitemtable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_InstantItemTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int ItemID;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.ItemID = pSox->GetFieldNum( "_ItemID" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
m_InstantItemTableData.insert( std::make_pair(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.ItemID )->GetInteger(),1) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::bIsInstantItem( int iItemID )
|
|
{
|
|
TMapInstantItemTableData::iterator itor = m_InstantItemTableData.find( iItemID );
|
|
if( itor == m_InstantItemTableData.end() )
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadFarmCultivateTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TFARMCULTIVATE );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TFARMCULTIVATE );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TFARMCULTIVATE );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"farmcultivatetable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"farmcultivatetable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_FarmCultivateTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int CultivateMaxTime;
|
|
int MaxWater;
|
|
int ConsumeWater;
|
|
int HarvestItemID;
|
|
int HarvestDrop[Farm::Max::HARVESTITEM_COUNT];
|
|
int HarvestDropID;
|
|
int SkillpointSeed;
|
|
int SkillpointWater;
|
|
int CatalystCount;
|
|
int RequiredSkillGrade;
|
|
int RequiredSkillLevel;
|
|
int Overlap;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
|
|
sFieldNum.CultivateMaxTime = pSox->GetFieldNum( "_CultivateMaxTime" );
|
|
sFieldNum.MaxWater = pSox->GetFieldNum( "_MaxWater" );
|
|
sFieldNum.ConsumeWater = pSox->GetFieldNum( "_ConsumeWater" );
|
|
sFieldNum.HarvestItemID = pSox->GetFieldNum( "_HarvestItemID" );
|
|
sFieldNum.HarvestDropID = pSox->GetFieldNum( "_HarvestDropID" );
|
|
sFieldNum.SkillpointSeed = pSox->GetFieldNum( "_SkillpointSeed" );
|
|
sFieldNum.SkillpointWater = pSox->GetFieldNum( "_SkillpointWater" );
|
|
sFieldNum.CatalystCount = pSox->GetFieldNum( "_CatalystCount" );
|
|
sFieldNum.RequiredSkillGrade = pSox->GetFieldNum( "_SecondarySkillClass" );
|
|
sFieldNum.RequiredSkillLevel = pSox->GetFieldNum( "_SecondarySkillLevel" );
|
|
sFieldNum.Overlap = pSox->GetFieldNum( "_Overlap" );
|
|
|
|
for( int i=0 ; i<_countof(sFieldNum.HarvestDrop) ; ++i )
|
|
{
|
|
char szBuf[MAX_PATH];
|
|
sprintf_s( szBuf, "_HarvestDrop%d", i+1 );
|
|
sFieldNum.HarvestDrop[i] = pSox->GetFieldNum( szBuf );
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TFarmCultivateTableData Data;
|
|
|
|
int iItemID = pSox->GetItemID(i);
|
|
int iIdx = pSox->GetIDXprimary( iItemID );
|
|
|
|
Data.iCultivateMaxTimeSec = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.CultivateMaxTime )->GetInteger();
|
|
Data.iMaxWater = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MaxWater )->GetInteger();
|
|
Data.iConsumeWater = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.ConsumeWater )->GetInteger();
|
|
Data.iHarvestNeedItemID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.HarvestItemID )->GetInteger();
|
|
Data.iHarvestDropTableID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.HarvestDropID )->GetInteger();
|
|
Data.iSkillPointPlant = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SkillpointSeed )->GetInteger();
|
|
Data.iSkillPointWater = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.SkillpointWater )->GetInteger();
|
|
Data.iCatalystCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.CatalystCount )->GetInteger();
|
|
Data.RequiredSkillGrade = static_cast<SecondarySkill::Grade::eType>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.RequiredSkillGrade )->GetInteger());
|
|
Data.iRequiredSkillLevel = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.RequiredSkillLevel )->GetInteger();
|
|
Data.iOverlap = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Overlap )->GetInteger();
|
|
for( int i=0 ; i<_countof(sFieldNum.HarvestDrop) ; ++i )
|
|
{
|
|
Data.iHarvestDropRate[i] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.HarvestDrop[i] )->GetInteger();
|
|
}
|
|
|
|
m_FarmCultivateTableData.insert( std::make_pair(iItemID,Data) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TFarmCultivateTableData* CDNGameDataManager::GetFarmCultivateTableData( int iItemID )
|
|
{
|
|
TMapFarmCultivateTableData::iterator itor = m_FarmCultivateTableData.find( iItemID );
|
|
if( itor != m_FarmCultivateTableData.end() )
|
|
return &(*itor).second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadFishingTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TFISHING);
|
|
else
|
|
pSox = GetDNTable(CDnTableDB::TFISHING);
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable(CDnTableDB::TFISHING);
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"fishingtable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"fishingtable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_FishingTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum : public TFishingTableData
|
|
{
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
|
|
sFieldNum.nMaxTime = pSox->GetFieldNum( "_MaxTime" );
|
|
sFieldNum.nPullingTargetMin = pSox->GetFieldNum( "_TargetMin" );
|
|
sFieldNum.nPullingTargetMax = pSox->GetFieldNum( "_TargetMax" );
|
|
sFieldNum.nPullingTargetSpeed = pSox->GetFieldNum( "_TargetSpeed" );
|
|
sFieldNum.nPullingTargetUpTime = pSox->GetFieldNum( "_TargetUpTime" );
|
|
sFieldNum.nSkillPointSuccess = pSox->GetFieldNum( "_GetSkillPointSuccess" );
|
|
sFieldNum.nSkillPointFailure = pSox->GetFieldNum( "_GetSkillPointFailure" );
|
|
sFieldNum.nSuccessProbability = pSox->GetFieldNum( "_SuccessProbability" );
|
|
sFieldNum.nSuccessDropTableID = pSox->GetFieldNum( "_SuccessDrapID" ); //坷藕单 老窜 せ
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TFishingTableData Data;
|
|
memset(&Data, 0, sizeof(TFishingTableData));
|
|
|
|
int iItemID = pSox->GetItemID(i);
|
|
int iIdx = pSox->GetIDXprimary( iItemID );
|
|
|
|
Data.nMaxTime = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nMaxTime )->GetInteger();
|
|
Data.nPullingTargetMin = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nPullingTargetMin )->GetInteger();
|
|
Data.nPullingTargetMax = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nPullingTargetMax )->GetInteger();
|
|
Data.nPullingTargetSpeed = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nPullingTargetSpeed )->GetInteger();
|
|
Data.nPullingTargetUpTime = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nPullingTargetUpTime )->GetInteger();
|
|
Data.nSkillPointSuccess = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nSkillPointSuccess )->GetInteger();
|
|
Data.nSkillPointFailure = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nSkillPointFailure )->GetInteger();
|
|
Data.nSuccessProbability = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nSuccessProbability )->GetInteger();
|
|
Data.nSuccessDropTableID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nSuccessDropTableID )->GetInteger();
|
|
|
|
if(m_FishingTableData.find(iItemID) != m_FishingTableData.end())
|
|
{
|
|
_ASSERT_EXPR(0, L"Check Fishing TableID Duplicated!");
|
|
return false;
|
|
}
|
|
m_FishingTableData.insert( std::make_pair(iItemID,Data) );
|
|
}
|
|
return true;
|
|
}
|
|
|
|
TFishingTableData * CDNGameDataManager::GetFishingTableData(int nItemID)
|
|
{
|
|
TMapFishingTableData::iterator ii = m_FishingTableData.find(nItemID);
|
|
if(ii != m_FishingTableData.end())
|
|
return &(*ii).second;
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadFishingPointTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TFISHINGPOINT);
|
|
else
|
|
pSox = GetDNTable(CDnTableDB::TFISHINGPOINT);
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable(CDnTableDB::TFISHINGPOINT);
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"fishingpointtable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"fishingpointtable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_FishingPointTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum : public TFishingPointTableData
|
|
{
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
|
|
sFieldNum.nSecondarySkillClass = pSox->GetFieldNum( "_SecondarySkillClass" );
|
|
sFieldNum.nSecondarySkillLevel = pSox->GetFieldNum( "_SecondarySkillLevel" );
|
|
sFieldNum.nRequireItemType1 = pSox->GetFieldNum( "_NeedItemType1" );
|
|
sFieldNum.nRequireItemType2 = pSox->GetFieldNum( "_NeedItemType2" );
|
|
|
|
std::string strPattern = "_FishingPatternID";
|
|
std::string strPatternProbabillity = "_Probability";
|
|
std::string strPatternTemp;
|
|
std::string strPatternProbabillityTemp;
|
|
|
|
USES_CONVERSION;
|
|
for (int i = 0; i < Fishing::Max::FISHINGPATTERNMAX; i++)
|
|
{
|
|
strPatternTemp.clear();
|
|
strPatternProbabillityTemp.clear();
|
|
|
|
strPatternTemp = strPattern + I2A(i+1);
|
|
strPatternProbabillityTemp = strPatternProbabillity + I2A(i+1);
|
|
sFieldNum.Pattern[i].nPatternID = pSox->GetFieldNum( strPatternTemp.c_str() );
|
|
sFieldNum.Pattern[i].nProbabillity = pSox->GetFieldNum( strPatternProbabillityTemp.c_str() );
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TFishingPointTableData Data;
|
|
|
|
int iItemID = pSox->GetItemID(i);
|
|
int iIdx = pSox->GetIDXprimary( iItemID );
|
|
|
|
Data.nSecondarySkillClass = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nSecondarySkillClass )->GetInteger();
|
|
Data.nSecondarySkillLevel = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nSecondarySkillLevel )->GetInteger();
|
|
Data.nRequireItemType1 = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nRequireItemType1 )->GetInteger();
|
|
Data.nRequireItemType2 = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nRequireItemType2 )->GetInteger();
|
|
for (int j = 0; j < Fishing::Max::FISHINGPATTERNMAX; j++)
|
|
{
|
|
Data.Pattern[j].nPatternID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Pattern[j].nPatternID )->GetInteger();
|
|
Data.Pattern[j].nProbabillity = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Pattern[j].nProbabillity )->GetInteger();
|
|
}
|
|
|
|
if(m_FishingPointTableData.find(iItemID) != m_FishingPointTableData.end())
|
|
{
|
|
_ASSERT_EXPR(0, L"Check Fishing TableID Duplicated!");
|
|
return false;
|
|
}
|
|
m_FishingPointTableData.insert( std::make_pair(iItemID,Data) );
|
|
}
|
|
return true;
|
|
}
|
|
|
|
TFishingPointTableData * CDNGameDataManager::GetFishingPointTableData(int nItemID)
|
|
{
|
|
TMapFishingPointTableData::iterator ii = m_FishingPointTableData.find(nItemID);
|
|
if(ii != m_FishingPointTableData.end())
|
|
return &(*ii).second;
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadFishingAreaTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TFISHINGAREA);
|
|
else
|
|
pSox = GetDNTable(CDnTableDB::TFISHINGAREA);
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable(CDnTableDB::TFISHINGAREA);
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"fishingareatable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"fishingareatable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_FishingAreaTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum : public TFishingAreaTableData
|
|
{
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
|
|
sFieldNum.nMatchedMapID = pSox->GetFieldNum( "_MapID" );
|
|
sFieldNum.nMatchedFishingAreaID = pSox->GetFieldNum( "_EventAreaID" );
|
|
sFieldNum.nFishingPointID = pSox->GetFieldNum( "_FishingPointID" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TFishingAreaTableData Data;
|
|
|
|
int iItemID = pSox->GetItemID(i);
|
|
int iIdx = pSox->GetIDXprimary( iItemID );
|
|
|
|
Data.nMatchedMapID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nMatchedMapID )->GetInteger();
|
|
Data.nMatchedFishingAreaID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nMatchedFishingAreaID )->GetInteger();
|
|
Data.nFishingPointID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.nFishingPointID )->GetInteger();
|
|
|
|
if(m_FishingAreaTableData.find(iItemID) != m_FishingAreaTableData.end())
|
|
{
|
|
_ASSERT_EXPR(0, L"Check Fishing TableID Duplicated!");
|
|
return false;
|
|
}
|
|
m_FishingAreaTableData.insert( std::make_pair(iItemID,Data) );
|
|
}
|
|
return true;
|
|
}
|
|
|
|
TFishingAreaTableData * CDNGameDataManager::GetFishingAreaTableData(int nItemID)
|
|
{
|
|
TMapFishingAreaTableData::iterator ii = m_FishingAreaTableData.find(nItemID);
|
|
if(ii != m_FishingAreaTableData.end())
|
|
return &(*ii).second;
|
|
return NULL;
|
|
}
|
|
|
|
void CDNGameDataManager::GetFishingAreaTableDataByMapID(int nMapID, std::vector <TFishingAreaTableData> &vFishingArea)
|
|
{
|
|
TMapFishingAreaTableData::iterator ii;
|
|
for(ii = m_FishingAreaTableData.begin(); ii != m_FishingAreaTableData.end(); ii++)
|
|
{
|
|
if((*ii).second.nMatchedMapID == nMapID)
|
|
vFishingArea.push_back((*ii).second);
|
|
}
|
|
}
|
|
|
|
|
|
bool CDNGameDataManager::LoadJobTableData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TJOB );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TJOB );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TJOB );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"JobTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"JobTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_JobTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _JobNumber;
|
|
int _BaseClass;
|
|
int _ParentJob;
|
|
int _MaxSPJob[ 5 ];
|
|
int _Class;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._JobNumber = pSox->GetFieldNum( "_JobNumber" );
|
|
sFieldNum._BaseClass = pSox->GetFieldNum( "_BaseClass" );
|
|
sFieldNum._ParentJob = pSox->GetFieldNum( "_ParentJob" );
|
|
|
|
char acBuffer[ 256 ] = { 0 };
|
|
for( int i = 0; i < 5; ++i )
|
|
{
|
|
sprintf_s( acBuffer, "_MaxSPJob%d", i );
|
|
sFieldNum._MaxSPJob[ i ] = pSox->GetFieldNum( acBuffer );
|
|
}
|
|
|
|
sFieldNum._Class = pSox->GetFieldNum( "_Class" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
|
|
{
|
|
TJobTableData Data;
|
|
int nItemID = pSox->GetItemID(i);
|
|
int iIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
Data.cJobNumber = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._JobNumber )->GetInteger();
|
|
Data.cBaseClass = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._BaseClass )->GetInteger();
|
|
Data.cParentJob = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ParentJob )->GetInteger();
|
|
for( int k = 0; k < 5; ++k )
|
|
Data.afMaxUsingSP[ k ] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._MaxSPJob[ k ] )->GetFloat();
|
|
|
|
Data.cClass = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Class )->GetInteger();
|
|
|
|
m_JobTableData.insert( std::make_pair(nItemID, Data) );
|
|
|
|
if( nItemID >= JOB_KIND_MAX )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MaxJob OverFlow %d/%d\r\n", nItemID, JOB_KIND_MAX );
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TJobTableData* CDNGameDataManager::GetJobTableData( int nJobTableID )
|
|
{
|
|
TMapJobTableData::iterator itor = m_JobTableData.find( nJobTableID );
|
|
if( itor != m_JobTableData.end() )
|
|
{
|
|
TJobTableData * pTJobTableData = &(itor->second);
|
|
if( pTJobTableData->cJobNumber >= 0 ) // 扁夯流诀篮 瞒荐啊 0 何磐 矫累捞扼 荐沥.
|
|
return pTJobTableData;
|
|
}
|
|
|
|
return NULL;
|
|
};
|
|
|
|
int CDNGameDataManager::GetBaseClass( int iJob )
|
|
{
|
|
int iResult = -1;
|
|
|
|
TMapJobTableData::iterator itor = m_JobTableData.find( iJob );
|
|
if( itor != m_JobTableData.end() )
|
|
{
|
|
TJobTableData * pTJobTableData = &(itor->second);
|
|
iResult = pTJobTableData->cBaseClass;
|
|
}
|
|
|
|
return iResult;
|
|
}
|
|
|
|
int CDNGameDataManager::GetParentJob( int iJob )
|
|
{
|
|
TMapJobTableData::iterator itor = m_JobTableData.find( iJob );
|
|
if( itor != m_JobTableData.end() )
|
|
{
|
|
TJobTableData * pTJobTableData = &(itor->second);
|
|
if( pTJobTableData->cJobNumber > 0 ) // 何葛流诀阑 掘绢坷绰 流诀篮 风飘 流诀捞 瞪 荐 绝栏骨肺 0 焊促 奴 流诀 酒捞叼父 倾侩.
|
|
return pTJobTableData->cParentJob;
|
|
}
|
|
return iJob;
|
|
}
|
|
|
|
int CDNGameDataManager::GetJobNumber( int iJob )
|
|
{
|
|
TMapJobTableData::iterator itor = m_JobTableData.find( iJob );
|
|
if( itor != m_JobTableData.end() )
|
|
{
|
|
TJobTableData * pTJobTableData = &(itor->second);
|
|
if( pTJobTableData->cJobNumber >= 0 ) // 扁夯流诀篮 瞒荐啊 0 何磐 矫累捞扼 荐沥.
|
|
return pTJobTableData->cJobNumber;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int CDNGameDataManager::GetClass( int iJob )
|
|
{
|
|
TMapJobTableData::iterator itor = m_JobTableData.find( iJob );
|
|
if( itor != m_JobTableData.end() )
|
|
{
|
|
TJobTableData * pTJobTableData = &(itor->second);
|
|
if( pTJobTableData->cJobNumber > 0 )
|
|
return pTJobTableData->cClass;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CDNGameDataManager::GetJobGroupID(int nItemID, char cJobCode[])
|
|
{
|
|
int nJobNumber = GetJobNumber(nItemID);
|
|
if(nJobNumber >= ITEMJOB_MAX)
|
|
nJobNumber = ITEMJOB_MAX;
|
|
|
|
if(nJobNumber == 0)
|
|
{
|
|
cJobCode[0] = nItemID;
|
|
}
|
|
else
|
|
{
|
|
int i = 0;
|
|
int nParentJob = nItemID;
|
|
for(i=0; i<nJobNumber; i++)
|
|
{
|
|
cJobCode[i] = nParentJob;
|
|
nParentJob = GetParentJob(nParentJob);
|
|
}
|
|
cJobCode[i] = nParentJob;
|
|
}
|
|
}
|
|
|
|
// GlyphSkill
|
|
bool CDNGameDataManager::LoadGlyphSkillData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TGLYPHSKILL );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TGLYPHSKILL );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGLYPHSKILL );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"GlyphSkillTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"GlyphSkillTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapGlyphSkill.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _SkillLevelID; // 胶懦饭骇抛捞喉ID
|
|
int _GlyphType; // 巩厘 鸥涝
|
|
int _SkillID; // 胶懦抛捞喉ID
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._SkillLevelID = pSox->GetFieldNum( "_SkillLevelID" );
|
|
sFieldNum._GlyphType = pSox->GetFieldNum( "_GlyphType" );
|
|
sFieldNum._SkillID = pSox->GetFieldNum( "_SkillID" );
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
TGlyphSkillData Data = {0, };
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
Data.nGlyphID = nItemID;
|
|
Data.nSkillLevelID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SkillLevelID)->GetInteger();
|
|
Data.nGlyphType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._GlyphType)->GetInteger();
|
|
Data.nSkillID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SkillID)->GetInteger();
|
|
|
|
m_MapGlyphSkill.insert(make_pair(Data.nGlyphID, Data));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TGlyphSkillData *CDNGameDataManager::GetGlyphSkillData(int nGlyphID)
|
|
{
|
|
if(m_MapGlyphSkill.empty()) return NULL;
|
|
|
|
TMapGlyphSkillData::iterator iter = m_MapGlyphSkill.find(nGlyphID);
|
|
if(iter == m_MapGlyphSkill.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
int CDNGameDataManager::GetGlyphType(int nGlyphID)
|
|
{
|
|
if(m_MapGlyphSkill.empty()) return 0;
|
|
|
|
TGlyphSkillData *pGlyph = GetGlyphSkillData(nGlyphID);
|
|
if(!pGlyph) return 0;
|
|
|
|
return pGlyph->nGlyphType;
|
|
}
|
|
|
|
// GlyphSlot
|
|
bool CDNGameDataManager::LoadGlyphSlotData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TGLYPHSLOT );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TGLYPHSLOT );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGLYPHSLOT );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"GlyphSlotTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"GlyphSlotTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_VecGlyphSlot.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nSlotID;
|
|
int nLevelLimit;
|
|
int nSlotType;
|
|
int nIsCash;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nSlotID = pSox->GetFieldNum( "_slotID" );
|
|
sFieldNum.nLevelLimit = pSox->GetFieldNum( "_LevelLimit" );
|
|
sFieldNum.nSlotType = pSox->GetFieldNum( "_slotType" );
|
|
sFieldNum.nIsCash = pSox->GetFieldNum( "_isCash" );
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
TGlyphSlotData Data = {0, };
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
Data.nID = nItemID;
|
|
Data.cSlotID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nSlotID)->GetInteger();
|
|
Data.cSlotType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nSlotType)->GetInteger();
|
|
Data.cLevelLimit = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nLevelLimit)->GetInteger();
|
|
Data.IsCash = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nIsCash)->GetInteger() ? true : false;
|
|
|
|
m_VecGlyphSlot.push_back(Data);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GLYPHINDEX_2_SLOTINDEX(int nGlyphIndex)
|
|
{
|
|
// 0, 1, 2, 4, 3, 5, 6, 7, 8, 9
|
|
// 6, 7, 5, 8, 12, 9, 11, 10
|
|
switch(nGlyphIndex)
|
|
{
|
|
case GLYPH_ENCHANT1: return 5;
|
|
case GLYPH_ENCHANT2: return 6;
|
|
case GLYPH_ENCHANT3: return 7;
|
|
case GLYPH_ENCHANT4: return 8;
|
|
case GLYPH_ENCHANT5: return 9;
|
|
case GLYPH_ENCHANT6: return 10;
|
|
case GLYPH_ENCHANT7: return 11;
|
|
case GLYPH_ENCHANT8: return 12;
|
|
case GLYPH_SKILL1: return 1;
|
|
case GLYPH_SKILL2: return 2;
|
|
case GLYPH_SKILL3: return 4;
|
|
case GLYPH_SKILL4: return 3;
|
|
case GLYPH_SPECIALSKILL: return 0;
|
|
case GLYPH_CASH1: return 13;
|
|
case GLYPH_CASH2: return 14;
|
|
case GLYPH_CASH3: return 15;
|
|
#if defined(PRE_ADD_DRAGON_FELLOWSHIP_GLYPH)
|
|
case GLYPH_DRAGON1: return 16;
|
|
case GLYPH_DRAGON2: return 17;
|
|
case GLYPH_DRAGON3: return 18;
|
|
case GLYPH_DRAGON4: return 19;
|
|
#endif //#if defined(PRE_ADD_DRAGON_FELLOWSHIP_GLYPH)GLYPH_DRAGON1
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsGlyphSlotLevel(int nGlyphIndex, int nCharLevel)
|
|
{
|
|
#if defined(PRE_ADD_DRAGON_FELLOWSHIP_GLYPH)
|
|
if ((nGlyphIndex < GLYPH_ENCHANT1) ||(nGlyphIndex > GLYPH_DRAGON4)) return false;
|
|
#else
|
|
if ((nGlyphIndex < GLYPH_ENCHANT1) ||(nGlyphIndex > GLYPH_CASH3)) return false;
|
|
#endif
|
|
if ((nCharLevel <= 0) ||(nCharLevel > CHARLEVELMAX)) return false;
|
|
|
|
int nSlot = GLYPHINDEX_2_SLOTINDEX(nGlyphIndex);
|
|
|
|
for (int i = 0; i < (int)m_VecGlyphSlot.size(); i++){
|
|
if (m_VecGlyphSlot[i].cSlotID != nSlot) continue;
|
|
if (m_VecGlyphSlot[i].cLevelLimit > nCharLevel) return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsGlyphLevel(int nGlyphID, int nCharLevel)
|
|
{
|
|
if (nGlyphID <= 0) return false;
|
|
|
|
TItemData *pItemData = GetItemData(nGlyphID);
|
|
if (!pItemData) return false;
|
|
|
|
if (pItemData->cLevelLimit > nCharLevel)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
// GlyphCharge
|
|
bool CDNGameDataManager::LoadGlyphChargeData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TGLYPHCHARGE );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TGLYPHCHARGE );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGLYPHCHARGE );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"GlyphChargeTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"GlyphChargeTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_VecGlyphCharge.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nGlyphType;
|
|
int nRank;
|
|
int nCharge;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nGlyphType = pSox->GetFieldNum( "_Glyph_type" );
|
|
sFieldNum.nRank = pSox->GetFieldNum( "_Rank" );
|
|
sFieldNum.nCharge = pSox->GetFieldNum( "_Charge" );
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
TGlyphChargeData Data = {0, };
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary( nItemID );
|
|
|
|
Data.cGlyphType= pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nGlyphType)->GetInteger();
|
|
Data.cGlyphRank = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nRank)->GetInteger();
|
|
Data.nCharge = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nCharge)->GetInteger();
|
|
|
|
m_VecGlyphCharge.push_back(Data);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetGlyphCharge(char cGlyphType, char cGlyphRank)
|
|
{
|
|
if (m_VecGlyphCharge.empty()) return 0;
|
|
if (cGlyphType <= 0) return 0;
|
|
if (cGlyphRank <= 0) return 0;
|
|
|
|
for (int i = 0; i < (int)m_VecGlyphCharge.size(); i++){
|
|
if ((m_VecGlyphCharge[i].cGlyphType == cGlyphType) && (m_VecGlyphCharge[i].cGlyphRank == cGlyphRank))
|
|
return m_VecGlyphCharge[i].nCharge;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// CharmItemKeyTable
|
|
bool CDNGameDataManager::LoadCharmItemKeyData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TCHARMITEMKEY );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TCHARMITEMKEY );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TCHARMITEMKEY );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"CharmItemKeyTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"CharmItemKeyTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
// return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapCharmKeyItem.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _CharmItemID; // 惑磊 ItemID
|
|
int _Key[CharmItemKeyMax]; // 凯艰ID
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._CharmItemID = pSox->GetFieldNum("_CharmItemID");
|
|
sFieldNum._Key[0] = pSox->GetFieldNum("_Key1");
|
|
sFieldNum._Key[1] = pSox->GetFieldNum("_Key2");
|
|
sFieldNum._Key[2] = pSox->GetFieldNum("_Key3");
|
|
sFieldNum._Key[3] = pSox->GetFieldNum("_Key4");
|
|
sFieldNum._Key[4] = pSox->GetFieldNum("_Key5");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TCharmItemKeyData Data = {0, };
|
|
Data.nCharmItemID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._CharmItemID)->GetInteger();
|
|
if (Data.nCharmItemID <= 0) continue;
|
|
for (int j = 0; j < 5; j++){
|
|
int nKey = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Key[j])->GetInteger();
|
|
if (nKey > 0)
|
|
Data.nKeyList.push_back(nKey);
|
|
}
|
|
|
|
m_MapCharmKeyItem.insert(make_pair(Data.nCharmItemID, Data));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TCharmItemKeyData *CDNGameDataManager::GetCharmKeyData(int nItemID)
|
|
{
|
|
if (m_MapCharmKeyItem.empty()) return NULL;
|
|
|
|
TMapCharmKeyItem::iterator iter = m_MapCharmKeyItem.find(nItemID);
|
|
if (iter == m_MapCharmKeyItem.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
// CharmItemTable
|
|
bool CDNGameDataManager::LoadCharmItemData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TCHARMITEM );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TCHARMITEM );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TCHARMITEM );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"CharmItemTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"CharmItemTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
// return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapCharmItem.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _CharmNum; // 概仿酒捞袍 锅龋
|
|
int _Count; // 蜡历啊 裙垫且 俺荐
|
|
int _Prob; // 犬伏
|
|
int _Period; // 扁埃
|
|
int _ItemID; // 酒捞袍ID
|
|
int _Gold; // 榜靛
|
|
int _Msg; // 皋矫瘤 焊尘瘤 咯何
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._CharmNum = pSox->GetFieldNum("_CharmNum");
|
|
sFieldNum._Count = pSox->GetFieldNum("_Count");
|
|
sFieldNum._Prob = pSox->GetFieldNum("_Prob");
|
|
sFieldNum._Period = pSox->GetFieldNum("_Period");
|
|
sFieldNum._ItemID = pSox->GetFieldNum("_ItemID");
|
|
sFieldNum._Msg = pSox->GetFieldNum("_Msg");
|
|
sFieldNum._Gold = pSox->GetFieldNum("_Gold");
|
|
|
|
int nNeedEmptyCoinAmount = (int)CGlobalWeightIntTable::GetInstance().GetValue(CGlobalWeightIntTable::CharmItemEmptyCoinAmount);
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
int nCharmNo = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._CharmNum)->GetInteger();
|
|
if (nCharmNo <= 0) continue;
|
|
|
|
TCharmItem Item = {0, };
|
|
#if defined(PRE_FIX_68828)
|
|
Item.nCharmID = nItemID;
|
|
#endif
|
|
Item.nItemID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ItemID)->GetInteger();
|
|
Item.nCount = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Count)->GetInteger();
|
|
Item.nPeriod = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Period)->GetInteger();
|
|
Item.nProb = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Prob)->GetInteger();
|
|
Item.bMsg = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Msg)->GetInteger() ? true : false;
|
|
Item.nGold = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Gold)->GetInteger();
|
|
|
|
if (!Item.nItemID || !Item.nCount)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"CharmItemTable.dnt ItemID[%d] Invalid Data, setting default count to 0\r\n", nItemID );
|
|
//rlkt_test
|
|
if (Item.nItemID > 0)
|
|
{
|
|
Item.nCount = 0;
|
|
}else{
|
|
return false;
|
|
}
|
|
|
|
}
|
|
|
|
if (Item.nProb <= 0)
|
|
{
|
|
Item.nProb = 1;
|
|
g_Log.Log(LogType::_FILELOG, L"CharmItemTable.dnt ItemID[%d] Probability==0 , Probability is now 1 \r\n", nItemID);
|
|
}
|
|
|
|
if (Item.nGold > 0 && Item.nGold > nNeedEmptyCoinAmount)
|
|
{
|
|
Item.nGold = nNeedEmptyCoinAmount;
|
|
//rlkt_test
|
|
g_Log.Log( LogType::_FILELOG, L"CharmItemTable.dnt ItemID[%d] Gold OverFlow MaxCoin[%d] \r\n", nItemID, nNeedEmptyCoinAmount );
|
|
//return false;
|
|
}
|
|
m_MapCharmItem[nCharmNo].CharmItemList.push_back(Item);
|
|
m_MapCharmItem[nCharmNo].nCharmNo = nCharmNo;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TCharmItemData *CDNGameDataManager::GetCharmItemData(int nCharmNo)
|
|
{
|
|
if (nCharmNo <= 0) return NULL;
|
|
|
|
TMapCharmItem::iterator iter = m_MapCharmItem.find(nCharmNo);
|
|
if (iter == m_MapCharmItem.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
#if defined(PRE_ADD_GETITEM_WITH_RANDOMVALUE)
|
|
// CharmCountTable
|
|
bool CDNGameDataManager::LoadCharmCountData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TCHARMCOUNT );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TCHARMCOUNT );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TCHARMCOUNT );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"charmcounttable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"charmcounttable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
// return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapCharmCount.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _CharmCount_Min;
|
|
int _CharmCount_Max;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._CharmCount_Min = pSox->GetFieldNum("_CharmCount_Min");
|
|
sFieldNum._CharmCount_Max = pSox->GetFieldNum("_CharmCount_Max");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TCharmCountData Data = {0, };
|
|
Data.nID = nItemID;
|
|
Data.nMin = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._CharmCount_Min)->GetInteger();
|
|
Data.nMax = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._CharmCount_Max)->GetInteger();
|
|
|
|
m_MapCharmCount.insert(make_pair(Data.nID, Data));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TCharmCountData *CDNGameDataManager::GetCharmCountData(int nID)
|
|
{
|
|
TMapCharmCount::iterator iter = m_MapCharmCount.find(nID);
|
|
if (iter == m_MapCharmCount.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
#endif // #if defined(PRE_ADD_GETITEM_WITH_RANDOMVALUE)
|
|
|
|
#if defined (PRE_ADD_CHAOSCUBE)
|
|
// ChaosCubeStuffTable
|
|
bool CDNGameDataManager::LoadChaosCubeStuffData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TCHAOSCUBESTUFF );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TCHAOSCUBESTUFF );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TCHAOSCUBESTUFF );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"chaoscubestufftable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"chaoscubestufftable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
// return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapChaosStuffItem.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _ChaosNum; // 概仿酒捞袍 锅龋
|
|
int _Count; //
|
|
int _ItemID; // 酒捞袍ID
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._ChaosNum = pSox->GetFieldNum("_ChaoscubeNum");
|
|
sFieldNum._Count = pSox->GetFieldNum("_Count");
|
|
sFieldNum._ItemID = pSox->GetFieldNum("_ItemID");
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
int nChaosNo = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ChaosNum)->GetInteger();
|
|
if (nChaosNo <= 0) continue;
|
|
|
|
TChaosStuffItem Item = {0, };
|
|
Item.nItemID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ItemID)->GetInteger();
|
|
Item.nCount = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Count)->GetInteger();
|
|
|
|
m_MapChaosStuffItem[Item.nItemID] = Item;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TChaosStuffItem* CDNGameDataManager::GetChaosStuffItemData(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return NULL;
|
|
|
|
TMapChaosStuffItem::iterator iter = m_MapChaosStuffItem.find(nItemID);
|
|
if (iter == m_MapChaosStuffItem.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
// ChaosCubeResultTable
|
|
bool CDNGameDataManager::LoadChaosCubeResultData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TCHAOSCUBERESULT );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TCHAOSCUBERESULT );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TCHAOSCUBERESULT );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"chaoscuberesulttable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"chaoscuberesulttable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
// return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapChaosItem.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _ChaosNum; // 概仿酒捞袍 锅龋
|
|
int _Count; // 蜡历啊 裙垫且 俺荐
|
|
int _Prob; // 犬伏
|
|
int _Period; // 扁埃
|
|
int _ItemID; // 酒捞袍ID
|
|
int _Gold; // 榜靛
|
|
int _Msg; // 皋矫瘤 焊尘瘤 咯何
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._ChaosNum = pSox->GetFieldNum("_ChaoscubeNum");
|
|
sFieldNum._Count = pSox->GetFieldNum("_Count");
|
|
sFieldNum._Prob = pSox->GetFieldNum("_Prob");
|
|
sFieldNum._Period = pSox->GetFieldNum("_Period");
|
|
sFieldNum._ItemID = pSox->GetFieldNum("_ItemID");
|
|
sFieldNum._Msg = pSox->GetFieldNum("_Msg");
|
|
sFieldNum._Gold = pSox->GetFieldNum("_Gold");
|
|
|
|
int nNeedEmptyCoinAmount = (int)CGlobalWeightIntTable::GetInstance().GetValue(CGlobalWeightIntTable::CharmItemEmptyCoinAmount);
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
int nChaosNo = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ChaosNum)->GetInteger();
|
|
if (nChaosNo <= 0) continue;
|
|
|
|
TChaosResultItem Item = {0, };
|
|
Item.nItemID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ItemID)->GetInteger();
|
|
Item.nCount = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Count)->GetInteger();
|
|
Item.nPeriod = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Period)->GetInteger();
|
|
Item.nProb = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Prob)->GetInteger();
|
|
Item.bMsg = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Msg)->GetInteger() ? true : false;
|
|
Item.nGold = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Gold)->GetInteger();
|
|
|
|
if (!Item.nItemID || !Item.nCount)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"chaoscuberesulttable.dnt ItemID[%d] Invalid Data \r\n", nItemID );
|
|
return false;
|
|
}
|
|
|
|
if (Item.nGold > 0 && Item.nGold > nNeedEmptyCoinAmount)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"chaoscuberesulttable.dnt ItemID[%d] Gold OverFlow MaxCoin[%d] \r\n", nItemID, nNeedEmptyCoinAmount );
|
|
return false;
|
|
}
|
|
|
|
m_MapChaosItem[nChaosNo].ChaosItemList.push_back(Item);
|
|
m_MapChaosItem[nChaosNo].nChaosNo = nChaosNo;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TChaosItemData* CDNGameDataManager::GetChaosItemData(int nChaosNo)
|
|
{
|
|
if (nChaosNo <= 0) return NULL;
|
|
|
|
TMapChaosItem::iterator iter = m_MapChaosItem.find(nChaosNo);
|
|
if (iter == m_MapChaosItem.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
#endif
|
|
|
|
bool CDNGameDataManager::LoadGuildLevelData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TGUILDLEVEL );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TGUILDLEVEL );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGUILDLEVEL );
|
|
#endif //#ifdef _WORK
|
|
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"guildleveltable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"guildleveltable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_GuildLevel.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _GuildLevel;
|
|
int _ReqGold;
|
|
int _ReqGuildPoint;
|
|
int _DailyGuildPointLimit;
|
|
int _DailyMissionPointLimit;
|
|
int _IsApplicable;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._GuildLevel = pSox->GetFieldNum("_GuildLevel");
|
|
sFieldNum._ReqGold = pSox->GetFieldNum("_ReqGold");
|
|
sFieldNum._ReqGuildPoint = pSox->GetFieldNum("_ReqGuildPoint");
|
|
sFieldNum._DailyGuildPointLimit = pSox->GetFieldNum("_DailyGuildPointLimit");
|
|
sFieldNum._DailyMissionPointLimit = pSox->GetFieldNum("_DailyMissionPointLimit");
|
|
sFieldNum._IsApplicable = pSox->GetFieldNum("_IsApplicable");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
int nLevel = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._GuildLevel)->GetInteger();
|
|
|
|
TGuildLevel Data = {0, };
|
|
|
|
Data.nReqGuildPoint = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ReqGuildPoint)->GetInteger();
|
|
Data.nReqGold = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ReqGold)->GetInteger();
|
|
Data.nDailyGuildPointLimit = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._DailyGuildPointLimit)->GetInteger();
|
|
Data.nDailyMissionPointLimit = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._DailyMissionPointLimit)->GetInteger();
|
|
Data.bApplicable = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._IsApplicable)->GetInteger() ? true : false;
|
|
|
|
if (Data.bApplicable)
|
|
{
|
|
m_GuildLevel[nLevel] = Data;
|
|
m_GuildLevel[nLevel].nLevel = nLevel;
|
|
|
|
m_nMaxGuildExp = Data.nReqGuildPoint;
|
|
if (m_nMaxGuildLevel < nLevel)
|
|
m_nMaxGuildLevel = nLevel;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetMaxGuildExp()
|
|
{
|
|
return m_nMaxGuildExp;
|
|
}
|
|
|
|
int CDNGameDataManager::GetMaxMaxGuildLevel()
|
|
{
|
|
return m_nMaxGuildLevel;
|
|
}
|
|
|
|
TGuildLevel *CDNGameDataManager::GetGuildLevelData(int nLevel)
|
|
{
|
|
if (nLevel <= 0) return NULL;
|
|
|
|
TMapGuilLevel::iterator iter = m_GuildLevel.find(nLevel);
|
|
if (iter == m_GuildLevel.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadGuildWarPointData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TGUILDWARPOINT );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TGUILDWARPOINT );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGUILDWARPOINT );
|
|
#endif //#ifdef _WORK
|
|
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"guildwarpointtable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"guildwarpointtable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_GuildWarPoint.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _GuildWarRank;
|
|
int _RewardGuildPoint;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._GuildWarRank = pSox->GetFieldNum("_GuildWarRank");
|
|
sFieldNum._RewardGuildPoint = pSox->GetFieldNum("_RewardGuildPoint");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
int nRank = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._GuildWarRank)->GetInteger();
|
|
|
|
TGuildWarPoint Data = {0, };
|
|
|
|
Data.nRewardGuildPoint = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._RewardGuildPoint)->GetInteger();
|
|
|
|
m_GuildWarPoint[nRank] = Data;
|
|
m_GuildWarPoint[nRank].nRank = nRank;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TGuildWarPoint *CDNGameDataManager::GetGuildWarPointData(int nRank)
|
|
{
|
|
if (nRank <= 0) return NULL;
|
|
|
|
TMapGuilWarPoint::iterator iter = m_GuildWarPoint.find(nRank);
|
|
if (iter == m_GuildWarPoint.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadGuildWareData()
|
|
{
|
|
|
|
// 弥措蔼 檬扁拳
|
|
m_nGuildLimitMaxCoin = 0;
|
|
m_nGuildLimitMaxItem = 0;
|
|
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TGUILDWAREHOUSE );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TGUILDWAREHOUSE );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGUILDWAREHOUSE );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"GuildWareHouse.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"GuildWareHouse.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_GuildLimitItem.clear();
|
|
m_GuildLimitCoin.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _WareHouseType;
|
|
int _LimitIndex;
|
|
int _LimitValue;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._WareHouseType = pSox->GetFieldNum("_WareHouseType");
|
|
sFieldNum._LimitIndex = pSox->GetFieldNum("_Limit_Index");
|
|
sFieldNum._LimitValue = pSox->GetFieldNum("_Limit_Value");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); i++)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
int nType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._WareHouseType)->GetInteger();
|
|
int nLimitIndex = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._LimitIndex)->GetInteger();
|
|
int nLimitValue = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._LimitValue)->GetInteger();
|
|
|
|
// 辨靛芒绊 酒捞袍 捞侩力茄
|
|
if (nType == 0)
|
|
{
|
|
// 吝汗虐 八荤
|
|
if (m_GuildLimitItem.find(nLimitIndex) != m_GuildLimitItem.end())
|
|
{
|
|
DN_ASSERT(0, "Check!");
|
|
}
|
|
|
|
// 弥措蔼 魂免
|
|
if (nLimitValue > m_nGuildLimitMaxItem)
|
|
m_nGuildLimitMaxItem = nLimitValue;
|
|
|
|
m_GuildLimitItem[nLimitIndex] = nLimitValue;
|
|
}
|
|
// 辨靛芒绊 免陛 力茄
|
|
else if (nType == 1)
|
|
{
|
|
// 吝汗虐 八荤
|
|
if (m_GuildLimitCoin.find(nLimitIndex) != m_GuildLimitCoin.end())
|
|
{
|
|
DN_ASSERT(0, "Check");
|
|
}
|
|
|
|
|
|
// 弥措蔼 魂免
|
|
if (nLimitValue > m_nGuildLimitMaxCoin)
|
|
m_nGuildLimitMaxCoin = nLimitValue;
|
|
|
|
m_GuildLimitCoin[nLimitIndex] = nLimitValue;
|
|
}
|
|
else
|
|
DN_ASSERT(0, "Check");
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetGuildLimitItem(int nIndex)
|
|
{
|
|
if (nIndex < 0) return -1;
|
|
|
|
std::map <int, int>::iterator iter = m_GuildLimitItem.find(nIndex);
|
|
if (iter == m_GuildLimitItem.end()) return -1;
|
|
|
|
return iter->second;
|
|
}
|
|
|
|
|
|
int CDNGameDataManager::GetGuildLimitCoin(int nIndex)
|
|
{
|
|
if (nIndex < 0) return -1;
|
|
|
|
std::map <int, int>::iterator iter = m_GuildLimitCoin.find(nIndex);
|
|
if (iter == m_GuildLimitCoin.end()) return -1;
|
|
|
|
return iter->second;
|
|
}
|
|
|
|
int CDNGameDataManager::GetGuildLimitMaxItem()
|
|
{
|
|
return m_nGuildLimitMaxItem;
|
|
}
|
|
|
|
int CDNGameDataManager::GetGuildLimitMaxCoin()
|
|
{
|
|
return m_nGuildLimitMaxCoin;
|
|
}
|
|
|
|
// VehicleTable
|
|
bool CDNGameDataManager::LoadVehicleData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TVEHICLE );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TVEHICLE );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TVEHICLE );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"vehicletable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"vehicletable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapVehicle.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _VehicleClassID;
|
|
int _VehicleActorID;
|
|
int _DefaultBodyParts;
|
|
int _DefaultPartsA;
|
|
int _DefaultPartsB;
|
|
int _VehicleSummonTime;
|
|
int _VehicleDefaultSpeed;
|
|
int _nPetLevelTypeID;
|
|
int _nPetSkillID1;
|
|
int _nPetSkillID2;
|
|
int _nRange;
|
|
int _nFoodID;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._VehicleClassID = pSox->GetFieldNum("_VehicleClassID");
|
|
sFieldNum._VehicleActorID = pSox->GetFieldNum("_VehicleActorID");
|
|
sFieldNum._DefaultBodyParts = pSox->GetFieldNum("_DefaultBodyParts");
|
|
sFieldNum._DefaultPartsA = pSox->GetFieldNum("_DefaultPartsA");
|
|
sFieldNum._DefaultPartsB = pSox->GetFieldNum("_DefaultPartsB");
|
|
sFieldNum._VehicleSummonTime = pSox->GetFieldNum("_VehicleSummonTime");
|
|
sFieldNum._VehicleDefaultSpeed = pSox->GetFieldNum("_VehicleDefaultSpeed");
|
|
sFieldNum._nPetLevelTypeID = pSox->GetFieldNum("_PetLevelTypeID");
|
|
sFieldNum._nPetSkillID1 = pSox->GetFieldNum("_PetSKILLID1");
|
|
sFieldNum._nPetSkillID2 = pSox->GetFieldNum("_PetSKILLID2");
|
|
sFieldNum._nRange = pSox->GetFieldNum("_Range");
|
|
sFieldNum._nFoodID = pSox->GetFieldNum("_FoodID");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TVehicleData Data = {0, };
|
|
Data.nItemID = nItemID;
|
|
Data.nVehicleClassID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VehicleClassID)->GetInteger();
|
|
Data.nVehicleActorID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VehicleActorID)->GetInteger();
|
|
Data.nDefaultBody = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._DefaultBodyParts)->GetInteger();
|
|
Data.nDefaultParts1 = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._DefaultPartsA)->GetInteger();
|
|
Data.nDefaultParts2 = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._DefaultPartsB)->GetInteger();
|
|
Data.nVehicleSummonTime = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VehicleSummonTime)->GetInteger();
|
|
Data.nVehicleDefaultSpeed = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VehicleDefaultSpeed)->GetInteger();
|
|
Data.nPetLevelTypeID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nPetLevelTypeID)->GetInteger();
|
|
Data.nPetSkillID1 = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nPetSkillID1)->GetInteger();
|
|
Data.nPetSkillID2 = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nPetSkillID2)->GetInteger();
|
|
Data.nRange = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nRange)->GetInteger();
|
|
Data.nFoodID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nFoodID)->GetInteger();
|
|
m_MapVehicle.insert(make_pair(Data.nItemID, Data));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TVehicleData *CDNGameDataManager::GetVehicleData(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return NULL;
|
|
|
|
TMapVehicleData::iterator iter = m_MapVehicle.find(nItemID);
|
|
if (iter == m_MapVehicle.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
int CDNGameDataManager::GetVehicleClassID(int nItemID)
|
|
{
|
|
TVehicleData *pVehicle = GetVehicleData(nItemID);
|
|
if (!pVehicle) return 0;
|
|
|
|
return pVehicle->nVehicleClassID;
|
|
}
|
|
|
|
int CDNGameDataManager::GetVehicleActorID(int nItemID)
|
|
{
|
|
TVehicleData *pVehicle = GetVehicleData(nItemID);
|
|
if (!pVehicle) return 0;
|
|
|
|
return pVehicle->nVehicleActorID;
|
|
}
|
|
|
|
int CDNGameDataManager::GetPetLevelTypeID(int nItemID)
|
|
{
|
|
TVehicleData *pVehicle = GetVehicleData(nItemID);
|
|
if (!pVehicle) return 0;
|
|
|
|
return pVehicle->nPetLevelTypeID;
|
|
}
|
|
|
|
// VehiclePartsTable
|
|
bool CDNGameDataManager::LoadVehiclePartsData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TVEHICLEPARTS );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TVEHICLEPARTS );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TVEHICLEPARTS );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"vehiclepartstable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"vehiclepartstable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapVehicleParts.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _VehicleClassID;
|
|
int _VehiclePartsType;
|
|
int _SkinName;
|
|
int _AniName;
|
|
int _ActName;
|
|
int _SkinColor;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._VehicleClassID = pSox->GetFieldNum("_VehicleClassID");
|
|
sFieldNum._VehiclePartsType = pSox->GetFieldNum("_VehiclePartsType");
|
|
sFieldNum._SkinName = pSox->GetFieldNum("_SkinName");
|
|
sFieldNum._AniName = pSox->GetFieldNum("_AniName");
|
|
sFieldNum._ActName = pSox->GetFieldNum("_ActName");
|
|
sFieldNum._SkinColor = pSox->GetFieldNum("_SkinColor");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
//TVehiclePartsData Data = {0, };
|
|
//2010.10.7 haling STL 焊龋 困秦 积己磊肺 函券
|
|
TVehiclePartsData Data;
|
|
Data.nItemID = nItemID;
|
|
Data.nVehicleClassID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VehicleClassID)->GetInteger();
|
|
Data.nVehiclePartsType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VehiclePartsType)->GetInteger() + 1;
|
|
Data.strSkinName = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SkinName)->GetString();
|
|
Data.strAniName = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._AniName)->GetString();
|
|
Data.strActName = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ActName)->GetString();
|
|
Data.nSkinColor = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SkinColor)->GetInteger();
|
|
|
|
m_MapVehicleParts.insert(make_pair(Data.nItemID, Data));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TVehiclePartsData *CDNGameDataManager::GetVehiclePartsData(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return NULL;
|
|
|
|
TMapVehicleParts::iterator iter = m_MapVehicleParts.find(nItemID);
|
|
if (iter == m_MapVehicleParts.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
int CDNGameDataManager::GetVehiclePartsType(int nItemID)
|
|
{
|
|
TVehiclePartsData *pVehicle = GetVehiclePartsData(nItemID);
|
|
if (!pVehicle) return 0;
|
|
|
|
return pVehicle->nVehiclePartsType;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadPetLevelData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPETLEVEL );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TPETLEVEL );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPETLEVEL );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"petleveltable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"petleveltable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PMAP(TMapPetLevelData, m_pPetLevelData);
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _PetLevelTypeID;
|
|
int _PetLevel;
|
|
int _PetExp;
|
|
std::vector<int> _State;
|
|
std::vector<int> _State_Min;
|
|
std::vector<int> _State_Max;
|
|
int _VipExp;
|
|
};
|
|
|
|
char szTemp[256] = { 0, };
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._PetLevelTypeID = pSox->GetFieldNum("_PetLevelTypeID");
|
|
sFieldNum._PetLevel = pSox->GetFieldNum("_PetLevel");
|
|
sFieldNum._PetExp = pSox->GetFieldNum("_PetExp");
|
|
sFieldNum._State.reserve(PetStateMax);
|
|
sFieldNum._State_Min.reserve(PetStateMax);
|
|
sFieldNum._State_Max.reserve(PetStateMax);
|
|
for (int j = 0; j < PetStateMax; ++j)
|
|
{
|
|
sprintf_s(szTemp, "_State%d", j+1);
|
|
sFieldNum._State.push_back(pSox->GetFieldNum(szTemp));
|
|
sprintf_s(szTemp, "_State%d_Min", j+1);
|
|
sFieldNum._State_Min.push_back(pSox->GetFieldNum(szTemp));
|
|
sprintf_s(szTemp, "_State%d_Max", j+1);
|
|
sFieldNum._State_Max.push_back(pSox->GetFieldNum(szTemp));
|
|
}
|
|
|
|
sFieldNum._VipExp = pSox->GetFieldNum("_VipExp");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
int nPetLevelType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PetLevelTypeID)->GetInteger();
|
|
|
|
TPetLevelData *pData = GetPetLevelData(nPetLevelType);
|
|
if (!pData){
|
|
pData = new TPetLevelData;
|
|
pData->nPetLevelType = nPetLevelType;
|
|
m_pPetLevelData.insert(make_pair(nPetLevelType, pData));
|
|
}
|
|
|
|
TPetLevelDetail Detail = {0,};
|
|
Detail.nTableIndex = nItemID;
|
|
Detail.nPetLevel = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PetLevel)->GetInteger();
|
|
Detail.nPetExp = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PetExp)->GetInteger();
|
|
|
|
for (int j = 0; j < PetStateMax; j++){
|
|
Detail.nState[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._State[j])->GetInteger();
|
|
Detail.szStateMin[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._State_Min[j])->GetString();
|
|
Detail.szStateMax[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._State_Max[j])->GetString();
|
|
}
|
|
|
|
Detail.nVipExp = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VipExp)->GetInteger();
|
|
|
|
pData->VecPetLevel.push_back(Detail);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TPetLevelData *CDNGameDataManager::GetPetLevelData(int nPetLevelType)
|
|
{
|
|
TMapPetLevelData::iterator iter = m_pPetLevelData.find(nPetLevelType);
|
|
if (iter == m_pPetLevelData.end()) return NULL;
|
|
|
|
return iter->second;
|
|
}
|
|
|
|
TPetLevelDetail *CDNGameDataManager::GetPetLevelDetail(int nPetBodyItemID, int nPetExp)
|
|
{
|
|
int nLevelTypeID = GetPetLevelTypeID(nPetBodyItemID);
|
|
TPetLevelData *pPetData = g_pDataManager->GetPetLevelData(nLevelTypeID);
|
|
if (!pPetData) return NULL;
|
|
if (pPetData->VecPetLevel.empty()) return NULL;
|
|
|
|
int nPetLevelIndex = -1;
|
|
for (int i = 0; i <(int)pPetData->VecPetLevel.size(); i++)
|
|
{
|
|
if( nPetExp < pPetData->VecPetLevel[i].nPetExp )
|
|
{
|
|
nPetLevelIndex = i;
|
|
break;
|
|
}
|
|
else
|
|
nPetLevelIndex = i; // MAX饭闺老 版快
|
|
}
|
|
|
|
if( nPetLevelIndex == -1 )
|
|
return NULL;
|
|
|
|
return &(pPetData->VecPetLevel[nPetLevelIndex]);
|
|
}
|
|
|
|
int CDNGameDataManager::GetPetLevelTableIndex(int nPetBodyItemID, int nPetExp)
|
|
{
|
|
TPetLevelDetail *pDetail = GetPetLevelDetail(nPetBodyItemID, nPetExp);
|
|
if (!pDetail) return -1;
|
|
|
|
return pDetail->nTableIndex;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadPetFoodData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPETFOOD );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TPETFOOD );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPETFOOD );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"petfoodtable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"vehiclepartstable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapVehicleParts.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _FullTime;
|
|
int _FullTic;
|
|
int _FullTimeLogout;
|
|
int _FullMaxCount;
|
|
std::vector<int> _UseExp;
|
|
std::vector<int> _UseState;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._FullTime = pSox->GetFieldNum("_FullTime");
|
|
sFieldNum._FullTic = pSox->GetFieldNum("_FullTic");
|
|
sFieldNum._FullTimeLogout = pSox->GetFieldNum("_FullTimeLogout");
|
|
sFieldNum._FullMaxCount = pSox->GetFieldNum("_FullMaxCount");
|
|
sFieldNum._UseExp.reserve(Pet::MAX_SATIETY_SELECTION);
|
|
sFieldNum._UseState.reserve(Pet::MAX_SATIETY_SELECTION);
|
|
|
|
char szTemp[256] = { 0, };
|
|
for (int j = 0; j < Pet::MAX_SATIETY_SELECTION; ++j)
|
|
{
|
|
sprintf_s(szTemp, "_Useexp%d", j+1);
|
|
sFieldNum._UseExp.push_back(pSox->GetFieldNum(szTemp));
|
|
sprintf_s(szTemp, "_Usestate%d", j+1);
|
|
sFieldNum._UseState.push_back(pSox->GetFieldNum(szTemp));
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TPetFoodData Data = {0, };
|
|
Data.nItemID = nItemID;
|
|
Data.nTickTime = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._FullTime)->GetInteger();
|
|
Data.nFullTic = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._FullTic)->GetInteger();
|
|
Data.cFullTimeLogOut = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._FullTimeLogout)->GetInteger();
|
|
Data.nFullMaxCount = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._FullMaxCount)->GetInteger();
|
|
|
|
for (int j = 0; j < Pet::MAX_SATIETY_SELECTION; j++){
|
|
Data.nUseExp[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._UseExp[j])->GetInteger();
|
|
Data.nUseState[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._UseState[j])->GetInteger();
|
|
}
|
|
|
|
m_MapPetFoodData.insert(make_pair(Data.nItemID, Data));
|
|
}
|
|
return true;
|
|
}
|
|
|
|
TPetFoodData *CDNGameDataManager::GetPetFoodData(int nItemID)
|
|
{
|
|
TMapPetFoodData::iterator iter = m_MapPetFoodData.find(nItemID);
|
|
if (iter == m_MapPetFoodData.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
unsigned int CDNGameDataManager::MemoryToRSHashKey(const wchar_t *pszData, long nSize)
|
|
{
|
|
unsigned int nB = 378551;
|
|
unsigned int nA = 63689;
|
|
unsigned int nHashKey = 0;
|
|
|
|
for (int i = 0; i < nSize; i++)
|
|
{
|
|
nHashKey = nHashKey * nA + pszData[i];
|
|
nA = nA * nB;
|
|
}
|
|
|
|
return (nHashKey & 0x7FFFFFFF);
|
|
}
|
|
|
|
#if defined(PRE_ADD_MULTILANGUAGE)
|
|
bool CDNGameDataManager::LoadProhibitWord(int nLanguage, const char * pszFilePath)
|
|
{
|
|
if (pszFilePath == NULL)
|
|
return false;
|
|
|
|
CXMLParser parser;
|
|
if (parser.Open(pszFilePath) == false)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"%S failed\r\n", pszFilePath);
|
|
return false;
|
|
}
|
|
|
|
TProhibitWord * pProhibit = GetLanguageSlangFilter(nLanguage);
|
|
if (pProhibit == NULL)
|
|
{
|
|
TProhibitWord mProhibit;
|
|
m_ProhibitWordList.insert(std::make_pair(nLanguage, mProhibit));
|
|
|
|
pProhibit = GetLanguageSlangFilter(nLanguage);
|
|
if (pProhibit == NULL)
|
|
return false;
|
|
}
|
|
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
bool CDNGameDataManager::LoadProhibitWord()
|
|
{
|
|
char buf[_MAX_PATH] = { 0, };
|
|
sprintf_s( buf, "%s/Resource/UIString/ProhibitWord.xml", g_Config.szResourcePath.c_str() );
|
|
|
|
CXMLParser parser;
|
|
|
|
if (parser.Open(buf) == false)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"ProhibitWord.xml failed\r\n");
|
|
return false;
|
|
}
|
|
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
|
|
if (parser.FirstChildElement("ProhibitWord", true) == true)
|
|
{
|
|
if (parser.FirstChildElement("Account", true) == true)
|
|
{
|
|
if (parser.FirstChildElement("AccountWord", true) == true)
|
|
{
|
|
do {
|
|
if (parser.GetText())
|
|
{
|
|
wstring wszStr = parser.GetText();
|
|
std::transform( wszStr.begin(), wszStr.end(), wszStr.begin(), towlower );
|
|
unsigned int nHashKey = MemoryToRSHashKey(wszStr.c_str(), (long)wszStr.length());
|
|
#if defined(PRE_ADD_MULTILANGUAGE)
|
|
pProhibit->insert(make_pair(nHashKey, wszStr));
|
|
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
m_ProhibitWordList.insert(make_pair(nHashKey, wszStr));
|
|
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
}
|
|
|
|
/*if (parser.GetText()){
|
|
wstring wszStr = parser.GetText();
|
|
unsigned int nHashKey = MemoryToRSHashKey(wszStr.c_str(), (long)wszStr.length());
|
|
m_ProhibitWordList.insert(make_pair(nHashKey, wszStr));
|
|
}*/
|
|
} while(parser.NextSiblingElement("AccountWord"));
|
|
|
|
parser.GoParent();
|
|
}
|
|
|
|
parser.GoParent();
|
|
}
|
|
|
|
#if defined(_KR) || defined(_KRAZ)
|
|
if (parser.FirstChildElement("Chat", true) == true)
|
|
{
|
|
if (parser.FirstChildElement("ChatWord", true) == true)
|
|
{
|
|
do {
|
|
if (parser.GetText())
|
|
{
|
|
wstring wszStr = parser.GetText();
|
|
std::transform( wszStr.begin(), wszStr.end(), wszStr.begin(), towlower );
|
|
unsigned int nHashKey = MemoryToRSHashKey(wszStr.c_str(), (long)wszStr.length());
|
|
#if defined(PRE_ADD_MULTILANGUAGE)
|
|
pProhibit->insert(make_pair(nHashKey, wszStr));
|
|
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
m_ProhibitWordList.insert(make_pair(nHashKey, wszStr));
|
|
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
}
|
|
} while(parser.NextSiblingElement("ChatWord"));
|
|
|
|
parser.GoParent();
|
|
}
|
|
|
|
parser.GoParent();
|
|
}
|
|
#endif
|
|
return true;
|
|
}
|
|
|
|
g_Log.Log( LogType::_FILELOG, L"ProhibitWord parsing failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
#if defined(PRE_ADD_MULTILANGUAGE)
|
|
CDNGameDataManager::TProhibitWord * CDNGameDataManager::GetLanguageSlangFilter(int nLanguage)
|
|
{
|
|
TProhibitWord * pList = NULL;
|
|
std::map <int, TProhibitWord>::iterator ii = m_ProhibitWordList.find(nLanguage);
|
|
if (ii != m_ProhibitWordList.end())
|
|
return &(*ii).second;
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::CheckProhibitWord(int nLanguage, const wchar_t *pwszWord)
|
|
{
|
|
TProhibitWord * pProhibit = GetLanguageSlangFilter(nLanguage);
|
|
if (pProhibit)
|
|
{
|
|
std::wstring::size_type index;
|
|
|
|
std::wstring strTemp(pwszWord);
|
|
std::transform ( strTemp.begin(), strTemp.end(), strTemp.begin(), towlower );
|
|
|
|
for( std::map<unsigned int, std::wstring>::iterator itor = pProhibit->begin(); itor != pProhibit->end(); itor++ )
|
|
{
|
|
index = strTemp.find( itor->second );
|
|
if( index != string::npos )
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
bool CDNGameDataManager::CheckProhibitWord(const wchar_t *pwszWord)
|
|
{
|
|
std::wstring::size_type index;
|
|
|
|
std::wstring strTemp(pwszWord);
|
|
std::transform ( strTemp.begin(), strTemp.end(), strTemp.begin(), towlower );
|
|
|
|
for( std::map<unsigned int, std::wstring>::iterator itor = m_ProhibitWordList.begin(); itor != m_ProhibitWordList.end(); itor++ )
|
|
{
|
|
index = strTemp.find( itor->second );
|
|
if( index != string::npos )
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
|
|
bool CDNGameDataManager::LoadExchangeTradeData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TEXCHANGETRADE );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TEXCHANGETRADE );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TEXCHANGETRADE );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"Exchange.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"Exchange.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapExchangeTrade.clear();
|
|
for (int i = 0; i < ITEMEXCHANGEGROUP_MAX; i++)
|
|
m_VecExchangeGroupID[i].clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _CategoryType;
|
|
int _GroupID;
|
|
int _ExchangeType;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._CategoryType = pSox->GetFieldNum("_CategoryType");
|
|
sFieldNum._GroupID = pSox->GetFieldNum("_GroupID");
|
|
sFieldNum._ExchangeType = pSox->GetFieldNum("_ExchangeType");
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
|
|
TExchangeTrade Data;
|
|
Data.nItemID = nItemID;
|
|
Data.nCategoryType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._CategoryType)->GetInteger();
|
|
Data.nGroupID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._GroupID)->GetInteger();
|
|
Data.ExchangeType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ExchangeType)->GetInteger();
|
|
|
|
m_MapExchangeTrade.insert(make_pair(Data.nItemID, Data));
|
|
|
|
// 弊缝酒捞叼 弥措肮荐 八荤
|
|
if (Data.nGroupID >= ITEMEXCHANGEGROUP_MAX)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"LoadExchangeTradeData Over ITEMEXCHANGEGROUP_MAX\r\n");
|
|
return false;
|
|
}
|
|
|
|
// 墨抛绊府ID俊 蝶扼 弊缝喊肺 历厘茄促.
|
|
if (Data.nCategoryType == 1)
|
|
m_VecExchangeGroupID[Data.nGroupID].push_back(Data.ExchangeType);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetExchangeGroupID(int nGroupID, char cItemChange[])
|
|
{
|
|
if (nGroupID >= ITEMEXCHANGEGROUP_MAX)
|
|
return false;
|
|
|
|
if (m_VecExchangeGroupID[nGroupID].empty())
|
|
return false;
|
|
|
|
int i = 0;
|
|
std::vector<char>::iterator iter = m_VecExchangeGroupID[nGroupID].begin();
|
|
for(; iter != m_VecExchangeGroupID[nGroupID].end(); iter++)
|
|
{
|
|
if (i >= ITEMEXCHANGEGROUP_MAX)
|
|
return false;
|
|
|
|
cItemChange[i] = (*iter);
|
|
i++;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TExchangeTrade* CDNGameDataManager::GetExchageTradeData(int nItemID)
|
|
{
|
|
if (nItemID <= 0) return NULL;
|
|
|
|
TMapExchangeTrade::iterator iter = m_MapExchangeTrade.find(nItemID);
|
|
if (iter == m_MapExchangeTrade.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadPVPMissionRoom()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPVPMISSIONROOM );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TPVPMISSIONROOM );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPVPMISSIONROOM );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPMissionRoomTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPMissionRoomTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapPvPMissionRoom.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _PvPMissionRoomGroup;
|
|
int _PvPMapTableID;
|
|
int _PvPGameModeTableID;
|
|
int _WinCondition;
|
|
int _PlayTime;
|
|
int _MaxPlayers;
|
|
int _StartPlayers;
|
|
int _TitleUIString;
|
|
int _DropItem;
|
|
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
int _ChannelType;
|
|
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._PvPMissionRoomGroup = pSox->GetFieldNum("_PvPMissionRoomGroup");
|
|
sFieldNum._PvPMapTableID = pSox->GetFieldNum("_PvPMapTableID");
|
|
sFieldNum._PvPGameModeTableID = pSox->GetFieldNum("_PvPGameModeTableID");
|
|
sFieldNum._WinCondition = pSox->GetFieldNum("_WinCondition");
|
|
sFieldNum._PlayTime = pSox->GetFieldNum("_PlayTime");
|
|
sFieldNum._MaxPlayers = pSox->GetFieldNum("_MaxUser");
|
|
sFieldNum._StartPlayers = pSox->GetFieldNum("_StartUser");
|
|
sFieldNum._TitleUIString = pSox->GetFieldNum("_TitleUIString");
|
|
sFieldNum._DropItem = pSox->GetFieldNum("_DropItem");
|
|
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
sFieldNum._ChannelType = pSox->GetFieldNum("_PVPChannel");
|
|
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
|
|
TPvPMissionRoom Data;
|
|
Data.nItemID = nItemID;
|
|
Data.nGroupID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PvPMissionRoomGroup)->GetInteger();
|
|
Data.nMapID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PvPMapTableID)->GetInteger();
|
|
Data.nModeID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PvPGameModeTableID)->GetInteger();
|
|
Data.nWinCondition = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._WinCondition)->GetInteger();
|
|
Data.nPlayTime = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PlayTime)->GetInteger();
|
|
Data.nMaxPlayers = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._MaxPlayers)->GetInteger();
|
|
Data.nStartPlayers = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._StartPlayers)->GetInteger();
|
|
Data.nRoomNameIndex = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._TitleUIString)->GetInteger();
|
|
Data.bDropItem = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._DropItem)->GetInteger() ? true : false;
|
|
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
Data.nChannelType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ChannelType)->GetInteger();
|
|
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
|
|
// 弊缝酒捞叼 弥措肮荐 八荤
|
|
if (Data.nGroupID >= PVPMISSIONROOMGROUP_MAX)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"LoadPVPMissionRoom Over PVPMISSIONROOMGROUP_MAX\r\n");
|
|
return false;
|
|
}
|
|
|
|
m_MapPvPMissionRoom.insert(make_pair(nItemID, Data));
|
|
|
|
m_VecPvPMissionRoom.push_back(Data);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TPvPMissionRoom* CDNGameDataManager::GetPvPMissionRoom(int nItemID)
|
|
{
|
|
if(nItemID <= 0) return NULL;
|
|
|
|
TMapPvPMissionRoom::iterator iter = m_MapPvPMissionRoom.find(nItemID);
|
|
if(iter == m_MapPvPMissionRoom.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
TVecPvPMissionRoom& CDNGameDataManager::GetVecPvPMissionRoom()
|
|
{
|
|
return m_VecPvPMissionRoom;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadGhoulModeCondition()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TGHOULMODE_CONDITION );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TGHOULMODE_CONDITION );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGHOULMODE_CONDITION );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"ghoulconditiontable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"ghoulconditiontable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_VecGhoulModeCondition.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nPlayerMaxNum[PvPCommon::Common::GhouConditionColCount];
|
|
int nGhoulCount[PvPCommon::Common::GhouConditionColCount];
|
|
int nMatchingMutationGroupID[PvPCommon::Common::GhouConditionColCount];
|
|
};
|
|
|
|
char szTemp1[32];
|
|
char szTemp2[32];
|
|
char szTemp3[32];
|
|
TempFieldNum sFieldNum;
|
|
for (int i = 0; i < PvPCommon::Common::GhouConditionColCount; i++)
|
|
{
|
|
sprintf_s( szTemp1, "_PlayerMaxNum%d", i+1 );
|
|
sprintf_s( szTemp2, "_GhoulCount%d", i+1 );
|
|
sprintf_s( szTemp3, "_GroupIndex%d", i+1 );
|
|
|
|
sFieldNum.nPlayerMaxNum[i] = pSox->GetFieldNum(szTemp1);
|
|
sFieldNum.nGhoulCount[i] = pSox->GetFieldNum(szTemp2);
|
|
sFieldNum.nMatchingMutationGroupID[i] = pSox->GetFieldNum(szTemp3);
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TGhoulConditionData Condition;
|
|
memset(&Condition, 0, sizeof(TGhoulConditionData));
|
|
|
|
Condition.nItemID = nItemID;
|
|
Condition.nItemIdx = nIdx;
|
|
|
|
for (int j = 0; j < PvPCommon::Common::GhouConditionColCount; j++)
|
|
{
|
|
Condition.nPlayerMaxNum[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nPlayerMaxNum[j])->GetInteger();
|
|
Condition.nGhoulCount[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nGhoulCount[j])->GetInteger();
|
|
Condition.nMatchingMutationGroupID[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMatchingMutationGroupID[j])->GetInteger();
|
|
}
|
|
|
|
m_VecGhoulModeCondition.push_back(Condition);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void CDNGameDataManager::GetGhoulGroup(int nUserCount, TMonsterMutationGroup &Group, int &nGhoulCount)
|
|
{
|
|
if(m_VecGhoulModeCondition.empty())
|
|
return ;
|
|
|
|
int nGroupID = -1;
|
|
int nLastCheckUserCount = 0;
|
|
for (int i = 0; i < PvPCommon::Common::GhouConditionColCount; i++)
|
|
{
|
|
if(m_VecGhoulModeCondition[0].nPlayerMaxNum[i] <= 0) continue;
|
|
if(nLastCheckUserCount == 0 ||(m_VecGhoulModeCondition[0].nPlayerMaxNum[i] > nLastCheckUserCount && m_VecGhoulModeCondition[0].nPlayerMaxNum[i] <= nUserCount))
|
|
{
|
|
nLastCheckUserCount = m_VecGhoulModeCondition[0].nPlayerMaxNum[i];
|
|
nGroupID = m_VecGhoulModeCondition[0].nMatchingMutationGroupID[i];
|
|
nGhoulCount = m_VecGhoulModeCondition[0].nGhoulCount[i];
|
|
}
|
|
}
|
|
|
|
if(nGhoulCount <= 0)
|
|
{
|
|
for (int i = 0; i < PvPCommon::Common::GhouConditionColCount; i++)
|
|
{
|
|
if(m_VecGhoulModeCondition[0].nPlayerMaxNum[i] <= 0) continue;
|
|
if(nLastCheckUserCount == 0 || m_VecGhoulModeCondition[0].nPlayerMaxNum[i] < nLastCheckUserCount)
|
|
{
|
|
nLastCheckUserCount = m_VecGhoulModeCondition[0].nPlayerMaxNum[i];
|
|
nGroupID = m_VecGhoulModeCondition[0].nMatchingMutationGroupID[i];
|
|
nGhoulCount = m_VecGhoulModeCondition[0].nGhoulCount[i];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
GetMonsterMutationGroup(nGroupID, Group);
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadMonsterLevel()
|
|
{
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TMONSTER );
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"monstertable.dnt.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"monstertable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
bool isValidLevel = true;
|
|
int nMonsterLevel = 0;
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
nMonsterLevel= pSox->GetFieldFromLablePtr(nItemID, "_Level")->GetInteger();
|
|
|
|
if (nMonsterLevel > m_nMaxPlayerLevel)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"monstertable.dnt Level over than MaxPlayerLevel [ItemID:%d][Level:%d]\r\n", nItemID, nMonsterLevel );
|
|
isValidLevel = false;
|
|
}
|
|
}
|
|
|
|
return isValidLevel;
|
|
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadMonsterMutationGroupData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TMONSTERGROUP_TRANS );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TMONSTERGROUP_TRANS );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TMONSTERGROUP_TRANS );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"monstergrouptable_transform.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"monstergrouptable_transform.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_VecMonsterMutationGroup.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nMonsterID[PvPCommon::Common::MonsterMutationColCount];
|
|
int nProbability[PvPCommon::Common::MonsterMutationColCount];
|
|
};
|
|
|
|
char szTemp1[32];
|
|
char szTemp2[32];
|
|
TempFieldNum sFieldNum;
|
|
for (int i = 0; i < PvPCommon::Common::MonsterMutationColCount; i++)
|
|
{
|
|
sprintf_s( szTemp1, "_MonsterID%d", i+1 );
|
|
sprintf_s( szTemp2, "_Prob%d", i+1 );
|
|
|
|
sFieldNum.nMonsterID[i] = pSox->GetFieldNum(szTemp1);
|
|
sFieldNum.nProbability[i] = pSox->GetFieldNum(szTemp2);
|
|
}
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TMonsterMutationGroup Group;
|
|
memset(&Group, 0, sizeof(TMonsterMutationGroup));
|
|
|
|
Group.nGroupID = nItemID;
|
|
Group.nGourpIdx = nIdx;
|
|
|
|
for (int j = 0; j < PvPCommon::Common::MonsterMutationColCount; j++)
|
|
{
|
|
Group.nMonsterID[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMonsterID[j])->GetInteger();
|
|
Group.nProbability[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nProbability[j])->GetInteger();
|
|
}
|
|
|
|
m_VecMonsterMutationGroup.push_back(Group);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetMonsterMutationGroup(int nGroupID, TMonsterMutationGroup &Group)
|
|
{
|
|
TVecMonsterMutationGroup::iterator ii;
|
|
for(ii = m_VecMonsterMutationGroup.begin(); ii != m_VecMonsterMutationGroup.end(); ii++)
|
|
{
|
|
if((*ii).nGroupID == nGroupID)
|
|
{
|
|
Group = (*ii);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadMonsterMutationData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TMONSTER_TRANS );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TMONSTER_TRANS );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TMONSTER_TRANS );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"monstertable_transform.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"monstertable_transform.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_mMonsterMutationData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nMutationActorID;
|
|
|
|
int nMutationHP;
|
|
int nMutationStrPMax;
|
|
int nMutationStrMMax;
|
|
int nMutationDefP;
|
|
int nMutationDefM;
|
|
int nMutationStiff;
|
|
|
|
int nMutationStiffResis;
|
|
int nMutationCriticalResis;
|
|
int nMutationStunResis;
|
|
|
|
int nMutationWeaponIdx1;
|
|
int nMutationWeaponIdx2;
|
|
int nMutationSkillTableID;
|
|
int nMutationSuperArmor;
|
|
|
|
int nSizeMin;
|
|
int nSizeMax;
|
|
int nMoveSpeed;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nMutationActorID = pSox->GetFieldNum("_ActorTableID");
|
|
sFieldNum.nMutationHP = pSox->GetFieldNum("_HP");
|
|
sFieldNum.nMutationStrPMax = pSox->GetFieldNum("_StrPMax");
|
|
sFieldNum.nMutationStrMMax = pSox->GetFieldNum("_StrMMax");
|
|
sFieldNum.nMutationDefP = pSox->GetFieldNum("_DefP");
|
|
sFieldNum.nMutationDefM = pSox->GetFieldNum("_DefM");
|
|
sFieldNum.nMutationStiff = pSox->GetFieldNum("_Stiff");
|
|
sFieldNum.nMutationStiffResis = pSox->GetFieldNum("_StiffResistance");
|
|
sFieldNum.nMutationCriticalResis = pSox->GetFieldNum("_CriticalResistance");
|
|
sFieldNum.nMutationStunResis = pSox->GetFieldNum("_StunResistance");
|
|
sFieldNum.nMutationWeaponIdx1 = pSox->GetFieldNum("_Weapon1Index");
|
|
sFieldNum.nMutationWeaponIdx2 = pSox->GetFieldNum("_Weapon2Index");
|
|
sFieldNum.nMutationSkillTableID = pSox->GetFieldNum("_SkillTable");
|
|
sFieldNum.nMutationSuperArmor = pSox->GetFieldNum("_SuperAmmor");
|
|
sFieldNum.nSizeMin = pSox->GetFieldNum("_SizeMin");
|
|
sFieldNum.nSizeMax = pSox->GetFieldNum("_SizeMax");
|
|
sFieldNum.nMoveSpeed = pSox->GetFieldNum("_MoveSpeed");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TMonsterMutationData Monster;
|
|
memset(&Monster, 0, sizeof(TMonsterMutationData));
|
|
|
|
Monster.nMutationID = nItemID;
|
|
Monster.nMutationIdx = nIdx;
|
|
Monster.nMutationActorID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMutationActorID)->GetInteger();
|
|
|
|
Monster.nMutationHP = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMutationHP)->GetInteger();
|
|
Monster.nMutationStrPMax = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMutationStrPMax)->GetInteger();
|
|
Monster.nMutationStrMMax = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMutationStrMMax)->GetInteger();
|
|
Monster.nMutationDefP = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMutationDefP)->GetInteger();
|
|
Monster.nMutationDefM = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMutationDefM)->GetInteger();
|
|
Monster.nMutationStiff = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMutationStiff)->GetInteger();
|
|
|
|
Monster.nMutationStiffResis = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMutationStiffResis)->GetInteger();
|
|
Monster.nMutationCriticalResis = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMutationCriticalResis)->GetInteger();
|
|
Monster.nMutationStunResis = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMutationStunResis)->GetInteger();
|
|
|
|
Monster.nMutationWeaponIdx1 = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMutationWeaponIdx1)->GetInteger();
|
|
Monster.nMutationWeaponIdx2 = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMutationWeaponIdx2)->GetInteger();
|
|
Monster.nMutationSkillTableID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMutationSkillTableID)->GetInteger();
|
|
Monster.nMutationSuperArmor = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMutationSuperArmor)->GetInteger();
|
|
|
|
Monster.nSizeMin = static_cast<int>(pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nSizeMin)->GetFloat()*100.f);
|
|
Monster.nSizeMax = static_cast<int>(pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nSizeMax)->GetFloat()*100.f);
|
|
|
|
Monster.nMoveSpeed = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMoveSpeed)->GetInteger();
|
|
|
|
m_mMonsterMutationData.insert( std::make_pair(nItemID,Monster) );
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::GetMonsterMutationData(int nMutationDataID, TMonsterMutationData &Data)
|
|
{
|
|
TMapMonsterMutationData::iterator itor = m_mMonsterMutationData.find( nMutationDataID );
|
|
if( itor == m_mMonsterMutationData.end() )
|
|
return false;
|
|
|
|
Data = (*itor).second;
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetMonsterMutationActorID( int nMutationDataID )
|
|
{
|
|
TMapMonsterMutationData::iterator itor = m_mMonsterMutationData.find( nMutationDataID );
|
|
if( itor == m_mMonsterMutationData.end() )
|
|
return -1;
|
|
|
|
return(*itor).second.nMutationActorID;
|
|
}
|
|
|
|
int CDNGameDataManager::GetMonsterMutationMoveSpeed( int nMutationDataID )
|
|
{
|
|
TMapMonsterMutationData::iterator itor = m_mMonsterMutationData.find( nMutationDataID );
|
|
if( itor == m_mMonsterMutationData.end() )
|
|
{
|
|
_ASSERT(0);
|
|
return 0;
|
|
}
|
|
|
|
return(*itor).second.nMoveSpeed;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadMonsterMutationSkillData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TMONSTERSKILL_TRANS );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TMONSTERSKILL_TRANS );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TMONSTERSKILL_TRANS );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"monsterskilltable_transform.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"monsterskilltable_transform.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_VecMonsterMutationSkill.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nMonsterSkillIndex[PvPCommon::Common::MonsterMutationSkillColCount];
|
|
int nMonsterSkillLevel[PvPCommon::Common::MonsterMutationSkillColCount];
|
|
};
|
|
|
|
char szTemp1[32];
|
|
char szTemp2[32];
|
|
TempFieldNum sFieldNum;
|
|
for (int i = 0; i < PvPCommon::Common::MonsterMutationSkillColCount; i++)
|
|
{
|
|
sprintf_s( szTemp1, "_SkillIndex%d", i+1 );
|
|
sprintf_s( szTemp2, "_SkillLevel%d", i+1 );
|
|
|
|
sFieldNum.nMonsterSkillIndex[i] = pSox->GetFieldNum(szTemp1);
|
|
sFieldNum.nMonsterSkillLevel[i] = pSox->GetFieldNum(szTemp2);
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TMonsterMutationSkill Skill;
|
|
memset(&Skill, 0, sizeof(TMonsterMutationSkill));
|
|
|
|
Skill.nMonsterID = nItemID;
|
|
Skill.nMonsterIdx = nIdx;
|
|
for (int j = 0; j < PvPCommon::Common::MonsterMutationSkillColCount; j++)
|
|
{
|
|
Skill.nMonsterSkillIndex[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMonsterSkillIndex[j])->GetInteger();
|
|
Skill.nMonsterSkillLevel[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMonsterSkillLevel[j])->GetInteger();
|
|
}
|
|
|
|
m_VecMonsterMutationSkill.push_back(Skill);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadReputeBenefitData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TREPUTEBENEFIT );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TREPUTEBENEFIT );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TREPUTEBENEFIT );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"ReputeBenefit.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"ReputeBenefit.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_VecUnionReputeBenefitData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nPeriod;
|
|
int nBenefitType[NpcReputation::Common::MaxBenefitCount];
|
|
int nBenefitNum[NpcReputation::Common::MaxBenefitCount];
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nPeriod = pSox->GetFieldNum("_Period");
|
|
|
|
char szTemp1[32];
|
|
char szTemp2[32];
|
|
for (int i=0; i< NpcReputation::Common::MaxBenefitCount; i++)
|
|
{
|
|
sprintf_s( szTemp1, "_Benefit%d", i+1 );
|
|
sprintf_s( szTemp2, "_Benefit%d_Num", i+1 );
|
|
|
|
sFieldNum.nBenefitType[i] = pSox->GetFieldNum(szTemp1);
|
|
sFieldNum.nBenefitNum[i] = pSox->GetFieldNum(szTemp2);
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
|
|
std::vector<int> vAbuseItemID;
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
TUnionReputeBenefitData Benefit;
|
|
memset(&Benefit, 0, sizeof(TUnionReputeBenefitData));
|
|
|
|
Benefit.nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(Benefit.nItemID);
|
|
|
|
Benefit.nPeriod = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nPeriod)->GetInteger();
|
|
|
|
int nMaxSellRate = 0;
|
|
int nMaxBuyRate = 0;
|
|
for (int j = 0; j < NpcReputation::Common::MaxBenefitCount; j++)
|
|
{
|
|
Benefit.nBenefitType[j] = static_cast<TStoreBenefitData::eType>(pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nBenefitType[j])->GetInteger());
|
|
Benefit.nBenefitNum[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nBenefitNum[j])->GetInteger();
|
|
|
|
if (Benefit.nBenefitType[j] == (int)NpcReputation::StoreBenefit::BuyingPriceDiscount)
|
|
nMaxBuyRate = Benefit.nBenefitNum[j];
|
|
|
|
if (Benefit.nBenefitType[j] == (int)NpcReputation::StoreBenefit::SellingPriceUp)
|
|
nMaxSellRate = Benefit.nBenefitNum[j];
|
|
}
|
|
|
|
if (nMaxBuyRate + nMaxSellRate >= MAX_ITEMPRICE_RATE * 100)
|
|
vAbuseItemID.push_back(Benefit.nItemID);
|
|
|
|
m_VecUnionReputeBenefitData.push_back(Benefit);
|
|
}
|
|
|
|
if (vAbuseItemID.size() > 0)
|
|
{
|
|
WCHAR szTemp[1024];
|
|
std::wstring szError = L"Invalid ReputeBenefit\n\n";
|
|
|
|
for(UINT i=0; i<vAbuseItemID.size(); i++)
|
|
{
|
|
swprintf_s( szTemp, L"ItemID : %d\n", vAbuseItemID[i] );
|
|
szError += szTemp;
|
|
}
|
|
|
|
MessageBox( NULL, szError.c_str(), L"Critical Error!!", MB_OK );
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TUnionReputeBenefitData* CDNGameDataManager::GetUnionReputeBenefitByItemID(int nItemID)
|
|
{
|
|
TVecUnionReputeBenefitData::iterator ii;
|
|
for(ii = m_VecUnionReputeBenefitData.begin(); ii != m_VecUnionReputeBenefitData.end(); ii++)
|
|
{
|
|
if((*ii).nItemID == nItemID)
|
|
{
|
|
return &(*ii);
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadGuildMarkData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TGUILDMARK );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TGUILDMARK );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGUILDMARK );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"GuildmarkTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"GuildmarkTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_VecGuildMarkData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nType;
|
|
int nCash;
|
|
int nMarkOnly;
|
|
int nMarkView;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nType = pSox->GetFieldNum("_Type");
|
|
sFieldNum.nCash = pSox->GetFieldNum("_IsCash");
|
|
sFieldNum.nMarkOnly = pSox->GetFieldNum("_MarkOnly");
|
|
sFieldNum.nMarkView = pSox->GetFieldNum("_MarkView");
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TGuildMarkData Mark;
|
|
memset(&Mark, 0, sizeof(TGuildMarkData));
|
|
|
|
Mark.nItemID = nItemID;
|
|
Mark.nType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nType)->GetInteger();
|
|
Mark.bCash = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nCash)->GetInteger() ? true : false;
|
|
Mark.bMarkOnly = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMarkOnly)->GetInteger() ? true : false;
|
|
Mark.bMarkView = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMarkView)->GetInteger() ? true : false;
|
|
|
|
m_VecGuildMarkData.push_back(Mark);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::IsValidCompleteMark(int nItemID, int nType)
|
|
{
|
|
TVecGuildMarkData::iterator ii;
|
|
for(ii = m_VecGuildMarkData.begin(); ii != m_VecGuildMarkData.end(); ii++)
|
|
{
|
|
if((*ii).nItemID == nItemID && (*ii).nType == nType)
|
|
return(int)((*ii).bMarkOnly);
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsValidGuildMark(int nItemID, bool bCheckCash)
|
|
{
|
|
TVecGuildMarkData::iterator ii;
|
|
for(ii = m_VecGuildMarkData.begin(); ii != m_VecGuildMarkData.end(); ii++)
|
|
{
|
|
if((*ii).nItemID == nItemID)
|
|
{
|
|
if(!(*ii).bMarkView)
|
|
return false;
|
|
|
|
if(bCheckCash)
|
|
{
|
|
// 某浆眉农秦辑 秦寸 酒捞袍捞 某浆老 版快 FALSE 贸府
|
|
if((*ii).bCash) return false;
|
|
else return true;
|
|
}
|
|
else
|
|
return true;
|
|
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadPlayerCommonLeaveTable()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPLAYERCOMMONLEVEL );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TPLAYERCOMMONLEVEL );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPLAYERCOMMONLEVEL );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"playercommonleveltable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"playercommonleveltable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_mPlayerCommonLevelTable.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int FatigueRatio;
|
|
int MasterGainExp;
|
|
//int MasterGainItemID;
|
|
//int MasterGainItemNum;
|
|
int AddGainExp;
|
|
int Defense;
|
|
int Critical;
|
|
int FinalDamage;
|
|
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
int TalismanCost;
|
|
#endif
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.FatigueRatio = pSox->GetFieldNum("_Fatigueratio");
|
|
sFieldNum.MasterGainExp = pSox->GetFieldNum("_MasterGainExp");
|
|
//sFieldNum.MasterGainItemID = pSox->GetFieldNum("_MasterGainItem");
|
|
//sFieldNum.MasterGainItemNum = pSox->GetFieldNum("_MasterGainItemNum");
|
|
sFieldNum.AddGainExp = pSox->GetFieldNum("_AddGainExp");
|
|
sFieldNum.Defense = pSox->GetFieldNum( "_Cdefense" );
|
|
sFieldNum.Critical = pSox->GetFieldNum( "_Ccritical" );
|
|
sFieldNum.FinalDamage = pSox->GetFieldNum( "_Cfinaldamage" );
|
|
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
sFieldNum.TalismanCost = pSox->GetFieldNum( "_TalismanCost" );
|
|
#endif
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TPlayerCommonLevelTableInfo Data;
|
|
memset(&Data, 0, sizeof(Data));
|
|
|
|
Data.iFatigue10000Ratio = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.FatigueRatio)->GetInteger();
|
|
Data.fMasterGainExp = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.MasterGainExp)->GetFloat();
|
|
//Data.nMasterGainItemID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.MasterGainItemID)->GetInteger();
|
|
//Data.nMasterGainItemCount = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.MasterGainItemNum)->GetInteger();
|
|
Data.fAddGainExp = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.AddGainExp)->GetFloat();
|
|
if(Data.fAddGainExp < 1)
|
|
{
|
|
//趣矫 葛福聪 蔼捞 1焊促 累栏搁 坷幅 免仿(趣矫 1焊促 累篮 蔼捞 利侩登绢具 窍绰 版快俊绰 努扼捞攫飘 CDnStageClearReportDlg::Process 窃荐狼 PHASE03_RANK_START何盒档 荐沥秦具窃)
|
|
g_Log.Log( LogType::_FILELOG, L"playercommonleveltable.dnt _AddGainExp Error\r\n" );
|
|
return false;
|
|
}
|
|
|
|
Data.fDefense = pSox->GetFieldFromLablePtr( nIdx, sFieldNum.Defense )->GetFloat();
|
|
Data.fCritical = pSox->GetFieldFromLablePtr( nIdx, sFieldNum.Critical )->GetFloat();
|
|
Data.fFinalDamage = pSox->GetFieldFromLablePtr( nIdx, sFieldNum.FinalDamage )->GetFloat();
|
|
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
sFieldNum.TalismanCost = pSox->GetFieldNum( "_TalismanCost" );
|
|
Data.iTalismanCost = pSox->GetFieldFromLablePtr( nIdx, sFieldNum.TalismanCost )->GetInteger();
|
|
#endif
|
|
|
|
if (nItemID > m_nMaxPlayerLevel)
|
|
m_nMaxPlayerLevel = nItemID;
|
|
m_mPlayerCommonLevelTable.insert( std::make_pair(nItemID,Data) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetFatigue10000RatioFromPlayerCommonLevelTable( int iLevel )
|
|
{
|
|
std::map<int,TPlayerCommonLevelTableInfo>::iterator itor = m_mPlayerCommonLevelTable.find( iLevel );
|
|
if( itor != m_mPlayerCommonLevelTable.end() )
|
|
return(*itor).second.iFatigue10000Ratio;
|
|
|
|
return 0;
|
|
}
|
|
|
|
TPlayerCommonLevelTableInfo* CDNGameDataManager::GetPlayerCommonLevelTable(int nLevel)
|
|
{
|
|
std::map<int,TPlayerCommonLevelTableInfo>::iterator itor = m_mPlayerCommonLevelTable.find( nLevel );
|
|
if( itor != m_mPlayerCommonLevelTable.end() )
|
|
return &(*itor).second;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
int CDNGameDataManager::GetTalismanCostFromPlayerCommonLevelTable( int iLevel )
|
|
{
|
|
std::map<int,TPlayerCommonLevelTableInfo>::iterator itor = m_mPlayerCommonLevelTable.find( iLevel );
|
|
if( itor != m_mPlayerCommonLevelTable.end() )
|
|
return(*itor).second.iTalismanCost;
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
bool CDNGameDataManager::LoadMasterSysFeelTable()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TMASTERSYSFEEL );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TMASTERSYSFEEL );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TMASTERSYSFEEL );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"mastersysfeeltable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"mastersysfeeltable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_vMasterSysFeelTableInfo.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int MinFeel;
|
|
int MaxFeel;
|
|
int AddExp;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.MinFeel = pSox->GetFieldNum("_MinFeel");
|
|
sFieldNum.MaxFeel = pSox->GetFieldNum("_MaxFeel");
|
|
sFieldNum.AddExp = pSox->GetFieldNum("_AddExp");
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TMasterSysFeelTableInfo Data;
|
|
memset(&Data, 0, sizeof(Data));
|
|
|
|
Data.nMinFeel = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.MinFeel)->GetInteger();
|
|
Data.nMaxFeel = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.MaxFeel)->GetInteger();
|
|
Data.nAddExp = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.AddExp)->GetInteger();
|
|
|
|
m_vMasterSysFeelTableInfo.push_back(Data);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetMasterSysFeelAddExp(int nFavor)
|
|
{
|
|
std::vector <TMasterSysFeelTableInfo>::iterator ii;
|
|
for(ii = m_vMasterSysFeelTableInfo.begin(); ii != m_vMasterSysFeelTableInfo.end(); ii++)
|
|
{
|
|
if((*ii).nMinFeel <= nFavor && (*ii).nMaxFeel >= nFavor )
|
|
return(*ii).nAddExp;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadGlobalEventData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TGLOBALEVENTQUEST );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TGLOBALEVENTQUEST );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGLOBALEVENTQUEST );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"globalevent.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"globalevent.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return true;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_VecGlobalEvent.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nScheduleID;
|
|
int nCollectItemID;
|
|
int nCollectTotalCount;
|
|
int nCollectStartDay;
|
|
int nCollectEndDay;
|
|
int nRewardStartDay;
|
|
int nNoticeCount[MAX_NOTICE_WORLDEVENT];
|
|
|
|
};
|
|
|
|
char* szCollectStartDate;
|
|
char* szCollectEndDate;
|
|
char* szRewardDate;
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nScheduleID = pSox->GetFieldNum("_ScheduleID");
|
|
sFieldNum.nCollectItemID = pSox->GetFieldNum("_CollectItemID");
|
|
sFieldNum.nCollectTotalCount = pSox->GetFieldNum("_CollectTotalCount");
|
|
sFieldNum.nCollectStartDay = pSox->GetFieldNum("_CollectStartDay");
|
|
sFieldNum.nCollectEndDay = pSox->GetFieldNum("_CollectEndDay");
|
|
sFieldNum.nRewardStartDay = pSox->GetFieldNum("_RewardStartDay");
|
|
|
|
char szTemp[32];
|
|
for (int i=0; i<MAX_NOTICE_WORLDEVENT; i++)
|
|
{
|
|
sprintf_s( szTemp, "_NoticeCount%d", i+1 );
|
|
sFieldNum.nNoticeCount[i] = pSox->GetFieldNum(szTemp);
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TGlobalEventData Event;
|
|
memset(&Event, 0, sizeof(TGlobalEventData));
|
|
|
|
Event.nItemID = nItemID;
|
|
Event.nScheduleID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nScheduleID)->GetInteger();
|
|
Event.nCollectItemID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nCollectItemID)->GetInteger();
|
|
Event.nCollectTotalCount = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nCollectTotalCount)->GetInteger();
|
|
|
|
szCollectStartDate = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nCollectStartDay)->GetString();
|
|
szCollectEndDate = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nCollectEndDay)->GetString();
|
|
szRewardDate = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nRewardStartDay)->GetString();
|
|
|
|
for (int j=0; j<MAX_NOTICE_WORLDEVENT; j++)
|
|
{
|
|
Event.nNoticeCount[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nNoticeCount[j])->GetInteger();
|
|
|
|
if(Event.nNoticeCount[j] == 0)
|
|
Event.bCheckNotice[j] = true;
|
|
|
|
if (Event.nCollectTotalCount < Event.nNoticeCount[j])
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"globalevent.dnt _CollectItemID < _NoticeCount%d \r\n", j );
|
|
return false;
|
|
}
|
|
}
|
|
|
|
CTimeSet tCollectStartSet(szCollectStartDate, true);
|
|
CTimeSet tCollectEndSet(szCollectEndDate, true);
|
|
CTimeSet tRewardSet(szRewardDate, true);
|
|
|
|
if(!tCollectStartSet.CheckIntegrity())
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"globalevent.dnt _CollectStartDay Invalid\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if(!tCollectEndSet.CheckIntegrity())
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"globalevent.dnt _CollectEndDay Invalid\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if(!tRewardSet.CheckIntegrity())
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"globalevent.dnt _RewardStartDay Invalid\r\n" );
|
|
return false;
|
|
}
|
|
|
|
Event.tCollectStartDate = tCollectStartSet.GetTimeT64_LC();
|
|
Event.tCollectEndDate = tCollectEndSet.GetTimeT64_LC();
|
|
Event.tRewardDate = tRewardSet.GetTimeT64_LC();
|
|
|
|
if(Event.tCollectStartDate > Event.tRewardDate || Event.tCollectStartDate > Event.tCollectEndDate)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"globalevent.dnt Time Sequence Invalid\r\n" );
|
|
return false;
|
|
}
|
|
|
|
m_VecGlobalEvent.push_back(Event);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TGlobalEventData* CDNGameDataManager::GetGlobalEventData(int nScheduleID)
|
|
{
|
|
TVecGlobalEvent::iterator ii;
|
|
for(ii = m_VecGlobalEvent.begin(); ii != m_VecGlobalEvent.end(); ii++)
|
|
{
|
|
if((*ii).nScheduleID == nScheduleID)
|
|
return &(*ii);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadEveryDayEventData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TATTENDANCEEVENT );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TATTENDANCEEVENT );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TATTENDANCEEVENT );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"EverydayEventTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"EverydayEventTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_VecEveryDayEvent.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _nEventOnOff;
|
|
int _nStartDate;
|
|
int _nEndDate;
|
|
int _nSquenceDate;
|
|
int _MailID;
|
|
int _CashMailID;
|
|
int _Number;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._nEventOnOff = pSox->GetFieldNum("_ON");
|
|
sFieldNum._nStartDate = pSox->GetFieldNum("_Start_Date");
|
|
sFieldNum._nEndDate = pSox->GetFieldNum("_End_Date");
|
|
sFieldNum._nSquenceDate = pSox->GetFieldNum("_Date_Count");
|
|
sFieldNum._MailID = pSox->GetFieldNum("_MailID");
|
|
sFieldNum._CashMailID = pSox->GetFieldNum("_CashMailID");
|
|
sFieldNum._Number = pSox->GetFieldNum("_Number");
|
|
|
|
int nPrevNumber = 0; //捞傈 雀瞒客 备盒秦辑 滴俺狼 雀瞒啊 乐阑版快 坷幅 免仿
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TEveryDayEventData Event;
|
|
memset(&Event, 0, sizeof(TEveryDayEventData));
|
|
|
|
Event.nEventID = nItemID;
|
|
Event.nEventOnOff = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nEventOnOff)->GetInteger();
|
|
if( !Event.nEventOnOff )
|
|
continue;
|
|
char* szStartDate = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nStartDate)->GetString();
|
|
char* szEndDate = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nEndDate)->GetString();
|
|
Event.nSquenceDateCount = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nSquenceDate)->GetInteger();
|
|
Event.nMailID = pSox->GetFieldFromLablePtr( nIdx, sFieldNum._MailID )->GetInteger();
|
|
Event.nCashMailID = pSox->GetFieldFromLablePtr( nIdx, sFieldNum._CashMailID )->GetInteger();
|
|
Event.nNumber = pSox->GetFieldFromLablePtr( nIdx, sFieldNum._Number )->GetInteger();
|
|
|
|
if(nPrevNumber == 0)
|
|
nPrevNumber = Event.nNumber;
|
|
else if(nPrevNumber != Event.nNumber)
|
|
{
|
|
//劝己拳等 捞亥飘啊 滴俺牢 版快 坷幅 免仿
|
|
g_Log.Log( LogType::_FILELOG, L"everydayeventtable.dnt Active Number Error\r\n" );
|
|
return false;
|
|
}
|
|
|
|
CTimeSet tCollectStartSet(szStartDate, true);
|
|
CTimeSet tCollectEndSet(szEndDate, true);
|
|
|
|
if(!tCollectStartSet.CheckIntegrity())
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"everydayeventtable.dnt _CollectStartDay Invalid\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if(!tCollectEndSet.CheckIntegrity())
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"everydayeventtable.dnt _CollectEndDay Invalid\r\n" );
|
|
return false;
|
|
}
|
|
|
|
Event.tStartDate = tCollectStartSet.GetTimeT64_LC();
|
|
Event.tEndDate = tCollectEndSet.GetTimeT64_LC();
|
|
|
|
m_VecEveryDayEvent.push_back(Event);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TEveryDayEventData* CDNGameDataManager::GetEveryDayEventRewardMailID(int iOngoingDay)
|
|
{
|
|
TVecEveryDayEvent::iterator itor;
|
|
CTimeSet tPresentDate;
|
|
__time64_t tChectDate = tPresentDate.GetTimeT64_LC();
|
|
|
|
for(itor = m_VecEveryDayEvent.begin(); itor != m_VecEveryDayEvent.end(); itor++)
|
|
{
|
|
//泅犁 tStartDated客 tEndDate 眉农档 眠啊
|
|
if((*itor).nEventOnOff && tChectDate >= (*itor).tStartDate && tChectDate <= (*itor).tEndDate )
|
|
{
|
|
if((*itor).nSquenceDateCount == iOngoingDay )
|
|
{
|
|
return &(*itor);
|
|
}
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::CheckEveryDayEventTime(WORD *index)
|
|
{
|
|
TVecEveryDayEvent::iterator itor;
|
|
for(itor = m_VecEveryDayEvent.begin(); itor != m_VecEveryDayEvent.end(); itor++)
|
|
{
|
|
if((*itor).nEventOnOff && *index == (*itor).nNumber )
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
*index = (*itor).nNumber;
|
|
return false;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
#ifdef PRE_FIX_MEMOPT_EXT
|
|
char* CDNGameDataManager::GetFileNameFromFileEXT(DNTableFileFormat* pRawSox, int itemId, const char* pFieldName, DNTableFileFormat* pFileNameSox)
|
|
{
|
|
if(pRawSox == NULL || pFieldName == NULL || pFieldName[0] == '\0')
|
|
return NULL;
|
|
|
|
DNTableCell* pNameField = pRawSox->GetFieldFromLablePtr( itemId, pFieldName );
|
|
return(pNameField != NULL) ? GetFileNameFromFileEXT(pNameField->GetInteger(), pFileNameSox) : NULL;
|
|
}
|
|
|
|
void CDNGameDataManager::GetFileNameFromFileEXT(std::string& result, DNTableFileFormat* pRawSox, int itemId, const char* pFieldName, DNTableFileFormat* pFileNameSox)
|
|
{
|
|
if(pRawSox == NULL || pFieldName == NULL || pFieldName[0] == '\0')
|
|
return;
|
|
|
|
DNTableCell* pNameField = pRawSox->GetFieldFromLablePtr( itemId, pFieldName );
|
|
if(pNameField != NULL)
|
|
{
|
|
char* pFileName = GetFileNameFromFileEXT(pNameField->GetInteger(), pFileNameSox);
|
|
result = (pFileName) ? pFileName : "";
|
|
}
|
|
else
|
|
{
|
|
result = "";
|
|
}
|
|
}
|
|
|
|
void CDNGameDataManager::GetFileNameFromFileEXT(std::string& result, DNTableFileFormat* pRawSox, int itemId, int fieldIndex, DNTableFileFormat* pFileNameSox)
|
|
{
|
|
if(pRawSox == NULL)
|
|
return;
|
|
|
|
DNTableCell* pNameField = pRawSox->GetFieldFromLablePtr( itemId, fieldIndex );
|
|
if(pNameField != NULL)
|
|
{
|
|
char* pFileName = GetFileNameFromFileEXT(pNameField->GetInteger(), pFileNameSox);
|
|
result = (pFileName) ? pFileName : "";
|
|
}
|
|
else
|
|
{
|
|
result = "";
|
|
}
|
|
}
|
|
|
|
char* CDNGameDataManager::GetFileNameFromFileEXT(int index, DNTableFileFormat* pFileSox)
|
|
{
|
|
if(pFileSox == NULL)
|
|
{
|
|
pFileSox = GetDNTable( CDnTableDB::TFILE );
|
|
if(pFileSox == NULL)
|
|
{
|
|
_ASSERT(0);
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
return pFileSox->GetFieldFromLablePtr(index, "_FileName")->GetString();
|
|
}
|
|
#endif
|
|
|
|
bool CDNGameDataManager::bIsGuildReversionItem( int iItemID )
|
|
{
|
|
TMapGuildReversionTableData::iterator itor = m_GuildReversionTableData.find( iItemID );
|
|
if( itor == m_GuildReversionTableData.end() )
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
#if defined( PRE_PARTY_DB )
|
|
|
|
bool CDNGameDataManager::LoadPartySortWeightTable()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPARTYSORTWEIGHT );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TPARTYSORTWEIGHT );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPARTYSORTWEIGHT );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"partylistsortweight.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"partylistsortweight.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_PartySortWeight.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _nWeight;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._nWeight = pSox->GetFieldNum("_Weight");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
int iWeight = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nWeight)->GetInteger();
|
|
|
|
m_PartySortWeight.insert( std::make_pair(static_cast<Party::SortWeightIndex::eCode>(nItemID),iWeight) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetPartySortWeight( Party::SortWeightIndex::eCode Type )
|
|
{
|
|
TMapPartySortWeight::iterator itor = m_PartySortWeight.find( Type );
|
|
if( itor != m_PartySortWeight.end() )
|
|
return (*itor).second;
|
|
return 0;
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadDungeonSortWeightTable()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TDUNGEONENTER );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TDUNGEONENTER );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TDUNGEONENTER );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"stageentertable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"stageentertable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_DungeonSortWeight.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _ListSort;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._ListSort = pSox->GetFieldNum("_ListSort");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
int iWeight = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ListSort)->GetInteger();
|
|
|
|
m_DungeonSortWeight.insert( std::make_pair(nItemID,iWeight) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetDungeonSortWeight( int iMapindex )
|
|
{
|
|
const TMapInfo* pMapInfo = GetMapInfo( iMapindex );
|
|
if( pMapInfo == NULL )
|
|
return 0;
|
|
|
|
TMapDungeonSortWeight::iterator itor = m_DungeonSortWeight.find( pMapInfo->iEnterConditionTable );
|
|
if( itor != m_DungeonSortWeight.end() )
|
|
return (*itor).second;
|
|
return 0;
|
|
}
|
|
|
|
#endif // #if defined( PRE_PARTY_DB )
|
|
|
|
bool CDNGameDataManager::LoadGuildRewardItemData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TGUILDREWARDITEM );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TGUILDREWARDITEM );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGUILDREWARDITEM );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"guildrewardtable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"guildrewardtable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_mGuildRewardItemTableData.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _nNeedGuildLevel;
|
|
int _nNeedGold;
|
|
int _nItemType;
|
|
int _nItemTypeParam1;
|
|
int _nItemTypeParam2;
|
|
int _nCheckInven;
|
|
int _nPeriod;
|
|
int _nCheckMaster;
|
|
int _nCheckType;
|
|
int _nCheckID;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._nNeedGuildLevel = pSox->GetFieldNum("_NeedGuildLevel");
|
|
sFieldNum._nNeedGold = pSox->GetFieldNum("_NeedGold");
|
|
sFieldNum._nItemType = pSox->GetFieldNum("_Type");
|
|
sFieldNum._nItemTypeParam1 = pSox->GetFieldNum("_TypeParam1");
|
|
sFieldNum._nItemTypeParam2 = pSox->GetFieldNum("_TypeParam2");
|
|
sFieldNum._nCheckInven = pSox->GetFieldNum("_CheckInven");
|
|
sFieldNum._nPeriod = pSox->GetFieldNum("_Period");
|
|
sFieldNum._nCheckMaster = pSox->GetFieldNum("_GuildMasterLimit");
|
|
sFieldNum._nCheckType = pSox->GetFieldNum("_PrerequisiteType");
|
|
sFieldNum._nCheckID = pSox->GetFieldNum("_PrerequisiteID");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TGuildRewardItemData GuildRewardItem;
|
|
memset(&GuildRewardItem, 0, sizeof(GuildRewardItem));
|
|
|
|
GuildRewardItem.nItemID = nItemID;
|
|
GuildRewardItem.nNeedGuildLevel = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nNeedGuildLevel)->GetInteger();
|
|
GuildRewardItem.nNeedGold = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nNeedGold)->GetInteger();
|
|
GuildRewardItem.nItemType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nItemType)->GetInteger();
|
|
GuildRewardItem.nTypeParam1 = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nItemTypeParam1)->GetInteger();
|
|
GuildRewardItem.nTypeParam2 = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nItemTypeParam2)->GetInteger();
|
|
GuildRewardItem.bCheckInven = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nCheckInven)->GetInteger() ? true : false;
|
|
GuildRewardItem.bEternity = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nPeriod)->GetInteger() ? false : true;
|
|
GuildRewardItem.nPeriod = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nPeriod)->GetInteger();
|
|
GuildRewardItem.bCheckMaster = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nCheckMaster)->GetInteger() ? true : false;
|
|
GuildRewardItem.nCheckType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nCheckType)->GetInteger();
|
|
GuildRewardItem.nCheckID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nCheckID)->GetInteger();
|
|
|
|
m_mGuildRewardItemTableData.insert( make_pair(nItemID, GuildRewardItem) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
TGuildRewardItemData* CDNGameDataManager::GetGuildRewardItemData(int nItemID)
|
|
{
|
|
TMapGuildRewardItem::iterator itor = m_mGuildRewardItemTableData.find( nItemID );
|
|
if( itor != m_mGuildRewardItemTableData.end() )
|
|
return &itor->second;
|
|
return NULL;
|
|
}
|
|
|
|
#if defined( PRE_ADD_SALE_COUPON)
|
|
bool CDNGameDataManager::LoadSaleCouponData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TSALECOUPON );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TSALECOUPON );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TSALECOUPON );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"coupon.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"coupon.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return true;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_mSaleCouponItemTableData.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _nItemID;
|
|
int _nUseItemSN[MAX_SALE_USEITEM];
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
memset(&sFieldNum, 0, sizeof(sFieldNum));
|
|
sFieldNum._nItemID = pSox->GetFieldNum("_ID");
|
|
|
|
char szTemp[256];
|
|
memset( szTemp, 0, sizeof(szTemp) );
|
|
for( int i=0; i<MAX_SALE_USEITEM; ++i)
|
|
{
|
|
sprintf_s( szTemp, "_UseItem%02d", i+1 );
|
|
sFieldNum._nUseItemSN[i] = pSox->GetFieldNum(szTemp);
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
TSaleCouponData SaleCoupon;
|
|
memset(&SaleCoupon, 0, sizeof(SaleCoupon));
|
|
|
|
SaleCoupon.nItemID = nItemID;
|
|
for( int j=0; j<MAX_SALE_USEITEM; ++j)
|
|
{
|
|
SaleCoupon.nUseItemSN[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nUseItemSN[j])->GetInteger();
|
|
}
|
|
m_mSaleCouponItemTableData.insert( make_pair(nItemID, SaleCoupon) );
|
|
}
|
|
return true;
|
|
}
|
|
TSaleCouponData* CDNGameDataManager::GetSaleCouponItemData(int nItemID)
|
|
{
|
|
TMapSaleCoupon::iterator itor = m_mSaleCouponItemTableData.find( nItemID );
|
|
if( itor != m_mSaleCouponItemTableData.end() )
|
|
return &itor->second;
|
|
return NULL;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsSaleCouponItemBuyItem(int nCouponItemID, int nBuyItemSN)
|
|
{
|
|
TMapSaleCoupon::iterator itor = m_mSaleCouponItemTableData.find( nCouponItemID );
|
|
if( itor != m_mSaleCouponItemTableData.end() )
|
|
{
|
|
for( int i=0; i<MAX_SALE_USEITEM; ++i)
|
|
{
|
|
if( itor->second.nUseItemSN[i] == nBuyItemSN )
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
#endif
|
|
|
|
#if defined(PRE_FIX_NEXTSKILLINFO)
|
|
SKILL_LEVEL_INFO CDNGameDataManager::ms_SkillLevelTableInfo;
|
|
SKILL_LEVEL_INFO* CDNGameDataManager::GetSkillLevelTableIDList(int nSkillID, int nApplyType)
|
|
{
|
|
if (nApplyType >= 2 || nApplyType < 0)
|
|
return &ms_SkillLevelTableInfo;
|
|
|
|
SKILL_LEVEL_TABLEID_LIST::iterator findIter = m_SkillLevelTableIDList[nApplyType].find(nSkillID);
|
|
if (findIter != m_SkillLevelTableIDList[nApplyType].end())
|
|
return &findIter->second;
|
|
|
|
return &ms_SkillLevelTableInfo;
|
|
}
|
|
|
|
void CDNGameDataManager::InitSkillLevelTableIDList()
|
|
{
|
|
DNTableFileFormat* pSkillTable = GetDNTable( CDnTableDB::TSKILL );
|
|
DNTableFileFormat* pSkillLevelTable = GetDNTable( CDnTableDB::TSKILLLEVEL );
|
|
|
|
if (pSkillTable == NULL || pSkillLevelTable == NULL)
|
|
return;
|
|
|
|
int nSkillCount = pSkillTable->GetItemCount();
|
|
for (int i = 0; i < nSkillCount; ++i)
|
|
{
|
|
int nSkillID = pSkillTable->GetItemID(i);
|
|
|
|
//int nSkillID = pSkillTable->GetFieldFromLablePtr(nItemID, "id")->GetInteger();
|
|
|
|
std::vector<int> vlSkillLevelList;
|
|
pSkillLevelTable->GetItemIDListFromField( "_SkillIndex", nSkillID, vlSkillLevelList );
|
|
|
|
// pve, pvp 措惑牢瘤 犬牢窍咯 吧矾晨.
|
|
vector<int>::iterator iterLevelList = vlSkillLevelList.begin();
|
|
for( iterLevelList; iterLevelList != vlSkillLevelList.end(); ++iterLevelList)
|
|
{
|
|
int iSkillLevelTableID = *iterLevelList;
|
|
int iApplyType = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_ApplyType" )->GetInteger();
|
|
int iSkillLevel = pSkillLevelTable->GetFieldFromLablePtr(iSkillLevelTableID, "_SkillLevel")->GetInteger();
|
|
|
|
AddSkillLevelTableID(nSkillID, iSkillLevel, iSkillLevelTableID, iApplyType);
|
|
#ifdef _GAMESERVER
|
|
if (iApplyType == CDnSkill::PVP)
|
|
{
|
|
float fNewDamageMultiplier = pSkillLevelTable->GetFieldFromLablePtr(iSkillLevelTableID, "_PDamage")->GetFloat();
|
|
AddToPvpSkillList(iSkillLevelTableID, nSkillID, iSkillLevel, fNewDamageMultiplier); //_P/MDamage
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
|
|
//rlkt_pvp_skills
|
|
void CDNGameDataManager::AddToPvpSkillList(int iSkillLevelTableID, int nSkillID, int iSkillLevel, float fNewDamageMultiplier)
|
|
{
|
|
if (nSkillID <= 0) return;
|
|
|
|
TPVPSkills* temp = new TPVPSkills;
|
|
memset(temp, 0, sizeof(TPVPSkills));
|
|
|
|
temp->nSkillID = nSkillID;
|
|
temp->nSkillLevel = iSkillLevel;
|
|
temp->fPDamage = fNewDamageMultiplier;
|
|
// printf("%s ADD Skills:%d nlvl: %d dmg: %.2f -- %d\n",__FUNCTION__,nSkillID,iSkillLevel,fNewDamageMultiplier,iSkillLevelTableID);
|
|
m_pPvpSkills.insert(make_pair(iSkillLevelTableID, temp));
|
|
}
|
|
|
|
CDNGameDataManager::TPVPSkills *CDNGameDataManager::GetPVPSkillPDamage(int nSkillID, int iSkillLevel)
|
|
{
|
|
printf("%s %d \n\n",__FUNCTION__, m_pPvpSkills.size());
|
|
|
|
if (m_pPvpSkills.size() == 0) return NULL;
|
|
|
|
for (std::map<int, TPVPSkills*>::iterator it = m_pPvpSkills.begin(); it != m_pPvpSkills.end(); it++) {
|
|
if (it->second->nSkillID == nSkillID)
|
|
{
|
|
if (it->second->nSkillLevel == iSkillLevel)
|
|
{
|
|
return it->second;
|
|
}
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void CDNGameDataManager::AddSkillLevelTableID(int nSkillID, int nSkillLevel, int nSkillLevelTableID, int nApplyType)
|
|
{
|
|
if (nApplyType >= 2 || nApplyType < 0)
|
|
return;
|
|
|
|
SKILL_LEVEL_TABLEID_LIST::iterator findIter = m_SkillLevelTableIDList[nApplyType].find(nSkillID);
|
|
if (findIter != m_SkillLevelTableIDList[nApplyType].end())
|
|
{
|
|
//扁粮 府胶飘啊 粮犁 窍搁 弊 府胶飘俊 眠啊 茄促..
|
|
findIter->second.AddSkillLevelTableID(nSkillLevel, nSkillLevelTableID);
|
|
}
|
|
else
|
|
{
|
|
SKILL_LEVEL_INFO skillLevelInfo;
|
|
skillLevelInfo.AddSkillLevelTableID(nSkillLevel, nSkillLevelTableID);
|
|
|
|
m_SkillLevelTableIDList[nApplyType].insert(std::make_pair(nSkillID, skillLevelInfo));
|
|
}
|
|
}
|
|
#endif // PRE_FIX_NEXTSKILLINFO
|
|
|
|
#ifdef PRE_ADD_COSRANDMIX
|
|
bool CDNGameDataManager::LoadCostumeRandomMixData()
|
|
{
|
|
return m_CosRandMixDataMgr.LoadData();
|
|
}
|
|
#endif
|
|
|
|
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
|
|
bool CDNGameDataManager::LoadNamedItemData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TNAMEDITEM );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TNAMEDITEM );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TNAMEDITEM );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"nameditemtable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"nameditemtable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_mNamedItemTableData.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _Named_Max_count;
|
|
int _NamedItem_ID;
|
|
int _Item_ID;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._Named_Max_count = pSox->GetFieldNum("_Named_Max_count");
|
|
sFieldNum._NamedItem_ID = pSox->GetFieldNum("_NamedItem_ID");
|
|
sFieldNum._Item_ID = pSox->GetFieldNum("_Item_ID");
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
int nID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nID);
|
|
|
|
TNamedItemData NamedItem;
|
|
memset(&NamedItem, 0, sizeof(NamedItem));
|
|
|
|
NamedItem.nMaxCount = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Named_Max_count)->GetInteger();
|
|
NamedItem.nItemID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._NamedItem_ID)->GetInteger();
|
|
NamedItem.nSwapItemID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Item_ID)->GetInteger();
|
|
|
|
m_mNamedItemTableData.insert( make_pair(NamedItem.nItemID, NamedItem) );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetNamedItemMaxCount( int nItemID )
|
|
{
|
|
TMapNamedItem::iterator itor = m_mNamedItemTableData.find( nItemID );
|
|
if( itor != m_mNamedItemTableData.end() )
|
|
return itor->second.nMaxCount;
|
|
return 0;
|
|
}
|
|
|
|
int CDNGameDataManager::GetNamedItemSwapID( int nItemID )
|
|
{
|
|
TMapNamedItem::iterator itor = m_mNamedItemTableData.find( nItemID );
|
|
if( itor != m_mNamedItemTableData.end() )
|
|
return itor->second.nSwapItemID;
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
#ifdef PRE_ADD_EXCHANGE_POTENTIAL
|
|
bool CDNGameDataManager::LoadPotentialTransferData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPOTENTIAL_TRANS );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TPOTENTIAL_TRANS );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPOTENTIAL_TRANS );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"potentialtransfertable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"potentialtransfertable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_vPotentialTransferList.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nExtractItemLevel;
|
|
int nExtractItemRank;
|
|
int nInjectItemLevel;
|
|
int nInjectItemRank;
|
|
int nConsumptionCount;
|
|
int nMainType;
|
|
int nSubType;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nExtractItemLevel = pSox->GetFieldNum("_FromLevel");
|
|
sFieldNum.nExtractItemRank = pSox->GetFieldNum("_FromGrade");
|
|
sFieldNum.nInjectItemLevel = pSox->GetFieldNum("_ToLevel");
|
|
sFieldNum.nInjectItemRank = pSox->GetFieldNum("_ToGrade");
|
|
sFieldNum.nConsumptionCount = pSox->GetFieldNum("_Count");
|
|
sFieldNum.nMainType = pSox->GetFieldNum("_MainType");
|
|
sFieldNum.nSubType = pSox->GetFieldNum("_SubType");
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
int nID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nID);
|
|
|
|
TPotentialTransferData PotentialTransferData;
|
|
memset(&PotentialTransferData, 0, sizeof(PotentialTransferData));
|
|
|
|
PotentialTransferData.nItemID = nID;
|
|
PotentialTransferData.nExtractItemLevel = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nExtractItemLevel)->GetInteger();
|
|
PotentialTransferData.nExtractItemRank = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nExtractItemRank)->GetInteger();
|
|
PotentialTransferData.nInjectItemLevel = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nInjectItemLevel)->GetInteger();
|
|
PotentialTransferData.nInjectItemRank = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nInjectItemRank)->GetInteger();
|
|
PotentialTransferData.nConsumptionCount = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nConsumptionCount)->GetInteger();
|
|
PotentialTransferData.nMainType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMainType)->GetInteger();
|
|
PotentialTransferData.nSubType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nSubType)->GetInteger();
|
|
|
|
m_vPotentialTransferList.push_back(PotentialTransferData);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetPotentialTransConsumptionCount(int nExtractLevel, int nExtractRank, int nInjectLevel, int nInjectRank, int nMainType, int nSubType)
|
|
{
|
|
TVecPotentialTransferItem::iterator ii;
|
|
for (ii = m_vPotentialTransferList.begin(); ii != m_vPotentialTransferList.end(); ii++)
|
|
{
|
|
if ((*ii).nExtractItemLevel == nExtractLevel && (*ii).nExtractItemRank == nExtractRank && \
|
|
(*ii).nInjectItemLevel == nInjectLevel && (*ii).nInjectItemRank == nInjectRank && \
|
|
(*ii).nMainType == nMainType && (*ii).nSubType == nSubType)
|
|
return (*ii).nConsumptionCount;
|
|
}
|
|
return -1;
|
|
}
|
|
#endif //#ifdef PRE_ADD_EXCHANGE_POTENTIAL
|
|
|
|
bool CDNGameDataManager::LoadCashErasableType()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TCASHERASABLETYPE );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TCASHERASABLETYPE );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TCASHERASABLETYPE );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"casherasabletypetable.dnt failed\r\n" );
|
|
// return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"casherasabletypetable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
// return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_VecCashErasableType.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nType;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nType = pSox->GetFieldNum("_Type");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
int nID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nID);
|
|
|
|
int nType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nType)->GetInteger();
|
|
|
|
m_VecCashErasableType.push_back(nType);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsCashErasableType(int nItemID)
|
|
{
|
|
int nType = GetItemMainType(nItemID);
|
|
|
|
if (m_VecCashErasableType.empty()) return false;
|
|
|
|
for (int i = 0; i < (int)m_VecCashErasableType.size(); i++){
|
|
if (nType == m_VecCashErasableType[i])
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
#if defined( PRE_WORLDCOMBINE_PARTY )
|
|
bool CDNGameDataManager::LoadCombinePartyData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TWORLDCOMBINEPARTY );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TWORLDCOMBINEPARTY );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TWORLDCOMBINEPARTY );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"nestmissionpartytable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"nestmissionpartytable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_mWorldCombinePartyData.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nGroupIndex;
|
|
int nWorldMapID;
|
|
int nTitle;
|
|
int nTargetMap;
|
|
int nMapType;
|
|
int nMaxUser;
|
|
int nItemID;
|
|
int nLimitLevel;
|
|
int nItemLootRule;
|
|
int nClassDice;
|
|
int nSkillID1;
|
|
int nSkillID2;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nGroupIndex = pSox->GetFieldNum("_NestMissionPartyGroup");
|
|
sFieldNum.nWorldMapID = pSox->GetFieldNum("_WorldMapID");
|
|
sFieldNum.nTitle = pSox->GetFieldNum("_Title");
|
|
sFieldNum.nTargetMap = pSox->GetFieldNum("_MapTableID");
|
|
sFieldNum.nMapType = pSox->GetFieldNum("_MapType");
|
|
sFieldNum.nMaxUser = pSox->GetFieldNum("_MaxUser");
|
|
sFieldNum.nItemID = pSox->GetFieldNum("_GainItem");
|
|
sFieldNum.nLimitLevel = pSox->GetFieldNum("_LimitLevel");
|
|
sFieldNum.nItemLootRule = pSox->GetFieldNum("_ItemSelectDiceType");
|
|
sFieldNum.nClassDice = pSox->GetFieldNum("_SelectClassDice");
|
|
sFieldNum.nSkillID1 = pSox->GetFieldNum("_PartySkill1ID");
|
|
sFieldNum.nSkillID2 = pSox->GetFieldNum("_PartySkill2ID");
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
WorldCombineParty::WrldCombinePartyData Data;
|
|
memset(&Data, 0, sizeof(WorldCombineParty::WrldCombinePartyData));
|
|
int nID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nID);
|
|
|
|
Data.cIndex = (BYTE)nID;
|
|
Data.cGroupIndex = (BYTE)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nGroupIndex)->GetInteger();
|
|
Data.nWorldMap = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nWorldMapID)->GetInteger();
|
|
int nTitleID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nTitle)->GetInteger();
|
|
_wcscpy(Data.wszPartyName, _countof(Data.wszPartyName), GetEtUIXML().GetUIString( CEtUIXML::idCategory1, nTitleID ), (int)wcslen(GetEtUIXML().GetUIString( CEtUIXML::idCategory1, nTitleID )) );
|
|
Data.nTargetMap = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nTargetMap)->GetInteger();
|
|
Data.Difficulty = (TDUNGEONDIFFICULTY)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMapType)->GetInteger();
|
|
Data.cPartyMemberMax = (BYTE)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nMaxUser)->GetInteger();
|
|
Data.nItemID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nItemID)->GetInteger();
|
|
Data.cUserLvLimitMin = (BYTE)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nLimitLevel)->GetInteger();
|
|
Data.ItemLootRule = (TPARTYITEMLOOTRULE)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nItemLootRule)->GetInteger();
|
|
Data.nSkillID[0] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nSkillID1)->GetInteger();
|
|
Data.nSkillID[1] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nSkillID2)->GetInteger();
|
|
if( pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nClassDice)->GetInteger() )
|
|
Data.iBitFlag |= Party::BitFlag::JobDice;
|
|
|
|
Data.iBitFlag |= Party::BitFlag::WorldmapAllow;
|
|
Data.PartyType = _WORLDCOMBINE_PARTY;
|
|
Data.ItemRank = ITEMRANK_D;
|
|
m_mWorldCombinePartyData.insert( make_pair(Data.nTargetMap, Data) );
|
|
}
|
|
return true;
|
|
}
|
|
WorldCombineParty::WrldCombinePartyData* CDNGameDataManager::GetCombinePartyData(int nPrimaryIndex)
|
|
{
|
|
TMapWorldCombinePartyData::iterator itor = m_mWorldCombinePartyData.find(nPrimaryIndex);
|
|
if( itor != m_mWorldCombinePartyData.end() )
|
|
return &(itor->second);
|
|
return NULL;
|
|
}
|
|
void CDNGameDataManager::CheckCombinePartyData(TMapWorldCombinePartyData ExistCombineParty, TMapWorldCombinePartyData &CreateCombineParty)
|
|
{
|
|
for(TMapWorldCombinePartyData::iterator itor = m_mWorldCombinePartyData.begin();itor != m_mWorldCombinePartyData.end();itor++)
|
|
{
|
|
if( ExistCombineParty.find((*itor).first) == ExistCombineParty.end() )
|
|
{
|
|
CreateCombineParty.insert( make_pair((*itor).first, (*itor).second) );
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if defined( PRE_ADD_PCBANG_RENTAL_ITEM)
|
|
bool CDNGameDataManager::LoadPcCafeRentData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPCBANGRENTALITEM );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TPCBANGRENTALITEM );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPCBANGRENTALITEM );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"pccaferenttable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"pccaferenttable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_mPcBangRentItemData.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nItemID;
|
|
int nLevelStart;
|
|
int nLevelEnd;
|
|
int nClassID;
|
|
int nJob;
|
|
int nGrade;
|
|
int nItemOption;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nLevelStart = pSox->GetFieldNum("_PCLevelStart");
|
|
sFieldNum.nLevelEnd = pSox->GetFieldNum("_PCLevelEnd");
|
|
sFieldNum.nClassID = pSox->GetFieldNum("_ClassID");
|
|
sFieldNum.nJob = pSox->GetFieldNum("_Job");
|
|
sFieldNum.nItemID = pSox->GetFieldNum("_ItemID");
|
|
sFieldNum.nGrade = pSox->GetFieldNum("_Grade");
|
|
sFieldNum.nItemOption = pSox->GetFieldNum("_ItemOption");
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
TPcBangRentItem Data;
|
|
memset(&Data, 0, sizeof(TPcBangRentItem));
|
|
int nID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nID);
|
|
|
|
Data.nItemID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nItemID)->GetInteger();
|
|
Data.cLevelStart = (BYTE)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nLevelStart)->GetInteger();
|
|
Data.cLevelEnd = (BYTE)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nLevelEnd)->GetInteger();
|
|
Data.cClassID = (BYTE)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nClassID)->GetInteger();
|
|
Data.cJob = (BYTE)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nJob)->GetInteger();
|
|
Data.cGrade = (BYTE)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nGrade)->GetInteger();
|
|
Data.nItemOption = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nItemOption)->GetInteger();
|
|
m_mPcBangRentItemData.insert( make_pair(Data.nItemID, Data) );
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsPcCafeRentItem(int nItemID)
|
|
{
|
|
if( m_mPcBangRentItemData.empty() )
|
|
return false;
|
|
|
|
TMapPcBangRentItemData::iterator itor = m_mPcBangRentItemData.find(nItemID);
|
|
if( itor != m_mPcBangRentItemData.end() )
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
int CDNGameDataManager::GetPcCafeRentItemID(BYTE cLevel, char cClassID, BYTE cJob, BYTE cPcCafeGrade, std::map<int,int> &vList )
|
|
{
|
|
if( m_mPcBangRentItemData.empty() )
|
|
return 0;
|
|
|
|
int nCount = 0;
|
|
TPcBangRentItem* pRentItem = NULL;
|
|
for(TMapPcBangRentItemData::iterator itor = m_mPcBangRentItemData.begin(); itor != m_mPcBangRentItemData.end(); itor++)
|
|
{
|
|
pRentItem = &itor->second;
|
|
if( cLevel >= pRentItem->cLevelStart && cLevel <= pRentItem->cLevelEnd )
|
|
{
|
|
if( pRentItem->cClassID == 0 || pRentItem->cClassID == cClassID )
|
|
{
|
|
if( pRentItem->cJob == 0 || pRentItem->cJob == cJob )
|
|
{
|
|
if( pRentItem->cGrade == 0 || pRentItem->cGrade == cPcCafeGrade )
|
|
{
|
|
const TItemData* pItemData = g_pDataManager->GetItemData( pRentItem->nItemID );
|
|
if( !pItemData )
|
|
continue;
|
|
vList.insert(std::make_pair(pRentItem->nItemID,pRentItem->nItemOption));
|
|
if( pItemData->nType == ITEMTYPE_PET || pItemData->nType == ITEMTYPE_VEHICLE ) // 脐, 呕巴篮 牢亥配府 肮荐眉农 救窃
|
|
continue;
|
|
++nCount;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return nCount;
|
|
}
|
|
|
|
#endif //#if defined( PRE_ADD_PCBANG_RENTAL_ITEM)
|
|
|
|
#if defined(PRE_ADD_INSTANT_CASH_BUY)
|
|
bool CDNGameDataManager::LoadCashBuyShortcut()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pDnt;
|
|
if (m_bAllLoaded)
|
|
pDnt = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TCASHBUYSHORTCUT );
|
|
else
|
|
pDnt = GetDNTable( CDnTableDB::TCASHBUYSHORTCUT );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pDnt = GetDNTable( CDnTableDB::TCASHBUYSHORTCUT );
|
|
#endif //#ifdef _WORK
|
|
if( !pDnt )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"cashbuyshortcuttable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pDnt->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"cashbuyshortcuttable.dnt Count(%d)\r\n", pDnt->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapCashBuyShortcut.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH] = { 0, };
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nType;
|
|
int nAllowMapTypes;
|
|
int nShow;
|
|
std::vector<int> nSN;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nType = pDnt->GetFieldNum("_Type");
|
|
sFieldNum.nAllowMapTypes = pDnt->GetFieldNum("_AllowMapTypes");
|
|
sFieldNum.nShow = pDnt->GetFieldNum("_Show");
|
|
sFieldNum.nSN.reserve(CashBuyShortcutMax);
|
|
for (int j = 0; j < CashBuyShortcutMax; j++){
|
|
sprintf_s(szTemp, "_SN%02d", j + 1);
|
|
sFieldNum.nSN.push_back(pDnt->GetFieldNum(szTemp));
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pDnt->GetItemCount(); ++i)
|
|
{
|
|
int nID = pDnt->GetItemID(i);
|
|
int nIdx = pDnt->GetIDXprimary(nID);
|
|
|
|
TCashBuyShortcutData Shortcut = {0,};
|
|
|
|
Shortcut.nType = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nType)->GetInteger();
|
|
Shortcut.nAllowMapTypes = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nAllowMapTypes)->GetInteger();
|
|
Shortcut.nShow = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nShow)->GetInteger();
|
|
for (int j = 0; j < CashBuyShortcutMax; j++){
|
|
int nSN = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nSN[j])->GetInteger();
|
|
if (nSN <= 0) continue;
|
|
|
|
Shortcut.nSNList.push_back(nSN);
|
|
}
|
|
|
|
std::pair<TMapCashBuyShortcut::iterator, bool> Ret = m_MapCashBuyShortcut.insert(make_pair(Shortcut.nType, Shortcut));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TCashBuyShortcutData *CDNGameDataManager::GetCashBuyShortcut(int nType)
|
|
{
|
|
TMapCashBuyShortcut::iterator iter = m_MapCashBuyShortcut.find(nType);
|
|
if (iter == m_MapCashBuyShortcut.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
bool CDNGameDataManager::IsCashBuyShortcut(int nType, int nMapIndex, int nItemSN)
|
|
{
|
|
const TMapInfo *pMapData = GetMapInfo(nMapIndex);
|
|
if (!pMapData) return false;
|
|
|
|
TCashBuyShortcutData *pCash = GetCashBuyShortcut(nType);
|
|
if (!pCash) return false;
|
|
|
|
if (pCash->nShow == 0) return false;
|
|
if (pCash->nSNList.empty()) return false;
|
|
|
|
bool bFlag = false;
|
|
for (int i = 0; i < (int)pCash->nSNList.size(); i++){
|
|
if (pCash->nSNList[i] == nItemSN){
|
|
bFlag = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!bFlag) return false;
|
|
|
|
return (pCash->nAllowMapTypes & pMapData->nAllowMapType) ? true : false;
|
|
}
|
|
|
|
#endif // #if defined(PRE_ADD_INSTANT_CASH_BUY)
|
|
|
|
#if defined(PRE_ADD_EXCHANGE_ENCHANT)
|
|
bool CDNGameDataManager::LoadEnchantTransferData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TENCHANTTRANSFER );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TENCHANTTRANSFER );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TENCHANTTRANSFER );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"enchanttransfertable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"enchanttransfertable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_vExchangeEnchantData.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nRank;
|
|
int nLevelLimit;
|
|
int nEnchantLevel;
|
|
int nNeedCoin;
|
|
int nNeedItemID1;
|
|
int nNeedItemCount1;
|
|
int nNeedItemID2;
|
|
int nNeedItemCount2;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nRank = pSox->GetFieldNum("_Rank");
|
|
sFieldNum.nLevelLimit = pSox->GetFieldNum("_LevelLimit");
|
|
sFieldNum.nEnchantLevel = pSox->GetFieldNum("_EnchantLevel");
|
|
sFieldNum.nNeedCoin = pSox->GetFieldNum("_NeedCoin");
|
|
sFieldNum.nNeedItemID1 = pSox->GetFieldNum("_NeedItemID1");
|
|
sFieldNum.nNeedItemCount1 = pSox->GetFieldNum("_NeedItemCount1");
|
|
sFieldNum.nNeedItemID2 = pSox->GetFieldNum("_NeedItemID2");
|
|
sFieldNum.nNeedItemCount2 = pSox->GetFieldNum("_NeedItemCount2");
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i=0; i<pSox->GetItemCount(); ++i)
|
|
{
|
|
TExchangeEnchantData Data;
|
|
memset(&Data, 0, sizeof(TExchangeEnchantData));
|
|
int nID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nID);
|
|
|
|
Data.cRank = (BYTE)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nRank)->GetInteger();
|
|
Data.cLevelLimit = (BYTE)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nLevelLimit)->GetInteger();
|
|
Data.cEnchantLevel = (BYTE)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nEnchantLevel)->GetInteger();
|
|
Data.nNeedCoin = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nNeedCoin)->GetInteger();
|
|
Data.nNeedItemID1 = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nNeedItemID1)->GetInteger();
|
|
Data.wNeedItemCount1 = (short)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nNeedItemCount1)->GetInteger();
|
|
Data.nNeedItemID2 = pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nNeedItemID2)->GetInteger();
|
|
Data.wNeedItemCount2 = (short)pSox->GetFieldFromLablePtr(nIdx, sFieldNum.nNeedItemCount2)->GetInteger();
|
|
m_vExchangeEnchantData.push_back(Data);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
TExchangeEnchantData* CDNGameDataManager::GetExchangeEnchantData(BYTE cRank, BYTE cLevelLimit, BYTE cEnchantLevel)
|
|
{
|
|
TVecExchangeEnchantData::iterator ii;
|
|
for (ii = m_vExchangeEnchantData.begin(); ii != m_vExchangeEnchantData.end(); ii++)
|
|
{
|
|
if( (*ii).cRank == cRank && (*ii).cLevelLimit == cLevelLimit && (*ii).cEnchantLevel == cEnchantLevel )
|
|
return &(*ii);
|
|
}
|
|
return NULL;
|
|
|
|
}
|
|
#endif
|
|
|
|
#if defined(PRE_ADD_WEEKLYEVENT)
|
|
bool CDNGameDataManager::LoadWeeklyEvent()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pDnt;
|
|
if (m_bAllLoaded)
|
|
pDnt = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TWEEKLYEVENT);
|
|
else
|
|
pDnt = GetDNTable(CDnTableDB::TWEEKLYEVENT);
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pDnt = GetDNTable(CDnTableDB::TWEEKLYEVENT);
|
|
#endif //#ifdef _WORK
|
|
if (!pDnt)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"weeklyevent.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pDnt->GetItemCount() <= 0)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"weeklyevent.dnt Count(%d)\r\n", pDnt->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_pMapWeeklyEvent.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH] = { 0, };
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nDayOfWeek;
|
|
int nStartTime;
|
|
int nEndTime;
|
|
int nRaceType;
|
|
int nClassType;
|
|
int nEventType;
|
|
int nValue;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nDayOfWeek = pDnt->GetFieldNum("_DayOfWeek");
|
|
sFieldNum.nStartTime = pDnt->GetFieldNum("_StartTime");
|
|
sFieldNum.nEndTime = pDnt->GetFieldNum("_EndTime");
|
|
sFieldNum.nRaceType = pDnt->GetFieldNum("_RaceType");
|
|
sFieldNum.nClassType = pDnt->GetFieldNum("_ClassType");
|
|
sFieldNum.nEventType = pDnt->GetFieldNum("_EventType");
|
|
sFieldNum.nValue = pDnt->GetFieldNum("_Value");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
WeeklyEvent::TWeeklyEventData Data = {0,};
|
|
|
|
for (int i = 0; i < pDnt->GetItemCount(); ++i)
|
|
{
|
|
int nID = pDnt->GetItemID(i);
|
|
int nIdx = pDnt->GetIDXprimary(nID);
|
|
|
|
int nDayOfWeek = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nDayOfWeek)->GetInteger();
|
|
if (nDayOfWeek <= 0) continue;
|
|
if( nDayOfWeek == 7 ) // 老夸老篮 0捞促.
|
|
nDayOfWeek = 0;
|
|
|
|
WeeklyEvent::TWeeklyEvent *pEvent = GetWeeklyEvent(nDayOfWeek);
|
|
if (!pEvent){
|
|
pEvent = new WeeklyEvent::TWeeklyEvent;
|
|
pEvent->nDayOfWeek = nDayOfWeek;
|
|
}
|
|
|
|
memset(&Data, 0, sizeof(Data));
|
|
Data.nStartTime = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nStartTime)->GetInteger();
|
|
Data.nEndTime = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nEndTime)->GetInteger();
|
|
Data.cRaceType = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nRaceType)->GetInteger();
|
|
Data.cClassType = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nClassType)->GetInteger();
|
|
Data.nEventType = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nEventType)->GetInteger();
|
|
Data.nValue = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nValue)->GetInteger();
|
|
|
|
pEvent->VecEventData.push_back(Data);
|
|
|
|
m_pMapWeeklyEvent[nDayOfWeek] = pEvent;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
WeeklyEvent::TWeeklyEvent *CDNGameDataManager::GetWeeklyEvent(int nDayOfWeek)
|
|
{
|
|
if (nDayOfWeek <= 0) return NULL;
|
|
|
|
TMapWeeklyEvent::iterator iter = m_pMapWeeklyEvent.find(nDayOfWeek);
|
|
if (iter == m_pMapWeeklyEvent.end()) return NULL;
|
|
|
|
return iter->second;
|
|
}
|
|
|
|
int CDNGameDataManager::GetWeeklyEventValue(int nRaceType, int nClassType, int nEventType, int nThreadIndex)
|
|
{
|
|
if (nThreadIndex >= 30) return 0;
|
|
|
|
WeeklyEvent::TWeeklyEvent *pWeeklyEvent = GetWeeklyEvent(m_UpdateLocalTime[nThreadIndex].pCurLocalTime.tm_wday);
|
|
if (!pWeeklyEvent) return 0;
|
|
if (pWeeklyEvent->VecEventData.empty()) return 0;
|
|
|
|
for (int i = 0; i < (int)pWeeklyEvent->VecEventData.size(); i++){
|
|
if (pWeeklyEvent->VecEventData[i].nStartTime > m_UpdateLocalTime[nThreadIndex].pCurLocalTime.tm_hour) continue;
|
|
if (pWeeklyEvent->VecEventData[i].nEndTime <= m_UpdateLocalTime[nThreadIndex].pCurLocalTime.tm_hour) continue;
|
|
if ((pWeeklyEvent->VecEventData[i].cRaceType > 0) && (pWeeklyEvent->VecEventData[i].cRaceType != nRaceType)) continue;
|
|
if ((pWeeklyEvent->VecEventData[i].cClassType > 0) && (pWeeklyEvent->VecEventData[i].cClassType != nClassType)) continue;
|
|
if (pWeeklyEvent->VecEventData[i].nEventType != nEventType) continue;
|
|
|
|
return pWeeklyEvent->VecEventData[i].nValue;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
float CDNGameDataManager::GetWeeklyEventValuef(int nRaceType, int nClassType, int nEventType, int nThreadIndex)
|
|
{
|
|
int nValue = GetWeeklyEventValue(nRaceType, nClassType, nEventType, nThreadIndex);
|
|
if (nValue == 0) return 0.f;
|
|
|
|
return (float)(nValue / 100.f);
|
|
}
|
|
|
|
void CDNGameDataManager::WeeklyEventClear()
|
|
{
|
|
m_pMapWeeklyEvent.clear();
|
|
}
|
|
|
|
#endif // #if defined(PRE_ADD_WEEKLYEVENT)
|
|
|
|
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
|
|
bool CDNGameDataManager::LoadTotalLevelSkill()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pTotalSkillDnt;
|
|
DNTableFileFormat* pTotalSlot;
|
|
DNTableFileFormat* pSkillLevelTable;
|
|
DNTableFileFormat* pSkillTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTotalSkillDnt = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TTOTALLEVELSKILL);
|
|
pTotalSlot = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TTOTALLEVELLSKILLSLOT);
|
|
DNTableFileFormat* pSkillLevelTable = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TSKILLLEVEL);
|
|
pSkillTable = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TSKILL);
|
|
}
|
|
else
|
|
{
|
|
pTotalSkillDnt = GetDNTable(CDnTableDB::TTOTALLEVELSKILL);
|
|
pTotalSlot = GetDNTable(CDnTableDB::TTOTALLEVELLSKILLSLOT);
|
|
pSkillLevelTable = GetDNTable( CDnTableDB::TSKILLLEVEL );
|
|
pSkillTable = GetDNTable( CDnTableDB::TSKILL );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pTotalSkillDnt = GetDNTable(CDnTableDB::TTOTALLEVELSKILL);
|
|
DNTableFileFormat* pTotalSlot = GetDNTable(CDnTableDB::TTOTALLEVELLSKILLSLOT);
|
|
DNTableFileFormat* pSkillLevelTable = GetDNTable( CDnTableDB::TSKILLLEVEL );
|
|
DNTableFileFormat* pSkillTable = GetDNTable( CDnTableDB::TSKILL );
|
|
#endif //#ifdef _WORK
|
|
if (!pTotalSkillDnt)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"totallevelskill.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (!pTotalSlot)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"totalskillslot.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (!pSkillLevelTable)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"SkillLevelTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (!pSkillTable)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"SkillTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pTotalSkillDnt->GetItemCount() <= 0)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"totallevelskill.dnt Count(%d)\r\n", pTotalSkillDnt->GetItemCount());
|
|
return false;
|
|
}
|
|
if (pTotalSlot->GetItemCount() <= 0)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"totalskillslot.dnt Count(%d)\r\n", pTotalSlot->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapTotalSkillLevelTabel.clear();
|
|
m_MapTotalSkillSlotTabel.clear();
|
|
m_MapTotalSkillBlow.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH] = { 0, };
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nSkillID;
|
|
int nTotalLevelLimit;
|
|
int nUseLevelLimit;
|
|
int nSkillType;
|
|
int nSlotIndex;
|
|
int nLevelLimit;
|
|
int bCash;
|
|
std::vector<int> EffectBlowID;
|
|
std::vector<int> EffectBlowValue;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nSkillID = pTotalSkillDnt->GetFieldNum("_SkillTableID");
|
|
sFieldNum.nTotalLevelLimit = pTotalSkillDnt->GetFieldNum("_TotalLevelLimit");
|
|
sFieldNum.nUseLevelLimit = pTotalSkillDnt->GetFieldNum("_LevelLimit");
|
|
sFieldNum.nSkillType = pTotalSkillDnt->GetFieldNum("_SkillType");
|
|
|
|
sFieldNum.nSlotIndex = pTotalSlot->GetFieldNum("_SlotID");
|
|
sFieldNum.nLevelLimit = pTotalSlot->GetFieldNum("_LevelLimit");
|
|
sFieldNum.bCash = pTotalSlot->GetFieldNum("_IsCash");
|
|
|
|
sFieldNum.EffectBlowID.reserve(TotalLevelSkill::Common::MAX_STATE_EFFECT_COUNT);
|
|
sFieldNum.EffectBlowValue.reserve(TotalLevelSkill::Common::MAX_STATE_EFFECT_COUNT);
|
|
for( int i = 0; i < TotalLevelSkill::Common::MAX_STATE_EFFECT_COUNT; ++i )
|
|
{
|
|
sprintf_s( szTemp, "_EffectClass%d", i+1 );
|
|
sFieldNum.EffectBlowID.push_back( pSkillTable->GetFieldNum( szTemp) );
|
|
sprintf_s( szTemp, "_EffectClassValue%d", i+1 );
|
|
sFieldNum.EffectBlowValue.push_back( pSkillLevelTable->GetFieldNum( szTemp) );
|
|
}
|
|
|
|
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
|
|
for (int i = 0; i < pTotalSkillDnt->GetItemCount(); ++i)
|
|
{
|
|
int nID = pTotalSkillDnt->GetItemID(i);
|
|
int nIdx = pTotalSkillDnt->GetIDXprimary(nID);
|
|
|
|
TotalLevelSkill::TTotalSkillLevelTable LevelTable;
|
|
memset(&LevelTable, 0, sizeof(LevelTable));
|
|
|
|
LevelTable.nSkillID = pTotalSkillDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nSkillID)->GetInteger();
|
|
LevelTable.nTotalLevelLimit= pTotalSkillDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nTotalLevelLimit)->GetInteger();
|
|
LevelTable.nUseLevelLimit= pTotalSkillDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nUseLevelLimit)->GetInteger();
|
|
LevelTable.nSkillType= pTotalSkillDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nSkillType)->GetInteger();
|
|
|
|
m_MapTotalSkillLevelTabel.insert(std::make_pair(LevelTable.nSkillID, LevelTable));
|
|
|
|
std::list<TotalLevelSkill::TTotalSkillBlowTable> EffectBlowList;
|
|
EffectBlowList.clear();
|
|
for( int j = 0; j < TotalLevelSkill::Common::MAX_STATE_EFFECT_COUNT; ++j )
|
|
{
|
|
std::vector<int> vlSkillLevelList;
|
|
if( pSkillLevelTable->GetItemIDListFromField( "_SkillIndex", LevelTable.nSkillID, vlSkillLevelList ) <= 0 )
|
|
break;
|
|
|
|
int iSkillLevelTableID = -1;
|
|
|
|
for( int i = 0; i < (int)vlSkillLevelList.size(); ++i )
|
|
{
|
|
int iNowLevel = pSkillLevelTable->GetFieldFromLablePtr( vlSkillLevelList.at(i), "_SkillLevel" )->GetInteger();
|
|
if( iNowLevel == 1 )
|
|
{
|
|
iSkillLevelTableID = vlSkillLevelList.at( i );
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( -1 == iSkillLevelTableID )
|
|
break;
|
|
|
|
int nSkillIdx = pSkillTable->GetIDXprimary( LevelTable.nSkillID );
|
|
|
|
// 付阑侩 牢磊绰 公炼扒 茄俺肺 烹老
|
|
TotalLevelSkill::TTotalSkillBlowTable BlowData;
|
|
memset(&BlowData, 0, sizeof(TotalLevelSkill::TTotalSkillBlowTable));
|
|
BlowData.nSkillID = LevelTable.nSkillID;
|
|
BlowData.nBlowID = pSkillTable->GetFieldFromLablePtr( nSkillIdx, sFieldNum.EffectBlowID[j] )->GetInteger();
|
|
|
|
if(BlowData.nBlowID < 1)
|
|
continue;
|
|
|
|
int nSkillLevelIdx = pSkillLevelTable->GetIDXprimary( iSkillLevelTableID );
|
|
string szValue = pSkillLevelTable->GetFieldFromLablePtr( nSkillLevelIdx, sFieldNum.EffectBlowValue[j] )->GetString();
|
|
BlowData.fBlowValue = (float)atof( szValue.c_str() );
|
|
BlowData.nBlowValue = (int)atoi( szValue.c_str() );
|
|
EffectBlowList.push_back(BlowData);
|
|
}
|
|
m_MapTotalSkillBlow.insert(make_pair(LevelTable.nSkillID, EffectBlowList));
|
|
}
|
|
|
|
for (int i = 0; i < pTotalSlot->GetItemCount(); ++i)
|
|
{
|
|
int nID = pTotalSlot->GetItemID(i);
|
|
int nIdx = pTotalSlot->GetIDXprimary(nID);
|
|
|
|
TotalLevelSkill::TTotalSkillSlotTable SlotTable;
|
|
memset(&SlotTable, 0, sizeof(SlotTable));
|
|
|
|
|
|
SlotTable.nSlotIndex= pTotalSlot->GetFieldFromLablePtr(nIdx, sFieldNum.nSlotIndex)->GetInteger() - 1;
|
|
SlotTable.nLevelLimit= pTotalSlot->GetFieldFromLablePtr(nIdx, sFieldNum.nLevelLimit)->GetInteger();
|
|
SlotTable.bCash= pTotalSlot->GetFieldFromLablePtr(nIdx, sFieldNum.bCash)->GetInteger() ? true : false;
|
|
|
|
m_MapTotalSkillSlotTabel.insert(std::make_pair(SlotTable.nSlotIndex, SlotTable));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetTotalLevelSkillType( int nSkillID )
|
|
{
|
|
TMapTotalSkillLevelTable::iterator itor = m_MapTotalSkillLevelTabel.find(nSkillID);
|
|
if(itor != m_MapTotalSkillLevelTabel.end())
|
|
{
|
|
return itor->second.nSkillType;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
float CDNGameDataManager::GetTotalLevelSkillValue( int nSkillID, TotalLevelSkill::Common::eVillageEffectType eType )
|
|
{
|
|
TMapTotalSkillBlow::iterator itor = m_MapTotalSkillBlow.find(nSkillID);
|
|
float fValue = 0.0f;
|
|
for(std::list<TotalLevelSkill::TTotalSkillBlowTable>::iterator ii = itor->second.begin();ii != itor->second.end();ii++)
|
|
{
|
|
if((*ii).nBlowID == eType)
|
|
fValue += (*ii).fBlowValue;
|
|
}
|
|
return fValue;
|
|
}
|
|
|
|
int CDNGameDataManager::GetintTotalLevelSkillValue( int nSkillID, TotalLevelSkill::Common::eVillageEffectType eType )
|
|
{
|
|
TMapTotalSkillBlow::iterator itor = m_MapTotalSkillBlow.find(nSkillID);
|
|
for(std::list<TotalLevelSkill::TTotalSkillBlowTable>::iterator ii = itor->second.begin();ii != itor->second.end();ii++)
|
|
{
|
|
if((*ii).nBlowID == eType)
|
|
{
|
|
return (*ii).nBlowValue;
|
|
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
bool CDNGameDataManager::bIsTotalLevelSkillLimitLevel( int nSlotIndex, int nSkillID, int nTotalLevel, int nCharacterLevel)
|
|
{
|
|
TMapTotalSkillLevelTable::iterator itor = m_MapTotalSkillLevelTabel.find(nSkillID);
|
|
if(itor != m_MapTotalSkillLevelTabel.end())
|
|
{
|
|
if( itor->second.nTotalLevelLimit <= nTotalLevel && itor->second.nUseLevelLimit <= nCharacterLevel )
|
|
{
|
|
TMapTotalSkillSlotTable::iterator ii = m_MapTotalSkillSlotTabel.find(nSlotIndex);
|
|
if(ii != m_MapTotalSkillSlotTabel.end())
|
|
{
|
|
if(ii->second.nLevelLimit <= nCharacterLevel)
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CDNGameDataManager::bIsTotalLevelSkillCashSlot( int nSlotIndex )
|
|
{
|
|
TMapTotalSkillSlotTable::iterator ii = m_MapTotalSkillSlotTabel.find(nSlotIndex);
|
|
if(ii != m_MapTotalSkillSlotTabel.end())
|
|
{
|
|
return ii->second.bCash;
|
|
}
|
|
return false;
|
|
}
|
|
#endif
|
|
|
|
#if defined(PRE_SPECIALBOX)
|
|
bool CDNGameDataManager::LoadKeepBoxProvideItem()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pDnt;
|
|
if (m_bAllLoaded)
|
|
pDnt = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TKEEPBOXPROVIDEITEM);
|
|
else
|
|
pDnt = GetDNTable(CDnTableDB::TKEEPBOXPROVIDEITEM);
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pDnt = GetDNTable(CDnTableDB::TKEEPBOXPROVIDEITEM);
|
|
#endif //#ifdef _WORK
|
|
if (!pDnt)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"keepboxprovideitemtable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pDnt->GetItemCount() <= 0)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"keepboxprovideitemtable.dnt Count(%d)\r\n", pDnt->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_pMapKeepBoxProvideItemData.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH] = { 0, };
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nType;
|
|
int nCashSN;
|
|
int nItemID;
|
|
int nCount;
|
|
int nSealCount;
|
|
int nOption;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nType = pDnt->GetFieldNum("_Type");
|
|
sFieldNum.nCashSN = pDnt->GetFieldNum("_CashSN");
|
|
sFieldNum.nItemID = pDnt->GetFieldNum("_ItemID");
|
|
sFieldNum.nCount = pDnt->GetFieldNum("_Count");
|
|
sFieldNum.nSealCount = pDnt->GetFieldNum("_SealCount");
|
|
sFieldNum.nOption = pDnt->GetFieldNum("_ItemOption");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pDnt->GetItemCount(); ++i)
|
|
{
|
|
int nID = pDnt->GetItemID(i);
|
|
int nIdx = pDnt->GetIDXprimary(nID);
|
|
|
|
int nType = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nType)->GetInteger();
|
|
|
|
TKeepBoxProvideItemData *pData = GetKeepBoxProvideItemData(nType);
|
|
if (!pData){
|
|
pData = new TKeepBoxProvideItemData;
|
|
pData->nType = nType;
|
|
}
|
|
|
|
TProvideItemData AddItem = {0,};
|
|
|
|
AddItem.nCashSN = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nCashSN)->GetInteger();
|
|
AddItem.nItemID = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nItemID)->GetInteger();
|
|
AddItem.nCount = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nCount)->GetInteger();
|
|
AddItem.nSealCount = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nSealCount)->GetInteger();
|
|
if (AddItem.nSealCount == -1)
|
|
AddItem.nSealCount = GetItemSealCount(AddItem.nItemID);
|
|
AddItem.nOption = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nOption)->GetInteger();
|
|
|
|
pData->VecProvideItem.push_back(AddItem);
|
|
|
|
m_pMapKeepBoxProvideItemData[nType] = pData;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TKeepBoxProvideItemData *CDNGameDataManager::GetKeepBoxProvideItemData(int nType)
|
|
{
|
|
TMapKeepBoxProvideItemData::iterator iter = m_pMapKeepBoxProvideItemData.find(nType);
|
|
if (iter == m_pMapKeepBoxProvideItemData.end()) return NULL;
|
|
|
|
return iter->second;
|
|
}
|
|
#endif // #if defined(PRE_SPECIALBOX)
|
|
|
|
#if defined(PRE_ADD_REMOTE_QUEST)
|
|
bool CDNGameDataManager::LoadRemoteQuestData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TREMOTEQUEST );
|
|
}
|
|
else
|
|
{
|
|
pTable = GetDNTable( CDnTableDB::TREMOTEQUEST );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TREMOTEQUEST );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"QuestRemoteTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log( LogType::_FILELOG, L"QuestRemoteTable.dnt Count(%d)\r\n", pTable->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PVEC( m_pQuestRemoteTable );
|
|
SAFE_DELETE_MAP(m_MapRemoteQuestID);
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _Activate;
|
|
int _QuestID;
|
|
int _PreQuestCheckType;
|
|
std::vector<int> _PreQuestCondition;
|
|
int _GainEvent;
|
|
std::vector<int> _GainType;
|
|
std::vector<int> _GainParam;
|
|
std::vector<int> _GainOperator;
|
|
int _GainCheckType;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._Activate = pTable->GetFieldNum( "_Activate" );
|
|
sFieldNum._QuestID = pTable->GetFieldNum( "_QuestID" );
|
|
sFieldNum._PreQuestCheckType = pTable->GetFieldNum( "_PreQuestCheckType" );
|
|
sFieldNum._GainEvent = pTable->GetFieldNum( "_GainEvent" );
|
|
sFieldNum._GainType.reserve(5);
|
|
sFieldNum._GainParam.reserve(5);
|
|
sFieldNum._GainOperator.reserve(5);
|
|
|
|
for( int j=0; j<5; j++ )
|
|
{
|
|
sprintf_s( szTemp, "_Gain%dType", j + 1 );
|
|
sFieldNum._GainType.push_back( pTable->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_Gain%dParam", j + 1 );
|
|
sFieldNum._GainParam.push_back( pTable->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_Gain%dOperator", j + 1 );
|
|
sFieldNum._GainOperator.push_back( pTable->GetFieldNum(szTemp) );
|
|
}
|
|
for( int j=0; j<10; j++ )
|
|
{
|
|
sprintf_s( szTemp, "_PreQuestCondition%d", j + 1 );
|
|
sFieldNum._PreQuestCondition.push_back( pTable->GetFieldNum(szTemp) );
|
|
}
|
|
|
|
sFieldNum._GainCheckType = pTable->GetFieldNum( "_GainCheckType" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pTable->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pTable->GetItemID(i);
|
|
|
|
int iIdx = pTable->GetIDXprimary( nItemID );
|
|
|
|
TRemoteQuestData *pData = new TRemoteQuestData;
|
|
memset( pData, 0, sizeof(TRemoteQuestData) );
|
|
|
|
pData->bActivate = ( pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Activate )->GetInteger() == TRUE ) ? true : false;
|
|
pData->nQuestID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._QuestID )->GetInteger();
|
|
pData->bPreQuestCheckType = ( pTable->GetFieldFromLablePtr( iIdx, sFieldNum._PreQuestCheckType )->GetInteger() == TRUE ) ? true : false;
|
|
|
|
pData->GainCondition.cEvent = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._GainEvent )->GetInteger();
|
|
|
|
if (pData->bActivate)
|
|
{
|
|
if (pData->GainCondition.cEvent >= EventSystem::EventTypeEnum_Amount)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"QuestRemoteTable.dnt Invalid GainEvent : [ItemID:%d]\n" ,nItemID);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
for( int j=0; j<5; j++ )
|
|
{
|
|
pData->GainCondition.cType[j] = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._GainType[j] )->GetInteger();
|
|
pData->GainCondition.nParam[j] = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._GainParam[j] )->GetInteger();
|
|
pData->GainCondition.cOperator[j] = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._GainOperator[j] )->GetInteger();
|
|
|
|
if (pData->bActivate)
|
|
{
|
|
if (pData->GainCondition.nParam[j] < 0)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"QuestRemoteTable.dnt, GainParm < 0 [ItemID:%d]\n", nItemID);
|
|
return false;
|
|
}
|
|
|
|
if (pData->GainCondition.cType[j] >= EventSystem::EventValueTypeEnum_Amount)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MissionTable.dnt, Invalid GainType\n");
|
|
return false;
|
|
}
|
|
|
|
if (CDNEventSystem::s_EventValueFuncList[pData->GainCondition.cType[j]].pFunc == NULL && pData->GainCondition.cType[j] > 0)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MissionTable.dnt, Invalid s_EventValueFuncList[GainType], please check MissionAPI\n");
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
for( int j=0; j<10; j++ )
|
|
{
|
|
int nPreQuestID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._PreQuestCondition[j] )->GetInteger();
|
|
if( 0 == nPreQuestID )
|
|
continue;
|
|
|
|
pData->nVecPreQuestCondition.push_back( nPreQuestID );
|
|
}
|
|
|
|
pData->GainCondition.bCheckType = ( pTable->GetFieldFromLablePtr( iIdx, sFieldNum._GainCheckType )->GetInteger() == TRUE ) ? true : false;
|
|
|
|
m_pQuestRemoteTable.push_back( pData );
|
|
m_MapRemoteQuestID.insert( make_pair(pData->nQuestID, pData->nIndex));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetRemoteQuestDataSize()
|
|
{
|
|
return (int)m_pQuestRemoteTable.size();
|
|
}
|
|
|
|
TRemoteQuestData *CDNGameDataManager::GetRemoteQuestData( int nArrayIndex )
|
|
{
|
|
if( nArrayIndex < 0 || nArrayIndex >= (int)m_pQuestRemoteTable.size() ) return NULL;
|
|
return m_pQuestRemoteTable[nArrayIndex];
|
|
}
|
|
|
|
TRemoteQuestData *CDNGameDataManager::GetRemoteQuestDataByQuestID( int nQuestID )
|
|
{
|
|
if( nQuestID < 0 || m_pQuestRemoteTable.empty()) return NULL;
|
|
|
|
TMapRemoteQuestID::iterator iter = m_MapRemoteQuestID.find(nQuestID);
|
|
if(iter == m_MapRemoteQuestID.end())
|
|
return NULL;
|
|
|
|
return GetRemoteQuestData(iter->second);
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef PRE_ADD_JOINGUILD_SUPPORT
|
|
bool CDNGameDataManager::LoadGuildSupport()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pDnt;
|
|
if (m_bAllLoaded)
|
|
pDnt = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TGUILDSUPPORT);
|
|
else
|
|
pDnt = GetDNTable(CDnTableDB::TGUILDSUPPORT);
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pDnt = GetDNTable(CDnTableDB::TGUILDSUPPORT);
|
|
#endif //#ifdef _WORK
|
|
if (!pDnt)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"guildmembermaxlv.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if (pDnt->GetItemCount() <= 0)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"guildmembermaxlv.dnt Count(%d)\r\n", pDnt->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_VecGuildSupportData.clear();
|
|
}
|
|
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH] = { 0, };
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nJoinMinLevel; //弥檬辨靛啊涝矫 弥家饭骇
|
|
int nJoinMaxLevel; //弥檬辨靛啊涝矫 弥措饭骇
|
|
int nFirstJoinMailID; //弥檬啊涝矫 焊惑皋老酒捞叼
|
|
int nMaxLevelGuildSupportMailID; //弥檬啊涝茄 辨靛俊辑 父乏矫 焊惑酒捞叼
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nJoinMinLevel = pDnt->GetFieldNum("_Lvmin");
|
|
sFieldNum.nJoinMaxLevel = pDnt->GetFieldNum("_Lvmax");
|
|
sFieldNum.nFirstJoinMailID = pDnt->GetFieldNum("_Join");
|
|
sFieldNum.nMaxLevelGuildSupportMailID = pDnt->GetFieldNum("_Maxlv");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pDnt->GetItemCount(); ++i)
|
|
{
|
|
int nID = pDnt->GetItemID(i);
|
|
int nIdx = pDnt->GetIDXprimary(nID);
|
|
|
|
TGuildSupportData Data;
|
|
memset(&Data, 0, sizeof(Data));
|
|
|
|
Data.nID = nID;
|
|
Data.nJoinMinLevel = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nJoinMinLevel)->GetInteger();
|
|
Data.nJoinMaxLevel = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nJoinMaxLevel)->GetInteger();
|
|
Data.nFirstJoinMailID = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nFirstJoinMailID)->GetInteger();
|
|
Data.nMaxLevelGuildSupportMailID = pDnt->GetFieldFromLablePtr(nIdx, sFieldNum.nMaxLevelGuildSupportMailID)->GetInteger();
|
|
|
|
m_VecGuildSupportData.push_back(Data);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetRewardGuildSupportMailID(int nLevel)
|
|
{
|
|
TVecGuildSupportData::iterator ii;
|
|
for (ii = m_VecGuildSupportData.begin(); ii != m_VecGuildSupportData.end(); ii++)
|
|
{
|
|
if ((*ii).nJoinMinLevel <= nLevel && (*ii).nJoinMaxLevel >= nLevel)
|
|
return (*ii).nMaxLevelGuildSupportMailID;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int CDNGameDataManager::GetRewardFisrtGuildJoinMailID(int nLevel)
|
|
{
|
|
TVecGuildSupportData::iterator ii;
|
|
for (ii = m_VecGuildSupportData.begin(); ii != m_VecGuildSupportData.end(); ii++)
|
|
{
|
|
if ((*ii).nJoinMinLevel <= nLevel && (*ii).nJoinMaxLevel >= nLevel)
|
|
return (*ii).nFirstJoinMailID;
|
|
}
|
|
return 0;
|
|
}
|
|
#endif //#ifdef PRE_ADD_JOINGUILD_SUPPORT
|
|
|
|
#if defined( PRE_WORLDCOMBINE_PVP )
|
|
bool CDNGameDataManager::LoadWorldPVPMissionRoom()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
DNTableFileFormat* pGameModeSox;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TWORLDPVPMISSIONROOM );
|
|
pGameModeSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPVPGAMEMODE );
|
|
}
|
|
else
|
|
{
|
|
pSox = GetDNTable( CDnTableDB::TWORLDPVPMISSIONROOM );
|
|
pGameModeSox = GetDNTable( CDnTableDB::TPVPGAMEMODE );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TWORLDPVPMISSIONROOM );
|
|
DNTableFileFormat* pGameModeSox = GetDNTable( CDnTableDB::TPVPGAMEMODE );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"worldmissionroomtable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"worldmissionroomtable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
//return false;
|
|
}
|
|
|
|
if( !pGameModeSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPGameModeTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pGameModeSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPGameModeTable.dnt Count(%d)\r\n", pGameModeSox->GetItemCount() );
|
|
//return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapWorldPvPMissionRoom.clear();
|
|
m_VecWorldPvPMissionRoom.clear();
|
|
m_listWorldPvPRoomMode.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _PvPMissionRoomGroup;
|
|
int _PvPMapTableID;
|
|
int _PvPGameModeTableID;
|
|
int _WinCondition;
|
|
int _PlayTime;
|
|
int _MaxPlayers;
|
|
int _StartPlayers;
|
|
int _TitleUIString;
|
|
int _DropItem;
|
|
int _LimitLevelMin;
|
|
int _LimitLevelMax;
|
|
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
int _ChannelType;
|
|
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._PvPMissionRoomGroup = pSox->GetFieldNum("_WorldMissionRoomGroup");
|
|
sFieldNum._PvPMapTableID = pSox->GetFieldNum("_PvPMapTableID");
|
|
sFieldNum._PvPGameModeTableID = pSox->GetFieldNum("_PvPGameModeTableID");
|
|
sFieldNum._WinCondition = pSox->GetFieldNum("_WinCondition");
|
|
sFieldNum._PlayTime = pSox->GetFieldNum("_PlayTime");
|
|
sFieldNum._MaxPlayers = pSox->GetFieldNum("_MaxUser");
|
|
sFieldNum._StartPlayers = pSox->GetFieldNum("_StartUser");
|
|
sFieldNum._TitleUIString = pSox->GetFieldNum("_TitleUIString");
|
|
sFieldNum._DropItem = pSox->GetFieldNum("_DropItem");
|
|
sFieldNum._LimitLevelMin = pSox->GetFieldNum("_LimitLevelMin");
|
|
sFieldNum._LimitLevelMax = pSox->GetFieldNum("_LimitLevelMax");
|
|
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
sFieldNum._ChannelType = pSox->GetFieldNum("_PVPChannel");
|
|
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
|
|
TWorldPvPMissionRoom Data;
|
|
memset(&Data, 0, sizeof(Data));
|
|
Data.nItemID = nItemID;
|
|
Data.nMapID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PvPMapTableID)->GetInteger();
|
|
Data.cModeID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PvPGameModeTableID)->GetInteger();
|
|
Data.nWinCondition = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._WinCondition)->GetInteger();
|
|
Data.nPlayTime = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PlayTime)->GetInteger();
|
|
Data.cMaxPlayers = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._MaxPlayers)->GetInteger();
|
|
Data.nStartPlayers = 2;
|
|
Data.nRoomNameIndex = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._TitleUIString)->GetInteger();
|
|
Data.bDropItem = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._DropItem)->GetInteger() ? true : false;
|
|
Data.nMinLevel = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._LimitLevelMin)->GetInteger();
|
|
Data.nMaxLevel = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._LimitLevelMax)->GetInteger();
|
|
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
Data.nChannelType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ChannelType)->GetInteger();
|
|
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
Data.eWorldReqType = WorldPvPMissionRoom::Common::MissionRoom;
|
|
// Data.unRoomOptionBit |= PvPCommon::RoomOption::BreakInto;
|
|
Data.unRoomOptionBit |= PvPCommon::RoomOption::RandomTeam;
|
|
|
|
int nAllowMode = pGameModeSox->GetFieldFromLablePtr( Data.cModeID, "GamemodeID" )->GetInteger();
|
|
// m_listWorldPvPRoomMode.push_back(nAllowMode);
|
|
if(nAllowMode == PvPCommon::GameMode::PvP_AllKill )
|
|
Data.unRoomOptionBit |= PvPCommon::RoomOption::AllKill_RandomOrder;
|
|
|
|
#if defined(PRE_ADD_MULTILANGUAGE)
|
|
std::wstring wszName = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, Data.nRoomNameIndex, MultiLanguage::eDefaultLanguage );
|
|
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
std::wstring wszName = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, Data.nRoomNameIndex );
|
|
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
|
|
_wcscpy( Data.wszRoomName, _countof(Data.wszRoomName), wszName.c_str(), static_cast<int>(wszName.size()) );
|
|
|
|
m_MapWorldPvPMissionRoom.insert(make_pair(nItemID, Data));
|
|
|
|
m_VecWorldPvPMissionRoom.push_back(Data);
|
|
}
|
|
|
|
m_listWorldPvPRoomMode.push_back(PvPCommon::GameMode::PvP_AllKill);
|
|
m_listWorldPvPRoomMode.push_back(PvPCommon::GameMode::PvP_Tournament);
|
|
|
|
return true;
|
|
}
|
|
|
|
TWorldPvPMissionRoom* CDNGameDataManager::GetWorldPvPMissionRoom(int nItemID)
|
|
{
|
|
if(nItemID <= 0) return NULL;
|
|
|
|
TMapWorldPvPMissionRoom::iterator iter = m_MapWorldPvPMissionRoom.find(nItemID);
|
|
if(iter == m_MapWorldPvPMissionRoom.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
TVecWorldPvPMissionRoom& CDNGameDataManager::GetWorldVecPvPMissionRoom()
|
|
{
|
|
return m_VecWorldPvPMissionRoom;
|
|
}
|
|
|
|
bool CDNGameDataManager::bIsWorldPvPRoomAllowMode( int nMode )
|
|
{
|
|
for( std::list<int>::iterator itor = m_listWorldPvPRoomMode.begin(); itor != m_listWorldPvPRoomMode.end(); itor++ )
|
|
{
|
|
if( *itor == nMode )
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
#endif
|
|
|
|
#if defined(PRE_ADD_ACTIVEMISSION)
|
|
|
|
bool CDNGameDataManager::LoadActiveMissionData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TACTIVEMISSION );
|
|
}
|
|
else
|
|
{
|
|
pTable = GetDNTable( CDnTableDB::TACTIVEMISSION );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TACTIVEMISSION );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"ActiveMissionTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log( LogType::_FILELOG, L"ActiveMissionTable.dnt Count(%d)\r\n", pTable->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PVEC( m_pActiveMissionTable );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _Activate;
|
|
int _AchieveEvent;
|
|
std::vector<int> _AchieveType;
|
|
std::vector<int> _AchieveParam;
|
|
std::vector<int> _AchieveOperator;
|
|
int _AchieveCheckType;
|
|
int _MailID;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._Activate = pTable->GetFieldNum( "_Activate" );
|
|
sFieldNum._AchieveEvent = pTable->GetFieldNum( "_AchieveEvent" );
|
|
sFieldNum._AchieveType.reserve(5);
|
|
sFieldNum._AchieveParam.reserve(5);
|
|
sFieldNum._AchieveOperator.reserve(5);
|
|
sFieldNum._MailID = pTable->GetFieldNum( "_MailID" );
|
|
|
|
for( int j=0; j<5; j++ )
|
|
{
|
|
sprintf_s( szTemp, "_Achieve%dType", j + 1 );
|
|
sFieldNum._AchieveType.push_back( pTable->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_Achieve%dParam", j + 1 );
|
|
sFieldNum._AchieveParam.push_back( pTable->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_Achieve%dOperator", j + 1 );
|
|
sFieldNum._AchieveOperator.push_back( pTable->GetFieldNum(szTemp) );
|
|
sprintf_s( szTemp, "_Achieve%dType", j + 1 );
|
|
}
|
|
|
|
sFieldNum._AchieveCheckType = pTable->GetFieldNum( "_AchieveCheckType" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pTable->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pTable->GetItemID(i);
|
|
|
|
int iIdx = pTable->GetIDXprimary( nItemID );
|
|
|
|
TActiveMissionData *pData = new TActiveMissionData;
|
|
memset( pData, 0, sizeof(TActiveMissionData) );
|
|
|
|
pData->nIndex = nItemID;
|
|
pData->bActivate = ( pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Activate )->GetInteger() == TRUE ) ? true : false;
|
|
pData->AchieveCondition.cEvent = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveEvent )->GetInteger();
|
|
|
|
if (pData->bActivate)
|
|
{
|
|
if (pData->AchieveCondition.cEvent >= EventSystem::EventTypeEnum_Amount)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"ActiveMissionTable.dnt Invalid AchieveEvent : [ItemID:%d]\n" ,nItemID);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
for( int j=0; j<5; j++ )
|
|
{
|
|
pData->AchieveCondition.cType[j] = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveType[j] )->GetInteger();
|
|
pData->AchieveCondition.nParam[j] = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveParam[j] )->GetInteger();
|
|
pData->AchieveCondition.cOperator[j] = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveOperator[j] )->GetInteger();
|
|
|
|
if (pData->bActivate)
|
|
{
|
|
if (pData->AchieveCondition.nParam[j] < 0)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"ActiveMissionTable.dnt, AchieveParm < 0 [ItemID:%d]\n", nItemID);
|
|
return false;
|
|
}
|
|
|
|
if (pData->AchieveCondition.cType[j] >= EventSystem::EventValueTypeEnum_Amount)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MissionTable.dnt, Invalid AchieveType\n");
|
|
|
|
//TODO(Cussrro):可能是资源不匹配吧
|
|
//return false;
|
|
}
|
|
|
|
if (CDNEventSystem::s_EventValueFuncList[pData->AchieveCondition.cType[j]].pFunc == NULL && pData->AchieveCondition.cType[j] > 0)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"MissionTable.dnt, Invalid s_EventValueFuncList[AchieveType], please check MissionAPI\n");
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
pData->AchieveCondition.bCheckType = ( pTable->GetFieldFromLablePtr( iIdx, sFieldNum._AchieveCheckType )->GetInteger() == TRUE ) ? true : false;
|
|
pData->nMailID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._MailID )->GetInteger();
|
|
|
|
m_pActiveMissionTable.push_back( pData );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TActiveMissionData* CDNGameDataManager::GetActiveMissionData(int nIndex)
|
|
{
|
|
if(nIndex < 0 || nIndex >= (int)m_pActiveMissionTable.size()) return NULL;
|
|
return m_pActiveMissionTable[nIndex];
|
|
}
|
|
|
|
|
|
bool CDNGameDataManager::LoadActiveSetData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TACTIVESET );
|
|
}
|
|
else
|
|
{
|
|
pTable = GetDNTable( CDnTableDB::TACTIVESET );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TACTIVESET );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"ActiveSetTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log( LogType::_FILELOG, L"ActiveSetTable.dnt Count(%d)\r\n", pTable->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
for(std::map<int, std::vector<int>>::iterator iter = m_ActiveSetTable.begin() ; iter != m_ActiveSetTable.end() ; iter++ )
|
|
SAFE_DELETE_VEC(iter->second);
|
|
SAFE_DELETE_MAP( m_ActiveSetTable );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pTable->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pTable->GetItemID(i);
|
|
|
|
char *szGroupStr;
|
|
std::string strValue;
|
|
|
|
int nMapID = pTable->GetFieldFromLablePtr( nItemID, "_MapID" )->GetInteger();
|
|
if(nMapID <= 0)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"ActiveSetTable.dnt Invalid MapID [%d : %d]\r\n", nItemID, nMapID);
|
|
return false;
|
|
}
|
|
|
|
szGroupStr = pTable->GetFieldFromLablePtr( nItemID, "_ActiveGroup1" )->GetString();
|
|
if( strlen( szGroupStr ) > 0 ) {
|
|
for( int n=0;; n++ ) {
|
|
strValue = _GetSubStrByCountSafe( n, szGroupStr, ';' );
|
|
if( !strValue.size() ) break;
|
|
int nResultID = atoi(strValue.c_str());
|
|
if( nResultID < 1 ) continue;
|
|
m_ActiveSetTable[nMapID].push_back( nResultID );
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TActiveMissionData* CDNGameDataManager::GetRandomActiveMission( int nMapIndex, int nRandomSeed )
|
|
{
|
|
if( m_ActiveSetTable.find(nMapIndex) == m_ActiveSetTable.end() ) return NULL;
|
|
|
|
//角力 index 困摹绰 ID - 1 蔼
|
|
int nIndex = m_ActiveSetTable[nMapIndex][nRandomSeed % m_ActiveSetTable[nMapIndex].size()] - 1;
|
|
return GetActiveMissionData(nIndex);
|
|
}
|
|
#endif
|
|
|
|
#if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
|
|
bool CDNGameDataManager::LoadBonusDropTable(void)
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TBONUSDROP );
|
|
}
|
|
else
|
|
{
|
|
pTable = GetDNTable( CDnTableDB::TBONUSDROP );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TBONUSDROP );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"BonusDropTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log(LogType::_FILELOG, L"BonusDropTable.dnt Count(%d)\r\n", pTable->GetItemCount());
|
|
//return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapBonusDropTable.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nItemID;
|
|
int nMapID;
|
|
int nDropType;
|
|
int nNeedItemID[3];
|
|
int nDropItemGroupID[3];
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nMapID = pTable->GetFieldNum("_MapID");
|
|
sFieldNum.nDropType = pTable->GetFieldNum("_DropType");
|
|
for(int i = 0; i < 3; i++)
|
|
{
|
|
sprintf_s( szTemp, "_NeedItemID%d", i + 1 );
|
|
sFieldNum.nNeedItemID[i] = pTable->GetFieldNum(szTemp);
|
|
sprintf_s( szTemp, "_DropGroupID%d", i + 1 );
|
|
sFieldNum.nDropItemGroupID[i] = pTable->GetFieldNum(szTemp);
|
|
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pTable->GetItemCount(); i++ )
|
|
{
|
|
TBonusDropTable Data;
|
|
memset( &Data, 0, sizeof(TBonusDropTable) );
|
|
|
|
Data.nIndex = pTable->GetItemID(i);
|
|
int iIdx = pTable->GetIDXprimary( Data.nIndex );
|
|
Data.nMapID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum.nMapID )->GetInteger();
|
|
Data.nDropType = pTable->GetFieldFromLablePtr( iIdx, sFieldNum.nDropType )->GetInteger();
|
|
for(int j = 0; j < 3; j++)
|
|
{
|
|
Data.nNeedItemID[j] = pTable->GetFieldFromLablePtr( iIdx, sFieldNum.nNeedItemID[j] )->GetInteger();
|
|
Data.nDropItemGroupID[j] = pTable->GetFieldFromLablePtr( iIdx, sFieldNum.nDropItemGroupID[j] )->GetInteger();
|
|
}
|
|
|
|
m_MapBonusDropTable.insert(std::make_pair(Data.nMapID, Data));
|
|
}
|
|
return true;
|
|
}
|
|
|
|
int CDNGameDataManager::GetBonusDropGroupID(int nMapID, int nNeedItemID)
|
|
{
|
|
if(m_MapBonusDropTable.empty())
|
|
return 0;
|
|
|
|
TMapBonusDropTable::iterator iter = m_MapBonusDropTable.find(nMapID);
|
|
if(iter == m_MapBonusDropTable.end())
|
|
return 0;
|
|
|
|
for(int i=0; i < 3;i++)
|
|
{
|
|
if(iter->second.nNeedItemID[i] == nNeedItemID )
|
|
return iter->second.nDropItemGroupID[i];
|
|
}
|
|
return 0;
|
|
}
|
|
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
|
|
|
|
#if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
bool CDNGameDataManager::LoadDropItemEnchant()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TDROPITEMENCHANT );
|
|
}
|
|
else
|
|
{
|
|
pTable = GetDNTable( CDnTableDB::TDROPITEMENCHANT );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TDROPITEMENCHANT );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"DropItemEnchant.dnt failed\r\n");
|
|
return true; //rlkt_test was false
|
|
}
|
|
|
|
if( pTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log(LogType::_FILELOG, L"DropItemEnchant.dnt Count(%d)\r\n", pTable->GetItemCount());
|
|
return true; //rlkt_test was false
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapItemDropEnchantTable.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
char szTemp[MAX_PATH];
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nDropID;
|
|
int nOption[20];
|
|
int nProb[20];
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum.nDropID = pTable->GetFieldNum("_DropID");
|
|
|
|
for(int i = 0; i < 20; i++)
|
|
{
|
|
sprintf_s( szTemp, "_ItemOptionID%d", i + 1 );
|
|
sFieldNum.nOption[i] = pTable->GetFieldNum(szTemp);
|
|
sprintf_s( szTemp, "_ItemOptionRatio%d", i + 1 );
|
|
sFieldNum.nProb[i] = pTable->GetFieldNum(szTemp);
|
|
|
|
}
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pTable->GetItemCount(); i++ )
|
|
{
|
|
TItemDropEnchantData Data;
|
|
memset( &Data, 0, sizeof(TItemDropEnchantData) );
|
|
|
|
Data.nIndex = pTable->GetItemID(i);
|
|
int iIdx = pTable->GetIDXprimary( Data.nIndex );
|
|
Data.nDropID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum.nDropID )->GetInteger();
|
|
for(int j = 0; j < 20; j++)
|
|
{
|
|
Data.nEnchantOption[j] = pTable->GetFieldFromLablePtr( iIdx, sFieldNum.nOption[j] )->GetInteger();
|
|
Data.nEnchantProb[j] = pTable->GetFieldFromLablePtr( iIdx, sFieldNum.nProb[j] )->GetInteger();
|
|
if(Data.nEnchantOption[j] <= 0)
|
|
{
|
|
Data.nEnchantCount = j + 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
m_MapItemDropEnchantTable.insert(std::make_pair(Data.nDropID, Data));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
TItemDropEnchantData* CDNGameDataManager::GetDropItemEnchant(int nDropTableID)
|
|
{
|
|
TMapItemDropEnchantTable::iterator iter = m_MapItemDropEnchantTable.find(nDropTableID);
|
|
if(iter == m_MapItemDropEnchantTable.end())
|
|
return NULL;
|
|
|
|
return &iter->second;
|
|
}
|
|
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
|
|
#if defined( PRE_ALTEIAWORLD_EXPLORE )
|
|
bool CDNGameDataManager::LoadAlteiaWorldMapInfo()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
DNTableFileFormat *pTimeTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TALTEIAWORLDMAP );
|
|
pTimeTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TALTEIATIME );
|
|
}
|
|
else
|
|
{
|
|
pTable = GetDNTable( CDnTableDB::TALTEIAWORLDMAP );
|
|
pTimeTable = GetDNTable( CDnTableDB::TALTEIATIME );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TALTEIAWORLDMAP );
|
|
DNTableFileFormat *pTimeTable = GetDNTable( CDnTableDB::TALTEIATIME );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"AlteiaBoardTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( !pTimeTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"alteiatimetable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log(LogType::_FILELOG, L"AlteiaBoardTable.dnt Count(%d)\r\n", pTable->GetItemCount());
|
|
//return false;
|
|
}
|
|
|
|
if( pTimeTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log(LogType::_FILELOG, L"alteiatimetable.dnt Count(%d)\r\n", pTimeTable->GetItemCount());
|
|
//return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapAlteiaWorldMapInfo.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int nMapID;
|
|
int nDifficulty;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
|
|
sFieldNum.nMapID = pTable->GetFieldNum("_MapID");
|
|
sFieldNum.nDifficulty = pTable->GetFieldNum("_Difficulty");
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pTable->GetItemCount(); i++ )
|
|
{
|
|
TAlteiaWorldMapInfo Data;
|
|
memset( &Data, 0, sizeof(TAlteiaWorldMapInfo) );
|
|
|
|
Data.nIndex = pTable->GetItemID(i);
|
|
int iIdx = pTable->GetIDXprimary( Data.nIndex );
|
|
Data.nMapID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum.nMapID )->GetInteger();
|
|
Data.Difficulty = (TDUNGEONDIFFICULTY)pTable->GetFieldFromLablePtr( iIdx, sFieldNum.nDifficulty )->GetInteger();
|
|
|
|
m_MapAlteiaWorldMapInfo.insert(std::make_pair(Data.nIndex, Data));
|
|
m_nAlteiaWorldMapMaxCount = Data.nIndex;
|
|
}
|
|
|
|
CTimeSet tCurTime;
|
|
tCurTime.Reset();
|
|
|
|
for( int i=0; i<pTimeTable->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pTimeTable->GetItemID(i);
|
|
|
|
char *szPeriod = pTimeTable->GetFieldFromLablePtr( nItemID, "_EventPeriod" )->GetString();
|
|
std::vector<string> vEventPeriod;
|
|
TokenizeA( szPeriod, vEventPeriod, ":" );
|
|
if( vEventPeriod.size() != 2 ) continue;
|
|
|
|
CTimeSet tBeginSet( vEventPeriod[0].c_str(), true );
|
|
CTimeSet tEndSet( vEventPeriod[1].c_str(), true );
|
|
|
|
if( tCurTime.GetTimeT64_LC() > tEndSet.GetTimeT64_LC() ) continue;
|
|
|
|
tm pLastTime;
|
|
time_t Time = tEndSet.GetTimeT64_LC();
|
|
pLastTime = *localtime(&Time);
|
|
|
|
if( pLastTime.tm_wday != 6 )
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"alteiatimetable.dnt EndDate Error\r\n");
|
|
return false;
|
|
}
|
|
|
|
m_tAlteiaWorldBeginTime = tBeginSet.GetTimeT64_LC();
|
|
m_tAlteiaWorldEndTime = tEndSet.GetTimeT64_LC();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TAlteiaWorldMapInfo* CDNGameDataManager::GetAlteiaWorldMapInfo(int nIndex)
|
|
{
|
|
TMapAlteiaWorldMapInfo::iterator iter = m_MapAlteiaWorldMapInfo.find(nIndex);
|
|
if(iter == m_MapAlteiaWorldMapInfo.end())
|
|
return NULL;
|
|
|
|
return &iter->second;
|
|
}
|
|
|
|
bool CDNGameDataManager::bIsAlteiaWorldEventTime()
|
|
{
|
|
CTimeSet CurTime;
|
|
if( m_tAlteiaWorldBeginTime < CurTime.GetTimeT64_LC() && m_tAlteiaWorldEndTime > CurTime.GetTimeT64_LC() )
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
#endif // #if defined( PRE_ALTEIAWORLD_EXPLORE )
|
|
|
|
#if defined( PRE_ADD_STAMPSYSTEM )
|
|
bool CDNGameDataManager::LoadStampTable()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TSTAMPCHALLENGE );
|
|
}
|
|
else
|
|
{
|
|
pTable = GetDNTable( CDnTableDB::TSTAMPCHALLENGE );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TSTAMPCHALLENGE );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"StampTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log(LogType::_FILELOG, L"StampTable.dnt Count(%d)\r\n", pTable->GetItemCount());
|
|
//return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapStampTableData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _StampStartDay;
|
|
int _Type;
|
|
int _AssignmentID;
|
|
int _MailID4;
|
|
int _MailID7;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
|
|
sFieldNum._StampStartDay = pTable->GetFieldNum( "_StampStartDay" );
|
|
sFieldNum._Type = pTable->GetFieldNum( "_StampType" );
|
|
sFieldNum._AssignmentID = pTable->GetFieldNum( "_AssignmentID" );
|
|
sFieldNum._MailID4 = pTable->GetFieldNum( "_MailID4" );
|
|
sFieldNum._MailID7 = pTable->GetFieldNum( "_MailID7" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i = 0; i < pTable->GetItemCount(); ++ i )
|
|
{
|
|
StampSystem::TStampChallenge ChallengeData;
|
|
int nIndex = pTable->GetItemID(i);
|
|
int iIdx = pTable->GetIDXprimary( nIndex );
|
|
|
|
std::string szStartTime = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._StampStartDay )->GetString();
|
|
INT64 biStartTime = _atoi64( szStartTime.c_str() );
|
|
|
|
ChallengeData.cType = (char)pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Type )->GetInteger();
|
|
ChallengeData.nMailID4 = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._MailID4 )->GetInteger();
|
|
ChallengeData.nMailID7 = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._MailID7 )->GetInteger();
|
|
|
|
std::vector<std::string> challengeTokens;
|
|
|
|
std::string szAssignmentIDString = pTable->GetFieldFromLablePtr(iIdx, sFieldNum._AssignmentID)->GetString();
|
|
TokenizeA( szAssignmentIDString, challengeTokens, ":" );
|
|
|
|
std::vector<std::string>::iterator iter = challengeTokens.begin();
|
|
for(; iter != challengeTokens.end(); ++iter)
|
|
{
|
|
std::string& token = * iter;
|
|
int id = atoi( token.c_str() );
|
|
ChallengeData.setAssignmentID.insert( id );
|
|
}
|
|
|
|
StampSystem::TStampTableData & rTableData = m_MapStampTableData[biStartTime];
|
|
rTableData.biStartTime = biStartTime;
|
|
|
|
if( StampSystem::Common::MaxChallengeCount > rTableData.vChallengeList.size() )
|
|
{
|
|
rTableData.vChallengeList.push_back(ChallengeData);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
const StampSystem::TStampTableData * CDNGameDataManager::GetStampTableData( INT64 biTime ) const
|
|
{
|
|
const StampSystem::TStampTableData * pStampTableData = NULL;
|
|
|
|
for( TMapStampTableData::const_iterator iter = m_MapStampTableData.begin() ; iter != m_MapStampTableData.end() ; ++ iter )
|
|
{
|
|
if( biTime < iter->first )
|
|
{
|
|
break;
|
|
}
|
|
pStampTableData = & iter->second;
|
|
}
|
|
return pStampTableData;
|
|
}
|
|
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
|
|
|
|
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
|
|
bool CDNGameDataManager::LoadTalismanData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TTALISMANITEM );
|
|
}
|
|
else
|
|
{
|
|
pTable = GetDNTable( CDnTableDB::TTALISMANITEM );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TTALISMANSLOT );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"TalismanTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log( LogType::_FILELOG, L"TalismanTable.dnt Count(%d)\r\n", pTable->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PVEC( m_pTalismanSlotTable );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _Type;
|
|
int _Period;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
|
|
sFieldNum._Type = pTable->GetFieldNum( "_Type" );
|
|
sFieldNum._Period = pTable->GetFieldNum( "_Period" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pTable->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pTable->GetItemID(i);
|
|
int iIdx = pTable->GetIDXprimary( nItemID );
|
|
|
|
TTalismanData Data;
|
|
memset( &Data, 0, sizeof(TTalismanData) );
|
|
|
|
Data.nTalismanID = nItemID;
|
|
Data.nType = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Type )->GetInteger();
|
|
Data.nPeriod = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Period )->GetInteger();
|
|
|
|
m_MapTalismanTable.insert(make_pair(Data.nTalismanID, Data));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TTalismanData *CDNGameDataManager::GetTalismanData(int nTalismanID)
|
|
{
|
|
if(m_MapTalismanTable.empty()) return NULL;
|
|
|
|
TMapTalismanData::iterator iter = m_MapTalismanTable.find(nTalismanID);
|
|
if(iter == m_MapTalismanTable.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
|
|
bool CDNGameDataManager::LoadTalismanSlotData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TTALISMANSLOT );
|
|
}
|
|
else
|
|
{
|
|
pTable = GetDNTable( CDnTableDB::TTALISMANSLOT );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TTALISMANSLOT );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"TalismanSlotTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
if( pTable->GetItemCount() <= 0 ) {
|
|
g_Log.Log( LogType::_FILELOG, L"TalismanSlotTable.dnt Count(%d)\r\n", pTable->GetItemCount());
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
SAFE_DELETE_PVEC( m_pTalismanSlotTable );
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _Service;
|
|
int _Level;
|
|
int _Amount;
|
|
int _Item;
|
|
int _ItemCount;
|
|
int _Efficiency;
|
|
int _Type;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
|
|
sFieldNum._Service = pTable->GetFieldNum( "_Service" );
|
|
sFieldNum._Level = pTable->GetFieldNum( "_Level" );
|
|
sFieldNum._Amount = pTable->GetFieldNum( "_Amount" );
|
|
sFieldNum._Item = pTable->GetFieldNum( "_Item" );
|
|
sFieldNum._ItemCount = pTable->GetFieldNum( "_ItemCount" );
|
|
sFieldNum._Efficiency = pTable->GetFieldNum( "_Efficiency" );
|
|
sFieldNum._Type = pTable->GetFieldNum( "_Type" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for( int i=0; i<pTable->GetItemCount(); i++ )
|
|
{
|
|
int nItemID = pTable->GetItemID(i);
|
|
int iIdx = pTable->GetIDXprimary( nItemID );
|
|
|
|
TTalismanSlotData *pData = new TTalismanSlotData;
|
|
memset( pData, 0, sizeof(TTalismanSlotData) );
|
|
|
|
//pData->nIndex = nItemID;
|
|
pData->bService = ( pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Service )->GetInteger() == TRUE ) ? true : false;
|
|
pData->nLevel = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Level )->GetInteger();
|
|
pData->nAmount = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Amount )->GetInteger();
|
|
pData->nItem = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Item )->GetInteger();
|
|
pData->nNeedItemCount = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._ItemCount )->GetInteger();
|
|
pData->fEfficiency = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Efficiency )->GetFloat();
|
|
pData->nType = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._Type )->GetInteger();
|
|
|
|
m_pTalismanSlotTable.push_back( pData );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TTalismanSlotData* CDNGameDataManager::GetTalismanSlotData(int nIndex)
|
|
{
|
|
if(nIndex < 0 || nIndex >= (int)m_pTalismanSlotTable.size()) return NULL;
|
|
return m_pTalismanSlotTable[nIndex];
|
|
}
|
|
|
|
float CDNGameDataManager::GetTalismanSlotEfficiency(int nIndex)
|
|
{
|
|
if(nIndex < 0 || nIndex >= (int)m_pTalismanSlotTable.size()) return 0.0f;
|
|
return m_pTalismanSlotTable[nIndex]->fEfficiency;
|
|
}
|
|
|
|
bool CDNGameDataManager::IsTalismanSlotLevel(int nTalismanIndex, int nCharLevel)
|
|
{
|
|
if ((nTalismanIndex < 0) ||(nTalismanIndex > TALISMAN_MAX)) return false;
|
|
if ((nCharLevel <= 0) ||(nCharLevel > CHARLEVELMAX)) return false;
|
|
|
|
TTalismanSlotData *pTalismanSlotData = GetTalismanSlotData(nTalismanIndex);
|
|
if(!pTalismanSlotData) return false;
|
|
|
|
return nCharLevel >= pTalismanSlotData->nLevel;
|
|
}
|
|
#endif //#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
|
|
#if defined( PRE_DRAGONBUFF )
|
|
void CDNGameDataManager::AddWorldBuffData( int nItemID )
|
|
{
|
|
// 扁霖 矫埃 唱坷搁 咯扁辑 歹秦辑 持绢淋
|
|
TMapWorldBuffData::iterator itor = m_MapWorldBuffData.find(nItemID);
|
|
CTimeSet CurTime;
|
|
int nSecond = static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::DragonBuffWaitTime ));
|
|
CurTime.AddSecond(nSecond);
|
|
if( itor == m_MapWorldBuffData.end() )
|
|
{
|
|
m_MapWorldBuffData.insert(make_pair(nItemID, CurTime.GetTimeT64_LC()));
|
|
}
|
|
else
|
|
{
|
|
itor->second = CurTime.GetTimeT64_LC();
|
|
}
|
|
}
|
|
|
|
bool CDNGameDataManager::bIsWorldBuffData( int nItemID )
|
|
{
|
|
CTimeSet CurTime;
|
|
TMapWorldBuffData::iterator itor = m_MapWorldBuffData.find(nItemID);
|
|
if( itor == m_MapWorldBuffData.end() )
|
|
return true;
|
|
|
|
if(itor->second <= CurTime.GetTimeT64_LC())
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
#endif
|
|
|
|
#if defined( PRE_PVP_GAMBLEROOM )
|
|
bool CDNGameDataManager::LoadPVPGambleRoomData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat* pSox;
|
|
if (m_bAllLoaded)
|
|
pSox = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TPVPGAMBLEROOM );
|
|
else
|
|
pSox = GetDNTable( CDnTableDB::TPVPGAMBLEROOM );
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPVPGAMBLEROOM );
|
|
#endif //#ifdef _WORK
|
|
if( !pSox )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPGambleModeRoomTable.dnt failed\r\n" );
|
|
return false;
|
|
}
|
|
|
|
if( pSox->GetItemCount() <= 0 )
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"PvPGambleModeRoomTable.dnt Count(%d)\r\n", pSox->GetItemCount() );
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapPvPGambleRoom.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _PvPMissionRoomGroup;
|
|
int _PvPMapTableID;
|
|
int _PvPGameModeTableID;
|
|
int _WinCondition;
|
|
int _PlayTime;
|
|
int _MaxPlayers;
|
|
int _StartPlayers;
|
|
int _TitleUIString;
|
|
int _DropItem;
|
|
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
int _ChannelType;
|
|
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
sFieldNum._PvPMissionRoomGroup = pSox->GetFieldNum("_PvPMissionRoomGroup");
|
|
sFieldNum._PvPMapTableID = pSox->GetFieldNum("_PvPMapTableID");
|
|
sFieldNum._PvPGameModeTableID = pSox->GetFieldNum("_PvPGameModeTableID");
|
|
sFieldNum._WinCondition = pSox->GetFieldNum("_WinCondition");
|
|
sFieldNum._PlayTime = pSox->GetFieldNum("_PlayTime");
|
|
sFieldNum._MaxPlayers = pSox->GetFieldNum("_MaxUser");
|
|
sFieldNum._StartPlayers = pSox->GetFieldNum("_StartUser");
|
|
sFieldNum._TitleUIString = pSox->GetFieldNum("_TitleUIString");
|
|
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
sFieldNum._ChannelType = pSox->GetFieldNum("_PVPChannel");
|
|
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
for (int i = 0; i < pSox->GetItemCount(); ++i)
|
|
{
|
|
int nItemID = pSox->GetItemID(i);
|
|
int nIdx = pSox->GetIDXprimary(nItemID);
|
|
|
|
|
|
TPvPMissionRoom Data;
|
|
Data.nItemID = nItemID;
|
|
Data.nGroupID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PvPMissionRoomGroup)->GetInteger();
|
|
Data.nMapID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PvPMapTableID)->GetInteger();
|
|
Data.nModeID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PvPGameModeTableID)->GetInteger();
|
|
Data.nWinCondition = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._WinCondition)->GetInteger();
|
|
Data.nPlayTime = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PlayTime)->GetInteger();
|
|
Data.nMaxPlayers = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._MaxPlayers)->GetInteger();
|
|
Data.nStartPlayers = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._StartPlayers)->GetInteger();
|
|
Data.nRoomNameIndex = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._TitleUIString)->GetInteger();
|
|
|
|
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
Data.nChannelType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ChannelType)->GetInteger();
|
|
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
|
|
m_MapPvPGambleRoom.insert(make_pair(nItemID, Data));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TPvPMissionRoom* CDNGameDataManager::GetPvPGambleRoom(int nItemID)
|
|
{
|
|
if(nItemID <= 0) return NULL;
|
|
|
|
TMapPvPMissionRoom::iterator iter = m_MapPvPGambleRoom.find(nItemID);
|
|
if(iter == m_MapPvPGambleRoom.end()) return NULL;
|
|
|
|
return &(iter->second);
|
|
}
|
|
#endif
|
|
|
|
#if defined( PRE_ADD_STAGE_WEIGHT )
|
|
bool CDNGameDataManager::LoadStageWeightData()
|
|
{
|
|
#ifdef _WORK
|
|
DNTableFileFormat *pTable;
|
|
if (m_bAllLoaded)
|
|
{
|
|
pTable = CDnTableDB::GetInstance().ReLoadSox( CDnTableDB::TSTAGEWEIGHT );
|
|
}
|
|
else
|
|
{
|
|
pTable = GetDNTable( CDnTableDB::TSTAGEWEIGHT );
|
|
}
|
|
#else //#ifdef _WORK
|
|
DNTableFileFormat *pTable = GetDNTable( CDnTableDB::TSTAGEWEIGHT );
|
|
#endif //#ifdef _WORK
|
|
if( !pTable ) {
|
|
g_Log.Log(LogType::_FILELOG, L"StageWeightTable.dnt failed\r\n");
|
|
return false;
|
|
}
|
|
|
|
#ifdef _WORK
|
|
if (m_bAllLoaded)
|
|
{
|
|
m_MapStageWeightData.clear();
|
|
}
|
|
#endif //#ifdef _WORK
|
|
|
|
//##################################################################
|
|
// FieldNum 固府 祸牢
|
|
//##################################################################
|
|
|
|
struct TempFieldNum
|
|
{
|
|
int _StageWeightID;
|
|
int _HeadCount;
|
|
int _HP;
|
|
int _ATK;
|
|
int _SuperArmor;
|
|
int _ItemDrop;
|
|
};
|
|
|
|
TempFieldNum sFieldNum;
|
|
|
|
sFieldNum._StageWeightID = pTable->GetFieldNum( "_StageWeightID" );
|
|
sFieldNum._HeadCount = pTable->GetFieldNum( "_HeadCount" );
|
|
sFieldNum._HP = pTable->GetFieldNum( "_HP" );
|
|
sFieldNum._ATK = pTable->GetFieldNum( "_ATK" );
|
|
sFieldNum._SuperArmor = pTable->GetFieldNum( "_SuperArmor" );
|
|
sFieldNum._ItemDrop = pTable->GetFieldNum( "_ItemDrop" );
|
|
|
|
//##################################################################
|
|
// Load
|
|
//##################################################################
|
|
|
|
typedef std::map<DWORD, TStageWeightData>
|
|
TMapHeadCountWeight;
|
|
|
|
for( int i = 0; i < pTable->GetItemCount(); ++ i )
|
|
{
|
|
int nIndex = pTable->GetItemID(i);
|
|
int iIdx = pTable->GetIDXprimary( nIndex );
|
|
|
|
int nStageWeightID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._StageWeightID )->GetInteger();
|
|
DWORD dwHeadCount = static_cast<BYTE>( pTable->GetFieldFromLablePtr( iIdx, sFieldNum._HeadCount )->GetInteger() );
|
|
|
|
TMapHeadCountWeight & rMapHeadCountWeight = m_MapStageWeightData[nStageWeightID];
|
|
TMapHeadCountWeight::iterator iter = rMapHeadCountWeight.find(dwHeadCount);
|
|
if(rMapHeadCountWeight.end() != iter)
|
|
{
|
|
g_Log.Log( LogType::_FILELOG, L"StageWeightTable.dnt failed - exist(_StageWeightID:%d, _HeadCount:%d)\r\n", nStageWeightID, dwHeadCount );
|
|
return false;
|
|
}
|
|
|
|
TStageWeightData & rStageWeightData = rMapHeadCountWeight[dwHeadCount];
|
|
rStageWeightData.fHPRate = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._HP )->GetFloat();
|
|
rStageWeightData.fAttackRate = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._ATK )->GetFloat();
|
|
rStageWeightData.fSuperArmorRate = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._SuperArmor )->GetFloat();
|
|
rStageWeightData.fItemDropRate = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._ItemDrop )->GetFloat();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
const TStageWeightData* CDNGameDataManager::GetStageWeigthData( int nStageWeightID, DWORD dwUserCount )
|
|
{
|
|
TMapStageWeightData::iterator iter = m_MapStageWeightData.find( nStageWeightID );
|
|
if(m_MapStageWeightData.end() == iter)
|
|
return NULL;
|
|
|
|
std::map<DWORD, TStageWeightData>::iterator sub_iter = iter->second.find(dwUserCount);
|
|
if( iter->second.end() == sub_iter )
|
|
return NULL;
|
|
|
|
return & sub_iter->second;
|
|
}
|
|
#endif // #if defined( PRE_ADD_STAGE_WEIGHT )
|