From bf6434a3d6073b4766f92658ac2862558234c87d Mon Sep 17 00:00:00 2001 From: mq1n Date: Sat, 23 Aug 2025 09:25:53 +0300 Subject: [PATCH] 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;