#include "stdafx.h" #include #include #include #include #include #include #include #include #include "Monster.h" #include "AwardTable.h" using namespace AwardTable; CAward CAward::ms_this; unsigned long CAward::GetAward(unsigned char cItemKind, CMonster* lpDeadMonster, CCharacter* lpAttackCharacter, Item::CItem** lpItem_Out) { if (NULL == lpDeadMonster || NULL == lpAttackCharacter) { ERRLOG2(g_Log, "CAward::GetAward Æ÷ÀÎÅÍ ¿À·ùÀÔ´Ï´Ù. Monster:0x%p, Character:0x%p", lpDeadMonster, lpAttackCharacter); return 0; } // edith µå¶ø ¾ÆÀÌÅÛÀÇ ¼Ó¼ºº° È®À² // À̺¥Æ® ¾ÆÀÌÅÛÀÌ µå¶øµÉ ŸÀ̹ÖÀÎÁö üũÇÑ´Ù. unsigned long dwResultItem = CGameEventMgr::GetInstance().PopDropEventItem(); if (0 == dwResultItem) { const unsigned char cLevel = lpDeadMonster->GetStatus().m_nLevel; const unsigned int iPattern = lpDeadMonster->GetPattern(); using namespace Item::EquipType; OptionType eOptionType = MAX_OPTION_TYPE; Grade eGrade = MAX_GRADE; float fAddPer = 1.0f; switch (cItemKind) { case MonsterInfo::ORIGINAL1: case MonsterInfo::ORIGINAL2: case MonsterInfo::ORIGINAL3: case MonsterInfo::ORIGINAL4: case MonsterInfo::ORIGINAL5: dwResultItem = lpDeadMonster->GetAwardItem(cItemKind); break; case MonsterInfo::COIN: // °ñµå¿¡ ½ºÆ¿Çڵ尡 ¹ÌÄ¡´Â ¿µÇâ if(lpAttackCharacter->GetEnchantInfo().GetFlag(Skill::SpellID::StealHand)) { // ¹è¼ö·Î È®Á¤ÇÑ´Ù. 1À̸é int iLevel = lpAttackCharacter->GetEnchantLevel(Skill::SpellID::StealHand); // ±âº» 1.0 fAddPer += ((float)iLevel/10.0f); } if( lpAttackCharacter->GetAbilityValue(Skill::Type::AB_GETUP_GOLD) ) { fAddPer += ((float)lpAttackCharacter->GetAbilityValue(Skill::Type::AB_GETUP_GOLD)/100.0f); } dwResultItem = GetAwardCoin(cLevel, fAddPer); break; case MonsterInfo::GEM: dwResultItem = GetAwardGem(cLevel); break; case MonsterInfo::METAL: dwResultItem = GetAwardMetal(cLevel); break; case MonsterInfo::POTION: dwResultItem = GetAwardPotion(cLevel); break; case MonsterInfo::SKILL: dwResultItem = GetAwardSkill(cLevel, lpAttackCharacter->GetRace()); break; case MonsterInfo::CASH_ITEM: dwResultItem = GetAwardCashItem(lpAttackCharacter->GetRace(), cLevel, iPattern); break; case MonsterInfo::LOTTERY: dwResultItem = GetAwardLottery(); break; case MonsterInfo::F_STANDARD_EQUIP: eOptionType = STANDARD_OPTION; eGrade = F_GRADE; break; case MonsterInfo::D_STANDARD_EQUIP: eOptionType = STANDARD_OPTION; eGrade = D_GRADE; break; case MonsterInfo::C_STANDARD_EQUIP: eOptionType = STANDARD_OPTION; eGrade = C_GRADE; break; case MonsterInfo::B_STANDARD_EQUIP: eOptionType = STANDARD_OPTION; eGrade = B_GRADE; break; case MonsterInfo::A_STANDARD_EQUIP: eOptionType = STANDARD_OPTION; eGrade = A_GRADE; break; case MonsterInfo::F_OVER_EQUIP: eOptionType = OVER_OPTION; eGrade = F_GRADE; break; case MonsterInfo::D_OVER_EQUIP: eOptionType = OVER_OPTION; eGrade = D_GRADE; break; case MonsterInfo::C_OVER_EQUIP: eOptionType = OVER_OPTION; eGrade = C_GRADE; break; case MonsterInfo::B_OVER_EQUIP: eOptionType = OVER_OPTION; eGrade = B_GRADE; break; case MonsterInfo::A_OVER_EQUIP: eOptionType = OVER_OPTION; eGrade = A_GRADE; break; case MonsterInfo::NO_EQUIP: eOptionType = NO_OPTION; break; //--// start.. case MonsterInfo::F_RING: dwResultItem = GetAwardRing(cLevel, F_GRADE); break; case MonsterInfo::D_RING: dwResultItem = GetAwardRing(cLevel, D_GRADE); break; case MonsterInfo::C_RING: dwResultItem = GetAwardRing(cLevel, C_GRADE); break; case MonsterInfo::B_RING: dwResultItem = GetAwardRing(cLevel, B_GRADE); break; case MonsterInfo::A_RING: dwResultItem = GetAwardRing(cLevel, A_GRADE); break; case MonsterInfo::F_NECKLACE: dwResultItem = GetAwardNecklace(cLevel, F_GRADE); break; case MonsterInfo::D_NECKLACE: dwResultItem = GetAwardNecklace(cLevel, D_GRADE); break; case MonsterInfo::C_NECKLACE: dwResultItem = GetAwardNecklace(cLevel, C_GRADE); break; case MonsterInfo::B_NECKLACE: dwResultItem = GetAwardNecklace(cLevel, B_GRADE); break; case MonsterInfo::A_NECKLACE: dwResultItem = GetAwardNecklace(cLevel, A_GRADE); break; case MonsterInfo::F_RUNE: dwResultItem = GetAwardRune(cLevel, F_GRADE); break; case MonsterInfo::D_RUNE: dwResultItem = GetAwardRune(cLevel, D_GRADE); break; case MonsterInfo::C_RUNE: dwResultItem = GetAwardRune(cLevel, C_GRADE); break; case MonsterInfo::B_RUNE: dwResultItem = GetAwardRune(cLevel, B_GRADE); break; case MonsterInfo::A_RUNE: dwResultItem = GetAwardRune(cLevel, A_GRADE); break; case MonsterInfo::DESTRUCTION_RUNE: dwResultItem = GetAwardDestructionRune(); break; //--// end.. default: return 0; } Item::CItemFactory& ItemFactory = Item::CItemFactory::GetInstance(); if (MAX_OPTION_TYPE != eOptionType) { // ÀåºñÀÇ °æ¿ì dwResultItem = GetAwardEquipment(eOptionType, cLevel, lpAttackCharacter, false); *lpItem_Out = ItemFactory.CreateItem(static_cast(dwResultItem)); Item::CEquipment* lpEquip = Item::CEquipment::DowncastToEquipment(*lpItem_Out); if (NULL != lpEquip) { // edith 2008.01.14 Àåºñ¿¡ ¿É¼ÇÀ» ·£´ýÀ¸·Î °Ç´Ù.(¼³¸í) if(lpEquip->AddRandomOption(eGrade, lpDeadMonster->GetOptionBaseNum(eOptionType), lpAttackCharacter->GetMagicChancePoint())) lpEquip->SetNewEquip(2); else lpEquip->SetNewEquip(); } } else { if (!(dwResultItem & CCell::MONEY_BIT)) { // µ·ÀÌ ¾Æ´Ñ ±âŸ ÀâÅÛ *lpItem_Out = ItemFactory.CreateItem(static_cast(dwResultItem)); if (NULL != *lpItem_Out) { (*lpItem_Out)->SetNumOrDurability(1); } } } } return dwResultItem; } unsigned long CAward::GetAwardCoin(unsigned char cDeadMonsterLevel, float cAddPer) { // edith 2009.06.13 °ñµå µå¶ø¾ç Á¶Àý // const unsigned long dwMinMoney = static_cast(cDeadMonsterLevel) * 2; // const unsigned long dwMaxMoney = static_cast(cDeadMonsterLevel) * 4 + 10; const unsigned long dwMinMoney = static_cast(cDeadMonsterLevel) * 3 + 6; const unsigned long dwMaxMoney = static_cast(cDeadMonsterLevel) * 6 + 12; unsigned long dwMoneyAmount = static_cast( min(Math::Random::ComplexRandom(dwMaxMoney + 1, dwMinMoney) * (CServerSetup::GetInstance().GetDropDefault() / 100.0f) * cAddPer, float(CCell::MAX_MONEY_AMOUNT)) ); dwMoneyAmount = min(dwMoneyAmount, ULONG_MAX & ~CCell::TYPE_CHECK_BIT); return (CCell::MONEY_BIT + dwMoneyAmount); } unsigned long CAward::GetAwardGem(unsigned char cDeadMonsterLevel) { cDeadMonsterLevel = std::min(cDeadMonsterLevel, unsigned char(MAX_MONSTER_LEVEL)); const int nPoint = Math::Random::ComplexRandom(std::accumulate(&(aryGemDropTable[(cDeadMonsterLevel - 1) / 10][0]), &(aryGemDropTable[(cDeadMonsterLevel - 1) / 10][GEM_DROP_TABLE_ROW]), 0)); int nSpace = 0; for (int nAwardTableIndex = 0; nAwardTableIndex < GEM_DROP_TABLE_ROW; ++nAwardTableIndex) { nSpace += aryGemDropTable[(cDeadMonsterLevel - 1) / 10][nAwardTableIndex]; if (nSpace > nPoint) { return (Item::EtcItemID::GEM_START_ID + Math::Random::ComplexRandom(Item::MAX_GEM_KIND) + (nAwardTableIndex * Item::MAX_GEM_KIND)); } } return 0; } //--// start.. unsigned long CAward::GetAwardRing(unsigned char cLevel, unsigned char cGrade) { return Item::CItemMgr::GetInstance().GetRingDropItem(cLevel, cGrade); } unsigned long CAward::GetAwardNecklace(unsigned char cLevel, unsigned char cGrade) { return Item::CItemMgr::GetInstance().GetNecklaceDropItem(cLevel, cGrade); } unsigned long CAward::GetAwardRune(unsigned char cLevel, unsigned char cGrade) { return Item::CItemMgr::GetInstance().GetRuneDropItem(cLevel, cGrade); } unsigned long CAward::GetAwardDestructionRune() { return Item::EtcItemID::DESTRUCTION_RUNE; } //--// end.. unsigned long CAward::GetAwardMetal(unsigned char cDeadMonsterLevel) { cDeadMonsterLevel = std::min(cDeadMonsterLevel, unsigned char(MAX_MONSTER_LEVEL)); const int nPoint = Math::Random::ComplexRandom(std::accumulate(&(aryMetalDropTable[(cDeadMonsterLevel - 1) / 10][0]), &(aryMetalDropTable[(cDeadMonsterLevel - 1) / 10][METAL_DROP_TABLE_ROW]), 0)); int nSpace = 0; for (int nAwardTableIndex = 0; nAwardTableIndex < METAL_DROP_TABLE_ROW; ++nAwardTableIndex) { nSpace += aryMetalDropTable[(cDeadMonsterLevel - 1) / 10][nAwardTableIndex]; if (nSpace > nPoint) { // ÄÚ¾î½Ã½ºÅÛ if(nAwardTableIndex == 6) { // edith 2009.09.17 ÄÚ¾î½Ã½ºÅÛ // ÇöÀç·Î¼­´Â °¢¼ºÀÇ Äھ ÀÖÀ¸¹Ç·Î °¢¼ºÀÇ Äھ ¶³±º´Ù. return Item::EtcItemID::AWAKENCORE; } else { int iMetalID = (Item::EtcItemID::MINERAL_START_ID + nAwardTableIndex); if(iMetalID > Item::EtcItemID::MINERAL_END_ID) iMetalID = Item::EtcItemID::MINERAL_END_ID; return iMetalID; } } } return 0; } unsigned long CAward::GetAwardPotion(unsigned char cDeadMonsterLevel) { cDeadMonsterLevel = std::min(cDeadMonsterLevel, unsigned char(MAX_MONSTER_LEVEL)); const int nPoint = Math::Random::ComplexRandom(std::accumulate(&(aryPotionDropTable[(cDeadMonsterLevel - 1) / 10][0]), &(aryPotionDropTable[(cDeadMonsterLevel - 1) / 10][POTION_DROP_TABLE_ROW]), 0)); int nSpace = 0; for (int nAwardTableIndex = 0; nAwardTableIndex < POTION_DROP_TABLE_ROW; ++nAwardTableIndex) { nSpace += aryPotionDropTable[(cDeadMonsterLevel - 1) / 10][nAwardTableIndex]; if (nSpace > nPoint) { if(nAwardTableIndex <= 3) { const int iType = Math::Random::ComplexRandom(2); // »§µé. if(iType == 0) { switch (nAwardTableIndex) { case 0: return Item::EtcItemID::BREAD; case 1: return Item::EtcItemID::RARE_STEAK; case 2: return Item::EtcItemID::WELLDONE_STEAK; case 3: return Item::EtcItemID::BACON; } } else if(iType == 1) { switch (nAwardTableIndex) { case 0: return Item::EtcItemID::MANNA1; case 1: return Item::EtcItemID::MANNA2; case 2: return Item::EtcItemID::MANNA3; case 3: return Item::EtcItemID::MANNA4; } } else if(iType == 2) { switch (nAwardTableIndex) { case 0: return Item::EtcItemID::SOUP1; case 1: return Item::EtcItemID::SOUP2; case 2: return Item::EtcItemID::SOUP3; case 3: return Item::EtcItemID::SOUP4; } } } else { // 4ºÎÅÍ Æ÷¼Ç 0·¦ Æ÷¼Ç // Æ÷¼Ç°è¿­, int iLevel = nAwardTableIndex-4; const int iType = Math::Random::ComplexRandom(14); switch(iType) { case 0: return Item::EtcItemID::POTION1+iLevel; case 1: return Item::EtcItemID::POTION2+iLevel; case 2: return Item::EtcItemID::POTION3+iLevel; case 3: return Item::EtcItemID::POTION4+iLevel; case 4: return Item::EtcItemID::POTION5+iLevel; case 5: return Item::EtcItemID::POTION6+iLevel; case 6: return Item::EtcItemID::POTION7+iLevel; case 7: return Item::EtcItemID::POTION8+iLevel; case 8: return Item::EtcItemID::POTION9+iLevel; case 9: return Item::EtcItemID::POTION10+iLevel; case 10: return Item::EtcItemID::POTION11+iLevel; case 11: return Item::EtcItemID::POTION12+iLevel; case 12: return Item::EtcItemID::POTION13+iLevel; case 13: return Item::EtcItemID::POTION14+iLevel; // case 14: return Item::EtcItemID::POTION15+iLevel; } } } } return 0; } unsigned long CAward::GetAwardSkill(unsigned char cDeadMonsterLevel, char cAttackCharacterNation) { cDeadMonsterLevel = std::min(cDeadMonsterLevel, unsigned char(MAX_MONSTER_LEVEL)); const short nDeadMonsterLevelRange = (cDeadMonsterLevel - 1) / 10; const short nPoint = static_cast(Math::Random::ComplexRandom(arySkillBookDropTable[nDeadMonsterLevelRange] * 3)); short nSkillLevel = (101 <= cDeadMonsterLevel) ? 4 : nPoint % arySkillBookDropTable[nDeadMonsterLevelRange]; // edith 2008.05.07 ½ºÅ³ºÏ µå¶ø ¼³Á¤ if (true == CServerSetup::GetInstance().UseContents(GameRYL::LEVEL_LIMIT_90)) { // 4´Ü°è±îÁö µå¶ø °¡´É nSkillLevel = min(nSkillLevel, short(3)); } else { // 3´Ü°è±îÁö µå¶ø °¡´É nSkillLevel = min(nSkillLevel, short(2)); } /* else if (true == CServerSetup::GetInstance().UseContents(GameRYL::LEVEL_LIMIT_80)) { // 4´Ü°è±îÁö µå¶ø °¡´É nSkillLevel = min(nSkillLevel, short(3)); } else { // 3´Ü°è±îÁö µå¶ø °¡´É nSkillLevel = min(nSkillLevel, short(2)); } */ const CClass::JobLevel nSkillType = (nPoint < arySkillBookDropTable[nDeadMonsterLevelRange] || 4 <= nSkillLevel) ? CClass::JOB_CHANGE_1ST : CClass::DEFAULT_CLASS; int nSkillKind = (4 <= nSkillLevel) ? FIFTHSKILL_KIND : SKILL_KIND; unsigned short* arySkillShuffleList = new unsigned short[nSkillKind]; for(int i = 0; i < nSkillKind; i++) { arySkillShuffleList[i] = 0; } if(4 <= nSkillLevel) { std::copy(aryDropableFifthSkillbookList, aryDropableFifthSkillbookList + nSkillKind, arySkillShuffleList); } else { std::copy(aryDropableSkillbookList, aryDropableSkillbookList + nSkillKind, arySkillShuffleList); } std::random_shuffle(arySkillShuffleList, arySkillShuffleList + nSkillKind); for (int nAwardTableIndex = 0; nAwardTableIndex < nSkillKind; nAwardTableIndex++) { const unsigned char cSkillBookClass = (arySkillShuffleList[nAwardTableIndex] & ~Skill::SKILL_MASK) >> 8; if ((cSkillBookClass >> 4) == cAttackCharacterNation && CClass::GetJobLevel(cSkillBookClass) == nSkillType) { return Item::CItemMgr::GetInstance().GetItemIDFromSkillID(arySkillShuffleList[nAwardTableIndex], nSkillLevel); } } delete arySkillShuffleList; return 0; } unsigned short CAward::GetAwardEquipment(Item::EquipType::OptionType eOptionType, unsigned char cDeadMonsterLevel, CCharacter* lpCharacter, bool bQuestAward) { unsigned short wItemID = 0; // ¼Ö·ÎÀ× if (NULL == lpCharacter->GetParty() || true == bQuestAward) { // edith 2008.01.14 40ÇÁ·Î È®À²·Î Ŭ·¡½º¿¡ ¾Ë¸Â´Â Àåºñ µå¶ø // 40%ÀÇ È®·ü·Î Ŭ·¡½º¿¡ ¾Ë¸ÂÀº Àåºñ¸¦ µå¶øÇÑ´Ù. if (Math::Random::ComplexRandom(100) < (unsigned long)(40+lpCharacter->GetAbilityValue(Skill::Type::AB_MYEQUIP_UP))) { unsigned char aryShuffleList[PRIMARY_EQUIP_TABLE_ROW] = { 0, }; std::copy(aryPrimaryEquipList[lpCharacter->GetClass()], aryPrimaryEquipList[lpCharacter->GetClass()] + PRIMARY_EQUIP_TABLE_ROW, aryShuffleList); std::random_shuffle(aryShuffleList, aryShuffleList + PRIMARY_EQUIP_TABLE_ROW); Item::CItemType& itemType = Item::CItemType::GetInstance(); for (unsigned char cIndex = 0; cIndex < PRIMARY_EQUIP_TABLE_ROW; ++cIndex) { Item::ItemType::Type eItemType = static_cast(aryShuffleList[cIndex]); // edith 2008.01.14 ¿É¼ÇŸÀÔ ¾Ë¾Æ¿À±â (½ºÅÄ´Ùµå¿É¼Ç, ¿À¹ö¿É¼Ç, ³í¿É¼Ç) if (MAX_ITEM_TYPE != aryShuffleList[cIndex] && true == itemType.IsCorrectOptionType(eOptionType, eItemType)) { wItemID = Item::CItemMgr::GetInstance().GetDropItem(eItemType, cDeadMonsterLevel); if (0 == wItemID) { continue; } break; } } } else { if (CClass::HUMAN == lpCharacter->GetRace()) { wItemID = SelectItemByRace(eOptionType, aryHumanEquipTypeList, HUMAN_EQUIP_TYPE_NUM, cDeadMonsterLevel); } else if (CClass::AKHAN == lpCharacter->GetRace()) { wItemID = SelectItemByRace(eOptionType, aryAkhanEquipTypeList, AKHAN_EQUIP_TYPE_NUM, cDeadMonsterLevel); } else { ERRLOG2(g_Log, "CID:0x%08x ij¸¯ÅÍÀÇ Á¾Á·ÀÌ ÀÌ»óÇÕ´Ï´Ù. Á¾Á·:%d", lpCharacter->GetCID(), lpCharacter->GetRace()); return 0; } } } // ÆÄƼ Ç÷¹ÀÌ else { CCharacterParty* lpParty = reinterpret_cast(lpCharacter->GetParty()); CCharacter* aryNearCharacterList[PARTY::MAX_MEM]; unsigned char cHighestLevel = 0; const unsigned char cNearPartyMemberNum = lpParty->GetNearMemberList(lpCharacter->GetCellPos().m_lpCell, true, aryNearCharacterList, cHighestLevel); if (0 == cNearPartyMemberNum) { return 0; } unsigned char cHumanNum = 0; for (unsigned char cMemberIndex = 0; cMemberIndex < cNearPartyMemberNum; ++cMemberIndex) { if (CClass::HUMAN == aryNearCharacterList[cMemberIndex]->GetRace()) { ++cHumanNum; } } // ÆÄƼ¿øÀÇ Á¾Á· ºñÀ²¿¡ ÀÇÇØ µå¶øµÉ Àåºñ ŸÀÔÀÇ È®·üÀÌ °áÁ¤µÈ´Ù. if (static_cast(cHumanNum * 100.0f / cNearPartyMemberNum) > Math::Random::ComplexRandom(100)) { wItemID = SelectItemByRace(eOptionType, aryHumanEquipTypeList, HUMAN_EQUIP_TYPE_NUM, cDeadMonsterLevel); } else { wItemID = SelectItemByRace(eOptionType, aryAkhanEquipTypeList, AKHAN_EQUIP_TYPE_NUM, cDeadMonsterLevel); } } if (0 == wItemID) { ERRLOG0(g_Log, "µå¶øÇÒ Àåºñ¸¦ °áÁ¤ÇÏÁö ¸øÇÏ¿´½À´Ï´Ù."); return 0; } return wItemID; } unsigned short CAward::GetQuestEquipmentClass(Item::EquipType::OptionType eOptionType, unsigned char cClass, unsigned char cDeadMonsterLevel, CCharacter* lpCharacter) { unsigned short wItemID = 0; unsigned char aryShuffleList[PRIMARY_EQUIP_TABLE_ROW] = { 0, }; std::copy(aryPrimaryEquipList[cClass], aryPrimaryEquipList[cClass] + PRIMARY_EQUIP_TABLE_ROW, aryShuffleList); std::random_shuffle(aryShuffleList, aryShuffleList + PRIMARY_EQUIP_TABLE_ROW); Item::CItemType& itemType = Item::CItemType::GetInstance(); for (unsigned char cIndex = 0; cIndex < PRIMARY_EQUIP_TABLE_ROW; ++cIndex) { Item::ItemType::Type eItemType = static_cast(aryShuffleList[cIndex]); // edith 2008.01.14 ¿É¼ÇŸÀÔ ¾Ë¾Æ¿À±â (½ºÅÄ´Ùµå¿É¼Ç, ¿À¹ö¿É¼Ç, ³í¿É¼Ç) if (MAX_ITEM_TYPE != aryShuffleList[cIndex] && true == itemType.IsCorrectOptionType(eOptionType, eItemType)) { wItemID = Item::CItemMgr::GetInstance().GetDropItem(eItemType, cDeadMonsterLevel); if (0 == wItemID) { continue; } break; } } if (0 == wItemID) { ERRLOG0(g_Log, "µå¶øÇÒ Àåºñ¸¦ °áÁ¤ÇÏÁö ¸øÇÏ¿´½À´Ï´Ù."); return 0; } return wItemID; } unsigned long CAward::GetAwardCashItem(char cAttackCharacterNation, unsigned char cDeadMonsterLevel, unsigned int cDeadMonsterPattern) { cDeadMonsterLevel = std::min(cDeadMonsterLevel, unsigned char(MAX_MONSTER_LEVEL)); int iMonLevel = (cDeadMonsterLevel - 1) / 10; if(cDeadMonsterPattern == MonsterInfo::PATTERN_CHIEF) // Ä¡ÇÁ¸é 11 iMonLevel = 11; else if(cDeadMonsterPattern == MonsterInfo::PATTERN_NAMED) // ³×ÀÓµå¸é 12 Å×À̺í iMonLevel = 12; const int nPoint = Math::Random::ComplexRandom(std::accumulate(&(aryCashDropTable[iMonLevel][0]), &(aryCashDropTable[iMonLevel][CASH_DROP_TABLE_ROW]), 0)); // ij½¬ÅÛÀÇ µå¶ø¾ÆÀÌÅÛ ¸®½ºÆ®´Â ¿©±â¿¡ int nSpace = 0; for (int nAwardTableIndex = 0; nAwardTableIndex < CASH_DROP_TABLE_ROW; ++nAwardTableIndex) { nSpace += aryCashDropTable[(cDeadMonsterLevel - 1) / 10][nAwardTableIndex]; if (nSpace > nPoint) { if(nAwardTableIndex == 0) // ¸Á°¢Àǵ¹ return Item::EtcItemID::OBLIVION_STONE; else if(nAwardTableIndex == 4) // ³»±¸µµ¼® return Item::EtcItemID::ENDURANCESTONE; else if(nAwardTableIndex == 5) // ºÎȰÀǵ¹ return Item::EtcItemID::REBIRTH_STONE; else if(nAwardTableIndex == 6) // Å»°Í { const int iType = Math::Random::ComplexRandom(2); if(cAttackCharacterNation == 0) //ÈÞ¸Õ { if(iType == 0) return Item::EtcItemID::RIDEH1; else return Item::EtcItemID::RIDEH2; } else // ¾ÆÄ­ { if(iType == 0) return Item::EtcItemID::RIDEA1; else return Item::EtcItemID::RIDEA2; } } else if(nAwardTableIndex == 3) // ¿Àºê { const int iType = Math::Random::ComplexRandom(2); if(iType == 0) return Item::EtcItemID::ORB_EXP; else return Item::EtcItemID::ORB_LUCK; } else if(nAwardTableIndex == 1 || nAwardTableIndex == 2) // À¯·á Æ÷¼Ç { int iLevel = nAwardTableIndex-1; int iType = 0; const int iRage = Math::Random::ComplexRandom(100); if(iRage < 60) { iType = Math::Random::ComplexRandom(2); } else { iType = 2+Math::Random::ComplexRandom(12); } switch(iType) { case 0: return Item::EtcItemID::CASHPOTION1+iLevel; case 1: return Item::EtcItemID::CASHPOTION2+iLevel; case 2: return Item::EtcItemID::CASHPOTION3+iLevel; case 3: return Item::EtcItemID::CASHPOTION4+iLevel; case 4: return Item::EtcItemID::CASHPOTION5+iLevel; case 5: return Item::EtcItemID::CASHPOTION6+iLevel; case 6: return Item::EtcItemID::CASHPOTION7+iLevel; case 7: return Item::EtcItemID::CASHPOTION8+iLevel; case 8: return Item::EtcItemID::CASHPOTION9+iLevel; case 9: return Item::EtcItemID::CASHPOTION10+iLevel; case 10: return Item::EtcItemID::CASHPOTION11+iLevel; case 11: return Item::EtcItemID::CASHPOTION12+iLevel; case 12: return Item::EtcItemID::CASHPOTION13+iLevel; case 13: return Item::EtcItemID::CASHPOTION14+iLevel; // case 14: return Item::EtcItemID::CASHPOTION15+iLevel; } } } } ERRLOG0(g_Log, "µå¶øÇÒ Ä³½¬¾ÆÀÌÅÛÀ» °áÁ¤ÇÏÁö ¸øÇÏ¿´½À´Ï´Ù."); return 0;//Item::EtcItemID::OBLIVION_STONE; } unsigned long CAward::GetAwardLottery(void) { if (false == CServerSetup::GetInstance().GetLotteryEvent()) { ERRLOG0(g_Log, "º¹±Ç À̺¥Æ®¸¦ Çϰí ÀÖÁö ¾ÊÀºµ¥, º¹±Ç µå¶øÀ» ¿äûÇÏ¿´½À´Ï´Ù."); return 0; } return CGameEventMgr::GetInstance().GetLotteryEvent().GetLottery(); } unsigned short CAward::SelectItemByRace(Item::EquipType::OptionType eOptionType, const unsigned char* aryItemType, unsigned char cMaxItemType, unsigned char cLevel) { unsigned char aryShuffleList[UCHAR_MAX] = { 0, }; std::copy(aryItemType, aryItemType + cMaxItemType, aryShuffleList); std::random_shuffle(aryShuffleList, aryShuffleList + cMaxItemType); unsigned short wItemID = 0; for (unsigned char cIndex = 0; cIndex < cMaxItemType; ++cIndex) { Item::ItemType::Type eItemType = static_cast(aryShuffleList[cIndex]); if (true == Item::CItemType::GetInstance().IsCorrectOptionType(eOptionType, eItemType)) { wItemID = Item::CItemMgr::GetInstance().GetDropItem(eItemType, cLevel); if (0 != wItemID) { break; } } } return wItemID; }