2V3-a: walk with the keyboard through the ported player chain

PythonPlayer, PythonPlayerInput{,Keyboard,Mouse}, PythonPlayerEventHandler,
PythonPlayerSkill, PythonPlayerModule and GameType are verbatim copies; the
`player` stub module and the pending PythonPlayer/GameType stand-ins are gone.
Unported callees (CPythonSkill, CItemData, CItemManager, CPythonItem, ...) are
pending stubs. 64-bit fixes: emotion icon handles use Py_BuildPointer, and
PyDict_Next takes Py_ssize_t.

The actor did not move because GrannyUpdateModelMatrix passed the model matrix
through. Walk/run motions use constant root-motion extraction
(AccumulationFlags=AccumulationExtracted, LoopTranslation e.g. (0,-300,0) for
the warrior run, same as the .msa Accumulation). libgr2 now reads both fields
from TrackGroups[0], and the runtime moves by LoopTranslation over each
control's local-clock span, blended by control weight. VDA extraction is not
implemented.

port.login_flow presses DIK_UP; the actor walks more than 100 cm, and the fake
server parses CG packets and sees CG_MOVE FUNC_MOVE, then FUNC_WAIT at the new
position. port.login_live against the real server walked 132 cm.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-23 23:41:31 +09:00
co-authored by Claude Opus 5.5
parent 157f7c3bb4
commit ff0983d3c8
39 changed files with 10170 additions and 2039 deletions
@@ -7,14 +7,8 @@
#include "UserInterface/PythonBackground.h"
#include "EterLib/StateManager.h"
#include "GameLib/MapOutdoor.h"
#include "UserInterface/PythonChat.h"
#include "UserInterface/PythonItem.h"
#include "GameLib/ItemManager.h"
#include "UserInterface/PythonCharacterManager.h"
#include "UserInterface/PythonNonPlayer.h"
#include "UserInterface/InstanceBase.h"
#include "GameLib/RaceManager.h"
#include "EffectLib/EffectManager.h"
#include "UserInterface/PythonCharacterManager.h"
#include "UserInterface/PythonEventManager.h"
#include "UserInterface/PythonNetworkStream.h"
#include "GameLib/GameEventManager.h"
@@ -25,10 +19,13 @@
#include "UserInterface/MarkManager.h"
#include "UserInterface/PythonIME.h"
#include "UserInterface/PythonApplication.h"
#include "UserInterface/PythonItem.h"
#include "GameLib/ItemManager.h"
#include "UserInterface/InstanceBase.h"
#include "UserInterface/AbstractApplication.h"
#include "UserInterface/PythonMessenger.h"
#include "UserInterface/PythonMiniMap.h"
#include "UserInterface/PythonPlayer.h"
#include "UserInterface/PythonNonPlayer.h"
#include "EterLib/Profiler.h"
#include "UserInterface/PythonQuest.h"
#include "UserInterface/PythonSafeBox.h"
@@ -36,6 +33,7 @@
#include "UserInterface/PythonSkill.h"
#include "EterBase/Poly/Poly.h"
#include "EterPack/EterPackManager.h"
#include "UserInterface/PythonPlayer.h"
#include "UserInterface/PythonTextTail.h"
// 40250 UserInterface/ServerStateCheckerModule.cpp
@@ -473,279 +471,6 @@ void AddStubConstants_nonplayer(PyObject* poModule)
PyModule_AddIntConstant(poModule, "KING", 5);
}
// 40250 UserInterface/PythonPlayerModule.cpp
extern const DWORD c_iSkillIndex_Tongsol = 121;
extern const DWORD c_iSkillIndex_Combo = 122;
extern const DWORD c_iSkillIndex_Fishing = 123;
extern const DWORD c_iSkillIndex_Mining = 124;
extern const DWORD c_iSkillIndex_Making = 125;
extern const DWORD c_iSkillIndex_Language1 = 126;
extern const DWORD c_iSkillIndex_Language2 = 127;
extern const DWORD c_iSkillIndex_Language3 = 128;
extern const DWORD c_iSkillIndex_Polymorph = 129;
extern const DWORD c_iSkillIndex_Riding = 130;
extern const DWORD c_iSkillIndex_Summon = 131;
enum
{
EMOTION_CLAP = 1,
EMOTION_CHEERS_1,
EMOTION_CHEERS_2,
EMOTION_DANCE_1,
EMOTION_DANCE_2,
EMOTION_DANCE_3,
EMOTION_DANCE_4,
EMOTION_DANCE_5,
EMOTION_DANCE_6, // 강남스타일
EMOTION_CONGRATULATION,
EMOTION_FORGIVE,
EMOTION_ANGRY,
EMOTION_ATTRACTIVE,
EMOTION_SAD,
EMOTION_SHY,
EMOTION_CHEERUP,
EMOTION_BANTER,
EMOTION_JOY,
EMOTION_KISS = 51,
EMOTION_FRENCH_KISS,
EMOTION_SLAP,
};
enum
{
REFINE_SCROLL_TYPE_MAKE_SOCKET = 1,
REFINE_SCROLL_TYPE_UP_GRADE = 2,
};
enum
{
REFINE_CANT,
REFINE_OK,
REFINE_ALREADY_MAX_SOCKET_COUNT,
REFINE_NEED_MORE_GOOD_SCROLL,
REFINE_CANT_MAKE_SOCKET_ITEM,
REFINE_NOT_NEXT_GRADE_ITEM,
REFINE_CANT_REFINE_METIN_TO_EQUIPMENT,
REFINE_CANT_REFINE_ROD,
};
enum
{
ATTACH_METIN_CANT,
ATTACH_METIN_OK,
ATTACH_METIN_NOT_MATCHABLE_ITEM,
ATTACH_METIN_NO_MATCHABLE_SOCKET,
ATTACH_METIN_NOT_EXIST_GOLD_SOCKET,
ATTACH_METIN_CANT_ATTACH_TO_EQUIPMENT,
};
enum
{
DETACH_METIN_CANT,
DETACH_METIN_OK,
};
// 40250 UserInterface/PythonPlayerModule.cpp
void AddStubConstants_player(PyObject* poModule)
{
(void) poModule;
PyModule_AddIntConstant(poModule, "LEVEL", POINT_LEVEL);
PyModule_AddIntConstant(poModule, "VOICE", POINT_VOICE);
PyModule_AddIntConstant(poModule, "EXP", POINT_EXP);
PyModule_AddIntConstant(poModule, "NEXT_EXP", POINT_NEXT_EXP);
PyModule_AddIntConstant(poModule, "HP", POINT_HP);
PyModule_AddIntConstant(poModule, "MAX_HP", POINT_MAX_HP);
PyModule_AddIntConstant(poModule, "SP", POINT_SP);
PyModule_AddIntConstant(poModule, "MAX_SP", POINT_MAX_SP);
PyModule_AddIntConstant(poModule, "STAMINA", POINT_STAMINA);
PyModule_AddIntConstant(poModule, "MAX_STAMINA", POINT_MAX_STAMINA);
PyModule_AddIntConstant(poModule, "ELK", POINT_GOLD);
PyModule_AddIntConstant(poModule, "ST", POINT_ST);
PyModule_AddIntConstant(poModule, "HT", POINT_HT);
PyModule_AddIntConstant(poModule, "DX", POINT_DX);
PyModule_AddIntConstant(poModule, "IQ", POINT_IQ);
PyModule_AddIntConstant(poModule, "ATT_POWER", POINT_ATT_POWER);
PyModule_AddIntConstant(poModule, "ATT_MIN", POINT_MIN_ATK);
PyModule_AddIntConstant(poModule, "ATT_MAX", POINT_MAX_ATK);
PyModule_AddIntConstant(poModule, "MIN_MAGIC_WEP", POINT_MIN_MAGIC_WEP);
PyModule_AddIntConstant(poModule, "MAX_MAGIC_WEP", POINT_MAX_MAGIC_WEP);
PyModule_AddIntConstant(poModule, "ATT_SPEED", POINT_ATT_SPEED);
PyModule_AddIntConstant(poModule, "ATT_BONUS", POINT_ATT_GRADE_BONUS);
PyModule_AddIntConstant(poModule, "EVADE_RATE", POINT_EVADE_RATE);
PyModule_AddIntConstant(poModule, "MOVING_SPEED", POINT_MOV_SPEED);
PyModule_AddIntConstant(poModule, "DEF_GRADE", POINT_DEF_GRADE);
PyModule_AddIntConstant(poModule, "DEF_BONUS", POINT_DEF_GRADE_BONUS);
PyModule_AddIntConstant(poModule, "CASTING_SPEED", POINT_CASTING_SPEED);
PyModule_AddIntConstant(poModule, "MAG_ATT", POINT_MAGIC_ATT_GRADE);
PyModule_AddIntConstant(poModule, "MAG_DEF", POINT_MAGIC_DEF_GRADE);
PyModule_AddIntConstant(poModule, "EMPIRE_POINT", POINT_EMPIRE_POINT);
PyModule_AddIntConstant(poModule, "STAT", POINT_STAT);
PyModule_AddIntConstant(poModule, "SKILL_PASSIVE", POINT_SUB_SKILL);
PyModule_AddIntConstant(poModule, "SKILL_SUPPORT", POINT_SUB_SKILL);
PyModule_AddIntConstant(poModule, "SKILL_ACTIVE", POINT_SKILL);
PyModule_AddIntConstant(poModule, "SKILL_HORSE", POINT_HORSE_SKILL);
PyModule_AddIntConstant(poModule, "PLAYTIME", POINT_PLAYTIME);
PyModule_AddIntConstant(poModule, "BOW_DISTANCE", POINT_BOW_DISTANCE);
PyModule_AddIntConstant(poModule, "HP_RECOVERY", POINT_HP_RECOVERY);
PyModule_AddIntConstant(poModule, "SP_RECOVERY", POINT_SP_RECOVERY);
PyModule_AddIntConstant(poModule, "ATTACKER_BONUS", POINT_PARTY_ATT_GRADE);
PyModule_AddIntConstant(poModule, "MAX_NUM", POINT_MAX_NUM);
PyModule_AddIntConstant(poModule, "POINT_CRITICAL_PCT", POINT_CRITICAL_PCT);
PyModule_AddIntConstant(poModule, "POINT_PENETRATE_PCT", POINT_PENETRATE_PCT);
PyModule_AddIntConstant(poModule, "POINT_MALL_ATTBONUS", POINT_MALL_ATTBONUS);
PyModule_AddIntConstant(poModule, "POINT_MALL_DEFBONUS", POINT_MALL_DEFBONUS);
PyModule_AddIntConstant(poModule, "POINT_MALL_EXPBONUS", POINT_MALL_EXPBONUS);
PyModule_AddIntConstant(poModule, "POINT_MALL_ITEMBONUS", POINT_MALL_ITEMBONUS);
PyModule_AddIntConstant(poModule, "POINT_MALL_GOLDBONUS", POINT_MALL_GOLDBONUS);
PyModule_AddIntConstant(poModule, "POINT_MAX_HP_PCT", POINT_MAX_HP_PCT);
PyModule_AddIntConstant(poModule, "POINT_MAX_SP_PCT", POINT_MAX_SP_PCT);
PyModule_AddIntConstant(poModule, "POINT_SKILL_DAMAGE_BONUS", POINT_SKILL_DAMAGE_BONUS);
PyModule_AddIntConstant(poModule, "POINT_NORMAL_HIT_DAMAGE_BONUS", POINT_NORMAL_HIT_DAMAGE_BONUS);
PyModule_AddIntConstant(poModule, "POINT_SKILL_DEFEND_BONUS", POINT_SKILL_DEFEND_BONUS);
PyModule_AddIntConstant(poModule, "POINT_NORMAL_HIT_DEFEND_BONUS", POINT_NORMAL_HIT_DEFEND_BONUS);
PyModule_AddIntConstant(poModule, "POINT_PC_BANG_EXP_BONUS", POINT_PC_BANG_EXP_BONUS);
PyModule_AddIntConstant(poModule, "POINT_PC_BANG_DROP_BONUS", POINT_PC_BANG_DROP_BONUS);
PyModule_AddIntConstant(poModule, "ENERGY", POINT_ENERGY);
PyModule_AddIntConstant(poModule, "ENERGY_END_TIME", POINT_ENERGY_END_TIME);
PyModule_AddIntConstant(poModule, "SKILL_GRADE_NORMAL", CPythonPlayer::SKILL_NORMAL);
PyModule_AddIntConstant(poModule, "SKILL_GRADE_MASTER", CPythonPlayer::SKILL_MASTER);
PyModule_AddIntConstant(poModule, "SKILL_GRADE_GRAND_MASTER", CPythonPlayer::SKILL_GRAND_MASTER);
PyModule_AddIntConstant(poModule, "SKILL_GRADE_PERFECT_MASTER", CPythonPlayer::SKILL_PERFECT_MASTER);
PyModule_AddIntConstant(poModule, "CATEGORY_ACTIVE", CPythonPlayer::CATEGORY_ACTIVE);
PyModule_AddIntConstant(poModule, "CATEGORY_PASSIVE", CPythonPlayer::CATEGORY_PASSIVE);
PyModule_AddIntConstant(poModule, "INVENTORY_PAGE_SIZE", c_Inventory_Page_Size);
PyModule_AddIntConstant(poModule, "INVENTORY_PAGE_COUNT", c_Inventory_Page_Count);
PyModule_AddIntConstant(poModule, "INVENTORY_SLOT_COUNT", c_Inventory_Count);
PyModule_AddIntConstant(poModule, "EQUIPMENT_SLOT_START", c_Equipment_Start);
PyModule_AddIntConstant(poModule, "EQUIPMENT_PAGE_COUNT", c_Equipment_Count);
#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM
PyModule_AddIntConstant(poModule, "NEW_EQUIPMENT_SLOT_START", c_New_Equipment_Start);
PyModule_AddIntConstant(poModule, "NEW_EQUIPMENT_SLOT_COUNT", c_New_Equipment_Count);
#endif
PyModule_AddIntConstant(poModule, "MBF_SKILL", CPythonPlayer::MBF_SKILL);
PyModule_AddIntConstant(poModule, "MBF_ATTACK", CPythonPlayer::MBF_ATTACK);
PyModule_AddIntConstant(poModule, "MBF_CAMERA", CPythonPlayer::MBF_CAMERA);
PyModule_AddIntConstant(poModule, "MBF_SMART", CPythonPlayer::MBF_SMART);
PyModule_AddIntConstant(poModule, "MBF_MOVE", CPythonPlayer::MBF_MOVE);
PyModule_AddIntConstant(poModule, "MBF_AUTO", CPythonPlayer::MBF_AUTO);
PyModule_AddIntConstant(poModule, "MBS_PRESS", CPythonPlayer::MBS_PRESS);
PyModule_AddIntConstant(poModule, "MBS_CLICK", CPythonPlayer::MBS_CLICK);
PyModule_AddIntConstant(poModule, "MBT_RIGHT", CPythonPlayer::MBT_RIGHT);
PyModule_AddIntConstant(poModule, "MBT_LEFT", CPythonPlayer::MBT_LEFT);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_NONE", SLOT_TYPE_NONE);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_INVENTORY", SLOT_TYPE_INVENTORY);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_SKILL", SLOT_TYPE_SKILL);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_SHOP", SLOT_TYPE_SHOP);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_EXCHANGE_OWNER", SLOT_TYPE_EXCHANGE_OWNER);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_EXCHANGE_TARGET", SLOT_TYPE_EXCHANGE_TARGET);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_QUICK_SLOT", SLOT_TYPE_QUICK_SLOT);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_SAFEBOX", SLOT_TYPE_SAFEBOX);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_PRIVATE_SHOP", SLOT_TYPE_PRIVATE_SHOP);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_MALL", SLOT_TYPE_MALL);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_EMOTION", SLOT_TYPE_EMOTION);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_DRAGON_SOUL_INVENTORY", SLOT_TYPE_DRAGON_SOUL_INVENTORY);
PyModule_AddIntConstant(poModule, "RESERVED_WINDOW", RESERVED_WINDOW);
PyModule_AddIntConstant(poModule, "INVENTORY", INVENTORY);
PyModule_AddIntConstant(poModule, "EQUIPMENT", EQUIPMENT);
PyModule_AddIntConstant(poModule, "SAFEBOX", SAFEBOX);
PyModule_AddIntConstant(poModule, "MALL", MALL);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_INVENTORY", DRAGON_SOUL_INVENTORY);
PyModule_AddIntConstant(poModule, "GROUND", GROUND);
PyModule_AddIntConstant(poModule, "ITEM_MONEY", -1);
PyModule_AddIntConstant(poModule, "SKILL_SLOT_COUNT", SKILL_MAX_NUM);
PyModule_AddIntConstant(poModule, "EFFECT_PICK", CPythonPlayer::EFFECT_PICK);
PyModule_AddIntConstant(poModule, "METIN_SOCKET_TYPE_NONE", CPythonPlayer::METIN_SOCKET_TYPE_NONE);
PyModule_AddIntConstant(poModule, "METIN_SOCKET_TYPE_SILVER", CPythonPlayer::METIN_SOCKET_TYPE_SILVER);
PyModule_AddIntConstant(poModule, "METIN_SOCKET_TYPE_GOLD", CPythonPlayer::METIN_SOCKET_TYPE_GOLD);
PyModule_AddIntConstant(poModule, "METIN_SOCKET_MAX_NUM", ITEM_SOCKET_SLOT_MAX_NUM);
PyModule_AddIntConstant(poModule, "ATTRIBUTE_SLOT_MAX_NUM", ITEM_ATTRIBUTE_SLOT_MAX_NUM);
PyModule_AddIntConstant(poModule, "REFINE_CANT", REFINE_CANT);
PyModule_AddIntConstant(poModule, "REFINE_OK", REFINE_OK);
PyModule_AddIntConstant(poModule, "REFINE_ALREADY_MAX_SOCKET_COUNT", REFINE_ALREADY_MAX_SOCKET_COUNT);
PyModule_AddIntConstant(poModule, "REFINE_NEED_MORE_GOOD_SCROLL", REFINE_NEED_MORE_GOOD_SCROLL);
PyModule_AddIntConstant(poModule, "REFINE_CANT_MAKE_SOCKET_ITEM", REFINE_CANT_MAKE_SOCKET_ITEM);
PyModule_AddIntConstant(poModule, "REFINE_NOT_NEXT_GRADE_ITEM", REFINE_NOT_NEXT_GRADE_ITEM);
PyModule_AddIntConstant(poModule, "REFINE_CANT_REFINE_METIN_TO_EQUIPMENT", REFINE_CANT_REFINE_METIN_TO_EQUIPMENT);
PyModule_AddIntConstant(poModule, "REFINE_CANT_REFINE_ROD", REFINE_CANT_REFINE_ROD);
PyModule_AddIntConstant(poModule, "ATTACH_METIN_CANT", ATTACH_METIN_CANT);
PyModule_AddIntConstant(poModule, "ATTACH_METIN_OK", ATTACH_METIN_OK);
PyModule_AddIntConstant(poModule, "ATTACH_METIN_NOT_MATCHABLE_ITEM", ATTACH_METIN_NOT_MATCHABLE_ITEM);
PyModule_AddIntConstant(poModule, "ATTACH_METIN_NO_MATCHABLE_SOCKET", ATTACH_METIN_NO_MATCHABLE_SOCKET);
PyModule_AddIntConstant(poModule, "ATTACH_METIN_NOT_EXIST_GOLD_SOCKET", ATTACH_METIN_NOT_EXIST_GOLD_SOCKET);
PyModule_AddIntConstant(poModule, "ATTACH_METIN_CANT_ATTACH_TO_EQUIPMENT", ATTACH_METIN_CANT_ATTACH_TO_EQUIPMENT);
PyModule_AddIntConstant(poModule, "DETACH_METIN_CANT", DETACH_METIN_CANT);
PyModule_AddIntConstant(poModule, "DETACH_METIN_OK", DETACH_METIN_OK);
PyModule_AddIntConstant(poModule, "PARTY_STATE_NORMAL", CPythonPlayer::PARTY_ROLE_NORMAL);
PyModule_AddIntConstant(poModule, "PARTY_STATE_LEADER", CPythonPlayer::PARTY_ROLE_LEADER);
PyModule_AddIntConstant(poModule, "PARTY_STATE_ATTACKER", CPythonPlayer::PARTY_ROLE_ATTACKER);
PyModule_AddIntConstant(poModule, "PARTY_STATE_TANKER", CPythonPlayer::PARTY_ROLE_TANKER);
PyModule_AddIntConstant(poModule, "PARTY_STATE_BUFFER", CPythonPlayer::PARTY_ROLE_BUFFER);
PyModule_AddIntConstant(poModule, "PARTY_STATE_SKILL_MASTER", CPythonPlayer::PARTY_ROLE_SKILL_MASTER);
PyModule_AddIntConstant(poModule, "PARTY_STATE_BERSERKER", CPythonPlayer::PARTY_ROLE_BERSERKER);
PyModule_AddIntConstant(poModule, "PARTY_STATE_DEFENDER", CPythonPlayer::PARTY_ROLE_DEFENDER);
PyModule_AddIntConstant(poModule, "PARTY_STATE_MAX_NUM", CPythonPlayer::PARTY_ROLE_MAX_NUM);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_TONGSOL", c_iSkillIndex_Tongsol);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_FISHING", c_iSkillIndex_Fishing);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_MINING", c_iSkillIndex_Mining);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_MAKING", c_iSkillIndex_Making);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_COMBO", c_iSkillIndex_Combo);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_LANGUAGE1", c_iSkillIndex_Language1);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_LANGUAGE2", c_iSkillIndex_Language2);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_LANGUAGE3", c_iSkillIndex_Language3);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_POLYMORPH", c_iSkillIndex_Polymorph);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_RIDING", c_iSkillIndex_Riding);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_SUMMON", c_iSkillIndex_Summon);
PyModule_AddIntConstant(poModule, "PK_MODE_PEACE", PK_MODE_PEACE);
PyModule_AddIntConstant(poModule, "PK_MODE_REVENGE", PK_MODE_REVENGE);
PyModule_AddIntConstant(poModule, "PK_MODE_FREE", PK_MODE_FREE);
PyModule_AddIntConstant(poModule, "PK_MODE_PROTECT", PK_MODE_PROTECT);
PyModule_AddIntConstant(poModule, "PK_MODE_GUILD", PK_MODE_GUILD);
PyModule_AddIntConstant(poModule, "PK_MODE_MAX_NUM", PK_MODE_MAX_NUM);
PyModule_AddIntConstant(poModule, "BLOCK_EXCHANGE", BLOCK_EXCHANGE);
PyModule_AddIntConstant(poModule, "BLOCK_PARTY", BLOCK_PARTY_INVITE);
PyModule_AddIntConstant(poModule, "BLOCK_GUILD", BLOCK_GUILD_INVITE);
PyModule_AddIntConstant(poModule, "BLOCK_WHISPER", BLOCK_WHISPER);
PyModule_AddIntConstant(poModule, "BLOCK_FRIEND", BLOCK_MESSENGER_INVITE);
PyModule_AddIntConstant(poModule, "BLOCK_PARTY_REQUEST", BLOCK_PARTY_REQUEST);
PyModule_AddIntConstant(poModule, "PARTY_EXP_NON_DISTRIBUTION", PARTY_EXP_DISTRIBUTION_NON_PARITY);
PyModule_AddIntConstant(poModule, "PARTY_EXP_DISTRIBUTION_PARITY", PARTY_EXP_DISTRIBUTION_PARITY);
PyModule_AddIntConstant(poModule, "EMOTION_CLAP", EMOTION_CLAP);
PyModule_AddIntConstant(poModule, "EMOTION_CHEERS_1", EMOTION_CHEERS_1);
PyModule_AddIntConstant(poModule, "EMOTION_CHEERS_2", EMOTION_CHEERS_2);
PyModule_AddIntConstant(poModule, "EMOTION_DANCE_1", EMOTION_DANCE_1);
PyModule_AddIntConstant(poModule, "EMOTION_DANCE_2", EMOTION_DANCE_2);
PyModule_AddIntConstant(poModule, "EMOTION_DANCE_3", EMOTION_DANCE_3);
PyModule_AddIntConstant(poModule, "EMOTION_DANCE_4", EMOTION_DANCE_4);
PyModule_AddIntConstant(poModule, "EMOTION_DANCE_5", EMOTION_DANCE_5);
PyModule_AddIntConstant(poModule, "EMOTION_DANCE_6", EMOTION_DANCE_6); // PSY 강남스타일
PyModule_AddIntConstant(poModule, "EMOTION_CONGRATULATION", EMOTION_CONGRATULATION);
PyModule_AddIntConstant(poModule, "EMOTION_FORGIVE", EMOTION_FORGIVE);
PyModule_AddIntConstant(poModule, "EMOTION_ANGRY", EMOTION_ANGRY);
PyModule_AddIntConstant(poModule, "EMOTION_ATTRACTIVE", EMOTION_ATTRACTIVE);
PyModule_AddIntConstant(poModule, "EMOTION_SAD", EMOTION_SAD);
PyModule_AddIntConstant(poModule, "EMOTION_SHY", EMOTION_SHY);
PyModule_AddIntConstant(poModule, "EMOTION_CHEERUP", EMOTION_CHEERUP);
PyModule_AddIntConstant(poModule, "EMOTION_BANTER", EMOTION_BANTER);
PyModule_AddIntConstant(poModule, "EMOTION_JOY", EMOTION_JOY);
PyModule_AddIntConstant(poModule, "EMOTION_KISS", EMOTION_KISS);
PyModule_AddIntConstant(poModule, "EMOTION_FRENCH_KISS", EMOTION_FRENCH_KISS);
PyModule_AddIntConstant(poModule, "EMOTION_SLAP", EMOTION_SLAP);
PyModule_AddIntConstant(poModule, "AUTO_POTION_TYPE_HP", CPythonPlayer::AUTO_POTION_TYPE_HP);
PyModule_AddIntConstant(poModule, "AUTO_POTION_TYPE_SP", CPythonPlayer::AUTO_POTION_TYPE_SP);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_PAGE_SIZE", c_DragonSoul_Inventory_Box_Size);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_PAGE_COUNT", DRAGON_SOUL_GRADE_MAX);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_SLOT_COUNT", c_DragonSoul_Inventory_Count);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_EQUIPMENT_SLOT_START", c_DragonSoul_Equip_Start);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_EQUIPMENT_PAGE_COUNT", DS_DECK_MAX_NUM);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_EQUIPMENT_FIRST_SIZE", c_DragonSoul_Equip_Slot_Max);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_REFINE_CLOSE", DS_SUB_HEADER_CLOSE);
PyModule_AddIntConstant(poModule, "DS_SUB_HEADER_DO_UPGRADE", DS_SUB_HEADER_DO_UPGRADE);
PyModule_AddIntConstant(poModule, "DS_SUB_HEADER_DO_IMPROVEMENT", DS_SUB_HEADER_DO_IMPROVEMENT);
PyModule_AddIntConstant(poModule, "DS_SUB_HEADER_DO_REFINE", DS_SUB_HEADER_DO_REFINE);
}
// 40250 UserInterface/PythonProfilerModule.cpp
void AddStubConstants_profiler(PyObject* poModule)
{