#include "stdafx.h" #include "DnCommonUtil.h" #include "SundriesFunc.h" #if defined _CLIENT || defined _SERVER #if defined _GAMESERVER || defined _CLIENT #include "DnActor.h" #include "DnItem.h" #include "DnParts.h" #endif #include #include #include "md5.h" #include "DnTableDB.h" #include "EtUIXML.h" #ifdef _CLIENT #include "DnItemTask.h" #ifdef PRE_MOD_GACHA_SYSTEM #include "DnInterfaceString.h" #endif // PRE_MOD_GACHA_SYSTEM #endif // _CLIENT #else // defined _CLIENT || defined _SERVER #include "DNTableFile.h" // For ActionTool #ifdef _ACTIONTOOL #include "../Client/EtActionTool/DnGameTable.h" #endif #endif // defined _CLIENT || defined _SERVER #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif int g_JobKindMax = 0; namespace CommonUtil { #if defined _CLIENT || defined _SERVER bool IsValidCharacterNameLen(int len) { if (len > NAMELENMAX - 1) { _ASSERT(0 && _T("INVALID NAME LENGTH!!")); return false; } return true; } bool IsValidPartyNameLen(int len) { if (len > PARTYNAMELENMAX - 1) { _ASSERT(0 && _T("INVALID PARTY NAME LENGTH!!")); return false; } return true; } #if defined( PRE_PARTY_DB ) eErrorPartySearchWord IsValidPartySearchWord(const WCHAR* pSearchWord) { if (pSearchWord == NULL) return ePARTYWORD_NULL_STRING; int len = int(wcslen(pSearchWord)); if (len < 0 || len >= Party::Max::SearchWordLen - 1) return ePARTYWORD_OVER_LENGTH; int i = 0, count = 0; for (; i < len; ++i) { if (pSearchWord[i] == ' ') { ++count; if (count >= Party::Max::WordSpacing) return ePARTYWORD_OVER_SPACING; } } return ePARTYWORD_NONE; } #else bool IsValidPartyPwdLen(int len) { if (len > PARTYPASSWORDMAX - 1) { _ASSERT(0 && _T("INVALID PARTY PASSWORD LENGTH!!")); return false; } return true; } #endif // #if defined( PRE_PARTY_DB ) bool IsValidDungeonDifficulty(TDUNGEONDIFFICULTY difficulty) { return (difficulty >= Dungeon::Difficulty::Easy && difficulty < Dungeon::Difficulty::Max); } bool IsValidFriendGroupNameLen(int len) { if (len > FRIEND_GROUP_NAMELENMAX - 1) { _ASSERT(0 && _T("INVALID FRIEND GROUP NAME LENGTH!!")); return false; } return true; } bool IsCtrlChar(WCHAR ch) { switch(ch) { case VK_BACK: case VK_DELETE: case 24: // Ctrl-X Cut case VK_CANCEL: // Ctrl-C Copy case 22: // Ctrl-V Paste case 1: // Ctrl-A Select All case VK_RETURN: case 26: // Ctrl Z case 2: // Ctrl B case 14: // Ctrl N case 19: // Ctrl S case 4: // Ctrl D case 6: // Ctrl F case 7: // Ctrl G case 10: // Ctrl J case 11: // Ctrl K case 12: // Ctrl L case 17: // Ctrl Q case 23: // Ctrl W case 5: // Ctrl E case 18: // Ctrl R case 20: // Ctrl T case 25: // Ctrl Y case 21: // Ctrl U case 9: // Ctrl I case 15: // Ctrl O case 16: // Ctrl P case 27: // Ctrl [ case 29: // Ctrl ] case 28: // Ctrl { return true; } } return false; } TAX_TYPE CalcTax(int taxType, int charLev, MONEY_TYPE attachAmount) { DNTableFileFormat *pSox = GetDNTable(CDnTableDB::TTAX); if (!pSox) { _ASSERT(0); return 0; } for (int i = 1; i <= pSox->GetItemCount(); i++) { int nItemID = pSox->GetItemID(i); int taxSort = pSox->GetFieldFromLablePtr(nItemID, "_TaxSort")->GetInteger(); if (taxSort != taxType) continue; int startLev = pSox->GetFieldFromLablePtr(nItemID, "_LevelS")->GetInteger(); int endLev = pSox->GetFieldFromLablePtr(nItemID, "_LevelE")->GetInteger(); if (charLev < startLev || charLev > endLev) continue; int startAmount = pSox->GetFieldFromLablePtr(nItemID, "_AmountS")->GetInteger(); // Gold´ÜÀ§ int endAmount = pSox->GetFieldFromLablePtr(nItemID, "_AmountE")->GetInteger(); int attachGold = (int)(attachAmount / 10000); if (attachGold < startAmount || attachGold > endAmount) continue; if (taxType == TAX_POSTDEFAULT) return TAX_TYPE(pSox->GetFieldFromLablePtr(nItemID, "_TaxAmount")->GetInteger()); float taxRate = pSox->GetFieldFromLablePtr(nItemID, "_Rate")->GetFloat(); return TAX_TYPE(attachAmount * taxRate + 0.5f ); } _ASSERT(0); return 0; } TAX_TYPE GetFixedTax(int taxType) { DNTableFileFormat *pSox = GetDNTable(CDnTableDB::TTAX); if (!pSox) { _ASSERT(0); return 0; } int i = 1; for (; i <= pSox->GetItemCount(); i++) { int nItemID = pSox->GetItemID(i); int taxSort = pSox->GetFieldFromLablePtr(nItemID, "_TaxSort")->GetInteger(); if (taxSort != taxType) continue; return TAX_TYPE(pSox->GetFieldFromLablePtr(nItemID, "_TaxAmount")->GetInteger()); } return 0; } void GetCashRemainDate(const time_t& nRemain, WCHAR *pRemainDate, size_t SizeInWord) { tm Day; if( !DnLocalTime_s(&Day, &nRemain) ) return; #ifdef _US wcsftime(pRemainDate, SizeInWord, L"%m,%d,%Y,%H,%M,%S", &Day); #elif _RU wcsftime(pRemainDate, SizeInWord, L"%d,%m,%Y,%H,%M,%S", &Day); #else // _US wcsftime(pRemainDate, SizeInWord, L"%Y,%m,%d,%H,%M,%S", &Day); #endif // _US } bool ConvertTimeFormatString(WCHAR *dateString, std::wstring& stringProcessed) { #ifdef _US enum { MONTH, DAY, YEAR, HOUR, MINUTE, SECOND, DATE_MAX }; #elif _RU enum { DAY, MONTH, YEAR, HOUR, MINUTE, SECOND, DATE_MAX }; #else enum { YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, DATE_MAX }; #endif // _US std::vector tokens; TokenizeW(std::wstring(dateString ? dateString : L""), tokens, L","); std::wstring dateSeperator = L"/"; std::wstring timeSeperator = L":"; #ifdef _US dateSeperator = L"/"; #elif _RU dateSeperator = L"."; #endif if (tokens.size() == DATE_MAX) { int i = 0; for (; i < DATE_MAX; ++i) { //¸¶Áö¸· ÃÊ´ÜÀ§ Á¤º¸´Â Ãß°¡ ÇÏÁö ¾Ê´Â´Ù. if (i == SECOND) continue; std::wstring& str = tokens[i]; if (i == YEAR) { str.substr(2, std::wstring::npos); } stringProcessed += str; //¾Õ¿¡ 3°³´Â ³¯Â¥ Æ÷¸Ë...(¸Ç ¸¶Áö¸· ³¯Â¥(i==2)ÀÎ °æ¿ì °ø¹é Ãß°¡ if (i < HOUR) { if (i == 2) stringProcessed += L" "; else stringProcessed += dateSeperator; } //½Ã°£ Æ÷¸Ë else if (i >= HOUR) { //ºÐ´ÜÀ§´Â ¸¶Áö¸·À̶ó ½Ã°£ ºÐ¸®ÀÚ Ãß°¡ ¾ÈÇÔ if (i < MINUTE) stringProcessed += timeSeperator; } } } return true; } #ifdef _CLIENT void GetDateString(eDateStringType type, std::wstring& result, const tm& info) { std::wstring::size_type startPos = 0; std::wstring::size_type endPos = 0; std::wstring cur; int uiStringNum = -1; if (type == DATESTR_FULL) uiStringNum = 1981; else if (type == DATESTR_COMPACT) uiStringNum = 4681; else if (type == DATESTR_REFUNDCASHINVEN) uiStringNum = 4803; else if (type == DATESTR_ACCEPT_LIMITTIME ) uiStringNum = 8204; std::wstring formatString = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, uiStringNum); startPos = endPos = 0; while(endPos != std::string::npos) { startPos = formatString.find_first_of(L"<"); endPos = formatString.find_first_of(L">", startPos); if (endPos == std::string::npos || startPos == std::string::npos) break; cur = formatString.substr(startPos, endPos - startPos + 1); if (cur == TEXT("")) cur = FormatW(L"%d", info.tm_year + 1900); else if (cur == TEXT("")) cur = FormatW(L"%d", info.tm_mon + 1); else if (cur == TEXT("")) cur = FormatW(L"%d", info.tm_mday); else if (cur == TEXT("")) cur = ((info.tm_hour / 12) < 1) ? L"AM" : L"PM"; else if (cur == TEXT("