#include "stdafx.h" #include "SAutoToolTip.h" #include "ItemEffect.h" #include "SUIDisplayInfo.h" #include namespace rp { bool s_bApplyAutoToolTip = false; // 현재 타이밍에서 S()함수로 DB를 읽어오면 안된다. 아직 파일시스템 추가가 안되었기 때문이다. 2009.12.29 sfreer namespace { const std::string c_strLineFeed = "
"; const std::string c_strLineGap = std::string("") + c_strLineFeed + std::string(""); const std::string c_strAutoToolTip = "@#auto_tooltip#@"; const std::string c_strItemNameDeco = "#@itemname@#"; const std::string c_strLimitLevelDeco = "#@limit_level@#"; const std::string c_strRecommendLevelDeco = "#@recommend_level@#"; const std::string c_strBitsetTextDeco = std::string("#@bitset_text@#") + c_strLineFeed; const std::string c_strWeightDeco = "#@weight@#"; const std::string c_strJobDepth = "#@job_depth@#"; /// 2011.03.30 - prodongi } #define CLASS_STRING( c, s ) m_mapClassString.insert( mapClassString::value_type( (c), (s) ) ); #define OPTION_STRING( o, s ) m_mapOptionString.insert( mapOptionString::value_type( (o), (s) ) ); #define AWAKENINGOPTION_STRING( o, s ) m_mapAwakeningOptionString.insert( mapOptionString::value_type( (o), (s) ) ) CAutoToolTip::CAutoToolTip() { CLASS_STRING( 0, S(7500) ) // 기타 CLASS_STRING( ItemBase::CLASS_ETCWEAPON, S(7501) ) CLASS_STRING( ItemBase::CLASS_ONEHAND_SWORD, S(7502) ) CLASS_STRING( ItemBase::CLASS_TWOHAND_SWORD, S(7503) ) CLASS_STRING( ItemBase::CLASS_DAGGER, S(7504) ) CLASS_STRING( ItemBase::CLASS_TWOHAND_SPEAR, S(7505) ) CLASS_STRING( ItemBase::CLASS_TWOHAND_AXE, S(7506) ) CLASS_STRING( ItemBase::CLASS_ONEHAND_MACE, S(7507) ) CLASS_STRING( ItemBase::CLASS_TWOHAND_MACE, S(7508) ) CLASS_STRING( ItemBase::CLASS_HEAVY_BOW, S(7509) ) CLASS_STRING( ItemBase::CLASS_LIGHT_BOW, S(7510) ) CLASS_STRING( ItemBase::CLASS_CROSSBOW, S(7511) ) CLASS_STRING( ItemBase::CLASS_ONEHAND_STAFF, S(7512) ) CLASS_STRING( ItemBase::CLASS_TWOHAND_STAFF, S(7513) ) CLASS_STRING( ItemBase::CLASS_ONEHAND_AXE, S(7514) ) CLASS_STRING( ItemBase::CLASS_ARMOR, S(7515) ) CLASS_STRING( ItemBase::CLASS_FIGHTER_ARMOR, S(7516) ) CLASS_STRING( ItemBase::CLASS_HUNTER_ARMOR, S(7517) ) CLASS_STRING( ItemBase::CLASS_MAGICIAN_ARMOR, S(7518) ) CLASS_STRING( ItemBase::CLASS_SUMMONER_ARMOR, S(7519) ) CLASS_STRING( ItemBase::CLASS_SHIELD, S(7520) ) CLASS_STRING( ItemBase::CLASS_HELM, S(7521) ) CLASS_STRING( ItemBase::CLASS_HELM + 1, S(7522) ) // 전사투구 CLASS_STRING( ItemBase::CLASS_HELM + 2, S(7523) ) // 헌터투구 CLASS_STRING( ItemBase::CLASS_HELM + 3, S(7524) ) // 법사투구 CLASS_STRING( ItemBase::CLASS_HELM + 4, S(7525) ) // 소환사투구 CLASS_STRING( ItemBase::CLASS_BOOTS, S(7526) ) /// 2011.01.19 - prodongi CLASS_STRING( ItemBase::CLASS_FIGHTER_BOOTS, S(7569) ) CLASS_STRING( ItemBase::CLASS_HUNTER_BOOTS, S(7570) ) CLASS_STRING( ItemBase::CLASS_MAGICIAN_BOOTS, S(7571) ) CLASS_STRING( ItemBase::CLASS_SUMMONER_BOOTS, S(7572) ) CLASS_STRING( ItemBase::CLASS_GLOVE, S(7527) ) /// 2011.01.19 - prodongi CLASS_STRING( ItemBase::CLASS_FIGHTER_GLOVE, S(7573) ) CLASS_STRING( ItemBase::CLASS_HUNTER_GLOVE, S(7574) ) CLASS_STRING( ItemBase::CLASS_MAGICIAN_GLOVE, S(7575) ) CLASS_STRING( ItemBase::CLASS_SUMMONER_GLOVE, S(7576) ) CLASS_STRING( ItemBase::CLASS_BELT, S(7528) ) /// 2011.01.19 - prodongi CLASS_STRING( ItemBase::CLASS_FIGHTER_BELT, S(7577) ) CLASS_STRING( ItemBase::CLASS_HUNTER_BELT, S(7578) ) CLASS_STRING( ItemBase::CLASS_MAGICIAN_BELT, S(7579) ) CLASS_STRING( ItemBase::CLASS_SUMMONER_BELT, S(7580) ) CLASS_STRING( ItemBase::CLASS_MANTLE, S(7529) ) /// 2011.01.19 - prodongi CLASS_STRING( ItemBase::CLASS_FIGHTER_MANTLE, S(7581) ) CLASS_STRING( ItemBase::CLASS_HUNTER_MANTLE, S(7582) ) CLASS_STRING( ItemBase::CLASS_MAGICIAN_MANTLE, S(7583) ) CLASS_STRING( ItemBase::CLASS_SUMMONER_MANTLE, S(7584) ) CLASS_STRING( ItemBase::CLASS_ETC_ACCESSORY, S(7530) ) CLASS_STRING( ItemBase::CLASS_RING, S(7531) ) CLASS_STRING( ItemBase::CLASS_EARRING, S(7532) ) CLASS_STRING( ItemBase::CLASS_ARMULET, S(7533) ) CLASS_STRING( ItemBase::CLASS_EYEGLASS, S(7534) ) CLASS_STRING( ItemBase::CLASS_MASK, S(7535) ) CLASS_STRING( 350, S(7536) ) // 가방이 아이템클래스의 enum에서는 빠져 있다. CLASS_STRING( ItemBase::CLASS_BOOST_CHIP, S(7537) ) CLASS_STRING( ItemBase::CLASS_SOULSTONE, S(7538) ) CLASS_STRING( 500, S(7539) ) // 소모형캐쉬템이 아이템클래스의 enum에서 빠져 있다. CLASS_STRING( 501, S(7540) ) // 소지형캐쉬템이 아이템클래스의 enum에서 빠져 있다. CLASS_STRING( ItemBase::CLASS_USE_CASH_ITEM, S(7541) ) CLASS_STRING( ItemBase::CLASS_DECO_WEAPON, S(7542) ) CLASS_STRING( ItemBase::CLASS_DECO_SHIELD, S(7543) ) CLASS_STRING( ItemBase::CLASS_DECO_ARMOR, S(7544) ) CLASS_STRING( ItemBase::CLASS_DECO_HELM, S(7545) ) CLASS_STRING( ItemBase::CLASS_DECO_GLOVE, S(7546) ) CLASS_STRING( ItemBase::CLASS_DECO_BOOTS, S(7547) ) CLASS_STRING( ItemBase::CLASS_DECO_MALTLE, S(7548) ) CLASS_STRING( ItemBase::CLASS_DECO_SHOULDER, S(7549) ) CLASS_STRING( ItemBase::CLASS_DECO_HAIR, S(7550) ) CLASS_STRING( ItemBase::CLASS_DECO_ONEHAND_SWORD, S(7551) ) CLASS_STRING( ItemBase::CLASS_DECO_TWOHAND_SWORD, S(7552) ) CLASS_STRING( ItemBase::CLASS_DECO_DAGGER, S(7553) ) CLASS_STRING( ItemBase::CLASS_DECO_TWOHAND_SPEAR, S(7554) ) CLASS_STRING( ItemBase::CLASS_DECO_TWOHAND_AXE, S(7555) ) CLASS_STRING( ItemBase::CLASS_DECO_ONEHAND_MACE, S(7556) ) CLASS_STRING( ItemBase::CLASS_DECO_TWOHAND_MACE, S(7557) ) CLASS_STRING( ItemBase::CLASS_DECO_HEAVY_BOW, S(7558) ) CLASS_STRING( ItemBase::CLASS_DECO_LIGHT_BOW, S(7559) ) CLASS_STRING( ItemBase::CLASS_DECO_CROSSBOW, S(7560) ) CLASS_STRING( ItemBase::CLASS_DECO_ONEHAND_STAFF, S(7561) ) CLASS_STRING( ItemBase::CLASS_DECO_TWOHAND_STAFF, S(7562) ) CLASS_STRING( ItemBase::CLASS_DECO_ONEHAND_AXE, S(7563) ) CLASS_STRING( 700, S(7564) ) // 속성이펙트 CLASS_STRING( 701, S(7565) ) // 속성이펙트 공격력 강화 CLASS_STRING( 702, S(7566) ) // 속성이펙트 마력 강화 CLASS_STRING( 703, S(7567) ) // 양손용 속성이펙트 공격력 강화 CLASS_STRING( 704, S(7568) ) // 양손용 속성이펙트 마력 강화 OPTION_STRING( ITEM_EFFECT_PASSIVE::ATTACK_POINT, S(8002) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::MAGIC_POINT, S(8003) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::ACCURACY, S(8004) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::ATTACK_SPEED, S(8005) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::DEFENCE, S(8006) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::MAGIC_DEFENCE, S(8007) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::AVOID, S(8008) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::MOVE_SPEED, S(8009) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::BLOCK_CHANGE, S(8010) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::CARRY_WEIGHT, S(8011) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::BLOCK_DEFENCE, S(8012) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::CASTING_SPEED, S(8013) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::MAGIC_ACCURACY, S(8014) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::MAGIC_AVOID, S(8015) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::COOLTIME_SPEED, S(8016) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::BELT_SLOT, S(8017) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::MAX_HP, S(8018) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::MAX_MP, S(8019) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::MP_REGEN_POINT, S(8020) ) OPTION_STRING( ITEM_EFFECT_CHARM::INC_MAX_STAMINA, S(8021) ) /// 2011.03.30 - prodongi OPTION_STRING( ITEM_EFFECT_PASSIVE::PBLOCK_CHANCE, S(7238) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::ADEF_IGNORE, S(7239) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::MDEF_IGNORE, S(7240) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::ADEM_PENETRATION, S(7241) ) OPTION_STRING( ITEM_EFFECT_PASSIVE::MDEM_PENETRATION, S(7242) ) OPTION_STRING(ITEM_EFFECT_PASSIVE::ADD_STATE_BY_EQUIP_ITEM, "ADD_STATE_BY_EQUIP_ITEM" ) // 17가지 옵션 AWAKENINGOPTION_STRING ( StateInfo::STR , S(70) ); // 힘 AWAKENINGOPTION_STRING ( StateInfo::VIT , S(71) ); // 체력 AWAKENINGOPTION_STRING ( StateInfo::DEX , S(73) ); // 민첩 AWAKENINGOPTION_STRING ( StateInfo::AGI , S(72) ); // 집중 AWAKENINGOPTION_STRING ( StateInfo::INT , S(74) ); // 지능 AWAKENINGOPTION_STRING ( StateInfo::MEN , S(75) ); // 정신 AWAKENINGOPTION_STRING ( StateInfo::PHYSICS , S(53) ); // 물리공격력 1 << 7 AWAKENINGOPTION_STRING ( StateInfo::MAGIC , S(54) ); // 마력 AWAKENINGOPTION_STRING ( StateInfo::PHY_DEF , S(55) ); // 물리방어력 AWAKENINGOPTION_STRING ( StateInfo::MGC_DEF , S(56) ); // 마법방어력 AWAKENINGOPTION_STRING ( StateInfo::A_SPEED , S(57) ); // 공격속도 AWAKENINGOPTION_STRING ( StateInfo::C_SPEED , S(58) ); // 시전속도 AWAKENINGOPTION_STRING ( StateInfo::M_SPEED , S(59) ); // 이동속도 1 << 13 AWAKENINGOPTION_STRING ( StateInfo::ACCURACY , S(60) ); // 명중 AWAKENINGOPTION_STRING ( StateInfo::MGS_ACRC , S(62) ); // 마법명중 1 << 15 AWAKENINGOPTION_STRING ( StateInfo::AVOIDANCE , S(61) ); // 회피 1<<19 AWAKENINGOPTION_STRING ( StateInfo::MGS_RESIST , S(1253) ); // 마법 저항 1<<10 AWAKENINGOPTION_STRING(StateInfo::MAXHP, S(1748)); // 마법 저항 1<<10 AWAKENINGOPTION_STRING ( StateInfo::CRI_DAG , S(7152) ); // 치명타 위력 1<<28 AWAKENINGOPTION_STRING ( StateInfo::CRI , S(9775) ); // 치명타율 1<<16 AWAKENINGOPTION_STRING (ITEM_EFFECT_PASSIVE::INC_ALL_SKILL , S(7250) ); // 모든 스킬 레벨 증가Lv1 AWAKENINGOPTION_STRING (ITEM_EFFECT_PASSIVE::INC_COOLTIME_SPEED , S(7251) ); // 모든 스킬 쿨타임 감소 AWAKENINGOPTION_STRING (ITEM_EFFECT_PASSIVE::INC_CASTING_SPEED , S(7252) ); // 모든 스킬 시전시간 감소 AWAKENINGOPTION_STRING (ITEM_EFFECT_PASSIVE::INC_DOUBLE_ATTACK , S(7253) ); // 일반공격 더블어택 확률 추가 AWAKENINGOPTION_STRING (ITEM_EFFECT_PASSIVE::RESIST_NEGATIVE , S(7254) ); // 모든 해로운 이펙트 지속시간감소 AWAKENINGOPTION_STRING (ITEM_EFFECT_PASSIVE::INC_CREATURE_FCM, S(7255) ); // 모든 크리처 능력치 강화 AWAKENINGOPTION_STRING(ITEM_EFFECT_PASSIVE::INC_BELT_ENHANCE, S(7258)); // 모든 크리처 능력치 강화 AWAKENINGOPTION_STRING(ITEM_EFFECT_PASSIVE::INC_FIRE_DAMAGE, S(7139)); // 모든 크리처 능력치 강화 AWAKENINGOPTION_STRING(ITEM_EFFECT_PASSIVE::INC_WATER_DAMAGE, S(7140)); // 모든 크리처 능력치 강화 AWAKENINGOPTION_STRING(ITEM_EFFECT_PASSIVE::INC_WIND_DAMAGE, S(7141)); // 모든 크리처 능력치 강화 AWAKENINGOPTION_STRING(ITEM_EFFECT_PASSIVE::INC_EARTH_DAMAGE, S(7142)); // 모든 크리처 능력치 강화 AWAKENINGOPTION_STRING(ITEM_EFFECT_PASSIVE::INC_LIGHT_DAMAGE, S(7143)); // 모든 크리처 능력치 강화 AWAKENINGOPTION_STRING(ITEM_EFFECT_PASSIVE::INC_DARK_DAMAGE, S(7144)); // 모든 크리처 능력치 강화 } std::string CAutoToolTip::GetItemClassString( int nClass ) const { std::string strClassName; cimapClassString itor = m_mapClassString.find( static_cast < ItemBase::ItemClass > ( nClass ) ); if ( itor != m_mapClassString.end() ) strClassName = itor->second; return strClassName; } std::string CAutoToolTip::GetItemOptionString( const ItemBaseEx_info * pItemBase ) const { std::string strOptions; cimapOptionString itor; for( int i(0); ItemBase::MAX_OPTION_NUMBER>i; i++ ) { itor = m_mapOptionString.find( pItemBase->nBaseType[i] ); if ( itor != m_mapOptionString.end() ) strOptions += std::string( itor->second ); } for( int i(0); ItemBase::MAX_OPTION_NUMBER>i; i++ ) { itor = m_mapOptionString.find( pItemBase->nOptType[i] ); if ( itor != m_mapOptionString.end() ) strOptions += std::string( itor->second ); } return strOptions; } std::string CAutoToolTip::GetItemAwakeningOptionString( DWORD dwType ) const { mapAwakeningOptionString::const_iterator it = m_mapAwakeningOptionString.find( dwType ); if ( it != m_mapAwakeningOptionString.end() ) return std::string( it->second ); return std::string(""); } std::string CAutoToolTip::GetItemStateString( const ItemBaseEx_info * pItemBase ) const { std::string strState; if ( pItemBase->CheckFlag( ItemBase::FLAG_CANT_TRADE ) ) // 거래불가 strState += c_strLineFeed + S( 7800 ); if ( pItemBase->CheckFlag( ItemBase::FLAG_WEARABLE ) ) // 기부 불가 표시... 기부가 왜 WEARABLE일까????? strState += c_strLineFeed + S( 7801 ); if ( pItemBase->CheckFlag( ItemBase::FLAG_CANT_STORAGE ) && !pItemBase->CheckFlag( ItemBase::FLAG_CANT_TRADE ) ) // 창고 보관 불가 strState += c_strLineFeed + S( 7802 ); if ( pItemBase->CheckFlag( ItemBase::FLAG_CASHITEM ) )// 캐쉬 아이템 strState += c_strLineFeed + S( 7803 ); if ( pItemBase->CheckFlag( ItemBase::FLAG_ENHANCE ) ) //강화 조합 불가 strState += c_strLineFeed + S( 690000032 ); if ( pItemBase->nType == ItemBase::TYPE_ARMOR ) // 장비 // AziaMafia Tooltip Fix / Opti //strState += c_strLineFeed + S( 7804 ); if ( ( pItemBase->nType == ItemBase::TYPE_ETC ) && !pItemBase->CheckFlag( ItemBase::FLAG_QUEST ) ) // 기타 strState += c_strLineFeed + S( 7805 ); if ( pItemBase->CheckFlag( ItemBase::FLAG_USE ) ) // 소모품 strState += c_strLineFeed + S( 7806 ); if ( pItemBase->CheckFlag( ItemBase::FLAG_QUEST ) ) // 퀘스트 아이템 strState += c_strLineFeed + S( 7807 ); if ( pItemBase->CheckFlag( ItemBase::FLAG_HUNTAHOLIC_USEABLE_ONLY ) ) // 베어로드에서만 사용 가능 strState += c_strLineFeed + S( 7808 ); if ( pItemBase->CheckFlag( ItemBase::FLAG_DEATHMATCH_USEABLE_ONLY ) ) // 베어로드에서만 사용 가능 strState += c_strLineFeed + S( 7808 ); strState += c_strLineFeed; if ( pItemBase->CheckFlag( ItemBase::FLAG_RAID ) || pItemBase->CheckFlag( ItemBase::FLAG_SECROUTE ) || pItemBase->CheckFlag( ItemBase::FLAG_EVENTMAP ) || pItemBase->CheckFlag( ItemBase::FLAG_HUNTAHOLIC ) ) // 해당 지역에서 사용 불가 { strState += S( 7813 ); if ( pItemBase->CheckFlag( ItemBase::FLAG_RAID ) ) // 레이드, 시즈, strState += S( 7809 ); if ( pItemBase->CheckFlag( ItemBase::FLAG_SECROUTE ) ) // 시크루트 strState += S( 7810 ); if ( pItemBase->CheckFlag( ItemBase::FLAG_EVENTMAP ) ) // 이벤트 strState += S( 7811 ); if ( pItemBase->CheckFlag( ItemBase::FLAG_HUNTAHOLIC ) ) // 베어로드 strState += S( 7812 ); strState += c_strLineFeed; } // floyd 2010. 4. 19 /// 2010.11.10 FLAG_CANT_SELL가 아니고 FLAG_CANT_TRADE가 맞습니다. - prodongi //if ( pItemBase->CheckFlag( ItemBase::FLAG_CANT_STORAGE ) && pItemBase->CheckFlag( ItemBase::FLAG_CANT_SELL ) ) // 아바타 귀속 아이템 if ( pItemBase->CheckFlag( ItemBase::FLAG_CANT_STORAGE ) && pItemBase->CheckFlag( ItemBase::FLAG_CANT_TRADE ) ) // 아바타 귀속 아이템 strState += c_strLineFeed + S( 7814 ); return strState; } string CAutoToolTip::CreateItemTooltipString( const ItemBaseEx_info* pItemBase, int nRace, int nJobID, string appearanceName, /* = "" */ bool bAwakening, /* = false */ bool bIsRandomOptionItem, /* = false */ bool bIsIdentifiedRandomOption, /* = false */ int nAdditionalItemEffect /* = 0 */ ) const // Fraun Sky Accessories 7/12/2025 { std::string strTooltip( "" ); if (s_bApplyAutoToolTip) { strTooltip = c_strAutoToolTip; } else { strTooltip = GetStringDB().GetString( pItemBase->nToolTipID ); } // Fraun 7/17/2025 automatic autotooltip for specific classes if it does not exist if (strTooltip.compare(0, c_strAutoToolTip.length(), c_strAutoToolTip) != 0) { if ( pItemBase->nClass == pItemBase->CLASS_ONEHAND_SWORD || pItemBase->nClass == pItemBase->CLASS_TWOHAND_SWORD || pItemBase->nClass == pItemBase->CLASS_DAGGER || pItemBase->nClass == pItemBase->CLASS_TWOHAND_SPEAR || pItemBase->nClass == pItemBase->CLASS_TWOHAND_AXE || pItemBase->nClass == pItemBase->CLASS_ONEHAND_MACE || pItemBase->nClass == pItemBase->CLASS_TWOHAND_MACE || pItemBase->nClass == pItemBase->CLASS_HEAVY_BOW || pItemBase->nClass == pItemBase->CLASS_LIGHT_BOW || pItemBase->nClass == pItemBase->CLASS_CROSSBOW || pItemBase->nClass == pItemBase->CLASS_ONEHAND_STAFF || pItemBase->nClass == pItemBase->CLASS_TWOHAND_STAFF || pItemBase->nClass == pItemBase->CLASS_ONEHAND_AXE || pItemBase->nClass == pItemBase->CLASS_ARMOR || pItemBase->nClass == pItemBase->CLASS_FIGHTER_ARMOR || pItemBase->nClass == pItemBase->CLASS_HUNTER_ARMOR || pItemBase->nClass == pItemBase->CLASS_MAGICIAN_ARMOR || pItemBase->nClass == pItemBase->CLASS_SUMMONER_ARMOR || pItemBase->nClass == pItemBase->CLASS_SHIELD || pItemBase->nClass == pItemBase->CLASS_HELM || pItemBase->nClass == pItemBase->CLASS_BOOTS || pItemBase->nClass == pItemBase->CLASS_FIGHTER_BOOTS || pItemBase->nClass == pItemBase->CLASS_HUNTER_BOOTS || pItemBase->nClass == pItemBase->CLASS_MAGICIAN_BOOTS || pItemBase->nClass == pItemBase->CLASS_SUMMONER_BOOTS || pItemBase->nClass == pItemBase->CLASS_GLOVE || pItemBase->nClass == pItemBase->CLASS_FIGHTER_GLOVE || pItemBase->nClass == pItemBase->CLASS_HUNTER_GLOVE || pItemBase->nClass == pItemBase->CLASS_MAGICIAN_GLOVE || pItemBase->nClass == pItemBase->CLASS_SUMMONER_GLOVE || pItemBase->nClass == pItemBase->CLASS_BELT || pItemBase->nClass == pItemBase->CLASS_FIGHTER_BELT || pItemBase->nClass == pItemBase->CLASS_HUNTER_BELT || pItemBase->nClass == pItemBase->CLASS_MAGICIAN_BELT || pItemBase->nClass == pItemBase->CLASS_SUMMONER_BELT || pItemBase->nClass == pItemBase->CLASS_MANTLE || pItemBase->nClass == pItemBase->CLASS_FIGHTER_MANTLE || pItemBase->nClass == pItemBase->CLASS_HUNTER_MANTLE || pItemBase->nClass == pItemBase->CLASS_MAGICIAN_MANTLE || pItemBase->nClass == pItemBase->CLASS_SUMMONER_MANTLE || pItemBase->nClass == pItemBase->CLASS_QUIVER || pItemBase->nClass == pItemBase->CLASS_BOOSTER || pItemBase->nClass == pItemBase->CLASS_ETC_ACCESSORY || pItemBase->nClass == pItemBase->CLASS_RING || pItemBase->nClass == pItemBase->CLASS_EARRING || pItemBase->nClass == pItemBase->CLASS_ARMULET || pItemBase->nClass == pItemBase->CLASS_EYEGLASS || pItemBase->nClass == pItemBase->CLASS_MASK || pItemBase->nClass == pItemBase->CLASS_DECO_WEAPON || pItemBase->nClass == pItemBase->CLASS_DECO_SHIELD || pItemBase->nClass == pItemBase->CLASS_DECO_ARMOR || pItemBase->nClass == pItemBase->CLASS_DECO_HELM || pItemBase->nClass == pItemBase->CLASS_DECO_GLOVE || pItemBase->nClass == pItemBase->CLASS_DECO_BOOTS || pItemBase->nClass == pItemBase->CLASS_DECO_MALTLE || pItemBase->nClass == pItemBase->CLASS_DECO_SHOULDER || pItemBase->nClass == pItemBase->CLASS_DECO_HAIR || pItemBase->nClass == pItemBase->CLASS_DECO_ONEHAND_SWORD || pItemBase->nClass == pItemBase->CLASS_DECO_TWOHAND_SWORD || pItemBase->nClass == pItemBase->CLASS_DECO_DAGGER || pItemBase->nClass == pItemBase->CLASS_DECO_TWOHAND_SPEAR || pItemBase->nClass == pItemBase->CLASS_DECO_TWOHAND_AXE || pItemBase->nClass == pItemBase->CLASS_DECO_ONEHAND_MACE || pItemBase->nClass == pItemBase->CLASS_DECO_TWOHAND_MACE || pItemBase->nClass == pItemBase->CLASS_DECO_HEAVY_BOW || pItemBase->nClass == pItemBase->CLASS_DECO_LIGHT_BOW || pItemBase->nClass == pItemBase->CLASS_DECO_CROSSBOW || pItemBase->nClass == pItemBase->CLASS_DECO_ONEHAND_STAFF || pItemBase->nClass == pItemBase->CLASS_DECO_TWOHAND_STAFF || pItemBase->nClass == pItemBase->CLASS_DECO_ONEHAND_AXE) { strTooltip = c_strAutoToolTip; } } if ( strTooltip.compare( 0, c_strAutoToolTip.length(), c_strAutoToolTip ) == 0 ) { string strItemDescription( std::string( strTooltip.begin() + c_strAutoToolTip.length(), strTooltip.end() ) ); string strItemToolTip( "" ); strItemToolTip = c_strItemNameDeco + appearanceName + "<#ffffff>"+ c_strLineFeed + c_strLineGap; // 아이템 기본 설명 if ( strItemDescription.size() > 0 ) strItemToolTip += strItemDescription + c_strLineFeed + c_strLineGap; DWORD dwAllRace = ItemBase::LIMIT_DEVA | ItemBase::LIMIT_ASURA | ItemBase::LIMIT_GAIA; if ( ( pItemBase->nLimit & dwAllRace ) != dwAllRace ) { bool bWearable = GetItemDB().IsWearablebyRace( pItemBase, nRace ); if( bWearable == false ) { strItemToolTip += "<#ff0000>"; } // 종족 제한 if ( ( pItemBase->nLimit & ItemBase::LIMIT_DEVA ) == ItemBase::LIMIT_DEVA ) strItemToolTip += string( S(2) ) + " "; if ( ( pItemBase->nLimit & ItemBase::LIMIT_ASURA ) == ItemBase::LIMIT_ASURA ) strItemToolTip += string( S(3) ) + " "; if ( ( pItemBase->nLimit & ItemBase::LIMIT_GAIA ) == ItemBase::LIMIT_GAIA ) strItemToolTip += string( S(1) ) + " "; if( bWearable == false ) { strItemToolTip += "<#ffffff>"; } } // 아이템 계열 bool bWearable = GetItemDB().IsWearablebyJob( pItemBase, nJobID, nRace ); if( bWearable == true && pItemBase->nGroup == ItemBase::GROUP_DECO ) { bWearable = isWearableDecoItem( pItemBase ); } if( bWearable == false ) { strItemToolTip += "<#ff0000>"; } strItemToolTip += GetItemClassString( pItemBase->nClass ); if( bWearable == false ) { strItemToolTip += "<#ffffff>"; } strItemToolTip += c_strLineFeed + c_strLineGap; /// 2011.03.30 job_depth - prodongi strItemToolTip += c_strJobDepth + c_strLineFeed; // 아이템 레벨 strItemToolTip += string( S( 7700 ) ) + c_strLimitLevelDeco + c_strLineFeed; // 제한 레벨 need to implement!! if (pItemBase->nMaxLevel > 0 && pItemBase->nMaxLevel < 300 ) strItemToolTip += string( S( 7701 ) ) + c_strRecommendLevelDeco + c_strLineFeed; // 권장 레벨 need to implement!! strItemToolTip += c_strLineGap; // 아이템 성능옵션 strItemToolTip += GetItemOptionString( pItemBase ); strItemToolTip += c_strBitsetTextDeco + c_strLineGap; string strWeight( "" ); XStringUtil::Format( strWeight, "%4.0f", pItemBase->fWeight ); if (pItemBase->fWeight > 0) strItemToolTip += S( 7702 ) + strWeight + c_strLineFeed; // 무게 if( true == bIsRandomOptionItem && // 랜덤 옵션 아이템이고 false == bIsIdentifiedRandomOption ) // 미확인 된 아이템이라면, { return strItemToolTip; // 여기까지의 정보만 출력한다. } if ( pItemBase->set_id != 0 ) { std::string szsz = c_strLineGap + S(7703) + c_strLineFeed + string( "#@setitem_fx@#" ) + c_strLineGap + string( "[#@setitem_name@#]" ) + string( "#@setitem_part@#" ); strItemToolTip += c_strLineGap + szsz + c_strLineGap; } if (nAdditionalItemEffect > 0) { strItemToolTip += "#@additional_item_effect@#"; // Fraun Sky Accessories 7/12/2025 } if (pItemBase->nEffectId != 0) { strItemToolTip += string( "#@itemeffecttooltip@#" ) + c_strLineFeed; } if (bAwakening) { strItemToolTip += string( "#@itemawakeningtooltip@#" ) + c_strLineFeed; } if( true == bIsRandomOptionItem && // 랜덤 옵션 아이템이고 true == bIsIdentifiedRandomOption ) // 확인 된 아이템이라면, { strItemToolTip.append( "#@itemRandomOptionToolTip@#" ); strItemToolTip.append( c_strLineFeed ); } // 아이템 상태 표시 툴팁 strItemToolTip += GetItemStateString( pItemBase ); if(pItemBase->nEthereal_durability > 0) { strItemToolTip += c_strLineFeed + S(7815) + "#@Ethereal_Durability@# / #@Ethereal_Durability_Max@#"; #ifdef _DEV strItemToolTip += c_strLineFeed + S(7816) + "#@Ethereal_Durability_test@# / #@Ethereal_Durability_test_Max@#"; #endif } #ifdef _DEV strItemToolTip += c_strLineFeed + S(7817) + "#@Soulstone_Durability_test@# / #@Soulstone_Durability_test_Max@#"; #endif // 2010.06.21 - prodongi if (ITEM_EFFECT_INSTANT::AUTO_HP_RECOVERY == pItemBase->nOptType[0] || ITEM_EFFECT_INSTANT::AUTO_MP_RECOVERY == pItemBase->nOptType[0]) { strItemToolTip += c_strLineFeed + S(7818) + "#@Recovery_Endurance@# / #@Recovery_Endurance_Max@#"; } return strItemToolTip; } else return strTooltip; } } // namespace rp