Beispiel #1
0
Datei: Tool.cpp Projekt: ff78/son
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();
}
Beispiel #2
0
/*
*  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);
}