Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
374 lines
18 KiB
C++
374 lines
18 KiB
C++
#include "stdafx.h"
|
||
#include "ItemConstants.h"
|
||
#include "ItemStructure.h"
|
||
|
||
#include <algorithm>
|
||
|
||
using namespace Item;
|
||
|
||
Item::CItemType Item::CItemType::ms_this;
|
||
|
||
const CTypeName Item::Attribute::Attributes[Item::Attribute::MAX_ATTRIBUTE_NUM] =
|
||
{
|
||
CTypeName(Attribute::NONE, "None"),
|
||
CTypeName(Attribute::CRITICAL_TYPE, "CriticalType"),
|
||
CTypeName(Attribute::CRITICAL_PERCENTAGE, "CriticalPercentage"),
|
||
CTypeName(Attribute::MIN_DAMAGE, "MinDamage"),
|
||
CTypeName(Attribute::MAX_DAMAGE, "MaxDamage"),
|
||
CTypeName(Attribute::DRC, "DRC"),
|
||
CTypeName(Attribute::OFFENCE_REVISION, "OffenceRevision"),
|
||
CTypeName(Attribute::DEFENCE, "Defence"),
|
||
CTypeName(Attribute::DEFENCE_REVISION, "DefenceRevision"),
|
||
CTypeName(Attribute::MAGIC_RESISTANCE, "Resistance"),
|
||
CTypeName(Attribute::BLOCKING_PERCENTAGE, "BlockingPercentage"),
|
||
CTypeName(Attribute::ATTACK_SPEED, "AttackSpeed"),
|
||
CTypeName(Attribute::MOVE_SPEED, "MoveSpeed"),
|
||
CTypeName(Attribute::ATTACK_RANGE, "AttackRange"),
|
||
CTypeName(Attribute::RANGE_ATTACK_DISTANCE, "LongRangeAttack"),
|
||
CTypeName(Attribute::MAX_HP, "HpMaxPlus"),
|
||
CTypeName(Attribute::MAX_MP, "MpMaxPlus"),
|
||
CTypeName(Attribute::HP_REGEN_AMOUNT, "HPRegen"),
|
||
CTypeName(Attribute::MP_REGEN_AMOUNT, "MPRegen"),
|
||
CTypeName(Attribute::FIRE_ATTACK, "FireAttribute"),
|
||
CTypeName(Attribute::LIGHTNING_ATTACK, "LightingAttribute"),
|
||
CTypeName(Attribute::COLD_ATTACK, "ColdAttribute"),
|
||
CTypeName(Attribute::DRAIN_ATTACK, "DrainAttribute"),
|
||
CTypeName(Attribute::POISON_ATTACK, "PoisonAttribute"),
|
||
CTypeName(Attribute::FIRE_RESISTANCE, "FireResistance"),
|
||
CTypeName(Attribute::LIGHTNING_RESISTANCE, "LightningResistance"),
|
||
CTypeName(Attribute::COLD_RESISTANCE, "ColdResistance"),
|
||
CTypeName(Attribute::DRAIN_RESISTANCE, "DrainResistance"),
|
||
CTypeName(Attribute::POISON_RESISTANCE, "PoisonResistance"),
|
||
CTypeName(Attribute::ADD_STR, "STRAdd"),
|
||
CTypeName(Attribute::ADD_DEX, "DEXAdd"),
|
||
CTypeName(Attribute::ADD_CON, "CONAdd"),
|
||
CTypeName(Attribute::ADD_INT, "INTAdd"),
|
||
CTypeName(Attribute::ADD_WIS, "WISAdd")
|
||
};
|
||
|
||
|
||
|
||
const CTypeName Item::Grade::Grades[Grade::MAX_ITEM_GRADE] =
|
||
{
|
||
CTypeName(Grade::ETC, "ETC"),
|
||
CTypeName(Grade::NORMAL, "NORMAL"),
|
||
CTypeName(Grade::ENHANCED, "ENHANCED"),
|
||
CTypeName(Grade::RARE, "RARE")
|
||
};
|
||
|
||
|
||
Item::CItemType::CItemType()
|
||
{
|
||
int nCount = 0;
|
||
|
||
for(nCount = 0; nCount < MAX_ARRAY_TYPE; ++nCount)
|
||
{
|
||
m_ItemTypes[nCount].reserve(MAX_ITEM_TYPE);
|
||
}
|
||
|
||
m_ItemTypeNames[HELM] = CTypeName(HELM, "HELM");
|
||
m_ItemTypeNames[SHIRT] = CTypeName(SHIRT, "SHIRT");
|
||
m_ItemTypeNames[TUNIC] = CTypeName(TUNIC, "TUNIC");
|
||
m_ItemTypeNames[ARMOUR] = CTypeName(ARMOUR, "ARMOUR");
|
||
m_ItemTypeNames[GLOVE] = CTypeName(GLOVE, "GLOVE");
|
||
m_ItemTypeNames[BOOTS] = CTypeName(BOOTS, "BOOTS");
|
||
m_ItemTypeNames[SWORD] = CTypeName(SWORD, "ONEHANDED_SWORD");
|
||
m_ItemTypeNames[BLUNT] = CTypeName(BLUNT, "ONEHANDED_BLUNT");
|
||
m_ItemTypeNames[AXE] = CTypeName(AXE, "ONEHANDED_AXE");
|
||
m_ItemTypeNames[TWOHANDED_BLUNT] = CTypeName(TWOHANDED_BLUNT, "TWOHANDED_BLUNT");
|
||
m_ItemTypeNames[TWOHANDED_AXE] = CTypeName(TWOHANDED_AXE, "TWOHANDED_AXE");
|
||
m_ItemTypeNames[TWOHANDED_SWORD] = CTypeName(TWOHANDED_SWORD, "TWOHANDED_SWORD");
|
||
m_ItemTypeNames[BOW] = CTypeName(BOW, "BOW");
|
||
m_ItemTypeNames[CROSSBOW] = CTypeName(CROSSBOW, "CROSSBOW");
|
||
m_ItemTypeNames[STAFF] = CTypeName(STAFF, "STAFF");
|
||
m_ItemTypeNames[DAGGER] = CTypeName(DAGGER, "DAGGER");
|
||
m_ItemTypeNames[SHIELD] = CTypeName(SHIELD, "SHIELD");
|
||
m_ItemTypeNames[CLOAK] = CTypeName(CLOAK, "CLOAK");
|
||
m_ItemTypeNames[RING] = CTypeName(RING, "RING");
|
||
m_ItemTypeNames[NECKLACE] = CTypeName(NECKLACE, "NECKLACE");
|
||
|
||
m_ItemTypeNames[POTION] = CTypeName(POTION, "POTION");
|
||
m_ItemTypeNames[POISON] = CTypeName(POISON, "POISON");
|
||
m_ItemTypeNames[TRAP] = CTypeName(TRAP, "TRAP");
|
||
m_ItemTypeNames[SKILLBOOK] = CTypeName(SKILLBOOK, "SKILLBOOK");
|
||
m_ItemTypeNames[GEM] = CTypeName(GEM, "GEM");
|
||
m_ItemTypeNames[RUNE] = CTypeName(RUNE, "RUNE");
|
||
m_ItemTypeNames[MATERIAL] = CTypeName(MATERIAL, "ORE");
|
||
m_ItemTypeNames[AMMO] = CTypeName(AMMO, "AMMO");
|
||
m_ItemTypeNames[ETC] = CTypeName(ETC, "ETC");
|
||
|
||
m_ItemTypeNames[HEAD] = CTypeName(HEAD, "HEAD");
|
||
m_ItemTypeNames[BODY] = CTypeName(BODY, "BODY");
|
||
m_ItemTypeNames[PROTECT_A] = CTypeName(PROTECT_A, "PROTECT_A");
|
||
m_ItemTypeNames[PELVIS] = CTypeName(PELVIS, "PELVIS");
|
||
m_ItemTypeNames[COM_BLUNT] = CTypeName(COM_BLUNT, "COM_BLUNT");
|
||
m_ItemTypeNames[COM_SWORD] = CTypeName(COM_SWORD, "COM_SWORD");
|
||
m_ItemTypeNames[OPP_HAMMER] = CTypeName(OPP_HAMMER, "OPP_HAMMER");
|
||
m_ItemTypeNames[OPP_AXE] = CTypeName(OPP_AXE, "OPP_AXE");
|
||
m_ItemTypeNames[OPP_SLUSHER] = CTypeName(OPP_SLUSHER, "OPP_SLUSHER");
|
||
m_ItemTypeNames[OPP_TALON] = CTypeName(OPP_TALON, "OPP_TALON");
|
||
m_ItemTypeNames[OPP_SYTHE] = CTypeName(OPP_SYTHE, "OPP_SYTHE");
|
||
m_ItemTypeNames[SKILL_A_GUARD] = CTypeName(SKILL_A_GUARD, "SKILL_A_GUARD");
|
||
m_ItemTypeNames[SKILL_A_ATTACK] = CTypeName(SKILL_A_ATTACK, "SKILL_A_ATTACK");
|
||
m_ItemTypeNames[SKILL_A_GUN] = CTypeName(SKILL_A_GUN, "SKILL_A_GUN");
|
||
m_ItemTypeNames[SKILL_A_KNIFE] = CTypeName(SKILL_A_KNIFE, "SKILL_A_KNIFE");
|
||
m_ItemTypeNames[ACCESSORY] = CTypeName(ACCESSORY, "ACCESSORY");
|
||
|
||
m_ItemTypeNames[ARROW] = CTypeName(ARROW, "ARROW");
|
||
m_ItemTypeNames[BOLT] = CTypeName(BOLT, "BOLT");
|
||
|
||
// <20><><EFBFBD><EFBFBD>
|
||
m_ItemTypes[EQUIP_TYPE].push_back(ARROW); m_ItemTypes[EQUIP_TYPE].push_back(BOLT);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(HELM); m_ItemTypes[EQUIP_TYPE].push_back(SHIRT);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(TUNIC); m_ItemTypes[EQUIP_TYPE].push_back(ARMOUR);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(SHIELD); m_ItemTypes[EQUIP_TYPE].push_back(CLOAK);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(GLOVE); m_ItemTypes[EQUIP_TYPE].push_back(BOOTS);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(SWORD); m_ItemTypes[EQUIP_TYPE].push_back(BLUNT);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(AXE); m_ItemTypes[EQUIP_TYPE].push_back(DAGGER);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(STAFF); m_ItemTypes[EQUIP_TYPE].push_back(TWOHANDED_BLUNT);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(TWOHANDED_AXE); m_ItemTypes[EQUIP_TYPE].push_back(TWOHANDED_SWORD);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(BOW); m_ItemTypes[EQUIP_TYPE].push_back(CROSSBOW);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(RING); m_ItemTypes[EQUIP_TYPE].push_back(NECKLACE);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(HEAD); m_ItemTypes[EQUIP_TYPE].push_back(BODY);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(PELVIS); m_ItemTypes[EQUIP_TYPE].push_back(PROTECT_A);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(COM_BLUNT); m_ItemTypes[EQUIP_TYPE].push_back(COM_SWORD);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(OPP_HAMMER); m_ItemTypes[EQUIP_TYPE].push_back(OPP_AXE);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(OPP_SLUSHER); m_ItemTypes[EQUIP_TYPE].push_back(OPP_TALON);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(OPP_SYTHE); m_ItemTypes[EQUIP_TYPE].push_back(SKILL_A_GUARD);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(SKILL_A_ATTACK); m_ItemTypes[EQUIP_TYPE].push_back(SKILL_A_GUN);
|
||
m_ItemTypes[EQUIP_TYPE].push_back(SKILL_A_KNIFE); m_ItemTypes[EQUIP_TYPE].push_back(ACCESSORY);
|
||
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
m_ItemTypes[USE_ITEM_TYPE].push_back(POTION); m_ItemTypes[USE_ITEM_TYPE].push_back(POISON);
|
||
m_ItemTypes[USE_ITEM_TYPE].push_back(TRAP); m_ItemTypes[USE_ITEM_TYPE].push_back(SKILLBOOK);
|
||
m_ItemTypes[USE_ITEM_TYPE].push_back(AMMO);
|
||
|
||
// <20><><EFBFBD><EFBFBD>
|
||
m_ItemTypes[WEAPON_TYPE].push_back(SWORD); m_ItemTypes[WEAPON_TYPE].push_back(BLUNT);
|
||
m_ItemTypes[WEAPON_TYPE].push_back(AXE); m_ItemTypes[WEAPON_TYPE].push_back(DAGGER);
|
||
m_ItemTypes[WEAPON_TYPE].push_back(STAFF); m_ItemTypes[WEAPON_TYPE].push_back(TWOHANDED_BLUNT);
|
||
m_ItemTypes[WEAPON_TYPE].push_back(TWOHANDED_AXE); m_ItemTypes[WEAPON_TYPE].push_back(TWOHANDED_SWORD);
|
||
m_ItemTypes[WEAPON_TYPE].push_back(BOW); m_ItemTypes[WEAPON_TYPE].push_back(CROSSBOW);
|
||
m_ItemTypes[WEAPON_TYPE].push_back(COM_BLUNT); m_ItemTypes[WEAPON_TYPE].push_back(COM_SWORD);
|
||
m_ItemTypes[WEAPON_TYPE].push_back(OPP_HAMMER); m_ItemTypes[WEAPON_TYPE].push_back(OPP_AXE);
|
||
m_ItemTypes[WEAPON_TYPE].push_back(OPP_SLUSHER); m_ItemTypes[WEAPON_TYPE].push_back(OPP_TALON);
|
||
m_ItemTypes[WEAPON_TYPE].push_back(OPP_SYTHE);
|
||
|
||
// <20><><EFBFBD>
|
||
m_ItemTypes[ARMOUR_TYPE].push_back(HELM); m_ItemTypes[ARMOUR_TYPE].push_back(SHIRT);
|
||
m_ItemTypes[ARMOUR_TYPE].push_back(TUNIC); m_ItemTypes[ARMOUR_TYPE].push_back(ARMOUR);
|
||
m_ItemTypes[ARMOUR_TYPE].push_back(SHIELD); m_ItemTypes[ARMOUR_TYPE].push_back(CLOAK);
|
||
m_ItemTypes[ARMOUR_TYPE].push_back(GLOVE); m_ItemTypes[ARMOUR_TYPE].push_back(BOOTS);
|
||
m_ItemTypes[ARMOUR_TYPE].push_back(HEAD); m_ItemTypes[ARMOUR_TYPE].push_back(BODY);
|
||
m_ItemTypes[ARMOUR_TYPE].push_back(PELVIS); m_ItemTypes[ARMOUR_TYPE].push_back(PROTECT_A);
|
||
|
||
// <20><>ų<EFBFBD><C5B3>
|
||
m_ItemTypes[SKILL_ARM_TYPE].push_back(SKILL_A_GUARD); m_ItemTypes[SKILL_ARM_TYPE].push_back(SKILL_A_ATTACK);
|
||
m_ItemTypes[SKILL_ARM_TYPE].push_back(SKILL_A_GUN); m_ItemTypes[SKILL_ARM_TYPE].push_back(SKILL_A_KNIFE);
|
||
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
m_ItemTypes[TWOHANDED_TYPE].push_back(STAFF); m_ItemTypes[TWOHANDED_TYPE].push_back(TWOHANDED_BLUNT);
|
||
m_ItemTypes[TWOHANDED_TYPE].push_back(TWOHANDED_AXE); m_ItemTypes[TWOHANDED_TYPE].push_back(TWOHANDED_SWORD);
|
||
m_ItemTypes[TWOHANDED_TYPE].push_back(BOW); m_ItemTypes[TWOHANDED_TYPE].push_back(CROSSBOW);
|
||
|
||
for(nCount = 0; nCount < MAX_ARRAY_TYPE; ++nCount)
|
||
{
|
||
std::sort(m_ItemTypes[nCount].begin(), m_ItemTypes[nCount].end());
|
||
}
|
||
}
|
||
|
||
bool Item::CItemType::IsCorrectItemType(ArrayType itemType, unsigned char cEquipType)
|
||
{
|
||
return std::binary_search(m_ItemTypes[itemType].begin(),
|
||
m_ItemTypes[itemType].end(), cEquipType);
|
||
}
|
||
|
||
unsigned char Item::CItemType::ConvertRandomOptionType(unsigned char cEquipType)
|
||
{
|
||
if (true == IsCorrectItemType(CItemType::WEAPON_TYPE, cEquipType))
|
||
{
|
||
return RandomOption::WEAPON;
|
||
}
|
||
else
|
||
{
|
||
switch (cEquipType)
|
||
{
|
||
case CItemType::ARMOUR: case CItemType::BODY: return RandomOption::ARMOUR_BODY;
|
||
case CItemType::HELM: case CItemType::HEAD: return RandomOption::HELM_HEAD;
|
||
case CItemType::RING: case CItemType::ACCESSORY: return RandomOption::RING_ACCESSORY;
|
||
case CItemType::NECKLACE: return RandomOption::NECKLACE;
|
||
|
||
case CItemType::SHIELD: case CItemType::SKILL_A_GUARD: return RandomOption::SKILL_A_GUARD;
|
||
|
||
case CItemType::SKILL_A_ATTACK:
|
||
case CItemType::SKILL_A_GUN:
|
||
case CItemType::SKILL_A_KNIFE:
|
||
return RandomOption::SKILL_A_WEAPON;
|
||
}
|
||
}
|
||
|
||
return RandomOption::MAX_RANDOM_OPTION_TYPE;
|
||
}
|
||
|
||
void Item::CItemType::SetEquipTypeFlags(ItemInfo& itemInfo)
|
||
{
|
||
switch (itemInfo.m_DetailData.m_cItemType)
|
||
{
|
||
case ARROW:
|
||
case BOLT:
|
||
itemInfo.m_DetailData.m_dwFlags |= Item::DetailData::STACKABLE;
|
||
break;
|
||
}
|
||
|
||
if (IsCorrectItemType(Item::CItemType::WEAPON_TYPE, itemInfo.m_DetailData.m_cItemType))
|
||
{
|
||
itemInfo.m_DetailData.m_dwFlags |= DetailData::WEAPON;
|
||
|
||
if (IsCorrectItemType(Item::CItemType::TWOHANDED_TYPE, itemInfo.m_DetailData.m_cItemType))
|
||
{
|
||
itemInfo.m_DetailData.m_dwFlags |= DetailData::TWOHANDED;
|
||
}
|
||
|
||
}
|
||
else if (IsCorrectItemType(Item::CItemType::SKILL_ARM_TYPE, itemInfo.m_DetailData.m_cItemType))
|
||
{
|
||
itemInfo.m_DetailData.m_dwFlags |= DetailData::SKILL_ARM;
|
||
}
|
||
else if (IsCorrectItemType(Item::CItemType::ARMOUR_TYPE, itemInfo.m_DetailData.m_cItemType))
|
||
{
|
||
itemInfo.m_DetailData.m_dwFlags |= DetailData::ARMOUR;
|
||
}
|
||
|
||
itemInfo.m_DetailData.m_dwFlags |= Item::DetailData::EQUIP;
|
||
}
|
||
|
||
|
||
void Item::CItemType::SetUseItemTypeFlags(ItemInfo& itemInfo)
|
||
{
|
||
switch(itemInfo.m_DetailData.m_cItemType)
|
||
{
|
||
case Item::CItemType::POTION:
|
||
case Item::CItemType::POISON:
|
||
case Item::CItemType::TRAP:
|
||
itemInfo.m_DetailData.m_dwFlags |= Item::DetailData::QUICKSLOT_IN;
|
||
break;
|
||
}
|
||
|
||
if(itemInfo.m_DetailData.m_cMaxDurabilityOrStack > 1)
|
||
{
|
||
itemInfo.m_DetailData.m_dwFlags |= Item::DetailData::STACKABLE;
|
||
}
|
||
|
||
itemInfo.m_DetailData.m_dwFlags |= Item::DetailData::USE_ITEM;
|
||
}
|
||
|
||
|
||
void Item::CItemType::SetEtcItemTypeFlags(ItemInfo& itemInfo)
|
||
{
|
||
if(itemInfo.m_DetailData.m_cMaxDurabilityOrStack > 1)
|
||
{
|
||
itemInfo.m_DetailData.m_dwFlags |= Item::DetailData::STACKABLE;
|
||
}
|
||
}
|
||
|
||
|
||
using namespace Item::Attribute;
|
||
typedef Item::ItemAttribute Attr;
|
||
|
||
Attr GemInstallTable[15][7] =
|
||
{
|
||
// <09><><EFBFBD><EFBFBD> <09>Ƹ<EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> 2+ <09>Ƹ<EFBFBD> 2+
|
||
Attr(FIRE_ATTACK, 1), Attr(FIRE_RESISTANCE, 1), Attr(ADD_STR, 3), Attr(OFFENCE_REVISION ,3), Attr(MAX_DAMAGE, 2), Attr(OFFENCE_REVISION, 3), Attr(ADD_STR, 3), // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
Attr(POISON_ATTACK, 1), Attr(POISON_RESISTANCE, 1), Attr(ADD_CON, 3), Attr(HP_REGEN_AMOUNT, 3), Attr(MAX_HP, 10), Attr(ADD_CON, 3), Attr(MAX_HP, 1), // <20><><EFBFBD><EFBFBD><DEB6><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
Attr(COLD_ATTACK, 1), Attr(COLD_RESISTANCE, 1), Attr(ADD_INT, 3), Attr(MP_REGEN_AMOUNT, 3), Attr(MAX_MP, 10), Attr(MAX_MP, 1), Attr(ADD_INT, 3), // <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
Attr(LIGHTNING_ATTACK, 1), Attr(LIGHTNING_RESISTANCE, 1), Attr(ADD_WIS ,3), Attr(MAGIC_RESISTANCE, 3), Attr(CRITICAL_PERCENTAGE, 1), Attr(CRITICAL_PERCENTAGE, 2), Attr(MAGIC_RESISTANCE, 3), // <20><><EFBFBD>̾Ƹ<CCBE><C6B8><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
Attr(DRAIN_ATTACK, 1), Attr(DRAIN_RESISTANCE, 1), Attr(ADD_DEX ,3), Attr(DEFENCE_REVISION, 3), Attr(DEFENCE, 1), Attr(ADD_DEX, 3), Attr(DEFENCE_REVISION, 3), // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
|
||
Attr(FIRE_ATTACK, 2), Attr(FIRE_RESISTANCE, 2), Attr(ADD_STR, 6), Attr(OFFENCE_REVISION ,6), Attr(MAX_DAMAGE, 4), Attr(OFFENCE_REVISION, 6), Attr(ADD_STR, 6), // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
Attr(POISON_ATTACK, 2), Attr(POISON_RESISTANCE, 2), Attr(ADD_CON, 6), Attr(HP_REGEN_AMOUNT, 6), Attr(MAX_HP, 20), Attr(ADD_CON, 6), Attr(MAX_HP, 2), // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><DEB6><EFBFBD>
|
||
Attr(COLD_ATTACK, 2), Attr(COLD_RESISTANCE, 2), Attr(ADD_INT, 6), Attr(MP_REGEN_AMOUNT, 6), Attr(MAX_MP, 20), Attr(MAX_MP, 2), Attr(ADD_INT, 6), // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD>
|
||
Attr(LIGHTNING_ATTACK, 2), Attr(LIGHTNING_RESISTANCE, 2), Attr(ADD_WIS ,6), Attr(MAGIC_RESISTANCE, 6), Attr(CRITICAL_PERCENTAGE, 2), Attr(CRITICAL_PERCENTAGE, 4), Attr(MAGIC_RESISTANCE, 6), // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̾Ƹ<CCBE><C6B8><EFBFBD>
|
||
Attr(DRAIN_ATTACK, 2), Attr(DRAIN_RESISTANCE, 2), Attr(ADD_DEX ,6), Attr(DEFENCE_REVISION, 6), Attr(DEFENCE, 2), Attr(ADD_DEX, 6), Attr(DEFENCE_REVISION, 6), // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Attr(FIRE_ATTACK, 3), Attr(FIRE_RESISTANCE, 3), Attr(ADD_STR, 9), Attr(OFFENCE_REVISION ,9), Attr(MAX_DAMAGE, 6), Attr(OFFENCE_REVISION, 9), Attr(ADD_STR, 9), // <20><><EFBFBD><EFBFBD>
|
||
Attr(POISON_ATTACK, 3), Attr(POISON_RESISTANCE, 3), Attr(ADD_CON, 9), Attr(HP_REGEN_AMOUNT, 9), Attr(MAX_HP, 30), Attr(ADD_CON, 9), Attr(MAX_HP, 3), // <20><><EFBFBD><EFBFBD><DEB6><EFBFBD>
|
||
Attr(COLD_ATTACK, 3), Attr(COLD_RESISTANCE, 3), Attr(ADD_INT, 9), Attr(MP_REGEN_AMOUNT, 9), Attr(MAX_MP, 30), Attr(MAX_MP, 9), Attr(ADD_INT, 9), // <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD>
|
||
Attr(LIGHTNING_ATTACK, 3), Attr(LIGHTNING_RESISTANCE, 3), Attr(ADD_WIS ,9), Attr(MAGIC_RESISTANCE, 9), Attr(CRITICAL_PERCENTAGE, 3), Attr(CRITICAL_PERCENTAGE, 6), Attr(MAGIC_RESISTANCE, 9), // <20><><EFBFBD>̾Ƹ<CCBE><C6B8><EFBFBD>
|
||
Attr(DRAIN_ATTACK, 3), Attr(DRAIN_RESISTANCE, 3), Attr(ADD_DEX ,9), Attr(DEFENCE_REVISION, 9), Attr(DEFENCE, 3), Attr(ADD_DEX, 9), Attr(DEFENCE_REVISION, 9), // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
};
|
||
|
||
Item::ItemAttribute CItemType::GetInstallGemAttribute(unsigned char cGemType, unsigned char cEquipType, bool bPlus)
|
||
{
|
||
const unsigned char NON_EQUIP_TYPE_INDEX = 0xFF;
|
||
|
||
unsigned char cEquipTypeIndex = NON_EQUIP_TYPE_INDEX;
|
||
|
||
if(CItemType::GetInstance().IsCorrectItemType(WEAPON_TYPE, cEquipType))
|
||
{
|
||
cEquipType = 0 + (bPlus ? 5 : 0);
|
||
}
|
||
else
|
||
{
|
||
switch (cEquipType)
|
||
{
|
||
case ARMOUR: case BODY: cEquipType = 1 + (bPlus ? 5 : 0); break; // <20>Ƹ<EFBFBD>
|
||
case HELM: case HEAD: cEquipType = 2; break; // <20><><EFBFBD><EFBFBD>
|
||
case RING: case ACCESSORY: cEquipType = 3; break; // <20><><EFBFBD><EFBFBD>
|
||
case NECKLACE: cEquipType = 4; break; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
}
|
||
}
|
||
|
||
return (NON_EQUIP_TYPE_INDEX != cEquipType) ?
|
||
GemInstallTable[cGemType][cEquipType] : Item::ItemAttribute();
|
||
}
|
||
|
||
|
||
unsigned short UpgradeTable[15][3] =
|
||
{
|
||
//Ȯ<><C8AE> <09>䱸 <20><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
75, 2001, 3, // <20>Ǻ<EFBFBD>
|
||
66, 2001, 6, // <20>Ǻ<EFBFBD>
|
||
54, 2001, 9, // <20>Ǻ<EFBFBD>
|
||
44, 2001, 12, // <20>Ǻ<EFBFBD>
|
||
|
||
35, 2002, 3, // <20>̽<EFBFBD><CCBD><EFBFBD>
|
||
28, 2002, 6, // <20>̽<EFBFBD><CCBD><EFBFBD>
|
||
23, 2002, 9, // <20>̽<EFBFBD><CCBD><EFBFBD>
|
||
18, 2002, 12, // <20>̽<EFBFBD><CCBD><EFBFBD>
|
||
|
||
15, 2003, 3, // <20><><EFBFBD>ʹϿ<CDB4>
|
||
13, 2003, 6, // <20><><EFBFBD>ʹϿ<CDB4>
|
||
11, 2003, 9, // <20><><EFBFBD>ʹϿ<CDB4>
|
||
9, 2003, 12, // <20><><EFBFBD>ʹϿ<CDB4>
|
||
|
||
8, 2004, 3, // <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD>
|
||
7, 2004, 6, // <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD>
|
||
6, 2004, 9 // <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD>
|
||
};
|
||
|
||
unsigned char CItemType::GetUpgradeItemAttribute(unsigned char EquipType, Item::ItemAttribute& Attribute)
|
||
{
|
||
/* FIXME :
|
||
if (IsWeapon(EquipType))
|
||
{
|
||
Attribute[0].m_nAttributeType = Attribute::MIN_DAMAGE; // <20>ּ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ
|
||
Attribute[0].m_nValue = 3;
|
||
|
||
Attribute[1].m_nAttributeType = Attribute::MAX_DAMAGE; // <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ
|
||
Attribute[1].m_nValue = 3;
|
||
|
||
return 2;
|
||
}
|
||
else if (IsArmour(EquipType))
|
||
{
|
||
Attribute[0].m_nAttributeType = Attribute::DEFENCE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ
|
||
Attribute[0].m_nValue = 3;
|
||
|
||
return 1;
|
||
}
|
||
*/
|
||
|
||
return 0;
|
||
}
|
||
|