7 Commits
dx11 ... main

Author SHA1 Message Date
bdc9050199 Merge pull request 'build: linux mingw cross-compile fixes (partial, stuck at DIMM.h)' (#5) from claude/linux-mingw-crosscompile-fixes into main
Some checks are pending
build / Windows Build (push) Waiting to run
Reviewed-on: #5
2026-04-17 21:58:10 +02:00
Claude
dfe0baabce fix: restore linux mingw client build and gm smoke 2026-04-17 21:53:59 +02:00
Claude
2fe362e0a9 build: linux mingw cross-compile fixes (partial)
Enables the Linux -> win-x64 MinGW cross-compile path that got broken
after recent merges. Still INCOMPLETE — build fails later at missing
DirectX IME headers (DIMM.h) and likely more vendor SDK compat issues.
Commit captures the mechanical fixes so Jakub can adopt/iterate.

Changes:

1. toolchains/linux-mingw64.cmake — MinGW cross-compile toolchain
   (Windows x86_64 target, mingw-w64 gcc/g++/windres, lld linker).

2. CMakeLists.txt:
   - MSVC-only flags (/MP, /Zi, /DEBUG linker flag) gated behind
     if(MSVC) — they break MinGW gcc which treats /MP as filename.
   - UNICODE / _UNICODE defined globally (was inside if(MSVC), but
     WIN32_FIND_DATA etc. need it everywhere).
   - __int64 -> long long compile definition for non-MSVC compilers
     so the Granny SDK header parses.
   - -mssse3 compile option for non-MSVC so _mm_shuffle_epi8 in
     EterLib/GrpImageTexture.cpp inlines correctly.

3. Include fixes for Linux case-sensitive filesystem and stricter
   GCC standard library:
   - Poly/StdAfx.h: backslash in include path -> forward slash.
   - EterBase/Stl.h: <SSTREAM> -> <sstream>.
   - EterBase/Utils.h: add <cmath> so cos() in templates resolves.
   - AudioLib/MaSoundInstance.h: add <cstdint> so uint8_t vector
     template argument is valid.
   - AudioLib/Type.h: add <cstdint> for uint32_t.
   - extern/include/utf8.h: add <cstdint> for uint8_t/uint16_t.
   - EffectLib/Type.h: typedef typename std::vector<...>::iterator
     (dependent-name C++11+ compliance).

Not committed (needs manual recreation per checkout, or git-tracking
them needs buy-in):
   - 60+ stdafx case-variant symlinks (stdafx.h, StdAfx.h, Stdafx.h)
   - 7 directory case symlinks (Eterlib, eterLib, eterBase, Gamelib,
     gamelib, Eterbase, eterbase)
   - header case-variant symlinks in individual dirs

Still failing at:
   - src/EterLib/IME.h:7 wanting DIMM.h (DirectX IME, not in extern/
     and not shipped with mingw-w64). Needs either a shim header, a
     #ifdef _MSC_VER guard, or vendoring the Microsoft DirectX IME SDK.

Work done over ~2h trying to get a fresh release cycle through from
Linux. Stopping here because each fix exposes another vendor/compat
issue that benefits from Jakub's context of the build history.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 23:54:55 +02:00
00c5be4d8a Merge pull request 'issue #9: add sash slot and actor part support' (#4) from issue-9-sashes into main
Some checks failed
build / Windows Build (push) Has been cancelled
Reviewed-on: #4
2026-04-16 23:06:33 +02:00
d3966d971f Merge pull request 'issue #4: expose biolog submit network helper' (#3) from issue-4-biolog-submit-helper into main
Some checks failed
build / Windows Build (push) Has been cancelled
Reviewed-on: #3
2026-04-16 23:03:58 +02:00
server
64d1cc35c1 issue-9: add sash slot and actor part support 2026-04-16 21:08:27 +02:00
server
1eda856283 issue-4: expose biolog submit network helper 2026-04-16 17:26:51 +02:00
69 changed files with 551 additions and 111 deletions

View File

@@ -20,12 +20,30 @@ set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<$<CONFIG:Debug,RelWithDebInfo,Release
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG")
add_compile_definitions(UNICODE _UNICODE)
add_compile_definitions("$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:__int64=long long>")
add_compile_options("$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mssse3>")
if(MSVC)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
endif()
add_compile_definitions(UNICODE _UNICODE)
add_compile_definitions("$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:__int64=long long>")
add_compile_options("$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mssse3>")
if(MSVC)
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG")
endif()
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options(/MP)
add_compile_definitions(UNICODE _UNICODE)
add_compile_definitions("$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:__int64=long long>")
add_compile_options("$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mssse3>")
if(MSVC)
add_compile_options(/MP)
endif()
add_compile_definitions(UNICODE _UNICODE)
add_compile_definitions("$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:__int64=long long>")
add_compile_options("$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-mssse3>")
if(MSVC)
add_compile_definitions(UNICODE _UNICODE)
endif()

View File

@@ -13,7 +13,12 @@ Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InspectFlag;
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_OptimizeFlag;
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_NoSiteFlag;
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_BytesWarningFlag;
#if defined(__MINGW32__)
PyAPI_FUNC(int*) M2_GetPyFrozenFlagPtr(void);
#define Py_FrozenFlag (*M2_GetPyFrozenFlagPtr())
#else
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_FrozenFlag;
#endif
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_IgnoreEnvironmentFlag;
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_DontWriteBytecodeFlag;
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_NoUserSiteDirectory;

2
extern/include/python/python.h vendored Normal file
View File

@@ -0,0 +1,2 @@
#pragma once
#include "Python.h"

View File

@@ -1,3 +1,4 @@
#include <cstdint>
#pragma once
#include <string>
#include <cstring>

View File

@@ -1,3 +1,7 @@
add_library(DirectX INTERFACE)
target_include_directories(DirectX INTERFACE "${CMAKE_SOURCE_DIR}/extern/include")
target_link_libraries(DirectX INTERFACE "${CMAKE_CURRENT_LIST_DIR}/d3d9.lib" "${CMAKE_CURRENT_LIST_DIR}/d3dx9.lib" "${CMAKE_CURRENT_LIST_DIR}/dinput8.lib" "${CMAKE_CURRENT_LIST_DIR}/dxguid.lib")
if(MSVC)
target_link_libraries(DirectX INTERFACE "${CMAKE_CURRENT_LIST_DIR}/d3d9.lib" "${CMAKE_CURRENT_LIST_DIR}/d3dx9.lib" "${CMAKE_CURRENT_LIST_DIR}/dinput8.lib" "${CMAKE_CURRENT_LIST_DIR}/dxguid.lib")
else()
target_link_libraries(DirectX INTERFACE "${CMAKE_CURRENT_LIST_DIR}/d3d9.lib" "${CMAKE_CURRENT_LIST_DIR}/d3dx9.lib" "${CMAKE_CURRENT_LIST_DIR}/dinput8.lib")
endif()

View File

@@ -1,7 +1,15 @@
add_library(Python INTERFACE)
target_include_directories(Python INTERFACE "${CMAKE_SOURCE_DIR}/extern/include")
target_link_libraries(Python INTERFACE
"${CMAKE_CURRENT_LIST_DIR}/python314_static.lib"
pathcch
bcrypt
)
if(MSVC)
target_link_libraries(Python INTERFACE
"${CMAKE_CURRENT_LIST_DIR}/python314_static.lib"
pathcch
bcrypt
)
else()
target_link_libraries(Python INTERFACE
"${CMAKE_CURRENT_LIST_DIR}/libpython314.dll.a"
pathcch
bcrypt
)
endif()

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(AudioLib STATIC ${FILE_SOURCES})
target_link_libraries(AudioLib

View File

@@ -1,3 +1,4 @@
#include <cstdint>
#pragma once
#define MA_NO_WASAPI
#define MA_ENABLE_DSOUND

View File

@@ -1,3 +1,4 @@
#include <cstdint>
#pragma once
#include <vector>

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(Discord STATIC ${FILE_SOURCES})
# target_link_libraries(Discord

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
# Use tea.cpp from EterBase instead of maintaining a local copy
list(APPEND FILE_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/../EterBase/tea.cpp")

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(EffectLib STATIC ${FILE_SOURCES})
target_link_libraries(EffectLib

View File

@@ -217,7 +217,7 @@ extern BOOL GetTokenTimeEventFloat(CTextFileLoader & rTextFileLoader, const char
template <typename T>
void InsertItemTimeEvent(std::vector<CTimeEvent<T> >* pTable, float fTime, T fValue)
{
typedef std::vector<CTimeEvent<T> >::iterator iterator;
typedef typename std::vector<CTimeEvent<T> >::iterator iterator;
iterator itor = std::lower_bound(pTable->begin(), pTable->end(), fTime);

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(EterBase STATIC ${FILE_SOURCES})
target_link_libraries(EterBase

View File

@@ -19,7 +19,6 @@ extern void Tracenf(const char* c_szFormat, ...);
extern void Tracef(const char* c_szFormat, ...);
extern void TraceError(const char* c_szFormat, ...);
extern void TraceErrorWithoutEnter(const char* c_szFormat, ...);
// MR-11: Separate packet dump log from the main log file
extern void TempTrace(const char* c_szMsg, bool errType = false);
extern void TempTracef(const char* c_szFormat, bool errType = false, ...);
extern void TempTracen(const char* c_szMsg, bool errType = false);
@@ -27,13 +26,12 @@ extern void TempTracenf(const char* c_szFormat, bool errType = false, ...);
extern void PacketDump(const char* c_szMsg);
extern void PacketDumpf(const char* c_szFormat, ...);
// MR-11: -- END OF -- Separate packet dump log from the main log file
extern void LogBox(const char* c_szMsg, const char * c_szCaption = NULL, HWND hWnd = NULL);
extern void LogBox(const char* c_szMsg, const char* c_szCaption = NULL, HWND hWnd = NULL);
extern void LogBoxf(const char* c_szMsg, ...);
extern void LogFile(const char* c_szMsg);
extern void LogFilef(const char * c_szMessage, ...);
extern void LogFilef(const char* c_szMessage, ...);
extern void OpenConsoleWindow(void);
extern void CloseConsoleWindow();
extern void SetupLog(void);
@@ -43,12 +41,12 @@ extern void CloseLogFile();
extern HWND g_PopupHwnd;
#define CHECK_RETURN(flag, string) \
if (flag) \
{ \
LogBox(string); \
return; \
} \
#define CHECK_RETURN(flag, string) \
if (flag) \
{ \
LogBox(string); \
return; \
}
#endif

View File

@@ -1,2 +1,2 @@
#pragma once
#include "..\StdAfx.h"
#include "../StdAfx.h"

View File

@@ -3,83 +3,80 @@
#include <assert.h>
template <typename T> class CSingleton
{
static T * ms_singleton;
public:
template <typename T> class CSingleton
{
static T* ms_singleton;
public:
CSingleton()
{
{
assert(!ms_singleton);
intptr_t offset = (intptr_t) (T*) 1 - (intptr_t) (CSingleton <T>*) (T*) 1;
ms_singleton = (T*) ((intptr_t) this + offset);
}
intptr_t offset = (intptr_t)(T*)1 - (intptr_t)(CSingleton<T>*)(T*)1;
ms_singleton = (T*)((intptr_t)this + offset);
}
virtual ~CSingleton()
{
{
assert(ms_singleton);
ms_singleton = 0;
ms_singleton = 0;
}
__forceinline static T & Instance()
__forceinline static T& Instance()
{
assert(ms_singleton);
return (*ms_singleton);
}
__forceinline static T * InstancePtr()
{
__forceinline static T* InstancePtr()
{
return (ms_singleton);
}
__forceinline static T & instance()
__forceinline static T& instance()
{
assert(ms_singleton);
return (*ms_singleton);
}
};
template <typename T> T * CSingleton <T>::ms_singleton = 0;
template <typename T> T* CSingleton<T>::ms_singleton = 0;
//
// singleton for non-hungarian
//
template <typename T> class singleton
{
static T * ms_singleton;
public:
{
static T* ms_singleton;
public:
singleton()
{
{
assert(!ms_singleton);
intptr_t offset = (intptr_t) (T*) 1 - (intptr_t) (singleton <T>*) (T*) 1;
ms_singleton = (T*) ((intptr_t) this + offset);
}
intptr_t offset = (intptr_t)(T*)1 - (intptr_t)(singleton<T>*)(T*)1;
ms_singleton = (T*)((intptr_t)this + offset);
}
virtual ~singleton()
{
{
assert(ms_singleton);
ms_singleton = 0;
ms_singleton = 0;
}
__forceinline static T & Instance()
__forceinline static T& Instance()
{
assert(ms_singleton);
return (*ms_singleton);
}
__forceinline static T * InstancePtr()
{
__forceinline static T* InstancePtr()
{
return (ms_singleton);
}
__forceinline static T & instance()
__forceinline static T& instance()
{
assert(ms_singleton);
return (*ms_singleton);
}
};
template <typename T> T * singleton <T>::ms_singleton = 0;
template <typename T> T* singleton<T>::ms_singleton = 0;
#endif

View File

@@ -20,7 +20,7 @@
#include <map>
#include <queue>
#include <functional>
#include <SSTREAM>
#include <sstream>
#pragma warning ( pop )

View File

@@ -1,3 +1,4 @@
#include <cmath>
#ifndef __INC_ETER2_ETERBASE_UTILS_H__
#define __INC_ETER2_ETERBASE_UTILS_H__

View File

@@ -80,6 +80,7 @@ LONG __stdcall EterExceptionFilter(_EXCEPTION_POINTERS* pExceptionInfo)
fprintf(fException, "rcx: 0x%016llx\trdx: 0x%016llx\n", context.Rcx, context.Rdx);
fprintf(fException, "rsi: 0x%016llx\trdi: 0x%016llx\n", context.Rsi, context.Rdi);
fprintf(fException, "rbp: 0x%016llx\trsp: 0x%016llx\n", context.Rbp, context.Rsp);
fprintf(fException, "rip: 0x%016llx\n", context.Rip);
fprintf(fException, "\n");
/*

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(EterGrnLib STATIC ${FILE_SOURCES})
target_link_libraries(EterGrnLib

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(EterImageLib STATIC ${FILE_SOURCES})
target_link_libraries(EterImageLib

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(EterLib STATIC ${FILE_SOURCES})
target_link_libraries(EterLib

View File

@@ -5,6 +5,7 @@
#include "msctf.h"
#include <oleauto.h>
#include <algorithm>
#include <cstdint>
#include <utf8.h>
#define COUNTOF(a) ( sizeof( a ) / sizeof( ( a )[0] ) )
@@ -66,6 +67,12 @@ enum { IMEUI_STATE_OFF, IMEUI_STATE_ON, IMEUI_STATE_ENGLISH };
#define LCID_INVARIANT MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)
#if defined(__MINGW32__) && !defined(__ITfReadingInformationUIElement_INTERFACE_DEFINED__)
#define M2_HAS_TSF_UIELEMENT_EXT 0
#else
#define M2_HAS_TSF_UIELEMENT_EXT 1
#endif
wchar_t s_aszIndicator[5][3] =
{
L"En",
@@ -179,8 +186,10 @@ protected:
LONG _cRef;
};
#if M2_HAS_TSF_UIELEMENT_EXT
static void MakeReadingInformationString(ITfReadingInformationUIElement* preading);
static void MakeCandidateStrings(ITfCandidateListUIElement* pcandidate);
#endif
static ITfUIElement* GetUIElement(DWORD dwUIElementId);
static BOOL GetCompartments( ITfCompartmentMgr** ppcm, ITfCompartment** ppTfOpenMode, ITfCompartment** ppTfConvMode );
static BOOL SetupCompartmentSinks( BOOL bResetOnly = FALSE, ITfCompartment* pTfOpenMode = NULL, ITfCompartment* ppTfConvMode = NULL );
@@ -1475,7 +1484,7 @@ DWORD CIME::GetImeId( UINT uIndex )
return ms_adwId[uIndex];
hklPrev = hkl;
DWORD dwLang = ((DWORD)hkl & 0xffff);
DWORD dwLang = (static_cast<DWORD>(reinterpret_cast<ULONG_PTR>(hkl)) & 0xffff);
if ( ms_bUILessMode && GETLANG() == LANG_CHT ) {
// In case of Vista, artifitial value is returned so that it's not considered as older IME.
@@ -1734,7 +1743,7 @@ void CIME::CheckToggleState()
/* Check Toggle State */
bool bIme = ImmIsIME( ms_hklCurrent ) != 0
&& ( ( 0xF0000000 & (DWORD)ms_hklCurrent ) == 0xE0000000 ); // Hack to detect IME correctly. When IME is running as TIP, ImmIsIME() returns true for CHT US keyboard.
&& ((0xF0000000u & static_cast<DWORD>(reinterpret_cast<ULONG_PTR>(ms_hklCurrent))) == 0xE0000000u); // Hack to detect IME correctly. When IME is running as TIP, ImmIsIME() returns true for CHT US keyboard.
ms_bChineseIME = ( GETPRIMLANG() == LANG_CHINESE ) && bIme;
HIMC himc;
@@ -1897,6 +1906,7 @@ STDAPI CTsfUiLessMode::CUIElementSink::BeginUIElement(DWORD dwUIElementId, BOOL
if (!pElement)
return E_INVALIDARG;
#if M2_HAS_TSF_UIELEMENT_EXT
ITfReadingInformationUIElement *preading = NULL;
ITfCandidateListUIElement *pcandidate = NULL;
*pbShow = FALSE;
@@ -1922,6 +1932,9 @@ STDAPI CTsfUiLessMode::CUIElementSink::BeginUIElement(DWORD dwUIElementId, BOOL
CIME::ms_pEvent->OnOpenCandidateList();
pcandidate->Release();
}
#else
*pbShow = FALSE;
#endif
pElement->Release();
return S_OK;
@@ -1933,6 +1946,7 @@ STDAPI CTsfUiLessMode::CUIElementSink::UpdateUIElement(DWORD dwUIElementId)
if (!pElement)
return E_INVALIDARG;
#if M2_HAS_TSF_UIELEMENT_EXT
ITfReadingInformationUIElement *preading = NULL;
ITfCandidateListUIElement *pcandidate = NULL;
@@ -1956,6 +1970,7 @@ STDAPI CTsfUiLessMode::CUIElementSink::UpdateUIElement(DWORD dwUIElementId)
CIME::ms_pEvent->OnOpenCandidateList();
pcandidate->Release();
}
#endif
pElement->Release();
return S_OK;
@@ -1973,6 +1988,7 @@ STDAPI CTsfUiLessMode::CUIElementSink::EndUIElement(DWORD dwUIElementId)
//OutputDebugStringW(bstrDesc);
//OutputDebugStringW(L"\n");
#if M2_HAS_TSF_UIELEMENT_EXT
ITfReadingInformationUIElement *preading = NULL;
if (SUCCEEDED(pElement->QueryInterface(__uuidof(ITfReadingInformationUIElement), (void **)&preading)))
{
@@ -1988,6 +2004,7 @@ STDAPI CTsfUiLessMode::CUIElementSink::EndUIElement(DWORD dwUIElementId)
CIME::CloseCandidateList();
pcandidate->Release();
}
#endif
pElement->Release();
return S_OK;
@@ -1995,6 +2012,11 @@ STDAPI CTsfUiLessMode::CUIElementSink::EndUIElement(DWORD dwUIElementId)
void CTsfUiLessMode::UpdateImeState(BOOL bResetCompartmentEventSink)
{
#if defined(__MINGW32__)
(void)bResetCompartmentEventSink;
CIME::ms_dwImeState = CIME::ms_bChineseIME ? IMEUI_STATE_ENGLISH : IMEUI_STATE_OFF;
return;
#else
ITfCompartmentMgr* pcm;
ITfCompartment* pTfOpenMode = NULL;
ITfCompartment* pTfConvMode = NULL;
@@ -2026,6 +2048,7 @@ void CTsfUiLessMode::UpdateImeState(BOOL bResetCompartmentEventSink)
pTfConvMode->Release();
pcm->Release();
}
#endif
}
STDAPI CTsfUiLessMode::CUIElementSink::OnActivated(DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID catid,
@@ -2053,6 +2076,7 @@ STDAPI CTsfUiLessMode::CUIElementSink::OnChange(REFGUID rguid)
return S_OK;
}
#if M2_HAS_TSF_UIELEMENT_EXT
void CTsfUiLessMode::MakeReadingInformationString(ITfReadingInformationUIElement* preading)
{
UINT cchMax;
@@ -2164,6 +2188,7 @@ void CTsfUiLessMode::MakeCandidateStrings(ITfCandidateListUIElement* pcandidate)
free(IndexList);
}
}
#endif
ITfUIElement* CTsfUiLessMode::GetUIElement(DWORD dwUIElementId)
{

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(EterLocale STATIC ${FILE_SOURCES})
target_link_libraries(EterLocale

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(EterPythonLib STATIC ${FILE_SOURCES})
target_link_libraries(EterPythonLib

View File

@@ -55,10 +55,12 @@ void CGridSlotWindow::OnRenderPickingSlot()
for (std::list<TSlot*>::iterator itor = SlotList.begin(); itor != SlotList.end(); ++itor)
{
TSlot * pSlot = *itor;
const LONG slotRight = m_rect.left + pSlot->ixPosition + static_cast<LONG>(pSlot->byxPlacedItemSize) * ITEM_WIDTH;
const LONG slotBottom = m_rect.top + pSlot->iyPosition + static_cast<LONG>(pSlot->byxPlacedItemSize) * ITEM_HEIGHT;
Rect.left = std::min(Rect.left, m_rect.left + pSlot->ixPosition);
Rect.top = std::min(Rect.top, m_rect.top + pSlot->iyPosition);
Rect.right = std::max(Rect.right, m_rect.left + pSlot->ixPosition + pSlot->byxPlacedItemSize*ITEM_WIDTH);
Rect.bottom = std::max(Rect.bottom, m_rect.top + pSlot->iyPosition + pSlot->byxPlacedItemSize*ITEM_HEIGHT);
Rect.right = std::max(Rect.right, slotRight);
Rect.bottom = std::max(Rect.bottom, slotBottom);
}
CPythonGraphic::Instance().RenderBar2d(Rect.left, Rect.top, Rect.right, Rect.bottom);

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(GameLib STATIC ${FILE_SOURCES})
target_link_libraries(GameLib

View File

@@ -1,5 +1,6 @@
#pragma once
class CFlyTarget;
class IFlyTargetableObject
{
@@ -77,4 +78,3 @@ inline void IFlyTargetableObject::ClearFlyTargeter()
}
m_FlyTargeterSet.clear();
}

View File

@@ -103,6 +103,7 @@ class CItemData
{
COSTUME_BODY, //0 갑옷(main look)
COSTUME_HAIR, //1 헤어(탈착가능)
COSTUME_SASH, //2 어깨/등 장식
COSTUME_NUM_TYPES,
};
@@ -252,6 +253,7 @@ class CItemData
WEAR_RING1, //21
WEAR_RING2, //22
WEAR_BELT, //23
WEAR_COSTUME_SASH, //24
WEAR_MAX_NUM,
};
@@ -273,6 +275,7 @@ class CItemData
WEARABLE_COSTUME_BODY = (1 << 12),
WEARABLE_COSTUME_HAIR = (1 << 13),
WEARABLE_BELT = (1 << 14),
WEARABLE_COSTUME_SASH = (1 << 15),
};
enum EApplyTypes

View File

@@ -24,7 +24,7 @@ class CMapBase : public CScreen
virtual float GetHeight(float fx, float fy) = 0;
virtual void OnBeginEnvironment() = 0; // 렌더링 할 때 불려지며 여기서 Environment에 관련 있는 것들을 셋팅 한다.
virtual void ApplyLight(DWORD dwVersion, const D3DLIGHT9& c_rkLight) = 0;
virtual void ApplyLight(ULONG_PTR dwVersion, const D3DLIGHT9& c_rkLight) = 0;
protected:
virtual void OnRender() = 0;

View File

@@ -254,7 +254,7 @@ void CMapManager::BeginEnvironment()
{
ms_lpd3dDevice->LightEnable(0, TRUE);
rkMap.ApplyLight((DWORD)mc_pcurEnvironmentData, mc_pcurEnvironmentData->DirLights[ENV_DIRLIGHT_BACKGROUND]);
rkMap.ApplyLight(reinterpret_cast<ULONG_PTR>(mc_pcurEnvironmentData), mc_pcurEnvironmentData->DirLights[ENV_DIRLIGHT_BACKGROUND]);
}
else
ms_lpd3dDevice->LightEnable(0, FALSE);
@@ -658,4 +658,3 @@ void CMapManager::__LoadMapInfoVector()
return;
}

View File

@@ -99,7 +99,7 @@ class CMapOutdoor : public CMapBase
bool LoadSetting(const char * c_szFileName);
void ApplyLight(DWORD dwVersion, const D3DLIGHT9& c_rkLight);
void ApplyLight(ULONG_PTR dwVersion, const D3DLIGHT9& c_rkLight);
void SetEnvironmentScreenFilter();
void SetEnvironmentSkyBox();
void SetEnvironmentLensFlare();
@@ -577,7 +577,7 @@ class CMapOutdoor : public CMapBase
IDirect3DVertexBuffer9* m_pkVBNone[NONE_VB_NUM];
DWORD m_dwSplatPos;
DWORD m_dwNonePos;
DWORD m_dwLightVersion;
ULONG_PTR m_dwLightVersion;
} m_kSTPD;
struct SoftwareTransformPatch_SRenderState {

View File

@@ -129,7 +129,7 @@ void CMapOutdoor::__RenderTerrain_AppendPatch(const D3DXVECTOR3& c_rv3Center, fl
m_PatchVector.push_back(std::make_pair(fDistance, lPatchNum));
}
void CMapOutdoor::ApplyLight(DWORD dwVersion, const D3DLIGHT9& c_rkLight)
void CMapOutdoor::ApplyLight(ULONG_PTR dwVersion, const D3DLIGHT9& c_rkLight)
{
m_kSTPD.m_dwLightVersion=dwVersion;
STATEMANAGER.SetLight(0, &c_rkLight);

View File

@@ -23,6 +23,7 @@ class CRaceData
PART_HEAD,
PART_WEAPON_LEFT,
PART_HAIR,
PART_ACCE,
PART_MAX_NUM,
};

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(PRTerrainLib STATIC ${FILE_SOURCES})
target_link_libraries(PRTerrainLib

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES CONFIGURE_DEPENDS "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(PackLib STATIC ${FILE_SOURCES})
target_link_libraries(PackLib

View File

@@ -163,6 +163,7 @@ bool CPackManager::GetFileWithPool(std::string_view path, TPackFile& result, CBu
}
}
RecordPackProfileLoad(
"disk",
"<disk>",
@@ -212,6 +213,10 @@ void CPackManager::NormalizePath(std::string_view in, std::string& out) const
if (in[i] == '\\')
out[i] = '/';
else
out[i] = static_cast<char>(std::tolower(in[i]));
out[i] = static_cast<char>(std::tolower(static_cast<unsigned char>(in[i])));
}
static constexpr std::string_view kDrivePrefix = "d:/";
if (out.rfind(kDrivePrefix, 0) == 0)
out.erase(0, kDrivePrefix.size());
}

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_executable(PackMaker ${FILE_SOURCES})
set_target_properties(PackMaker PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin

View File

@@ -1,4 +1,10 @@
file(GLOB_RECURSE FILE_SOURCES CONFIGURE_DEPENDS "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(PythonModules STATIC ${FILE_SOURCES})
GroupSourcesByFolder(PythonModules)

View File

@@ -1,6 +1,10 @@
/* Auto-generated by Tools/freeze/generate_legacy_frozen.py */
#include <python/Python.h>
#if defined(_WIN32)
#include <windows.h>
#endif
extern unsigned char M___future__[];
extern unsigned char M___main__[];
extern unsigned char M__collections_abc[];
@@ -673,5 +677,15 @@ const struct _frozen _PyImport_FrozenModules[] = {
void InitStandardPythonModules()
{
#if defined(__MINGW32__)
HMODULE python = GetModuleHandleA("python314.dll");
if (python) {
const struct _frozen **frozen_modules = (const struct _frozen **)GetProcAddress(python, "PyImport_FrozenModules");
if (frozen_modules) {
*frozen_modules = _PyImport_FrozenModules;
}
}
#else
PyImport_FrozenModules = _PyImport_FrozenModules;
#endif
}

View File

@@ -1,4 +1,10 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
file(GLOB_RECURSE FILE_SOURCES CONFIGURE_DEPENDS "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(ScriptLib STATIC ${FILE_SOURCES})

View File

@@ -0,0 +1,36 @@
#include <windows.h>
#include <python/Python.h>
extern "C" int* M2_GetPyFrozenFlagPtr(void)
{
static int fallback_flag = 0;
HMODULE python = GetModuleHandleA("python314.dll");
if (!python) {
return &fallback_flag;
}
FARPROC proc = GetProcAddress(python, "Py_FrozenFlag");
if (!proc) {
return &fallback_flag;
}
return reinterpret_cast<int*>(proc);
}
extern "C" PyObject* M2_GetPyNonePtr(void)
{
static PyObject* fallback_none = nullptr;
HMODULE python = GetModuleHandleA("python314.dll");
if (!python) {
return fallback_none;
}
FARPROC proc = GetProcAddress(python, "_Py_NoneStruct");
if (!proc) {
return fallback_none;
}
return reinterpret_cast<PyObject*>(proc);
}

View File

@@ -10,6 +10,8 @@ bool __PyCallClassMemberFunc_ByCString(PyObject* poClass, const char* c_szFunc,
bool __PyCallClassMemberFunc_ByPyString(PyObject* poClass, PyObject* poFuncName, PyObject* poArgs, PyObject** poRet);
bool __PyCallClassMemberFunc(PyObject* poClass, PyObject* poFunc, PyObject* poArgs, PyObject** poRet);
extern "C" PyObject* M2_GetPyNonePtr(void);
PyObject * Py_BadArgument()
{
PyErr_BadArgument();
@@ -36,13 +38,14 @@ PyObject * Py_BuildException(const char * c_pszErr, ...)
PyObject * Py_BuildNone()
{
Py_INCREF(Py_None);
return Py_None;
PyObject* pyNone = M2_GetPyNonePtr();
Py_INCREF(pyNone);
return pyNone;
}
void Py_ReleaseNone()
{
Py_DECREF(Py_None);
Py_DECREF(M2_GetPyNonePtr());
}
bool PyTuple_GetObject(PyObject* poArgs, int pos, PyObject** ret)
@@ -111,7 +114,7 @@ bool PyTuple_GetFloat(PyObject* poArgs, int pos, float* ret)
if (!poItem)
return false;
*ret = float(PyFloat_AsDouble(poItem));
*ret = static_cast<float>(PyFloat_AsDouble(poItem));
return true;
}
@@ -119,7 +122,7 @@ bool PyTuple_GetByte(PyObject* poArgs, int pos, unsigned char* ret)
{
int val;
bool result = PyTuple_GetInteger(poArgs,pos,&val);
*ret = unsigned char(val);
*ret = static_cast<unsigned char>(val);
return result;
}
@@ -127,7 +130,7 @@ bool PyTuple_GetInteger(PyObject* poArgs, int pos, unsigned char* ret)
{
int val;
bool result = PyTuple_GetInteger(poArgs,pos,&val);
*ret = unsigned char(val);
*ret = static_cast<unsigned char>(val);
return result;
}
@@ -135,7 +138,7 @@ bool PyTuple_GetInteger(PyObject* poArgs, int pos, WORD* ret)
{
int val;
bool result = PyTuple_GetInteger(poArgs,pos,&val);
*ret = WORD(val);
*ret = static_cast<WORD>(val);
return result;
}
@@ -452,4 +455,4 @@ bool __PyCallClassMemberFunc(PyObject* poClass, PyObject * poFunc, PyObject* poA
Py_DECREF(poFunc);
Py_XDECREF(poArgs);
return true;
}
}

View File

@@ -1,5 +1,23 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
if(MSVC)
list(REMOVE_ITEM FILE_SOURCES
"${CMAKE_CURRENT_SOURCE_DIR}/SpeedTreeStubs.cpp"
)
else()
list(REMOVE_ITEM FILE_SOURCES
"${CMAKE_CURRENT_SOURCE_DIR}/SpeedTreeForest.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/SpeedTreeForestDirectX.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/SpeedTreeWrapper.cpp"
)
endif()
add_library(SpeedTreeLib STATIC ${FILE_SOURCES})
target_link_libraries(SpeedTreeLib

View File

@@ -1,5 +1,11 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
add_library(SphereLib STATIC ${FILE_SOURCES})
# target_link_libraries(SphereLib

View File

@@ -1,13 +1,29 @@
file(GLOB_RECURSE FILE_SOURCES "*.h" "*.c" "*.cpp")
foreach(_source IN LISTS FILE_SOURCES)
if(IS_SYMLINK "${_source}")
list(REMOVE_ITEM FILE_SOURCES "${_source}")
endif()
endforeach()
list(APPEND FILE_SOURCES "${CMAKE_SOURCE_DIR}/src/UserInterface/GUIDKeyCompat.cpp")
add_executable(UserInterface WIN32 ${FILE_SOURCES} ${CMAKE_SOURCE_DIR}/src/UserInterface/UserInterface.rc)
set_target_properties(UserInterface PROPERTIES LINK_FLAGS "/level='requireAdministrator' /uiAccess='false'"
set_target_properties(UserInterface PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
OUTPUT_NAME_DEBUG "Metin2_Debug"
OUTPUT_NAME_RELEASE "Metin2_Release"
OUTPUT_NAME_RELWITHDEBINFO "Metin2_RelWithDebInfo"
)
if(MSVC)
set_target_properties(UserInterface PROPERTIES LINK_FLAGS "/level='requireAdministrator' /uiAccess='false'")
endif()
target_include_directories(UserInterface PRIVATE
$<$<COMPILE_LANGUAGE:RC>:${CMAKE_SOURCE_DIR}/src/UserInterface>
)
target_link_libraries(UserInterface
AudioLib
Discord
@@ -25,6 +41,7 @@ target_link_libraries(UserInterface
SpeedTreeLib
SphereLib
PackLib
EterLib
lzo2
libzstd_static
@@ -32,17 +49,23 @@ target_link_libraries(UserInterface
DirectX
Granny
SpeedTree
$<$<CXX_COMPILER_ID:MSVC>:SpeedTree>
Python
WebView
ws2_32
imm32
winmm
strmiids
amstrmid
dmoguids
ddraw
version
Dbghelp
$<$<CXX_COMPILER_ID:MSVC>:Dbghelp>
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:dbghelp>
EterImageLib
AudioLib
PythonModules
EterBase
)
GroupSourcesByFolder(UserInterface)

View File

@@ -101,11 +101,12 @@ enum EDragonSoulStepTypes
#ifdef ENABLE_COSTUME_SYSTEM
const DWORD c_Costume_Slot_Start = c_Equipment_Start + CItemData::WEAR_COSTUME_BODY;
const DWORD c_Costume_Slot_Body = c_Costume_Slot_Start + CItemData::COSTUME_BODY;
const DWORD c_Costume_Slot_Hair = c_Costume_Slot_Start + CItemData::COSTUME_HAIR;
const DWORD c_Costume_Slot_Body = c_Equipment_Start + CItemData::WEAR_COSTUME_BODY;
const DWORD c_Costume_Slot_Hair = c_Equipment_Start + CItemData::WEAR_COSTUME_HAIR;
const DWORD c_Costume_Slot_Sash = c_Equipment_Start + CItemData::WEAR_COSTUME_SASH;
const DWORD c_Costume_Slot_Count = CItemData::COSTUME_NUM_TYPES;
const DWORD c_Costume_Slot_End = c_Costume_Slot_Start + c_Costume_Slot_Count;
const DWORD c_Costume_Slot_End = c_Costume_Slot_Sash + 1;
#endif

View File

@@ -762,6 +762,7 @@ bool CInstanceBase::Create(const SCreateData& c_rkCreateData)
{
SetHair(c_rkCreateData.m_dwHair);
SetWeapon(c_rkCreateData.m_dwWeapon);
SetAcce(c_rkCreateData.m_dwAcce);
}
__Create_SetName(c_rkCreateData);
@@ -2654,6 +2655,25 @@ void CInstanceBase::SetHair(DWORD eHair)
m_GraphicThingInstance.SetHair(eHair);
}
void CInstanceBase::SetAcce(DWORD eAcce)
{
if (IsPC() == false)
return;
m_awPart[CRaceData::PART_ACCE] = eAcce;
m_GraphicThingInstance.DetachModelInstance(CRaceData::PART_MAIN, m_GraphicThingInstance, CRaceData::PART_ACCE);
if (0 == eAcce)
return;
CItemData* pItemData;
if (!CItemManager::Instance().GetItemDataPointer(eAcce, &pItemData))
return;
m_GraphicThingInstance.AttachWeapon(eAcce, CRaceData::PART_MAIN, CRaceData::PART_ACCE);
}
void CInstanceBase::ChangeHair(DWORD eHair)
{
if (!HAIR_COLOR_ENABLE)
@@ -2673,6 +2693,18 @@ void CInstanceBase::ChangeHair(DWORD eHair)
//RefreshState(type, true);
}
void CInstanceBase::ChangeAcce(DWORD eAcce)
{
if (IsPC() == false)
return;
if (GetPart(CRaceData::PART_ACCE) == eAcce)
return;
SetAcce(eAcce);
RefreshState(CRaceMotionData::NAME_WAIT, true);
}
void CInstanceBase::SetArmor(DWORD dwArmor)
{
DWORD dwShape;
@@ -2852,6 +2884,7 @@ bool CInstanceBase::ChangeArmor(DWORD dwArmor)
DWORD dwRace = GetRace();
DWORD eHair = GetPart(CRaceData::PART_HAIR);
DWORD eWeapon = GetPart(CRaceData::PART_WEAPON);
DWORD eAcce = GetPart(CRaceData::PART_ACCE);
float fRot = GetRotation();
float fAdvRot = GetAdvancingRotation();
@@ -2872,6 +2905,7 @@ bool CInstanceBase::ChangeArmor(DWORD dwArmor)
SetArmor(dwArmor);
SetHair(eHair);
SetWeapon(eWeapon);
SetAcce(eAcce);
SetRotation(fRot);
SetAdvancingRotation(fAdvRot);

View File

@@ -26,6 +26,7 @@ class CInstanceBase
DWORD m_dwArmor;
DWORD m_dwWeapon;
DWORD m_dwHair;
DWORD m_dwAcce;
DWORD m_dwMountVnum;
short m_sAlignment;
@@ -497,10 +498,12 @@ class CInstanceBase
void SetArmor(DWORD dwArmor);
void SetShape(DWORD eShape, float fSpecular=0.0f);
void SetHair(DWORD eHair);
void SetAcce(DWORD eAcce);
bool SetWeapon(DWORD eWeapon);
bool ChangeArmor(DWORD dwArmor);
void ChangeWeapon(DWORD eWeapon);
void ChangeHair(DWORD eHair);
void ChangeAcce(DWORD eAcce);
void ChangeGuild(DWORD dwGuildID);
DWORD GetWeaponType();

View File

@@ -6,11 +6,11 @@
#include <stb_image_write.h>
#if !defined(_MSC_VER)
#include <IL/il.h>
#include "crc32.h"
#include "lzo_manager.h"
#include "minilzo.h"
#define CLZO LZOManager
#include "EterBase/CRC32.h"
#define sys_err TraceError
#define sys_log Tracenf
#define thecore_memcpy memcpy
#else
#define sys_err TraceError
#define sys_log //(n, format, ...) Tracenf(format, __VA_ARGS__)

View File

@@ -2,11 +2,15 @@
#include <stdio.h>
#include "MarkManager.h"
#if _MSC_VER < 1200
#if defined(_MSC_VER) && _MSC_VER < 1200
#include "crc32.h"
#else
#define sys_err TraceError
#if defined(_MSC_VER)
#define sys_log // (n, format, ...) Tracenf(format, __VA_ARGS__)
#else
#define sys_log Tracenf
#endif
#define thecore_memcpy memcpy
#define itertype(cont) typeof((cont).begin())
#endif

View File

@@ -2,6 +2,29 @@
#include "MovieMan.h"
#include "PythonApplication.h"
#if !defined(_MSC_VER)
void CMovieMan::ClearToBlack()
{
}
void CMovieMan::PlayLogo(const char *pcszName)
{
(void)pcszName;
}
void CMovieMan::PlayIntro()
{
}
BOOL CMovieMan::PlayTutorial(LONG nIdx)
{
(void)nIdx;
return FALSE;
}
#else
// 2007-08-19, nuclei
// add following files to the [Project Settings-Linker-Input]
// DEBUG: ../dshow/strmbasd.lib ../dshow/dmoguids.lib ddraw.lib
@@ -688,3 +711,5 @@ HRESULT CMovieMan::BuildFilterGraphManually(
// }
//}
//#endif
#endif

View File

@@ -77,6 +77,7 @@ void SNetworkActorData::__copy__(const SNetworkActorData& src)
m_dwArmor = src.m_dwArmor;
m_dwWeapon = src.m_dwWeapon;
m_dwHair = src.m_dwHair;
m_dwAcce = src.m_dwAcce;
m_dwOwnerVID = src.m_dwOwnerVID;
@@ -104,6 +105,7 @@ SNetworkActorData::SNetworkActorData()
m_dwArmor=0;
m_dwWeapon=0;
m_dwHair=0;
m_dwAcce=0;
m_dwEmpireID=0;
m_dwOwnerVID=0;
@@ -356,6 +358,7 @@ CInstanceBase* CNetworkActorManager::__AppendCharacterManagerActor(SNetworkActor
kCreateData.m_dwArmor=rkNetActorData.m_dwArmor;
kCreateData.m_dwWeapon=rkNetActorData.m_dwWeapon;
kCreateData.m_dwHair=rkNetActorData.m_dwHair;
kCreateData.m_dwAcce=rkNetActorData.m_dwAcce;
kCreateData.m_isMain=__IsMainActorVID(dwVID);
CInstanceBase* pOldInstance = rkChrMgr.GetInstancePtr(dwVID);
@@ -472,7 +475,8 @@ void CNetworkActorManager::UpdateActor(const SNetworkUpdateActorData& c_rkNetUpd
{
pkInstFind->ChangeArmor(c_rkNetUpdateActorData.m_dwArmor);
pkInstFind->ChangeWeapon(c_rkNetUpdateActorData.m_dwWeapon);
pkInstFind->ChangeHair(c_rkNetUpdateActorData.m_dwHair);
pkInstFind->ChangeHair(c_rkNetUpdateActorData.m_dwHair);
pkInstFind->ChangeAcce(c_rkNetUpdateActorData.m_dwAcce);
pkInstFind->ChangeGuild(c_rkNetUpdateActorData.m_dwGuildID);
pkInstFind->SetAffectFlagContainer(c_rkNetUpdateActorData.m_kAffectFlags);
pkInstFind->SetMoveSpeed(c_rkNetUpdateActorData.m_dwMovSpd);
@@ -502,6 +506,7 @@ void CNetworkActorManager::UpdateActor(const SNetworkUpdateActorData& c_rkNetUpd
rkNetActorData.m_dwArmor=c_rkNetUpdateActorData.m_dwArmor;
rkNetActorData.m_dwWeapon=c_rkNetUpdateActorData.m_dwWeapon;
rkNetActorData.m_dwHair=c_rkNetUpdateActorData.m_dwHair;
rkNetActorData.m_dwAcce=c_rkNetUpdateActorData.m_dwAcce;
rkNetActorData.m_sAlignment=c_rkNetUpdateActorData.m_sAlignment;
rkNetActorData.m_byPKMode=c_rkNetUpdateActorData.m_byPKMode;
}

View File

@@ -31,6 +31,7 @@ struct SNetworkActorData
DWORD m_dwArmor;
DWORD m_dwWeapon;
DWORD m_dwHair;
DWORD m_dwAcce;
DWORD m_dwOwnerVID;
@@ -85,6 +86,7 @@ struct SNetworkUpdateActorData
DWORD m_dwArmor;
DWORD m_dwWeapon;
DWORD m_dwHair;
DWORD m_dwAcce;
DWORD m_dwMovSpd;
DWORD m_dwAtkSpd;
short m_sAlignment;
@@ -100,6 +102,7 @@ struct SNetworkUpdateActorData
m_dwArmor=0;
m_dwWeapon=0;
m_dwHair=0;
m_dwAcce=0;
m_dwMovSpd=0;
m_dwAtkSpd=0;
m_sAlignment=0;

View File

@@ -1278,6 +1278,7 @@ enum ECharacterEquipmentPart
CHR_EQUIPPART_WEAPON,
CHR_EQUIPPART_HEAD,
CHR_EQUIPPART_HAIR,
CHR_EQUIPPART_ACCE,
CHR_EQUIPPART_NUM,
};

View File

@@ -728,7 +728,10 @@ bool CPythonApplication::Process()
m_dwFaceAccCount += dwCurFaceCount;
m_dwFaceAccTime += m_dwCurRenderTime;
m_fFaceSpd=(m_dwFaceAccCount/m_dwFaceAccTime);
if (m_dwFaceAccTime != 0)
m_fFaceSpd = static_cast<float>(m_dwFaceAccCount) / static_cast<float>(m_dwFaceAccTime);
else
m_fFaceSpd = 0.0f;
// °Å¸® ÀÚµ¿ Á¶Àý
if (-1 == m_iForceSightRange)

View File

@@ -1,6 +1,24 @@
#include "StdAfx.h"
#include "PythonApplication.h"
#ifndef IID_ISampleGrabber
DEFINE_GUID(IID_ISampleGrabber, 0x6b652fff, 0x11fe, 0x4fce, 0x92, 0xad, 0x02, 0x66, 0xb5, 0xd7, 0xc7, 0x8f);
DEFINE_GUID(CLSID_SampleGrabber, 0xc1f400a0, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37);
MIDL_INTERFACE("6B652FFF-11FE-4fce-92AD-0266B5D7C78F")
ISampleGrabber : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE SetOneShot(WINBOOL OneShot) = 0;
virtual HRESULT STDMETHODCALLTYPE SetMediaType(const AM_MEDIA_TYPE* pType) = 0;
virtual HRESULT STDMETHODCALLTYPE GetConnectedMediaType(AM_MEDIA_TYPE* pType) = 0;
virtual HRESULT STDMETHODCALLTYPE SetBufferSamples(WINBOOL BufferThem) = 0;
virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer(LONG* pBufferSize, LONG* pBuffer) = 0;
virtual HRESULT STDMETHODCALLTYPE GetCurrentSample(IMediaSample** ppSample) = 0;
virtual HRESULT STDMETHODCALLTYPE SetCallback(IUnknown* pCallback, LONG WhichMethodToCallback) = 0;
};
#endif
static bool bInitializedLogo = false;
int CPythonApplication::OnLogoOpen(char* szName)

View File

@@ -1,6 +1,8 @@
#include "StdAfx.h"
#include "PythonApplication.h"
#if defined(_MSC_VER)
#undef C8
#include <wrl.h>
#include <wil/com.h>
@@ -118,3 +120,29 @@ void CPythonApplication::HideWebPage()
else
SetCursorMode(CURSOR_MODE_HARDWARE);
}
#else
bool CPythonApplication::IsWebPageMode()
{
return false;
}
void CPythonApplication::ShowWebPage(const char* c_szURL, const RECT& c_rcWebPage)
{
TraceError("WebView2 is not available in this build");
}
void CPythonApplication::MoveWebPage(const RECT& c_rcWebPage)
{
}
void CPythonApplication::HideWebPage()
{
if (m_pySystem.IsSoftwareCursor())
SetCursorMode(CURSOR_MODE_SOFTWARE);
else
SetCursorMode(CURSOR_MODE_HARDWARE);
}
#endif

View File

@@ -1437,6 +1437,7 @@ void initchr()
PyModule_AddIntConstant(poModule, "PART_WEAPON", CRaceData::PART_WEAPON);
PyModule_AddIntConstant(poModule, "PART_HEAD", CRaceData::PART_HEAD);
PyModule_AddIntConstant(poModule, "PART_WEAPON_LEFT", CRaceData::PART_WEAPON_LEFT);
PyModule_AddIntConstant(poModule, "PART_ACCE", CRaceData::PART_ACCE);
/////

View File

@@ -654,12 +654,14 @@ void initItem()
// Item Sub Type
PyModule_AddIntConstant(poModule, "COSTUME_TYPE_BODY", CItemData::COSTUME_BODY);
PyModule_AddIntConstant(poModule, "COSTUME_TYPE_HAIR", CItemData::COSTUME_HAIR);
PyModule_AddIntConstant(poModule, "COSTUME_TYPE_SASH", CItemData::COSTUME_SASH);
// 인벤토리 및 장비창에서의 슬롯 번호
PyModule_AddIntConstant(poModule, "COSTUME_SLOT_START", c_Costume_Slot_Start);
PyModule_AddIntConstant(poModule, "COSTUME_SLOT_COUNT", c_Costume_Slot_Count);
PyModule_AddIntConstant(poModule, "COSTUME_SLOT_BODY", c_Costume_Slot_Body);
PyModule_AddIntConstant(poModule, "COSTUME_SLOT_HAIR", c_Costume_Slot_Hair);
PyModule_AddIntConstant(poModule, "COSTUME_SLOT_SASH", c_Costume_Slot_Sash);
PyModule_AddIntConstant(poModule, "COSTUME_SLOT_END", c_Costume_Slot_End);
#endif

View File

@@ -317,6 +317,7 @@ class CPythonNetworkStream : public CNetworkStream, public CSingleton<CPythonNet
// Main Game Phase
bool SendC2CPacket(DWORD dwSize, void * pData);
bool SendChatPacket(const char * c_szChat, BYTE byType = CHAT_TYPE_TALKING);
bool SendBiologSubmit();
bool SendWhisperPacket(const char * name, const char * c_szChat);
bool SendMessengerAddByVIDPacket(DWORD vid);
bool SendMessengerAddByNamePacket(const char * c_szName);

View File

@@ -499,6 +499,13 @@ PyObject* netSendChatPacket(PyObject* poSelf, PyObject* poArgs)
return Py_BuildNone();
}
PyObject* netSendBiologSubmit(PyObject* poSelf, PyObject* poArgs)
{
CPythonNetworkStream& rkNetStream = CPythonNetworkStream::Instance();
rkNetStream.SendBiologSubmit();
return Py_BuildNone();
}
PyObject* netSendEmoticon(PyObject* poSelf, PyObject* poArgs)
{
int eEmoticon;
@@ -1700,6 +1707,7 @@ void initnet()
{ "IsConnect", netIsConnect, METH_VARARGS },
{ "SendChatPacket", netSendChatPacket, METH_VARARGS },
{ "SendBiologSubmit", netSendBiologSubmit, METH_VARARGS },
{ "SendEmoticon", netSendEmoticon, METH_VARARGS },
{ "SendWhisperPacket", netSendWhisperPacket, METH_VARARGS },

View File

@@ -788,6 +788,11 @@ bool CPythonNetworkStream::SendChatPacket(const char * c_szChat, BYTE byType)
return true;
}
bool CPythonNetworkStream::SendBiologSubmit()
{
return SendChatPacket("/biolog_submit");
}
//////////////////////////////////////////////////////////////////////////
// Emoticon
void CPythonNetworkStream::RegisterEmoticonString(const char * pcEmoticonString)
@@ -838,7 +843,7 @@ void CPythonNetworkStream::__ConvertEmpireText(DWORD dwEmpireID, char* szText)
{
if (pbText[0]>=0xb0 && pbText[0]<=0xc8 && pbText[1]>=0xa1 && pbText[1]<=0xfe)
{
uHanPos=(pbText[0]-0xb0)*(0xfe-0xa1+1)+(pbText[1]-0xa1);
uHanPos = (pbText[0] - 0xb0) * (0xfe - 0xa1 + 1) + (pbText[1] - 0xa1);
pbText[0]=rkTextConvTable.aacHan[uHanPos][0];
pbText[1]=rkTextConvTable.aacHan[uHanPos][1];
}
@@ -4357,4 +4362,4 @@ void CPythonNetworkStream::Discord_Close()
{
Discord_Shutdown();
}
#endif
#endif

View File

@@ -120,7 +120,8 @@ bool CPythonNetworkStream::RecvCharacterAppendPacket()
kNetActorData.m_dwEmpireID=0;/*chrAddPacket.bEmpire*/;
kNetActorData.m_dwArmor=0;/*chrAddPacket.awPart[CHR_EQUIPPART_ARMOR]*/;
kNetActorData.m_dwWeapon=0;/*chrAddPacket.awPart[CHR_EQUIPPART_WEAPON]*/;
kNetActorData.m_dwHair=0;/*chrAddPacket.awPart[CHR_EQUIPPART_HAIR]*/;
kNetActorData.m_dwHair=0;/*chrAddPacket.awPart[CHR_EQUIPPART_HAIR]*/;
kNetActorData.m_dwAcce=0;/*chrAddPacket.awPart[CHR_EQUIPPART_ACCE]*/;
kNetActorData.m_dwMountVnum=0;/*chrAddPacket.dwMountVnum*/;
kNetActorData.m_dwLevel = 0; // 몬스터 레벨 표시 안함
@@ -178,7 +179,8 @@ bool CPythonNetworkStream::RecvCharacterAdditionalInfo()
kNetActorData.m_dwEmpireID=chrInfoPacket.bEmpire;
kNetActorData.m_dwArmor=chrInfoPacket.awPart[CHR_EQUIPPART_ARMOR];
kNetActorData.m_dwWeapon=chrInfoPacket.awPart[CHR_EQUIPPART_WEAPON];
kNetActorData.m_dwHair=chrInfoPacket.awPart[CHR_EQUIPPART_HAIR];
kNetActorData.m_dwHair=chrInfoPacket.awPart[CHR_EQUIPPART_HAIR];
kNetActorData.m_dwAcce=chrInfoPacket.awPart[CHR_EQUIPPART_ACCE];
kNetActorData.m_dwMountVnum=chrInfoPacket.dwMountVnum;
__RecvCharacterAppendPacket(&kNetActorData);
@@ -212,6 +214,7 @@ bool CPythonNetworkStream::RecvCharacterAppendPacketNew()
kNetActorData.m_dwArmor=chrAddPacket.awPart[CHR_EQUIPPART_ARMOR];
kNetActorData.m_dwWeapon=chrAddPacket.awPart[CHR_EQUIPPART_WEAPON];
kNetActorData.m_dwHair=chrAddPacket.awPart[CHR_EQUIPPART_HAIR];
kNetActorData.m_dwAcce=chrAddPacket.awPart[CHR_EQUIPPART_ACCE];
kNetActorData.m_dwStateFlags=chrAddPacket.bStateFlag;
kNetActorData.m_dwVID=chrAddPacket.dwVID;
kNetActorData.m_dwMountVnum=chrAddPacket.dwMountVnum;
@@ -240,6 +243,7 @@ bool CPythonNetworkStream::RecvCharacterUpdatePacket()
kNetUpdateActorData.m_dwArmor=chrUpdatePacket.awPart[CHR_EQUIPPART_ARMOR];
kNetUpdateActorData.m_dwWeapon=chrUpdatePacket.awPart[CHR_EQUIPPART_WEAPON];
kNetUpdateActorData.m_dwHair=chrUpdatePacket.awPart[CHR_EQUIPPART_HAIR];
kNetUpdateActorData.m_dwAcce=chrUpdatePacket.awPart[CHR_EQUIPPART_ACCE];
kNetUpdateActorData.m_dwVID=chrUpdatePacket.dwVID;
kNetUpdateActorData.m_kAffectFlags.CopyData(0, sizeof(chrUpdatePacket.dwAffectFlag[0]), &chrUpdatePacket.dwAffectFlag[0]);
kNetUpdateActorData.m_kAffectFlags.CopyData(32, sizeof(chrUpdatePacket.dwAffectFlag[1]), &chrUpdatePacket.dwAffectFlag[1]);
@@ -265,6 +269,7 @@ bool CPythonNetworkStream::RecvCharacterUpdatePacketNew()
kNetUpdateActorData.m_dwArmor=chrUpdatePacket.awPart[CHR_EQUIPPART_ARMOR];
kNetUpdateActorData.m_dwWeapon=chrUpdatePacket.awPart[CHR_EQUIPPART_WEAPON];
kNetUpdateActorData.m_dwHair=chrUpdatePacket.awPart[CHR_EQUIPPART_HAIR];
kNetUpdateActorData.m_dwAcce=chrUpdatePacket.awPart[CHR_EQUIPPART_ACCE];
kNetUpdateActorData.m_dwVID=chrUpdatePacket.dwVID;
kNetUpdateActorData.m_kAffectFlags.CopyData(0, sizeof(chrUpdatePacket.dwAffectFlag[0]), &chrUpdatePacket.dwAffectFlag[0]);
kNetUpdateActorData.m_kAffectFlags.CopyData(32, sizeof(chrUpdatePacket.dwAffectFlag[1]), &chrUpdatePacket.dwAffectFlag[1]);
@@ -473,4 +478,3 @@ bool CPythonNetworkStream::RecvCharacterAppendPacket()
return true;
}
*/

View File

@@ -58,7 +58,7 @@ bool CPythonNetworkStream::LoadConvertTable(DWORD dwEmpireID, const char* c_szFi
return false;
DWORD dwEngCount=26;
DWORD dwHanCount=(0xc8-0xb0+1)*(0xfe-0xa1+1);
DWORD dwHanCount = (0xc8 - 0xb0 + 1) * (0xfe - 0xa1 + 1);
DWORD dwHanSize=dwHanCount*2;
DWORD dwFileSize=dwEngCount*2+dwHanSize;

View File

@@ -27,8 +27,12 @@
#include "EterLib/FontManager.h"
extern "C" {
#if defined(__MINGW32__)
int _fltused = 0;
#else
extern int _fltused;
FILE __iob_func[3] = { *stdin, *stdout, *stderr };
#endif
volatile int _AVOID_FLOATING_POINT_LIBRARY_BUG = _fltused;
__declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
__declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;

View File

@@ -9,7 +9,7 @@
// Generated from the TEXTINCLUDE 2 resource.
//
// #include "afxres.h"
#include <Windows.h>
#include <windows.h>
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
@@ -70,19 +70,19 @@ END
// Cursor
//
IDC_CURSOR_NORMAL CURSOR "Cursors\\cursor.cur"
IDC_CURSOR_CHAIR CURSOR "Cursors\\cursor_chair.cur"
IDC_CURSOR_DOOR CURSOR "Cursors\\cursor_door.cur"
IDC_CURSOR_NO CURSOR "Cursors\\cursor_no.cur"
IDC_CURSOR_PICK CURSOR "Cursors\\cursor_pick.cur"
IDC_CURSOR_TALK CURSOR "Cursors\\cursor_talk.cur"
IDC_CURSOR_ATTACK CURSOR "Cursors\\cursor_attack.cur"
IDC_CURSOR_BUY CURSOR "Cursors\\cursor_buy.cur"
IDC_CURSOR_SELL CURSOR "Cursors\\cursor_sell.cur"
IDC_CURSOR_CAMERA_ROTATE CURSOR "Cursors\\cursor_camera_rotate.cur"
IDC_CURSOR_HSIZE CURSOR "Cursors\\cursor_hsize.cur"
IDC_CURSOR_VSIZE CURSOR "Cursors\\cursor_vsize.cur"
IDC_CURSOR_HVSIZE CURSOR "Cursors\\cursor_hvsize.cur"
IDC_CURSOR_NORMAL CURSOR "Cursors/cursor.cur"
IDC_CURSOR_CHAIR CURSOR "Cursors/cursor_chair.cur"
IDC_CURSOR_DOOR CURSOR "Cursors/cursor_door.cur"
IDC_CURSOR_NO CURSOR "Cursors/cursor_no.cur"
IDC_CURSOR_PICK CURSOR "Cursors/cursor_pick.cur"
IDC_CURSOR_TALK CURSOR "Cursors/cursor_talk.cur"
IDC_CURSOR_ATTACK CURSOR "Cursors/cursor_attack.cur"
IDC_CURSOR_BUY CURSOR "Cursors/cursor_buy.cur"
IDC_CURSOR_SELL CURSOR "Cursors/cursor_sell.cur"
IDC_CURSOR_CAMERA_ROTATE CURSOR "Cursors/cursor_camera_rotate.cur"
IDC_CURSOR_HSIZE CURSOR "Cursors/cursor_hsize.cur"
IDC_CURSOR_VSIZE CURSOR "Cursors/cursor_vsize.cur"
IDC_CURSOR_HVSIZE CURSOR "Cursors/cursor_hvsize.cur"
/////////////////////////////////////////////////////////////////////////////
//

View File

@@ -0,0 +1,22 @@
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR x86_64)
get_filename_component(_TOOLCHAIN_DIR "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY)
set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
set(CMAKE_LINKER "${_TOOLCHAIN_DIR}/mingw-lld-bin/x86_64-w64-mingw32-ld" CACHE FILEPATH "" FORCE)
set(_MINGW_LLD_FLAGS "-B${_TOOLCHAIN_DIR}/mingw-lld-bin -fuse-ld=lld")
set(CMAKE_EXE_LINKER_FLAGS "${_MINGW_LLD_FLAGS}" CACHE STRING "" FORCE)
set(CMAKE_SHARED_LINKER_FLAGS "${_MINGW_LLD_FLAGS}" CACHE STRING "" FORCE)
set(CMAKE_MODULE_LINKER_FLAGS "${_MINGW_LLD_FLAGS}" CACHE STRING "" FORCE)
set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)