/****************************************************************************** 功能: 生成药品 入口: 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; }
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; }
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; }
BOOL KItemGenerator::Gen_Item(KItem* pItem, INT nItemGenre, INT nDetailType, INT nParticular, INT nLevel, INT nEnhTimes, CONST KItem::KSTONE_INFO* pStoneInfo, CONST KMagicAttrib* pAppendAttr, CONST KItem::KREFINE_LOCK* pRefineLock, UINT uRandSeed, UINT uRandSeedEx, BOOL bNew, BOOL bTemporary, // = FALSE CONST GUID* pGuid // = NULL ) { BYTE pBuf[emITEM_COUNT_RANDOM] = {0}; if (!pItem) return FALSE; if (nItemGenre <= ITEM_INVALID_TYPE) return FALSE; if (nDetailType <= ITEM_INVALID_TYPE) return FALSE; if (nParticular <= ITEM_INVALID_TYPE) return FALSE; BOOL bRet = FALSE; #ifdef GAME_SERVER if (!uRandSeed) { // 打散随机种子 g_Random(-1); uRandSeed = g_GetRandomSeed(); } if (!uRandSeedEx) { // 打散随机种子 g_Random(-1); uRandSeedEx = g_GetRandomSeed(); } // 设置物品唯一ID if (pGuid) { pItem->SetGuid(pGuid); } else { GUID sGuid; QGenerateGUID(&sGuid); pItem->SetGuid(&sGuid); } #endif if(bNew) { memset(pItem->m_aryStoneInfo, emSTONE_LOCKED_ID, sizeof(pItem->m_aryStoneInfo)); } m_cRandom.SetSeed(uRandSeed); // 使用随机种子 m_cRandomEx.SetSeed(uRandSeedEx); pItem->SetRandSeed(uRandSeed); // 设置随机种子 pItem->SetRandSeedEx(uRandSeedEx); g_cScriptManager.SetIt((QLunaBase*)pItem->m_pLuna); switch (nItemGenre) { case item_equip_general: // 普通装备类 if(nDetailType <= equip_foot) { bRet = Gen_GeneralEquip(pItem, nDetailType, nParticular, nLevel, nEnhTimes, pStoneInfo, pAppendAttr, pRefineLock, bNew); } else { // 套装 bRet = Gen_GeneralSuit(pItem, nDetailType, nParticular, nLevel, bNew); } break; case item_medicine: // 药品类 bRet = Gen_Medicine(pItem, nDetailType, nParticular); break; case item_script: // 脚本道具类 switch(nDetailType) { case item_script_stone: bRet = Gen_Stone(pItem, nDetailType, nParticular, nLevel); break; case item_script_ride: bRet = Gen_Ride(pItem, nDetailType, nParticular, nLevel); break; default: bRet = Gen_ScriptItem(pItem, nDetailType, nParticular); break; } break; case item_pet: // 宠物道具类 bRet = Gen_PetItem(pItem, nDetailType, nParticular); break; case item_skill: // 技能道具类 bRet = Gen_SkillItem(pItem, nDetailType, nParticular); break; case item_quest: // 任务道具类 bRet = Gen_TaskQuest(pItem, nDetailType, nParticular); break; case item_extbag: // 扩展背包类 bRet = Gen_ExtendBag(pItem, nDetailType, nParticular); break; case item_stuff: bRet = Gen_StuffItem(pItem, nDetailType, nParticular); break; case item_plan: bRet = Gen_PlanItem(pItem, nDetailType, nParticular); break; default: bRet = FALSE; } if (bRet) { #ifdef GAME_SERVER if (bNew) pItem->SetGenTime(KSysService::Time(NULL)); #endif /* if (nStrengthen > 0) { pItem->SetStrengthen(nStrengthen); // 设置改造属性 } */ pItem->SetTemporary(bTemporary); //VERIFY(pItem->EndGenerate()); } return bRet; }
/****************************************************************************** 功能: 生成随机装备 入口: nDetailType: 具体类别, 如近程武器、暗器、...... nParticularType: 详细类别 nSeriesReq: 五行属性 nLevel: 等级 pnaryMALevel: 魔法属性等级数组[6] nLucky: 运气值 出口: 成功时返回非零, 相关数据在 pItem 所指对象中给出 失败时返回零 ******************************************************************************/ BOOL KItemGenerator::Gen_Equipment(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; #ifdef _SERVER // 服务器版本 pItem->m_GeneratorParam.uRandomSeed = g_GetRandomSeed(); if (pnaryMALevel) memcpy(pItem->m_GeneratorParam.nGeneratorLevel, pnaryMALevel, sizeof(int) * 6); else ZeroMemory(pItem->m_GeneratorParam.nGeneratorLevel, sizeof(int) * 6); pItem->m_GeneratorParam.nVersion = g_SubWorldSet.GetGameVersion(); pItem->m_GeneratorParam.nLuck = nLucky; #else g_RandomSeed(pItem->m_GeneratorParam.uRandomSeed); if (pnaryMALevel) memcpy(pItem->m_GeneratorParam.nGeneratorLevel, pnaryMALevel, sizeof(int) * 6); #endif 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 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; }