int KMovableObject::CalcProcessTrackMoveZmax(int nRandomSeed, const KPOSITION& StartPos, const KPOSITION& FinalPos) const { int nDistanceXY = 0; int nDistanceZ = 0; int nOffsetX = 0; int nOffsetY = 0; int nTempRandomNum = 0; int nSaveRandomSeed = 0; int nZmax = 0; nOffsetX = abs(StartPos.nX - FinalPos.nX); nOffsetY = abs(StartPos.nY - FinalPos.nY); nDistanceXY = (int)sqrt((double)(nOffsetX * nOffsetX + nOffsetY * nOffsetY)); nDistanceZ = abs(StartPos.nZ - FinalPos.nZ); nSaveRandomSeed = g_GetRandomSeed(); g_RandomSeed(nRandomSeed); //KGLogPrintf(KGLOG_INFO, "seed = %d DistanceXY = %d DistanceZ = %d OffsetX = %d OffsetY = %d\n", nRandomSeed, nDistanceXY, nDistanceZ, nOffsetX, nOffsetY); nTempRandomNum = g_Random(160) + 160; g_RandomSeed(nSaveRandomSeed); nZmax = nDistanceXY / 640 + nDistanceZ / 320 + nTempRandomNum; MakeInRange<int>(nZmax, 240, 600); nZmax += MAX(StartPos.nZ, FinalPos.nZ); //KGLogPrintf(KGLOG_INFO, "nZmax = %d, temprandom:%d\n", nZmax, nTempRandomNum); Exit0: return nZmax; }
/****************************************************************************** 功能: 生成药品 入口: nDetailType: 药品类型 nLevel: 等级 nVersion: 版本号 出口: 成功时返回非零, 相关数据在 pItem 所指对象中给出 失败时返回零 ******************************************************************************/ BOOL KItemGenerator::Gen_Medicine(IN int nDetailType, IN int nLevel, IN int nVersion, IN OUT KItem* pItem) { _ASSERT(this != NULL); _ASSERT(pItem != NULL); BOOL bEC = FALSE; #ifdef _SERVER // 服务器版本 pItem->m_GeneratorParam.uRandomSeed = g_GetRandomSeed(); pItem->m_GeneratorParam.nVersion = g_SubWorldSet.GetGameVersion(); pItem->m_GeneratorParam.nLuck = 0; #else g_RandomSeed(pItem->m_GeneratorParam.uRandomSeed); int nGameVersion = pItem->m_GeneratorParam.nVersion; #endif const int i = nDetailType * 5 + nLevel - 1; // 本公式由策划定义 // 等级数据从1开始,所以要减回来 const KBASICPROP_MEDICINE* pMed = NULL; pMed = m_BPTLib.GetMedicineRecord(i); if (NULL == pMed) { _ASSERT(FALSE); return bEC; } *pItem = *pMed; return TRUE; }
BOOL KItemLib::GenerateCustomItem(KItem* pItem, KCustomEquipInfo* pInfo, DWORD dwRandSeed) { BOOL bResult = FALSE; BOOL bRetCode = FALSE; KGLOG_PROCESS_ERROR(pItem); KGLOG_PROCESS_ERROR(pInfo); pItem->m_GenParam.nQuality = pInfo->nQuality; for (int i = 0; i < MAX_ITEM_MAGIC_COUNT; i++) { pItem->m_GenParam.nMagicIndex[i] = pInfo->nAttribIndex[i]; } if (dwRandSeed == 0) { dwRandSeed = g_GetRandomSeed(); } else { g_RandomSeed(dwRandSeed); } pItem->m_GenParam.dwRandSeed = dwRandSeed; bRetCode = ExpandCustomItemAttrib(pItem, pInfo); KGLOG_PROCESS_ERROR(bRetCode); bResult = TRUE; Exit0: return bResult; }
BOOL KItemLib::GenerateRandItem(KItem* pItem, KEquipInfo* pInfo, int nMagicNum, int nQuality, DWORD dwRandSeed, int nMagic[]) { BOOL bResult = FALSE; BOOL bRetCode = FALSE; KGLOG_PROCESS_ERROR(pItem); KGLOG_PROCESS_ERROR(pInfo); KGLOG_PROCESS_ERROR(nMagicNum >= 0); KGLOG_PROCESS_ERROR(nMagicNum <= MAX_ITEM_MAGIC_COUNT); pItem->m_GenParam.nQuality = nQuality; // 生成魔法属性 if (!nMagic) { bRetCode = GenerateMagicAttrib(pItem, pInfo->nAttribGroup, nMagicNum); KGLOG_PROCESS_ERROR(bRetCode); } else { for (int i = 0; i < nMagicNum; i++) { pItem->m_GenParam.nMagicIndex[i] = nMagic[i]; } } // 生成随机种子 if (dwRandSeed == 0) // 生成时随机 { dwRandSeed = g_GetRandomSeed(); } else { g_RandomSeed(dwRandSeed); } pItem->m_GenParam.dwRandSeed = dwRandSeed; bRetCode = ExpandItemAttrib(pItem, pInfo); KGLOG_PROCESS_ERROR(bRetCode); bResult = TRUE; Exit0: return bResult; }
DWORD KQuestInfoList::GetRandomQuest(int nHeroLevel, int nRandomQuestIndex) { DWORD dwResult = 0; KMAP_LEVEL2QUESTGROUP::iterator it; KQUEST_GROUP* pQuestGroup = NULL; int nLevel = (nHeroLevel - 1) / RANDOM_QUEST_LEVEL + 1; unsigned int nOldSeed = g_GetRandomSeed(); unsigned int nRandSeed = nRandomQuestIndex + g_pSO3World->m_nBaseTime; unsigned int nRandomQuest = 0; it = m_RandomQuestGroup.find(nLevel); KG_PROCESS_ERROR(it != m_RandomQuestGroup.end()); pQuestGroup = &it->second; KGLOG_PROCESS_ERROR(pQuestGroup->size() > 0); g_RandomSeed(nRandSeed); nRandomQuest = g_Random(pQuestGroup->size()); g_RandomSeed(nOldSeed); dwResult = pQuestGroup->at(nRandomQuest); Exit0: return dwResult; }
/****************************************************************************** 功能: 生成随机装备 入口: nDetailType: 具体类别, 如近程武器、暗器、...... nParticularType: 详细类别 nSeriesReq: 五行属性 nLevel: 等级 pnaryMALevel: 魔法属性等级数组[6] nLucky: 运气值 出口: 成功时返回非零, 相关数据在 pItem 所指对象中给出 失败时返回零 ******************************************************************************/ BOOL KItemGenerator::Gen_ExistEquipment(IN int nDetailType, IN int nParticularType, IN int nSeriesReq, IN int nLevel, IN const int* pnaryMALevel, IN int nLucky, IN int nVersion, IN OUT KItem* pItem) { _ASSERT(this != NULL); _ASSERT(pItem != NULL); BOOL bEC = FALSE; g_RandomSeed(pItem->m_GeneratorParam.uRandomSeed); if (pnaryMALevel) memcpy(pItem->m_GeneratorParam.nGeneratorLevel, pnaryMALevel, sizeof(int) * 6); int nGameVersion = pItem->m_GeneratorParam.nVersion; // 根据入口参数, 确定装备的基本数据 const int i = nParticularType * 10 + nLevel - 1;// 本公式由策划定义 // 详见SPE 2002年8月31日7:40 // email: 基础道具数值表 // 等级数据从1开始,所以要减回来 const KBASICPROP_EQUIPMENT* pEqu = NULL; switch(nDetailType) { case equip_meleeweapon: pEqu = m_BPTLib.GetMeleeWeaponRecord(i); break; case equip_rangeweapon: pEqu = m_BPTLib.GetRangeWeaponRecord(i); break; case equip_armor: pEqu = m_BPTLib.GetArmorRecord(i); break; case equip_helm: pEqu = m_BPTLib.GetHelmRecord(i); break; case equip_boots: pEqu = m_BPTLib.GetBootRecord(i); break; case equip_belt: pEqu = m_BPTLib.GetBeltRecord(i); break; case equip_amulet: pEqu = m_BPTLib.GetAmuletRecord(i); break; case equip_ring: pEqu = m_BPTLib.GetRingRecord(i); break; case equip_cuff: pEqu = m_BPTLib.GetCuffRecord(i); break; case equip_pendant: pEqu = m_BPTLib.GetPendantRecord(i); break; case equip_horse: pEqu = m_BPTLib.GetHorseRecord(i); break; default: break; } if (NULL == pEqu) { _ASSERT(FALSE); return bEC; } // 运行至此的直接原因: 只有n种装备, 而上面 i 的值在[0,n-1]之外 // 检查3点: nParticularType 有误? // nLevel 有误? // 原始的tab file有误导致 m_BPTLib.m_BPTEquipment 所 // 管理的数据有问题? pItem->SetAttrib_CBR(pEqu); pItem->SetSeries(nSeriesReq); if (NULL == pnaryMALevel) return TRUE; // 确定装备的魔法属性 KItemNormalAttrib sMA[6]; // 道具的魔法属性 bEC = Gen_MagicAttrib(nDetailType, pnaryMALevel, nSeriesReq, nLucky, sMA, nGameVersion); if (bEC) pItem->SetAttrib_MA(sMA); return bEC; }
BOOL KSO3World::Init(IRecorderFactory* piFactory) { BOOL bResult = false; BOOL bRetCode = false; int nRetCode = 0; BOOL bTeamInitFlag = false; BOOL bRelationMgrInitFlag = false; BOOL bSettingsInitFlag = false; BOOL bScriptCenterInitFlag = false; BOOL bItemManagerInitFlag = false; BOOL bShopCenterInitFlag = false; BOOL bProfessionManagerInitFlag = false; BOOL bRoadManageInitFlag = false; BOOL bAIManageInitFlag = false; BOOL bDropCenterInitFlag = false; BOOL bSkillManagerInitFlag = false; BOOL bBuffManagerInitFlag = false; BOOL bTextFilterInitFlag = false; BOOL bCampInfoInitFlag = false; BOOL bPQInitFlag = false; BOOL bTransListInitFlag = false; BOOL bStatDataServerInitFlag = false; DWORD dwRandSeed = 0; IIniFile* piIniFile = NULL; #ifdef _CLIENT BOOL bTongClientInitFlag = false; BOOL bApexClientInitFlag = false; #endif m_eWorldMode = wmNormal; m_nBaseTime = 0; m_dwStartTime = 0; m_nStartLoop = 0; m_nGameLoop = 0; #ifdef _SERVER m_bFastBootMode = 0; m_bTalkRecNearby = 0; m_bTalkRecTeam = 0; m_bTalkRecRaid = 0; m_bTalkRecBattleField = 0; m_bTalkRecScene = 0; m_bTalkRecWhisper = 0; m_bTalkRecTong = 0; m_bTalkRecWorld = 0; m_bTalkRecForce = 0; m_bTalkRecCamp = 0; #endif assert(piFactory); m_piRecorderTools = piFactory->CreateToolsInterface(); KGLOG_PROCESS_ERROR(m_piRecorderTools); m_nCurrentTime = m_piRecorderTools->GetTime(); m_dwStartTime = m_piRecorderTools->GetTickCount(); #ifdef _SERVER m_piSceneLoader = piFactory->CreateSceneLoader(); KGLOG_PROCESS_ERROR(m_piSceneLoader); piIniFile = g_OpenIniFile(GS_SETTINGS_FILENAME); KGLOG_PROCESS_ERROR(piIniFile); bRetCode = piIniFile->GetInteger("Global", "FastBootMode", 0, &m_bFastBootMode); KGLOG_PROCESS_ERROR(bRetCode); bRetCode = piIniFile->GetInteger("TalkRec", "Nearby", 0, &m_bTalkRecNearby); //KGLOG_PROCESS_ERROR(bRetCode); bRetCode = piIniFile->GetInteger("TalkRec", "Team", 0, &m_bTalkRecTeam); //KGLOG_PROCESS_ERROR(bRetCode); bRetCode = piIniFile->GetInteger("TalkRec", "Party", 0, &m_bTalkRecRaid); //KGLOG_PROCESS_ERROR(bRetCode); bRetCode = piIniFile->GetInteger("TalkRec", "BattleField", 0, &m_bTalkRecBattleField); //KGLOG_PROCESS_ERROR(bRetCode); bRetCode = piIniFile->GetInteger("TalkRec", "Scene", 0, &m_bTalkRecScene); //KGLOG_PROCESS_ERROR(bRetCode); bRetCode = piIniFile->GetInteger("TalkRec", "Whisper", 0, &m_bTalkRecWhisper); //KGLOG_PROCESS_ERROR(bRetCode); bRetCode = piIniFile->GetInteger("TalkRec", "Tong", 0, &m_bTalkRecTong); //KGLOG_PROCESS_ERROR(bRetCode); bRetCode = piIniFile->GetInteger("TalkRec", "World", 0, &m_bTalkRecWorld); //KGLOG_PROCESS_ERROR(bRetCode); bRetCode = piIniFile->GetInteger("TalkRec", "Force", 0, &m_bTalkRecForce); //KGLOG_PROCESS_ERROR(bRetCode); bRetCode = piIniFile->GetInteger("TalkRec", "Camp", 0, &m_bTalkRecCamp); //KGLOG_PROCESS_ERROR(bRetCode); #endif g_RandomSeed(m_dwStartTime); srand(m_dwStartTime); #ifdef _SERVER //bRetCode = m_TeamCache.Init(); bRetCode = m_TeamServer.Init(); #endif #ifdef _CLIENT bRetCode = m_TeamClient.Init(); #endif KGLOG_PROCESS_ERROR(bRetCode); bTeamInitFlag = true; bRetCode = m_FellowshipMgr.Init(); KGLOG_PROCESS_ERROR(bRetCode); bRelationMgrInitFlag = true; bRetCode = m_Settings.Init(); KGLOG_PROCESS_ERROR(bRetCode); bSettingsInitFlag = true; bRetCode = m_ScriptCenter.Init(); KGLOG_PROCESS_ERROR(bRetCode); bScriptCenterInitFlag = true; bRetCode = InitAttributeFunctions(); KGLOG_PROCESS_ERROR(bRetCode); bRetCode = m_ItemManager.Init(); KGLOG_PROCESS_ERROR(bRetCode); bItemManagerInitFlag = true; bRetCode = m_ShopCenter.Init(); KGLOG_PROCESS_ERROR(bRetCode); bShopCenterInitFlag = true; bRetCode = m_ProfessionManager.Init(); KGLOG_PROCESS_ERROR(bRetCode); bProfessionManagerInitFlag = true; bRetCode = m_RoadManager.Init(); KGLOG_PROCESS_ERROR(bRetCode); bRoadManageInitFlag = true; bRetCode = m_AIManager.Init(); KGLOG_PROCESS_ERROR(bRetCode); bAIManageInitFlag = true; bRetCode = m_BuffManager.Init(); KGLOG_CHECK_ERROR(bRetCode); bBuffManagerInitFlag = true; bRetCode = m_SkillManager.Init(); KGLOG_PROCESS_ERROR(bRetCode); bSkillManagerInitFlag = true; #ifdef _SERVER bRetCode = m_DropCenter.Init(); KGLOG_PROCESS_ERROR(bRetCode); bDropCenterInitFlag = true; #endif bRetCode = m_CampInfo.Init(); KGLOG_PROCESS_ERROR(bRetCode); bCampInfoInitFlag = true; bRetCode = m_PQManager.Init(); KGLOG_PROCESS_ERROR(bRetCode); bPQInitFlag = true; #ifdef _CLIENT bRetCode = m_TongClient.Init(); KGLOG_PROCESS_ERROR(bRetCode); bTongClientInitFlag = true; bRetCode = m_ApexClient.Init(); KGLOG_PROCESS_ERROR(bRetCode); bApexClientInitFlag = true; #endif #ifdef _SERVER bRetCode = m_TransmissionList.Init(); KGLOG_PROCESS_ERROR(bRetCode); bTransListInitFlag = true; bRetCode = m_StatDataServer.Init(); KGLOG_PROCESS_ERROR(bRetCode); bStatDataServerInitFlag = true; #endif m_NpcSet.SetPrefix(NPC_ID_PREFIX); #ifdef _CLIENT m_ItemSet.SetPrefix(CLIENT_ITEM_ID_PREFIX); m_LinkItemQue.clear(); m_piTextFilter = CreateTextFilterInterface(); KGLOG_PROCESS_ERROR(m_piTextFilter); bRetCode = m_piTextFilter->LoadFilterFile(SETTING_DIR"/TextFilter.txt"); KGLOG_PROCESS_ERROR(bRetCode); g_pSO3World->m_dwBattleFieldPQID = 0; g_pSO3World->m_dwBattleFieldPQTemplateID = 0; g_pSO3World->m_nBattleFieldPQBeginTime = 0; g_pSO3World->m_nBattleFieldPQEndTime = 0; memset(g_pSO3World->m_nBattleFieldObjectiveCurrent, 0, sizeof(g_pSO3World->m_nBattleFieldObjectiveCurrent)); memset(g_pSO3World->m_nBattleFieldObjectiveTarget, 0, sizeof(g_pSO3World->m_nBattleFieldObjectiveTarget)); #endif #ifdef _SERVER m_bRunFlag = true; m_nIdleFrame = 0; #endif #ifdef _SERVER m_CenterRemote.Setup(); m_ScriptServer.Setup(); #else m_ScriptClient.Setup(); #endif #ifdef _CLIENT m_bForwardCharacterPosition = false; #endif nRetCode = lzo_init(); KGLOG_PROCESS_ERROR(nRetCode == LZO_E_OK); bResult = true; Exit0: if (!bResult) { #ifdef _SERVER if (m_pPlayerTalkLogFile) { fclose(m_pPlayerTalkLogFile); m_pPlayerTalkLogFile = NULL; m_nPlayerTalkLogFileDay = 0; } #endif #ifdef _CLIENT KG_COM_RELEASE(m_piTextFilter); #endif #ifdef _CLIENT if (bApexClientInitFlag) { m_ApexClient.UnInit(); bApexClientInitFlag = false; } if (bTongClientInitFlag) { m_TongClient.UnInit(); bTongClientInitFlag = false; } #endif if (bPQInitFlag) { m_PQManager.UnInit(); bPQInitFlag = false; } if (bCampInfoInitFlag) { m_CampInfo.UnInit(); bCampInfoInitFlag = false; } #ifdef _SERVER if (bDropCenterInitFlag) { m_DropCenter.UnInit(); bDropCenterInitFlag = false; } #endif if (bBuffManagerInitFlag) { m_BuffManager.UnInit(); bBuffManagerInitFlag = false; } if (bSkillManagerInitFlag) { m_SkillManager.UnInit(); bSkillManagerInitFlag = false; } if (bAIManageInitFlag) { m_AIManager.UnInit(); bAIManageInitFlag = false; } if (bRoadManageInitFlag) { m_RoadManager.UnInit(); bRoadManageInitFlag = false; } if (bProfessionManagerInitFlag) { m_ProfessionManager.UnInit(); bProfessionManagerInitFlag = false; } if (bShopCenterInitFlag) { m_ShopCenter.UnInit(); bShopCenterInitFlag = false; } if (bItemManagerInitFlag) { m_ItemManager.UnInit(); bItemManagerInitFlag = false; } if (bScriptCenterInitFlag) { m_ScriptCenter.UnInit(); bScriptCenterInitFlag = false; } if (bSettingsInitFlag) { m_Settings.UnInit(); bSettingsInitFlag = false; } if (bRelationMgrInitFlag) { m_FellowshipMgr.UnInit(); bRelationMgrInitFlag = false; } if (bTeamInitFlag) { #ifdef _SERVER m_TeamServer.UnInit(); #endif #ifdef _CLIENT m_TeamClient.UnInit(); #endif bTeamInitFlag = false; } #ifdef _SERVER if (bTransListInitFlag) { m_TransmissionList.UnInit(); bTransListInitFlag = false; } if (bStatDataServerInitFlag) { m_StatDataServer.UnInit(); bStatDataServerInitFlag = false; } #endif #ifdef _SERVER KG_COM_RELEASE(m_piSceneLoader); #endif KG_COM_RELEASE(m_piRecorderTools); } KG_COM_RELEASE(piIniFile); KGLogPrintf(KGLOG_INFO, "Load game settings ... ... [%s]", bResult ? "OK" : "Failed"); return bResult; }
BOOL KItemLib::GenerateItem(KItem* pItem, DWORD dwTabType, DWORD dwIndex, DWORD dwId/* = 0*/, DWORD dwRandSeed/* = 0 */, int nMagicNum/* = 0 */, int nQuality/* = 0 */, int nMagic[]/* = NULL */, time_t nGenTime/* = 0*/) { BOOL bResult = FALSE; BOOL bRetCode = FALSE; DWORD dwOldRandSeed = 0; KGLOG_PROCESS_ERROR(dwTabType > ittInvalid && dwTabType < ittTotal); if (!nQuality) { nQuality = GenerateQuality(dwTabType, dwIndex); } if (!nGenTime) { nGenTime = time(NULL); } pItem->m_GenParam.nVersion = m_nVerion; pItem->m_GenParam.dwTabType = dwTabType; pItem->m_GenParam.dwIndex = dwIndex; pItem->m_GenParam.nGenTime = nGenTime; if (dwRandSeed) { dwOldRandSeed = g_GetRandomSeed(); } else { // 改变随机种子,保证反复调用生成道具具有不一致性 g_Random(128); } switch (dwTabType) { case ittWeapon: bRetCode = GenerateRandItem( pItem, m_Weapon.GetItemInfo(dwIndex), nMagicNum, nQuality, dwRandSeed, nMagic); KG_PROCESS_ERROR(bRetCode); break; case ittArmor: bRetCode = GenerateRandItem( pItem, m_Armor.GetItemInfo(dwIndex), nMagicNum, nQuality, dwRandSeed, nMagic); KG_PROCESS_ERROR(bRetCode); case ittTrinket: bRetCode = GenerateRandItem( pItem, m_Trinket.GetItemInfo(dwIndex), nMagicNum, nQuality, dwRandSeed, nMagic); KG_PROCESS_ERROR(bRetCode); break; case ittOther: bRetCode = GenerateCommonItem( pItem, m_Other.GetItemInfo(dwIndex), dwRandSeed); KG_PROCESS_ERROR(bRetCode); break; case ittCustWeapon: bRetCode = GenerateCustomItem( pItem, m_CustomWeapon.GetItemInfo(dwIndex), dwRandSeed); KG_PROCESS_ERROR(bRetCode); break; case ittCustArmor: bRetCode = GenerateCustomItem( pItem, m_CustomArmor.GetItemInfo(dwIndex), dwRandSeed); KG_PROCESS_ERROR(bRetCode); break; case ittCustTrinket: bRetCode = GenerateCustomItem( pItem, m_CustomTrinket.GetItemInfo(dwIndex), dwRandSeed); KG_PROCESS_ERROR(bRetCode); break; default: KG_PROCESS_ERROR(0); break; } bResult = TRUE; if (!pItem->m_dwScriptID && !pItem->m_dwSkillID) { pItem->m_eUseType = uistCannotUse; } else { if (pItem->m_Common.nGenre == igEquipment) pItem->m_eUseType = uistUseWhenEquipped; else pItem->m_eUseType = uistUseInPackage; } Exit0: if (dwOldRandSeed) { g_RandomSeed(dwOldRandSeed); } return bResult; }