#ifndef _CREATURE_STRUCTURE_H_ #define _CREATURE_STRUCTURE_H_ #include #include #include #include // Àü¹æ ÂüÁ¶ struct CreatureStatus; struct CharacterStatus; struct SKILL; namespace Item { class CItem; class CEquipment; namespace EquipType { enum DoubleSwordType; } } namespace BattleInclination { enum Const { IS_PEACEMODE = ( 1 << 0 ), // ÆòÈ­¸ðµåÀÎ °æ¿ì ¼¼ÆÃ IS_SAFETY_ZONE = ( 1 << 1 ), // ¼¼ÀÌÇÁƼ Á¸ ³»ºÎ¿¡ ÀÖ´Â °æ¿ì ¼¼ÆÃ HAS_CAMP = ( 1 << 2 ), // ±æµå ¿ä»õ¸¦ °¡Áø ±æµå¿¡ ¼ÓÇØ ÀÖÀ» °æ¿ì ¼¼ÆÃ HAS_DEVELOPING_CAMP = ( 1 << 3 ), // °Ç¼³ÁßÀÎ ±æµå ¿ä»õ¸¦ °¡Áø ±æµå¿¡ ¼ÓÇØ ÀÖÀ» °æ¿ì ¼¼ÆÃ IS_CASTLE_OBJECT = ( 1 << 4 ), // °ø¼º ObjectÀ̸鼭 ¼ö¼ºº´±âÀÎ °æ¿ì¸¸ ¼¼ÆÃ IS_CASTLE_NPC = ( 1 << 5 ), // °ø¼º ObjectÀ̸鼭 ¼ö¼º º´±âÀÇ º´±â °ü¸® NPC ¿Í µÞ¹® NPC IS_GOD_MODE = ( 1 << 6 ), // G¸ðµåÀÎ °æ¿ì ¼¼ÆÃ IS_TEAM_BATTLE = ( 1 << 7 ), // ÆÀ¹èƲ ÁßÀÎ °æ¿ì ¼¼ÆÃ }; enum VSType { VS_CHARACTER = ( 1 << 0 ), // PvP VS_PARTY = ( 1 << 1 ), // ÆÄƼ°£ ¹èƲ VS_GUILD = ( 1 << 2 ), // ±æµå°£ ¹èƲ }; // ÇǾƽĺ°½Ã ÁÖü°¡ µÇ´Â ij¸¯ÅÍ Á¤º¸ // ¿©±â¼­ µ¥ÀÌÅÍ Ãß°¡Çϰųª »èÁ¦ÇÏ´Â °æ¿ì, // ºê·Îµåij½ºÆÃ ½Ã, äÆÃ¼­¹ö·Î µ¥ÀÌÅÍ Àü¼ÛÇÏ´Â ºÎºÐµµ ¼öÁ¤ÇؾßÇÑ´Ù. struct CharData { bool IsPeaceMode(void) const { return 0 != (m_cFlags & IS_PEACEMODE); } // ÆòÈ­¸ðµåÀÎ °æ¿ì bool IsSafetyZone(void) const { return 0 != (m_cFlags & IS_SAFETY_ZONE); } // ³»°¡ SafetyÁ¸ ³»ºÎ¿¡ ÀÖ´ÂÁö bool HasCamp(void) const { return 0 != (m_cFlags & HAS_CAMP); } // ¼ÓÇÑ ±æµå°¡ ±æµå ¿ä»õ¸¦ °¡Áö°í ÀÖ´ÂÁö... bool HasDevelopingCamp(void) const { return 0 != (m_cFlags & HAS_DEVELOPING_CAMP); } // ¼ÓÇÑ ±æµå°¡ ±æµå ¿ä»õ¸¦ °Ç¼³ÁßÀÎÁö... bool IsCastleObject(void) const { return 0 != (m_cFlags & IS_CASTLE_OBJECT); } // °ø¼ºº´±âÀÎ °æ¿ì, ¼ö¼ºº´±âÀÎÁö... bool IsCastleNPC(void) const { return 0 != (m_cFlags & IS_CASTLE_NPC); } // ¼ö¼º NPC ÀÎ °æ¿ì bool IsGODMode(void) const { return 0 != (m_cFlags & IS_GOD_MODE); } // G¸ðµåÀÎ °æ¿ì bool IsTeamBattle(void) const { return 0 != (m_cFlags & IS_TEAM_BATTLE); } // ÆÀ¹èƲ ÁßÀÎ °æ¿ì void SetPeaceMode(bool bPeaceMode) { m_cFlags |= bPeaceMode ? IS_PEACEMODE : 0; } void SetSafetyZone(bool bInSafetyZone) { m_cFlags |= bInSafetyZone ? IS_SAFETY_ZONE : 0; } void SetHasCamp(bool bHasCamp) { m_cFlags |= bHasCamp ? HAS_CAMP : 0; } void SetHasDevelopingCamp(bool bHasDevelopingCamp) { m_cFlags |= bHasDevelopingCamp ? HAS_DEVELOPING_CAMP : 0; } void SetCastleObject(bool bCastleObject) { m_cFlags |= bCastleObject ? IS_CASTLE_OBJECT : 0; } void SetCastleNPC(bool bCastleNPC) { m_cFlags |= bCastleNPC ? IS_CASTLE_NPC : 0; } void SetGODMode(bool bGODMode) { m_cFlags |= bGODMode ? IS_GOD_MODE : 0; } void SetTeamBattle(bool bTeamBattle) { m_cFlags |= bTeamBattle ? IS_TEAM_BATTLE : 0; } unsigned long m_dwCID; // ij¸¯ÅÍ CID unsigned long m_dwGID; // ij¸¯ÅÍ GID unsigned long m_dwCastleID; // °ø¼º º´±âÀÎ °æ¿ì, ¼ÓÇÑ ¼ºÀÇ ID¸¦ ³Ö´Â´Ù. unsigned char m_cSiegeState; // °ø¼º º´±âÀÎ °æ¿ì, °ø¼º º´±â »óŸ¦ ³Ö´Â´Ù. unsigned char m_cNation; // ij¸¯ÅÍ ±¹Àû unsigned char m_cAdminLevel; // ¿î¿µÀÚ ·¹º§ unsigned char m_cFlags; // ±âŸ Á¤º¸ unsigned long m_dwPID; // ij¸¯ÅÍ¿¡ ÆÄƼ Á¤º¸ unsigned char m_cTacticsFlag; // ij¸¯ÅÍ¿¡ ¿ëº´ Á¤º¸ unsigned char m_cRealmWarFlag; unsigned char m_cGuildWarFlag; unsigned char m_cCreatureType; // Å©¸®ÃÄ Å¸ÀÔ unsigned short m_wObjectType; // ½ºÆ®·°ÃÄ Á¤º¸ unsigned short m_wKind; // ½ºÆ®·°ÃÄ Á¾·ù unsigned char m_cRide; // º´±â¿¡ ž½Â ¿©ºÎ. }; // ÇǾƽĺ°½Ã ¾²À̴ ij¸¯ÅͰ£ÀÇ °ü°è (ÀÏ´ÜÀº äÆÃ ¼­¹ö±îÁø °¥ ÇÊ¿ä ¾ø´Â Á¤º¸·Î ±¸¼º) struct RelationData { unsigned char m_cVSFlag; // PvP, ÆÀ¹èƲ Á¤º¸ bool m_bHostileGuild; // Àû´ë ±æµåÀΰ¡? }; }; namespace Creature { enum Const { PC_MAX_LEVEL = 100, // ij¸¯ÅÍ ÃÖ´ë ·¹º§ MONSTER_MAX_LEVEL = 150, // ¸ó½ºÅÍ ÃÖ´ë ·¹º§ // edith 2008.02.27 ±æµå°¡ÀÔ ·¹º§ Á¦ÇÑ Á¦°Å LEVEL_ABLE_WAR = 1 // ÀüÀïÀÌ °¡´ÉÇÑ ÃÖ¼Ò ·¹º§ (±æµå °¡ÀÔ/ÀüÀï ¸ðµå Á¦ÇÑ) }; enum IdentifyCIDBit { MONSTER_KIND_BIT = 0x0000FFFF, MONSTER_BIT = 0x80000000, NPC_BIT = 0x40000000, SIEGE_OBJECT_BIT = 0x10000000, SUMMON_MONSTER_BIT = 0xA0000000, // MONSTER_BIT (0x80000000) + 0x20000000 NPC_LINK_BIT = 0x50000000, // ¼Òȯ ¿Ï·áµÈ ¼®»óÀÇ °æ¿ì ÀÌ ºñÆ®°¡ ¼¼Æ®µÈ NPC¿Í ¸µÅ©µÇ¾î ¸Þ´Þ»óÁ¡ÀÇ ¿ªÇÒÀ» ÇÑ´Ù. // NPC_BIT (0x40000000) + 0x10000000 // ¼®»ó KID (MonsterStructure.h ¿¡µµ Á¤ÀǵǾî ÀÖÀ½) MIN_STATUE_KID = 4001, MAX_STATUE_KID = 4070 }; enum CreatureType { CT_PC = 0, CT_NPC = 1, CT_MONSTER = 2, CT_SUMMON = 3, CT_STRUCT = 4, CT_SIEGE_OBJECT = 5, CT_NONE_TYPE = 99 }; enum Nation { STATELESS = 0, // ¹«±¹Àû (¸ó½ºÅÍ, NPC) KARTERANT = 1, // Ä«¸£Å×¶õÆ® MERKADIA = 2, // ¸Þ¸£Ä«µð¾Æ ALMIGHTY_PIRATE = 3, // ½ÅÀÇÇØÀû´Ü MAX_NATION = 4 }; enum WarFlag { WAR_OFF = 0, // ÀüÀï Âü¿© ¾ÈÇÔ WAR_ON = 1, // ÀüÀï Âü¿© WAR_INSTANCE = 2 // ÀνºÅϽº ÀüÀï Âü¿© }; enum StatusType { RIGHT_PASSIVE_TYPE = 0, // ÆÐ½Ãºê ½ºÅ³ÀÌ Àû¿ëµÈ ¿À¸¥¼Õ Àåºñ ½ºÅÈ (±âº»°ªÀ¸·Î CreatureStatus¿¡ ¹Ù·Î »ç¿ëµÈ´Ù.) LEFT_PASSIVE_TYPE = 1, // ÆÐ½Ãºê ½ºÅ³ÀÌ Àû¿ëµÈ ¿Þ¼Õ Àåºñ ½ºÅÈ (À̵µ·ù) RIGHT_NON_PASSIVE_TYPE = 2, // ÆÐ½Ãºê ½ºÅ³ÀÌ Àû¿ëµÇÁö ¾ÊÀº ¿À¸¥¼Õ Àåºñ ½ºÅÈ (¿À¸¥¼Õ ¹«±â¸¦ »ç¿ëÇÏ´Â ½ºÅ³) LEFT_NON_PASSIVE_TYPE = 3, // ÆÐ½Ãºê ½ºÅ³ÀÌ Àû¿ëµÇÁö ¾ÊÀº ¿Þ¼Õ Àåºñ ½ºÅÈ (¿Þ¼Õ ¹«±â(½ºÅ³¾Ï)¸¦ »ç¿ëÇÏ´Â ½ºÅ³) MAX_STATUS_TYPE = 4 }; // ¼­¹ö¿¡¼­ »ç¿ëÇÏ´Â Creature ÆÇº° ÇÔ¼öµé // Ŭ¶óÀÌ¾ðÆ®¿¡¼­´Â CRYLGameData::GetClientIdentity() ÇÔ¼ö »ç¿ë!! static bool IsSummonMonster(unsigned long dwCID) { return (Creature::SUMMON_MONSTER_BIT == (dwCID & Creature::SUMMON_MONSTER_BIT)); } static bool IsStruct(unsigned long dwCID) { unsigned short wKID = static_cast(dwCID & Creature::MONSTER_KIND_BIT); return (wKID >= MIN_STATUE_KID && wKID <= MAX_STATUE_KID); } static bool IsLinkedNPC(unsigned long dwCID) { return (Creature::NPC_LINK_BIT == (dwCID & Creature::NPC_LINK_BIT)); } static CreatureType GetCreatureType(unsigned long dwCID) { if (dwCID & Creature::MONSTER_BIT) { if (IsSummonMonster(dwCID)) return Creature::CT_SUMMON; else if (IsStruct(dwCID)) return Creature::CT_STRUCT; return Creature::CT_MONSTER; } else if (dwCID & Creature::NPC_BIT) return Creature::CT_NPC; else if (dwCID & Creature::SIEGE_OBJECT_BIT) return Creature::CT_SIEGE_OBJECT; return Creature::CT_PC; } inline static const char* GetNationName(unsigned char cNation) { switch(cNation) { case KARTERANT: return "KARTERANT"; case MERKADIA: return "MERKADIA"; case ALMIGHTY_PIRATE: return "ALMIGHTY_PIRATE"; } return "STATELESS"; } inline static const char* GetShortNationName(unsigned char cNation) { switch(cNation) { case KARTERANT: return "KR"; case MERKADIA: return "ME"; case ALMIGHTY_PIRATE: return "AP"; } return "ST"; } }; // ¿¤¸®Æ® º¸³Ê½º Á¤º¸ namespace EliteBonus { enum Const { MAX_BONUS_LEVEL = 10, MAX_BONUS_DROP_ITEM = 3 }; // ¿¤¸®Æ® º¸³Ê½º¿¡ ÀÇÇÑ °æÇèÄ¡/µå¶ø·ü º¸³Ê½º°¡ Á¦°ÅµÇ¾ú½À´Ï´Ù. (2004-09-17 by ·Îµò) static short usBonusExp[MAX_BONUS_LEVEL] = { 100 + 0, 100 + 0, 100 + 0, 100 + 0, 100 + 0, 100 + 0, 100 + 0, 100 + 0, 100 + 0, 100 + 0 }; static unsigned char usBonusItemDropRate[MAX_BONUS_LEVEL][MAX_BONUS_DROP_ITEM] = { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }; struct EliteBonusData { char m_cNation; unsigned char m_cLevel; EliteBonusData(); EliteBonusData(char cNation, unsigned char cLevel); }; } // ¸Ê À̵¿ Á¤º¸ struct Position { float m_fPointX; // Point X ÁÂÇ¥ float m_fPointY; // Point Y ÁÂÇ¥ float m_fPointZ; // Point Z ÁÂÇ¥ inline Position(); inline Position(const POS& Pos); inline Position(const Position& Pos); inline Position(float fPointX, float fPointY, float fPointZ); inline POS PositionToPOS() const; inline unsigned long GetDistance(const Position& rhs) const { return static_cast(sqrt( (m_fPointX - rhs.m_fPointX) * (m_fPointX - rhs.m_fPointX) + (m_fPointY - rhs.m_fPointY) * (m_fPointY - rhs.m_fPointY) + (m_fPointZ - rhs.m_fPointZ) * (m_fPointZ - rhs.m_fPointZ))); } inline unsigned long GetSquaredDistance(const Position& rhs) const { return static_cast( (m_fPointX - rhs.m_fPointX) * (m_fPointX - rhs.m_fPointX) + (m_fPointY - rhs.m_fPointY) * (m_fPointY - rhs.m_fPointY) + (m_fPointZ - rhs.m_fPointZ) * (m_fPointZ - rhs.m_fPointZ)); } inline bool operator == (const Position& rhs) const { if ( m_fPointX == rhs.m_fPointX && m_fPointY == rhs.m_fPointY && m_fPointZ == rhs.m_fPointZ ) { return true; } return false; } inline bool operator != (const Position& rhs) const { if ( m_fPointX != rhs.m_fPointX || m_fPointY != rhs.m_fPointY || m_fPointZ != rhs.m_fPointZ ) { return true; } return false; } inline void operator () (const Position& rhs) { m_fPointX = rhs.m_fPointX; m_fPointY = rhs.m_fPointY; m_fPointZ = rhs.m_fPointZ; } }; inline Position::Position() : m_fPointX(0.0f), m_fPointY(0.0f), m_fPointZ(0.0f) { } inline Position::Position(const POS& Pos) : m_fPointX(Pos.fPointX), m_fPointY(Pos.fPointY), m_fPointZ(Pos.fPointZ) { } inline Position::Position(const Position& Pos) : m_fPointX(Pos.m_fPointX), m_fPointY(Pos.m_fPointY), m_fPointZ(Pos.m_fPointZ) { } inline Position::Position(float fPointX, float fPointY, float fPointZ) : m_fPointX(fPointX), m_fPointY(fPointY), m_fPointZ(fPointZ) { } inline POS Position::PositionToPOS() const { POS stPos; stPos.fPointX = m_fPointX; stPos.fPointY = m_fPointY; stPos.fPointZ = m_fPointZ; return stPos; } // µ¿ÀÛ Á¤º¸ struct MotionInfo { float m_fDirection; // ¹Ù¶óº¸´Â ¹æÇâ float m_fVelocity; // ¼Óµµ unsigned short m_wAction; // ÃëÇÏ´Â Çൿ unsigned long m_dwFrame; // ¸ð¼Ç ÇÁ·¹ÀÓ ( ¸ó½ºÅÍ, NPC°¡ »ç¿ë ) MotionInfo(); }; // ÀÎæƮ Á¤º¸ struct EnchantInfo { enum { ULONG_BIT = 32, // unsigned long (32¹ÙÀÌÆ®) MAX_ARRAY = 4 // ½ºÆçÀÇ Á¾·ù´Â UCHAR_BIT * MAX_ARRAY }; unsigned long m_dwStatusFlag[MAX_ARRAY]; // æƮ/ÀÎæƮ Ç÷¡±× EnchantInfo(); EnchantInfo( const EnchantInfo& Info ) // ´ëÀÔÀ» À§ÇÑ º¹»ç »ý¼ºÀÚ { for( int i = 0 ; i < MAX_ARRAY ; ++i ) { m_dwStatusFlag[ i ] = Info.m_dwStatusFlag[ i ]; } } void SetFlag(unsigned char cSpellKind); void ResetFlag(unsigned char cSpellKind); void ClearFlag(void); bool GetFlag(unsigned char cSpellKind) const; }; // µ¥¹ÌÁö °è»ê½ÃÀÇ Ãß°¡ È¿°ú Á¤º¸ struct CalculateDamageInfo { bool m_bForceDRC; // 'Âü'ÀÌ¸é ±âº» DRC¸¦ ¹«½ÃÇϰí Ãß°¡ DRC·Î ´ëü float m_fDRC; // Ãß°¡ DRC short m_nOffenceRevision; // Ãß°¡ °ø°Ýº¸Á¤ short m_nMinDamage; // Ãß°¡ ÃÖ¼Òµ¥¹ÌÁö short m_nMaxDamage; // Ãß°¡ ÃÖ´ëµ¥¹ÌÁö CalculateDamageInfo() : m_bForceDRC(false), m_fDRC(0.0f), m_nOffenceRevision(0), m_nMinDamage(0), m_nMaxDamage(0) { } CalculateDamageInfo(bool bForceDRC, float fDRC, short nOffenceRevision, short nMinDamage, short nMaxDamage) : m_bForceDRC(bForceDRC), m_fDRC(fDRC), m_nOffenceRevision(nOffenceRevision), m_nMinDamage(nMinDamage), m_nMaxDamage(nMaxDamage) { } }; typedef CalculateDamageInfo* LPCalculateDamageInfo; // ij¸¯ÅÍ¿¡ ´ëÇÑ ¼Ó¼º struct CharacterStatus { short m_nSTR; // ij¸¯ÅÍ STR short m_nDEX; // ij¸¯ÅÍ DEX short m_nCON; // ij¸¯ÅÍ CON short m_nINT; // ij¸¯ÅÍ INT short m_nWIS; // ij¸¯ÅÍ WIS CharacterStatus(); CharacterStatus(CHAR_INFOST& characterDBData); void Init(CHAR_INFOST& characterDBData); }; typedef CharacterStatus* LPCharacterStatus; struct FightStatus { // °è»ê »óÅ (Áߺ¹ °è»ê ¹æÁö) enum CalculateState { CS_NONE = 0, // ÃʱâÈ­ CS_BASE_INFO = 1, // ±âº» ½ºÅÈÀ¸·Î °è»êÀ» ¿Ï·áÇÑ »óÅ CS_EQUIP_INFO = 2, // Àåºñ È¿°ú¸¦ Ãß°¡ °è»êÇÑ »óÅ CS_ENCHANT_INFO = 3 // ÀÎæƮ È¿°ú¸¦ ¹ÞÀº »óÅ }; enum Const { MAX_INCHANT_HP = 15000, MAX_INCHANT_MP = 15000 }; long m_lMinDamage; // ÃÖ¼Òµ¥¹ÌÁö long m_lMaxDamage; // ÃÖ´ëµ¥¹ÌÁö short m_wArmor; // ¹æ¾î·Â short m_wHitRate; // ¸íÁß short m_wEvade; // ȸÇÇ unsigned short m_nMaxHP; // HP ÃÖ´ë°ª short m_wHPRegen; // HP ȸº¹ unsigned short m_nMaxMP; // MP ÃÖ´ë°ª short m_wMPRegen; // MP ȸº¹ short m_wCritical; // Å©¸®Æ¼Äà short m_wBlock; // ºí·Ï short m_wSpeed; // ¼Óµµ short m_wCoolDownRevision; // Äð´Ù¿îº¸Á¤ short m_wSkillPoint; // ½ºÅ³Æ÷ÀÎÆ® short m_wMagicPower; // ¸¶¹ý·Â short m_wMagicResist; // ¸¶¹ýÀúÇ× int m_wLuck; // Çà¿î°ª //--// start.. short m_wFrost; // ³Ã±â/Á¤Áö ¼Ó¼º short m_wFire; // ºÒ/µ¶ ¼Ó¼º short m_wElectro; // ÀüÁö/Ãæ°Ý ¼Ó¼º short m_wDarkness; // ¾ÏÈæ/ºû ¼Ó¼º //--// end.. float m_fDefenceRate; // ¹æ¾î% float m_fCriticalMagnification; // Å©¸®Æ¼ÄùèÀ² float m_fCriticalRate; // Å©¸®Æ¼ÄÃ% float m_fBlockRate; // ºí·°·ü% float m_fSpeedRate; // ¼Óµµ% float m_fCoolDownRevisionRate; // Äð´Ù¿îº¸Á¤% float m_fMagicResistRate; // ¸¶¹ýÀúÇ×% float m_fLuckResistRate; // ·°Å°Âù½º% float m_fLevelExplosion; // ·¹º§ ÀͽºÇ÷ÎÁ¯ unsigned char m_cCriticalType; // Å©¸®Æ¼Äà ŸÀÔ unsigned char m_cComboCount; // °ø°Ý ÄÞº¸ Ƚ¼ö unsigned char m_cCalculateState; // °è»ê »óÅ FightStatus(); bool CalculateBaseInfo(const CharacterStatus& characterStatus, const unsigned short wLevel, const unsigned char cClass); bool CalculateEquipInfo(const Item::CEquipment** ppEquip, const bool bFirstWeaponSlot, const bool bRightHand, const bool bRideFlag, const SKILL& skill, const unsigned char cLevel, const unsigned short wRiderAbility, const unsigned short wLuckAbility, const unsigned short wLevelAbility, const CharacterStatus& characterStatus, const unsigned char cClass, FightStatus& resultStatus) const; bool CalculateEnchantInfo(const unsigned short* aryEnchantLevel, FightStatus& resultStatus) const; void CalculateSubStatus(void); static bool CheckEquipable(const Item::CEquipment* lpEquip, const CharacterStatus& characterStatus, const unsigned char cClass, const unsigned char cLevel, const unsigned short wLevelAbility); //--// }; #pragma pack(8) //------------------------------------------------------------------------------------ // TODO : memory alignment ÁÖÀÇÇÒ °Í. // : 4byte´ÜÀ§·Î alignment °¡ µÇµµ·Ï ÇÒ °Í. // : ¸Þ¸ð¸® ºÎÁ·½Ã¿¡´Â Å©±â°¡ ¸¹ÀÌ ÇÊ¿ä ¾ø´Â ¸â¹ö´Â shortµîÀ¸·Î ÁÙÀÏ °Í. // ¹«±â³ª µµ±¸¿¡ ÀÇÇØ¼­ ¿µÇâÀ» ¹ÞÀº ´É·ÂÄ¡¸¦ ÀúÀå (°ÔÀÓ»ó¿¡¼­ ¸ðµç °è»êÀº À̰ÍÀ¸·Î ÇÔ) struct CreatureStatus { __int64 m_nExp; // »ç¶÷ÀÎ °æ¿ì´Â ÀÚ½ÅÀÇ °æÇèÁ¡, ¸ó½ºÅÍÀÎ °æ¿ì´Â ³ª´©¾î ÁÙ °æÇèÁ¡ int m_nLevel; // ·¹º§ unsigned short m_nNowHP; // ÇöÀç HP unsigned short m_nNowMP; // ÇöÀç MP (¸ó½ºÅÍÀÇ °æ¿ì´Â ¹«Á¶°Ç ÃÖ´ë°ªÀ¸·Î ÃʱâÈ­) FightStatus m_StatusInfo; // ´ëºÎºÐÀÇ Á¤º¸°¡ À̰÷¿¡ ÀÖÀ½ CreatureStatus(); CreatureStatus(CHAR_INFOST& characterDBData); void Init(CHAR_INFOST& characterDBData); }; typedef CreatureStatus* LPCreatureStatus; #pragma pack() #endif