From c987a9f2f1dd5f1a2a976083b30c4203106acce8 Mon Sep 17 00:00:00 2001 From: mq1n Date: Sat, 23 Aug 2025 09:12:29 +0300 Subject: [PATCH 1/2] Update CMake minimum required version to 3.10 Raised the minimum required CMake version to 3.10 in cryptopp and zlib CMakeLists.txt files to ensure compatibility with newer CMake features and improve build consistency >> -- Could NOT find ZSTD (missing: ZSTD_LIBRARIES ZSTD_INCLUDE_DIRS) CMake Error at vendor/mariadb-connector-c-3.4.5/external/zlib/CMakeLists.txt:1 CMake Error at vendor/cryptopp/CMakeLists.txt:34 (cmake_minimum_required): Compatibility with CMake < 3.5 has been removed from CMake. (cmake_minimum_required): Compatibility with CMake < 3.5 has been removed from CMake. Update the VERSION argument value. Or, use the ... syntax to tell CMake that the project requires at least but has been updated to work with policies introduced by or earlier. Or, add -DCMAKE_POLICY_VERSION_MINIMUM=3.5 to try configuring anyway. -- Configuring incomplete, errors occurred! --- vendor/cryptopp/CMakeLists.txt | 2 +- vendor/mariadb-connector-c-3.4.5/external/zlib/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/cryptopp/CMakeLists.txt b/vendor/cryptopp/CMakeLists.txt index b36e982..9569e1e 100644 --- a/vendor/cryptopp/CMakeLists.txt +++ b/vendor/cryptopp/CMakeLists.txt @@ -31,7 +31,7 @@ message( STATUS "CMake version ${CMAKE_VERSION}" ) message( STATUS "System ${CMAKE_SYSTEM_NAME}" ) message( STATUS "Processor ${CMAKE_SYSTEM_PROCESSOR}" ) -cmake_minimum_required(VERSION 2.8.6) +cmake_minimum_required(VERSION 3.10) if (${CMAKE_VERSION} VERSION_LESS "3.0.0") project(cryptopp) set(cryptopp_VERSION_MAJOR 8) diff --git a/vendor/mariadb-connector-c-3.4.5/external/zlib/CMakeLists.txt b/vendor/mariadb-connector-c-3.4.5/external/zlib/CMakeLists.txt index 360f9fe..70ac40b 100644 --- a/vendor/mariadb-connector-c-3.4.5/external/zlib/CMakeLists.txt +++ b/vendor/mariadb-connector-c-3.4.5/external/zlib/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.4.4) +cmake_minimum_required(VERSION 3.10) set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON) project(zlib C) From bf6434a3d6073b4766f92658ac2862558234c87d Mon Sep 17 00:00:00 2001 From: mq1n Date: Sat, 23 Aug 2025 09:25:53 +0300 Subject: [PATCH 2/2] Fix encoding warnings warning C4828: The file contains a character starting at offse t 0x132 that is illegal in the current source character set (codepage 65001) --- src/db/Config.cpp | 6 +- src/db/Marriage.cpp | 6 +- src/db/Monarch.cpp | 4 +- src/game/constants.h | 6 +- src/game/desc_client.cpp | 8 +- src/game/dragon_soul_table.cpp | 6 +- src/game/dungeon.cpp | 6 +- src/game/item_manager.cpp | 144 ++-- src/game/item_manager_read_tables.cpp | 2 +- src/game/item_manager_read_tables.cpp.bak | 919 ++++++++++++++++++++++ src/game/motion.cpp | 4 +- src/game/questlua_global.cpp | 2 +- src/game/questlua_item.cpp | 4 +- src/game/questlua_marriage.cpp | 4 +- src/game/shopEx.cpp | 4 +- src/game/utils.cpp | 10 +- src/game/xmas_event.h | 6 +- src/libsql/AsyncSQL.h | 6 +- 18 files changed, 1033 insertions(+), 114 deletions(-) create mode 100644 src/game/item_manager_read_tables.cpp.bak diff --git a/src/db/Config.cpp b/src/db/Config.cpp index 2ad7dd3..eb0cf14 100644 --- a/src/db/Config.cpp +++ b/src/db/Config.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "Config.h" CConfig::CConfig() @@ -67,7 +67,7 @@ bool CConfig::GetWord(FILE *fp, char *tar) if ((c == ' ' || c == '\t' || c == '\n')) { - // . + // ÅÜ. tar[i] = '\0'; return true; } @@ -144,7 +144,7 @@ bool CConfig::LoadFile(const char* filename) } - // ݴ κ. + // ÆÄÀÏ ´Ý´Â ºÎºÐ. fclose(fp); return true; } diff --git a/src/db/Marriage.cpp b/src/db/Marriage.cpp index d094ed2..bc05c88 100644 --- a/src/db/Marriage.cpp +++ b/src/db/Marriage.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "Marriage.h" #include "Main.h" #include "DBManager.h" @@ -253,7 +253,7 @@ namespace marriage void CManager::OnSetup(CPeer* peer) { - // ȥ + // 결혼한 사람들 보내기 for (itertype(m_Marriages) it = m_Marriages.begin(); it != m_Marriages.end(); ++it) { TMarriage* pMarriage = *it; @@ -280,7 +280,7 @@ namespace marriage } } - // ȥ + // 결혼식 보내기 for (itertype(m_mapRunningWedding) it = m_mapRunningWedding.begin(); it != m_mapRunningWedding.end(); ++it) { const TWedding& t = it->second; diff --git a/src/db/Monarch.cpp b/src/db/Monarch.cpp index 035c135..5112e75 100644 --- a/src/db/Monarch.cpp +++ b/src/db/Monarch.cpp @@ -1,4 +1,4 @@ -#include "Monarch.h" +#include "Monarch.h" #include "common/utils.h" #include "Main.h" #include "ClientManager.h" @@ -235,7 +235,7 @@ bool CMonarch::SetMonarch(const char * name) } delete pMsg; - //db Է + //db¿¡ ÀÔ·Â snprintf(szQuery, sizeof(szQuery), "REPLACE INTO monarch (empire, name, windate, money) VALUES(%d, %d, now(), %lld)", Empire, p->pid[Empire], p->money[Empire]); diff --git a/src/game/constants.h b/src/game/constants.h index d785fb6..e0529ac 100644 --- a/src/game/constants.h +++ b/src/game/constants.h @@ -1,4 +1,4 @@ -#ifndef __INC_METIN_II_GAME_CONSTANTS_H__ +#ifndef __INC_METIN_II_GAME_CONSTANTS_H__ #define __INC_METIN_II_GAME_CONSTANTS_H__ #include "common/tables.h" @@ -13,7 +13,7 @@ enum EMonsterChatState typedef struct SMobRankStat { - int iGoldPercent; // Ȯ + int iGoldPercent; // µ·ÀÌ ³ª¿Ã È®·ü } TMobRankStat; typedef struct SMobStat @@ -124,7 +124,7 @@ extern const int aiMobResistsApplyIdx[MOB_RESISTS_MAX_NUM]; extern const int aSkillAttackAffectProbByRank[MOB_RANK_MAX_NUM]; -extern const int aiItemMagicAttributePercentHigh[ITEM_ATTRIBUTE_MAX_LEVEL]; // 1 +extern const int aiItemMagicAttributePercentHigh[ITEM_ATTRIBUTE_MAX_LEVEL]; // 1°³±îÁö extern const int aiItemMagicAttributePercentLow[ITEM_ATTRIBUTE_MAX_LEVEL]; extern const int aiItemAttributeAddPercent[ITEM_ATTRIBUTE_MAX_NUM]; diff --git a/src/game/desc_client.cpp b/src/game/desc_client.cpp index 3186fd8..6200f42 100644 --- a/src/game/desc_client.cpp +++ b/src/game/desc_client.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "config.h" #include "utils.h" #include "desc_client.h" @@ -84,7 +84,7 @@ bool CLIENT_DESC::Connect(int iPhaseWhenSucceed) if (iPhaseWhenSucceed != 0) m_iPhaseWhenSucceed = iPhaseWhenSucceed; - if (get_global_time() - m_LastTryToConnectTime < 3) // 3 + if (get_global_time() - m_LastTryToConnectTime < 3) // 3초 return false; m_LastTryToConnectTime = get_global_time(); @@ -207,7 +207,7 @@ void CLIENT_DESC::SetPhase(int iPhase) sys_log(0, "DB_SETUP current user %d size %d", p.dwLoginCount, buf.size()); - // Ƽ ó ְ . + // 파티를 처리할 수 있게 됨. CPartyManager::instance().EnablePCParty(); //CPartyManager::instance().SendPartyToDB(); } @@ -294,7 +294,7 @@ void CLIENT_DESC::Update(DWORD t) void CLIENT_DESC::UpdateChannelStatus(DWORD t, bool fForce) { enum { - CHANNELSTATUS_UPDATE_PERIOD = 5*60*1000, // 5и + CHANNELSTATUS_UPDATE_PERIOD = 5*60*1000, // 5분마다 }; if (fForce || m_tLastChannelStatusUpdateTime+CHANNELSTATUS_UPDATE_PERIOD < t) { int iTotal; diff --git a/src/game/dragon_soul_table.cpp b/src/game/dragon_soul_table.cpp index 963ce56..df679a9 100644 --- a/src/game/dragon_soul_table.cpp +++ b/src/game/dragon_soul_table.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "constants.h" #include "group_text_parse_tree.h" #include "dragon_soul_table.h" @@ -172,7 +172,7 @@ bool DragonSoulTable::ReadBasicApplys() TVecApplys vecApplys; int n = pChild->GetRowCount(); - // BasicApply Group Key 1 . + // BasicApply Group은 Key가 1부터 시작함. for (int j = 1; j <= n; j++) { std::stringstream ss; @@ -654,7 +654,7 @@ bool DragonSoulTable::GetWeight(BYTE ds_type, BYTE grade_idx, BYTE step_index, B return true; } } - // default group 캽. + // default group을 살펴봄. pDragonSoulGroup = m_pWeightTableNode->GetChildNode("default"); if (NULL != pDragonSoulGroup) { diff --git a/src/game/dungeon.cpp b/src/game/dungeon.cpp index 1280e37..9536e84 100644 --- a/src/game/dungeon.cpp +++ b/src/game/dungeon.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "dungeon.h" #include "char.h" #include "char_manager.h" @@ -1130,7 +1130,7 @@ struct FExitDungeonToStartPosition { PIXEL_POSITION posWarp; - // ε ִ ƴ϶ ϴ ε ִ´. + // 현재 맵 인덱스를 넣는 것이 아니라 시작하는 맵 인덱스를 넣는다. if (SECTREE_MANAGER::instance().GetRecallPositionByEmpire(g_start_map[ch->GetEmpire()], ch->GetEmpire(), posWarp)) ch->WarpSet(posWarp.x, posWarp.y); else @@ -1280,7 +1280,7 @@ void CDungeon::JumpToEliminateLocation() } else { - // Ϲ + // 일반 맵으로 워프 LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap(m_lMapIndex); if (!pMap) diff --git a/src/game/item_manager.cpp b/src/game/item_manager.cpp index ea2ae05..fcbe227 100644 --- a/src/game/item_manager.cpp +++ b/src/game/item_manager.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "utils.h" #include "config.h" #include "char.h" @@ -81,7 +81,7 @@ bool ITEM_MANAGER::Initialize(TItemTable * table, int size) if (m_vec_prototype[i].dwRefinedVnum) m_map_ItemRefineFrom.insert(std::make_pair(m_vec_prototype[i].dwRefinedVnum, m_vec_prototype[i].dwVnum)); - // NOTE : QUEST_GIVE ÷״ npc ̺Ʈ ߻. + // NOTE : QUEST_GIVE 플래그는 npc 이벤트로 발생. if (m_vec_prototype[i].bType == ITEM_QUEST || IS_SET(m_vec_prototype[i].dwFlags, ITEM_FLAG_QUEST_USE | ITEM_FLAG_QUEST_USE_MULTIPLE)) quest::CQuestManager::instance().RegisterNPCVnum(m_vec_prototype[i].dwVnum); @@ -159,7 +159,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi { if (vnum == 50300 && bTryMagic) { - // ü ȣ ٸ ش. + // 수련서를 아이템 번호를 다르게 만들어 준다. DWORD dwSkillVnum; do @@ -185,7 +185,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi LPITEM item = NULL; - //id ˻ؼ Ѵٸ -- ! + //id로 검사해서 존재한다면 -- 리턴! if (m_map_pkItemByID.find(id) != m_map_pkItemByID.end()) { item = m_map_pkItemByID[id]; @@ -194,7 +194,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi return NULL; } - // ϳ Ҵϰ + //아이템 하나 할당하고 #ifdef M2_USE_POOL item = pool_.Construct(); #else @@ -203,15 +203,15 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi bool bIsNewItem = (0 == id); - //ʱȭ ϰ. ̺ ϰ + //초기화 하고. 테이블 셋하고 item->Initialize(); item->SetProto(table); item->SetMaskVnum(dwMaskVnum); - if (item->GetType() == ITEM_ELK) // ID ʿ 嵵 ʿ. + if (item->GetType() == ITEM_ELK) // 돈은 ID가 필요없고 저장도 필요없다. item->SetSkipSave(true); - // Unique ID + // Unique ID를 세팅하자 else if (!bIsNewItem) { item->SetID(id); @@ -221,16 +221,16 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi { item->SetID(GetNewID()); - if (item->GetType() == ITEM_UNIQUE) // ũ ÿ Ͽ ð Ѵ. + if (item->GetType() == ITEM_UNIQUE) // 유니크 아이템은 생성시에 소켓에 남은시간을 기록한다. { if (item->GetValue(2) == 0) - item->SetSocket(ITEM_SOCKET_UNIQUE_REMAIN_TIME, item->GetValue(0)); // ð ũ + item->SetSocket(ITEM_SOCKET_UNIQUE_REMAIN_TIME, item->GetValue(0)); // 게임 시간 유니크 else { //int globalTime = get_global_time(); //int lastTime = item->GetValue(0); //int endTime = get_global_time() + item->GetValue(0); - item->SetSocket(ITEM_SOCKET_UNIQUE_REMAIN_TIME, get_global_time() + item->GetValue(0)); // ǽð ũ + item->SetSocket(ITEM_SOCKET_UNIQUE_REMAIN_TIME, get_global_time() + item->GetValue(0)); // 실시간 유니크 } } } @@ -259,9 +259,9 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi break; } - if (item->GetType() == ITEM_ELK) // ƹ ó ʿ + if (item->GetType() == ITEM_ELK) // 돈은 아무 처리가 필요하지 않음 ; - else if (item->IsStackable()) // ĥ ִ + else if (item->IsStackable()) // 합칠 수 있는 아이템의 경우 { count = MINMAX(1, count, ITEM_MAX_COUNT); @@ -289,7 +289,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi for (int i=0 ; i < ITEM_LIMIT_MAX_NUM ; i++) { - // ʾƵ ð Ǵ + // 아이템 생성 시점부터 사용하지 않아도 시간이 차감되는 방식 if (LIMIT_REAL_TIME == item->GetLimitType(i)) { if (item->GetLimitValue(i)) @@ -304,11 +304,11 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi item->StartRealTimeExpireEvent(); } - // ũ ó ÿ 밡 ð Ǵ + // 기존 유니크 아이템처럼 착용시에만 사용가능 시간이 차감되는 방식 else if (LIMIT_TIMER_BASED_ON_WEAR == item->GetLimitType(i)) { - // ̹ ̸ Ÿ̸Ӹ ϰ, ð ش. ( - // ۸ ϴ 쿡 Socket0 Ǿ ־ Ѵ. + // 이미 착용중인 아이템이면 타이머를 시작하고, 새로 만드는 아이템은 사용 가능 시간을 세팅해준다. ( + // 아이템몰로 지급하는 경우에는 이 로직에 들어오기 전에 Socket0 값이 세팅이 되어 있어야 한다. if (true == item->IsEquipped()) { item->StartTimerBasedOnWearExpireEvent(); @@ -320,16 +320,16 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi duration = item->GetLimitValue(i); if (0 == duration) - duration = 60 * 60 * 10; // ƹ͵ Ʈ 10ð + duration = 60 * 60 * 10; // 정보가 아무것도 없으면 디폴트로 10시간 세팅 item->SetSocket(0, duration); } } } - if (id == 0) // ó + if (id == 0) // 새로 만드는 아이템일 때만 처리 { - // ߰Ǵ ʵϰ ٸó + // 새로추가되는 약초들일경우 성능을 다르게처리 if (ITEM_BLEND==item->GetType()) { if (Blend_Item_find(item->GetVnum())) @@ -356,7 +356,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi if (table->bGainSocketPct) item->AlterToSocketItem(table->bGainSocketPct); - // 50300 == ü + // 50300 == 기술 수련서 if (vnum == 50300 || vnum == ITEM_SKILLFORGET_VNUM) { DWORD dwSkillVnum; @@ -408,7 +408,7 @@ LPITEM ITEM_MANAGER::CreateItem(DWORD vnum, DWORD count, DWORD id, bool bTryMagi } } - // Ǵ ȥ ó. + // 새로 생성되는 용혼석 처리. if (item->IsDragonSoul() && 0 == id) { DSManager::instance().DragonSoulItemInitialize(item); @@ -477,7 +477,7 @@ void ITEM_MANAGER::Update() this_it = it++; LPITEM item = *this_it; - // SLOW_QUERY ÷װ ִ ÿ Ѵ. + // SLOW_QUERY 플래그가 있는 것은 종료시에만 저장한다. if (item->GetOwner() && IS_SET(item->GetFlag(), ITEM_FLAG_SLOW_QUERY)) continue; @@ -500,7 +500,7 @@ void ITEM_MANAGER::RemoveItem(LPITEM item, const char * c_pszReason) // SAFEBOX_TIME_LIMIT_ITEM_BUG_FIX if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX) { - // 20050613.ipkn.ð ð ٿȴ. + // 20050613.ipkn.시간제 아이템이 상점에 있을 경우 시간만료시 서버가 다운된다. CSafebox* pSafebox = item->GetWindow() == MALL ? o->GetMall() : o->GetSafebox(); if (pSafebox) { @@ -764,8 +764,8 @@ class CItemDropInfo extern std::vector g_vec_pkCommonDropItem[MOB_RANK_MAX_NUM]; // 20050503.ipkn. -// iMinimum iDefault (, iMinimum 0 Ŀ) -// 1, 0 ON/OFF Ǵ ϱ +// iMinimum 보다 작으면 iDefault 세팅 (단, iMinimum은 0보다 커야함) +// 1, 0 식으로 ON/OFF 되는 방식을 지원하기 위해 존재 int GetDropPerKillPct(int iMinimum, int iDefault, int iDeltaPercent, const char * c_pszFlag) { int iVal = 0; @@ -785,8 +785,8 @@ int GetDropPerKillPct(int iMinimum, int iDefault, int iDeltaPercent, const char if (iVal == 0) return 0; - // ⺻ ϶ (iDeltaPercent=100) - // 40000 iVal ϳ ֱ + // 기본 세팅일때 (iDeltaPercent=100) + // 40000 iVal 마리당 하나 느낌을 주기 위한 상수임 return (40000 * iDeltaPercent / iVal); } @@ -932,7 +932,7 @@ bool ITEM_MANAGER::CreateDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std:: CMobItemGroup* pGroup = it->second; // MOB_DROP_ITEM_BUG_FIX - // 20050805.myevan.MobDropItem CMobItemGroup::GetOne() ٽ ߻ + // 20050805.myevan.MobDropItem 에 아이템이 없을 경우 CMobItemGroup::GetOne() 접근시 문제 발생 수정 if (pGroup && !pGroup->IsEmpty()) { int iPercent = 40000 * iDeltaPercent / pGroup->GetKillPerDrop(); @@ -995,7 +995,7 @@ bool ITEM_MANAGER::CreateDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std:: } } - // + // 잡템 if (pkChr->GetMobDropItemVnum()) { itertype(m_map_dwEtcItemDropProb) it = m_map_dwEtcItemDropProb.find(pkChr->GetMobDropItemVnum()); @@ -1044,14 +1044,14 @@ bool ITEM_MANAGER::CreateDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std:: pdw[1] = 1; pdw[2] = quest::CQuestManager::instance().GetEventFlag("lotto_round"); - // Ѵ + // 행운의 서는 소켓을 설정한다 DBManager::instance().ReturnQuery(QID_LOTTO, pkKiller->GetPlayerID(), pdw, "INSERT INTO lotto_list VALUES(0, 'server%s', %u, NOW())", get_table_postfix(), pkKiller->GetPlayerID()); } // - // + // 스페셜 드롭 아이템 // CreateQuestDropItem(pkChr, pkKiller, vec_item, iDeltaPercent, iRandRange); @@ -1062,7 +1062,7 @@ bool ITEM_MANAGER::CreateDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std:: } // - // · õǵ 2 + // 승룡곡 천의동굴 2층에서만 수룡방 입장권 // if (LC_IsYMIR() || LC_IsKorea()) { @@ -1079,21 +1079,21 @@ bool ITEM_MANAGER::CreateDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std:: } // - // · 1, 2 7,8 ųԹ + // 승룡곡 1층, 2층에서만 7,8 스킬입문서 드롭 // if (LC_IsYMIR() || LC_IsKorea()) { switch (pkKiller->GetMapIndex()) { - case 72: // õǵ 1 - case 73: // õǵ 2 + case 72: // 천의동굴 1층 + case 73: // 천의동굴 2층 { int vnum = 0; - if (2403 == pkChr->GetRaceNum()) // õǹ - vnum = 69200; // 7ų Թ - else if (2411 == pkChr->GetRaceNum()) // õǺ - vnum = 69201; // 8ų Թ + if (2403 == pkChr->GetRaceNum()) // 천의법사 + vnum = 69200; // 7스킬 입문서 + else if (2411 == pkChr->GetRaceNum()) // 진천의병사 + vnum = 69201; // 8스킬 입문서 else break; @@ -1249,11 +1249,11 @@ bool DropEvent_CharStone_SetValue(const std::string& name, int value) // END_OF_DROPEVENT_CHARSTONE // fixme -// Ͱ Բ quest . -// ̰ ʹ ݾ... -// ?. ϵڵ ȴ ̤ -// 跮 . -// by rtsummit ġ ¥ +// 위의 것과 함께 quest로 뺄것 빼보자. +// 이거 너무 더럽잖아... +// ”?. 하드코딩 싫다 ㅜㅠ +// 계량 아이템 보상 시작. +// by rtsummit 고치자 진짜 static struct DropEvent_RefineBox { int percent_low; @@ -1373,7 +1373,7 @@ bool DropEvent_RefineBox_SetValue(const std::string& name, int value) return true; } -// . +// 개량 아이템 보상 끝. void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, std::vector & vec_item, int iDeltaPercent, int iRandRange) @@ -1393,7 +1393,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, // END_OF_DROPEVENT_CHARSTONE __DropEvent_RefineBox_DropItem(*pkKiller, *pkChr, *this, vec_item); - // ũ 縻 + // 크리스마스 양말 if (quest::CQuestManager::instance().GetEventFlag("xmas_sock")) { //const DWORD SOCK_ITEM_VNUM = 50010; @@ -1435,7 +1435,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, } } - // + // 월광 보합 if (quest::CQuestManager::instance().GetEventFlag("drop_moon")) { const DWORD ITEM_VNUM = 50011; @@ -1481,10 +1481,10 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, } } - // + //육각보합 if (GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "2006_drop") >= number(1, iRandRange)) { - sys_log(0, " DROP EVENT "); + sys_log(0, "육각보합 DROP EVENT "); const static DWORD dwVnum = 50037; @@ -1493,10 +1493,10 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, } - //+ + //육각보합+ if (GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "2007_drop") >= number(1, iRandRange)) { - sys_log(0, " DROP EVENT "); + sys_log(0, "육각보합 DROP EVENT "); const static DWORD dwVnum = 50043; @@ -1504,17 +1504,17 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, vec_item.push_back(item); } - // ̺Ʈ + // 새해 폭죽 이벤트 if (GetDropPerKillPct(/* minimum */ 100, /* default */ 1000, iDeltaPercent, "newyear_fire") >= number(1, iRandRange)) { - // ߱ , ѱ + // 중국은 폭죽, 한국 팽이 const DWORD ITEM_VNUM_FIRE = g_iUseLocale ? 50107 : 50108; if ((item = CreateItem(ITEM_VNUM_FIRE, 1, 0, true))) vec_item.push_back(item); } - // 뺸 ̺Ʈ + // 새해 대보름 원소 이벤트 if (GetDropPerKillPct(100, 500, iDeltaPercent, "newyear_moon") >= number(1, iRandRange)) { sys_log(0, "EVENT NEWYEAR_MOON DROP"); @@ -1526,7 +1526,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, vec_item.push_back(item); } - // ߷Ÿ ̺Ʈ. OGE 䱸 event ּҰ 1 .(ٸ ̺Ʈ ϴ ״ .) + // 발렌타인 데이 이벤트. OGE의 요구에 따라 event 최소값을 1로 변경.(다른 이벤트는 일단 그대로 둠.) if (GetDropPerKillPct(1, g_iUseLocale ? 2000 : 800, iDeltaPercent, "valentine_drop") >= number(1, iRandRange)) { sys_log(0, "EVENT VALENTINE_DROP"); @@ -1538,7 +1538,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, vec_item.push_back(item); } - // ̽ũ ̺Ʈ + // 아이스크림 이벤트 if (GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "icecream_drop") >= number(1, iRandRange)) { const static DWORD icecream = 50123; @@ -1547,8 +1547,8 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, vec_item.push_back(item); } - // new ũ ̺Ʈ - // 53002 : Ʊ ȯ + // new 크리스마스 이벤트 + // 53002 : 아기 순록 소환권 if ((pkKiller->CountSpecifyItem(53002) > 0) && (GetDropPerKillPct(50, 100, iDeltaPercent, "new_xmas_event") >= number(1, iRandRange))) { const static DWORD xmas_sock = 50010; @@ -1592,7 +1592,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, vec_item.push_back(item); } - // ̺Ʈ + // 월드컵 이벤트 if ( GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "football_drop") >= number(1, iRandRange) ) { const static DWORD football_item = 50096; @@ -1601,7 +1601,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, vec_item.push_back(item); } - // ȭƮ ̺Ʈ + // 화이트 데이 이벤트 if (GetDropPerKillPct(100, g_iUseLocale ? 2000 : 800, iDeltaPercent, "whiteday_drop") >= number(1, iRandRange)) { sys_log(0, "EVENT WHITEDAY_DROP"); @@ -1612,7 +1612,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, vec_item.push_back(item); } - // ̳ ̺Ʈ + // 어린이날 수수께끼 상자 이벤트 if (pkKiller->GetLevel()>=50) { if (GetDropPerKillPct(100, 1000, iDeltaPercent, "kids_day_drop_high") >= number(1, iRandRange)) @@ -1634,7 +1634,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, } } - // ø ̺Ʈ + // 올림픽 드롭 이벤트 if (pkChr->GetLevel() >= 30 && GetDropPerKillPct(50, 100, iDeltaPercent, "medal_part_drop") >= number(1, iRandRange)) { const static DWORD drop_items[] = { 30265, 30266, 30267, 30268, 30269 }; @@ -1645,7 +1645,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, } // ADD_GRANDMASTER_SKILL - // ȥ + // 혼석 아이템 드롭 if (pkChr->GetLevel() >= 40 && pkChr->GetMobRank() >= MOB_RANK_BOSS && GetDropPerKillPct(/* minimum */ 1, /* default */ 1000, iDeltaPercent, "three_skill_item") / GetThreeSkillLevelAdjust(pkChr->GetLevel()) >= number(1, iRandRange)) { const DWORD ITEM_VNUM = 50513; @@ -1656,7 +1656,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, // END_OF_ADD_GRANDMASTER_SKILL // - // drop + // 종자 아이템 drop // if (GetDropPerKillPct(100, 1000, iDeltaPercent, "dragon_boat_festival_drop") >= number(1, iRandRange)) { @@ -1666,7 +1666,7 @@ void ITEM_MANAGER::CreateQuestDropItem(LPCHARACTER pkChr, LPCHARACTER pkKiller, vec_item.push_back(item); } - // ູ ö drop + // 무신의 축복서용 만년한철 drop if (pkKiller->GetLevel() >= 15 && quest::CQuestManager::instance().GetEventFlag("mars_drop")) { const DWORD ITEM_HANIRON = 70035; @@ -1728,8 +1728,8 @@ DWORD ITEM_MANAGER::GetMaskVnum(DWORD dwVnum) return 0; } -// pkNewItem Ӽ ϴ Լ. -// char_item.cpp Ͽ ִ Լ TransformRefineItem ״ +// pkNewItem으로 모든 속성과 소켓 값들을 목사하는 함수. +// 기존에 char_item.cpp 파일에 있던 로컬함수인 TransformRefineItem 그대로 복사함 void ITEM_MANAGER::CopyAllAttrTo(LPITEM pkOldItem, LPITEM pkNewItem) { // ACCESSORY_REFINE @@ -1744,7 +1744,7 @@ void ITEM_MANAGER::CopyAllAttrTo(LPITEM pkOldItem, LPITEM pkNewItem) // END_OF_ACCESSORY_REFINE else { - // ⼭ ڵ û + // 여기서 깨진석이 자동적으로 청소 됨 for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i) { if (!pkOldItem->GetSocket(i)) @@ -1753,19 +1753,19 @@ void ITEM_MANAGER::CopyAllAttrTo(LPITEM pkOldItem, LPITEM pkNewItem) pkNewItem->SetSocket(i, 1); } - // + // 소켓 설정 int slot = 0; for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i) { long socket = pkOldItem->GetSocket(i); - const int ITEM_BROKEN_METIN_VNUM = 28960; // ̰ Ȱ 3 ֳ... ϳ سФФ н ȫ Ҳ + const int ITEM_BROKEN_METIN_VNUM = 28960; // 이건 뭐 똑같은 상수가 3군데나 있냐... 하나로 해놓지ㅠㅠㅠ 나는 패스 홍이 할꺼임 if (socket > 2 && socket != ITEM_BROKEN_METIN_VNUM) pkNewItem->SetSocket(slot++, socket); } } - // + // 매직 아이템 설정 pkOldItem->CopyAttributeTo(pkNewItem); } diff --git a/src/game/item_manager_read_tables.cpp b/src/game/item_manager_read_tables.cpp index f05e5f9..3859949 100644 --- a/src/game/item_manager_read_tables.cpp +++ b/src/game/item_manager_read_tables.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "utils.h" #include "config.h" #include "char.h" diff --git a/src/game/item_manager_read_tables.cpp.bak b/src/game/item_manager_read_tables.cpp.bak new file mode 100644 index 0000000..f05e5f9 --- /dev/null +++ b/src/game/item_manager_read_tables.cpp.bak @@ -0,0 +1,919 @@ +#include "stdafx.h" +#include "utils.h" +#include "config.h" +#include "char.h" +#include "char_manager.h" +#include "desc_client.h" +#include "db.h" +#include "log.h" +#include "skill.h" +#include "text_file_loader.h" +#include "priv_manager.h" +#include "questmanager.h" +#include "unique_item.h" +#include "safebox.h" +#include "blend_item.h" +#include "dev_log.h" +#include "locale_service.h" +#include "item.h" +#include "item_manager.h" +#include "item_manager_private_types.h" +#include "group_text_parse_tree.h" + +std::vector g_vec_pkCommonDropItem[MOB_RANK_MAX_NUM]; + +bool ITEM_MANAGER::ReadCommonDropItemFile(const char * c_pszFileName) +{ + FILE * fp = fopen(c_pszFileName, "r"); + + if (!fp) + { + sys_err("Cannot open %s", c_pszFileName); + return false; + } + + char buf[1024]; + + int lines = 0; + + while (fgets(buf, 1024, fp)) + { + ++lines; + + if (!*buf || *buf == '\n') + continue; + + TDropItem d[MOB_RANK_MAX_NUM]; + char szTemp[64]; + + memset(&d, 0, sizeof(d)); + + char * p = buf; + char * p2; + + for (int i = 0; i <= MOB_RANK_S_KNIGHT; ++i) + { + for (int j = 0; j < 6; ++j) + { + p2 = strchr(p, '\t'); + + if (!p2) + break; + + strlcpy(szTemp, p, MIN(sizeof(szTemp), (p2 - p) + 1)); + p = p2 + 1; + + switch (j) + { + case 0: break; + case 1: str_to_number(d[i].iLvStart, szTemp); break; + case 2: str_to_number(d[i].iLvEnd, szTemp); break; + case 3: d[i].fPercent = atof(szTemp); break; + case 4: strlcpy(d[i].szItemName, szTemp, sizeof(d[i].szItemName)); break; + case 5: str_to_number(d[i].iCount, szTemp); break; + } + } + + DWORD dwPct = (DWORD) (d[i].fPercent * 10000.0f); + DWORD dwItemVnum = 0; + + if (!ITEM_MANAGER::instance().GetVnumByOriginalName(d[i].szItemName, dwItemVnum)) + { + // ̸ ã ȣ ˻ + str_to_number(dwItemVnum, d[i].szItemName); + if (!ITEM_MANAGER::instance().GetTable(dwItemVnum)) + { + sys_err("No such an item (name: %s)", d[i].szItemName); + fclose(fp); + return false; + } + } + + if (d[i].iLvStart == 0) + continue; + + g_vec_pkCommonDropItem[i].push_back(CItemDropInfo(d[i].iLvStart, d[i].iLvEnd, dwPct, dwItemVnum)); + } + } + + fclose(fp); + + for (int i = 0; i < MOB_RANK_MAX_NUM; ++i) + { + std::vector & v = g_vec_pkCommonDropItem[i]; + std::sort(v.begin(), v.end()); + + std::vector::iterator it = v.begin(); + + sys_log(1, "CommonItemDrop rank %d", i); + + while (it != v.end()) + { + const CItemDropInfo & c = *(it++); + sys_log(1, "CommonItemDrop %d %d %d %u", c.m_iLevelStart, c.m_iLevelEnd, c.m_iPercent, c.m_dwVnum); + } + } + + return true; +} + +bool ITEM_MANAGER::ReadSpecialDropItemFile(const char * c_pszFileName) +{ + CTextFileLoader loader; + + if (!loader.Load(c_pszFileName)) + return false; + + std::string stName; + + for (DWORD i = 0; i < loader.GetChildNodeCount(); ++i) + { + loader.SetChildNode(i); + + loader.GetCurrentNodeName(&stName); + + int iVnum; + + if (!loader.GetTokenInteger("vnum", &iVnum)) + { + sys_err("ReadSpecialDropItemFile : Syntax error %s : no vnum, node %s", c_pszFileName, stName.c_str()); + loader.SetParentNode(); + return false; + } + + sys_log(0,"DROP_ITEM_GROUP %s %d", stName.c_str(), iVnum); + + TTokenVector * pTok; + + // + std::string stType; + int type = CSpecialItemGroup::NORMAL; + if (loader.GetTokenString("type", &stType)) + { + stl_lowers(stType); + if (stType == "pct") + { + type = CSpecialItemGroup::PCT; + } + else if (stType == "quest") + { + type = CSpecialItemGroup::QUEST; + quest::CQuestManager::instance().RegisterNPCVnum(iVnum); + } + else if (stType == "special") + { + type = CSpecialItemGroup::SPECIAL; + } + } + + if ("attr" == stType) + { + CSpecialAttrGroup * pkGroup = M2_NEW CSpecialAttrGroup(iVnum); + for (int k = 1; k < 256; ++k) + { + char buf[4]; + snprintf(buf, sizeof(buf), "%d", k); + + if (loader.GetTokenVector(buf, &pTok)) + { + DWORD apply_type = 0; + int apply_value = 0; + str_to_number(apply_type, pTok->at(0).c_str()); + if (0 == apply_type) + { + apply_type = FN_get_apply_type(pTok->at(0).c_str()); + if (0 == apply_type) + { + sys_err ("Invalid APPLY_TYPE %s in Special Item Group Vnum %d", pTok->at(0).c_str(), iVnum); + return false; + } + } + str_to_number(apply_value, pTok->at(1).c_str()); + if (apply_type > MAX_APPLY_NUM) + { + sys_err ("Invalid APPLY_TYPE %u in Special Item Group Vnum %d", apply_type, iVnum); + M2_DELETE(pkGroup); + return false; + } + pkGroup->m_vecAttrs.push_back(CSpecialAttrGroup::CSpecialAttrInfo(apply_type, apply_value)); + } + else + { + break; + } + } + if (loader.GetTokenVector("effect", &pTok)) + { + pkGroup->m_stEffectFileName = pTok->at(0); + } + loader.SetParentNode(); + m_map_pkSpecialAttrGroup.insert(std::make_pair(iVnum, pkGroup)); + } + else + { + CSpecialItemGroup * pkGroup = M2_NEW CSpecialItemGroup(iVnum, type); + for (int k = 1; k < 256; ++k) + { + char buf[4]; + snprintf(buf, sizeof(buf), "%d", k); + + if (loader.GetTokenVector(buf, &pTok)) + { + const std::string& name = pTok->at(0); + DWORD dwVnum = 0; + + if (!GetVnumByOriginalName(name.c_str(), dwVnum)) + { + if (name == "ġ" || name == "exp") + { + dwVnum = CSpecialItemGroup::EXP; + } + else if (name == "mob") + { + dwVnum = CSpecialItemGroup::MOB; + } + else if (name == "slow") + { + dwVnum = CSpecialItemGroup::SLOW; + } + else if (name == "drain_hp") + { + dwVnum = CSpecialItemGroup::DRAIN_HP; + } + else if (name == "poison") + { + dwVnum = CSpecialItemGroup::POISON; + } + else if (name == "group") + { + dwVnum = CSpecialItemGroup::MOB_GROUP; + } + else + { + str_to_number(dwVnum, name.c_str()); + if (!ITEM_MANAGER::instance().GetTable(dwVnum)) + { + sys_err("ReadSpecialDropItemFile : there is no item %s : node %s", name.c_str(), stName.c_str()); + M2_DELETE(pkGroup); + + return false; + } + } + } + + int iCount = 0; + str_to_number(iCount, pTok->at(1).c_str()); + int iProb = 0; + str_to_number(iProb, pTok->at(2).c_str()); + + int iRarePct = 0; + if (pTok->size() > 3) + { + str_to_number(iRarePct, pTok->at(3).c_str()); + } + + sys_log(0," name %s count %d prob %d rare %d", name.c_str(), iCount, iProb, iRarePct); + pkGroup->AddItem(dwVnum, iCount, iProb, iRarePct); + + // CHECK_UNIQUE_GROUP + if (iVnum < 30000) + { + m_ItemToSpecialGroup[dwVnum] = iVnum; + } + // END_OF_CHECK_UNIQUE_GROUP + + continue; + } + + break; + } + loader.SetParentNode(); + if (CSpecialItemGroup::QUEST == type) + { + m_map_pkQuestItemGroup.insert(std::make_pair(iVnum, pkGroup)); + } + else + { + m_map_pkSpecialItemGroup.insert(std::make_pair(iVnum, pkGroup)); + } + } + } + + return true; +} + + +bool ITEM_MANAGER::ConvSpecialDropItemFile() +{ + char szSpecialItemGroupFileName[256]; + snprintf(szSpecialItemGroupFileName, sizeof(szSpecialItemGroupFileName), + "%s/special_item_group.txt", LocaleService_GetBasePath().c_str()); + + FILE *fp = fopen("special_item_group_vnum.txt", "w"); + if (!fp) + { + sys_err("could not open file (%s)", "special_item_group_vnum.txt"); + return false; + } + + CTextFileLoader loader; + + if (!loader.Load(szSpecialItemGroupFileName)) + { + fclose(fp); + return false; + } + + std::string stName; + + for (DWORD i = 0; i < loader.GetChildNodeCount(); ++i) + { + loader.SetChildNode(i); + + loader.GetCurrentNodeName(&stName); + + int iVnum; + + if (!loader.GetTokenInteger("vnum", &iVnum)) + { + sys_err("ConvSpecialDropItemFile : Syntax error %s : no vnum, node %s", szSpecialItemGroupFileName, stName.c_str()); + loader.SetParentNode(); + fclose(fp); + return false; + } + + std::string str; + int type = 0; + if (loader.GetTokenString("type", &str)) + { + stl_lowers(str); + if (str == "pct") + { + type = 1; + } + } + + TTokenVector * pTok; + + fprintf(fp, "Group %s\n", stName.c_str()); + fprintf(fp, "{\n"); + fprintf(fp, " Vnum %i\n", iVnum); + if (type) + fprintf(fp, " Type Pct"); + + for (int k = 1; k < 256; ++k) + { + char buf[4]; + snprintf(buf, sizeof(buf), "%d", k); + + if (loader.GetTokenVector(buf, &pTok)) + { + const std::string& name = pTok->at(0); + DWORD dwVnum = 0; + + if (!GetVnumByOriginalName(name.c_str(), dwVnum)) + { + if ( name == "ġ" || + name == "mob" || + name == "slow" || + name == "drain_hp" || + name == "poison" || + name == "group") + { + dwVnum = 0; + } + else + { + str_to_number(dwVnum, name.c_str()); + if (!ITEM_MANAGER::instance().GetTable(dwVnum)) + { + sys_err("ReadSpecialDropItemFile : there is no item %s : node %s", name.c_str(), stName.c_str()); + fclose(fp); + + return false; + } + } + } + + int iCount = 0; + str_to_number(iCount, pTok->at(1).c_str()); + int iProb = 0; + str_to_number(iProb, pTok->at(2).c_str()); + + int iRarePct = 0; + if (pTok->size() > 3) + { + str_to_number(iRarePct, pTok->at(3).c_str()); + } + + // 1 " ü" 1 100 + if (0 == dwVnum) + fprintf(fp, " %d %s %d %d\n", k, name.c_str(), iCount, iProb); + else + fprintf(fp, " %d %u %d %d\n", k, dwVnum, iCount, iProb); + + continue; + } + + break; + } + fprintf(fp, "}\n"); + fprintf(fp, "\n"); + + loader.SetParentNode(); + } + + fclose(fp); + return true; +} + +bool ITEM_MANAGER::ReadEtcDropItemFile(const char * c_pszFileName) +{ + FILE * fp = fopen(c_pszFileName, "r"); + + if (!fp) + { + sys_err("Cannot open %s", c_pszFileName); + return false; + } + + char buf[512]; + + int lines = 0; + + while (fgets(buf, 512, fp)) + { + ++lines; + + if (!*buf || *buf == '\n') + continue; + + char szItemName[256]; + float fProb = 0.0f; + + strlcpy(szItemName, buf, sizeof(szItemName)); + char * cpTab = strrchr(szItemName, '\t'); + + if (!cpTab) + continue; + + *cpTab = '\0'; + fProb = atof(cpTab + 1); + + if (!*szItemName || fProb == 0.0f) + continue; + + DWORD dwItemVnum; + + if (!ITEM_MANAGER::instance().GetVnumByOriginalName(szItemName, dwItemVnum)) + { + sys_err("No such an item (name: %s)", szItemName); + fclose(fp); + return false; + } + + m_map_dwEtcItemDropProb[dwItemVnum] = (DWORD) (fProb * 10000.0f); + sys_log(0, "ETC_DROP_ITEM: %s prob %f", szItemName, fProb); + } + + fclose(fp); + return true; +} + +bool ITEM_MANAGER::ReadMonsterDropItemGroup(const char * c_pszFileName) +{ + CTextFileLoader loader; + + if (!loader.Load(c_pszFileName)) + return false; + + for (DWORD i = 0; i < loader.GetChildNodeCount(); ++i) + { + std::string stName(""); + + loader.GetCurrentNodeName(&stName); + + if (strncmp (stName.c_str(), "kr_", 3) == 0) + { + if (LC_IsYMIR()) + { + stName.assign(stName, 3, stName.size() - 3); + } + else + { + continue; + } + } + + loader.SetChildNode(i); + + int iMobVnum = 0; + int iKillDrop = 0; + int iLevelLimit = 0; + + std::string strType(""); + + if (!loader.GetTokenString("type", &strType)) + { + sys_err("ReadMonsterDropItemGroup : Syntax error %s : no type (kill|drop), node %s", c_pszFileName, stName.c_str()); + loader.SetParentNode(); + return false; + } + + if (!loader.GetTokenInteger("mob", &iMobVnum)) + { + sys_err("ReadMonsterDropItemGroup : Syntax error %s : no mob vnum, node %s", c_pszFileName, stName.c_str()); + loader.SetParentNode(); + return false; + } + + if (strType == "kill") + { + if (!loader.GetTokenInteger("kill_drop", &iKillDrop)) + { + sys_err("ReadMonsterDropItemGroup : Syntax error %s : no kill drop count, node %s", c_pszFileName, stName.c_str()); + loader.SetParentNode(); + return false; + } + } + else + { + iKillDrop = 1; + } + + if ( strType == "limit" ) + { + if ( !loader.GetTokenInteger("level_limit", &iLevelLimit) ) + { + sys_err("ReadmonsterDropItemGroup : Syntax error %s : no level_limit, node %s", c_pszFileName, stName.c_str()); + loader.SetParentNode(); + return false; + } + } + else + { + iLevelLimit = 0; + } + + sys_log(0,"MOB_ITEM_GROUP %s [%s] %d %d", stName.c_str(), strType.c_str(), iMobVnum, iKillDrop); + + if (iKillDrop == 0) + { + loader.SetParentNode(); + continue; + } + + TTokenVector* pTok = NULL; + + if (strType == "kill") + { + CMobItemGroup * pkGroup = M2_NEW CMobItemGroup(iMobVnum, iKillDrop, stName); + + for (int k = 1; k < 256; ++k) + { + char buf[4]; + snprintf(buf, sizeof(buf), "%d", k); + + if (loader.GetTokenVector(buf, &pTok)) + { + //sys_log(1, " %s %s", pTok->at(0).c_str(), pTok->at(1).c_str()); + std::string& name = pTok->at(0); + DWORD dwVnum = 0; + + if (!GetVnumByOriginalName(name.c_str(), dwVnum)) + { + str_to_number(dwVnum, name.c_str()); + if (!ITEM_MANAGER::instance().GetTable(dwVnum)) + { + sys_err("ReadMonsterDropItemGroup : there is no item %s : node %s : vnum %d", name.c_str(), stName.c_str(), dwVnum); + return false; + } + } + + int iCount = 0; + str_to_number(iCount, pTok->at(1).c_str()); + + if (iCount<1) + { + sys_err("ReadMonsterDropItemGroup : there is no count for item %s : node %s : vnum %d, count %d", name.c_str(), stName.c_str(), dwVnum, iCount); + return false; + } + + int iPartPct = 0; + str_to_number(iPartPct, pTok->at(2).c_str()); + + if (iPartPct == 0) + { + sys_err("ReadMonsterDropItemGroup : there is no drop percent for item %s : node %s : vnum %d, count %d, pct %d", name.c_str(), stName.c_str(), iPartPct); + return false; + } + + int iRarePct = 0; + str_to_number(iRarePct, pTok->at(3).c_str()); + iRarePct = MINMAX(0, iRarePct, 100); + + sys_log(0," %s count %d rare %d", name.c_str(), iCount, iRarePct); + pkGroup->AddItem(dwVnum, iCount, iPartPct, iRarePct); + continue; + } + + break; + } + m_map_pkMobItemGroup.insert(std::map::value_type(iMobVnum, pkGroup)); + + } + else if (strType == "drop") + { + CDropItemGroup* pkGroup; + bool bNew = true; + itertype(m_map_pkDropItemGroup) it = m_map_pkDropItemGroup.find (iMobVnum); + if (it == m_map_pkDropItemGroup.end()) + { + pkGroup = M2_NEW CDropItemGroup(0, iMobVnum, stName); + } + else + { + bNew = false; + pkGroup = it->second; + } + + for (int k = 1; k < 256; ++k) + { + char buf[4]; + snprintf(buf, sizeof(buf), "%d", k); + + if (loader.GetTokenVector(buf, &pTok)) + { + std::string& name = pTok->at(0); + DWORD dwVnum = 0; + + if (!GetVnumByOriginalName(name.c_str(), dwVnum)) + { + str_to_number(dwVnum, name.c_str()); + if (!ITEM_MANAGER::instance().GetTable(dwVnum)) + { + sys_err("ReadDropItemGroup : there is no item %s : node %s", name.c_str(), stName.c_str()); + M2_DELETE(pkGroup); + + return false; + } + } + + int iCount = 0; + str_to_number(iCount, pTok->at(1).c_str()); + + if (iCount < 1) + { + sys_err("ReadMonsterDropItemGroup : there is no count for item %s : node %s", name.c_str(), stName.c_str()); + M2_DELETE(pkGroup); + + return false; + } + + float fPercent = atof(pTok->at(2).c_str()); + + DWORD dwPct = (DWORD)(10000.0f * fPercent); + + sys_log(0," name %s pct %d count %d", name.c_str(), dwPct, iCount); + pkGroup->AddItem(dwVnum, dwPct, iCount); + + continue; + } + + break; + } + if (bNew) + m_map_pkDropItemGroup.insert(std::map::value_type(iMobVnum, pkGroup)); + + } + else if ( strType == "limit" ) + { + CLevelItemGroup* pkLevelItemGroup = M2_NEW CLevelItemGroup(iLevelLimit); + + for ( int k=1; k < 256; k++ ) + { + char buf[4]; + snprintf(buf, sizeof(buf), "%d", k); + + if ( loader.GetTokenVector(buf, &pTok) ) + { + std::string& name = pTok->at(0); + DWORD dwItemVnum = 0; + + if (false == GetVnumByOriginalName(name.c_str(), dwItemVnum)) + { + str_to_number(dwItemVnum, name.c_str()); + if ( !ITEM_MANAGER::instance().GetTable(dwItemVnum) ) + { + M2_DELETE(pkLevelItemGroup); + return false; + } + } + + int iCount = 0; + str_to_number(iCount, pTok->at(1).c_str()); + + if (iCount < 1) + { + M2_DELETE(pkLevelItemGroup); + return false; + } + + float fPct = atof(pTok->at(2).c_str()); + DWORD dwPct = (DWORD)(10000.0f * fPct); + + pkLevelItemGroup->AddItem(dwItemVnum, dwPct, iCount); + + continue; + } + + break; + } + + m_map_pkLevelItemGroup.insert(std::map::value_type(iMobVnum, pkLevelItemGroup)); + } + else if (strType == "thiefgloves") + { + CBuyerThiefGlovesItemGroup* pkGroup = M2_NEW CBuyerThiefGlovesItemGroup(0, iMobVnum, stName); + + for (int k = 1; k < 256; ++k) + { + char buf[4]; + snprintf(buf, sizeof(buf), "%d", k); + + if (loader.GetTokenVector(buf, &pTok)) + { + std::string& name = pTok->at(0); + DWORD dwVnum = 0; + + if (!GetVnumByOriginalName(name.c_str(), dwVnum)) + { + str_to_number(dwVnum, name.c_str()); + if (!ITEM_MANAGER::instance().GetTable(dwVnum)) + { + sys_err("ReadDropItemGroup : there is no item %s : node %s", name.c_str(), stName.c_str()); + M2_DELETE(pkGroup); + + return false; + } + } + + int iCount = 0; + str_to_number(iCount, pTok->at(1).c_str()); + + if (iCount < 1) + { + sys_err("ReadMonsterDropItemGroup : there is no count for item %s : node %s", name.c_str(), stName.c_str()); + M2_DELETE(pkGroup); + + return false; + } + + float fPercent = atof(pTok->at(2).c_str()); + + DWORD dwPct = (DWORD)(10000.0f * fPercent); + + sys_log(0," name %s pct %d count %d", name.c_str(), dwPct, iCount); + pkGroup->AddItem(dwVnum, dwPct, iCount); + + continue; + } + + break; + } + + m_map_pkGloveItemGroup.insert(std::map::value_type(iMobVnum, pkGroup)); + } + else + { + sys_err("ReadMonsterDropItemGroup : Syntax error %s : invalid type %s (kill|drop), node %s", c_pszFileName, strType.c_str(), stName.c_str()); + loader.SetParentNode(); + return false; + } + + loader.SetParentNode(); + } + + return true; +} + +bool ITEM_MANAGER::ReadDropItemGroup(const char * c_pszFileName) +{ + CTextFileLoader loader; + + if (!loader.Load(c_pszFileName)) + return false; + + std::string stName; + + for (DWORD i = 0; i < loader.GetChildNodeCount(); ++i) + { + loader.SetChildNode(i); + + loader.GetCurrentNodeName(&stName); + + int iVnum; + int iMobVnum; + + if (!loader.GetTokenInteger("vnum", &iVnum)) + { + sys_err("ReadDropItemGroup : Syntax error %s : no vnum, node %s", c_pszFileName, stName.c_str()); + loader.SetParentNode(); + return false; + } + + if (!loader.GetTokenInteger("mob", &iMobVnum)) + { + sys_err("ReadDropItemGroup : Syntax error %s : no mob vnum, node %s", c_pszFileName, stName.c_str()); + loader.SetParentNode(); + return false; + } + + sys_log(0,"DROP_ITEM_GROUP %s %d", stName.c_str(), iMobVnum); + + TTokenVector * pTok; + + itertype(m_map_pkDropItemGroup) it = m_map_pkDropItemGroup.find(iMobVnum); + + CDropItemGroup* pkGroup; + + if (it == m_map_pkDropItemGroup.end()) + pkGroup = M2_NEW CDropItemGroup(iVnum, iMobVnum, stName); + else + pkGroup = it->second; + + for (int k = 1; k < 256; ++k) + { + char buf[4]; + snprintf(buf, sizeof(buf), "%d", k); + + if (loader.GetTokenVector(buf, &pTok)) + { + std::string& name = pTok->at(0); + DWORD dwVnum = 0; + + if (!GetVnumByOriginalName(name.c_str(), dwVnum)) + { + str_to_number(dwVnum, name.c_str()); + if (!ITEM_MANAGER::instance().GetTable(dwVnum)) + { + sys_err("ReadDropItemGroup : there is no item %s : node %s", name.c_str(), stName.c_str()); + + if (it == m_map_pkDropItemGroup.end()) + M2_DELETE(pkGroup); + + return false; + } + } + + float fPercent = atof(pTok->at(1).c_str()); + + DWORD dwPct = (DWORD)(10000.0f * fPercent); + + int iCount = 1; + if (pTok->size() > 2) + str_to_number(iCount, pTok->at(2).c_str()); + + if (iCount < 1) + { + sys_err("ReadDropItemGroup : there is no count for item %s : node %s", name.c_str(), stName.c_str()); + + if (it == m_map_pkDropItemGroup.end()) + M2_DELETE(pkGroup); + + return false; + } + + sys_log(0," %s %d %d", name.c_str(), dwPct, iCount); + pkGroup->AddItem(dwVnum, dwPct, iCount); + continue; + } + + break; + } + + if (it == m_map_pkDropItemGroup.end()) + m_map_pkDropItemGroup.insert(std::map::value_type(iMobVnum, pkGroup)); + + loader.SetParentNode(); + } + + return true; +} + +bool ITEM_MANAGER::ReadItemVnumMaskTable(const char * c_pszFileName) +{ + FILE *fp = fopen(c_pszFileName, "r"); + if (!fp) + { + return false; + } + + int ori_vnum, new_vnum; + while (fscanf(fp, "%u %u", &ori_vnum, &new_vnum) != EOF) + { + m_map_new_to_ori.insert (TMapDW2DW::value_type (new_vnum, ori_vnum)); + } + fclose(fp); + return true; +} diff --git a/src/game/motion.cpp b/src/game/motion.cpp index 8c534b4..fca67c1 100644 --- a/src/game/motion.cpp +++ b/src/game/motion.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "common/stl.h" #include "constants.h" #include "motion.h" @@ -476,7 +476,7 @@ bool CMotion::LoadMobSkillFromFile(const char * c_pszFileName, CMob* pMob, int i continue; case MOTION_EVENT_TYPE_SPECIAL_ATTACKING: - // ʹ ϳ + // 구 데이터는 하나 라고 가정 if (!rkTextFileLoader.SetChildNode("spheredata", 0)) { sys_err("Motion: no sphere data %s", c_pszFileName); diff --git a/src/game/questlua_global.cpp b/src/game/questlua_global.cpp index 7ad39a8..a2e3060 100644 --- a/src/game/questlua_global.cpp +++ b/src/game/questlua_global.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include #include "constants.h" #include "char.h" diff --git a/src/game/questlua_item.cpp b/src/game/questlua_item.cpp index 4945ba6..7647a46 100644 --- a/src/game/questlua_item.cpp +++ b/src/game/questlua_item.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "questmanager.h" #include "char.h" #include "item.h" @@ -444,7 +444,7 @@ namespace quest ITEM_MANAGER::instance().FlushDelayedSave(pkNewItem); pkNewItem->AttrLog(); - // ! + // ¼º°ø! lua_pushboolean(L, 1); } diff --git a/src/game/questlua_marriage.cpp b/src/game/questlua_marriage.cpp index e2c5fa0..7484b5d 100644 --- a/src/game/questlua_marriage.cpp +++ b/src/game/questlua_marriage.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "char.h" #include "char_manager.h" #include "wedding.h" @@ -169,7 +169,7 @@ namespace quest } if (pMarriage->pWeddingInfo) { - // ȥ û + // 결혼식 끝내기 요청 pMarriage->RequestEndWedding(); } return 0; diff --git a/src/game/shopEx.cpp b/src/game/shopEx.cpp index e125b11..be0e525 100644 --- a/src/game/shopEx.cpp +++ b/src/game/shopEx.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "libgame/grid.h" #include "constants.h" #include "utils.h" @@ -69,7 +69,7 @@ bool CShopEx::AddGuest(LPCHARACTER ch,DWORD owner_vid, bool bOtherEmpire) pack2.owner_vid = owner_vid; pack2.shop_tab_count = m_vec_shopTabs.size(); - char temp[8096]; // ִ 1728 * 3 + char temp[8096]; // ÃÖ´ë 1728 * 3 char* buf = &temp[0]; size_t size = 0; for (itertype(m_vec_shopTabs) it = m_vec_shopTabs.begin(); it != m_vec_shopTabs.end(); it++) diff --git a/src/game/utils.cpp b/src/game/utils.cpp index 169402a..677e623 100644 --- a/src/game/utils.cpp +++ b/src/game/utils.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" static int global_time_gap = 0; @@ -47,12 +47,12 @@ size_t str_lower(const char * src, char * dest, size_t dest_size) return len; } - // \0 ڸ Ȯ + // \0 자리 확보 --dest_size; while (*src && len < dest_size) { - *dest = LOWER(*src); // LOWER ũο ++ --ϸ ȵ!! + *dest = LOWER(*src); // LOWER 매크로에서 ++나 --하면 안됨!! ++src; ++dest; @@ -80,7 +80,7 @@ const char *one_argument(const char *argument, char *first_arg, size_t first_siz return NULL; } - // \0 ڸ Ȯ + // \0 자리 확보 --first_size; skip_spaces(&argument); @@ -118,7 +118,7 @@ const char *first_cmd(const char *argument, char *first_arg, size_t first_arg_si size_t cur_len = 0; skip_spaces(&argument); - // \0 ڸ Ȯ + // \0 자리 확보 first_arg_size -= 1; while (*argument && !isnhspace(*argument) && cur_len < first_arg_size) diff --git a/src/game/xmas_event.h b/src/game/xmas_event.h index 443e95e..f1a44ab 100644 --- a/src/game/xmas_event.h +++ b/src/game/xmas_event.h @@ -1,12 +1,12 @@ -#ifndef __INC_XMAS_EVENT_H +#ifndef __INC_XMAS_EVENT_H #define __INC_XMAS_EVENT_H namespace xmas { enum { - MOB_SANTA_VNUM = 20031, //Ÿ - // MOB_SANTA_VNUM = 20095, // + MOB_SANTA_VNUM = 20031, //»êŸ + // MOB_SANTA_VNUM = 20095, //³ëÇØ MOB_XMAS_TREE_VNUM = 20032, MOB_XMAS_FIRWORK_SELLER_VNUM = 9004, }; diff --git a/src/libsql/AsyncSQL.h b/src/libsql/AsyncSQL.h index 1bc9e97..3ed9632 100644 --- a/src/libsql/AsyncSQL.h +++ b/src/libsql/AsyncSQL.h @@ -1,4 +1,4 @@ -#ifndef __INC_METIN_II_ASYNCSQL_H__ +#ifndef __INC_METIN_II_ASYNCSQL_H__ #define __INC_METIN_II_ASYNCSQL_H__ #include "libthecore/stdafx.h" @@ -99,8 +99,8 @@ typedef struct _SQLMsg int iID; std::string stQuery; - std::vector vec_pkResult; // result - unsigned int uiResultPos; // result ġ + std::vector vec_pkResult; // result 벡터 + unsigned int uiResultPos; // 현재 result 위치 void * pvUserData; bool bReturn;