示例#1
0
/******************************************************************************
	功能:	生成药品
	入口:	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;
}
示例#3
0
文件: KItemLib.cpp 项目: viticm/pap2
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;
}
示例#4
0
文件: KItemLib.cpp 项目: viticm/pap2
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;
}
示例#5
0
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;
}
示例#6
0
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;
}
示例#7
0
/******************************************************************************
	功能:	生成随机装备
	入口:	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;
}
示例#8
0
文件: KItemLib.cpp 项目: viticm/pap2
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;
}