diff --git a/audit/history.jsonl b/audit/history.jsonl index 7f8ba9c3..38a4f0b7 100644 --- a/audit/history.jsonl +++ b/audit/history.jsonl @@ -502,3 +502,4 @@ {"time": "2026-09-23T11:00:00Z", "event": "port_round", "unit": "PORT-PLAN 批次 2P step 4 (macOS): the 40250 script layer starts inside the Godot process", "ported": [], "adapted": ["UserInterface/UserInterface.cpp:RunMainScript -> extension/src/platform/ScriptLib/PythonBoot.cpp (Start/RunMainScript/RunLine/Stop; 40250 keeps CPythonLauncher on Main()'s stack, Godot owns this process so the launcher has to outlive the call that starts it)", "EterBase/Debug.cpp:LogBox, EterBase/Debug.cpp:LogBoxf -> extension/src/platform/EterBase/Debug.cpp (stderr plus LastLogBoxMessage(); ScriptLib Traceback() reports through LogBoxf after PyErr_Fetch has cleared the exception, so this is the only place a script traceback survives)"], "deleted": [], "divergent": ["RunMainScript RegisterCommandLine passes the command line through unchanged: the -cs/-ncs auto-login decoding needs EterBase/Utils.cpp SplitLine and EterLib/Util.cpp base64_decode, both declared but not ported (批次 2V1). Nothing in this host passes -cs today.", "RunMainScript drops '--pause-before-create-window' (system(\"pause\")) and the XTrap init check: no console and no XTrap on macOS/Android.", "Of the 37 module initializers RunMainScript calls, only initpack() is called — the other 36 are 2V slices."], "needs_live": [], "staging": {"native": "extension/src/platform/ScriptLib/PythonBoot.{h,cpp} (godot-free, placed under ScriptLib because that is the directory port_logic/port_platform drop when `mtpython` is absent; compiled with the UserInterface library's definitions so its `#ifdef _DISTRIBUTE` gives __DEBUG__ = 0). extension/src/platform/EterBase/LogBox.h. extension/src/python_host_node.{h,cpp} -> GDScript class Metin2PythonHost (start/is_running/run_main_script/run_line/stop; each returns \"\" or the reason, and a build without the interpreter answers with a distinguishable message instead of failing to register).", "gdscript": "project/python_host_check.gd in two halves — the interpreter + stdlib half needs no 40250 pack and runs on any platform, the system.py half needs the pack and is skipped without it. project/python_host_test.gd (--script) is the desktop entry; MT_TEST_MODE=python in project/client_main.gd is the on-device entry, since export templates do not accept --script.", "boot": "Metin2PythonHost.start(\"\") stages the stdlib through Metin2Python.stdlib_path(), which until now had no caller outside python_stdlib_test.gd."}, "status_note": "macOS only. Android/iOS in-process is untouched: the APK cross-build is blocked on the GBK iconv issue (see the PORT-PLAN known-issue section, deferred by the user 2026-09-23), and a device has no 40250 Client/pack, so on a phone only the interpreter + stdlib half of the check can run. prototype.RunApp() is 2V0: system.py still stops at its first import. The real boot path (AppFlow) does not start the interpreter.", "tests": ["godot --headless --path project --script python_host_test.gd -> PASS: interpreter starts in-process, is_running(), a second start() is a no-op, `import os, string, types, codecs`, u'\\xe4'.encode('cp1252'), sys.path non-empty, system.py stops at ImportError: No module named app (identical to ctest port.python_launcher), stop() tears it down", "MT_TEST_MODE=python godot --headless --path project -> same result through client_main.gd", "ctest --test-dir build -> 27/27 passed (14.51s)"], "not_done": "Android/iOS 进程内验证;正式启动路径起解释器(2V0);RunMainScript 的 -cs 命令行解码(2V1)", "commit": "2P-step4-macos"} {"time": "2026-09-23T11:40:00Z", "event": "port_round", "unit": "PORT-PLAN 批次 2V0-a: the EterPythonLib window-system headers enter the mirror", "ported": ["EterPythonLib/StdAfx.h", "EterPythonLib/PythonGraphic.h", "EterPythonLib/PythonWindow.h", "EterPythonLib/PythonWindowManager.h", "EterPythonLib/PythonSlotWindow.h", "EterPythonLib/PythonGridSlotWindow.h"], "adapted": [], "deleted": [], "divergent": [], "needs_live": [], "staging": {"scope": "headers only; no .cpp unit and therefore no port-map entry — declarations, nothing to call. The EterPythonLib .cpp units are 2V0-b.", "mechanical": "port_copy.py copy, 0 of 6 with manual edits: every one compiles as a mechanical CP949->UTF-8 / CRLF->LF / include-case copy.", "stdafx": "EterPythonLib/StdAfx.h had to come first: port_header_gate compiles each header behind its library's StdAfx.h, as 40250 does, and without it these five see neither , the STL, nor CSingleton.", "slice_list_correction": "audit/slices/2V0.json lists EterLib/Dimm.h as a missing header. It is not: 40250 vendors the MIDL output of the Windows SDK as EterLib/Dimm.h, and extension/src/port/common/shim/win32/Dimm.h already shims it (a mirror copy shadows the shim for EterLib/IME.h's quoted include and breaks the build on 'rpc.h'). Copied, found, and removed again."}, "status_note": "2V0 entry state measured: of the slice's 212 headers 164 were already in the mirror, 48 were not (1 EterLib = the SDK shim above, 5 EterPythonLib = this round, 42 UserInterface = 2V0-d, all behind UserInterface/PythonApplication.h). Of the 10 units, 2 are ported (ScriptLib/PythonLauncher.cpp, UserInterface/PythonPackModule.cpp) and 8 are not.", "tests": ["cmake --build build --target port_header_gate -> the 6 new gate translation units compile (each header alone, twice, behind EterPythonLib/StdAfx.h)", "ctest --test-dir build -> 27/27 passed"], "not_done": "EterPythonLib/*.cpp(2V0-b);wndMgr/grp/grpImage/grpText 模块(2V0-c);42 个 UserInterface 头 + PythonApplicationModule.cpp(2V0-d)", "commit": "2V0-a"} {"time": "2026-09-23T02:17:52Z", "event": "port_round", "unit": "PORT-PLAN 批次 2V0-b: window tree completion and 64-bit LZO boundary repair", "ported": ["EterPythonLib/PythonWindow.cpp (211 functions)", "EterPythonLib/PythonWindowManager.cpp (76)", "EterPythonLib/PythonSlotWindow.cpp (80)", "EterPythonLib/PythonGridSlotWindow.cpp (14)", "EterLib/ReferenceObject.cpp (9)", "EterLib/Resource.cpp (18)", "EterLib/ResourceManager.cpp (25)"], "adapted": ["EterBase/lzo.cpp: CLZObject::Compress and CLZObject::Decompress use native-width lzo_uint at the liblzo API while retaining 32-bit pack-header lengths"], "divergent": [], "needs_live": [], "status_note": "The seven units in b4c9d6ce are exact mechanical copies of 40250 (0 manual edits); their 433 functions are recorded in port-map. The original port.window_tree test had four expectations contrary to 40250: DeactivateWindow restores the previous active window and SetTop changes update order; corrected the expectations. A fresh 64-bit build exposed stack corruption in the older LZO caller because Win32 UINT (4 bytes) was passed as native lzo_uint* (8 bytes); fixed the boundary. The normal app path still does not load the UI shell; module registration and rendering remain 2V0-c through 2V0-f.", "tests": ["port_copy.py diff on seven units: 0 manual edits", "ctest -R port.window_tree: pass", "ctest -R port.eterpack: pass, including added LZO compress/decompress round trip and full pack inventory", "ctest -R port.python_launcher: pass", "ctest --test-dir build --output-on-failure -j6: 28/28 pass", "port_map.py check: 0 errors"], "not_done": "2V0-c through 2V0-f; normal app startup and visible interactive Logo/Popup are the whole 2V0 acceptance gate, not the 2V0-b substep.", "commit": "2V0-b-completion"} +{"time": "2026-09-23T02:57:22Z", "event": "port_round", "unit": "PORT-PLAN 2V0-c/d and beginning of 2V0-e", "ported": ["EterPythonLib/PythonWindowManagerModule.cpp", "EterPythonLib/PythonGraphicModule.cpp", "EterPythonLib/PythonGraphicImageModule.cpp", "EterPythonLib/PythonGraphicTextModule.cpp", "EterPythonLib/PythonGraphicThingModule.cpp", "UserInterface/PythonApplicationModule.cpp", "ScriptLib/PythonDebugModule.cpp", "42 UserInterface dependency headers"], "adapted": ["Python pointer handles via PyLong_FromVoidPtr/PyLong_AsVoidPtr (native pointer width)", "Win32 FindFirstFile/FindNextFile shim for app file enumeration", "Godot PythonBoot registers dbg, grp, grpImage, grpText, wndMgr and app and propagates dbg.LogBox failures"], "divergent": ["CPythonApplication platform lifecycle and graphics methods remain MT_PLATFORM_STUB; no visible Logo/Popup yet", "DevIL image and DirectShow logo backends remain MT_PLATFORM_STUB"], "tests": ["cmake --build build -> pass", "ctest --test-dir build --output-on-failure -j6 -> 29/29 passed, 1 skipped", "godot --headless --path project --script python_host_test.gd -> system.py reaches constInfo.py import net and reports ImportError through RunMainScript", "port_map.py check -> 0 errors"], "not_done": "2V0-e native gameplay module stubs and prototype.RunApp; 2V0-f Godot UI renderer/input/Logo/Popup runtime acceptance", "status_note": "The app binding imports, but its CPythonApplication adapter is only a link surface. The 2V0 acceptance gate is not yet met."} diff --git a/audit/port-map/EterPythonLib/PythonGraphicImageModule.cpp.json b/audit/port-map/EterPythonLib/PythonGraphicImageModule.cpp.json new file mode 100644 index 00000000..0f9be71e --- /dev/null +++ b/audit/port-map/EterPythonLib/PythonGraphicImageModule.cpp.json @@ -0,0 +1,117 @@ +{ + "reference": "EterPythonLib/PythonGraphicImageModule.cpp", + "reference_sha256": "1baa501715a276d533c0bc79718e12f57d15b1fb08d87ba03c4f3b2814afdce3", + "priority": "P4", + "contracts": [], + "functions": { + "PyTuple_GetImageInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:PyTuple_GetImageInstance" + ] + }, + "PyTuple_GetExpandedImageInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:PyTuple_GetExpandedImageInstance" + ] + }, + "grpImageGenerate": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpImageGenerate" + ] + }, + "grpImageGenerateExpanded": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpImageGenerateExpanded" + ] + }, + "grpImageGenerateFromHandle": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpImageGenerateFromHandle" + ] + }, + "grpImageDelete": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpImageDelete" + ] + }, + "grpImageDeleteExpanded": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpImageDeleteExpanded" + ] + }, + "grpImageSetFileName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpImageSetFileName" + ] + }, + "grpImageRender": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpImageRender" + ] + }, + "grpSetImagePosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpSetImagePosition" + ] + }, + "grpSetImageOrigin": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpSetImageOrigin" + ] + }, + "grpSetImageRotation": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpSetImageRotation" + ] + }, + "grpSetImageScale": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpSetImageScale" + ] + }, + "grpSetRenderingRect": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpSetRenderingRect" + ] + }, + "grpSetImageDiffuseColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpSetImageDiffuseColor" + ] + }, + "grpGetWidth": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpGetWidth" + ] + }, + "grpGetHeight": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:grpGetHeight" + ] + }, + "initgrpImage": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp:initgrpImage" + ], + "test": "extension/tests/port_python_ui_modules_test.cpp (port.python_ui_modules)" + } + } +} diff --git a/audit/port-map/EterPythonLib/PythonGraphicModule.cpp.json b/audit/port-map/EterPythonLib/PythonGraphicModule.cpp.json new file mode 100644 index 00000000..f8e02959 --- /dev/null +++ b/audit/port-map/EterPythonLib/PythonGraphicModule.cpp.json @@ -0,0 +1,339 @@ +{ + "reference": "EterPythonLib/PythonGraphicModule.cpp", + "reference_sha256": "5ef45f5997988815a6e074a35bd8a56231efffa0b4ff3efd0dd7bd316e6c8d8a", + "priority": "P4", + "contracts": [], + "functions": { + "grpCreateTextBar": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpCreateTextBar" + ] + }, + "grpCreateBigTextBar": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpCreateBigTextBar" + ] + }, + "grpDestroyTextBar": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpDestroyTextBar" + ] + }, + "grpRenderTextBar": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpRenderTextBar" + ] + }, + "grpTextBarSetTextColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpTextBarSetTextColor" + ] + }, + "grpTextBarGetTextExtent": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpTextBarGetTextExtent" + ] + }, + "grpTextBarTextOut": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpTextBarTextOut" + ] + }, + "grpClearTextBar": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpClearTextBar" + ] + }, + "grpSetTextBarClipRect": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetTextBarClipRect" + ] + }, + "grpCulling": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpCulling" + ] + }, + "grpInitScreenEffect": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpInitScreenEffect" + ] + }, + "grpClearDepthBuffer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpClearDepthBuffer" + ] + }, + "grpPushState": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpPushState" + ] + }, + "grpPopState": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpPopState" + ] + }, + "grpPushMatrix": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpPushMatrix" + ] + }, + "grpPopMatrix": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpPopMatrix" + ] + }, + "grpTranslate": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpTranslate" + ] + }, + "grpRotate": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpRotate" + ] + }, + "grpSetColorRenderState": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetColorRenderState" + ] + }, + "grpSetAroundCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetAroundCamera" + ] + }, + "grpSetPositionCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetPositionCamera" + ] + }, + "grpSetEyeCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetEyeCamera" + ] + }, + "grpSetPerspective": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetPerspective" + ] + }, + "grpSetOrtho2D": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetOrtho2D" + ] + }, + "grpSetOrtho3D": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetOrtho3D" + ] + }, + "grpGenerateColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpGenerateColor" + ] + }, + "grpSetColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetColor" + ] + }, + "grpSetAlpha": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetAlpha" + ] + }, + "grpGetCursorPosition3d": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpGetCursorPosition3d" + ] + }, + "grpSetCursorPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetCursorPosition" + ] + }, + "grpRenderLine": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpRenderLine" + ] + }, + "grpRenderRoundBox": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpRenderRoundBox" + ] + }, + "grpRenderBox": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpRenderBox" + ] + }, + "grpRenderBar": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpRenderBar" + ] + }, + "grpRenderCube": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpRenderCube" + ] + }, + "grpRenderBar3d": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpRenderBar3d" + ] + }, + "grpRenderGradationBar": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpRenderGradationBar" + ] + }, + "grpRenderDownButton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpRenderDownButton" + ] + }, + "grpRenderUpButton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpRenderUpButton" + ] + }, + "grpRenderBox3d": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpRenderBox3d" + ] + }, + "grpSetClearColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetClearColor" + ] + }, + "grpSetDiffuseColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetDiffuseColor" + ] + }, + "grpIdentity": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpIdentity" + ] + }, + "grpGetAvailableMemory": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpGetAvailableMemory" + ] + }, + "grpSaveScreenShotToPath": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSaveScreenShotToPath" + ] + }, + "grpSaveScreenShot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSaveScreenShot" + ] + }, + "grpSetGamma": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetGamma" + ] + }, + "grpSetInterfaceRenderState": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetInterfaceRenderState" + ] + }, + "grpSetGameRenderState": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetGameRenderState" + ] + }, + "grpSetViewport": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetViewport" + ] + }, + "grpRestoreViewport": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpRestoreViewport" + ] + }, + "grpSetOmniLight": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpSetOmniLight" + ] + }, + "grpGetCameraPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpGetCameraPosition" + ] + }, + "grpGetTargetPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:grpGetTargetPosition" + ] + }, + "initgrp": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicModule.cpp:initgrp" + ], + "test": "extension/tests/port_python_ui_modules_test.cpp (port.python_ui_modules)" + } + } +} diff --git a/audit/port-map/EterPythonLib/PythonGraphicTextModule.cpp.json b/audit/port-map/EterPythonLib/PythonGraphicTextModule.cpp.json new file mode 100644 index 00000000..eb92bf46 --- /dev/null +++ b/audit/port-map/EterPythonLib/PythonGraphicTextModule.cpp.json @@ -0,0 +1,147 @@ +{ + "reference": "EterPythonLib/PythonGraphicTextModule.cpp", + "reference_sha256": "a49b35e36427c263b1ea179b241c886fb205974f91c7211ea60fa86cdea25c5c", + "priority": "P4", + "contracts": [], + "functions": { + "PyTuple_GetTextInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:PyTuple_GetTextInstance" + ] + }, + "grpTextGenerate": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextGenerate" + ] + }, + "grpTextDestroy": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextDestroy" + ] + }, + "grpTextGetSize": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextGetSize" + ] + }, + "grpTextSetPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextSetPosition" + ] + }, + "grpTextSetText": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextSetText" + ] + }, + "grpTextSetSecret": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextSetSecret" + ] + }, + "grpTextOutline": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextOutline" + ] + }, + "grpTextGetText": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextGetText" + ] + }, + "grpTextSetFontName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextSetFontName" + ] + }, + "grpTextSetFontColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextSetFontColor" + ] + }, + "grpTextSetOutLineColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextSetOutLineColor" + ] + }, + "grpTextRender": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextRender" + ] + }, + "grpTextUpdate": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextUpdate" + ] + }, + "grpTextShowCursor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextShowCursor" + ] + }, + "grpTextHideCursor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextHideCursor" + ] + }, + "grpSetHorizontalAlign": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpSetHorizontalAlign" + ] + }, + "grpSetVerticalAlign": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpSetVerticalAlign" + ] + }, + "grpSetMax": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpSetMax" + ] + }, + "grpGetSplitingTextLineCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpGetSplitingTextLineCount" + ] + }, + "grpGetSplitingTextLine": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpGetSplitingTextLine" + ] + }, + "grpTextPixelPositionToCharacterPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:grpTextPixelPositionToCharacterPosition" + ] + }, + "initgrpText": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp:initgrpText" + ], + "test": "extension/tests/port_python_ui_modules_test.cpp (port.python_ui_modules)" + } + } +} diff --git a/audit/port-map/EterPythonLib/PythonGraphicThingModule.cpp.json b/audit/port-map/EterPythonLib/PythonGraphicThingModule.cpp.json new file mode 100644 index 00000000..5228a874 --- /dev/null +++ b/audit/port-map/EterPythonLib/PythonGraphicThingModule.cpp.json @@ -0,0 +1,69 @@ +{ + "reference": "EterPythonLib/PythonGraphicThingModule.cpp", + "reference_sha256": "d6306a86136347ad1ec24143c4ea7aa93d32fb9559c2a33e07389a3602f70400", + "priority": "P4", + "contracts": [], + "functions": { + "PyTuple_GetThingInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicThingModule.cpp:PyTuple_GetThingInstance" + ] + }, + "grpThingGenerate": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicThingModule.cpp:grpThingGenerate" + ] + }, + "grpThingDelete": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicThingModule.cpp:grpThingDelete" + ] + }, + "grpThingSetFileName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicThingModule.cpp:grpThingSetFileName" + ] + }, + "grpThingRender": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicThingModule.cpp:grpThingRender" + ] + }, + "grpThingUpdate": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicThingModule.cpp:grpThingUpdate" + ] + }, + "grpSetThingPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicThingModule.cpp:grpSetThingPosition" + ] + }, + "grpSetThingRotation": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicThingModule.cpp:grpSetThingRotation" + ] + }, + "grpSetThingScale": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicThingModule.cpp:grpSetThingScale" + ] + }, + "initgrpThing": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonGraphicThingModule.cpp:initgrpThing" + ], + "test": "extension/tests/port_python_ui_modules_test.cpp (port.python_ui_modules)" + } + } +} diff --git a/audit/port-map/EterPythonLib/PythonWindowManagerModule.cpp.json b/audit/port-map/EterPythonLib/PythonWindowManagerModule.cpp.json new file mode 100644 index 00000000..c19f777a --- /dev/null +++ b/audit/port-map/EterPythonLib/PythonWindowManagerModule.cpp.json @@ -0,0 +1,954 @@ +{ + "reference": "EterPythonLib/PythonWindowManagerModule.cpp", + "reference_sha256": "472c1c91ab9c3c9dc9b31f88c6f312e3ff0db82b33c2300f5555be8a9f196446", + "priority": "P4", + "contracts": [], + "functions": { + "PyTuple_GetWindow": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:PyTuple_GetWindow" + ] + }, + "wndMgrGetAspect": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetAspect" + ] + }, + "wndMgrOnceIgnoreMouseLeftButtonUpEvent": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrOnceIgnoreMouseLeftButtonUpEvent" + ] + }, + "wndMgrSetMouseHandler": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetMouseHandler" + ] + }, + "wndMgrRegister": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegister" + ], + "test": "extension/tests/port_python_ui_modules_test.cpp (port.python_ui_modules)" + }, + "wndMgrRegisterSlotWindow": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterSlotWindow" + ] + }, + "wndMgrRegisterGridSlotWindow": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterGridSlotWindow" + ] + }, + "wndMgrRegisterTextLine": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterTextLine" + ] + }, + "wndMgrRegisterMarkBox": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterMarkBox" + ] + }, + "wndMgrRegisterImageBox": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterImageBox" + ] + }, + "wndMgrRegisterExpandedImageBox": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterExpandedImageBox" + ] + }, + "wndMgrRegisterAniImageBox": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterAniImageBox" + ] + }, + "wndMgrRegisterButton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterButton" + ] + }, + "wndMgrRegisterRadioButton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterRadioButton" + ] + }, + "wndMgrRegisterToggleButton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterToggleButton" + ] + }, + "wndMgrRegisterDragButton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterDragButton" + ] + }, + "wndMgrRegisterBox": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterBox" + ] + }, + "wndMgrRegisterBar": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterBar" + ] + }, + "wndMgrRegisterLine": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterLine" + ] + }, + "wndMgrRegisterBar3D": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterBar3D" + ] + }, + "wndMgrRegisterNumberLine": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRegisterNumberLine" + ] + }, + "wndMgrDestroy": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrDestroy" + ], + "test": "extension/tests/port_python_ui_modules_test.cpp (port.python_ui_modules)" + }, + "wndMgrIsFocus": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrIsFocus" + ] + }, + "wndMgrSetFocus": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetFocus" + ] + }, + "wndMgrKillFocus": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrKillFocus" + ] + }, + "wndMgrLock": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrLock" + ] + }, + "wndMgrUnlock": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrUnlock" + ] + }, + "wndMgrSetName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetName" + ], + "test": "extension/tests/port_python_ui_modules_test.cpp (port.python_ui_modules)" + }, + "wndMgrSetTop": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetTop" + ] + }, + "wndMgrShow": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrShow" + ] + }, + "wndMgrHide": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrHide" + ] + }, + "wndMgrIsShow": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrIsShow" + ] + }, + "wndMgrIsRTL": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrIsRTL" + ] + }, + "wndMgrSetScreenSize": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetScreenSize" + ] + }, + "wndMgrSetParent": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetParent" + ] + }, + "wndMgrSetPickAlways": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetPickAlways" + ] + }, + "wndMgrSetWndSize": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetWndSize" + ] + }, + "wndMgrSetWndPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetWndPosition" + ] + }, + "wndMgrGetName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetName" + ] + }, + "wndMgrGetWndWidth": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetWndWidth" + ] + }, + "wndMgrGetWndHeight": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetWndHeight" + ] + }, + "wndMgrGetWndLocalPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetWndLocalPosition" + ] + }, + "wndMgrGetWndGlobalPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetWndGlobalPosition" + ] + }, + "wndMgrGetWindowRect": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetWindowRect" + ] + }, + "wndMgrSetWindowHorizontalAlign": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetWindowHorizontalAlign" + ] + }, + "wndMgrSetWindowVerticalAlign": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetWindowVerticalAlign" + ] + }, + "wndMgrIsIn": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrIsIn" + ] + }, + "wndMgrGetMouseLocalPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetMouseLocalPosition" + ] + }, + "wndMgrGetHyperlink": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetHyperlink" + ] + }, + "wndMgrGetScreenWidth": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetScreenWidth" + ] + }, + "wndMgrGetScreenHeight": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetScreenHeight" + ] + }, + "wndMgrGetMousePosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetMousePosition" + ] + }, + "wndMgrIsDragging": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrIsDragging" + ] + }, + "wndMgrIsPickedWindow": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrIsPickedWindow" + ] + }, + "wndMgrGetChildCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetChildCount" + ] + }, + "wndMgrAddFlag": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrAddFlag" + ] + }, + "wndMgrSetLimitBias": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetLimitBias" + ] + }, + "wndMgrUpdateRect": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrUpdateRect" + ] + }, + "wndMgrAppendSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrAppendSlot" + ] + }, + "wndMgrArrangeSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrArrangeSlot" + ] + }, + "wndMgrSetSlotBaseImage": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetSlotBaseImage" + ] + }, + "wndMgrSetCoverButton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetCoverButton" + ] + }, + "wndMgrEnableCoverButton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrEnableCoverButton" + ] + }, + "wndMgrDisableCoverButton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrDisableCoverButton" + ] + }, + "wndMgrIsDisableCoverButton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrIsDisableCoverButton" + ] + }, + "wndMgrSetAlwaysRenderCoverButton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetAlwaysRenderCoverButton" + ] + }, + "wndMgrAppendSlotButton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrAppendSlotButton" + ] + }, + "wndMgrAppendRequirementSignImage": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrAppendRequirementSignImage" + ] + }, + "wndMgrShowSlotButton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrShowSlotButton" + ] + }, + "wndMgrHideAllSlotButton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrHideAllSlotButton" + ] + }, + "wndMgrShowRequirementSign": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrShowRequirementSign" + ] + }, + "wndMgrHideRequirementSign": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrHideRequirementSign" + ] + }, + "wndMgrRefreshSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrRefreshSlot" + ] + }, + "wndMgrSetUseMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetUseMode" + ] + }, + "wndMgrSetUsableItem": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetUsableItem" + ] + }, + "wndMgrClearSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrClearSlot" + ] + }, + "wndMgrClearAllSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrClearAllSlot" + ] + }, + "wndMgrHasSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrHasSlot" + ] + }, + "wndMgrSetSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetSlot" + ] + }, + "wndMgrSetSlotCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetSlotCount" + ] + }, + "wndMgrSetSlotCountNew": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetSlotCountNew" + ] + }, + "wndMgrSetSlotCoolTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetSlotCoolTime" + ] + }, + "wndMgrSetToggleSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetToggleSlot" + ] + }, + "wndMgrActivateSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrActivateSlot" + ] + }, + "wndMgrDeactivateSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrDeactivateSlot" + ] + }, + "wndMgrEnableSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrEnableSlot" + ] + }, + "wndMgrDisableSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrDisableSlot" + ] + }, + "wndMgrShowSlotBaseImage": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrShowSlotBaseImage" + ] + }, + "wndMgrHideSlotBaseImage": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrHideSlotBaseImage" + ] + }, + "wndMgrSetSlotType": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetSlotType" + ] + }, + "wndMgrSetSlotStyle": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetSlotStyle" + ] + }, + "wndMgrSelectSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSelectSlot" + ] + }, + "wndMgrClearSelected": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrClearSelected" + ] + }, + "wndMgrGetSelectedSlotCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetSelectedSlotCount" + ] + }, + "wndMgrGetSelectedSlotNumber": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetSelectedSlotNumber" + ] + }, + "wndMgrIsSelectedSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrIsSelectedSlot" + ] + }, + "wndMgrGetSlotCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrGetSlotCount" + ] + }, + "wndMgrLockSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrLockSlot" + ] + }, + "wndMgrUnlockSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrUnlockSlot" + ] + }, + "wndBarSetColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndBarSetColor" + ] + }, + "wndMgrAttachIcon": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrAttachIcon" + ] + }, + "wndMgrDeattachIcon": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrDeattachIcon" + ] + }, + "wndMgrSetAttachingFlag": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetAttachingFlag" + ] + }, + "wndTextSetMax": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextSetMax" + ] + }, + "wndTextSetHorizontalAlign": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextSetHorizontalAlign" + ] + }, + "wndTextSetVerticalAlign": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextSetVerticalAlign" + ] + }, + "wndTextSetSecret": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextSetSecret" + ] + }, + "wndTextSetOutline": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextSetOutline" + ] + }, + "wndTextSetFeather": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextSetFeather" + ] + }, + "wndTextSetMultiLine": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextSetMultiLine" + ] + }, + "wndTextSetFontName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextSetFontName" + ] + }, + "wndTextSetFontColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextSetFontColor" + ] + }, + "wndTextSetLimitWidth": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextSetLimitWidth" + ] + }, + "wndTextSetText": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextSetText" + ] + }, + "wndTextGetText": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextGetText" + ] + }, + "wndTextGetTextSize": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextGetTextSize" + ] + }, + "wndTextShowCursor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextShowCursor" + ] + }, + "wndTextHideCursor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextHideCursor" + ] + }, + "wndTextGetCursorPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndTextGetCursorPosition" + ] + }, + "wndNumberSetNumber": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndNumberSetNumber" + ] + }, + "wndNumberSetNumberHorizontalAlignCenter": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndNumberSetNumberHorizontalAlignCenter" + ] + }, + "wndNumberSetNumberHorizontalAlignRight": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndNumberSetNumberHorizontalAlignRight" + ] + }, + "wndNumberSetPath": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndNumberSetPath" + ] + }, + "wndMarkBox_SetImageFilename": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMarkBox_SetImageFilename" + ] + }, + "wndMarkBox_SetImage": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMarkBox_SetImage" + ] + }, + "wndMarkBox_Load": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMarkBox_Load" + ] + }, + "wndMarkBox_SetIndex": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMarkBox_SetIndex" + ] + }, + "wndMarkBox_SetScale": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMarkBox_SetScale" + ] + }, + "wndMarkBox_SetDiffuseColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMarkBox_SetDiffuseColor" + ] + }, + "wndImageLoadImage": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndImageLoadImage" + ] + }, + "wndImageSetDiffuseColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndImageSetDiffuseColor" + ] + }, + "wndImageGetWidth": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndImageGetWidth" + ] + }, + "wndImageGetHeight": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndImageGetHeight" + ] + }, + "wndImageSetScale": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndImageSetScale" + ] + }, + "wndImageSetOrigin": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndImageSetOrigin" + ] + }, + "wndImageSetRotation": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndImageSetRotation" + ] + }, + "wndImageSetRenderingRect": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndImageSetRenderingRect" + ] + }, + "wndImageSetRenderingMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndImageSetRenderingMode" + ] + }, + "wndImageSetDelay": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndImageSetDelay" + ] + }, + "wndImageAppendImage": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndImageAppendImage" + ] + }, + "wndButtonSetUpVisual": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndButtonSetUpVisual" + ] + }, + "wndButtonSetOverVisual": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndButtonSetOverVisual" + ] + }, + "wndButtonSetDownVisual": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndButtonSetDownVisual" + ] + }, + "wndButtonSetDisableVisual": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndButtonSetDisableVisual" + ] + }, + "wndButtonGetUpVisualFileName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndButtonGetUpVisualFileName" + ] + }, + "wndButtonGetOverVisualFileName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndButtonGetOverVisualFileName" + ] + }, + "wndButtonGetDownVisualFileName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndButtonGetDownVisualFileName" + ] + }, + "wndButtonFlash": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndButtonFlash" + ] + }, + "wndButtonEnable": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndButtonEnable" + ] + }, + "wndButtonDisable": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndButtonDisable" + ] + }, + "wndButtonDown": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndButtonDown" + ] + }, + "wndButtonSetUp": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndButtonSetUp" + ] + }, + "wndButtonSetRestrictMovementArea": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndButtonSetRestrictMovementArea" + ] + }, + "wndButtonIsDown": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndButtonIsDown" + ] + }, + "wndMgrSetOutlineFlag": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrSetOutlineFlag" + ] + }, + "wndMgrShowOverInWindowName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:wndMgrShowOverInWindowName" + ] + }, + "initwndMgr": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp:initwndMgr" + ], + "test": "extension/tests/port_python_ui_modules_test.cpp (port.python_ui_modules)" + } + } +} diff --git a/audit/port-map/ScriptLib/PythonDebugModule.cpp.json b/audit/port-map/ScriptLib/PythonDebugModule.cpp.json new file mode 100644 index 00000000..71b79c7f --- /dev/null +++ b/audit/port-map/ScriptLib/PythonDebugModule.cpp.json @@ -0,0 +1,45 @@ +{ + "reference": "ScriptLib/PythonDebugModule.cpp", + "reference_sha256": "2b2fa7c750cd61f3a9bfb58088ea9f277b56a52bf7c8c0a068ca5bd6aaa7f2f9", + "priority": "P4", + "contracts": [], + "functions": { + "dbgLogBox": { + "status": "PORTED", + "impl": [ + "extension/src/port/ScriptLib/PythonDebugModule.cpp:dbgLogBox" + ] + }, + "dbgTrace": { + "status": "PORTED", + "impl": [ + "extension/src/port/ScriptLib/PythonDebugModule.cpp:dbgTrace" + ] + }, + "dbgTracen": { + "status": "PORTED", + "impl": [ + "extension/src/port/ScriptLib/PythonDebugModule.cpp:dbgTracen" + ] + }, + "dbgTraceError": { + "status": "PORTED", + "impl": [ + "extension/src/port/ScriptLib/PythonDebugModule.cpp:dbgTraceError" + ] + }, + "dbgRegisterExceptionString": { + "status": "PORTED", + "impl": [ + "extension/src/port/ScriptLib/PythonDebugModule.cpp:dbgRegisterExceptionString" + ] + }, + "initdbg": { + "status": "PORTED", + "impl": [ + "extension/src/port/ScriptLib/PythonDebugModule.cpp:initdbg" + ], + "test": "project/python_host_check.gd (Godot system.py import)" + } + } +} diff --git a/audit/port-map/UserInterface/PythonApplicationModule.cpp.json b/audit/port-map/UserInterface/PythonApplicationModule.cpp.json new file mode 100644 index 00000000..08625cee --- /dev/null +++ b/audit/port-map/UserInterface/PythonApplicationModule.cpp.json @@ -0,0 +1,669 @@ +{ + "reference": "UserInterface/PythonApplicationModule.cpp", + "reference_sha256": "8fa802b3ae55e7de225ddb5dc3ed0b2a822d14e4dd754a64aacd6978be21dd10", + "priority": "P4", + "contracts": [], + "functions": { + "appShowWebPage": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appShowWebPage" + ] + }, + "appMoveWebPage": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appMoveWebPage" + ] + }, + "appHideWebPage": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appHideWebPage" + ] + }, + "appIsWebPageMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appIsWebPageMode" + ] + }, + "appEnablePerformanceTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appEnablePerformanceTime" + ] + }, + "appSetTextTailLivingTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetTextTailLivingTime" + ] + }, + "appSetHairColorEnable": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetHairColorEnable" + ] + }, + "appSetArmorSpecularEnable": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetArmorSpecularEnable" + ] + }, + "appSetWeaponSpecularEnable": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetWeaponSpecularEnable" + ] + }, + "appSetSkillEffectUpgradeEnable": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetSkillEffectUpgradeEnable" + ] + }, + "SetTwoHandedWeaponAttSpeedDecreaseValue": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:SetTwoHandedWeaponAttSpeedDecreaseValue" + ] + }, + "appSetRideHorseEnable": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetRideHorseEnable" + ] + }, + "appSetCameraMaxDistance": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetCameraMaxDistance" + ] + }, + "appSetControlFP": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetControlFP" + ] + }, + "appSetSpecularSpeed": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetSpecularSpeed" + ] + }, + "appSetMinFog": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetMinFog" + ] + }, + "appSetFrameSkip": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetFrameSkip" + ] + }, + "appForceSetLocale": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appForceSetLocale" + ] + }, + "appGetLocaleServiceName": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetLocaleServiceName" + ] + }, + "appSetCHEONMA": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetCHEONMA" + ] + }, + "appIsCHEONMA": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appIsCHEONMA" + ] + }, + "appLoadLocaleAddr": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appLoadLocaleAddr" + ] + }, + "appLoadLocaleData": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appLoadLocaleData" + ] + }, + "appGetLocaleName": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetLocaleName" + ] + }, + "appGetLocalePath": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetLocalePath" + ] + }, + "appGetDefaultCodePage": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetDefaultCodePage" + ] + }, + "appGetImageInfo": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetImageInfo" + ] + }, + "appIsExistFile": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appIsExistFile" + ] + }, + "appGetFileList": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetFileList" + ] + }, + "appUpdateGame": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appUpdateGame" + ] + }, + "appRenderGame": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appRenderGame" + ] + }, + "appSetMouseHandler": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetMouseHandler" + ] + }, + "appCreate": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appCreate" + ] + }, + "appLoop": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appLoop" + ] + }, + "appGetInfo": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetInfo" + ] + }, + "appProcess": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appProcess" + ] + }, + "appAbort": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appAbort" + ] + }, + "appExit": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appExit" + ] + }, + "appSetCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetCamera" + ] + }, + "appGetCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetCamera" + ] + }, + "appGetCameraPitch": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetCameraPitch" + ] + }, + "appGetCameraRotation": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetCameraRotation" + ] + }, + "appGetTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetTime" + ] + }, + "appGetGlobalTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetGlobalTime" + ] + }, + "appGetGlobalTimeStamp": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetGlobalTimeStamp" + ] + }, + "appGetUpdateFPS": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetUpdateFPS" + ] + }, + "appGetRenderFPS": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetRenderFPS" + ] + }, + "appRotateCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appRotateCamera" + ] + }, + "appPitchCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appPitchCamera" + ] + }, + "appZoomCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appZoomCamera" + ] + }, + "appMovieRotateCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appMovieRotateCamera" + ] + }, + "appMoviePitchCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appMoviePitchCamera" + ] + }, + "appMovieZoomCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appMovieZoomCamera" + ] + }, + "appMovieResetCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appMovieResetCamera" + ] + }, + "appGetFaceSpeed": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetFaceSpeed" + ] + }, + "appGetRenderTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetRenderTime" + ] + }, + "appGetUpdateTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetUpdateTime" + ] + }, + "appGetLoad": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetLoad" + ] + }, + "appGetFaceCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetFaceCount" + ] + }, + "appGetAvaiableTextureMememory": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetAvaiableTextureMememory" + ] + }, + "appSetFPS": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetFPS" + ] + }, + "appSetGlobalCenterPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetGlobalCenterPosition" + ] + }, + "appSetCenterPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetCenterPosition" + ] + }, + "appGetCursorPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetCursorPosition" + ] + }, + "appRunPythonFile": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appRunPythonFile" + ] + }, + "appIsPressed": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appIsPressed" + ] + }, + "appSetCursor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetCursor" + ] + }, + "appGetCursor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetCursor" + ] + }, + "appShowCursor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appShowCursor" + ] + }, + "appHideCursor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appHideCursor" + ] + }, + "appIsShowCursor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appIsShowCursor" + ] + }, + "appIsLiarCursorOn": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appIsLiarCursorOn" + ] + }, + "appSetSoftwareCursor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetSoftwareCursor" + ] + }, + "appSetHardwareCursor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetHardwareCursor" + ] + }, + "appSetConnectData": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetConnectData" + ] + }, + "appGetConnectData": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetConnectData" + ] + }, + "appGetRandom": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetRandom" + ] + }, + "appGetRotatingDirection": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetRotatingDirection" + ] + }, + "appGetDegreeDifference": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetDegreeDifference" + ] + }, + "appSleep": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSleep" + ] + }, + "appSetDefaultFontName": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetDefaultFontName" + ] + }, + "appSetGuildSymbolPath": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetGuildSymbolPath" + ] + }, + "appEnableSpecialCameraMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appEnableSpecialCameraMode" + ] + }, + "appSetCameraSpeed": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetCameraSpeed" + ] + }, + "appIsFileExist": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appIsFileExist" + ] + }, + "appSetCameraSetting": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetCameraSetting" + ] + }, + "appSaveCameraSetting": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSaveCameraSetting" + ] + }, + "appLoadCameraSetting": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appLoadCameraSetting" + ] + }, + "appSetDefaultCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetDefaultCamera" + ] + }, + "appSetSightRange": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetSightRange" + ] + }, + "apptestGetAccumulationTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:apptestGetAccumulationTime" + ] + }, + "apptestResetAccumulationTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:apptestResetAccumulationTime" + ] + }, + "apptestSetSpecularColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:apptestSetSpecularColor" + ] + }, + "appSetVisibleNotice": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetVisibleNotice" + ] + }, + "appIsVisibleNotice": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appIsVisibleNotice" + ] + }, + "appEnableTestServerFlag": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appEnableTestServerFlag" + ] + }, + "appIsEnableTestServerFlag": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appIsEnableTestServerFlag" + ] + }, + "appOpenTextFile": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appOpenTextFile" + ] + }, + "appCloseTextFile": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appCloseTextFile" + ] + }, + "appGetTextFileLineCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetTextFileLineCount" + ] + }, + "appGetTextFileLine": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appGetTextFileLine" + ] + }, + "appSetGuildMarkPath": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appSetGuildMarkPath" + ] + }, + "appIsDevStage": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appIsDevStage" + ] + }, + "appIsTestStage": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appIsTestStage" + ] + }, + "appIsLiveStage": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appIsLiveStage" + ] + }, + "appLogoOpen": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appLogoOpen" + ] + }, + "appLogoUpdate": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appLogoUpdate" + ] + }, + "appLogoRender": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appLogoRender" + ] + }, + "appLogoClose": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:appLogoClose" + ] + }, + "initapp": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonApplicationModule.cpp:initapp" + ], + "test": "extension/tests/port_python_ui_modules_test.cpp (port.python_ui_modules)" + } + } +} diff --git a/docs/PORT-PLAN.md b/docs/PORT-PLAN.md index 46963f17..9aad4ecf 100644 --- a/docs/PORT-PLAN.md +++ b/docs/PORT-PLAN.md @@ -397,9 +397,9 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次 | --- | --- | --- | | 2V0-a | `EterPythonLib/StdAfx.h` + 5 个窗口系统头进镜像,门禁绿 | 完成 | | 2V0-b | `EterPythonLib/PythonWindow.cpp`、`PythonWindowManager.cpp`(窗口树逻辑;含 Slot/GridSlot 与资源层依赖) | 完成:原版源码机械移植,`port.window_tree` 通过;正式 UI 渲染仍属 2V0-f | - | 2V0-c | `wndMgr` / `grp` / `grpImage` / `grpText` / `grpThing` 模块 | 未做 | - | 2V0-d | 42 个 `UserInterface` 头(都在 `PythonApplication.h` 后面)+ `PythonApplicationModule.cpp`(`app`) | 未做 | - | 2V0-e | `dbg` 等桩模块补齐,`system.py` 跑到 `prototype.RunApp()` | 未做 | + | 2V0-c | `wndMgr` / `grp` / `grpImage` / `grpText` / `grpThing` 模块 | 绑定已移植并通过导入/窗口句柄测试;图形绘制仍属 2V0-f | + | 2V0-d | 42 个 `UserInterface` 头(都在 `PythonApplication.h` 后面)+ `PythonApplicationModule.cpp`(`app`) | 头与绑定已编译、链接并导入;应用生命周期 adapter 仍属 2V0-f | + | 2V0-e | `dbg` 等桩模块补齐,`system.py` 跑到 `prototype.RunApp()` | 进行中:`dbg` 原版绑定已移植;Godot 进程内 `system.py` 目前停在 `constInfo.py` 的 `import net` | | 2V0-f | Godot 渲染器上的 platform UI adapter;Logo/Popup 可显示可操作 | 未做 | 2. **2V1 — 登录/选角**:加入 `PythonNetworkStream{,PhaseHandShake,PhaseLogin,PhaseSelect,PhaseLoading}.cpp`、 `PythonNetworkStreamModule.cpp`、AccountConnector 及登录/选角脚本真实调用到的模块。验收为 FakeServer 离线完成 phase 顺序, diff --git a/extension/src/platform/EterImageLib/DevIL.cpp b/extension/src/platform/EterImageLib/DevIL.cpp new file mode 100644 index 00000000..6c6e96c6 --- /dev/null +++ b/extension/src/platform/EterImageLib/DevIL.cpp @@ -0,0 +1,13 @@ +#include +#include "../PlatformStub.h" + +void ilGenImages(unsigned count, ILuint* images) +{ + MT_PLATFORM_STUB(); + for (unsigned i = 0; i < count; ++i) + images[i] = 0; +} +void ilBindImage(ILuint) { MT_PLATFORM_STUB(); } +bool ilLoad(unsigned, const char*) { MT_PLATFORM_STUB(); return false; } +int ilGetInteger(unsigned) { MT_PLATFORM_STUB(); return 0; } +void ilDeleteImages(unsigned, const ILuint*) { MT_PLATFORM_STUB(); } diff --git a/extension/src/platform/EterLib/Camera.cpp b/extension/src/platform/EterLib/Camera.cpp new file mode 100644 index 00000000..9bb86ff7 --- /dev/null +++ b/extension/src/platform/EterLib/Camera.cpp @@ -0,0 +1,9 @@ +#include "EterLib/StdAfx.h" +#include "EterLib/Camera.h" +#include "../PlatformStub.h" + +CCamera* CCameraManager::GetCurrentCamera() +{ + MT_PLATFORM_STUB(); + return nullptr; +} diff --git a/extension/src/platform/EterPythonLib/PythonGraphic.cpp b/extension/src/platform/EterPythonLib/PythonGraphic.cpp index b3003f02..b2dbc2f5 100644 --- a/extension/src/platform/EterPythonLib/PythonGraphic.cpp +++ b/extension/src/platform/EterPythonLib/PythonGraphic.cpp @@ -11,6 +11,21 @@ #include "../PlatformStub.h" +void CPythonGraphic::SetViewport(float, float, float, float) { MT_PLATFORM_STUB(); } +void CPythonGraphic::RestoreViewport() { MT_PLATFORM_STUB(); } +void CPythonGraphic::SetOmniLight() { MT_PLATFORM_STUB(); } +long CPythonGraphic::GenerateColor(float, float, float, float) { MT_PLATFORM_STUB(); return 0; } +void CPythonGraphic::RenderUpButton(float, float, float, float) { MT_PLATFORM_STUB(); } +void CPythonGraphic::RenderDownButton(float, float, float, float) { MT_PLATFORM_STUB(); } +bool CPythonGraphic::SaveScreenShot(const char*) { MT_PLATFORM_STUB(); return false; } +void CPythonGraphic::SetCursorPosition(int, int) { MT_PLATFORM_STUB(); } +DWORD CPythonGraphic::GetAvailableMemory() { MT_PLATFORM_STUB(); return 0; } +void CPythonGraphic::SetGameRenderState() { MT_PLATFORM_STUB(); } +void CPythonGraphic::SetInterfaceRenderState() { MT_PLATFORM_STUB(); } +void CPythonGraphic::PushState() { MT_PLATFORM_STUB(); } +void CPythonGraphic::PopState() { MT_PLATFORM_STUB(); } +void CPythonGraphic::SetGamma(float) { MT_PLATFORM_STUB(); } + void CPythonGraphic::RenderCoolTimeBox(float fxCenter, float fyCenter, float fRadius, float fTime) { MT_PLATFORM_STUB(); diff --git a/extension/src/platform/ScriptLib/PythonBoot.cpp b/extension/src/platform/ScriptLib/PythonBoot.cpp index 7e4962a0..30d2cc53 100644 --- a/extension/src/platform/ScriptLib/PythonBoot.cpp +++ b/extension/src/platform/ScriptLib/PythonBoot.cpp @@ -3,6 +3,7 @@ #include "ScriptLib/StdAfx.h" #include "ScriptLib/PythonLauncher.h" #include "UserInterface/StdAfx.h" // initpack and the rest of the module initializer list +#include "EterPythonLib/StdAfx.h" #include "PythonBoot.h" #include "PythonHost.h" #include "../EterBase/LogBox.h" @@ -13,6 +14,7 @@ namespace { // 40250 has this on Main()'s stack. CPythonLauncher is a CSingleton, so there is still only ever one. std::unique_ptr g_launcher; +std::unique_ptr g_window_manager; bool fail(std::string* error, const std::string& text) { @@ -55,6 +57,7 @@ bool Start(const char* stdlib_path, std::string* error) Stop(); return fail(error, "InstallStdLib(" + stdlib + "): " + stdlib_error); } + g_window_manager = std::make_unique(); return true; } @@ -66,10 +69,14 @@ bool RunMainScript(const char* lpCmdLine, std::string* error) CPythonLauncher& pyLauncher = *g_launcher; - // The module initializers, in 40250's order. Everything after initpack (initdbg, initime, initgrp, - // initgrpImage, initgrpText, initwndMgr, initudp, initapp, ... initServerStateChecker) is a 2V slice: - // system.py stops at the first import of one of them, today `app`. + // The module initializers follow 40250's order; missing modules arrive in later 2V steps. initpack(); + initdbg(); + initgrp(); + initgrpImage(); + initgrpText(); + initwndMgr(); + initapp(); ClearLogBoxMessage(); @@ -122,6 +129,10 @@ bool RunMainScript(const char* lpCmdLine, std::string* error) TraceError("RunMain Error"); return fail(error, "RunMain Error: " + LastLogBoxMessage()); } + // system.py catches failures in prototype.py and calls dbg.LogBox. Its outer + // RunFile then succeeds, so surface that recorded failure to the Godot host. + if (!LastLogBoxMessage().empty()) + return fail(error, "RunMain Error: " + LastLogBoxMessage()); } NANOEND @@ -143,6 +154,7 @@ void Stop() { if (!g_launcher) return; + g_window_manager.reset(); g_launcher->Clear(); // Main() calls Clear() explicitly before the launcher leaves scope g_launcher.reset(); } diff --git a/extension/src/platform/UserInterface/PythonApplication.cpp b/extension/src/platform/UserInterface/PythonApplication.cpp new file mode 100644 index 00000000..f944c747 --- /dev/null +++ b/extension/src/platform/UserInterface/PythonApplication.cpp @@ -0,0 +1,88 @@ +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonApplication.h" +#include "UserInterface/MarkManager.h" +#include "GameLib/GameUtil.h" +#include "EterLib/Camera.h" +#include "../PlatformStub.h" + +// 2V0-d link surface. The application event loop and UI rendering are implemented in 2V0-f. +CPythonApplication* CPythonApplication::ms_pInstance = nullptr; + +void CPythonApplication::ShowWebPage(const char*, const RECT&) { MT_PLATFORM_STUB(); } +void CPythonApplication::MoveWebPage(const RECT&) { MT_PLATFORM_STUB(); } +void CPythonApplication::HideWebPage() { MT_PLATFORM_STUB(); } +bool CPythonApplication::IsWebPageMode() { MT_PLATFORM_STUB(); return false; } +void CPythonApplication::GetInfo(UINT, std::string* out) { MT_PLATFORM_STUB(); if (out) out->clear(); } +void CPythonApplication::Loop() { MT_PLATFORM_STUB(); } +void CPythonApplication::Exit() { MT_PLATFORM_STUB(); } +void CPythonApplication::Abort() { MT_PLATFORM_STUB(); } +void CPythonApplication::SetMinFog(float) { MT_PLATFORM_STUB(); } +void CPythonApplication::SetFrameSkip(bool) { MT_PLATFORM_STUB(); } +bool CPythonApplication::Create(PyObject*, const char*, int, int, int) { MT_PLATFORM_STUB(); return false; } +void CPythonApplication::UpdateGame() { MT_PLATFORM_STUB(); } +void CPythonApplication::RenderGame() { MT_PLATFORM_STUB(); } +bool CPythonApplication::Process() { MT_PLATFORM_STUB(); return false; } +BOOL CPythonApplication::SetCursorNum(int) { MT_PLATFORM_STUB(); return FALSE; } +void CPythonApplication::SetCursorVisible(BOOL, bool) { MT_PLATFORM_STUB(); } +BOOL CPythonApplication::GetCursorVisible() { MT_PLATFORM_STUB(); return FALSE; } +bool CPythonApplication::GetLiarCursorOn() { MT_PLATFORM_STUB(); return false; } +void CPythonApplication::SetCursorMode(int) { MT_PLATFORM_STUB(); } +void CPythonApplication::SetMouseHandler(PyObject*) { MT_PLATFORM_STUB(); } +void CPythonApplication::SetGlobalCenterPosition(LONG, LONG) { MT_PLATFORM_STUB(); } +void CPythonApplication::SetCamera(float, float, float, float) { MT_PLATFORM_STUB(); } +void CPythonApplication::GetCamera(float* distance, float* pitch, float* rotation, float* height) { + MT_PLATFORM_STUB(); + if (distance) *distance = 0; + if (pitch) *pitch = 0; + if (rotation) *rotation = 0; + if (height) *height = 0; +} +void CPythonApplication::RotateCamera(int) { MT_PLATFORM_STUB(); } +void CPythonApplication::PitchCamera(int) { MT_PLATFORM_STUB(); } +void CPythonApplication::ZoomCamera(int) { MT_PLATFORM_STUB(); } +void CPythonApplication::MovieRotateCamera(int) { MT_PLATFORM_STUB(); } +void CPythonApplication::MoviePitchCamera(int) { MT_PLATFORM_STUB(); } +void CPythonApplication::MovieZoomCamera(int) { MT_PLATFORM_STUB(); } +void CPythonApplication::MovieResetCamera() { MT_PLATFORM_STUB(); } +float CPythonApplication::GetRotation() { MT_PLATFORM_STUB(); return 0; } +float CPythonApplication::GetPitch() { MT_PLATFORM_STUB(); return 0; } +void CPythonApplication::SetFPS(int) { MT_PLATFORM_STUB(); } +time_t CPythonApplication::GetServerTime() { MT_PLATFORM_STUB(); return 0; } +time_t CPythonApplication::GetServerTimeStamp() { MT_PLATFORM_STUB(); return 0; } +void CPythonApplication::SetConnectData(const char*, int) { MT_PLATFORM_STUB(); } +void CPythonApplication::GetConnectData(std::string& ip, int& port) { MT_PLATFORM_STUB(); ip.clear(); port = 0; } +void CPythonApplication::EnableSpecialCameraMode() { MT_PLATFORM_STUB(); } +void CPythonApplication::SetCameraSpeed(int) { MT_PLATFORM_STUB(); } +void CPythonApplication::SaveCameraSetting(const char*) { MT_PLATFORM_STUB(); } +bool CPythonApplication::LoadCameraSetting(const char*) { MT_PLATFORM_STUB(); return false; } +void CPythonApplication::SetForceSightRange(int) { MT_PLATFORM_STUB(); } + +void CCamera::SetResistance(float) { MT_PLATFORM_STUB(); } +void CCamera::SetCameraMaxDistance(float) { MT_PLATFORM_STUB(); } +void CGuildMarkManager::SetMarkPathPrefix(const char*) { MT_PLATFORM_STUB(); } +void CMovieMan::PlayLogo(const char*) { MT_PLATFORM_STUB(); } + +float GetDegreeDifference(float, float) { MT_PLATFORM_STUB(); return 0; } +int GetRotatingDirection(float, float) { MT_PLATFORM_STUB(); return 0; } + +BOOL HAIR_COLOR_ENABLE = FALSE; +BOOL PERF_CHECKER_RENDER_GAME = FALSE; +BOOL RIDE_HORSE_ENABLE = FALSE; +BOOL SKILL_EFFECT_UPGRADE_ENABLE = FALSE; +BOOL USE_ARMOR_SPECULAR = FALSE; +BOOL USE_WEAPON_SPECULAR = FALSE; +D3DXCOLOR g_fSpecularColor; +double g_specularSpd = 0; +int g_iAccumulationTime = 0; + +bool LoadLocaleData(const char*) { MT_PLATFORM_STUB(); return false; } +void SetGuildSymbolPath(const char*) { MT_PLATFORM_STUB(); } +void DefaultFont_SetName(const char*) { MT_PLATFORM_STUB(); } +void TextTail_SetLivingTime(long) { MT_PLATFORM_STUB(); } +const char* LocaleService_GetName() { MT_PLATFORM_STUB(); return ""; } +bool LocaleService_IsCHEONMA() { MT_PLATFORM_STUB(); return false; } +void LocaleService_SetCHEONMA(bool) { MT_PLATFORM_STUB(); } +unsigned LocaleService_GetCodePage() { MT_PLATFORM_STUB(); return 0; } +const char* LocaleService_GetLocaleName() { MT_PLATFORM_STUB(); return ""; } +const char* LocaleService_GetLocalePath() { MT_PLATFORM_STUB(); return ""; } +void LocaleService_ForceSetLocale(const char*, const char*) { MT_PLATFORM_STUB(); } diff --git a/extension/src/port/CMakeLists.txt b/extension/src/port/CMakeLists.txt index 67ec68b8..69d8a72b 100644 --- a/extension/src/port/CMakeLists.txt +++ b/extension/src/port/CMakeLists.txt @@ -180,5 +180,11 @@ if(BUILD_TESTING AND CMAKE_SYSTEM_NAME STREQUAL CMAKE_HOST_SYSTEM_NAME) add_test(NAME port.window_tree COMMAND $ ${MT_PYTHON_STDLIB_ZIP}) set_tests_properties(port.window_tree PROPERTIES SKIP_RETURN_CODE 77) + + add_executable(port_python_ui_modules_test ${CMAKE_CURRENT_SOURCE_DIR}/../../tests/port_python_ui_modules_test.cpp) + target_link_libraries(port_python_ui_modules_test PRIVATE port_platform) + add_dependencies(port_python_ui_modules_test mtpython_stdlib) + add_test(NAME port.python_ui_modules + COMMAND $ ${MT_PYTHON_STDLIB_ZIP}) endif() endif() diff --git a/extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp b/extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp new file mode 100644 index 00000000..18287fcf --- /dev/null +++ b/extension/src/port/EterPythonLib/PythonGraphicImageModule.cpp @@ -0,0 +1,295 @@ +#include "StdAfx.h" +#include "../common/PortPythonPointer.h" // PORT: preserve Win32 pointer handles on 64-bit hosts + +bool PyTuple_GetImageInstance(PyObject* poArgs, int pos, CGraphicImageInstance** ppRetImageInstance) +{ + return PyTuple_GetPointer(poArgs, pos, ppRetImageInstance) && *ppRetImageInstance; +} + +bool PyTuple_GetExpandedImageInstance(PyObject* poArgs, int pos, CGraphicExpandedImageInstance ** ppRetImageInstance) +{ + CGraphicImageInstance* image; + if (!PyTuple_GetPointer(poArgs, pos, &image) || !image) + return false; + if (!image->IsType(CGraphicExpandedImageInstance::Type())) + return false; + *ppRetImageInstance = static_cast(image); + return true; +} + +PyObject* grpImageGenerate(PyObject * poSelf, PyObject* poArgs) +{ + char * szFileName; + + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BadArgument(); + + if (!*szFileName) + return Py_BuildValue("i", 0); + + CResource * pResource = CResourceManager::Instance().GetResourcePointer(szFileName); + + if (!pResource->IsType(CGraphicImage::Type())) + return Py_BuildException("Resource is not an image (filename: %s)", szFileName); + + CGraphicImageInstance * pImageInstance = CGraphicImageInstance::New(); + pImageInstance->SetImagePointer(static_cast(pResource)); + + if (pImageInstance->IsEmpty()) + return Py_BuildException("Cannot load image (filename: %s)", szFileName); + + return Py_BuildPointer(pImageInstance); +} + +PyObject* grpImageGenerateExpanded(PyObject* poSelf, PyObject* poArgs) +{ + char * szFileName; + + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BadArgument(); + + if (strlen(szFileName) <= 0) + return Py_BuildValue("i", 0); + + CResource* pResource = CResourceManager::Instance().GetResourcePointer(szFileName); + + if (!pResource->IsType(CGraphicImage::Type())) + return Py_BuildException("Resource is not an image (filename: %s)", szFileName); + + CGraphicExpandedImageInstance * pImageInstance = CGraphicExpandedImageInstance::New(); + pImageInstance->SetImagePointer(static_cast(pResource)); + + if (pImageInstance->IsEmpty()) + return Py_BuildException("Cannot load image (filename: %s)", szFileName); + + return Py_BuildPointer(pImageInstance); +} + +PyObject* grpImageGenerateFromHandle(PyObject * poSelf, PyObject* poArgs) +{ + CGraphicImage* image; + if (!PyTuple_GetPointer(poArgs, 0, &image)) + return Py_BadArgument(); + + CGraphicImageInstance * pImageInstance = CGraphicImageInstance::New(); + pImageInstance->SetImagePointer(image); + + return Py_BuildPointer(pImageInstance); +} + +PyObject* grpImageDelete(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicImageInstance * pImageInstance; + + if (!PyTuple_GetImageInstance(poArgs, 0, &pImageInstance)) + return Py_BadArgument(); + + if (!pImageInstance) + return Py_BuildNone(); + + CGraphicImageInstance::Delete(pImageInstance); + + return Py_BuildNone(); +} + +PyObject* grpImageDeleteExpanded(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicExpandedImageInstance * pExpandedImageInstance; + if (!PyTuple_GetExpandedImageInstance(poArgs, 0, &pExpandedImageInstance)) + return Py_BadArgument(); + + CGraphicExpandedImageInstance::Delete(pExpandedImageInstance); + return Py_BuildNone(); +} + +PyObject* grpImageSetFileName(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicImageInstance * pImageInstance; + if (!PyTuple_GetImageInstance(poArgs, 0, &pImageInstance)) + return Py_BadArgument(); + + char * szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BadArgument(); + + CResource * pResource = CResourceManager::Instance().GetResourcePointer(szFileName); + + if (!pResource->IsType(CGraphicImage::Type())) + return Py_BuildException("Resource is not an image (filename: %s)", szFileName); + + pImageInstance->SetImagePointer(static_cast(pResource)); + return Py_BuildNone(); +} + +PyObject* grpImageRender(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicImageInstance* pImageInstance; + if (!PyTuple_GetImageInstance(poArgs, 0, &pImageInstance)) + return Py_BadArgument(); + + pImageInstance->Render(); + return Py_BuildNone(); +} + +PyObject * grpSetImagePosition(PyObject * poSelf, PyObject * poArgs) +{ + CGraphicImageInstance* pImageInstance; + if (!PyTuple_GetImageInstance(poArgs, 0, &pImageInstance)) + return Py_BadArgument(); + + float x; + if (!PyTuple_GetFloat(poArgs, 1, &x)) + return Py_BadArgument(); + + float y; + if (!PyTuple_GetFloat(poArgs, 2, &y)) + return Py_BadArgument(); + + pImageInstance->SetPosition(x, y); + return Py_BuildNone(); +} + +PyObject * grpSetImageOrigin(PyObject * poSelf, PyObject * poArgs) +{ + CGraphicExpandedImageInstance * pImageInstance; + if (!PyTuple_GetExpandedImageInstance(poArgs, 0, &pImageInstance)) + return Py_BadArgument(); + + float x; + if (!PyTuple_GetFloat(poArgs, 1, &x)) + return Py_BadArgument(); + float y; + if (!PyTuple_GetFloat(poArgs, 2, &y)) + return Py_BadArgument(); + + pImageInstance->SetOrigin(x, y); + return Py_BuildNone(); +} + +PyObject * grpSetImageRotation(PyObject * poSelf, PyObject * poArgs) +{ + CGraphicExpandedImageInstance * pImageInstance; + if (!PyTuple_GetExpandedImageInstance(poArgs, 0, &pImageInstance)) + return Py_BadArgument(); + + float Degree; + if (!PyTuple_GetFloat(poArgs, 1, &Degree)) + return Py_BadArgument(); + + pImageInstance->SetRotation(Degree); + return Py_BuildNone(); +} + +PyObject * grpSetImageScale(PyObject * poSelf, PyObject * poArgs) +{ + CGraphicExpandedImageInstance * pImageInstance; + if (!PyTuple_GetExpandedImageInstance(poArgs, 0, &pImageInstance)) + return Py_BadArgument(); + + float x; + if (!PyTuple_GetFloat(poArgs, 1, &x)) + return Py_BadArgument(); + float y; + if (!PyTuple_GetFloat(poArgs, 2, &y)) + return Py_BadArgument(); + + pImageInstance->SetScale(x, y); + return Py_BuildNone(); +} + +PyObject * grpSetRenderingRect(PyObject * poSelf, PyObject * poArgs) +{ + CGraphicExpandedImageInstance * pImageInstance; + if (!PyTuple_GetExpandedImageInstance(poArgs, 0, &pImageInstance)) + return Py_BadArgument(); + + float fLeft; + if (!PyTuple_GetFloat(poArgs, 1, &fLeft)) + return Py_BadArgument(); + float fTop; + if (!PyTuple_GetFloat(poArgs, 2, &fTop)) + return Py_BadArgument(); + float fRight; + if (!PyTuple_GetFloat(poArgs, 3, &fRight)) + return Py_BadArgument(); + float fBottom; + if (!PyTuple_GetFloat(poArgs, 4, &fBottom)) + return Py_BadArgument(); + + pImageInstance->SetRenderingRect(fLeft, fTop, fRight, fBottom); + return Py_BuildNone(); +} + +PyObject * grpSetImageDiffuseColor(PyObject * poSelf, PyObject * poArgs) +{ + CGraphicImageInstance* pImageInstance; + if (!PyTuple_GetImageInstance(poArgs, 0, &pImageInstance)) + return Py_BadArgument(); + + float r; + if (!PyTuple_GetFloat(poArgs, 1, &r)) + return Py_BadArgument(); + float g; + if (!PyTuple_GetFloat(poArgs, 2, &g)) + return Py_BadArgument(); + float b; + if (!PyTuple_GetFloat(poArgs, 3, &b)) + return Py_BadArgument(); + float a; + if (!PyTuple_GetFloat(poArgs, 4, &a)) + return Py_BadArgument(); + + pImageInstance->SetDiffuseColor(r, g, b, a); + return Py_BuildNone(); +} + +PyObject * grpGetWidth(PyObject * poSelf, PyObject * poArgs) +{ + CGraphicImageInstance * pImageInstance; + + if (!PyTuple_GetImageInstance(poArgs, 0, &pImageInstance)) + return Py_BadArgument(); + + if (pImageInstance->IsEmpty()) + return Py_BuildException("Image is empty"); + + return Py_BuildValue("i", pImageInstance->GetWidth()); +} + +PyObject * grpGetHeight(PyObject * poSelf, PyObject * poArgs) +{ + CGraphicImageInstance * pImageInstance; + + if (!PyTuple_GetImageInstance(poArgs, 0, &pImageInstance)) + return Py_BadArgument(); + + if (pImageInstance->IsEmpty()) + return Py_BuildException("Image is empty"); + + return Py_BuildValue("i", pImageInstance->GetHeight()); +} + +void initgrpImage() +{ + static PyMethodDef s_methods[] = + { + { "Render", grpImageRender, METH_VARARGS }, + { "SetPosition", grpSetImagePosition, METH_VARARGS }, + { "Generate", grpImageGenerate, METH_VARARGS }, + { "GenerateExpanded", grpImageGenerateExpanded, METH_VARARGS }, + { "GenerateFromHandle", grpImageGenerateFromHandle, METH_VARARGS }, + { "Delete", grpImageDelete, METH_VARARGS }, + { "DeleteExpanded", grpImageDeleteExpanded, METH_VARARGS }, + { "SetFileName", grpImageSetFileName, METH_VARARGS }, + { "SetOrigin", grpSetImageOrigin, METH_VARARGS }, + { "SetRotation", grpSetImageRotation, METH_VARARGS }, + { "SetScale", grpSetImageScale, METH_VARARGS }, + { "SetRenderingRect", grpSetRenderingRect, METH_VARARGS }, + { "SetDiffuseColor", grpSetImageDiffuseColor, METH_VARARGS }, + { "GetWidth", grpGetWidth, METH_VARARGS }, + { "GetHeight", grpGetHeight, METH_VARARGS }, + { NULL, NULL, NULL }, + }; + + Py_InitModule("grpImage", s_methods); +} diff --git a/extension/src/port/EterPythonLib/PythonGraphicModule.cpp b/extension/src/port/EterPythonLib/PythonGraphicModule.cpp new file mode 100644 index 00000000..860f3076 --- /dev/null +++ b/extension/src/port/EterPythonLib/PythonGraphicModule.cpp @@ -0,0 +1,999 @@ +#include "StdAfx.h" +#include "../common/PortPythonPointer.h" // PORT: preserve Win32 pointer handles on 64-bit hosts +#include "../EterLib/Camera.h" +#include "../EterLib/TextBar.h" + +#include + +PyObject* grpCreateTextBar(PyObject* poSelf, PyObject* poArgs) +{ + int iWidth; + if (!PyTuple_GetInteger(poArgs, 0, &iWidth)) + return Py_BuildException(); + int iHeight; + if (!PyTuple_GetInteger(poArgs, 1, &iHeight)) + return Py_BuildException(); + + CTextBar * pTextBar = new CTextBar(12, false); + if (!pTextBar->Create(NULL, iWidth, iHeight)) + { + delete pTextBar; + return Py_BuildValue("i", NULL); + } + + return Py_BuildPointer(pTextBar); +} + +PyObject* grpCreateBigTextBar(PyObject* poSelf, PyObject* poArgs) +{ + int iWidth; + if (!PyTuple_GetInteger(poArgs, 0, &iWidth)) + return Py_BuildException(); + int iHeight; + if (!PyTuple_GetInteger(poArgs, 1, &iHeight)) + return Py_BuildException(); + + int iFontSize; + if (!PyTuple_GetInteger(poArgs, 2, &iFontSize)) + return Py_BuildException(); + + CTextBar * pTextBar = new CTextBar(iFontSize, true); + if (!pTextBar->Create(NULL, iWidth, iHeight)) + { + delete pTextBar; + return Py_BuildValue("i", NULL); + } + + return Py_BuildPointer(pTextBar); +} + +PyObject* grpDestroyTextBar(PyObject* poSelf, PyObject* poArgs) +{ + CTextBar* pTextBar; + if (!PyTuple_GetPointer(poArgs, 0, &pTextBar)) + return Py_BuildException(); + + delete pTextBar; + + return Py_BuildNone(); +} + +PyObject* grpRenderTextBar(PyObject* poSelf, PyObject* poArgs) +{ + CTextBar* pTextBar; + if (!PyTuple_GetPointer(poArgs, 0, &pTextBar)) + return Py_BuildException(); + int ix; + if (!PyTuple_GetInteger(poArgs, 1, &ix)) + return Py_BuildException(); + int iy; + if (!PyTuple_GetInteger(poArgs, 2, &iy)) + return Py_BuildException(); + + if (pTextBar) + pTextBar->Render(ix, iy); + + return Py_BuildNone(); +} + +PyObject* grpTextBarSetTextColor(PyObject* poSelf, PyObject* poArgs) +{ + CTextBar* pTextBar; + if (!PyTuple_GetPointer(poArgs, 0, &pTextBar)) + return Py_BuildException(); + int r; + if (!PyTuple_GetInteger(poArgs, 1, &r)) + return Py_BuildException(); + int g; + if (!PyTuple_GetInteger(poArgs, 2, &g)) + return Py_BuildException(); + int b; + if (!PyTuple_GetInteger(poArgs, 3, &b)) + return Py_BuildException(); + + if (pTextBar) + pTextBar->SetTextColor(r, g, b); + + return Py_BuildNone(); +} + +PyObject* grpTextBarGetTextExtent(PyObject* poSelf, PyObject* poArgs) +{ + CTextBar* pTextBar; + if (!PyTuple_GetPointer(poArgs, 0, &pTextBar)) + return Py_BuildException(); + char * szText; + if (!PyTuple_GetString(poArgs, 1, &szText)) + return Py_BuildException(); + + SIZE size = {0, 0}; + if (pTextBar) + pTextBar->GetTextExtent(szText, &size); + + return Py_BuildValue("ii", size.cx, size.cy); +} + +PyObject* grpTextBarTextOut(PyObject* poSelf, PyObject* poArgs) +{ + CTextBar* pTextBar; + if (!PyTuple_GetPointer(poArgs, 0, &pTextBar)) + return Py_BuildException(); + int ix; + if (!PyTuple_GetInteger(poArgs, 1, &ix)) + return Py_BuildException(); + int iy; + if (!PyTuple_GetInteger(poArgs, 2, &iy)) + return Py_BuildException(); + char * szText; + if (!PyTuple_GetString(poArgs, 3, &szText)) + return Py_BuildException(); + + if (pTextBar) + pTextBar->TextOut(ix, iy, szText); + + return Py_BuildNone(); +} + +PyObject* grpClearTextBar(PyObject* poSelf, PyObject* poArgs) +{ + CTextBar* pTextBar; + if (!PyTuple_GetPointer(poArgs, 0, &pTextBar)) + return Py_BuildException(); + + if (pTextBar) + pTextBar->ClearBar(); + + return Py_BuildNone(); +} + +PyObject* grpSetTextBarClipRect(PyObject* poSelf, PyObject* poArgs) +{ + CTextBar* pTextBar; + if (!PyTuple_GetPointer(poArgs, 0, &pTextBar)) + return Py_BuildException(); + int isx; + if (!PyTuple_GetInteger(poArgs, 1, &isx)) + return Py_BuildException(); + int isy; + if (!PyTuple_GetInteger(poArgs, 2, &isy)) + return Py_BuildException(); + int iex; + if (!PyTuple_GetInteger(poArgs, 3, &iex)) + return Py_BuildException(); + int iey; + if (!PyTuple_GetInteger(poArgs, 4, &iey)) + return Py_BuildException(); + + if (pTextBar) + { + RECT rect; + rect.left = isx; + rect.top = isy; + rect.right = iex; + rect.bottom = iey; + + pTextBar->SetClipRect(rect); + } + + return Py_BuildNone(); +} + +PyObject* grpCulling(PyObject* poSelf, PyObject* poArgs) +{ + CCullingManager::Instance().Process(); + return Py_BuildNone(); +} + +PyObject* grpInitScreenEffect(PyObject* poSelf, PyObject* poArgs) +{ + CPythonGraphic::Instance().InitScreenEffect(); + return Py_BuildNone(); +} + +PyObject* grpClearDepthBuffer(PyObject* poSelf, PyObject* poArgs) +{ + CPythonGraphic::Instance().ClearDepthBuffer(); + return Py_BuildNone(); +} + +PyObject* grpPushState(PyObject* poSelf, PyObject* poArgs) +{ + CPythonGraphic::Instance().PushState(); + return Py_BuildNone(); +} + +PyObject* grpPopState(PyObject* poSelf, PyObject* poArgs) +{ + CPythonGraphic::Instance().PopState(); + return Py_BuildNone(); +} + +PyObject* grpPushMatrix(PyObject* poSelf, PyObject* poArgs) +{ + CPythonGraphic::Instance().PushMatrix(); + return Py_BuildNone(); +} + +PyObject* grpPopMatrix(PyObject* poSelf, PyObject* poArgs) +{ + CPythonGraphic::Instance().PopMatrix(); + return Py_BuildNone(); +} + +PyObject* grpTranslate(PyObject* poSelf, PyObject* poArgs) +{ + float x; + if (!PyTuple_GetFloat(poArgs, 0, &x)) + return Py_BuildException("grp.Translate:Wrong X"); + + float y; + if (!PyTuple_GetFloat(poArgs, 1, &y)) + return Py_BuildException("grp.Translate:Wrong Y"); + + float z; + if (!PyTuple_GetFloat(poArgs, 2, &z)) + return Py_BuildException("grp.Translate:Wrong Z"); + + CPythonGraphic::Instance().Translate(x, y, z); + + return Py_BuildNone(); +} + +PyObject* grpRotate(PyObject* poSelf, PyObject* poArgs) +{ + float Degree; + if (!PyTuple_GetFloat(poArgs, 0, &Degree)) + return Py_BuildException(); + + float x; + if (!PyTuple_GetFloat(poArgs, 1, &x)) + return Py_BuildException(); + + float y; + if (!PyTuple_GetFloat(poArgs, 2, &y)) + return Py_BuildException(); + + float z; + if (!PyTuple_GetFloat(poArgs, 3, &z)) + return Py_BuildException(); + + CPythonGraphic::Instance().Rotate(Degree, x, y, z); + + return Py_BuildNone(); +} + +PyObject * grpSetColorRenderState(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildNone(); +} + +PyObject* grpSetAroundCamera(PyObject* poSelf, PyObject* poArgs) +{ + float distance; + if (!PyTuple_GetFloat(poArgs, 0, &distance)) + return Py_BuildException(); + + float pitch; + if (!PyTuple_GetFloat(poArgs, 1, &pitch)) + return Py_BuildException(); + + float roll; + if (!PyTuple_GetFloat(poArgs, 2, &roll)) + return Py_BuildException(); + + float lookAtZ; + if (!PyTuple_GetFloat(poArgs, 3, &lookAtZ)) + return Py_BuildException(); + + CPythonGraphic::Instance().SetAroundCamera(distance, pitch, roll, lookAtZ); + return Py_BuildNone(); +} + +PyObject* grpSetPositionCamera(PyObject* poSelf, PyObject* poArgs) +{ + float fx; + if (!PyTuple_GetFloat(poArgs, 0, &fx)) + return Py_BuildException(); + + float fy; + if (!PyTuple_GetFloat(poArgs, 1, &fy)) + return Py_BuildException(); + + float fz; + if (!PyTuple_GetFloat(poArgs, 2, &fz)) + return Py_BuildException(); + + float distance; + if (!PyTuple_GetFloat(poArgs, 3, &distance)) + return Py_BuildException(); + + float pitch; + if (!PyTuple_GetFloat(poArgs, 4, &pitch)) + return Py_BuildException(); + + float roll; + if (!PyTuple_GetFloat(poArgs, 5, &roll)) + return Py_BuildException(); + + CPythonGraphic::Instance().SetPositionCamera(fx, fy, fz, distance, pitch, roll); + return Py_BuildNone(); +} + +PyObject* grpSetEyeCamera(PyObject* poSelf, PyObject* poArgs) +{ + float xEye; + if (!PyTuple_GetFloat(poArgs, 0, &xEye)) + return Py_BuildException(); + + float yEye; + if (!PyTuple_GetFloat(poArgs, 1, &yEye)) + return Py_BuildException(); + + float zEye; + if (!PyTuple_GetFloat(poArgs, 2, &zEye)) + return Py_BuildException(); + + float xCenter; + if (!PyTuple_GetFloat(poArgs, 3, &xCenter)) + return Py_BuildException(); + + float yCenter; + if (!PyTuple_GetFloat(poArgs, 4, &yCenter)) + return Py_BuildException(); + + float zCenter; + if (!PyTuple_GetFloat(poArgs, 5, &zCenter)) + return Py_BuildException(); + + float xUp; + if (!PyTuple_GetFloat(poArgs, 6, &xUp)) + return Py_BuildException(); + + float yUp; + if (!PyTuple_GetFloat(poArgs, 7, &yUp)) + return Py_BuildException(); + + float zUp; + if (!PyTuple_GetFloat(poArgs, 8, &zUp)) + return Py_BuildException(); + + CPythonGraphic::Instance().SetEyeCamera(xEye, yEye, zEye, xCenter, yCenter, zCenter, xUp, yUp, zUp); + return Py_BuildNone(); +} + + +PyObject* grpSetPerspective(PyObject* poSelf, PyObject* poArgs) +{ + float fov; + if (!PyTuple_GetFloat(poArgs, 0, &fov)) + return Py_BuildException(); + + float aspect; + if (!PyTuple_GetFloat(poArgs, 1, &aspect)) + return Py_BuildException(); + + float zNear; + if (!PyTuple_GetFloat(poArgs, 2, &zNear)) + return Py_BuildException(); + + float zFar; + if (!PyTuple_GetFloat(poArgs, 3, &zFar)) + return Py_BuildException(); + + CPythonGraphic::Instance().SetPerspective(fov, aspect, zNear, zFar); + return Py_BuildNone(); +} + + +PyObject* grpSetOrtho2D(PyObject* poSelf, PyObject* poArgs) +{ + float width; + if (!PyTuple_GetFloat(poArgs, 0, &width)) + return Py_BuildException(); + + float height; + if (!PyTuple_GetFloat(poArgs, 1, &height)) + return Py_BuildException(); + + float length; + if (!PyTuple_GetFloat(poArgs, 2, &length)) + return Py_BuildException(); + + CPythonGraphic::Instance().SetOrtho2D(width, height, length); + return Py_BuildNone(); +} + + +PyObject* grpSetOrtho3D(PyObject* poSelf, PyObject* poArgs) +{ + float width; + if (!PyTuple_GetFloat(poArgs, 0, &width)) + return Py_BuildException(); + + float height; + if (!PyTuple_GetFloat(poArgs, 1, &height)) + return Py_BuildException(); + + float zmin; + if (!PyTuple_GetFloat(poArgs, 2, &zmin)) + return Py_BuildException(); + + float zmax; + if (!PyTuple_GetFloat(poArgs, 3, &zmax)) + return Py_BuildException(); + + CPythonGraphic::Instance().SetOrtho3D(width, height, zmin, zmax); + return Py_BuildNone(); +} + + +PyObject* grpGenerateColor(PyObject* poSelf, PyObject* poArgs) +{ + float r; + if (!PyTuple_GetFloat(poArgs, 0, &r)) + return Py_BuildException(); + + float g; + if (!PyTuple_GetFloat(poArgs, 1, &g)) + return Py_BuildException(); + + float b; + if (!PyTuple_GetFloat(poArgs, 2, &b)) + return Py_BuildException(); + + float a; + if (!PyTuple_GetFloat(poArgs, 3, &a)) + return Py_BuildException(); + + return Py_BuildValue("l", CPythonGraphic::Instance().GenerateColor(r, g, b, a)); +} + +PyObject* grpSetColor(PyObject* poSelf, PyObject* poArgs) +{ + int color; + if (!PyTuple_GetInteger(poArgs, 0, &color)) + return Py_BuildException(); + + CPythonGraphic::Instance().SetDiffuseColor(DWORD(color)); + return Py_BuildNone(); +} + +PyObject* grpSetAlpha(PyObject* poSelf, PyObject* poArgs) +{ + float Alpha; + if (!PyTuple_GetFloat(poArgs, 0, &Alpha)) + return Py_BuildException(); + + //CPythonGraphic::Instance().SetAlpha(Alpha); + return Py_BuildNone(); +} + +PyObject* grpGetCursorPosition3d(PyObject * poSelf, PyObject * poArgs) +{ + float x, y, z; + CPythonGraphic::Instance().GetCursorPosition(&x, &y, &z); + return Py_BuildValue("(fff)", x, y, z); +} + +PyObject* grpSetCursorPosition(PyObject * poSelf, PyObject * poArgs) +{ + int ix; + if (!PyTuple_GetInteger(poArgs, 0, &ix)) + return Py_BuildException(); + int iy; + if (!PyTuple_GetInteger(poArgs, 1, &iy)) + return Py_BuildException(); + + CPythonGraphic::Instance().SetCursorPosition(ix, iy); + return Py_BuildNone(); +} + +PyObject* grpRenderLine(PyObject* poSelf, PyObject* poArgs) +{ + int x; + if (!PyTuple_GetInteger(poArgs, 0, &x)) + return Py_BuildException(); + + int y; + if (!PyTuple_GetInteger(poArgs, 1, &y)) + return Py_BuildException(); + + int width; + if (!PyTuple_GetInteger(poArgs, 2, &width)) + return Py_BuildException(); + + int height; + if (!PyTuple_GetInteger(poArgs, 3, &height)) + return Py_BuildException(); + + CPythonGraphic::Instance().RenderLine2d((float) x, (float) y, (float) x+width, (float) y+height); + return Py_BuildNone(); +} + +PyObject* grpRenderRoundBox(PyObject* poSelf, PyObject* poArgs) +{ + int x; + if (!PyTuple_GetInteger(poArgs, 0, &x)) + return Py_BuildException(); + + int y; + if (!PyTuple_GetInteger(poArgs, 1, &y)) + return Py_BuildException(); + + int width; + if (!PyTuple_GetInteger(poArgs, 2, &width)) + return Py_BuildException(); + + int height; + if (!PyTuple_GetInteger(poArgs, 3, &height)) + return Py_BuildException(); + + float fx = float(x); + float fy = float(y); + float fWidth = float(width); + float fHeight = float(height); + + CPythonGraphic::Instance().RenderLine2d(fx+2.0f, fy, fx+2.0f + (fWidth-3.0f), fy); + CPythonGraphic::Instance().RenderLine2d(fx+2.0f, fy+fHeight, fx+2.0f + (fWidth-3.0f), fy+fHeight); + CPythonGraphic::Instance().RenderLine2d(fx, fy+2.0f, fx, fy+2.0f + fHeight-4.0f); + CPythonGraphic::Instance().RenderLine2d(fx+fWidth, fy+1.0f, fx+fWidth, fy+1.0f + fHeight-3.0f); + CPythonGraphic::Instance().RenderLine2d(fx, fy+2.0f, fx+2.0f, fy); + CPythonGraphic::Instance().RenderLine2d(fx, fy+fHeight-2.0f, fx+2.0f, fy+fHeight); + CPythonGraphic::Instance().RenderLine2d(fx+fWidth-2.0f, fy, fx+fWidth, fy+2.0f); + CPythonGraphic::Instance().RenderLine2d(fx+fWidth-2.0f, fy+fHeight, fx+fWidth, fy+fHeight-2.0f); + return Py_BuildNone(); +} + +PyObject* grpRenderBox(PyObject* poSelf, PyObject* poArgs) +{ + int x; + if (!PyTuple_GetInteger(poArgs, 0, &x)) + return Py_BuildException(); + + int y; + if (!PyTuple_GetInteger(poArgs, 1, &y)) + return Py_BuildException(); + + int width; + if (!PyTuple_GetInteger(poArgs, 2, &width)) + return Py_BuildException(); + + int height; + if (!PyTuple_GetInteger(poArgs, 3, &height)) + return Py_BuildException(); + + CPythonGraphic::Instance().RenderBox2d((float) x, (float) y, (float) x+width, (float) y+height); + return Py_BuildNone(); +} + +PyObject* grpRenderBar(PyObject* poSelf, PyObject* poArgs) +{ + int x; + if (!PyTuple_GetInteger(poArgs, 0, &x)) + return Py_BuildException(); + + int y; + if (!PyTuple_GetInteger(poArgs, 1, &y)) + return Py_BuildException(); + + int width; + if (!PyTuple_GetInteger(poArgs, 2, &width)) + return Py_BuildException(); + + int height; + if (!PyTuple_GetInteger(poArgs, 3, &height)) + return Py_BuildException(); + + CPythonGraphic::Instance().RenderBar2d((float) x, (float) y, (float) x+width, (float) y+height); + return Py_BuildNone(); +} + +PyObject* grpRenderCube(PyObject* poSelf, PyObject* poArgs) +{ + float sx; + if (!PyTuple_GetFloat(poArgs, 0, &sx)) + return Py_BuildException(); + + float sy; + if (!PyTuple_GetFloat(poArgs, 1, &sy)) + return Py_BuildException(); + + float sz; + if (!PyTuple_GetFloat(poArgs, 2, &sz)) + return Py_BuildException(); + + float ex; + if (!PyTuple_GetFloat(poArgs, 3, &ex)) + return Py_BuildException(); + + float ey; + if (!PyTuple_GetFloat(poArgs, 4, &ey)) + return Py_BuildException(); + + float ez; + if (!PyTuple_GetFloat(poArgs, 5, &ez)) + return Py_BuildException(); + + CPythonGraphic::Instance().RenderCube(sx, sy, sz, ex, ey, ez); + return Py_BuildNone(); +} + +PyObject* grpRenderBar3d(PyObject* poSelf, PyObject* poArgs) +{ + int sx; + if (!PyTuple_GetInteger(poArgs, 0, &sx)) + return Py_BuildException(); + + int sy; + if (!PyTuple_GetInteger(poArgs, 1, &sy)) + return Py_BuildException(); + + int sz; + if (!PyTuple_GetInteger(poArgs, 2, &sz)) + return Py_BuildException(); + + int ex; + if (!PyTuple_GetInteger(poArgs, 3, &ex)) + return Py_BuildException(); + + int ey; + if (!PyTuple_GetInteger(poArgs, 4, &ey)) + return Py_BuildException(); + + int ez; + if (!PyTuple_GetInteger(poArgs, 5, &ez)) + return Py_BuildException(); + + CPythonGraphic::Instance().RenderBar3d(sx, sy, sz, ex, ey, ez); + return Py_BuildNone(); +} + +PyObject * grpRenderGradationBar(PyObject* poSelf, PyObject* poArgs) +{ + int x; + if (!PyTuple_GetInteger(poArgs, 0, &x)) + return Py_BadArgument(); + + int y; + if (!PyTuple_GetInteger(poArgs, 1, &y)) + return Py_BadArgument(); + + int width; + if (!PyTuple_GetInteger(poArgs, 2, &width)) + return Py_BadArgument(); + + int height; + if (!PyTuple_GetInteger(poArgs, 3, &height)) + return Py_BadArgument(); + + int iStartColor; + if (!PyTuple_GetInteger(poArgs, 4, &iStartColor)) + return Py_BadArgument(); + + int iEndColor; + if (!PyTuple_GetInteger(poArgs, 5, &iEndColor)) + return Py_BadArgument(); + + CPythonGraphic::Instance().RenderGradationBar2d((float)x, (float)y, (float)x+width, (float)y+height, iStartColor, iEndColor); + return Py_BuildNone(); +} + +PyObject* grpRenderDownButton(PyObject* poSelf, PyObject* poArgs) +{ + int x; + if (!PyTuple_GetInteger(poArgs, 0, &x)) + return Py_BuildException(); + + int y; + if (!PyTuple_GetInteger(poArgs, 1, &y)) + return Py_BuildException(); + + int width; + if (!PyTuple_GetInteger(poArgs, 2, &width)) + return Py_BuildException(); + + int height; + if (!PyTuple_GetInteger(poArgs, 3, &height)) + return Py_BuildException(); + + CPythonGraphic::Instance().RenderDownButton((float) x, (float) y, (float) x+width, (float) y+height); + return Py_BuildNone(); +} + +PyObject* grpRenderUpButton(PyObject* poSelf, PyObject* poArgs) +{ + int x; + if (!PyTuple_GetInteger(poArgs, 0, &x)) + return Py_BuildException(); + + int y; + if (!PyTuple_GetInteger(poArgs, 1, &y)) + return Py_BuildException(); + + int width; + if (!PyTuple_GetInteger(poArgs, 2, &width)) + return Py_BuildException(); + + int height; + if (!PyTuple_GetInteger(poArgs, 3, &height)) + return Py_BuildException(); + + CPythonGraphic::Instance().RenderUpButton((float) x, (float) y, (float) x+width, (float) y+height); + return Py_BuildNone(); +} + +PyObject* grpRenderBox3d(PyObject* poSelf, PyObject* poArgs) +{ + float sx; + if (!PyTuple_GetFloat(poArgs, 0, &sx)) + return Py_BuildException(); + + float sy; + if (!PyTuple_GetFloat(poArgs, 1, &sy)) + return Py_BuildException(); + + float sz; + if (!PyTuple_GetFloat(poArgs, 2, &sz)) + return Py_BuildException(); + + float ex; + if (!PyTuple_GetFloat(poArgs, 3, &ex)) + return Py_BuildException(); + + float ey; + if (!PyTuple_GetFloat(poArgs, 4, &ey)) + return Py_BuildException(); + + float ez; + if (!PyTuple_GetFloat(poArgs, 5, &ez)) + return Py_BuildException(); + + CPythonGraphic::Instance().RenderBox3d((float) sx, (float) sy, (float) sz, (float) ex, (float) ey, (float) ez); + return Py_BuildNone(); +} + +PyObject * grpSetClearColor(PyObject * poSelf, PyObject * poArgs) +{ + float fr; + if (!PyTuple_GetFloat(poArgs, 0, &fr)) + return Py_BuildException(); + + float fg; + if (!PyTuple_GetFloat(poArgs, 1, &fg)) + return Py_BuildException(); + + float fb; + if (!PyTuple_GetFloat(poArgs, 2, &fb)) + return Py_BuildException(); + + CPythonGraphic::Instance().SetClearColor(fr, fg, fb, 1.0f); + return Py_BuildNone(); +} + +PyObject * grpSetDiffuseColor(PyObject * poSelf, PyObject * poArgs) +{ + float r; + if (!PyTuple_GetFloat(poArgs, 0, &r)) + return Py_BuildException(); + + float g; + if (!PyTuple_GetFloat(poArgs, 1, &g)) + return Py_BuildException(); + + float b; + if (!PyTuple_GetFloat(poArgs, 2, &b)) + return Py_BuildException(); + + float a; + if (!PyTuple_GetFloat(poArgs, 3, &a)) + return Py_BuildException(); + + CPythonGraphic::Instance().SetDiffuseColor(r, g, b, a); + return Py_BuildNone(); +} + +PyObject * grpIdentity(PyObject * poSelf, PyObject * poArgs) +{ + CPythonGraphic::Instance().Identity(); + return Py_BuildNone(); +} + +PyObject * grpGetAvailableMemory(PyObject * poSelf, PyObject * poArgs) +{ + int iValue = CPythonGraphic::Instance().GetAvailableMemory(); + return Py_BuildValue("i", iValue); +} + +// SCREENSHOT_CWDSAVE +PyObject * grpSaveScreenShotToPath(PyObject * poSelf, PyObject * poArgs) +{ + char * szBasePath; + if (!PyTuple_GetString(poArgs, 0, &szBasePath)) + return Py_BuildException(); + + struct tm * tmNow; + time_t ct; + + ct = time(0); + tmNow = localtime(&ct); + + char szPath[MAX_PATH + 256]; + snprintf(szPath, sizeof(szPath), "%s%02d%02d_%02d%02d%02d.jpg", + szBasePath, + tmNow->tm_mon + 1, + tmNow->tm_mday, + tmNow->tm_hour, + tmNow->tm_min, + tmNow->tm_sec); + + BOOL bResult = CPythonGraphic::Instance().SaveScreenShot(szPath); + return Py_BuildValue("(is)", bResult, szPath); +} +// END_OF_SCREENSHOT_CWDSAVE + +PyObject * grpSaveScreenShot(PyObject * poSelf, PyObject * poArgs) +{ + struct tm * tmNow; + time_t ct; + + ct = time(0); + tmNow = localtime(&ct); + + char szPath[MAX_PATH + 256]; + SHGetSpecialFolderPath(NULL, szPath, CSIDL_PERSONAL, TRUE); + //GetTempPath(); + strcat(szPath, "\\METIN2\\"); + + if (-1 == _access(szPath, 0)) + if (!CreateDirectory(szPath, NULL)) + { + TraceError("Failed to create directory [%s]\n", szPath); + return Py_BuildValue("(is)", FALSE, ""); + } + + sprintf(szPath + strlen(szPath), "%02d%02d_%02d%02d%02d.jpg", + tmNow->tm_mon + 1, + tmNow->tm_mday, + tmNow->tm_hour, + tmNow->tm_min, + tmNow->tm_sec); + + BOOL bResult = CPythonGraphic::Instance().SaveScreenShot(szPath); + return Py_BuildValue("(is)", bResult, szPath); +} + +PyObject * grpSetGamma(PyObject * poSelf, PyObject * poArgs) +{ + float gamma; + + if (!PyTuple_GetFloat(poArgs, 0, &gamma)) + return Py_BuildException(); + + CPythonGraphic::Instance().SetGamma(gamma); + return Py_BuildNone(); +} + +PyObject * grpSetInterfaceRenderState(PyObject * poSelf, PyObject * poArgs) +{ + CPythonGraphic::Instance().SetInterfaceRenderState(); + return Py_BuildNone(); +} + +PyObject * grpSetGameRenderState(PyObject * poSelf, PyObject * poArgs) +{ + CPythonGraphic::Instance().SetGameRenderState(); + return Py_BuildNone(); +} + +PyObject * grpSetViewport(PyObject * poSelf, PyObject * poArgs) +{ + float fx; + if (!PyTuple_GetFloat(poArgs, 0, &fx)) + return Py_BuildException(); + float fy; + if (!PyTuple_GetFloat(poArgs, 1, &fy)) + return Py_BuildException(); + + float fWidth; + if (!PyTuple_GetFloat(poArgs, 2, &fWidth)) + return Py_BuildException(); + float fHeight; + if (!PyTuple_GetFloat(poArgs, 3, &fHeight)) + return Py_BuildException(); + + UINT uWidth; + UINT uHeight; + CPythonGraphic::Instance().GetBackBufferSize(&uWidth, &uHeight); + CPythonGraphic::Instance().SetViewport(fx*uWidth, fy*uHeight, fWidth*uWidth, fHeight*uHeight); + return Py_BuildNone(); +} + +PyObject * grpRestoreViewport(PyObject * poSelf, PyObject * poArgs) +{ + CPythonGraphic::Instance().RestoreViewport(); + return Py_BuildNone(); +} + +PyObject * grpSetOmniLight(PyObject * poSelf, PyObject * poArgs) +{ + CPythonGraphic::Instance().SetOmniLight(); + return Py_BuildNone(); +} + +PyObject * grpGetCameraPosition(PyObject * poSelf, PyObject * poArgs) +{ + D3DXVECTOR3 v3Eye = CCameraManager::Instance().GetCurrentCamera()->GetEye(); + return Py_BuildValue("fff", v3Eye.x, v3Eye.y, v3Eye.z); +} + +PyObject * grpGetTargetPosition(PyObject * poSelf, PyObject * poArgs) +{ + D3DXVECTOR3 v3Target = CCameraManager::Instance().GetCurrentCamera()->GetTarget(); + return Py_BuildValue("fff", v3Target.x, v3Target.y, v3Target.z); +} + +void initgrp() +{ + static PyMethodDef s_methods[] = + { + { "InitScreenEffect", grpInitScreenEffect, METH_VARARGS }, + { "Culling", grpCulling, METH_VARARGS }, + { "ClearDepthBuffer", grpClearDepthBuffer, METH_VARARGS }, + { "Identity", grpIdentity, METH_VARARGS }, + { "GenerateColor", grpGenerateColor, METH_VARARGS }, + { "PopState", grpPopState, METH_VARARGS }, + { "PushState", grpPushState, METH_VARARGS }, + { "PushMatrix", grpPushMatrix, METH_VARARGS }, + { "PopMatrix", grpPopMatrix, METH_VARARGS }, + { "Translate", grpTranslate, METH_VARARGS }, + { "Rotate", grpRotate, METH_VARARGS }, + { "SetColorRenderState", grpSetColorRenderState, METH_VARARGS }, + { "SetAroundCamera", grpSetAroundCamera, METH_VARARGS }, + { "SetPositionCamera", grpSetPositionCamera, METH_VARARGS }, + { "SetEyeCamera", grpSetEyeCamera, METH_VARARGS }, + { "SetPerspective", grpSetPerspective, METH_VARARGS }, + { "SetOrtho2d", grpSetOrtho2D, METH_VARARGS }, + { "SetOrtho3d", grpSetOrtho3D, METH_VARARGS }, + { "SetColor", grpSetColor, METH_VARARGS }, + { "SetAlpha", grpSetAlpha, METH_VARARGS }, + { "SetDiffuseColor", grpSetDiffuseColor, METH_VARARGS }, + { "SetClearColor", grpSetClearColor, METH_VARARGS }, + { "GetCursorPosition3d", grpGetCursorPosition3d, METH_VARARGS }, + { "SetCursorPosition", grpSetCursorPosition, METH_VARARGS }, + { "RenderLine", grpRenderLine, METH_VARARGS }, + { "RenderBox", grpRenderBox, METH_VARARGS }, + { "RenderRoundBox", grpRenderRoundBox, METH_VARARGS }, + { "RenderBox3d", grpRenderBox3d, METH_VARARGS }, + { "RenderBar", grpRenderBar, METH_VARARGS }, + { "RenderBar3d", grpRenderBar3d, METH_VARARGS }, + { "RenderGradationBar", grpRenderGradationBar, METH_VARARGS }, + { "RenderCube", grpRenderCube, METH_VARARGS }, + { "RenderDownButton", grpRenderDownButton, METH_VARARGS }, + { "RenderUpButton", grpRenderUpButton, METH_VARARGS }, + { "GetAvailableMemory", grpGetAvailableMemory, METH_VARARGS }, + { "SaveScreenShot", grpSaveScreenShot, METH_VARARGS }, + { "SaveScreenShotToPath", grpSaveScreenShotToPath, METH_VARARGS }, + { "SetGamma", grpSetGamma, METH_VARARGS }, + { "SetInterfaceRenderState", grpSetInterfaceRenderState, METH_VARARGS }, + { "SetGameRenderState", grpSetGameRenderState, METH_VARARGS }, + { "SetViewport", grpSetViewport, METH_VARARGS }, + { "RestoreViewport", grpRestoreViewport, METH_VARARGS }, + { "SetOmniLight", grpSetOmniLight, METH_VARARGS }, + { "GetCameraPosition", grpGetCameraPosition, METH_VARARGS }, + { "GetTargetPosition", grpGetTargetPosition, METH_VARARGS }, + + { "CreateTextBar", grpCreateTextBar, METH_VARARGS }, + { "CreateBigTextBar", grpCreateBigTextBar, METH_VARARGS }, + { "DestroyTextBar", grpDestroyTextBar, METH_VARARGS }, + { "RenderTextBar", grpRenderTextBar, METH_VARARGS }, + { "TextBarTextOut", grpTextBarTextOut, METH_VARARGS }, + { "TextBarSetTextColor", grpTextBarSetTextColor, METH_VARARGS }, + { "TextBarGetTextExtent", grpTextBarGetTextExtent, METH_VARARGS }, + { "ClearTextBar", grpClearTextBar, METH_VARARGS }, + { "SetTextBarClipRect", grpSetTextBarClipRect, METH_VARARGS }, + + { NULL, NULL, NULL }, + }; + + Py_InitModule("grp", s_methods); +} diff --git a/extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp b/extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp new file mode 100644 index 00000000..f62c4d24 --- /dev/null +++ b/extension/src/port/EterPythonLib/PythonGraphicTextModule.cpp @@ -0,0 +1,418 @@ +#include "StdAfx.h" +#include "../common/PortPythonPointer.h" // PORT: preserve Win32 pointer handles on 64-bit hosts + +bool PyTuple_GetTextInstance(PyObject* poArgs, int pos, CGraphicTextInstance** ppTextInstance) +{ + return PyTuple_GetPointer(poArgs, pos, ppTextInstance) && *ppTextInstance; +} + +PyObject* grpTextGenerate(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance * pTextInstance = CGraphicTextInstance::New(); + return Py_BuildPointer(pTextInstance); +} + +PyObject* grpTextDestroy(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + CGraphicTextInstance::Delete(pTextInstance); + return Py_BuildNone(); +} + +PyObject* grpTextGetSize(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + int width, height; + pTextInstance->GetTextSize(&width, &height); + return Py_BuildValue("(i, i)", width, height); +} + +PyObject* grpTextSetPosition(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + int ix; + if (!PyTuple_GetInteger(poArgs, 1, &ix)) + return Py_BuildException(); + int iy; + if (!PyTuple_GetInteger(poArgs, 2, &iy)) + return Py_BuildException(); + + pTextInstance->SetPosition((float) ix, (float) iy); + return Py_BuildNone(); +} + +PyObject* grpTextSetText(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + char* szText; + if (!PyTuple_GetString(poArgs, 1, &szText)) + return Py_BuildException(); + + pTextInstance->SetValue(szText); + return Py_BuildNone(); +} + +PyObject* grpTextSetSecret(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + bool bValue; + if (!PyTuple_GetBoolean(poArgs, 1, &bValue)) + return Py_BuildException(); + + pTextInstance->SetSecret(bValue); + return Py_BuildNone(); +} + +PyObject* grpTextOutline(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + bool bValue; + if (!PyTuple_GetBoolean(poArgs, 1, &bValue)) + return Py_BuildException(); + + pTextInstance->SetOutline(bValue); + return Py_BuildNone(); +} + +PyObject* grpTextGetText(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + return Py_BuildValue("s", pTextInstance->GetValueStringReference().c_str()); +} + +PyObject* grpTextSetFontName(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + char* szFontName; + if (!PyTuple_GetString(poArgs, 1, &szFontName)) + return Py_BuildException(); + + std::string stFontName = szFontName; + stFontName += ".fnt"; + + CResource* pResource = CResourceManager::Instance().GetResourcePointer(stFontName.c_str()); + pTextInstance->SetTextPointer(static_cast(pResource)); + return Py_BuildNone(); +} + +PyObject* grpTextSetFontColor(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + if (2 == PyTuple_Size(poArgs)) + { + int iColor; + if (!PyTuple_GetInteger(poArgs, 1, &iColor)) + return Py_BuildException(); + pTextInstance->SetColor(DWORD(iColor)); + } + else if (4 == PyTuple_Size(poArgs)) + { + float fRed; + if (!PyTuple_GetFloat(poArgs, 1, &fRed)) + return Py_BuildException(); + float fGreen; + if (!PyTuple_GetFloat(poArgs, 2, &fGreen)) + return Py_BuildException(); + float fBlue; + if (!PyTuple_GetFloat(poArgs, 3, &fBlue)) + return Py_BuildException(); + pTextInstance->SetColor(fRed, fGreen, fBlue); + } + else + { + return Py_BuildException(); + } + + return Py_BuildNone(); +} + +PyObject* grpTextSetOutLineColor(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + float fRed; + if (!PyTuple_GetFloat(poArgs, 1, &fRed)) + return Py_BuildException(); + float fGreen; + if (!PyTuple_GetFloat(poArgs, 2, &fGreen)) + return Py_BuildException(); + float fBlue; + if (!PyTuple_GetFloat(poArgs, 3, &fBlue)) + return Py_BuildException(); + + float fAlpha; + if (!PyTuple_GetFloat(poArgs, 4, &fAlpha)) + return Py_BuildException(); + + pTextInstance->SetOutLineColor(fRed, fGreen, fBlue, fAlpha); + return Py_BuildNone(); +} + + +PyObject* grpTextRender(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + pTextInstance->Render(); + return Py_BuildNone(); +} + +PyObject* grpTextUpdate(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + pTextInstance->Update(); + return Py_BuildNone(); +} + +PyObject* grpTextShowCursor(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + pTextInstance->ShowCursor(); + return Py_BuildNone(); +} + +PyObject* grpTextHideCursor(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + pTextInstance->HideCursor(); + return Py_BuildNone(); +} + +PyObject* grpSetHorizontalAlign(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + int iAlign; + if (!PyTuple_GetInteger(poArgs, 1, &iAlign)) + return Py_BuildException(); + + pTextInstance->SetHorizonalAlign(iAlign); + return Py_BuildNone(); +} + +PyObject* grpSetVerticalAlign(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + int iAlign; + if (!PyTuple_GetInteger(poArgs, 1, &iAlign)) + return Py_BuildException(); + + pTextInstance->SetVerticalAlign(iAlign); + return Py_BuildNone(); +} + +PyObject* grpSetMax(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance* pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + int iValue; + if (!PyTuple_GetInteger(poArgs, 1, &iValue)) + return Py_BuildException(); + + pTextInstance->SetMax(iValue); + return Py_BuildNone(); +} + +PyObject* grpGetSplitingTextLineCount(PyObject* poSelf, PyObject* poArgs) +{ + char * szText; + if (!PyTuple_GetString(poArgs, 0, &szText)) + return Py_BuildException(); + + int iLineLimitation; + if (!PyTuple_GetInteger(poArgs, 1, &iLineLimitation)) + return Py_BuildException(); + + int iPosition = 0; + int iLineCount = 0; + + for (DWORD i = 0; i < strlen(szText);) + { + if ('|' == szText[i]) + { + i += 1; + + // 자동 줄 바꿈되고 바로 | 가 있을 경우 + if (iPosition>0) + ++iLineCount; + + iPosition = 0; + continue; + } + + if (szText[i] & 0x80) + { + i += 2; + iPosition += 2; + } + else + { + i += 1; + iPosition += 1; + } + + if (iPosition >= iLineLimitation) + { + ++iLineCount; + iPosition = 0; + } + } + + if (iPosition > 0) + ++iLineCount; + + return Py_BuildValue("i", iLineCount); +} + +PyObject* grpGetSplitingTextLine(PyObject* poSelf, PyObject* poArgs) +{ + char * szText; + if (!PyTuple_GetString(poArgs, 0, &szText)) + return Py_BuildException(); + + int iLineLimitation; + if (!PyTuple_GetInteger(poArgs, 1, &iLineLimitation)) + return Py_BuildException(); + + int iGettingLine; + if (!PyTuple_GetInteger(poArgs, 2, &iGettingLine)) + return Py_BuildException(); + + std::string strLine = ""; + int iPosition = 0; + int iLineCount = 0; + + // 1차 : 조금 더 깔끔하게 안될까 -_-a + // 2차 : 오.. 좀 나아졌다 +_+ + for (DWORD i = 0; i < strlen(szText);) + { + if ('|' == szText[i]) + { + i += 1; + + // 자동 줄 바꿈되고 바로 | 가 있을 경우 + if (iPosition>0) + ++iLineCount; + iPosition = 0; + continue; + } + + if (szText[i] & 0x80) + { + if (iLineCount == iGettingLine) + strLine.append(szText+i, 2); + + i += 2; + iPosition += 2; + } + else + { + if (iLineCount == iGettingLine) + strLine += szText[i]; + + i += 1; + iPosition += 1; + } + + if (iPosition >= iLineLimitation) + { + ++iLineCount; + iPosition = 0; + } + } + + return Py_BuildValue("s", strLine.c_str()); +} + +PyObject* grpTextPixelPositionToCharacterPosition(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicTextInstance * pTextInstance; + if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance)) + return Py_BuildException(); + + int iPixelPosition; + if (!PyTuple_GetInteger(poArgs, 1, &iPixelPosition)) + return Py_BuildException(); + + int iCharacterPosition = pTextInstance->PixelPositionToCharacterPosition(iPixelPosition); + + return Py_BuildValue("i", iCharacterPosition); +} + +void initgrpText() +{ + static PyMethodDef s_methods[] = + { + { "Update", grpTextUpdate, METH_VARARGS }, + { "Render", grpTextRender, METH_VARARGS }, + { "Generate", grpTextGenerate, METH_VARARGS }, + { "Destroy", grpTextDestroy, METH_VARARGS }, + { "SetFontName", grpTextSetFontName, METH_VARARGS }, + { "SetFontColor", grpTextSetFontColor, METH_VARARGS }, + { "SetOutLineColor", grpTextSetOutLineColor, METH_VARARGS }, + { "SetSecret", grpTextSetSecret, METH_VARARGS }, + { "SetOutline", grpTextOutline, METH_VARARGS }, + { "SetText", grpTextSetText, METH_VARARGS }, + { "GetText", grpTextGetText, METH_VARARGS }, + { "GetSize", grpTextGetSize, METH_VARARGS }, + { "SetPosition", grpTextSetPosition, METH_VARARGS }, + { "ShowCursor", grpTextShowCursor, METH_VARARGS }, + { "HideCursor", grpTextHideCursor, METH_VARARGS }, + { "SetHorizontalAlign", grpSetHorizontalAlign, METH_VARARGS }, + { "SetVerticalAlign", grpSetVerticalAlign, METH_VARARGS }, + { "SetMax", grpSetMax, METH_VARARGS }, + { "GetSplitingTextLineCount", grpGetSplitingTextLineCount, METH_VARARGS }, + { "GetSplitingTextLine", grpGetSplitingTextLine, METH_VARARGS }, + { "PixelPositionToCharacterPosition", grpTextPixelPositionToCharacterPosition, METH_VARARGS }, + { NULL, NULL, NULL }, + }; + + Py_InitModule("grpText", s_methods); +} diff --git a/extension/src/port/EterPythonLib/PythonGraphicThingModule.cpp b/extension/src/port/EterPythonLib/PythonGraphicThingModule.cpp new file mode 100644 index 00000000..144ead6b --- /dev/null +++ b/extension/src/port/EterPythonLib/PythonGraphicThingModule.cpp @@ -0,0 +1,157 @@ +#include "StdAfx.h" +#include "../common/PortPythonPointer.h" // PORT: preserve Win32 pointer handles on 64-bit hosts + +bool PyTuple_GetThingInstance(PyObject* poArgs, int pos, CGraphicThingInstance** ppRetThingInstance) +{ + return PyTuple_GetPointer(poArgs, pos, ppRetThingInstance) && *ppRetThingInstance; +} + +PyObject* grpThingGenerate(PyObject* poSelf, PyObject* poArgs) +{ + char * szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BuildException(); + + if (strlen(szFileName) <= 0) + return Py_BuildValue("i", 0); + + CResource* pResource = CResourceManager::Instance().GetResourcePointer(szFileName); + + if (!pResource->IsType(CGraphicThing::Type())) + return Py_BuildException(); + + CGraphicThingInstance * pThingInstance = CGraphicThingInstance::New(); + pThingInstance->ReserveModelThing(1); + pThingInstance->ReserveModelInstance(1); + pThingInstance->RegisterModelThing(0, static_cast(pResource)); + pThingInstance->SetModelInstance(0, 0, 0); + return Py_BuildPointer(pThingInstance); +} + +PyObject* grpThingDelete(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicThingInstance * pThingInstance; + if (!PyTuple_GetThingInstance(poArgs, 0, &pThingInstance)) + return Py_BuildException(); + + CGraphicThingInstance::Delete(pThingInstance); + return Py_BuildNone(); +} + +PyObject* grpThingSetFileName(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicThingInstance * pThingInstance; + if (!PyTuple_GetThingInstance(poArgs, 0, &pThingInstance)) + return Py_BuildException(); + + char* szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BuildException(); + + CResource* pResource = CResourceManager::Instance().GetResourcePointer(szFileName); + + if (!pResource->IsType(CGraphicThing::Type())) + return Py_BuildException(); + + pThingInstance->Clear(); + pThingInstance->ReserveModelThing(1); + pThingInstance->ReserveModelInstance(1); + pThingInstance->RegisterModelThing(0, static_cast(pResource)); + pThingInstance->SetModelInstance(0, 0, 0); + return Py_BuildNone(); +} + +PyObject* grpThingRender(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicThingInstance* pThingInstance; + if (!PyTuple_GetThingInstance(poArgs, 0, &pThingInstance)) + return Py_BuildException(); + + pThingInstance->Render(); + return Py_BuildNone(); +} + +PyObject* grpThingUpdate(PyObject* poSelf, PyObject* poArgs) +{ + CGraphicThingInstance* pThingInstance; + if (!PyTuple_GetThingInstance(poArgs, 0, &pThingInstance)) + return Py_BuildException(); + + pThingInstance->Update(); + pThingInstance->Deform(); + return Py_BuildNone(); +} + +PyObject * grpSetThingPosition(PyObject * poSelf, PyObject * poArgs) +{ + CGraphicThingInstance* pThingInstance; + if (!PyTuple_GetThingInstance(poArgs, 0, &pThingInstance)) + return Py_BuildException(); + + float x; + if (!PyTuple_GetFloat(poArgs, 1, &x)) + return Py_BuildException(); + + float y; + if (!PyTuple_GetFloat(poArgs, 2, &y)) + return Py_BuildException(); + + float z; + if (!PyTuple_GetFloat(poArgs, 3, &z)) + return Py_BuildException(); + + pThingInstance->SetPosition(x, y, z); + return Py_BuildNone(); +} + +PyObject * grpSetThingRotation(PyObject * poSelf, PyObject * poArgs) +{ + CGraphicThingInstance* pThingInstance; + if (!PyTuple_GetThingInstance(poArgs, 0, &pThingInstance)) + return Py_BuildException(); + + float fDegree; + if (!PyTuple_GetFloat(poArgs, 1, &fDegree)) + return Py_BuildException(); + + pThingInstance->SetRotation(fDegree); + return Py_BuildNone(); +} + +PyObject * grpSetThingScale(PyObject * poSelf, PyObject * poArgs) +{ + CGraphicThingInstance* pThingInstance; + if (!PyTuple_GetThingInstance(poArgs, 0, &pThingInstance)) + return Py_BuildException(); + + float x; + if (!PyTuple_GetFloat(poArgs, 1, &x)) + return Py_BuildException(); + float y; + if (!PyTuple_GetFloat(poArgs, 2, &y)) + return Py_BuildException(); + float z; + if (!PyTuple_GetFloat(poArgs, 3, &z)) + return Py_BuildException(); + + pThingInstance->SetScale(x, y, z); + return Py_BuildNone(); +} + +void initgrpThing() +{ + static PyMethodDef s_methods[] = + { + { "Update", grpThingUpdate, METH_VARARGS }, + { "Render", grpThingRender, METH_VARARGS }, + { "SetPosition", grpSetThingPosition, METH_VARARGS }, + { "Generate", grpThingGenerate, METH_VARARGS }, + { "Delete", grpThingDelete, METH_VARARGS }, + { "SetFileName", grpThingSetFileName, METH_VARARGS }, + { "SetRotation", grpSetThingRotation, METH_VARARGS }, + { "SetScale", grpSetThingScale, METH_VARARGS }, + { NULL, NULL, NULL }, + }; + + Py_InitModule("grpThing", s_methods); +} diff --git a/extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp b/extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp new file mode 100644 index 00000000..ba38b9f7 --- /dev/null +++ b/extension/src/port/EterPythonLib/PythonWindowManagerModule.cpp @@ -0,0 +1,2516 @@ +#include "StdAfx.h" +#include "../common/PortPythonPointer.h" // PORT: preserve Win32 pointer handles on 64-bit hosts +#include "PythonWindow.h" +#include "PythonSlotWindow.h" +#include "PythonGridSlotWindow.h" + +bool PyTuple_GetWindow(PyObject* poArgs, int pos, UI::CWindow ** ppRetWindow) +{ + return PyTuple_GetPointer(poArgs, pos, ppRetWindow) && *ppRetWindow; +} + +PyObject * wndMgrGetAspect(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("f", UI::CWindowManager::Instance().GetAspect()); +} + +PyObject * wndMgrOnceIgnoreMouseLeftButtonUpEvent(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindowManager::Instance().OnceIgnoreMouseLeftButtonUpEvent(); + return Py_BuildNone(); +} + +PyObject * wndMgrSetMouseHandler(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * poHandler; + if (!PyTuple_GetObject(poArgs, 0, &poHandler)) + return Py_BuildException(); + + UI::CWindowManager::Instance().SetMouseHandler(poHandler); + return Py_BuildNone(); +} + +///////////////////////////////////////////////////////////////////////////////////////////////// +///// Register ///// +// Window +PyObject * wndMgrRegister(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindowManager& kWndMgr=UI::CWindowManager::Instance(); + UI::CWindow * pWindow = kWndMgr.RegisterWindow(po, szLayer); + if (!pWindow) + return Py_BuildException(); + + return Py_BuildPointer(pWindow); +} + +// SlotWindow +PyObject * wndMgrRegisterSlotWindow(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterSlotWindow(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// GridSlotWindow +PyObject * wndMgrRegisterGridSlotWindow(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterGridSlotWindow(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// TextLine +PyObject * wndMgrRegisterTextLine(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterTextLine(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// MarkBox +PyObject * wndMgrRegisterMarkBox(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterMarkBox(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// ImageBox +PyObject * wndMgrRegisterImageBox(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterImageBox(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// ExpandedImageBox +PyObject * wndMgrRegisterExpandedImageBox(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterExpandedImageBox(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// AniImageBox +PyObject * wndMgrRegisterAniImageBox(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterAniImageBox(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// RegisterButton +PyObject * wndMgrRegisterButton(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterButton(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// RadioButton +PyObject * wndMgrRegisterRadioButton(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterRadioButton(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// ToggleButton +PyObject * wndMgrRegisterToggleButton(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterToggleButton(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// DragButton +PyObject * wndMgrRegisterDragButton(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterDragButton(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// Box +PyObject * wndMgrRegisterBox(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterBox(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// Bar +PyObject * wndMgrRegisterBar(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterBar(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// Line +PyObject * wndMgrRegisterLine(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterLine(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// Slot +PyObject * wndMgrRegisterBar3D(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterBar3D(po, szLayer); + return Py_BuildPointer(pWindow); +} + +// NumberLine +PyObject * wndMgrRegisterNumberLine(PyObject * poSelf, PyObject * poArgs) +{ + PyObject * po; + if (!PyTuple_GetObject(poArgs, 0, &po)) + return Py_BuildException(); + char * szLayer; + if (!PyTuple_GetString(poArgs, 1, &szLayer)) + return Py_BuildException(); + + UI::CWindow * pWindow = UI::CWindowManager::Instance().RegisterNumberLine(po, szLayer); + return Py_BuildPointer(pWindow); +} +///// Register ///// +///////////////////////////////////////////////////////////////////////////////////////////////// + +PyObject * wndMgrDestroy(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + UI::CWindowManager::Instance().DestroyWindow(pWin); + return Py_BuildNone(); +} + +PyObject * wndMgrIsFocus(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + return Py_BuildValue("i", pWindow == UI::CWindowManager::Instance().GetActivateWindow()); +} + +PyObject * wndMgrSetFocus(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + UI::CWindowManager::Instance().ActivateWindow(pWin); + return Py_BuildNone(); +} + +PyObject * wndMgrKillFocus(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (PyTuple_GetWindow(poArgs, 0, &pWin)) + { + if (pWin == UI::CWindowManager::Instance().GetActivateWindow()) + { + UI::CWindowManager::Instance().DeactivateWindow(); + } + } + else + { + UI::CWindowManager::Instance().DeactivateWindow(); + } + + return Py_BuildNone(); +} + +PyObject * wndMgrLock(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + UI::CWindowManager::Instance().LockWindow(pWin); + return Py_BuildNone(); +} + +PyObject * wndMgrUnlock(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindowManager::Instance().UnlockWindow(); + return Py_BuildNone(); +} + +PyObject * wndMgrSetName(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + char * szName; + if (!PyTuple_GetString(poArgs, 1, &szName)) + return Py_BuildException(); + + pWin->SetName(szName); + return Py_BuildNone(); +} + +PyObject * wndMgrSetTop(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + UI::CWindowManager::Instance().SetTop(pWin); + return Py_BuildNone(); +} + +PyObject * wndMgrShow(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + pWin->Show(); + return Py_BuildNone(); +} + +PyObject * wndMgrHide(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + pWin->Hide(); + return Py_BuildNone(); +} + +PyObject * wndMgrIsShow(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + return Py_BuildValue("i", pWin->IsShow()); +} + +PyObject * wndMgrIsRTL(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + return Py_BuildValue("i", pWin->IsFlag(UI::CWindow::FLAG_RTL)); +} + +PyObject * wndMgrSetScreenSize(PyObject * poSelf, PyObject * poArgs) +{ + int width; + if (!PyTuple_GetInteger(poArgs, 0, &width)) + return Py_BuildException(); + int height; + if (!PyTuple_GetInteger(poArgs, 1, &height)) + return Py_BuildException(); + + UI::CWindowManager::Instance().SetScreenSize(width, height); + return Py_BuildNone(); +} + +PyObject * wndMgrSetParent(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + UI::CWindow * pParentWin; + if (!PyTuple_GetWindow(poArgs, 1, &pParentWin)) + return Py_BuildException(); + + UI::CWindowManager::Instance().SetParent(pWin, pParentWin); + return Py_BuildNone(); +} + +PyObject * wndMgrSetPickAlways(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + UI::CWindowManager::Instance().SetPickAlways(pWin); + return Py_BuildNone(); +} + +PyObject * wndMgrSetWndSize(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + int width; + if (!PyTuple_GetInteger(poArgs, 1, &width)) + return Py_BuildException(); + int height; + if (!PyTuple_GetInteger(poArgs, 2, &height)) + return Py_BuildException(); + + pWin->SetSize(width, height); + return Py_BuildNone(); +} + +PyObject * wndMgrSetWndPosition(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + int x; + if (!PyTuple_GetInteger(poArgs, 1, &x)) + return Py_BuildException(); + int y; + if (!PyTuple_GetInteger(poArgs, 2, &y)) + return Py_BuildException(); + + pWin->SetPosition(x, y); + return Py_BuildNone(); +} + +PyObject * wndMgrGetName(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + return Py_BuildValue("s", pWin->GetName()); +} + +PyObject * wndMgrGetWndWidth(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + return Py_BuildValue("i", pWin->GetWidth()); +} + +PyObject * wndMgrGetWndHeight(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + return Py_BuildValue("i", pWin->GetHeight()); +} + +PyObject * wndMgrGetWndLocalPosition(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + long lx, ly; + pWin->GetPosition(&lx, &ly); + + return Py_BuildValue("ii", lx, ly); +} + +PyObject * wndMgrGetWndGlobalPosition(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + RECT & rRect = pWindow->GetRect(); + return Py_BuildValue("ii", rRect.left, rRect.top); +} + +PyObject * wndMgrGetWindowRect(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + RECT & rRect = pWin->GetRect(); + return Py_BuildValue("iiii", rRect.left, rRect.top, rRect.right - rRect.left, rRect.bottom - rRect.top); +} + +PyObject * wndMgrSetWindowHorizontalAlign(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + int iAlign; + if (!PyTuple_GetInteger(poArgs, 1, &iAlign)) + return Py_BuildException(); + + pWin->SetHorizontalAlign(iAlign); + + return Py_BuildNone(); +} + +PyObject * wndMgrSetWindowVerticalAlign(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + int iAlign; + if (!PyTuple_GetInteger(poArgs, 1, &iAlign)) + return Py_BuildException(); + + pWin->SetVerticalAlign(iAlign); + + return Py_BuildNone(); +} + +PyObject * wndMgrIsIn(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + return Py_BuildValue("i", pWin == UI::CWindowManager::Instance().GetPointWindow()); +} + +PyObject * wndMgrGetMouseLocalPosition(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + long lx, ly; + pWin->GetMouseLocalPosition(lx, ly); + return Py_BuildValue("ii", lx, ly); +} + +PyObject * wndMgrGetHyperlink(PyObject * poSelf, PyObject * poArgs) +{ + char retBuf[1024]; + int retLen = CGraphicTextInstance::Hyperlink_GetText(retBuf, sizeof(retBuf)-1); + retBuf[retLen] = '\0'; + + return Py_BuildValue("s#", retBuf, retLen); +} + +PyObject * wndMgrGetScreenWidth(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", UI::CWindowManager::Instance().GetScreenWidth()); +} + +PyObject * wndMgrGetScreenHeight(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", UI::CWindowManager::Instance().GetScreenHeight()); +} + +PyObject * wndMgrGetMousePosition(PyObject * poSelf, PyObject * poArgs) +{ + long lx, ly; + UI::CWindowManager::Instance().GetMousePosition(lx, ly); + return Py_BuildValue("ii", lx, ly); +} + +PyObject * wndMgrIsDragging(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", UI::CWindowManager::Instance().IsDragging()); +} + +PyObject * wndMgrIsPickedWindow(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + UI::CWindow * pPickedWin = UI::CWindowManager::Instance().GetPointWindow(); + return Py_BuildValue("i", pWin == pPickedWin ? 1 : 0); +} + +PyObject * wndMgrGetChildCount(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + return Py_BuildValue("i", pWin->GetChildCount()); +} + +PyObject * wndMgrAddFlag(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + char * pszFlag; + if (!PyTuple_GetString(poArgs, 1, &pszFlag)) + return Py_BuildException(); + + if (pszFlag && *pszFlag) + { + if (!stricmp(pszFlag, "movable")) + pWin->AddFlag(UI::CWindow::FLAG_MOVABLE); + else if (!stricmp(pszFlag, "limit")) + pWin->AddFlag(UI::CWindow::FLAG_LIMIT); + else if (!stricmp(pszFlag, "dragable")) + pWin->AddFlag(UI::CWindow::FLAG_DRAGABLE); + else if (!stricmp(pszFlag, "attach")) + pWin->AddFlag(UI::CWindow::FLAG_ATTACH); + else if (!stricmp(pszFlag, "restrict_x")) + pWin->AddFlag(UI::CWindow::FLAG_RESTRICT_X); + else if (!stricmp(pszFlag, "restrict_y")) + pWin->AddFlag(UI::CWindow::FLAG_RESTRICT_Y); + else if (!stricmp(pszFlag, "float")) + pWin->AddFlag(UI::CWindow::FLAG_FLOAT); + else if (!stricmp(pszFlag, "not_pick")) + pWin->AddFlag(UI::CWindow::FLAG_NOT_PICK); + else if (!stricmp(pszFlag, "ignore_size")) + pWin->AddFlag(UI::CWindow::FLAG_IGNORE_SIZE); + else if (!stricmp(pszFlag, "rtl")) + pWin->AddFlag(UI::CWindow::FLAG_RTL); + else if (!stricmp(pszFlag, "ltr")) + pWin->RemoveFlag(UI::CWindow::FLAG_RTL); + else + TraceError("Unknown window flag %s", pszFlag); + } + + return Py_BuildNone(); +} + +PyObject * wndMgrSetLimitBias(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int l; + if (!PyTuple_GetInteger(poArgs, 1, &l)) + return Py_BuildException(); + int r; + if (!PyTuple_GetInteger(poArgs, 2, &r)) + return Py_BuildException(); + int t; + if (!PyTuple_GetInteger(poArgs, 3, &t)) + return Py_BuildException(); + int b; + if (!PyTuple_GetInteger(poArgs, 4, &b)) + return Py_BuildException(); + + pWin->SetLimitBias(l, r, t, b); + return Py_BuildNone(); +} + +PyObject * wndMgrUpdateRect(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + pWin->UpdateRect(); + return Py_BuildNone(); +} + +PyObject * wndMgrAppendSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iIndex)) + return Py_BuildException(); + + int ixPosition; + if (!PyTuple_GetInteger(poArgs, 2, &ixPosition)) + return Py_BuildException(); + + int iyPosition; + if (!PyTuple_GetInteger(poArgs, 3, &iyPosition)) + return Py_BuildException(); + + int ixCellSize; + if (!PyTuple_GetInteger(poArgs, 4, &ixCellSize)) + return Py_BuildException(); + + int iyCellSize; + if (!PyTuple_GetInteger(poArgs, 5, &iyCellSize)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->AppendSlot(iIndex, ixPosition, iyPosition, ixCellSize, iyCellSize); + + return Py_BuildNone(); +} + +PyObject * wndMgrArrangeSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iStartIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iStartIndex)) + return Py_BuildException(); + + int ixCellCount; + if (!PyTuple_GetInteger(poArgs, 2, &ixCellCount)) + return Py_BuildException(); + + int iyCellCount; + if (!PyTuple_GetInteger(poArgs, 3, &iyCellCount)) + return Py_BuildException(); + + int ixCellSize; + if (!PyTuple_GetInteger(poArgs, 4, &ixCellSize)) + return Py_BuildException(); + + int iyCellSize; + if (!PyTuple_GetInteger(poArgs, 5, &iyCellSize)) + return Py_BuildException(); + + int ixBlank; + if (!PyTuple_GetInteger(poArgs, 6, &ixBlank)) + return Py_BuildException(); + + int iyBlank; + if (!PyTuple_GetInteger(poArgs, 7, &iyBlank)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CGridSlotWindow::Type())) + { + TraceError("wndMgr.ArrangeSlot : not a grid window"); + return Py_BuildException(); + } + + UI::CGridSlotWindow * pGridSlotWin = (UI::CGridSlotWindow *)pWin; + pGridSlotWin->ArrangeGridSlot(iStartIndex, ixCellCount, iyCellCount, ixCellSize, iyCellSize, ixBlank, iyBlank); + + return Py_BuildNone(); +} + +PyObject * wndMgrSetSlotBaseImage(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + char * szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BuildException(); + + float fr; + if (!PyTuple_GetFloat(poArgs, 2, &fr)) + return Py_BuildException(); + float fg; + if (!PyTuple_GetFloat(poArgs, 3, &fg)) + return Py_BuildException(); + float fb; + if (!PyTuple_GetFloat(poArgs, 4, &fb)) + return Py_BuildException(); + float fa; + if (!PyTuple_GetFloat(poArgs, 5, &fa)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + { + TraceError("wndMgr.ArrangeSlot : not a slot window"); + return Py_BuildException(); + } + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->SetSlotBaseImage(szFileName, fr, fg, fb, fa); + + return Py_BuildNone(); +} + +PyObject * wndMgrSetCoverButton(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + char * szUpImageName; + if (!PyTuple_GetString(poArgs, 2, &szUpImageName)) + return Py_BuildException(); + char * szOverImageName; + if (!PyTuple_GetString(poArgs, 3, &szOverImageName)) + return Py_BuildException(); + char * szDownImageName; + if (!PyTuple_GetString(poArgs, 4, &szDownImageName)) + return Py_BuildException(); + char * szDisableImageName; + if (!PyTuple_GetString(poArgs, 5, &szDisableImageName)) + return Py_BuildException(); + + int iLeftButtonEnable; + if (!PyTuple_GetInteger(poArgs, 6, &iLeftButtonEnable)) + return Py_BuildException(); + int iRightButtonEnable; + if (!PyTuple_GetInteger(poArgs, 7, &iRightButtonEnable)) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWindow; + pSlotWin->SetCoverButton(iSlotIndex, szUpImageName, szOverImageName, szDownImageName, szDisableImageName, iLeftButtonEnable, iRightButtonEnable); + + return Py_BuildNone(); +} + +PyObject * wndMgrEnableCoverButton(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWindow; + pSlotWin->EnableCoverButton(iSlotIndex); + + return Py_BuildNone(); +} + +PyObject * wndMgrDisableCoverButton(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWindow; + pSlotWin->DisableCoverButton(iSlotIndex); + + return Py_BuildNone(); +} + +PyObject * wndMgrIsDisableCoverButton(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWindow; + return Py_BuildValue("i", pSlotWin->IsDisableCoverButton(iSlotIndex)); +} + +PyObject * wndMgrSetAlwaysRenderCoverButton(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + int iSlotIndex; + bool bAlwaysRender = false; + + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + if (!PyTuple_GetBoolean(poArgs, 2, &bAlwaysRender)) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWindow; + pSlotWin->SetAlwaysRenderCoverButton(iSlotIndex, bAlwaysRender); + + return Py_BuildNone(); +} + +PyObject * wndMgrAppendSlotButton(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + char * szUpImageName; + if (!PyTuple_GetString(poArgs, 1, &szUpImageName)) + return Py_BuildException(); + char * szOverImageName; + if (!PyTuple_GetString(poArgs, 2, &szOverImageName)) + return Py_BuildException(); + char * szDownImageName; + if (!PyTuple_GetString(poArgs, 3, &szDownImageName)) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWindow; + pSlotWin->AppendSlotButton(szUpImageName, szOverImageName, szDownImageName); + + return Py_BuildNone(); +} + +PyObject * wndMgrAppendRequirementSignImage(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + char * szImageName; + if (!PyTuple_GetString(poArgs, 1, &szImageName)) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWindow; + pSlotWin->AppendRequirementSignImage(szImageName); + + return Py_BuildNone(); +} + +PyObject * wndMgrShowSlotButton(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + int iSlotNumber; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotNumber)) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWindow; + pSlotWin->ShowSlotButton(iSlotNumber); + + return Py_BuildNone(); +} + +PyObject * wndMgrHideAllSlotButton(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWindow; + pSlotWin->HideAllSlotButton(); + + return Py_BuildNone(); +} + +PyObject * wndMgrShowRequirementSign(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + int iSlotNumber; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotNumber)) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWindow; + pSlotWin->ShowRequirementSign(iSlotNumber); + + return Py_BuildNone(); +} + +PyObject * wndMgrHideRequirementSign(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + int iSlotNumber; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotNumber)) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWindow; + pSlotWin->HideRequirementSign(iSlotNumber); + + return Py_BuildNone(); +} + +PyObject * wndMgrRefreshSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->RefreshSlot(); + + return Py_BuildNone(); +} + +PyObject * wndMgrSetUseMode(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + int iFlag; + if (!PyTuple_GetInteger(poArgs, 1, &iFlag)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->SetUseMode(iFlag); + + return Py_BuildNone(); +} + +PyObject * wndMgrSetUsableItem(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + int iFlag; + if (!PyTuple_GetInteger(poArgs, 1, &iFlag)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->SetUsableItem(iFlag); + + return Py_BuildNone(); +} + +PyObject * wndMgrClearSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->ClearSlot(iSlotIndex); + + return Py_BuildNone(); +} + +PyObject * wndMgrClearAllSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->ClearAllSlot(); + + return Py_BuildNone(); +} + +PyObject * wndMgrHasSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + + return Py_BuildValue("i", pSlotWin->HasSlot(iSlotIndex)); +} + +PyObject * wndMgrSetSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + int iItemIndex; + if (!PyTuple_GetInteger(poArgs, 2, &iItemIndex)) + return Py_BuildException(); + + int iWidth; + if (!PyTuple_GetInteger(poArgs, 3, &iWidth)) + return Py_BuildException(); + + int iHeight; + if (!PyTuple_GetInteger(poArgs, 4, &iHeight)) + return Py_BuildException(); + + CGraphicImage* image; + if (!PyTuple_GetPointer(poArgs, 5, &image)) + return Py_BuildException(); + + D3DXCOLOR diffuseColor; + PyObject* pTuple; + if (!PyTuple_GetObject(poArgs, 6, &pTuple)) + { + diffuseColor = D3DXCOLOR(1.0, 1.0, 1.0, 1.0); + //return Py_BuildException(); + } + else + // get diffuse color from pTuple + { + if (PyTuple_Size(pTuple) != 4) + return Py_BuildException(); + if (!PyTuple_GetFloat(pTuple, 0, &diffuseColor.r)) + return Py_BuildException(); + if (!PyTuple_GetFloat(pTuple, 1, &diffuseColor.g)) + return Py_BuildException(); + if (!PyTuple_GetFloat(pTuple, 2, &diffuseColor.b)) + return Py_BuildException(); + if (!PyTuple_GetFloat(pTuple, 3, &diffuseColor.a)) + return Py_BuildException(); + } + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->SetSlot(iSlotIndex, iItemIndex, iWidth, iHeight, image, diffuseColor); + + return Py_BuildNone(); +} + +PyObject * wndMgrSetSlotCount(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + int iCount; + if (!PyTuple_GetInteger(poArgs, 2, &iCount)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->SetSlotCount(iSlotIndex, iCount); + + return Py_BuildNone(); +} + +PyObject * wndMgrSetSlotCountNew(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + int iGrade; + if (!PyTuple_GetInteger(poArgs, 2, &iGrade)) + return Py_BuildException(); + + int iCount; + if (!PyTuple_GetInteger(poArgs, 3, &iCount)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->SetSlotCountNew(iSlotIndex, iGrade, iCount); + + return Py_BuildNone(); +} + +PyObject * wndMgrSetSlotCoolTime(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + float fCoolTime; + if (!PyTuple_GetFloat(poArgs, 2, &fCoolTime)) + return Py_BuildException(); + + float fElapsedTime = 0.0f; + PyTuple_GetFloat(poArgs, 3, &fElapsedTime); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->SetSlotCoolTime(iSlotIndex, fCoolTime, fElapsedTime); + + return Py_BuildNone(); +} + +PyObject * wndMgrSetToggleSlot(PyObject * poSelf, PyObject * poArgs) +{ + assert(!"wndMgrSetToggleSlot - \xbb\xe7\xbf\xeb\xc7\xcf\xc1\xf6\x20\xbe\xca\xb4\xc2\x20\xc7\xd4\xbc\xf6"); + return Py_BuildNone(); +} + +PyObject * wndMgrActivateSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->ActivateSlot(iSlotIndex); + return Py_BuildNone(); +} + +PyObject * wndMgrDeactivateSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->DeactivateSlot(iSlotIndex); + return Py_BuildNone(); +} + +PyObject * wndMgrEnableSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->EnableSlot(iSlotIndex); + return Py_BuildNone(); +} + +PyObject * wndMgrDisableSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->DisableSlot(iSlotIndex); + return Py_BuildNone(); +} + +PyObject * wndMgrShowSlotBaseImage(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->ShowSlotBaseImage(iSlotIndex); + return Py_BuildNone(); +} + +PyObject * wndMgrHideSlotBaseImage(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->HideSlotBaseImage(iSlotIndex); + return Py_BuildNone(); +} + +PyObject * wndMgrSetSlotType(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iType; + if (!PyTuple_GetInteger(poArgs, 1, &iType)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->SetSlotType(iType); + + return Py_BuildNone(); +} + +PyObject * wndMgrSetSlotStyle(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iStyle; + if (!PyTuple_GetInteger(poArgs, 1, &iStyle)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->SetSlotStyle(iStyle); + + return Py_BuildNone(); +} + +PyObject * wndMgrSelectSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + int iIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iIndex)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->SelectSlot(iIndex); + + return Py_BuildNone(); +} + +PyObject * wndMgrClearSelected(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->ClearSelected(); + + return Py_BuildNone(); +} + +PyObject * wndMgrGetSelectedSlotCount(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + return Py_BuildValue("i", pSlotWin->GetSelectedSlotCount()); +} + +PyObject * wndMgrGetSelectedSlotNumber(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + int iSlotNumber; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotNumber)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + return Py_BuildValue("i", pSlotWin->GetSelectedSlotNumber(iSlotNumber)); +} + +PyObject * wndMgrIsSelectedSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + int iSlotNumber; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotNumber)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + return Py_BuildValue("i", pSlotWin->isSelectedSlot(iSlotNumber)); +} + +PyObject * wndMgrGetSlotCount(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + return Py_BuildValue("i", pSlotWin->GetSlotCount()); +} + +PyObject * wndMgrLockSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->LockSlot(iSlotIndex); + return Py_BuildNone(); +} + +PyObject * wndMgrUnlockSlot(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWin; + if (!PyTuple_GetWindow(poArgs, 0, &pWin)) + return Py_BuildException(); + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + if (!pWin->IsType(UI::CSlotWindow::Type())) + return Py_BuildException(); + + UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin; + pSlotWin->UnlockSlot(iSlotIndex); + return Py_BuildNone(); +} + +PyObject * wndBarSetColor(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + int iColor; + if (!PyTuple_GetInteger(poArgs, 1, &iColor)) + return Py_BuildException(); + + if (pWindow->IsType(UI::CBar3D::Type())) + { + int iLeftColor = iColor; + + int iRightColor; + if (!PyTuple_GetInteger(poArgs, 2, &iRightColor)) + return Py_BuildException(); + int iCenterColor; + if (!PyTuple_GetInteger(poArgs, 3, &iCenterColor)) + return Py_BuildException(); + + ((UI::CBar3D *)pWindow)->SetColor(iLeftColor, iRightColor, iCenterColor); + } + else + { + ((UI::CWindow *)pWindow)->SetColor(iColor); + } + return Py_BuildNone(); +} + +PyObject * wndMgrAttachIcon(PyObject * poSelf, PyObject * poArgs) +{ + int iType; + if (!PyTuple_GetInteger(poArgs, 0, &iType)) + return Py_BuildException(); + int iIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iIndex)) + return Py_BuildException(); + int iSlotNumber; + if (!PyTuple_GetInteger(poArgs, 2, &iSlotNumber)) + return Py_BuildException(); + int iWidth; + if (!PyTuple_GetInteger(poArgs, 3, &iWidth)) + return Py_BuildException(); + int iHeight; + if (!PyTuple_GetInteger(poArgs, 4, &iHeight)) + return Py_BuildException(); + + UI::CWindowManager::Instance().AttachIcon(iType, iIndex, iSlotNumber, iWidth, iHeight); + return Py_BuildNone(); +} + +PyObject * wndMgrDeattachIcon(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindowManager::Instance().DeattachIcon(); + return Py_BuildNone(); +} + +PyObject * wndMgrSetAttachingFlag(PyObject * poSelf, PyObject * poArgs) +{ + BOOL bFlag; + if (!PyTuple_GetInteger(poArgs, 0, &bFlag)) + return Py_BuildException(); + + UI::CWindowManager::Instance().SetAttachingFlag(bFlag); + return Py_BuildNone(); +} + +// Text +PyObject * wndTextSetMax(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + int iMax; + if (!PyTuple_GetInteger(poArgs, 1, &iMax)) + return Py_BuildException(); + + ((UI::CTextLine*)pWindow)->SetMax(iMax); + return Py_BuildNone(); +} +PyObject * wndTextSetHorizontalAlign(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + int iType; + if (!PyTuple_GetInteger(poArgs, 1, &iType)) + return Py_BuildException(); + + ((UI::CTextLine*)pWindow)->SetHorizontalAlign(iType); + return Py_BuildNone(); +} +PyObject * wndTextSetVerticalAlign(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + int iType; + if (!PyTuple_GetInteger(poArgs, 1, &iType)) + return Py_BuildException(); + + ((UI::CTextLine*)pWindow)->SetVerticalAlign(iType); + return Py_BuildNone(); +} +PyObject * wndTextSetSecret(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + int iFlag; + if (!PyTuple_GetInteger(poArgs, 1, &iFlag)) + return Py_BuildException(); + + ((UI::CTextLine*)pWindow)->SetSecret(iFlag); + return Py_BuildNone(); +} +PyObject * wndTextSetOutline(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + int iFlag; + if (!PyTuple_GetInteger(poArgs, 1, &iFlag)) + return Py_BuildException(); + + ((UI::CTextLine*)pWindow)->SetOutline(iFlag); + return Py_BuildNone(); +} +PyObject * wndTextSetFeather(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + int iFlag; + if (!PyTuple_GetInteger(poArgs, 1, &iFlag)) + return Py_BuildException(); + + ((UI::CTextLine*)pWindow)->SetFeather(iFlag); + return Py_BuildNone(); +} +PyObject * wndTextSetMultiLine(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + int iFlag; + if (!PyTuple_GetInteger(poArgs, 1, &iFlag)) + return Py_BuildException(); + + ((UI::CTextLine*)pWindow)->SetMultiLine(iFlag); + return Py_BuildNone(); +} +PyObject * wndTextSetFontName(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + char * szFontName; + if (!PyTuple_GetString(poArgs, 1, &szFontName)) + return Py_BuildException(); + + ((UI::CTextLine*)pWindow)->SetFontName(szFontName); + return Py_BuildNone(); +} +PyObject * wndTextSetFontColor(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + if (2 == PyTuple_Size(poArgs)) + { + int iColor; + if (!PyTuple_GetInteger(poArgs, 1, &iColor)) + return Py_BuildException(); + ((UI::CTextLine*)pWindow)->SetFontColor(iColor); + } + else if (4 == PyTuple_Size(poArgs)) + { + float fr; + if (!PyTuple_GetFloat(poArgs, 1, &fr)) + return Py_BuildException(); + float fg; + if (!PyTuple_GetFloat(poArgs, 2, &fg)) + return Py_BuildException(); + float fb; + if (!PyTuple_GetFloat(poArgs, 3, &fb)) + return Py_BuildException(); + float fa = 1.0f; + + BYTE argb[4] = + { + (BYTE) (255.0f * fb), + (BYTE) (255.0f * fg), + (BYTE) (255.0f * fr), + (BYTE) (255.0f * fa) + }; + ((UI::CTextLine*)pWindow)->SetFontColor(*((DWORD *) argb)); + } + else + { + return Py_BuildException(); + } + + return Py_BuildNone(); +} +PyObject * wndTextSetLimitWidth(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + float fWidth; + if (!PyTuple_GetFloat(poArgs, 1, &fWidth)) + return Py_BuildException(); + + ((UI::CTextLine*)pWindow)->SetLimitWidth(fWidth); + return Py_BuildNone(); +} +PyObject * wndTextSetText(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + char * szText; + if (!PyTuple_GetString(poArgs, 1, &szText)) + return Py_BuildException(); + + ((UI::CTextLine*)pWindow)->SetText(szText); + return Py_BuildNone(); +} +PyObject * wndTextGetText(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + return Py_BuildValue("s", ((UI::CTextLine*)pWindow)->GetText()); +} + +PyObject * wndTextGetTextSize(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + int nWidth; + int nHeight; + + UI::CTextLine* pkTextLine=(UI::CTextLine*)pWindow; + pkTextLine->GetTextSize(&nWidth, &nHeight); + + return Py_BuildValue("(ii)", nWidth, nHeight); +} + + +PyObject * wndTextShowCursor(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + ((UI::CTextLine*)pWindow)->ShowCursor(); + return Py_BuildNone(); +} +PyObject * wndTextHideCursor(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + ((UI::CTextLine*)pWindow)->HideCursor(); + return Py_BuildNone(); +} +PyObject * wndTextGetCursorPosition(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + return Py_BuildValue("i", ((UI::CTextLine*)pWindow)->GetCursorPosition()); +} + +PyObject * wndNumberSetNumber(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + char * szNumber; + if (!PyTuple_GetString(poArgs, 1, &szNumber)) + return Py_BuildException(); + + ((UI::CNumberLine*)pWindow)->SetNumber(szNumber); + + return Py_BuildNone(); +} + +PyObject * wndNumberSetNumberHorizontalAlignCenter(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + ((UI::CNumberLine*)pWindow)->SetHorizontalAlign(UI::CWindow::HORIZONTAL_ALIGN_CENTER); + + return Py_BuildNone(); +} + +PyObject * wndNumberSetNumberHorizontalAlignRight(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + ((UI::CNumberLine*)pWindow)->SetHorizontalAlign(UI::CWindow::HORIZONTAL_ALIGN_RIGHT); + + return Py_BuildNone(); +} + +PyObject * wndNumberSetPath(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + char * szPath; + if (!PyTuple_GetString(poArgs, 1, &szPath)) + return Py_BuildException(); + + ((UI::CNumberLine*)pWindow)->SetPath(szPath); + + return Py_BuildNone(); +} + +PyObject * wndMarkBox_SetImageFilename(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + char * szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BuildException(); + + ((UI::CMarkBox*)pWindow)->LoadImage(szFileName); + return Py_BuildNone(); +} + +PyObject * wndMarkBox_SetImage(PyObject * poSelf, PyObject * poArgs) +{ + // 아무것도 하지 않음 + return Py_BuildNone(); +} + +PyObject * wndMarkBox_Load(PyObject * poSelf, PyObject * poArgs) +{ + // 아무것도 하지 않음 + return Py_BuildNone(); +} + +PyObject * wndMarkBox_SetIndex(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + int nIndex; + if (!PyTuple_GetInteger(poArgs, 1, &nIndex)) + return Py_BuildException(); + + ((UI::CMarkBox*)pWindow)->SetIndex(nIndex); + return Py_BuildNone(); +} + +PyObject * wndMarkBox_SetScale(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + float fScale; + if (!PyTuple_GetFloat(poArgs, 1, &fScale)) + return Py_BuildException(); + + ((UI::CMarkBox*)pWindow)->SetScale(fScale); + return Py_BuildNone(); +} + + +PyObject * wndMarkBox_SetDiffuseColor(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + float fr; + if (!PyTuple_GetFloat(poArgs, 1, &fr)) + return Py_BuildException(); + float fg; + if (!PyTuple_GetFloat(poArgs, 2, &fg)) + return Py_BuildException(); + float fb; + if (!PyTuple_GetFloat(poArgs, 3, &fb)) + return Py_BuildException(); + float fa; + if (!PyTuple_GetFloat(poArgs, 4, &fa)) + return Py_BuildException(); + + ((UI::CMarkBox*)pWindow)->SetDiffuseColor(fr, fg, fb, fa); + + return Py_BuildNone(); +} + + +PyObject * wndImageLoadImage(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + char * szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BuildException(); + + if (!((UI::CImageBox*)pWindow)->LoadImage(szFileName)) + return Py_BuildException("Failed to load image (filename: %s)", szFileName); + + return Py_BuildNone(); +} + +PyObject * wndImageSetDiffuseColor(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + float fr; + if (!PyTuple_GetFloat(poArgs, 1, &fr)) + return Py_BuildException(); + float fg; + if (!PyTuple_GetFloat(poArgs, 2, &fg)) + return Py_BuildException(); + float fb; + if (!PyTuple_GetFloat(poArgs, 3, &fb)) + return Py_BuildException(); + float fa; + if (!PyTuple_GetFloat(poArgs, 4, &fa)) + return Py_BuildException(); + + ((UI::CImageBox*)pWindow)->SetDiffuseColor(fr, fg, fb, fa); + + return Py_BuildNone(); +} + +PyObject * wndImageGetWidth(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + return Py_BuildValue("i", ((UI::CImageBox*)pWindow)->GetWidth()); +} + +PyObject * wndImageGetHeight(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + return Py_BuildValue("i", ((UI::CImageBox*)pWindow)->GetHeight()); +} + +PyObject * wndImageSetScale(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + float fx; + if (!PyTuple_GetFloat(poArgs, 1, &fx)) + return Py_BuildException(); + float fy; + if (!PyTuple_GetFloat(poArgs, 2, &fy)) + return Py_BuildException(); + + ((UI::CExpandedImageBox*)pWindow)->SetScale(fx, fy); + + return Py_BuildNone(); +} +PyObject * wndImageSetOrigin(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + float fx; + if (!PyTuple_GetFloat(poArgs, 1, &fx)) + return Py_BuildException(); + float fy; + if (!PyTuple_GetFloat(poArgs, 2, &fy)) + return Py_BuildException(); + + ((UI::CExpandedImageBox*)pWindow)->SetOrigin(fx, fy); + + return Py_BuildNone(); +} +PyObject * wndImageSetRotation(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + float fRotation; + if (!PyTuple_GetFloat(poArgs, 1, &fRotation)) + return Py_BuildException(); + + ((UI::CExpandedImageBox*)pWindow)->SetRotation(fRotation); + + return Py_BuildNone(); +} +PyObject * wndImageSetRenderingRect(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + float fLeft; + if (!PyTuple_GetFloat(poArgs, 1, &fLeft)) + return Py_BuildException(); + float fTop; + if (!PyTuple_GetFloat(poArgs, 2, &fTop)) + return Py_BuildException(); + float fRight; + if (!PyTuple_GetFloat(poArgs, 3, &fRight)) + return Py_BuildException(); + float fBottom; + if (!PyTuple_GetFloat(poArgs, 4, &fBottom)) + return Py_BuildException(); + + if (pWindow->IsType(UI::CExpandedImageBox::Type())) + ((UI::CExpandedImageBox*)pWindow)->SetRenderingRect(fLeft, fTop, fRight, fBottom); + else if (pWindow->IsType(UI::CAniImageBox::Type())) + ((UI::CAniImageBox*)pWindow)->SetRenderingRect(fLeft, fTop, fRight, fBottom); + + return Py_BuildNone(); +} +PyObject * wndImageSetRenderingMode(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + int iMode; + if (!PyTuple_GetInteger(poArgs, 1, &iMode)) + return Py_BuildException(); + + if (pWindow->IsType(UI::CExpandedImageBox::Type())) + ((UI::CExpandedImageBox*)pWindow)->SetRenderingMode(iMode); + + return Py_BuildNone(); +} +PyObject * wndImageSetDelay(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + float fDelay; + if (!PyTuple_GetFloat(poArgs, 1, &fDelay)) + return Py_BuildException(); + + ((UI::CAniImageBox*)pWindow)->SetDelay(fDelay); + + return Py_BuildNone(); +} +PyObject * wndImageAppendImage(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + char * szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BuildException(); + + ((UI::CAniImageBox*)pWindow)->AppendImage(szFileName); + + return Py_BuildNone(); +} + +PyObject * wndButtonSetUpVisual(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + char * szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BuildException(); + + ((UI::CButton*)pWindow)->SetUpVisual(szFileName); + + return Py_BuildNone(); +} +PyObject * wndButtonSetOverVisual(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + char * szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BuildException(); + + ((UI::CButton*)pWindow)->SetOverVisual(szFileName); + + return Py_BuildNone(); +} +PyObject * wndButtonSetDownVisual(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + char * szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BuildException(); + + ((UI::CButton*)pWindow)->SetDownVisual(szFileName); + + return Py_BuildNone(); +} +PyObject * wndButtonSetDisableVisual(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + char * szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BuildException(); + + ((UI::CButton*)pWindow)->SetDisableVisual(szFileName); + + return Py_BuildNone(); +} +PyObject * wndButtonGetUpVisualFileName(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + return Py_BuildValue("s", ((UI::CButton*)pWindow)->GetUpVisualFileName()); +} +PyObject * wndButtonGetOverVisualFileName(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + return Py_BuildValue("s", ((UI::CButton*)pWindow)->GetOverVisualFileName()); +} +PyObject * wndButtonGetDownVisualFileName(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + return Py_BuildValue("s", ((UI::CButton*)pWindow)->GetDownVisualFileName()); +} +PyObject * wndButtonFlash(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + ((UI::CButton*)pWindow)->Flash(); + + return Py_BuildNone(); +} +PyObject * wndButtonEnable(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + ((UI::CButton*)pWindow)->Enable(); + + return Py_BuildNone(); +} +PyObject * wndButtonDisable(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + ((UI::CButton*)pWindow)->Disable(); + + return Py_BuildNone(); +} +PyObject * wndButtonDown(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + ((UI::CButton*)pWindow)->Down(); + + return Py_BuildNone(); +} +PyObject * wndButtonSetUp(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + ((UI::CButton*)pWindow)->SetUp(); + + return Py_BuildNone(); +} +PyObject * wndButtonSetRestrictMovementArea(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + int ix; + if (!PyTuple_GetInteger(poArgs, 1, &ix)) + return Py_BuildException(); + int iy; + if (!PyTuple_GetInteger(poArgs, 2, &iy)) + return Py_BuildException(); + int iwidth; + if (!PyTuple_GetInteger(poArgs, 3, &iwidth)) + return Py_BuildException(); + int iheight; + if (!PyTuple_GetInteger(poArgs, 4, &iheight)) + return Py_BuildException(); + + ((UI::CDragButton*)pWindow)->SetRestrictMovementArea(ix, iy, iwidth, iheight); + + return Py_BuildNone(); +} + +PyObject * wndButtonIsDown(PyObject * poSelf, PyObject * poArgs) +{ + UI::CWindow * pWindow; + if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) + return Py_BuildException(); + + return Py_BuildValue("i", ((UI::CButton*)pWindow)->IsPressed()); +} + +extern BOOL g_bOutlineBoxEnable; +extern BOOL g_bShowOverInWindowName; + +PyObject * wndMgrSetOutlineFlag(PyObject * poSelf, PyObject * poArgs) +{ + int iFlag; + if (!PyTuple_GetInteger(poArgs, 0, &iFlag)) + return Py_BuildException(); + + g_bOutlineBoxEnable = iFlag; + + return Py_BuildNone(); +} + +PyObject * wndMgrShowOverInWindowName(PyObject * poSelf, PyObject * poArgs) +{ + int iFlag; + if (!PyTuple_GetInteger(poArgs, 0, &iFlag)) + return Py_BuildException(); + + g_bShowOverInWindowName = iFlag; + + return Py_BuildNone(); +} + +void initwndMgr() +{ + static PyMethodDef s_methods[] = + { + // WindowManager + { "SetMouseHandler", wndMgrSetMouseHandler, METH_VARARGS }, + { "SetScreenSize", wndMgrSetScreenSize, METH_VARARGS }, + { "GetScreenWidth", wndMgrGetScreenWidth, METH_VARARGS }, + { "GetScreenHeight", wndMgrGetScreenHeight, METH_VARARGS }, + { "AttachIcon", wndMgrAttachIcon, METH_VARARGS }, + { "DeattachIcon", wndMgrDeattachIcon, METH_VARARGS }, + { "SetAttachingFlag", wndMgrSetAttachingFlag, METH_VARARGS }, + { "GetAspect", wndMgrGetAspect, METH_VARARGS }, + { "GetHyperlink", wndMgrGetHyperlink, METH_VARARGS }, + { "OnceIgnoreMouseLeftButtonUpEvent", wndMgrOnceIgnoreMouseLeftButtonUpEvent, METH_VARARGS }, + + // Window + { "Register", wndMgrRegister, METH_VARARGS }, + { "RegisterSlotWindow", wndMgrRegisterSlotWindow, METH_VARARGS }, + { "RegisterGridSlotWindow", wndMgrRegisterGridSlotWindow, METH_VARARGS }, + { "RegisterTextLine", wndMgrRegisterTextLine, METH_VARARGS }, + { "RegisterMarkBox", wndMgrRegisterMarkBox, METH_VARARGS }, + { "RegisterImageBox", wndMgrRegisterImageBox, METH_VARARGS }, + { "RegisterExpandedImageBox", wndMgrRegisterExpandedImageBox, METH_VARARGS }, + { "RegisterAniImageBox", wndMgrRegisterAniImageBox, METH_VARARGS }, + { "RegisterButton", wndMgrRegisterButton, METH_VARARGS }, + { "RegisterRadioButton", wndMgrRegisterRadioButton, METH_VARARGS }, + { "RegisterToggleButton", wndMgrRegisterToggleButton, METH_VARARGS }, + { "RegisterDragButton", wndMgrRegisterDragButton, METH_VARARGS }, + { "RegisterBox", wndMgrRegisterBox, METH_VARARGS }, + { "RegisterBar", wndMgrRegisterBar, METH_VARARGS }, + { "RegisterLine", wndMgrRegisterLine, METH_VARARGS }, + { "RegisterBar3D", wndMgrRegisterBar3D, METH_VARARGS }, + { "RegisterNumberLine", wndMgrRegisterNumberLine, METH_VARARGS }, + { "Destroy", wndMgrDestroy, METH_VARARGS }, + { "AddFlag", wndMgrAddFlag, METH_VARARGS }, + { "IsRTL", wndMgrIsRTL, METH_VARARGS }, + + // Base Window + { "SetName", wndMgrSetName, METH_VARARGS }, + { "GetName", wndMgrGetName, METH_VARARGS }, + + { "SetTop", wndMgrSetTop, METH_VARARGS }, + { "Show", wndMgrShow, METH_VARARGS }, + { "Hide", wndMgrHide, METH_VARARGS }, + { "IsShow", wndMgrIsShow, METH_VARARGS }, + { "SetParent", wndMgrSetParent, METH_VARARGS }, + { "SetPickAlways", wndMgrSetPickAlways, METH_VARARGS }, + + { "IsFocus", wndMgrIsFocus, METH_VARARGS }, + { "SetFocus", wndMgrSetFocus, METH_VARARGS }, + { "KillFocus", wndMgrKillFocus, METH_VARARGS }, + { "Lock", wndMgrLock, METH_VARARGS }, + { "Unlock", wndMgrUnlock, METH_VARARGS }, + + { "SetWindowSize", wndMgrSetWndSize, METH_VARARGS }, + { "SetWindowPosition", wndMgrSetWndPosition, METH_VARARGS }, + { "GetWindowWidth", wndMgrGetWndWidth, METH_VARARGS }, + { "GetWindowHeight", wndMgrGetWndHeight, METH_VARARGS }, + { "GetWindowLocalPosition", wndMgrGetWndLocalPosition, METH_VARARGS }, + { "GetWindowGlobalPosition", wndMgrGetWndGlobalPosition, METH_VARARGS }, + { "GetWindowRect", wndMgrGetWindowRect, METH_VARARGS }, + { "SetWindowHorizontalAlign", wndMgrSetWindowHorizontalAlign, METH_VARARGS }, + { "SetWindowVerticalAlign", wndMgrSetWindowVerticalAlign, METH_VARARGS }, + + { "GetChildCount", wndMgrGetChildCount, METH_VARARGS }, + + { "IsPickedWindow", wndMgrIsPickedWindow, METH_VARARGS }, + { "IsIn", wndMgrIsIn, METH_VARARGS }, + { "GetMouseLocalPosition", wndMgrGetMouseLocalPosition, METH_VARARGS }, + { "GetMousePosition", wndMgrGetMousePosition, METH_VARARGS }, + { "IsDragging", wndMgrIsDragging, METH_VARARGS }, + + { "SetLimitBias", wndMgrSetLimitBias, METH_VARARGS }, + + { "UpdateRect", wndMgrUpdateRect, METH_VARARGS }, + + // Slot Window + { "AppendSlot", wndMgrAppendSlot, METH_VARARGS }, + { "ArrangeSlot", wndMgrArrangeSlot, METH_VARARGS }, + { "ClearSlot", wndMgrClearSlot, METH_VARARGS }, + { "ClearAllSlot", wndMgrClearAllSlot, METH_VARARGS }, + { "HasSlot", wndMgrHasSlot, METH_VARARGS }, + { "SetSlot", wndMgrSetSlot, METH_VARARGS }, + { "SetSlotCount", wndMgrSetSlotCount, METH_VARARGS }, + { "SetSlotCountNew", wndMgrSetSlotCountNew, METH_VARARGS }, + { "SetSlotCoolTime", wndMgrSetSlotCoolTime, METH_VARARGS }, + { "SetToggleSlot", wndMgrSetToggleSlot, METH_VARARGS }, + { "ActivateSlot", wndMgrActivateSlot, METH_VARARGS }, + { "DeactivateSlot", wndMgrDeactivateSlot, METH_VARARGS }, + { "EnableSlot", wndMgrEnableSlot, METH_VARARGS }, + { "DisableSlot", wndMgrDisableSlot, METH_VARARGS }, + { "ShowSlotBaseImage", wndMgrShowSlotBaseImage, METH_VARARGS }, + { "HideSlotBaseImage", wndMgrHideSlotBaseImage, METH_VARARGS }, + { "SetSlotType", wndMgrSetSlotType, METH_VARARGS }, + { "SetSlotStyle", wndMgrSetSlotStyle, METH_VARARGS }, + { "SetSlotBaseImage", wndMgrSetSlotBaseImage, METH_VARARGS }, + + { "SetCoverButton", wndMgrSetCoverButton, METH_VARARGS }, + { "EnableCoverButton", wndMgrEnableCoverButton, METH_VARARGS }, + { "DisableCoverButton", wndMgrDisableCoverButton, METH_VARARGS }, + { "IsDisableCoverButton", wndMgrIsDisableCoverButton, METH_VARARGS }, + { "SetAlwaysRenderCoverButton", wndMgrSetAlwaysRenderCoverButton, METH_VARARGS }, + + { "AppendSlotButton", wndMgrAppendSlotButton, METH_VARARGS }, + { "AppendRequirementSignImage", wndMgrAppendRequirementSignImage, METH_VARARGS }, + { "ShowSlotButton", wndMgrShowSlotButton, METH_VARARGS }, + { "HideAllSlotButton", wndMgrHideAllSlotButton, METH_VARARGS }, + { "ShowRequirementSign", wndMgrShowRequirementSign, METH_VARARGS }, + { "HideRequirementSign", wndMgrHideRequirementSign, METH_VARARGS }, + { "RefreshSlot", wndMgrRefreshSlot, METH_VARARGS }, + { "SetUseMode", wndMgrSetUseMode, METH_VARARGS }, + { "SetUsableItem", wndMgrSetUsableItem, METH_VARARGS }, + + { "SelectSlot", wndMgrSelectSlot, METH_VARARGS }, + { "ClearSelected", wndMgrClearSelected, METH_VARARGS }, + { "GetSelectedSlotCount", wndMgrGetSelectedSlotCount, METH_VARARGS }, + { "GetSelectedSlotNumber", wndMgrGetSelectedSlotNumber, METH_VARARGS }, + { "IsSelectedSlot", wndMgrIsSelectedSlot, METH_VARARGS }, + { "GetSlotCount", wndMgrGetSlotCount, METH_VARARGS }, + { "LockSlot", wndMgrLockSlot, METH_VARARGS }, + { "UnlockSlot", wndMgrUnlockSlot, METH_VARARGS }, + + // Bar + { "SetColor", wndBarSetColor, METH_VARARGS }, + + // TextLine + { "SetMax", wndTextSetMax, METH_VARARGS }, + { "SetHorizontalAlign", wndTextSetHorizontalAlign, METH_VARARGS }, + { "SetVerticalAlign", wndTextSetVerticalAlign, METH_VARARGS }, + { "SetSecret", wndTextSetSecret, METH_VARARGS }, + { "SetOutline", wndTextSetOutline, METH_VARARGS }, + { "SetFeather", wndTextSetFeather, METH_VARARGS }, + { "SetMultiLine", wndTextSetMultiLine, METH_VARARGS }, + { "SetText", wndTextSetText, METH_VARARGS }, + { "SetFontName", wndTextSetFontName, METH_VARARGS }, + { "SetFontColor", wndTextSetFontColor, METH_VARARGS }, + { "SetLimitWidth", wndTextSetLimitWidth, METH_VARARGS }, + { "GetText", wndTextGetText, METH_VARARGS }, + { "GetTextSize", wndTextGetTextSize, METH_VARARGS }, + { "ShowCursor", wndTextShowCursor, METH_VARARGS }, + { "HideCursor", wndTextHideCursor, METH_VARARGS }, + { "GetCursorPosition", wndTextGetCursorPosition, METH_VARARGS }, + // NumberLine + { "SetNumber", wndNumberSetNumber, METH_VARARGS }, + { "SetNumberHorizontalAlignCenter", wndNumberSetNumberHorizontalAlignCenter, METH_VARARGS }, + { "SetNumberHorizontalAlignRight", wndNumberSetNumberHorizontalAlignRight, METH_VARARGS }, + { "SetPath", wndNumberSetPath, METH_VARARGS }, + + // ImageBox + { "MarkBox_SetImage", wndMarkBox_SetImage, METH_VARARGS }, + { "MarkBox_SetImageFilename", wndMarkBox_SetImageFilename, METH_VARARGS }, + { "MarkBox_Load", wndMarkBox_Load, METH_VARARGS }, + { "MarkBox_SetIndex", wndMarkBox_SetIndex, METH_VARARGS }, + { "MarkBox_SetScale", wndMarkBox_SetScale, METH_VARARGS }, + { "MarkBox_SetDiffuseColor", wndMarkBox_SetDiffuseColor, METH_VARARGS }, + + // ImageBox + { "LoadImage", wndImageLoadImage, METH_VARARGS }, + { "SetDiffuseColor", wndImageSetDiffuseColor, METH_VARARGS }, + { "GetWidth", wndImageGetWidth, METH_VARARGS }, + { "GetHeight", wndImageGetHeight, METH_VARARGS }, + // ExpandedImageBox + { "SetScale", wndImageSetScale, METH_VARARGS }, + { "SetOrigin", wndImageSetOrigin, METH_VARARGS }, + { "SetRotation", wndImageSetRotation, METH_VARARGS }, + { "SetRenderingRect", wndImageSetRenderingRect, METH_VARARGS }, + { "SetRenderingMode", wndImageSetRenderingMode, METH_VARARGS }, + // AniImageBox + { "SetDelay", wndImageSetDelay, METH_VARARGS }, + { "AppendImage", wndImageAppendImage, METH_VARARGS }, + + // Button + { "SetUpVisual", wndButtonSetUpVisual, METH_VARARGS }, + { "SetOverVisual", wndButtonSetOverVisual, METH_VARARGS }, + { "SetDownVisual", wndButtonSetDownVisual, METH_VARARGS }, + { "SetDisableVisual", wndButtonSetDisableVisual, METH_VARARGS }, + { "GetUpVisualFileName", wndButtonGetUpVisualFileName, METH_VARARGS }, + { "GetOverVisualFileName", wndButtonGetOverVisualFileName, METH_VARARGS }, + { "GetDownVisualFileName", wndButtonGetDownVisualFileName, METH_VARARGS }, + { "Flash", wndButtonFlash, METH_VARARGS }, + { "Enable", wndButtonEnable, METH_VARARGS }, + { "Disable", wndButtonDisable, METH_VARARGS }, + { "Down", wndButtonDown, METH_VARARGS }, + { "SetUp", wndButtonSetUp, METH_VARARGS }, + { "IsDown", wndButtonIsDown, METH_VARARGS }, + + // DragButton + { "SetRestrictMovementArea", wndButtonSetRestrictMovementArea, METH_VARARGS }, + + // For Debug + { "SetOutlineFlag", wndMgrSetOutlineFlag, METH_VARARGS }, + { "ShowOverInWindowName", wndMgrShowOverInWindowName, METH_VARARGS }, + + { NULL, NULL, NULL }, + }; + + PyObject * poModule = Py_InitModule("wndMgr", s_methods); + +// 하나의 딕셔너리에 너무 많은 Function이 포함 되는 것 같아 이런식으로 딕셔너리를 나누는 것을 고려 중 - [levites] +// PyObject * poMgrModule = Py_InitModule("wndMgr", s_methods); +// PyObject * poTextModule = Py_InitModule("wndText", s_methods); +// PyObject * poSlotModule = Py_InitModule("wndSlot", s_methods); + + PyModule_AddIntConstant(poModule, "SLOT_STYLE_NONE", UI::SLOT_STYLE_NONE); + PyModule_AddIntConstant(poModule, "SLOT_STYLE_PICK_UP", UI::SLOT_STYLE_PICK_UP); + PyModule_AddIntConstant(poModule, "SLOT_STYLE_SELECT", UI::SLOT_STYLE_SELECT); + + PyModule_AddIntConstant(poModule, "TEXT_HORIZONTAL_ALIGN_LEFT", CGraphicTextInstance::HORIZONTAL_ALIGN_LEFT); + PyModule_AddIntConstant(poModule, "TEXT_HORIZONTAL_ALIGN_RIGHT", CGraphicTextInstance::HORIZONTAL_ALIGN_RIGHT); + PyModule_AddIntConstant(poModule, "TEXT_HORIZONTAL_ALIGN_CENTER", CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER); + PyModule_AddIntConstant(poModule, "TEXT_VERTICAL_ALIGN_TOP", CGraphicTextInstance::VERTICAL_ALIGN_TOP); + PyModule_AddIntConstant(poModule, "TEXT_VERTICAL_ALIGN_BOTTOM", CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM); + PyModule_AddIntConstant(poModule, "TEXT_VERTICAL_ALIGN_CENTER", CGraphicTextInstance::VERTICAL_ALIGN_CENTER); + + PyModule_AddIntConstant(poModule, "HORIZONTAL_ALIGN_LEFT", UI::CWindow::HORIZONTAL_ALIGN_LEFT); + PyModule_AddIntConstant(poModule, "HORIZONTAL_ALIGN_CENTER", UI::CWindow::HORIZONTAL_ALIGN_CENTER); + PyModule_AddIntConstant(poModule, "HORIZONTAL_ALIGN_RIGHT", UI::CWindow::HORIZONTAL_ALIGN_RIGHT); + PyModule_AddIntConstant(poModule, "VERTICAL_ALIGN_TOP", UI::CWindow::VERTICAL_ALIGN_TOP); + PyModule_AddIntConstant(poModule, "VERTICAL_ALIGN_CENTER", UI::CWindow::VERTICAL_ALIGN_CENTER); + PyModule_AddIntConstant(poModule, "VERTICAL_ALIGN_BOTTOM", UI::CWindow::VERTICAL_ALIGN_BOTTOM); + + PyModule_AddIntConstant(poModule, "RENDERING_MODE_MODULATE", CGraphicExpandedImageInstance::RENDERING_MODE_MODULATE); +} diff --git a/extension/src/port/ScriptLib/PythonDebugModule.cpp b/extension/src/port/ScriptLib/PythonDebugModule.cpp new file mode 100644 index 00000000..710981ee --- /dev/null +++ b/extension/src/port/ScriptLib/PythonDebugModule.cpp @@ -0,0 +1,77 @@ +#include "StdAfx.h" + +extern IPythonExceptionSender * g_pkExceptionSender; + +PyObject* dbgLogBox(PyObject* poSelf, PyObject* poArgs) +{ + char* szMsg; + char* szCaption; + if (!PyTuple_GetString(poArgs, 0, &szMsg)) + return Py_BuildException(); + if (!PyTuple_GetString(poArgs, 1, &szCaption)) + { + LogBox(szMsg); + } + else + { + LogBox(szMsg,szCaption); + } + return Py_BuildNone(); +} + +PyObject* dbgTrace(PyObject* poSelf, PyObject* poArgs) +{ + char* szMsg; + if (!PyTuple_GetString(poArgs, 0, &szMsg)) + return Py_BuildException(); + + Trace(szMsg); + return Py_BuildNone(); +} + +PyObject* dbgTracen(PyObject* poSelf, PyObject* poArgs) +{ + char* szMsg; + if (!PyTuple_GetString(poArgs, 0, &szMsg)) + return Py_BuildException(); + + Tracen(szMsg); + return Py_BuildNone(); +} + +PyObject* dbgTraceError(PyObject* poSelf, PyObject* poArgs) +{ + char* szMsg; + if (!PyTuple_GetString(poArgs, 0, &szMsg)) + return Py_BuildException(); + + TraceError( "%s", szMsg ); + return Py_BuildNone(); +} + +PyObject* dbgRegisterExceptionString(PyObject* poSelf, PyObject* poArgs) +{ + char* szMsg; + if (!PyTuple_GetString(poArgs, 0, &szMsg)) + return Py_BuildException(); + + if (g_pkExceptionSender) + g_pkExceptionSender->RegisterExceptionString(szMsg); + + return Py_BuildNone(); +} + +void initdbg() +{ + static PyMethodDef s_methods[] = + { + { "LogBox", dbgLogBox, METH_VARARGS }, + { "Trace", dbgTrace, METH_VARARGS }, + { "Tracen", dbgTracen, METH_VARARGS }, + { "TraceError", dbgTraceError, METH_VARARGS }, + { "RegisterExceptionString", dbgRegisterExceptionString, METH_VARARGS }, + { NULL, NULL}, + }; + + Py_InitModule("dbg", s_methods); +} \ No newline at end of file diff --git a/extension/src/port/UserInterface/AbstractApplication.h b/extension/src/port/UserInterface/AbstractApplication.h new file mode 100644 index 00000000..004d59c4 --- /dev/null +++ b/extension/src/port/UserInterface/AbstractApplication.h @@ -0,0 +1,56 @@ +#pragma once + +#include "AbstractSingleton.h" + +class IAbstractApplication : public TAbstractSingleton +{ + public: + struct SCameraPos + { + float m_fUpDir; + float m_fViewDir; + float m_fCrossDir; + + SCameraPos() : m_fUpDir(0.0f), m_fViewDir(0.0f), m_fCrossDir(0.0f) {} + }; + + struct SCameraSetting + { + D3DXVECTOR3 v3CenterPosition; + SCameraPos kCmrPos; + float fRotation; + float fPitch; + float fZoom; + + SCameraSetting() : v3CenterPosition(0.0f, 0.0f, 0.0f), + fRotation(0.0f), + fPitch(0.0f), + fZoom(0.0f) {} + }; + + public: + IAbstractApplication() {} + virtual ~IAbstractApplication() {} + + virtual void GetMousePosition(POINT* ppt) = 0; + virtual float GetGlobalTime() = 0; + virtual float GetGlobalElapsedTime() = 0; + + virtual void SkipRenderBuffering(DWORD dwSleepMSec) = 0; + virtual void SetServerTime(time_t tTime) = 0; + virtual void SetCenterPosition(float fx, float fy, float fz) = 0; + + virtual void SetEventCamera(const SCameraSetting & c_rCameraSetting) = 0; + virtual void BlendEventCamera(const SCameraSetting & c_rCameraSetting, float fBlendTime) = 0; + virtual void SetDefaultCamera() = 0; + + virtual void RunIMEUpdate() = 0; + virtual void RunIMETabEvent() = 0; + virtual void RunIMEReturnEvent() = 0; + + virtual void RunIMEChangeCodePage() = 0; + virtual void RunIMEOpenCandidateListEvent() = 0; + virtual void RunIMECloseCandidateListEvent() = 0; + virtual void RunIMEOpenReadingWndEvent() = 0; + virtual void RunIMECloseReadingWndEvent() = 0; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/AbstractCharacterManager.h b/extension/src/port/UserInterface/AbstractCharacterManager.h new file mode 100644 index 00000000..68d4f77a --- /dev/null +++ b/extension/src/port/UserInterface/AbstractCharacterManager.h @@ -0,0 +1,15 @@ +#pragma once + +#include "AbstractSingleton.h" + +class CInstanceBase; + +class IAbstractCharacterManager : public TAbstractSingleton +{ + public: + IAbstractCharacterManager() {} + virtual ~IAbstractCharacterManager() {} + + virtual void Destroy() = 0; + virtual CInstanceBase * GetInstancePtr(DWORD dwVID) = 0; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/AbstractChat.h b/extension/src/port/UserInterface/AbstractChat.h new file mode 100644 index 00000000..809eedc6 --- /dev/null +++ b/extension/src/port/UserInterface/AbstractChat.h @@ -0,0 +1,12 @@ +#pragma once + +#include "AbstractSingleton.h" + +class IAbstractChat : public TAbstractSingleton +{ + public: + IAbstractChat() {} + virtual ~IAbstractChat() {} + + virtual void AppendChat(int iType, const char * c_szChat) = 0; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/AbstractPlayer.h b/extension/src/port/UserInterface/AbstractPlayer.h new file mode 100644 index 00000000..bbfa6e9e --- /dev/null +++ b/extension/src/port/UserInterface/AbstractPlayer.h @@ -0,0 +1,65 @@ +#pragma once + +#include "AbstractSingleton.h" + +class CInstanceBase; + +class IAbstractPlayer : public TAbstractSingleton +{ + public: + IAbstractPlayer() {} + virtual ~IAbstractPlayer() {} + + virtual DWORD GetMainCharacterIndex() = 0; + virtual void SetMainCharacterIndex(int iIndex) = 0; + virtual bool IsMainCharacterIndex(DWORD dwIndex) = 0; + + virtual int GetStatus(DWORD dwType) = 0; + + virtual const char * GetName() = 0; + + virtual void SetRace(DWORD dwRace) = 0; + + virtual void StartStaminaConsume(DWORD dwConsumePerSec, DWORD dwCurrentStamina) = 0; + virtual void StopStaminaConsume(DWORD dwCurrentStamina) = 0; + + virtual bool IsPartyMemberByVID(DWORD dwVID) = 0; + virtual bool PartyMemberVIDToPID(DWORD dwVID, DWORD * pdwPID) = 0; + virtual bool IsSamePartyMember(DWORD dwVID1, DWORD dwVID2) = 0; + + virtual void SetItemData(TItemPos itemPos, const TItemData & c_rkItemInst) = 0; + virtual void SetItemCount(TItemPos itemPos, BYTE byCount) = 0; + virtual void SetItemMetinSocket(TItemPos itemPos, DWORD dwMetinSocketIndex, DWORD dwMetinNumber) = 0; + virtual void SetItemAttribute(TItemPos itemPos, DWORD dwAttrIndex, BYTE byType, short sValue) = 0; +#if defined(GAIDEN) + virtual void SetItemUnbindTime(DWORD dwItemSlotIndex, DWORD dwUnbindSecondsLeft) = 0; +#endif + + virtual DWORD GetItemIndex(TItemPos itemPos) = 0; + virtual DWORD GetItemFlags(TItemPos itemPos) = 0; + virtual DWORD GetItemCount(TItemPos itemPos) = 0; + + virtual bool IsEquipItemInSlot(TItemPos itemPos) = 0; + + virtual void AddQuickSlot(int QuickslotIndex, char IconType, char IconPosition) = 0; + virtual void DeleteQuickSlot(int QuickslotIndex) = 0; + virtual void MoveQuickSlot(int Source, int Target) = 0; + + virtual void SetWeaponPower(DWORD dwMinPower, DWORD dwMaxPower, DWORD dwMinMagicPower, DWORD dwMaxMagicPower, DWORD dwAddPower) = 0; + + virtual void SetTarget(DWORD dwVID, BOOL bForceChange = TRUE) = 0; + virtual void NotifyCharacterUpdate(DWORD dwVID) = 0; + virtual void NotifyCharacterDead(DWORD dwVID) = 0; + virtual void NotifyDeletingCharacterInstance(DWORD dwVID) = 0; + virtual void NotifyChangePKMode() = 0; + + virtual void SetObserverMode(bool isEnable) = 0; + virtual void SetMobileFlag(BOOL bFlag) = 0; + virtual void SetComboSkillFlag(BOOL bFlag) = 0; + + virtual void StartEmotionProcess() = 0; + virtual void EndEmotionProcess() = 0; + + virtual CInstanceBase* NEW_GetMainActorPtr() = 0; +}; + diff --git a/extension/src/port/UserInterface/AbstractSingleton.h b/extension/src/port/UserInterface/AbstractSingleton.h new file mode 100644 index 00000000..e55cf6f1 --- /dev/null +++ b/extension/src/port/UserInterface/AbstractSingleton.h @@ -0,0 +1,29 @@ +#pragma once + +template +class TAbstractSingleton +{ + static T * ms_singleton; + +public: + TAbstractSingleton() + { + assert(!ms_singleton); + // PORT: preserve the derived-subobject adjustment without truncating pointers to Win32 int. + ms_singleton = static_cast(this); + } + + virtual ~TAbstractSingleton() + { + assert(ms_singleton); + ms_singleton = 0; + } + + __forceinline static T & GetSingleton() + { + assert(ms_singleton!=NULL); + return (*ms_singleton); + } +}; + +template T * TAbstractSingleton ::ms_singleton = 0; diff --git a/extension/src/port/UserInterface/AccountConnector.h b/extension/src/port/UserInterface/AccountConnector.h new file mode 100644 index 00000000..50d2c60a --- /dev/null +++ b/extension/src/port/UserInterface/AccountConnector.h @@ -0,0 +1,93 @@ +#pragma once // PORT: 40250's incomplete pragma was harmless under MSVC PCH, but this header is gated twice. + +#include "../EterLib/NetStream.h" +#include "../EterLib/FuncObject.h" + +class CAccountConnector : public CNetworkStream, public CSingleton +{ + public: + enum + { + STATE_OFFLINE, + STATE_HANDSHAKE, + STATE_AUTH, + }; + + public: + CAccountConnector(); + virtual ~CAccountConnector(); + + void SetHandler(PyObject* poHandler); + void SetLoginInfo(const char * c_szName, const char * c_szPwd); + void ClearLoginInfo( void ); + + bool SendChinaMatrixCardPacket(const char * c_szMatrixCardString); + bool SendRunupMatrixCardPacket(const char * c_szMatrixCardString); + bool SendNEWCIBNPasspodAnswerPacket(const char * answer); + + bool Connect(const char * c_szAddr, int iPort, const char * c_szAccountAddr, int iAccountPort); + void Disconnect(); + void Process(); + + protected: + void OnConnectFailure(); + void OnConnectSuccess(); + void OnRemoteDisconnect(); + void OnDisconnect(); + + protected: + void __Inialize(); + bool __StateProcess(); + + void __OfflineState_Set(); + void __HandshakeState_Set(); + void __AuthState_Set(); + + bool __HandshakeState_Process(); + bool __AuthState_Process(); + + bool __AuthState_RecvEmpty(); + bool __AuthState_RecvPhase(); + bool __AuthState_RecvHandshake(); + bool __AuthState_RecvPing(); + bool __AuthState_SendPong(); + bool __AuthState_RecvAuthSuccess(); +#ifdef USE_OPENID + bool __AuthState_RecvAuthSuccess_OpenID(); +#endif /* USE_OPENID */ + bool __AuthState_RecvAuthFailure(); + bool __AuthState_RecvChinaMatrixCard(); + bool __AuthState_RecvRunupMatrixQuiz(); + bool __AuthState_RecvNEWCIBNPasspodRequest(); + bool __AuthState_RecvPanamaPack(); +#ifdef _IMPROVED_PACKET_ENCRYPTION_ + bool __AuthState_RecvKeyAgreement(); + bool __AuthState_RecvKeyAgreementCompleted(); +#endif + bool __AuthState_RecvHybridCryptKeys(int VarSize); + bool __AuthState_RecvHybridCryptSDB(int VarSize); + + bool __AnalyzePacket(UINT uHeader, UINT uPacketSize, bool (CAccountConnector::*pfnDispatchPacket)()); + // TODO: 지금 현재는 임시다. header뒤에 size 4byte가 무조건 온다는 가정임. + // 제대로 하려면 Packet System Refactoring해야 한다. + bool __AnalyzeVarSizePacket(UINT uHeader, bool (CAccountConnector::*pfnDispatchPacket)(int)); + +#ifndef _IMPROVED_PACKET_ENCRYPTION_ + void __BuildClientKey(); +#endif + + protected: + UINT m_eState; + std::string m_strID; + std::string m_strPassword; + + std::string m_strAddr; + int m_iPort; + BOOL m_isWaitKey; + + PyObject * m_poHandler; + + // CHINA_CRYPT_KEY + void __BuildClientKey_20050304Myevan(); + // END_OF_CHINA_CRYPT_KEY +}; diff --git a/extension/src/port/UserInterface/AffectFlagContainer.h b/extension/src/port/UserInterface/AffectFlagContainer.h new file mode 100644 index 00000000..bbbfc8b6 --- /dev/null +++ b/extension/src/port/UserInterface/AffectFlagContainer.h @@ -0,0 +1,29 @@ +#pragma once + +class CAffectFlagContainer +{ + public: + enum + { + BIT_SIZE = 64, + BYTE_SIZE = BIT_SIZE/8+(1*((BIT_SIZE&7) ? 1 : 0)), + }; + + public: + CAffectFlagContainer(); + ~CAffectFlagContainer(); + + void Clear(); + void CopyInstance(const CAffectFlagContainer& c_rkAffectContainer); + void Set(UINT uPos, bool isSet); + bool IsSet(UINT uPos) const; + + void CopyData(UINT uPos, UINT uByteSize, const void* c_pvData); + + void ConvertToPosition(unsigned* uRetX, unsigned* uRetY) const; + + private: + typedef unsigned char Element; + + Element m_aElement[BYTE_SIZE]; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/GameType.h b/extension/src/port/UserInterface/GameType.h new file mode 100644 index 00000000..114d022a --- /dev/null +++ b/extension/src/port/UserInterface/GameType.h @@ -0,0 +1,360 @@ +#pragma once +#include "../GameLib/ItemData.h" + +struct SAffects +{ + enum + { + AFFECT_MAX_NUM = 32, + }; + + SAffects() : dwAffects(0) {} + SAffects(const DWORD & c_rAffects) + { + __SetAffects(c_rAffects); + } + int operator = (const DWORD & c_rAffects) + { + __SetAffects(c_rAffects); + } + + BOOL IsAffect(BYTE byIndex) + { + return dwAffects & (1 << byIndex); + } + + void __SetAffects(const DWORD & c_rAffects) + { + dwAffects = c_rAffects; + } + + DWORD dwAffects; +}; + +extern std::string g_strGuildSymbolPathName; + +const DWORD c_Name_Max_Length = 64; +const DWORD c_FileName_Max_Length = 128; +const DWORD c_Short_Name_Max_Length = 32; + +const DWORD c_Inventory_Page_Size = 5*9; // x*y +const DWORD c_Inventory_Page_Count = 2; +const DWORD c_ItemSlot_Count = c_Inventory_Page_Size * c_Inventory_Page_Count; +const DWORD c_Equipment_Count = 12; + +const DWORD c_Equipment_Start = c_ItemSlot_Count; + +const DWORD c_Equipment_Body = c_Equipment_Start + 0; +const DWORD c_Equipment_Head = c_Equipment_Start + 1; +const DWORD c_Equipment_Shoes = c_Equipment_Start + 2; +const DWORD c_Equipment_Wrist = c_Equipment_Start + 3; +const DWORD c_Equipment_Weapon = c_Equipment_Start + 4; +const DWORD c_Equipment_Neck = c_Equipment_Start + 5; +const DWORD c_Equipment_Ear = c_Equipment_Start + 6; +const DWORD c_Equipment_Unique1 = c_Equipment_Start + 7; +const DWORD c_Equipment_Unique2 = c_Equipment_Start + 8; +const DWORD c_Equipment_Arrow = c_Equipment_Start + 9; +const DWORD c_Equipment_Shield = c_Equipment_Start + 10; + +// 새로 추가된 신규 반지 & 벨트 +// 장착형 아이템에 할당할 수 있는 위치가 기존 장비, 채기랍 퀘스트 보상, 코스튬 시스템 등으로 인해서 공간이 잘려있다. +// 이게 다 채기랍 보상 버프를 장착아이템처럼 구현한 ㅅㄲ 때문에 난리났따... ㅆㅂ +// +// 정리하면, 기존 장비창들은 서버DB상 아이템 포지션이 90 ~ 102 이고, +// 2013년 초에 새로 추가되는 슬롯들은 111 ~ 부터 시작한다. 착용 장비에서 최대로 사용할 수 있는 값은 121 까지이고, 122부터는 용혼석에서 사용한다. +#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM + const DWORD c_New_Equipment_Start = c_Equipment_Start + 21; + const DWORD c_New_Equipment_Count = 3; + const DWORD c_Equipment_Ring1 = c_New_Equipment_Start + 0; + const DWORD c_Equipment_Ring2 = c_New_Equipment_Start + 1; + const DWORD c_Equipment_Belt = c_New_Equipment_Start + 2;; +#endif + +enum EDragonSoulDeckType +{ + DS_DECK_1, + DS_DECK_2, + DS_DECK_MAX_NUM = 2, +}; + +enum EDragonSoulGradeTypes +{ + DRAGON_SOUL_GRADE_NORMAL, + DRAGON_SOUL_GRADE_BRILLIANT, + DRAGON_SOUL_GRADE_RARE, + DRAGON_SOUL_GRADE_ANCIENT, + DRAGON_SOUL_GRADE_LEGENDARY, + DRAGON_SOUL_GRADE_MAX, + +}; + +enum EDragonSoulStepTypes +{ + DRAGON_SOUL_STEP_LOWEST, + DRAGON_SOUL_STEP_LOW, + DRAGON_SOUL_STEP_MID, + DRAGON_SOUL_STEP_HIGH, + DRAGON_SOUL_STEP_HIGHEST, + DRAGON_SOUL_STEP_MAX, +}; + +#ifdef ENABLE_COSTUME_SYSTEM + const DWORD c_Costume_Slot_Start = c_Equipment_Start + 19; // [주의] 숫자(19) 하드코딩 주의. 현재 서버에서 코스츔 슬롯은 19부터임. 서버 common/length.h 파일의 EWearPositions 열거형 참고. + const DWORD c_Costume_Slot_Body = c_Costume_Slot_Start + 0; + const DWORD c_Costume_Slot_Hair = c_Costume_Slot_Start + 1; + const DWORD c_Costume_Slot_Count = 2; + const DWORD c_Costume_Slot_End = c_Costume_Slot_Start + c_Costume_Slot_Count; +#endif + + +// [주의] 숫자(32) 하드코딩 주의. 현재 서버에서 용혼석 슬롯은 32부터임. +// 서버 common/length.h 파일의 EWearPositions 열거형이 32까지 확장될 것을 염두하고(32 이상은 확장 하기 힘들게 되어있음.), +// 그 이후부터를 용혼석 장착 슬롯으로 사용. +const DWORD c_Wear_Max = 32; +const DWORD c_DragonSoul_Equip_Start = c_ItemSlot_Count + c_Wear_Max; +const DWORD c_DragonSoul_Equip_Slot_Max = 6; +const DWORD c_DragonSoul_Equip_End = c_DragonSoul_Equip_Start + c_DragonSoul_Equip_Slot_Max * DS_DECK_MAX_NUM; + +// NOTE: 2013년 2월 5일 현재... 용혼석 데크는 2개가 존재하는데, 향후 확장 가능성이 있어서 3개 데크 여유분을 할당 해 둠. 그 뒤 공간은 벨트 인벤토리로 사용 +const DWORD c_DragonSoul_Equip_Reserved_Count = c_DragonSoul_Equip_Slot_Max * 3; + +#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM + // 벨트 아이템이 제공하는 인벤토리 + const DWORD c_Belt_Inventory_Slot_Start = c_DragonSoul_Equip_End + c_DragonSoul_Equip_Reserved_Count; + const DWORD c_Belt_Inventory_Width = 4; + const DWORD c_Belt_Inventory_Height= 4; + const DWORD c_Belt_Inventory_Slot_Count = c_Belt_Inventory_Width * c_Belt_Inventory_Height; + const DWORD c_Belt_Inventory_Slot_End = c_Belt_Inventory_Slot_Start + c_Belt_Inventory_Slot_Count; + + const DWORD c_Inventory_Count = c_Belt_Inventory_Slot_End; +#else + const DWORD c_Inventory_Count = c_DragonSoul_Equip_End; +#endif + +// 용혼석 전용 인벤토리 +const DWORD c_DragonSoul_Inventory_Start = 0; +const DWORD c_DragonSoul_Inventory_Box_Size = 32; +const DWORD c_DragonSoul_Inventory_Count = CItemData::DS_SLOT_NUM_TYPES * DRAGON_SOUL_GRADE_MAX * c_DragonSoul_Inventory_Box_Size; +const DWORD c_DragonSoul_Inventory_End = c_DragonSoul_Inventory_Start + c_DragonSoul_Inventory_Count; + +enum ESlotType +{ + SLOT_TYPE_NONE, + SLOT_TYPE_INVENTORY, + SLOT_TYPE_SKILL, + SLOT_TYPE_EMOTION, + SLOT_TYPE_SHOP, + SLOT_TYPE_EXCHANGE_OWNER, + SLOT_TYPE_EXCHANGE_TARGET, + SLOT_TYPE_QUICK_SLOT, + SLOT_TYPE_SAFEBOX, + SLOT_TYPE_PRIVATE_SHOP, + SLOT_TYPE_MALL, + SLOT_TYPE_DRAGON_SOUL_INVENTORY, + SLOT_TYPE_MAX, +}; + +enum EWindows +{ + RESERVED_WINDOW, + INVENTORY, // 기본 인벤토리. (45칸 짜리가 2페이지 존재 = 90칸) + EQUIPMENT, + SAFEBOX, + MALL, + DRAGON_SOUL_INVENTORY, + GROUND, // NOTE: 2013년 2월5일 현재까지 unused.. 왜 있는거지??? + BELT_INVENTORY, // NOTE: W2.1 버전에 새로 추가되는 벨트 슬롯 아이템이 제공하는 벨트 인벤토리 + + WINDOW_TYPE_MAX, +}; + +enum EDSInventoryMaxNum +{ + DS_INVENTORY_MAX_NUM = c_DragonSoul_Inventory_Count, + DS_REFINE_WINDOW_MAX_NUM = 15, +}; + +#pragma pack (push, 1) +#define WORD_MAX 0xffff + +typedef struct SItemPos +{ + BYTE window_type; + WORD cell; + SItemPos () + { + window_type = INVENTORY; + cell = WORD_MAX; + } + SItemPos (BYTE _window_type, WORD _cell) + { + window_type = _window_type; + cell = _cell; + } + + // 기존에 cell의 형을 보면 BYTE가 대부분이지만, oi + // 어떤 부분은 int, 어떤 부분은 WORD로 되어있어, + // 가장 큰 자료형인 int로 받는다. + // int operator=(const int _cell) + // { + //window_type = INVENTORY; + // cell = _cell; + // return cell; + // } + bool IsValidCell() + { + switch (window_type) + { + case INVENTORY: + return cell < c_Inventory_Count; + break; + case EQUIPMENT: + return cell < c_DragonSoul_Equip_End; + break; + case DRAGON_SOUL_INVENTORY: + return cell < (DS_INVENTORY_MAX_NUM); + break; + default: + return false; + } + } + bool IsEquipCell() + { + switch (window_type) + { + case INVENTORY: + case EQUIPMENT: + return (c_Equipment_Start + c_Wear_Max > cell) && (c_Equipment_Start <= cell); + break; + + case BELT_INVENTORY: + case DRAGON_SOUL_INVENTORY: + return false; + break; + + default: + return false; + } + } + +#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM + bool IsBeltInventoryCell() + { + bool bResult = c_Belt_Inventory_Slot_Start <= cell && c_Belt_Inventory_Slot_End > cell; + return bResult; + } +#endif + + bool operator==(const struct SItemPos& rhs) const + { + return (window_type == rhs.window_type) && (cell == rhs.cell); + } + + bool operator<(const struct SItemPos& rhs) const + { + return (window_type < rhs.window_type) || ((window_type == rhs.window_type) && (cell < rhs.cell)); + } +} TItemPos; +#pragma pack(pop) + +const DWORD c_QuickBar_Line_Count = 3; +const DWORD c_QuickBar_Slot_Count = 12; + +const float c_Idle_WaitTime = 5.0f; + +const int c_Monster_Race_Start_Number = 6; +const int c_Monster_Model_Start_Number = 20001; + +const float c_fAttack_Delay_Time = 0.2f; +const float c_fHit_Delay_Time = 0.1f; +const float c_fCrash_Wave_Time = 0.2f; +const float c_fCrash_Wave_Distance = 3.0f; + +const float c_fHeight_Step_Distance = 50.0f; + +enum +{ + DISTANCE_TYPE_FOUR_WAY, + DISTANCE_TYPE_EIGHT_WAY, + DISTANCE_TYPE_ONE_WAY, + DISTANCE_TYPE_MAX_NUM, +}; + +const float c_fMagic_Script_Version = 1.0f; +const float c_fSkill_Script_Version = 1.0f; +const float c_fMagicSoundInformation_Version = 1.0f; +const float c_fBattleCommand_Script_Version = 1.0f; +const float c_fEmotionCommand_Script_Version = 1.0f; +const float c_fActive_Script_Version = 1.0f; +const float c_fPassive_Script_Version = 1.0f; + +// Used by PushMove +const float c_fWalkDistance = 175.0f; +const float c_fRunDistance = 310.0f; + +#define FILE_MAX_LEN 128 + +enum +{ + ITEM_SOCKET_SLOT_MAX_NUM = 3, + ITEM_ATTRIBUTE_SLOT_MAX_NUM = 7, +}; + +#pragma pack(push) +#pragma pack(1) + +typedef struct SQuickSlot +{ + BYTE Type; + BYTE Position; +} TQuickSlot; + +typedef struct TPlayerItemAttribute +{ + BYTE bType; + short sValue; +} TPlayerItemAttribute; + +typedef struct packet_item +{ + DWORD vnum; + BYTE count; + DWORD flags; + DWORD anti_flags; + long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; + TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; +} TItemData; + +typedef struct packet_shop_item +{ + DWORD vnum; + DWORD price; + BYTE count; + BYTE display_pos; + long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; + TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; +} TShopItemData; + +#pragma pack(pop) + +inline float GetSqrtDistance(int ix1, int iy1, int ix2, int iy2) // By sqrt +{ + float dx, dy; + + dx = float(ix1 - ix2); + dy = float(iy1 - iy2); + + return sqrtf(dx*dx + dy*dy); +} + +// DEFAULT_FONT +void DefaultFont_Startup(); +void DefaultFont_Cleanup(); +void DefaultFont_SetName(const char * c_szFontName); +CResource* DefaultFont_GetResource(); +CResource* DefaultItalicFont_GetResource(); +// END_OF_DEFAULT_FONT + +void SetGuildSymbolPath(const char * c_szPathName); +const char * GetGuildSymbolFileName(DWORD dwGuildID); +BYTE SlotTypeToInvenType(BYTE bSlotType); diff --git a/extension/src/port/UserInterface/GuildMarkDownloader.h b/extension/src/port/UserInterface/GuildMarkDownloader.h new file mode 100644 index 00000000..5719352a --- /dev/null +++ b/extension/src/port/UserInterface/GuildMarkDownloader.h @@ -0,0 +1,79 @@ +#pragma once + +#include "../EterLib/NetStream.h" +#include "MarkManager.h" + +class CGuildMarkDownloader : public CNetworkStream, public CSingleton +{ + public: + CGuildMarkDownloader(); + virtual ~CGuildMarkDownloader(); + + bool Connect(const CNetworkAddress& c_rkNetAddr, DWORD dwHandle, DWORD dwRandomKey); + bool ConnectToRecvSymbol(const CNetworkAddress& c_rkNetAddr, DWORD dwHandle, DWORD dwRandomKey, const std::vector & c_rkVec_dwGuildID); + + void Process(); + + private: + enum + { + STATE_OFFLINE, + STATE_LOGIN, + STATE_COMPLETE, + }; + + enum + { + TODO_RECV_NONE, + TODO_RECV_MARK, + TODO_RECV_SYMBOL, + }; + + private: + void OnConnectFailure(); + void OnConnectSuccess(); + void OnRemoteDisconnect(); + void OnDisconnect(); + + void __Initialize(); + bool __StateProcess(); + + UINT __GetPacketSize(UINT header); + bool __DispatchPacket(UINT header); + + void __OfflineState_Set(); + void __CompleteState_Set(); + + void __LoginState_Set(); + bool __LoginState_Process(); + bool __LoginState_RecvPhase(); + bool __LoginState_RecvHandshake(); + bool __LoginState_RecvPing(); + bool __LoginState_RecvMarkIndex(); + bool __LoginState_RecvMarkBlock(); + bool __LoginState_RecvSymbolData(); +#ifdef _IMPROVED_PACKET_ENCRYPTION_ + bool __LoginState_RecvKeyAgreement(); + bool __LoginState_RecvKeyAgreementCompleted(); +#endif + bool __SendMarkIDXList(); + bool __SendMarkCRCList(); + bool __SendSymbolCRCList(); + + private: + DWORD m_dwHandle; + DWORD m_dwRandomKey; + DWORD m_dwTodo; + + std::vector m_kVec_dwGuildID; + + UINT m_eState; + + BYTE m_currentRequestingImageIndex; + + CGuildMarkManager * m_pkMarkMgr; + + DWORD m_dwBlockIndex; + DWORD m_dwBlockDataSize; + DWORD m_dwBlockDataPos; +}; diff --git a/extension/src/port/UserInterface/GuildMarkUploader.h b/extension/src/port/UserInterface/GuildMarkUploader.h new file mode 100644 index 00000000..1068c035 --- /dev/null +++ b/extension/src/port/UserInterface/GuildMarkUploader.h @@ -0,0 +1,118 @@ +#pragma once + +#include "../EterLib/NetStream.h" +#include "MarkImage.h" + +#ifdef __VTUNE__ + +class CGuildMarkUploader : public CNetworkStream, public CSingleton +{ + public: + enum + { + ERROR_NONE, + ERROR_CONNECT, + ERROR_LOAD, + ERROR_WIDTH, + ERROR_HEIGHT, + }; + + public: + CGuildMarkUploader() {} + virtual ~CGuildMarkUploader() {} + + void Disconnect() {} + bool Connect(const CNetworkAddress& c_rkNetAddr, DWORD dwHandle, DWORD dwRandomKey, DWORD dwGuildID, const char* c_szFileName, UINT* peError) {return false;} + bool ConnectToSendSymbol(const CNetworkAddress& c_rkNetAddr, DWORD dwHandle, DWORD dwRandomKey, DWORD dwGuildID, const char* c_szFileName, UINT* peError) {return false;} + void Process() {} +}; + +#else + +#include + +class CGuildMarkUploader : public CNetworkStream, public CSingleton +{ + public: + enum + { + ERROR_NONE, + ERROR_CONNECT, + ERROR_LOAD, + ERROR_WIDTH, + ERROR_HEIGHT, + }; + + enum + { + SEND_TYPE_MARK, + SEND_TYPE_SYMBOL, + }; + + public: + CGuildMarkUploader(); + virtual ~CGuildMarkUploader(); + + void Disconnect(); + bool Connect(const CNetworkAddress& c_rkNetAddr, DWORD dwHandle, DWORD dwRandomKey, DWORD dwGuildID, const char* c_szFileName, UINT* peError); + bool ConnectToSendSymbol(const CNetworkAddress& c_rkNetAddr, DWORD dwHandle, DWORD dwRandomKey, DWORD dwGuildID, const char* c_szFileName, UINT* peError); + bool IsCompleteUploading(); + + void Process(); + + private: + enum + { + STATE_OFFLINE, + STATE_LOGIN, + STATE_COMPLETE, + }; + + private: + void OnConnectFailure(); + void OnConnectSuccess(); + void OnRemoteDisconnect(); + void OnDisconnect(); + + bool __Load(const char* c_szFileName, UINT* peError); + bool __LoadSymbol(const char* c_szFileName, UINT* peError); + + bool __Save(const char* c_szFileName); + + void __Inialize(); + bool __StateProcess(); + + void __OfflineState_Set(); + void __CompleteState_Set(); + + void __LoginState_Set(); + bool __LoginState_Process(); + bool __LoginState_RecvPhase(); + bool __LoginState_RecvHandshake(); + bool __LoginState_RecvPing(); +#ifdef _IMPROVED_PACKET_ENCRYPTION_ + bool __LoginState_RecvKeyAgreement(); + bool __LoginState_RecvKeyAgreementCompleted(); +#endif + + bool __AnalyzePacket(UINT uHeader, UINT uPacketSize, bool (CGuildMarkUploader::*pfnDispatchPacket)()); + + bool __SendMarkPacket(); + bool __SendSymbolPacket(); + + private: + UINT m_eState; + + DWORD m_dwSendType; + DWORD m_dwHandle; + DWORD m_dwRandomKey; + DWORD m_dwGuildID; + + SGuildMark m_kMark; + + DWORD m_dwSymbolBufSize; + DWORD m_dwSymbolCRC32; + BYTE * m_pbySymbolBuf; +}; + +#endif \ No newline at end of file diff --git a/extension/src/port/UserInterface/Hackshield.h b/extension/src/port/UserInterface/Hackshield.h new file mode 100644 index 00000000..998a34b9 --- /dev/null +++ b/extension/src/port/UserInterface/Hackshield.h @@ -0,0 +1,23 @@ +#pragma once + +#ifdef USE_AHNLAB_HACKSHIELD + +#include "HackshieldLicense.h" + +#ifndef METIN2HS_INCLUDE +//#define METIN2HS_INCLUDE hshield-5.4.8.1 +#define METIN2HS_INCLUDE hackshield //2012년 3월 +#endif + +#define METIN2HS_INCLUDE_HSUPCHK +#define METIN2HS_INCLUDE_HSUSERUTIL +#define METIN2HS_INCLUDE_HSHIELD +#define METIN2HS_INCLUDE_HSHIELDLIBLINK +#define METIN2HS_INCLUDE_ANTICPXSVR + +bool HackShield_Init(); +bool HackShield_Shutdown(); +bool HackShield_PollEvent(); +void HackShield_SetUserInfo(const char* szAccountName); + +#endif /* USE_AHNLAB_HACKSHIELD */ diff --git a/extension/src/port/UserInterface/HackshieldLicense.h b/extension/src/port/UserInterface/HackshieldLicense.h new file mode 100644 index 00000000..e69de29b diff --git a/extension/src/port/UserInterface/InstanceBase.h b/extension/src/port/UserInterface/InstanceBase.h new file mode 100644 index 00000000..d5092600 --- /dev/null +++ b/extension/src/port/UserInterface/InstanceBase.h @@ -0,0 +1,1132 @@ +#pragma once + +#include "../GameLib/RaceData.h" +#include "../GameLib/ActorInstance.h" + +#include "AffectFlagContainer.h" + +class CInstanceBase +{ + public: + struct SCreateData + { + BYTE m_bType; + DWORD m_dwStateFlags; + DWORD m_dwEmpireID; + DWORD m_dwGuildID; + DWORD m_dwLevel; + DWORD m_dwVID; + DWORD m_dwRace; + DWORD m_dwMovSpd; + DWORD m_dwAtkSpd; + LONG m_lPosX; + LONG m_lPosY; + FLOAT m_fRot; + DWORD m_dwArmor; + DWORD m_dwWeapon; + DWORD m_dwHair; + DWORD m_dwMountVnum; + + short m_sAlignment; + BYTE m_byPKMode; + CAffectFlagContainer m_kAffectFlags; + + std::string m_stName; + + bool m_isMain; + }; + + public: + typedef DWORD TType; + + enum EDirection + { + DIR_NORTH, + DIR_NORTHEAST, + DIR_EAST, + DIR_SOUTHEAST, + DIR_SOUTH, + DIR_SOUTHWEST, + DIR_WEST, + DIR_NORTHWEST, + DIR_MAX_NUM, + }; + + enum + { + FUNC_WAIT, + FUNC_MOVE, + FUNC_ATTACK, + FUNC_COMBO, + FUNC_MOB_SKILL, + FUNC_EMOTION, + FUNC_SKILL = 0x80, + }; + + enum + { + AFFECT_YMIR, + AFFECT_INVISIBILITY, + AFFECT_SPAWN, + + AFFECT_POISON, + AFFECT_SLOW, + AFFECT_STUN, + + AFFECT_DUNGEON_READY, // 던전에서 준비 상태 + AFFECT_SHOW_ALWAYS, // AFFECT_DUNGEON_UNIQUE 에서 변경(클라이언트에서 컬링되지않음) + + AFFECT_BUILDING_CONSTRUCTION_SMALL, + AFFECT_BUILDING_CONSTRUCTION_LARGE, + AFFECT_BUILDING_UPGRADE, + + AFFECT_MOV_SPEED_POTION, // 11 + AFFECT_ATT_SPEED_POTION, // 12 + + AFFECT_FISH_MIND, // 13 + + AFFECT_JEONGWI, // 14 전귀혼 + AFFECT_GEOMGYEONG, // 15 검경 + AFFECT_CHEONGEUN, // 16 천근추 + AFFECT_GYEONGGONG, // 17 경공술 + AFFECT_EUNHYEONG, // 18 은형법 + AFFECT_GWIGEOM, // 19 귀검 + AFFECT_GONGPO, // 20 공포 + AFFECT_JUMAGAP, // 21 주마갑 + AFFECT_HOSIN, // 22 호신 + AFFECT_BOHO, // 23 보호 + AFFECT_KWAESOK, // 24 쾌속 + AFFECT_HEUKSIN, // 25 흑신수호 + AFFECT_MUYEONG, // 26 무영진 + AFFECT_REVIVE_INVISIBILITY, // 27 부활 무적 + AFFECT_FIRE, // 28 지속 불 + AFFECT_GICHEON, // 29 기천 대공 + AFFECT_JEUNGRYEOK, // 30 증력술 + AFFECT_DASH, // 31 대쉬 + AFFECT_PABEOP, // 32 파법술 + AFFECT_FALLEN_CHEONGEUN, // 33 다운 그레이드 천근추 + AFFECT_POLYMORPH, // 34 폴리모프 + AFFECT_WAR_FLAG1, // 35 + AFFECT_WAR_FLAG2, // 36 + AFFECT_WAR_FLAG3, // 37 + AFFECT_CHINA_FIREWORK, // 38 + AFFECT_PREMIUM_SILVER, + AFFECT_PREMIUM_GOLD, + AFFECT_RAMADAN_RING, // 41 초승달 반지 착용 Affect + + AFFECT_NUM = 64, + + AFFECT_HWAYEOM = AFFECT_GEOMGYEONG, + }; + + enum + { + NEW_AFFECT_MOV_SPEED = 200, + NEW_AFFECT_ATT_SPEED, + NEW_AFFECT_ATT_GRADE, + NEW_AFFECT_INVISIBILITY, + NEW_AFFECT_STR, + NEW_AFFECT_DEX, // 205 + NEW_AFFECT_CON, + NEW_AFFECT_INT, + NEW_AFFECT_FISH_MIND_PILL, + + NEW_AFFECT_POISON, + NEW_AFFECT_STUN, // 210 + NEW_AFFECT_SLOW, + NEW_AFFECT_DUNGEON_READY, + NEW_AFFECT_DUNGEON_UNIQUE, + + NEW_AFFECT_BUILDING, + NEW_AFFECT_REVIVE_INVISIBLE, // 215 + NEW_AFFECT_FIRE, + NEW_AFFECT_CAST_SPEED, + NEW_AFFECT_HP_RECOVER_CONTINUE, + NEW_AFFECT_SP_RECOVER_CONTINUE, + + NEW_AFFECT_POLYMORPH, // 220 + NEW_AFFECT_MOUNT, + + NEW_AFFECT_WAR_FLAG, // 222 + + NEW_AFFECT_BLOCK_CHAT, // 223 + NEW_AFFECT_CHINA_FIREWORK, + + NEW_AFFECT_BOW_DISTANCE, // 225 + + NEW_AFFECT_EXP_BONUS = 500, // 경험의 반지 + NEW_AFFECT_ITEM_BONUS = 501, // 도둑의 장갑 + NEW_AFFECT_SAFEBOX = 502, // PREMIUM_SAFEBOX, + NEW_AFFECT_AUTOLOOT = 503, // PREMIUM_AUTOLOOT, + NEW_AFFECT_FISH_MIND = 504, // PREMIUM_FISH_MIND, + NEW_AFFECT_MARRIAGE_FAST = 505, // 원앙의 깃털 (금슬), + NEW_AFFECT_GOLD_BONUS = 506, + + NEW_AFFECT_MALL = 510, // 몰 아이템 에펙트 + NEW_AFFECT_NO_DEATH_PENALTY = 511, // 용신의 가호 (경험치 패널티를 한번 막아준다) + NEW_AFFECT_SKILL_BOOK_BONUS = 512, // 선인의 교훈 (책 수련 성공 확률이 50% 증가) + NEW_AFFECT_SKILL_BOOK_NO_DELAY = 513, // 주안 술서 (책 수련 딜레이 없음) + + NEW_AFFECT_EXP_BONUS_EURO_FREE = 516, // 경험의 반지 (유럽 버전 14 레벨 이하 기본 효과) + NEW_AFFECT_EXP_BONUS_EURO_FREE_UNDER_15 = 517, + + NEW_AFFECT_AUTO_HP_RECOVERY = 534, // 자동물약 HP + NEW_AFFECT_AUTO_SP_RECOVERY = 535, // 자동물약 SP + + NEW_AFFECT_DRAGON_SOUL_QUALIFIED = 540, + NEW_AFFECT_DRAGON_SOUL_DECK1 = 541, + NEW_AFFECT_DRAGON_SOUL_DECK2 = 542, + + NEW_AFFECT_RAMADAN_ABILITY = 300, + NEW_AFFECT_RAMADAN_RING = 301, // 라마단 이벤트용 특수아이템 초승달의 반지 착용 유무 + + NEW_AFFECT_NOG_POCKET_ABILITY = 302, + + NEW_AFFECT_QUEST_START_IDX = 1000, + }; + + enum + { + STONE_SMOKE1 = 0, // 99% + STONE_SMOKE2 = 1, // 85% + STONE_SMOKE3 = 2, // 80% + STONE_SMOKE4 = 3, // 60% + STONE_SMOKE5 = 4, // 45% + STONE_SMOKE6 = 5, // 40% + STONE_SMOKE7 = 6, // 20% + STONE_SMOKE8 = 7, // 10% + STONE_SMOKE_NUM = 4, + }; + + enum EBuildingAffect + { + BUILDING_CONSTRUCTION_SMALL = 0, + BUILDING_CONSTRUCTION_LARGE = 1, + BUILDING_UPGRADE = 2, + }; + + enum + { + WEAPON_DUALHAND, + WEAPON_ONEHAND, + WEAPON_TWOHAND, + WEAPON_NUM, + }; + + enum + { + EMPIRE_NONE, + EMPIRE_A, + EMPIRE_B, + EMPIRE_C, + EMPIRE_NUM, + }; + + enum + { + NAMECOLOR_MOB, + NAMECOLOR_NPC, + NAMECOLOR_PC, + NAMECOLOR_PC_END = NAMECOLOR_PC + EMPIRE_NUM, + NAMECOLOR_NORMAL_MOB, + NAMECOLOR_NORMAL_NPC, + NAMECOLOR_NORMAL_PC, + NAMECOLOR_NORMAL_PC_END = NAMECOLOR_NORMAL_PC + EMPIRE_NUM, + NAMECOLOR_EMPIRE_MOB, + NAMECOLOR_EMPIRE_NPC, + NAMECOLOR_EMPIRE_PC, + NAMECOLOR_EMPIRE_PC_END = NAMECOLOR_EMPIRE_PC + EMPIRE_NUM, + NAMECOLOR_FUNC, + NAMECOLOR_PK, + NAMECOLOR_PVP, + NAMECOLOR_PARTY, + NAMECOLOR_WARP, + NAMECOLOR_WAYPOINT, + NAMECOLOR_EXTRA = NAMECOLOR_FUNC + 10, + NAMECOLOR_NUM = NAMECOLOR_EXTRA + 10, + }; + + enum + { + ALIGNMENT_TYPE_WHITE, + ALIGNMENT_TYPE_NORMAL, + ALIGNMENT_TYPE_DARK, + }; + + enum + { + EMOTICON_EXCLAMATION = 1, + EMOTICON_FISH = 11, + EMOTICON_NUM = 128, + + TITLE_NUM = 9, + TITLE_NONE = 4, + }; + + enum //아래 번호가 바뀌면 registerEffect 쪽도 바꾸어 줘야 한다. + { + EFFECT_REFINED_NONE, + + EFFECT_SWORD_REFINED7, + EFFECT_SWORD_REFINED8, + EFFECT_SWORD_REFINED9, + + EFFECT_BOW_REFINED7, + EFFECT_BOW_REFINED8, + EFFECT_BOW_REFINED9, + + EFFECT_FANBELL_REFINED7, + EFFECT_FANBELL_REFINED8, + EFFECT_FANBELL_REFINED9, + + EFFECT_SMALLSWORD_REFINED7, + EFFECT_SMALLSWORD_REFINED8, + EFFECT_SMALLSWORD_REFINED9, + + EFFECT_SMALLSWORD_REFINED7_LEFT, + EFFECT_SMALLSWORD_REFINED8_LEFT, + EFFECT_SMALLSWORD_REFINED9_LEFT, + + EFFECT_BODYARMOR_REFINED7, + EFFECT_BODYARMOR_REFINED8, + EFFECT_BODYARMOR_REFINED9, + + EFFECT_BODYARMOR_SPECIAL, // 갑옷 4-2-1 + EFFECT_BODYARMOR_SPECIAL2, // 갑옷 4-2-2 + + EFFECT_REFINED_NUM, + }; + + enum DamageFlag + { + DAMAGE_NORMAL = (1<<0), + DAMAGE_POISON = (1<<1), + DAMAGE_DODGE = (1<<2), + DAMAGE_BLOCK = (1<<3), + DAMAGE_PENETRATE= (1<<4), + DAMAGE_CRITICAL = (1<<5), + // 반-_-사 + }; + + enum + { + EFFECT_DUST, + EFFECT_STUN, + EFFECT_HIT, + EFFECT_FLAME_ATTACK, + EFFECT_FLAME_HIT, + EFFECT_FLAME_ATTACH, + EFFECT_ELECTRIC_ATTACK, + EFFECT_ELECTRIC_HIT, + EFFECT_ELECTRIC_ATTACH, + EFFECT_SPAWN_APPEAR, + EFFECT_SPAWN_DISAPPEAR, + EFFECT_LEVELUP, + EFFECT_SKILLUP, + EFFECT_HPUP_RED, + EFFECT_SPUP_BLUE, + EFFECT_SPEEDUP_GREEN, + EFFECT_DXUP_PURPLE, + EFFECT_CRITICAL, + EFFECT_PENETRATE, + EFFECT_BLOCK, + EFFECT_DODGE, + EFFECT_FIRECRACKER, + EFFECT_SPIN_TOP, + EFFECT_WEAPON, + EFFECT_WEAPON_END = EFFECT_WEAPON + WEAPON_NUM, + EFFECT_AFFECT, + EFFECT_AFFECT_GYEONGGONG = EFFECT_AFFECT + AFFECT_GYEONGGONG, + EFFECT_AFFECT_KWAESOK = EFFECT_AFFECT + AFFECT_KWAESOK, + EFFECT_AFFECT_END = EFFECT_AFFECT + AFFECT_NUM, + EFFECT_EMOTICON, + EFFECT_EMOTICON_END = EFFECT_EMOTICON + EMOTICON_NUM, + EFFECT_SELECT, + EFFECT_TARGET, + EFFECT_EMPIRE, + EFFECT_EMPIRE_END = EFFECT_EMPIRE + EMPIRE_NUM, + EFFECT_HORSE_DUST, + EFFECT_REFINED, + EFFECT_REFINED_END = EFFECT_REFINED + EFFECT_REFINED_NUM, + EFFECT_DAMAGE_TARGET, + EFFECT_DAMAGE_NOT_TARGET, + EFFECT_DAMAGE_SELFDAMAGE, + EFFECT_DAMAGE_SELFDAMAGE2, + EFFECT_DAMAGE_POISON, + EFFECT_DAMAGE_MISS, + EFFECT_DAMAGE_TARGETMISS, + EFFECT_DAMAGE_CRITICAL, + EFFECT_SUCCESS, + EFFECT_FAIL, + EFFECT_FR_SUCCESS, + EFFECT_LEVELUP_ON_14_FOR_GERMANY, //레벨업 14일때 ( 독일전용 ) + EFFECT_LEVELUP_UNDER_15_FOR_GERMANY,//레벨업 15일때 ( 독일전용 ) + EFFECT_PERCENT_DAMAGE1, + EFFECT_PERCENT_DAMAGE2, + EFFECT_PERCENT_DAMAGE3, + EFFECT_AUTO_HPUP, + EFFECT_AUTO_SPUP, + EFFECT_RAMADAN_RING_EQUIP, // 초승달 반지 착용 순간에 발동하는 이펙트 + EFFECT_HALLOWEEN_CANDY_EQUIP, // 할로윈 사탕 착용 순간에 발동하는 이펙트 + EFFECT_HAPPINESS_RING_EQUIP, // 행복의 반지 착용 순간에 발동하는 이펙트 + EFFECT_LOVE_PENDANT_EQUIP, // 행복의 반지 착용 순간에 발동하는 이펙트 + EFFECT_TEMP, + EFFECT_NUM, + }; + + enum + { + DUEL_NONE, + DUEL_CANNOTATTACK, + DUEL_START, + }; + + public: + static void DestroySystem(); + static void CreateSystem(UINT uCapacity); + static bool RegisterEffect(UINT eEftType, const char* c_szEftAttachBone, const char* c_szEftName, bool isCache); + static void RegisterTitleName(int iIndex, const char * c_szTitleName); + static bool RegisterNameColor(UINT uIndex, UINT r, UINT g, UINT b); + static bool RegisterTitleColor(UINT uIndex, UINT r, UINT g, UINT b); + static bool ChangeEffectTexture(UINT eEftType, const char* c_szSrcFileName, const char* c_szDstFileName); + + static void SetDustGap(float fDustGap); + static void SetHorseDustGap(float fDustGap); + + static void SetEmpireNameMode(bool isEnable); + static const D3DXCOLOR& GetIndexedNameColor(UINT eNameColor); + + public: + void SetMainInstance(); + + void OnSelected(); + void OnUnselected(); + void OnTargeted(); + void OnUntargeted(); + + protected: + bool __IsExistMainInstance(); + bool __IsMainInstance(); + bool __MainCanSeeHiddenThing(); + float __GetBowRange(); + + protected: + DWORD __AttachEffect(UINT eEftType); + DWORD __AttachEffect(char filename[128]); + void __DetachEffect(DWORD dwEID); + + public: + void CreateSpecialEffect(DWORD iEffectIndex); + void AttachSpecialEffect(DWORD effect); + + protected: + static std::string ms_astAffectEffectAttachBone[EFFECT_NUM]; + static DWORD ms_adwCRCAffectEffect[EFFECT_NUM]; + static float ms_fDustGap; + static float ms_fHorseDustGap; + + public: + CInstanceBase(); + virtual ~CInstanceBase(); + + bool LessRenderOrder(CInstanceBase* pkInst); + + void MountHorse(UINT eRace); + void DismountHorse(); + + // 스크립트용 테스트 함수. 나중에 없에자 + void SCRIPT_SetAffect(UINT eAffect, bool isVisible); + + float CalculateDistanceSq3d(const TPixelPosition& c_rkPPosDst); + + // Instance Data + bool IsFlyTargetObject(); + void ClearFlyTargetInstance(); + void SetFlyTargetInstance(CInstanceBase& rkInstDst); + void AddFlyTargetInstance(CInstanceBase& rkInstDst); + void AddFlyTargetPosition(const TPixelPosition& c_rkPPosDst); + + float GetFlyTargetDistance(); + + void SetAlpha(float fAlpha); + + void DeleteBlendOut(); + + void AttachTextTail(); + void DetachTextTail(); + void UpdateTextTailLevel(DWORD level); + + void RefreshTextTail(); + void RefreshTextTailTitle(); + + bool Create(const SCreateData& c_rkCreateData); + + bool CreateDeviceObjects(); + void DestroyDeviceObjects(); + + void Destroy(); + + void Update(); + bool UpdateDeleting(); + + void Transform(); + void Deform(); + void Render(); + void RenderTrace(); + void RenderToShadowMap(); + void RenderCollision(); + void RegisterBoundingSphere(); + + // Temporary + void GetBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax); + + void SetNameString(const char* c_szName, int len); + bool SetRace(DWORD dwRaceIndex); + void SetVirtualID(DWORD wVirtualNumber); + void SetVirtualNumber(DWORD dwVirtualNumber); + void SetInstanceType(int iInstanceType); + void SetAlignment(short sAlignment); + void SetPKMode(BYTE byPKMode); + void SetKiller(bool bFlag); + void SetPartyMemberFlag(bool bFlag); + void SetStateFlags(DWORD dwStateFlags); + + void SetArmor(DWORD dwArmor); + void SetShape(DWORD eShape, float fSpecular=0.0f); + void SetHair(DWORD eHair); + bool SetWeapon(DWORD eWeapon); + bool ChangeArmor(DWORD dwArmor); + void ChangeWeapon(DWORD eWeapon); + void ChangeHair(DWORD eHair); + void ChangeGuild(DWORD dwGuildID); + DWORD GetWeaponType(); + + void SetComboType(UINT uComboType); + void SetAttackSpeed(UINT uAtkSpd); + void SetMoveSpeed(UINT uMovSpd); + void SetRotationSpeed(float fRotSpd); + + const char * GetNameString(); + int GetInstanceType(); + DWORD GetPart(CRaceData::EParts part); + DWORD GetShape(); + DWORD GetRace(); + DWORD GetVirtualID(); + DWORD GetVirtualNumber(); + DWORD GetEmpireID(); + DWORD GetGuildID(); + int GetAlignment(); + UINT GetAlignmentGrade(); + int GetAlignmentType(); + BYTE GetPKMode(); + bool IsKiller(); + bool IsPartyMember(); + + void ActDualEmotion(CInstanceBase & rkDstInst, WORD dwMotionNumber1, WORD dwMotionNumber2); + void ActEmotion(DWORD dwMotionNumber); + void LevelUp(); + void SkillUp(); + void UseSpinTop(); + void Revive(); + void Stun(); + void Die(); + void Hide(); + void Show(); + + bool CanAct(); + bool CanMove(); + bool CanAttack(); + bool CanUseSkill(); + bool CanFishing(); + bool IsConflictAlignmentInstance(CInstanceBase& rkInstVictim); + bool IsAttackableInstance(CInstanceBase& rkInstVictim); + bool IsTargetableInstance(CInstanceBase& rkInstVictim); + bool IsPVPInstance(CInstanceBase& rkInstVictim); + bool CanChangeTarget(); + bool CanPickInstance(); + bool CanViewTargetHP(CInstanceBase& rkInstVictim); + + + // Movement + BOOL IsGoing(); + bool NEW_Goto(const TPixelPosition& c_rkPPosDst, float fDstRot); + void EndGoing(); + + void SetRunMode(); + void SetWalkMode(); + + bool IsAffect(UINT uAffect); + BOOL IsInvisibility(); + BOOL IsParalysis(); + BOOL IsGameMaster(); + BOOL IsSameEmpire(CInstanceBase& rkInstDst); + BOOL IsBowMode(); + BOOL IsHandMode(); + BOOL IsFishingMode(); + BOOL IsFishing(); + + BOOL IsWearingDress(); + BOOL IsHoldingPickAxe(); + BOOL IsMountingHorse(); + BOOL IsNewMount(); + BOOL IsForceVisible(); + BOOL IsInSafe(); + BOOL IsEnemy(); + BOOL IsStone(); + BOOL IsResource(); + BOOL IsNPC(); + BOOL IsPC(); + BOOL IsPoly(); + BOOL IsWarp(); + BOOL IsGoto(); + BOOL IsObject(); + BOOL IsDoor(); + BOOL IsBuilding(); + BOOL IsWoodenDoor(); + BOOL IsStoneDoor(); + BOOL IsFlag(); + BOOL IsGuildWall(); + + BOOL IsDead(); + BOOL IsStun(); + BOOL IsSleep(); + BOOL __IsSyncing(); + BOOL IsWaiting(); + BOOL IsWalking(); + BOOL IsPushing(); + BOOL IsAttacking(); + BOOL IsActingEmotion(); + BOOL IsAttacked(); + BOOL IsKnockDown(); + BOOL IsUsingSkill(); + BOOL IsUsingMovingSkill(); + BOOL CanCancelSkill(); + BOOL CanAttackHorseLevel(); + +#ifdef __MOVIE_MODE__ + BOOL IsMovieMode(); // 운영자용 완전히 안보이는거 +#endif + bool NEW_CanMoveToDestPixelPosition(const TPixelPosition& c_rkPPosDst); + + void NEW_SetAdvancingRotationFromPixelPosition(const TPixelPosition& c_rkPPosSrc, const TPixelPosition& c_rkPPosDst); + void NEW_SetAdvancingRotationFromDirPixelPosition(const TPixelPosition& c_rkPPosDir); + bool NEW_SetAdvancingRotationFromDestPixelPosition(const TPixelPosition& c_rkPPosDst); + void SetAdvancingRotation(float fRotation); + + void EndWalking(float fBlendingTime=0.15f); + void EndWalkingWithoutBlending(); + + // Battle + void SetEventHandler(CActorInstance::IEventHandler* pkEventHandler); + + void PushUDPState(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg); + void PushTCPState(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg); + void PushTCPStateExpanded(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg, UINT uTargetVID); + + void NEW_Stop(); + + bool NEW_UseSkill(UINT uSkill, UINT uMot, UINT uMotLoopCount, bool isMovingSkill); + void NEW_Attack(); + void NEW_Attack(float fDirRot); + void NEW_AttackToDestPixelPositionDirection(const TPixelPosition& c_rkPPosDst); + bool NEW_AttackToDestInstanceDirection(CInstanceBase& rkInstDst, IFlyEventHandler* pkFlyHandler); + bool NEW_AttackToDestInstanceDirection(CInstanceBase& rkInstDst); + + bool NEW_MoveToDestPixelPositionDirection(const TPixelPosition& c_rkPPosDst); + void NEW_MoveToDestInstanceDirection(CInstanceBase& rkInstDst); + void NEW_MoveToDirection(float fDirRot); + + float NEW_GetDistanceFromDirPixelPosition(const TPixelPosition& c_rkPPosDir); + float NEW_GetDistanceFromDestPixelPosition(const TPixelPosition& c_rkPPosDst); + float NEW_GetDistanceFromDestInstance(CInstanceBase& rkInstDst); + + float NEW_GetRotation(); + float NEW_GetRotationFromDestPixelPosition(const TPixelPosition& c_rkPPosDst); + float NEW_GetRotationFromDirPixelPosition(const TPixelPosition& c_rkPPosDir); + float NEW_GetRotationFromDestInstance(CInstanceBase& rkInstDst); + + float NEW_GetAdvancingRotationFromDirPixelPosition(const TPixelPosition& c_rkPPosDir); + float NEW_GetAdvancingRotationFromDestPixelPosition(const TPixelPosition& c_rkPPosDst); + float NEW_GetAdvancingRotationFromPixelPosition(const TPixelPosition& c_rkPPosSrc, const TPixelPosition& c_rkPPosDst); + + BOOL NEW_IsClickableDistanceDestPixelPosition(const TPixelPosition& c_rkPPosDst); + BOOL NEW_IsClickableDistanceDestInstance(CInstanceBase& rkInstDst); + + bool NEW_GetFrontInstance(CInstanceBase ** ppoutTargetInstance, float fDistance); + void NEW_GetRandomPositionInFanRange(CInstanceBase& rkInstTarget, TPixelPosition* pkPPosDst); + bool NEW_GetInstanceVectorInFanRange(float fSkillDistance, CInstanceBase& rkInstTarget, std::vector* pkVct_pkInst); + bool NEW_GetInstanceVectorInCircleRange(float fSkillDistance, std::vector* pkVct_pkInst); + + void NEW_SetOwner(DWORD dwOwnerVID); + void NEW_SyncPixelPosition(long & nPPosX, long & nPPosY); + void NEW_SyncCurrentPixelPosition(); + + void NEW_SetPixelPosition(const TPixelPosition& c_rkPPosDst); + + bool NEW_IsLastPixelPosition(); + const TPixelPosition& NEW_GetLastPixelPositionRef(); + + + // Battle + BOOL isNormalAttacking(); + BOOL isComboAttacking(); + MOTION_KEY GetNormalAttackIndex(); + DWORD GetComboIndex(); + float GetAttackingElapsedTime(); + void InputNormalAttack(float fAtkDirRot); + void InputComboAttack(float fAtkDirRot); + + void RunNormalAttack(float fAtkDirRot); + void RunComboAttack(float fAtkDirRot, DWORD wMotionIndex); + + CInstanceBase* FindNearestVictim(); + BOOL CheckAdvancing(); + + + bool AvoidObject(const CGraphicObjectInstance& c_rkBGObj); + bool IsBlockObject(const CGraphicObjectInstance& c_rkBGObj); + void BlockMovement(); + + public: + BOOL CheckAttacking(CInstanceBase& rkInstVictim); + void ProcessHitting(DWORD dwMotionKey, CInstanceBase * pVictimInstance); + void ProcessHitting(DWORD dwMotionKey, BYTE byEventIndex, CInstanceBase * pVictimInstance); + void GetBlendingPosition(TPixelPosition * pPixelPosition); + void SetBlendingPosition(const TPixelPosition & c_rPixelPosition); + + // Fishing + void StartFishing(float frot); + void StopFishing(); + void ReactFishing(); + void CatchSuccess(); + void CatchFail(); + BOOL GetFishingRot(int * pirot); + + // Render Mode + void RestoreRenderMode(); + void SetAddRenderMode(); + void SetModulateRenderMode(); + void SetRenderMode(int iRenderMode); + void SetAddColor(const D3DXCOLOR & c_rColor); + + // Position + void SCRIPT_SetPixelPosition(float fx, float fy); + void NEW_GetPixelPosition(TPixelPosition * pPixelPosition); + + // Rotation + void NEW_LookAtFlyTarget(); + void NEW_LookAtDestInstance(CInstanceBase& rkInstDst); + void NEW_LookAtDestPixelPosition(const TPixelPosition& c_rkPPosDst); + + float GetRotation(); + float GetAdvancingRotation(); + void SetRotation(float fRotation); + void BlendRotation(float fRotation, float fBlendTime = 0.1f); + + void SetDirection(int dir); + void BlendDirection(int dir, float blendTime); + float GetDegreeFromDirection(int dir); + + // Motion + // Motion Deque + BOOL isLock(); + + void SetMotionMode(int iMotionMode); + int GetMotionMode(DWORD dwMotionIndex); + + // Motion + // Pushing Motion + void ResetLocalTime(); + void SetLoopMotion(WORD wMotion, float fBlendTime=0.1f, float fSpeedRatio=1.0f); + void PushOnceMotion(WORD wMotion, float fBlendTime=0.1f, float fSpeedRatio=1.0f); + void PushLoopMotion(WORD wMotion, float fBlendTime=0.1f, float fSpeedRatio=1.0f); + void SetEndStopMotion(); + + // Intersect + bool IntersectDefendingSphere(); + bool IntersectBoundingBox(); + + // Part + //void SetParts(const WORD * c_pParts); + void Refresh(DWORD dwMotIndex, bool isLoop); + + //void AttachEffectByID(DWORD dwParentPartIndex, const char * c_pszBoneName, DWORD dwEffectID, int dwLife = CActorInstance::EFFECT_LIFE_INFINITE ); // 수명은 ms단위입니다. + //void AttachEffectByName(DWORD dwParentPartIndex, const char * c_pszBoneName, const char * c_pszEffectName, int dwLife = CActorInstance::EFFECT_LIFE_INFINITE ); // 수명은 ms단위입니다. + + float GetDistance(CInstanceBase * pkTargetInst); + float GetDistance(const TPixelPosition & c_rPixelPosition); + + // ETC + CActorInstance& GetGraphicThingInstanceRef(); + CActorInstance* GetGraphicThingInstancePtr(); + + bool __Background_IsWaterPixelPosition(const TPixelPosition& c_rkPPos); + bool __Background_GetWaterHeight(const TPixelPosition& c_rkPPos, float* pfHeight); + + // 2004.07.25.myevan.이펙트 안나오는 문제 + ///////////////////////////////////////////////////////////// + void __ClearAffectFlagContainer(); + void __ClearAffects(); + ///////////////////////////////////////////////////////////// + + void __SetAffect(UINT eAffect, bool isVisible); + + void SetAffectFlagContainer(const CAffectFlagContainer& c_rkAffectFlagContainer); + + void __SetNormalAffectFlagContainer(const CAffectFlagContainer& c_rkAffectFlagContainer); + void __SetStoneSmokeFlagContainer(const CAffectFlagContainer& c_rkAffectFlagContainer); + + void SetEmoticon(UINT eEmoticon); + void SetFishEmoticon(); + bool IsPossibleEmoticon(); + + protected: + UINT __LessRenderOrder_GetLODLevel(); + void __Initialize(); + void __InitializeRotationSpeed(); + + void __Create_SetName(const SCreateData& c_rkCreateData); + void __Create_SetWarpName(const SCreateData& c_rkCreateData); + + CInstanceBase* __GetMainInstancePtr(); + CInstanceBase* __FindInstancePtr(DWORD dwVID); + + bool __FindRaceType(DWORD dwRace, BYTE* pbType); + DWORD __GetRaceType(); + + bool __IsShapeAnimalWear(); + BOOL __IsChangableWeapon(int iWeaponID); + + void __EnableSkipCollision(); + void __DisableSkipCollision(); + + void __ClearMainInstance(); + + void __Shaman_SetParalysis(bool isParalysis); + void __Warrior_SetGeomgyeongAffect(bool isVisible); + void __Assassin_SetEunhyeongAffect(bool isVisible); + void __SetReviveInvisibilityAffect(bool isVisible); + + BOOL __CanProcessNetworkStatePacket(); + + bool __IsInDustRange(); + + // Emotion + void __ProcessFunctionEmotion(DWORD dwMotionNumber, DWORD dwTargetVID, const TPixelPosition & c_rkPosDst); + void __EnableChangingTCPState(); + void __DisableChangingTCPState(); + BOOL __IsEnableTCPProcess(UINT eCurFunc); + + // 2004.07.17.levites.isShow를 ViewFrustumCheck로 변경 + bool __CanRender(); + bool __IsInViewFrustum(); + + // HORSE + void __AttachHorseSaddle(); + void __DetachHorseSaddle(); + + struct SHORSE + { + bool m_isMounting; + CActorInstance* m_pkActor; + + SHORSE(); + ~SHORSE(); + + void Destroy(); + void Create(const TPixelPosition& c_rkPPos, UINT eRace, UINT eHitEffect); + + void SetAttackSpeed(UINT uAtkSpd); + void SetMoveSpeed(UINT uMovSpd); + void Deform(); + void Render(); + CActorInstance& GetActorRef(); + CActorInstance* GetActorPtr(); + + bool IsMounting(); + bool CanAttack(); + bool CanUseSkill(); + + UINT GetLevel(); + bool IsNewMount(); + + void __Initialize(); + } m_kHorse; + + + protected: + // Blend Mode + void __SetBlendRenderingMode(); + void __SetAlphaValue(float fAlpha); + float __GetAlphaValue(); + + void __ComboProcess(); + void MovementProcess(); + void TodoProcess(); + void StateProcess(); + void AttackProcess(); + + void StartWalking(); + float GetLocalTime(); + + void RefreshState(DWORD dwMotIndex, bool isLoop); + void RefreshActorInstance(); + + protected: + void OnSyncing(); + void OnWaiting(); + void OnMoving(); + + void NEW_SetCurPixelPosition(const TPixelPosition& c_rkPPosDst); + void NEW_SetSrcPixelPosition(const TPixelPosition& c_rkPPosDst); + void NEW_SetDstPixelPosition(const TPixelPosition& c_rkPPosDst); + void NEW_SetDstPixelPositionZ(FLOAT z); + + const TPixelPosition& NEW_GetCurPixelPositionRef(); + const TPixelPosition& NEW_GetSrcPixelPositionRef(); + + public: + const TPixelPosition& NEW_GetDstPixelPositionRef(); + + protected: + BOOL m_isTextTail; + + // Instance Data + std::string m_stName; + + DWORD m_awPart[CRaceData::PART_MAX_NUM]; + + DWORD m_dwLevel; + DWORD m_dwEmpireID; + DWORD m_dwGuildID; + + protected: + CAffectFlagContainer m_kAffectFlagContainer; + DWORD m_adwCRCAffectEffect[AFFECT_NUM]; + + UINT __GetRefinedEffect(CItemData* pItem); + void __ClearWeaponRefineEffect(); + void __ClearArmorRefineEffect(); + + protected: + void __AttachSelectEffect(); + void __DetachSelectEffect(); + + void __AttachTargetEffect(); + void __DetachTargetEffect(); + + void __AttachEmpireEffect(DWORD eEmpire); + + protected: + struct SEffectContainer + { + typedef std::map Dict; + Dict m_kDct_dwEftID; + } m_kEffectContainer; + + void __EffectContainer_Initialize(); + void __EffectContainer_Destroy(); + + DWORD __EffectContainer_AttachEffect(DWORD eEffect); + void __EffectContainer_DetachEffect(DWORD eEffect); + + SEffectContainer::Dict& __EffectContainer_GetDict(); + + protected: + struct SStoneSmoke + { + DWORD m_dwEftID; + } m_kStoneSmoke; + + void __StoneSmoke_Inialize(); + void __StoneSmoke_Destroy(); + void __StoneSmoke_Create(DWORD eSmoke); + + + protected: + // Emoticon + //DWORD m_adwCRCEmoticonEffect[EMOTICON_NUM]; + + BYTE m_eType; + BYTE m_eRaceType; + DWORD m_eShape; + DWORD m_dwRace; + DWORD m_dwVirtualNumber; + short m_sAlignment; + BYTE m_byPKMode; + bool m_isKiller; + bool m_isPartyMember; + + // Movement + int m_iRotatingDirection; + + DWORD m_dwAdvActorVID; + DWORD m_dwLastDmgActorVID; + + LONG m_nAverageNetworkGap; + DWORD m_dwNextUpdateHeightTime; + + bool m_isGoing; + + TPixelPosition m_kPPosDust; + + DWORD m_dwLastComboIndex; + + DWORD m_swordRefineEffectRight; + DWORD m_swordRefineEffectLeft; + DWORD m_armorRefineEffect; + + struct SMoveAfterFunc + { + UINT eFunc; + UINT uArg; + + // For Emotion Function + UINT uArgExpanded; + TPixelPosition kPosDst; + }; + + SMoveAfterFunc m_kMovAfterFunc; + + float m_fDstRot; + float m_fAtkPosTime; + float m_fRotSpd; + float m_fMaxRotSpd; + + BOOL m_bEnableTCPState; + + // Graphic Instance + CActorInstance m_GraphicThingInstance; + + + protected: + struct SCommand + { + DWORD m_dwChkTime; + DWORD m_dwCmdTime; + float m_fDstRot; + UINT m_eFunc; + UINT m_uArg; + UINT m_uTargetVID; + TPixelPosition m_kPPosDst; + }; + + typedef std::list CommandQueue; + + DWORD m_dwBaseChkTime; + DWORD m_dwBaseCmdTime; + + DWORD m_dwSkipTime; + + CommandQueue m_kQue_kCmdNew; + + BOOL m_bDamageEffectType; + + struct SEffectDamage + { + DWORD damage; + BYTE flag; + BOOL bSelf; + BOOL bTarget; + }; + + typedef std::list CommandDamageQueue; + CommandDamageQueue m_DamageQueue; + + void ProcessDamage(); + + public: + void AddDamageEffect(DWORD damage,BYTE flag,BOOL bSelf,BOOL bTarget); + + protected: + struct SWarrior + { + DWORD m_dwGeomgyeongEffect; + }; + + SWarrior m_kWarrior; + + void __Warrior_Initialize(); + + public: + static void ClearPVPKeySystem(); + + static void InsertPVPKey(DWORD dwSrcVID, DWORD dwDstVID); + static void InsertPVPReadyKey(DWORD dwSrcVID, DWORD dwDstVID); + static void RemovePVPKey(DWORD dwSrcVID, DWORD dwDstVID); + + static void InsertGVGKey(DWORD dwSrcGuildVID, DWORD dwDstGuildVID); + static void RemoveGVGKey(DWORD dwSrcGuildVID, DWORD dwDstGuildVID); + + static void InsertDUELKey(DWORD dwSrcVID, DWORD dwDstVID); + + UINT GetNameColorIndex(); + + const D3DXCOLOR& GetNameColor(); + const D3DXCOLOR& GetTitleColor(); + + protected: + static DWORD __GetPVPKey(DWORD dwSrcVID, DWORD dwDstVID); + static bool __FindPVPKey(DWORD dwSrcVID, DWORD dwDstVID); + static bool __FindPVPReadyKey(DWORD dwSrcVID, DWORD dwDstVID); + static bool __FindGVGKey(DWORD dwSrcGuildID, DWORD dwDstGuildID); + static bool __FindDUELKey(DWORD dwSrcGuildID, DWORD dwDstGuildID); + + protected: + CActorInstance::IEventHandler* GetEventHandlerPtr(); + CActorInstance::IEventHandler& GetEventHandlerRef(); + + protected: + static float __GetBackgroundHeight(float x, float y); + static DWORD __GetShadowMapColor(float x, float y); + + public: + static void ResetPerformanceCounter(); + static void GetInfo(std::string* pstInfo); + + public: + static CInstanceBase* New(); + static void Delete(CInstanceBase* pkInst); + + static CDynamicPool ms_kPool; + + protected: + static DWORD ms_dwUpdateCounter; + static DWORD ms_dwRenderCounter; + static DWORD ms_dwDeformCounter; + + public: + DWORD GetDuelMode(); + void SetDuelMode(DWORD type); + protected: + DWORD m_dwDuelMode; + DWORD m_dwEmoticonTime; + public: + DWORD GetLevel() const { return m_dwLevel; } + void SetLevel(DWORD dwLvl); +}; + +inline int RaceToJob(int race) +{ + const int JOB_NUM = 4; + return race % JOB_NUM; +} + +inline int RaceToSex(int race) +{ + switch (race) + { + case 0: + case 2: + case 5: + case 7: + return 1; + case 1: + case 3: + case 4: + case 6: + return 0; + + } + return 0; +} \ No newline at end of file diff --git a/extension/src/port/UserInterface/InsultChecker.h b/extension/src/port/UserInterface/InsultChecker.h new file mode 100644 index 00000000..527884d2 --- /dev/null +++ b/extension/src/port/UserInterface/InsultChecker.h @@ -0,0 +1,24 @@ +#pragma once + +class CInsultChecker +{ + public: + CInsultChecker& GetSingleton(); + + public: + CInsultChecker(); + virtual ~CInsultChecker(); + + void Clear(); + + void AppendInsult(const std::string& c_rstInsult); + bool IsInsultIn(const char* c_szLine, UINT uLineLen); + void FilterInsult(char* szLine, UINT uLineLen); + + private: + bool __GetInsultLength(const char* c_szWord, UINT* puInsultLen); + bool __IsInsult(const char* c_szWord); + + private: + std::list m_kList_stInsult; +}; diff --git a/extension/src/port/UserInterface/Locale.h b/extension/src/port/UserInterface/Locale.h new file mode 100644 index 00000000..d1630429 --- /dev/null +++ b/extension/src/port/UserInterface/Locale.h @@ -0,0 +1,36 @@ +#pragma once + +#include "Locale_inc.h" + +bool LocaleService_IsYMIR(); +bool LocaleService_IsJAPAN(); +bool LocaleService_IsENGLISH(); +bool LocaleService_IsHONGKONG(); +bool LocaleService_IsTAIWAN(); +bool LocaleService_IsNEWCIBN(); +bool LocaleService_IsEUROPE(); +bool LocaleService_IsWorldEdition(); + +unsigned LocaleService_GetCodePage(); +const char* LocaleService_GetName(); +const char* LocaleService_GetLocaleName(); +const char* LocaleService_GetLocalePath(); +const char* LocaleService_GetSecurityKey(); +BOOL LocaleService_IsLeadByte( const char chByte ); +int LocaleService_StringCompareCI( LPCSTR szStringLeft, LPCSTR szStringRight, size_t sizeLength ); + +void LocaleService_ForceSetLocale(const char* name, const char* localePath); +void LocaleService_LoadConfig(const char* fileName); +bool LocaleService_LoadGlobal(HINSTANCE hInstance); +unsigned LocaleService_GetLastExp(int level); +int LocaleService_GetSkillPower(unsigned level); + +// CHEONMA +void LocaleService_SetCHEONMA(bool isEnable); +bool LocaleService_IsCHEONMA(); +// END_OF_CHEONMA + +#ifdef USE_OPENID +void LocaleService_SetOpenIDAuthKey(const char *authKey); +const char* LocaleService_GetOpenIDAuthKey(); +#endif \ No newline at end of file diff --git a/extension/src/port/UserInterface/Locale_inc.h b/extension/src/port/UserInterface/Locale_inc.h new file mode 100644 index 00000000..0f4007d0 --- /dev/null +++ b/extension/src/port/UserInterface/Locale_inc.h @@ -0,0 +1,6 @@ +#define LOCALE_SERVICE_SINGAPORE // 싱가폴 +#define ENABLE_COSTUME_SYSTEM +#define ENABLE_ENERGY_SYSTEM +#define ENABLE_DRAGON_SOUL_SYSTEM +#define ENABLE_NEW_EQUIPMENT_SYSTEM +//#define ENABLE_DISCORD_RPC diff --git a/extension/src/port/UserInterface/MarkImage.h b/extension/src/port/UserInterface/MarkImage.h new file mode 100644 index 00000000..b68447ab --- /dev/null +++ b/extension/src/port/UserInterface/MarkImage.h @@ -0,0 +1,110 @@ +#ifndef __INC_METIN_II_MARKIMAGE_H__ +#define __INC_METIN_II_MARKIMAGE_H__ + +#include // PORT: normalize the Win32 SDK include case for case-sensitive hosts + +typedef unsigned long Pixel; + +struct SGuildMark +{ + enum + { + WIDTH = 16, + HEIGHT = 12, + SIZE = WIDTH * HEIGHT, + }; + + /////////////////////////////////////////////////////////////////////////////// + Pixel m_apxBuf[SIZE]; // 실제 이미지 + + /////////////////////////////////////////////////////////////////////////////// + void Clear(); + bool IsEmpty(); +}; + +struct SGuildMarkBlock +{ + enum + { + MARK_PER_BLOCK_WIDTH = 4, + MARK_PER_BLOCK_HEIGHT = 4, + + WIDTH = SGuildMark::WIDTH * MARK_PER_BLOCK_WIDTH, + HEIGHT = SGuildMark::HEIGHT * MARK_PER_BLOCK_HEIGHT, + + SIZE = WIDTH * HEIGHT, + MAX_COMP_SIZE = (SIZE * sizeof(Pixel)) + ((SIZE * sizeof(Pixel)) >> 4) + 64 + 3 + }; + + /////////////////////////////////////////////////////////////////////////////// + Pixel m_apxBuf[SIZE]; // 실제 이미지 + + BYTE m_abCompBuf[MAX_COMP_SIZE]; // 압축된 데이터 + size_t m_sizeCompBuf; // 압축된 크기 + DWORD m_crc; // 압축된 데이터의 CRC + + /////////////////////////////////////////////////////////////////////////////// + DWORD GetCRC() const; + + void CopyFrom(const BYTE * pbCompBuf, DWORD dwCompSize, DWORD crc); + void Compress(const Pixel * pxBuf); +}; + +class CGuildMarkImage +{ + public: + enum + { + WIDTH = 512, + HEIGHT = 512, + + BLOCK_ROW_COUNT = HEIGHT / SGuildMarkBlock::HEIGHT, // 10 + BLOCK_COL_COUNT = WIDTH / SGuildMarkBlock::WIDTH, // 8 + + BLOCK_TOTAL_COUNT = BLOCK_ROW_COUNT * BLOCK_COL_COUNT, // 80 + + MARK_ROW_COUNT = BLOCK_ROW_COUNT * SGuildMarkBlock::MARK_PER_BLOCK_HEIGHT, // 40 + MARK_COL_COUNT = BLOCK_COL_COUNT * SGuildMarkBlock::MARK_PER_BLOCK_WIDTH, // 32 + + MARK_TOTAL_COUNT = MARK_ROW_COUNT * MARK_COL_COUNT, // 1280 + + INVALID_MARK_POSITION = 0xffffffff, + }; + + CGuildMarkImage(); + virtual ~CGuildMarkImage(); + + void Create(); + void Destroy(); + + bool Build(const char * c_szFileName); + bool Save(const char* c_szFileName); + bool Load(const char* c_szFileName); + + void PutData(UINT x, UINT y, UINT width, UINT height, void* data); + void GetData(UINT x, UINT y, UINT width, UINT height, void* data); + + bool SaveMark(DWORD posMark, BYTE * pbMarkImage); + bool DeleteMark(DWORD posMark); + bool SaveBlockFromCompressedData(DWORD posBlock, const BYTE * pbComp, DWORD dwCompSize); // 서버 -> 클라이언트 + + DWORD GetEmptyPosition(); // 빈 마크 위치를 얻는다. + + void GetBlockCRCList(DWORD * crcList); + void GetDiffBlocks(const DWORD * crcList, std::map & mapDiffBlocks); + + private: + enum + { + INVALID_HANDLE = 0xffffffff, + }; + + void BuildAllBlocks(); + + SGuildMarkBlock m_aakBlock[BLOCK_ROW_COUNT][BLOCK_COL_COUNT]; + Pixel m_apxImage[WIDTH * HEIGHT * sizeof(Pixel)]; + + ILuint m_uImg; +}; + +#endif diff --git a/extension/src/port/UserInterface/MarkManager.h b/extension/src/port/UserInterface/MarkManager.h new file mode 100644 index 00000000..90df0579 --- /dev/null +++ b/extension/src/port/UserInterface/MarkManager.h @@ -0,0 +1,82 @@ +#ifndef __INC_METIN_II_GUILDLIB_MARK_MANAGER_H__ +#define __INC_METIN_II_GUILDLIB_MARK_MANAGER_H__ + +#include "MarkImage.h" + +class CGuildMarkManager : public singleton +{ + public: + enum + { + MAX_IMAGE_COUNT = 5, + INVALID_MARK_ID = 0xffffffff, + }; + + // Symbol + struct TGuildSymbol + { + DWORD crc; + std::vector raw; + }; + + CGuildMarkManager(); + virtual ~CGuildMarkManager(); + + const TGuildSymbol * GetGuildSymbol(DWORD GID); + bool LoadSymbol(const char* filename); + void SaveSymbol(const char* filename); + void UploadSymbol(DWORD guildID, int iSize, const BYTE* pbyData); + + // + // Mark + // + void SetMarkPathPrefix(const char * prefix); + + bool LoadMarkIndex(); // 마크 인덱스 불러오기 (서버에서만 사용) + bool SaveMarkIndex(); // 마크 인덱스 저장하기 + + void LoadMarkImages(); // 모든 마크 이미지를 불러오기 + void SaveMarkImage(DWORD imgIdx); // 마크 이미지 저장 + + bool GetMarkImageFilename(DWORD imgIdx, std::string & path) const; + bool AddMarkIDByGuildID(DWORD guildID, DWORD markID); + DWORD GetMarkImageCount() const; + DWORD GetMarkCount() const; + DWORD GetMarkID(DWORD guildID); + + // SERVER + void CopyMarkIdx(char * pcBuf) const; + DWORD SaveMark(DWORD guildID, BYTE * pbMarkImage); + void DeleteMark(DWORD guildID); + void GetDiffBlocks(DWORD imgIdx, const DWORD * crcList, std::map & mapDiffBlocks); + + // CLIENT + bool SaveBlockFromCompressedData(DWORD imgIdx, DWORD idBlock, const BYTE * pbBlock, DWORD dwSize); + bool GetBlockCRCList(DWORD imgIdx, DWORD * crcList); + + private: + // + // Mark + // + CGuildMarkImage * __NewImage(); + void __DeleteImage(CGuildMarkImage * pkImgDel); + + DWORD __AllocMarkID(DWORD guildID); + + CGuildMarkImage * __GetImage(DWORD imgIdx); + CGuildMarkImage * __GetImagePtr(DWORD idMark); + + std::map m_mapIdx_Image; // index = image index + std::map m_mapGID_MarkID; // index = guild id + + std::set m_setFreeMarkID; + std::string m_pathPrefix; + + private: + // + // Symbol + // + std::map m_mapSymbol; +}; + +#endif diff --git a/extension/src/port/UserInterface/MovieMan.h b/extension/src/port/UserInterface/MovieMan.h new file mode 100644 index 00000000..39f8eadb --- /dev/null +++ b/extension/src/port/UserInterface/MovieMan.h @@ -0,0 +1,83 @@ +#pragma once + +// 페이드아웃 길이(초) +#define MOVIEMAN_FADE_DURATION 1300 +#define MOVIEMAN_SKIPPABLE_YES true +#define MOVIEMAN_POSTEFFECT_FADEOUT 1 + +// 동영상 재생에 DX 7.0 사용 +struct IDirectDraw; +struct IDirectDrawSurface; +struct IDirectDrawMediaStream; +struct IGraphBuilder; +struct IBasicAudio; +struct IMultiMediaStream; +struct IAMMultiMediaStream; + +const GUID CLSID_MP43DMOCodec = { 0xcba9e78b, 0x49a3, 0x49ea, 0x93, 0xd4, 0x6b, 0xcb, 0xa8, 0xc4, 0xde, 0x07 }; +const GUID CLSID_MP4VideoCodec = { 0x82ccd3e0, 0xf71a, 0x11d0, 0x9f, 0xe5, 0x0, 0x60, 0x97, 0x78, 0xea, 0x66 }; +const GUID CLSID_MP3AudioCodec = { 0x38be3000, 0xdbf4, 0x11d0, 0x86, 0x0e, 0x0, 0xa0, 0x24, 0xcf, 0xef, 0x6d }; +const GUID CLSID_DIrectSoundRenderer = { 0x79376820, 0x07D0, 0x11CF, 0xA2, 0x4D, 0x0, 0x20, 0xAF, 0xD7, 0x97, 0x67 }; + +class CMovieMan : public CSingleton +{ +public: + CMovieMan() + : m_movieWidth(0), + m_movieHeight(0), + m_usingRGB32(false), + m_pPrimarySurface(NULL), + m_pBasicAudio(NULL) + { + // PORT: COM initializes only on the 40250 Windows video backend. +#ifdef _WIN32 + CoInitialize(NULL); +#endif + }; + + virtual ~CMovieMan() + { +#ifdef _WIN32 + CoUninitialize(); +#endif + }; + + void ClearToBlack(); + void PlayLogo(const char *pcszName); + void PlayIntro(); + BOOL PlayTutorial(LONG nIdx); + +private: + bool m_usingRGB32; + int m_movieWidth; + int m_movieHeight; + RECT m_movieRect; + IDirectDrawSurface* m_pPrimarySurface; + IBasicAudio* m_pBasicAudio; + + void FillRect(RECT& fillRect, DWORD fillColor); + inline void GDIFillRect(RECT& fillRect, DWORD fillColor); + inline void GDIBlt(IDirectDrawSurface *pSrcSurface, RECT *pDestRect); + + void GetWindowRect(RECT& windowRect); + void CalcMovieRect(int srcWidth, int srcHeight, RECT& movieRect); + void CalcBackgroundRect(const RECT& movieRect, RECT& upperRect, RECT& lowerRect); + + BOOL PlayMovie(const char *cpFileName, const bool bSkipAllowed = FALSE, const int nPostEffectID = 0, const DWORD dwPostEffectData = 0); + + HRESULT BuildFilterGraphManually( + WCHAR* wpFilename, + IAMMultiMediaStream *pAMStream, + const GUID FAR clsidSplitter, + const GUID FAR clsidVideoCodec, + const GUID FAR clsidAudioCodec); + + HRESULT RenderFileToMMStream(const char *cpFilename, IMultiMediaStream **ppMMStream, IDirectDraw *pDD); + HRESULT RenderStreamToSurface(IDirectDrawSurface *pSurface, IDirectDrawMediaStream *pDDStream, IMultiMediaStream *pMMStream, bool bSkipAllowed, int nPostEffectID, DWORD dwPostEffectData); + HRESULT RenderPostEffectFadeOut(IDirectDrawSurface *pSurface, int fadeOutDuration, DWORD fadeOutColor); + +//#ifdef _DEBUG +// HRESULT AddToRot(IGraphBuilder* pGraphBuilder, DWORD *pdwRegister); +// void RemoveFromRot(DWORD pdwRegister); +//#endif +}; diff --git a/extension/src/port/UserInterface/Packet.h b/extension/src/port/UserInterface/Packet.h new file mode 100644 index 00000000..9cf6c11d --- /dev/null +++ b/extension/src/port/UserInterface/Packet.h @@ -0,0 +1,2813 @@ +#pragma once + +#ifdef USE_AHNLAB_HACKSHIELD +#include "Hackshield.h" +#include METIN2HS_INCLUDE_ANTICPXSVR +#else +#pragma pack(push) //기존 alignment 저장 +#pragma pack(8) + +#define ANTICPX_TRANS_BUFFER_MAX 400 + +typedef struct _AHNHS_TRANS_BUFFER +{ + unsigned char byBuffer[ANTICPX_TRANS_BUFFER_MAX/* 송수신 패킷의 최대 크기 */]; + unsigned short nLength; +} AHNHS_TRANS_BUFFER, *PAHNHS_TRANS_BUFFER; + +#pragma pack(pop) // 기존 alignment 복구. +#endif /* !USE_AHNLAB_HACKSHIELD */ + +#include "../GameLib/RaceData.h" + +typedef BYTE TPacketHeader; + +enum +{ + ///////////////////////////////////////////////// + // To Server + // HEADER_BLANK is the not use(for future use) + HEADER_CG_LOGIN = 1, + HEADER_CG_ATTACK = 2, + HEADER_CG_CHAT = 3, + HEADER_CG_PLAYER_CREATE = 4, // 새로운 플래이어를 생성 + HEADER_CG_PLAYER_DESTROY = 5, // 플래이어를 삭제. + HEADER_CG_PLAYER_SELECT = 6, + HEADER_CG_CHARACTER_MOVE = 7, + HEADER_CG_SYNC_POSITION = 8, + HEADER_CG_DIRECT_ENTER = 9, + HEADER_CG_ENTERGAME = 10, + HEADER_CG_ITEM_USE = 11, + HEADER_CG_ITEM_DROP = 12, + HEADER_CG_ITEM_MOVE = 13, + HEADER_CG_ITEM_PICKUP = 15, + HEADER_CG_QUICKSLOT_ADD = 16, + HEADER_CG_QUICKSLOT_DEL = 17, + HEADER_CG_QUICKSLOT_SWAP = 18, + HEADER_CG_WHISPER = 19, + HEADER_CG_ITEM_DROP2 = 20, + //HEADER_BLANK21 = 21, + //HEADER_BLANK22 = 22, + //HEADER_BLANK22 = 23, + //HEADER_BLANK24 = 24, + //HEADER_BLANK25 = 25, + HEADER_CG_ON_CLICK = 26, + HEADER_CG_EXCHANGE = 27, + HEADER_CG_CHARACTER_POSITION = 28, + HEADER_CG_SCRIPT_ANSWER = 29, + HEADER_CG_QUEST_INPUT_STRING = 30, + HEADER_CG_QUEST_CONFIRM = 31, + //HEADER_BLANK32 = 32, + //HEADER_BLANK33 = 33, + //HEADER_BLANK34 = 34, + //HEADER_BLANK35 = 35, + //HEADER_BLANK36 = 36, + //HEADER_BLANK37 = 37, + //HEADER_BLANK38 = 38, + //HEADER_BLANK39 = 39, + //HEADER_BLANK40 = 40, + HEADER_CG_PVP = 41, + //HEADER_BLANK42 = 42, + //HEADER_BLANK43 = 43, + //HEADER_BLANK44 = 44, + //HEADER_BLANK45 = 45, + //HEADER_BLANK46 = 46, + //HEADER_BLANK47 = 47, + //HEADER_BLANK48 = 48, + //HEADER_BLANK49 = 49, + HEADER_CG_SHOP = 50, + HEADER_CG_FLY_TARGETING = 51, + HEADER_CG_USE_SKILL = 52, + HEADER_CG_ADD_FLY_TARGETING = 53, + HEADER_CG_SHOOT = 54, + HEADER_CG_MYSHOP = 55, + //HEADER_BLANK56 = 56, + //HEADER_BLANK57 = 57, + //HEADER_BLANK58 = 58, + //HEADER_BLANK59 = 59, + HEADER_CG_ITEM_USE_TO_ITEM = 60, + HEADER_CG_TARGET = 61, + //HEADER_BLANK62 = 62, + //HEADER_BLANK63 = 63, + //HEADER_BLANK64 = 64, + HEADER_CG_WARP = 65, + HEADER_CG_SCRIPT_BUTTON = 66, + HEADER_CG_MESSENGER = 67, + //HEADER_BLANK68 = 68, + HEADER_CG_MALL_CHECKOUT = 69, + HEADER_CG_SAFEBOX_CHECKIN = 70, // 아이템을 창고에 넣는다. + HEADER_CG_SAFEBOX_CHECKOUT = 71, // 아이템을 창고로 부터 빼온다. + HEADER_CG_PARTY_INVITE = 72, + HEADER_CG_PARTY_INVITE_ANSWER = 73, + HEADER_CG_PARTY_REMOVE = 74, + HEADER_CG_PARTY_SET_STATE = 75, + HEADER_CG_PARTY_USE_SKILL = 76, + HEADER_CG_SAFEBOX_ITEM_MOVE = 77, + HEADER_CG_PARTY_PARAMETER = 78, + //HEADER_BLANK68 = 79, + HEADER_CG_GUILD = 80, + HEADER_CG_ANSWER_MAKE_GUILD = 81, + HEADER_CG_FISHING = 82, + HEADER_CG_GIVE_ITEM = 83, + //HEADER_BLANK84 = 84, + //HEADER_BLANK85 = 85, + //HEADER_BLANK86 = 86, + //HEADER_BLANK87 = 87, + //HEADER_BLANK88 = 88, + //HEADER_BLANK89 = 89, + HEADER_CG_EMPIRE = 90, + //HEADER_BLANK91 = 91, + //HEADER_BLANK92 = 92, + //HEADER_BLANK93 = 93, + //HEADER_BLANK94 = 94, + //HEADER_BLANK95 = 95, + HEADER_CG_REFINE = 96, + //HEADER_BLANK97 = 97, + //HEADER_BLANK98 = 98, + //HEADER_BLANK99 = 99, + + HEADER_CG_MARK_LOGIN = 100, + HEADER_CG_MARK_CRCLIST = 101, + HEADER_CG_MARK_UPLOAD = 102, + HEADER_CG_MARK_IDXLIST = 104, + + HEADER_CG_CRC_REPORT = 103, + + HEADER_CG_HACK = 105, + HEADER_CG_CHANGE_NAME = 106, + HEADER_CG_SMS = 107, + HEADER_CG_CHINA_MATRIX_CARD = 108, + HEADER_CG_LOGIN2 = 109, + HEADER_CG_DUNGEON = 110, + HEADER_CG_LOGIN3 = 111, + HEADER_CG_GUILD_SYMBOL_UPLOAD = 112, + HEADER_CG_GUILD_SYMBOL_CRC = 113, + HEADER_CG_SCRIPT_SELECT_ITEM = 114, + HEADER_CG_LOGIN4 = 115, + HEADER_CG_LOGIN5_OPENID = 116, //OpenID : 실행시 받은 인증키를 서버에 보냄. + + HEADER_CG_RUNUP_MATRIX_ANSWER = 201, + HEADER_CG_NEWCIBN_PASSPOD_ANSWER = 202, + + HEADER_CG_HS_ACK = 203, + HEADER_CG_XTRAP_ACK = 204, + + HEADER_CG_DRAGON_SOUL_REFINE = 205, + HEADER_CG_STATE_CHECKER = 206, + +#ifdef __AUCTION__ + HEADER_CG_AUCTION_CMD = 205, +#endif + + HEADER_CG_KEY_AGREEMENT = 0xfb, // _IMPROVED_PACKET_ENCRYPTION_ + HEADER_CG_TIME_SYNC = 0xfc, + HEADER_CG_CLIENT_VERSION = 0xfd, + HEADER_CG_CLIENT_VERSION2 = 0xf1, + HEADER_CG_PONG = 0xfe, + HEADER_CG_HANDSHAKE = 0xff, + ///////////////////////////////////////////////// + // From Server + + HEADER_GC_CHARACTER_ADD = 1, + HEADER_GC_CHARACTER_DEL = 2, + HEADER_GC_CHARACTER_MOVE = 3, + HEADER_GC_CHAT = 4, + HEADER_GC_SYNC_POSITION = 5, + HEADER_GC_LOGIN_SUCCESS3 = 6, + HEADER_GC_LOGIN_FAILURE = 7, + HEADER_GC_PLAYER_CREATE_SUCCESS = 8, + HEADER_GC_PLAYER_CREATE_FAILURE = 9, + HEADER_GC_PLAYER_DELETE_SUCCESS = 10, + HEADER_GC_PLAYER_DELETE_WRONG_SOCIAL_ID = 11, + // 12 + HEADER_GC_STUN = 13, + HEADER_GC_DEAD = 14, + + HEADER_GC_MAIN_CHARACTER = 15, + HEADER_GC_PLAYER_POINTS = 16, + HEADER_GC_PLAYER_POINT_CHANGE = 17, + HEADER_GC_CHANGE_SPEED = 18, + HEADER_GC_CHARACTER_UPDATE = 19, +#if defined(GAIDEN) + HEADER_GC_ITEM_DEL = 20, // 아이템 창에 추가 + HEADER_GC_ITEM_SET = 21, // 아이템 창에 추가 +#else + HEADER_GC_ITEM_SET = 20, // 아이템 창에 추가 + HEADER_GC_ITEM_SET2 = 21, // 아이템 창에 추가 +#endif + HEADER_GC_ITEM_USE = 22, // 아이템 사용 (주위 사람들에게 보여주기 위해) + HEADER_GC_ITEM_DROP = 23, // 아이템 버리기 + HEADER_GC_ITEM_UPDATE = 25, // 아이템 수치 업데이트 + HEADER_GC_ITEM_GROUND_ADD = 26, // 바닥에 아이템 추가 + HEADER_GC_ITEM_GROUND_DEL = 27, // 바닥에서 아이템 삭제 + HEADER_GC_QUICKSLOT_ADD = 28, + HEADER_GC_QUICKSLOT_DEL = 29, + HEADER_GC_QUICKSLOT_SWAP = 30, + HEADER_GC_ITEM_OWNERSHIP = 31, + HEADER_GC_LOGIN_SUCCESS4 = 32, + HEADER_GC_ITEM_UNBIND_TIME = 33, + HEADER_GC_WHISPER = 34, + HEADER_GC_ALERT = 35, + + HEADER_GC_MOTION = 36, + + HEADER_GC_SHOP = 38, + HEADER_GC_SHOP_SIGN = 39, + + // 39 ~ 41 Balnk + HEADER_GC_DUEL_START = 40, + HEADER_GC_PVP = 41, + HEADER_GC_EXCHANGE = 42, + HEADER_GC_CHARACTER_POSITION = 43, + + HEADER_GC_PING = 44, + + HEADER_GC_SCRIPT = 45, + HEADER_GC_QUEST_CONFIRM = 46, + + HEADER_GC_MOUNT = 61, + HEADER_GC_OWNERSHIP = 62, + HEADER_GC_TARGET = 63, + HEADER_GC_WARP = 65, + HEADER_GC_ADD_FLY_TARGETING = 69, + + HEADER_GC_CREATE_FLY = 70, + HEADER_GC_FLY_TARGETING = 71, + HEADER_GC_SKILL_LEVEL = 72, + HEADER_GC_SKILL_COOLTIME_END = 73, + HEADER_GC_MESSENGER = 74, + HEADER_GC_GUILD = 75, + HEADER_GC_SKILL_LEVEL_NEW = 76, + + HEADER_GC_PARTY_INVITE = 77, + HEADER_GC_PARTY_ADD = 78, + HEADER_GC_PARTY_UPDATE = 79, + HEADER_GC_PARTY_REMOVE = 80, + + HEADER_GC_QUEST_INFO = 81, + HEADER_GC_REQUEST_MAKE_GUILD = 82, + HEADER_GC_PARTY_PARAMETER = 83, + + HEADER_GC_SAFEBOX_MONEY_CHANGE = 84, + HEADER_GC_SAFEBOX_SET = 85, + HEADER_GC_SAFEBOX_DEL = 86, + HEADER_GC_SAFEBOX_WRONG_PASSWORD = 87, + HEADER_GC_SAFEBOX_SIZE = 88, + + HEADER_GC_FISHING = 89, + + HEADER_GC_EMPIRE = 90, + + HEADER_GC_PARTY_LINK = 91, + HEADER_GC_PARTY_UNLINK = 92, + + HEADER_GC_REFINE_INFORMATION = 95, + + HEADER_GC_OBSERVER_ADD = 96, + HEADER_GC_OBSERVER_REMOVE = 97, + HEADER_GC_OBSERVER_MOVE = 98, + HEADER_GC_VIEW_EQUIP = 99, + + HEADER_GC_MARK_BLOCK = 100, + HEADER_GC_MARK_DIFF_DATA = 101, + HEADER_GC_MARK_IDXLIST = 102, + + //HEADER_GC_SLOW_TIMER = 105, + HEADER_GC_TIME = 106, + HEADER_GC_CHANGE_NAME = 107, + + HEADER_GC_DUNGEON = 110, + HEADER_GC_WALK_MODE = 111, + HEADER_GC_CHANGE_SKILL_GROUP = 112, + +#if defined(GAIDEN) + HEADER_GC_MAIN_CHARACTER = 113, + HEADER_GC_MAIN_CHARACTER3_BGM = 137, + HEADER_GC_MAIN_CHARACTER4_BGM_VOL = 138, +#else + // SUPPORT_BGM + HEADER_GC_MAIN_CHARACTER2_EMPIRE = 113, + // END_OF_SUPPORT_BGM +#endif + + HEADER_GC_SEPCIAL_EFFECT = 114, + HEADER_GC_NPC_POSITION = 115, + + HEADER_GC_CHINA_MATRIX_CARD = 116, + HEADER_GC_CHARACTER_UPDATE2 = 117, + HEADER_GC_LOGIN_KEY = 118, + HEADER_GC_REFINE_INFORMATION_NEW = 119, + HEADER_GC_CHARACTER_ADD2 = 120, + HEADER_GC_CHANNEL = 121, + + HEADER_GC_MALL_OPEN = 122, + HEADER_GC_TARGET_UPDATE = 123, + HEADER_GC_TARGET_DELETE = 124, + HEADER_GC_TARGET_CREATE_NEW = 125, + + HEADER_GC_AFFECT_ADD = 126, + HEADER_GC_AFFECT_REMOVE = 127, + + HEADER_GC_MALL_SET = 128, + HEADER_GC_MALL_DEL = 129, + HEADER_GC_LAND_LIST = 130, + HEADER_GC_LOVER_INFO = 131, + HEADER_GC_LOVE_POINT_UPDATE = 132, + HEADER_GC_GUILD_SYMBOL_DATA = 133, + HEADER_GC_DIG_MOTION = 134, + + HEADER_GC_DAMAGE_INFO = 135, + HEADER_GC_CHAR_ADDITIONAL_INFO = 136, + + // SUPPORT_BGM + HEADER_GC_MAIN_CHARACTER3_BGM = 137, + HEADER_GC_MAIN_CHARACTER4_BGM_VOL = 138, + // END_OF_SUPPORT_BGM + + HEADER_GC_AUTH_SUCCESS = 150, + HEADER_GC_PANAMA_PACK = 151, + + //HYBRID CRYPT + HEADER_GC_HYBRIDCRYPT_KEYS = 152, + HEADER_GC_HYBRIDCRYPT_SDB = 153, // SDB means Supplmentary Data Blocks + //HYBRID CRYPT + + HEADER_GC_AUTH_SUCCESS_OPENID = 154, + + HEADER_GC_RUNUP_MATRIX_QUIZ = 201, + HEADER_GC_NEWCIBN_PASSPOD_REQUEST = 202, + HEADER_GC_NEWCIBN_PASSPOD_FAILURE = 203, +#if defined(GAIDEN) + HEADER_GC_ONTIME = 204, + HEADER_GC_RESET_ONTIME = 205, + + // AUTOBAN + HEADER_GC_AUTOBAN_QUIZ = 206, + // END_OF_AUTOBAN + + HEADER_GC_HS_REQUEST = 207, // Origially it's 204 on devel branch +#else + HEADER_GC_HS_REQUEST = 204, + HEADER_GC_XTRAP_CS1_REQUEST = 205, +#endif + +#ifdef __AUCTION__ + HEADER_GC_AUCTOIN_ITEM_LIST = 206, +#endif + + HEADER_GC_SPECIFIC_EFFECT = 208, + HEADER_GC_DRAGON_SOUL_REFINE = 209, + HEADER_GC_RESPOND_CHANNELSTATUS = 210, + + HEADER_GC_KEY_AGREEMENT_COMPLETED = 0xfa, // _IMPROVED_PACKET_ENCRYPTION_ + HEADER_GC_KEY_AGREEMENT = 0xfb, // _IMPROVED_PACKET_ENCRYPTION_ + HEADER_GC_HANDSHAKE_OK = 0xfc, // 252 + HEADER_GC_PHASE = 0xfd, // 253 + HEADER_GC_BINDUDP = 0xfe, // 254 + HEADER_GC_HANDSHAKE = 0xff, // 255 + + ///////////////////////////////////////////////// + // Client To Client for UDP + /* + HEADER_CC_STATE_WAITING = 1, + HEADER_CC_STATE_WALKING = 2, + HEADER_CC_STATE_GOING = 3, + HEADER_CC_EVENT_NORMAL_ATTACKING = 4, + HEADER_CC_EVENT_COMBO_ATTACKING = 5, + HEADER_CC_EVENT_HIT = 6, + */ +}; + +enum +{ + ID_MAX_NUM = 30, + PASS_MAX_NUM = 16, + CHAT_MAX_NUM = 128, + PATH_NODE_MAX_NUM = 64, + SHOP_SIGN_MAX_LEN = 32, + + PLAYER_PER_ACCOUNT3 = 3, + PLAYER_PER_ACCOUNT4 = 4, + + PLAYER_ITEM_SLOT_MAX_NUM = 20, // 플래이어의 슬롯당 들어가는 갯수. + + QUICKSLOT_MAX_LINE = 4, + QUICKSLOT_MAX_COUNT_PER_LINE = 8, // 클라이언트 임의 결정값 + QUICKSLOT_MAX_COUNT = QUICKSLOT_MAX_LINE * QUICKSLOT_MAX_COUNT_PER_LINE, + + QUICKSLOT_MAX_NUM = 36, // 서버와 맞춰져 있는 값 + + SHOP_HOST_ITEM_MAX_NUM = 40, + + METIN_SOCKET_COUNT = 6, + + PARTY_AFFECT_SLOT_MAX_NUM = 7, + + GUILD_GRADE_NAME_MAX_LEN = 8, + GUILD_NAME_MAX_LEN = 12, + GUILD_GRADE_COUNT = 15, + GULID_COMMENT_MAX_LEN = 50, + + MARK_CRC_NUM = 8*8, + MARK_DATA_SIZE = 16*12, + SYMBOL_DATA_SIZE = 128*256, + QUEST_INPUT_STRING_MAX_NUM = 64, + + PRIVATE_CODE_LENGTH = 8, + + REFINE_MATERIAL_MAX_NUM = 5, + + CHINA_MATRIX_ANSWER_MAX_LEN = 8, + + RUNUP_MATRIX_QUIZ_MAX_LEN = 8, + RUNUP_MATRIX_ANSWER_MAX_LEN = 4, + NEWCIBN_PASSPOD_ANSWER_MAX_LEN = 8, + NEWCIBN_PASSPOD_FAILURE_MAX_LEN = 128, + + WEAR_MAX_NUM = 11, + + OPENID_AUTHKEY_LEN = 32, + + SHOP_TAB_NAME_MAX = 32, + SHOP_TAB_COUNT_MAX = 3, +}; + +#pragma pack(push) +#pragma pack(1) + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Mark +typedef struct command_mark_login +{ + BYTE header; + DWORD handle; + DWORD random_key; +} TPacketCGMarkLogin; + +typedef struct command_mark_upload +{ + BYTE header; + DWORD gid; + BYTE image[16*12*4]; +} TPacketCGMarkUpload; + +typedef struct command_mark_idxlist +{ + BYTE header; +} TPacketCGMarkIDXList; + +typedef struct command_mark_crclist +{ + BYTE header; + BYTE imgIdx; + DWORD crclist[80]; +} TPacketCGMarkCRCList; + +typedef struct packet_mark_idxlist +{ + BYTE header; + DWORD bufSize; + WORD count; + //뒤에 size * (WORD + WORD)만큼 데이터 붙음 +} TPacketGCMarkIDXList; + +typedef struct packet_mark_block +{ + BYTE header; + DWORD bufSize; + BYTE imgIdx; + DWORD count; + // 뒤에 64 x 48 x 픽셀크기(4바이트) = 12288만큼 데이터 붙음 +} TPacketGCMarkBlock; + +typedef struct command_symbol_upload +{ + BYTE header; + WORD size; + DWORD handle; +} TPacketCGSymbolUpload; + +typedef struct command_symbol_crc +{ + BYTE header; + DWORD dwGuildID; + DWORD dwCRC; + DWORD dwSize; +} TPacketCGSymbolCRC; + +typedef struct packet_symbol_data +{ + BYTE header; + WORD size; + DWORD guild_id; +} TPacketGCGuildSymbolData; + +// +// +// +typedef struct packet_observer_add +{ + BYTE header; + DWORD vid; + WORD x; + WORD y; +} TPacketGCObserverAdd; + +typedef struct packet_observer_move +{ + BYTE header; + DWORD vid; + WORD x; + WORD y; +} TPacketGCObserverMove; + + +typedef struct packet_observer_remove +{ + BYTE header; + DWORD vid; +} TPacketGCObserverRemove; + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// To Server + +typedef struct command_checkin +{ + BYTE header; + char name[ID_MAX_NUM+1]; + char pwd[PASS_MAX_NUM+1]; +} TPacketCGCheckin; + +typedef struct command_login +{ + BYTE header; + char name[ID_MAX_NUM + 1]; + char pwd[PASS_MAX_NUM + 1]; +} TPacketCGLogin; + +// start - 권한 서버 접속을 위한 패킷들 +typedef struct command_login2 +{ + BYTE header; + char name[ID_MAX_NUM + 1]; + DWORD login_key; + DWORD adwClientKey[4]; +} TPacketCGLogin2; + +typedef struct command_login3 +{ + BYTE header; + char name[ID_MAX_NUM + 1]; + char pwd[PASS_MAX_NUM + 1]; + DWORD adwClientKey[4]; +} TPacketCGLogin3; + +typedef struct command_login5 +{ + BYTE header; + char authKey[OPENID_AUTHKEY_LEN + 1]; + DWORD adwClientKey[4]; +} TPacketCGLogin5; +// end - 권한 서버 접속을 위한 패킷들 + +typedef struct command_direct_enter +{ + BYTE bHeader; + char login[ID_MAX_NUM + 1]; + char passwd[PASS_MAX_NUM + 1]; + BYTE index; +} TPacketCGDirectEnter; + +typedef struct command_player_select +{ + BYTE header; + BYTE player_index; +} TPacketCGSelectCharacter; + +typedef struct command_attack +{ + BYTE header; + BYTE bType; // 공격 유형 + DWORD dwVictimVID; // 적 VID + BYTE bCRCMagicCubeProcPiece; + BYTE bCRCMagicCubeFilePiece; +} TPacketCGAttack; + +typedef struct command_chat +{ + BYTE header; + WORD length; + BYTE type; +} TPacketCGChat; + +typedef struct command_whisper +{ + BYTE bHeader; + WORD wSize; + char szNameTo[CHARACTER_NAME_MAX_LEN + 1]; +} TPacketCGWhisper; + +typedef struct command_sms +{ + BYTE bHeader; + WORD wSize; + char szNameTo[CHARACTER_NAME_MAX_LEN + 1]; +} TPacketCGSMS; + +enum EBattleMode +{ + BATTLEMODE_ATTACK = 0, + BATTLEMODE_DEFENSE = 1, +}; + +typedef struct command_EnterFrontGame +{ + BYTE header; +} TPacketCGEnterFrontGame; + +typedef struct command_item_use +{ + BYTE header; + TItemPos pos; +} TPacketCGItemUse; + +typedef struct command_item_use_to_item +{ + BYTE header; + TItemPos source_pos; + TItemPos target_pos; +} TPacketCGItemUseToItem; + +typedef struct command_item_drop +{ + BYTE header; + TItemPos pos; + DWORD elk; +} TPacketCGItemDrop; + +typedef struct command_item_drop2 +{ + BYTE header; + TItemPos pos; + DWORD gold; + BYTE count; +} TPacketCGItemDrop2; + +typedef struct command_item_move +{ + BYTE header; + TItemPos pos; + TItemPos change_pos; + BYTE num; +} TPacketCGItemMove; + +typedef struct command_item_pickup +{ + BYTE header; + DWORD vid; +} TPacketCGItemPickUp; + +typedef struct command_quickslot_add +{ + BYTE header; + BYTE pos; + TQuickSlot slot; +}TPacketCGQuickSlotAdd; + +typedef struct command_quickslot_del +{ + BYTE header; + BYTE pos; +}TPacketCGQuickSlotDel; + +typedef struct command_quickslot_swap +{ + BYTE header; + BYTE pos; + BYTE change_pos; +}TPacketCGQuickSlotSwap; + +typedef struct command_on_click +{ + BYTE header; + DWORD vid; +} TPacketCGOnClick; + + +enum +{ + SHOP_SUBHEADER_CG_END, + SHOP_SUBHEADER_CG_BUY, + SHOP_SUBHEADER_CG_SELL, + SHOP_SUBHEADER_CG_SELL2, +}; + +typedef struct command_shop +{ + BYTE header; + BYTE subheader; +} TPacketCGShop; + +enum +{ + EXCHANGE_SUBHEADER_CG_START, // arg1 == vid of target character + EXCHANGE_SUBHEADER_CG_ITEM_ADD, // arg1 == position of item + EXCHANGE_SUBHEADER_CG_ITEM_DEL, // arg1 == position of item + EXCHANGE_SUBHEADER_CG_ELK_ADD, // arg1 == amount of elk + EXCHANGE_SUBHEADER_CG_ACCEPT, // arg1 == not used + EXCHANGE_SUBHEADER_CG_CANCEL, // arg1 == not used +}; + +typedef struct command_exchange +{ + BYTE header; + BYTE subheader; + DWORD arg1; + BYTE arg2; + TItemPos Pos; +} TPacketCGExchange; + +typedef struct command_position +{ + BYTE header; + BYTE position; +} TPacketCGPosition; + +typedef struct command_script_answer +{ + BYTE header; + BYTE answer; +} TPacketCGScriptAnswer; + +typedef struct command_script_button +{ + BYTE header; + unsigned int idx; +} TPacketCGScriptButton; + +typedef struct command_target +{ + BYTE header; + DWORD dwVID; +} TPacketCGTarget; + +typedef struct command_move +{ + BYTE bHeader; + BYTE bFunc; + BYTE bArg; + BYTE bRot; + LONG lX; + LONG lY; + DWORD dwTime; +} TPacketCGMove; + +typedef struct command_sync_position_element +{ + DWORD dwVID; + long lX; + long lY; +} TPacketCGSyncPositionElement; + +typedef struct command_sync_position +{ + BYTE bHeader; + WORD wSize; +} TPacketCGSyncPosition; + +typedef struct command_fly_targeting +{ + BYTE bHeader; + DWORD dwTargetVID; + long lX; + long lY; +} TPacketCGFlyTargeting; + +typedef struct packet_fly_targeting +{ + BYTE bHeader; + DWORD dwShooterVID; + DWORD dwTargetVID; + long lX; + long lY; +} TPacketGCFlyTargeting; + +typedef struct packet_shoot +{ + BYTE bHeader; + BYTE bType; +} TPacketCGShoot; + +typedef struct command_warp +{ + BYTE bHeader; +} TPacketCGWarp; + +enum +{ + MESSENGER_SUBHEADER_GC_LIST, + MESSENGER_SUBHEADER_GC_LOGIN, + MESSENGER_SUBHEADER_GC_LOGOUT, + MESSENGER_SUBHEADER_GC_INVITE, + MESSENGER_SUBHEADER_GC_MOBILE, +}; + +typedef struct packet_messenger +{ + BYTE header; + WORD size; + BYTE subheader; +} TPacketGCMessenger; + +typedef struct packet_messenger_list_offline +{ + BYTE connected; // always 0 + BYTE length; +} TPacketGCMessengerListOffline; + +enum +{ + MESSENGER_CONNECTED_STATE_OFFLINE, + MESSENGER_CONNECTED_STATE_ONLINE, + MESSENGER_CONNECTED_STATE_MOBILE, +}; + +typedef struct packet_messenger_list_online +{ + BYTE connected; + BYTE length; + //BYTE length_char_name; +} TPacketGCMessengerListOnline; + +typedef struct packet_messenger_login +{ + //BYTE length_login; + //BYTE length_char_name; + BYTE length; +} TPacketGCMessengerLogin; + +typedef struct packet_messenger_logout +{ + BYTE length; +} TPacketGCMessengerLogout; + +enum +{ + MESSENGER_SUBHEADER_CG_ADD_BY_VID, + MESSENGER_SUBHEADER_CG_ADD_BY_NAME, + MESSENGER_SUBHEADER_CG_REMOVE, +}; + +typedef struct command_messenger +{ + BYTE header; + BYTE subheader; +} TPacketCGMessenger; + +typedef struct command_messenger_remove +{ + BYTE length; +} TPacketCGMessengerRemove; + +enum +{ + SAFEBOX_MONEY_STATE_SAVE, + SAFEBOX_MONEY_STATE_WITHDRAW, +}; + +typedef struct command_safebox_money +{ + BYTE bHeader; + BYTE bState; + DWORD dwMoney; +} TPacketCGSafeboxMoney; + +typedef struct command_safebox_checkout +{ + BYTE bHeader; + BYTE bSafePos; + TItemPos ItemPos; +} TPacketCGSafeboxCheckout; + +typedef struct command_safebox_checkin +{ + BYTE bHeader; + BYTE bSafePos; + TItemPos ItemPos; +} TPacketCGSafeboxCheckin; + +typedef struct command_mall_checkout +{ + BYTE bHeader; + BYTE bMallPos; + TItemPos ItemPos; +} TPacketCGMallCheckout; + +/////////////////////////////////////////////////////////////////////////////////// +// Party + +typedef struct command_use_skill +{ + BYTE bHeader; + DWORD dwVnum; + DWORD dwTargetVID; +} TPacketCGUseSkill; + +typedef struct command_party_invite +{ + BYTE header; + DWORD vid; +} TPacketCGPartyInvite; + +typedef struct command_party_invite_answer +{ + BYTE header; + DWORD leader_pid; + BYTE accept; +} TPacketCGPartyInviteAnswer; + +typedef struct command_party_remove +{ + BYTE header; + DWORD pid; +} TPacketCGPartyRemove; + +typedef struct command_party_set_state +{ + BYTE byHeader; + DWORD dwVID; + BYTE byState; + BYTE byFlag; +} TPacketCGPartySetState; + +typedef struct packet_party_link +{ + BYTE header; + DWORD pid; + DWORD vid; +} TPacketGCPartyLink; + +typedef struct packet_party_unlink +{ + BYTE header; + DWORD pid; + DWORD vid; +} TPacketGCPartyUnlink; + +typedef struct command_party_use_skill +{ + BYTE byHeader; + BYTE bySkillIndex; + DWORD dwTargetVID; +} TPacketCGPartyUseSkill; + +enum +{ + GUILD_SUBHEADER_CG_ADD_MEMBER, + GUILD_SUBHEADER_CG_REMOVE_MEMBER, + GUILD_SUBHEADER_CG_CHANGE_GRADE_NAME, + GUILD_SUBHEADER_CG_CHANGE_GRADE_AUTHORITY, + GUILD_SUBHEADER_CG_OFFER, + GUILD_SUBHEADER_CG_POST_COMMENT, + GUILD_SUBHEADER_CG_DELETE_COMMENT, + GUILD_SUBHEADER_CG_REFRESH_COMMENT, + GUILD_SUBHEADER_CG_CHANGE_MEMBER_GRADE, + GUILD_SUBHEADER_CG_USE_SKILL, + GUILD_SUBHEADER_CG_CHANGE_MEMBER_GENERAL, + GUILD_SUBHEADER_CG_GUILD_INVITE_ANSWER, + GUILD_SUBHEADER_CG_CHARGE_GSP, + GUILD_SUBHEADER_CG_DEPOSIT_MONEY, + GUILD_SUBHEADER_CG_WITHDRAW_MONEY, +}; + +typedef struct command_guild +{ + BYTE byHeader; + BYTE bySubHeader; +} TPacketCGGuild; + +typedef struct command_guild_answer_make_guild +{ + BYTE header; + char guild_name[GUILD_NAME_MAX_LEN+1]; +} TPacketCGAnswerMakeGuild; + +typedef struct command_give_item +{ + BYTE byHeader; + DWORD dwTargetVID; + TItemPos ItemPos; + BYTE byItemCount; +} TPacketCGGiveItem; + +typedef struct SPacketCGHack +{ + BYTE bHeader; + char szBuf[255 + 1]; +} TPacketCGHack; + +typedef struct command_dungeon +{ + BYTE bHeader; + WORD size; +} TPacketCGDungeon; + +// Private Shop +typedef struct SShopItemTable +{ + DWORD vnum; + BYTE count; + + TItemPos pos; // PC 상점에만 이용 + DWORD price; // PC 상점에만 이용 + BYTE display_pos; // PC 상점에만 이용, 보일 위치. +} TShopItemTable; + +typedef struct SPacketCGMyShop +{ + BYTE bHeader; + char szSign[SHOP_SIGN_MAX_LEN + 1]; + BYTE bCount; // count of TShopItemTable, max 39 +} TPacketCGMyShop; + +typedef struct SPacketCGRefine +{ + BYTE header; + BYTE pos; + BYTE type; +} TPacketCGRefine; + +typedef struct SPacketCGChangeName +{ + BYTE header; + BYTE index; + char name[CHARACTER_NAME_MAX_LEN+1]; +} TPacketCGChangeName; + +typedef struct command_client_version +{ + BYTE header; + char filename[32+1]; + char timestamp[32+1]; +} TPacketCGClientVersion; + +typedef struct command_client_version2 +{ + BYTE header; + char filename[32+1]; + char timestamp[32+1]; +} TPacketCGClientVersion2; + +typedef struct command_crc_report +{ + BYTE header; + BYTE byPackMode; + DWORD dwBinaryCRC32; + DWORD dwProcessCRC32; + DWORD dwRootPackCRC32; +} TPacketCGCRCReport; + +typedef struct command_china_matrix_card +{ + BYTE bHeader; + char szAnswer[CHINA_MATRIX_ANSWER_MAX_LEN + 1]; +} TPacketCGChinaMatrixCard; + +typedef struct command_runup_matrix_answer +{ + BYTE bHeader; + char szAnswer[RUNUP_MATRIX_ANSWER_MAX_LEN + 1]; +} TPacketCGRunupMatrixAnswer; + +typedef struct command_newcibn_passpod_answer +{ + BYTE bHeader; + char szAnswer[NEWCIBN_PASSPOD_ANSWER_MAX_LEN + 1]; +} TPacketCGNEWCIBNPasspodAnswer; + +enum EPartyExpDistributionType +{ + PARTY_EXP_DISTRIBUTION_NON_PARITY, + PARTY_EXP_DISTRIBUTION_PARITY, +}; + +typedef struct command_party_parameter +{ + BYTE bHeader; + BYTE bDistributeMode; +} TPacketCGPartyParameter; + +typedef struct command_quest_input_string +{ + BYTE bHeader; + char szString[QUEST_INPUT_STRING_MAX_NUM+1]; +} TPacketCGQuestInputString; + +typedef struct command_quest_confirm +{ + BYTE header; + BYTE answer; + DWORD requestPID; +} TPacketCGQuestConfirm; + +typedef struct command_script_select_item +{ + BYTE header; + DWORD selection; +} TPacketCGScriptSelectItem; + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// From Server +enum EPhase +{ + PHASE_CLOSE, // 끊기는 상태 (또는 끊기 전 상태) + PHASE_HANDSHAKE, // 악수..;; + PHASE_LOGIN, // 로그인 중 + PHASE_SELECT, // 캐릭터 선택 화면 + PHASE_LOADING, // 선택 후 로딩 화면 + PHASE_GAME, // 게임 화면 + PHASE_DEAD, // 죽었을 때.. (게임 안에 있는 것일 수도..) + + PHASE_DBCLIENT_CONNECTING, // 서버용 + PHASE_DBCLIENT, // 서버용 + PHASE_P2P, // 서버용 + PHASE_AUTH, // 로그인 인증 용 +}; + +typedef struct packet_phase +{ + BYTE header; + BYTE phase; +} TPacketGCPhase; + +typedef struct packet_blank // 공백패킷. +{ + BYTE header; +} TPacketGCBlank; + +typedef struct packet_blank_dynamic +{ + BYTE header; + WORD size; +} TPacketGCBlankDynamic; + +typedef struct packet_header_handshake +{ + BYTE header; + DWORD dwHandshake; + DWORD dwTime; + LONG lDelta; +} TPacketGCHandshake; + +typedef struct packet_header_bindudp +{ + BYTE header; + DWORD addr; + WORD port; +} TPacketGCBindUDP; + +typedef struct packet_header_dynamic_size +{ + BYTE header; + WORD size; +} TDynamicSizePacketHeader; + +typedef struct SSimplePlayerInformation +{ + DWORD dwID; + char szName[CHARACTER_NAME_MAX_LEN + 1]; + BYTE byJob; + BYTE byLevel; + DWORD dwPlayMinutes; + BYTE byST, byHT, byDX, byIQ; +// WORD wParts[CRaceData::PART_MAX_NUM]; + WORD wMainPart; + BYTE bChangeName; + WORD wHairPart; + BYTE bDummy[4]; + long x, y; + LONG lAddr; + WORD wPort; + BYTE bySkillGroup; +} TSimplePlayerInformation; + +typedef struct packet_login_success3 +{ + BYTE header; + TSimplePlayerInformation akSimplePlayerInformation[PLAYER_PER_ACCOUNT3]; + DWORD guild_id[PLAYER_PER_ACCOUNT3]; + char guild_name[PLAYER_PER_ACCOUNT3][GUILD_NAME_MAX_LEN+1]; + DWORD handle; + DWORD random_key; +} TPacketGCLoginSuccess3; + +typedef struct packet_login_success4 +{ + BYTE header; + TSimplePlayerInformation akSimplePlayerInformation[PLAYER_PER_ACCOUNT4]; + DWORD guild_id[PLAYER_PER_ACCOUNT4]; + char guild_name[PLAYER_PER_ACCOUNT4][GUILD_NAME_MAX_LEN+1]; + DWORD handle; + DWORD random_key; +} TPacketGCLoginSuccess4; + + +enum { LOGIN_STATUS_MAX_LEN = 8 }; +typedef struct packet_login_failure +{ + BYTE header; + char szStatus[LOGIN_STATUS_MAX_LEN + 1]; +} TPacketGCLoginFailure; + +typedef struct command_player_create +{ + BYTE header; + BYTE index; + char name[CHARACTER_NAME_MAX_LEN + 1]; + WORD job; + BYTE shape; + BYTE CON; + BYTE INT; + BYTE STR; + BYTE DEX; +} TPacketCGCreateCharacter; + +typedef struct command_player_create_success +{ + BYTE header; + BYTE bAccountCharacterSlot; + TSimplePlayerInformation kSimplePlayerInfomation; +} TPacketGCPlayerCreateSuccess; + +typedef struct command_create_failure +{ + BYTE header; + BYTE bType; +} TPacketGCCreateFailure; + +typedef struct command_player_delete +{ + BYTE header; + BYTE index; + char szPrivateCode[PRIVATE_CODE_LENGTH]; +} TPacketCGDestroyCharacter; + +typedef struct packet_player_delete_success +{ + BYTE header; + BYTE account_index; +} TPacketGCDestroyCharacterSuccess; + +enum +{ + ADD_CHARACTER_STATE_DEAD = (1 << 0), + ADD_CHARACTER_STATE_SPAWN = (1 << 1), + ADD_CHARACTER_STATE_GUNGON = (1 << 2), + ADD_CHARACTER_STATE_KILLER = (1 << 3), + ADD_CHARACTER_STATE_PARTY = (1 << 4), +}; + +enum EPKModes +{ + PK_MODE_PEACE, + PK_MODE_REVENGE, + PK_MODE_FREE, + PK_MODE_PROTECT, + PK_MODE_GUILD, + PK_MODE_MAX_NUM, +}; + +// 2004.11.20.myevan.CRaceData::PART_MAX_NUM 사용안하게 수정 - 서버에서 사용하는것과 일치하지 않음 +enum ECharacterEquipmentPart +{ + CHR_EQUIPPART_ARMOR, + CHR_EQUIPPART_WEAPON, + CHR_EQUIPPART_HEAD, + CHR_EQUIPPART_HAIR, + + CHR_EQUIPPART_NUM, +}; + +typedef struct packet_char_additional_info +{ + BYTE header; + DWORD dwVID; + char name[CHARACTER_NAME_MAX_LEN + 1]; + WORD awPart[CHR_EQUIPPART_NUM]; + BYTE bEmpire; + DWORD dwGuildID; + DWORD dwLevel; + short sAlignment; //선악치 + BYTE bPKMode; + DWORD dwMountVnum; +} TPacketGCCharacterAdditionalInfo; + +typedef struct packet_add_char +{ + BYTE header; + + DWORD dwVID; + + //char name[CHARACTER_NAME_MAX_LEN + 1]; + + float angle; + long x; + long y; + long z; + + BYTE bType; + WORD wRaceNum; + //WORD awPart[CHR_EQUIPPART_NUM]; + BYTE bMovingSpeed; + BYTE bAttackSpeed; + + BYTE bStateFlag; + DWORD dwAffectFlag[2]; // ?? + //BYTE bEmpire; + //DWORD dwGuild; + //short sAlignment; + //BYTE bPKMode; + //DWORD dwMountVnum; +} TPacketGCCharacterAdd; + +typedef struct packet_add_char2 +{ + BYTE header; + + DWORD dwVID; + + char name[CHARACTER_NAME_MAX_LEN + 1]; + + float angle; + long x; + long y; + long z; + + BYTE bType; + WORD wRaceNum; + WORD awPart[CHR_EQUIPPART_NUM]; + BYTE bMovingSpeed; + BYTE bAttackSpeed; + + BYTE bStateFlag; + DWORD dwAffectFlag[2]; // ?? + BYTE bEmpire; + + DWORD dwGuild; + short sAlignment; + BYTE bPKMode; + DWORD dwMountVnum; +} TPacketGCCharacterAdd2; + +typedef struct packet_update_char +{ + BYTE header; + DWORD dwVID; + + WORD awPart[CHR_EQUIPPART_NUM]; + BYTE bMovingSpeed; + BYTE bAttackSpeed; + + BYTE bStateFlag; + DWORD dwAffectFlag[2]; + + DWORD dwGuildID; + short sAlignment; + BYTE bPKMode; + DWORD dwMountVnum; +} TPacketGCCharacterUpdate; + +typedef struct packet_update_char2 +{ + BYTE header; + DWORD dwVID; + + WORD awPart[CHR_EQUIPPART_NUM]; + BYTE bMovingSpeed; + BYTE bAttackSpeed; + + BYTE bStateFlag; + DWORD dwAffectFlag[2]; + + DWORD dwGuildID; + short sAlignment; + BYTE bPKMode; + DWORD dwMountVnum; +} TPacketGCCharacterUpdate2; + +typedef struct packet_del_char +{ + BYTE header; + DWORD dwVID; +} TPacketGCCharacterDelete; + +typedef struct packet_GlobalTime +{ + BYTE header; + float GlobalTime; +} TPacketGCGlobalTime; + +enum EChatType +{ + CHAT_TYPE_TALKING, /* 그냥 채팅 */ + CHAT_TYPE_INFO, /* 정보 (아이템을 집었다, 경험치를 얻었다. 등) */ + CHAT_TYPE_NOTICE, /* 공지사항 */ + CHAT_TYPE_PARTY, /* 파티말 */ + CHAT_TYPE_GUILD, /* 길드말 */ + CHAT_TYPE_COMMAND, /* 명령 */ + CHAT_TYPE_SHOUT, /* 외치기 */ + CHAT_TYPE_WHISPER, // 서버와는 연동되지 않는 Only Client Enum + CHAT_TYPE_BIG_NOTICE, + CHAT_TYPE_MAX_NUM, +}; + +typedef struct packet_chatting +{ + BYTE header; + WORD size; + BYTE type; + DWORD dwVID; + BYTE bEmpire; +} TPacketGCChat; + +typedef struct packet_whisper // 가변 패킷 +{ + BYTE bHeader; + WORD wSize; + BYTE bType; + char szNameFrom[CHARACTER_NAME_MAX_LEN + 1]; +} TPacketGCWhisper; + +typedef struct packet_stun +{ + BYTE header; + DWORD vid; +} TPacketGCStun; + +typedef struct packet_dead +{ + BYTE header; + DWORD vid; +} TPacketGCDead; + +typedef struct packet_main_character +{ + BYTE header; + DWORD dwVID; + WORD wRaceNum; + char szName[CHARACTER_NAME_MAX_LEN + 1]; + long lX, lY, lZ; + BYTE bySkillGroup; +} TPacketGCMainCharacter; + +// SUPPORT_BGM +typedef struct packet_main_character2_empire +{ + BYTE header; + DWORD dwVID; + WORD wRaceNum; + char szName[CHARACTER_NAME_MAX_LEN + 1]; + long lX, lY, lZ; + BYTE byEmpire; + BYTE bySkillGroup; +} TPacketGCMainCharacter2_EMPIRE; + +typedef struct packet_main_character3_bgm +{ + enum + { + MUSIC_NAME_MAX_LEN = 24, + }; + BYTE header; + DWORD dwVID; + WORD wRaceNum; + char szUserName[CHARACTER_NAME_MAX_LEN + 1]; + char szBGMName[MUSIC_NAME_MAX_LEN + 1]; + long lX, lY, lZ; + BYTE byEmpire; + BYTE bySkillGroup; +} TPacketGCMainCharacter3_BGM; + +typedef struct packet_main_character4_bgm_vol +{ + enum + { + MUSIC_NAME_MAX_LEN = 24, + }; + BYTE header; + DWORD dwVID; + WORD wRaceNum; + char szUserName[CHARACTER_NAME_MAX_LEN + 1]; + char szBGMName[MUSIC_NAME_MAX_LEN + 1]; + float fBGMVol; + long lX, lY, lZ; + BYTE byEmpire; + BYTE bySkillGroup; +} TPacketGCMainCharacter4_BGM_VOL; +// END_OF_SUPPORT_BGM + +enum EPointTypes +{ + POINT_NONE, // 0 + POINT_LEVEL, // 1 + POINT_VOICE, // 2 + POINT_EXP, // 3 + POINT_NEXT_EXP, // 4 + POINT_HP, // 5 + POINT_MAX_HP, // 6 + POINT_SP, // 7 + POINT_MAX_SP, // 8 + POINT_STAMINA, // 9 스테미너 + POINT_MAX_STAMINA, // 10 최대 스테미너 + + POINT_GOLD, // 11 + POINT_ST, // 12 근력 + POINT_HT, // 13 체력 + POINT_DX, // 14 민첩성 + POINT_IQ, // 15 정신력 + POINT_ATT_POWER, // 16 공격력 + POINT_ATT_SPEED, // 17 공격속도 + POINT_EVADE_RATE, // 18 회피율 + POINT_MOV_SPEED, // 19 이동속도 + POINT_DEF_GRADE, // 20 방어등급 + POINT_CASTING_SPEED, // 21 주문속도 (쿨다운타임*100) / (100 + 이값) = 최종 쿨다운 타임 + POINT_MAGIC_ATT_GRADE, // 22 마법공격력 + POINT_MAGIC_DEF_GRADE, // 23 마법방어력 + POINT_EMPIRE_POINT, // 24 제국점수 + POINT_LEVEL_STEP, // 25 한 레벨에서의 단계.. (1 2 3 될 때 보상, 4 되면 레벨 업) + POINT_STAT, // 26 능력치 올릴 수 있는 개수 + POINT_SUB_SKILL, // 27 보조 스킬 포인트 + POINT_SKILL, // 28 액티브 스킬 포인트 +// POINT_SKILL_PASV, // 27 패시브 기술 올릴 수 있는 개수 +// POINT_SKILL_ACTIVE, // 28 액티브 스킬 포인트 + POINT_MIN_ATK, // 29 최소 파괴력 + POINT_MAX_ATK, // 30 최대 파괴력 + POINT_PLAYTIME, // 31 플레이시간 + POINT_HP_REGEN, // 32 HP 회복률 + POINT_SP_REGEN, // 33 SP 회복률 + + POINT_BOW_DISTANCE, // 34 활 사정거리 증가치 (meter) + + POINT_HP_RECOVERY, // 35 체력 회복 증가량 + POINT_SP_RECOVERY, // 36 정신력 회복 증가량 + + POINT_POISON_PCT, // 37 독 확률 + POINT_STUN_PCT, // 38 기절 확률 + POINT_SLOW_PCT, // 39 슬로우 확률 + POINT_CRITICAL_PCT, // 40 크리티컬 확률 + POINT_PENETRATE_PCT, // 41 관통타격 확률 + POINT_CURSE_PCT, // 42 저주 확률 + + POINT_ATTBONUS_HUMAN, // 43 인간에게 강함 + POINT_ATTBONUS_ANIMAL, // 44 동물에게 데미지 % 증가 + POINT_ATTBONUS_ORC, // 45 웅귀에게 데미지 % 증가 + POINT_ATTBONUS_MILGYO, // 46 밀교에게 데미지 % 증가 + POINT_ATTBONUS_UNDEAD, // 47 시체에게 데미지 % 증가 + POINT_ATTBONUS_DEVIL, // 48 마귀(악마)에게 데미지 % 증가 + POINT_ATTBONUS_INSECT, // 49 벌레족 + POINT_ATTBONUS_FIRE, // 50 화염족 + POINT_ATTBONUS_ICE, // 51 빙설족 + POINT_ATTBONUS_DESERT, // 52 사막족 + POINT_ATTBONUS_UNUSED0, // 53 UNUSED0 + POINT_ATTBONUS_UNUSED1, // 54 UNUSED1 + POINT_ATTBONUS_UNUSED2, // 55 UNUSED2 + POINT_ATTBONUS_UNUSED3, // 56 UNUSED3 + POINT_ATTBONUS_UNUSED4, // 57 UNUSED4 + POINT_ATTBONUS_UNUSED5, // 58 UNUSED5 + POINT_ATTBONUS_UNUSED6, // 59 UNUSED6 + POINT_ATTBONUS_UNUSED7, // 60 UNUSED7 + POINT_ATTBONUS_UNUSED8, // 61 UNUSED8 + POINT_ATTBONUS_UNUSED9, // 62 UNUSED9 + + POINT_STEAL_HP, // 63 생명력 흡수 + POINT_STEAL_SP, // 64 정신력 흡수 + + POINT_MANA_BURN_PCT, // 65 마나 번 + + /// 피해시 보너스 /// + + POINT_DAMAGE_SP_RECOVER, // 66 공격당할 시 정신력 회복 확률 + + POINT_BLOCK, // 67 블럭율 + POINT_DODGE, // 68 회피율 + + POINT_RESIST_SWORD, // 69 + POINT_RESIST_TWOHAND, // 70 + POINT_RESIST_DAGGER, // 71 + POINT_RESIST_BELL, // 72 + POINT_RESIST_FAN, // 73 + POINT_RESIST_BOW, // 74 화살 저항 : 대미지 감소 + POINT_RESIST_FIRE, // 75 화염 저항 : 화염공격에 대한 대미지 감소 + POINT_RESIST_ELEC, // 76 전기 저항 : 전기공격에 대한 대미지 감소 + POINT_RESIST_MAGIC, // 77 술법 저항 : 모든술법에 대한 대미지 감소 + POINT_RESIST_WIND, // 78 바람 저항 : 바람공격에 대한 대미지 감소 + + POINT_REFLECT_MELEE, // 79 공격 반사 + + /// 특수 피해시 /// + POINT_REFLECT_CURSE, // 80 저주 반사 + POINT_POISON_REDUCE, // 81 독데미지 감소 + + /// 적 소멸시 /// + POINT_KILL_SP_RECOVER, // 82 적 소멸시 MP 회복 + POINT_EXP_DOUBLE_BONUS, // 83 + POINT_GOLD_DOUBLE_BONUS, // 84 + POINT_ITEM_DROP_BONUS, // 85 + + /// 회복 관련 /// + POINT_POTION_BONUS, // 86 + POINT_KILL_HP_RECOVER, // 87 + + POINT_IMMUNE_STUN, // 88 + POINT_IMMUNE_SLOW, // 89 + POINT_IMMUNE_FALL, // 90 + ////////////////// + + POINT_PARTY_ATT_GRADE, // 91 + POINT_PARTY_DEF_GRADE, // 92 + + POINT_ATT_BONUS, // 93 + POINT_DEF_BONUS, // 94 + + POINT_ATT_GRADE_BONUS, // 95 + POINT_DEF_GRADE_BONUS, // 96 + POINT_MAGIC_ATT_GRADE_BONUS, // 97 + POINT_MAGIC_DEF_GRADE_BONUS, // 98 + + POINT_RESIST_NORMAL_DAMAGE, // 99 + + POINT_STAT_RESET_COUNT = 112, + POINT_HORSE_SKILL = 113, + + POINT_MALL_ATTBONUS, // 114 공격력 +x% + POINT_MALL_DEFBONUS, // 115 방어력 +x% + POINT_MALL_EXPBONUS, // 116 경험치 +x% + POINT_MALL_ITEMBONUS, // 117 아이템 드롭율 x/10배 + POINT_MALL_GOLDBONUS, // 118 돈 드롭율 x/10배 + POINT_MAX_HP_PCT, // 119 최대생명력 +x% + POINT_MAX_SP_PCT, // 120 최대정신력 +x% + + POINT_SKILL_DAMAGE_BONUS, // 121 스킬 데미지 *(100+x)% + POINT_NORMAL_HIT_DAMAGE_BONUS, // 122 평타 데미지 *(100+x)% + + POINT_SKILL_DEFEND_BONUS, // 123 스킬 방어 데미지 + POINT_NORMAL_HIT_DEFEND_BONUS, // 124 평타 방어 데미지 + POINT_PC_BANG_EXP_BONUS, // 125 + POINT_PC_BANG_DROP_BONUS, // 126 PC방 전용 드롭률 보너스 + + POINT_ENERGY = 128, // 128 기력 + + // 기력 ui 용. + // 이렇게 하고 싶지 않았지만, + // uiTaskBar에서는 affect에 접근할 수 없고, + // 더구나 클라리언트에서는 blend_affect는 관리하지 않아, + // 임시로 이렇게 둔다. + POINT_ENERGY_END_TIME = 129, // 129 기력 종료 시간 + + // 클라이언트 포인트 + POINT_MIN_WEP = 200, + POINT_MAX_WEP, + POINT_MIN_MAGIC_WEP, + POINT_MAX_MAGIC_WEP, + POINT_HIT_RATE, + + + //POINT_MAX_NUM = 255,=>stdafx.h 로/ +}; + +typedef struct packet_points +{ + BYTE header; + long points[POINT_MAX_NUM]; +} TPacketGCPoints; + +typedef struct packet_point_change +{ + int header; + + DWORD dwVID; + BYTE Type; + + long amount; // 바뀐 값 + long value; // 현재 값 +} TPacketGCPointChange; + +typedef struct packet_motion +{ + BYTE header; + DWORD vid; + DWORD victim_vid; + WORD motion; +} TPacketGCMotion; + +#if defined(GAIDEN) +struct TPacketGCItemDelDeprecate +{ + TPacketGCItemDelDeprecate() : + header(HEADER_GC_ITEM_DEL), + pos(0), + vnum(0), + count(0) + { + memset(&alSockets, 0, sizeof(alSockets)); + memset(&aAttr, 0, sizeof(aAttr)); + } + + BYTE header; + BYTE pos; + DWORD vnum; + BYTE count; + long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; + TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; +}; + +typedef struct packet_set_item +{ + BYTE header; + BYTE pos; + DWORD vnum; + BYTE count; + DWORD flags; // 플래그 추가 + long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; + TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; +} TPacketGCItemSet; + +typedef struct packet_item_del +{ + BYTE header; + BYTE pos; +} TPacketGCItemDel; +#else +typedef struct packet_set_item +{ + BYTE header; + TItemPos Cell; + DWORD vnum; + BYTE count; + long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; + TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; +} TPacketGCItemSet; + +typedef struct packet_set_item2 +{ + BYTE header; + TItemPos Cell; + DWORD vnum; + BYTE count; + DWORD flags; // 플래그 추가 + DWORD anti_flags; // 플래그 추가 + bool highlight; + long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; + TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; +} TPacketGCItemSet2; +#endif + +typedef struct packet_item_del +{ + BYTE header; + BYTE pos; +} TPacketGCItemDel; + +typedef struct packet_use_item +{ + BYTE header; + TItemPos Cell; + DWORD ch_vid; + DWORD victim_vid; + + DWORD vnum; +} TPacketGCItemUse; + +typedef struct packet_update_item +{ + BYTE header; + TItemPos Cell; + BYTE count; + long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; + TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; +} TPacketGCItemUpdate; + +typedef struct packet_ground_add_item +{ + BYTE bHeader; + long lX; + long lY; + long lZ; + + DWORD dwVID; + DWORD dwVnum; +} TPacketGCItemGroundAdd; + +typedef struct packet_ground_del_item +{ + BYTE header; + DWORD vid; +} TPacketGCItemGroundDel; + +typedef struct packet_item_ownership +{ + BYTE bHeader; + DWORD dwVID; + char szName[CHARACTER_NAME_MAX_LEN + 1]; +} TPacketGCItemOwnership; + +typedef struct packet_quickslot_add +{ + BYTE header; + BYTE pos; + TQuickSlot slot; +} TPacketGCQuickSlotAdd; + +typedef struct packet_quickslot_del +{ + BYTE header; + BYTE pos; +} TPacketGCQuickSlotDel; + +typedef struct packet_quickslot_swap +{ + BYTE header; + BYTE pos; + BYTE change_pos; +} TPacketGCQuickSlotSwap; + +typedef struct packet_shop_start +{ + struct packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM]; +} TPacketGCShopStart; + +typedef struct packet_shop_start_ex // 다음에 TSubPacketShopTab* shop_tabs 이 따라옴. +{ + typedef struct sub_packet_shop_tab + { + char name[SHOP_TAB_NAME_MAX]; + BYTE coin_type; + packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM]; + } TSubPacketShopTab; + DWORD owner_vid; + BYTE shop_tab_count; +} TPacketGCShopStartEx; + + +typedef struct packet_shop_update_item +{ + BYTE pos; + struct packet_shop_item item; +} TPacketGCShopUpdateItem; + +typedef struct packet_shop_update_price +{ + int iElkAmount; +} TPacketGCShopUpdatePrice; + +enum EPacketShopSubHeaders +{ + SHOP_SUBHEADER_GC_START, + SHOP_SUBHEADER_GC_END, + SHOP_SUBHEADER_GC_UPDATE_ITEM, + SHOP_SUBHEADER_GC_UPDATE_PRICE, + SHOP_SUBHEADER_GC_OK, + SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY, + SHOP_SUBHEADER_GC_SOLDOUT, + SHOP_SUBHEADER_GC_INVENTORY_FULL, + SHOP_SUBHEADER_GC_INVALID_POS, + SHOP_SUBHEADER_GC_SOLD_OUT, + SHOP_SUBHEADER_GC_START_EX, + SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY_EX, +}; + +typedef struct packet_shop +{ + BYTE header; + WORD size; + BYTE subheader; +} TPacketGCShop; + +typedef struct packet_exchange +{ + BYTE header; + BYTE subheader; + BYTE is_me; + DWORD arg1; + TItemPos arg2; + DWORD arg3; + long alValues[ITEM_SOCKET_SLOT_MAX_NUM]; + TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; +} TPacketGCExchange; + +enum +{ + EXCHANGE_SUBHEADER_GC_START, // arg1 == vid + EXCHANGE_SUBHEADER_GC_ITEM_ADD, // arg1 == vnum arg2 == pos arg3 == count + EXCHANGE_SUBHEADER_GC_ITEM_DEL, // arg1 == pos + EXCHANGE_SUBHEADER_GC_ELK_ADD, // arg1 == elk + EXCHANGE_SUBHEADER_GC_ACCEPT, // arg1 == accept + EXCHANGE_SUBHEADER_GC_END, // arg1 == not used + EXCHANGE_SUBHEADER_GC_ALREADY, // arg1 == not used + EXCHANGE_SUBHEADER_GC_LESS_ELK, // arg1 == not used +}; + +typedef struct packet_position +{ + BYTE header; + DWORD vid; + BYTE position; +} TPacketGCPosition; + +typedef struct packet_ping +{ + BYTE header; +} TPacketGCPing; + +typedef struct packet_pong +{ + BYTE bHeader; +} TPacketCGPong; + +typedef struct packet_script +{ + BYTE header; + WORD size; + BYTE skin; + WORD src_size; +} TPacketGCScript; + +typedef struct packet_target +{ + BYTE header; + DWORD dwVID; + BYTE bHPPercent; +} TPacketGCTarget; + +typedef struct packet_damage_info +{ + BYTE header; + DWORD dwVID; + BYTE flag; + int damage; +} TPacketGCDamageInfo; + +typedef struct packet_mount +{ + BYTE header; + DWORD vid; + DWORD mount_vid; + BYTE pos; + DWORD _x, _y; +} TPacketGCMount; + +typedef struct packet_change_speed +{ + BYTE header; + DWORD vid; + WORD moving_speed; +} TPacketGCChangeSpeed; + +typedef struct packet_move +{ + BYTE bHeader; + BYTE bFunc; + BYTE bArg; + BYTE bRot; + DWORD dwVID; + LONG lX; + LONG lY; + DWORD dwTime; + DWORD dwDuration; +} TPacketGCMove; + +enum +{ + QUEST_SEND_IS_BEGIN = 1 << 0, + QUEST_SEND_TITLE = 1 << 1, // 28자 까지 + QUEST_SEND_CLOCK_NAME = 1 << 2, // 16자 까지 + QUEST_SEND_CLOCK_VALUE = 1 << 3, + QUEST_SEND_COUNTER_NAME = 1 << 4, // 16자 까지 + QUEST_SEND_COUNTER_VALUE = 1 << 5, + QUEST_SEND_ICON_FILE = 1 << 6, // 24자 까지 +}; + +typedef struct packet_quest_info +{ + BYTE header; + WORD size; + WORD index; + BYTE flag; +} TPacketGCQuestInfo; + +typedef struct packet_quest_confirm +{ + BYTE header; + char msg[64+1]; + long timeout; + DWORD requestPID; +} TPacketGCQuestConfirm; + +typedef struct packet_attack +{ + BYTE header; + DWORD dwVID; + DWORD dwVictimVID; // 적 VID + BYTE bType; // 공격 유형 +} TPacketGCAttack; + +typedef struct packet_c2c +{ + BYTE header; + WORD wSize; +} TPacketGCC2C; + +typedef struct packetd_sync_position_element +{ + DWORD dwVID; + long lX; + long lY; +} TPacketGCSyncPositionElement; + +typedef struct packetd_sync_position +{ + BYTE bHeader; + WORD wSize; +} TPacketGCSyncPosition; + +typedef struct packet_ownership +{ + BYTE bHeader; + DWORD dwOwnerVID; + DWORD dwVictimVID; +} TPacketGCOwnership; + +#define SKILL_MAX_NUM 255 + +typedef struct packet_skill_level +{ + BYTE bHeader; + BYTE abSkillLevels[SKILL_MAX_NUM]; +} TPacketGCSkillLevel; + +typedef struct SPlayerSkill +{ + BYTE bMasterType; + BYTE bLevel; + time_t tNextRead; +} TPlayerSkill; + +typedef struct packet_skill_level_new +{ + BYTE bHeader; + TPlayerSkill skills[SKILL_MAX_NUM]; +} TPacketGCSkillLevelNew; + +// fly +typedef struct packet_fly +{ + BYTE bHeader; + BYTE bType; + DWORD dwStartVID; + DWORD dwEndVID; +} TPacketGCCreateFly; + +enum EPVPModes +{ + PVP_MODE_NONE, + PVP_MODE_AGREE, + PVP_MODE_FIGHT, + PVP_MODE_REVENGE, +}; + +typedef struct packet_duel_start +{ + BYTE header ; + WORD wSize ; // DWORD가 몇개? 개수 = (wSize - sizeof(TPacketGCPVPList)) / 4 +} TPacketGCDuelStart ; + +typedef struct packet_pvp +{ + BYTE header; + DWORD dwVIDSrc; + DWORD dwVIDDst; + BYTE bMode; +} TPacketGCPVP; + +typedef struct packet_skill_cooltime_end +{ + BYTE header; + BYTE bSkill; +} TPacketGCSkillCoolTimeEnd; + +typedef struct packet_warp +{ + BYTE bHeader; + LONG lX; + LONG lY; + LONG lAddr; + WORD wPort; +} TPacketGCWarp; + +typedef struct packet_party_invite +{ + BYTE header; + DWORD leader_pid; +} TPacketGCPartyInvite; + +typedef struct packet_party_add +{ + BYTE header; + DWORD pid; + char name[CHARACTER_NAME_MAX_LEN+1]; +} TPacketGCPartyAdd; + +typedef struct packet_party_update +{ + BYTE header; + DWORD pid; + BYTE state; + BYTE percent_hp; + short affects[PARTY_AFFECT_SLOT_MAX_NUM]; +} TPacketGCPartyUpdate; + +typedef struct packet_party_remove +{ + BYTE header; + DWORD pid; +} TPacketGCPartyRemove; + +typedef TPacketCGSafeboxCheckout TPacketGCSafeboxCheckout; +typedef TPacketCGSafeboxCheckin TPacketGCSafeboxCheckin; + +typedef struct packet_safebox_wrong_password +{ + BYTE bHeader; +} TPacketGCSafeboxWrongPassword; + +typedef struct packet_safebox_size +{ + BYTE bHeader; + BYTE bSize; +} TPacketGCSafeboxSize; + +typedef struct packet_safebox_money_change +{ + BYTE bHeader; + DWORD dwMoney; +} TPacketGCSafeboxMoneyChange; + +typedef struct command_empire +{ + BYTE bHeader; + BYTE bEmpire; +} TPacketCGEmpire; + +typedef struct packet_empire +{ + BYTE bHeader; + BYTE bEmpire; +} TPacketGCEmpire; + +enum +{ + FISHING_SUBHEADER_GC_START, + FISHING_SUBHEADER_GC_STOP, + FISHING_SUBHEADER_GC_REACT, + FISHING_SUBHEADER_GC_SUCCESS, + FISHING_SUBHEADER_GC_FAIL, + FISHING_SUBHEADER_GC_FISH, +}; + +typedef struct packet_fishing +{ + BYTE header; + BYTE subheader; + DWORD info; + BYTE dir; +} TPacketGCFishing; + +typedef struct paryt_parameter +{ + BYTE bHeader; + BYTE bDistributeMode; +} TPacketGCPartyParameter; + +////////////////////////////////////////////////////////////////////////// +// Guild + +enum +{ + GUILD_SUBHEADER_GC_LOGIN, + GUILD_SUBHEADER_GC_LOGOUT, + GUILD_SUBHEADER_GC_LIST, + GUILD_SUBHEADER_GC_GRADE, + GUILD_SUBHEADER_GC_ADD, + GUILD_SUBHEADER_GC_REMOVE, + GUILD_SUBHEADER_GC_GRADE_NAME, + GUILD_SUBHEADER_GC_GRADE_AUTH, + GUILD_SUBHEADER_GC_INFO, + GUILD_SUBHEADER_GC_COMMENTS, + GUILD_SUBHEADER_GC_CHANGE_EXP, + GUILD_SUBHEADER_GC_CHANGE_MEMBER_GRADE, + GUILD_SUBHEADER_GC_SKILL_INFO, + GUILD_SUBHEADER_GC_CHANGE_MEMBER_GENERAL, + GUILD_SUBHEADER_GC_GUILD_INVITE, + GUILD_SUBHEADER_GC_WAR, + GUILD_SUBHEADER_GC_GUILD_NAME, + GUILD_SUBHEADER_GC_GUILD_WAR_LIST, + GUILD_SUBHEADER_GC_GUILD_WAR_END_LIST, + GUILD_SUBHEADER_GC_WAR_POINT, + GUILD_SUBHEADER_GC_MONEY_CHANGE, +}; + +typedef struct packet_guild +{ + BYTE header; + WORD size; + BYTE subheader; +} TPacketGCGuild; + +// SubHeader - Grade +enum +{ + GUILD_AUTH_ADD_MEMBER = (1 << 0), + GUILD_AUTH_REMOVE_MEMBER = (1 << 1), + GUILD_AUTH_NOTICE = (1 << 2), + GUILD_AUTH_SKILL = (1 << 3), +}; + +typedef struct packet_guild_sub_grade +{ + char grade_name[GUILD_GRADE_NAME_MAX_LEN+1]; // 8+1 길드장, 길드원 등의 이름 + BYTE auth_flag; +} TPacketGCGuildSubGrade; + +typedef struct packet_guild_sub_member +{ + DWORD pid; + BYTE byGrade; + BYTE byIsGeneral; + BYTE byJob; + BYTE byLevel; + DWORD dwOffer; + BYTE byNameFlag; +// if NameFlag is TRUE, name is sent from server. +// char szName[CHARACTER_ME_MAX_LEN+1]; +} TPacketGCGuildSubMember; + +typedef struct packet_guild_sub_info +{ + WORD member_count; + WORD max_member_count; + DWORD guild_id; + DWORD master_pid; + DWORD exp; + BYTE level; + char name[GUILD_NAME_MAX_LEN+1]; + DWORD gold; + BYTE hasLand; +} TPacketGCGuildInfo; + +enum EGuildWarState +{ + GUILD_WAR_NONE, + GUILD_WAR_SEND_DECLARE, + GUILD_WAR_REFUSE, + GUILD_WAR_RECV_DECLARE, + GUILD_WAR_WAIT_START, + GUILD_WAR_CANCEL, + GUILD_WAR_ON_WAR, + GUILD_WAR_END, + + GUILD_WAR_DURATION = 2*60*60, // 2시간 +}; + +typedef struct packet_guild_war +{ + DWORD dwGuildSelf; + DWORD dwGuildOpp; + BYTE bType; + BYTE bWarState; +} TPacketGCGuildWar; + +typedef struct SPacketGuildWarPoint +{ + DWORD dwGainGuildID; + DWORD dwOpponentGuildID; + long lPoint; +} TPacketGuildWarPoint; + +// SubHeader - Dungeon +enum +{ + DUNGEON_SUBHEADER_GC_TIME_ATTACK_START = 0, + DUNGEON_SUBHEADER_GC_DESTINATION_POSITION = 1, +}; + +typedef struct packet_dungeon +{ + BYTE bHeader; + WORD size; + BYTE subheader; +} TPacketGCDungeon; + +// Private Shop +typedef struct SPacketGCShopSign +{ + BYTE bHeader; + DWORD dwVID; + char szSign[SHOP_SIGN_MAX_LEN + 1]; +} TPacketGCShopSign; + +typedef struct SPacketGCTime +{ + BYTE bHeader; + time_t time; +} TPacketGCTime; + +enum +{ + WALKMODE_RUN, + WALKMODE_WALK, +}; + +typedef struct SPacketGCWalkMode +{ + BYTE header; + DWORD vid; + BYTE mode; +} TPacketGCWalkMode; + +typedef struct SPacketGCChangeSkillGroup +{ + BYTE header; + BYTE skill_group; +} TPacketGCChangeSkillGroup; + +struct TMaterial +{ + DWORD vnum; + DWORD count; +}; + +typedef struct SRefineTable +{ + DWORD src_vnum; + DWORD result_vnum; + BYTE material_count; + int cost; // 소요 비용 + int prob; // 확률 + TMaterial materials[REFINE_MATERIAL_MAX_NUM]; +} TRefineTable; + +typedef struct SPacketGCRefineInformation +{ + BYTE header; + BYTE pos; + TRefineTable refine_table; +} TPacketGCRefineInformation; + +typedef struct SPacketGCRefineInformationNew +{ + BYTE header; + BYTE type; + BYTE pos; + TRefineTable refine_table; +} TPacketGCRefineInformationNew; + +enum SPECIAL_EFFECT +{ + SE_NONE, + SE_HPUP_RED, + SE_SPUP_BLUE, + SE_SPEEDUP_GREEN, + SE_DXUP_PURPLE, + SE_CRITICAL, + SE_PENETRATE, + SE_BLOCK, + SE_DODGE, + SE_CHINA_FIREWORK, + SE_SPIN_TOP, + SE_SUCCESS, + SE_FAIL, + SE_FR_SUCCESS, + SE_LEVELUP_ON_14_FOR_GERMANY, //레벨업 14일때 ( 독일전용 ) + SE_LEVELUP_UNDER_15_FOR_GERMANY,//레벨업 15일때 ( 독일전용 ) + SE_PERCENT_DAMAGE1, + SE_PERCENT_DAMAGE2, + SE_PERCENT_DAMAGE3, + SE_AUTO_HPUP, + SE_AUTO_SPUP, + SE_EQUIP_RAMADAN_RING, // 초승달의 반지를 착용하는 순간에 발동하는 이펙트 + SE_EQUIP_HALLOWEEN_CANDY, // 할로윈 사탕을 착용(-_-;)한 순간에 발동하는 이펙트 + SE_EQUIP_HAPPINESS_RING, // 크리스마스 행복의 반지를 착용하는 순간에 발동하는 이펙트 + SE_EQUIP_LOVE_PENDANT, // 발렌타인 사랑의 팬던트(71145) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님) +}; + +typedef struct SPacketGCSpecialEffect +{ + BYTE header; + BYTE type; + DWORD vid; +} TPacketGCSpecialEffect; + +typedef struct SPacketGCNPCPosition +{ + BYTE header; + WORD size; + WORD count; +} TPacketGCNPCPosition; + +struct TNPCPosition +{ + BYTE bType; + char name[CHARACTER_NAME_MAX_LEN+1]; + long x; + long y; +}; + +typedef struct SPacketGCChangeName +{ + BYTE header; + DWORD pid; + char name[CHARACTER_NAME_MAX_LEN+1]; +} TPacketGCChangeName; + +enum EBlockAction +{ + BLOCK_EXCHANGE = (1 << 0), + BLOCK_PARTY_INVITE = (1 << 1), + BLOCK_GUILD_INVITE = (1 << 2), + BLOCK_WHISPER = (1 << 3), + BLOCK_MESSENGER_INVITE = (1 << 4), + BLOCK_PARTY_REQUEST = (1 << 5), +}; + +typedef struct packet_china_matrixd_card +{ + BYTE bHeader; + DWORD dwRows; + DWORD dwCols; +} TPacketGCChinaMatrixCard; + +typedef struct packet_runup_matrixd_quiz +{ + BYTE bHeader; + char szQuiz[RUNUP_MATRIX_QUIZ_MAX_LEN + 1]; +} TPacketGCRunupMatrixQuiz; + +typedef struct packet_newcibn_passpod_request +{ + BYTE bHeader; +} TPacketGCNEWCIBNPasspodRequest; + +typedef struct packet_newcibn_passpod_failure +{ + BYTE bHeader; + char szMessage[NEWCIBN_PASSPOD_FAILURE_MAX_LEN + 1]; +} TPacketGCNEWCIBNPasspodFailure; + +typedef struct packet_login_key +{ + BYTE bHeader; + DWORD dwLoginKey; +} TPacketGCLoginKey; + +typedef struct packet_auth_success +{ + BYTE bHeader; + DWORD dwLoginKey; + BYTE bResult; +} TPacketGCAuthSuccess; + +typedef struct packet_auth_success_openid +{ + BYTE bHeader; + DWORD dwLoginKey; + BYTE bResult; + char login[ID_MAX_NUM + 1]; +} TPacketGCAuthSuccessOpenID; + +typedef struct packet_channel +{ + BYTE header; + BYTE channel; +} TPacketGCChannel; + +typedef struct SEquipmentItemSet +{ + DWORD vnum; + BYTE count; + long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; + TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; +} TEquipmentItemSet; + +typedef struct pakcet_view_equip +{ + BYTE header; + DWORD dwVID; + TEquipmentItemSet equips[WEAR_MAX_NUM]; +} TPacketGCViewEquip; + +typedef struct +{ + DWORD dwID; + long x, y; + long width, height; + DWORD dwGuildID; +} TLandPacketElement; + +typedef struct packet_land_list +{ + BYTE header; + WORD size; +} TPacketGCLandList; + +typedef struct +{ + BYTE bHeader; + long lID; + char szTargetName[32+1]; +} TPacketGCTargetCreate; + +enum +{ + CREATE_TARGET_TYPE_NONE, + CREATE_TARGET_TYPE_LOCATION, + CREATE_TARGET_TYPE_CHARACTER, +}; + +typedef struct +{ + BYTE bHeader; + long lID; + char szTargetName[32+1]; + DWORD dwVID; + BYTE byType; +} TPacketGCTargetCreateNew; + +typedef struct +{ + BYTE bHeader; + long lID; + long lX, lY; +} TPacketGCTargetUpdate; + +typedef struct +{ + BYTE bHeader; + long lID; +} TPacketGCTargetDelete; + +typedef struct +{ + DWORD dwType; + BYTE bPointIdxApplyOn; + long lApplyValue; + DWORD dwFlag; + long lDuration; + long lSPCost; +} TPacketAffectElement; + +typedef struct +{ + BYTE bHeader; + TPacketAffectElement elem; +} TPacketGCAffectAdd; + +typedef struct +{ + BYTE bHeader; + DWORD dwType; + BYTE bApplyOn; +} TPacketGCAffectRemove; + +typedef struct packet_mall_open +{ + BYTE bHeader; + BYTE bSize; +} TPacketGCMallOpen; + +typedef struct packet_lover_info +{ + BYTE bHeader; + char szName[CHARACTER_NAME_MAX_LEN + 1]; + BYTE byLovePoint; +} TPacketGCLoverInfo; + +typedef struct packet_love_point_update +{ + BYTE bHeader; + BYTE byLovePoint; +} TPacketGCLovePointUpdate; + +typedef struct packet_dig_motion +{ + BYTE header; + DWORD vid; + DWORD target_vid; + BYTE count; +} TPacketGCDigMotion; + +typedef struct SPacketGCOnTime +{ + BYTE header; + int ontime; // sec +} TPacketGCOnTime; + +typedef struct SPacketGCResetOnTime +{ + BYTE header; +} TPacketGCResetOnTime; + +typedef struct SPacketGCPanamaPack +{ + BYTE bHeader; + char szPackName[256]; + BYTE abIV[32]; +} TPacketGCPanamaPack; + +typedef struct SPacketGCHybridCryptKeys +{ +private: + SPacketGCHybridCryptKeys() : m_pStream(NULL) {} + +public: + SPacketGCHybridCryptKeys(int iStreamSize) : iKeyStreamLen(iStreamSize) + { + m_pStream = new BYTE[iStreamSize]; + } + ~SPacketGCHybridCryptKeys() + { + if( m_pStream ) + { + delete[] m_pStream; + m_pStream = NULL; + } + } + static int GetFixedHeaderSize() + { + return sizeof(BYTE)+sizeof(WORD)+sizeof(int); + } + + BYTE bHeader; + WORD wDynamicPacketSize; + int iKeyStreamLen; + BYTE* m_pStream; + +} TPacketGCHybridCryptKeys; + + +typedef struct SPacketGCHybridSDB +{ +private: + SPacketGCHybridSDB() : m_pStream(NULL) {} + +public: + SPacketGCHybridSDB(int iStreamSize) : iSDBStreamLen(iStreamSize) + { + m_pStream = new BYTE[iStreamSize]; + } + ~SPacketGCHybridSDB() + { + delete[] m_pStream; + m_pStream = NULL; + } + static int GetFixedHeaderSize() + { + return sizeof(BYTE)+sizeof(WORD)+sizeof(int); + } + + BYTE bHeader; + WORD wDynamicPacketSize; + int iSDBStreamLen; + BYTE* m_pStream; + +} TPacketGCHybridSDB; +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Client To Client + +typedef struct packet_state +{ + BYTE bHeader; + BYTE bFunc; + BYTE bArg; + BYTE bRot; + DWORD dwVID; + DWORD dwTime; + TPixelPosition kPPos; +} TPacketCCState; + +typedef struct packet_hs_check_req +{ + BYTE bHeader; + AHNHS_TRANS_BUFFER Req; +} TPacketHSCheck; + +//NOTE : recv/send에 공통으로 생김, bPacketData의 내용만 바뀐다. +typedef struct packet_xtrap_verify +{ + BYTE bHeader; + BYTE bPacketData[128]; + +} TPacketXTrapCSVerify; +// AUTOBAN +typedef struct packet_autoban_quiz +{ + BYTE bHeader; + BYTE bDuration; + BYTE bCaptcha[64*32]; + char szQuiz[256]; +} TPacketGCAutoBanQuiz; +// END_OF_AUTOBAN + +#ifdef _IMPROVED_PACKET_ENCRYPTION_ +struct TPacketKeyAgreement +{ + static const int MAX_DATA_LEN = 256; + BYTE bHeader; + WORD wAgreedLength; + WORD wDataLength; + BYTE data[MAX_DATA_LEN]; +}; + +struct TPacketKeyAgreementCompleted +{ + BYTE bHeader; + BYTE data[3]; // dummy (not used) +}; +#endif // _IMPROVED_PACKET_ENCRYPTION_ + +#ifdef __AUCTION__ +// Argument의 용도는 cmd에 따라 다르다. +typedef struct SPacketCGAuctionCmd +{ + BYTE bHeader; + BYTE cmd; + int arg1; + int arg2; + int arg3; + int arg4; +} TPacketCGAuctionCmd; + +typedef struct SPacketGCAuctionItemListPack +{ + BYTE bHeader; + BYTE bNumbers; +} TPacketGCAuctionItemListPack; + +#endif + +typedef struct SPacketGCSpecificEffect +{ + BYTE header; + DWORD vid; + char effect_file[128]; +} TPacketGCSpecificEffect; + +// 용혼석 +enum EDragonSoulRefineWindowRefineType +{ + DragonSoulRefineWindow_UPGRADE, + DragonSoulRefineWindow_IMPROVEMENT, + DragonSoulRefineWindow_REFINE, +}; + +enum EPacketCGDragonSoulSubHeaderType +{ + DS_SUB_HEADER_OPEN, + DS_SUB_HEADER_CLOSE, + DS_SUB_HEADER_DO_UPGRADE, + DS_SUB_HEADER_DO_IMPROVEMENT, + DS_SUB_HEADER_DO_REFINE, + DS_SUB_HEADER_REFINE_FAIL, + DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE, + DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL, + DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY, + DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MATERIAL, + DS_SUB_HEADER_REFINE_FAIL_TOO_MUCH_MATERIAL, + DS_SUB_HEADER_REFINE_SUCCEED, +}; + +typedef struct SPacketCGDragonSoulRefine +{ + SPacketCGDragonSoulRefine() : header (HEADER_CG_DRAGON_SOUL_REFINE) + {} + BYTE header; + BYTE bSubType; + TItemPos ItemGrid[DS_REFINE_WINDOW_MAX_NUM]; +} TPacketCGDragonSoulRefine; + +typedef struct SPacketGCDragonSoulRefine +{ + SPacketGCDragonSoulRefine() : header(HEADER_GC_DRAGON_SOUL_REFINE) + {} + BYTE header; + BYTE bSubType; + TItemPos Pos; +} TPacketGCDragonSoulRefine; + +typedef struct SChannelStatus +{ + short nPort; + BYTE bStatus; +} TChannelStatus; + +#pragma pack(pop) diff --git a/extension/src/port/UserInterface/PythonApplication.h b/extension/src/port/UserInterface/PythonApplication.h new file mode 100644 index 00000000..c667c6b0 --- /dev/null +++ b/extension/src/port/UserInterface/PythonApplication.h @@ -0,0 +1,440 @@ +#pragma once + +#include "../EterLib/MSApplication.h" +#include "../EterLib/Input.h" +#include "../EterLib/Profiler.h" +#include "../EterLib/GrpDevice.h" +#include "../EterLib/NetDevice.h" +#include "../EterLib/GrpLightManager.h" +#include "../EffectLib/EffectManager.h" +#include "../GameLib/RaceManager.h" +#include "../GameLib/ItemManager.h" +#include "../GameLib/FlyingObjectManager.h" +#include "../GameLib/GameEventManager.h" +#include "../MilesLib/SoundManager.h" + +#include "PythonEventManager.h" +#include "PythonPlayer.h" +#include "PythonNonPlayer.h" +#include "PythonMiniMap.h" +#include "PythonIME.h" +#include "PythonItem.h" +#include "PythonShop.h" +#include "PythonExchange.h" +#include "PythonChat.h" +#include "PythonTextTail.h" +#include "PythonSkill.h" +#include "PythonSystem.h" +//#include "PythonNetworkDatagram.h" +#include "PythonNetworkStream.h" +#include "PythonCharacterManager.h" +#include "PythonQuest.h" +#include "PythonMessenger.h" +#include "PythonSafeBox.h" +#include "PythonGuild.h" + +#include "GuildMarkDownloader.h" +#include "GuildMarkUploader.h" + +#include "AccountConnector.h" + +#include "ServerStateChecker.h" +#include "AbstractApplication.h" +#include "MovieMan.h" + +class CPythonApplication : public CMSApplication, public CInputKeyboard, public IAbstractApplication +{ + public: + enum EDeviceState + { + DEVICE_STATE_FALSE, + DEVICE_STATE_SKIP, + DEVICE_STATE_OK, + }; + + enum ECursorMode + { + CURSOR_MODE_HARDWARE, + CURSOR_MODE_SOFTWARE, + }; + + enum ECursorShape + { + CURSOR_SHAPE_NORMAL, + CURSOR_SHAPE_ATTACK, + CURSOR_SHAPE_TARGET, + CURSOR_SHAPE_TALK, + CURSOR_SHAPE_CANT_GO, + CURSOR_SHAPE_PICK, + + CURSOR_SHAPE_DOOR, + CURSOR_SHAPE_CHAIR, + CURSOR_SHAPE_MAGIC, // Magic + CURSOR_SHAPE_BUY, // Buy + CURSOR_SHAPE_SELL, // Sell + + CURSOR_SHAPE_CAMERA_ROTATE, // Camera Rotate + CURSOR_SHAPE_HSIZE, // Horizontal Size + CURSOR_SHAPE_VSIZE, // Vertical Size + CURSOR_SHAPE_HVSIZE, // Horizontal & Vertical Size + + CURSOR_SHAPE_COUNT, + + // 안정적인 네이밍 변환을 위한 임시 enumerate + NORMAL = CURSOR_SHAPE_NORMAL, + ATTACK = CURSOR_SHAPE_ATTACK, + TARGET = CURSOR_SHAPE_TARGET, + CAMERA_ROTATE = CURSOR_SHAPE_CAMERA_ROTATE, + CURSOR_COUNT = CURSOR_SHAPE_COUNT, + }; + + enum EInfo + { + INFO_ACTOR, + INFO_EFFECT, + INFO_ITEM, + INFO_TEXTTAIL, + }; + + enum ECameraControlDirection + { + CAMERA_TO_POSITIVE = 1, + CAMERA_TO_NEGITIVE = -1, + CAMERA_STOP = 0, + }; + + enum + { + CAMERA_MODE_NORMAL = 0, + CAMERA_MODE_STAND = 1, + CAMERA_MODE_BLEND = 2, + + EVENT_CAMERA_NUMBER = 101, + }; + + struct SCameraSpeed + { + float m_fUpDir; + float m_fViewDir; + float m_fCrossDir; + + SCameraSpeed() : m_fUpDir(0.0f), m_fViewDir(0.0f), m_fCrossDir(0.0f) {} + }; + + public: + CPythonApplication(); + virtual ~CPythonApplication(); + + public: + void ShowWebPage(const char* c_szURL, const RECT& c_rcWebPage); + void MoveWebPage(const RECT& c_rcWebPage); + void HideWebPage(); + + bool IsWebPageMode(); + + public: + void NotifyHack(const char* c_szFormat, ...); + void GetInfo(UINT eInfo, std::string* pstInfo); + void GetMousePosition(POINT* ppt); + + static CPythonApplication& Instance() + { + assert(ms_pInstance != NULL); + return *ms_pInstance; + } + + void Loop(); + void Destroy(); + void Clear(); + void Exit(); + void Abort(); + + void SetMinFog(float fMinFog); + void SetFrameSkip(bool isEnable); + void SkipRenderBuffering(DWORD dwSleepMSec); + + bool Create(PyObject* poSelf, const char* c_szName, int width, int height, int Windowed); + bool CreateDevice(int width, int height, int Windowed, int bit = 32, int frequency = 0); + + void UpdateGame(); + void RenderGame(); + + bool Process(); + + void UpdateClientRect(); + + bool CreateCursors(); + void DestroyCursors(); + + void SafeSetCapture(); + void SafeReleaseCapture(); + + BOOL SetCursorNum(int iCursorNum); + void SetCursorVisible(BOOL bFlag, bool bLiarCursorOn = false); + BOOL GetCursorVisible(); + bool GetLiarCursorOn(); + void SetCursorMode(int iMode); + int GetCursorMode(); + int GetCursorNum() { return m_iCursorNum; } + + void SetMouseHandler(PyObject * poMouseHandler); + + int GetWidth(); + int GetHeight(); + + void SetGlobalCenterPosition(LONG x, LONG y); + void SetCenterPosition(float fx, float fy, float fz); + void GetCenterPosition(TPixelPosition * pPixelPosition); + void SetCamera(float Distance, float Pitch, float Rotation, float fDestinationHeight); + void GetCamera(float * Distance, float * Pitch, float * Rotation, float * DestinationHeight); + void RotateCamera(int iDirection); + void PitchCamera(int iDirection); + void ZoomCamera(int iDirection); + void MovieRotateCamera(int iDirection); + void MoviePitchCamera(int iDirection); + void MovieZoomCamera(int iDirection); + void MovieResetCamera(); + void SetViewDirCameraSpeed(float fSpeed); + void SetCrossDirCameraSpeed(float fSpeed); + void SetUpDirCameraSpeed(float fSpeed); + float GetRotation(); + float GetPitch(); + + void SetFPS(int iFPS); + void SetServerTime(time_t tTime); + time_t GetServerTime(); + time_t GetServerTimeStamp(); + float GetGlobalTime(); + float GetGlobalElapsedTime(); + + float GetFaceSpeed() { return m_fFaceSpd; } + float GetAveRenderTime() { return m_fAveRenderTime; } + DWORD GetCurRenderTime() { return m_dwCurRenderTime; } + DWORD GetCurUpdateTime() { return m_dwCurUpdateTime; } + DWORD GetUpdateFPS() { return m_dwUpdateFPS; } + DWORD GetRenderFPS() { return m_dwRenderFPS; } + DWORD GetLoad() { return m_dwLoad; } + DWORD GetFaceCount() { return m_dwFaceCount; } + + void SetConnectData(const char * c_szIP, int iPort); + void GetConnectData(std::string & rstIP, int & riPort); + + void RunIMEUpdate(); + void RunIMETabEvent(); + void RunIMEReturnEvent(); + void RunPressExitKey(); + + void RunIMEChangeCodePage(); + void RunIMEOpenCandidateListEvent(); + void RunIMECloseCandidateListEvent(); + void RunIMEOpenReadingWndEvent(); + void RunIMECloseReadingWndEvent(); + + void EnableSpecialCameraMode(); + void SetCameraSpeed(int iPercentage); + + bool IsLockCurrentCamera(); + void SetEventCamera(const SCameraSetting & c_rCameraSetting); + void BlendEventCamera(const SCameraSetting & c_rCameraSetting, float fBlendTime); + void SetDefaultCamera(); + + void SetCameraSetting(const SCameraSetting & c_rCameraSetting); + void GetCameraSetting(SCameraSetting * pCameraSetting); + void SaveCameraSetting(const char * c_szFileName); + bool LoadCameraSetting(const char * c_szFileName); + + void SetForceSightRange(int iRange); + + + public: + int OnLogoOpen(char* szName); + int OnLogoUpdate(); + void OnLogoRender(); + void OnLogoClose(); + + protected: + IGraphBuilder* m_pGraphBuilder; // Graph Builder + IBaseFilter* m_pFilterSG; // Sample Grabber 필터 + ISampleGrabber* m_pSampleGrabber; // 영상 이미지 캡처를 위한 샘플 그래버 + IMediaControl* m_pMediaCtrl; // Media Control + IMediaEventEx* m_pMediaEvent; // Media Event + IVideoWindow* m_pVideoWnd; // Video Window + IBasicVideo* m_pBasicVideo; + BYTE* m_pCaptureBuffer; // 영상 이미지를 캡처한 버퍼 + LONG m_lBufferSize; // Video 버퍼 크기 변수 + CGraphicImageTexture* m_pLogoTex; // 출력할 텍스쳐 + bool m_bLogoError; // 영상 읽기 상태 + bool m_bLogoPlay; + + int m_nLeft, m_nRight, m_nTop, m_nBottom; + + + protected: + LRESULT WindowProcedure(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam); + + void OnCameraUpdate(); + + void OnUIUpdate(); + void OnUIRender(); + + void OnMouseUpdate(); + void OnMouseRender(); + + void OnMouseWheel(int nLen); + void OnMouseMove(int x, int y); + void OnMouseMiddleButtonDown(int x, int y); + void OnMouseMiddleButtonUp(int x, int y); + void OnMouseLeftButtonDown(int x, int y); + void OnMouseLeftButtonUp(int x, int y); + void OnMouseLeftButtonDoubleClick(int x, int y); + void OnMouseRightButtonDown(int x, int y); + void OnMouseRightButtonUp(int x, int y); + void OnSizeChange(int width, int height); + void OnKeyDown(int iIndex); + void OnKeyUp(int iIndex); + void OnIMEKeyDown(int iIndex); + + int CheckDeviceState(); + + BOOL __IsContinuousChangeTypeCursor(int iCursorNum); + + void __UpdateCamera(); + + void __SetFullScreenWindow(HWND hWnd, DWORD dwWidth, DWORD dwHeight, DWORD dwBPP); + void __MinimizeFullScreenWindow(HWND hWnd, DWORD dwWidth, DWORD dwHeight); + + + protected: + CTimer m_timer; + + CLightManager m_LightManager; + CSoundManager m_SoundManager; + CFlyingManager m_FlyingManager; + CRaceManager m_RaceManager; + CGameEventManager m_GameEventManager; + CItemManager m_kItemMgr; + CMovieMan m_MovieManager; + + UI::CWindowManager m_kWndMgr; + CEffectManager m_kEftMgr; + CPythonCharacterManager m_kChrMgr; + + CServerStateChecker m_kServerStateChecker; + CPythonGraphic m_pyGraphic; + CPythonNetworkStream m_pyNetworkStream; + //CPythonNetworkDatagram m_pyNetworkDatagram; + CPythonPlayer m_pyPlayer; + CPythonIME m_pyIme; + CPythonItem m_pyItem; + CPythonShop m_pyShop; + CPythonExchange m_pyExchange; + CPythonChat m_pyChat; + CPythonTextTail m_pyTextTail; + CPythonNonPlayer m_pyNonPlayer; + CPythonMiniMap m_pyMiniMap; + CPythonEventManager m_pyEventManager; + CPythonBackground m_pyBackground; + CPythonSkill m_pySkill; + CPythonResource m_pyRes; + CPythonQuest m_pyQuest; + CPythonMessenger m_pyManager; + CPythonSafeBox m_pySafeBox; + CPythonGuild m_pyGuild; + + CGuildMarkManager m_kGuildMarkManager; + CGuildMarkDownloader m_kGuildMarkDownloader; + CGuildMarkUploader m_kGuildMarkUploader; + CAccountConnector m_kAccountConnector; + + CGraphicDevice m_grpDevice; + CNetworkDevice m_netDevice; + + CPythonSystem m_pySystem; + + + PyObject * m_poMouseHandler; + D3DXVECTOR3 m_v3CenterPosition; + + unsigned int m_iFPS; + float m_fAveRenderTime; + DWORD m_dwCurRenderTime; + DWORD m_dwCurUpdateTime; + DWORD m_dwLoad; + DWORD m_dwWidth; + DWORD m_dwHeight; + + protected: + // Time + DWORD m_dwLastIdleTime; + DWORD m_dwStartLocalTime; + time_t m_tServerTime; + time_t m_tLocalStartTime; + float m_fGlobalTime; + float m_fGlobalElapsedTime; + + ///////////////////////////////////////////////////////////// + // Camera + SCameraSetting m_DefaultCameraSetting; + SCameraSetting m_kEventCameraSetting; + + int m_iCameraMode; + float m_fBlendCameraStartTime; + float m_fBlendCameraBlendTime; + SCameraSetting m_kEndBlendCameraSetting; + + float m_fRotationSpeed; + float m_fPitchSpeed; + float m_fZoomSpeed; + float m_fCameraRotateSpeed; + float m_fCameraPitchSpeed; + float m_fCameraZoomSpeed; + + SCameraPos m_kCmrPos; + SCameraSpeed m_kCmrSpd; + + BOOL m_isSpecialCameraMode; + // Camera + ///////////////////////////////////////////////////////////// + + float m_fFaceSpd; + DWORD m_dwFaceSpdSum; + DWORD m_dwFaceSpdCount; + + DWORD m_dwFaceAccCount; + DWORD m_dwFaceAccTime; + + DWORD m_dwUpdateFPS; + DWORD m_dwRenderFPS; + DWORD m_dwFaceCount; + + DWORD m_dwLButtonDownTime; + DWORD m_dwLButtonUpTime; + + typedef std::map TCursorHandleMap; + TCursorHandleMap m_CursorHandleMap; + HANDLE m_hCurrentCursor; + + BOOL m_bCursorVisible; + bool m_bLiarCursorOn; + int m_iCursorMode; + bool m_isWindowed; + bool m_isFrameSkipDisable; + + // Connect Data + std::string m_strIP; + int m_iPort; + + static CPythonApplication* ms_pInstance; + + bool m_isMinimizedWnd; + bool m_isActivateWnd; + BOOL m_isWindowFullScreenEnable; + + DWORD m_dwStickyKeysFlag; + DWORD m_dwBufSleepSkipTime; + int m_iForceSightRange; + + protected: + int m_iCursorNum; + int m_iContinuousCursorNum; +}; diff --git a/extension/src/port/UserInterface/PythonApplicationModule.cpp b/extension/src/port/UserInterface/PythonApplicationModule.cpp new file mode 100644 index 00000000..c9398a7a --- /dev/null +++ b/extension/src/port/UserInterface/PythonApplicationModule.cpp @@ -0,0 +1,1529 @@ +#include "StdAfx.h" +#include "../common/PortPythonPointer.h" // PORT: text-file handles must keep pointer width. +#include "resource.h" +#include "PythonApplication.h" +#include "../EterLib/Camera.h" + +extern bool PERF_CHECKER_RENDER_GAME; +extern D3DXCOLOR g_fSpecularColor; +extern BOOL bVisibleNotice = true; +extern BOOL bTestServerFlag = FALSE; +extern int TWOHANDED_WEWAPON_ATT_SPEED_DECREASE_VALUE = 0; + +#ifdef USE_OPENID +extern int openid_test; +#endif + +PyObject* appShowWebPage(PyObject* poSelf, PyObject* poArgs) +{ + char* szWebPage; + if (!PyTuple_GetString(poArgs, 0, &szWebPage)) + return Py_BuildException(); + + PyObject* poRect=PyTuple_GetItem(poArgs, 1); + if (!PyTuple_Check(poRect)) + return Py_BuildException(); + + RECT rcWebPage; + rcWebPage.left=PyInt_AsLong(PyTuple_GetItem(poRect, 0)); + rcWebPage.top=PyInt_AsLong(PyTuple_GetItem(poRect, 1)); + rcWebPage.right=PyInt_AsLong(PyTuple_GetItem(poRect, 2)); + rcWebPage.bottom=PyInt_AsLong(PyTuple_GetItem(poRect, 3)); + + CPythonApplication::Instance().ShowWebPage( + szWebPage, + rcWebPage + ); + return Py_BuildNone(); +} + +PyObject* appMoveWebPage(PyObject* poSelf, PyObject* poArgs) +{ + PyObject* poRect=PyTuple_GetItem(poArgs, 0); + if (!PyTuple_Check(poRect)) + return Py_BuildException(); + + RECT rcWebPage; + rcWebPage.left=PyInt_AsLong(PyTuple_GetItem(poRect, 0)); + rcWebPage.top=PyInt_AsLong(PyTuple_GetItem(poRect, 1)); + rcWebPage.right=PyInt_AsLong(PyTuple_GetItem(poRect, 2)); + rcWebPage.bottom=PyInt_AsLong(PyTuple_GetItem(poRect, 3)); + + CPythonApplication::Instance().MoveWebPage(rcWebPage); + return Py_BuildNone(); +} + +PyObject* appHideWebPage(PyObject* poSelf, PyObject* poArgs) +{ + CPythonApplication::Instance().HideWebPage(); + return Py_BuildNone(); +} + + +PyObject * appIsWebPageMode(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", CPythonApplication::Instance().IsWebPageMode()); +} + +PyObject* appEnablePerformanceTime(PyObject* poSelf, PyObject* poArgs) +{ + char* szMode; + if (!PyTuple_GetString(poArgs, 0, &szMode)) + return Py_BuildException(); + + int nEnable; + if (!PyTuple_GetInteger(poArgs, 1, &nEnable)) + return Py_BuildException(); + + bool isEnable=nEnable ? true : false; + + if (strcmp(szMode, "RENDER_GAME")==0) + PERF_CHECKER_RENDER_GAME = isEnable; + + return Py_BuildNone(); +} + +///////////////////////////////////////////////////// + +extern BOOL HAIR_COLOR_ENABLE; +extern BOOL USE_ARMOR_SPECULAR; +extern BOOL USE_WEAPON_SPECULAR; +extern BOOL SKILL_EFFECT_UPGRADE_ENABLE; +extern BOOL RIDE_HORSE_ENABLE; +extern double g_specularSpd; + +// TEXTTAIL_LIVINGTIME_CONTROL +extern void TextTail_SetLivingTime(long livingTime); + +PyObject* appSetTextTailLivingTime(PyObject* poSelf, PyObject* poArgs) +{ + float livingTime; + if (!PyTuple_GetFloat(poArgs, 0, &livingTime)) + return Py_BuildException(); + + TextTail_SetLivingTime(livingTime*1000); + + return Py_BuildNone(); +} +// END_OF_TEXTTAIL_LIVINGTIME_CONTROL + +PyObject* appSetHairColorEnable(PyObject* poSelf, PyObject* poArgs) +{ + int nEnable; + if (!PyTuple_GetInteger(poArgs, 0, &nEnable)) + return Py_BuildException(); + + HAIR_COLOR_ENABLE=nEnable; + + return Py_BuildNone(); +} + +PyObject* appSetArmorSpecularEnable(PyObject* poSelf, PyObject* poArgs) +{ + int nEnable; + if (!PyTuple_GetInteger(poArgs, 0, &nEnable)) + return Py_BuildException(); + + USE_ARMOR_SPECULAR=nEnable; + + return Py_BuildNone(); +} + +PyObject* appSetWeaponSpecularEnable(PyObject* poSelf, PyObject* poArgs) +{ + int nEnable; + if (!PyTuple_GetInteger(poArgs, 0, &nEnable)) + return Py_BuildException(); + + USE_WEAPON_SPECULAR=nEnable; + + return Py_BuildNone(); +} + +PyObject* appSetSkillEffectUpgradeEnable(PyObject* poSelf, PyObject* poArgs) +{ + int nEnable; + if (!PyTuple_GetInteger(poArgs, 0, &nEnable)) + return Py_BuildException(); + + SKILL_EFFECT_UPGRADE_ENABLE=nEnable; + + return Py_BuildNone(); +} + +PyObject* SetTwoHandedWeaponAttSpeedDecreaseValue(PyObject* poSelf, PyObject* poArgs) +{ + int iValue; + if (!PyTuple_GetInteger(poArgs, 0, &iValue)) + return Py_BuildException(); + + TWOHANDED_WEWAPON_ATT_SPEED_DECREASE_VALUE = iValue; + + return Py_BuildNone(); +} + +PyObject* appSetRideHorseEnable(PyObject* poSelf, PyObject* poArgs) +{ + int nEnable; + if (!PyTuple_GetInteger(poArgs, 0, &nEnable)) + return Py_BuildException(); + + RIDE_HORSE_ENABLE=nEnable; + + return Py_BuildNone(); +} + +PyObject* appSetCameraMaxDistance(PyObject* poSelf, PyObject* poArgs) +{ + float fMax; + if (!PyTuple_GetFloat(poArgs, 0, &fMax)) + return Py_BuildException(); + + CCamera::SetCameraMaxDistance(fMax); + return Py_BuildNone(); +} + +PyObject* appSetControlFP(PyObject* poSelf, PyObject* poArgs) +{ + _controlfp( _PC_24, _MCW_PC ); + return Py_BuildNone(); +} + +PyObject* appSetSpecularSpeed(PyObject* poSelf, PyObject* poArgs) +{ + float fSpeed; + if (!PyTuple_GetFloat(poArgs, 0, &fSpeed)) + return Py_BuildException(); + + g_specularSpd = fSpeed; + + return Py_BuildNone(); +} + +PyObject * appSetMinFog(PyObject * poSelf, PyObject * poArgs) +{ + float fMinFog; + if (!PyTuple_GetFloat(poArgs, 0, &fMinFog)) + return Py_BuildException(); + + CPythonApplication::Instance().SetMinFog(fMinFog); + return Py_BuildNone(); +} + +PyObject* appSetFrameSkip(PyObject* poSelf, PyObject* poArgs) +{ + int nFrameSkip; + if (!PyTuple_GetInteger(poArgs, 0, &nFrameSkip)) + return Py_BuildException(); + + CPythonApplication::Instance().SetFrameSkip(nFrameSkip ? true : false); + return Py_BuildNone(); +} + +// LOCALE + +PyObject* appForceSetLocale(PyObject* poSelf, PyObject* poArgs) +{ + char* szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + char* szLocalePath; + if (!PyTuple_GetString(poArgs, 1, &szLocalePath)) + return Py_BuildException(); + + LocaleService_ForceSetLocale(szName, szLocalePath); + + return Py_BuildNone(); +} + +PyObject* appGetLocaleServiceName(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("s", LocaleService_GetName()); +} + +// +bool LoadLocaleData(const char* localePath); + +PyObject* appSetCHEONMA(PyObject* poSelf, PyObject* poArgs) +{ + int enable; + if (!PyTuple_GetInteger(poArgs, 0, &enable)) + return Py_BuildException(); + + LocaleService_SetCHEONMA(enable ? true : false); + return Py_BuildNone(); +} + +PyObject* appIsCHEONMA(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("i", LocaleService_IsCHEONMA()); +} + +#include "../EterBase/tea.h" + +PyObject* appLoadLocaleAddr(PyObject* poSelf, PyObject* poArgs) +{ + char* addrPath; + if (!PyTuple_GetString(poArgs, 0, &addrPath)) + return Py_BuildException(); + + FILE* fp = fopen(addrPath, "rb"); + if (!fp) + return Py_BuildException(); + + fseek(fp, 0, SEEK_END); + + int size = ftell(fp); + char* enc = (char*)_alloca(size); + fseek(fp, 0, SEEK_SET); + fread(enc, size, 1, fp); + fclose(fp); + + static const unsigned char key[16] = { + 0x82, 0x1b, 0x34, 0xae, + 0x12, 0x3b, 0xfb, 0x17, + 0xd7, 0x2c, 0x39, 0xae, + 0x41, 0x98, 0xf1, 0x63 + }; + + char* buf = (char*)_alloca(size); + //int decSize = + // PORT: 40250 unsigned long is 32-bit; tea_word preserves that width on LP64 hosts. + tea_decrypt((tea_word*)buf, (const tea_word*)enc, (const tea_word*)key, size); + unsigned int retSize = *(unsigned int*)buf; + char* ret = buf + sizeof(unsigned int); + return Py_BuildValue("s#", ret, retSize); +} + +PyObject* appLoadLocaleData(PyObject* poSelf, PyObject* poArgs) +{ + char* localePath; + if (!PyTuple_GetString(poArgs, 0, &localePath)) + return Py_BuildException(); + + return Py_BuildValue("i", LoadLocaleData(localePath)); +} + +PyObject* appGetLocaleName(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("s", LocaleService_GetLocaleName()); +} + +PyObject* appGetLocalePath(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("s", LocaleService_GetLocalePath()); +} +// END_OF_LOCALE + +PyObject* appGetDefaultCodePage(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("i", LocaleService_GetCodePage()); +} + +#ifdef __VTUNE__ + +PyObject* appGetImageInfo(PyObject* poSelf, PyObject* poArgs) +{ + char* szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BuildException(); + + return Py_BuildValue("iii", 0, 0, 0); +} + +#else + +#include + +PyObject* appGetImageInfo(PyObject* poSelf, PyObject* poArgs) +{ + char* szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BuildException(); + + BOOL canLoad=FALSE; + ILuint uWidth=0; + ILuint uHeight=0; + + ILuint uImg; + ilGenImages(1, &uImg); + ilBindImage(uImg); + if (ilLoad(IL_TYPE_UNKNOWN, szFileName)) + { + canLoad=TRUE; + uWidth=ilGetInteger(IL_IMAGE_WIDTH); + uHeight=ilGetInteger(IL_IMAGE_HEIGHT); + } + + ilDeleteImages(1, &uImg); + + return Py_BuildValue("iii", canLoad, uWidth, uHeight); +} +#endif + +#include "../EterPack/EterPackManager.h" + +PyObject* appIsExistFile(PyObject* poSelf, PyObject* poArgs) +{ + char* szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BuildException(); + + bool isExist=CEterPackManager::Instance().isExist(szFileName); + + return Py_BuildValue("i", isExist); +} + +PyObject* appGetFileList(PyObject* poSelf, PyObject* poArgs) +{ + char* szFilter; + if (!PyTuple_GetString(poArgs, 0, &szFilter)) + return Py_BuildException(); + + PyObject* poList=PyList_New(0); + + WIN32_FIND_DATA wfd; + memset(&wfd, 0, sizeof(wfd)); + + HANDLE hFind = FindFirstFile(szFilter, &wfd); + if (hFind != INVALID_HANDLE_VALUE) + { + do + { + PyObject* poFileName=PyString_FromString(wfd.cFileName) ; + PyList_Append(poList, poFileName); + } + while (FindNextFile(hFind, &wfd)); + + + FindClose(hFind); + } + + return poList; +} + + +PyObject* appUpdateGame(PyObject* poSelf, PyObject* poArgs) +{ + CPythonApplication::Instance().UpdateGame(); + return Py_BuildNone(); +} + +PyObject* appRenderGame(PyObject* poSelf, PyObject* poArgs) +{ + CPythonApplication::Instance().RenderGame(); + return Py_BuildNone(); +} + + + +PyObject* appSetMouseHandler(PyObject* poSelf, PyObject* poArgs) +{ + PyObject* poHandler; + if (!PyTuple_GetObject(poArgs, 0, &poHandler)) + return Py_BuildException(); + + CPythonApplication::Instance().SetMouseHandler(poHandler); + return Py_BuildNone(); +} + +PyObject* appCreate(PyObject* poSelf, PyObject* poArgs) +{ + char* szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + int width; + if (!PyTuple_GetInteger(poArgs, 1, &width)) + return Py_BuildException(); + + int height; + if (!PyTuple_GetInteger(poArgs, 2, &height)) + return Py_BuildException(); + + int Windowed; + if (!PyTuple_GetInteger(poArgs, 3, &Windowed)) + return Py_BuildException(); + + CPythonApplication& rkApp=CPythonApplication::Instance(); + if (!rkApp.Create(poSelf, szName, width, height, Windowed)) + { + //return Py_BuildNone(); + return NULL; + } + + return Py_BuildNone(); +} + +PyObject* appLoop(PyObject* poSelf, PyObject* poArgs) +{ + CPythonApplication::Instance().Loop(); + + return Py_BuildNone(); +} + +PyObject* appGetInfo(PyObject* poSelf, PyObject* poArgs) +{ + int nInfo; + if (!PyTuple_GetInteger(poArgs, 0, &nInfo)) + return Py_BuildException(); + + std::string stInfo; + CPythonApplication::Instance().GetInfo(nInfo, &stInfo); + return Py_BuildValue("s", stInfo.c_str()); +} + +PyObject* appProcess(PyObject* poSelf, PyObject* poArgs) +{ + if (CPythonApplication::Instance().Process()) + return Py_BuildValue("i", 1); + + return Py_BuildValue("i", 0); +} + +PyObject* appAbort(PyObject* poSelf, PyObject* poArgs) +{ + CPythonApplication::Instance().Abort(); + return Py_BuildNone(); +} + +PyObject* appExit(PyObject* poSelf, PyObject* poArgs) +{ + CPythonApplication::Instance().Exit(); + return Py_BuildNone(); +} + +PyObject * appSetCamera(PyObject * poSelf, PyObject * poArgs) +{ + float Distance; + if (!PyTuple_GetFloat(poArgs, 0, &Distance)) + return Py_BuildException(); + + float Pitch; + if (!PyTuple_GetFloat(poArgs, 1, &Pitch)) + return Py_BuildException(); + + float Rotation; + if (!PyTuple_GetFloat(poArgs, 2, &Rotation)) + return Py_BuildException(); + + float fDestinationHeight; + if (!PyTuple_GetFloat(poArgs, 3, &fDestinationHeight)) + return Py_BuildException(); + + CPythonApplication::Instance().SetCamera(Distance, Pitch, Rotation, fDestinationHeight); + return Py_BuildNone(); +} + +PyObject * appGetCamera(PyObject * poSelf, PyObject * poArgs) +{ + float Distance, Pitch, Rotation, DestinationHeight; + CPythonApplication::Instance().GetCamera(&Distance, &Pitch, &Rotation, &DestinationHeight); + + return Py_BuildValue("ffff", Distance, Pitch, Rotation, DestinationHeight); +} + +PyObject * appGetCameraPitch(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("f", CPythonApplication::Instance().GetPitch()); +} + +PyObject * appGetCameraRotation(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("f", CPythonApplication::Instance().GetRotation()); +} + +PyObject * appGetTime(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("f", CPythonApplication::Instance().GetGlobalTime()); +} + +PyObject * appGetGlobalTime(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", CPythonApplication::Instance().GetServerTime()); +} + +PyObject * appGetGlobalTimeStamp(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", CPythonApplication::Instance().GetServerTimeStamp()); +} + +PyObject * appGetUpdateFPS(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", CPythonApplication::Instance().GetUpdateFPS()); +} + +PyObject * appGetRenderFPS(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", CPythonApplication::Instance().GetRenderFPS()); +} + +PyObject * appRotateCamera(PyObject * poSelf, PyObject * poArgs) +{ + int iDirection; + if (!PyTuple_GetInteger(poArgs, 0, &iDirection)) + return Py_BuildException(); + CPythonApplication::Instance().RotateCamera(iDirection); + return Py_BuildNone(); +} + +PyObject * appPitchCamera(PyObject * poSelf, PyObject * poArgs) +{ + int iDirection; + if (!PyTuple_GetInteger(poArgs, 0, &iDirection)) + return Py_BuildException(); + CPythonApplication::Instance().PitchCamera(iDirection); + return Py_BuildNone(); +} + +PyObject * appZoomCamera(PyObject * poSelf, PyObject * poArgs) +{ + int iDirection; + if (!PyTuple_GetInteger(poArgs, 0, &iDirection)) + return Py_BuildException(); + CPythonApplication::Instance().ZoomCamera(iDirection); + return Py_BuildNone(); +} + +PyObject * appMovieRotateCamera(PyObject * poSelf, PyObject * poArgs) +{ + int iDirection; + if (!PyTuple_GetInteger(poArgs, 0, &iDirection)) + return Py_BuildException(); + CPythonApplication::Instance().MovieRotateCamera(iDirection); + return Py_BuildNone(); +} + +PyObject * appMoviePitchCamera(PyObject * poSelf, PyObject * poArgs) +{ + int iDirection; + if (!PyTuple_GetInteger(poArgs, 0, &iDirection)) + return Py_BuildException(); + CPythonApplication::Instance().MoviePitchCamera(iDirection); + return Py_BuildNone(); +} + +PyObject * appMovieZoomCamera(PyObject * poSelf, PyObject * poArgs) +{ + int iDirection; + if (!PyTuple_GetInteger(poArgs, 0, &iDirection)) + return Py_BuildException(); + CPythonApplication::Instance().MovieZoomCamera(iDirection); + return Py_BuildNone(); +} + +PyObject * appMovieResetCamera(PyObject * poSelf, PyObject * poArgs) +{ + CPythonApplication::Instance().MovieResetCamera(); + return Py_BuildNone(); +} + +PyObject * appGetFaceSpeed(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("f", CPythonApplication::Instance().GetFaceSpeed()); +} + +PyObject * appGetRenderTime(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("fi", + CPythonApplication::Instance().GetAveRenderTime(), + CPythonApplication::Instance().GetCurRenderTime()); +} + +PyObject * appGetUpdateTime(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", CPythonApplication::Instance().GetCurUpdateTime()); +} + +PyObject * appGetLoad(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", CPythonApplication::Instance().GetLoad()); +} +PyObject * appGetFaceCount(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", CPythonApplication::Instance().GetFaceCount()); +} + +PyObject * appGetAvaiableTextureMememory(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", CGraphicBase::GetAvailableTextureMemory()); +} + +PyObject * appSetFPS(PyObject * poSelf, PyObject * poArgs) +{ + int iFPS; + if (!PyTuple_GetInteger(poArgs, 0, &iFPS)) + return Py_BuildException(); + + CPythonApplication::Instance().SetFPS(iFPS); + + return Py_BuildNone(); +} + +PyObject * appSetGlobalCenterPosition(PyObject * poSelf, PyObject * poArgs) +{ + int x; + if (!PyTuple_GetInteger(poArgs, 0, &x)) + return Py_BuildException(); + + int y; + if (!PyTuple_GetInteger(poArgs, 1, &y)) + return Py_BuildException(); + + CPythonApplication::Instance().SetGlobalCenterPosition(x, y); + return Py_BuildNone(); +} + + +PyObject * appSetCenterPosition(PyObject * poSelf, PyObject * poArgs) +{ + float fx; + if (!PyTuple_GetFloat(poArgs, 0, &fx)) + return Py_BuildException(); + + float fy; + if (!PyTuple_GetFloat(poArgs, 1, &fy)) + return Py_BuildException(); + + float fz; + if (!PyTuple_GetFloat(poArgs, 2, &fz)) + return Py_BuildException(); + + CPythonApplication::Instance().SetCenterPosition(fx, -fy, fz); + return Py_BuildNone(); +} + +PyObject * appGetCursorPosition(PyObject * poSelf, PyObject * poArgs) +{ + long lx, ly; + UI::CWindowManager& rkWndMgr=UI::CWindowManager::Instance(); + rkWndMgr.GetMousePosition(lx, ly); + + return Py_BuildValue("ii", lx, ly); +} + +PyObject * appRunPythonFile(PyObject * poSelf, PyObject * poArgs) +{ + char *szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BuildException(); + + bool ret = CPythonLauncher::Instance().RunFile(szFileName); + return Py_BuildValue("i", ret); +} + +PyObject * appIsPressed(PyObject * poSelf, PyObject * poArgs) +{ + int iKey; + if (!PyTuple_GetInteger(poArgs, 0, &iKey)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonApplication::Instance().IsPressed(iKey)); +} + +PyObject * appSetCursor(PyObject * poSelf, PyObject * poArgs) +{ +/* + char * szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + if (!CPythonApplication::Instance().SetHardwareCursor(szName)) + return Py_BuildException("Wrong Cursor Name [%s]", szName); +*/ + int iCursorNum; + if (!PyTuple_GetInteger(poArgs, 0, &iCursorNum)) + return Py_BuildException(); + + if (!CPythonApplication::Instance().SetCursorNum(iCursorNum)) + return Py_BuildException("Wrong Cursor Name [%d]", iCursorNum); + + return Py_BuildNone(); +} + +PyObject * appGetCursor(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", CPythonApplication::Instance().GetCursorNum()); +} + +PyObject * appShowCursor(PyObject * poSelf, PyObject * poArgs) +{ + CPythonApplication::Instance().SetCursorVisible(TRUE); + + return Py_BuildNone(); +} + +PyObject * appHideCursor(PyObject * poSelf, PyObject * poArgs) +{ + CPythonApplication::Instance().SetCursorVisible(FALSE); + + return Py_BuildNone(); +} + +PyObject * appIsShowCursor(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", TRUE == CPythonApplication::Instance().GetCursorVisible()); +} + +PyObject * appIsLiarCursorOn(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", TRUE == CPythonApplication::Instance().GetLiarCursorOn()); +} + +PyObject * appSetSoftwareCursor(PyObject * poSelf, PyObject * poArgs) +{ + CPythonApplication::Instance().SetCursorMode(CPythonApplication::CURSOR_MODE_SOFTWARE); + return Py_BuildNone(); +} + +PyObject * appSetHardwareCursor(PyObject * poSelf, PyObject * poArgs) +{ + CPythonApplication::Instance().SetCursorMode(CPythonApplication::CURSOR_MODE_HARDWARE); + return Py_BuildNone(); +} + +PyObject * appSetConnectData(PyObject * poSelf, PyObject * poArgs) +{ + char * szIP; + if (!PyTuple_GetString(poArgs, 0, &szIP)) + return Py_BuildException(); + + int iPort; + if (!PyTuple_GetInteger(poArgs, 1, &iPort)) + return Py_BuildException(); + + CPythonApplication::Instance().SetConnectData(szIP, iPort); + + return Py_BuildNone(); +} + +PyObject * appGetConnectData(PyObject * poSelf, PyObject * poArgs) +{ + std::string strIP; + int iPort; + + CPythonApplication::Instance().GetConnectData(strIP, iPort); + + return Py_BuildValue("si", strIP.c_str(), iPort); +} + +PyObject * appGetRandom(PyObject * poSelf, PyObject * poArgs) +{ + int from; + if (!PyTuple_GetInteger(poArgs, 0, &from)) + return Py_BuildException(); + + int to; + if (!PyTuple_GetInteger(poArgs, 1, &to)) + return Py_BuildException(); + + if (from > to) + { + int tmp = from; + from = to; + to = tmp; + } + + return Py_BuildValue("i", random_range(from, to)); +} + +PyObject * appGetRotatingDirection(PyObject * poSelf, PyObject * poArgs) +{ + float fSource; + if (!PyTuple_GetFloat(poArgs, 0, &fSource)) + return Py_BuildException(); + float fTarget; + if (!PyTuple_GetFloat(poArgs, 1, &fTarget)) + return Py_BuildException(); + + return Py_BuildValue("i", GetRotatingDirection(fSource, fTarget)); +} + +PyObject * appGetDegreeDifference(PyObject * poSelf, PyObject * poArgs) +{ + float fSource; + if (!PyTuple_GetFloat(poArgs, 0, &fSource)) + return Py_BuildException(); + float fTarget; + if (!PyTuple_GetFloat(poArgs, 1, &fTarget)) + return Py_BuildException(); + + return Py_BuildValue("f", GetDegreeDifference(fSource, fTarget)); +} + +PyObject * appSleep(PyObject * poSelf, PyObject * poArgs) +{ + int iTime; + if (!PyTuple_GetInteger(poArgs, 0, &iTime)) + return Py_BuildException(); + + Sleep(iTime); + + return Py_BuildNone(); +} + +PyObject * appSetDefaultFontName(PyObject * poSelf, PyObject * poArgs) +{ + char * szFontName; + if (!PyTuple_GetString(poArgs, 0, &szFontName)) + return Py_BuildException(); + + // DEFAULT_FONT + DefaultFont_SetName(szFontName); + // END_OF_DEFAULT_FONT + + return Py_BuildNone(); +} + +PyObject * appSetGuildSymbolPath(PyObject * poSelf, PyObject * poArgs) +{ + char * szPathName; + if (!PyTuple_GetString(poArgs, 0, &szPathName)) + return Py_BuildException(); + + SetGuildSymbolPath(szPathName); + + return Py_BuildNone(); +} + +PyObject * appEnableSpecialCameraMode(PyObject * poSelf, PyObject * poArgs) +{ + CPythonApplication::Instance().EnableSpecialCameraMode(); + return Py_BuildNone(); +} + +PyObject * appSetCameraSpeed(PyObject * poSelf, PyObject * poArgs) +{ + int iPercentage; + if (!PyTuple_GetInteger(poArgs, 0, &iPercentage)) + return Py_BuildException(); + + CPythonApplication::Instance().SetCameraSpeed(iPercentage); + + CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera(); + if (pCamera) + pCamera->SetResistance(float(iPercentage) / 100.0f); + return Py_BuildNone(); +} + +PyObject * appIsFileExist(PyObject * poSelf, PyObject * poArgs) +{ + char * szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BuildException(); + + return Py_BuildValue("i", -1 != _access(szFileName, 0)); +} + +PyObject * appSetCameraSetting(PyObject * poSelf, PyObject * poArgs) +{ + int ix; + if (!PyTuple_GetInteger(poArgs, 0, &ix)) + return Py_BuildException(); + int iy; + if (!PyTuple_GetInteger(poArgs, 1, &iy)) + return Py_BuildException(); + int iz; + if (!PyTuple_GetInteger(poArgs, 2, &iz)) + return Py_BuildException(); + + int iZoom; + if (!PyTuple_GetInteger(poArgs, 3, &iZoom)) + return Py_BuildException(); + int iRotation; + if (!PyTuple_GetInteger(poArgs, 4, &iRotation)) + return Py_BuildException(); + int iPitch; + if (!PyTuple_GetInteger(poArgs, 5, &iPitch)) + return Py_BuildException(); + + CPythonApplication::SCameraSetting CameraSetting; + ZeroMemory(&CameraSetting, sizeof(CameraSetting)); + CameraSetting.v3CenterPosition.x = float(ix); + CameraSetting.v3CenterPosition.y = float(iy); + CameraSetting.v3CenterPosition.z = float(iz); + CameraSetting.fZoom = float(iZoom); + CameraSetting.fRotation = float(iRotation); + CameraSetting.fPitch = float(iPitch); + CPythonApplication::Instance().SetEventCamera(CameraSetting); + return Py_BuildNone(); +} + +PyObject * appSaveCameraSetting(PyObject * poSelf, PyObject * poArgs) +{ + char * szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BuildException(); + + CPythonApplication::Instance().SaveCameraSetting(szFileName); + return Py_BuildNone(); +} + +PyObject * appLoadCameraSetting(PyObject * poSelf, PyObject * poArgs) +{ + char * szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BuildException(); + + bool bResult = CPythonApplication::Instance().LoadCameraSetting(szFileName); + return Py_BuildValue("i", bResult); +} + +PyObject * appSetDefaultCamera(PyObject * poSelf, PyObject * poArgs) +{ + CPythonApplication::Instance().SetDefaultCamera(); + return Py_BuildNone(); +} + +PyObject * appSetSightRange(PyObject * poSelf, PyObject * poArgs) +{ + int iRange; + if (!PyTuple_GetInteger(poArgs, 0, &iRange)) + return Py_BuildException(); + + CPythonApplication::Instance().SetForceSightRange(iRange); + return Py_BuildNone(); +} + +extern int g_iAccumulationTime; + +PyObject * apptestGetAccumulationTime(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", g_iAccumulationTime); +} + +PyObject * apptestResetAccumulationTime(PyObject * poSelf, PyObject * poArgs) +{ + g_iAccumulationTime = 0; + return Py_BuildNone(); +} + +PyObject * apptestSetSpecularColor(PyObject * poSelf, PyObject * poArgs) +{ + float fr; + if (!PyTuple_GetFloat(poArgs, 0, &fr)) + return Py_BuildException(); + float fg; + if (!PyTuple_GetFloat(poArgs, 1, &fg)) + return Py_BuildException(); + float fb; + if (!PyTuple_GetFloat(poArgs, 2, &fb)) + return Py_BuildException(); + g_fSpecularColor = D3DXCOLOR(fr, fg, fb, 1.0f); + return Py_BuildNone(); +} + +PyObject * appSetVisibleNotice(PyObject * poSelf, PyObject * poArgs) +{ + int iFlag; + if (!PyTuple_GetInteger(poArgs, 0, &iFlag)) + return Py_BuildException(); + bVisibleNotice = iFlag; + return Py_BuildNone(); +} + +PyObject * appIsVisibleNotice(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", bVisibleNotice); +} + +PyObject * appEnableTestServerFlag(PyObject * poSelf, PyObject * poArgs) +{ + bTestServerFlag = TRUE; + return Py_BuildNone(); +} + +PyObject * appIsEnableTestServerFlag(PyObject * poSelf, PyObject * poArgs) +{ + return Py_BuildValue("i", bTestServerFlag); +} + +class CTextLineLoader +{ + public: + CTextLineLoader(const char * c_szFileName) + { + const VOID* pvData; + CMappedFile kFile; + if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData)) + return; + + m_kTextFileLoader.Bind(kFile.Size(), pvData); + } + + DWORD GetLineCount() + { + return m_kTextFileLoader.GetLineCount(); + } + + const char * GetLine(DWORD dwIndex) + { + if (dwIndex >= GetLineCount()) + return ""; + + return m_kTextFileLoader.GetLineString(dwIndex).c_str(); + } + + protected: + CMemoryTextFileLoader m_kTextFileLoader; +}; + +PyObject * appOpenTextFile(PyObject * poSelf, PyObject * poArgs) +{ + char * szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BuildException(); + + CTextLineLoader * pTextLineLoader = new CTextLineLoader(szFileName); + + return Py_BuildPointer(pTextLineLoader); +} + +PyObject * appCloseTextFile(PyObject * poSelf, PyObject * poArgs) +{ + CTextLineLoader* pTextFileLoader; + if (!PyTuple_GetPointer(poArgs, 0, &pTextFileLoader)) + return Py_BuildException(); + + delete pTextFileLoader; + + return Py_BuildNone(); +} + +PyObject * appGetTextFileLineCount(PyObject * poSelf, PyObject * poArgs) +{ + CTextLineLoader* pTextFileLoader; + if (!PyTuple_GetPointer(poArgs, 0, &pTextFileLoader)) + return Py_BuildException(); + + return Py_BuildValue("i", pTextFileLoader->GetLineCount()); +} + +PyObject * appGetTextFileLine(PyObject * poSelf, PyObject * poArgs) +{ + CTextLineLoader* pTextFileLoader; + if (!PyTuple_GetPointer(poArgs, 0, &pTextFileLoader)) + return Py_BuildException(); + int iLineIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iLineIndex)) + return Py_BuildException(); + + return Py_BuildValue("s", pTextFileLoader->GetLine(iLineIndex)); +} + +PyObject * appSetGuildMarkPath(PyObject * poSelf, PyObject * poArgs) +{ + char * path; + if (!PyTuple_GetString(poArgs, 0, &path)) + return Py_BuildException(); + + char newPath[256]; + char * ext = strstr(path, ".tga"); + + if (ext) + { + int extPos = ext - path; + strncpy(newPath, path, extPos); + newPath[extPos] = '\0'; + } + else + strncpy(newPath, path, sizeof(newPath)-1); + + CGuildMarkManager::Instance().SetMarkPathPrefix(newPath); + return Py_BuildNone(); +} + +PyObject* appIsDevStage(PyObject* poSelf, PyObject* poArgs) +{ + int nIsDevelopmentStage = 0; +#if defined(LOCALE_SERVICE_STAGE_DEVELOPMENT) + nIsDevelopmentStage = 1; +#endif + return Py_BuildValue("i", nIsDevelopmentStage); +} + +PyObject* appIsTestStage(PyObject* poSelf, PyObject* poArgs) +{ + int nIsTestStage = 0; +#if defined(LOCALE_SERVICE_STAGE_TEST) + nIsTestStage = 1; +#endif + return Py_BuildValue("i", nIsTestStage); +} + +PyObject* appIsLiveStage(PyObject* poSelf, PyObject* poArgs) +{ + int nIsLiveStage = 0; +#if !defined(LOCALE_SERVICE_STAGE_TEST) && !defined(LOCALE_SERVICE_STAGE_DEVELOPMENT) + nIsLiveStage = 1; +#endif + return Py_BuildValue("i", nIsLiveStage); +} + +PyObject* appLogoOpen(PyObject* poSelf, PyObject* poArgs) +{ + char* szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + int nIsSuccess = 1; //CPythonApplication::Instance().OnLogoOpen(szName); + CMovieMan::Instance().PlayLogo(szName); + + return Py_BuildValue("i", nIsSuccess); +} + +PyObject* appLogoUpdate(PyObject* poSelf, PyObject* poArgs) +{ + int nIsRun = 0; //CPythonApplication::Instance().OnLogoUpdate(); + return Py_BuildValue("i", nIsRun); +} + +PyObject* appLogoRender(PyObject* poSelf, PyObject* poArgs) +{ + //CPythonApplication::Instance().OnLogoRender(); + return Py_BuildNone(); +} + +PyObject* appLogoClose(PyObject* poSelf, PyObject* poArgs) +{ + //CPythonApplication::Instance().OnLogoClose(); + return Py_BuildNone(); +} + +void initapp() +{ + static PyMethodDef s_methods[] = + { + { "IsDevStage", appIsDevStage, METH_VARARGS }, + { "IsTestStage", appIsTestStage, METH_VARARGS }, + { "IsLiveStage", appIsLiveStage, METH_VARARGS }, + + // TEXTTAIL_LIVINGTIME_CONTROL + { "SetTextTailLivingTime", appSetTextTailLivingTime, METH_VARARGS }, + // END_OF_TEXTTAIL_LIVINGTIME_CONTROL + + { "EnablePerformanceTime", appEnablePerformanceTime, METH_VARARGS }, + { "SetHairColorEnable", appSetHairColorEnable, METH_VARARGS }, + + { "SetArmorSpecularEnable", appSetArmorSpecularEnable, METH_VARARGS }, + { "SetWeaponSpecularEnable", appSetWeaponSpecularEnable, METH_VARARGS }, + { "SetSkillEffectUpgradeEnable",appSetSkillEffectUpgradeEnable, METH_VARARGS }, + { "SetTwoHandedWeaponAttSpeedDecreaseValue", SetTwoHandedWeaponAttSpeedDecreaseValue, METH_VARARGS }, + { "SetRideHorseEnable", appSetRideHorseEnable, METH_VARARGS }, + + { "SetCameraMaxDistance", appSetCameraMaxDistance, METH_VARARGS }, + { "SetMinFog", appSetMinFog, METH_VARARGS }, + { "SetFrameSkip", appSetFrameSkip, METH_VARARGS }, + { "GetImageInfo", appGetImageInfo, METH_VARARGS }, + { "GetInfo", appGetInfo, METH_VARARGS }, + { "UpdateGame", appUpdateGame, METH_VARARGS }, + { "RenderGame", appRenderGame, METH_VARARGS }, + { "Loop", appLoop, METH_VARARGS }, + { "Create", appCreate, METH_VARARGS }, + { "Process", appProcess, METH_VARARGS }, + { "Exit", appExit, METH_VARARGS }, + { "Abort", appAbort, METH_VARARGS }, + { "SetMouseHandler", appSetMouseHandler, METH_VARARGS }, + { "IsExistFile", appIsExistFile, METH_VARARGS }, + { "GetFileList", appGetFileList, METH_VARARGS }, + + { "SetCamera", appSetCamera, METH_VARARGS }, + { "GetCamera", appGetCamera, METH_VARARGS }, + { "GetCameraPitch", appGetCameraPitch, METH_VARARGS }, + { "GetCameraRotation", appGetCameraRotation, METH_VARARGS }, + { "GetTime", appGetTime, METH_VARARGS }, + { "GetGlobalTime", appGetGlobalTime, METH_VARARGS }, + { "GetGlobalTimeStamp", appGetGlobalTimeStamp, METH_VARARGS }, + { "GetUpdateFPS", appGetUpdateFPS, METH_VARARGS }, + { "GetRenderFPS", appGetRenderFPS, METH_VARARGS }, + { "RotateCamera", appRotateCamera, METH_VARARGS }, + { "PitchCamera", appPitchCamera, METH_VARARGS }, + { "ZoomCamera", appZoomCamera, METH_VARARGS }, + { "MovieRotateCamera", appMovieRotateCamera, METH_VARARGS }, + { "MoviePitchCamera", appMoviePitchCamera, METH_VARARGS }, + { "MovieZoomCamera", appMovieZoomCamera, METH_VARARGS }, + { "MovieResetCamera", appMovieResetCamera, METH_VARARGS }, + + { "GetAvailableTextureMemory", appGetAvaiableTextureMememory, METH_VARARGS }, + { "GetRenderTime", appGetRenderTime, METH_VARARGS }, + { "GetUpdateTime", appGetUpdateTime, METH_VARARGS }, + { "GetLoad", appGetLoad, METH_VARARGS }, + { "GetFaceSpeed", appGetFaceSpeed, METH_VARARGS }, + { "GetFaceCount", appGetFaceCount, METH_VARARGS }, + { "SetFPS", appSetFPS, METH_VARARGS }, + { "SetGlobalCenterPosition", appSetGlobalCenterPosition, METH_VARARGS }, + { "SetCenterPosition", appSetCenterPosition, METH_VARARGS }, + { "GetCursorPosition", appGetCursorPosition, METH_VARARGS }, + + { "GetRandom", appGetRandom, METH_VARARGS }, + { "RunPythonFile", appRunPythonFile, METH_VARARGS }, + { "IsWebPageMode", appIsWebPageMode, METH_VARARGS }, + { "ShowWebPage", appShowWebPage, METH_VARARGS }, + { "MoveWebPage", appMoveWebPage, METH_VARARGS }, + { "HideWebPage", appHideWebPage, METH_VARARGS }, + { "IsPressed", appIsPressed, METH_VARARGS }, + { "SetCursor", appSetCursor, METH_VARARGS }, + { "GetCursor", appGetCursor, METH_VARARGS }, + { "ShowCursor", appShowCursor, METH_VARARGS }, + { "HideCursor", appHideCursor, METH_VARARGS }, + { "IsShowCursor", appIsShowCursor, METH_VARARGS }, + { "IsLiarCursorOn", appIsLiarCursorOn, METH_VARARGS }, + { "SetSoftwareCursor", appSetSoftwareCursor, METH_VARARGS }, + { "SetHardwareCursor", appSetHardwareCursor, METH_VARARGS }, + + { "SetConnectData", appSetConnectData, METH_VARARGS }, + { "GetConnectData", appGetConnectData, METH_VARARGS }, + + { "GetRotatingDirection", appGetRotatingDirection, METH_VARARGS }, + { "GetDegreeDifference", appGetDegreeDifference, METH_VARARGS }, + { "Sleep", appSleep, METH_VARARGS }, + { "SetDefaultFontName", appSetDefaultFontName, METH_VARARGS }, + { "SetGuildSymbolPath", appSetGuildSymbolPath, METH_VARARGS }, + + { "EnableSpecialCameraMode", appEnableSpecialCameraMode, METH_VARARGS }, + { "SetCameraSpeed", appSetCameraSpeed, METH_VARARGS }, + + { "SaveCameraSetting", appSaveCameraSetting, METH_VARARGS }, + { "LoadCameraSetting", appLoadCameraSetting, METH_VARARGS }, + { "SetDefaultCamera", appSetDefaultCamera, METH_VARARGS }, + { "SetCameraSetting", appSetCameraSetting, METH_VARARGS }, + + { "SetSightRange", appSetSightRange, METH_VARARGS }, + + { "IsFileExist", appIsFileExist, METH_VARARGS }, + { "OpenTextFile", appOpenTextFile, METH_VARARGS }, + { "CloseTextFile", appCloseTextFile, METH_VARARGS }, + { "GetTextFileLineCount", appGetTextFileLineCount, METH_VARARGS }, + { "GetTextFileLine", appGetTextFileLine, METH_VARARGS }, + + // LOCALE + { "GetLocaleServiceName", appGetLocaleServiceName, METH_VARARGS }, + { "GetLocaleName", appGetLocaleName, METH_VARARGS }, + { "GetLocalePath", appGetLocalePath, METH_VARARGS }, + { "ForceSetLocale", appForceSetLocale, METH_VARARGS }, + // END_OF_LOCALE + + // CHEONMA + { "LoadLocaleAddr", appLoadLocaleAddr, METH_VARARGS }, + { "LoadLocaleData", appLoadLocaleData, METH_VARARGS }, + { "SetCHEONMA", appSetCHEONMA, METH_VARARGS }, + { "IsCHEONMA", appIsCHEONMA, METH_VARARGS }, + // END_OF_CHEONMA + + { "GetDefaultCodePage", appGetDefaultCodePage, METH_VARARGS }, + { "SetControlFP", appSetControlFP, METH_VARARGS }, + { "SetSpecularSpeed", appSetSpecularSpeed, METH_VARARGS }, + + { "testGetAccumulationTime", apptestGetAccumulationTime, METH_VARARGS }, + { "testResetAccumulationTime", apptestResetAccumulationTime, METH_VARARGS }, + { "testSetSpecularColor", apptestSetSpecularColor, METH_VARARGS }, + + { "SetVisibleNotice", appSetVisibleNotice, METH_VARARGS }, + { "IsVisibleNotice", appIsVisibleNotice, METH_VARARGS }, + { "EnableTestServerFlag", appEnableTestServerFlag, METH_VARARGS }, + { "IsEnableTestServerFlag", appIsEnableTestServerFlag, METH_VARARGS }, + + { "SetGuildMarkPath", appSetGuildMarkPath, METH_VARARGS }, + + { "OnLogoUpdate", appLogoUpdate, METH_VARARGS }, + { "OnLogoRender", appLogoRender, METH_VARARGS }, + { "OnLogoOpen", appLogoOpen, METH_VARARGS }, + { "OnLogoClose", appLogoClose, METH_VARARGS }, + + + { NULL, NULL }, + }; + + PyObject * poModule = Py_InitModule("app", s_methods); + + PyModule_AddIntConstant(poModule, "INFO_ITEM", CPythonApplication::INFO_ITEM); + PyModule_AddIntConstant(poModule, "INFO_ACTOR", CPythonApplication::INFO_ACTOR); + PyModule_AddIntConstant(poModule, "INFO_EFFECT", CPythonApplication::INFO_EFFECT); + PyModule_AddIntConstant(poModule, "INFO_TEXTTAIL", CPythonApplication::INFO_TEXTTAIL); + + PyModule_AddIntConstant(poModule, "DEGREE_DIRECTION_SAME", DEGREE_DIRECTION_SAME); + PyModule_AddIntConstant(poModule, "DEGREE_DIRECTION_RIGHT", DEGREE_DIRECTION_RIGHT); + PyModule_AddIntConstant(poModule, "DEGREE_DIRECTION_LEFT", DEGREE_DIRECTION_LEFT); + + PyModule_AddIntConstant(poModule, "VK_LEFT", VK_LEFT); + PyModule_AddIntConstant(poModule, "VK_RIGHT", VK_RIGHT); + PyModule_AddIntConstant(poModule, "VK_UP", VK_UP); + PyModule_AddIntConstant(poModule, "VK_DOWN", VK_DOWN); + PyModule_AddIntConstant(poModule, "VK_HOME", VK_HOME); + PyModule_AddIntConstant(poModule, "VK_END", VK_END); + PyModule_AddIntConstant(poModule, "VK_DELETE", VK_DELETE); + + PyModule_AddIntConstant(poModule, "DIK_ESCAPE", DIK_ESCAPE); + PyModule_AddIntConstant(poModule, "DIK_ESC", DIK_ESCAPE); // 편의를 위해 + PyModule_AddIntConstant(poModule, "DIK_1", DIK_1); + PyModule_AddIntConstant(poModule, "DIK_2", DIK_2); + PyModule_AddIntConstant(poModule, "DIK_3", DIK_3); + PyModule_AddIntConstant(poModule, "DIK_4", DIK_4); + PyModule_AddIntConstant(poModule, "DIK_5", DIK_5); + PyModule_AddIntConstant(poModule, "DIK_6", DIK_6); + PyModule_AddIntConstant(poModule, "DIK_7", DIK_7); + PyModule_AddIntConstant(poModule, "DIK_8", DIK_8); + PyModule_AddIntConstant(poModule, "DIK_9", DIK_9); + PyModule_AddIntConstant(poModule, "DIK_0", DIK_0); + PyModule_AddIntConstant(poModule, "DIK_MINUS", DIK_MINUS); /* - on main keyboard */ + PyModule_AddIntConstant(poModule, "DIK_EQUALS", DIK_EQUALS); + PyModule_AddIntConstant(poModule, "DIK_BACK", DIK_BACK); /* backspace */ + PyModule_AddIntConstant(poModule, "DIK_TAB", DIK_TAB); + PyModule_AddIntConstant(poModule, "DIK_Q", DIK_Q); + PyModule_AddIntConstant(poModule, "DIK_W", DIK_W); + PyModule_AddIntConstant(poModule, "DIK_E", DIK_E); + PyModule_AddIntConstant(poModule, "DIK_R", DIK_R); + PyModule_AddIntConstant(poModule, "DIK_T", DIK_T); + PyModule_AddIntConstant(poModule, "DIK_Y", DIK_Y); + PyModule_AddIntConstant(poModule, "DIK_U", DIK_U); + PyModule_AddIntConstant(poModule, "DIK_I", DIK_I); + PyModule_AddIntConstant(poModule, "DIK_O", DIK_O); + PyModule_AddIntConstant(poModule, "DIK_P", DIK_P); + PyModule_AddIntConstant(poModule, "DIK_LBRACKET", DIK_LBRACKET); + PyModule_AddIntConstant(poModule, "DIK_RBRACKET", DIK_RBRACKET); + PyModule_AddIntConstant(poModule, "DIK_RETURN", DIK_RETURN); /* Enter on main keyboard */ + PyModule_AddIntConstant(poModule, "DIK_LCONTROL", DIK_LCONTROL); + PyModule_AddIntConstant(poModule, "DIK_A", DIK_A); + PyModule_AddIntConstant(poModule, "DIK_S", DIK_S); + PyModule_AddIntConstant(poModule, "DIK_D", DIK_D); + PyModule_AddIntConstant(poModule, "DIK_F", DIK_F); + PyModule_AddIntConstant(poModule, "DIK_G", DIK_G); + PyModule_AddIntConstant(poModule, "DIK_H", DIK_H); + PyModule_AddIntConstant(poModule, "DIK_J", DIK_J); + PyModule_AddIntConstant(poModule, "DIK_K", DIK_K); + PyModule_AddIntConstant(poModule, "DIK_L", DIK_L); + PyModule_AddIntConstant(poModule, "DIK_SEMICOLON", DIK_SEMICOLON); + PyModule_AddIntConstant(poModule, "DIK_APOSTROPHE", DIK_APOSTROPHE); + PyModule_AddIntConstant(poModule, "DIK_GRAVE", DIK_GRAVE); /* accent grave */ + PyModule_AddIntConstant(poModule, "DIK_LSHIFT", DIK_LSHIFT); + PyModule_AddIntConstant(poModule, "DIK_BACKSLASH", DIK_BACKSLASH); + PyModule_AddIntConstant(poModule, "DIK_Z", DIK_Z); + PyModule_AddIntConstant(poModule, "DIK_X", DIK_X); + PyModule_AddIntConstant(poModule, "DIK_C", DIK_C); + PyModule_AddIntConstant(poModule, "DIK_V", DIK_V); + PyModule_AddIntConstant(poModule, "DIK_B", DIK_B); + PyModule_AddIntConstant(poModule, "DIK_N", DIK_N); + PyModule_AddIntConstant(poModule, "DIK_M", DIK_M); + PyModule_AddIntConstant(poModule, "DIK_COMMA", DIK_COMMA); + PyModule_AddIntConstant(poModule, "DIK_PERIOD", DIK_PERIOD); /* . on main keyboard */ + PyModule_AddIntConstant(poModule, "DIK_SLASH", DIK_SLASH); /* / on main keyboard */ + PyModule_AddIntConstant(poModule, "DIK_RSHIFT", DIK_RSHIFT); + PyModule_AddIntConstant(poModule, "DIK_MULTIPLY", DIK_MULTIPLY); /* * on numeric keypad */ + PyModule_AddIntConstant(poModule, "DIK_LALT", DIK_LMENU); /* left Alt */ + PyModule_AddIntConstant(poModule, "DIK_SPACE", DIK_SPACE); + PyModule_AddIntConstant(poModule, "DIK_CAPITAL", DIK_CAPITAL); + PyModule_AddIntConstant(poModule, "DIK_F1", DIK_F1); + PyModule_AddIntConstant(poModule, "DIK_F2", DIK_F2); + PyModule_AddIntConstant(poModule, "DIK_F3", DIK_F3); + PyModule_AddIntConstant(poModule, "DIK_F4", DIK_F4); + PyModule_AddIntConstant(poModule, "DIK_F5", DIK_F5); + PyModule_AddIntConstant(poModule, "DIK_F6", DIK_F6); + PyModule_AddIntConstant(poModule, "DIK_F7", DIK_F7); + PyModule_AddIntConstant(poModule, "DIK_F8", DIK_F8); + PyModule_AddIntConstant(poModule, "DIK_F9", DIK_F9); + PyModule_AddIntConstant(poModule, "DIK_F10", DIK_F10); + PyModule_AddIntConstant(poModule, "DIK_NUMLOCK", DIK_NUMLOCK); + PyModule_AddIntConstant(poModule, "DIK_SCROLL", DIK_SCROLL); /* Scroll Lock */ + PyModule_AddIntConstant(poModule, "DIK_NUMPAD7", DIK_NUMPAD7); + PyModule_AddIntConstant(poModule, "DIK_NUMPAD8", DIK_NUMPAD8); + PyModule_AddIntConstant(poModule, "DIK_NUMPAD9", DIK_NUMPAD9); + PyModule_AddIntConstant(poModule, "DIK_SUBTRACT", DIK_SUBTRACT); /* - on numeric keypad */ + PyModule_AddIntConstant(poModule, "DIK_NUMPAD4", DIK_NUMPAD4); + PyModule_AddIntConstant(poModule, "DIK_NUMPAD5", DIK_NUMPAD5); + PyModule_AddIntConstant(poModule, "DIK_NUMPAD6", DIK_NUMPAD6); + PyModule_AddIntConstant(poModule, "DIK_ADD", DIK_ADD); /* + on numeric keypad */ + PyModule_AddIntConstant(poModule, "DIK_NUMPAD1", DIK_NUMPAD1); + PyModule_AddIntConstant(poModule, "DIK_NUMPAD2", DIK_NUMPAD2); + PyModule_AddIntConstant(poModule, "DIK_NUMPAD3", DIK_NUMPAD3); + PyModule_AddIntConstant(poModule, "DIK_NUMPAD0", DIK_NUMPAD0); + PyModule_AddIntConstant(poModule, "DIK_DECIMAL", DIK_DECIMAL); /* . on numeric keypad */ + PyModule_AddIntConstant(poModule, "DIK_F11", DIK_F11); + PyModule_AddIntConstant(poModule, "DIK_F12", DIK_F12); + PyModule_AddIntConstant(poModule, "DIK_NEXTTRACK", DIK_NEXTTRACK); /* Next Track */ + PyModule_AddIntConstant(poModule, "DIK_NUMPADENTER", DIK_NUMPADENTER); /* Enter on numeric keypad */ + PyModule_AddIntConstant(poModule, "DIK_RCONTROL", DIK_RCONTROL); + PyModule_AddIntConstant(poModule, "DIK_MUTE", DIK_MUTE); /* Mute */ + PyModule_AddIntConstant(poModule, "DIK_CALCULATOR", DIK_CALCULATOR); /* Calculator */ + PyModule_AddIntConstant(poModule, "DIK_PLAYPAUSE", DIK_PLAYPAUSE); /* Play / Pause */ + PyModule_AddIntConstant(poModule, "DIK_MEDIASTOP", DIK_MEDIASTOP); /* Media Stop */ + PyModule_AddIntConstant(poModule, "DIK_VOLUMEDOWN", DIK_VOLUMEDOWN); /* Volume - */ + PyModule_AddIntConstant(poModule, "DIK_VOLUMEUP", DIK_VOLUMEUP); /* Volume + */ + PyModule_AddIntConstant(poModule, "DIK_WEBHOME", DIK_WEBHOME); /* Web home */ + PyModule_AddIntConstant(poModule, "DIK_NUMPADCOMMA", DIK_NUMPADCOMMA); /* , on numeric keypad (NEC PC98) */ + PyModule_AddIntConstant(poModule, "DIK_DIVIDE", DIK_DIVIDE); /* / on numeric keypad */ + PyModule_AddIntConstant(poModule, "DIK_SYSRQ", DIK_SYSRQ); + PyModule_AddIntConstant(poModule, "DIK_RALT", DIK_RMENU); /* right Alt */ + PyModule_AddIntConstant(poModule, "DIK_PAUSE", DIK_PAUSE); /* Pause */ + PyModule_AddIntConstant(poModule, "DIK_HOME", DIK_HOME); /* Home on arrow keypad */ + PyModule_AddIntConstant(poModule, "DIK_UP", DIK_UP); /* UpArrow on arrow keypad */ + PyModule_AddIntConstant(poModule, "DIK_PGUP", DIK_PRIOR); /* PgUp on arrow keypad */ + PyModule_AddIntConstant(poModule, "DIK_LEFT", DIK_LEFT); /* LeftArrow on arrow keypad */ + PyModule_AddIntConstant(poModule, "DIK_RIGHT", DIK_RIGHT); /* RightArrow on arrow keypad */ + PyModule_AddIntConstant(poModule, "DIK_END", DIK_END); /* End on arrow keypad */ + PyModule_AddIntConstant(poModule, "DIK_DOWN", DIK_DOWN); /* DownArrow on arrow keypad */ + PyModule_AddIntConstant(poModule, "DIK_PGDN", DIK_NEXT); /* PgDn on arrow keypad */ + PyModule_AddIntConstant(poModule, "DIK_INSERT", DIK_INSERT); /* Insert on arrow keypad */ + PyModule_AddIntConstant(poModule, "DIK_DELETE", DIK_DELETE); /* Delete on arrow keypad */ + PyModule_AddIntConstant(poModule, "DIK_LWIN", DIK_LWIN); /* Left Windows key */ + PyModule_AddIntConstant(poModule, "DIK_RWIN", DIK_RWIN); /* Right Windows key */ + PyModule_AddIntConstant(poModule, "DIK_APPS", DIK_APPS); /* AppMenu key */ + + // Cursor + PyModule_AddIntConstant(poModule, "NORMAL", CPythonApplication::CURSOR_SHAPE_NORMAL); + PyModule_AddIntConstant(poModule, "ATTACK", CPythonApplication::CURSOR_SHAPE_ATTACK); + PyModule_AddIntConstant(poModule, "TARGET", CPythonApplication::CURSOR_SHAPE_TARGET); + PyModule_AddIntConstant(poModule, "TALK", CPythonApplication::CURSOR_SHAPE_TALK); + PyModule_AddIntConstant(poModule, "CANT_GO", CPythonApplication::CURSOR_SHAPE_CANT_GO); + PyModule_AddIntConstant(poModule, "PICK", CPythonApplication::CURSOR_SHAPE_PICK); + + PyModule_AddIntConstant(poModule, "DOOR", CPythonApplication::CURSOR_SHAPE_DOOR); + PyModule_AddIntConstant(poModule, "CHAIR", CPythonApplication::CURSOR_SHAPE_CHAIR); + PyModule_AddIntConstant(poModule, "MAGIC", CPythonApplication::CURSOR_SHAPE_MAGIC); + PyModule_AddIntConstant(poModule, "BUY", CPythonApplication::CURSOR_SHAPE_BUY); + PyModule_AddIntConstant(poModule, "SELL", CPythonApplication::CURSOR_SHAPE_SELL); + + PyModule_AddIntConstant(poModule, "CAMERA_ROTATE", CPythonApplication::CURSOR_SHAPE_CAMERA_ROTATE); + PyModule_AddIntConstant(poModule, "HSIZE", CPythonApplication::CURSOR_SHAPE_HSIZE); + PyModule_AddIntConstant(poModule, "VSIZE", CPythonApplication::CURSOR_SHAPE_VSIZE); + PyModule_AddIntConstant(poModule, "HVSIZE", CPythonApplication::CURSOR_SHAPE_HVSIZE); + + PyModule_AddIntConstant(poModule, "CAMERA_TO_POSITIVE", CPythonApplication::CAMERA_TO_POSITIVE); + PyModule_AddIntConstant(poModule, "CAMERA_TO_NEGATIVE", CPythonApplication::CAMERA_TO_NEGITIVE); + PyModule_AddIntConstant(poModule, "CAMERA_STOP", CPythonApplication::CAMERA_STOP); + +#ifdef ENABLE_COSTUME_SYSTEM + PyModule_AddIntConstant(poModule, "ENABLE_COSTUME_SYSTEM", 1); +#else + PyModule_AddIntConstant(poModule, "ENABLE_COSTUME_SYSTEM", 0); +#endif + +#ifdef ENABLE_ENERGY_SYSTEM + PyModule_AddIntConstant(poModule, "ENABLE_ENERGY_SYSTEM", 1); +#else + PyModule_AddIntConstant(poModule, "ENABLE_ENERGY_SYSTEM", 0); +#endif + +#ifdef ENABLE_DRAGON_SOUL_SYSTEM + PyModule_AddIntConstant(poModule, "ENABLE_DRAGON_SOUL_SYSTEM", 1); +#else + PyModule_AddIntConstant(poModule, "ENABLE_DRAGON_SOUL_SYSTEM", 0); +#endif + +#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM + PyModule_AddIntConstant(poModule, "ENABLE_NEW_EQUIPMENT_SYSTEM", 1); +#else + PyModule_AddIntConstant(poModule, "ENABLE_NEW_EQUIPMENT_SYSTEM", 0); +#endif + +#ifdef USE_OPENID + PyModule_AddIntConstant(poModule, "USE_OPENID", 1); + if (openid_test) + PyModule_AddIntConstant(poModule, "OPENID_TEST", 1); + else + PyModule_AddIntConstant(poModule, "OPENID_TEST", 0); +#else + PyModule_AddIntConstant(poModule, "USE_OPENID", 0); + PyModule_AddIntConstant(poModule, "OPENID_TEST", 0); +#endif /* USE_OPENID */ +} diff --git a/extension/src/port/UserInterface/PythonBackground.h b/extension/src/port/UserInterface/PythonBackground.h new file mode 100644 index 00000000..28e0d27d --- /dev/null +++ b/extension/src/port/UserInterface/PythonBackground.h @@ -0,0 +1,183 @@ +// PythonBackground.h: interface for the CPythonBackground class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_PYTHONBACKGROUND_H__A202CB18_9553_4CF3_8500_5D7062B55432__INCLUDED_) +#define AFX_PYTHONBACKGROUND_H__A202CB18_9553_4CF3_8500_5D7062B55432__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "../GameLib/MapManager.h" +#include "../GameLib/TerrainDecal.h" +#include "../GameLib/SnowEnvironment.h" + +class CInstanceBase; + +class CPythonBackground : public CMapManager, public CSingleton +{ +public: + enum + { + SHADOW_NONE, + SHADOW_GROUND, + SHADOW_GROUND_AND_SOLO, + SHADOW_ALL, + SHADOW_ALL_HIGH, + SHADOW_ALL_MAX, + }; + + enum + { + DISTANCE0, + DISTANCE1, + DISTANCE2, + DISTANCE3, + DISTANCE4, + NUM_DISTANCE_SET + }; + + enum + { + DAY_MODE_LIGHT, + DAY_MODE_DARK, + }; + + typedef struct SVIEWDISTANCESET + { + float m_fFogStart; + float m_fFogEnd; + float m_fFarClip; + D3DXVECTOR3 m_v3SkyBoxScale; + } TVIEWDISTANCESET; + +public: + CPythonBackground(); + virtual ~CPythonBackground(); + + void Initialize(); + + void Destroy(); + void Create(); + + void GlobalPositionToLocalPosition(LONG& rGlobalX, LONG& rGlobalY); + void LocalPositionToGlobalPosition(LONG& rLocalX, LONG& rLocalY); + + void EnableTerrainOnlyForHeight(); + bool SetSplatLimit(int iSplatNum); + bool SetVisiblePart(int ePart, bool isVisible); + bool SetShadowLevel(int eLevel); + void RefreshShadowLevel(); + void SelectViewDistanceNum(int eNum); + void SetViewDistanceSet(int eNum, float fFarClip); + float GetFarClip(); + + DWORD GetRenderShadowTime(); + void GetDistanceSetInfo(int * peNum, float * pfStart, float * pfEnd, float * pfFarClip); + + bool GetPickingPoint(D3DXVECTOR3 * v3IntersectPt); + bool GetPickingPointWithRay(const CRay & rRay, D3DXVECTOR3 * v3IntersectPt); + bool GetPickingPointWithRayOnlyTerrain(const CRay & rRay, D3DXVECTOR3 * v3IntersectPt); + BOOL GetLightDirection(D3DXVECTOR3 & rv3LightDirection); + + void Update(float fCenterX, float fCenterY, float fCenterZ); + + void CreateCharacterShadowTexture(); + void ReleaseCharacterShadowTexture(); + void Render(); + void RenderSnow(); + void RenderPCBlocker(); + void RenderCollision(); + void RenderCharacterShadowToTexture(); + void RenderSky(); + void RenderCloud(); + void RenderWater(); + void RenderEffect(); + void RenderBeforeLensFlare(); + void RenderAfterLensFlare(); + + bool CheckAdvancing(CInstanceBase * pInstance); + + void SetCharacterDirLight(); + void SetBackgroundDirLight(); + + void ChangeToDay(); + void ChangeToNight(); + void EnableSnowEnvironment(); + void DisableSnowEnvironment(); + void SetXMaxTree(int iGrade); + + void ClearGuildArea(); + void RegisterGuildArea(int isx, int isy, int iex, int iey); + + void CreateTargetEffect(DWORD dwID, DWORD dwChrVID); + void CreateTargetEffect(DWORD dwID, long lx, long ly); + void DeleteTargetEffect(DWORD dwID); + + void CreateSpecialEffect(DWORD dwID, float fx, float fy, float fz, const char * c_szFileName); + void DeleteSpecialEffect(DWORD dwID); + + void Warp(DWORD dwX, DWORD dwY); + + void VisibleGuildArea(); + void DisableGuildArea(); + + void RegisterDungeonMapName(const char * c_szMapName); + TMapInfo* GlobalPositionToMapInfo(DWORD dwGlobalX, DWORD dwGlobalY); + const char* GetWarpMapName(); + +protected: + void __CreateProperty(); + bool __IsSame(std::set & rleft, std::set & rright); + +protected: + std::string m_strMapName; + +private: + CSnowEnvironment m_SnowEnvironment; + + int m_iDayMode; + int m_iXMasTreeGrade; + + int m_eShadowLevel; + int m_eViewDistanceNum; + + BOOL m_bVisibleGuildArea; + + DWORD m_dwRenderShadowTime; + + DWORD m_dwBaseX; + DWORD m_dwBaseY; + + TVIEWDISTANCESET m_ViewDistanceSet[NUM_DISTANCE_SET]; + + std::set m_kSet_iShowingPortalID; + std::set m_kSet_strDungeonMapName; + std::map m_kMap_dwTargetID_dwChrID; + + struct SReserveTargetEffect + { + int ilx; + int ily; + }; + std::map m_kMap_dwID_kReserveTargetEffect; + + struct FFindWarpMapName + { + DWORD m_dwX, m_dwY; + FFindWarpMapName(DWORD dwX, DWORD dwY) + { + m_dwX = dwX; + m_dwY = dwY; + } + bool operator() (TMapInfo & rMapInfo) + { + if (m_dwX < rMapInfo.m_dwBaseX || m_dwX >= rMapInfo.m_dwEndX || m_dwY < rMapInfo.m_dwBaseY || m_dwY >= rMapInfo.m_dwEndY) + return false; + return true; + } + }; +}; + +#endif // !defined(AFX_PYTHONBACKGROUND_H__A202CB18_9553_4CF3_8500_5D7062B55432__INCLUDED_) diff --git a/extension/src/port/UserInterface/PythonCharacterManager.h b/extension/src/port/UserInterface/PythonCharacterManager.h new file mode 100644 index 00000000..ad41f4b0 --- /dev/null +++ b/extension/src/port/UserInterface/PythonCharacterManager.h @@ -0,0 +1,168 @@ +#pragma once + +#include "AbstractCharacterManager.h" +#include "InstanceBase.h" +#include "../GameLib/PhysicsObject.h" + +class CPythonCharacterManager : public CSingleton, public IAbstractCharacterManager, public IObjectManager +{ + public: + // Character List + typedef std::list TCharacterInstanceList; + typedef std::map TCharacterInstanceMap; + + class CharacterIterator; + + public: + CPythonCharacterManager(); + virtual ~CPythonCharacterManager(); + + virtual void AdjustCollisionWithOtherObjects(CActorInstance* pInst ); + + void EnableSortRendering(bool isEnable); + + bool IsRegisteredVID(DWORD dwVID); + bool IsAliveVID(DWORD dwVID); + bool IsDeadVID(DWORD dwVID); + bool IsCacheMode(); + + bool OLD_GetPickedInstanceVID(DWORD* pdwPickedActorID); + CInstanceBase* OLD_GetPickedInstancePtr(); + D3DXVECTOR2& OLD_GetPickedInstPosReference(); + + CInstanceBase* FindClickableInstancePtr(); + + void InsertPVPKey(DWORD dwVIDSrc, DWORD dwVIDDst); + void RemovePVPKey(DWORD dwVIDSrc, DWORD dwVIDDst); + void ChangeGVG(DWORD dwSrcGuildID, DWORD dwDstGuildID); + + void GetInfo(std::string* pstInfo); + + void ClearMainInstance(); + bool SetMainInstance(DWORD dwVID); + CInstanceBase* GetMainInstancePtr(); + + void SCRIPT_SetAffect(DWORD dwVID, DWORD eAffect, BOOL isVisible); + void SetEmoticon(DWORD dwVID, DWORD eEmoticon); + bool IsPossibleEmoticon(DWORD dwVID); + void ShowPointEffect(DWORD dwVID, DWORD ePoint); + bool RegisterPointEffect(DWORD ePoint, const char* c_szFileName); + + // System + void Destroy(); + + void DeleteAllInstances(); + + bool CreateDeviceObjects(); + void DestroyDeviceObjects(); + + void Update(); + void Deform(); + void Render(); + void RenderShadowMainInstance(); + void RenderShadowAllInstances(); + void RenderCollision(); + + // Create/Delete Instance + CInstanceBase * CreateInstance(const CInstanceBase::SCreateData& c_rkCreateData); + CInstanceBase * RegisterInstance(DWORD VirtualID); + + void DeleteInstance(DWORD VirtualID); + void DeleteInstanceByFade(DWORD VirtualID); + void DeleteVehicleInstance(DWORD VirtualID); + + void DestroyAliveInstanceMap(); + void DestroyDeadInstanceList(); + + inline CharacterIterator CharacterInstanceBegin() { return CharacterIterator(m_kAliveInstMap.begin());} + inline CharacterIterator CharacterInstanceEnd() { return CharacterIterator(m_kAliveInstMap.end());} + + // Access Instance + void SelectInstance(DWORD VirtualID); + CInstanceBase * GetSelectedInstancePtr(); + + CInstanceBase * GetInstancePtr(DWORD VirtualID); + CInstanceBase * GetInstancePtrByName(const char *name); + + // Pick + int PickAll(); + CInstanceBase * GetCloseInstance(CInstanceBase * pInstance); + + // Refresh TextTail + void RefreshAllPCTextTail(); + void RefreshAllGuildMark(); + + protected: + void UpdateTransform(); + void UpdateDeleting(); + + protected: + void __Initialize(); + + void __DeleteBlendOutInstance(CInstanceBase* pkInstDel); + + void __OLD_Pick(); + void __NEW_Pick(); + + void __UpdateSortPickedActorList(); + void __UpdatePickedActorList(); + void __SortPickedActorList(); + + void __RenderSortedAliveActorList(); + void __RenderSortedDeadActorList(); + + protected: + CInstanceBase * m_pkInstMain; + CInstanceBase * m_pkInstPick; + CInstanceBase * m_pkInstBind; + D3DXVECTOR2 m_v2PickedInstProjPos; + + TCharacterInstanceMap m_kAliveInstMap; + TCharacterInstanceList m_kDeadInstList; + + std::vector m_kVct_pkInstPicked; + + DWORD m_adwPointEffect[POINT_MAX_NUM]; + + public: + class CharacterIterator + { + public: + CharacterIterator(){} + CharacterIterator(const TCharacterInstanceMap::iterator & it) : m_it(it) {} + + inline CInstanceBase * operator * () { return m_it->second; } + + inline CharacterIterator & operator ++() + { + ++m_it; + return *this; + } + + inline CharacterIterator operator ++(int) + { + CharacterIterator new_it = *this; + ++(*this); + return new_it; + } + + inline CharacterIterator & operator = (const CharacterIterator & rhs) + { + m_it = rhs.m_it; + return (*this); + } + + inline bool operator == (const CharacterIterator & rhs) const + { + return m_it == rhs.m_it; + } + + inline bool operator != (const CharacterIterator & rhs) const + { + return m_it != rhs.m_it; + } + + private: + TCharacterInstanceMap::iterator m_it; + }; +}; diff --git a/extension/src/port/UserInterface/PythonChat.h b/extension/src/port/UserInterface/PythonChat.h new file mode 100644 index 00000000..f8f24b2a --- /dev/null +++ b/extension/src/port/UserInterface/PythonChat.h @@ -0,0 +1,234 @@ +#pragma once + +#include "Packet.h" +#include "AbstractChat.h" + +class CWhisper +{ + public: + typedef struct SChatLine + { + CGraphicTextInstance Instance; + + SChatLine() + { + } + ~SChatLine() + { + Instance.Destroy(); + } + + static void DestroySystem(); + + static SChatLine* New(); + static void Delete(SChatLine* pkChatLine); + + static CDynamicPool ms_kPool; + } TChatLine; + + typedef std::deque TChatLineDeque; + typedef std::list TChatLineList; + + public: + CWhisper(); + ~CWhisper(); + + void Destroy(); + + void SetPosition(float fPosition); + void SetBoxSize(float fWidth, float fHeight); + void AppendChat(int iType, const char* c_szChat); + void Render(float fx, float fy); + + protected: + void __Initialize(); + void __ArrangeChat(); + + protected: + float m_fLineStep; + float m_fWidth; + float m_fHeight; + float m_fcurPosition; + + TChatLineDeque m_ChatLineDeque; + TChatLineList m_ShowingChatLineList; + + public: + static void DestroySystem(); + + static CWhisper* New(); + static void Delete(CWhisper* pkWhisper); + + static CDynamicPool ms_kPool; +}; + +class CPythonChat : public CSingleton, public IAbstractChat +{ + public: + enum EWhisperType + { + WHISPER_TYPE_CHAT = 0, + WHISPER_TYPE_NOT_EXIST = 1, + WHISPER_TYPE_TARGET_BLOCKED = 2, + WHISPER_TYPE_SENDER_BLOCKED = 3, + WHISPER_TYPE_ERROR = 4, + WHISPER_TYPE_GM = 5, + WHISPER_TYPE_SYSTEM = 0xFF + }; + + enum EBoardState + { + BOARD_STATE_VIEW, + BOARD_STATE_EDIT, + BOARD_STATE_LOG, + }; + + enum + { + CHAT_LINE_MAX_NUM = 300, + CHAT_LINE_COLOR_ARRAY_MAX_NUM = 3, + }; + + typedef struct SChatLine + { + int iType; + float fAppendedTime; + D3DXCOLOR aColor[CHAT_LINE_COLOR_ARRAY_MAX_NUM]; + CGraphicTextInstance Instance; + + SChatLine(); + virtual ~SChatLine(); + + void SetColor(DWORD dwID, DWORD dwColor); + void SetColorAll(DWORD dwColor); + D3DXCOLOR & GetColorRef(DWORD dwID); + static void DestroySystem(); + + static SChatLine* New(); + static void Delete(SChatLine* pkChatLine); + + static CDynamicPool ms_kPool; + } TChatLine; + + typedef struct SWaitChat + { + int iType; + std::string strChat; + + DWORD dwAppendingTime; + } TWaitChat; + + typedef std::deque TChatLineDeque; + typedef std::list TChatLineList; + + typedef std::map TWhisperMap; + typedef std::set TIgnoreCharacterSet; + typedef std::list TWaitChatList; + + typedef struct SChatSet + { + int m_ix; + int m_iy; + int m_iHeight; + int m_iStep; + float m_fEndPos; + + int m_iBoardState; + std::vector m_iMode; + + TChatLineList m_ShowingChatLineList; + + bool CheckMode(DWORD dwType) + { + if (dwType >= m_iMode.size()) + return false; + + return m_iMode[dwType] ? true : false; + } + + SChatSet() + { + m_iBoardState = BOARD_STATE_VIEW; + + m_ix = 0; + m_iy = 0; + m_fEndPos = 1.0f; + m_iHeight = 0; + m_iStep = 15; + + m_iMode.clear(); + m_iMode.resize(ms_iChatModeSize, 1); + } + + static int ms_iChatModeSize; + } TChatSet; + + typedef std::map TChatSetMap; + + public: + CPythonChat(); + virtual ~CPythonChat(); + + void SetChatColor(UINT eType, UINT r, UINT g, UINT b); + + void Destroy(); + void Close(); + + int CreateChatSet(DWORD dwID); + void Update(DWORD dwID); + void Render(DWORD dwID); + void RenderWhisper(const char * c_szName, float fx, float fy); + + void SetBoardState(DWORD dwID, int iState); + void SetPosition(DWORD dwID, int ix, int iy); + void SetHeight(DWORD dwID, int iHeight); + void SetStep(DWORD dwID, int iStep); + void ToggleChatMode(DWORD dwID, int iMode); + void EnableChatMode(DWORD dwID, int iMode); + void DisableChatMode(DWORD dwID, int iMode); + void SetEndPos(DWORD dwID, float fPos); + + int GetVisibleLineCount(DWORD dwID); + int GetEditableLineCount(DWORD dwID); + int GetLineCount(DWORD dwID); + int GetLineStep(DWORD dwID); + + // Chat + void AppendChat(int iType, const char * c_szChat); + void AppendChatWithDelay(int iType, const char * c_szChat, int iDelay); + void ArrangeShowingChat(DWORD dwID); + + // Ignore + void IgnoreCharacter(const char * c_szName); + BOOL IsIgnoreCharacter(const char * c_szName); + + // Whisper + CWhisper * CreateWhisper(const char * c_szName); + void AppendWhisper(int iType, const char * c_szName, const char * c_szChat); + void ClearWhisper(const char * c_szName); + BOOL GetWhisper(const char * c_szName, CWhisper ** ppWhisper); + void InitWhisper(PyObject * ppyObject); + + protected: + void __Initialize(); + void __DestroyWhisperMap(); + + TChatLineList * GetChatLineListPtr(DWORD dwID); + TChatSet * GetChatSetPtr(DWORD dwID); + + void UpdateViewMode(DWORD dwID); + void UpdateEditMode(DWORD dwID); + void UpdateLogMode(DWORD dwID); + + DWORD GetChatColor(int iType); + + protected: + TChatLineDeque m_ChatLineDeque; + TChatLineList m_ShowingChatLineList; + TChatSetMap m_ChatSetMap; + TWhisperMap m_WhisperMap; + TIgnoreCharacterSet m_IgnoreCharacterSet; + TWaitChatList m_WaitChatList; + + D3DXCOLOR m_akD3DXClrChat[CHAT_TYPE_MAX_NUM]; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/PythonEventManager.h b/extension/src/port/UserInterface/PythonEventManager.h new file mode 100644 index 00000000..f453ec32 --- /dev/null +++ b/extension/src/port/UserInterface/PythonEventManager.h @@ -0,0 +1,212 @@ +#pragma once + +#include "../EterLib/parser.h" + +#include +#include + +class CPythonEventManager : public CSingleton +{ + public: + typedef struct STextLine + { + int ixLocal, iyLocal; + CGraphicTextInstance * pInstance; + } TTextLine; + + typedef std::list TScriptTextLineList; + typedef std::map TEventAnswerMap; + + enum + { + EVENT_POSITION_START = 0, + EVENT_POSITION_END = 1, + + BOX_VISIBLE_LINE_COUNT = 5, + }; + + enum EButtonType + { + BUTTON_TYPE_NEXT, + BUTTON_TYPE_DONE, + BUTTON_TYPE_CANCEL, + }; + + enum EEventType + { + EVENT_TYPE_LETTER, + EVENT_TYPE_COLOR, + EVENT_TYPE_DELAY, + EVENT_TYPE_ENTER, + EVENT_TYPE_WAIT, + EVENT_TYPE_CLEAR, + EVENT_TYPE_QUESTION, + EVENT_TYPE_NEXT, + EVENT_TYPE_DONE, + + EVENT_TYPE_LEFT_IMAGE, + EVENT_TYPE_TOP_IMAGE, + EVENT_TYPE_BACKGROUND_IMAGE, + EVENT_TYPE_IMAGE, + + EVENT_TYPE_ADD_MAP_SIGNAL, + EVENT_TYPE_CLEAR_MAP_SIGNAL, + EVENT_TYPE_SET_MESSAGE_POSITION, + EVENT_TYPE_ADJUST_MESSAGE_POSITION, + EVENT_TYPE_SET_CENTER_MAP_POSITION, + + EVENT_TYPE_QUEST_BUTTON, + + // HIDE_QUEST_LETTER + EVENT_TYPE_QUEST_BUTTON_CLOSE, + // END_OF_HIDE_QUEST_LETTER + + EVENT_TYPE_SLEEP, + EVENT_TYPE_SET_CAMERA, + EVENT_TYPE_BLEND_CAMERA, + EVENT_TYPE_RESTORE_CAMERA, + EVENT_TYPE_FADE_OUT, + EVENT_TYPE_FADE_IN, + EVENT_TYPE_WHITE_OUT, + EVENT_TYPE_WHITE_IN, + EVENT_TYPE_CLEAR_TEXT, + EVENT_TYPE_TEXT_HORIZONTAL_ALIGN_CENTER, + EVENT_TYPE_TITLE_IMAGE, + + EVENT_TYPE_RUN_CINEMA, + EVENT_TYPE_DUNGEON_RESULT, + + EVENT_TYPE_ITEM_NAME, + EVENT_TYPE_MONSTER_NAME, + + EVENT_TYPE_COLOR256, + EVENT_TYPE_WINDOW_SIZE, + + EVENT_TYPE_INPUT, + EVENT_TYPE_CONFIRM_WAIT, + EVENT_TYPE_END_CONFIRM_WAIT, + + EVENT_TYPE_INSERT_IMAGE, + + EVENT_TYPE_SELECT_ITEM, + }; + + private: + std::map EventTypeMap; + + public: + typedef struct SEventSet + { + int ix, iy; + int iWidth; + int iyLocal; + + // State + bool isLock; + + long lLastDelayTime; + + int iCurrentLetter; + + D3DXCOLOR CurrentColor; + std::string strCurrentLine; + + CGraphicTextInstance * pCurrentTextLine; + TScriptTextLineList ScriptTextLineList; + + BOOL isConfirmWait; + CGraphicTextInstance * pConfirmTimeTextLine; + int iConfirmEndTime; + + // Group Data + script::Group ScriptGroup; + + // Static Data + char szFileName[32+1]; + + int iVisibleStartLine; + int iVisibleLineCount; + + int iAdjustLine; + + D3DXCOLOR DiffuseColor; + long lWaitingTime; + int iRestrictedCharacterCount; + + int nAnswer; + + bool isTextCenterMode; + bool isWaitFlag; + + PyObject * poEventHandler; + + SEventSet() {} + virtual ~SEventSet() {} + } TEventSet; + + typedef std::vector TEventSetVector; + + + public: + CPythonEventManager(); + virtual ~CPythonEventManager(); + + void Destroy(); + + int RegisterEventSet(const char * c_szFileName); + int RegisterEventSetFromString(const std::string& strScript); + void ClearEventSeti(int iIndex); + void __ClearEventSetp(TEventSet * pEventSet); + + void SetEventHandler(int iIndex, PyObject * poEventHandler); + void SetRestrictedCount(int iIndex, int iCount); + + int GetEventSetLocalYPosition(int iIndex); + void AddEventSetLocalYPosition(int iIndex, int iAddValue); + void InsertText(int iIndex, const char * c_szText, int iX_pos = 0); + + void UpdateEventSet(int iIndex, int ix, int iy); + void RenderEventSet(int iIndex); + void SetEventSetWidth(int iIndex, int iWidth); + + void Skip(int iIndex); + bool IsWait(int iIndex); + void EndEventProcess(int iIndex); + + void SelectAnswer(int iIndex, int iAnswer); + void SetVisibleStartLine(int iIndex, int iStartLine); + int GetVisibleStartLine(int iIndex); + int GetLineCount(int iIndex); + void SetVisibleLineCount(int iIndex, int iLineCount); + + void SetInterfaceWindow(PyObject * poInterface); + void SetLeftTimeString(const char * c_szString); + + protected: + void __InitEventSet(TEventSet& rEventSet); + void __InsertLine(TEventSet& rEventSet, BOOL isCenter=FALSE, int iX_pos=0); + void __AddSpace(TEventSet& pEventSet, int iSpace); + + DWORD GetEmptyEventSetSlot(); + + bool CheckEventSetIndex(int iIndex); + + void ProcessEventSet(TEventSet * pEventSet); + + void ClearLine(TEventSet * pEventSet); + void RefreshLinePosition(TEventSet * pEventSet); + bool GetScriptEventIndex(const char * c_szName, int * pEventPosition, int * pEventType); + + void MakeQuestion(TEventSet * pEventSet, script::TArgList & rArgumentList); + void MakeNextButton(TEventSet * pEventSet, int iButtonType); + + protected: + TEventSetVector m_EventSetVector; + BOOL m_isQuestConfirmWait; + + private: + CDynamicPool m_EventSetPool; + CDynamicPool m_ScriptTextLinePool; + PyObject * m_poInterface; + std::string m_strLeftTimeString; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/PythonExchange.h b/extension/src/port/UserInterface/PythonExchange.h new file mode 100644 index 00000000..832ec01d --- /dev/null +++ b/extension/src/port/UserInterface/PythonExchange.h @@ -0,0 +1,92 @@ +#pragma once + +#include "Packet.h" + +/* + * 교환 창 관련 + */ +class CPythonExchange : public CSingleton +{ + public: + enum + { + EXCHANGE_ITEM_MAX_NUM = 12, + }; + + typedef struct trade + { + char name[CHARACTER_NAME_MAX_LEN + 1]; + + DWORD item_vnum[EXCHANGE_ITEM_MAX_NUM]; + BYTE item_count[EXCHANGE_ITEM_MAX_NUM]; + DWORD item_metin[EXCHANGE_ITEM_MAX_NUM][ITEM_SOCKET_SLOT_MAX_NUM]; + TPlayerItemAttribute item_attr[EXCHANGE_ITEM_MAX_NUM][ITEM_ATTRIBUTE_SLOT_MAX_NUM]; + + BYTE accept; + DWORD elk; + } TExchangeData; + + public: + CPythonExchange(); + virtual ~CPythonExchange(); + + void Clear(); + + void Start(); + void End(); + bool isTrading(); + + // Interface + + void SetSelfName(const char *name); + void SetTargetName(const char *name); + + char *GetNameFromSelf(); + char *GetNameFromTarget(); + + void SetElkToTarget(DWORD elk); + void SetElkToSelf(DWORD elk); + + DWORD GetElkFromTarget(); + DWORD GetElkFromSelf(); + + void SetItemToTarget(DWORD pos, DWORD vnum, BYTE count); + void SetItemToSelf(DWORD pos, DWORD vnum, BYTE count); + + void SetItemMetinSocketToTarget(int pos, int imetinpos, DWORD vnum); + void SetItemMetinSocketToSelf(int pos, int imetinpos, DWORD vnum); + + void SetItemAttributeToTarget(int pos, int iattrpos, BYTE byType, short sValue); + void SetItemAttributeToSelf(int pos, int iattrpos, BYTE byType, short sValue); + + void DelItemOfTarget(BYTE pos); + void DelItemOfSelf(BYTE pos); + + DWORD GetItemVnumFromTarget(BYTE pos); + DWORD GetItemVnumFromSelf(BYTE pos); + + BYTE GetItemCountFromTarget(BYTE pos); + BYTE GetItemCountFromSelf(BYTE pos); + + DWORD GetItemMetinSocketFromTarget(BYTE pos, int iMetinSocketPos); + DWORD GetItemMetinSocketFromSelf(BYTE pos, int iMetinSocketPos); + + void GetItemAttributeFromTarget(BYTE pos, int iAttrPos, BYTE * pbyType, short * psValue); + void GetItemAttributeFromSelf(BYTE pos, int iAttrPos, BYTE * pbyType, short * psValue); + + void SetAcceptToTarget(BYTE Accept); + void SetAcceptToSelf(BYTE Accept); + + bool GetAcceptFromTarget(); + bool GetAcceptFromSelf(); + + bool GetElkMode(); + void SetElkMode(bool value); + + protected: + bool m_isTrading; + + bool m_elk_mode; // 엘크를 클릭해서 교환했을때를 위한 변종임. + TExchangeData m_self; + TExchangeData m_victim; +}; diff --git a/extension/src/port/UserInterface/PythonGuild.h b/extension/src/port/UserInterface/PythonGuild.h new file mode 100644 index 00000000..e3f09f3c --- /dev/null +++ b/extension/src/port/UserInterface/PythonGuild.h @@ -0,0 +1,130 @@ +#pragma once + +#include "Packet.h" + +class CPythonGuild : public CSingleton +{ + public: + enum + { + GUILD_SKILL_MAX_NUM = 12, + ENEMY_GUILD_SLOT_MAX_COUNT = 6, + }; + + typedef struct SGulidInfo + { + DWORD dwGuildID; + char szGuildName[GUILD_NAME_MAX_LEN+1]; + DWORD dwMasterPID; + DWORD dwGuildLevel; + DWORD dwCurrentExperience; + DWORD dwCurrentMemberCount; + DWORD dwMaxMemberCount; + DWORD dwGuildMoney; + BOOL bHasLand; + } TGuildInfo; + + typedef struct SGuildGradeData + { + SGuildGradeData(){} + SGuildGradeData(BYTE byAuthorityFlag_, const char * c_szName_) : byAuthorityFlag(byAuthorityFlag_), strName(c_szName_) {} + BYTE byAuthorityFlag; + std::string strName; + } TGuildGradeData; + typedef std::map TGradeDataMap; + + typedef struct SGuildMemberData + { + DWORD dwPID; + + std::string strName; + BYTE byGrade; + BYTE byJob; + BYTE byLevel; + BYTE byGeneralFlag; + DWORD dwOffer; + } TGuildMemberData; + typedef std::vector TGuildMemberDataVector; + + typedef struct SGuildBoardCommentData + { + DWORD dwCommentID; + std::string strName; + std::string strComment; + } TGuildBoardCommentData; + typedef std::vector TGuildBoardCommentDataVector; + + typedef struct SGuildSkillData + { + BYTE bySkillPoint; + BYTE bySkillLevel[GUILD_SKILL_MAX_NUM]; + WORD wGuildPoint; + WORD wMaxGuildPoint; + } TGuildSkillData; + + typedef std::map TGuildNameMap; + + public: + CPythonGuild(); + virtual ~CPythonGuild(); + + void Destroy(); + + void EnableGuild(); + void SetGuildMoney(DWORD dwMoney); + void SetGuildEXP(BYTE byLevel, DWORD dwEXP); + void SetGradeData(BYTE byGradeNumber, TGuildGradeData & rGuildGradeData); + void SetGradeName(BYTE byGradeNumber, const char * c_szName); + void SetGradeAuthority(BYTE byGradeNumber, BYTE byAuthority); + void ClearComment(); + void RegisterComment(DWORD dwCommentID, const char * c_szName, const char * c_szComment); + void RegisterMember(TGuildMemberData & rGuildMemberData); + void ChangeGuildMemberGrade(DWORD dwPID, BYTE byGrade); + void ChangeGuildMemberGeneralFlag(DWORD dwPID, BYTE byFlag); + void RemoveMember(DWORD dwPID); + void RegisterGuildName(DWORD dwID, const char * c_szName); + + BOOL IsMainPlayer(DWORD dwPID); + BOOL IsGuildEnable(); + TGuildInfo & GetGuildInfoRef(); + BOOL GetGradeDataPtr(DWORD dwGradeNumber, TGuildGradeData ** ppData); + const TGuildBoardCommentDataVector & GetGuildBoardCommentVector(); + DWORD GetMemberCount(); + BOOL GetMemberDataPtr(DWORD dwIndex, TGuildMemberData ** ppData); + BOOL GetMemberDataPtrByPID(DWORD dwPID, TGuildMemberData ** ppData); + BOOL GetMemberDataPtrByName(const char * c_szName, TGuildMemberData ** ppData); + DWORD GetGuildMemberLevelSummary(); + DWORD GetGuildMemberLevelAverage(); + DWORD GetGuildExperienceSummary(); + TGuildSkillData & GetGuildSkillDataRef(); + bool GetGuildName(DWORD dwID, std::string * pstrGuildName); + DWORD GetGuildID(); + BOOL HasGuildLand(); + + void StartGuildWar(DWORD dwEnemyGuildID); + void EndGuildWar(DWORD dwEnemyGuildID); + DWORD GetEnemyGuildID(DWORD dwIndex); + BOOL IsDoingGuildWar(); + + protected: + void __CalculateLevelAverage(); + void __SortMember(); + BOOL __IsGradeData(BYTE byGradeNumber); + + void __Initialize(); + + protected: + TGuildInfo m_GuildInfo; + TGradeDataMap m_GradeDataMap; + TGuildMemberDataVector m_GuildMemberDataVector; + TGuildBoardCommentDataVector m_GuildBoardCommentVector; + TGuildSkillData m_GuildSkillData; + TGuildNameMap m_GuildNameMap; + DWORD m_adwEnemyGuildID[ENEMY_GUILD_SLOT_MAX_COUNT]; + + DWORD m_dwMemberLevelSummary; + DWORD m_dwMemberLevelAverage; + DWORD m_dwMemberExperienceSummary; + + BOOL m_bGuildEnable; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/PythonIME.h b/extension/src/port/UserInterface/PythonIME.h new file mode 100644 index 00000000..d2d47c91 --- /dev/null +++ b/extension/src/port/UserInterface/PythonIME.h @@ -0,0 +1,36 @@ +#pragma once + +#include "../EterBase/Singleton.h" +#include "../EterLib/IME.h" + +class CPythonIME : + public IIMEEventSink, + public CIME, + public CSingleton +{ +public: + CPythonIME(); + virtual ~CPythonIME(); + + void MoveLeft(); + void MoveRight(); + void MoveHome(); + void MoveEnd(); + void SetCursorPosition(int iPosition); + void Delete(); + + void Create(HWND hWnd); + +protected: + virtual void OnTab(); + virtual void OnReturn(); + virtual void OnEscape(); + + virtual bool OnWM_CHAR( WPARAM wParam, LPARAM lParam ); + virtual void OnUpdate(); + virtual void OnChangeCodePage(); + virtual void OnOpenCandidateList(); + virtual void OnCloseCandidateList(); + virtual void OnOpenReadingWnd(); + virtual void OnCloseReadingWnd(); +}; diff --git a/extension/src/port/UserInterface/PythonItem.h b/extension/src/port/UserInterface/PythonItem.h new file mode 100644 index 00000000..9824758d --- /dev/null +++ b/extension/src/port/UserInterface/PythonItem.h @@ -0,0 +1,136 @@ +#pragma once + +// Note : 화면상에 떨어진 Item의 Update와 Rendering을 책임지는 한편 +// 각 아이템의 데이타와 Icon Image Instance의 매니져 역할까지 주관 +// 조금 난잡해진거 같기도 하다 - 2003. 01. 13. [levites] + +#include "../EterGrnLib/ThingInstance.h" + +class CItemData; + +class CPythonItem : public CSingleton +{ + public: + enum + { + INVALID_ID = 0xffffffff, + }; + + enum + { + VNUM_MONEY = 1, + }; + + enum + { + USESOUND_NONE, + USESOUND_DEFAULT, + USESOUND_ARMOR, + USESOUND_WEAPON, + USESOUND_BOW, + USESOUND_ACCESSORY, + USESOUND_POTION, + USESOUND_PORTAL, + USESOUND_NUM, + }; + + enum + { + DROPSOUND_DEFAULT, + DROPSOUND_ARMOR, + DROPSOUND_WEAPON, + DROPSOUND_BOW, + DROPSOUND_ACCESSORY, + DROPSOUND_NUM + }; + + typedef struct SGroundItemInstance + { + DWORD dwVirtualNumber; + D3DXVECTOR3 v3EndPosition; + + D3DXVECTOR3 v3RotationAxis; + D3DXQUATERNION qEnd; + D3DXVECTOR3 v3Center; + CGraphicThingInstance ThingInstance; + DWORD dwStartTime; + DWORD dwEndTime; + + DWORD eDropSoundType; + + bool bAnimEnded; + bool Update(); + void Clear(); + + DWORD dwEffectInstanceIndex; + std::string stOwnership; + + static void __PlayDropSound(DWORD eItemType, const D3DXVECTOR3& c_rv3Pos); + static std::string ms_astDropSoundFileName[DROPSOUND_NUM]; + + SGroundItemInstance() {} + virtual ~SGroundItemInstance() {} + } TGroundItemInstance; + + typedef std::map TGroundItemInstanceMap; + + public: + CPythonItem(void); + virtual ~CPythonItem(void); + + // Initialize + void Destroy(); + void Create(); + + void PlayUseSound(DWORD dwItemID); + void PlayDropSound(DWORD dwItemID); + void PlayUsePotionSound(); + + void SetUseSoundFileName(DWORD eItemType, const std::string& c_rstFileName); + void SetDropSoundFileName(DWORD eItemType, const std::string& c_rstFileName); + + void GetInfo(std::string* pstInfo); + + void DeleteAllItems(); + + void Render(); + void Update(const POINT& c_rkPtMouse); + + void CreateItem(DWORD dwVirtualID, DWORD dwVirtualNumber, float x, float y, float z, bool bDrop=true); + void DeleteItem(DWORD dwVirtualID); + void SetOwnership(DWORD dwVID, const char * c_pszName); + bool GetOwnership(DWORD dwVID, const char ** c_pszName); + + BOOL GetGroundItemPosition(DWORD dwVirtualID, TPixelPosition * pPosition); + + bool GetPickedItemID(DWORD* pdwPickedItemID); + + bool GetCloseItem(const TPixelPosition & c_rPixelPosition, DWORD* pdwItemID, DWORD dwDistance=300); + bool GetCloseMoney(const TPixelPosition & c_rPixelPosition, DWORD* dwItemID, DWORD dwDistance=300); + + DWORD GetVirtualNumberOfGroundItem(DWORD dwVID); + + void BuildNoGradeNameData(int iType); + DWORD GetNoGradeNameDataCount(); + CItemData * GetNoGradeNameDataPtr(DWORD dwIndex); + + protected: + DWORD __Pick(const POINT& c_rkPtMouse); + + DWORD __GetUseSoundType(const CItemData& c_rkItemData); + DWORD __GetDropSoundType(const CItemData& c_rkItemData); + + protected: + TGroundItemInstanceMap m_GroundItemInstanceMap; + CDynamicPool m_GroundItemInstancePool; + + DWORD m_dwDropItemEffectID; + DWORD m_dwPickedItemID; + + int m_nMouseX; + int m_nMouseY; + + std::string m_astUseSoundFileName[USESOUND_NUM]; + + std::vector m_NoGradeNameItemData; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/PythonMessenger.h b/extension/src/port/UserInterface/PythonMessenger.h new file mode 100644 index 00000000..150ae9c0 --- /dev/null +++ b/extension/src/port/UserInterface/PythonMessenger.h @@ -0,0 +1,45 @@ +#pragma once + +class CPythonMessenger : public CSingleton +{ + public: + typedef std::set TFriendNameMap; + typedef std::map TGuildMemberStateMap; + + enum EMessengerGroupIndex + { + MESSENGER_GRUOP_INDEX_FRIEND, + MESSENGER_GRUOP_INDEX_GUILD, + }; + + public: + CPythonMessenger(); + virtual ~CPythonMessenger(); + + void Destroy(); + + // Friend + void RemoveFriend(const char * c_szKey); + void OnFriendLogin(const char * c_szKey); + void OnFriendLogout(const char * c_szKey); + void SetMobile(const char * c_szKey, BYTE byState); + BOOL IsFriendByKey(const char * c_szKey); + BOOL IsFriendByName(const char * c_szName); + + // Guild + void AppendGuildMember(const char * c_szName); + void RemoveGuildMember(const char * c_szName); + void RemoveAllGuildMember(); + void LoginGuildMember(const char * c_szName); + void LogoutGuildMember(const char * c_szName); + void RefreshGuildMember(); + + void SetMessengerHandler(PyObject* poHandler); + + protected: + TFriendNameMap m_FriendNameMap; + TGuildMemberStateMap m_GuildMemberStateMap; + + private: + PyObject * m_poMessengerHandler; +}; diff --git a/extension/src/port/UserInterface/PythonMiniMap.h b/extension/src/port/UserInterface/PythonMiniMap.h new file mode 100644 index 00000000..a1c922de --- /dev/null +++ b/extension/src/port/UserInterface/PythonMiniMap.h @@ -0,0 +1,253 @@ +#pragma once + +#include "PythonBackground.h" + +class CPythonMiniMap : public CScreen, public CSingleton +{ + public: + enum + { + EMPIRE_NUM = 4, + + MINI_WAYPOINT_IMAGE_COUNT = 12, + WAYPOINT_IMAGE_COUNT = 15, + TARGET_MARK_IMAGE_COUNT = 2, + }; + enum + { + TYPE_OPC, + TYPE_OPCPVP, + TYPE_OPCPVPSELF, + TYPE_NPC, + TYPE_MONSTER, + TYPE_WARP, + TYPE_WAYPOINT, + TYPE_PARTY, + TYPE_EMPIRE, + TYPE_EMPIRE_END = TYPE_EMPIRE + EMPIRE_NUM, + TYPE_TARGET, + TYPE_COUNT, + }; + + public: + CPythonMiniMap(); + virtual ~CPythonMiniMap(); + + void Destroy(); + bool Create(); + + bool IsAtlas(); + bool CanShow(); + bool CanShowAtlas(); + + void SetMiniMapSize(float fWidth, float fHeight); + void SetScale(float fScale); + void ScaleUp(); + void ScaleDown(); + + void SetCenterPosition(float fCenterX, float fCenterY); + + void Update(float fCenterX, float fCenterY); + void Render(float fScreenX, float fScreenY); + + void Show(); + void Hide(); + + bool GetPickedInstanceInfo(float fScreenX, float fScreenY, std::string & rReturnName, float * pReturnPosX, float * pReturnPosY, DWORD * pdwTextColor); + + // Atlas + bool LoadAtlas(); + void UpdateAtlas(); + void RenderAtlas(float fScreenX, float fScreenY); + void ShowAtlas(); + void HideAtlas(); + + bool GetAtlasInfo(float fScreenX, float fScreenY, std::string & rReturnString, float * pReturnPosX, float * pReturnPosY, DWORD * pdwTextColor, DWORD * pdwGuildID); + bool GetAtlasSize(float * pfSizeX, float * pfSizeY); + + void AddObserver(DWORD dwVID, float fSrcX, float fSrcY); + void MoveObserver(DWORD dwVID, float fDstX, float fDstY); + void RemoveObserver(DWORD dwVID); + + // WayPoint + void AddWayPoint(BYTE byType, DWORD dwID, float fX, float fY, std::string strText, DWORD dwChrVID=0); + void RemoveWayPoint(DWORD dwID); + + // SignalPoint + void AddSignalPoint(float fX, float fY); + void ClearAllSignalPoint(); + + void RegisterAtlasWindow(PyObject* poHandler); + void UnregisterAtlasWindow(); + void OpenAtlasWindow(); + void SetAtlasCenterPosition(int x, int y); + + // NPC List + void ClearAtlasMarkInfo(); + void RegisterAtlasMark(BYTE byType, const char * c_szName, long lx, long ly); + + // Guild + void ClearGuildArea(); + void RegisterGuildArea(DWORD dwID, DWORD dwGuildID, long x, long y, long width, long height); + DWORD GetGuildAreaID(DWORD x, DWORD y); + + // Target + void CreateTarget(int iID, const char * c_szName); + void CreateTarget(int iID, const char * c_szName, DWORD dwVID); + void UpdateTarget(int iID, int ix, int iy); + void DeleteTarget(int iID); + + protected: + void __Initialize(); + void __SetPosition(); + void __LoadAtlasMarkInfo(); + + void __RenderWayPointMark(int ixCenter, int iyCenter); + void __RenderMiniWayPointMark(int ixCenter, int iyCenter); + void __RenderTargetMark(int ixCenter, int iyCenter); + + void __GlobalPositionToAtlasPosition(long lx, long ly, float * pfx, float * pfy); + + protected: + // Atlas + typedef struct + { + BYTE m_byType; + DWORD m_dwID; // For WayPoint + float m_fX; + float m_fY; + float m_fScreenX; + float m_fScreenY; + float m_fMiniMapX; + float m_fMiniMapY; + DWORD m_dwChrVID; + std::string m_strText; + } TAtlasMarkInfo; + + // GuildArea + typedef struct + { + DWORD dwGuildID; + long lx, ly; + long lwidth, lheight; + + float fsxRender, fsyRender; + float fexRender, feyRender; + } TGuildAreaInfo; + + struct SObserver + { + float fCurX; + float fCurY; + float fSrcX; + float fSrcY; + float fDstX; + float fDstY; + + DWORD dwSrcTime; + DWORD dwDstTime; + }; + + // 캐릭터 리스트 + typedef struct + { + float m_fX; + float m_fY; + UINT m_eNameColor; + } TMarkPosition; + + typedef std::vector TInstanceMarkPositionVector; + typedef TInstanceMarkPositionVector::iterator TInstancePositionVectorIterator; + + protected: + bool __GetWayPoint(DWORD dwID, TAtlasMarkInfo ** ppkInfo); + void __UpdateWayPoint(TAtlasMarkInfo * pkInfo, int ix, int iy); + + protected: + float m_fWidth; + float m_fHeight; + + float m_fScale; + + float m_fCenterX; + float m_fCenterY; + + float m_fCenterCellX; + float m_fCenterCellY; + + float m_fScreenX; + float m_fScreenY; + + float m_fMiniMapRadius; + + // 맵 그림... + LPDIRECT3DTEXTURE8 m_lpMiniMapTexture[AROUND_AREA_NUM]; + + // 미니맵 커버 + CGraphicImageInstance m_MiniMapFilterGraphicImageInstance; + CGraphicExpandedImageInstance m_MiniMapCameraraphicImageInstance; + + // 캐릭터 마크 + CGraphicExpandedImageInstance m_PlayerMark; + CGraphicImageInstance m_WhiteMark; + + TInstanceMarkPositionVector m_PartyPCPositionVector; + TInstanceMarkPositionVector m_OtherPCPositionVector; + TInstanceMarkPositionVector m_NPCPositionVector; + TInstanceMarkPositionVector m_MonsterPositionVector; + TInstanceMarkPositionVector m_WarpPositionVector; + std::map m_kMap_dwVID_kObserver; + + bool m_bAtlas; + bool m_bShow; + + CGraphicVertexBuffer m_VertexBuffer; + CGraphicIndexBuffer m_IndexBuffer; + + D3DXMATRIX m_matIdentity; + D3DXMATRIX m_matWorld; + D3DXMATRIX m_matMiniMapCover; + + bool m_bShowAtlas; + CGraphicImageInstance m_AtlasImageInstance; + D3DXMATRIX m_matWorldAtlas; + CGraphicExpandedImageInstance m_AtlasPlayerMark; + + float m_fAtlasScreenX; + float m_fAtlasScreenY; + + DWORD m_dwAtlasBaseX; + DWORD m_dwAtlasBaseY; + + float m_fAtlasMaxX; + float m_fAtlasMaxY; + + float m_fAtlasImageSizeX; + float m_fAtlasImageSizeY; + + typedef std::vector TAtlasMarkInfoVector; + typedef TAtlasMarkInfoVector::iterator TAtlasMarkInfoVectorIterator; + typedef std::vector TGuildAreaInfoVector; + typedef TGuildAreaInfoVector::iterator TGuildAreaInfoVectorIterator; + TAtlasMarkInfoVectorIterator m_AtlasMarkInfoVectorIterator; + TAtlasMarkInfoVector m_AtlasNPCInfoVector; + TAtlasMarkInfoVector m_AtlasWarpInfoVector; + + // WayPoint + CGraphicExpandedImageInstance m_MiniWayPointGraphicImageInstances[MINI_WAYPOINT_IMAGE_COUNT]; + CGraphicExpandedImageInstance m_WayPointGraphicImageInstances[WAYPOINT_IMAGE_COUNT]; + CGraphicExpandedImageInstance m_TargetMarkGraphicImageInstances[TARGET_MARK_IMAGE_COUNT]; + CGraphicImageInstance m_GuildAreaFlagImageInstance; + TAtlasMarkInfoVector m_AtlasWayPointInfoVector; + TGuildAreaInfoVector m_GuildAreaInfoVector; + + // SignalPoint + struct TSignalPoint + { + D3DXVECTOR2 v2Pos; + unsigned int id; + }; + std::vector m_SignalPointVector; + + PyObject* m_poHandler; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/PythonNetworkStream.h b/extension/src/port/UserInterface/PythonNetworkStream.h new file mode 100644 index 00000000..f87e26f6 --- /dev/null +++ b/extension/src/port/UserInterface/PythonNetworkStream.h @@ -0,0 +1,738 @@ +#pragma once + +#include "../EterLib/FuncObject.h" +#include "../EterLib/NetStream.h" +#include "../EterLib/NetPacketHeaderMap.h" + +#include "InsultChecker.h" + +#include "Packet.h" + +class CInstanceBase; +class CNetworkActorManager; +struct SNetworkActorData; +struct SNetworkUpdateActorData; + +class CPythonNetworkStream : public CNetworkStream, public CSingleton +{ + public: + enum + { + SERVER_COMMAND_LOG_OUT = 0, + SERVER_COMMAND_RETURN_TO_SELECT_CHARACTER = 1, + SERVER_COMMAND_QUIT = 2, + + MAX_ACCOUNT_PLAYER + }; + + enum + { + ERROR_NONE, + ERROR_UNKNOWN, + ERROR_CONNECT_MARK_SERVER, + ERROR_LOAD_MARK, + ERROR_MARK_WIDTH, + ERROR_MARK_HEIGHT, + + // MARK_BUG_FIX + ERROR_MARK_UPLOAD_NEED_RECONNECT, + ERROR_MARK_CHECK_NEED_RECONNECT, + // END_OF_MARK_BUG_FIX + }; + + enum + { + ACCOUNT_CHARACTER_SLOT_ID, + ACCOUNT_CHARACTER_SLOT_NAME, + ACCOUNT_CHARACTER_SLOT_RACE, + ACCOUNT_CHARACTER_SLOT_LEVEL, + ACCOUNT_CHARACTER_SLOT_STR, + ACCOUNT_CHARACTER_SLOT_DEX, + ACCOUNT_CHARACTER_SLOT_HTH, + ACCOUNT_CHARACTER_SLOT_INT, + ACCOUNT_CHARACTER_SLOT_PLAYTIME, + ACCOUNT_CHARACTER_SLOT_FORM, + ACCOUNT_CHARACTER_SLOT_ADDR, + ACCOUNT_CHARACTER_SLOT_PORT, + ACCOUNT_CHARACTER_SLOT_GUILD_ID, + ACCOUNT_CHARACTER_SLOT_GUILD_NAME, + ACCOUNT_CHARACTER_SLOT_CHANGE_NAME_FLAG, + ACCOUNT_CHARACTER_SLOT_HAIR, + }; + + enum + { + PHASE_WINDOW_LOGO, + PHASE_WINDOW_LOGIN, + PHASE_WINDOW_SELECT, + PHASE_WINDOW_CREATE, + PHASE_WINDOW_LOAD, + PHASE_WINDOW_GAME, + PHASE_WINDOW_EMPIRE, + PHASE_WINDOW_NUM, + }; + + public: + CPythonNetworkStream(); + virtual ~CPythonNetworkStream(); + + bool SendSpecial(int nLen, void * pvBuf); + + void StartGame(); + void Warp(LONG lGlobalX, LONG lGlobalY); + + void NotifyHack(const char* c_szMsg); + void SetWaitFlag(); +#if defined(ENABLE_DISCORD_RPC) + void Discord_Start(); + void Discord_Close(); + void Discord_Update(const bool bInGame); +#endif + + void SendEmoticon(UINT eEmoticon); + + void ExitApplication(); + void ExitGame(); + void LogOutGame(); + void AbsoluteExitGame(); + void AbsoluteExitApplication(); + + void EnableChatInsultFilter(bool isEnable); + bool IsChatInsultIn(const char* c_szMsg); + bool IsInsultIn(const char* c_szMsg); + + DWORD GetGuildID(); + + UINT UploadMark(const char* c_szImageFileName); + UINT UploadSymbol(const char* c_szImageFileName); + + bool LoadInsultList(const char* c_szInsultListFileName); + bool LoadConvertTable(DWORD dwEmpireID, const char* c_szFileName); + + UINT GetAccountCharacterSlotDatau(UINT iSlot, UINT eType); + const char* GetAccountCharacterSlotDataz(UINT iSlot, UINT eType); + + // SUPPORT_BGM + const char* GetFieldMusicFileName(); + float GetFieldMusicVolume(); + // END_OF_SUPPORT_BGM + + bool IsSelectedEmpire(); + + void ToggleGameDebugInfo(); + + void SetMarkServer(const char* c_szAddr, UINT uPort); + void ConnectLoginServer(const char* c_szAddr, UINT uPort); + void ConnectGameServer(UINT iChrSlot); + + void SetLoginInfo(const char* c_szID, const char* c_szPassword); + void SetLoginKey(DWORD dwLoginKey); + void ClearLoginInfo( void ); + + void SetHandler(PyObject* poHandler); + void SetPhaseWindow(UINT ePhaseWnd, PyObject* poPhaseWnd); + void ClearPhaseWindow(UINT ePhaseWnd, PyObject* poPhaseWnd); + void SetServerCommandParserWindow(PyObject* poPhaseWnd); + + bool SendSyncPositionElementPacket(DWORD dwVictimVID, DWORD dwVictimX, DWORD dwVictimY); + + bool SendAttackPacket(UINT uMotAttack, DWORD dwVIDVictim); + bool SendCharacterStatePacket(const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg); + bool SendUseSkillPacket(DWORD dwSkillIndex, DWORD dwTargetVID=0); + bool SendTargetPacket(DWORD dwVID); + + // OLDCODE: + bool SendCharacterStartWalkingPacket(float fRotation, long lx, long ly); + bool SendCharacterEndWalkingPacket(float fRotation, long lx, long ly); + bool SendCharacterCheckWalkingPacket(float fRotation, long lx, long ly); + + bool SendCharacterPositionPacket(BYTE iPosition); + + bool SendItemUsePacket(TItemPos pos); + bool SendItemUseToItemPacket(TItemPos source_pos, TItemPos target_pos); + bool SendItemDropPacket(TItemPos pos, DWORD elk); + bool SendItemDropPacketNew(TItemPos pos, DWORD elk, DWORD count); + bool SendItemMovePacket(TItemPos pos, TItemPos change_pos, BYTE num); + bool SendItemPickUpPacket(DWORD vid); + + bool SendQuickSlotAddPacket(BYTE wpos, BYTE type, BYTE pos); + bool SendQuickSlotDelPacket(BYTE wpos); + bool SendQuickSlotMovePacket(BYTE wpos, BYTE change_pos); + + // PointReset 개 임시 + bool SendPointResetPacket(); + + // Shop + bool SendShopEndPacket(); + bool SendShopBuyPacket(BYTE byCount); + bool SendShopSellPacket(BYTE bySlot); + bool SendShopSellPacketNew(BYTE bySlot, BYTE byCount); + + // Exchange + bool SendExchangeStartPacket(DWORD vid); + bool SendExchangeItemAddPacket(TItemPos ItemPos, BYTE byDisplayPos); + bool SendExchangeElkAddPacket(DWORD elk); + bool SendExchangeItemDelPacket(BYTE pos); + bool SendExchangeAcceptPacket(); + bool SendExchangeExitPacket(); + + // Quest + bool SendScriptAnswerPacket(int iAnswer); + bool SendScriptButtonPacket(unsigned int iIndex); + bool SendAnswerMakeGuildPacket(const char * c_szName); + bool SendQuestInputStringPacket(const char * c_szString); + bool SendQuestConfirmPacket(BYTE byAnswer, DWORD dwPID); + + // Event + bool SendOnClickPacket(DWORD vid); + + // Fly + bool SendFlyTargetingPacket(DWORD dwTargetVID, const TPixelPosition& kPPosTarget); + bool SendAddFlyTargetingPacket(DWORD dwTargetVID, const TPixelPosition& kPPosTarget); + bool SendShootPacket(UINT uSkill); + + // Command + bool ClientCommand(const char * c_szCommand); + void ServerCommand(char * c_szCommand); + + // Emoticon + void RegisterEmoticonString(const char * pcEmoticonString); + + // Party + bool SendPartyInvitePacket(DWORD dwVID); + bool SendPartyInviteAnswerPacket(DWORD dwLeaderVID, BYTE byAccept); + bool SendPartyRemovePacket(DWORD dwPID); + bool SendPartySetStatePacket(DWORD dwVID, BYTE byState, BYTE byFlag); + bool SendPartyUseSkillPacket(BYTE bySkillIndex, DWORD dwVID); + bool SendPartyParameterPacket(BYTE byDistributeMode); + + // SafeBox + bool SendSafeBoxMoneyPacket(BYTE byState, DWORD dwMoney); + bool SendSafeBoxCheckinPacket(TItemPos InventoryPos, BYTE bySafeBoxPos); + bool SendSafeBoxCheckoutPacket(BYTE bySafeBoxPos, TItemPos InventoryPos); + bool SendSafeBoxItemMovePacket(BYTE bySourcePos, BYTE byTargetPos, BYTE byCount); + + // Mall + bool SendMallCheckoutPacket(BYTE byMallPos, TItemPos InventoryPos); + + // Guild + bool SendGuildAddMemberPacket(DWORD dwVID); + bool SendGuildRemoveMemberPacket(DWORD dwPID); + bool SendGuildChangeGradeNamePacket(BYTE byGradeNumber, const char * c_szName); + bool SendGuildChangeGradeAuthorityPacket(BYTE byGradeNumber, BYTE byAuthority); + bool SendGuildOfferPacket(DWORD dwExperience); + bool SendGuildPostCommentPacket(const char * c_szMessage); + bool SendGuildDeleteCommentPacket(DWORD dwIndex); + bool SendGuildRefreshCommentsPacket(DWORD dwHighestIndex); + bool SendGuildChangeMemberGradePacket(DWORD dwPID, BYTE byGrade); + bool SendGuildUseSkillPacket(DWORD dwSkillID, DWORD dwTargetVID); + bool SendGuildChangeMemberGeneralPacket(DWORD dwPID, BYTE byFlag); + bool SendGuildInvitePacket(DWORD dwVID); + bool SendGuildInviteAnswerPacket(DWORD dwGuildID, BYTE byAnswer); + bool SendGuildChargeGSPPacket(DWORD dwMoney); + bool SendGuildDepositMoneyPacket(DWORD dwMoney); + bool SendGuildWithdrawMoneyPacket(DWORD dwMoney); + + // Mall + bool RecvMallOpenPacket(); + bool RecvMallItemSetPacket(); + bool RecvMallItemDelPacket(); + + // Lover + bool RecvLoverInfoPacket(); + bool RecvLovePointUpdatePacket(); + + // Dig + bool RecvDigMotionPacket(); + + // Fishing + bool SendFishingPacket(int iRotation); + bool SendGiveItemPacket(DWORD dwTargetVID, TItemPos ItemPos, int iItemCount); + + // Private Shop + bool SendBuildPrivateShopPacket(const char * c_szName, const std::vector & c_rSellingItemStock); + + // Refine + bool SendRefinePacket(BYTE byPos, BYTE byType); + bool SendSelectItemPacket(DWORD dwItemPos); + + // Client Version + bool SendClientVersionPacket(); + + // CRC Report + bool __SendCRCReportPacket(); + + // 용홍석 강화 + bool SendDragonSoulRefinePacket(BYTE bRefineType, TItemPos* pos); + + // Handshake + bool RecvHandshakePacket(); + bool RecvHandshakeOKPacket(); + + bool RecvHybridCryptKeyPacket(); + bool RecvHybridCryptSDBPacket(); +#ifdef _IMPROVED_PACKET_ENCRYPTION_ + bool RecvKeyAgreementPacket(); + bool RecvKeyAgreementCompletedPacket(); + +#endif + // ETC + DWORD GetMainActorVID(); + DWORD GetMainActorRace(); + DWORD GetMainActorEmpire(); + DWORD GetMainActorSkillGroup(); + void SetEmpireID(DWORD dwEmpireID); + DWORD GetEmpireID(); + void __TEST_SetSkillGroupFake(int iIndex); + + ////////////////////////////////////////////////////////////////////////// + // Phase 관련 + ////////////////////////////////////////////////////////////////////////// + public: + void SetOffLinePhase(); + void SetHandShakePhase(); + void SetLoginPhase(); + void SetSelectPhase(); + void SetLoadingPhase(); + void SetGamePhase(); + void ClosePhase(); + + // Login Phase + bool SendLoginPacket(const char * c_szName, const char * c_szPassword); + bool SendLoginPacketNew(const char * c_szName, const char * c_szPassword); + bool SendChinaMatrixCardPacket(const char * c_szMatrixCardString); + bool SendRunupMatrixAnswerPacket(const char * c_szMatrixCardString); + bool SendNEWCIBNPasspodAnswerPacket(const char * answer); + bool SendDirectEnterPacket(const char * c_szName, const char * c_szPassword, UINT uChrSlot); + + bool SendEnterGame(); + + // Select Phase + bool SendSelectEmpirePacket(DWORD dwEmpireID); + bool SendSelectCharacterPacket(BYTE account_Index); + bool SendChangeNamePacket(BYTE index, const char *name); + bool SendCreateCharacterPacket(BYTE index, const char *name, BYTE job, BYTE shape, BYTE byStat1, BYTE byStat2, BYTE byStat3, BYTE byStat4); + bool SendDestroyCharacterPacket(BYTE index, const char * szPrivateCode); + + // Main Game Phase + bool SendC2CPacket(DWORD dwSize, void * pData); + bool SendChatPacket(const char * c_szChat, BYTE byType = CHAT_TYPE_TALKING); + bool SendWhisperPacket(const char * name, const char * c_szChat); + bool SendMobileMessagePacket(const char * name, const char * c_szChat); + bool SendMessengerAddByVIDPacket(DWORD vid); + bool SendMessengerAddByNamePacket(const char * c_szName); + bool SendMessengerRemovePacket(const char * c_szKey, const char * c_szName); + + protected: + bool OnProcess(); // State들을 실제로 실행한다. + void OffLinePhase(); + void HandShakePhase(); + void LoginPhase(); + void SelectPhase(); + void LoadingPhase(); + void GamePhase(); + + bool __IsNotPing(); + + void __DownloadMark(); + void __DownloadSymbol(const std::vector & c_rkVec_dwGuildID); + + void __PlayInventoryItemUseSound(TItemPos uSlotPos); + void __PlayInventoryItemDropSound(TItemPos uSlotPos); + //void __PlayShopItemDropSound(UINT uSlotPos); + void __PlaySafeBoxItemDropSound(UINT uSlotPos); + void __PlayMallItemDropSound(UINT uSlotPos); + + bool __CanActMainInstance(); + + enum REFRESH_WINDOW_TYPE + { + RefreshStatus = (1 << 0), + RefreshAlignmentWindow = (1 << 1), + RefreshCharacterWindow = (1 << 2), + RefreshEquipmentWindow = (1 << 3), + RefreshInventoryWindow = (1 << 4), + RefreshExchangeWindow = (1 << 5), + RefreshSkillWindow = (1 << 6), + RefreshSafeboxWindow = (1 << 7), + RefreshMessengerWindow = (1 << 8), + RefreshGuildWindowInfoPage = (1 << 9), + RefreshGuildWindowBoardPage = (1 << 10), + RefreshGuildWindowMemberPage = (1 << 11), + RefreshGuildWindowMemberPageGradeComboBox = (1 << 12), + RefreshGuildWindowSkillPage = (1 << 13), + RefreshGuildWindowGradePage = (1 << 14), + RefreshTargetBoard = (1 << 15), + RefreshMallWindow = (1 << 16), + }; + + void __RefreshStatus(); + void __RefreshAlignmentWindow(); + void __RefreshCharacterWindow(); + void __RefreshEquipmentWindow(); + void __RefreshInventoryWindow(); + void __RefreshExchangeWindow(); + void __RefreshSkillWindow(); + void __RefreshSafeboxWindow(); + void __RefreshMessengerWindow(); + void __RefreshGuildWindowInfoPage(); + void __RefreshGuildWindowBoardPage(); + void __RefreshGuildWindowMemberPage(); + void __RefreshGuildWindowMemberPageGradeComboBox(); + void __RefreshGuildWindowSkillPage(); + void __RefreshGuildWindowGradePage(); + void __RefreshTargetBoardByVID(DWORD dwVID); + void __RefreshTargetBoardByName(const char * c_szName); + void __RefreshTargetBoard(); + void __RefreshMallWindow(); + + bool __SendHack(const char* c_szMsg); + + protected: + bool RecvObserverAddPacket(); + bool RecvObserverRemovePacket(); + bool RecvObserverMovePacket(); + + // Common + bool RecvErrorPacket(int header); + bool RecvPingPacket(); + bool RecvDefaultPacket(int header); + bool RecvPhasePacket(); + + // Login Phase + bool __RecvLoginSuccessPacket3(); + bool __RecvLoginSuccessPacket4(); + bool __RecvLoginFailurePacket(); + bool __RecvEmpirePacket(); + bool __RecvChinaMatrixCardPacket(); + bool __RecvRunupMatrixQuizPacket(); + bool __RecvNEWCIBNPasspodRequestPacket(); + bool __RecvNEWCIBNPasspodFailurePacket(); + bool __RecvLoginKeyPacket(); + + // Select Phase + bool __RecvPlayerCreateSuccessPacket(); + bool __RecvPlayerCreateFailurePacket(); + bool __RecvPlayerDestroySuccessPacket(); + bool __RecvPlayerDestroyFailurePacket(); + bool __RecvPreserveItemPacket(); + bool __RecvPlayerPoints(); + bool __RecvChangeName(); + + // Loading Phase + bool RecvMainCharacter(); + bool RecvMainCharacter2_EMPIRE(); + bool RecvMainCharacter3_BGM(); + bool RecvMainCharacter4_BGM_VOL(); + + void __SetFieldMusicFileName(const char* musicName); + void __SetFieldMusicFileInfo(const char* musicName, float vol); + // END_OF_SUPPORT_BGM + + // Main Game Phase + bool RecvWarpPacket(); + bool RecvPVPPacket(); + bool RecvDuelStartPacket(); + bool RecvGlobalTimePacket(); + bool RecvCharacterAppendPacket(); + bool RecvCharacterAdditionalInfo(); + bool RecvCharacterAppendPacketNew(); + bool RecvCharacterUpdatePacket(); + bool RecvCharacterUpdatePacketNew(); + bool RecvCharacterDeletePacket(); + bool RecvChatPacket(); + bool RecvOwnerShipPacket(); + bool RecvSyncPositionPacket(); + bool RecvWhisperPacket(); + bool RecvPointChange(); // Alarm to python + bool RecvChangeSpeedPacket(); + + bool RecvStunPacket(); + bool RecvDeadPacket(); + bool RecvCharacterMovePacket(); + + bool RecvItemSetPacket(); // Alarm to python + bool RecvItemSetPacket2(); // Alarm to python + bool RecvItemUsePacket(); // Alarm to python + bool RecvItemUpdatePacket(); // Alarm to python + bool RecvItemGroundAddPacket(); + bool RecvItemGroundDelPacket(); + bool RecvItemOwnership(); + + bool RecvQuickSlotAddPacket(); // Alarm to python + bool RecvQuickSlotDelPacket(); // Alarm to python + bool RecvQuickSlotMovePacket(); // Alarm to python + + bool RecvCharacterPositionPacket(); + bool RecvMotionPacket(); + + bool RecvShopPacket(); + bool RecvShopSignPacket(); + bool RecvExchangePacket(); + + // Quest + bool RecvScriptPacket(); + bool RecvQuestInfoPacket(); + bool RecvQuestConfirmPacket(); + bool RecvRequestMakeGuild(); + + // Skill + bool RecvSkillLevel(); + bool RecvSkillLevelNew(); + bool RecvSkillCoolTimeEnd(); + + // Target + bool RecvTargetPacket(); + bool RecvViewEquipPacket(); + bool RecvDamageInfoPacket(); + + // Mount + bool RecvMountPacket(); + + // Fly + bool RecvCreateFlyPacket(); + bool RecvFlyTargetingPacket(); + bool RecvAddFlyTargetingPacket(); + + // Messenger + bool RecvMessenger(); + + // Guild + bool RecvGuild(); + + // Party + bool RecvPartyInvite(); + bool RecvPartyAdd(); + bool RecvPartyUpdate(); + bool RecvPartyRemove(); + bool RecvPartyLink(); + bool RecvPartyUnlink(); + bool RecvPartyParameter(); + + // SafeBox + bool RecvSafeBoxSetPacket(); + bool RecvSafeBoxDelPacket(); + bool RecvSafeBoxWrongPasswordPacket(); + bool RecvSafeBoxSizePacket(); + bool RecvSafeBoxMoneyChangePacket(); + + // Fishing + bool RecvFishing(); + + // Dungeon + bool RecvDungeon(); + + // Time + bool RecvTimePacket(); + + // WalkMode + bool RecvWalkModePacket(); + + // ChangeSkillGroup + bool RecvChangeSkillGroupPacket(); + + // Refine + bool RecvRefineInformationPacket(); + bool RecvRefineInformationPacketNew(); + + // Use Potion + bool RecvSpecialEffect(); + + // 서버에서 지정한 이팩트 발동 패킷. + bool RecvSpecificEffect(); + + // 용혼석 관련 + bool RecvDragonSoulRefine(); + + // MiniMap Info + bool RecvNPCList(); + bool RecvLandPacket(); + bool RecvTargetCreatePacket(); + bool RecvTargetCreatePacketNew(); + bool RecvTargetUpdatePacket(); + bool RecvTargetDeletePacket(); + + // Affect + bool RecvAffectAddPacket(); + bool RecvAffectRemovePacket(); + + // Channel + bool RecvChannelPacket(); + + //Security + bool RecvHSCheckRequest(); + bool RecvXTrapVerifyRequest(); + + protected: + // 이모티콘 + bool ParseEmoticon(const char * pChatMsg, DWORD * pdwEmoticon); + + // 파이썬으로 보내는 콜들 + void OnConnectFailure(); + void OnScriptEventStart(int iSkin, int iIndex); + + void OnRemoteDisconnect(); + void OnDisconnect(); + + void SetGameOnline(); + void SetGameOffline(); + BOOL IsGameOnline(); + + protected: + bool CheckPacket(TPacketHeader * pRetHeader); + + void __InitializeGamePhase(); + void __InitializeMarkAuth(); + void __GlobalPositionToLocalPosition(LONG& rGlobalX, LONG& rGlobalY); + void __LocalPositionToGlobalPosition(LONG& rLocalX, LONG& rLocalY); + + bool __IsPlayerAttacking(); + bool __IsEquipItemInSlot(TItemPos Cell); + + void __ShowMapName(LONG lLocalX, LONG lLocalY); + + void __LeaveOfflinePhase() {} + void __LeaveHandshakePhase() {} + void __LeaveLoginPhase() {} + void __LeaveSelectPhase() {} + void __LeaveLoadingPhase() {} + void __LeaveGamePhase(); + + void __ClearNetworkActorManager(); + + void __ClearSelectCharacterData(); + + // DELETEME + //void __SendWarpPacket(); + + void __ConvertEmpireText(DWORD dwEmpireID, char* szText); + + void __RecvCharacterAppendPacket(SNetworkActorData * pkNetActorData); + void __RecvCharacterUpdatePacket(SNetworkUpdateActorData * pkNetUpdateActorData); + + void __FilterInsult(char* szLine, UINT uLineLen); + + void __SetGuildID(DWORD id); + + protected: + TPacketGCHandshake m_HandshakeData; + DWORD m_dwChangingPhaseTime; + DWORD m_dwBindupRetryCount; + DWORD m_dwMainActorVID; + DWORD m_dwMainActorRace; + DWORD m_dwMainActorEmpire; + DWORD m_dwMainActorSkillGroup; + BOOL m_isGameOnline; + BOOL m_isStartGame; + + DWORD m_dwGuildID; + DWORD m_dwEmpireID; + + struct SServerTimeSync + { + DWORD m_dwChangeServerTime; + DWORD m_dwChangeClientTime; + } m_kServerTimeSync; + + void __ServerTimeSync_Initialize(); + //DWORD m_dwBaseServerTime; + //DWORD m_dwBaseClientTime; + + DWORD m_dwLastGamePingTime; + + std::string m_stID; + std::string m_stPassword; + std::string m_strLastCommand; + std::string m_strPhase; + DWORD m_dwLoginKey; + BOOL m_isWaitLoginKey; + + std::string m_stMarkIP; + + CFuncObject m_phaseProcessFunc; + CFuncObject m_phaseLeaveFunc; + + PyObject* m_poHandler; + PyObject* m_apoPhaseWnd[PHASE_WINDOW_NUM]; + PyObject* m_poSerCommandParserWnd; + + TSimplePlayerInformation m_akSimplePlayerInfo[PLAYER_PER_ACCOUNT4]; + DWORD m_adwGuildID[PLAYER_PER_ACCOUNT4]; + std::string m_astrGuildName[PLAYER_PER_ACCOUNT4]; + bool m_bSimplePlayerInfo; + + CRef m_rokNetActorMgr; + + bool m_isRefreshStatus; + bool m_isRefreshCharacterWnd; + bool m_isRefreshEquipmentWnd; + bool m_isRefreshInventoryWnd; + bool m_isRefreshExchangeWnd; + bool m_isRefreshSkillWnd; + bool m_isRefreshSafeboxWnd; + bool m_isRefreshMallWnd; + bool m_isRefreshMessengerWnd; + bool m_isRefreshGuildWndInfoPage; + bool m_isRefreshGuildWndBoardPage; + bool m_isRefreshGuildWndMemberPage; + bool m_isRefreshGuildWndMemberPageGradeComboBox; + bool m_isRefreshGuildWndSkillPage; + bool m_isRefreshGuildWndGradePage; + + // Emoticon + std::vector m_EmoticonStringVector; + + struct STextConvertTable + { + char acUpper[26]; + char acLower[26]; + BYTE aacHan[5000][2]; + } m_aTextConvTable[3]; + + + + struct SMarkAuth + { + CNetworkAddress m_kNetAddr; + DWORD m_dwHandle; + DWORD m_dwRandomKey; + } m_kMarkAuth; + + + + DWORD m_dwSelectedCharacterIndex; + + CInsultChecker m_kInsultChecker; + + bool m_isEnableChatInsultFilter; + bool m_bComboSkillFlag; + + std::deque m_kQue_stHack; + + private: + struct SDirectEnterMode + { + bool m_isSet; + DWORD m_dwChrSlotIndex; + } m_kDirectEnterMode; + + void __DirectEnterMode_Initialize(); + void __DirectEnterMode_Set(UINT uChrSlotIndex); + bool __DirectEnterMode_IsSet(); + + public: + DWORD EXPORT_GetBettingGuildWarValue(const char* c_szValueName); + + private: + struct SBettingGuildWar + { + DWORD m_dwBettingMoney; + DWORD m_dwObserverCount; + } m_kBettingGuildWar; + + CInstanceBase * m_pInstTarget; + + void __BettingGuildWar_Initialize(); + void __BettingGuildWar_SetObserverCount(UINT uObserverCount); + void __BettingGuildWar_SetBettingMoney(UINT uBettingMoney); +}; diff --git a/extension/src/port/UserInterface/PythonNonPlayer.h b/extension/src/port/UserInterface/PythonNonPlayer.h new file mode 100644 index 00000000..cdba8f83 --- /dev/null +++ b/extension/src/port/UserInterface/PythonNonPlayer.h @@ -0,0 +1,142 @@ +#pragma once + +/* + * NPC 데이터 프로토 타잎을 관리 한다. + */ +class CPythonNonPlayer : public CSingleton +{ + public: + enum EClickEvent + { + ON_CLICK_EVENT_NONE = 0, + ON_CLICK_EVENT_BATTLE = 1, + ON_CLICK_EVENT_SHOP = 2, + ON_CLICK_EVENT_TALK = 3, + ON_CLICK_EVENT_VEHICLE = 4, + + ON_CLICK_EVENT_MAX_NUM, + }; + + enum EMobEnchants + { + MOB_ENCHANT_CURSE, + MOB_ENCHANT_SLOW, + MOB_ENCHANT_POISON, + MOB_ENCHANT_STUN, + MOB_ENCHANT_CRITICAL, + MOB_ENCHANT_PENETRATE, + MOB_ENCHANTS_MAX_NUM + }; + enum EMobResists + { + MOB_RESIST_SWORD, + MOB_RESIST_TWOHAND, + MOB_RESIST_DAGGER, + MOB_RESIST_BELL, + MOB_RESIST_FAN, + MOB_RESIST_BOW, + MOB_RESIST_FIRE, + MOB_RESIST_ELECT, + MOB_RESIST_MAGIC, + MOB_RESIST_WIND, + MOB_RESIST_POISON, + MOB_RESISTS_MAX_NUM + }; + + #define MOB_ATTRIBUTE_MAX_NUM 12 + #define MOB_SKILL_MAX_NUM 5 + +#pragma pack(push) +#pragma pack(1) + typedef struct SMobSkillLevel + { + DWORD dwVnum; + BYTE bLevel; + } TMobSkillLevel; + + typedef struct SMobTable + { + DWORD dwVnum; + char szName[CHARACTER_NAME_MAX_LEN + 1]; + char szLocaleName[CHARACTER_NAME_MAX_LEN + 1]; + + BYTE bType; // Monster, NPC + BYTE bRank; // PAWN, KNIGHT, KING + BYTE bBattleType; // MELEE, etc.. + BYTE bLevel; // Level + BYTE bSize; + + DWORD dwGoldMin; + DWORD dwGoldMax; + DWORD dwExp; + DWORD dwMaxHP; + BYTE bRegenCycle; + BYTE bRegenPercent; + WORD wDef; + + DWORD dwAIFlag; + DWORD dwRaceFlag; + DWORD dwImmuneFlag; + + BYTE bStr, bDex, bCon, bInt; + DWORD dwDamageRange[2]; + + short sAttackSpeed; + short sMovingSpeed; + BYTE bAggresiveHPPct; + WORD wAggressiveSight; + WORD wAttackRange; + + char cEnchants[MOB_ENCHANTS_MAX_NUM]; + char cResists[MOB_RESISTS_MAX_NUM]; + + DWORD dwResurrectionVnum; + DWORD dwDropItemVnum; + + BYTE bMountCapacity; + BYTE bOnClickType; + + BYTE bEmpire; + char szFolder[64 + 1]; + float fDamMultiply; + DWORD dwSummonVnum; + DWORD dwDrainSP; + DWORD dwMonsterColor; + DWORD dwPolymorphItemVnum; + + TMobSkillLevel Skills[MOB_SKILL_MAX_NUM]; + + BYTE bBerserkPoint; + BYTE bStoneSkinPoint; + BYTE bGodSpeedPoint; + BYTE bDeathBlowPoint; + BYTE bRevivePoint; + } TMobTable; +#pragma pack(pop) + + typedef std::list TMobTableList; + typedef std::map TNonPlayerDataMap; + + public: + CPythonNonPlayer(void); + virtual ~CPythonNonPlayer(void); + + void Clear(); + void Destroy(); + + bool LoadNonPlayerData(const char * c_szFileName); + + const TMobTable * GetTable(DWORD dwVnum); + bool GetName(DWORD dwVnum, const char ** c_pszName); + bool GetInstanceType(DWORD dwVnum, BYTE* pbType); + BYTE GetEventType(DWORD dwVnum); + BYTE GetEventTypeByVID(DWORD dwVID); + DWORD GetMonsterColor(DWORD dwVnum); + const char* GetMonsterName(DWORD dwVnum); + + // Function for outer + void GetMatchableMobList(int iLevel, int iInterval, TMobTableList * pMobTableList); + + protected: + TNonPlayerDataMap m_NonPlayerDataMap; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/PythonPlayer.h b/extension/src/port/UserInterface/PythonPlayer.h new file mode 100644 index 00000000..51acda5b --- /dev/null +++ b/extension/src/port/UserInterface/PythonPlayer.h @@ -0,0 +1,689 @@ +#pragma once + +#include "AbstractPlayer.h" +#include "Packet.h" +#include "PythonSkill.h" + +class CInstanceBase; + +/* + * 메인 캐릭터 (자신이 조정하는 캐릭터) 가 가진 정보들을 관리한다. + * + * 2003-01-12 Levites 본래는 CPythonCharacter가 가지고 있었지만 규모가 너무 커져 버린데다 + * 위치도 애매해서 따로 분리 + * 2003-07-19 Levites 메인 캐릭터의 이동 처리 CharacterInstance에서 떼어다 붙임 + * 기존의 데이타 보존의 역할에서 완벽한 메인 플레이어 제어 클래스로 + * 탈바꿈 함. + */ + +class CPythonPlayer : public CSingleton, public IAbstractPlayer +{ + public: + enum + { + CATEGORY_NONE = 0, + CATEGORY_ACTIVE = 1, + CATEGORY_PASSIVE = 2, + CATEGORY_MAX_NUM = 3, + + STATUS_INDEX_ST = 1, + STATUS_INDEX_DX = 2, + STATUS_INDEX_IQ = 3, + STATUS_INDEX_HT = 4, + }; + + enum + { + MBT_LEFT, + MBT_RIGHT, + MBT_MIDDLE, + MBT_NUM, + }; + + enum + { + MBF_SMART, + MBF_MOVE, + MBF_CAMERA, + MBF_ATTACK, + MBF_SKILL, + MBF_AUTO, + }; + + enum + { + MBS_CLICK, + MBS_PRESS, + }; + + enum EMode + { + MODE_NONE, + MODE_CLICK_POSITION, + MODE_CLICK_ITEM, + MODE_CLICK_ACTOR, + MODE_USE_SKILL, + }; + + enum EEffect + { + EFFECT_PICK, + EFFECT_NUM, + }; + + enum EMetinSocketType + { + METIN_SOCKET_TYPE_NONE, + METIN_SOCKET_TYPE_SILVER, + METIN_SOCKET_TYPE_GOLD, + }; + + typedef struct SSkillInstance + { + DWORD dwIndex; + int iType; + int iGrade; + int iLevel; + float fcurEfficientPercentage; + float fnextEfficientPercentage; + BOOL isCoolTime; + + float fCoolTime; // NOTE : 쿨타임 중인 스킬 슬롯을 + float fLastUsedTime; // 퀵창에 등록할 때 사용하는 변수 + BOOL bActive; + } TSkillInstance; + + enum EKeyBoard_UD + { + KEYBOARD_UD_NONE, + KEYBOARD_UD_UP, + KEYBOARD_UD_DOWN, + }; + + enum EKeyBoard_LR + { + KEYBOARD_LR_NONE, + KEYBOARD_LR_LEFT, + KEYBOARD_LR_RIGHT, + }; + + enum + { + DIR_UP, + DIR_DOWN, + DIR_LEFT, + DIR_RIGHT, + }; + + typedef struct SPlayerStatus + { + TItemData aItem[c_Inventory_Count]; + TItemData aDSItem[c_DragonSoul_Inventory_Count]; + TQuickSlot aQuickSlot[QUICKSLOT_MAX_NUM]; + TSkillInstance aSkill[SKILL_MAX_NUM]; + long m_alPoint[POINT_MAX_NUM]; + long lQuickPageIndex; + + void SetPoint(UINT ePoint, long lPoint); + long GetPoint(UINT ePoint); + } TPlayerStatus; + + typedef struct SPartyMemberInfo + { + SPartyMemberInfo(DWORD _dwPID, const char * c_szName) : dwPID(_dwPID), strName(c_szName), dwVID(0) {} + + DWORD dwVID; + DWORD dwPID; + std::string strName; + BYTE byState; + BYTE byHPPercentage; + short sAffects[PARTY_AFFECT_SLOT_MAX_NUM]; + } TPartyMemberInfo; + + enum EPartyRole + { + PARTY_ROLE_NORMAL, + PARTY_ROLE_LEADER, + PARTY_ROLE_ATTACKER, + PARTY_ROLE_TANKER, + PARTY_ROLE_BUFFER, + PARTY_ROLE_SKILL_MASTER, + PARTY_ROLE_BERSERKER, + PARTY_ROLE_DEFENDER, + PARTY_ROLE_MAX_NUM, + }; + + enum + { + SKILL_NORMAL, + SKILL_MASTER, + SKILL_GRAND_MASTER, + SKILL_PERFECT_MASTER, + }; + + // 자동물약 상태 관련 특화 구조체.. 이런식의 특화 처리 작업을 안 하려고 최대한 노력했지만 실패하고 결국 특화처리. + struct SAutoPotionInfo + { + SAutoPotionInfo() : bActivated(false), totalAmount(0), currentAmount(0) {} + + bool bActivated; // 활성화 되었는가? + long currentAmount; // 현재 남은 양 + long totalAmount; // 전체 양 + long inventorySlotIndex; // 사용중인 아이템의 인벤토리상 슬롯 인덱스 + }; + + enum EAutoPotionType + { + AUTO_POTION_TYPE_HP = 0, + AUTO_POTION_TYPE_SP = 1, + AUTO_POTION_TYPE_NUM + }; + + public: + CPythonPlayer(void); + virtual ~CPythonPlayer(void); + + void PickCloseMoney(); + void PickCloseItem(); + + void SetGameWindow(PyObject * ppyObject); + + void SetObserverMode(bool isEnable); + bool IsObserverMode(); + + void SetQuickCameraMode(bool isEnable); + + void SetAttackKeyState(bool isPress); + + void NEW_GetMainActorPosition(TPixelPosition* pkPPosActor); + + bool RegisterEffect(DWORD dwEID, const char* c_szEftFileName, bool isCache); + + bool NEW_SetMouseState(int eMBType, int eMBState); + bool NEW_SetMouseFunc(int eMBType, int eMBFunc); + int NEW_GetMouseFunc(int eMBT); + void NEW_SetMouseMiddleButtonState(int eMBState); + + void NEW_SetAutoCameraRotationSpeed(float fRotSpd); + void NEW_ResetCameraRotation(); + + void NEW_SetSingleDirKeyState(int eDirKey, bool isPress); + void NEW_SetSingleDIKKeyState(int eDIKKey, bool isPress); + void NEW_SetMultiDirKeyState(bool isLeft, bool isRight, bool isUp, bool isDown); + + void NEW_Attack(); + void NEW_Fishing(); + bool NEW_CancelFishing(); + + void NEW_LookAtFocusActor(); + bool NEW_IsAttackableDistanceFocusActor(); + + + bool NEW_MoveToDestPixelPositionDirection(const TPixelPosition& c_rkPPosDst); + bool NEW_MoveToMousePickedDirection(); + bool NEW_MoveToMouseScreenDirection(); + bool NEW_MoveToDirection(float fDirRot); + void NEW_Stop(); + + + // Reserved + bool NEW_IsEmptyReservedDelayTime(float fElapsedtime); // 네이밍 교정 논의 필요 - [levites] + + + // Dungeon + void SetDungeonDestinationPosition(int ix, int iy); + void AlarmHaveToGo(); + + + CInstanceBase* NEW_FindActorPtr(DWORD dwVID); + CInstanceBase* NEW_GetMainActorPtr(); + + // flying target set + void Clear(); + void ClearSkillDict(); // 없어지거나 ClearGame 쪽으로 포함될 함수 + void NEW_ClearSkillData(bool bAll = false); + + void Update(); + + + // Play Time + DWORD GetPlayTime(); + void SetPlayTime(DWORD dwPlayTime); + + + // System + void SetMainCharacterIndex(int iIndex); + + DWORD GetMainCharacterIndex(); + bool IsMainCharacterIndex(DWORD dwIndex); + DWORD GetGuildID(); + void NotifyDeletingCharacterInstance(DWORD dwVID); + void NotifyCharacterDead(DWORD dwVID); + void NotifyCharacterUpdate(DWORD dwVID); + void NotifyDeadMainCharacter(); + void NotifyChangePKMode(); + + + // Player Status + const char * GetName(); + void SetName(const char *name); + + void SetRace(DWORD dwRace); + DWORD GetRace(); + + void SetWeaponPower(DWORD dwMinPower, DWORD dwMaxPower, DWORD dwMinMagicPower, DWORD dwMaxMagicPower, DWORD dwAddPower); + void SetStatus(DWORD dwType, long lValue); + int GetStatus(DWORD dwType); + + + // Item + void MoveItemData(TItemPos SrcCell, TItemPos DstCell); + void SetItemData(TItemPos Cell, const TItemData & c_rkItemInst); + const TItemData * GetItemData(TItemPos Cell) const; + void SetItemCount(TItemPos Cell, BYTE byCount); + void SetItemMetinSocket(TItemPos Cell, DWORD dwMetinSocketIndex, DWORD dwMetinNumber); + void SetItemAttribute(TItemPos Cell, DWORD dwAttrIndex, BYTE byType, short sValue); + DWORD GetItemIndex(TItemPos Cell); + DWORD GetItemFlags(TItemPos Cell); + DWORD GetItemCount(TItemPos Cell); + DWORD GetItemCountByVnum(DWORD dwVnum); + DWORD GetItemMetinSocket(TItemPos Cell, DWORD dwMetinSocketIndex); + void GetItemAttribute(TItemPos Cell, DWORD dwAttrSlotIndex, BYTE * pbyType, short * psValue); + void SendClickItemPacket(DWORD dwIID); + + void RequestAddLocalQuickSlot(DWORD dwLocalSlotIndex, DWORD dwWndType, DWORD dwWndItemPos); + void RequestAddToEmptyLocalQuickSlot(DWORD dwWndType, DWORD dwWndItemPos); + void RequestMoveGlobalQuickSlotToLocalQuickSlot(DWORD dwGlobalSrcSlotIndex, DWORD dwLocalDstSlotIndex); + void RequestDeleteGlobalQuickSlot(DWORD dwGlobalSlotIndex); + void RequestUseLocalQuickSlot(DWORD dwLocalSlotIndex); + DWORD LocalQuickSlotIndexToGlobalQuickSlotIndex(DWORD dwLocalSlotIndex); + + void GetGlobalQuickSlotData(DWORD dwGlobalSlotIndex, DWORD* pdwWndType, DWORD* pdwWndItemPos); + void GetLocalQuickSlotData(DWORD dwSlotPos, DWORD* pdwWndType, DWORD* pdwWndItemPos); + void RemoveQuickSlotByValue(int iType, int iPosition); + + char IsItem(TItemPos SlotIndex); + +#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM + bool IsBeltInventorySlot(TItemPos Cell); +#endif + bool IsInventorySlot(TItemPos SlotIndex); + bool IsEquipmentSlot(TItemPos SlotIndex); + + bool IsEquipItemInSlot(TItemPos iSlotIndex); + + + // Quickslot + int GetQuickPage(); + void SetQuickPage(int nPageIndex); + void AddQuickSlot(int QuickslotIndex, char IconType, char IconPosition); + void DeleteQuickSlot(int QuickslotIndex); + void MoveQuickSlot(int Source, int Target); + + + // Skill + void SetSkill(DWORD dwSlotIndex, DWORD dwSkillIndex); + bool GetSkillSlotIndex(DWORD dwSkillIndex, DWORD* pdwSlotIndex); + int GetSkillIndex(DWORD dwSlotIndex); + int GetSkillGrade(DWORD dwSlotIndex); + int GetSkillLevel(DWORD dwSlotIndex); + float GetSkillCurrentEfficientPercentage(DWORD dwSlotIndex); + float GetSkillNextEfficientPercentage(DWORD dwSlotIndex); + void SetSkillLevel(DWORD dwSlotIndex, DWORD dwSkillLevel); + void SetSkillLevel_(DWORD dwSkillIndex, DWORD dwSkillGrade, DWORD dwSkillLevel); + BOOL IsToggleSkill(DWORD dwSlotIndex); + void ClickSkillSlot(DWORD dwSlotIndex); + void ChangeCurrentSkillNumberOnly(DWORD dwSlotIndex); + bool FindSkillSlotIndexBySkillIndex(DWORD dwSkillIndex, DWORD * pdwSkillSlotIndex); + + void SetSkillCoolTime(DWORD dwSkillIndex); + void EndSkillCoolTime(DWORD dwSkillIndex); + + float GetSkillCoolTime(DWORD dwSlotIndex); + float GetSkillElapsedCoolTime(DWORD dwSlotIndex); + BOOL IsSkillActive(DWORD dwSlotIndex); + BOOL IsSkillCoolTime(DWORD dwSlotIndex); + void UseGuildSkill(DWORD dwSkillSlotIndex); + bool AffectIndexToSkillSlotIndex(UINT uAffect, DWORD* pdwSkillSlotIndex); + bool AffectIndexToSkillIndex(DWORD dwAffectIndex, DWORD * pdwSkillIndex); + + void SetAffect(UINT uAffect); + void ResetAffect(UINT uAffect); + void ClearAffects(); + + + // Target + void SetTarget(DWORD dwVID, BOOL bForceChange = TRUE); + void OpenCharacterMenu(DWORD dwVictimActorID); + DWORD GetTargetVID(); + + + // Party + void ExitParty(); + void AppendPartyMember(DWORD dwPID, const char * c_szName); + void LinkPartyMember(DWORD dwPID, DWORD dwVID); + void UnlinkPartyMember(DWORD dwPID); + void UpdatePartyMemberInfo(DWORD dwPID, BYTE byState, BYTE byHPPercentage); + void UpdatePartyMemberAffect(DWORD dwPID, BYTE byAffectSlotIndex, short sAffectNumber); + void RemovePartyMember(DWORD dwPID); + bool IsPartyMemberByVID(DWORD dwVID); + bool IsPartyMemberByName(const char * c_szName); + bool GetPartyMemberPtr(DWORD dwPID, TPartyMemberInfo ** ppPartyMemberInfo); + bool PartyMemberPIDToVID(DWORD dwPID, DWORD * pdwVID); + bool PartyMemberVIDToPID(DWORD dwVID, DWORD * pdwPID); + bool IsSamePartyMember(DWORD dwVID1, DWORD dwVID2); + + + // Fight + void RememberChallengeInstance(DWORD dwVID); + void RememberRevengeInstance(DWORD dwVID); + void RememberCantFightInstance(DWORD dwVID); + void ForgetInstance(DWORD dwVID); + bool IsChallengeInstance(DWORD dwVID); + bool IsRevengeInstance(DWORD dwVID); + bool IsCantFightInstance(DWORD dwVID); + + + // Private Shop + void OpenPrivateShop(); + void ClosePrivateShop(); + bool IsOpenPrivateShop(); + + + + // Stamina + void StartStaminaConsume(DWORD dwConsumePerSec, DWORD dwCurrentStamina); + void StopStaminaConsume(DWORD dwCurrentStamina); + + + // PK Mode + DWORD GetPKMode(); + + + // Mobile + void SetMobileFlag(BOOL bFlag); + BOOL HasMobilePhoneNumber(); + + + // Combo + void SetComboSkillFlag(BOOL bFlag); + + + // System + void SetMovableGroundDistance(float fDistance); + + + // Emotion + void ActEmotion(DWORD dwEmotionID); + void StartEmotionProcess(); + void EndEmotionProcess(); + + + // Function Only For Console System + BOOL __ToggleCoolTime(); + BOOL __ToggleLevelLimit(); + + __inline const SAutoPotionInfo& GetAutoPotionInfo(int type) const { return m_kAutoPotionInfo[type]; } + __inline SAutoPotionInfo& GetAutoPotionInfo(int type) { return m_kAutoPotionInfo[type]; } + __inline void SetAutoPotionInfo(int type, const SAutoPotionInfo& info) { m_kAutoPotionInfo[type] = info; } + + protected: + TQuickSlot & __RefLocalQuickSlot(int SlotIndex); + TQuickSlot & __RefGlobalQuickSlot(int SlotIndex); + + + DWORD __GetLevelAtk(); + DWORD __GetStatAtk(); + DWORD __GetWeaponAtk(DWORD dwWeaponPower); + DWORD __GetTotalAtk(DWORD dwWeaponPower, DWORD dwRefineBonus); + DWORD __GetRaceStat(); + DWORD __GetHitRate(); + DWORD __GetEvadeRate(); + + void __UpdateBattleStatus(); + + void __DeactivateSkillSlot(DWORD dwSlotIndex); + void __ActivateSkillSlot(DWORD dwSlotIndex); + + void __OnPressSmart(CInstanceBase& rkInstMain, bool isAuto); + void __OnClickSmart(CInstanceBase& rkInstMain, bool isAuto); + + void __OnPressItem(CInstanceBase& rkInstMain, DWORD dwPickedItemID); + void __OnPressActor(CInstanceBase& rkInstMain, DWORD dwPickedActorID, bool isAuto); + void __OnPressGround(CInstanceBase& rkInstMain, const TPixelPosition& c_rkPPosPickedGround); + void __OnPressScreen(CInstanceBase& rkInstMain); + + void __OnClickActor(CInstanceBase& rkInstMain, DWORD dwPickedActorID, bool isAuto); + void __OnClickItem(CInstanceBase& rkInstMain, DWORD dwPickedItemID); + void __OnClickGround(CInstanceBase& rkInstMain, const TPixelPosition& c_rkPPosPickedGround); + + bool __IsMovableGroundDistance(CInstanceBase& rkInstMain, const TPixelPosition& c_rkPPosPickedGround); + + bool __GetPickedActorPtr(CInstanceBase** pkInstPicked); + + bool __GetPickedActorID(DWORD* pdwActorID); + bool __GetPickedItemID(DWORD* pdwItemID); + bool __GetPickedGroundPos(TPixelPosition* pkPPosPicked); + + void __ClearReservedAction(); + void __ReserveClickItem(DWORD dwItemID); + void __ReserveClickActor(DWORD dwActorID); + void __ReserveClickGround(const TPixelPosition& c_rkPPosPickedGround); + void __ReserveUseSkill(DWORD dwActorID, DWORD dwSkillSlotIndex, DWORD dwRange); + + void __ReserveProcess_ClickActor(); + + void __ShowPickedEffect(const TPixelPosition& c_rkPPosPickedGround); + void __SendClickActorPacket(CInstanceBase& rkInstVictim); + + void __ClearAutoAttackTargetActorID(); + void __SetAutoAttackTargetActorID(DWORD dwActorID); + + void NEW_ShowEffect(int dwEID, TPixelPosition kPPosDst); + + void NEW_SetMouseSmartState(int eMBS, bool isAuto); + void NEW_SetMouseMoveState(int eMBS); + void NEW_SetMouseCameraState(int eMBS); + void NEW_GetMouseDirRotation(float fScrX, float fScrY, float* pfDirRot); + void NEW_GetMultiKeyDirRotation(bool isLeft, bool isRight, bool isUp, bool isDown, float* pfDirRot); + + float GetDegreeFromDirection(int iUD, int iLR); + float GetDegreeFromPosition(int ix, int iy, int iHalfWidth, int iHalfHeight); + + bool CheckCategory(int iCategory); + bool CheckAbilitySlot(int iSlotIndex); + + void RefreshKeyWalkingDirection(); + void NEW_RefreshMouseWalkingDirection(); + + + // Instances + void RefreshInstances(); + + bool __CanShot(CInstanceBase& rkInstMain, CInstanceBase& rkInstTarget); + bool __CanUseSkill(); + + bool __CanMove(); + + bool __CanAttack(); + bool __CanChangeTarget(); + + bool __CheckSkillUsable(DWORD dwSlotIndex); + void __UseCurrentSkill(); + void __UseChargeSkill(DWORD dwSkillSlotIndex); + bool __UseSkill(DWORD dwSlotIndex); + bool __CheckSpecialSkill(DWORD dwSkillIndex); + + bool __CheckRestSkillCoolTime(DWORD dwSkillSlotIndex); + bool __CheckShortLife(TSkillInstance & rkSkillInst, CPythonSkill::TSkillData& rkSkillData); + bool __CheckShortMana(TSkillInstance & rkSkillInst, CPythonSkill::TSkillData& rkSkillData); + bool __CheckShortArrow(TSkillInstance & rkSkillInst, CPythonSkill::TSkillData& rkSkillData); + bool __CheckDashAffect(CInstanceBase& rkInstMain); + + void __SendUseSkill(DWORD dwSkillSlotIndex, DWORD dwTargetVID); + void __RunCoolTime(DWORD dwSkillSlotIndex); + + BYTE __GetSkillType(DWORD dwSkillSlotIndex); + + bool __IsReservedUseSkill(DWORD dwSkillSlotIndex); + bool __IsMeleeSkill(CPythonSkill::TSkillData& rkSkillData); + bool __IsChargeSkill(CPythonSkill::TSkillData& rkSkillData); + DWORD __GetSkillTargetRange(CPythonSkill::TSkillData& rkSkillData); + bool __SearchNearTarget(); + bool __IsUsingChargeSkill(); + + bool __ProcessEnemySkillTargetRange(CInstanceBase& rkInstMain, CInstanceBase& rkInstTarget, CPythonSkill::TSkillData& rkSkillData, DWORD dwSkillSlotIndex); + + + // Item + bool __HasEnoughArrow(); + bool __HasItem(DWORD dwItemID); + DWORD __GetPickableDistance(); + + + // Target + CInstanceBase* __GetTargetActorPtr(); + void __ClearTarget(); + DWORD __GetTargetVID(); + void __SetTargetVID(DWORD dwVID); + bool __IsSameTargetVID(DWORD dwVID); + bool __IsTarget(); + bool __ChangeTargetToPickedInstance(); + + CInstanceBase * __GetSkillTargetInstancePtr(CPythonSkill::TSkillData& rkSkillData); + CInstanceBase * __GetAliveTargetInstancePtr(); + CInstanceBase * __GetDeadTargetInstancePtr(); + + BOOL __IsRightButtonSkillMode(); + + + // Update + void __Update_AutoAttack(); + void __Update_NotifyGuildAreaEvent(); + + + + // Emotion + BOOL __IsProcessingEmotion(); + + + protected: + PyObject * m_ppyGameWindow; + + // Client Player Data + std::map m_skillSlotDict; + std::string m_stName; + DWORD m_dwMainCharacterIndex; + DWORD m_dwRace; + DWORD m_dwWeaponMinPower; + DWORD m_dwWeaponMaxPower; + DWORD m_dwWeaponMinMagicPower; + DWORD m_dwWeaponMaxMagicPower; + DWORD m_dwWeaponAddPower; + + // Todo + DWORD m_dwSendingTargetVID; + float m_fTargetUpdateTime; + + // Attack + DWORD m_dwAutoAttackTargetVID; + + // NEW_Move + EMode m_eReservedMode; + float m_fReservedDelayTime; + + float m_fMovDirRot; + + bool m_isUp; + bool m_isDown; + bool m_isLeft; + bool m_isRight; + bool m_isAtkKey; + bool m_isDirKey; + bool m_isCmrRot; + bool m_isSmtMov; + bool m_isDirMov; + + float m_fCmrRotSpd; + + TPlayerStatus m_playerStatus; + + UINT m_iComboOld; + DWORD m_dwVIDReserved; + DWORD m_dwIIDReserved; + + DWORD m_dwcurSkillSlotIndex; + DWORD m_dwSkillSlotIndexReserved; + DWORD m_dwSkillRangeReserved; + + TPixelPosition m_kPPosInstPrev; + TPixelPosition m_kPPosReserved; + + // Emotion + BOOL m_bisProcessingEmotion; + + // Dungeon + BOOL m_isDestPosition; + int m_ixDestPos; + int m_iyDestPos; + int m_iLastAlarmTime; + + // Party + std::map m_PartyMemberMap; + + // PVP + std::set m_ChallengeInstanceSet; + std::set m_RevengeInstanceSet; + std::set m_CantFightInstanceSet; + + // Private Shop + bool m_isOpenPrivateShop; + bool m_isObserverMode; + + // Stamina + BOOL m_isConsumingStamina; + float m_fCurrentStamina; + float m_fConsumeStaminaPerSec; + + // Guild + DWORD m_inGuildAreaID; + + // Mobile + BOOL m_bMobileFlag; + + // System + BOOL m_sysIsCoolTime; + BOOL m_sysIsLevelLimit; + + protected: + // Game Cursor Data + TPixelPosition m_MovingCursorPosition; + float m_fMovingCursorSettingTime; + DWORD m_adwEffect[EFFECT_NUM]; + + DWORD m_dwVIDPicked; + DWORD m_dwIIDPicked; + int m_aeMBFButton[MBT_NUM]; + + DWORD m_dwTargetVID; + DWORD m_dwTargetEndTime; + DWORD m_dwPlayTime; + + SAutoPotionInfo m_kAutoPotionInfo[AUTO_POTION_TYPE_NUM]; + + protected: + float MOVABLE_GROUND_DISTANCE; + + private: + std::map m_kMap_dwAffectIndexToSkillIndex; +}; + +extern const int c_iFastestSendingCount; +extern const int c_iSlowestSendingCount; +extern const float c_fFastestSendingDelay; +extern const float c_fSlowestSendingDelay; +extern const float c_fRotatingStepTime; + +extern const float c_fComboDistance; +extern const float c_fPickupDistance; +extern const float c_fClickDistance; diff --git a/extension/src/port/UserInterface/PythonQuest.h b/extension/src/port/UserInterface/PythonQuest.h new file mode 100644 index 00000000..bef0dc03 --- /dev/null +++ b/extension/src/port/UserInterface/PythonQuest.h @@ -0,0 +1,59 @@ +#pragma once + +class CPythonQuest : public CSingleton +{ + public: + struct SQuestInstance + { + SQuestInstance() + { + dwIndex = 0; + iClockValue = 0; + iCounterValue = 0; + iStartTime = 0; + } + + DWORD dwIndex; + + std::string strIconFileName; + std::string strTitle; + + std::string strClockName; + std::string strCounterName; + + int iClockValue; + int iCounterValue; + + int iStartTime; + }; + typedef std::vector TQuestInstanceContainer; + + public: + CPythonQuest(); + virtual ~CPythonQuest(); + + void Clear(); + + void RegisterQuestInstance(const SQuestInstance & c_rQuestInstance); + void DeleteQuestInstance(DWORD dwIndex); + + bool IsQuest(DWORD dwIndex); + void MakeQuest(DWORD dwIndex); + + void SetQuestTitle(DWORD dwIndex, const char * c_szTitle); + void SetQuestClockName(DWORD dwIndex, const char * c_szClockName); + void SetQuestCounterName(DWORD dwIndex, const char * c_szCounterName); + void SetQuestClockValue(DWORD dwIndex, int iClockValue); + void SetQuestCounterValue(DWORD dwIndex, int iCounterValue); + void SetQuestIconFileName(DWORD dwIndex, const char * c_szIconFileName); + + int GetQuestCount(); + bool GetQuestInstancePtr(DWORD dwArrayIndex, SQuestInstance ** ppQuestInstance); + + protected: + void __Initialize(); + bool __GetQuestInstancePtr(DWORD dwQuestIndex, SQuestInstance ** ppQuestInstance); + + protected: + TQuestInstanceContainer m_QuestInstanceContainer; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/PythonSafeBox.h b/extension/src/port/UserInterface/PythonSafeBox.h new file mode 100644 index 00000000..4f062621 --- /dev/null +++ b/extension/src/port/UserInterface/PythonSafeBox.h @@ -0,0 +1,42 @@ +#pragma once + +class CPythonSafeBox : public CSingleton +{ + public: + enum + { + SAFEBOX_SLOT_X_COUNT = 5, + SAFEBOX_SLOT_Y_COUNT = 9, + SAFEBOX_PAGE_SIZE = SAFEBOX_SLOT_X_COUNT * SAFEBOX_SLOT_Y_COUNT, + }; + typedef std::vector TItemInstanceVector; + + public: + CPythonSafeBox(); + virtual ~CPythonSafeBox(); + + void OpenSafeBox(int iSize); + void SetItemData(DWORD dwSlotIndex, const TItemData & rItemData); + void DelItemData(DWORD dwSlotIndex); + + void SetMoney(DWORD dwMoney); + DWORD GetMoney(); + + BOOL GetSlotItemID(DWORD dwSlotIndex, DWORD* pdwItemID); + + int GetCurrentSafeBoxSize(); + BOOL GetItemDataPtr(DWORD dwSlotIndex, TItemData ** ppInstance); + + // MALL + void OpenMall(int iSize); + void SetMallItemData(DWORD dwSlotIndex, const TItemData & rItemData); + void DelMallItemData(DWORD dwSlotIndex); + BOOL GetMallItemDataPtr(DWORD dwSlotIndex, TItemData ** ppInstance); + BOOL GetSlotMallItemID(DWORD dwSlotIndex, DWORD * pdwItemID); + DWORD GetMallSize(); + + protected: + TItemInstanceVector m_ItemInstanceVector; + TItemInstanceVector m_MallItemInstanceVector; + DWORD m_dwMoney; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/PythonShop.h b/extension/src/port/UserInterface/PythonShop.h new file mode 100644 index 00000000..d285acbc --- /dev/null +++ b/extension/src/port/UserInterface/PythonShop.h @@ -0,0 +1,82 @@ +#pragma once + +#include "Packet.h" + +/* + * 상점 처리 + * + * 2003-01-16 anoa 일차 완료 + * 2003-12-26 levites 수정 + * + * 2012-10-29 rtsummit 새로운 화폐 출현 및 tab 기능 추가로 인한 shop 확장. + * + */ +typedef enum +{ + SHOP_COIN_TYPE_GOLD, // DEFAULT VALUE + SHOP_COIN_TYPE_SECONDARY_COIN, +} EShopCoinType; + +class CPythonShop : public CSingleton +{ + public: + CPythonShop(void); + virtual ~CPythonShop(void); + + void Clear(); + + void SetItemData(DWORD dwIndex, const TShopItemData & c_rShopItemData); + BOOL GetItemData(DWORD dwIndex, const TShopItemData ** c_ppItemData); + + void SetItemData(BYTE tabIdx, DWORD dwSlotPos, const TShopItemData & c_rShopItemData); + BOOL GetItemData(BYTE tabIdx, DWORD dwSlotPos, const TShopItemData ** c_ppItemData); + + void SetTabCount(BYTE bTabCount) { m_bTabCount = bTabCount; } + BYTE GetTabCount() { return m_bTabCount; } + + void SetTabCoinType(BYTE tabIdx, BYTE coinType); + BYTE GetTabCoinType(BYTE tabIdx); + + void SetTabName(BYTE tabIdx, const char* name); + const char* GetTabName(BYTE tabIdx); + + + //BOOL GetSlotItemID(DWORD dwSlotPos, DWORD* pdwItemID); + + void Open(BOOL isPrivateShop, BOOL isMainPrivateShop); + void Close(); + BOOL IsOpen(); + BOOL IsPrivateShop(); + BOOL IsMainPlayerPrivateShop(); + + void ClearPrivateShopStock(); + void AddPrivateShopItemStock(TItemPos ItemPos, BYTE byDisplayPos, DWORD dwPrice); + void DelPrivateShopItemStock(TItemPos ItemPos); + int GetPrivateShopItemPrice(TItemPos ItemPos); + void BuildPrivateShop(const char * c_szName); + + protected: + BOOL CheckSlotIndex(DWORD dwIndex); + + protected: + BOOL m_isShoping; + BOOL m_isPrivateShop; + BOOL m_isMainPlayerPrivateShop; + + struct ShopTab + { + ShopTab() + { + coinType = SHOP_COIN_TYPE_GOLD; + } + BYTE coinType; + std::string name; + TShopItemData items[SHOP_HOST_ITEM_MAX_NUM]; + }; + + BYTE m_bTabCount; + ShopTab m_aShoptabs[SHOP_TAB_COUNT_MAX]; + + typedef std::map TPrivateShopItemStock; + TPrivateShopItemStock m_PrivateShopItemStock; +}; diff --git a/extension/src/port/UserInterface/PythonSkill.h b/extension/src/port/UserInterface/PythonSkill.h new file mode 100644 index 00000000..d58a72c9 --- /dev/null +++ b/extension/src/port/UserInterface/PythonSkill.h @@ -0,0 +1,299 @@ +#pragma once + +#include "../GameLib/ItemData.h" +#include "../EterBase/Poly/Poly.h" + +class CInstanceBase; + +class CPythonSkill : public CSingleton +{ + public: + enum + { + SKILL_TYPE_NONE, + SKILL_TYPE_ACTIVE, + SKILL_TYPE_SUPPORT, + SKILL_TYPE_GUILD, + SKILL_TYPE_HORSE, + SKILL_TYPE_MAX_NUM, + }; + + enum ESkillTableTokenType + { + TABLE_TOKEN_TYPE_VNUM, + TABLE_TOKEN_TYPE_NAME, + TABLE_TOKEN_TYPE_TYPE, + TABLE_TOKEN_TYPE_LEVEL_STEP, + TABLE_TOKEN_TYPE_MAX_LEVEL, + TABLE_TOKEN_TYPE_LEVEL_LIMIT, + TABLE_TOKEN_TYPE_POINT_ON, + TABLE_TOKEN_TYPE_POINT_POLY, + TABLE_TOKEN_TYPE_SP_COST_POLY, + TABLE_TOKEN_TYPE_DURATION_POLY, + TABLE_TOKEN_TYPE_DURATION_SP_COST_POLY, + TABLE_TOKEN_TYPE_COOLDOWN_POLY, + TABLE_TOKEN_TYPE_MASTER_BONUS_POLY, + TABLE_TOKEN_TYPE_ATTACK_GRADE_POLY, + TABLE_TOKEN_TYPE_FLAG, + TABLE_TOKEN_TYPE_AFFECT_FLAG, + TABLE_TOKEN_TYPE_POINT_ON2, + TABLE_TOKEN_TYPE_POINT_POLY2, + TABLE_TOKEN_TYPE_DURATION_POLY2, + TABLE_TOKEN_TYPE_AFFECT_FLAG2, + TABLE_TOKEN_TYPE_PREREQUISITE_SKILL_VNUM, + TABLE_TOKEN_TYPE_PREREQUISITE_SKILL_LEVEL, + TABLE_TOKEN_TYPE_SKILL_TYPE, + TABLE_TOKEN_TYPE_MAX_HIT, + TABLE_TOKEN_TYPE_SPLASH_AROUND_DAMAGE_ADJUST_POLY, + TABLE_TOKEN_TYPE_TARGET_RANGE, + TABLE_TOKEN_TYPE_SPLASH_RANGE, + TABLE_TOKEN_TYPE_MAX_NUM, + }; + + enum ESkillDescTokenType + { + DESC_TOKEN_TYPE_VNUM, + DESC_TOKEN_TYPE_JOB, + DESC_TOKEN_TYPE_NAME1, + DESC_TOKEN_TYPE_NAME2, + DESC_TOKEN_TYPE_NAME3, + DESC_TOKEN_TYPE_DESCRIPTION, + DESC_TOKEN_TYPE_CONDITION1, + DESC_TOKEN_TYPE_CONDITION2, + DESC_TOKEN_TYPE_CONDITION3, + DESC_TOKEN_TYPE_CONDITION4, + DESC_TOKEN_TYPE_ATTRIBUTE, + DESC_TOKEN_TYPE_WEAPON, + DESC_TOKEN_TYPE_ICON_NAME, + DESC_TOKEN_TYPE_MOTION_INDEX, + DESC_TOKEN_TYPE_MOTION_INDEX_GRADE_NUM, + DESC_TOKEN_TYPE_TARGET_COUNT_FORMULA, + DESC_TOKEN_TYPE_MOTION_LOOP_COUNT_FORMULA, + DESC_TOKEN_TYPE_AFFECT_DESCRIPTION_1, + DESC_TOKEN_TYPE_AFFECT_MIN_1, + DESC_TOKEN_TYPE_AFFECT_MAX_1, + DESC_TOKEN_TYPE_AFFECT_DESCRIPTION_2, + DESC_TOKEN_TYPE_AFFECT_MIN_2, + DESC_TOKEN_TYPE_AFFECT_MAX_2, + DESC_TOKEN_TYPE_AFFECT_DESCRIPTION_3, + DESC_TOKEN_TYPE_AFFECT_MIN_3, + DESC_TOKEN_TYPE_AFFECT_MAX_3, + DESC_TOKEN_TYPE_LEVEL_LIMIT, + DESC_TOKEN_TYPE_MAX_LEVEL, + DESC_TOKEN_TYPE_MAX_NUM, + + CONDITION_COLUMN_COUNT = 3, + AFFECT_COLUMN_COUNT = 3, + AFFECT_STEP_COUNT = 3, + }; + + enum + { + SKILL_ATTRIBUTE_NEED_TARGET = (1 << 0), + SKILL_ATTRIBUTE_TOGGLE = (1 << 1), + SKILL_ATTRIBUTE_WEAPON_LIMITATION = (1 << 2), + SKILL_ATTRIBUTE_MELEE_ATTACK = (1 << 3), + SKILL_ATTRIBUTE_USE_HP = (1 << 4), + SKILL_ATTRIBUTE_CAN_CHANGE_DIRECTION = (1 << 5), + SKILL_ATTRIBUTE_STANDING_SKILL = (1 << 6), + SKILL_ATTRIBUTE_ONLY_FOR_ALLIANCE = (1 << 7), + SKILL_ATTRIBUTE_CAN_USE_FOR_ME = (1 << 8), + SKILL_ATTRIBUTE_NEED_CORPSE = (1 << 9), + SKILL_ATTRIBUTE_FAN_RANGE = (1 << 10), + SKILL_ATTRIBUTE_CAN_USE_IF_NOT_ENOUGH = (1 << 11), + SKILL_ATTRIBUTE_NEED_EMPTY_BOTTLE = (1 << 12), + SKILL_ATTRIBUTE_NEED_POISON_BOTTLE = (1 << 13), + SKILL_ATTRIBUTE_ATTACK_SKILL = (1 << 14), + SKILL_ATTRIBUTE_TIME_INCREASE_SKILL = (1 << 15), // 증지술 전용 attribute + SKILL_ATTRIBUTE_CHARGE_ATTACK = (1 << 16), + SKILL_ATTRIBUTE_PASSIVE = (1 << 17), + SKILL_ATTRIBUTE_CANNOT_LEVEL_UP = (1 << 18), + SKILL_ATTRIBUTE_ONLY_FOR_GUILD_WAR = (1 << 19), + SKILL_ATTRIBUTE_MOVING_SKILL = (1 << 20), + SKILL_ATTRIBUTE_HORSE_SKILL = (1 << 21), + SKILL_ATTRIBUTE_CIRCLE_RANGE = (1 << 22), + SKILL_ATTRIBUTE_SEARCH_TARGET = (1 << 23), + }; + + enum + { + SKILL_NEED_WEAPON_SWORD = (1 << CItemData::WEAPON_SWORD), + SKILL_NEED_WEAPON_DAGGER = (1 << CItemData::WEAPON_DAGGER), + SKILL_NEED_WEAPON_BOW = (1 << CItemData::WEAPON_BOW), + SKILL_NEED_WEAPON_TWO_HANDED = (1 << CItemData::WEAPON_TWO_HANDED), + SKILL_NEED_WEAPON_DOUBLE_SWORD = (1 << CItemData::WEAPON_DAGGER), + SKILL_NEED_WEAPON_BELL = (1 << CItemData::WEAPON_BELL), + SKILL_NEED_WEAPON_FAN = (1 << CItemData::WEAPON_FAN), + SKILL_NEED_WEAPON_ARROW = (1 << CItemData::WEAPON_ARROW), + SKILL_NEED_WEAPON_EMPTY_HAND = (1 << CItemData::WEAPON_NONE), + }; + + enum + { + VALUE_TYPE_FREE, + VALUE_TYPE_MIN, + VALUE_TYPE_MAX, + }; + + enum + { + SKILL_GRADE_COUNT = 3, + SKILL_EFFECT_COUNT = 4, //스킬은 초,중,고급 이외에 마스터일때 이펙트 추가. + SKILL_GRADE_STEP_COUNT = 20, + SKILL_GRADEGAP = 25, + }; + + typedef struct SAffectData + { + std::string strAffectDescription; + std::string strAffectMinFormula; + std::string strAffectMaxFormula; + } TAffectData; + typedef struct SAffectDataNew + { + std::string strPointType; + std::string strPointPoly; + } TAffectDataNew; + typedef struct SRequireStatData + { + BYTE byPoint; + BYTE byLevel; + } TRequireStatData; + typedef struct SGradeData + { + std::string strName; + CGraphicImage * pImage; + WORD wMotionIndex; + } TGradeData; + typedef struct SSkillData + { + static DWORD MELEE_SKILL_TARGET_RANGE; + // Functions + SSkillData(); + DWORD GetTargetRange() const; + BOOL CanChangeDirection(); + BOOL IsFanRange(); + BOOL IsCircleRange(); + BOOL IsAutoSearchTarget(); + BOOL IsNeedTarget(); + BOOL IsNeedCorpse(); + BOOL IsToggleSkill(); + BOOL IsUseHPSkill(); + BOOL IsStandingSkill(); + BOOL CanUseWeaponType(DWORD dwWeaponType); + BOOL IsOnlyForAlliance(); + BOOL CanUseForMe(); + BOOL CanUseIfNotEnough(); + BOOL IsNeedEmptyBottle(); + BOOL IsNeedPoisonBottle(); + BOOL IsNeedBow(); + BOOL IsAttackSkill(); + BOOL IsHorseSkill(); + BOOL IsMovingSkill(); + BOOL IsTimeIncreaseSkill(); + BOOL IsMeleeSkill(); + BOOL IsChargeSkill(); + BOOL IsOnlyForGuildWar(); + + bool GetState(const char * c_szStateName, int * piState, int iMinMaxType = VALUE_TYPE_FREE); + float ProcessFormula(CPoly * pPoly, float fSkillLevel = 0.0f, int iMinMaxType = VALUE_TYPE_FREE); + const char * GetAffectDescription(DWORD dwIndex, float fSkillLevel); + DWORD GetSkillCoolTime(float fSkillPoint); + int GetNeedSP(float fSkillPoint); + DWORD GetContinuationSP(float fSkillPoint); + DWORD GetMotionLoopCount(float fSkillPoint); + DWORD GetTargetCount(float fSkillPoint); + DWORD GetDuration(float fSkillPoint); + DWORD GetSkillMotionIndex(int iGrade=-1); + BYTE GetMaxLevel(); + BYTE GetLevelUpPoint(); + bool IsCanUseSkill(); + BOOL IsNoMotion(); + + const std::string GetName() const; + BYTE GetType() const; + + /////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////// + + // Variable + BYTE byType; + DWORD dwSkillIndex; + BYTE byMaxLevel; + BYTE byLevelUpPoint; + BYTE byLevelLimit; + BOOL bNoMotion; + + std::string strName; + std::string strIconFileName; + std::string strDescription; + std::string strMotionScriptFileName; + + std::vector ConditionDataVector; + std::vector AffectDataVector; + std::vector AffectDataNewVector; + std::vector RequireStatDataVector; + std::string strCoolTimeFormula; + std::string strTargetCountFormula; + std::string strMotionLoopCountFormula; + std::string strNeedSPFormula; + std::string strContinuationSPFormula; + std::string strDuration; + + DWORD dwSkillAttribute; + DWORD dwNeedWeapon; + DWORD dwTargetRange; + WORD wMotionIndex; // 없어질 변수 + WORD wMotionIndexForMe; // 없어질 변수 + + BOOL isRequirement; + std::string strRequireSkillName; + BYTE byRequireSkillLevel; + + TGradeData GradeData[SKILL_EFFECT_COUNT]; + + CGraphicImage * pImage; + + ///// + + static std::map ms_StatusNameMap; + static std::map ms_NewMinStatusNameMap; + static std::map ms_NewMaxStatusNameMap; + static DWORD ms_dwTimeIncreaseSkillNumber; + } TSkillData; + + typedef std::map TSkillDataMap; + typedef std::map TSkillMotionIndexMap; + typedef std::map TPathNameMap; + + public: + CPythonSkill(); + virtual ~CPythonSkill(); + + void Destroy(); + bool RegisterSkill(DWORD dwSkillIndex, const char * c_szFileName); + bool RegisterSkillTable(const char * c_szFileName); + bool RegisterSkillDesc(const char * c_szFileName); + BOOL GetSkillData(DWORD dwSkillIndex, TSkillData ** ppSkillData); + bool GetSkillDataByName(const char * c_szName, TSkillData ** ppSkillData); + + void SetPathName(const char * c_szFileName); + const char * GetPathName(); + + void TEST(); + + protected: + void __RegisterGradeIconImage(TSkillData & rData, const char * c_szHeader, const char * c_szImageName); + void __RegisterNormalIconImage(TSkillData & rData, const char * c_szHeader, const char * c_szImageName); + + protected: + TSkillDataMap m_SkillDataMap; + + std::string m_strPathName; + + std::map m_SkillTypeIndexMap; + std::map m_SkillAttributeIndexMap; + std::map m_SkillNeedWeaponIndexMap; + std::map m_SkillWeaponTypeIndexMap; + TPathNameMap m_PathNameMap; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/PythonSystem.h b/extension/src/port/UserInterface/PythonSystem.h new file mode 100644 index 00000000..f70d2b30 --- /dev/null +++ b/extension/src/port/UserInterface/PythonSystem.h @@ -0,0 +1,162 @@ +#pragma once + +class CPythonSystem : public CSingleton +{ + public: + enum EWindow + { + WINDOW_STATUS, + WINDOW_INVENTORY, + WINDOW_ABILITY, + WINDOW_SOCIETY, + WINDOW_JOURNAL, + WINDOW_COMMAND, + + WINDOW_QUICK, + WINDOW_GAUGE, + WINDOW_MINIMAP, + WINDOW_CHAT, + + WINDOW_MAX_NUM, + }; + + enum + { + FREQUENCY_MAX_NUM = 30, + RESOLUTION_MAX_NUM = 100 + }; + + typedef struct SResolution + { + DWORD width; + DWORD height; + DWORD bpp; // bits per pixel (high-color = 16bpp, true-color = 32bpp) + + DWORD frequency[20]; + BYTE frequency_count; + } TResolution; + + typedef struct SWindowStatus + { + int isVisible; + int isMinimized; + + int ixPosition; + int iyPosition; + int iHeight; + } TWindowStatus; + + typedef struct SConfig + { + DWORD width; + DWORD height; + DWORD bpp; + DWORD frequency; + + bool is_software_cursor; + bool is_object_culling; + int iDistance; + int iShadowLevel; + + FLOAT music_volume; + BYTE voice_volume; + + int gamma; + + int isSaveID; + char SaveID[20]; + + bool bWindowed; + bool bDecompressDDS; + bool bNoSoundCard; + bool bUseDefaultIME; + BYTE bSoftwareTiling; + bool bViewChat; + bool bAlwaysShowName; + bool bShowDamage; + bool bShowSalesText; + } TConfig; + + public: + CPythonSystem(); + virtual ~CPythonSystem(); + + void Clear(); + void SetInterfaceHandler(PyObject * poHandler); + void DestroyInterfaceHandler(); + + // Config + void SetDefaultConfig(); + bool LoadConfig(); + bool SaveConfig(); + void ApplyConfig(); + void SetConfig(TConfig * set_config); + TConfig * GetConfig(); + void ChangeSystem(); + + // Interface + bool LoadInterfaceStatus(); + void SaveInterfaceStatus(); + bool isInterfaceConfig(); + const TWindowStatus & GetWindowStatusReference(int iIndex); + + DWORD GetWidth(); + DWORD GetHeight(); + DWORD GetBPP(); + DWORD GetFrequency(); + bool IsSoftwareCursor(); + bool IsWindowed(); + bool IsViewChat(); + bool IsAlwaysShowName(); + bool IsShowDamage(); + bool IsShowSalesText(); + bool IsUseDefaultIME(); + bool IsNoSoundCard(); + bool IsAutoTiling(); + bool IsSoftwareTiling(); + void SetSoftwareTiling(bool isEnable); + void SetViewChatFlag(int iFlag); + void SetAlwaysShowNameFlag(int iFlag); + void SetShowDamageFlag(int iFlag); + void SetShowSalesTextFlag(int iFlag); + + // Window + void SaveWindowStatus(int iIndex, int iVisible, int iMinimized, int ix, int iy, int iHeight); + + // SaveID + int IsSaveID(); + const char * GetSaveID(); + void SetSaveID(int iValue, const char * c_szSaveID); + + /// Display + void GetDisplaySettings(); + + int GetResolutionCount(); + int GetFrequencyCount(int index); + bool GetResolution(int index, OUT DWORD *width, OUT DWORD *height, OUT DWORD *bpp); + bool GetFrequency(int index, int freq_index, OUT DWORD *frequncy); + int GetResolutionIndex(DWORD width, DWORD height, DWORD bpp); + int GetFrequencyIndex(int res_index, DWORD frequency); + bool isViewCulling(); + + // Sound + float GetMusicVolume(); + int GetSoundVolume(); + void SetMusicVolume(float fVolume); + void SetSoundVolumef(float fVolume); + + int GetDistance(); + int GetShadowLevel(); + void SetShadowLevel(unsigned int level); + + protected: + TResolution m_ResolutionList[RESOLUTION_MAX_NUM]; + int m_ResolutionCount; + + TConfig m_Config; + TConfig m_OldConfig; + + bool m_isInterfaceConfig; + PyObject * m_poInterfaceHandler; + TWindowStatus m_WindowStatus[WINDOW_MAX_NUM]; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/PythonTextTail.h b/extension/src/port/UserInterface/PythonTextTail.h new file mode 100644 index 00000000..3db1613b --- /dev/null +++ b/extension/src/port/UserInterface/PythonTextTail.h @@ -0,0 +1,113 @@ +#pragma once + +#include "../EterBase/Singleton.h" + +/* + * 따라다니는 텍스트 처리 + */ +class CPythonTextTail : public CSingleton +{ + public: + typedef struct STextTail + { + CGraphicTextInstance* pTextInstance; + CGraphicTextInstance* pOwnerTextInstance; + + CGraphicMarkInstance* pMarkInstance; + CGraphicTextInstance* pGuildNameTextInstance; + + CGraphicTextInstance* pTitleTextInstance; + CGraphicTextInstance* pLevelTextInstance; + + + // Todo : 이건 전부 VID로 바꾸도록 한다. + // 도중 캐릭터가 없어질 경우 튕길 가능성이 있음 + CGraphicObjectInstance * pOwner; + + DWORD dwVirtualID; + + float x, y, z; + float fDistanceFromPlayer; + D3DXCOLOR Color; + BOOL bNameFlag; // 이름도 함께 켤것인지의 플래그 + + float xStart, yStart; + float xEnd, yEnd; + + DWORD LivingTime; + + float fHeight; + + STextTail() {} + virtual ~STextTail() {} + } TTextTail; + + typedef std::map TTextTailMap; + typedef std::list TTextTailList; + typedef TTextTailMap TChatTailMap; + + public: + CPythonTextTail(void); + virtual ~CPythonTextTail(void); + + void GetInfo(std::string* pstInfo); + + void Initialize(); + void Destroy(); + void Clear(); + + void UpdateAllTextTail(); + void UpdateShowingTextTail(); + void Render(); + + void ArrangeTextTail(); + void HideAllTextTail(); + void ShowAllTextTail(); + void ShowCharacterTextTail(DWORD VirtualID); + void ShowItemTextTail(DWORD VirtualID); + + void RegisterCharacterTextTail(DWORD dwGuildID, DWORD dwVirtualID, const D3DXCOLOR & c_rColor, float fAddHeight=10.0f); + void RegisterItemTextTail(DWORD VirtualID, const char * c_szText, CGraphicObjectInstance * pOwner); + void RegisterChatTail(DWORD VirtualID, const char * c_szChat); + void RegisterInfoTail(DWORD VirtualID, const char * c_szChat); + void SetCharacterTextTailColor(DWORD VirtualID, const D3DXCOLOR & c_rColor); + void SetItemTextTailOwner(DWORD dwVID, const char * c_szName); + void DeleteCharacterTextTail(DWORD VirtualID); + void DeleteItemTextTail(DWORD VirtualID); + + int Pick(int ixMouse, int iyMouse); + void SelectItemName(DWORD dwVirtualID); + + bool GetTextTailPosition(DWORD dwVID, float* px, float* py, float* pz); + bool IsChatTextTail(DWORD dwVID); + + void EnablePKTitle(BOOL bFlag); + void AttachTitle(DWORD dwVID, const char * c_szName, const D3DXCOLOR& c_rColor); + void DetachTitle(DWORD dwVID); + + void AttachLevel(DWORD dwVID, const char* c_szText, const D3DXCOLOR& c_rColor); + void DetachLevel(DWORD dwVID); + + + protected: + TTextTail * RegisterTextTail(DWORD dwVirtualID, const char * c_szText, CGraphicObjectInstance * pOwner, float fHeight, const D3DXCOLOR & c_rColor); + void DeleteTextTail(TTextTail * pTextTail); + + void UpdateTextTail(TTextTail * pTextTail); + void RenderTextTailBox(TTextTail * pTextTail); + void RenderTextTailName(TTextTail * pTextTail); + void UpdateDistance(const TPixelPosition & c_rCenterPosition, TTextTail * pTextTail); + + bool isIn(TTextTail * pSource, TTextTail * pTarget); + + protected: + TTextTailMap m_CharacterTextTailMap; + TTextTailMap m_ItemTextTailMap; + TChatTailMap m_ChatTailMap; + + TTextTailList m_CharacterTextTailList; + TTextTailList m_ItemTextTailList; + + private: + CDynamicPool m_TextTailPool; +}; diff --git a/extension/src/port/UserInterface/ServerStateChecker.h b/extension/src/port/UserInterface/ServerStateChecker.h new file mode 100644 index 00000000..dc66b186 --- /dev/null +++ b/extension/src/port/UserInterface/ServerStateChecker.h @@ -0,0 +1,31 @@ +#pragma once + +#include "../EterLib/NetStream.h" + +class CServerStateChecker : public CSingleton +{ + public: + CServerStateChecker(); + virtual ~CServerStateChecker(); + + void Create(PyObject* poWnd); + void AddChannel(UINT uServerIndex, const char* c_szAddr, UINT uPort); + void Request(); + void Update(); + + void Initialize(); + + private: + typedef struct SChannel + { + UINT uServerIndex; + const char* c_szAddr; + UINT uPort; + } TChannel; + + PyObject* m_poWnd; + + std::list m_lstChannel; + + CNetworkStream m_kStream; +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/StdAfx.h b/extension/src/port/UserInterface/StdAfx.h index 2a452e92..42c33686 100644 --- a/extension/src/port/UserInterface/StdAfx.h +++ b/extension/src/port/UserInterface/StdAfx.h @@ -8,6 +8,24 @@ // (docs/PORT-PLAN.md 批次 2V0-2V3). #include "../ScriptLib/StdAfx.h" +#include "../GameLib/StdAfx.h" // 40250 PCH order: GameLib types precede UserInterface/GameType.h. +#include "../GameLib/RaceData.h" +#include "../EterPythonLib/StdAfx.h" +#include "GameType.h" // 40250's UserInterface precompiled header supplies these item types. +#include "Locale.h" +#include "../EterBase/tea.h" +#include + +// 40250's Windows PCH also includes DirectShow. The macOS UI adapter owns the video backend; +// these opaque interfaces are only pointer members in PythonApplication.h. +#ifndef _WIN32 +struct IBaseFilter; +struct ISampleGrabber; +struct IMediaControl; +struct IMediaEventEx; +struct IVideoWindow; +struct IBasicVideo; +#endif #define APP_NAME "Metin 2" @@ -25,3 +43,4 @@ enum // The Python module initializers RunMainScript calls, each defined in its own Python*Module.cpp. // Listed here as 40250 lists them; only the ported ones are defined. void initpack(); +void initapp(); diff --git a/extension/src/port/UserInterface/resource.h b/extension/src/port/UserInterface/resource.h new file mode 100644 index 00000000..c307a88f --- /dev/null +++ b/extension/src/port/UserInterface/resource.h @@ -0,0 +1,66 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by UserInterface.rc +// +#define IDS_APP_NAME 1 +#define IDS_POSSESSIVE_MORPHENE 2 +#define IDS_WARN_BAD_DRIVER 3 +#define IDS_WARN_NO_TNL 4 +#define IDS_ERR_CANNOT_READ_FILE 5 +#define IDS_ERR_NOT_LATEST_FILE 6 +#define IDS_ERR_MUST_LAUNCH_FROM_PATCHER 7 +#define IDI_METIN2 100 +#define IDD_COLOR_DIALOG 101 +#define IDC_CURSOR_NORMAL 102 +#define IDC_CURSOR_ATTACK 104 +#define IDC_CURSOR_CHAIR 105 +#define IDC_CURSOR_DOOR 106 +#define IDC_CURSOR_NO 107 +#define IDC_CURSOR_PICK 108 +#define IDC_CURSOR_TALK 109 +#define IDC_CURSOR_BUY 110 +#define IDC_CURSOR_SELL 111 +#define IDC_CURSOR_PICKUP 114 +#define IDC_CURSOR_CAMERA_ROTATE 139 +#define IDC_CURSOR_HSIZE 140 +#define IDC_CURSOR_VSIZE 141 +#define IDC_CURSOR_HVSIZE 142 +#define IDD_SELECT_LOCALE 143 +#define IDR_VERTEXSHADER_LEAF_DYNAMIC_LIGHTING 150 +#define IDR_VERTEXSHADER_LEAF_STATIC_LIGHTING 151 +#define IDR_VERTEXSHADER_WINDYBRANCH_DYNAMIC_LIGHTING 152 +#define IDR_VERTEXSHADER_WINDYLEAF_DYNAMIC_LIGHTING 153 +#define IDR_VERTEXSHADER_WINDYLEAF_STATIC_LIGHTING 154 +#define IDR_VERTEXSHADER_WINDYBRANCH_STATIC_LIGHTING 155 +#define IDC_MATERIAL_AMBIENT_SLIDER_RED 1000 +#define IDC_START 1001 +#define IDC_MATERIAL_AMBIENT_SLIDER_GREEN 1001 +#define IDC_EXIT 1002 +#define IDC_MATERIAL_AMBIENT_SLIDER_BLUE 1002 +#define IDC_LOCALE_LIST 1003 +#define IDC_MATERIAL_AMBIENT_PRINT_RED 1003 +#define IDC_MATERIAL_AMBIENT_PRINT_GREEN 1004 +#define IDC_MATERIAL_AMBIENT_PRINT_BLUE 1005 +#define IDC_NATURE_AMBIENT_SLIDER_RED 1006 +#define IDC_NATURE_AMBIENT_SLIDER_GREEN 1007 +#define IDC_NATURE_AMBIENT_SLIDER_BLUE 1008 +#define IDC_NATURE_AMBIENT_PRINT_RED 1009 +#define IDC_NATURE_AMBIENT_PRINT_GREEN 1010 +#define IDC_NATURE_AMBIENT_PRINT_BLUE 1011 +#define IDC_LIGHT_COLOR_SLIDER_RED 1012 +#define IDC_LIGHT_COLOR_SLIDER_GREEN 1013 +#define IDC_LIGHT_COLOR_SLIDER_BLUE 1014 +#define IDC_LIGHT_COLOR_PRINT_RED 1015 +#define IDC_LIGHT_COLOR_PRINT_GREEN 1016 +#define IDC_LIGHT_COLOR_PRINT_BLUE 1017 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 145 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/extension/src/port/common/PortPythonPointer.h b/extension/src/port/common/PortPythonPointer.h new file mode 100644 index 00000000..8368e6e5 --- /dev/null +++ b/extension/src/port/common/PortPythonPointer.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +// The 40250 Python API represents native handles as integers. Keep that API while allowing a +// 64-bit pointer to survive the round trip on macOS and mobile builds. +template +PyObject* Py_BuildPointer(T* pointer) +{ + return PyLong_FromVoidPtr(static_cast(pointer)); +} + +template +bool PyTuple_GetPointer(PyObject* args, int position, T** out) +{ + if (position < 0 || position >= PyTuple_Size(args)) + return false; + PyObject* value = PyTuple_GetItem(args, position); + if (!value) + return false; + void* pointer = PyLong_AsVoidPtr(value); + if (PyErr_Occurred()) + return false; + *out = static_cast(pointer); + return true; +} diff --git a/extension/src/port/common/Win32Crt.cpp b/extension/src/port/common/Win32Crt.cpp index ce4ce4c0..b490ea1d 100644 --- a/extension/src/port/common/Win32Crt.cpp +++ b/extension/src/port/common/Win32Crt.cpp @@ -4,10 +4,14 @@ #include #include #include +#include #include #include +#include +#include #include +#include #include #include @@ -44,6 +48,69 @@ int _access(const char* path, int mode) return access(path, m); } +namespace +{ +struct FindState +{ + std::vector paths; + size_t next = 0; +}; + +void fill_find_data(const std::string& path, WIN32_FIND_DATA* data) +{ + const size_t slash = path.find_last_of('/'); + const std::string name = path.substr(slash == std::string::npos ? 0 : slash + 1); + std::snprintf(data->cFileName, sizeof(data->cFileName), "%s", name.c_str()); +} +} + +HANDLE FindFirstFile(const char* pattern, WIN32_FIND_DATA* data) +{ + if (!pattern || !data) + return INVALID_HANDLE_VALUE; + std::string normalized(pattern); + for (char& ch : normalized) + if (ch == '\\') ch = '/'; + glob_t matches{}; + const int result = glob(normalized.c_str(), 0, nullptr, &matches); + if (result != 0 || matches.gl_pathc == 0) + { + globfree(&matches); + return INVALID_HANDLE_VALUE; + } + auto* state = new FindState; + for (size_t i = 0; i < matches.gl_pathc; ++i) + state->paths.emplace_back(matches.gl_pathv[i]); + globfree(&matches); + fill_find_data(state->paths[0], data); + state->next = 1; + return state; +} + +BOOL FindNextFile(HANDLE handle, WIN32_FIND_DATA* data) +{ + if (handle == INVALID_HANDLE_VALUE || !handle || !data) + return FALSE; + auto* state = static_cast(handle); + if (state->next >= state->paths.size()) + return FALSE; + fill_find_data(state->paths[state->next++], data); + return TRUE; +} + +BOOL FindClose(HANDLE handle) +{ + if (handle == INVALID_HANDLE_VALUE || !handle) + return FALSE; + delete static_cast(handle); + return TRUE; +} + +void Sleep(DWORD milliseconds) +{ + std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds)); +} + char* _strlwr(char* s) { for (char* p = s; *p; ++p) diff --git a/extension/src/port/common/Win32Crt.h b/extension/src/port/common/Win32Crt.h index 11fe1891..c1dff49c 100644 --- a/extension/src/port/common/Win32Crt.h +++ b/extension/src/port/common/Win32Crt.h @@ -10,8 +10,15 @@ #include #if !defined(_WIN32) +#include #include +// The x87 precision-control call has no equivalent on ARM; the script never needs x87 state there. +#define _PC_24 0 +#define _MCW_PC 0 +inline unsigned _controlfp(unsigned, unsigned) { return 0; } +#define _alloca alloca + #include "Win32MinMax.h" // mmsystem.h @@ -54,6 +61,12 @@ int _snprintf(char* buf, size_t count, const char* fmt, ...) BOOL CreateDirectory(LPCSTR path, void* security_attributes); BOOL DeleteFile(LPCSTR path); int _access(const char* path, int mode); +struct WIN32_FIND_DATA { char cFileName[MAX_PATH]; }; +#define INVALID_HANDLE_VALUE (reinterpret_cast(static_cast(-1))) +HANDLE FindFirstFile(const char* pattern, WIN32_FIND_DATA* data); +BOOL FindNextFile(HANDLE handle, WIN32_FIND_DATA* data); +BOOL FindClose(HANDLE handle); +void Sleep(DWORD milliseconds); // winmm `timeGetTime`: milliseconds since system start, wrapping at 2^32. DWORD timeGetTime(); diff --git a/extension/src/port/common/shim/sdk/il/il.h b/extension/src/port/common/shim/sdk/il/il.h new file mode 100644 index 00000000..c025fad2 --- /dev/null +++ b/extension/src/port/common/shim/sdk/il/il.h @@ -0,0 +1,13 @@ +#pragma once +// DevIL interface needed by 40250 app.GetImageInfo / MarkImage. +typedef unsigned int ILuint; + +#define IL_TYPE_UNKNOWN 0 +#define IL_IMAGE_WIDTH 0x0DE4 +#define IL_IMAGE_HEIGHT 0x0DE5 + +void ilGenImages(unsigned count, ILuint* images); +void ilBindImage(ILuint image); +bool ilLoad(unsigned type, const char* filename); +int ilGetInteger(unsigned property); +void ilDeleteImages(unsigned count, const ILuint* images); diff --git a/extension/src/port/common/shim/win32/dinput.h b/extension/src/port/common/shim/win32/dinput.h index cbbf3049..58c7bbf8 100644 --- a/extension/src/port/common/shim/win32/dinput.h +++ b/extension/src/port/common/shim/win32/dinput.h @@ -11,3 +11,118 @@ struct IDirectInput8; struct IDirectInputDevice8; typedef IDirectInput8* LPDIRECTINPUT8; typedef IDirectInputDevice8* LPDIRECTINPUTDEVICE8; + +// DirectInput scan codes used by PythonApplicationModule.cpp, from mingw-w64 dinput.h. +#define DIK_0 0x0B +#define DIK_1 0x02 +#define DIK_2 0x03 +#define DIK_3 0x04 +#define DIK_4 0x05 +#define DIK_5 0x06 +#define DIK_6 0x07 +#define DIK_7 0x08 +#define DIK_8 0x09 +#define DIK_9 0x0A +#define DIK_A 0x1E +#define DIK_ADD 0x4E +#define DIK_APOSTROPHE 0x28 +#define DIK_APPS 0xDD +#define DIK_B 0x30 +#define DIK_BACK 0x0E +#define DIK_BACKSLASH 0x2B +#define DIK_C 0x2E +#define DIK_CALCULATOR 0xA1 +#define DIK_CAPITAL 0x3A +#define DIK_COMMA 0x33 +#define DIK_D 0x20 +#define DIK_DECIMAL 0x53 +#define DIK_DELETE 0xD3 +#define DIK_DIVIDE 0xB5 +#define DIK_DOWN 0xD0 +#define DIK_E 0x12 +#define DIK_END 0xCF +#define DIK_EQUALS 0x0D +#define DIK_ESCAPE 0x01 +#define DIK_F 0x21 +#define DIK_F1 0x3B +#define DIK_F10 0x44 +#define DIK_F11 0x57 +#define DIK_F12 0x58 +#define DIK_F2 0x3C +#define DIK_F3 0x3D +#define DIK_F4 0x3E +#define DIK_F5 0x3F +#define DIK_F6 0x40 +#define DIK_F7 0x41 +#define DIK_F8 0x42 +#define DIK_F9 0x43 +#define DIK_G 0x22 +#define DIK_GRAVE 0x29 +#define DIK_H 0x23 +#define DIK_HOME 0xC7 +#define DIK_I 0x17 +#define DIK_INSERT 0xD2 +#define DIK_J 0x24 +#define DIK_K 0x25 +#define DIK_L 0x26 +#define DIK_LBRACKET 0x1A +#define DIK_LCONTROL 0x1D +#define DIK_LEFT 0xCB +#define DIK_LMENU 0x38 +#define DIK_LSHIFT 0x2A +#define DIK_LWIN 0xDB +#define DIK_M 0x32 +#define DIK_MEDIASTOP 0xA4 +#define DIK_MINUS 0x0C +#define DIK_MULTIPLY 0x37 +#define DIK_MUTE 0xA0 +#define DIK_N 0x31 +#define DIK_NEXT 0xD1 +#define DIK_NEXTTRACK 0x99 +#define DIK_NUMLOCK 0x45 +#define DIK_NUMPAD0 0x52 +#define DIK_NUMPAD1 0x4F +#define DIK_NUMPAD2 0x50 +#define DIK_NUMPAD3 0x51 +#define DIK_NUMPAD4 0x4B +#define DIK_NUMPAD5 0x4C +#define DIK_NUMPAD6 0x4D +#define DIK_NUMPAD7 0x47 +#define DIK_NUMPAD8 0x48 +#define DIK_NUMPAD9 0x49 +#define DIK_NUMPADCOMMA 0xB3 +#define DIK_NUMPADENTER 0x9C +#define DIK_O 0x18 +#define DIK_P 0x19 +#define DIK_PAUSE 0xC5 +#define DIK_PERIOD 0x34 +#define DIK_PLAYPAUSE 0xA2 +#define DIK_PRIOR 0xC9 +#define DIK_Q 0x10 +#define DIK_R 0x13 +#define DIK_RBRACKET 0x1B +#define DIK_RCONTROL 0x9D +#define DIK_RETURN 0x1C +#define DIK_RIGHT 0xCD +#define DIK_RMENU 0xB8 +#define DIK_RSHIFT 0x36 +#define DIK_RWIN 0xDC +#define DIK_S 0x1F +#define DIK_SCROLL 0x46 +#define DIK_SEMICOLON 0x27 +#define DIK_SLASH 0x35 +#define DIK_SPACE 0x39 +#define DIK_SUBTRACT 0x4A +#define DIK_SYSRQ 0xB7 +#define DIK_T 0x14 +#define DIK_TAB 0x0F +#define DIK_U 0x16 +#define DIK_UP 0xC8 +#define DIK_V 0x2F +#define DIK_VOLUMEDOWN 0xAE +#define DIK_VOLUMEUP 0xB0 +#define DIK_W 0x11 +#define DIK_WEBHOME 0xB2 +#define DIK_X 0x2D +#define DIK_Y 0x15 +#define DIK_Z 0x2C diff --git a/extension/src/port/common/shim/win32/shlobj.h b/extension/src/port/common/shim/win32/shlobj.h new file mode 100644 index 00000000..95440984 --- /dev/null +++ b/extension/src/port/common/shim/win32/shlobj.h @@ -0,0 +1,12 @@ +#pragma once +// Win32 shell-folder API used only by the screenshot command in grp. +#include + +#define CSIDL_PERSONAL 0x0005 + +inline BOOL SHGetSpecialFolderPath(void*, char* path, int, BOOL) +{ + if (path) + path[0] = '\0'; + return FALSE; +} diff --git a/extension/src/port/common/shim/win32/windows.h b/extension/src/port/common/shim/win32/windows.h index 6a3c5685..b209f44f 100644 --- a/extension/src/port/common/shim/win32/windows.h +++ b/extension/src/port/common/shim/win32/windows.h @@ -17,3 +17,11 @@ #define WHITE_BRUSH 0 #define BLACK_BRUSH 4 #define KL_NAMELENGTH 9 +#define FAR +#define VK_LEFT 0x25 +#define VK_UP 0x26 +#define VK_RIGHT 0x27 +#define VK_DOWN 0x28 +#define VK_HOME 0x24 +#define VK_END 0x23 +#define VK_DELETE 0x2E diff --git a/extension/tests/port_python_ui_modules_test.cpp b/extension/tests/port_python_ui_modules_test.cpp new file mode 100644 index 00000000..19539c84 --- /dev/null +++ b/extension/tests/port_python_ui_modules_test.cpp @@ -0,0 +1,47 @@ +#include "EterPythonLib/StdAfx.h" +#include "EterPythonLib/PythonWindowManager.h" +#include "ScriptLib/PythonLauncher.h" +#include "UserInterface/StdAfx.h" +extern void initapp(); +#include "../src/platform/ScriptLib/PythonHost.h" + +#include +#include + +int main(int argc, char** argv) +{ + const std::string stdlib = argc > 1 ? argv[1] : PythonHost::DefaultStdLibPath(); + PythonHost::Configure(); + CPythonLauncher launcher; + if (!launcher.Create()) + return 1; + std::string error; + if (!PythonHost::InstallStdLib(stdlib.c_str(), &error)) + { + std::fprintf(stderr, "InstallStdLib: %s\n", error.c_str()); + return 1; + } + { + UI::CWindowManager manager; + initgrp(); + initgrpImage(); + initgrpText(); + initgrpThing(); + initwndMgr(); + initapp(); + if (!launcher.RunLine("import wndMgr, grp, grpImage, grpText, grpThing, app")) + return 1; + if (!launcher.RunLine( + "class Handler: pass\n" + "window = wndMgr.Register(Handler(), 'UI')\n" + "assert window > 0\n" + "wndMgr.SetName(window, 'roundtrip')\n" + "wndMgr.SetWindowSize(window, 100, 50)\n" + "assert wndMgr.GetWindowWidth(window) == 100\n" + "wndMgr.Destroy(window)\n")) + return 1; + manager.Update(); + } + launcher.Clear(); + return 0; +} diff --git a/project/python_host_check.gd b/project/python_host_check.gd index 86791a32..bf7f5ad2 100644 --- a/project/python_host_check.gd +++ b/project/python_host_check.gd @@ -2,7 +2,7 @@ # # 和 ctest 的 `port.python_launcher` 跑的是同一条序列,区别只有一个:那边是独立可执行文件,这边在 # Godot 进程里,由 GDScript 发起 —— step 4 要验的就是这个差别。2V0 把 C++ 模块注册上之前, -# system.py 停在第一个 import(`No module named app`),这就是当前的验收结果。 +# 在玩法模块补齐前,system.py 会停在下一个未注册的 native import。 # # 真机上通常没有 40250 的 Client/pack(APK 里只有 python27.zip),所以分两段:解释器 + 标准库这一段 # 不需要 pack,任何平台都跑;system.py 这一段需要 pack,没有就跳过并说清楚。 @@ -10,8 +10,7 @@ # 桌面:python_host_test.gd(--script);真机:MT_TEST_MODE=python 从 client_main.gd 进来。 extends RefCounted -# 2V0 之前 system.py 必然停在这里;2V0 之后这一行要跟着改。 -const EXPECTED_STOP := "No module named app" +const EXPECTED_STOP := "No module named net" var fail := 0