diff --git a/audit/history.jsonl b/audit/history.jsonl index 1a679e9e..1bb92ce2 100644 --- a/audit/history.jsonl +++ b/audit/history.jsonl @@ -514,3 +514,4 @@ {"time": "2026-09-23T07:40:54Z", "event": "port_round", "unit": "PORT-PLAN 2V1-e: live smoke against 192.168.21.203", "ported": [], "adapted": [], "divergent": [], "needs_live": ["the loading-phase packet burst after GC_MAIN_CHARACTER and CG_ENTERGAME (2V2 GameWindow)", "auth/login failure popups", "server handling of CG_CLIENT_VERSION with an empty filename (not observable client-side)"], "tests": ["port.login_live: pass x2 against 192.168.21.203 (auth handshake + key agreement + LOGIN3, game LOGIN2, character list, DirectEnter reconnect, CHARACTER_SELECT, GC_MAIN_CHARACTER -> LoadData + CG_CLIENT_VERSION; no unknown packets)", "port.login_flow: pass"], "todo": ["2V2", "port the platform/pending units"]} {"time": "2026-09-23T07:52:21Z", "event": "port_round", "unit": "PORT-PLAN 2V2-a: game.GameWindow opens after Loading, CG_ENTERGAME", "ported": [], "adapted": ["2V0 stub modules: 40250 constants (verbatim init lines, stub_constants.py) and zero return values shaped like each reference function's last Py_BuildValue"], "divergent": [], "fixed": ["UserInterface/StdAfx.h included GameType.h before Locale.h, dropping GameType.h's ENABLE_NEW_EQUIPMENT_SYSTEM branches; 40250 PCH order restored"], "needs_live": ["PHASE_GAME and the Entergame burst: GamePhase/SetGamePhase still stand-ins (2V2-b)"], "tests": ["port.login_flow: pass (fake server receives CG_ENTERGAME with the right sequence byte, GameWindow shown)", "port.login_live: pass against 192.168.21.203 (GameWindow shown)", "port.packet: pass"], "todo": ["2V2-b PhaseGame dispatch", "2V2-c PythonCharacterManager", "2V2-d InstanceBase/ActorInstance", "2V2-e render"]} {"time": "2026-09-23T09:19:19Z", "event": "port_round", "unit": "PORT-PLAN 2V2-b: PhaseGame dispatch + Entergame burst", "ported": ["UserInterface/PythonNetworkStreamPhaseGame.cpp", "UserInterface/PythonNetworkStreamPhaseGameActor.cpp", "UserInterface/PythonNetworkStreamPhaseGameItem.cpp", "UserInterface/PythonNetworkStreamCommand.cpp", "UserInterface/NetworkActorManager.cpp", "UserInterface/PythonChat.cpp", "UserInterface/PythonChatModule.cpp"], "adapted": ["GameSingletons in PythonBoot (CPythonApplication member order, calloc storage) for units still behind platform/pending stand-ins", "platform_stub.py pending: stand-ins generated from undefined symbols", "PlatformStub const char* stand-ins return \"\"", "EterBase TraceErrorObserver test hook"], "divergent": [], "needs_live": ["CreateInstance of every actor fails on the SetRace placeholder (2V2-d)"], "tests": ["port.login_flow: pass (fake server sends the CInputLogin::Entergame order: ADD/ADDITIONAL_INFO/UPDATE, NPC_POSITION, PHASE_GAME, LAND_LIST, TIME, CHANNEL, CHAT notice, PING -> PONG; notice reaches CPythonChat; no Unknown packet header)", "port.login_live: pass against 192.168.21.203 (10 s of the real game phase, connected, no unknown packet)", "script/port_gate.sh macos: PASS"], "todo": ["2V2-c chrmgr/chr modules", "2V2-d SetRace/RaceData", "2V2-e render"]} +{"time": "2026-09-23T09:39:22Z", "event": "port_round", "unit": "PORT-PLAN 2V2-c: chrmgr/chr modules + race registration chain", "ported": ["UserInterface/PythonCharacterManagerModule.cpp", "UserInterface/PythonCharacterModule.cpp", "GameLib/RaceData.cpp", "GameLib/RaceDataFile.cpp", "GameLib/RaceManager.cpp", "GameLib/RaceMotionData.cpp", "GameLib/GameType.cpp", "EterLib/AttributeData.cpp", "EterLib/AttributeInstance.cpp", "EterLib/TextFileLoader.cpp", "EterLib/Util.cpp (lines 1-141, 297-end)", "EterLib/Camera.cpp", "UserInterface/CameraProcedure.cpp"], "adapted": ["EterLib/Util.cpp code page / font face stays with the platform font backend", "CRaceManager created in PythonBoot in CPythonApplication member order", "D3DXVec2CCW / D3DXMatrixfDeterminant / D3DXMatrixLookAtRH"], "divergent": [], "needs_live": ["intermittent (about 1 in 11 live runs) unhandled header 7 in the Loading phase, suspected packet-size desync; the test now prints g_iLastPacket and fails; 8 later runs clean"], "tests": ["port.login_flow: pass (chr/chrmgr not stubs, race 0 MODE_GENERAL/NAME_WAIT registered, no unhandled packet header)", "port.login_live: 8/8 pass against 192.168.21.203", "script/port_gate.sh macos: PASS"], "todo": ["2V2-d gr2 loader + CGraphicThing adapter, InstanceBase/ActorInstance stand-ins", "2V2-e render", "Loading-phase header 7 desync"]} diff --git a/audit/port-map/EterLib/AttributeData.cpp.json b/audit/port-map/EterLib/AttributeData.cpp.json new file mode 100644 index 00000000..61d9c4a4 --- /dev/null +++ b/audit/port-map/EterLib/AttributeData.cpp.json @@ -0,0 +1,92 @@ +{ + "reference": "EterLib/AttributeData.cpp", + "reference_sha256": "4866e318d22d62ac88c2e2c9335c997ae9f12126c4fa6930c717725db05af9e4", + "priority": "P4", + "contracts": [], + "functions": { + "CAttributeData::GetCollisionDataVector": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeData.cpp:CAttributeData::GetCollisionDataVector" + ] + }, + "CAttributeData::GetHeightDataVector": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeData.cpp:CAttributeData::GetHeightDataVector" + ] + }, + "CAttributeData::GetHeightDataCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeData.cpp:CAttributeData::GetHeightDataCount" + ] + }, + "CAttributeData::GetHeightDataPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeData.cpp:CAttributeData::GetHeightDataPointer" + ] + }, + "CAttributeData::GetMaximizeRadius": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeData.cpp:CAttributeData::GetMaximizeRadius" + ] + }, + "CAttributeData::AddCollisionData": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeData.cpp:CAttributeData::AddCollisionData" + ] + }, + "CAttributeData::OnLoad": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeData.cpp:CAttributeData::OnLoad" + ] + }, + "CAttributeData::OnClear": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeData.cpp:CAttributeData::OnClear" + ] + }, + "CAttributeData::OnIsEmpty": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeData.cpp:CAttributeData::OnIsEmpty" + ] + }, + "CAttributeData::OnIsType": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeData.cpp:CAttributeData::OnIsType" + ] + }, + "CAttributeData::Type": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeData.cpp:CAttributeData::Type" + ] + }, + "CAttributeData::OnSelfDestruct": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeData.cpp:CAttributeData::OnSelfDestruct" + ] + }, + "CAttributeData::CAttributeData": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeData.cpp:CAttributeData::CAttributeData" + ] + }, + "CAttributeData::~CAttributeData": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeData.cpp:CAttributeData::~CAttributeData" + ] + } + } +} diff --git a/audit/port-map/EterLib/AttributeInstance.cpp.json b/audit/port-map/EterLib/AttributeInstance.cpp.json new file mode 100644 index 00000000..5347e5af --- /dev/null +++ b/audit/port-map/EterLib/AttributeInstance.cpp.json @@ -0,0 +1,98 @@ +{ + "reference": "EterLib/AttributeInstance.cpp", + "reference_sha256": "ddc7c046d58c5967c589562fd7eccc6688bf6e7c33f40bafbf1c994908027fa3", + "priority": "P4", + "contracts": [], + "functions": { + "CAttributeInstance::Picking": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::Picking" + ] + }, + "CAttributeInstance::GetHeight": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::GetHeight" + ] + }, + "CAttributeInstance::GetObjectPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::GetObjectPointer" + ] + }, + "CAttributeInstance::IsInHeight": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::IsInHeight" + ] + }, + "CAttributeInstance::SetObjectPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::SetObjectPointer" + ] + }, + "CAttributeInstance::RefreshObject": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::RefreshObject" + ] + }, + "CAttributeInstance::GetDataFileName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::GetDataFileName" + ] + }, + "CAttributeInstance::CreateSystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::CreateSystem" + ] + }, + "CAttributeInstance::DestroySystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::DestroySystem" + ] + }, + "CAttributeInstance::New": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::New" + ] + }, + "CAttributeInstance::Delete": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::Delete" + ] + }, + "CAttributeInstance::IsEmpty": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::IsEmpty" + ] + }, + "CAttributeInstance::Clear": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::Clear" + ] + }, + "CAttributeInstance::CAttributeInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::CAttributeInstance" + ] + }, + "CAttributeInstance::~CAttributeInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/AttributeInstance.cpp:CAttributeInstance::~CAttributeInstance" + ] + } + } +} diff --git a/audit/port-map/EterLib/Camera.cpp.json b/audit/port-map/EterLib/Camera.cpp.json new file mode 100644 index 00000000..7cf07ec4 --- /dev/null +++ b/audit/port-map/EterLib/Camera.cpp.json @@ -0,0 +1,290 @@ +{ + "reference": "EterLib/Camera.cpp", + "reference_sha256": "364a453b04d19018bcf3222e704500a8805ca4c4b83b96ad7534cf32465d0511", + "priority": "P4", + "contracts": [], + "functions": { + "CCamera::SetCameraMaxDistance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::SetCameraMaxDistance" + ] + }, + "CCamera::GetTargetHeight": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::GetTargetHeight" + ] + }, + "CCamera::SetTargetHeight": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::SetTargetHeight" + ] + }, + "CCamera::CCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::CCamera" + ] + }, + "CCamera::~CCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::~CCamera" + ] + }, + "CCamera::Lock": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::Lock" + ] + }, + "CCamera::Unlock": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::Unlock" + ] + }, + "CCamera::IsLock": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::IsLock" + ] + }, + "CCamera::SetResistance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::SetResistance" + ] + }, + "CCamera::Wheel": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::Wheel" + ] + }, + "CCamera::BeginDrag": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::BeginDrag" + ] + }, + "CCamera::IsDraging": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::IsDraging" + ] + }, + "CCamera::EndDrag": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::EndDrag" + ] + }, + "CCamera::Drag": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::Drag" + ] + }, + "CCamera::SetCameraState": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::SetCameraState" + ] + }, + "CCamera::IncreaseNumSrcreenBuilding": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::IncreaseNumSrcreenBuilding" + ] + }, + "CCamera::ResetNumScreenBuilding": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::ResetNumScreenBuilding" + ] + }, + "CCamera::SetViewParams": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::SetViewParams" + ] + }, + "CCamera::SetEye": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::SetEye" + ] + }, + "CCamera::SetTarget": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::SetTarget" + ] + }, + "CCamera::SetUp": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::SetUp" + ] + }, + "CCamera::SetViewMatrix": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::SetViewMatrix" + ] + }, + "CCamera::Move": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::Move" + ] + }, + "CCamera::Zoom": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::Zoom" + ] + }, + "CCamera::MoveAlongView": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::MoveAlongView" + ] + }, + "CCamera::MoveAlongCross": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::MoveAlongCross" + ] + }, + "CCamera::MoveAlongUp": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::MoveAlongUp" + ] + }, + "CCamera::MoveLateral": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::MoveLateral" + ] + }, + "CCamera::MoveFront": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::MoveFront" + ] + }, + "CCamera::MoveVertical": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::MoveVertical" + ] + }, + "CCamera::RotateEyeAroundTarget": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::RotateEyeAroundTarget" + ] + }, + "CCamera::RotateEyeAroundPoint": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::RotateEyeAroundPoint" + ] + }, + "CCamera::Pitch": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::Pitch" + ] + }, + "CCamera::Roll": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::Roll" + ] + }, + "CCamera::SetDistance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::SetDistance" + ] + }, + "CCamera::CalculateRoll": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCamera::CalculateRoll" + ] + }, + "CCameraManager::CCameraManager": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCameraManager::CCameraManager" + ] + }, + "CCameraManager::~CCameraManager": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCameraManager::~CCameraManager" + ] + }, + "CCameraManager::GetCurrentCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCameraManager::GetCurrentCamera" + ] + }, + "CCameraManager::SetCurrentCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCameraManager::SetCurrentCamera" + ] + }, + "CCameraManager::ResetToPreviousCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCameraManager::ResetToPreviousCamera" + ] + }, + "CCameraManager::isCurrentCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCameraManager::isCurrentCamera" + ] + }, + "CCameraManager::AddCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCameraManager::AddCamera" + ] + }, + "CCameraManager::RemoveCamera": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCameraManager::RemoveCamera" + ] + }, + "CCameraManager::GetCurrentCameraNum": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCameraManager::GetCurrentCameraNum" + ] + }, + "CCameraManager::isTerrainCollisionEnable": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCameraManager::isTerrainCollisionEnable" + ] + }, + "CCameraManager::SetTerrainCollision": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Camera.cpp:CCameraManager::SetTerrainCollision" + ] + } + } +} diff --git a/audit/port-map/EterLib/TextFileLoader.cpp.json b/audit/port-map/EterLib/TextFileLoader.cpp.json new file mode 100644 index 00000000..6f5a4429 --- /dev/null +++ b/audit/port-map/EterLib/TextFileLoader.cpp.json @@ -0,0 +1,260 @@ +{ + "reference": "EterLib/TextFileLoader.cpp", + "reference_sha256": "2765786448da8e27b98194515c6ad4c5bfc9c87b2c4b95697356b7d5379a6da9", + "priority": "P4", + "contracts": [], + "functions": { + "CTextFileLoader::SGroupNode::GetTokenVector": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::SGroupNode::GetTokenVector" + ] + }, + "CTextFileLoader::SGroupNode::IsExistTokenVector": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::SGroupNode::IsExistTokenVector" + ] + }, + "CTextFileLoader::SGroupNode::InsertTokenVector": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::SGroupNode::InsertTokenVector" + ] + }, + "CTextFileLoader::SGroupNode::GenNameKey": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::SGroupNode::GenNameKey" + ] + }, + "CTextFileLoader::SGroupNode::GetGroupName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::SGroupNode::GetGroupName" + ] + }, + "CTextFileLoader::SGroupNode::IsGroupNameKey": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::SGroupNode::IsGroupNameKey" + ] + }, + "CTextFileLoader::SGroupNode::SetGroupName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::SGroupNode::SetGroupName" + ] + }, + "CTextFileLoader::SGroupNode::New": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::SGroupNode::New" + ] + }, + "CTextFileLoader::SGroupNode::Delete": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::SGroupNode::Delete" + ] + }, + "CTextFileLoader::SGroupNode::DestroySystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::SGroupNode::DestroySystem" + ] + }, + "CTextFileLoader::Cache": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::Cache" + ] + }, + "CTextFileLoader::SetCacheMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::SetCacheMode" + ] + }, + "CTextFileLoader::DestroySystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::DestroySystem" + ] + }, + "CTextFileLoader::Destroy": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::Destroy" + ] + }, + "CTextFileLoader::CTextFileLoader": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::CTextFileLoader" + ] + }, + "CTextFileLoader::~CTextFileLoader": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::~CTextFileLoader" + ] + }, + "CTextFileLoader::__DestroyGroupNodeVector": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::__DestroyGroupNodeVector" + ] + }, + "CTextFileLoader::GetFileName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetFileName" + ] + }, + "CTextFileLoader::IsEmpty": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::IsEmpty" + ] + }, + "CTextFileLoader::Load": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::Load" + ] + }, + "CTextFileLoader::LoadGroup": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::LoadGroup" + ] + }, + "CTextFileLoader::SetTop": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::SetTop" + ] + }, + "CTextFileLoader::GetChildNodeCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetChildNodeCount" + ] + }, + "CTextFileLoader::SetChildNode": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::SetChildNode" + ] + }, + "CTextFileLoader::SetParentNode": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::SetParentNode" + ] + }, + "CTextFileLoader::GetCurrentNodeName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetCurrentNodeName" + ] + }, + "CTextFileLoader::IsToken": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::IsToken" + ] + }, + "CTextFileLoader::GetTokenVector": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenVector" + ] + }, + "CTextFileLoader::GetTokenBoolean": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenBoolean" + ] + }, + "CTextFileLoader::GetTokenByte": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenByte" + ] + }, + "CTextFileLoader::GetTokenWord": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenWord" + ] + }, + "CTextFileLoader::GetTokenInteger": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenInteger" + ] + }, + "CTextFileLoader::GetTokenDoubleWord": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenDoubleWord" + ] + }, + "CTextFileLoader::GetTokenFloat": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenFloat" + ] + }, + "CTextFileLoader::GetTokenVector2": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenVector2" + ] + }, + "CTextFileLoader::GetTokenVector3": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenVector3" + ] + }, + "CTextFileLoader::GetTokenVector4": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenVector4" + ] + }, + "CTextFileLoader::GetTokenPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenPosition" + ] + }, + "CTextFileLoader::GetTokenQuaternion": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenQuaternion" + ] + }, + "CTextFileLoader::GetTokenDirection": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenDirection" + ] + }, + "CTextFileLoader::GetTokenColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenColor" + ] + }, + "CTextFileLoader::GetTokenString": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/TextFileLoader.cpp:CTextFileLoader::GetTokenString" + ] + } + } +} diff --git a/audit/port-map/EterLib/Util.cpp.json b/audit/port-map/EterLib/Util.cpp.json new file mode 100644 index 00000000..5ffec9c5 --- /dev/null +++ b/audit/port-map/EterLib/Util.cpp.json @@ -0,0 +1,120 @@ +{ + "reference": "EterLib/Util.cpp", + "reference_sha256": "6bbb3a040afb38891e534689ea3ccdb4eafae4101ad2bb7a09c2a208fcaa35f3", + "priority": "P4", + "contracts": [], + "functions": { + "PrintfTabs": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Util.cpp:PrintfTabs" + ] + }, + "LoadTextData": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Util.cpp:LoadTextData" + ] + }, + "LoadMultipleTextData": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Util.cpp:LoadMultipleTextData" + ] + }, + "TokenToVector": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Util.cpp:TokenToVector" + ] + }, + "TokenToColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Util.cpp:TokenToColor" + ] + }, + "EnumFontFamExProc": { + "status": "N_A", + "note": "Win32 font enumeration; the platform font backend owns code page/font face" + }, + "GetCharsetFromCodePage": { + "status": "ADAPTED", + "impl": [ + "extension/src/platform/EterLib/Util.cpp:GetCharsetFromCodePage" + ], + "note": "lives with the platform font backend", + "test": "extension/tests/port_login_flow_test.cpp (PythonBoot SetDefaultCodePage(LocaleService_GetCodePage()) -> CP949 text through GrpTextInstance in the login/select/game UI)" + }, + "GetFontFaceFromCodePageNT": { + "status": "ADAPTED", + "impl": [ + "extension/src/platform/EterLib/Util.cpp:GetFontFaceFromCodePageNT" + ], + "note": "lives with the platform font backend", + "test": "extension/tests/port_login_flow_test.cpp (PythonBoot SetDefaultCodePage(LocaleService_GetCodePage()) -> CP949 text through GrpTextInstance in the login/select/game UI)" + }, + "GetFontFaceFromCodePage9x": { + "status": "N_A", + "note": "Win32 font enumeration; the platform font backend owns code page/font face" + }, + "GetDefaultCodePage": { + "status": "ADAPTED", + "impl": [ + "extension/src/platform/EterLib/Util.cpp:GetDefaultCodePage" + ], + "note": "lives with the platform font backend", + "test": "extension/tests/port_login_flow_test.cpp (PythonBoot SetDefaultCodePage(LocaleService_GetCodePage()) -> CP949 text through GrpTextInstance in the login/select/game UI)" + }, + "GetDefaultFontFace": { + "status": "ADAPTED", + "impl": [ + "extension/src/platform/EterLib/Util.cpp:GetDefaultFontFace" + ], + "note": "lives with the platform font backend", + "test": "extension/tests/port_login_flow_test.cpp (PythonBoot SetDefaultCodePage(LocaleService_GetCodePage()) -> CP949 text through GrpTextInstance in the login/select/game UI)" + }, + "GetFontFaceFromCodePage": { + "status": "ADAPTED", + "impl": [ + "extension/src/platform/EterLib/Util.cpp:GetFontFaceFromCodePage" + ], + "note": "lives with the platform font backend", + "test": "extension/tests/port_login_flow_test.cpp (PythonBoot SetDefaultCodePage(LocaleService_GetCodePage()) -> CP949 text through GrpTextInstance in the login/select/game UI)" + }, + "SetDefaultFontFace": { + "status": "ADAPTED", + "impl": [ + "extension/src/platform/EterLib/Util.cpp:SetDefaultFontFace" + ], + "note": "lives with the platform font backend", + "test": "extension/tests/port_login_flow_test.cpp (PythonBoot SetDefaultCodePage(LocaleService_GetCodePage()) -> CP949 text through GrpTextInstance in the login/select/game UI)" + }, + "SetDefaultCodePage": { + "status": "ADAPTED", + "impl": [ + "extension/src/platform/EterLib/Util.cpp:SetDefaultCodePage" + ], + "note": "lives with the platform font backend", + "test": "extension/tests/port_login_flow_test.cpp (PythonBoot SetDefaultCodePage(LocaleService_GetCodePage()) -> CP949 text through GrpTextInstance in the login/select/game UI)" + }, + "__base64_get": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Util.cpp:__base64_get" + ] + }, + "__strcat1": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Util.cpp:__strcat1" + ] + }, + "base64_decode": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/Util.cpp:base64_decode" + ] + } + } +} diff --git a/audit/port-map/GameLib/GameType.cpp.json b/audit/port-map/GameLib/GameType.cpp.json new file mode 100644 index 00000000..0dded9ea --- /dev/null +++ b/audit/port-map/GameLib/GameType.cpp.json @@ -0,0 +1,92 @@ +{ + "reference": "GameLib/GameType.cpp", + "reference_sha256": "1406f8fa1958ee6cd0583b2b3e0fb90125e077038ec083ae91bc5830bf06d345", + "priority": "P4", + "contracts": [], + "functions": { + "NRaceData::DestroySystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/GameType.cpp:NRaceData::DestroySystem" + ] + }, + "NRaceData::LoadAttackData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/GameType.cpp:NRaceData::LoadAttackData" + ] + }, + "NRaceData::THitData::Load": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/GameType.cpp:NRaceData::THitData::Load" + ] + }, + "NRaceData::LoadMotionAttackData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/GameType.cpp:NRaceData::LoadMotionAttackData" + ] + }, + "NRaceData::LoadCollisionData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/GameType.cpp:NRaceData::LoadCollisionData" + ] + }, + "NRaceData::SaveEffectData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/GameType.cpp:NRaceData::SaveEffectData" + ] + }, + "NRaceData::SaveObjectData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/GameType.cpp:NRaceData::SaveObjectData" + ] + }, + "NRaceData::LoadEffectData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/GameType.cpp:NRaceData::LoadEffectData" + ] + }, + "NRaceData::LoadObjectData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/GameType.cpp:NRaceData::LoadObjectData" + ] + }, + "NRaceData::SaveAttackData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/GameType.cpp:NRaceData::SaveAttackData" + ] + }, + "NRaceData::SaveMotionAttackData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/GameType.cpp:NRaceData::SaveMotionAttackData" + ] + }, + "NRaceData::SaveCollisionData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/GameType.cpp:NRaceData::SaveCollisionData" + ] + }, + "NRaceData::SaveAttachingData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/GameType.cpp:NRaceData::SaveAttachingData" + ] + }, + "NRaceData::LoadAttachingData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/GameType.cpp:NRaceData::LoadAttachingData" + ] + } + } +} diff --git a/audit/port-map/GameLib/RaceData.cpp.json b/audit/port-map/GameLib/RaceData.cpp.json index 858885bc..69105320 100644 --- a/audit/port-map/GameLib/RaceData.cpp.json +++ b/audit/port-map/GameLib/RaceData.cpp.json @@ -5,148 +5,292 @@ "contracts": [], "functions": { "CRaceData::GetSmokeBone": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetSmokeBone" + ] }, "CRaceData::GetSmokeEffectID": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetSmokeEffectID" + ] }, "CRaceData::FindHair": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::FindHair" + ] }, "CRaceData::SetHairSkin": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::SetHairSkin" + ] }, "CRaceData::FindShape": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::FindShape" + ] }, "CRaceData::SetShapeModel": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::SetShapeModel" + ] }, "CRaceData::AppendShapeSkin": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::AppendShapeSkin" + ] }, "CRaceData::New": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::New" + ] }, "CRaceData::Delete": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::Delete" + ] }, "CRaceData::CreateSystem": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::CreateSystem" + ] }, "CRaceData::DestroySystem": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::DestroySystem" + ] }, "CRaceData::CreateMotionModeIterator": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::CreateMotionModeIterator" + ] }, "CRaceData::NextMotionModeIterator": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::NextMotionModeIterator" + ] }, "CRaceData::GetMotionKey": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetMotionKey" + ] }, "CRaceData::GetMotionModeDataPointer": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetMotionModeDataPointer" + ] }, "CRaceData::GetModelDataPointer": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetModelDataPointer" + ] }, "CRaceData::GetMotionVectorPointer": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetMotionVectorPointer" + ] }, "CRaceData::GetMotionDataPointer": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetMotionDataPointer" + ] }, "CRaceData::GetAttachingDataCount": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetAttachingDataCount" + ] }, "CRaceData::GetAttachingDataPointer": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetAttachingDataPointer" + ] }, "CRaceData::GetCollisionDataPointer": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetCollisionDataPointer" + ] }, "CRaceData::GetBodyCollisionDataPointer": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetBodyCollisionDataPointer" + ] }, "CRaceData::SetRace": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::SetRace" + ] }, "CRaceData::RegisterAttachingBoneName": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::RegisterAttachingBoneName" + ] }, "CRaceData::RegisterMotionMode": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::RegisterMotionMode" + ] }, "CRaceData::NEW_RegisterMotion": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::NEW_RegisterMotion" + ] }, "CRaceData::RegisterMotionData": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::RegisterMotionData" + ] }, "CRaceData::OLD_RegisterMotion": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::OLD_RegisterMotion" + ] }, "CRaceData::__OLD_RegisterMotion": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::__OLD_RegisterMotion" + ] }, "CRaceData::SetMotionRandomWeight": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::SetMotionRandomWeight" + ] }, "CRaceData::RegisterNormalAttack": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::RegisterNormalAttack" + ] }, "CRaceData::GetNormalAttackIndex": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetNormalAttackIndex" + ] }, "CRaceData::ReserveComboAttack": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::ReserveComboAttack" + ] }, "CRaceData::RegisterComboAttack": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::RegisterComboAttack" + ] }, "CRaceData::GetComboDataPointer": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetComboDataPointer" + ] }, "CRaceData::GetBaseModelFileName": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetBaseModelFileName" + ] }, "CRaceData::GetAttributeFileName": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetAttributeFileName" + ] }, "CRaceData::GetMotionListFileName": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetMotionListFileName" + ] }, "CRaceData::GetBaseModelThing": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetBaseModelThing" + ] }, "CRaceData::GetLODModelThing": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetLODModelThing" + ] }, "CRaceData::GetAttributeDataPtr": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetAttributeDataPtr" + ] }, "CRaceData::GetAttachingBoneName": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetAttachingBoneName" + ] }, "CRaceData::IsTree": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::IsTree" + ] }, "CRaceData::GetTreeFileName": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::GetTreeFileName" + ] }, "CRaceData::Destroy": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::Destroy" + ] }, "CRaceData::__Initialize": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::__Initialize" + ] }, "CRaceData::CRaceData": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::CRaceData" + ] }, "CRaceData::~CRaceData": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceData.cpp:CRaceData::~CRaceData" + ] } } } diff --git a/audit/port-map/GameLib/RaceDataFile.cpp.json b/audit/port-map/GameLib/RaceDataFile.cpp.json new file mode 100644 index 00000000..d7623c43 --- /dev/null +++ b/audit/port-map/GameLib/RaceDataFile.cpp.json @@ -0,0 +1,14 @@ +{ + "reference": "GameLib/RaceDataFile.cpp", + "reference_sha256": "7c8325eec3b02e76185326573ec12627cf1303ec614708d431355c3f165c12a2", + "priority": "P1", + "contracts": [], + "functions": { + "CRaceData::LoadRaceData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceDataFile.cpp:CRaceData::LoadRaceData" + ] + } + } +} diff --git a/audit/port-map/GameLib/RaceManager.cpp.json b/audit/port-map/GameLib/RaceManager.cpp.json index b66cd4cb..33cb5e07 100644 --- a/audit/port-map/GameLib/RaceManager.cpp.json +++ b/audit/port-map/GameLib/RaceManager.cpp.json @@ -5,61 +5,118 @@ "contracts": [], "functions": { "__IsGuildRace": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:__IsGuildRace" + ] }, "__IsNPCRace": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:__IsNPCRace" + ] }, "__GetRaceResourcePathes": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:__GetRaceResourcePathes" + ] }, "CRaceManager::__LoadRaceData": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::__LoadRaceData" + ] }, "CRaceManager::__LoadRaceMotionList": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::__LoadRaceMotionList" + ] }, "CRaceManager::RegisterRaceSrcName": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::RegisterRaceSrcName" + ] }, "CRaceManager::RegisterRaceName": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::RegisterRaceName" + ] }, "CRaceManager::CreateRace": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::CreateRace" + ] }, "CRaceManager::SelectRace": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::SelectRace" + ] }, "CRaceManager::GetSelectedRaceDataPointer": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::GetSelectedRaceDataPointer" + ] }, "CRaceManager::GetRaceDataPointer": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::GetRaceDataPointer" + ] }, "CRaceManager::SetPathName": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::SetPathName" + ] }, "CRaceManager::GetFullPathFileName": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::GetFullPathFileName" + ] }, "CRaceManager::Create": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::Create" + ] }, "CRaceManager::__Initialize": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::__Initialize" + ] }, "CRaceManager::__DestroyRaceDataMap": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::__DestroyRaceDataMap" + ] }, "CRaceManager::Destroy": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::Destroy" + ] }, "CRaceManager::CRaceManager": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::CRaceManager" + ] }, "CRaceManager::~CRaceManager": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceManager.cpp:CRaceManager::~CRaceManager" + ] } } } diff --git a/audit/port-map/GameLib/RaceMotionData.cpp.json b/audit/port-map/GameLib/RaceMotionData.cpp.json new file mode 100644 index 00000000..0ef5b5a7 --- /dev/null +++ b/audit/port-map/GameLib/RaceMotionData.cpp.json @@ -0,0 +1,242 @@ +{ + "reference": "GameLib/RaceMotionData.cpp", + "reference_sha256": "021a976e2f62bb1c0056a6f076b6e7715c8eb513be3f7bc73738695c19cddece", + "priority": "P1", + "contracts": [], + "functions": { + "CRaceMotionData::CreateSystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::CreateSystem" + ] + }, + "CRaceMotionData::DestroySystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::DestroySystem" + ] + }, + "CRaceMotionData::New": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::New" + ] + }, + "CRaceMotionData::Delete": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::Delete" + ] + }, + "CRaceMotionData::SetName": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::SetName" + ] + }, + "CRaceMotionData::SetType": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::SetType" + ] + }, + "CRaceMotionData::GetType": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetType" + ] + }, + "CRaceMotionData::IsLock": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::IsLock" + ] + }, + "CRaceMotionData::GetLoopCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetLoopCount" + ] + }, + "CRaceMotionData::GetMotionDuration": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetMotionDuration" + ] + }, + "CRaceMotionData::SetMotionDuration": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::SetMotionDuration" + ] + }, + "CRaceMotionData::IsComboInputTimeData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::IsComboInputTimeData" + ] + }, + "CRaceMotionData::GetComboInputStartTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetComboInputStartTime" + ] + }, + "CRaceMotionData::GetNextComboTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetNextComboTime" + ] + }, + "CRaceMotionData::GetComboInputEndTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetComboInputEndTime" + ] + }, + "CRaceMotionData::isAttackingMotion": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::isAttackingMotion" + ] + }, + "CRaceMotionData::GetMotionAttackDataPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetMotionAttackDataPointer" + ] + }, + "CRaceMotionData::GetMotionAttackDataReference": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetMotionAttackDataReference" + ] + }, + "CRaceMotionData::HasSplashMotionEvent": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::HasSplashMotionEvent" + ] + }, + "CRaceMotionData::IsCancelEnableSkill": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::IsCancelEnableSkill" + ] + }, + "CRaceMotionData::IsLoopMotion": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::IsLoopMotion" + ] + }, + "CRaceMotionData::GetLoopStartTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetLoopStartTime" + ] + }, + "CRaceMotionData::GetLoopEndTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetLoopEndTime" + ] + }, + "CRaceMotionData::GetMotionEventDataCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetMotionEventDataCount" + ] + }, + "CRaceMotionData::GetMotionEventDataPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetMotionEventDataPointer" + ] + }, + "CRaceMotionData::GetMotionAttackingEventDataPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetMotionAttackingEventDataPointer" + ] + }, + "CRaceMotionData::GetEventType": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetEventType" + ] + }, + "CRaceMotionData::GetEventStartTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetEventStartTime" + ] + }, + "CRaceMotionData::GetSoundInstanceVectorPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetSoundInstanceVectorPointer" + ] + }, + "CRaceMotionData::SetAccumulationPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::SetAccumulationPosition" + ] + }, + "CRaceMotionData::LoadMotionData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::LoadMotionData" + ] + }, + "CRaceMotionData::SaveMotionData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::SaveMotionData" + ] + }, + "CRaceMotionData::LoadSoundScriptData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::LoadSoundScriptData" + ] + }, + "CRaceMotionData::GetMotionFileName": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetMotionFileName" + ] + }, + "CRaceMotionData::GetSoundScriptFileName": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::GetSoundScriptFileName" + ] + }, + "CRaceMotionData::Initialize": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::Initialize" + ] + }, + "CRaceMotionData::Destroy": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::Destroy" + ] + }, + "CRaceMotionData::CRaceMotionData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::CRaceMotionData" + ] + }, + "CRaceMotionData::~CRaceMotionData": { + "status": "PORTED", + "impl": [ + "extension/src/port/GameLib/RaceMotionData.cpp:CRaceMotionData::~CRaceMotionData" + ] + } + } +} diff --git a/audit/port-map/UserInterface/CameraProcedure.cpp.json b/audit/port-map/UserInterface/CameraProcedure.cpp.json new file mode 100644 index 00000000..d508a2c5 --- /dev/null +++ b/audit/port-map/UserInterface/CameraProcedure.cpp.json @@ -0,0 +1,26 @@ +{ + "reference": "UserInterface/CameraProcedure.cpp", + "reference_sha256": "b3c676fbf1e637181b53ae8de7631e5fafd9a7a39b5e98261d11dee0d5364312", + "priority": "P4", + "contracts": [], + "functions": { + "CCamera::ProcessTerrainCollision": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/CameraProcedure.cpp:CCamera::ProcessTerrainCollision" + ] + }, + "CCamera::ProcessBuildingCollision": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/CameraProcedure.cpp:CCamera::ProcessBuildingCollision" + ] + }, + "CCamera::Update": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/CameraProcedure.cpp:CCamera::Update" + ] + } + } +} diff --git a/audit/port-map/UserInterface/PythonCharacterManagerModule.cpp.json b/audit/port-map/UserInterface/PythonCharacterManagerModule.cpp.json new file mode 100644 index 00000000..65598353 --- /dev/null +++ b/audit/port-map/UserInterface/PythonCharacterManagerModule.cpp.json @@ -0,0 +1,248 @@ +{ + "reference": "UserInterface/PythonCharacterManagerModule.cpp", + "reference_sha256": "bab53370d95383243f0e04338e63df48c2cd71d44f97414cfe91cd10ba149c4c", + "priority": "P4", + "contracts": [], + "functions": { + "chrmgrSetEmpireNameMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrSetEmpireNameMode" + ] + }, + "chrmgrRegisterTitleName": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterTitleName" + ] + }, + "chrmgrRegisterNameColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterNameColor" + ] + }, + "chrmgrRegisterTitleColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterTitleColor" + ] + }, + "chrmgrGetPickedVID": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrGetPickedVID" + ] + }, + "chrmgrGetVIDInfo": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrGetVIDInfo" + ] + }, + "chrmgrSetPathName": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrSetPathName" + ] + }, + "chrmgrCreateRace": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrCreateRace" + ] + }, + "chrmgrSelectRace": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrSelectRace" + ] + }, + "chrmgrRegisterAttachingBoneName": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterAttachingBoneName" + ] + }, + "chrmgrRegisterMotionMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterMotionMode" + ] + }, + "chrmgrSetMotionRandomWeight": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrSetMotionRandomWeight" + ] + }, + "chrmgrRegisterNormalAttack": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterNormalAttack" + ] + }, + "chrmgrReserveComboAttack": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrReserveComboAttack" + ] + }, + "chrmgrRegisterComboAttack": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterComboAttack" + ] + }, + "chrmgrReserveComboAttackNew": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrReserveComboAttackNew" + ] + }, + "chrmgrRegisterComboAttackNew": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterComboAttackNew" + ] + }, + "chrmgrLoadRaceData": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrLoadRaceData" + ] + }, + "chrmgrLoadLocalRaceData": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrLoadLocalRaceData" + ] + }, + "chrmgrRegisterCacheMotionData": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterCacheMotionData" + ] + }, + "chrmgrRegisterMotionData": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterMotionData" + ] + }, + "chrmgrRegisterRaceSrcName": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterRaceSrcName" + ] + }, + "chrmgrRegisterRaceName": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterRaceName" + ] + }, + "chrmgrSetShapeModel": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrSetShapeModel" + ] + }, + "chrmgrAppendShapeSkin": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrAppendShapeSkin" + ] + }, + "chrmgrSetMovingSpeed": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrSetMovingSpeed" + ] + }, + "chrmgrRegisterEffect": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterEffect" + ] + }, + "chrmgrRegisterCacheEffect": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterCacheEffect" + ] + }, + "chrmgrSetDustGap": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrSetDustGap" + ] + }, + "chrmgrSetHorseDustGap": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrSetHorseDustGap" + ] + }, + "chrmgrToggleDirectionLine": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrToggleDirectionLine" + ] + }, + "chrmgrRegisterPointEffect": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrRegisterPointEffect" + ] + }, + "chrmgrShowPointEffect": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrShowPointEffect" + ] + }, + "CPythonCharacterManager::SCRIPT_SetAffect": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:CPythonCharacterManager::SCRIPT_SetAffect" + ] + }, + "chrmgrSetAffect": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrSetAffect" + ] + }, + "CPythonCharacterManager::SetEmoticon": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:CPythonCharacterManager::SetEmoticon" + ] + }, + "CPythonCharacterManager::IsPossibleEmoticon": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:CPythonCharacterManager::IsPossibleEmoticon" + ] + }, + "chrmgrSetEmoticon": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrSetEmoticon" + ] + }, + "chrmgrIsPossibleEmoticon": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:chrmgrIsPossibleEmoticon" + ] + }, + "initchrmgr": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManagerModule.cpp:initchrmgr" + ] + } + } +} diff --git a/audit/port-map/UserInterface/PythonCharacterModule.cpp.json b/audit/port-map/UserInterface/PythonCharacterModule.cpp.json new file mode 100644 index 00000000..53d80a8e --- /dev/null +++ b/audit/port-map/UserInterface/PythonCharacterModule.cpp.json @@ -0,0 +1,482 @@ +{ + "reference": "UserInterface/PythonCharacterModule.cpp", + "reference_sha256": "b0f4a420d3dd4f2d3a8ff8de9b4ddc369d4b05118fa812d4914669035d2cdf2d", + "priority": "P4", + "contracts": [], + "functions": { + "chrRaceToJob": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrRaceToJob" + ] + }, + "chrRaceToSex": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrRaceToSex" + ] + }, + "chrDestroy": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrDestroy" + ] + }, + "chrUpdate": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrUpdate" + ] + }, + "chrDeform": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrDeform" + ] + }, + "chrRender": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrRender" + ] + }, + "chrRenderCollision": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrRenderCollision" + ] + }, + "chrCreateInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrCreateInstance" + ] + }, + "chrDeleteInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrDeleteInstance" + ] + }, + "chrDeleteInstanceByFade": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrDeleteInstanceByFade" + ] + }, + "chrSelectInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSelectInstance" + ] + }, + "chrHasInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrHasInstance" + ] + }, + "chrIsEnemy": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrIsEnemy" + ] + }, + "chrIsNPC": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrIsNPC" + ] + }, + "chrIsGameMaster": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrIsGameMaster" + ] + }, + "chrIsPartyMember": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrIsPartyMember" + ] + }, + "chrSelect": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSelect" + ] + }, + "chrSetAddRenderMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetAddRenderMode" + ] + }, + "chrSetBlendRenderMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetBlendRenderMode" + ] + }, + "chrUnselect": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrUnselect" + ] + }, + "chrPick": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrPick" + ] + }, + "chrHide": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrHide" + ] + }, + "chrShow": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrShow" + ] + }, + "chrPickAll": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrPickAll" + ] + }, + "chrSetRace": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetRace" + ] + }, + "chrSetHair": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetHair" + ] + }, + "chrChangeHair": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrChangeHair" + ] + }, + "chrSetArmor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetArmor" + ] + }, + "chrChangeShape": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrChangeShape" + ] + }, + "chrSetWeapon": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetWeapon" + ] + }, + "chrSetVirtualID": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetVirtualID" + ] + }, + "chrSetNameString": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetNameString" + ] + }, + "chrSetInstanceType": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetInstanceType" + ] + }, + "chrAttachEffectByName": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrAttachEffectByName" + ] + }, + "chrAttachEffectByID": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrAttachEffectByID" + ] + }, + "chrRefresh": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrRefresh" + ] + }, + "chrMountHorse": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrMountHorse" + ] + }, + "chrDismountHorse": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrDismountHorse" + ] + }, + "chrRevive": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrRevive" + ] + }, + "chrDie": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrDie" + ] + }, + "chrLookAt": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrLookAt" + ] + }, + "chrSetMotionMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetMotionMode" + ] + }, + "chrSetLoopMotion": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetLoopMotion" + ] + }, + "chrBlendLoopMotion": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrBlendLoopMotion" + ] + }, + "chrPushOnceMotion": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrPushOnceMotion" + ] + }, + "chrPushLoopMotion": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrPushLoopMotion" + ] + }, + "chrSetPixelPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetPixelPosition" + ] + }, + "chrSetDirection": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetDirection" + ] + }, + "chrGetPixelPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrGetPixelPosition" + ] + }, + "chrSetRotation": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetRotation" + ] + }, + "chrSetRotationAll": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetRotationAll" + ] + }, + "chrBlendRotation": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrBlendRotation" + ] + }, + "chrGetRotation": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrGetRotation" + ] + }, + "chrGetRace": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrGetRace" + ] + }, + "chrGetName": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrGetName" + ] + }, + "chrGetNameByVID": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrGetNameByVID" + ] + }, + "chrGetGuildID": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrGetGuildID" + ] + }, + "chrGetProjectPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrGetProjectPosition" + ] + }, + "chrGetVirtualNumber": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrGetVirtualNumber" + ] + }, + "chrGetInstanceType": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrGetInstanceType" + ] + }, + "chrGetBoundBoxOnlyXY": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrGetBoundBoxOnlyXY" + ] + }, + "chrtestGetPKData": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrtestGetPKData" + ] + }, + "chrtestSetComboType": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrtestSetComboType" + ] + }, + "chrtestSetAddRenderMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrtestSetAddRenderMode" + ] + }, + "chrtestSetModulateRenderMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrtestSetModulateRenderMode" + ] + }, + "chrtestSetAddRenderModeRGB": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrtestSetAddRenderModeRGB" + ] + }, + "chrtestSetModulateRenderModeRGB": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrtestSetModulateRenderModeRGB" + ] + }, + "chrtestSetSpecularRenderMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrtestSetSpecularRenderMode" + ] + }, + "chrtestSetSpecularRenderMode2": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrtestSetSpecularRenderMode2" + ] + }, + "chrtestRestoreRenderMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrtestRestoreRenderMode" + ] + }, + "chrFaintTest": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrFaintTest" + ] + }, + "chrSetMoveSpeed": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetMoveSpeed" + ] + }, + "chrSetAttackSpeed": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrSetAttackSpeed" + ] + }, + "chrWeaponTraceSetTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrWeaponTraceSetTexture" + ] + }, + "chrWeaponTraceUseTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrWeaponTraceUseTexture" + ] + }, + "chrWeaponTraceUseAlpha": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrWeaponTraceUseAlpha" + ] + }, + "chrMoveToDestPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrMoveToDestPosition" + ] + }, + "chrtestSetRideMan": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:chrtestSetRideMan" + ] + }, + "initchr": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterModule.cpp:initchr" + ] + } + } +} diff --git a/docs/PORT-PLAN.md b/docs/PORT-PLAN.md index 588acb24..ccfad6c7 100644 --- a/docs/PORT-PLAN.md +++ b/docs/PORT-PLAN.md @@ -421,8 +421,8 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次 | --- | --- | --- | | 2V2-a | Loading 结束后打开 `game.GameWindow`,发 `CG_ENTERGAME` | 完成:2V0 桩模块的常量与返回值形状改为按 40250 生成(`scripts/stub_constants.py`:常量逐行抄各模块 init 的 `PyModule_Add*Constant` 及其预处理行/枚举/`extern const` 定义,写到 `platform/ScriptLib/GameplayModuleConstants.cpp`;桩函数返回参考函数最后一个 `return` 的 `Py_BuildValue` 格式的零值或 None,而不是一律 `int 0`),`uiSafebox.SetTableSize` 的除零和 `uiTaskBar` 解包失败随之消失,`interfaceModule.MakeInterface` 走完。修正:`UserInterface/StdAfx.h` 按 40250 PCH 顺序先 `Locale.h` 后 `GameType.h`(之前反了,`GameType.h` 里 `ENABLE_NEW_EQUIPMENT_SYSTEM` 分支全被丢掉)。`port.login_flow` 假服在 `CG_CLIENT_VERSION` 后收 `CG_ENTERGAME`(校验序列字节),测试等到 `GameWindow` 显示;`port.login_live` 2026-09-23 对 192.168.21.203 同样走到 `GameWindow`。`GamePhase`/`SetGamePhase` 仍是替身:服务器的 PHASE_GAME 及 Loading 阶段落到 `GamePhase()` 的包会卡住读流 | | 2V2-b | `PythonNetworkStreamPhaseGame*.cpp` 分派闭包:`SetGamePhase`/`GamePhase`,PHASE_GAME 后的 Entergame 包洪流(`GC_TIME`/`GC_CHANNEL`/`GC_CHARACTER_ADD`/`GC_CHAR_ADDITIONAL_INFO`/`GC_CHARACTER_UPDATE`/技能/物品/快捷栏…)读流不断 | 完成:`PythonNetworkStreamPhaseGame`/`PhaseGameActor`/`PhaseGameItem`/`Command`、`NetworkActorManager` 原样移植并在运行时分派(port-map 标 PORTED);`GC_CHAT` 需要的 `PythonChat.cpp`/`PythonChatModule.cpp` 一并原样移植,`GameplayModules.cpp` 的 `chat` 桩删除,`initChat()` 按 40250 顺序在 `initnet()` 前调用。未移植单元的单例在 `PythonBoot` 的 `GameSingletons` 里按 `CPythonApplication` 成员顺序创建(calloc 存储:替身构造函数不初始化标量);替身由 `platform_stub.py pending
<符号...> [--ctor]` 按链接缺失符号生成到 `platform/pending//`,返回 `const char*` 的替身返回 `""`(`RecvGuild` 里 `strcmp(…, CPythonPlayer::GetName())`)。`port.login_flow` 假服按 `CInputLogin::Entergame` 顺序发:Loading 阶段 `CHARACTER_ADD`+`CHAR_ADDITIONAL_INFO`+`CHARACTER_UPDATE`、`NPC_POSITION` → `PHASE_GAME` → `LAND_LIST`、`TIME`、`CHANNEL`、问候 `CHAT` → `PING`,客户端回 `PONG`,公告进 `CPythonChat`,`TraceError` 观察钩子(`EterBase/TraceErrorObserver.h`)断言无 `Unknown packet header`。`port.login_live` 2026-09-23 对 192.168.21.203 读 10 s 真实游戏阶段:连接保持、GameWindow 显示、无未知包;剩下的 SYSERR 只有 `CreateInstance` 失败(2V2-d 的 `SetRace` 占位) | - | 2V2-c | `PythonCharacterManager` + `chrmgr`/`chr` 模块:`playerSettingModule` 的种族/动作/特效注册走真实实现 | 进行中:PythonCharacterManager 原版逻辑已编译;`chrmgr`/`chr` 仍是 2V0 桩,注册链未接通 | - | 2V2-d | `InstanceBase` + `ActorInstance` + `CGraphicThingInstance` adapter:`GC_CHARACTER_ADD` 创建主角实例(msm 模型 + 待机动作) | 进行中:InstanceBase、InstanceBaseMovement、ActorInstance 已编译;ActorInstanceData/RaceManager/RaceData 已照抄但未接通。主角创建测试明确失败于尚为占位的 `CActorInstance::SetRace`,继续接通仍需 RaceDataFile、RaceMotionData、AttributeInstance、角色注册和模型 adapter | + | 2V2-c | `PythonCharacterManager` + `chrmgr`/`chr` 模块:`playerSettingModule` 的种族/动作/特效注册走真实实现 | 完成:`PythonCharacterManagerModule.cpp`/`PythonCharacterModule.cpp` 原样移植,`GameplayModules.cpp` 的 `chr`/`chrmgr` 桩删除,`initchr()`/`initchrmgr()` 按 40250 顺序在 `initChat()` 前调用;注册链需要的 `RaceData`/`RaceDataFile`/`RaceManager`/`RaceMotionData`、`GameType`、`AttributeData`/`AttributeInstance`、`TextFileLoader`、`Util.cpp`(代码页/字体部分留在 platform 字体后端,port-map 标 ADAPTED/N_A)、`Camera`/`CameraProcedure` 原样移植(port-map 标 PORTED),`CRaceManager` 按 `CPythonApplication` 成员顺序在 `PythonBoot` 创建;`D3DXMath` 补 `D3DXVec2CCW`/`D3DXMatrixfDeterminant`/`D3DXMatrixLookAtRH`。`port.login_flow` 断言 `chr`/`chrmgr` 不是桩、种族 0 的 `MODE_GENERAL`/`NAME_WAIT` 动作已注册、Syserr 无“처리되지 않은 패킷 헤더”;`port.login_live` 2026-09-23 对 192.168.21.203 连跑 8 次通过、`script/port_gate.sh macos` PASS,怪物种族实例随真实 `SetRace` 创建。偶发(约 1/11)Loading 阶段报头 7 未处理(疑包长失步),测试现打印 `g_iLastPacket` 并判失败,未再复现 | + | 2V2-d | `InstanceBase` + `ActorInstance` + `CGraphicThingInstance` adapter:`GC_CHARACTER_ADD` 创建主角实例(msm 模型 + 待机动作) | 进行中:InstanceBase、InstanceBaseMovement、ActorInstance 已编译;`SetRace` 已走 `ActorInstanceData.cpp` 真实实现,种族注册链已接通(2V2-c)。主角 `TPacketGCCharacterAdditionalInfo` 仍报错:`CResourceManager` 没有 gr2 工厂,模型资源报 `NOT SUPPORT FILE`;下一步是 gr2 资源加载与 `CGraphicThing` 模型 adapter,并把 `pending/UserInterface/InstanceBase.cpp`、`pending/GameLib/ActorInstance.cpp` 的替身换成移植 | | 2V2-e | Godot 显示主角(渲染 adapter),离线 + 真服 smoke:进游戏看到可辨认的静止角色 | TODO | 4. **2V3 — 本地移动**:加入 `PythonPlayer`、`PythonPlayerInput*`、`PythonPlayerEventHandler`、 `InstanceBaseMovement`、`ActorInstance{Motion,Event,Position,Rotation,CollisionDetection}` 的实际依赖闭包。验收为输入经过新路径 diff --git a/extension/src/platform/EterLib/Camera.cpp b/extension/src/platform/EterLib/Camera.cpp deleted file mode 100644 index 9bb86ff7..00000000 --- a/extension/src/platform/EterLib/Camera.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#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/ScriptLib/GameplayModuleConstants.cpp b/extension/src/platform/ScriptLib/GameplayModuleConstants.cpp index e5e529d7..bd505cc1 100644 --- a/extension/src/platform/ScriptLib/GameplayModuleConstants.cpp +++ b/extension/src/platform/ScriptLib/GameplayModuleConstants.cpp @@ -75,229 +75,6 @@ void AddStubConstants_background(PyObject* poModule) PyModule_AddIntConstant(poModule, "TEXTURE_SORT", CMapOutdoor::TEXTURE_SORT); } -// 40250 UserInterface/PythonCharacterModule.cpp -void AddStubConstants_chr(PyObject* poModule) -{ - (void) poModule; - PyModule_AddIntConstant(poModule, "PLAYER_NAME_MAX_LEN", PLAYER_NAME_MAX_LEN); - PyModule_AddIntConstant(poModule, "MOTION_NONE", CRaceMotionData::NAME_NONE); - PyModule_AddIntConstant(poModule, "MOTION_SPAWN", CRaceMotionData::NAME_SPAWN); - PyModule_AddIntConstant(poModule, "MOTION_WAIT", CRaceMotionData::NAME_WAIT); - PyModule_AddIntConstant(poModule, "MOTION_WALK", CRaceMotionData::NAME_WALK); - PyModule_AddIntConstant(poModule, "MOTION_RUN", CRaceMotionData::NAME_RUN); - PyModule_AddIntConstant(poModule, "MOTION_CHANGE_WEAPON", CRaceMotionData::NAME_CHANGE_WEAPON); - PyModule_AddIntConstant(poModule, "MOTION_DAMAGE", CRaceMotionData::NAME_DAMAGE); - PyModule_AddIntConstant(poModule, "MOTION_DAMAGE_FLYING", CRaceMotionData::NAME_DAMAGE_FLYING); - PyModule_AddIntConstant(poModule, "MOTION_STAND_UP", CRaceMotionData::NAME_STAND_UP); - PyModule_AddIntConstant(poModule, "MOTION_DAMAGE_BACK", CRaceMotionData::NAME_DAMAGE_BACK); - PyModule_AddIntConstant(poModule, "MOTION_DAMAGE_FLYING_BACK", CRaceMotionData::NAME_DAMAGE_FLYING_BACK); - PyModule_AddIntConstant(poModule, "MOTION_STAND_UP_BACK", CRaceMotionData::NAME_STAND_UP_BACK); - PyModule_AddIntConstant(poModule, "MOTION_DEAD", CRaceMotionData::NAME_DEAD); - PyModule_AddIntConstant(poModule, "MOTION_DEAD_BACK", CRaceMotionData::NAME_DEAD_BACK); - PyModule_AddIntConstant(poModule, "MOTION_NORMAL_ATTACK", CRaceMotionData::NAME_NORMAL_ATTACK); - PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_1", CRaceMotionData::NAME_COMBO_ATTACK_1); - PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_2", CRaceMotionData::NAME_COMBO_ATTACK_2); - PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_3", CRaceMotionData::NAME_COMBO_ATTACK_3); - PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_4", CRaceMotionData::NAME_COMBO_ATTACK_4); - PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_5", CRaceMotionData::NAME_COMBO_ATTACK_5); - PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_6", CRaceMotionData::NAME_COMBO_ATTACK_6); - PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_7", CRaceMotionData::NAME_COMBO_ATTACK_7); - PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_8", CRaceMotionData::NAME_COMBO_ATTACK_8); - PyModule_AddIntConstant(poModule, "MOTION_INTRO_WAIT", CRaceMotionData::NAME_INTRO_WAIT); - PyModule_AddIntConstant(poModule, "MOTION_INTRO_SELECTED", CRaceMotionData::NAME_INTRO_SELECTED); - PyModule_AddIntConstant(poModule, "MOTION_INTRO_NOT_SELECTED", CRaceMotionData::NAME_INTRO_NOT_SELECTED); - PyModule_AddIntConstant(poModule, "MOTION_FISHING_THROW", CRaceMotionData::NAME_FISHING_THROW); - PyModule_AddIntConstant(poModule, "MOTION_FISHING_WAIT", CRaceMotionData::NAME_FISHING_WAIT); - PyModule_AddIntConstant(poModule, "MOTION_FISHING_STOP", CRaceMotionData::NAME_FISHING_STOP); - PyModule_AddIntConstant(poModule, "MOTION_FISHING_REACT", CRaceMotionData::NAME_FISHING_REACT); - PyModule_AddIntConstant(poModule, "MOTION_FISHING_CATCH", CRaceMotionData::NAME_FISHING_CATCH); - PyModule_AddIntConstant(poModule, "MOTION_FISHING_FAIL", CRaceMotionData::NAME_FISHING_FAIL); - PyModule_AddIntConstant(poModule, "MOTION_STOP", CRaceMotionData::NAME_STOP); - PyModule_AddIntConstant(poModule, "MOTION_SKILL", CRaceMotionData::NAME_SKILL); - PyModule_AddIntConstant(poModule, "MOTION_CLAP", CRaceMotionData::NAME_CLAP); - PyModule_AddIntConstant(poModule, "MOTION_DANCE_1", CRaceMotionData::NAME_DANCE_1); - PyModule_AddIntConstant(poModule, "MOTION_DANCE_2", CRaceMotionData::NAME_DANCE_2); - PyModule_AddIntConstant(poModule, "MOTION_DANCE_3", CRaceMotionData::NAME_DANCE_3); - PyModule_AddIntConstant(poModule, "MOTION_DANCE_4", CRaceMotionData::NAME_DANCE_4); - PyModule_AddIntConstant(poModule, "MOTION_DANCE_5", CRaceMotionData::NAME_DANCE_5); - PyModule_AddIntConstant(poModule, "MOTION_DANCE_6", CRaceMotionData::NAME_DANCE_6); - PyModule_AddIntConstant(poModule, "MOTION_CONGRATULATION", CRaceMotionData::NAME_CONGRATULATION); - PyModule_AddIntConstant(poModule, "MOTION_FORGIVE", CRaceMotionData::NAME_FORGIVE); - PyModule_AddIntConstant(poModule, "MOTION_ANGRY", CRaceMotionData::NAME_ANGRY); - PyModule_AddIntConstant(poModule, "MOTION_ATTRACTIVE", CRaceMotionData::NAME_ATTRACTIVE); - PyModule_AddIntConstant(poModule, "MOTION_SAD", CRaceMotionData::NAME_SAD); - PyModule_AddIntConstant(poModule, "MOTION_SHY", CRaceMotionData::NAME_SHY); - PyModule_AddIntConstant(poModule, "MOTION_CHEERUP", CRaceMotionData::NAME_CHEERUP); - PyModule_AddIntConstant(poModule, "MOTION_BANTER", CRaceMotionData::NAME_BANTER); - PyModule_AddIntConstant(poModule, "MOTION_JOY", CRaceMotionData::NAME_JOY); - PyModule_AddIntConstant(poModule, "MOTION_CHEERS_1", CRaceMotionData::NAME_CHEERS_1); - PyModule_AddIntConstant(poModule, "MOTION_CHEERS_2", CRaceMotionData::NAME_CHEERS_2); - PyModule_AddIntConstant(poModule, "MOTION_KISS_WITH_WARRIOR", CRaceMotionData::NAME_KISS_WITH_WARRIOR); - PyModule_AddIntConstant(poModule, "MOTION_KISS_WITH_ASSASSIN", CRaceMotionData::NAME_KISS_WITH_ASSASSIN); - PyModule_AddIntConstant(poModule, "MOTION_KISS_WITH_SURA", CRaceMotionData::NAME_KISS_WITH_SURA); - PyModule_AddIntConstant(poModule, "MOTION_KISS_WITH_SHAMAN", CRaceMotionData::NAME_KISS_WITH_SHAMAN); - PyModule_AddIntConstant(poModule, "MOTION_FRENCH_KISS_WITH_WARRIOR", CRaceMotionData::NAME_FRENCH_KISS_WITH_WARRIOR); - PyModule_AddIntConstant(poModule, "MOTION_FRENCH_KISS_WITH_ASSASSIN", CRaceMotionData::NAME_FRENCH_KISS_WITH_ASSASSIN); - PyModule_AddIntConstant(poModule, "MOTION_FRENCH_KISS_WITH_SURA", CRaceMotionData::NAME_FRENCH_KISS_WITH_SURA); - PyModule_AddIntConstant(poModule, "MOTION_FRENCH_KISS_WITH_SHAMAN", CRaceMotionData::NAME_FRENCH_KISS_WITH_SHAMAN); - PyModule_AddIntConstant(poModule, "MOTION_SLAP_HIT_WITH_WARRIOR", CRaceMotionData::NAME_SLAP_HIT_WITH_WARRIOR); - PyModule_AddIntConstant(poModule, "MOTION_SLAP_HIT_WITH_ASSASSIN", CRaceMotionData::NAME_SLAP_HIT_WITH_ASSASSIN); - PyModule_AddIntConstant(poModule, "MOTION_SLAP_HIT_WITH_SURA", CRaceMotionData::NAME_SLAP_HIT_WITH_SURA); - PyModule_AddIntConstant(poModule, "MOTION_SLAP_HIT_WITH_SHAMAN", CRaceMotionData::NAME_SLAP_HIT_WITH_SHAMAN); - PyModule_AddIntConstant(poModule, "MOTION_SLAP_HURT_WITH_WARRIOR", CRaceMotionData::NAME_SLAP_HURT_WITH_WARRIOR); - PyModule_AddIntConstant(poModule, "MOTION_SLAP_HURT_WITH_ASSASSIN", CRaceMotionData::NAME_SLAP_HURT_WITH_ASSASSIN); - PyModule_AddIntConstant(poModule, "MOTION_SLAP_HURT_WITH_SURA", CRaceMotionData::NAME_SLAP_HURT_WITH_SURA); - PyModule_AddIntConstant(poModule, "MOTION_SLAP_HURT_WITH_SHAMAN", CRaceMotionData::NAME_SLAP_HURT_WITH_SHAMAN); - PyModule_AddIntConstant(poModule, "MOTION_DIG", CRaceMotionData::NAME_DIG); - PyModule_AddIntConstant(poModule, "MOTION_MODE_RESERVED", CRaceMotionData::MODE_RESERVED); - PyModule_AddIntConstant(poModule, "MOTION_MODE_GENERAL", CRaceMotionData::MODE_GENERAL); - PyModule_AddIntConstant(poModule, "MOTION_MODE_ONEHAND_SWORD", CRaceMotionData::MODE_ONEHAND_SWORD); - PyModule_AddIntConstant(poModule, "MOTION_MODE_TWOHAND_SWORD", CRaceMotionData::MODE_TWOHAND_SWORD); - PyModule_AddIntConstant(poModule, "MOTION_MODE_DUALHAND_SWORD", CRaceMotionData::MODE_DUALHAND_SWORD); - PyModule_AddIntConstant(poModule, "MOTION_MODE_BOW", CRaceMotionData::MODE_BOW); - PyModule_AddIntConstant(poModule, "MOTION_MODE_FAN", CRaceMotionData::MODE_FAN); - PyModule_AddIntConstant(poModule, "MOTION_MODE_BELL", CRaceMotionData::MODE_BELL); - PyModule_AddIntConstant(poModule, "MOTION_MODE_FISHING", CRaceMotionData::MODE_FISHING); - PyModule_AddIntConstant(poModule, "MOTION_MODE_HORSE", CRaceMotionData::MODE_HORSE); - PyModule_AddIntConstant(poModule, "MOTION_MODE_HORSE_ONEHAND_SWORD", CRaceMotionData::MODE_HORSE_ONEHAND_SWORD); - PyModule_AddIntConstant(poModule, "MOTION_MODE_HORSE_TWOHAND_SWORD", CRaceMotionData::MODE_HORSE_TWOHAND_SWORD); - PyModule_AddIntConstant(poModule, "MOTION_MODE_HORSE_DUALHAND_SWORD", CRaceMotionData::MODE_HORSE_DUALHAND_SWORD); - PyModule_AddIntConstant(poModule, "MOTION_MODE_HORSE_BOW", CRaceMotionData::MODE_HORSE_BOW); - PyModule_AddIntConstant(poModule, "MOTION_MODE_HORSE_FAN", CRaceMotionData::MODE_HORSE_FAN); - PyModule_AddIntConstant(poModule, "MOTION_MODE_HORSE_BELL", CRaceMotionData::MODE_HORSE_BELL); - PyModule_AddIntConstant(poModule, "MOTION_MODE_WEDDING_DRESS", CRaceMotionData::MODE_WEDDING_DRESS); - PyModule_AddIntConstant(poModule, "DIR_NORTH", CInstanceBase::DIR_NORTH); - PyModule_AddIntConstant(poModule, "DIR_NORTHEAST", CInstanceBase::DIR_NORTHEAST); - PyModule_AddIntConstant(poModule, "DIR_EAST", CInstanceBase::DIR_EAST); - PyModule_AddIntConstant(poModule, "DIR_SOUTHEAST", CInstanceBase::DIR_SOUTHEAST); - PyModule_AddIntConstant(poModule, "DIR_SOUTH", CInstanceBase::DIR_SOUTH); - PyModule_AddIntConstant(poModule, "DIR_SOUTHWEST", CInstanceBase::DIR_SOUTHWEST); - PyModule_AddIntConstant(poModule, "DIR_WEST", CInstanceBase::DIR_WEST); - PyModule_AddIntConstant(poModule, "DIR_NORTHWEST", CInstanceBase::DIR_NORTHWEST); - PyModule_AddIntConstant(poModule, "INSTANCE_TYPE_PLAYER", CActorInstance::TYPE_PC); - PyModule_AddIntConstant(poModule, "INSTANCE_TYPE_NPC", CActorInstance::TYPE_NPC); - PyModule_AddIntConstant(poModule, "INSTANCE_TYPE_ENEMY", CActorInstance::TYPE_ENEMY); - PyModule_AddIntConstant(poModule, "INSTANCE_TYPE_BUILDING", CActorInstance::TYPE_BUILDING); - PyModule_AddIntConstant(poModule, "INSTANCE_TYPE_OBJECT", CActorInstance::TYPE_OBJECT); - PyModule_AddIntConstant(poModule, "PART_WEAPON", CRaceData::PART_WEAPON); - PyModule_AddIntConstant(poModule, "PART_HEAD", CRaceData::PART_HEAD); - PyModule_AddIntConstant(poModule, "PART_WEAPON_LEFT", CRaceData::PART_WEAPON_LEFT); - PyModule_AddIntConstant(poModule, "AFFECT_POISON", CInstanceBase::AFFECT_POISON); - PyModule_AddIntConstant(poModule, "AFFECT_SLOW", CInstanceBase::AFFECT_SLOW); - PyModule_AddIntConstant(poModule, "AFFECT_STUN", CInstanceBase::AFFECT_STUN); - PyModule_AddIntConstant(poModule, "AFFECT_MOV_SPEED_POTION", CInstanceBase::AFFECT_MOV_SPEED_POTION); - PyModule_AddIntConstant(poModule, "AFFECT_ATT_SPEED_POTION", CInstanceBase::AFFECT_ATT_SPEED_POTION); - PyModule_AddIntConstant(poModule, "AFFECT_FISH_MIND", CInstanceBase::AFFECT_FISH_MIND); - PyModule_AddIntConstant(poModule, "AFFECT_JEONGWI", CInstanceBase::AFFECT_JEONGWI); - PyModule_AddIntConstant(poModule, "AFFECT_GEOMGYEONG", CInstanceBase::AFFECT_GEOMGYEONG); - PyModule_AddIntConstant(poModule, "AFFECT_CHEONGEUN", CInstanceBase::AFFECT_CHEONGEUN); - PyModule_AddIntConstant(poModule, "AFFECT_GYEONGGONG", CInstanceBase::AFFECT_GYEONGGONG); - PyModule_AddIntConstant(poModule, "AFFECT_EUNHYEONG", CInstanceBase::AFFECT_EUNHYEONG); - PyModule_AddIntConstant(poModule, "AFFECT_GWIGEOM", CInstanceBase::AFFECT_GWIGEOM); - PyModule_AddIntConstant(poModule, "AFFECT_GONGPO", CInstanceBase::AFFECT_GONGPO); - PyModule_AddIntConstant(poModule, "AFFECT_JUMAGAP", CInstanceBase::AFFECT_JUMAGAP); - PyModule_AddIntConstant(poModule, "AFFECT_HOSIN", CInstanceBase::AFFECT_HOSIN); - PyModule_AddIntConstant(poModule, "AFFECT_BOHO", CInstanceBase::AFFECT_BOHO); - PyModule_AddIntConstant(poModule, "AFFECT_KWAESOK", CInstanceBase::AFFECT_KWAESOK); - PyModule_AddIntConstant(poModule, "AFFECT_HEUKSIN", CInstanceBase::AFFECT_HEUKSIN); - PyModule_AddIntConstant(poModule, "AFFECT_MUYEONG", CInstanceBase::AFFECT_MUYEONG); - PyModule_AddIntConstant(poModule, "AFFECT_GICHEON", CInstanceBase::AFFECT_GICHEON); - PyModule_AddIntConstant(poModule, "AFFECT_JEUNGRYEOK", CInstanceBase::AFFECT_JEUNGRYEOK); - PyModule_AddIntConstant(poModule, "AFFECT_PABEOP", CInstanceBase::AFFECT_PABEOP); - PyModule_AddIntConstant(poModule, "AFFECT_FALLEN_CHEONGEUN", CInstanceBase::AFFECT_FALLEN_CHEONGEUN); - PyModule_AddIntConstant(poModule, "AFFECT_CHINA_FIREWORK", CInstanceBase::AFFECT_CHINA_FIREWORK); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_MALL", CInstanceBase::NEW_AFFECT_MALL); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_NO_DEATH_PENALTY", CInstanceBase::NEW_AFFECT_NO_DEATH_PENALTY); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_SKILL_BOOK_BONUS", CInstanceBase::NEW_AFFECT_SKILL_BOOK_BONUS); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_SKILL_BOOK_NO_DELAY", CInstanceBase::NEW_AFFECT_SKILL_BOOK_NO_DELAY); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_EXP_BONUS", CInstanceBase::NEW_AFFECT_EXP_BONUS); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_EXP_BONUS_EURO_FREE", CInstanceBase::NEW_AFFECT_EXP_BONUS_EURO_FREE); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_EXP_BONUS_EURO_FREE_UNDER_15",CInstanceBase::NEW_AFFECT_EXP_BONUS_EURO_FREE_UNDER_15); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_ITEM_BONUS", CInstanceBase::NEW_AFFECT_ITEM_BONUS); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_SAFEBOX", CInstanceBase::NEW_AFFECT_SAFEBOX); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_AUTOLOOT", CInstanceBase::NEW_AFFECT_AUTOLOOT); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_FISH_MIND", CInstanceBase::NEW_AFFECT_FISH_MIND); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_MARRIAGE_FAST", CInstanceBase::NEW_AFFECT_MARRIAGE_FAST); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_GOLD_BONUS", CInstanceBase::NEW_AFFECT_GOLD_BONUS); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_AUTO_HP_RECOVERY", CInstanceBase::NEW_AFFECT_AUTO_HP_RECOVERY); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_AUTO_SP_RECOVERY", CInstanceBase::NEW_AFFECT_AUTO_SP_RECOVERY); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_DRAGON_SOUL_QUALIFIED", CInstanceBase::NEW_AFFECT_DRAGON_SOUL_QUALIFIED); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_DRAGON_SOUL_DECK1", CInstanceBase::NEW_AFFECT_DRAGON_SOUL_DECK1); - PyModule_AddIntConstant(poModule, "NEW_AFFECT_DRAGON_SOUL_DECK2", CInstanceBase::NEW_AFFECT_DRAGON_SOUL_DECK2); -} - -// 40250 UserInterface/PythonCharacterManagerModule.cpp -void AddStubConstants_chrmgr(PyObject* poModule) -{ - (void) poModule; - PyModule_AddIntConstant(poModule, "NAMECOLOR_MOB", CInstanceBase::NAMECOLOR_NORMAL_MOB); - PyModule_AddIntConstant(poModule, "NAMECOLOR_NPC", CInstanceBase::NAMECOLOR_NORMAL_NPC); - PyModule_AddIntConstant(poModule, "NAMECOLOR_PC", CInstanceBase::NAMECOLOR_NORMAL_PC); - PyModule_AddIntConstant(poModule, "NAMECOLOR_EMPIRE_MOB", CInstanceBase::NAMECOLOR_EMPIRE_MOB); - PyModule_AddIntConstant(poModule, "NAMECOLOR_EMPIRE_NPC", CInstanceBase::NAMECOLOR_EMPIRE_NPC); - PyModule_AddIntConstant(poModule, "NAMECOLOR_EMPIRE_PC", CInstanceBase::NAMECOLOR_EMPIRE_PC); - PyModule_AddIntConstant(poModule, "NAMECOLOR_FUNC", CInstanceBase::NAMECOLOR_FUNC); - PyModule_AddIntConstant(poModule, "NAMECOLOR_PK", CInstanceBase::NAMECOLOR_PK); - PyModule_AddIntConstant(poModule, "NAMECOLOR_PVP", CInstanceBase::NAMECOLOR_PVP); - PyModule_AddIntConstant(poModule, "NAMECOLOR_PARTY", CInstanceBase::NAMECOLOR_PARTY); - PyModule_AddIntConstant(poModule, "NAMECOLOR_WARP", CInstanceBase::NAMECOLOR_WARP); - PyModule_AddIntConstant(poModule, "NAMECOLOR_WAYPOINT", CInstanceBase::NAMECOLOR_WAYPOINT); - PyModule_AddIntConstant(poModule, "NAMECOLOR_EXTRA", CInstanceBase::NAMECOLOR_EXTRA); - PyModule_AddIntConstant(poModule, "EFFECT_SPAWN_DISAPPEAR", CInstanceBase::EFFECT_SPAWN_DISAPPEAR); - PyModule_AddIntConstant(poModule, "EFFECT_SPAWN_APPEAR", CInstanceBase::EFFECT_SPAWN_APPEAR); - PyModule_AddIntConstant(poModule, "EFFECT_DUST", CInstanceBase::EFFECT_DUST); - PyModule_AddIntConstant(poModule, "EFFECT_HORSE_DUST", CInstanceBase::EFFECT_HORSE_DUST); - PyModule_AddIntConstant(poModule, "EFFECT_STUN", CInstanceBase::EFFECT_STUN); - PyModule_AddIntConstant(poModule, "EFFECT_HIT", CInstanceBase::EFFECT_HIT); - PyModule_AddIntConstant(poModule, "EFFECT_FLAME_ATTACK", CInstanceBase::EFFECT_FLAME_ATTACK); - PyModule_AddIntConstant(poModule, "EFFECT_FLAME_HIT", CInstanceBase::EFFECT_FLAME_HIT); - PyModule_AddIntConstant(poModule, "EFFECT_FLAME_ATTACH", CInstanceBase::EFFECT_FLAME_ATTACH); - PyModule_AddIntConstant(poModule, "EFFECT_ELECTRIC_ATTACK", CInstanceBase::EFFECT_ELECTRIC_ATTACK); - PyModule_AddIntConstant(poModule, "EFFECT_ELECTRIC_HIT", CInstanceBase::EFFECT_ELECTRIC_HIT); - PyModule_AddIntConstant(poModule, "EFFECT_ELECTRIC_ATTACH", CInstanceBase::EFFECT_ELECTRIC_ATTACH); - PyModule_AddIntConstant(poModule, "EFFECT_SELECT", CInstanceBase::EFFECT_SELECT); - PyModule_AddIntConstant(poModule, "EFFECT_TARGET", CInstanceBase::EFFECT_TARGET); - PyModule_AddIntConstant(poModule, "EFFECT_CRITICAL", CInstanceBase::EFFECT_CRITICAL); - PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_TARGET", CInstanceBase::EFFECT_DAMAGE_TARGET); - PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_NOT_TARGET", CInstanceBase::EFFECT_DAMAGE_NOT_TARGET); - PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_SELFDAMAGE", CInstanceBase::EFFECT_DAMAGE_SELFDAMAGE); - PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_SELFDAMAGE2", CInstanceBase::EFFECT_DAMAGE_SELFDAMAGE2); - PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_POISON", CInstanceBase::EFFECT_DAMAGE_POISON); - PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_MISS", CInstanceBase::EFFECT_DAMAGE_MISS); - PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_TARGETMISS", CInstanceBase::EFFECT_DAMAGE_TARGETMISS); - PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_CRITICAL", CInstanceBase::EFFECT_DAMAGE_CRITICAL); - PyModule_AddIntConstant(poModule, "EFFECT_LEVELUP", CInstanceBase::EFFECT_LEVELUP); - PyModule_AddIntConstant(poModule, "EFFECT_SKILLUP", CInstanceBase::EFFECT_SKILLUP); - PyModule_AddIntConstant(poModule, "EFFECT_HPUP_RED", CInstanceBase::EFFECT_HPUP_RED); - PyModule_AddIntConstant(poModule, "EFFECT_SPUP_BLUE", CInstanceBase::EFFECT_SPUP_BLUE); - PyModule_AddIntConstant(poModule, "EFFECT_SPEEDUP_GREEN", CInstanceBase::EFFECT_SPEEDUP_GREEN); - PyModule_AddIntConstant(poModule, "EFFECT_DXUP_PURPLE", CInstanceBase::EFFECT_DXUP_PURPLE); - PyModule_AddIntConstant(poModule, "EFFECT_PENETRATE", CInstanceBase::EFFECT_PENETRATE); - PyModule_AddIntConstant(poModule, "EFFECT_BLOCK", CInstanceBase::EFFECT_BLOCK); - PyModule_AddIntConstant(poModule, "EFFECT_DODGE", CInstanceBase::EFFECT_DODGE); - PyModule_AddIntConstant(poModule, "EFFECT_FIRECRACKER", CInstanceBase::EFFECT_FIRECRACKER); - PyModule_AddIntConstant(poModule, "EFFECT_SPIN_TOP", CInstanceBase::EFFECT_SPIN_TOP); - PyModule_AddIntConstant(poModule, "EFFECT_WEAPON", CInstanceBase::EFFECT_WEAPON); - PyModule_AddIntConstant(poModule, "EFFECT_AFFECT", CInstanceBase::EFFECT_AFFECT); - PyModule_AddIntConstant(poModule, "EFFECT_EMOTICON", CInstanceBase::EFFECT_EMOTICON); - PyModule_AddIntConstant(poModule, "EFFECT_EMPIRE", CInstanceBase::EFFECT_EMPIRE); - PyModule_AddIntConstant(poModule, "EFFECT_REFINED", CInstanceBase::EFFECT_REFINED); - PyModule_AddIntConstant(poModule, "EFFECT_SUCCESS", CInstanceBase::EFFECT_SUCCESS) ; - PyModule_AddIntConstant(poModule, "EFFECT_FAIL", CInstanceBase::EFFECT_FAIL) ; - PyModule_AddIntConstant(poModule, "EFFECT_FR_SUCCESS", CInstanceBase::EFFECT_FR_SUCCESS) ; - PyModule_AddIntConstant(poModule, "EFFECT_LEVELUP_ON_14_FOR_GERMANY", CInstanceBase::EFFECT_LEVELUP_ON_14_FOR_GERMANY ); //레벨업 14일때 ( 독일전용 ) - PyModule_AddIntConstant(poModule, "EFFECT_LEVELUP_UNDER_15_FOR_GERMANY", CInstanceBase::EFFECT_LEVELUP_UNDER_15_FOR_GERMANY );//레벨업 15일때 ( 독일전용 ) - PyModule_AddIntConstant(poModule, "EFFECT_PERCENT_DAMAGE1", CInstanceBase::EFFECT_PERCENT_DAMAGE1); - PyModule_AddIntConstant(poModule, "EFFECT_PERCENT_DAMAGE2", CInstanceBase::EFFECT_PERCENT_DAMAGE2); - PyModule_AddIntConstant(poModule, "EFFECT_PERCENT_DAMAGE3", CInstanceBase::EFFECT_PERCENT_DAMAGE3); - PyModule_AddIntConstant(poModule, "EFFECT_AUTO_HPUP", CInstanceBase::EFFECT_AUTO_HPUP); - PyModule_AddIntConstant(poModule, "EFFECT_AUTO_SPUP", CInstanceBase::EFFECT_AUTO_SPUP); - PyModule_AddIntConstant(poModule, "EFFECT_RAMADAN_RING_EQUIP", CInstanceBase::EFFECT_RAMADAN_RING_EQUIP); - PyModule_AddIntConstant(poModule, "EFFECT_HALLOWEEN_CANDY_EQUIP", CInstanceBase::EFFECT_HALLOWEEN_CANDY_EQUIP); - PyModule_AddIntConstant(poModule, "EFFECT_HAPPINESS_RING_EQUIP", CInstanceBase::EFFECT_HAPPINESS_RING_EQUIP); - PyModule_AddIntConstant(poModule, "EFFECT_LOVE_PENDANT_EQUIP", CInstanceBase::EFFECT_LOVE_PENDANT_EQUIP); -} - // 40250 UserInterface/PythonEffectModule.cpp enum { diff --git a/extension/src/platform/ScriptLib/GameplayModules.cpp b/extension/src/platform/ScriptLib/GameplayModules.cpp index c8835b23..730d71f4 100644 --- a/extension/src/platform/ScriptLib/GameplayModules.cpp +++ b/extension/src/platform/ScriptLib/GameplayModules.cpp @@ -7,8 +7,6 @@ // GameplayModuleConstants.cpp: each module's 40250 constants. void AddStubConstants_ServerStateChecker(PyObject* poModule); void AddStubConstants_background(PyObject* poModule); -void AddStubConstants_chr(PyObject* poModule); -void AddStubConstants_chrmgr(PyObject* poModule); void AddStubConstants_effect(PyObject* poModule); void AddStubConstants_event(PyObject* poModule); void AddStubConstants_eventMgr(PyObject* poModule); @@ -153,244 +151,6 @@ PyMethodDef methods_background[] = { { "WarpTest", stub_background_WarpTest, METH_VARARGS }, { NULL, NULL } }; -// 40250 UserInterface/PythonCharacterModule.cpp: chr export names. -PyObject* stub_chr_DismountHorse(PyObject*, PyObject*) { return stub_call_named("chr.DismountHorse", Py_BuildNone()); } -PyObject* stub_chr_MountHorse(PyObject*, PyObject*) { return stub_call_named("chr.MountHorse", Py_BuildNone()); } -PyObject* stub_chr_Destroy(PyObject*, PyObject*) { return stub_call_named("chr.Destroy", Py_BuildNone()); } -PyObject* stub_chr_Update(PyObject*, PyObject*) { return stub_call_named("chr.Update", Py_BuildNone()); } -PyObject* stub_chr_Deform(PyObject*, PyObject*) { return stub_call_named("chr.Deform", Py_BuildNone()); } -PyObject* stub_chr_Render(PyObject*, PyObject*) { return stub_call_named("chr.Render", Py_BuildNone()); } -PyObject* stub_chr_RenderCollision(PyObject*, PyObject*) { return stub_call_named("chr.RenderCollision", Py_BuildNone()); } -PyObject* stub_chr_CreateInstance(PyObject*, PyObject*) { return stub_call_named("chr.CreateInstance", Py_BuildNone()); } -PyObject* stub_chr_DeleteInstance(PyObject*, PyObject*) { return stub_call_named("chr.DeleteInstance", Py_BuildNone()); } -PyObject* stub_chr_DeleteInstanceByFade(PyObject*, PyObject*) { return stub_call_named("chr.DeleteInstanceByFade", Py_BuildNone()); } -PyObject* stub_chr_SelectInstance(PyObject*, PyObject*) { return stub_call_named("chr.SelectInstance", Py_BuildNone()); } -PyObject* stub_chr_HasInstance(PyObject*, PyObject*) { return stub_call_named("chr.HasInstance", Py_BuildValue("i", 0)); } -PyObject* stub_chr_IsEnemy(PyObject*, PyObject*) { return stub_call_named("chr.IsEnemy", Py_BuildValue("i", 0)); } -PyObject* stub_chr_IsNPC(PyObject*, PyObject*) { return stub_call_named("chr.IsNPC", Py_BuildValue("i", 0)); } -PyObject* stub_chr_IsGameMaster(PyObject*, PyObject*) { return stub_call_named("chr.IsGameMaster", Py_BuildValue("i", 0)); } -PyObject* stub_chr_IsPartyMember(PyObject*, PyObject*) { return stub_call_named("chr.IsPartyMember", Py_BuildValue("i", 0)); } -PyObject* stub_chr_Select(PyObject*, PyObject*) { return stub_call_named("chr.Select", Py_BuildNone()); } -PyObject* stub_chr_SetAddRenderMode(PyObject*, PyObject*) { return stub_call_named("chr.SetAddRenderMode", Py_BuildNone()); } -PyObject* stub_chr_SetBlendRenderMode(PyObject*, PyObject*) { return stub_call_named("chr.SetBlendRenderMode", Py_BuildNone()); } -PyObject* stub_chr_Unselect(PyObject*, PyObject*) { return stub_call_named("chr.Unselect", Py_BuildNone()); } -PyObject* stub_chr_Hide(PyObject*, PyObject*) { return stub_call_named("chr.Hide", Py_BuildNone()); } -PyObject* stub_chr_Show(PyObject*, PyObject*) { return stub_call_named("chr.Show", Py_BuildNone()); } -PyObject* stub_chr_Pick(PyObject*, PyObject*) { return stub_call_named("chr.Pick", Py_BuildValue("i", 0)); } -PyObject* stub_chr_PickAll(PyObject*, PyObject*) { return stub_call_named("chr.PickAll", Py_BuildValue("i", 0)); } -PyObject* stub_chr_SetArmor(PyObject*, PyObject*) { return stub_call_named("chr.SetArmor", Py_BuildNone()); } -PyObject* stub_chr_SetWeapon(PyObject*, PyObject*) { return stub_call_named("chr.SetWeapon", Py_BuildNone()); } -PyObject* stub_chr_ChangeShape(PyObject*, PyObject*) { return stub_call_named("chr.ChangeShape", Py_BuildNone()); } -PyObject* stub_chr_SetRace(PyObject*, PyObject*) { return stub_call_named("chr.SetRace", Py_BuildNone()); } -PyObject* stub_chr_SetHair(PyObject*, PyObject*) { return stub_call_named("chr.SetHair", Py_BuildNone()); } -PyObject* stub_chr_ChangeHair(PyObject*, PyObject*) { return stub_call_named("chr.ChangeHair", Py_BuildNone()); } -PyObject* stub_chr_SetVirtualID(PyObject*, PyObject*) { return stub_call_named("chr.SetVirtualID", Py_BuildNone()); } -PyObject* stub_chr_SetNameString(PyObject*, PyObject*) { return stub_call_named("chr.SetNameString", Py_BuildNone()); } -PyObject* stub_chr_SetInstanceType(PyObject*, PyObject*) { return stub_call_named("chr.SetInstanceType", Py_BuildNone()); } -PyObject* stub_chr_SetPixelPosition(PyObject*, PyObject*) { return stub_call_named("chr.SetPixelPosition", Py_BuildNone()); } -PyObject* stub_chr_SetDirection(PyObject*, PyObject*) { return stub_call_named("chr.SetDirection", Py_BuildNone()); } -PyObject* stub_chr_Refresh(PyObject*, PyObject*) { return stub_call_named("chr.Refresh", Py_BuildNone()); } -PyObject* stub_chr_Revive(PyObject*, PyObject*) { return stub_call_named("chr.Revive", Py_BuildNone()); } -PyObject* stub_chr_Die(PyObject*, PyObject*) { return stub_call_named("chr.Die", Py_BuildNone()); } -PyObject* stub_chr_AttachEffectByID(PyObject*, PyObject*) { return stub_call_named("chr.AttachEffectByID", Py_BuildNone()); } -PyObject* stub_chr_AttachEffectByName(PyObject*, PyObject*) { return stub_call_named("chr.AttachEffectByName", Py_BuildNone()); } -PyObject* stub_chr_LookAt(PyObject*, PyObject*) { return stub_call_named("chr.LookAt", Py_BuildNone()); } -PyObject* stub_chr_SetMotionMode(PyObject*, PyObject*) { return stub_call_named("chr.SetMotionMode", Py_BuildNone()); } -PyObject* stub_chr_SetLoopMotion(PyObject*, PyObject*) { return stub_call_named("chr.SetLoopMotion", Py_BuildNone()); } -PyObject* stub_chr_BlendLoopMotion(PyObject*, PyObject*) { return stub_call_named("chr.BlendLoopMotion", Py_BuildNone()); } -PyObject* stub_chr_PushOnceMotion(PyObject*, PyObject*) { return stub_call_named("chr.PushOnceMotion", Py_BuildNone()); } -PyObject* stub_chr_PushLoopMotion(PyObject*, PyObject*) { return stub_call_named("chr.PushLoopMotion", Py_BuildNone()); } -PyObject* stub_chr_GetPixelPosition(PyObject*, PyObject*) { return stub_call_named("chr.GetPixelPosition", Py_BuildValue("fff", 0.0, 0.0, 0.0)); } -PyObject* stub_chr_SetRotation(PyObject*, PyObject*) { return stub_call_named("chr.SetRotation", Py_BuildNone()); } -PyObject* stub_chr_SetRotationAll(PyObject*, PyObject*) { return stub_call_named("chr.SetRotationAll", Py_BuildNone()); } -PyObject* stub_chr_BlendRotation(PyObject*, PyObject*) { return stub_call_named("chr.BlendRotation", Py_BuildNone()); } -PyObject* stub_chr_GetRotation(PyObject*, PyObject*) { return stub_call_named("chr.GetRotation", Py_BuildValue("f", 0.0)); } -PyObject* stub_chr_GetRace(PyObject*, PyObject*) { return stub_call_named("chr.GetRace", Py_BuildValue("i", 0)); } -PyObject* stub_chr_GetName(PyObject*, PyObject*) { return stub_call_named("chr.GetName", Py_BuildValue("s", "")); } -PyObject* stub_chr_GetNameByVID(PyObject*, PyObject*) { return stub_call_named("chr.GetNameByVID", Py_BuildValue("s", "")); } -PyObject* stub_chr_GetGuildID(PyObject*, PyObject*) { return stub_call_named("chr.GetGuildID", Py_BuildValue("i", 0)); } -PyObject* stub_chr_GetProjectPosition(PyObject*, PyObject*) { return stub_call_named("chr.GetProjectPosition", Py_BuildValue("ii", 0, 0)); } -PyObject* stub_chr_GetVirtualNumber(PyObject*, PyObject*) { return stub_call_named("chr.GetVirtualNumber", Py_BuildValue("i", 0)); } -PyObject* stub_chr_GetInstanceType(PyObject*, PyObject*) { return stub_call_named("chr.GetInstanceType", Py_BuildValue("i", 0)); } -PyObject* stub_chr_GetBoundBoxOnlyXY(PyObject*, PyObject*) { return stub_call_named("chr.GetBoundBoxOnlyXY", Py_BuildValue("ffff", 0.0, 0.0, 0.0, 0.0)); } -PyObject* stub_chr_RaceToJob(PyObject*, PyObject*) { return stub_call_named("chr.RaceToJob", Py_BuildValue("i", 0)); } -PyObject* stub_chr_RaceToSex(PyObject*, PyObject*) { return stub_call_named("chr.RaceToSex", Py_BuildValue("i", 0)); } -PyObject* stub_chr_testGetPKData(PyObject*, PyObject*) { return stub_call_named("chr.testGetPKData", Py_BuildValue("ii", 0, 0)); } -PyObject* stub_chr_FaintTest(PyObject*, PyObject*) { return stub_call_named("chr.FaintTest", Py_BuildNone()); } -PyObject* stub_chr_SetMoveSpeed(PyObject*, PyObject*) { return stub_call_named("chr.SetMoveSpeed", Py_BuildNone()); } -PyObject* stub_chr_SetAttackSpeed(PyObject*, PyObject*) { return stub_call_named("chr.SetAttackSpeed", Py_BuildNone()); } -PyObject* stub_chr_WeaponTraceSetTexture(PyObject*, PyObject*) { return stub_call_named("chr.WeaponTraceSetTexture", Py_BuildNone()); } -PyObject* stub_chr_WeaponTraceUseAlpha(PyObject*, PyObject*) { return stub_call_named("chr.WeaponTraceUseAlpha", Py_BuildNone()); } -PyObject* stub_chr_WeaponTraceUseTexture(PyObject*, PyObject*) { return stub_call_named("chr.WeaponTraceUseTexture", Py_BuildNone()); } -PyObject* stub_chr_MoveToDestPosition(PyObject*, PyObject*) { return stub_call_named("chr.MoveToDestPosition", Py_BuildNone()); } -PyObject* stub_chr_testSetComboType(PyObject*, PyObject*) { return stub_call_named("chr.testSetComboType", Py_BuildNone()); } -PyObject* stub_chr_testSetAddRenderMode(PyObject*, PyObject*) { return stub_call_named("chr.testSetAddRenderMode", Py_BuildNone()); } -PyObject* stub_chr_testSetModulateRenderMode(PyObject*, PyObject*) { return stub_call_named("chr.testSetModulateRenderMode", Py_BuildNone()); } -PyObject* stub_chr_testSetAddRenderModeRGB(PyObject*, PyObject*) { return stub_call_named("chr.testSetAddRenderModeRGB", Py_BuildNone()); } -PyObject* stub_chr_testSetModulateRenderModeRGB(PyObject*, PyObject*) { return stub_call_named("chr.testSetModulateRenderModeRGB", Py_BuildNone()); } -PyObject* stub_chr_testSetSpecularRenderMode(PyObject*, PyObject*) { return stub_call_named("chr.testSetSpecularRenderMode", Py_BuildNone()); } -PyObject* stub_chr_testSetSpecularRenderMode2(PyObject*, PyObject*) { return stub_call_named("chr.testSetSpecularRenderMode2", Py_BuildNone()); } -PyObject* stub_chr_testRestoreRenderMode(PyObject*, PyObject*) { return stub_call_named("chr.testRestoreRenderMode", Py_BuildNone()); } -PyObject* stub_chr_testSetRideMan(PyObject*, PyObject*) { return stub_call_named("chr.testSetRideMan", Py_BuildNone()); } -PyMethodDef methods_chr[] = { - { "DismountHorse", stub_chr_DismountHorse, METH_VARARGS }, - { "MountHorse", stub_chr_MountHorse, METH_VARARGS }, - { "Destroy", stub_chr_Destroy, METH_VARARGS }, - { "Update", stub_chr_Update, METH_VARARGS }, - { "Deform", stub_chr_Deform, METH_VARARGS }, - { "Render", stub_chr_Render, METH_VARARGS }, - { "RenderCollision", stub_chr_RenderCollision, METH_VARARGS }, - { "CreateInstance", stub_chr_CreateInstance, METH_VARARGS }, - { "DeleteInstance", stub_chr_DeleteInstance, METH_VARARGS }, - { "DeleteInstanceByFade", stub_chr_DeleteInstanceByFade, METH_VARARGS }, - { "SelectInstance", stub_chr_SelectInstance, METH_VARARGS }, - { "HasInstance", stub_chr_HasInstance, METH_VARARGS }, - { "IsEnemy", stub_chr_IsEnemy, METH_VARARGS }, - { "IsNPC", stub_chr_IsNPC, METH_VARARGS }, - { "IsGameMaster", stub_chr_IsGameMaster, METH_VARARGS }, - { "IsPartyMember", stub_chr_IsPartyMember, METH_VARARGS }, - { "Select", stub_chr_Select, METH_VARARGS }, - { "SetAddRenderMode", stub_chr_SetAddRenderMode, METH_VARARGS }, - { "SetBlendRenderMode", stub_chr_SetBlendRenderMode, METH_VARARGS }, - { "Unselect", stub_chr_Unselect, METH_VARARGS }, - { "Hide", stub_chr_Hide, METH_VARARGS }, - { "Show", stub_chr_Show, METH_VARARGS }, - { "Pick", stub_chr_Pick, METH_VARARGS }, - { "PickAll", stub_chr_PickAll, METH_VARARGS }, - { "SetArmor", stub_chr_SetArmor, METH_VARARGS }, - { "SetWeapon", stub_chr_SetWeapon, METH_VARARGS }, - { "ChangeShape", stub_chr_ChangeShape, METH_VARARGS }, - { "SetRace", stub_chr_SetRace, METH_VARARGS }, - { "SetHair", stub_chr_SetHair, METH_VARARGS }, - { "ChangeHair", stub_chr_ChangeHair, METH_VARARGS }, - { "SetVirtualID", stub_chr_SetVirtualID, METH_VARARGS }, - { "SetNameString", stub_chr_SetNameString, METH_VARARGS }, - { "SetInstanceType", stub_chr_SetInstanceType, METH_VARARGS }, - { "SetPixelPosition", stub_chr_SetPixelPosition, METH_VARARGS }, - { "SetDirection", stub_chr_SetDirection, METH_VARARGS }, - { "Refresh", stub_chr_Refresh, METH_VARARGS }, - { "Revive", stub_chr_Revive, METH_VARARGS }, - { "Die", stub_chr_Die, METH_VARARGS }, - { "AttachEffectByID", stub_chr_AttachEffectByID, METH_VARARGS }, - { "AttachEffectByName", stub_chr_AttachEffectByName, METH_VARARGS }, - { "LookAt", stub_chr_LookAt, METH_VARARGS }, - { "SetMotionMode", stub_chr_SetMotionMode, METH_VARARGS }, - { "SetLoopMotion", stub_chr_SetLoopMotion, METH_VARARGS }, - { "BlendLoopMotion", stub_chr_BlendLoopMotion, METH_VARARGS }, - { "PushOnceMotion", stub_chr_PushOnceMotion, METH_VARARGS }, - { "PushLoopMotion", stub_chr_PushLoopMotion, METH_VARARGS }, - { "GetPixelPosition", stub_chr_GetPixelPosition, METH_VARARGS }, - { "SetRotation", stub_chr_SetRotation, METH_VARARGS }, - { "SetRotationAll", stub_chr_SetRotationAll, METH_VARARGS }, - { "BlendRotation", stub_chr_BlendRotation, METH_VARARGS }, - { "GetRotation", stub_chr_GetRotation, METH_VARARGS }, - { "GetRace", stub_chr_GetRace, METH_VARARGS }, - { "GetName", stub_chr_GetName, METH_VARARGS }, - { "GetNameByVID", stub_chr_GetNameByVID, METH_VARARGS }, - { "GetGuildID", stub_chr_GetGuildID, METH_VARARGS }, - { "GetProjectPosition", stub_chr_GetProjectPosition, METH_VARARGS }, - { "GetVirtualNumber", stub_chr_GetVirtualNumber, METH_VARARGS }, - { "GetInstanceType", stub_chr_GetInstanceType, METH_VARARGS }, - { "GetBoundBoxOnlyXY", stub_chr_GetBoundBoxOnlyXY, METH_VARARGS }, - { "RaceToJob", stub_chr_RaceToJob, METH_VARARGS }, - { "RaceToSex", stub_chr_RaceToSex, METH_VARARGS }, - { "testGetPKData", stub_chr_testGetPKData, METH_VARARGS }, - { "FaintTest", stub_chr_FaintTest, METH_VARARGS }, - { "SetMoveSpeed", stub_chr_SetMoveSpeed, METH_VARARGS }, - { "SetAttackSpeed", stub_chr_SetAttackSpeed, METH_VARARGS }, - { "WeaponTraceSetTexture", stub_chr_WeaponTraceSetTexture, METH_VARARGS }, - { "WeaponTraceUseAlpha", stub_chr_WeaponTraceUseAlpha, METH_VARARGS }, - { "WeaponTraceUseTexture", stub_chr_WeaponTraceUseTexture, METH_VARARGS }, - { "MoveToDestPosition", stub_chr_MoveToDestPosition, METH_VARARGS }, - { "testSetComboType", stub_chr_testSetComboType, METH_VARARGS }, - { "testSetAddRenderMode", stub_chr_testSetAddRenderMode, METH_VARARGS }, - { "testSetModulateRenderMode", stub_chr_testSetModulateRenderMode, METH_VARARGS }, - { "testSetAddRenderModeRGB", stub_chr_testSetAddRenderModeRGB, METH_VARARGS }, - { "testSetModulateRenderModeRGB", stub_chr_testSetModulateRenderModeRGB, METH_VARARGS }, - { "testSetSpecularRenderMode", stub_chr_testSetSpecularRenderMode, METH_VARARGS }, - { "testSetSpecularRenderMode2", stub_chr_testSetSpecularRenderMode2, METH_VARARGS }, - { "testRestoreRenderMode", stub_chr_testRestoreRenderMode, METH_VARARGS }, - { "testSetRideMan", stub_chr_testSetRideMan, METH_VARARGS }, - { NULL, NULL } -}; -// 40250 UserInterface/PythonCharacterManagerModule.cpp: chrmgr export names. -PyObject* stub_chrmgr_SetEmpireNameMode(PyObject*, PyObject*) { return stub_call_named("chrmgr.SetEmpireNameMode", Py_BuildNone()); } -PyObject* stub_chrmgr_GetVIDInfo(PyObject*, PyObject*) { return stub_call_named("chrmgr.GetVIDInfo", Py_BuildValue("s", "")); } -PyObject* stub_chrmgr_GetPickedVID(PyObject*, PyObject*) { return stub_call_named("chrmgr.GetPickedVID", Py_BuildValue("i", 0)); } -PyObject* stub_chrmgr_SetShapeModel(PyObject*, PyObject*) { return stub_call_named("chrmgr.SetShapeModel", Py_BuildNone()); } -PyObject* stub_chrmgr_AppendShapeSkin(PyObject*, PyObject*) { return stub_call_named("chrmgr.AppendShapeSkin", Py_BuildNone()); } -PyObject* stub_chrmgr_SetPathName(PyObject*, PyObject*) { return stub_call_named("chrmgr.SetPathName", Py_BuildNone()); } -PyObject* stub_chrmgr_LoadRaceData(PyObject*, PyObject*) { return stub_call_named("chrmgr.LoadRaceData", Py_BuildNone()); } -PyObject* stub_chrmgr_LoadLocalRaceData(PyObject*, PyObject*) { return stub_call_named("chrmgr.LoadLocalRaceData", Py_BuildNone()); } -PyObject* stub_chrmgr_CreateRace(PyObject*, PyObject*) { return stub_call_named("chrmgr.CreateRace", Py_BuildNone()); } -PyObject* stub_chrmgr_SelectRace(PyObject*, PyObject*) { return stub_call_named("chrmgr.SelectRace", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterAttachingBoneName(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterAttachingBoneName", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterMotionMode(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterMotionMode", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterMotion(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterMotion", Py_BuildNone()); } -PyObject* stub_chrmgr_SetMotionRandomWeight(PyObject*, PyObject*) { return stub_call_named("chrmgr.SetMotionRandomWeight", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterNormalAttack(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterNormalAttack", Py_BuildNone()); } -PyObject* stub_chrmgr_ReserveComboAttack(PyObject*, PyObject*) { return stub_call_named("chrmgr.ReserveComboAttack", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterComboAttack(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterComboAttack", Py_BuildNone()); } -PyObject* stub_chrmgr_ReserveComboAttackNew(PyObject*, PyObject*) { return stub_call_named("chrmgr.ReserveComboAttackNew", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterComboAttackNew(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterComboAttackNew", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterMotionData(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterMotionData", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterRaceName(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterRaceName", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterRaceSrcName(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterRaceSrcName", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterCacheMotionData(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterCacheMotionData", Py_BuildNone()); } -PyObject* stub_chrmgr_SetAffect(PyObject*, PyObject*) { return stub_call_named("chrmgr.SetAffect", Py_BuildNone()); } -PyObject* stub_chrmgr_SetEmoticon(PyObject*, PyObject*) { return stub_call_named("chrmgr.SetEmoticon", Py_BuildNone()); } -PyObject* stub_chrmgr_IsPossibleEmoticon(PyObject*, PyObject*) { return stub_call_named("chrmgr.IsPossibleEmoticon", Py_BuildValue("i", 0)); } -PyObject* stub_chrmgr_RegisterEffect(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterEffect", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterCacheEffect(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterCacheEffect", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterPointEffect(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterPointEffect", Py_BuildNone()); } -PyObject* stub_chrmgr_ShowPointEffect(PyObject*, PyObject*) { return stub_call_named("chrmgr.ShowPointEffect", Py_BuildNone()); } -PyObject* stub_chrmgr_ToggleDirectionLine(PyObject*, PyObject*) { return stub_call_named("chrmgr.ToggleDirectionLine", Py_BuildNone()); } -PyObject* stub_chrmgr_SetMovingSpeed(PyObject*, PyObject*) { return stub_call_named("chrmgr.SetMovingSpeed", Py_BuildNone()); } -PyObject* stub_chrmgr_SetDustGap(PyObject*, PyObject*) { return stub_call_named("chrmgr.SetDustGap", Py_BuildNone()); } -PyObject* stub_chrmgr_SetHorseDustGap(PyObject*, PyObject*) { return stub_call_named("chrmgr.SetHorseDustGap", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterTitleName(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterTitleName", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterNameColor(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterNameColor", Py_BuildNone()); } -PyObject* stub_chrmgr_RegisterTitleColor(PyObject*, PyObject*) { return stub_call_named("chrmgr.RegisterTitleColor", Py_BuildNone()); } -PyMethodDef methods_chrmgr[] = { - { "SetEmpireNameMode", stub_chrmgr_SetEmpireNameMode, METH_VARARGS }, - { "GetVIDInfo", stub_chrmgr_GetVIDInfo, METH_VARARGS }, - { "GetPickedVID", stub_chrmgr_GetPickedVID, METH_VARARGS }, - { "SetShapeModel", stub_chrmgr_SetShapeModel, METH_VARARGS }, - { "AppendShapeSkin", stub_chrmgr_AppendShapeSkin, METH_VARARGS }, - { "SetPathName", stub_chrmgr_SetPathName, METH_VARARGS }, - { "LoadRaceData", stub_chrmgr_LoadRaceData, METH_VARARGS }, - { "LoadLocalRaceData", stub_chrmgr_LoadLocalRaceData, METH_VARARGS }, - { "CreateRace", stub_chrmgr_CreateRace, METH_VARARGS }, - { "SelectRace", stub_chrmgr_SelectRace, METH_VARARGS }, - { "RegisterAttachingBoneName", stub_chrmgr_RegisterAttachingBoneName, METH_VARARGS }, - { "RegisterMotionMode", stub_chrmgr_RegisterMotionMode, METH_VARARGS }, - { "RegisterMotion", stub_chrmgr_RegisterMotion, METH_VARARGS }, - { "SetMotionRandomWeight", stub_chrmgr_SetMotionRandomWeight, METH_VARARGS }, - { "RegisterNormalAttack", stub_chrmgr_RegisterNormalAttack, METH_VARARGS }, - { "ReserveComboAttack", stub_chrmgr_ReserveComboAttack, METH_VARARGS }, - { "RegisterComboAttack", stub_chrmgr_RegisterComboAttack, METH_VARARGS }, - { "ReserveComboAttackNew", stub_chrmgr_ReserveComboAttackNew, METH_VARARGS }, - { "RegisterComboAttackNew", stub_chrmgr_RegisterComboAttackNew, METH_VARARGS }, - { "RegisterMotionData", stub_chrmgr_RegisterMotionData, METH_VARARGS }, - { "RegisterRaceName", stub_chrmgr_RegisterRaceName, METH_VARARGS }, - { "RegisterRaceSrcName", stub_chrmgr_RegisterRaceSrcName, METH_VARARGS }, - { "RegisterCacheMotionData", stub_chrmgr_RegisterCacheMotionData, METH_VARARGS }, - { "SetAffect", stub_chrmgr_SetAffect, METH_VARARGS }, - { "SetEmoticon", stub_chrmgr_SetEmoticon, METH_VARARGS }, - { "IsPossibleEmoticon", stub_chrmgr_IsPossibleEmoticon, METH_VARARGS }, - { "RegisterEffect", stub_chrmgr_RegisterEffect, METH_VARARGS }, - { "RegisterCacheEffect", stub_chrmgr_RegisterCacheEffect, METH_VARARGS }, - { "RegisterPointEffect", stub_chrmgr_RegisterPointEffect, METH_VARARGS }, - { "ShowPointEffect", stub_chrmgr_ShowPointEffect, METH_VARARGS }, - { "ToggleDirectionLine", stub_chrmgr_ToggleDirectionLine, METH_VARARGS }, - { "SetMovingSpeed", stub_chrmgr_SetMovingSpeed, METH_VARARGS }, - { "SetDustGap", stub_chrmgr_SetDustGap, METH_VARARGS }, - { "SetHorseDustGap", stub_chrmgr_SetHorseDustGap, METH_VARARGS }, - { "RegisterTitleName", stub_chrmgr_RegisterTitleName, METH_VARARGS }, - { "RegisterNameColor", stub_chrmgr_RegisterNameColor, METH_VARARGS }, - { "RegisterTitleColor", stub_chrmgr_RegisterTitleColor, METH_VARARGS }, - { NULL, NULL } -}; // 40250 UserInterface/PythonEffectModule.cpp: effect export names. PyObject* stub_effect_RegisterEffect(PyObject*, PyObject*) { return stub_call_named("effect.RegisterEffect", Py_BuildNone()); } PyObject* stub_effect_CreateEffect(PyObject*, PyObject*) { return stub_call_named("effect.CreateEffect", Py_BuildValue("i", 0)); } @@ -1437,16 +1197,6 @@ void init_2v0_gameplay_stubs() { PyModule_AddIntConstant(module, "__port_stub__", 1); AddStubConstants_background(module); } - { - PyObject* module = Py_InitModule("chr", methods_chr); - PyModule_AddIntConstant(module, "__port_stub__", 1); - AddStubConstants_chr(module); - } - { - PyObject* module = Py_InitModule("chrmgr", methods_chrmgr); - PyModule_AddIntConstant(module, "__port_stub__", 1); - AddStubConstants_chrmgr(module); - } { PyObject* module = Py_InitModule("effect", methods_effect); PyModule_AddIntConstant(module, "__port_stub__", 1); diff --git a/extension/src/platform/ScriptLib/PythonBoot.cpp b/extension/src/platform/ScriptLib/PythonBoot.cpp index 40d831ab..920db299 100644 --- a/extension/src/platform/ScriptLib/PythonBoot.cpp +++ b/extension/src/platform/ScriptLib/PythonBoot.cpp @@ -11,6 +11,7 @@ #include "UserInterface/AccountConnector.h" #include "UserInterface/PythonPlayer.h" #include "GameLib/FlyingObjectManager.h" +#include "GameLib/RaceManager.h" #include "EffectLib/EffectManager.h" #include "GameLib/ItemManager.h" #include "UserInterface/PythonCharacterManager.h" @@ -57,6 +58,7 @@ std::unique_ptr g_account_connector; // (CPythonNetworkStream::SetLoadingPhase). PythonPlayer and FlyingObjectManager are platform/pending stand-ins. std::unique_ptr g_player; std::unique_ptr g_flying_manager; +std::unique_ptr g_race_manager; std::unique_ptr g_effect_manager; // PORT: CPythonApplication is not constructed by the Godot host yet. GamePhase calls the // 40250 IAbstractApplication singleton, so expose the host's current timer and camera surface. @@ -298,6 +300,7 @@ bool Start(const char* stdlib_path, std::string* error) g_account_connector = std::make_unique(); g_player = std::make_unique(); g_flying_manager = std::make_unique(); + g_race_manager = std::make_unique(); g_effect_manager = std::make_unique(); g_game_application = std::make_unique(); g_game_singletons = std::make_unique(); @@ -321,6 +324,8 @@ bool run_main_script_body(const char* lpCmdLine, std::string* error) initgrpText(); initwndMgr(); initapp(); + initchr(); + initchrmgr(); initChat(); initnet(); init_2v0_gameplay_stubs(); @@ -491,6 +496,7 @@ void Stop() g_game_singletons.reset(); g_game_application.reset(); g_effect_manager.reset(); + g_race_manager.reset(); g_flying_manager.reset(); g_player.reset(); g_account_connector.reset(); diff --git a/extension/src/platform/UserInterface/PythonApplication.cpp b/extension/src/platform/UserInterface/PythonApplication.cpp index 40d1782b..e23e5cb8 100644 --- a/extension/src/platform/UserInterface/PythonApplication.cpp +++ b/extension/src/platform/UserInterface/PythonApplication.cpp @@ -162,8 +162,6 @@ 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 CMovieMan::PlayLogo(const char*) { MT_PLATFORM_STUB(); } float GetDegreeDifference(float, float) { MT_PLATFORM_STUB(); return 0; } diff --git a/extension/src/platform/pending/EterLib/AttributeInstance.cpp b/extension/src/platform/pending/EterLib/AttributeInstance.cpp deleted file mode 100644 index 0102b3d7..00000000 --- a/extension/src/platform/pending/EterLib/AttributeInstance.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// Stand-in for the 40250 logic unit EterLib/AttributeInstance.cpp, not ported yet: the members the ported units -// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ -// (docs/PORT-PLAN.md). -#include "EterLib/StdAfx.h" -#include "EterLib/AttributeInstance.h" - -#include "../../PlatformStub.h" - -auto CAttributeInstance::Clear() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CAttributeInstance::GetHeight(float, float, float *) -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CAttributeInstance::Delete(CAttributeInstance *) -> void -{ - MT_PLATFORM_STUB(); -} diff --git a/extension/src/platform/pending/GameLib/ActorInstance.cpp b/extension/src/platform/pending/GameLib/ActorInstance.cpp index 416870a4..d176ef1e 100644 --- a/extension/src/platform/pending/GameLib/ActorInstance.cpp +++ b/extension/src/platform/pending/GameLib/ActorInstance.cpp @@ -28,44 +28,6 @@ auto CActorInstance::SetEventHandler(IEventHandler *) -> void MT_PLATFORM_STUB(); } -auto CActorInstance::SetRace(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CActorInstance::SetHair(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CActorInstance::SetVirtualID(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CActorInstance::SetShape(DWORD, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CActorInstance::ChangeMaterial(const char *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CActorInstance::GetRace() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CActorInstance::GetVirtualID() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - auto CActorInstance::CanAct() -> bool { MT_PLATFORM_STUB(); @@ -100,12 +62,6 @@ auto CActorInstance::RefreshActorInstance() -> void MT_PLATFORM_STUB(); } -auto CActorInstance::GetPartItemID(DWORD) -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - auto CActorInstance::UpdateAttachingInstances() -> void { MT_PLATFORM_STUB(); @@ -368,11 +324,6 @@ auto CActorInstance::RenderToShadowMap() -> void MT_PLATFORM_STUB(); } -auto CActorInstance::UpdateAttribute() -> void -{ - MT_PLATFORM_STUB(); -} - auto CActorInstance::CanFishing() -> bool { MT_PLATFORM_STUB(); @@ -563,3 +514,46 @@ auto CActorInstance::TEMP_Push(int, int) -> void { MT_PLATFORM_STUB(); } + +auto CActorInstance::ShowDirectionLine(bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::AttachEffectByName(DWORD, const char *, const char *) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::PushOnceMotion(DWORD, float, float) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::PushLoopMotion(DWORD, float, float) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::SetXYRotation(float, float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetWeaponTraceTexture(const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::UseTextureWeaponTrace() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::UseAlphaWeaponTrace() -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/UserInterface/InstanceBase.cpp b/extension/src/platform/pending/UserInterface/InstanceBase.cpp index 362056d1..eea2d5cd 100644 --- a/extension/src/platform/pending/UserInterface/InstanceBase.cpp +++ b/extension/src/platform/pending/UserInterface/InstanceBase.cpp @@ -387,3 +387,81 @@ auto CInstanceBase::__EffectContainer_DetachEffect(DWORD) -> void { MT_PLATFORM_STUB(); } + +auto CInstanceBase::RegisterTitleName(int, const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::RegisterNameColor(UINT, UINT, UINT, UINT) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::RegisterTitleColor(UINT, UINT, UINT, UINT) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::SetDustGap(float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::SetHorseDustGap(float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::SetEmpireNameMode(bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::SCRIPT_SetAffect(UINT, bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::SetAlpha(float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::Revive() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::Hide() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::Show() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::SetDirection(int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::SetLoopMotion(WORD, float, float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::PushLoopMotion(WORD, float, float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::IsPossibleEmoticon() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonBackground.cpp b/extension/src/platform/pending/UserInterface/PythonBackground.cpp index 1497ecf4..50e8c6ae 100644 --- a/extension/src/platform/pending/UserInterface/PythonBackground.cpp +++ b/extension/src/platform/pending/UserInterface/PythonBackground.cpp @@ -88,3 +88,9 @@ auto CPythonBackground::CheckAdvancing(CInstanceBase *) -> bool MT_PLATFORM_STUB(); return mt_platform_stub_return(); } + +auto CPythonBackground::GetPickingPointWithRayOnlyTerrain(const CRay &, D3DXVECTOR3 *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/port/EterLib/AttributeData.cpp b/extension/src/port/EterLib/AttributeData.cpp new file mode 100644 index 00000000..859e6663 --- /dev/null +++ b/extension/src/port/EterLib/AttributeData.cpp @@ -0,0 +1,200 @@ +#include "StdAfx.h" +#include "../EterBase/Utils.h" +#include "AttributeData.h" + +const char c_szAttributeDataFileHeader[] = "AttributeData"; +const int c_iAttributeDataFileHeaderLength = 13; + +/*DWORD CAttributeData::GetCollisionDataCount() const +{ + return m_CollisionDataVector.size(); +} + +BOOL CAttributeData::GetCollisionDataPointer(DWORD dwIndex, const TCollisionData ** c_ppCollisionData) const +{ + if (dwIndex >= GetCollisionDataCount()) + return FALSE; + + *c_ppCollisionData = &m_CollisionDataVector[dwIndex]; + + return TRUE; +} +*/ + +const CStaticCollisionDataVector & CAttributeData::GetCollisionDataVector() const +{ + return m_StaticCollisionDataVector; +} + +const THeightDataVector & CAttributeData::GetHeightDataVector() const +{ + return m_HeightDataVector; +} + +DWORD CAttributeData::GetHeightDataCount() const +{ + return m_HeightDataVector.size(); +} + +BOOL CAttributeData::GetHeightDataPointer(DWORD dwIndex, const THeightData ** c_ppHeightData) const +{ + if (dwIndex >= GetHeightDataCount()) + return FALSE; + + *c_ppHeightData = &m_HeightDataVector[dwIndex]; + + return TRUE; +} + +float CAttributeData::GetMaximizeRadius() +{ + return m_fMaximizeRadius; +} + +size_t CAttributeData::AddCollisionData(const CStaticCollisionData& data) +{ + m_StaticCollisionDataVector.push_back(data); + return m_StaticCollisionDataVector.size(); +} + +bool CAttributeData::OnLoad(int /*iSize*/, const void * c_pvBuf) +{ + if (!c_pvBuf) + { + // NOTE: 파일이 존재하지 않으면 다른곳에서 그래픽 모델을 기반으로 충돌 데이터를 생성하니 리소스를 파괴하지 않고 유지시킴. + return true; + } + + const BYTE * c_pbBuf = static_cast (c_pvBuf); + + char szHeader[c_iAttributeDataFileHeaderLength+1]; + memcpy(szHeader, c_pbBuf, c_iAttributeDataFileHeaderLength+1); + c_pbBuf += c_iAttributeDataFileHeaderLength+1; + if (strcmp(szHeader, c_szAttributeDataFileHeader)) + return FALSE; + + DWORD dwCollisionDataCount; + DWORD dwHeightDataCount; + memcpy(&dwCollisionDataCount, c_pbBuf, sizeof(DWORD)); + c_pbBuf += sizeof(DWORD); + memcpy(&dwHeightDataCount, c_pbBuf, sizeof(DWORD)); + c_pbBuf += sizeof(DWORD); + + m_StaticCollisionDataVector.clear(); + m_StaticCollisionDataVector.resize(dwCollisionDataCount); + m_HeightDataVector.clear(); + m_HeightDataVector.resize(dwHeightDataCount); + + for (DWORD i = 0; i < dwCollisionDataCount; ++i) + { + CStaticCollisionData & rCollisionData = m_StaticCollisionDataVector[i]; + memcpy(&rCollisionData.dwType, c_pbBuf, sizeof(DWORD)); + c_pbBuf += sizeof(DWORD); + memcpy(rCollisionData.szName, c_pbBuf, 32); + c_pbBuf += 32; + memcpy(&rCollisionData.v3Position, c_pbBuf, sizeof(D3DXVECTOR3)); + c_pbBuf += sizeof(D3DXVECTOR3); + + switch(rCollisionData.dwType) + { + case COLLISION_TYPE_PLANE: + memcpy(rCollisionData.fDimensions, c_pbBuf, 2*sizeof(float)); + c_pbBuf += 2*sizeof(float); + break; + case COLLISION_TYPE_BOX: + memcpy(rCollisionData.fDimensions, c_pbBuf, 3*sizeof(float)); + c_pbBuf += 3*sizeof(float); + break; + case COLLISION_TYPE_SPHERE: + memcpy(rCollisionData.fDimensions, c_pbBuf, sizeof(float)); + c_pbBuf += sizeof(float); + break; + case COLLISION_TYPE_CYLINDER: + memcpy(rCollisionData.fDimensions, c_pbBuf, 2*sizeof(float)); + c_pbBuf += 2*sizeof(float); + break; + case COLLISION_TYPE_AABB: + memcpy(rCollisionData.fDimensions, c_pbBuf, 3*sizeof(float)); + c_pbBuf += 3*sizeof(float); + break; + case COLLISION_TYPE_OBB: + memcpy(rCollisionData.fDimensions, c_pbBuf, 3*sizeof(float)); + c_pbBuf += 3*sizeof(float); + break; + } + + memcpy(rCollisionData.quatRotation, c_pbBuf, sizeof(D3DXQUATERNION)); + c_pbBuf += sizeof(D3DXQUATERNION); + } + + for (DWORD j = 0; j < dwHeightDataCount; ++j) + { + THeightData & rHeightData = m_HeightDataVector[j]; + memcpy(rHeightData.szName, c_pbBuf, 32); + c_pbBuf += 32; + + DWORD dwPrimitiveCount; + memcpy(&dwPrimitiveCount, c_pbBuf, sizeof(DWORD)); + c_pbBuf += sizeof(DWORD); + + rHeightData.v3VertexVector.clear(); + rHeightData.v3VertexVector.resize(dwPrimitiveCount); + memcpy(&rHeightData.v3VertexVector[0], c_pbBuf, dwPrimitiveCount*sizeof(D3DXVECTOR3)); + c_pbBuf += dwPrimitiveCount*sizeof(D3DXVECTOR3); + + // Getting Maximize Radius + for (DWORD k = 0; k < rHeightData.v3VertexVector.size(); ++k) + { + m_fMaximizeRadius = fMAX(m_fMaximizeRadius, fabs(rHeightData.v3VertexVector[k].x)+50.0f); + m_fMaximizeRadius = fMAX(m_fMaximizeRadius, fabs(rHeightData.v3VertexVector[k].y)+50.0f); + m_fMaximizeRadius = fMAX(m_fMaximizeRadius, fabs(rHeightData.v3VertexVector[k].z)+50.0f); + } + // Getting Maximize Radius + } + + return true; +} + +void CAttributeData::OnClear() +{ + m_StaticCollisionDataVector.clear(); + m_HeightDataVector.clear(); +} + +bool CAttributeData::OnIsEmpty() const +{ + if (!m_StaticCollisionDataVector.empty()) + return false; + if (!m_HeightDataVector.empty()) + return false; + + return true; +} + +bool CAttributeData::OnIsType(TType type) +{ + if (CAttributeData::Type() == type) + return true; + + return CResource::OnIsType(type); +} + +CAttributeData::TType CAttributeData::Type() +{ + static TType s_type = StringToType("CAttributeData"); + return s_type; +} + +void CAttributeData::OnSelfDestruct() +{ + Clear(); +} + +CAttributeData::CAttributeData(const char * c_szFileName) : CResource(c_szFileName) +{ + m_fMaximizeRadius = 0.0f; +} + +CAttributeData::~CAttributeData() +{ +} diff --git a/extension/src/port/EterLib/AttributeInstance.cpp b/extension/src/port/EterLib/AttributeInstance.cpp new file mode 100644 index 00000000..6dac01c7 --- /dev/null +++ b/extension/src/port/EterLib/AttributeInstance.cpp @@ -0,0 +1,222 @@ +#include "StdAfx.h" +#include "../EterBase/Utils.h" +#include "AttributeInstance.h" +#include "GrpMath.h" + +CDynamicPool CAttributeInstance::ms_kPool; + +const float c_fStepSize = 50.0f; + +bool CAttributeInstance::Picking(const D3DXVECTOR3 & v, const D3DXVECTOR3 & dir, float & out_x, float & out_y) +{ + if (IsEmpty()) + return FALSE; + //fy *= -1.0f; + + bool bPicked = false; + float nx = 0; + float ny = 0; + + for (DWORD i = 0; i < m_v3HeightDataVector.size(); ++i) + for (DWORD j = 0; j < m_v3HeightDataVector[i].size(); j+=3) + { + const D3DXVECTOR3 & cv0 = m_v3HeightDataVector[i][j]; + const D3DXVECTOR3 & cv2 = m_v3HeightDataVector[i][j+1]; + const D3DXVECTOR3 & cv1 = m_v3HeightDataVector[i][j+2]; + + D3DXVECTOR3 n; + const auto vvv = (cv1 - cv0); + const auto vvv2 = (cv2 - cv0); + const auto vvv3 = (cv2 - cv1); + D3DXVec3Cross(&n,&vvv,&vvv2); + D3DXVECTOR3 x; + float t; + const auto _vv = (v - cv0); + t = - D3DXVec3Dot(&_vv,&n)/D3DXVec3Dot(&dir,&n); + + x = v+t*dir; + const auto vvv4 = (x - cv0); + const auto vvv5 = (x - cv1); + const auto vvv6 = (x - cv2); + D3DXVECTOR3 temp; + D3DXVec3Cross(&temp,&vvv,&vvv4); + if (D3DXVec3Dot(&temp,&n)<0) continue; + D3DXVec3Cross(&temp,&vvv3,&vvv5); + if (D3DXVec3Dot(&temp,&n)<0) continue; + const auto _vv_ = (cv0 - cv2); + D3DXVec3Cross(&temp,&_vv_,&vvv6); + if (D3DXVec3Dot(&temp,&n)<0) continue; + + if (bPicked) + { + if ((v.x-x.x)*(v.x-x.x)+(v.y-x.y)*(v.y-x.y)<(v.x-nx)*(v.x-nx)+(v.y-ny)*(v.y-ny)) + { + nx=x.x; + ny=x.y; + } + } + else + { + nx = x.x; + ny = x.y; + } + bPicked = true; + } + if (bPicked) + { + out_x = nx; + out_y = ny; + } + return bPicked; +} + +BOOL CAttributeInstance::GetHeight(float fx, float fy, float * pfHeight) +{ + if(IsEmpty()) + return FALSE; + + fy *= -1.0f; + + if (!IsInHeight(fx, fy)) + return FALSE; + + BOOL bFlag = FALSE; + + for (DWORD i = 0; i < m_v3HeightDataVector.size(); ++i) + for (DWORD j = 0; j < m_v3HeightDataVector[i].size(); j+=3) + { + const D3DXVECTOR3 & c_rv3Vertex0 = m_v3HeightDataVector[i][j]; + const D3DXVECTOR3 & c_rv3Vertex1 = m_v3HeightDataVector[i][j+1]; + const D3DXVECTOR3 & c_rv3Vertex2 = m_v3HeightDataVector[i][j+2]; + + if ( + fxc_rv3Vertex0.x && fx>c_rv3Vertex1.x && fx>c_rv3Vertex2.x || + fyc_rv3Vertex0.y && fy>c_rv3Vertex1.y && fy>c_rv3Vertex2.y + ) + continue; + + if (IsInTriangle2D(c_rv3Vertex0.x, c_rv3Vertex0.y, + c_rv3Vertex1.x, c_rv3Vertex1.y, + c_rv3Vertex2.x, c_rv3Vertex2.y, fx, fy)) + { + D3DXVECTOR3 v3Line1 = c_rv3Vertex1 - c_rv3Vertex0; + D3DXVECTOR3 v3Line2 = c_rv3Vertex2 - c_rv3Vertex0; + D3DXVECTOR3 v3Cross; + + D3DXVec3Cross(&v3Cross, &v3Line1, &v3Line2); + D3DXVec3Normalize(&v3Cross, &v3Cross); + + if (0.0f != v3Cross.z) + { + float fd = (v3Cross.x*c_rv3Vertex0.x + v3Cross.y*c_rv3Vertex0.y + v3Cross.z*c_rv3Vertex0.z); + float fm = (v3Cross.x*fx + v3Cross.y*fy); + *pfHeight = fMAX((fd - fm) / v3Cross.z, *pfHeight); + + bFlag = TRUE; + } + } + } + + return bFlag; +} + +CAttributeData * CAttributeInstance::GetObjectPointer() const +{ + return m_roAttributeData.GetPointer(); +} +BOOL CAttributeInstance::IsInHeight(float fx, float fy) +{ + float fdx = m_matGlobal._41 - fx; + float fdy = m_matGlobal._42 - fy; + if (sqrtf(fdx*fdx + fdy*fdy) > m_fHeightRadius) + return FALSE; + + return TRUE; +} + +void CAttributeInstance::SetObjectPointer(CAttributeData * pAttributeData) +{ + Clear(); + m_roAttributeData.SetPointer(pAttributeData); +} + +void CAttributeInstance::RefreshObject(const D3DXMATRIX & c_rmatGlobal) +{ + assert(!m_roAttributeData.IsNull()); + + m_matGlobal = c_rmatGlobal; + + // Height + m_fHeightRadius = m_roAttributeData->GetMaximizeRadius(); + + DWORD dwHeightDataCount = m_roAttributeData->GetHeightDataCount(); + m_v3HeightDataVector.clear(); + m_v3HeightDataVector.resize(dwHeightDataCount); + for (DWORD i = 0; i < dwHeightDataCount; ++i) + { + const THeightData * c_pHeightData; + if (!m_roAttributeData->GetHeightDataPointer(i, &c_pHeightData)) + continue; + + DWORD dwVertexCount = c_pHeightData->v3VertexVector.size(); + m_v3HeightDataVector[i].clear(); + m_v3HeightDataVector[i].resize(dwVertexCount); + for (DWORD j = 0; j < dwVertexCount; ++j) + { + D3DXVec3TransformCoord(&m_v3HeightDataVector[i][j], &c_pHeightData->v3VertexVector[j], &m_matGlobal); + } + } +} + +const char * CAttributeInstance::GetDataFileName() const +{ + return m_roAttributeData->GetFileName(); +} + +void CAttributeInstance::CreateSystem(UINT uCapacity) +{ + ms_kPool.Create(uCapacity); +} + +void CAttributeInstance::DestroySystem() +{ + ms_kPool.Destroy(); +} + +CAttributeInstance* CAttributeInstance::New() +{ + return ms_kPool.Alloc(); +} + +void CAttributeInstance::Delete(CAttributeInstance* pkInst) +{ + ms_kPool.Free(pkInst); +} + +BOOL CAttributeInstance::IsEmpty() const +{ + if (!m_v3HeightDataVector.empty()) + return FALSE; + + return TRUE; +} + +void CAttributeInstance::Clear() +{ + m_fHeightRadius = 0.0f; + m_fCollisionRadius = 0.0f; + D3DXMatrixIdentity(&m_matGlobal); + + m_v3HeightDataVector.clear(); + + m_roAttributeData.SetPointer(NULL); +} + +CAttributeInstance::CAttributeInstance() +{ +} +CAttributeInstance::~CAttributeInstance() +{ +} diff --git a/extension/src/port/EterLib/Camera.cpp b/extension/src/port/EterLib/Camera.cpp new file mode 100644 index 00000000..cf929cfb --- /dev/null +++ b/extension/src/port/EterLib/Camera.cpp @@ -0,0 +1,633 @@ +// Camera.cpp: implementation of the CCamera class. +// +////////////////////////////////////////////////////////////////////// + +#include "StdAfx.h" +#include "../EterBase/Utils.h" +#include "Camera.h" + +const float c_fDefaultResistance = 0.3f; + +CCameraManager aCameraManager; // CCameraManager Instance + +void CCamera::SetCameraMaxDistance(float fMax) +{ + CAMERA_MAX_DISTANCE = fMax; +} + +float CCamera::GetTargetHeight() +{ + return m_fTarget_; +} + +void CCamera::SetTargetHeight(float fTarget) +{ + m_fTarget_=fTarget; +} + + +////////////////////////////////////////////////////////////////////////// +// CCamera +////////////////////////////////////////////////////////////////////////// + + +CCamera::CCamera() : +m_fEyeGroundHeightRatio(0.3f), +m_fTargetHeightLimitRatio(2.0f), +m_fResistance(c_fDefaultResistance), +m_isLock(false) +{ + m_fDistance = 1.0f; + m_eCameraState = CAMERA_STATE_NORMAL; + m_eCameraStatePrev = CAMERA_STATE_NORMAL; + m_ulNumScreenBuilding = 0; + + m_fPitchSum = 0.0f; + m_fRollSum = 0.0f; + + m_fTerrainCollisionRadius = 50.0f; + m_fObjectCollisionRadius = 50.0f; + + m_bDrag = false; + + m_lMousePosX = -1; + m_lMousePosY = -1; + + m_fTarget_ = CAMERA_TARGET_STANDARD; + + m_v3AngularAcceleration = D3DXVECTOR3(0.0f, 0.0f, 0.0f); + m_v3AngularVelocity = D3DXVECTOR3(0.0f, 0.0f, 0.0f); + + m_bProcessTerrainCollision = true; + + SetViewParams(D3DXVECTOR3(0.0f,0.0f,1.0f), D3DXVECTOR3(0.0f,0.0f,0.0f), D3DXVECTOR3(0.0f,1.0f,0.0f)); +} + +CCamera::~CCamera() +{ +} + +void CCamera::Lock() +{ + m_isLock = true; +} + +void CCamera::Unlock() +{ + m_isLock = false; +} + +bool CCamera::IsLock() +{ + return m_isLock; +} + +void CCamera::SetResistance(float fResistance) +{ + m_fResistance = c_fDefaultResistance * fResistance; +} + +void CCamera::Wheel(int nLen) +{ + if (IsLock()) + return; + + m_v3AngularVelocity.y = (float)(nLen) * m_fResistance; +} + +void CCamera::BeginDrag(int nMouseX, int nMouseY) +{ + if (IsLock()) + return; + + m_bDrag = true; + m_lMousePosX = nMouseX; + m_lMousePosY = nMouseY; + m_fPitchSum = 0.0f; + m_fRollSum = 0.0f; +} + +bool CCamera::IsDraging() +{ + if (IsLock()) + return false; + + return m_bDrag; +} + +bool CCamera::EndDrag() +{ + if (IsLock()) + return false; + + m_bDrag = false; + + float fSum=sqrt(m_fPitchSum*m_fPitchSum+m_fRollSum*m_fRollSum); + + m_fPitchSum = 0.0f; + m_fRollSum = 0.0f; + + if (fSum<1.0f) + return false; + + return true; +} + +bool CCamera::Drag(int nMouseX, int nMouseY, LPPOINT lpReturnPoint) +{ + if (IsLock()) + return false; + + if (!m_bDrag) + { + m_lMousePosX = nMouseX; + m_lMousePosY = nMouseY; + lpReturnPoint->x = m_lMousePosX; + lpReturnPoint->y = m_lMousePosY; + return false; + } + + long lMouseX = nMouseX; + long lMouseY = nMouseY; + + float fNewPitchVelocity = (float)(lMouseY - m_lMousePosY) * m_fResistance; + float fNewRotationVelocity = (float)(lMouseX - m_lMousePosX) * m_fResistance; + + m_fPitchSum += fNewPitchVelocity; + m_fRollSum += fNewRotationVelocity; + + + if (CAMERA_STATE_CANTGOLEFT == GetCameraState()) + fNewRotationVelocity = fMAX(0.0f, fNewRotationVelocity); + if (CAMERA_STATE_CANTGORIGHT == GetCameraState()) + fNewRotationVelocity = fMIN(0.0f, fNewRotationVelocity); + if (CAMERA_STATE_CANTGODOWN == GetCameraState()) + fNewPitchVelocity = fMAX(0.0f, fNewPitchVelocity); + + m_v3AngularVelocity.x = fNewRotationVelocity; + m_v3AngularVelocity.z = fNewPitchVelocity; + + lpReturnPoint->x = m_lMousePosX; + lpReturnPoint->y = m_lMousePosY; + return true; +} + +////////////////////////////////////////////////////////////////////////// +// Update + +void CCamera::SetCameraState(eCameraState eNewCameraState) +{ + if (eNewCameraState == m_eCameraState) + return; + + m_eCameraStatePrev = m_eCameraState; + m_eCameraState = eNewCameraState; + +/* + if ((CAMERA_STATE_NORMAL == m_eCameraStatePrev)) + { + m_fDistanceBackup = m_fDistance; + m_fPitchBackup = m_fPitch; + m_fRollBackup = m_fRoll; + } + else if ((CAMERA_STATE_CANTGODOWN == m_eCameraStatePrev) && (CAMERA_STATE_CANTGODOWN == m_eCameraState) ) + { + m_v3EyeBackup = m_v3Eye; + } +*/ +} + +void CCamera::IncreaseNumSrcreenBuilding() +{ + ++m_ulNumScreenBuilding; +} + +void CCamera::ResetNumScreenBuilding() +{ + m_ulNumScreenBuilding = 0; +} + +////////////////////////////////////////////////////////////////////////// +// Property +void CCamera::SetViewParams( const D3DXVECTOR3 &v3Eye, const D3DXVECTOR3& v3Target, const D3DXVECTOR3& v3Up) +{ + if (IsLock()) + return; + + // Set attributes for the view matrix + m_v3Eye = v3Eye; + m_v3Target = v3Target; + m_v3Up = v3Up; + + SetViewMatrix(); +} + +void CCamera::SetEye(const D3DXVECTOR3 & v3Eye) +{ + if (IsLock()) + return; + + m_v3Eye = v3Eye; + + SetViewMatrix(); +} + +void CCamera::SetTarget(const D3DXVECTOR3 & v3Target) +{ + if (IsLock()) + return; + + m_v3Target = v3Target; + + SetViewMatrix(); +} + +void CCamera::SetUp(const D3DXVECTOR3 & v3Up) +{ + if (IsLock()) + return; + + m_v3Up = v3Up; + + SetViewMatrix(); +} + +void CCamera::SetViewMatrix() +{ + m_v3View = m_v3Target - m_v3Eye; + D3DXVECTOR3 v3CenterRay = -m_v3View; + CalculateRoll(); + m_fDistance = D3DXVec3Length(&m_v3View); + assert(m_fDistance >= 0); + D3DXVec3Normalize(&m_v3View , &m_v3View); + + D3DXVec3Cross(&m_v3Cross, &m_v3Up, &m_v3View); + D3DXVec3Normalize(&m_v3Cross, &m_v3Cross); + + D3DXVec3Cross(&m_v3Up, &m_v3View, &m_v3Cross); + D3DXVec3Normalize(&m_v3Up, &m_v3Up); + const auto vv = D3DXVECTOR3(0.0f, 0.0f, 1.0f); + m_fPitch = D3DXVec3Dot(&m_v3Up, &vv);// / D3DXVec2Length(&v2ViewYZ); + if (m_fPitch >= 1) + m_fPitch = 1; + else if (m_fPitch <= -1) + m_fPitch = -1; + m_fPitch = acosf(m_fPitch); + m_fPitch *= (180.0f / D3DX_PI); + if ( 0 < m_v3View.z ) + m_fPitch = -m_fPitch; + + D3DXMatrixLookAtRH(&m_matView, &m_v3Eye, &m_v3Target, &m_v3Up); + + float fDeterminantD3DMatView = D3DXMatrixfDeterminant(&m_matView); + D3DXMatrixInverse(&m_matInverseView, &fDeterminantD3DMatView, &m_matView); + + m_matBillboard = m_matInverseView; + m_matBillboard._41 = 0.0f; + m_matBillboard._42 = 0.0f; + m_matBillboard._43 = 0.0f; + + m_ViewRay.SetStartPoint(m_v3Target); + m_ViewRay.SetDirection(v3CenterRay, m_fDistance); + + m_kCameraBottomToTerrainRay.SetStartPoint(m_v3Eye); + m_kCameraFrontToTerrainRay.SetStartPoint(m_v3Eye); + m_kCameraBackToTerrainRay.SetStartPoint(m_v3Eye); + m_kCameraLeftToTerrainRay.SetStartPoint(m_v3Eye); + m_kCameraRightToTerrainRay.SetStartPoint(m_v3Eye); + m_kTargetToCameraBottomRay.SetStartPoint(m_v3Target); + + m_kCameraBottomToTerrainRay.SetDirection(-m_v3Up, 2.0f * m_fTerrainCollisionRadius); + m_kCameraFrontToTerrainRay.SetDirection(m_v3View, 4.0f * m_fTerrainCollisionRadius); + m_kCameraBackToTerrainRay.SetDirection(-m_v3View, m_fTerrainCollisionRadius); + m_kCameraLeftToTerrainRay.SetDirection(-m_v3Cross, 3.0f * m_fTerrainCollisionRadius); + m_kCameraRightToTerrainRay.SetDirection(m_v3Cross, 3.0f * m_fTerrainCollisionRadius); + const auto vv2 = (v3CenterRay - m_fTerrainCollisionRadius * m_v3Up); + m_kTargetToCameraBottomRay.SetDirection(v3CenterRay - m_fTerrainCollisionRadius * m_v3Up, D3DXVec3Length(&vv2)); + + m_kLeftObjectCollisionRay.SetStartPoint(m_v3Target); + m_kTopObjectCollisionRay.SetStartPoint(m_v3Target); + m_kRightObjectCollisionRay.SetStartPoint(m_v3Target); + m_kBottomObjectCollisionRay.SetStartPoint(m_v3Target); + const auto vv3 = (v3CenterRay + m_fObjectCollisionRadius * m_v3Cross); + const auto vv4 = (v3CenterRay - m_fObjectCollisionRadius * m_v3Cross); + const auto vv5 = (v3CenterRay + m_fObjectCollisionRadius * m_v3Up); + const auto vv6 = (v3CenterRay + m_fObjectCollisionRadius * m_v3Up); + m_kLeftObjectCollisionRay.SetDirection(v3CenterRay + m_fObjectCollisionRadius * m_v3Cross, D3DXVec3Length(&vv3)); + m_kRightObjectCollisionRay.SetDirection(v3CenterRay - m_fObjectCollisionRadius * m_v3Cross, D3DXVec3Length(&vv4)); + m_kTopObjectCollisionRay.SetDirection(v3CenterRay + m_fObjectCollisionRadius * m_v3Up, D3DXVec3Length(&vv5)); + m_kBottomObjectCollisionRay.SetDirection(v3CenterRay - m_fObjectCollisionRadius * m_v3Up, D3DXVec3Length(&vv6)); +} + +void CCamera::Move(const D3DXVECTOR3 & v3Displacement) +{ + if (IsLock()) + return; + + m_v3Eye += v3Displacement; + m_v3Target += v3Displacement; + + SetViewMatrix(); +} + +void CCamera::Zoom(float fRatio) +{ + if (IsLock()) + return; + + if (fRatio == 1.0f) + return; + + D3DXVECTOR3 v3Temp = m_v3Eye - m_v3Target; + v3Temp *= fRatio; + m_v3Eye = v3Temp + m_v3Target; + + SetViewMatrix(); +} + +void CCamera::MoveAlongView(float fDistance) +{ + if (IsLock()) + return; + + D3DXVECTOR3 v3Temp; + D3DXVec3Normalize(&v3Temp, &m_v3View); + + m_v3Eye += v3Temp * fDistance; + m_v3Target += v3Temp * fDistance; + + SetViewMatrix(); +} + +void CCamera::MoveAlongCross(float fDistance) +{ + if (IsLock()) + return; + + D3DXVECTOR3 v3Temp; + D3DXVec3Normalize(&v3Temp, &m_v3Cross); + + m_v3Eye += v3Temp * fDistance; + m_v3Target += v3Temp * fDistance; + + SetViewMatrix(); +} + +void CCamera::MoveAlongUp(FLOAT fDistance) +{ + if (IsLock()) + return; + + D3DXVECTOR3 v3Temp ; + D3DXVec3Normalize(&v3Temp, &m_v3Up); + m_v3Target += v3Temp * fDistance; + m_v3Eye += v3Temp * fDistance; + SetViewMatrix(); +} + +void CCamera::MoveLateral(float fDistance) +{ + if (IsLock()) + return; + + MoveAlongCross(fDistance); +} + +void CCamera::MoveFront(float fDistance) +{ + if (IsLock()) + return; + + D3DXVECTOR3 v3Temp = D3DXVECTOR3(m_v3View.x, m_v3View.y, 0.0f); + D3DXVec3Normalize(&v3Temp, &v3Temp); + + m_v3Eye += v3Temp * fDistance; + m_v3Target += v3Temp * fDistance; + + SetViewMatrix(); +} + +void CCamera::MoveVertical(float fDistance) +{ + if (IsLock()) + return; + + m_v3Eye.z += fDistance; + m_v3Target.z += fDistance; + + SetViewMatrix(); +} + +//void CCamera::RotateUpper(float fDegree) +//{ +// D3DXMATRIX matRot; +// D3DXMatrixRotationAxis(&matRot, &m_v3Cross, -D3DXToRadian(fDegree)); +// D3DXVec3TransformCoord(&m_v3View, &m_v3View, &matRot) ; +// D3DXVec3Cross(&m_v3Up, &m_v3View, &m_v3Cross); +// +// m_v3Target = m_v3Eye + m_v3View; +// +// SetViewMatrix() ; +//} + +void CCamera::RotateEyeAroundTarget(float fPitchDegree, float fRollDegree) +{ + if (IsLock()) + return; + + D3DXMATRIX matRot, matRotPitch, matRotRoll; + + // 머리위로 넘어가기 막기... + if (m_fPitch + fPitchDegree > 80.0f) + { + fPitchDegree = 80.0f - m_fPitch; + } + else if( m_fPitch + fPitchDegree < -80.0f) + { + fPitchDegree = -80.0f - m_fPitch; + } + + D3DXMatrixRotationAxis(&matRotPitch, &m_v3Cross, D3DXToRadian(fPitchDegree)); + + D3DXMatrixRotationZ(&matRotRoll, -D3DXToRadian(fRollDegree)); + matRot = matRotPitch * matRotRoll; + + D3DXVECTOR3 v3Temp = m_v3Eye - m_v3Target; + D3DXVec3TransformCoord(&m_v3Eye, &v3Temp, &matRot); + m_v3Eye += m_v3Target; + + SetUp(D3DXVECTOR3(0.0f, 0.0f, 1.0f)); + + m_fRoll += fRollDegree; + + if (m_fRoll > 360.0f) + m_fRoll -= 360.0f; + else if (m_fRoll < -360.0f) + m_fRoll += 360.0f; +} + +void CCamera::RotateEyeAroundPoint(const D3DXVECTOR3 & v3Point, float fPitchDegree, float fRollDegree) +{ +// if (IsLock()) +// return; + + D3DXMATRIX matRot, matRotPitch, matRotRoll; + + D3DXMatrixRotationAxis(&matRotPitch, &m_v3Cross, D3DXToRadian(fPitchDegree)); + + D3DXMatrixRotationZ(&matRotRoll, -D3DXToRadian(fRollDegree)); + matRot = matRotPitch * matRotRoll; + + D3DXVECTOR3 v3Temp = m_v3Eye - v3Point; + D3DXVec3TransformCoord(&m_v3Eye, &v3Temp, &matRot); + m_v3Eye += v3Point; + + const auto vv2 = (v3Temp + m_v3Up); + D3DXVec3TransformCoord(&m_v3Up, &vv2, &matRot); + m_v3Up -= (m_v3Eye - v3Point); + + v3Temp = m_v3Target - v3Point; + D3DXVec3TransformCoord(&m_v3Target, &v3Temp, &matRot); + m_v3Target += v3Point; + + SetViewMatrix(); +} + +void CCamera::Pitch(const float fPitchDelta) +{ +// if (IsLock()) +// return; + + RotateEyeAroundTarget(fPitchDelta, 0.0f); +} + +void CCamera::Roll(const float fRollDelta) +{ +// if (IsLock()) +// return; + + RotateEyeAroundTarget(0.0f, fRollDelta); +} + +void CCamera::SetDistance(const float fdistance) +{ +// if (IsLock()) +// return; + + Zoom(fdistance/m_fDistance); +} + +void CCamera::CalculateRoll() +{ + D3DXVECTOR2 v2ViewXY; + v2ViewXY.x = m_v3View.x; + v2ViewXY.y = m_v3View.y; + D3DXVec2Normalize(&v2ViewXY, &v2ViewXY); + const auto vv = D3DXVECTOR2(0.0f, 1.0f); + float fDot = D3DXVec2Dot(&v2ViewXY, &vv); + if (fDot >= 1) + fDot = 1; + else if (fDot <= -1) + fDot = -1; + fDot = acosf(fDot); + fDot *= (180.0f / D3DX_PI); + float fCross = D3DXVec2CCW (&v2ViewXY, &vv); + if ( 0 > fCross) + { + fDot = -fDot; + } + + m_fRoll = fDot; + +} + +////////////////////////////////////////////////////////////////////////// +// CCameraMananger +////////////////////////////////////////////////////////////////////////// + +CCameraManager::CCameraManager() : +m_pCurrentCamera(NULL), +m_pPreviousCamera(NULL) +{ + AddCamera(DEFAULT_PERSPECTIVE_CAMERA); + AddCamera(DEFAULT_ORTHO_CAMERA); + + SetCurrentCamera(DEFAULT_PERSPECTIVE_CAMERA); +} + +CCameraManager::~CCameraManager() +{ + for (TCameraMap::iterator itor = m_CameraMap.begin(); itor != m_CameraMap.end(); ++itor) + { + delete (*itor).second; + } + m_CameraMap.clear(); +} + +CCamera * CCameraManager::GetCurrentCamera() +{ + if (!m_pCurrentCamera) + assert(false); + return m_pCurrentCamera; +} + +void CCameraManager::SetCurrentCamera(unsigned char ucCameraNum) +{ + if (m_pCurrentCamera != m_CameraMap[ucCameraNum]) + m_pPreviousCamera = m_pCurrentCamera; + + m_pCurrentCamera = m_CameraMap[ucCameraNum]; +} + +void CCameraManager::ResetToPreviousCamera() +{ + if (!m_pPreviousCamera) + assert(false); + m_pCurrentCamera = m_pPreviousCamera; + m_pPreviousCamera = NULL; +} + +bool CCameraManager::isCurrentCamera(unsigned char ucCameraNum) +{ + if (m_CameraMap[ucCameraNum] == m_pCurrentCamera) + return true; + return false; +} + +// 잡스러운 함수들... +bool CCameraManager::AddCamera(unsigned char ucCameraNum) +{ + if(m_CameraMap.end() != m_CameraMap.find(ucCameraNum)) + return false; + m_CameraMap.insert(TCameraMap::value_type(ucCameraNum, new CCamera)); + return true; +} + +bool CCameraManager::RemoveCamera(unsigned char ucCameraNum) +{ + TCameraMap::iterator itor = m_CameraMap.find(ucCameraNum); + if(m_CameraMap.end() == itor) + return false; + m_CameraMap.erase(itor); + return true; +} + +unsigned char CCameraManager::GetCurrentCameraNum() +{ + if (!m_pCurrentCamera) + return NO_CURRENT_CAMERA; + for (TCameraMap::iterator itor = m_CameraMap.begin(); itor != m_CameraMap.end(); ++itor) + if(m_pCurrentCamera == (*itor).second) + return (*itor).first; + return NO_CURRENT_CAMERA; +} + +bool CCameraManager::isTerrainCollisionEnable() +{ + return m_pCurrentCamera->isTerrainCollisionEnable(); +} + +void CCameraManager::SetTerrainCollision(bool bEnable) +{ + m_pCurrentCamera->SetTerrainCollision(bEnable); +} diff --git a/extension/src/port/EterLib/TextFileLoader.cpp b/extension/src/port/EterLib/TextFileLoader.cpp new file mode 100644 index 00000000..520fb6cb --- /dev/null +++ b/extension/src/port/EterLib/TextFileLoader.cpp @@ -0,0 +1,696 @@ +#include "StdAfx.h" +#include "../EterBase/CRC32.h" +#include +#include "../EterPack/EterPackManager.h" + +#include "Pool.h" +#include "TextFileLoader.h" + +std::map CTextFileLoader::ms_kMap_dwNameKey_pkTextFileLoader; +bool CTextFileLoader::ms_isCacheMode=false; + +CDynamicPool CTextFileLoader::SGroupNode::ms_kPool; + +CTokenVector* CTextFileLoader::SGroupNode::GetTokenVector(const std::string& c_rstGroupName) +{ + DWORD dwGroupNameKey=GenNameKey(c_rstGroupName.c_str(), c_rstGroupName.length()); + + std::map::iterator f=m_kMap_dwKey_kVct_stToken.find(dwGroupNameKey); + if (m_kMap_dwKey_kVct_stToken.end()==f) + return NULL; + + return &f->second; +} + +bool CTextFileLoader::SGroupNode::IsExistTokenVector(const std::string& c_rstGroupName) +{ + DWORD dwGroupNameKey=GenNameKey(c_rstGroupName.c_str(), c_rstGroupName.length()); + + if (m_kMap_dwKey_kVct_stToken.end()==m_kMap_dwKey_kVct_stToken.find(dwGroupNameKey)) + return false; + + return true; +} + +void CTextFileLoader::SGroupNode::InsertTokenVector(const std::string& c_rstGroupName, const CTokenVector& c_rkVct_stToken) +{ + DWORD dwGroupNameKey=GenNameKey(c_rstGroupName.c_str(), c_rstGroupName.length()); + + m_kMap_dwKey_kVct_stToken.insert(std::map::value_type(dwGroupNameKey, c_rkVct_stToken)); +} + +DWORD CTextFileLoader::SGroupNode::GenNameKey(const char* c_szGroupName, UINT uGroupNameLen) +{ + return GetCRC32(c_szGroupName, uGroupNameLen); +} + +const std::string& CTextFileLoader::SGroupNode::GetGroupName() +{ + return m_strGroupName; +} + +bool CTextFileLoader::SGroupNode::IsGroupNameKey(DWORD dwGroupNameKey) +{ + if (dwGroupNameKey==m_dwGroupNameKey) + return true; + + return false; +} + +void CTextFileLoader::SGroupNode::SetGroupName(const std::string& c_rstGroupName) +{ + m_strGroupName=c_rstGroupName; + stl_lowers(m_strGroupName); + + m_dwGroupNameKey=GenNameKey(m_strGroupName.c_str(), m_strGroupName.length()); +} + + +CTextFileLoader::SGroupNode* CTextFileLoader::SGroupNode::New() +{ + return ms_kPool.Alloc(); +} + +void CTextFileLoader::SGroupNode::Delete(SGroupNode* pkNode) +{ + pkNode->m_kMap_dwKey_kVct_stToken.clear(); + pkNode->ChildNodeVector.clear(); + pkNode->m_strGroupName=""; + pkNode->m_dwGroupNameKey=0; + ms_kPool.Free(pkNode); +} + + + +void CTextFileLoader::SGroupNode::DestroySystem() +{ + ms_kPool.Destroy(); +} + + +CTextFileLoader* CTextFileLoader::Cache(const char* c_szFileName) +{ + DWORD dwNameKey=GetCRC32(c_szFileName, strlen(c_szFileName)); + std::map::iterator f=ms_kMap_dwNameKey_pkTextFileLoader.find(dwNameKey); + if (ms_kMap_dwNameKey_pkTextFileLoader.end()!=f) + { + if (!ms_isCacheMode) + { + delete f->second; + + CTextFileLoader* pkNewTextFileLoader=new CTextFileLoader; + pkNewTextFileLoader->Load(c_szFileName); + f->second=pkNewTextFileLoader; + } + f->second->SetTop(); + return f->second; + } + + CTextFileLoader* pkNewTextFileLoader=new CTextFileLoader; + pkNewTextFileLoader->Load(c_szFileName); + + ms_kMap_dwNameKey_pkTextFileLoader.insert(std::map::value_type(dwNameKey, pkNewTextFileLoader)); + return pkNewTextFileLoader; +} + +void CTextFileLoader::SetCacheMode() +{ + ms_isCacheMode=true; +} + +void CTextFileLoader::DestroySystem() +{ + { + std::map::iterator i; + for (i=ms_kMap_dwNameKey_pkTextFileLoader.begin(); i!=ms_kMap_dwNameKey_pkTextFileLoader.end(); ++i) + delete i->second; + ms_kMap_dwNameKey_pkTextFileLoader.clear(); + } + + SGroupNode::DestroySystem(); +} + +void CTextFileLoader::Destroy() +{ + __DestroyGroupNodeVector(); +} + +CTextFileLoader::CTextFileLoader() +{ + SetTop(); + + m_acBufData=NULL; + m_dwBufSize=0; + m_dwBufCapacity=0; + + m_GlobalNode.m_strGroupName = "global"; + m_GlobalNode.pParentNode = NULL; + + m_kVct_pkNode.reserve(128); +} + +CTextFileLoader::~CTextFileLoader() +{ + Destroy(); + + if (m_acBufData) + delete [] m_acBufData; +} + +void CTextFileLoader::__DestroyGroupNodeVector() +{ + std::vector::iterator i; + for (i=m_kVct_pkNode.begin(); i!=m_kVct_pkNode.end(); ++i) + SGroupNode::Delete(*i); + m_kVct_pkNode.clear(); +} + +const char * CTextFileLoader::GetFileName() +{ + return m_strFileName.c_str(); +} + +bool CTextFileLoader::IsEmpty() +{ + return m_strFileName.empty(); +} + +bool CTextFileLoader::Load(const char * c_szFileName) +{ + m_strFileName = ""; + + const VOID* pvData; + CMappedFile kFile; + if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData)) + return false; + + if (m_dwBufCapacitypParentNode = pGroupNode; + pNewNode->SetGroupName(stTokenVector[1]); + pGroupNode->ChildNodeVector.push_back(pNewNode); + + ++m_dwcurLineIndex; + + if( false == LoadGroup(pNewNode) ) + return false; + } + // List + else if (0 == stTokenVector[0].compare("list")) + { + if (2 != stTokenVector.size()) + { + assert(!"There is no list name!"); + continue; + } + + CTokenVector stSubTokenVector; + + stl_lowers(stTokenVector[1]); + std::string key = stTokenVector[1]; + + stTokenVector.clear(); + + ++m_dwcurLineIndex; + for (; m_dwcurLineIndex < m_textFileLoader.GetLineCount(); ++m_dwcurLineIndex) + { + if (!m_textFileLoader.SplitLine(m_dwcurLineIndex, &stSubTokenVector)) + continue; + + if ('{' == stSubTokenVector[0][0]) + continue; + + if ('}' == stSubTokenVector[0][0]) + break; + + for (DWORD j = 0; j < stSubTokenVector.size(); ++j) + { + stTokenVector.push_back(stSubTokenVector[j]); + } + } + + pGroupNode->InsertTokenVector(key, stTokenVector); + //pGroupNode->LocalTokenVectorMap.insert(std::make_pair(key, stTokenVector)); + } + else + { + std::string key = stTokenVector[0]; + + if (1 == stTokenVector.size()) + { + TraceError("CTextFileLoader::LoadGroup : must have a value (filename: %s line: %d key: %s)", + m_strFileName.c_str(), + m_dwcurLineIndex, + key.c_str()); + break; + } + + stTokenVector.erase(stTokenVector.begin()); + pGroupNode->InsertTokenVector(key, stTokenVector); + //pGroupNode->LocalTokenVectorMap.insert(std::make_pair(key, stTokenVector)); + } + } + + return (nLocalGroupDepth == 0); +} + +void CTextFileLoader::SetTop() +{ + m_pcurNode = &m_GlobalNode; +} + +DWORD CTextFileLoader::GetChildNodeCount() +{ + if (!m_pcurNode) + { + assert(!"Node to access has not set!"); + return 0; + } + + return m_pcurNode->ChildNodeVector.size(); +} + +BOOL CTextFileLoader::SetChildNode(const char * c_szKey) +{ + if (!m_pcurNode) + { + assert(!"Node to access has not set!"); + return FALSE; + } + + DWORD dwKey=SGroupNode::GenNameKey(c_szKey, strlen(c_szKey)); + + for (DWORD i = 0; i < m_pcurNode->ChildNodeVector.size(); ++i) + { + TGroupNode * pGroupNode = m_pcurNode->ChildNodeVector[i]; + if (pGroupNode->IsGroupNameKey(dwKey)) + { + m_pcurNode = pGroupNode; + return TRUE; + } + } + + return FALSE; +} +BOOL CTextFileLoader::SetChildNode(const std::string & c_rstrKeyHead, DWORD dwIndex) +{ + char szKey[32+1]; + _snprintf(szKey, sizeof(szKey), "%s%02u", c_rstrKeyHead.c_str(), dwIndex); + + return SetChildNode(szKey); +} +BOOL CTextFileLoader::SetChildNode(DWORD dwIndex) +{ + if (!m_pcurNode) + { + assert(!"Node to access has not set!"); + return FALSE; + } + + if (dwIndex >= m_pcurNode->ChildNodeVector.size()) + { + assert(!"Node index to set is too large to access!"); + return FALSE; + } + + m_pcurNode = m_pcurNode->ChildNodeVector[dwIndex]; + + return TRUE; +} + +BOOL CTextFileLoader::SetParentNode() +{ + if (!m_pcurNode) + { + assert(!"Node to access has not set!"); + return FALSE; + } + + if (NULL == m_pcurNode->pParentNode) + { + assert(!"Current group node is already top!"); + return FALSE; + } + + m_pcurNode = m_pcurNode->pParentNode; + + return TRUE; +} + +BOOL CTextFileLoader::GetCurrentNodeName(std::string * pstrName) +{ + if (!m_pcurNode) + return FALSE; + if (NULL == m_pcurNode->pParentNode) + return FALSE; + + *pstrName = m_pcurNode->GetGroupName(); + + return TRUE; +} + +BOOL CTextFileLoader::IsToken(const std::string & c_rstrKey) +{ + if (!m_pcurNode) + { + assert(!"Node to access has not set!"); + return FALSE; + } + + return m_pcurNode->IsExistTokenVector(c_rstrKey); + //return m_pcurNode->LocalTokenVectorMap.end() != m_pcurNode->LocalTokenVectorMap.find(c_rstrKey); +} + +BOOL CTextFileLoader::GetTokenVector(const std::string & c_rstrKey, CTokenVector ** ppTokenVector) +{ + if (!m_pcurNode) + { + assert(!"Node to access has not set!"); + return FALSE; + } + + CTokenVector* pkRetTokenVector=m_pcurNode->GetTokenVector(c_rstrKey); + if (!pkRetTokenVector) + return FALSE; + + *ppTokenVector = pkRetTokenVector; + + //CTokenVectorMap::iterator itor = m_pcurNode->LocalTokenVectorMap.find(c_rstrKey); + //if (m_pcurNode->LocalTokenVectorMap.end() == itor) + //{ + //Tracef(" CTextFileLoader::GetTokenVector - Failed to find the key %s [%s :: %s]\n", m_File.GetFileName(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); + // return FALSE; + //} + + //*ppTokenVector = &itor->second; + + return TRUE; +} + +BOOL CTextFileLoader::GetTokenBoolean(const std::string & c_rstrKey, BOOL * pData) +{ + CTokenVector * pTokenVector; + if (!GetTokenVector(c_rstrKey, &pTokenVector)) + return FALSE; + + if (pTokenVector->empty()) + { + //Tracef(" CTextFileLoader::GetTokenBoolean - Failed to find the value %s [%s : %s]\n", m_File.GetFileName(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); + return FALSE; + } + + *pData = BOOL(atoi(pTokenVector->at(0).c_str())); + + return TRUE; +} + +BOOL CTextFileLoader::GetTokenByte(const std::string & c_rstrKey, BYTE * pData) +{ + CTokenVector * pTokenVector; + if (!GetTokenVector(c_rstrKey, &pTokenVector)) + return FALSE; + + if (pTokenVector->empty()) + { + //Tracef(" CTextFileLoader::GetTokenByte - Failed to find the value %s [%s : %s]\n", m_File.GetFileName(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); + return FALSE; + } + + *pData = BYTE(atoi(pTokenVector->at(0).c_str())); + + return TRUE; +} + +BOOL CTextFileLoader::GetTokenWord(const std::string & c_rstrKey, WORD * pData) +{ + CTokenVector * pTokenVector; + if (!GetTokenVector(c_rstrKey, &pTokenVector)) + return FALSE; + + if (pTokenVector->empty()) + { + //Tracef(" CTextFileLoader::GetTokenWord - Failed to find the value %s [%s : %s]\n", m_File.GetFileName(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); + return FALSE; + } + + *pData = WORD(atoi(pTokenVector->at(0).c_str())); + + return TRUE; +} + +BOOL CTextFileLoader::GetTokenInteger(const std::string & c_rstrKey, int * pData) +{ + CTokenVector * pTokenVector; + if (!GetTokenVector(c_rstrKey, &pTokenVector)) + return FALSE; + + if (pTokenVector->empty()) + { + //Tracef(" CTextFileLoader::GetTokenInteger - Failed to find the value %s [%s : %s]\n", m_File.GetFileName(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); + return FALSE; + } + + *pData = atoi(pTokenVector->at(0).c_str()); + + return TRUE; +} + +BOOL CTextFileLoader::GetTokenDoubleWord(const std::string & c_rstrKey, DWORD * pData) +{ + return GetTokenInteger(c_rstrKey, *(int **)(&pData)); +} + +BOOL CTextFileLoader::GetTokenFloat(const std::string & c_rstrKey, float * pData) +{ + CTokenVector * pTokenVector; + if (!GetTokenVector(c_rstrKey, &pTokenVector)) + return FALSE; + + if (pTokenVector->empty()) + { + //Tracef(" CTextFileLoader::GetTokenFloat - Failed to find the value %s [%s : %s]\n", m_File.GetFileName(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); + return FALSE; + } + + *pData = atof(pTokenVector->at(0).c_str()); + + return TRUE; +} + +BOOL CTextFileLoader::GetTokenVector2(const std::string & c_rstrKey, D3DXVECTOR2 * pVector2) +{ + CTokenVector * pTokenVector; + if (!GetTokenVector(c_rstrKey, &pTokenVector)) + return FALSE; + + if (pTokenVector->size() != 2) + { + //Tracef(" CTextFileLoader::GetTokenVector2 - This key should have 2 values %s [%s : %s]\n", m_File.GetFileName(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); + return FALSE; + } + + pVector2->x = atof(pTokenVector->at(0).c_str()); + pVector2->y = atof(pTokenVector->at(1).c_str()); + + return TRUE; +} + +BOOL CTextFileLoader::GetTokenVector3(const std::string & c_rstrKey, D3DXVECTOR3 * pVector3) +{ + CTokenVector * pTokenVector; + if (!GetTokenVector(c_rstrKey, &pTokenVector)) + return FALSE; + + if (pTokenVector->size() != 3) + { + //Tracef(" CTextFileLoader::GetTokenVector3 - This key should have 3 values %s [%s : %s]\n", m_File.GetFileName(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); + return FALSE; + } + + pVector3->x = atof(pTokenVector->at(0).c_str()); + pVector3->y = atof(pTokenVector->at(1).c_str()); + pVector3->z = atof(pTokenVector->at(2).c_str()); + + return TRUE; +} + +BOOL CTextFileLoader::GetTokenVector4(const std::string & c_rstrKey, D3DXVECTOR4 * pVector4) +{ + CTokenVector * pTokenVector; + if (!GetTokenVector(c_rstrKey, &pTokenVector)) + return FALSE; + + if (pTokenVector->size() != 4) + { + //Tracef(" CTextFileLoader::GetTokenVector3 - This key should have 3 values %s [%s : %s]\n", m_File.GetFileName(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); + return FALSE; + } + + pVector4->x = atof(pTokenVector->at(0).c_str()); + pVector4->y = atof(pTokenVector->at(1).c_str()); + pVector4->z = atof(pTokenVector->at(2).c_str()); + pVector4->w = atof(pTokenVector->at(3).c_str()); + + return TRUE; +} + + +BOOL CTextFileLoader::GetTokenPosition(const std::string & c_rstrKey, D3DXVECTOR3 * pVector) +{ + return GetTokenVector3(c_rstrKey, pVector); +} + +BOOL CTextFileLoader::GetTokenQuaternion(const std::string & c_rstrKey, D3DXQUATERNION * pQ) +{ + CTokenVector * pTokenVector; + if (!GetTokenVector(c_rstrKey, &pTokenVector)) + return FALSE; + + if (pTokenVector->size() != 4) + { + //Tracef(" CTextFileLoader::GetTokenVector3 - This key should have 3 values %s [%s : %s]\n", m_File.GetFileName(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); + return FALSE; + } + + pQ->x = atof(pTokenVector->at(0).c_str()); + pQ->y = atof(pTokenVector->at(1).c_str()); + pQ->z = atof(pTokenVector->at(2).c_str()); + pQ->w = atof(pTokenVector->at(3).c_str()); + + return TRUE; +} + +BOOL CTextFileLoader::GetTokenDirection(const std::string & c_rstrKey, D3DVECTOR * pVector) +{ + CTokenVector * pTokenVector; + if (!GetTokenVector(c_rstrKey, &pTokenVector)) + return FALSE; + + if (pTokenVector->size() != 3) + { + //Tracef(" CTextFileLoader::GetTokenDirection - This key should have 3 values %s [%s : %s]\n", m_File.GetFileName(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); + return FALSE; + } + + pVector->x = atof(pTokenVector->at(0).c_str()); + pVector->y = atof(pTokenVector->at(1).c_str()); + pVector->z = atof(pTokenVector->at(2).c_str()); + + return TRUE; +} + +BOOL CTextFileLoader::GetTokenColor(const std::string & c_rstrKey, D3DXCOLOR * pColor) +{ + CTokenVector * pTokenVector; + if (!GetTokenVector(c_rstrKey, &pTokenVector)) + return FALSE; + + if (pTokenVector->size() != 4) + { + //Tracef(" CTextFileLoader::GetTokenColor - This key should have 4 values %s [%s : %s]\n", m_File.GetFileName(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); + return FALSE; + } + + pColor->r = atof(pTokenVector->at(0).c_str()); + pColor->g = atof(pTokenVector->at(1).c_str()); + pColor->b = atof(pTokenVector->at(2).c_str()); + pColor->a = atof(pTokenVector->at(3).c_str()); + + return TRUE; +} + +BOOL CTextFileLoader::GetTokenColor(const std::string & c_rstrKey, D3DCOLORVALUE * pColor) +{ + CTokenVector * pTokenVector; + if (!GetTokenVector(c_rstrKey, &pTokenVector)) + return FALSE; + + if (pTokenVector->size() != 4) + { + //Tracef(" CTextFileLoader::GetTokenColor - This key should have 4 values %s [%s : %s]\n", m_File.GetFileName(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); + return FALSE; + } + + pColor->r = atof(pTokenVector->at(0).c_str()); + pColor->g = atof(pTokenVector->at(1).c_str()); + pColor->b = atof(pTokenVector->at(2).c_str()); + pColor->a = atof(pTokenVector->at(3).c_str()); + + return TRUE; +} + +BOOL CTextFileLoader::GetTokenString(const std::string & c_rstrKey, std::string * pString) +{ + CTokenVector * pTokenVector; + if (!GetTokenVector(c_rstrKey, &pTokenVector)) + return FALSE; + + if (pTokenVector->empty()) + { + //Tracef(" CTextFileLoader::GetTokenString - Failed to find the value %s [%s : %s]\n", m_File.GetFileName(), m_pcurNode->strGroupName.c_str(), c_rstrKey.c_str()); + return FALSE; + } + + *pString = pTokenVector->at(0); + + return TRUE; +} diff --git a/extension/src/port/EterLib/Util.cpp b/extension/src/port/EterLib/Util.cpp new file mode 100644 index 00000000..60b436c4 --- /dev/null +++ b/extension/src/port/EterLib/Util.cpp @@ -0,0 +1,237 @@ +#include "StdAfx.h" +#include "../EterPack/EterPackManager.h" + +#include "TextFileLoader.h" + +void PrintfTabs(FILE * File, int iTabCount, const char * c_szString, ...) +{ + va_list args; + va_start(args, c_szString); + + static char szBuf[1024]; + _vsnprintf(szBuf, sizeof(szBuf), c_szString, args); + va_end(args); + + for (int i = 0; i < iTabCount; ++i) + fprintf(File, " "); + + fprintf(File, szBuf); +} + +bool LoadTextData(const char * c_szFileName, CTokenMap & rstTokenMap) +{ + LPCVOID pMotionData; + CMappedFile File; + + if (!CEterPackManager::Instance().Get(File, c_szFileName, &pMotionData)) + return false; + + CMemoryTextFileLoader textFileLoader; + CTokenVector stTokenVector; + + textFileLoader.Bind(File.Size(), pMotionData); + + for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i) + { + if (!textFileLoader.SplitLine(i, &stTokenVector)) + continue; + + if (2 != stTokenVector.size()) + return false; + + stl_lowers(stTokenVector[0]); + stl_lowers(stTokenVector[1]); + + rstTokenMap[stTokenVector[0]] = stTokenVector[1]; + } + + return true; +} + +bool LoadMultipleTextData(const char * c_szFileName, CTokenVectorMap & rstTokenVectorMap) +{ + LPCVOID pModelData; + CMappedFile File; + + if (!CEterPackManager::Instance().Get(File, c_szFileName, &pModelData)) + return false; + + DWORD i; + + CMemoryTextFileLoader textFileLoader; + CTokenVector stTokenVector; + + textFileLoader.Bind(File.Size(), pModelData); + + for (i = 0; i < textFileLoader.GetLineCount(); ++i) + { + if (!textFileLoader.SplitLine(i, &stTokenVector)) + continue; + + stl_lowers(stTokenVector[0]); + + // Start or End + if (0 == stTokenVector[0].compare("start")) + { + CTokenVector stSubTokenVector; + + stl_lowers(stTokenVector[1]); + std::string key = stTokenVector[1]; + stTokenVector.clear(); + + for (i=i+1; i < textFileLoader.GetLineCount(); ++i) + { + if (!textFileLoader.SplitLine(i, &stSubTokenVector)) + continue; + + stl_lowers(stSubTokenVector[0]); + + if (0 == stSubTokenVector[0].compare("end")) + { + break; + } + + for (DWORD j = 0; j < stSubTokenVector.size(); ++j) + { + stTokenVector.push_back(stSubTokenVector[j]); + } + } + + rstTokenVectorMap.insert(CTokenVectorMap::value_type(key, stTokenVector)); + } + else + { + std::string key = stTokenVector[0]; + stTokenVector.erase(stTokenVector.begin()); + rstTokenVectorMap.insert(CTokenVectorMap::value_type(key, stTokenVector)); + } + } + + return true; +} + +D3DXVECTOR3 TokenToVector(CTokenVector & rVector) +{ + if (3 != rVector.size()) + { + assert(!"Size of token vector which will be converted to vector is not 3"); + return D3DXVECTOR3(0.0f, 0.0f, 0.0f); + } + + return D3DXVECTOR3(atof(rVector[0].c_str()), + atof(rVector[1].c_str()), + atof(rVector[2].c_str())); +} + +D3DXCOLOR TokenToColor(CTokenVector & rVector) +{ + if (4 != rVector.size()) + { + assert(!"Size of token vector which will be converted to color is not 4"); + return D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); + } + + return D3DXCOLOR(atof(rVector[0].c_str()), + atof(rVector[1].c_str()), + atof(rVector[2].c_str()), + atof(rVector[3].c_str())); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +// PORT: lines 142-296 of 40250 EterLib/Util.cpp (default code page and font face, with the Win32 +// EnumFontFamExProc callback) live in platform/EterLib/Util.cpp, which owns the font backend. + + +int __base64_get( const int c ) +{ + if( 'A' <= c && c <= 'Z' ) + return c-'A'; + if( 'a' <= c && c <= 'z' ) + return c - 'a' + 26; + if( '0' <= c && c <= '9' ) + return c - '0' + 52; + if( c == '+' ) + return 62; + if( c == '/' ) + return 63; + if( c == '=' ) // end of line + return -1; + return -2; // non value; +} + +void __strcat1(char * str,int i) +{ + char result[2]; + result[0] = i; + result[1] = NULL; + strcat(str,result); +} + +void base64_decode(const char * str,char * resultStr) +{ + int nCount=0, i=0, r, result; + int length = strlen(str); + char szDest[5]=""; + + strcpy(resultStr,""); + while(nCount < length) + { + i=0; + strcpy(szDest, ""); + while(nCount= length ) // 데이터의 끝에 도달했다. + { + if( szDest[1] == '@' ) + { + __strcat1(resultStr,(szDest[0]<<2)); + break; + }// exit while loop + else + __strcat1(resultStr,(szDest[0]<<2 | szDest[1]>>4)); // 1 Byte + if( szDest[2] == '@' ) + { + __strcat1(resultStr,(szDest[1]<<4)); + break; + } + else + __strcat1(resultStr,(szDest[1]<<4 | szDest[2]>>2)); // 2 Byte + if( szDest[3] == '@' ) + { + __strcat1(resultStr,(szDest[2]<<6)); + break; + } + else + __strcat1(resultStr,(szDest[2]<<6 | szDest[3])); // 3 Byte + } + else + { + __strcat1(resultStr,(szDest[0]<<2 | szDest[1]>>4)); // 1 Byte + __strcat1(resultStr,(szDest[1]<<4 | szDest[2]>>2)); // 2 Byte + __strcat1(resultStr,(szDest[2]<<6 | szDest[3])); // 3 Byte + } + } + + }// end of while + + for (i = 0; i < strlen(resultStr); i++) + { + char c = resultStr[i]; + int xx = i + 5; + resultStr[i] = char(c ^ xx); + } + // E +} diff --git a/extension/src/port/GameLib/GameType.cpp b/extension/src/port/GameLib/GameType.cpp new file mode 100644 index 00000000..8d8c775a --- /dev/null +++ b/extension/src/port/GameLib/GameType.cpp @@ -0,0 +1,362 @@ +#include "StdAfx.h" +#include "GameType.h" +#include "../EffectLib/EffectManager.h" + +extern float g_fGameFPS = 60.0f; + +CDynamicPool NRaceData::g_CollisionDataPool; +CDynamicPool NRaceData::g_EffectDataPool; +CDynamicPool NRaceData::g_ObjectDataPool; + +void NRaceData::DestroySystem() +{ + g_CollisionDataPool.Destroy(); + g_EffectDataPool.Destroy(); + g_ObjectDataPool.Destroy(); +} + +///////////////////////////////////////////////////////////////////////////////// +// Character Attaching Collision Data +BOOL NRaceData::LoadAttackData(CTextFileLoader & rTextFileLoader, TAttackData * pData) +{ + if (!rTextFileLoader.GetTokenInteger("attacktype", &pData->iAttackType)) + { + pData->iAttackType = ATTACK_TYPE_SPLASH; + } + if (!rTextFileLoader.GetTokenInteger("hittingtype", &pData->iHittingType)) + return false; + if (!rTextFileLoader.GetTokenFloat("stiffentime", &pData->fStiffenTime)) + return false; + if (!rTextFileLoader.GetTokenFloat("invisibletime", &pData->fInvisibleTime)) + return false; + if (!rTextFileLoader.GetTokenFloat("externalforce", &pData->fExternalForce)) + return false; + if (!rTextFileLoader.GetTokenInteger("hitlimitcount", &pData->iHitLimitCount)) + { + pData->iHitLimitCount = 0; + } + + return true; +} + +bool NRaceData::THitData::Load(CTextFileLoader & rTextFileLoader) +{ + if (!rTextFileLoader.GetTokenFloat("attackingstarttime", &fAttackStartTime)) + return false; + if (!rTextFileLoader.GetTokenFloat("attackingendtime", &fAttackEndTime)) + return false; + + if (!rTextFileLoader.GetTokenString("attackingbone", &strBoneName)) + strBoneName = ""; + if (!rTextFileLoader.GetTokenFloat("weaponlength",&fWeaponLength)) + fWeaponLength = 0.0f; + + mapHitPosition.clear(); + + CTokenVector * tv; + if (rTextFileLoader.GetTokenVector("hitposition",&tv)) + { + CTokenVector::iterator it=tv->begin(); + + while(it!=tv->end()) + { + float time; + NRaceData::THitTimePosition hp; + time = atof(it++->c_str()); + hp.v3LastPosition.x = atof(it++->c_str()); + hp.v3LastPosition.y = atof(it++->c_str()); + hp.v3LastPosition.z = atof(it++->c_str()); + hp.v3Position.x = atof(it++->c_str()); + hp.v3Position.y = atof(it++->c_str()); + hp.v3Position.z = atof(it++->c_str()); + + mapHitPosition[time] = hp; + } + } + + return true; +} + +BOOL NRaceData::LoadMotionAttackData(CTextFileLoader & rTextFileLoader, TMotionAttackData * pData) +{ + if (!LoadAttackData(rTextFileLoader, pData)) + return FALSE; + + // NOTE : 기존의 AttackingType이 MotionType으로 바뀌었음 + // 기존 데이타의 경우 없으면 기존 것으로 읽게끔.. + if (!rTextFileLoader.GetTokenInteger("motiontype", &pData->iMotionType)) + { + if (!rTextFileLoader.GetTokenInteger("attackingtype", &pData->iMotionType)) + return FALSE; + } + + pData->HitDataContainer.clear(); + + DWORD dwHitDataCount; + if (!rTextFileLoader.GetTokenDoubleWord("hitdatacount", &dwHitDataCount)) + { + pData->HitDataContainer.push_back(SHitData()); + THitData & rHitData = *(pData->HitDataContainer.rbegin()); + if (!rHitData.Load(rTextFileLoader)) + return FALSE; + } + else + { + for (DWORD i = 0; i < dwHitDataCount; ++i) + { + if (!rTextFileLoader.SetChildNode(i)) + return FALSE; + + pData->HitDataContainer.push_back(SHitData()); + THitData & rHitData = *(pData->HitDataContainer.rbegin()); + if (!rHitData.Load(rTextFileLoader)) + return FALSE; + + rTextFileLoader.SetParentNode(); + } + } + + return TRUE; +} + +BOOL NRaceData::LoadCollisionData(CTextFileLoader & rTextFileLoader, TCollisionData * pCollisionData) +{ + if (!rTextFileLoader.GetTokenInteger("collisiontype", &pCollisionData->iCollisionType)) + return false; + + DWORD dwSphereDataCount; + if (!rTextFileLoader.GetTokenDoubleWord("spheredatacount", &dwSphereDataCount)) + return false; + + pCollisionData->SphereDataVector.clear(); + pCollisionData->SphereDataVector.resize(dwSphereDataCount); + for (DWORD i = 0; i < dwSphereDataCount; ++i) + { + TSphereData & r = pCollisionData->SphereDataVector[i].GetAttribute(); + + if (!rTextFileLoader.SetChildNode("spheredata", i)) + return false; + + if (!rTextFileLoader.GetTokenFloat("radius", &r.fRadius)) + return false; + if (!rTextFileLoader.GetTokenPosition("position", &r.v3Position)) + return false; + + rTextFileLoader.SetParentNode(); + } + + return true; +} + +void NRaceData::SaveEffectData(FILE * File, int iTabCount, const TAttachingEffectData & c_rEffectData) +{ + PrintfTabs(File, iTabCount, "EffectScriptName \"%s\"\n", c_rEffectData.strFileName.c_str()); + + PrintfTabs(File, iTabCount, "EffectPosition %f %f %f\n", c_rEffectData.v3Position.x, c_rEffectData.v3Position.y, c_rEffectData.v3Position.z); + PrintfTabs(File, iTabCount, "EffectRotation %f %f %f\n", c_rEffectData.v3Rotation.x, c_rEffectData.v3Rotation.y, c_rEffectData.v3Rotation.z); +} + +void NRaceData::SaveObjectData(FILE * File, int iTabCount, const TAttachingObjectData & c_rObjectData) +{ + PrintfTabs(File, iTabCount, "ObjectScriptName \"%s\"\n", c_rObjectData.strFileName.c_str()); +} + +BOOL NRaceData::LoadEffectData(CTextFileLoader & rTextFileLoader, TAttachingEffectData * pEffectData) +{ + if (!rTextFileLoader.GetTokenString("effectscriptname",&pEffectData->strFileName)) + return false; + + if (!rTextFileLoader.GetTokenPosition("effectposition",&pEffectData->v3Position)) + { + pEffectData->v3Position = D3DXVECTOR3(0.0f,0.0f,0.0f); + } + + if (!rTextFileLoader.GetTokenPosition("effectrotation",&pEffectData->v3Rotation)) + { + //pEffectData->qRotation = D3DXQUATERNION(0.0f,0.0f,0.0f,1.0f); + pEffectData->v3Rotation = D3DXVECTOR3(0.0f,0.0f,0.0f); + } + + /*if (!*/ + // TODO DELETEME FIXME + CEffectManager::Instance().RegisterEffect(pEffectData->strFileName.c_str()); + /*) return false;*/ + + return true; +} + +BOOL NRaceData::LoadObjectData(CTextFileLoader & rTextFileLoader, TAttachingObjectData * pObjectData) +{ + if (!rTextFileLoader.GetTokenString("objectscriptname",&pObjectData->strFileName)) + return false; + + return true; +} + +void NRaceData::SaveAttackData(FILE * File, int iTabCount, const TAttackData & c_rData) +{ + PrintfTabs(File, iTabCount, "AttackType %d\n", c_rData.iAttackType); + PrintfTabs(File, iTabCount, "HittingType %d\n", c_rData.iHittingType); + PrintfTabs(File, iTabCount, "StiffenTime %f\n", c_rData.fStiffenTime); + PrintfTabs(File, iTabCount, "InvisibleTime %f\n", c_rData.fInvisibleTime); + PrintfTabs(File, iTabCount, "ExternalForce %f\n", c_rData.fExternalForce); + PrintfTabs(File, iTabCount, "HitLimitCount %d\n", c_rData.iHitLimitCount); +} + +void NRaceData::SaveMotionAttackData(FILE * File, int iTabCount, const TMotionAttackData & c_rData) +{ + SaveAttackData(File, iTabCount, c_rData); + + PrintfTabs(File, iTabCount, "\n"); + PrintfTabs(File, iTabCount, "MotionType %d\n", c_rData.iMotionType); + PrintfTabs(File, iTabCount, "HitDataCount %d\n", c_rData.HitDataContainer.size()); + + DWORD dwHitDataNumber = 0; + THitDataContainer::const_iterator itor = c_rData.HitDataContainer.begin(); + for (; itor != c_rData.HitDataContainer.end(); ++itor, ++dwHitDataNumber) + { + const THitData & c_rHitData = *itor; + + PrintfTabs(File, iTabCount, "Group HitData%02d\n", dwHitDataNumber); + PrintfTabs(File, iTabCount, "{\n"); + PrintfTabs(File, iTabCount+1, "AttackingStartTime %f\n", c_rHitData.fAttackStartTime); + PrintfTabs(File, iTabCount+1, "AttackingEndTime %f\n", c_rHitData.fAttackEndTime); + + PrintfTabs(File, iTabCount+1, "AttackingBone \"%s\"\n", c_rHitData.strBoneName.c_str()); + PrintfTabs(File, iTabCount+1, "WeaponLength %f\n", c_rHitData.fWeaponLength); + PrintfTabs(File, iTabCount+1, "List HitPosition\n"); + PrintfTabs(File, iTabCount+1, "{\n"); + + NRaceData::THitTimePositionMap::const_iterator it; + for(it = c_rHitData.mapHitPosition.begin(); it!= c_rHitData.mapHitPosition.end();++it) + { + PrintfTabs(File, iTabCount+2, "%f %f %f %f %f %f %f\n", it->first, + it->second.v3LastPosition.x, it->second.v3LastPosition.y, it->second.v3LastPosition.z, + it->second.v3Position.x, it->second.v3Position.y, it->second.v3Position.z); + } + PrintfTabs(File, iTabCount+1, "}\n"); + PrintfTabs(File, iTabCount, "}\n"); + } +} + +void NRaceData::SaveCollisionData(FILE * File, int iTabCount, const TCollisionData & c_rCollisionData) +{ + PrintfTabs(File, iTabCount, "CollisionType %d\n", c_rCollisionData.iCollisionType); + PrintfTabs(File, iTabCount, "\n"); + + const CSphereCollisionInstanceVector & c_rSphereDataVector = c_rCollisionData.SphereDataVector; + + PrintfTabs(File, iTabCount, "SphereDataCount %d\n", c_rSphereDataVector.size()); + + for (DWORD i = 0; i < c_rSphereDataVector.size(); ++i) + { + const TSphereData & c_rAttr = c_rSphereDataVector[i].GetAttribute(); + + PrintfTabs(File, iTabCount, "Group SphereData%02d\n", i); + + PrintfTabs(File, iTabCount, "{\n"); + + PrintfTabs(File, iTabCount+1, "Radius %f\n", + c_rAttr.fRadius); + + PrintfTabs(File, iTabCount+1, "Position %f %f %f\n", + c_rAttr.v3Position.x, + c_rAttr.v3Position.y, + c_rAttr.v3Position.z); + + PrintfTabs(File, iTabCount, "}\n"); + } +} + +///////////////////////////////////////////////////////////////////////////////// +// Attaching Data +void NRaceData::SaveAttachingData(FILE * File, int iTabCount, const TAttachingDataVector & c_rAttachingDataVector) +{ + DWORD dwAttachingDataCount = c_rAttachingDataVector.size(); + + PrintfTabs(File, iTabCount, "AttachingDataCount %d\n", dwAttachingDataCount); + PrintfTabs(File, iTabCount, "\n"); + + for (DWORD i = 0; i < dwAttachingDataCount; ++i) + { + const NRaceData::TAttachingData & c_rAttachingData = c_rAttachingDataVector[i]; + + PrintfTabs(File, iTabCount, "Group AttachingData%02d\n", i); + PrintfTabs(File, iTabCount, "{\n", i); + + PrintfTabs(File, iTabCount+1, "AttachingDataType %d\n", c_rAttachingData.dwType); + PrintfTabs(File, iTabCount+1, "\n", i); + + PrintfTabs(File, iTabCount+1, "isAttaching %d\n", c_rAttachingData.isAttaching); + PrintfTabs(File, iTabCount+1, "AttachingModelIndex %d\n", c_rAttachingData.dwAttachingModelIndex); + PrintfTabs(File, iTabCount+1, "AttachingBoneName \"%s\"\n", c_rAttachingData.strAttachingBoneName.c_str()); + PrintfTabs(File, iTabCount+1, "\n"); + + switch (c_rAttachingData.dwType) + { + case NRaceData::ATTACHING_DATA_TYPE_COLLISION_DATA: + NRaceData::SaveCollisionData(File, iTabCount+1, *c_rAttachingData.pCollisionData); + break; + case NRaceData::ATTACHING_DATA_TYPE_EFFECT: + NRaceData::SaveEffectData(File, iTabCount+1, *c_rAttachingData.pEffectData); + break; + case NRaceData::ATTACHING_DATA_TYPE_OBJECT: + NRaceData::SaveObjectData(File, iTabCount+1, *c_rAttachingData.pObjectData); + break; + } + + PrintfTabs(File, iTabCount, "}\n"); + + if (i != dwAttachingDataCount-1) + PrintfTabs(File, iTabCount, "\n"); + } +} + +BOOL NRaceData::LoadAttachingData(CTextFileLoader & rTextFileLoader, TAttachingDataVector * pAttachingDataVector) +{ + DWORD dwDataCount; + if (!rTextFileLoader.GetTokenDoubleWord("attachingdatacount", &dwDataCount)) + return false; + + pAttachingDataVector->clear(); + pAttachingDataVector->resize(dwDataCount); + + for (DWORD i = 0; i < dwDataCount; ++i) + { + NRaceData::TAttachingData & rAttachingData = pAttachingDataVector->at(i); + if (!rTextFileLoader.SetChildNode("attachingdata", i)) + return false; + + if (!rTextFileLoader.GetTokenDoubleWord("attachingdatatype", &rAttachingData.dwType)) + return false; + + if (!rTextFileLoader.GetTokenInteger("isattaching", &rAttachingData.isAttaching)) + return false; + if (!rTextFileLoader.GetTokenDoubleWord("attachingmodelindex", &rAttachingData.dwAttachingModelIndex)) + return false; + if (!rTextFileLoader.GetTokenString("attachingbonename", &rAttachingData.strAttachingBoneName)) + return false; + + switch (rAttachingData.dwType) + { + case NRaceData::ATTACHING_DATA_TYPE_COLLISION_DATA: + rAttachingData.pCollisionData = g_CollisionDataPool.Alloc(); + if (!NRaceData::LoadCollisionData(rTextFileLoader, rAttachingData.pCollisionData)) + return false; + break; + case NRaceData::ATTACHING_DATA_TYPE_EFFECT: + rAttachingData.pEffectData = g_EffectDataPool.Alloc(); + if (!NRaceData::LoadEffectData(rTextFileLoader, rAttachingData.pEffectData)) + return false; + break; + case NRaceData::ATTACHING_DATA_TYPE_OBJECT: + rAttachingData.pObjectData = g_ObjectDataPool.Alloc(); + if (!NRaceData::LoadObjectData(rTextFileLoader, rAttachingData.pObjectData)) + return false; + break; + } + + rTextFileLoader.SetParentNode(); + } + return TRUE; +} diff --git a/extension/src/port/GameLib/RaceDataFile.cpp b/extension/src/port/GameLib/RaceDataFile.cpp new file mode 100644 index 00000000..2ff18512 --- /dev/null +++ b/extension/src/port/GameLib/RaceDataFile.cpp @@ -0,0 +1,186 @@ +#include "StdAfx.h" +#include "../EterLib/ResourceManager.h" + +#include "RaceData.h" +#include "RaceMotionData.h" + +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// + +BOOL CRaceData::LoadRaceData(const char * c_szFileName) +{ + CTextFileLoader TextFileLoader; + if (!TextFileLoader.Load(c_szFileName)) + return FALSE; + + TextFileLoader.SetTop(); + + TextFileLoader.GetTokenString("basemodelfilename", &m_strBaseModelFileName); + TextFileLoader.GetTokenString("treefilename", &m_strTreeFileName); + TextFileLoader.GetTokenString("attributefilename", &m_strAttributeFileName); + TextFileLoader.GetTokenString("smokebonename", &m_strSmokeBoneName); + TextFileLoader.GetTokenString("motionlistfilename", &m_strMotionListFileName); + + if (!m_strTreeFileName.empty()) + { + CFileNameHelper::StringPath(m_strTreeFileName); + } + + CTokenVector* pSmokeTokenVector; + if (TextFileLoader.GetTokenVector("smokefilename", &pSmokeTokenVector)) + { + if (pSmokeTokenVector->size()%2!=0) + { + TraceError("SmokeFileName ArgCount[%d]%2==0", pSmokeTokenVector->size()); + return FALSE; + } + + UINT uLineCount=pSmokeTokenVector->size()/2; + + for (UINT uLine=0; uLineat(uLine*2+0).c_str()); + if (eSmoke<0 || eSmoke>=SMOKE_NUM) + { + TraceError("SmokeFileName SmokeNum[%d] OUT OF RANGE", eSmoke); + return FALSE; + } + + const std::string& c_rstrEffectFileName = pSmokeTokenVector->at(uLine*2+1); + + DWORD& rdwCRCEft=m_adwSmokeEffectID[eSmoke]; + if (!CEffectManager::Instance().RegisterEffect2(c_rstrEffectFileName.c_str(), &rdwCRCEft)) + { + TraceError("CRaceData::RegisterEffect2(%s) ERROR", c_rstrEffectFileName.c_str()); + rdwCRCEft=0; + return false; + } + } + } + + if (TextFileLoader.SetChildNode("shapedata")) + { + std::string strPathName; + DWORD dwShapeDataCount = 0; + if (TextFileLoader.GetTokenString("pathname", &strPathName) && + TextFileLoader.GetTokenDoubleWord("shapedatacount", &dwShapeDataCount)) + { + for (DWORD i = 0; i < dwShapeDataCount; ++i) + { + if (!TextFileLoader.SetChildNode("shapedata", i)) + { + continue; + } + + ///////////////////////// + // Temporary - 이벤트를 위한 임시 기능 + TextFileLoader.GetTokenString("specialpath", &strPathName); + ///////////////////////// + + DWORD dwShapeIndex; + if (!TextFileLoader.GetTokenDoubleWord("shapeindex", &dwShapeIndex)) + { + continue; + } + + // LOCAL_PATH_SUPPORT + std::string strModel; + if (TextFileLoader.GetTokenString("model", &strModel)) + { + SetShapeModel(dwShapeIndex, (strPathName + strModel).c_str()); + } + else + { + if (!TextFileLoader.GetTokenString("local_model", &strModel)) + continue; + + SetShapeModel(dwShapeIndex, strModel.c_str()); + } + // END_OF_LOCAL_PATH_SUPPORT + + + + std::string strSourceSkin; + std::string strTargetSkin; + + // LOCAL_PATH_SUPPORT + if (TextFileLoader.GetTokenString("local_sourceskin", &strSourceSkin) && + TextFileLoader.GetTokenString("local_targetskin", &strTargetSkin)) + { + AppendShapeSkin(dwShapeIndex, 0, strSourceSkin.c_str(), strTargetSkin.c_str()); + } + // END_OF_LOCAL_PATH_SUPPORT + + if (TextFileLoader.GetTokenString("sourceskin", &strSourceSkin) && + TextFileLoader.GetTokenString("targetskin", &strTargetSkin)) + { + AppendShapeSkin(dwShapeIndex, 0, (strPathName + strSourceSkin).c_str(), (strPathName + strTargetSkin).c_str()); + } + + if (TextFileLoader.GetTokenString("sourceskin2", &strSourceSkin) && + TextFileLoader.GetTokenString("targetskin2", &strTargetSkin)) + { + AppendShapeSkin(dwShapeIndex, 0, (strPathName + strSourceSkin).c_str(), (strPathName + strTargetSkin).c_str()); + } + + TextFileLoader.SetParentNode(); + } + } + + TextFileLoader.SetParentNode(); + } + + if (TextFileLoader.SetChildNode("hairdata")) + { + std::string strPathName; + DWORD dwHairDataCount = 0; + if (TextFileLoader.GetTokenString("pathname", &strPathName) && + TextFileLoader.GetTokenDoubleWord("hairdatacount", &dwHairDataCount)) + { + + for (DWORD i = 0; i < dwHairDataCount; ++i) + { + if (!TextFileLoader.SetChildNode("hairdata", i)) + { + continue; + } + + ///////////////////////// + // Temporary - 이벤트를 위한 임시 기능 + TextFileLoader.GetTokenString("specialpath", &strPathName); + ///////////////////////// + + DWORD dwShapeIndex; + if (!TextFileLoader.GetTokenDoubleWord("hairindex", &dwShapeIndex)) + { + continue; + } + + std::string strModel; + std::string strSourceSkin; + std::string strTargetSkin; + if (TextFileLoader.GetTokenString("model", &strModel) && + TextFileLoader.GetTokenString("sourceskin", &strSourceSkin) && + TextFileLoader.GetTokenString("targetskin", &strTargetSkin)) + { + SetHairSkin(dwShapeIndex, 0, (strPathName + strModel).c_str(), (strPathName + strSourceSkin).c_str(), (strPathName + strTargetSkin).c_str()); + } + + TextFileLoader.SetParentNode(); + } + } + + TextFileLoader.SetParentNode(); + } + + + if (TextFileLoader.SetChildNode("attachingdata")) + { + if (!NRaceData::LoadAttachingData(TextFileLoader, &m_AttachingDataVector)) + return FALSE; + + TextFileLoader.SetParentNode(); + } + + return TRUE; +} diff --git a/extension/src/port/GameLib/RaceMotionData.cpp b/extension/src/port/GameLib/RaceMotionData.cpp new file mode 100644 index 00000000..e0e8c70b --- /dev/null +++ b/extension/src/port/GameLib/RaceMotionData.cpp @@ -0,0 +1,617 @@ +#include "StdAfx.h" +#include "../EffectLib/EffectManager.h" +#include "FlyingObjectManager.h" +#include "RaceMotionData.h" + +CDynamicPool CRaceMotionData::ms_kPool; + +void CRaceMotionData::CreateSystem(UINT uCapacity) +{ + ms_kPool.Create(uCapacity); +} + +void CRaceMotionData::DestroySystem() +{ + ms_kPool.Clear(); +} + +CRaceMotionData* CRaceMotionData::New() +{ + return ms_kPool.Alloc(); +} + +void CRaceMotionData::Delete(CRaceMotionData* pkData) +{ + pkData->Destroy(); + + ms_kPool.Free(pkData); +} + +void CRaceMotionData::SetName(UINT eName) +{ + m_eName=eName; + + switch (m_eName) + { + case NAME_NONE: + SetType(TYPE_NONE); + break; + case NAME_WAIT: + case NAME_INTRO_WAIT: + case NAME_STOP: + SetType(TYPE_WAIT); + break; + case NAME_WALK: + case NAME_RUN: + SetType(TYPE_MOVE); + break; + case NAME_DAMAGE: + case NAME_DAMAGE_BACK: + SetType(TYPE_DAMAGE); + break; + case NAME_DAMAGE_FLYING: + case NAME_DAMAGE_FLYING_BACK: + SetType(TYPE_KNOCKDOWN); + break; + case NAME_STAND_UP: + case NAME_STAND_UP_BACK: + SetType(TYPE_STANDUP); + break; + case NAME_SPAWN: + case NAME_CHANGE_WEAPON: + case NAME_INTRO_SELECTED: + case NAME_INTRO_NOT_SELECTED: + case NAME_SPECIAL_1: + case NAME_SPECIAL_2: + case NAME_SPECIAL_3: + case NAME_SPECIAL_4: + case NAME_SPECIAL_5: + case NAME_SPECIAL_6: + case NAME_CLAP: + case NAME_DANCE_1: + case NAME_DANCE_2: + case NAME_DANCE_3: + case NAME_DANCE_4: + case NAME_DANCE_5: + case NAME_DANCE_6: + case NAME_CONGRATULATION: + case NAME_FORGIVE: + case NAME_ANGRY: + case NAME_ATTRACTIVE: + case NAME_SAD: + case NAME_SHY: + case NAME_CHEERUP: + case NAME_BANTER: + case NAME_JOY: + case NAME_CHEERS_1: + case NAME_CHEERS_2: + case NAME_KISS_WITH_WARRIOR: + case NAME_KISS_WITH_ASSASSIN: + case NAME_KISS_WITH_SURA: + case NAME_KISS_WITH_SHAMAN: + case NAME_FRENCH_KISS_WITH_WARRIOR: + case NAME_FRENCH_KISS_WITH_ASSASSIN: + case NAME_FRENCH_KISS_WITH_SURA: + case NAME_FRENCH_KISS_WITH_SHAMAN: + case NAME_SLAP_HIT_WITH_WARRIOR: + case NAME_SLAP_HIT_WITH_ASSASSIN: + case NAME_SLAP_HIT_WITH_SURA: + case NAME_SLAP_HIT_WITH_SHAMAN: + case NAME_SLAP_HURT_WITH_WARRIOR: + case NAME_SLAP_HURT_WITH_ASSASSIN: + case NAME_SLAP_HURT_WITH_SURA: + case NAME_SLAP_HURT_WITH_SHAMAN: + case NAME_DIG: + SetType(TYPE_EVENT); + break; + case NAME_DEAD: + case NAME_DEAD_BACK: + SetType(TYPE_DIE); + break; + case NAME_NORMAL_ATTACK: + SetType(TYPE_ATTACK); + break; + case NAME_COMBO_ATTACK_1: + case NAME_COMBO_ATTACK_2: + case NAME_COMBO_ATTACK_3: + case NAME_COMBO_ATTACK_4: + case NAME_COMBO_ATTACK_5: + case NAME_COMBO_ATTACK_6: + case NAME_COMBO_ATTACK_7: + case NAME_COMBO_ATTACK_8: + SetType(TYPE_COMBO); + break; + case NAME_FISHING_THROW: + case NAME_FISHING_WAIT: + case NAME_FISHING_REACT: + case NAME_FISHING_CATCH: + case NAME_FISHING_FAIL: + case NAME_FISHING_STOP: + SetType(TYPE_FISHING); + break; + default: + if (eName>=NAME_SKILL && eName<=NAME_SKILL+SKILL_NUM) + SetType(TYPE_SKILL); + else + TraceError("CRaceMotionData::SetName - UNKNOWN NAME %d", eName); + break; + } +} +void CRaceMotionData::SetType(UINT eType) +{ + m_eType=eType; + + switch (m_eType) + { + case TYPE_ATTACK: + case TYPE_COMBO: + case TYPE_SKILL: + m_isLock=TRUE; + break; + default: + m_isLock=FALSE; + break; + } +} + +UINT CRaceMotionData::GetType() const +{ + return m_eType; +} + +bool CRaceMotionData::IsLock() const +{ + return m_isLock ? true : false; +} + +int CRaceMotionData::GetLoopCount() const +{ + return m_iLoopCount; +} + +float CRaceMotionData::GetMotionDuration() +{ + return m_fMotionDuration; +} + +void CRaceMotionData::SetMotionDuration(float fDuration) +{ + m_fMotionDuration = fDuration; +} + +// Combo +BOOL CRaceMotionData::IsComboInputTimeData() const +{ + return m_isComboMotion; +} + +float CRaceMotionData::GetComboInputStartTime() const +{ + assert(m_isComboMotion); + return m_ComboInputData.fInputStartTime; +} + +float CRaceMotionData::GetNextComboTime() const +{ + assert(m_isComboMotion); + return m_ComboInputData.fNextComboTime; +} + +float CRaceMotionData::GetComboInputEndTime() const +{ + assert(m_isComboMotion); + return m_ComboInputData.fInputEndTime; +} + +// Attacking +BOOL CRaceMotionData::isAttackingMotion() const +{ + return m_isAttackingMotion; +} + +const NRaceData::TMotionAttackData * CRaceMotionData::GetMotionAttackDataPointer() const +{ + return & m_MotionAttackData; +} + +const NRaceData::TMotionAttackData & CRaceMotionData::GetMotionAttackDataReference() const +{ + assert(m_isAttackingMotion); + return m_MotionAttackData; +} + +BOOL CRaceMotionData::HasSplashMotionEvent() const +{ + return m_hasSplashEvent; +} + +// Skill +BOOL CRaceMotionData::IsCancelEnableSkill() const +{ + return m_bCancelEnableSkill; +} + +// Loop +BOOL CRaceMotionData::IsLoopMotion() const +{ + return m_isLoopMotion; +} + +float CRaceMotionData::GetLoopStartTime() const +{ + return m_fLoopStartTime; +} + +float CRaceMotionData::GetLoopEndTime() const +{ + return m_fLoopEndTime; +} + +// Motion Event Data +DWORD CRaceMotionData::GetMotionEventDataCount() const +{ + return m_MotionEventDataVector.size(); +} + +BOOL CRaceMotionData::GetMotionEventDataPointer(BYTE byIndex, const CRaceMotionData::TMotionEventData ** c_ppData) const +{ + if (byIndex >= m_MotionEventDataVector.size()) + return FALSE; + + *c_ppData = m_MotionEventDataVector[byIndex]; + + return TRUE; +} + +BOOL CRaceMotionData::GetMotionAttackingEventDataPointer(BYTE byIndex, const CRaceMotionData::TMotionAttackingEventData ** c_ppData) const +{ + if (byIndex >= m_MotionEventDataVector.size()) + return FALSE; + + const CRaceMotionData::TMotionEventData * pData = m_MotionEventDataVector[byIndex]; + const CRaceMotionData::TMotionAttackingEventData * pAttackingEvent = (const CRaceMotionData::TMotionAttackingEventData *)pData; + + if (MOTION_EVENT_TYPE_SPECIAL_ATTACKING == pAttackingEvent->iType) + return FALSE; + + *c_ppData = pAttackingEvent; + + return TRUE; +} + +int CRaceMotionData::GetEventType(DWORD dwIndex) const +{ + if (dwIndex >= m_MotionEventDataVector.size()) + return MOTION_EVENT_TYPE_NONE; + + return m_MotionEventDataVector[dwIndex]->iType; +} + +float CRaceMotionData::GetEventStartTime(DWORD dwIndex) const +{ + if (dwIndex >= m_MotionEventDataVector.size()) + return 0.0f; + + return m_MotionEventDataVector[dwIndex]->fStartingTime; +} + +const NSound::TSoundInstanceVector * CRaceMotionData::GetSoundInstanceVectorPointer() const +{ + return &m_SoundInstanceVector; +} + +void CRaceMotionData::SetAccumulationPosition(const TPixelPosition & c_rPos) +{ + m_accumulationPosition = c_rPos; + m_isAccumulationMotion = TRUE; +} + +bool CRaceMotionData::LoadMotionData(const char * c_szFileName) +{ + const float c_fFrameTime = 1.0f / g_fGameFPS; + + CTextFileLoader* pkTextFileLoader=CTextFileLoader::Cache(c_szFileName); + if (!pkTextFileLoader) + return false; + + CTextFileLoader& rkTextFileLoader=*pkTextFileLoader; + + if (rkTextFileLoader.IsEmpty()) + return false; + + rkTextFileLoader.SetTop(); + + if (!rkTextFileLoader.GetTokenString("motionfilename", &m_strMotionFileName)) + return false; + + if (!rkTextFileLoader.GetTokenFloat("motionduration", &m_fMotionDuration)) + return false; + + CTokenVector * pTokenVector; + + if (rkTextFileLoader.GetTokenVector("accumulation", &pTokenVector)) + { + if (pTokenVector->size() != 3) + { + TraceError("CRaceMotioNData::LoadMotionData : syntax error on accumulation, vector size %d", pTokenVector->size()); + return false; + } + + TPixelPosition pos(atof(pTokenVector->at(0).c_str()), + atof(pTokenVector->at(1).c_str()), + atof(pTokenVector->at(2).c_str())); + + SetAccumulationPosition(pos); + } + + std::string strNodeName; + for (DWORD i = 0; i < rkTextFileLoader.GetChildNodeCount(); ++i) + { + CTextFileLoader::CGotoChild GotoChild(&rkTextFileLoader, i); + + rkTextFileLoader.GetCurrentNodeName(&strNodeName); + + if (0 == strNodeName.compare("comboinputdata")) + { + m_isComboMotion = TRUE; + + if (!rkTextFileLoader.GetTokenFloat("preinputtime", &m_ComboInputData.fInputStartTime)) + return false; + if (!rkTextFileLoader.GetTokenFloat("directinputtime", &m_ComboInputData.fNextComboTime)) + return false; + if (!rkTextFileLoader.GetTokenFloat("inputlimittime", &m_ComboInputData.fInputEndTime)) + return false; + } + else if (0 == strNodeName.compare("attackingdata")) + { + m_isAttackingMotion = TRUE; + + if (!NRaceData::LoadMotionAttackData(rkTextFileLoader, &m_MotionAttackData)) + return false; + } + else if (0 == strNodeName.compare("loopdata")) + { + m_isLoopMotion = TRUE; + if (!rkTextFileLoader.GetTokenInteger("motionloopcount", &m_iLoopCount)) + { + m_iLoopCount = -1; + } + if (!rkTextFileLoader.GetTokenInteger("loopcancelenable", &m_bCancelEnableSkill)) + { + m_bCancelEnableSkill = FALSE; + } + if (!rkTextFileLoader.GetTokenFloat("loopstarttime", &m_fLoopStartTime)) + return false; + if (!rkTextFileLoader.GetTokenFloat("loopendtime", &m_fLoopEndTime)) + return false; + } + else if (0 == strNodeName.compare("motioneventdata")) + { + DWORD dwMotionEventDataCount; + + if (!rkTextFileLoader.GetTokenDoubleWord("motioneventdatacount", &dwMotionEventDataCount)) + continue; + + stl_wipe(m_MotionEventDataVector); + + m_MotionEventDataVector.resize(dwMotionEventDataCount, NULL); + + for (DWORD j = 0; j < m_MotionEventDataVector.size(); ++j) + { + if (!rkTextFileLoader.SetChildNode("event", j)) + return false; + + int iType; + if (!rkTextFileLoader.GetTokenInteger("motioneventtype", &iType)) + return false; + + TMotionEventData * pData = NULL; + switch(iType) + { + case MOTION_EVENT_TYPE_FLY: + pData = new TMotionFlyEventData; + break; + case MOTION_EVENT_TYPE_EFFECT: + pData = new TMotionEffectEventData; + break; + case MOTION_EVENT_TYPE_SCREEN_WAVING: + pData = new TScreenWavingEventData; + break; + case MOTION_EVENT_TYPE_SPECIAL_ATTACKING: + pData = new TMotionAttackingEventData; + m_hasSplashEvent = TRUE; + break; + case MOTION_EVENT_TYPE_SOUND: + pData = new TMotionSoundEventData; + break; + case MOTION_EVENT_TYPE_CHARACTER_SHOW: + pData = new TMotionCharacterShowEventData; + break; + case MOTION_EVENT_TYPE_CHARACTER_HIDE: + pData = new TMotionCharacterHideEventData; + break; + case MOTION_EVENT_TYPE_WARP: + pData = new TMotionWarpEventData; + break; + case MOTION_EVENT_TYPE_EFFECT_TO_TARGET: + pData = new TMotionEffectToTargetEventData; + break; + default: + assert(!" CRaceMotionData::LoadMotionData - Strange Event Type"); + return false; + break; + } + m_MotionEventDataVector[j] = pData; + m_MotionEventDataVector[j]->Load(rkTextFileLoader); + m_MotionEventDataVector[j]->iType = iType; + if (!rkTextFileLoader.GetTokenFloat("startingtime", &m_MotionEventDataVector[j]->fStartingTime)) + return false; + + m_MotionEventDataVector[j]->dwFrame = (m_MotionEventDataVector[j]->fStartingTime / c_fFrameTime); + + rkTextFileLoader.SetParentNode(); + } + } + } + + std::string strSoundFileNameTemp=c_szFileName; + strSoundFileNameTemp = CFileNameHelper::NoExtension(strSoundFileNameTemp); + strSoundFileNameTemp+= ".mss"; + + if (strSoundFileNameTemp.length() > 13) + { + const char * c_szHeader = &strSoundFileNameTemp[13]; + + m_strSoundScriptDataFileName = "sound/"; + m_strSoundScriptDataFileName += c_szHeader; + + LoadSoundScriptData(m_strSoundScriptDataFileName.c_str()); + } + + return true; +} +#ifdef WORLD_EDITOR +bool CRaceMotionData::SaveMotionData(const char * c_szFileName) +{ + FILE * File; + + SetFileAttributes(c_szFileName, FILE_ATTRIBUTE_NORMAL); + File = fopen(c_szFileName, "w"); + + if (!File) + { + TraceError("CRaceMotionData::SaveMotionData : cannot open file for writing (filename: %s)", c_szFileName); + return false; + } + + fprintf(File, "ScriptType MotionData\n"); + fprintf(File, "\n"); + + fprintf(File, "MotionFileName \"%s\"\n", m_strMotionFileName.c_str()); + fprintf(File, "MotionDuration %f\n", m_fMotionDuration); + + if (m_isAccumulationMotion) + fprintf(File, "Accumulation %.2f\t%.2f\t%.2f\n", m_accumulationPosition.x, m_accumulationPosition.y, m_accumulationPosition.z); + + fprintf(File, "\n"); + + if (m_isComboMotion) + { + fprintf(File, "Group ComboInputData\n"); + fprintf(File, "{\n"); + fprintf(File, " PreInputTime %f\n", m_ComboInputData.fInputStartTime); + fprintf(File, " DirectInputTime %f\n", m_ComboInputData.fNextComboTime); + fprintf(File, " InputLimitTime %f\n", m_ComboInputData.fInputEndTime); + fprintf(File, "}\n"); + fprintf(File, "\n"); + } + + if (m_isAttackingMotion) + { + fprintf(File, "Group AttackingData\n"); + fprintf(File, "{\n"); + NRaceData::SaveMotionAttackData(File, 1, m_MotionAttackData); + fprintf(File, "}\n"); + fprintf(File, "\n"); + } + + if (m_isLoopMotion) + { + fprintf(File, "Group LoopData\n"); + fprintf(File, "{\n"); + fprintf(File, " MotionLoopCount %d\n", m_iLoopCount); + fprintf(File, " LoopCancelEnable %d\n", m_bCancelEnableSkill); + fprintf(File, " LoopStartTime %f\n", m_fLoopStartTime); + fprintf(File, " LoopEndTime %f\n", m_fLoopEndTime); + fprintf(File, "}\n"); + fprintf(File, "\n"); + } + + if (!m_MotionEventDataVector.empty()) + { + fprintf(File, "Group MotionEventData\n"); + fprintf(File, "{\n"); + fprintf(File, " MotionEventDataCount %d\n", m_MotionEventDataVector.size()); + + for (DWORD j = 0; j < m_MotionEventDataVector.size(); ++j) + { + TMotionEventData * c_pData = m_MotionEventDataVector[j]; + + fprintf(File, " Group Event%02d\n", j); + fprintf(File, " {\n"); + fprintf(File, " MotionEventType %d\n", c_pData->iType); + fprintf(File, " StartingTime %f\n", c_pData->fStartingTime); + c_pData->Save(File, 2); + fprintf(File, " }\n"); + } + fprintf(File, "}\n"); + } + + fclose(File); + return true; +} +#endif +bool CRaceMotionData::LoadSoundScriptData(const char * c_szFileName) +{ + NSound::TSoundDataVector SoundDataVector; + if (!NSound::LoadSoundInformationPiece(c_szFileName, SoundDataVector)) + { + return false; + } + + NSound::DataToInstance(SoundDataVector, &m_SoundInstanceVector); + return true; +} + +const char * CRaceMotionData::GetMotionFileName() const +{ + return m_strMotionFileName.c_str(); +} + +const char * CRaceMotionData::GetSoundScriptFileName() const +{ + return m_strSoundScriptDataFileName.c_str(); +} + +void CRaceMotionData::Initialize() +{ + m_iLoopCount = 0; + m_fMotionDuration = 0.0f; + m_accumulationPosition.x = 0.0f; + m_accumulationPosition.y = 0.0f; + m_accumulationPosition.z = 0.0f; + m_fLoopStartTime = 0.0f; + m_fLoopEndTime = 0.0f; + + m_isAccumulationMotion = FALSE; + m_isComboMotion = FALSE; + m_isLoopMotion = FALSE; + m_isAttackingMotion = FALSE; + m_bCancelEnableSkill = FALSE; + + m_hasSplashEvent = FALSE; + + m_isLock = FALSE; + + m_eType=TYPE_NONE; + m_eName=NAME_NONE; + + m_MotionEventDataVector.clear(); + m_SoundInstanceVector.clear(); +} + +void CRaceMotionData::Destroy() +{ + stl_wipe(m_MotionEventDataVector); + Initialize(); +} + +CRaceMotionData::CRaceMotionData() +{ + Initialize(); +} + +CRaceMotionData::~CRaceMotionData() +{ + Destroy(); +} diff --git a/extension/src/port/UserInterface/CameraProcedure.cpp b/extension/src/port/UserInterface/CameraProcedure.cpp new file mode 100644 index 00000000..4716b669 --- /dev/null +++ b/extension/src/port/UserInterface/CameraProcedure.cpp @@ -0,0 +1,354 @@ +#include "StdAfx.h" +#include "PythonBackground.h" +#include "../EterLib/Camera.h" + +////////////////////////////////////////////////////////////////////////// +// 메세지 + +extern void SetHeightLog(bool isLog); + +float CCamera::CAMERA_MIN_DISTANCE = 200.0f; +float CCamera::CAMERA_MAX_DISTANCE = 2500.0f; + +void CCamera::ProcessTerrainCollision() +{ + CPythonBackground & rPythonBackground = CPythonBackground::Instance(); + D3DXVECTOR3 v3CollisionPoint; + + if (rPythonBackground.GetPickingPointWithRayOnlyTerrain(m_kTargetToCameraBottomRay, &v3CollisionPoint)) + { + SetCameraState(CAMERA_STATE_CANTGODOWN); + D3DXVECTOR3 v3CheckVector = m_v3Eye - 2.0f * m_fTerrainCollisionRadius * m_v3Up; + v3CheckVector.z = rPythonBackground.GetHeight(floorf(v3CheckVector.x), floorf(v3CheckVector.y)); + D3DXVECTOR3 v3NewEye = v3CheckVector + 2.0f * m_fTerrainCollisionRadius * m_v3Up; + if (v3NewEye.z > m_v3Eye.z) + { + //printf("ToCameraBottom(%f, %f, %f) TCR %f, UP(%f, %f, %f), new %f > old %f", + // v3CheckVector.x, v3CheckVector.y, v3CheckVector.z, + // m_fTerrainCollisionRadius, + // m_v3Up.x, m_v3Up.y, m_v3Up.z, + // v3NewEye.z, m_v3Eye.z); + SetEye(v3NewEye); + } + /* + SetCameraState(CAMERA_STATE_NORMAL); + D3DXVECTOR3 v3NewEye = v3CollisionPoint; + SetEye(v3NewEye); + */ + } + else + SetCameraState(CAMERA_STATE_NORMAL); + + if (rPythonBackground.GetPickingPointWithRayOnlyTerrain(m_kCameraBottomToTerrainRay, &v3CollisionPoint)) + { + SetCameraState(CAMERA_STATE_CANTGODOWN); + auto d3dd = (m_v3Eye - v3CollisionPoint); + if (D3DXVec3Length(&d3dd) < 2.0f * m_fTerrainCollisionRadius) + { + D3DXVECTOR3 v3NewEye = v3CollisionPoint + 2.0f * m_fTerrainCollisionRadius * m_v3Up; + //printf("CameraBottomToTerrain new %f > old %f", v3NewEye.z, m_v3Eye.z); + SetEye(v3NewEye); + } + } + else + SetCameraState(CAMERA_STATE_NORMAL); +/* + if (rPythonBackground.GetPickingPointWithRayOnlyTerrain(m_kCameraFrontToTerrainRay, &v3CollisionPoint)) + { + if (D3DXVec3Length(&(m_v3Eye - v3CollisionPoint)) < 4.0f * m_fTerrainCollisionRadius) + { + D3DXVECTOR3 v3NewEye = v3CollisionPoint - 4.0f * m_fTerrainCollisionRadius * m_v3View; + //printf("CameraFrontToTerrain new %f > old %f", v3NewEye.z, m_v3Eye.z); + SetEye(v3NewEye); + } + } + + if (rPythonBackground.GetPickingPointWithRayOnlyTerrain(m_kCameraBackToTerrainRay, &v3CollisionPoint)) + { + if (D3DXVec3Length(&(m_v3Eye - v3CollisionPoint)) < m_fTerrainCollisionRadius) + { + D3DXVECTOR3 v3NewEye = v3CollisionPoint + m_fTerrainCollisionRadius * m_v3View; + //printf("CameraBackToTerrain new %f > old %f", v3NewEye.z, m_v3Eye.z); + SetEye(v3NewEye); + } + } + + // Left + if (rPythonBackground.GetPickingPointWithRayOnlyTerrain(m_kCameraLeftToTerrainRay, &v3CollisionPoint)) + { + SetCameraState(CAMERA_STATE_CANTGOLEFT); + if (D3DXVec3Length(&(m_v3Eye - v3CollisionPoint)) < 3.0f * m_fTerrainCollisionRadius) + { + D3DXVECTOR3 v3NewEye = v3CollisionPoint + 3.0f * m_fTerrainCollisionRadius * m_v3Cross; + //printf("CameraLeftToTerrain new %f > old %f", v3NewEye.z, m_v3Eye.z); + SetEye(v3NewEye); + } + } + else + SetCameraState(CAMERA_STATE_NORMAL); + + // Right + if (rPythonBackground.GetPickingPointWithRayOnlyTerrain(m_kCameraRightToTerrainRay, &v3CollisionPoint)) + { + SetCameraState(CAMERA_STATE_CANTGORIGHT); + if (D3DXVec3Length(&(m_v3Eye - v3CollisionPoint)) < 3.0f * m_fTerrainCollisionRadius) + { + D3DXVECTOR3 v3NewEye = v3CollisionPoint - 3.0f * m_fTerrainCollisionRadius * m_v3Cross; + //printf("CameraRightToTerrain new %f > old %f", v3NewEye.z, m_v3Eye.z); + SetEye(v3NewEye); + } + } + else + SetCameraState(CAMERA_STATE_NORMAL); + */ +} + +struct CameraCollisionChecker +{ + bool m_isBlocked; + std::vector* m_pkVct_v3Position; + CDynamicSphereInstance * m_pdsi; + + CameraCollisionChecker(CDynamicSphereInstance * pdsi, std::vector* pkVct_v3Position) : m_pdsi(pdsi), m_pkVct_v3Position(pkVct_v3Position), m_isBlocked(false) + { + } + void operator () (CGraphicObjectInstance* pOpponent) + { + if (pOpponent->CollisionDynamicSphere(*m_pdsi)) + { + m_pkVct_v3Position->push_back(pOpponent->GetPosition()); + m_isBlocked = true; + } + } +}; + +void CCamera::ProcessBuildingCollision() +{ + float fMoveAmountSmall = 2.0f; + float fMoveAmountLarge = 4.0f; + + D3DXVECTOR3 v3CheckVector; + + CDynamicSphereInstance s; + s.fRadius = m_fObjectCollisionRadius; + s.v3LastPosition = m_v3Eye; + + Vector3d aVector3d; + aVector3d.Set(m_v3Eye.x, m_v3Eye.y, m_v3Eye.z); + + // 뒤 + + CCullingManager & rkCullingMgr = CCullingManager::Instance(); + + { + v3CheckVector = m_v3Eye - m_fObjectCollisionRadius * m_v3View; + s.v3Position = v3CheckVector; + + std::vector kVct_kPosition; + CameraCollisionChecker kCameraCollisionChecker(&s, &kVct_kPosition); + rkCullingMgr.ForInRange(aVector3d, m_fObjectCollisionRadius, &kCameraCollisionChecker); + bool bCollide = kCameraCollisionChecker.m_isBlocked; + + if (bCollide) + { + if (m_v3AngularVelocity.y > 0.0f) + { + m_v3AngularVelocity.y = 0.0f; + m_v3AngularVelocity.z += fMoveAmountLarge; + } + // m_v3AngularVelocity.y = fMAX(fMoveAmountSmall, m_v3AngularVelocity.y); + //// m_v3AngularVelocity.y += fMoveAmountSmall; + + if (kVct_kPosition.size() > 1) + { + // m_v3AngularVelocity.z = fMAX(fMoveAmountSmall, m_v3AngularVelocity.z); + m_v3AngularVelocity.z += fMoveAmountSmall; + } + else + { + auto d3dd = (kVct_kPosition[0] - m_v3Eye); + D3DXVec3Cross(&v3CheckVector, &d3dd, &m_v3View); + float fDot = D3DXVec3Dot(&v3CheckVector, &m_v3Up); + if (fDot < 0) + { + // m_v3AngularVelocity.x = fMIN(-fMoveAmountSmall, m_v3AngularVelocity.x); + m_v3AngularVelocity.x -= fMoveAmountSmall; + } + else if(fDot > 0) + { + // m_v3AngularVelocity.x = fMAX(fMoveAmountSmall, m_v3AngularVelocity.x); + m_v3AngularVelocity.x += fMoveAmountSmall; + } + else + { + // m_v3AngularVelocity.z = fMAX(fMoveAmountSmall, m_v3AngularVelocity.z); + m_v3AngularVelocity.z += fMoveAmountSmall; + } + } + } + } + + // 위 + { + v3CheckVector = m_v3Eye + 2.0f * m_fObjectCollisionRadius * m_v3Up; + s.v3Position = v3CheckVector; + + std::vector kVct_kPosition; + CameraCollisionChecker kCameraCollisionChecker(&s, &kVct_kPosition); + rkCullingMgr.ForInRange(aVector3d, m_fObjectCollisionRadius, &kCameraCollisionChecker); + bool bCollide = kCameraCollisionChecker.m_isBlocked; + + if (bCollide) + { + m_v3AngularVelocity.z = fMIN(-fMoveAmountSmall, m_v3AngularVelocity.y); + // m_v3AngularVelocity.z -= 1.0f; + } + } + + // 좌 + { + v3CheckVector = m_v3Eye + 3.0f * m_fObjectCollisionRadius * m_v3Cross; + s.v3Position = v3CheckVector; + + std::vector kVct_kPosition; + CameraCollisionChecker kCameraCollisionChecker(&s, &kVct_kPosition); + rkCullingMgr.ForInRange(aVector3d, m_fObjectCollisionRadius, &kCameraCollisionChecker); + bool bCollide = kCameraCollisionChecker.m_isBlocked; + + if (bCollide) + { + if (m_v3AngularVelocity.x > 0.0f) + { + m_v3AngularVelocity.x = 0.0f; + m_v3AngularVelocity.y += fMoveAmountLarge; + } + } + } + + // 우 + { + v3CheckVector = m_v3Eye - 3.0f * m_fObjectCollisionRadius * m_v3Cross; + s.v3Position = v3CheckVector; + + std::vector kVct_kPosition; + CameraCollisionChecker kCameraCollisionChecker(&s, &kVct_kPosition); + rkCullingMgr.ForInRange(aVector3d, m_fObjectCollisionRadius, &kCameraCollisionChecker); + bool bCollide = kCameraCollisionChecker.m_isBlocked; + + if (bCollide) + { + if (m_v3AngularVelocity.x < 0.0f) + { + m_v3AngularVelocity.x = 0.0f; + m_v3AngularVelocity.y += fMoveAmountLarge; + } + } + } + + // 아래 + { + v3CheckVector = m_v3Eye - 2.0f * m_fTerrainCollisionRadius * m_v3Up; + s.v3Position = v3CheckVector; + + std::vector kVct_kPosition; + CameraCollisionChecker kCameraCollisionChecker(&s, &kVct_kPosition); + rkCullingMgr.ForInRange(aVector3d, m_fObjectCollisionRadius, &kCameraCollisionChecker); + bool bCollide = kCameraCollisionChecker.m_isBlocked; + + if (bCollide) + { + if (m_v3AngularVelocity.z < 0.0f) + { + m_v3AngularVelocity.z = 0.0f; + m_v3AngularVelocity.y += fMoveAmountLarge; + } + } + } + + // 앞 + { + v3CheckVector = m_v3Eye + 4.0f * m_fObjectCollisionRadius * m_v3View; + s.v3Position = v3CheckVector; + + std::vector kVct_kPosition; + CameraCollisionChecker kCameraCollisionChecker(&s, &kVct_kPosition); + rkCullingMgr.ForInRange(aVector3d, m_fObjectCollisionRadius, &kCameraCollisionChecker); + bool bCollide = kCameraCollisionChecker.m_isBlocked; + + if (bCollide) + { + if (m_v3AngularVelocity.y < 0.0f) + { + m_v3AngularVelocity.y = 0.0f; + m_v3AngularVelocity.z += fMoveAmountLarge; + } + + if (kVct_kPosition.size() > 1) + { + // m_v3AngularVelocity.z = fMAX(fMoveAmountLarge, m_v3AngularVelocity.z); + m_v3AngularVelocity.z += fMoveAmountLarge; + } + else + { + auto d3dd = (kVct_kPosition[0] - m_v3Eye); + D3DXVec3Cross(&v3CheckVector, &d3dd, &m_v3View); + float fDot = D3DXVec3Dot(&v3CheckVector, &m_v3Up); + if (fDot < 0) + { + // m_v3AngularVelocity.x = fMIN(-fMoveAmountSmall, m_v3AngularVelocity.x); + m_v3AngularVelocity.x -= fMoveAmountSmall; + } + else if(fDot > 0) + { + // m_v3AngularVelocity.x = fMAX(fMoveAmountSmall, m_v3AngularVelocity.x); + m_v3AngularVelocity.x += fMoveAmountSmall; + } + else + { + // m_v3AngularVelocity.z = fMAX(fMoveAmountSmall, m_v3AngularVelocity.z); + m_v3AngularVelocity.z += fMoveAmountSmall; + } + } + } + } +} + +void CCamera::Update() +{ +// ProcessBuildingCollision(); + + RotateEyeAroundTarget(m_v3AngularVelocity.z, m_v3AngularVelocity.x); + + float fNewDistance=fMAX(CAMERA_MIN_DISTANCE, fMIN( CAMERA_MAX_DISTANCE, GetDistance() - m_v3AngularVelocity.y ) ); + SetDistance(fNewDistance); + + if (m_bProcessTerrainCollision) + ProcessTerrainCollision(); + + m_v3AngularVelocity *= 0.5f; + if (fabs(m_v3AngularVelocity.x) < 1.0f) + m_v3AngularVelocity.x = 0.0f; + if (fabs(m_v3AngularVelocity.y) < 1.0f) + m_v3AngularVelocity.y = 0.0f; + if (fabs(m_v3AngularVelocity.z) < 1.0f) + m_v3AngularVelocity.z = 0.0f; + + const float CAMERA_MOVABLE_DISTANCE = CAMERA_MAX_DISTANCE - CAMERA_MIN_DISTANCE; + const float CAMERA_TARGET_DELTA = CAMERA_TARGET_FACE - CAMERA_TARGET_STANDARD; + float fCameraCurMovableDistance=CAMERA_MAX_DISTANCE - GetDistance(); + float fNewTargetHeight = CAMERA_TARGET_STANDARD + CAMERA_TARGET_DELTA * fCameraCurMovableDistance / CAMERA_MOVABLE_DISTANCE; + + SetTargetHeight(fNewTargetHeight); + + // Cinematic +#ifdef __20040725_CAMERA_WORK__ + m_MovementPosition += m_MovementSpeed; + + if (0.0f != m_MovementPosition.m_fViewDir) + MoveFront(m_MovementPosition.m_fViewDir); + if (0.0f != m_MovementPosition.m_fCrossDir) + MoveAlongCross(m_MovementPosition.m_fCrossDir); + if (0.0f != m_MovementPosition.m_fUpDir) + MoveVertical(m_MovementPosition.m_fUpDir); +#endif +} diff --git a/extension/src/port/UserInterface/PythonCharacterManagerModule.cpp b/extension/src/port/UserInterface/PythonCharacterManagerModule.cpp new file mode 100644 index 00000000..c87a89d3 --- /dev/null +++ b/extension/src/port/UserInterface/PythonCharacterManagerModule.cpp @@ -0,0 +1,844 @@ +#include "StdAfx.h" +#include "PythonCharacterManager.h" +#include "PythonBackground.h" +#include "InstanceBase.h" +#include "../GameLib/RaceManager.h" + +////////////////////////////////////////////////////////////////////////// +// RaceData 관련 시작 +////////////////////////////////////////////////////////////////////////// + +PyObject * chrmgrSetEmpireNameMode(PyObject* poSelf, PyObject* poArgs) +{ + int iEnable; + if (!PyTuple_GetInteger(poArgs, 0, &iEnable)) + return Py_BadArgument(); + + CInstanceBase::SetEmpireNameMode(iEnable ? true : false); + CPythonCharacterManager::Instance().RefreshAllPCTextTail(); + + return Py_BuildNone(); +} + +PyObject * chrmgrRegisterTitleName(PyObject* poSelf, PyObject* poArgs) +{ + int iIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iIndex)) + return Py_BadArgument(); + char * szTitleName; + if (!PyTuple_GetString(poArgs, 1, &szTitleName)) + return Py_BadArgument(); + + CInstanceBase::RegisterTitleName(iIndex, szTitleName); + return Py_BuildNone(); +} + +PyObject * chrmgrRegisterNameColor(PyObject* poSelf, PyObject* poArgs) +{ + int index; + if (!PyTuple_GetInteger(poArgs, 0, &index)) + return Py_BadArgument(); + + int ir; + if (!PyTuple_GetInteger(poArgs, 1, &ir)) + return Py_BadArgument(); + int ig; + if (!PyTuple_GetInteger(poArgs, 2, &ig)) + return Py_BadArgument(); + int ib; + if (!PyTuple_GetInteger(poArgs, 3, &ib)) + return Py_BadArgument(); + + CInstanceBase::RegisterNameColor(index, ir, ig, ib); + return Py_BuildNone(); +} + +PyObject * chrmgrRegisterTitleColor(PyObject* poSelf, PyObject* poArgs) +{ + int iIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iIndex)) + return Py_BadArgument(); + int ir; + if (!PyTuple_GetInteger(poArgs, 1, &ir)) + return Py_BadArgument(); + int ig; + if (!PyTuple_GetInteger(poArgs, 2, &ig)) + return Py_BadArgument(); + int ib; + if (!PyTuple_GetInteger(poArgs, 3, &ib)) + return Py_BadArgument(); + + CInstanceBase::RegisterTitleColor(iIndex, ir, ig, ib); + return Py_BuildNone(); +} + +PyObject * chrmgrGetPickedVID(PyObject* poSelf, PyObject* poArgs) +{ + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + + DWORD dwPickedActorID; + if (rkChrMgr.OLD_GetPickedInstanceVID(&dwPickedActorID)) + return Py_BuildValue("i", dwPickedActorID); + else + return Py_BuildValue("i", -1); +} + +PyObject * chrmgrGetVIDInfo(PyObject* poSelf, PyObject* poArgs) +{ + int nVID; + if (!PyTuple_GetInteger(poArgs, 0, &nVID)) + return Py_BadArgument(); + + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + + char szDetail[256]=""; + CInstanceBase* pkInstBase=rkChrMgr.GetInstancePtr(nVID); + if (pkInstBase) + { + TPixelPosition kPPosInst; + pkInstBase->NEW_GetPixelPosition(&kPPosInst); + + LONG xInst=kPPosInst.x; + LONG yInst=kPPosInst.y; + + CPythonBackground& rkBG=CPythonBackground::Instance(); + rkBG.LocalPositionToGlobalPosition(xInst, yInst); + sprintf(szDetail, "pos=(%d, %d)", xInst, yInst); + } + + + char szInfo[1024]; + sprintf(szInfo, "VID %d (isRegistered=%d, isAlive=%d, isDead=%d) %s", + nVID, + rkChrMgr.IsRegisteredVID(nVID), + rkChrMgr.IsAliveVID(nVID), + rkChrMgr.IsDeadVID(nVID), + szDetail + ); + + return Py_BuildValue("s", szInfo); +} + + +PyObject * chrmgrSetPathName(PyObject* poSelf, PyObject* poArgs) +{ + char * szPathName; + if (!PyTuple_GetString(poArgs, 0, &szPathName)) + return Py_BadArgument(); + + CRaceManager::Instance().SetPathName(szPathName); + return Py_BuildNone(); +} + +PyObject * chrmgrCreateRace(PyObject * poSelf, PyObject * poArgs) +{ + int iRace; + if (!PyTuple_GetInteger(poArgs, 0, &iRace)) + return Py_BadArgument(); + + CRaceManager::Instance().CreateRace(iRace); + return Py_BuildNone(); +} + +PyObject * chrmgrSelectRace(PyObject * poSelf, PyObject * poArgs) +{ + int iRace; + if (!PyTuple_GetInteger(poArgs, 0, &iRace)) + return Py_BadArgument(); + + CRaceManager::Instance().SelectRace(iRace); + return Py_BuildNone(); +} + +PyObject * chrmgrRegisterAttachingBoneName(PyObject * poSelf, PyObject * poArgs) +{ + int iPartIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iPartIndex)) + return Py_BadArgument(); + char * szBoneName; + if (!PyTuple_GetString(poArgs, 1, &szBoneName)) + return Py_BadArgument(); + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + pRaceData->RegisterAttachingBoneName(iPartIndex, szBoneName); + return Py_BuildNone(); +} + +PyObject * chrmgrRegisterMotionMode(PyObject* poSelf, PyObject* poArgs) +{ + int iMotionIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iMotionIndex)) + return Py_BadArgument(); + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + pRaceData->RegisterMotionMode(iMotionIndex); + return Py_BuildNone(); +} + + + +PyObject * chrmgrSetMotionRandomWeight(PyObject* poSelf, PyObject* poArgs) +{ + int iMode; + if (!PyTuple_GetInteger(poArgs, 0, &iMode)) + return Py_BadArgument(); + + int iMotion; + if (!PyTuple_GetInteger(poArgs, 1, &iMotion)) + return Py_BadArgument(); + + int iSubMotion; + if (!PyTuple_GetInteger(poArgs, 2, &iSubMotion)) + return Py_BadArgument(); + + int iPercentage; + if (!PyTuple_GetInteger(poArgs, 3, &iPercentage)) + return Py_BadArgument(); + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + if (!pRaceData->SetMotionRandomWeight(iMode, iMotion, iSubMotion, iPercentage)) + Py_BuildException("Failed to SetMotionRandomWeight"); + + return Py_BuildNone(); +} + +PyObject * chrmgrRegisterNormalAttack(PyObject* poSelf, PyObject* poArgs) +{ + int iMode; + if (!PyTuple_GetInteger(poArgs, 0, &iMode)) + return Py_BadArgument(); + + int iMotion; + if (!PyTuple_GetInteger(poArgs, 1, &iMotion)) + return Py_BadArgument(); + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + pRaceData->RegisterNormalAttack(iMode, iMotion); + return Py_BuildNone(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// 없어질 함수들 +PyObject * chrmgrReserveComboAttack(PyObject* poSelf, PyObject* poArgs) +{ + int iMode; + if (!PyTuple_GetInteger(poArgs, 0, &iMode)) + return Py_BadArgument(); + + int iCount; + if (!PyTuple_GetInteger(poArgs, 1, &iCount)) + return Py_BadArgument(); + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + pRaceData->ReserveComboAttack(iMode, 0, iCount); + return Py_BuildNone(); +} + +PyObject * chrmgrRegisterComboAttack(PyObject* poSelf, PyObject* poArgs) +{ + int iMode; + if (!PyTuple_GetInteger(poArgs, 0, &iMode)) + return Py_BadArgument(); + + int iComboIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iComboIndex)) + return Py_BadArgument(); + + int iMotionIndex; + if (!PyTuple_GetInteger(poArgs, 2, &iMotionIndex)) + return Py_BadArgument(); + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + pRaceData->RegisterComboAttack(iMode, 0, iComboIndex, iMotionIndex); + return Py_BuildNone(); +} +// 없어질 함수들 +/////////////////////////////////////////////////////////////////////////////////////////////////// + +PyObject * chrmgrReserveComboAttackNew(PyObject* poSelf, PyObject* poArgs) +{ + int iMotionMode; + if (!PyTuple_GetInteger(poArgs, 0, &iMotionMode)) + return Py_BadArgument(); + + int iComboType; + if (!PyTuple_GetInteger(poArgs, 1, &iComboType)) + return Py_BadArgument(); + + int iCount; + if (!PyTuple_GetInteger(poArgs, 2, &iCount)) + return Py_BadArgument(); + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + pRaceData->ReserveComboAttack(iMotionMode, iComboType, iCount); + return Py_BuildNone(); +} + +PyObject * chrmgrRegisterComboAttackNew(PyObject* poSelf, PyObject* poArgs) +{ + int iMotionMode; + if (!PyTuple_GetInteger(poArgs, 0, &iMotionMode)) + return Py_BadArgument(); + + int iComboType; + if (!PyTuple_GetInteger(poArgs, 1, &iComboType)) + return Py_BadArgument(); + + int iComboIndex; + if (!PyTuple_GetInteger(poArgs, 2, &iComboIndex)) + return Py_BadArgument(); + + int iMotionIndex; + if (!PyTuple_GetInteger(poArgs, 3, &iMotionIndex)) + return Py_BadArgument(); + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + pRaceData->RegisterComboAttack(iMotionMode, iComboType, iComboIndex, iMotionIndex); + return Py_BuildNone(); +} + +PyObject * chrmgrLoadRaceData(PyObject* poSelf, PyObject* poArgs) +{ + char* szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BadArgument(); + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + const char * c_szFullFileName = CRaceManager::Instance().GetFullPathFileName(szFileName); + if (!pRaceData->LoadRaceData(c_szFullFileName)) + { + TraceError("Failed to load race data : %s\n", c_szFullFileName); + } + + return Py_BuildNone(); +} + +PyObject * chrmgrLoadLocalRaceData(PyObject* poSelf, PyObject* poArgs) +{ + char* szFileName; + if (!PyTuple_GetString(poArgs, 0, &szFileName)) + return Py_BadArgument(); + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + if (!pRaceData->LoadRaceData(szFileName)) + { + TraceError("Failed to load race data : %s\n", szFileName); + } + + return Py_BuildNone(); +} + +/* +PyObject * chrmgrRegisterMotion(PyObject* poSelf, PyObject* poArgs) +{ + int iMode; + if (!PyTuple_GetInteger(poArgs, 0, &iMode)) + return Py_BadArgument(); + + int iMotion; + if (!PyTuple_GetInteger(poArgs, 1, &iMotion)) + return Py_BadArgument(); + + char* szFileName; + if (!PyTuple_GetString(poArgs, 2, &szFileName)) + return Py_BadArgument(); + + int iWeight = 0; + PyTuple_GetInteger(poArgs, 3, &iWeight); + iWeight = MIN(100, iWeight); + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + pRaceData->NEW_RegisterMotion(iMode, iMotion, CRaceManager::Instance().GetFullPathFileName(szFileName), iWeight); + return Py_BuildNone(); +} +*/ + +PyObject * chrmgrRegisterCacheMotionData(PyObject* poSelf, PyObject* poArgs) +{ + int iMode; + if (!PyTuple_GetInteger(poArgs, 0, &iMode)) + return Py_BadArgument(); + + int iMotion; + if (!PyTuple_GetInteger(poArgs, 1, &iMotion)) + return Py_BadArgument(); + + char * szFileName; + if (!PyTuple_GetString(poArgs, 2, &szFileName)) + return Py_BadArgument(); + + int iWeight = 0; + PyTuple_GetInteger(poArgs, 3, &iWeight); + iWeight = MIN(100, iWeight); + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + const char * c_szFullFileName = CRaceManager::Instance().GetFullPathFileName(szFileName); + CGraphicThing* pkMotionThing=pRaceData->RegisterMotionData(iMode, iMotion, c_szFullFileName, iWeight); + + if (pkMotionThing) + CResourceManager::Instance().LoadStaticCache(pkMotionThing->GetFileName()); + + return Py_BuildNone(); +} + +PyObject * chrmgrRegisterMotionData(PyObject* poSelf, PyObject* poArgs) +{ + int iMode; + if (!PyTuple_GetInteger(poArgs, 0, &iMode)) + return Py_BadArgument(); + + int iMotion; + if (!PyTuple_GetInteger(poArgs, 1, &iMotion)) + return Py_BadArgument(); + + char * szFileName; + if (!PyTuple_GetString(poArgs, 2, &szFileName)) + return Py_BadArgument(); + + int iWeight = 0; + PyTuple_GetInteger(poArgs, 3, &iWeight); + iWeight = MIN(100, iWeight); + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + const char * c_szFullFileName = CRaceManager::Instance().GetFullPathFileName(szFileName); + pRaceData->RegisterMotionData(iMode, iMotion, c_szFullFileName, iWeight); + + return Py_BuildNone(); +} + +PyObject * chrmgrRegisterRaceSrcName(PyObject* poSelf, PyObject* poArgs) +{ + char * szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BadArgument(); + + char * szSrcName; + if (!PyTuple_GetString(poArgs, 1, &szSrcName)) + return Py_BadArgument(); + + CRaceManager::Instance().RegisterRaceSrcName(szName, szSrcName); + + return Py_BuildNone(); +} + +PyObject * chrmgrRegisterRaceName(PyObject* poSelf, PyObject* poArgs) +{ + int iRaceIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iRaceIndex)) + return Py_BadArgument(); + + char * szName; + if (!PyTuple_GetString(poArgs, 1, &szName)) + return Py_BadArgument(); + + CRaceManager::Instance().RegisterRaceName(iRaceIndex, szName); + + return Py_BuildNone(); +} + +PyObject * chrmgrSetShapeModel(PyObject* poSelf, PyObject* poArgs) +{ + int eShape; + if (!PyTuple_GetInteger(poArgs, 0, &eShape)) + return Py_BadArgument(); + + char * szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BadArgument(); + + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + pRaceData->SetShapeModel(eShape, szFileName); + return Py_BuildNone(); +} + +PyObject * chrmgrAppendShapeSkin(PyObject* poSelf, PyObject* poArgs) +{ + int eShape; + if (!PyTuple_GetInteger(poArgs, 0, &eShape)) + return Py_BadArgument(); + + int ePart; + if (!PyTuple_GetInteger(poArgs, 1, &ePart)) + return Py_BadArgument(); + + char * szSrcFileName; + if (!PyTuple_GetString(poArgs, 2, &szSrcFileName)) + return Py_BadArgument(); + + char * szDstFileName; + if (!PyTuple_GetString(poArgs, 3, &szDstFileName)) + return Py_BadArgument(); + + CRaceData * pRaceData = CRaceManager::Instance().GetSelectedRaceDataPointer(); + if (!pRaceData) + return Py_BuildException("RaceData has not selected!"); + + pRaceData->AppendShapeSkin(eShape, ePart, szSrcFileName, szDstFileName); + return Py_BuildNone(); +} +////////////////////////////////////////////////////////////////////////// +// RaceData 관련 끝 +////////////////////////////////////////////////////////////////////////// + +PyObject * chrmgrSetMovingSpeed(PyObject* poSelf, PyObject* poArgs) +{ +#ifndef _DISTRIBUTE + int nMovSpd; + if (!PyTuple_GetInteger(poArgs, 0, &nMovSpd)) + return Py_BadArgument(); + + if (nMovSpd<0) + return Py_BuildException("MovingSpeed < 0"); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + + if (!pkInst) + return Py_BuildException("MainCharacter has not selected!"); + + pkInst->SetMoveSpeed(nMovSpd); +#endif + return Py_BuildNone(); +} + +PyObject * chrmgrRegisterEffect(PyObject* poSelf, PyObject* poArgs) +{ + int eEftType; + if (!PyTuple_GetInteger(poArgs, 0, &eEftType)) + return Py_BadArgument(); + + char * szBoneName; + if (!PyTuple_GetString(poArgs, 1, &szBoneName)) + return Py_BadArgument(); + + char * szPathName; + if (!PyTuple_GetString(poArgs, 2, &szPathName)) + return Py_BadArgument(); + + CInstanceBase::RegisterEffect(eEftType, szBoneName, szPathName, false); + return Py_BuildNone(); +} + +PyObject * chrmgrRegisterCacheEffect(PyObject* poSelf, PyObject* poArgs) +{ + int eEftType; + if (!PyTuple_GetInteger(poArgs, 0, &eEftType)) + return Py_BadArgument(); + + char * szBoneName; + if (!PyTuple_GetString(poArgs, 1, &szBoneName)) + return Py_BadArgument(); + + char * szPathName; + if (!PyTuple_GetString(poArgs, 2, &szPathName)) + return Py_BadArgument(); + + CInstanceBase::RegisterEffect(eEftType, szBoneName, szPathName, true); + + return Py_BuildNone(); +} + +PyObject * chrmgrSetDustGap(PyObject* poSelf, PyObject* poArgs) +{ + int nGap; + if (!PyTuple_GetInteger(poArgs, 0, &nGap)) + return Py_BadArgument(); + + CInstanceBase::SetDustGap(nGap); + return Py_BuildNone(); +} + +PyObject * chrmgrSetHorseDustGap(PyObject* poSelf, PyObject* poArgs) +{ + int nGap; + if (!PyTuple_GetInteger(poArgs, 0, &nGap)) + return Py_BadArgument(); + + CInstanceBase::SetHorseDustGap(nGap); + return Py_BuildNone(); +} + +PyObject * chrmgrToggleDirectionLine(PyObject* poSelf, PyObject* poArgs) +{ + static bool s_isVisible=true; + CActorInstance::ShowDirectionLine(s_isVisible); + + s_isVisible=!s_isVisible; + return Py_BuildNone(); +} + +PyObject * chrmgrRegisterPointEffect(PyObject* poSelf, PyObject* poArgs) +{ + int iEft; + if (!PyTuple_GetInteger(poArgs, 0, &iEft)) + return Py_BadArgument(); + + char * szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BadArgument(); + + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + rkChrMgr.RegisterPointEffect(iEft, szFileName); + return Py_BuildNone(); +} + +PyObject * chrmgrShowPointEffect(PyObject* poSelf, PyObject* poArgs) +{ + int nVID; + if (!PyTuple_GetInteger(poArgs, 0, &nVID)) + return Py_BadArgument(); + + int nEft; + if (!PyTuple_GetInteger(poArgs, 1, &nEft)) + return Py_BadArgument(); + + CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance(); + rkChrMgr.ShowPointEffect(nEft, nVID >= 0 ? nVID : 0xffffffff); + return Py_BuildNone(); +} + + +void CPythonCharacterManager::SCRIPT_SetAffect(DWORD dwVID, DWORD eState, BOOL isVisible) +{ + CInstanceBase * pkInstSel = (dwVID == 0xffffffff) ? GetSelectedInstancePtr() : GetInstancePtr(dwVID); + if (!pkInstSel) + return; + + pkInstSel->SCRIPT_SetAffect(eState, isVisible ? true : false); +} + +PyObject * chrmgrSetAffect(PyObject* poSelf, PyObject* poArgs) +{ + int nVID; + if (!PyTuple_GetInteger(poArgs, 0, &nVID)) + return Py_BadArgument(); + + int nEft; + if (!PyTuple_GetInteger(poArgs, 1, &nEft)) + return Py_BadArgument(); + + int nVisible; + if (!PyTuple_GetInteger(poArgs, 2, &nVisible)) + return Py_BadArgument(); + + CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance(); + rkChrMgr.SCRIPT_SetAffect(nVID >= 0 ? nVID : 0xffffffff, nEft, nVisible); + return Py_BuildNone(); +} + +void CPythonCharacterManager::SetEmoticon(DWORD dwVID, DWORD eState) +{ + CInstanceBase * pkInstSel = (dwVID == 0xffffffff) ? GetSelectedInstancePtr() : GetInstancePtr(dwVID); + if (!pkInstSel) + return; + + pkInstSel->SetEmoticon(eState); +} + +bool CPythonCharacterManager::IsPossibleEmoticon(DWORD dwVID) +{ + CInstanceBase * pkInstSel = (dwVID == 0xffffffff) ? GetSelectedInstancePtr() : GetInstancePtr(dwVID); + if (!pkInstSel) + return false; + + return pkInstSel->IsPossibleEmoticon(); +} + +PyObject * chrmgrSetEmoticon(PyObject* poSelf, PyObject* poArgs) +{ + int nVID; + if (!PyTuple_GetInteger(poArgs, 0, &nVID)) + return Py_BadArgument(); + + int nEft; + if (!PyTuple_GetInteger(poArgs, 1, &nEft)) + return Py_BadArgument(); + + CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance(); + rkChrMgr.SetEmoticon(nVID >= 0 ? nVID : 0xffffffff, nEft); + return Py_BuildNone(); +} + +PyObject * chrmgrIsPossibleEmoticon(PyObject* poSelf, PyObject* poArgs) +{ + int nVID; + if (!PyTuple_GetInteger(poArgs, 0, &nVID)) + return Py_BadArgument(); + + CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance(); + int result = rkChrMgr.IsPossibleEmoticon(nVID >= 0 ? nVID : 0xffffffff); + + return Py_BuildValue("i", result); +} + +void initchrmgr() +{ + static PyMethodDef s_methods[] = + { + // RaceData 관련 + { "SetEmpireNameMode", chrmgrSetEmpireNameMode, METH_VARARGS }, + { "GetVIDInfo", chrmgrGetVIDInfo, METH_VARARGS }, + { "GetPickedVID", chrmgrGetPickedVID, METH_VARARGS }, + { "SetShapeModel", chrmgrSetShapeModel, METH_VARARGS }, + { "AppendShapeSkin", chrmgrAppendShapeSkin, METH_VARARGS }, + { "SetPathName", chrmgrSetPathName, METH_VARARGS }, + { "LoadRaceData", chrmgrLoadRaceData, METH_VARARGS }, + { "LoadLocalRaceData", chrmgrLoadLocalRaceData, METH_VARARGS }, + { "CreateRace", chrmgrCreateRace, METH_VARARGS }, + { "SelectRace", chrmgrSelectRace, METH_VARARGS }, + { "RegisterAttachingBoneName", chrmgrRegisterAttachingBoneName, METH_VARARGS }, + { "RegisterMotionMode", chrmgrRegisterMotionMode, METH_VARARGS }, + //{ "RegisterMotion", chrmgrRegisterMotion, METH_VARARGS }, + { "SetMotionRandomWeight", chrmgrSetMotionRandomWeight, METH_VARARGS }, + { "RegisterNormalAttack", chrmgrRegisterNormalAttack, METH_VARARGS }, + { "ReserveComboAttack", chrmgrReserveComboAttack, METH_VARARGS }, + { "RegisterComboAttack", chrmgrRegisterComboAttack, METH_VARARGS }, + { "ReserveComboAttackNew", chrmgrReserveComboAttackNew, METH_VARARGS }, + { "RegisterComboAttackNew", chrmgrRegisterComboAttackNew, METH_VARARGS }, + { "RegisterMotionData", chrmgrRegisterMotionData, METH_VARARGS }, + { "RegisterRaceName", chrmgrRegisterRaceName, METH_VARARGS }, + { "RegisterRaceSrcName", chrmgrRegisterRaceSrcName, METH_VARARGS }, + { "RegisterCacheMotionData", chrmgrRegisterCacheMotionData, METH_VARARGS }, + + // ETC + { "SetAffect", chrmgrSetAffect, METH_VARARGS }, + { "SetEmoticon", chrmgrSetEmoticon, METH_VARARGS }, + { "IsPossibleEmoticon", chrmgrIsPossibleEmoticon, METH_VARARGS }, + { "RegisterEffect", chrmgrRegisterEffect, METH_VARARGS }, + { "RegisterCacheEffect", chrmgrRegisterCacheEffect, METH_VARARGS }, + { "RegisterPointEffect", chrmgrRegisterPointEffect, METH_VARARGS }, + { "ShowPointEffect", chrmgrShowPointEffect, METH_VARARGS }, + { "ToggleDirectionLine", chrmgrToggleDirectionLine, METH_VARARGS }, + { "SetMovingSpeed", chrmgrSetMovingSpeed, METH_VARARGS }, + { "SetDustGap", chrmgrSetDustGap, METH_VARARGS }, + { "SetHorseDustGap", chrmgrSetHorseDustGap, METH_VARARGS }, + + { "RegisterTitleName", chrmgrRegisterTitleName, METH_VARARGS }, + { "RegisterNameColor", chrmgrRegisterNameColor, METH_VARARGS }, + { "RegisterTitleColor", chrmgrRegisterTitleColor, METH_VARARGS }, + + { NULL, NULL, NULL }, + }; + + PyObject * poModule = Py_InitModule("chrmgr", s_methods); + + PyModule_AddIntConstant(poModule, "NAMECOLOR_MOB", CInstanceBase::NAMECOLOR_NORMAL_MOB); + PyModule_AddIntConstant(poModule, "NAMECOLOR_NPC", CInstanceBase::NAMECOLOR_NORMAL_NPC); + PyModule_AddIntConstant(poModule, "NAMECOLOR_PC", CInstanceBase::NAMECOLOR_NORMAL_PC); + PyModule_AddIntConstant(poModule, "NAMECOLOR_EMPIRE_MOB", CInstanceBase::NAMECOLOR_EMPIRE_MOB); + PyModule_AddIntConstant(poModule, "NAMECOLOR_EMPIRE_NPC", CInstanceBase::NAMECOLOR_EMPIRE_NPC); + PyModule_AddIntConstant(poModule, "NAMECOLOR_EMPIRE_PC", CInstanceBase::NAMECOLOR_EMPIRE_PC); + PyModule_AddIntConstant(poModule, "NAMECOLOR_FUNC", CInstanceBase::NAMECOLOR_FUNC); + PyModule_AddIntConstant(poModule, "NAMECOLOR_PK", CInstanceBase::NAMECOLOR_PK); + PyModule_AddIntConstant(poModule, "NAMECOLOR_PVP", CInstanceBase::NAMECOLOR_PVP); + PyModule_AddIntConstant(poModule, "NAMECOLOR_PARTY", CInstanceBase::NAMECOLOR_PARTY); + PyModule_AddIntConstant(poModule, "NAMECOLOR_WARP", CInstanceBase::NAMECOLOR_WARP); + PyModule_AddIntConstant(poModule, "NAMECOLOR_WAYPOINT", CInstanceBase::NAMECOLOR_WAYPOINT); + PyModule_AddIntConstant(poModule, "NAMECOLOR_EXTRA", CInstanceBase::NAMECOLOR_EXTRA); + + PyModule_AddIntConstant(poModule, "EFFECT_SPAWN_DISAPPEAR", CInstanceBase::EFFECT_SPAWN_DISAPPEAR); + PyModule_AddIntConstant(poModule, "EFFECT_SPAWN_APPEAR", CInstanceBase::EFFECT_SPAWN_APPEAR); + PyModule_AddIntConstant(poModule, "EFFECT_DUST", CInstanceBase::EFFECT_DUST); + PyModule_AddIntConstant(poModule, "EFFECT_HORSE_DUST", CInstanceBase::EFFECT_HORSE_DUST); + PyModule_AddIntConstant(poModule, "EFFECT_STUN", CInstanceBase::EFFECT_STUN); + PyModule_AddIntConstant(poModule, "EFFECT_HIT", CInstanceBase::EFFECT_HIT); + PyModule_AddIntConstant(poModule, "EFFECT_FLAME_ATTACK", CInstanceBase::EFFECT_FLAME_ATTACK); + PyModule_AddIntConstant(poModule, "EFFECT_FLAME_HIT", CInstanceBase::EFFECT_FLAME_HIT); + PyModule_AddIntConstant(poModule, "EFFECT_FLAME_ATTACH", CInstanceBase::EFFECT_FLAME_ATTACH); + PyModule_AddIntConstant(poModule, "EFFECT_ELECTRIC_ATTACK", CInstanceBase::EFFECT_ELECTRIC_ATTACK); + PyModule_AddIntConstant(poModule, "EFFECT_ELECTRIC_HIT", CInstanceBase::EFFECT_ELECTRIC_HIT); + PyModule_AddIntConstant(poModule, "EFFECT_ELECTRIC_ATTACH", CInstanceBase::EFFECT_ELECTRIC_ATTACH); + PyModule_AddIntConstant(poModule, "EFFECT_SELECT", CInstanceBase::EFFECT_SELECT); + PyModule_AddIntConstant(poModule, "EFFECT_TARGET", CInstanceBase::EFFECT_TARGET); + PyModule_AddIntConstant(poModule, "EFFECT_CRITICAL", CInstanceBase::EFFECT_CRITICAL); + + PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_TARGET", CInstanceBase::EFFECT_DAMAGE_TARGET); + PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_NOT_TARGET", CInstanceBase::EFFECT_DAMAGE_NOT_TARGET); + PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_SELFDAMAGE", CInstanceBase::EFFECT_DAMAGE_SELFDAMAGE); + PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_SELFDAMAGE2", CInstanceBase::EFFECT_DAMAGE_SELFDAMAGE2); + PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_POISON", CInstanceBase::EFFECT_DAMAGE_POISON); + PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_MISS", CInstanceBase::EFFECT_DAMAGE_MISS); + PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_TARGETMISS", CInstanceBase::EFFECT_DAMAGE_TARGETMISS); + PyModule_AddIntConstant(poModule, "EFFECT_DAMAGE_CRITICAL", CInstanceBase::EFFECT_DAMAGE_CRITICAL); + + PyModule_AddIntConstant(poModule, "EFFECT_LEVELUP", CInstanceBase::EFFECT_LEVELUP); + PyModule_AddIntConstant(poModule, "EFFECT_SKILLUP", CInstanceBase::EFFECT_SKILLUP); + PyModule_AddIntConstant(poModule, "EFFECT_HPUP_RED", CInstanceBase::EFFECT_HPUP_RED); + PyModule_AddIntConstant(poModule, "EFFECT_SPUP_BLUE", CInstanceBase::EFFECT_SPUP_BLUE); + PyModule_AddIntConstant(poModule, "EFFECT_SPEEDUP_GREEN", CInstanceBase::EFFECT_SPEEDUP_GREEN); + PyModule_AddIntConstant(poModule, "EFFECT_DXUP_PURPLE", CInstanceBase::EFFECT_DXUP_PURPLE); + PyModule_AddIntConstant(poModule, "EFFECT_PENETRATE", CInstanceBase::EFFECT_PENETRATE); + PyModule_AddIntConstant(poModule, "EFFECT_BLOCK", CInstanceBase::EFFECT_BLOCK); + PyModule_AddIntConstant(poModule, "EFFECT_DODGE", CInstanceBase::EFFECT_DODGE); + PyModule_AddIntConstant(poModule, "EFFECT_FIRECRACKER", CInstanceBase::EFFECT_FIRECRACKER); + PyModule_AddIntConstant(poModule, "EFFECT_SPIN_TOP", CInstanceBase::EFFECT_SPIN_TOP); + + PyModule_AddIntConstant(poModule, "EFFECT_WEAPON", CInstanceBase::EFFECT_WEAPON); + + PyModule_AddIntConstant(poModule, "EFFECT_AFFECT", CInstanceBase::EFFECT_AFFECT); + PyModule_AddIntConstant(poModule, "EFFECT_EMOTICON", CInstanceBase::EFFECT_EMOTICON); + PyModule_AddIntConstant(poModule, "EFFECT_EMPIRE", CInstanceBase::EFFECT_EMPIRE); + + PyModule_AddIntConstant(poModule, "EFFECT_REFINED", CInstanceBase::EFFECT_REFINED); + + PyModule_AddIntConstant(poModule, "EFFECT_SUCCESS", CInstanceBase::EFFECT_SUCCESS) ; + PyModule_AddIntConstant(poModule, "EFFECT_FAIL", CInstanceBase::EFFECT_FAIL) ; + PyModule_AddIntConstant(poModule, "EFFECT_FR_SUCCESS", CInstanceBase::EFFECT_FR_SUCCESS) ; + PyModule_AddIntConstant(poModule, "EFFECT_LEVELUP_ON_14_FOR_GERMANY", CInstanceBase::EFFECT_LEVELUP_ON_14_FOR_GERMANY ); //레벨업 14일때 ( 독일전용 ) + PyModule_AddIntConstant(poModule, "EFFECT_LEVELUP_UNDER_15_FOR_GERMANY", CInstanceBase::EFFECT_LEVELUP_UNDER_15_FOR_GERMANY );//레벨업 15일때 ( 독일전용 ) + PyModule_AddIntConstant(poModule, "EFFECT_PERCENT_DAMAGE1", CInstanceBase::EFFECT_PERCENT_DAMAGE1); + PyModule_AddIntConstant(poModule, "EFFECT_PERCENT_DAMAGE2", CInstanceBase::EFFECT_PERCENT_DAMAGE2); + PyModule_AddIntConstant(poModule, "EFFECT_PERCENT_DAMAGE3", CInstanceBase::EFFECT_PERCENT_DAMAGE3); + + // 자동물약 HP, SP + PyModule_AddIntConstant(poModule, "EFFECT_AUTO_HPUP", CInstanceBase::EFFECT_AUTO_HPUP); + PyModule_AddIntConstant(poModule, "EFFECT_AUTO_SPUP", CInstanceBase::EFFECT_AUTO_SPUP); + + PyModule_AddIntConstant(poModule, "EFFECT_RAMADAN_RING_EQUIP", CInstanceBase::EFFECT_RAMADAN_RING_EQUIP); + PyModule_AddIntConstant(poModule, "EFFECT_HALLOWEEN_CANDY_EQUIP", CInstanceBase::EFFECT_HALLOWEEN_CANDY_EQUIP); + PyModule_AddIntConstant(poModule, "EFFECT_HAPPINESS_RING_EQUIP", CInstanceBase::EFFECT_HAPPINESS_RING_EQUIP); + PyModule_AddIntConstant(poModule, "EFFECT_LOVE_PENDANT_EQUIP", CInstanceBase::EFFECT_LOVE_PENDANT_EQUIP); + +} diff --git a/extension/src/port/UserInterface/PythonCharacterModule.cpp b/extension/src/port/UserInterface/PythonCharacterModule.cpp new file mode 100644 index 00000000..ad76433f --- /dev/null +++ b/extension/src/port/UserInterface/PythonCharacterModule.cpp @@ -0,0 +1,1491 @@ +#include "StdAfx.h" +#include "PythonCharacterManager.h" +#include "PythonNonPlayer.h" + +PyObject * chrRaceToJob(PyObject * poSelf, PyObject * poArgs) +{ + int race; + if (!PyTuple_GetInteger(poArgs, 0, &race)) + return Py_BuildException(); + + return Py_BuildValue("i", RaceToJob(race)); +} + +PyObject * chrRaceToSex(PyObject * poSelf, PyObject * poArgs) +{ + int race; + if (!PyTuple_GetInteger(poArgs, 0, &race)) + return Py_BuildException(); + + return Py_BuildValue("i", RaceToSex(race)); +} + +PyObject * chrDestroy(PyObject * poSelf, PyObject * poArgs) +{ + CPythonCharacterManager::Instance().Destroy(); + return Py_BuildNone(); +} + +PyObject * chrUpdate(PyObject * poSelf, PyObject * poArgs) +{ + CPythonCharacterManager::Instance().Update(); + return Py_BuildNone(); +} + +PyObject * chrDeform(PyObject * poSelf, PyObject * poArgs) +{ + CPythonCharacterManager::Instance().Deform(); + return Py_BuildNone(); +} + +PyObject * chrRender(PyObject * poSelf, PyObject * poArgs) +{ + CPythonCharacterManager::Instance().Render(); + return Py_BuildNone(); +} + +PyObject * chrRenderCollision(PyObject * poSelf, PyObject * poArgs) +{ + CPythonCharacterManager::Instance().RenderCollision(); + return Py_BuildNone(); +} + +// Functions For Python Test Code +PyObject * chrCreateInstance(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + if (PyTuple_Size(poArgs)==2) + { + PyObject* poDict=PyTuple_GetItem(poArgs, 1); + if (!PyDict_Check(poDict)) + return Py_BuildException(); + + CInstanceBase::SCreateData kCreateData; + kCreateData.m_bType=CActorInstance::TYPE_PC; + kCreateData.m_dwLevel = 0; + kCreateData.m_dwGuildID=0; + kCreateData.m_dwEmpireID=0; + kCreateData.m_dwVID=iVirtualID; + kCreateData.m_dwMountVnum=0; + kCreateData.m_dwRace=0; + kCreateData.m_fRot=CInstanceBase::DIR_NORTH; + kCreateData.m_lPosX=0; + kCreateData.m_lPosY=0; + kCreateData.m_stName="NONAME"; + kCreateData.m_dwStateFlags=0; + kCreateData.m_dwMovSpd=100; + kCreateData.m_dwAtkSpd=100; + kCreateData.m_sAlignment=0; + kCreateData.m_byPKMode=0; + kCreateData.m_kAffectFlags.Clear(); + kCreateData.m_dwArmor=8; + kCreateData.m_dwWeapon=0; + kCreateData.m_dwHair=0; + kCreateData.m_isMain=false; + + PyObject* poHorse=PyDict_GetItemString(poDict, "horse"); + if (poHorse) + kCreateData.m_dwMountVnum=PyLong_AsLong(poHorse); + + PyObject* poX=PyDict_GetItemString(poDict, "x"); + if (poX) + kCreateData.m_lPosX=PyLong_AsLong(poX); + + PyObject* poY=PyDict_GetItemString(poDict, "y"); + if (poY) + kCreateData.m_lPosX=PyLong_AsLong(poY); + + CPythonCharacterManager::Instance().CreateInstance(kCreateData); + } + else + { + CPythonCharacterManager::Instance().RegisterInstance(iVirtualID); + } + + return Py_BuildNone(); +} + +PyObject * chrDeleteInstance(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CPythonCharacterManager::Instance().DeleteInstance(iVirtualID); + return Py_BuildNone(); +} + +PyObject * chrDeleteInstanceByFade(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CPythonCharacterManager::Instance().DeleteInstanceByFade(iVirtualID); + return Py_BuildNone(); +} + +PyObject * chrSelectInstance(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CPythonCharacterManager::Instance().SelectInstance(iVirtualID); + return Py_BuildNone(); +} + +PyObject * chrHasInstance(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + bool bFlag = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID) ? TRUE : FALSE; + return Py_BuildValue("i", bFlag); +} + +PyObject * chrIsEnemy(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + if (!pInstance) + return Py_BuildValue("i", 0); + + return Py_BuildValue("i", pInstance->IsEnemy()); +} + +PyObject * chrIsNPC(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + if (!pInstance) + return Py_BuildValue("i", 0); + + return Py_BuildValue("i", pInstance->IsNPC()); +} + +PyObject * chrIsGameMaster(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + if (!pInstance) + return Py_BuildValue("i", 0); + + return Py_BuildValue("i", pInstance->IsGameMaster()); +} + +PyObject * chrIsPartyMember(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + if (!pInstance) + return Py_BuildValue("i", 0); + + return Py_BuildValue("i", pInstance->IsPartyMember()); +} + +PyObject * chrSelect(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + + if (!pkInst) + return Py_BuildNone(); + + switch (CPythonNonPlayer::Instance().GetEventType(pkInst->GetVirtualNumber())) + { + case CPythonNonPlayer::ON_CLICK_EVENT_SHOP: + pkInst->SetAddRenderMode(); + pkInst->SetAddColor(D3DXCOLOR(0.0f, 0.3f, 0.0f, 1.0f)); + break; + + default: + // NOTE: 빨간색으로 나오게 하면 스샷 찍을 때 보기가 안좋아서 코멘트 하였습니다 [cronan 040226] + //pkInst->SetAddColor(D3DXCOLOR(0.3f, 0.0f, 0.0f, 1.0f)); + break; + } + + return Py_BuildNone(); +} + +PyObject * chrSetAddRenderMode(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + 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(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + + if (!pkInst) + return Py_BuildNone(); + + pkInst->SetAddRenderMode(); + pkInst->SetAddColor(D3DXCOLOR(fr, fg, fb, 1.0f)); + + return Py_BuildNone(); +} + +PyObject * chrSetBlendRenderMode(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + float fAlpha; + if (!PyTuple_GetFloat(poArgs, 1, &fAlpha)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + + if (!pkInst) + return Py_BuildNone(); + + pkInst->SetAlpha(fAlpha); + + return Py_BuildNone(); +} + +PyObject * chrUnselect(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + if (!pkInst) + return Py_BuildNone(); + + pkInst->RestoreRenderMode(); + return Py_BuildNone(); +} + +PyObject * chrPick(PyObject* poSelf, PyObject* poArgs) +{ + DWORD VirtualID = 0; + if (CPythonCharacterManager::Instance().OLD_GetPickedInstanceVID(&VirtualID)) + return Py_BuildValue("i", VirtualID); + else + return Py_BuildValue("i", -1); +} + +PyObject * chrHide(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + + pkInst->Hide(); + return Py_BuildNone(); +} + +PyObject * chrShow(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + + pkInst->Show(); + return Py_BuildNone(); +} + +PyObject * chrPickAll(PyObject* poSelf, PyObject* poArgs) +{ + DWORD VirtualID = CPythonCharacterManager::Instance().PickAll(); + return Py_BuildValue("i", VirtualID); +} + +PyObject * chrSetRace(PyObject* poSelf, PyObject* poArgs) +{ + int iRace; + if (!PyTuple_GetInteger(poArgs, 0, &iRace)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + + pkInst->SetRace(iRace); + + return Py_BuildNone(); +} + +PyObject * chrSetHair(PyObject* poSelf, PyObject* poArgs) +{ + int iRace; + if (!PyTuple_GetInteger(poArgs, 0, &iRace)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + + pkInst->SetHair(iRace); + + return Py_BuildNone(); +} + +PyObject * chrChangeHair(PyObject* poSelf, PyObject* poArgs) +{ + int iHair; + + if (!PyTuple_GetInteger(poArgs, 0, &iHair)) + return Py_BuildException(); + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + pkInst->ChangeHair(iHair); + return Py_BuildNone(); +} + +PyObject * chrSetArmor(PyObject* poSelf, PyObject* poArgs) +{ + int iForm; + if (!PyTuple_GetInteger(poArgs, 0, &iForm)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + + pkInst->SetArmor(iForm); + + pkInst->RegisterBoundingSphere(); + + return Py_BuildNone(); +} + +PyObject * chrChangeShape(PyObject* poSelf, PyObject* poArgs) +{ + int iForm; + if (!PyTuple_GetInteger(poArgs, 0, &iForm)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + + pkInst->ChangeArmor(iForm); + + return Py_BuildNone(); +} + +PyObject * chrSetWeapon(PyObject* poSelf, PyObject* poArgs) +{ + int iForm; + if (!PyTuple_GetInteger(poArgs, 0, &iForm)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + + pkInst->SetWeapon(iForm); + + return Py_BuildNone(); +} + +PyObject * chrSetVirtualID(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + pkInst->SetVirtualID(iVID); + return Py_BuildNone(); +} + +PyObject * chrSetNameString(PyObject* poSelf, PyObject* poArgs) +{ + char * c_szName; + if (!PyTuple_GetString(poArgs, 0, &c_szName)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + pkInst->SetNameString(c_szName, strlen(c_szName)); + return Py_BuildNone(); +} + +PyObject * chrSetInstanceType(PyObject* poSelf, PyObject* poArgs) +{ + int iInstanceType; + if (!PyTuple_GetInteger(poArgs, 0, &iInstanceType)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + pkInst->SetInstanceType(iInstanceType); + return Py_BuildNone(); +} + +PyObject * chrAttachEffectByName(PyObject* poSelf, PyObject* poArgs) +{ + int iParentPartIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iParentPartIndex)) + return Py_BuildException(); + + char * pszBoneName; + if (!PyTuple_GetString(poArgs, 1, &pszBoneName)) + { + pszBoneName = NULL; + //return Py_BuildException(); + } + + char * pszEffectName; + if (!PyTuple_GetString(poArgs, 2, &pszEffectName)) + return Py_BuildException(); + + int iLife = CActorInstance::EFFECT_LIFE_INFINITE; + + if (PyTuple_Size(poArgs)==4) + { + if (!PyTuple_GetInteger(poArgs, 3, &iLife)) + return Py_BuildException(); + } + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + + if (!pkInst) + return Py_BuildNone(); + + //pkInst->AttachEffectByName(iParentPartIndex, pszBoneName, pszEffectName, iLife); + return Py_BuildNone(); +} + +PyObject * chrAttachEffectByID(PyObject* poSelf, PyObject* poArgs) +{ + int iParentPartIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iParentPartIndex)) + return Py_BuildException(); + + char * pszBoneName; + if (!PyTuple_GetString(poArgs, 1, &pszBoneName)) + { + pszBoneName = NULL; + } + // return Py_BuildException(); + + // FIXME : bug or error on getting unsigned value + int iEffectID; + if (!PyTuple_GetInteger(poArgs, 2, &iEffectID)) + return Py_BuildException(); + + int iLife = CActorInstance::EFFECT_LIFE_INFINITE; + + if (PyTuple_Size(poArgs)==4) + { + if (!PyTuple_GetInteger(poArgs, 3, &iLife)) + return Py_BuildException(); + } + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + + if (!pkInst) + return Py_BuildNone(); + + //pkInst->AttachEffectByID(iParentPartIndex, pszBoneName, iEffectID, iLife); + return Py_BuildNone(); +} + +PyObject * chrRefresh(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + + if (!pkInst) + return Py_BuildNone(); + + // Select 화면에서는 WAIT 모션이 준비 되지 않은 상태이기 때문에 문제가 생긴다. + //pkInst->Refresh(CRaceMotionData::NAME_WAIT, true); + return Py_BuildNone(); +} + +PyObject * chrMountHorse(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + pkInst->MountHorse(20030); + return Py_BuildNone(); +} + +PyObject * chrDismountHorse(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + pkInst->DismountHorse(); + return Py_BuildNone(); +} + +PyObject * chrRevive(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + pkInst->Revive(); + return Py_BuildNone(); +} + +PyObject * chrDie(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + pkInst->Die(); + return Py_BuildNone(); +} + +PyObject * chrLookAt(PyObject* poSelf, PyObject* poArgs) +{ + int iCellX; + if (!PyTuple_GetInteger(poArgs, 0, &iCellX)) + return Py_BuildException(); + + int iCellY; + if (!PyTuple_GetInteger(poArgs, 1, &iCellY)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); +// pkInst->LookAt(TPixelPosition(iCellX * c_Section_xAttributeCellSize, iCellY * c_Section_xAttributeCellSize)); + return Py_BuildNone(); +} + +PyObject * chrSetMotionMode(PyObject* poSelf, PyObject* poArgs) +{ + int iMotionMode; + if (!PyTuple_GetInteger(poArgs, 0, &iMotionMode)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + + pkInst->SetMotionMode(iMotionMode); + return Py_BuildNone(); +} + +PyObject * chrSetLoopMotion(PyObject* poSelf, PyObject* poArgs) +{ + int iMotionIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iMotionIndex)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + pkInst->SetLoopMotion(WORD(iMotionIndex)); + + return Py_BuildNone(); +} + +PyObject * chrBlendLoopMotion(PyObject* poSelf, PyObject* poArgs) +{ + int iMotionIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iMotionIndex)) + return Py_BuildException(); + float fBlendTime; + if (!PyTuple_GetFloat(poArgs, 1, &fBlendTime)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + pkInst->SetLoopMotion(WORD(iMotionIndex), fBlendTime); + + return Py_BuildNone(); +} + +PyObject * chrPushOnceMotion(PyObject* poSelf, PyObject* poArgs) +{ + int iMotionIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iMotionIndex)) + return Py_BuildException(); + + float fBlendTime; + if (!PyTuple_GetFloat(poArgs, 1, &fBlendTime)) + { + fBlendTime = 0.1f; + } + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + pkInst->PushOnceMotion(WORD(iMotionIndex), fBlendTime); + + return Py_BuildNone(); +} + +PyObject * chrPushLoopMotion(PyObject* poSelf, PyObject* poArgs) +{ + int iMotionIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iMotionIndex)) + return Py_BuildException(); + + float fBlendTime; + if (!PyTuple_GetFloat(poArgs, 1, &fBlendTime)) + { + fBlendTime = 0.1f; + } + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + pkInst->PushLoopMotion(WORD(iMotionIndex), fBlendTime); + + return Py_BuildNone(); +} + +PyObject * chrSetPixelPosition(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(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + + int iZ; + if (PyTuple_GetInteger(poArgs, 2, &iZ)) + { + pkInst->NEW_SetPixelPosition(TPixelPosition(iX, iY, iZ)); + } + else + { + pkInst->SCRIPT_SetPixelPosition(iX, iY); + } + return Py_BuildNone(); +} + +PyObject * chrSetDirection(PyObject* poSelf, PyObject* poArgs) +{ + int iDirection; + if (!PyTuple_GetInteger(poArgs, 0, &iDirection)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + pkInst->SetDirection(iDirection); + return Py_BuildNone(); +} + +PyObject * chrGetPixelPosition(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + + if (!pkInst) + return Py_BuildException(); + + TPixelPosition PixelPosition; + pkInst->NEW_GetPixelPosition(&PixelPosition); + + return Py_BuildValue("fff", PixelPosition.x, PixelPosition.y, PixelPosition.z); +} + +PyObject * chrSetRotation(PyObject* poSelf, PyObject* poArgs) +{ + float fRotation; + if (!PyTuple_GetFloat(poArgs, 0, &fRotation)) + return Py_BuildException(); + + CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + + if (!pCharacterInstance) + return Py_BuildNone(); + + fRotation = fmod(fRotation + 180.0f, 360.0f); + + pCharacterInstance->SetRotation(fRotation); + + return Py_BuildNone(); +} + +PyObject * chrSetRotationAll(PyObject* poSelf, PyObject* poArgs) +{ + float fRotX; + if (!PyTuple_GetFloat(poArgs, 0, &fRotX)) + return Py_BuildException(); + float fRotY; + if (!PyTuple_GetFloat(poArgs, 1, &fRotY)) + return Py_BuildException(); + float fRotZ; + if (!PyTuple_GetFloat(poArgs, 2, &fRotZ)) + return Py_BuildException(); + + CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pCharacterInstance) + return Py_BuildNone(); + + pCharacterInstance->GetGraphicThingInstanceRef().SetXYRotation(fRotX, fRotY); + pCharacterInstance->GetGraphicThingInstanceRef().SetRotation(fRotZ); + return Py_BuildNone(); +} + +PyObject * chrBlendRotation(PyObject* poSelf, PyObject* poArgs) +{ + float fRotation; + if (!PyTuple_GetFloat(poArgs, 0, &fRotation)) + return Py_BuildException(); + float fBlendTime; + if (!PyTuple_GetFloat(poArgs, 1, &fBlendTime)) + return Py_BuildException(); + + fRotation = fmod(720.0f - fRotation, 360.0f); + + CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pCharacterInstance) + return Py_BuildNone(); + pCharacterInstance->BlendRotation(fRotation, fBlendTime); + + return Py_BuildNone(); +} + +PyObject * chrGetRotation(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + + if (!pCharacterInstance) + return Py_BuildValue("f", 0.0f); + + float fRotation = pCharacterInstance->GetRotation(); + + return Py_BuildValue("f", 360.0f - fRotation); +} + +PyObject * chrGetRace(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + + if (!pCharacterInstance) + return Py_BuildValue("i", 0); + + return Py_BuildValue("i", pCharacterInstance->GetRace()); +} + +PyObject * chrGetName(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + + if (!pCharacterInstance) + return Py_BuildValue("i", 0); + + return Py_BuildValue("s", pCharacterInstance->GetNameString()); +} + +PyObject * chrGetNameByVID(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + + if (!pInstance) + return Py_BuildValue("s", "None"); + + return Py_BuildValue("s", pInstance->GetNameString()); +} + +PyObject * chrGetGuildID(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + + if (!pInstance) + return Py_BuildValue("i", 0); + + return Py_BuildValue("i", pInstance->GetGuildID()); +} + +PyObject * chrGetProjectPosition(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + int iHeight; + if (!PyTuple_GetInteger(poArgs, 1, &iHeight)) + return Py_BuildException(); + + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + + if (!pInstance) + return Py_BuildValue("ii", -100, -100); + + TPixelPosition PixelPosition; + pInstance->NEW_GetPixelPosition(&PixelPosition); + + CPythonGraphic & rpyGraphic = CPythonGraphic::Instance(); + + float fx, fy, fz; + rpyGraphic.ProjectPosition(PixelPosition.x, + -PixelPosition.y, + PixelPosition.z + float(iHeight), + &fx, &fy, &fz); + + if (1 == int(fz)) + return Py_BuildValue("ii", -100, -100); + + return Py_BuildValue("ii", int(fx), int(fy)); +} + +PyObject * chrGetVirtualNumber(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + + if (NULL != pkInst) + return Py_BuildValue("i", pkInst->GetVirtualNumber()); + + return Py_BuildValue("i", CActorInstance::TYPE_PC); +} + +PyObject * chrGetInstanceType(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + + if (NULL != pkInst) + return Py_BuildValue("i", pkInst->GetInstanceType()); + + return Py_BuildValue("i", CActorInstance::TYPE_PC); +} + +PyObject * chrGetBoundBoxOnlyXY(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + + if (!pkInst) + return Py_BuildValue("ffff", 0.0f, 0.0f, 0.0f, 0.0f); + + D3DXVECTOR3 v3Min, v3Max; + pkInst->GetBoundBox(&v3Min, &v3Max); + + return Py_BuildValue("ffff", v3Min.x, v3Min.y, v3Max.x, v3Max.y); +} + +PyObject * chrtestGetPKData(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + + if (!pkInst) + return Py_BuildValue("ii", 0, 4); + + return Py_BuildValue("ii", pkInst->GetAlignment(), pkInst->GetAlignmentGrade()); +} + +PyObject * chrtestSetComboType(PyObject* poSelf, PyObject* poArgs) +{ + int iComboType; + if (!PyTuple_GetInteger(poArgs, 0, &iComboType)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (!pkInst) + return Py_BuildNone(); + + pkInst->GetGraphicThingInstanceRef().SetComboType(iComboType); + + return Py_BuildNone(); +} + +PyObject * chrtestSetAddRenderMode(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + int iColor; + if (!PyTuple_GetInteger(poArgs, 1, &iColor)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + if (pkInst) + { + pkInst->SetAddRenderMode(); + pkInst->SetAddColor(0xff000000 | iColor); + } + + return Py_BuildNone(); +} + +PyObject * chrtestSetModulateRenderMode(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + int iColor; + if (!PyTuple_GetInteger(poArgs, 1, &iColor)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + if (pkInst) + { + pkInst->SetModulateRenderMode(); + pkInst->SetAddColor(0xff000000 | iColor); + } + + return Py_BuildNone(); +} + +PyObject * chrtestSetAddRenderModeRGB(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + 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(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + if (pkInst) + { + pkInst->SetAddRenderMode(); + pkInst->SetAddColor(D3DXCOLOR(fr, fg, fb, 1.0f)); + } + + return Py_BuildNone(); +} + +PyObject * chrtestSetModulateRenderModeRGB(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + 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(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + if (pkInst) + { + pkInst->SetModulateRenderMode(); + pkInst->SetAddColor(D3DXCOLOR(fr, fg, fb, 1.0f)); + } + + return Py_BuildNone(); +} + +PyObject * chrtestSetSpecularRenderMode(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + int iPart; + if (!PyTuple_GetInteger(poArgs, 1, &iPart)) + return Py_BuildException(); + float fAlpha; + if (!PyTuple_GetFloat(poArgs, 2, &fAlpha)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + if (pkInst) + { + pkInst->GetGraphicThingInstanceRef().SetSpecularInfo(TRUE, iPart, fAlpha); + } + + return Py_BuildNone(); +} + +PyObject * chrtestSetSpecularRenderMode2(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + int iPart; + if (!PyTuple_GetInteger(poArgs, 1, &iPart)) + return Py_BuildException(); + float fAlpha; + if (!PyTuple_GetFloat(poArgs, 2, &fAlpha)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + if (pkInst) + { + pkInst->GetGraphicThingInstanceRef().SetSpecularInfoForce(TRUE, iPart, fAlpha); + } + + return Py_BuildNone(); +} + +PyObject * chrtestRestoreRenderMode(PyObject* poSelf, PyObject* poArgs) +{ + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) + return Py_BuildException(); + + CInstanceBase * pkInst = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID); + if (pkInst) + { + pkInst->RestoreRenderMode(); + } + + return Py_BuildNone(); +} + +PyObject * chrFaintTest(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + if (pCharacterInstance) + { + if (pCharacterInstance->GetGraphicThingInstanceRef().IsFaint()) + { + pCharacterInstance->GetGraphicThingInstanceRef().SetFaint(false); + } + else + { + pCharacterInstance->GetGraphicThingInstanceRef().InterceptOnceMotion(CRaceMotionData::NAME_DAMAGE_FLYING); + pCharacterInstance->GetGraphicThingInstanceRef().PushOnceMotion(CRaceMotionData::NAME_STAND_UP); + pCharacterInstance->GetGraphicThingInstanceRef().PushLoopMotion(CRaceMotionData::NAME_WAIT); + pCharacterInstance->GetGraphicThingInstanceRef().SetFaint(true); + } + } + + return Py_BuildNone(); +} + +PyObject * chrSetMoveSpeed(PyObject* poSelf, PyObject* poArgs) +{ + //int iSpeed; + //if (!PyTuple_GetInteger(poArgs, 0, &iSpeed)) + // return Py_BadArgument(); + + //CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + + //if (!pCharacterInstance) + // return Py_BuildValue("i", 0); + + //pCharacterInstance->SetMoveSpeed(iSpeed); + + return Py_BuildNone(); +} + +PyObject * chrSetAttackSpeed(PyObject* poSelf, PyObject* poArgs) +{ + //int iSpeed; + //if (!PyTuple_GetInteger(poArgs, 0, &iSpeed)) + // return Py_BadArgument(); + + //CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetSelectedInstancePtr(); + + //if (!pCharacterInstance) + // return Py_BuildValue("i", 0); + + //pCharacterInstance->SetAttackSpeed(iSpeed); + + return Py_BuildNone(); +} + +PyObject * chrWeaponTraceSetTexture(PyObject* poSelf, PyObject* poArgs) +{ + char * szPathName; + if (!PyTuple_GetString(poArgs, 0, &szPathName)) + return Py_BadArgument(); + + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetMainInstancePtr(); + if (pInstance) + { + pInstance->GetGraphicThingInstanceRef().SetWeaponTraceTexture(szPathName); + } + return Py_BuildNone(); +} + +PyObject * chrWeaponTraceUseTexture(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetMainInstancePtr(); + if (pInstance) + { + pInstance->GetGraphicThingInstanceRef().UseTextureWeaponTrace(); + } + return Py_BuildNone(); +} + +PyObject * chrWeaponTraceUseAlpha(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetMainInstancePtr(); + if (pInstance) + { + pInstance->GetGraphicThingInstanceRef().UseAlphaWeaponTrace(); + } + return Py_BuildNone(); +} + +PyObject * chrMoveToDestPosition(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BadArgument(); + + int ix; + if (!PyTuple_GetInteger(poArgs, 1, &ix)) + return Py_BadArgument(); + int iy; + if (!PyTuple_GetInteger(poArgs, 2, &iy)) + return Py_BadArgument(); + + CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVID); + if (!pCharacterInstance) + return Py_BuildNone(); + + pCharacterInstance->NEW_MoveToDestPixelPositionDirection(TPixelPosition(ix, iy, 0.0f)); + + return Py_BuildNone(); +} + +PyObject * chrtestSetRideMan(PyObject* poSelf, PyObject* poArgs) +{ + int ix; + if (!PyTuple_GetInteger(poArgs, 0, &ix)) + return Py_BadArgument(); + int iy; + if (!PyTuple_GetInteger(poArgs, 1, &iy)) + return Py_BadArgument(); + int imount = 20030; + PyTuple_GetInteger(poArgs, 2, &imount); + + CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().RegisterInstance(1); + CInstanceBase::SCreateData kCreateData; + ZeroMemory(&kCreateData, sizeof(kCreateData)); + kCreateData.m_bType = CActorInstance::TYPE_PC; + kCreateData.m_dwRace = 0; + kCreateData.m_dwArmor = 0; + kCreateData.m_dwHair = 100; + kCreateData.m_dwMovSpd = 100; + kCreateData.m_dwAtkSpd = 100; + kCreateData.m_dwMountVnum = imount; + kCreateData.m_lPosX = ix; + kCreateData.m_lPosY = iy; + pCharacterInstance->Create(kCreateData); + + return Py_BuildNone(); +} + +void initchr() +{ + static PyMethodDef s_methods[] = + { + { "DismountHorse", chrDismountHorse, METH_VARARGS }, + { "MountHorse", chrMountHorse, METH_VARARGS }, + + { "Destroy", chrDestroy, METH_VARARGS }, + { "Update", chrUpdate, METH_VARARGS }, + { "Deform", chrDeform, METH_VARARGS }, + { "Render", chrRender, METH_VARARGS }, + { "RenderCollision", chrRenderCollision, METH_VARARGS }, + + // Functions For Python Code + { "CreateInstance", chrCreateInstance, METH_VARARGS }, + { "DeleteInstance", chrDeleteInstance, METH_VARARGS }, + { "DeleteInstanceByFade", chrDeleteInstanceByFade, METH_VARARGS }, + { "SelectInstance", chrSelectInstance, METH_VARARGS }, + + { "HasInstance", chrHasInstance, METH_VARARGS }, + { "IsEnemy", chrIsEnemy, METH_VARARGS }, + { "IsNPC", chrIsNPC, METH_VARARGS }, + { "IsGameMaster", chrIsGameMaster, METH_VARARGS }, + { "IsPartyMember", chrIsPartyMember, METH_VARARGS }, + + { "Select", chrSelect, METH_VARARGS }, + { "SetAddRenderMode", chrSetAddRenderMode, METH_VARARGS }, + { "SetBlendRenderMode", chrSetBlendRenderMode, METH_VARARGS }, + { "Unselect", chrUnselect, METH_VARARGS }, + + { "Hide", chrHide, METH_VARARGS }, + { "Show", chrShow, METH_VARARGS }, + { "Pick", chrPick, METH_VARARGS }, + { "PickAll", chrPickAll, METH_VARARGS }, + + { "SetArmor", chrSetArmor, METH_VARARGS }, + { "SetWeapon", chrSetWeapon, METH_VARARGS }, + { "ChangeShape", chrChangeShape, METH_VARARGS }, + { "SetRace", chrSetRace, METH_VARARGS }, + { "SetHair", chrSetHair, METH_VARARGS }, + { "ChangeHair", chrChangeHair, METH_VARARGS }, + { "SetVirtualID", chrSetVirtualID, METH_VARARGS }, + { "SetNameString", chrSetNameString, METH_VARARGS }, + { "SetInstanceType", chrSetInstanceType, METH_VARARGS }, + + { "SetPixelPosition", chrSetPixelPosition, METH_VARARGS }, + { "SetDirection", chrSetDirection, METH_VARARGS }, + { "Refresh", chrRefresh, METH_VARARGS }, + { "Revive", chrRevive, METH_VARARGS }, + { "Die", chrDie, METH_VARARGS }, + + { "AttachEffectByID", chrAttachEffectByID, METH_VARARGS }, + { "AttachEffectByName", chrAttachEffectByName, METH_VARARGS }, + + { "LookAt", chrLookAt, METH_VARARGS }, + { "SetMotionMode", chrSetMotionMode, METH_VARARGS }, + { "SetLoopMotion", chrSetLoopMotion, METH_VARARGS }, + { "BlendLoopMotion", chrBlendLoopMotion, METH_VARARGS }, + { "PushOnceMotion", chrPushOnceMotion, METH_VARARGS }, + { "PushLoopMotion", chrPushLoopMotion, METH_VARARGS }, + { "GetPixelPosition", chrGetPixelPosition, METH_VARARGS }, + { "SetRotation", chrSetRotation, METH_VARARGS }, + { "SetRotationAll", chrSetRotationAll, METH_VARARGS }, + { "BlendRotation", chrBlendRotation, METH_VARARGS }, + { "GetRotation", chrGetRotation, METH_VARARGS }, + { "GetRace", chrGetRace, METH_VARARGS }, + { "GetName", chrGetName, METH_VARARGS }, + { "GetNameByVID", chrGetNameByVID, METH_VARARGS }, + { "GetGuildID", chrGetGuildID, METH_VARARGS }, + { "GetProjectPosition", chrGetProjectPosition, METH_VARARGS }, + + { "GetVirtualNumber", chrGetVirtualNumber, METH_VARARGS }, + { "GetInstanceType", chrGetInstanceType, METH_VARARGS }, + + { "GetBoundBoxOnlyXY", chrGetBoundBoxOnlyXY, METH_VARARGS }, + + { "RaceToJob", chrRaceToJob, METH_VARARGS }, + { "RaceToSex", chrRaceToSex, METH_VARARGS }, + + // For Test + { "testGetPKData", chrtestGetPKData, METH_VARARGS }, + { "FaintTest", chrFaintTest, METH_VARARGS }, + { "SetMoveSpeed", chrSetMoveSpeed, METH_VARARGS }, + { "SetAttackSpeed", chrSetAttackSpeed, METH_VARARGS }, + { "WeaponTraceSetTexture", chrWeaponTraceSetTexture, METH_VARARGS }, + { "WeaponTraceUseAlpha", chrWeaponTraceUseAlpha, METH_VARARGS }, + { "WeaponTraceUseTexture", chrWeaponTraceUseTexture, METH_VARARGS }, + { "MoveToDestPosition", chrMoveToDestPosition, METH_VARARGS }, + { "testSetComboType", chrtestSetComboType, METH_VARARGS }, + { "testSetAddRenderMode", chrtestSetAddRenderMode, METH_VARARGS }, + { "testSetModulateRenderMode", chrtestSetModulateRenderMode, METH_VARARGS }, + { "testSetAddRenderModeRGB", chrtestSetAddRenderModeRGB, METH_VARARGS }, + { "testSetModulateRenderModeRGB", chrtestSetModulateRenderModeRGB, METH_VARARGS }, + { "testSetSpecularRenderMode", chrtestSetSpecularRenderMode, METH_VARARGS }, + { "testSetSpecularRenderMode2", chrtestSetSpecularRenderMode2, METH_VARARGS }, + { "testRestoreRenderMode", chrtestRestoreRenderMode, METH_VARARGS }, + { "testSetRideMan", chrtestSetRideMan, METH_VARARGS }, + + { NULL, NULL, NULL }, + }; + + PyObject * poModule = Py_InitModule("chr", s_methods); + + // Length + PyModule_AddIntConstant(poModule, "PLAYER_NAME_MAX_LEN", PLAYER_NAME_MAX_LEN); + + // General + PyModule_AddIntConstant(poModule, "MOTION_NONE", CRaceMotionData::NAME_NONE); + + PyModule_AddIntConstant(poModule, "MOTION_SPAWN", CRaceMotionData::NAME_SPAWN); + PyModule_AddIntConstant(poModule, "MOTION_WAIT", CRaceMotionData::NAME_WAIT); + PyModule_AddIntConstant(poModule, "MOTION_WALK", CRaceMotionData::NAME_WALK); + PyModule_AddIntConstant(poModule, "MOTION_RUN", CRaceMotionData::NAME_RUN); + PyModule_AddIntConstant(poModule, "MOTION_CHANGE_WEAPON", CRaceMotionData::NAME_CHANGE_WEAPON); + PyModule_AddIntConstant(poModule, "MOTION_DAMAGE", CRaceMotionData::NAME_DAMAGE); + PyModule_AddIntConstant(poModule, "MOTION_DAMAGE_FLYING", CRaceMotionData::NAME_DAMAGE_FLYING); + PyModule_AddIntConstant(poModule, "MOTION_STAND_UP", CRaceMotionData::NAME_STAND_UP); + PyModule_AddIntConstant(poModule, "MOTION_DAMAGE_BACK", CRaceMotionData::NAME_DAMAGE_BACK); + PyModule_AddIntConstant(poModule, "MOTION_DAMAGE_FLYING_BACK", CRaceMotionData::NAME_DAMAGE_FLYING_BACK); + PyModule_AddIntConstant(poModule, "MOTION_STAND_UP_BACK", CRaceMotionData::NAME_STAND_UP_BACK); + PyModule_AddIntConstant(poModule, "MOTION_DEAD", CRaceMotionData::NAME_DEAD); + PyModule_AddIntConstant(poModule, "MOTION_DEAD_BACK", CRaceMotionData::NAME_DEAD_BACK); + PyModule_AddIntConstant(poModule, "MOTION_NORMAL_ATTACK", CRaceMotionData::NAME_NORMAL_ATTACK); + PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_1", CRaceMotionData::NAME_COMBO_ATTACK_1); + PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_2", CRaceMotionData::NAME_COMBO_ATTACK_2); + PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_3", CRaceMotionData::NAME_COMBO_ATTACK_3); + PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_4", CRaceMotionData::NAME_COMBO_ATTACK_4); + PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_5", CRaceMotionData::NAME_COMBO_ATTACK_5); + PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_6", CRaceMotionData::NAME_COMBO_ATTACK_6); + PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_7", CRaceMotionData::NAME_COMBO_ATTACK_7); + PyModule_AddIntConstant(poModule, "MOTION_COMBO_ATTACK_8", CRaceMotionData::NAME_COMBO_ATTACK_8); + PyModule_AddIntConstant(poModule, "MOTION_INTRO_WAIT", CRaceMotionData::NAME_INTRO_WAIT); + PyModule_AddIntConstant(poModule, "MOTION_INTRO_SELECTED", CRaceMotionData::NAME_INTRO_SELECTED); + PyModule_AddIntConstant(poModule, "MOTION_INTRO_NOT_SELECTED", CRaceMotionData::NAME_INTRO_NOT_SELECTED); + PyModule_AddIntConstant(poModule, "MOTION_FISHING_THROW", CRaceMotionData::NAME_FISHING_THROW); + PyModule_AddIntConstant(poModule, "MOTION_FISHING_WAIT", CRaceMotionData::NAME_FISHING_WAIT); + PyModule_AddIntConstant(poModule, "MOTION_FISHING_STOP", CRaceMotionData::NAME_FISHING_STOP); + PyModule_AddIntConstant(poModule, "MOTION_FISHING_REACT", CRaceMotionData::NAME_FISHING_REACT); + PyModule_AddIntConstant(poModule, "MOTION_FISHING_CATCH", CRaceMotionData::NAME_FISHING_CATCH); + PyModule_AddIntConstant(poModule, "MOTION_FISHING_FAIL", CRaceMotionData::NAME_FISHING_FAIL); + PyModule_AddIntConstant(poModule, "MOTION_STOP", CRaceMotionData::NAME_STOP); + PyModule_AddIntConstant(poModule, "MOTION_SKILL", CRaceMotionData::NAME_SKILL); + PyModule_AddIntConstant(poModule, "MOTION_CLAP", CRaceMotionData::NAME_CLAP); + PyModule_AddIntConstant(poModule, "MOTION_DANCE_1", CRaceMotionData::NAME_DANCE_1); + PyModule_AddIntConstant(poModule, "MOTION_DANCE_2", CRaceMotionData::NAME_DANCE_2); + + PyModule_AddIntConstant(poModule, "MOTION_DANCE_3", CRaceMotionData::NAME_DANCE_3); + PyModule_AddIntConstant(poModule, "MOTION_DANCE_4", CRaceMotionData::NAME_DANCE_4); + PyModule_AddIntConstant(poModule, "MOTION_DANCE_5", CRaceMotionData::NAME_DANCE_5); + PyModule_AddIntConstant(poModule, "MOTION_DANCE_6", CRaceMotionData::NAME_DANCE_6); + PyModule_AddIntConstant(poModule, "MOTION_CONGRATULATION", CRaceMotionData::NAME_CONGRATULATION); + PyModule_AddIntConstant(poModule, "MOTION_FORGIVE", CRaceMotionData::NAME_FORGIVE); + PyModule_AddIntConstant(poModule, "MOTION_ANGRY", CRaceMotionData::NAME_ANGRY); + PyModule_AddIntConstant(poModule, "MOTION_ATTRACTIVE", CRaceMotionData::NAME_ATTRACTIVE); + PyModule_AddIntConstant(poModule, "MOTION_SAD", CRaceMotionData::NAME_SAD); + PyModule_AddIntConstant(poModule, "MOTION_SHY", CRaceMotionData::NAME_SHY); + PyModule_AddIntConstant(poModule, "MOTION_CHEERUP", CRaceMotionData::NAME_CHEERUP); + PyModule_AddIntConstant(poModule, "MOTION_BANTER", CRaceMotionData::NAME_BANTER); + PyModule_AddIntConstant(poModule, "MOTION_JOY", CRaceMotionData::NAME_JOY); + + + PyModule_AddIntConstant(poModule, "MOTION_CHEERS_1", CRaceMotionData::NAME_CHEERS_1); + PyModule_AddIntConstant(poModule, "MOTION_CHEERS_2", CRaceMotionData::NAME_CHEERS_2); + PyModule_AddIntConstant(poModule, "MOTION_KISS_WITH_WARRIOR", CRaceMotionData::NAME_KISS_WITH_WARRIOR); + PyModule_AddIntConstant(poModule, "MOTION_KISS_WITH_ASSASSIN", CRaceMotionData::NAME_KISS_WITH_ASSASSIN); + PyModule_AddIntConstant(poModule, "MOTION_KISS_WITH_SURA", CRaceMotionData::NAME_KISS_WITH_SURA); + PyModule_AddIntConstant(poModule, "MOTION_KISS_WITH_SHAMAN", CRaceMotionData::NAME_KISS_WITH_SHAMAN); + PyModule_AddIntConstant(poModule, "MOTION_FRENCH_KISS_WITH_WARRIOR", CRaceMotionData::NAME_FRENCH_KISS_WITH_WARRIOR); + PyModule_AddIntConstant(poModule, "MOTION_FRENCH_KISS_WITH_ASSASSIN", CRaceMotionData::NAME_FRENCH_KISS_WITH_ASSASSIN); + PyModule_AddIntConstant(poModule, "MOTION_FRENCH_KISS_WITH_SURA", CRaceMotionData::NAME_FRENCH_KISS_WITH_SURA); + PyModule_AddIntConstant(poModule, "MOTION_FRENCH_KISS_WITH_SHAMAN", CRaceMotionData::NAME_FRENCH_KISS_WITH_SHAMAN); + PyModule_AddIntConstant(poModule, "MOTION_SLAP_HIT_WITH_WARRIOR", CRaceMotionData::NAME_SLAP_HIT_WITH_WARRIOR); + PyModule_AddIntConstant(poModule, "MOTION_SLAP_HIT_WITH_ASSASSIN", CRaceMotionData::NAME_SLAP_HIT_WITH_ASSASSIN); + PyModule_AddIntConstant(poModule, "MOTION_SLAP_HIT_WITH_SURA", CRaceMotionData::NAME_SLAP_HIT_WITH_SURA); + PyModule_AddIntConstant(poModule, "MOTION_SLAP_HIT_WITH_SHAMAN", CRaceMotionData::NAME_SLAP_HIT_WITH_SHAMAN); + PyModule_AddIntConstant(poModule, "MOTION_SLAP_HURT_WITH_WARRIOR", CRaceMotionData::NAME_SLAP_HURT_WITH_WARRIOR); + PyModule_AddIntConstant(poModule, "MOTION_SLAP_HURT_WITH_ASSASSIN", CRaceMotionData::NAME_SLAP_HURT_WITH_ASSASSIN); + PyModule_AddIntConstant(poModule, "MOTION_SLAP_HURT_WITH_SURA", CRaceMotionData::NAME_SLAP_HURT_WITH_SURA); + PyModule_AddIntConstant(poModule, "MOTION_SLAP_HURT_WITH_SHAMAN", CRaceMotionData::NAME_SLAP_HURT_WITH_SHAMAN); + PyModule_AddIntConstant(poModule, "MOTION_DIG", CRaceMotionData::NAME_DIG); + + PyModule_AddIntConstant(poModule, "MOTION_MODE_RESERVED", CRaceMotionData::MODE_RESERVED); + PyModule_AddIntConstant(poModule, "MOTION_MODE_GENERAL", CRaceMotionData::MODE_GENERAL); + PyModule_AddIntConstant(poModule, "MOTION_MODE_ONEHAND_SWORD", CRaceMotionData::MODE_ONEHAND_SWORD); + PyModule_AddIntConstant(poModule, "MOTION_MODE_TWOHAND_SWORD", CRaceMotionData::MODE_TWOHAND_SWORD); + PyModule_AddIntConstant(poModule, "MOTION_MODE_DUALHAND_SWORD", CRaceMotionData::MODE_DUALHAND_SWORD); + PyModule_AddIntConstant(poModule, "MOTION_MODE_BOW", CRaceMotionData::MODE_BOW); + PyModule_AddIntConstant(poModule, "MOTION_MODE_FAN", CRaceMotionData::MODE_FAN); + PyModule_AddIntConstant(poModule, "MOTION_MODE_BELL", CRaceMotionData::MODE_BELL); + PyModule_AddIntConstant(poModule, "MOTION_MODE_FISHING", CRaceMotionData::MODE_FISHING); + PyModule_AddIntConstant(poModule, "MOTION_MODE_HORSE", CRaceMotionData::MODE_HORSE); + PyModule_AddIntConstant(poModule, "MOTION_MODE_HORSE_ONEHAND_SWORD", CRaceMotionData::MODE_HORSE_ONEHAND_SWORD); + PyModule_AddIntConstant(poModule, "MOTION_MODE_HORSE_TWOHAND_SWORD", CRaceMotionData::MODE_HORSE_TWOHAND_SWORD); + PyModule_AddIntConstant(poModule, "MOTION_MODE_HORSE_DUALHAND_SWORD", CRaceMotionData::MODE_HORSE_DUALHAND_SWORD); + PyModule_AddIntConstant(poModule, "MOTION_MODE_HORSE_BOW", CRaceMotionData::MODE_HORSE_BOW); + PyModule_AddIntConstant(poModule, "MOTION_MODE_HORSE_FAN", CRaceMotionData::MODE_HORSE_FAN); + PyModule_AddIntConstant(poModule, "MOTION_MODE_HORSE_BELL", CRaceMotionData::MODE_HORSE_BELL); + PyModule_AddIntConstant(poModule, "MOTION_MODE_WEDDING_DRESS", CRaceMotionData::MODE_WEDDING_DRESS); + + PyModule_AddIntConstant(poModule, "DIR_NORTH", CInstanceBase::DIR_NORTH); + PyModule_AddIntConstant(poModule, "DIR_NORTHEAST", CInstanceBase::DIR_NORTHEAST); + PyModule_AddIntConstant(poModule, "DIR_EAST", CInstanceBase::DIR_EAST); + PyModule_AddIntConstant(poModule, "DIR_SOUTHEAST", CInstanceBase::DIR_SOUTHEAST); + PyModule_AddIntConstant(poModule, "DIR_SOUTH", CInstanceBase::DIR_SOUTH); + PyModule_AddIntConstant(poModule, "DIR_SOUTHWEST", CInstanceBase::DIR_SOUTHWEST); + PyModule_AddIntConstant(poModule, "DIR_WEST", CInstanceBase::DIR_WEST); + PyModule_AddIntConstant(poModule, "DIR_NORTHWEST", CInstanceBase::DIR_NORTHWEST); + + PyModule_AddIntConstant(poModule, "INSTANCE_TYPE_PLAYER", CActorInstance::TYPE_PC); + PyModule_AddIntConstant(poModule, "INSTANCE_TYPE_NPC", CActorInstance::TYPE_NPC); + PyModule_AddIntConstant(poModule, "INSTANCE_TYPE_ENEMY", CActorInstance::TYPE_ENEMY); + PyModule_AddIntConstant(poModule, "INSTANCE_TYPE_BUILDING", CActorInstance::TYPE_BUILDING); + PyModule_AddIntConstant(poModule, "INSTANCE_TYPE_OBJECT", CActorInstance::TYPE_OBJECT); + + PyModule_AddIntConstant(poModule, "PART_WEAPON", CRaceData::PART_WEAPON); + PyModule_AddIntConstant(poModule, "PART_HEAD", CRaceData::PART_HEAD); + PyModule_AddIntConstant(poModule, "PART_WEAPON_LEFT", CRaceData::PART_WEAPON_LEFT); + + ///// + + PyModule_AddIntConstant(poModule, "AFFECT_POISON", CInstanceBase::AFFECT_POISON); + PyModule_AddIntConstant(poModule, "AFFECT_SLOW", CInstanceBase::AFFECT_SLOW); + PyModule_AddIntConstant(poModule, "AFFECT_STUN", CInstanceBase::AFFECT_STUN); + PyModule_AddIntConstant(poModule, "AFFECT_MOV_SPEED_POTION", CInstanceBase::AFFECT_MOV_SPEED_POTION); + PyModule_AddIntConstant(poModule, "AFFECT_ATT_SPEED_POTION", CInstanceBase::AFFECT_ATT_SPEED_POTION); + PyModule_AddIntConstant(poModule, "AFFECT_FISH_MIND", CInstanceBase::AFFECT_FISH_MIND); + + PyModule_AddIntConstant(poModule, "AFFECT_JEONGWI", CInstanceBase::AFFECT_JEONGWI); + PyModule_AddIntConstant(poModule, "AFFECT_GEOMGYEONG", CInstanceBase::AFFECT_GEOMGYEONG); + PyModule_AddIntConstant(poModule, "AFFECT_CHEONGEUN", CInstanceBase::AFFECT_CHEONGEUN); + PyModule_AddIntConstant(poModule, "AFFECT_GYEONGGONG", CInstanceBase::AFFECT_GYEONGGONG); + PyModule_AddIntConstant(poModule, "AFFECT_EUNHYEONG", CInstanceBase::AFFECT_EUNHYEONG); + PyModule_AddIntConstant(poModule, "AFFECT_GWIGEOM", CInstanceBase::AFFECT_GWIGEOM); + PyModule_AddIntConstant(poModule, "AFFECT_GONGPO", CInstanceBase::AFFECT_GONGPO); + PyModule_AddIntConstant(poModule, "AFFECT_JUMAGAP", CInstanceBase::AFFECT_JUMAGAP); + PyModule_AddIntConstant(poModule, "AFFECT_HOSIN", CInstanceBase::AFFECT_HOSIN); + PyModule_AddIntConstant(poModule, "AFFECT_BOHO", CInstanceBase::AFFECT_BOHO); + PyModule_AddIntConstant(poModule, "AFFECT_KWAESOK", CInstanceBase::AFFECT_KWAESOK); + PyModule_AddIntConstant(poModule, "AFFECT_HEUKSIN", CInstanceBase::AFFECT_HEUKSIN); + PyModule_AddIntConstant(poModule, "AFFECT_MUYEONG", CInstanceBase::AFFECT_MUYEONG); + PyModule_AddIntConstant(poModule, "AFFECT_GICHEON", CInstanceBase::AFFECT_GICHEON); + PyModule_AddIntConstant(poModule, "AFFECT_JEUNGRYEOK", CInstanceBase::AFFECT_JEUNGRYEOK); + PyModule_AddIntConstant(poModule, "AFFECT_PABEOP", CInstanceBase::AFFECT_PABEOP); + PyModule_AddIntConstant(poModule, "AFFECT_FALLEN_CHEONGEUN", CInstanceBase::AFFECT_FALLEN_CHEONGEUN); + PyModule_AddIntConstant(poModule, "AFFECT_CHINA_FIREWORK", CInstanceBase::AFFECT_CHINA_FIREWORK); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_MALL", CInstanceBase::NEW_AFFECT_MALL); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_NO_DEATH_PENALTY", CInstanceBase::NEW_AFFECT_NO_DEATH_PENALTY); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_SKILL_BOOK_BONUS", CInstanceBase::NEW_AFFECT_SKILL_BOOK_BONUS); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_SKILL_BOOK_NO_DELAY", CInstanceBase::NEW_AFFECT_SKILL_BOOK_NO_DELAY); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_EXP_BONUS", CInstanceBase::NEW_AFFECT_EXP_BONUS); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_EXP_BONUS_EURO_FREE", CInstanceBase::NEW_AFFECT_EXP_BONUS_EURO_FREE); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_EXP_BONUS_EURO_FREE_UNDER_15",CInstanceBase::NEW_AFFECT_EXP_BONUS_EURO_FREE_UNDER_15); + + PyModule_AddIntConstant(poModule, "NEW_AFFECT_ITEM_BONUS", CInstanceBase::NEW_AFFECT_ITEM_BONUS); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_SAFEBOX", CInstanceBase::NEW_AFFECT_SAFEBOX); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_AUTOLOOT", CInstanceBase::NEW_AFFECT_AUTOLOOT); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_FISH_MIND", CInstanceBase::NEW_AFFECT_FISH_MIND); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_MARRIAGE_FAST", CInstanceBase::NEW_AFFECT_MARRIAGE_FAST); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_GOLD_BONUS", CInstanceBase::NEW_AFFECT_GOLD_BONUS); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_AUTO_HP_RECOVERY", CInstanceBase::NEW_AFFECT_AUTO_HP_RECOVERY); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_AUTO_SP_RECOVERY", CInstanceBase::NEW_AFFECT_AUTO_SP_RECOVERY); + + PyModule_AddIntConstant(poModule, "NEW_AFFECT_DRAGON_SOUL_QUALIFIED", CInstanceBase::NEW_AFFECT_DRAGON_SOUL_QUALIFIED); + + PyModule_AddIntConstant(poModule, "NEW_AFFECT_DRAGON_SOUL_DECK1", CInstanceBase::NEW_AFFECT_DRAGON_SOUL_DECK1); + PyModule_AddIntConstant(poModule, "NEW_AFFECT_DRAGON_SOUL_DECK2", CInstanceBase::NEW_AFFECT_DRAGON_SOUL_DECK2); + +} diff --git a/extension/src/port/UserInterface/StdAfx.h b/extension/src/port/UserInterface/StdAfx.h index 8d5c0cd5..bd33377b 100644 --- a/extension/src/port/UserInterface/StdAfx.h +++ b/extension/src/port/UserInterface/StdAfx.h @@ -44,5 +44,7 @@ enum // Listed here as 40250 lists them; only the ported ones are defined. void initpack(); void initapp(); +void initchr(); +void initchrmgr(); void initChat(); void initnet(); diff --git a/extension/src/port/common/D3DXMath.cpp b/extension/src/port/common/D3DXMath.cpp index c5d776ad..e5c0a5c1 100644 --- a/extension/src/port/common/D3DXMath.cpp +++ b/extension/src/port/common/D3DXMath.cpp @@ -154,6 +154,34 @@ D3DXMATRIX* D3DXMatrixInverse(D3DXMATRIX* pOut, FLOAT* pDeterminant, const D3DXM return pOut; } +FLOAT D3DXMatrixfDeterminant(const D3DXMATRIX* pM) +{ + FLOAT det = 0.0f; + D3DXMATRIX unused; + D3DXMatrixInverse(&unused, &det, pM); + return det; +} + +D3DXMATRIX* D3DXMatrixLookAtRH(D3DXMATRIX* pOut, const D3DXVECTOR3* pEye, const D3DXVECTOR3* pAt, const D3DXVECTOR3* pUp) +{ + D3DXVECTOR3 z = *pEye - *pAt; + D3DXVec3Normalize(&z, &z); + D3DXVECTOR3 x; + D3DXVec3Cross(&x, pUp, &z); + D3DXVec3Normalize(&x, &x); + D3DXVECTOR3 y; + D3DXVec3Cross(&y, &z, &x); + + pOut->_11 = x.x; pOut->_12 = y.x; pOut->_13 = z.x; pOut->_14 = 0.0f; + pOut->_21 = x.y; pOut->_22 = y.y; pOut->_23 = z.y; pOut->_24 = 0.0f; + pOut->_31 = x.z; pOut->_32 = y.z; pOut->_33 = z.z; pOut->_34 = 0.0f; + pOut->_41 = -D3DXVec3Dot(&x, pEye); + pOut->_42 = -D3DXVec3Dot(&y, pEye); + pOut->_43 = -D3DXVec3Dot(&z, pEye); + pOut->_44 = 1.0f; + return pOut; +} + D3DXMATRIX* D3DXMatrixScaling(D3DXMATRIX* pOut, FLOAT sx, FLOAT sy, FLOAT sz) { D3DXMatrixIdentity(pOut); diff --git a/extension/src/port/common/D3DXMath.h b/extension/src/port/common/D3DXMath.h index 0690c2b9..21233b0a 100644 --- a/extension/src/port/common/D3DXMath.h +++ b/extension/src/port/common/D3DXMath.h @@ -251,6 +251,8 @@ static_assert(sizeof(D3DXPLANE) == 16 && sizeof(D3DCOLORVALUE) == 16, "D3DX layo inline FLOAT D3DXVec2Length(const D3DXVECTOR2* pV) { return sqrtf(pV->x * pV->x + pV->y * pV->y); } inline FLOAT D3DXVec2LengthSq(const D3DXVECTOR2* pV) { return pV->x * pV->x + pV->y * pV->y; } inline FLOAT D3DXVec2Dot(const D3DXVECTOR2* pV1, const D3DXVECTOR2* pV2) { return pV1->x * pV2->x + pV1->y * pV2->y; } +// d3dx8math.inl: the z of the 3D cross product. +inline FLOAT D3DXVec2CCW(const D3DXVECTOR2* pV1, const D3DXVECTOR2* pV2) { return pV1->x * pV2->y - pV1->y * pV2->x; } inline D3DXVECTOR2* D3DXVec2Add(D3DXVECTOR2* pOut, const D3DXVECTOR2* pV1, const D3DXVECTOR2* pV2) { pOut->x = pV1->x + pV2->x; @@ -354,6 +356,9 @@ inline BOOL D3DXMatrixIsIdentity(const D3DXMATRIX* pM) D3DXMATRIX* D3DXMatrixMultiply(D3DXMATRIX* pOut, const D3DXMATRIX* pM1, const D3DXMATRIX* pM2); D3DXMATRIX* D3DXMatrixTranspose(D3DXMATRIX* pOut, const D3DXMATRIX* pM); D3DXMATRIX* D3DXMatrixInverse(D3DXMATRIX* pOut, FLOAT* pDeterminant, const D3DXMATRIX* pM); +FLOAT D3DXMatrixfDeterminant(const D3DXMATRIX* pM); +// Right-handed view matrix: z = normalize(eye - at), x = normalize(up x z), y = z x x. +D3DXMATRIX* D3DXMatrixLookAtRH(D3DXMATRIX* pOut, const D3DXVECTOR3* pEye, const D3DXVECTOR3* pAt, const D3DXVECTOR3* pUp); D3DXMATRIX* D3DXMatrixScaling(D3DXMATRIX* pOut, FLOAT sx, FLOAT sy, FLOAT sz); D3DXMATRIX* D3DXMatrixTranslation(D3DXMATRIX* pOut, FLOAT x, FLOAT y, FLOAT z); D3DXMATRIX* D3DXMatrixRotationX(D3DXMATRIX* pOut, FLOAT angle); diff --git a/extension/tests/port_login_flow_test.cpp b/extension/tests/port_login_flow_test.cpp index 140931fd..6c52f1db 100644 --- a/extension/tests/port_login_flow_test.cpp +++ b/extension/tests/port_login_flow_test.cpp @@ -40,6 +40,10 @@ #include "../src/platform/ScriptLib/PythonHost.h" #include "../src/platform/UserInterface/UserInterface.h" #include "../src/platform/EterBase/TraceErrorObserver.h" +#include "GameLib/StdAfx.h" +#include "GameLib/RaceManager.h" +#include "GameLib/RaceData.h" +#include "GameLib/RaceMotionData.h" #include "port_login_flow_server.h" #include @@ -68,10 +72,21 @@ static int g_failures = 0; static std::mutex g_syserr_mutex; static std::vector g_syserr; +// The two headers CheckPacket saw last (UserInterface/PythonNetworkStream.cpp). +extern int g_iLastPacket[2]; + +// CPythonNetworkStream::RecvDefaultPacket's CP949 "unhandled packet header %d, state %s": a phase +// dispatcher dropped the whole recv buffer. +static const char kUnhandledPacket[] = "\xc3\xb3\xb8\xae\xb5\xc7\xc1\xf6 \xbe\xca\xc0\xba \xc6\xd0\xc5\xb6 \xc7\xec\xb4\xf5"; + static void on_trace_error(const char* line) { std::lock_guard lock(g_syserr_mutex); g_syserr.emplace_back(line); + // RecvDefaultPacket does not print the preceding headers; the packet before a stray header is + // the one whose size disagrees with the server. + if (std::string(line).find(kUnhandledPacket) != std::string::npos) + std::fprintf(stderr, "port_login_flow_test: unhandled packet after headers %d, %d\n", g_iLastPacket[0], g_iLastPacket[1]); } static int count_syserr(const char* needle) @@ -277,9 +292,19 @@ int main(int argc, char** argv) CHECK(py_true(gaming)); CHECK(py("import net\nassert net.IsConnect(), 'disconnected in the game phase'")); CHECK(count_syserr("Unknown packet header") == 0); + CHECK(count_syserr(kUnhandledPacket) == 0); + CHECK(count_syserr("does not handle this header") == 0); // The fake greet notice went through RecvChatPacket into the ported CPythonChat, where // uichat's chat set (created by the game interface) counts it. CHECK(live || py("import chat\nassert any(chat.GetLineCount(i) > 0 for i in range(4)), 'greet notice not in chat'")); + // playerSettingModule ran its race registration through the real chrmgr module: the warrior + // (race 0) has a general-mode wait motion in its CRaceData. + CHECK(py("import chr, chrmgr\nassert not hasattr(chr, '__port_stub__') and not hasattr(chrmgr, '__port_stub__')")); + CRaceData* race = nullptr; + const CRaceData::TMotionVector* waits = nullptr; + CHECK(CRaceManager::Instance().GetRaceDataPointer(0, &race) && race && + race->GetMotionVectorPointer(CRaceMotionData::MODE_GENERAL, CRaceMotionData::NAME_WAIT, &waits) && + waits && !waits->empty()); } if (server) {