void RandGen::Reset(const SeedType p_Seed /* = 0*/) { m_Seed[0] = (p_Seed ^ 0xFEA09B9DLU) & 0xFFFFFFFELU; m_Seed[0] ^= (((m_Seed[0] << 7) & Max32BitLong) ^ m_Seed[0]) >> 31; m_Seed[1] = (p_Seed ^ 0x9C129511LU) & 0xFFFFFFF8LU; m_Seed[1] ^= (((m_Seed[1] << 2) & Max32BitLong) ^ m_Seed[1]) >> 29; m_Seed[2] = (p_Seed ^ 0x2512CFB8LU) & 0xFFFFFFF0LU; m_Seed[2] ^= (((m_Seed[2] << 9) & Max32BitLong) ^ m_Seed[2]) >> 28; RandUInt(); }
/* * RangeRand(len) * * Returns a random number in the range 0 to (len-1). * For example, RangeRand(256) returns a value from 0 to 255. */ unsigned int PWSrand::RangeRand(size_t len) { if (len != 0) { unsigned int r; const size_t ceil = UINT_MAX - (UINT_MAX % len) - 1; while ((r = RandUInt()) > ceil) ; return(r%len); } else return 0; }
QString QAutoGenDialog::GetRandomAddress(const QString & strParam) { QString strAddress; Address sAddress; std::map<QString, std::vector<unsigned int> >::iterator iterRecords = m_mapRandomRecords.find(strParam); std::map<QString, Rect>::iterator iterMapSelection = m_mapMapSelections.find(strParam); unsigned int i, iMaxRetries = 3, iRecord, iShapePoint; float fProgress; MapRecord * pRecord; if (iterRecords == m_mapRandomRecords.end()) { iterRecords = m_mapRandomRecords.find(OTHERADDRESSES); iterMapSelection = m_mapMapSelections.find(OTHERADDRESSES); if (iterRecords == m_mapRandomRecords.end()) return strAddress; } // choose a random location in this region if (iterRecords->second.empty()) return strAddress; for (i = 0; i < iMaxRetries; i++) { iRecord = RandUInt(0, iterRecords->second.size()); pRecord = g_pMapDB->GetRecord(iterRecords->second[iRecord]); if (pRecord->nShapePoints > 1) { iShapePoint = RandUInt(0, pRecord->nShapePoints - 1); fProgress = (float)RandDouble(0., 1.); if (g_pMapDB->AddressFromRecord(&sAddress, iterRecords->second[iRecord], iShapePoint, fProgress)) { strAddress = AddressToString(&sAddress); if (StringToAddress(strAddress, &sAddress) && sAddress.iRecord != (unsigned)-1 && iterMapSelection->second.intersectRect(pRecord->rBounds)) break; } } } return strAddress; }
BYTE CarManager::GetTableResult(BYTE& Index)//随机产生一个结果 { Index = 0; DWORD Value = RandUInt() % g_FishServer.GetFishConfig().GetFishMiNiGameConfig().carConfig.MaxRate; vector<tagCarValue>::iterator Iter = g_FishServer.GetFishConfig().GetFishMiNiGameConfig().carConfig.CarValueVec.begin(); for (; Iter != g_FishServer.GetFishConfig().GetFishMiNiGameConfig().carConfig.CarValueVec.end(); ++Iter) { if (Value >= Iter->MinRate && Value < Iter->MaxRate) { Index = Iter->ID; return Iter->TypeID; } } return 0; }
QString QAutoGenDialog::GetRandomParameter(const QString & strParam, const QString & strValue, const ModelParameter & param) { QString strRet; QStringList listRandom = QStringList::split(';', strValue); unsigned int iRandom = RandUInt(0, listRandom.size()); int iSep = strValue.find(':'); switch (param.eType & 0xF) { case ModelParameterTypeInt: if (iSep > -1) strRet = QString("%1").arg(RandInt((long)StringToNumber(strValue.left(iSep)), (long)StringToNumber(strValue.mid(iSep+1)))); else if (!listRandom.empty()) strRet = listRandom[iRandom]; break; case ModelParameterTypeFloat: if (iSep > -1) strRet = QString("%1").arg(RandDouble(StringToNumber(strValue.left(iSep)), StringToNumber(strValue.mid(iSep+1)))); else if (!listRandom.empty()) strRet = listRandom[iRandom]; break; case ModelParameterTypeAddress: strRet = GetRandomAddress(strParam); break; case ModelParameterTypeAddresses: // TODO: generate random address list if (!listRandom.empty()) strRet = listRandom[iRandom]; break; case ModelParameterTypeCoords: if (iSep > -1) { Coords ptMin, ptMax; ptMin.FromString(strValue.left(iSep)); ptMax.FromString(strValue.mid(iSep+1)); strRet = Coords(RandInt(ptMin.m_iLong, ptMax.m_iLong), RandInt(ptMin.m_iLat, ptMax.m_iLat)).ToString(); } else if (!listRandom.empty()) strRet = listRandom[iRandom]; else strRet = GetRandomPosition(strParam); break; default: if (!listRandom.empty()) strRet = listRandom[iRandom]; break; } return strRet; }
void FishPackageManager::OnAutoOpenFishPackage(CRoleEx* pRole, DWORD PackageItemID) { if (!pRole) { ASSERT(false); return; } if (!g_FishServer.GetFishConfig().ItemIsExists(PackageItemID)) { ASSERT(false); return; } //根据宝箱的情况 打开宝箱 HashMap<DWORD, tagFishPackage>::iterator Iter = g_FishServer.GetFishConfig().GetFishPackageConfig().m_PackageMap.find(PackageItemID); if (Iter == g_FishServer.GetFishConfig().GetFishPackageConfig().m_PackageMap.end()) { ASSERT(false); return; } if (Iter->second.ItemVec.empty()) { ASSERT(false); return; } vector<tagFishPackageGroup>::iterator IterGroup = Iter->second.ItemVec.begin(); for (; IterGroup != Iter->second.ItemVec.end(); ++IterGroup) { if (IterGroup->PackageItemVec.empty()) continue; //随机参数一个值 DWORD RankValue = RandUInt() % IterGroup->MaxRankValue; vector<tagFishPackageItem>::iterator IterItem = IterGroup->PackageItemVec.begin(); for (; IterItem != IterGroup->PackageItemVec.end(); ++IterItem) { if (RankValue <= IterItem->RankValue) { //添加物品了 pRole->OnAddRoleRewardByRewardID(IterItem->RewardID, TEXT("打开包裹物品 获得奖励")); break; } } } }
void FishPackageManager::OnOpenFishPackage(CRoleEx* pRole, DWORD ItemOnlyID, DWORD PackageItemID) { if (!pRole) { ASSERT(false); return; } LC_Cmd_OpenPackage msg; SetMsgInfo(msg, GetMsgType(Main_Package, LC_OpenPackage), sizeof(LC_Cmd_OpenPackage)); msg.Result = false; if (!g_FishServer.GetFishConfig().ItemIsExists(PackageItemID)) { pRole->SendDataToClient(&msg); ASSERT(false); return; } if (!pRole->GetItemManager().OnDelUserItem(ItemOnlyID,PackageItemID, 1))//从背包移除 但是玩家刚获得的时候 无须进行处理 { ASSERT(false); pRole->SendDataToClient(&msg); return; } //根据宝箱的情况 打开宝箱 HashMap<DWORD, tagFishPackage>::iterator Iter= g_FishServer.GetFishConfig().GetFishPackageConfig().m_PackageMap.find(PackageItemID); if (Iter == g_FishServer.GetFishConfig().GetFishPackageConfig().m_PackageMap.end()) { ASSERT(false); pRole->SendDataToClient(&msg); return; } if (Iter->second.ItemVec.empty()) { ASSERT(false); pRole->SendDataToClient(&msg); return; } DWORD PageSize = sizeof(LC_Cmd_OpenPackage)+sizeof(WORD)* (Iter->second.ItemVec.size() - 1); CheckMsgSize(PageSize); LC_Cmd_OpenPackage* msgOpen = (LC_Cmd_OpenPackage*)malloc(PageSize); if (!msgOpen) { ASSERT(false); return; } msgOpen->SetCmdSize(ConvertDWORDToWORD(PageSize)); msgOpen->SetCmdType(GetMsgType(Main_Package, LC_OpenPackage)); msgOpen->Result = true; msgOpen->RewardSum = ConvertDWORDToBYTE(Iter->second.ItemVec.size()); vector<tagFishPackageGroup>::iterator IterGroup = Iter->second.ItemVec.begin(); for (int i =0; IterGroup != Iter->second.ItemVec.end(); ++IterGroup) { if (IterGroup->PackageItemVec.empty()) continue; //随机参数一个值 DWORD RankValue = RandUInt() % IterGroup->MaxRankValue; vector<tagFishPackageItem>::iterator IterItem = IterGroup->PackageItemVec.begin(); for (; IterItem != IterGroup->PackageItemVec.end(); ++IterItem) { if (RankValue <= IterItem->RankValue) { //添加物品了 pRole->OnAddRoleRewardByRewardID(IterItem->RewardID,TEXT("打开包裹物品 获得奖励")); msgOpen->RewardID[i] = IterItem->RewardID; break; } } ++i; } pRole->SendDataToClient(msgOpen); free(msgOpen); }