Files
LGram16 dd97ddec92 Restructure repository to include all source folders
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>
2025-11-29 20:17:20 +09:00

538 lines
13 KiB
C++

#ifndef _ITEM_CONSTANTS_H_
#define _ITEM_CONSTANTS_H_
#include <vector>
#include <Utility/TypeArray.h>
namespace Item
{
// 전방 참조
struct ItemInfo;
struct ItemAttribute;
class CItem;
enum Const
{
MAX_GEM_KIND = 14, // 보석의 종류
MAX_LEVEL_OPTION_UPGRADE = 5, // 제련시 옵션이 증가하는 최대 레벨 (이후 레벨에선 소켓이 증가한다.)
MAX_OPTION_BASE_NUM = 6, // 한 아이템에 붙은 수 있는 +의 최대 갯수
GEMETYPE_RUNE = 5, // 5레벨이 룬타입의 젬이다
GEMETYPE_RUNE_NUM = 12, // 젬타입의 룬은 총 12개이다 현재 3개 사용
MAX_TEMP_INVEN_ITEM_NUM = 20, // 임시 인벤토리에 넣을 수 있는 최대 아이템 갯수
PRICE_AGGRAVATION = 7, // 리밸런싱 전 아이템에 대한 가격 가중치
GM_MODEL_ITEM = 49999, // GM 모델로 쓰는 아이템 아이디.
MAX_UPGRADE_COUNT = 1, // 고대의 돌 연속 업그래이드 수.
};
namespace ItemType
{
// 아이템 타입 ( 8bit )
enum Type
{
NONE = 0,
// 비기능성 장비
SHIRT = 1, TUNIC = 2,
// 인간 방어구
CON_ARMOUR = 3, CON_HELM = 4,
CON_GLOVE = 5, CON_BOOTS = 6,
DEX_ARMOUR = 7, DEX_HELM = 8,
DEX_GLOVE = 9, DEX_BOOTS = 10,
// 인간 무기
ONEHANDED_SWORD = 11, TWOHANDED_SWORD = 12,
ONEHANDED_AXE = 13, TWOHANDED_AXE = 14,
ONEHANDED_BLUNT = 15, TWOHANDED_BLUNT = 16,
BOW = 17, CROSSBOW = 18,
STAFF = 19, DAGGER = 20,
SHIELD = 21,
// 아칸 방어구
CON_BODY = 22, CON_HEAD = 23,
CON_PELVIS = 24, CON_PROTECT_A = 25,
DEX_BODY = 26, DEX_HEAD = 27,
DEX_PELVIS = 28, DEX_PROTECT_A = 29,
// 아칸 무기
COM_BLUNT = 30, COM_SWORD = 31,
OPP_HAMMER = 32, OPP_AXE = 33,
OPP_SLUSHER = 34, OPP_TALON = 35,
OPP_SYTHE = 36,
// 스킬암
SKILL_A_GUARD = 37, SKILL_A_ATTACK = 38,
SKILL_A_GUN = 39, SKILL_A_KNIFE = 40,
// 탄약류
ARROW = 41, BOLT = 42,
AMMO = 43,
// 사용 아이템
POTION = 44, EXP_BOOK = 45,
CASH_BOOK = 46, EVENT_LOTTERY = 47,
PORTAL = 48, FIRE_CRACKER = 49,
SKILL_BOOK = 50, FIXED_PORTAL = 51,
SKILL_ITEM = 52, CASH_ITEM = 53,
// 사용 불가 아이템
GEM = 54, ORE = 55,
ETC = 56,
// 공성용 스타터킷
CAMP_KIT = 57, SHORT_RANGE_ARMS_KIT = 58,
LONG_RANGE_ARMS_KIT = 59, AIRSHIP_KIT = 60,
WORLDWEAPON_K_KIT = 61, WORLDWEAPON_M_KIT = 62,
MINERAL_KIT = 63,
// 아이템 퀘스트용 아이템
QUEST_ITEM = 64,
// 악세사리 아이템
NECKLACE = 65, RING = 66,
RUNE = 67,
// 판매 전용 추가 아이템(구매/판매가 동일. 2006-06-19 by hackermz)
GEM_SELL = 68,
// 라이더
RIDE = 69, TRANSFORM = 70,
MAX_ITEM_TYPE = 71,
};
};
// 아이템 장착 제한
namespace StatusLimit
{
enum Type
{
NONE = 0,
STR = 1,
DEX = 2,
CON = 3,
INT = 4,
WIS = 5,
LEVEL = 6,
MAX_STATUS_LIMIT = 7
};
};
namespace Attribute
{
enum Type
{
// ---------------------------------------------------------------------------
// 이 곳의 속성은 DB에 저장되는 값으로 수정시에 DB 컨버팅이 필요합니다.
NONE = 0,
MIN_DAMAGE = 1,
MAX_DAMAGE = 2,
ARMOR = 3,
HIT_RATE = 4,
EVADE = 5,
MAX_HP = 6,
HP_REGEN = 7,
MAX_MP = 8,
MP_REGEN = 9,
CRITICAL = 10,
BLOCK = 11,
SPEED = 12,
MAGIC_POWER = 13,
MAGIC_RESIST = 14,
LUCKCHANCE = 15,
MAX_DB_ATTRIBUTE_NUM = 16,
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
// 이후 추가 속성은 DB에 저장되지 않습니다. (랜덤 옵션이 붙을 수 없습니다.)
COOLDOWN = 16,
SKILL_POINT = 17,
FROST = 18,
FIRE = 19,
ELECTRO = 20,
DARKNESS = 21,
RUNTYPE = 22,
MAX_ATTRIBUTE_NUM = 22
// ---------------------------------------------------------------------------
};
enum Trend
{
Aggressive = (1 << 0),
Defensive = (1 << 1)
};
enum CriticalType
{
NONE_TYPE = 0,
SWORD_TYPE = 1,
AXE_TYPE = 2,
BLUNT_TYPE = 3
};
extern const CTypeName Attributes[MAX_ATTRIBUTE_NUM];
};
namespace EquipType
{
enum Type
{
ARMOR_TYPE = 0, // 값옷
DAGGER_TYPE = 1, // 단검
ONEHANDED_WEAPON_TYPE = 2, // 한손무기
LONGRANGE_WEAPON_TYPE = 3, // 장거리무기
TWOHANDED_WEAPON_TYPE = 4, // 양손무기류
STAFF_TYPE = 5, // 스태프
SHIELD_TYPE = 6, // 방패
MAX_TYPE = 7
};
enum Grade
{
S_GRADE = 0,
AAA_GRADE = 1,
AA_GRADE = 2,
A_GRADE = 3,
B_GRADE = 4,
C_GRADE = 5,
D_GRADE = 6,
F_GRADE = 7,
X_GRADE = 8,
MAX_GRADE = 9
};
enum OptionType
{
NONE = 0,
STANDARD_OPTION = 1,
OVER_OPTION = 2,
NO_OPTION = 3,
MAX_OPTION_TYPE = 4
};
};
namespace EquipmentPos
{
// 장비 위치 ( 8bit )
enum Type
{
// 인간 장비 위치
HELM = 0, SHIRT = 1,
TUNIC = 2, ARMOUR = 3,
GLOVE = 4, BOOTS = 5,
NECKLACE = 6, RINGR = 7,
RINGL = 8, SHIELD_HAND1 = 9,
SHIELD_HAND2 = 10, WEAPON_HAND1 = 11,
WEAPON_HAND2 = 12, AVATA = 13,
// 아칸 장비 위치
HEAD = 0, BODY = 3,
PROTECT_ARM = 4, PELVIS = 5,
SKILL_ARM = 9, WEAPON = 11,
MAX_EQUPMENT_POS = 15,
TEMP_ITEM_INDEX = 128
};
};
namespace ExtraSpacePos
{
enum Type
{
// --------------------------------------------------------------------------
// 2004-07-14 by 로딘
//
// Extra의 DB 크기는 현재 사용량은 최대 494 / 508 bytes
// ( DB 크기를 초과하지 않도록 주의합시다. )
//
// 참고 자료 : 잡템의 크기는 14 bytes,
// 장비의 최대 크기는 52 bytes
// ( 풀옵션일때... 14(기본) + 6(장비) + 8(보석) + 24(옵션) )
// --------------------------------------------------------------------------
UPGRADE_EQUIPMENT_POS = 0, // 제련 장비
UPGRADE_MATERIAL_POS = 1, // 제련 광물
HOLDITEM_POS = 2, // 들고 있는 아이템
KIT_MATERIAL_POS = 3, // 공성병기 제작 자재
CAMP_MATERIAL_POS = 4, // 길드 요새 제작 자재 (사용 안함)
EMBLEM_JEWEL_POS1 = 5, // 상징물 업그레이드 보석 (사용 안함)
EMBLEM_JEWEL_POS2 = 6, // (사용 안함)
EMBLEM_JEWEL_POS3 = 7, // (사용 안함)
EMBLEM_JEWEL_POS4 = 8, // (사용 안함)
EMBLEM_JEWEL_POS5 = 9, // (사용 안함)
EMBLEM_JEWEL_POS6 = 10, // (사용 안함)
EMBLEM_JEWEL_POS7 = 11, // (사용 안함)
EMBLEM_JEWEL_POS8 = 12, // (사용 안함)
EMBLEM_JEWEL_POS9 = 13, // (사용 안함)
GRAFT_ORIGINAL_POS = 14, // 옵션 이식 원본 장비
GRAFT_SACRIFICE_POS = 15, // 옵션 이식 제물 장비
GRAFT_RESULT_POS = 16, // 옵션 이식 결과 장비
COMPENSATION_POS = 17, // 보상 판매 대상
MAX_EXTRA_SPACE_NUM = 18,
EMBLEM_JEWEL_POS_NUM = 9
};
};
namespace GiveItem
{
enum ExceptionUID : unsigned __int64
{
// 쿠폰으로 아이템 지급시 임시 인벤토리가 꽉찬 상태라면 지급을 펜딩한다. 이 때, 사용되는 예외 UID
PENDING_ITEM_UID = 0xFFFFFFFFFFFFFFFF
};
};
namespace EtcItemID
{
enum Type
{
// 보석 아이템 ID
GEM_START_ID = 1901,
GEM_END_ID = 1942,
GEM_PERFECTEND_ID = 1956,
GEM_RUNE_START_ID = 1957, // 보석속성인데 매찬올려주는 아이템(룬보석이라고 불림)
GEM_RUNE_END_ID = 1968,
GEM_UNSOCKET_ID = 1970,
GEM_MAXSOCKET_ID = 1971,
// 룬 아이템 ID
RUNE_START_ID = 40000, // 시작 아이디는 아이템에 추가될 수 없음 (고로 소멸의 룬 ID와 같은 것이 베스트!)
RUNE_END_ID = 44096,
// 소멸의 룬 ID
DESTRUCTION_RUNE = 40000,
// 광물 아이템 ID
MINERAL_START_ID = 2001,
MINERAL_END_ID = 2003,
SILVIN = 2001,
MITHRIL = 2002,
ITERNIUM = 2003,
SOULMETAL = 2004,
ANTONIUM = 2005,
ANCIENTMETAL = 2006,
ENDURANCESTONE = 2007,
AWAKENCORE = 2008, // 각성의 코어 (시즌레코드3으로 변경되고 장비착용시 착용레벨-5 효과)
// 고철 ID
SCRAPS = 2101,
// 회복약 아이템 ID
BREAD = 3020,
RARE_STEAK = 3021,
WELLDONE_STEAK = 3022,
BACON = 3023,
// 만나
MANNA1 = 3024,
MANNA2 = 3025,
MANNA3 = 3026,
MANNA4 = 3027,
// 스프
SOUP1 = 3028,
SOUP2 = 3029,
SOUP3 = 3030,
SOUP4 = 3031,
// 버프포션시작아이디 + 3까지가 레벨로 증가하는 포션아이디
POTION1 = 3105,
POTION2 = 3109,
POTION3 = 3113,
POTION4 = 3117,
POTION5 = 3121,
POTION6 = 3153,
POTION7 = 3157,
POTION8 = 3161,
POTION9 = 3165,
POTION10 = 3169,
POTION11 = 3176,
POTION12 = 3180,
POTION13 = 3184,
POTION14 = 3188,
// POTION15 = 3192, // HP, MP
// 스킬북 쿠폰 ID
SKILL_COUPON_3 = 3401,
SKILL_COUPON_4 = 3402,
// 공성 관련 스타트킷 ID
CAMP_KIT_ID = 7100,
SHORT_RANGE_ARMS_KIT_ID = 7101,
LONG_RANGE_ARMS_KIT_ID = 7102,
AIRSHIP_KIT_ID = 7103,
WORLDWEAPON_K_KIT = 7105,
WORLDWEAPON_M_KIT = 7106,
MINERAL_KIT = 7107,
// 공성 관련 자재 ID
SIEGE_MATERIAL_ID = 7104,
// 캐쉬템 정보
// 망각의돌 ID
OBLIVION_STONE = 9914,
ORB_EXP = 9101,
ORB_LUCK = 9102,
CASHPOTION1 = 9001,
CASHPOTION2 = 9003,
CASHPOTION3 = 9007,
CASHPOTION4 = 9009,
CASHPOTION5 = 9011,
CASHPOTION6 = 9013,
CASHPOTION7 = 9015,
CASHPOTION8 = 9017,
CASHPOTION9 = 9019,
CASHPOTION10 = 9021,
CASHPOTION11 = 9023,
CASHPOTION12 = 9025,
CASHPOTION13 = 9027,
CASHPOTION14 = 9029,
// CASHPOTION15 = 9005,
RIDEH1 = 9104,
RIDEH2 = 9106,
RIDEA1 = 9105,
RIDEA2 = 9107,
// 부활의돌 ID
REBIRTH_STONE = 9201,
// 계명허가서 ID
RENAME_WARRANT = 9200,
};
};
namespace Chemical
{
// 아이템 합성 결과
enum Result
{
S_SUCCESS = 0, // 성공
F_WRONG_RECIPE = 2, // 올바른 합성법이 아닙니다.
F_NOT_ENOUGH_ITEM = 3, // 합성 아이템의 수가 최소량에 미치지 못합니다.
F_WRONG_RATE = 4, // 대상 아이템의 숫자에 나머지 값이 발생합니다. 합성 비율을 맞춰주시기 바랍니다.
F_NOT_QUEST = 5, // 필요퀘스트를 하지 못했다.
F_NOT_ABILITY = 6, // 해당 어빌리티가 충족하지 않는다.
};
};
namespace Compensation
{
// 클래스별 특수 보상 판매
enum SpeacialCase
{
CASE1 = ItemType::MAX_ITEM_TYPE,
CASE2 = ItemType::MAX_ITEM_TYPE + 1,
CASE3 = ItemType::MAX_ITEM_TYPE + 2,
CASE4 = ItemType::MAX_ITEM_TYPE + 3,
CASE5 = ItemType::MAX_ITEM_TYPE + 4,
CASE6 = ItemType::MAX_ITEM_TYPE + 5,
CASE7 = ItemType::MAX_ITEM_TYPE + 6,
CASE8 = ItemType::MAX_ITEM_TYPE + 7,
CASE9 = ItemType::MAX_ITEM_TYPE + 8,
MAX_CASE = ItemType::MAX_ITEM_TYPE + 9
};
};
class CItemType
{
public:
enum ArrayType
{
EQUIP_TYPE = 0, // 장비타입
USE_ITEM_TYPE = 1, // 아이템 타입
WEAPON_TYPE = 2, // 웨폰타입
SKILL_ARM_TYPE = 3,
HELM_TYPE = 4, // 투구
ARMOUR_TYPE = 5, // 갑옷
DAGGER_TYPE = 6, // 단검
ONEHANDED_TYPE = 7, // 한손무기
LONGRANGE_TYPE = 8, // 장거리무기
TWOHANDED_TYPE = 9, // 양손무기
STAFF_TYPE = 10, // 스태프
SHIELD_TYPE = 11, // 방패
STANDARD_TYPE = 12,
OVER_TYPE = 13,
NO_TYPE = 14,
ACCESSORY_TYPE = 15,
AVATA_TYPE = 16,
MAX_ARRAY_TYPE = 17
};
typedef std::vector<ItemAttribute> ItemAttributeArray;
static CItemType& GetInstance();
// 정적 멤버 함수
static ArrayType GetEquipType(unsigned long dwItemFlag);
// Rodin : 이 함수들은 CEquipment의 멤버 함수가 되는게 좋을 듯? (그러면서 CEquipment의 friend도 제거!)
static void SetInstallGemAttribute(CItem* lpItem);
static void SetUpgradeItemAttribute(CItem* lpItem);
// 멤버 함수
bool IsCorrectItemType(ArrayType itemType, unsigned char cEquipType);
bool IsCorrectOptionType(EquipType::OptionType eOptionType, ItemType::Type eItemType);
EquipType::OptionType GetOptionType(ItemType::Type eItemType);
void SetEquipTypeFlags(ItemInfo& itemInfo);
void SetAccessoryTypeFlags(ItemInfo& itemInfo);
void SetAvataTypeFlags(ItemInfo& itemInfo);
void SetUseItemTypeFlags(ItemInfo& itemInfo);
void SetEtcItemTypeFlags(ItemInfo& itemInfo);
CTypeName* GetItemTypeName(void) { return m_ItemTypeNames; }
CTypeName* GetItemLimitName(void) { return m_ItemLimitNames; }
CTypeName* GetItemGradeName(void) { return m_ItemGradeNames; }
private:
CItemType();
typedef std::vector<ItemType::Type> ItemTypeArray;
ItemTypeArray m_ItemTypes[MAX_ARRAY_TYPE];
CTypeName m_ItemTypeNames[ItemType::MAX_ITEM_TYPE];
CTypeName m_ItemLimitNames[StatusLimit::MAX_STATUS_LIMIT];
CTypeName m_ItemGradeNames[EquipType::MAX_GRADE];
};
};
#endif