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;
}
Example #2
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;
}
Example #3
0
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;
}
Example #4
0
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;
}
Example #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;
}
Example #6
0
/******************************************************************************
	功能:	生成随机装备
	入口:	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;
}
Example #7
0
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;
}
Example #8
0
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;
}