port: P3-d PythonTextTail + textTail module (1:1 40250)

Copy PythonTextTail.cpp/PythonTextTailModule.cpp verbatim, drop the pending
stand-in and the textTail module stub, register initTextTail() after
initChat() and call CPythonTextTail::Initialize() in Create as 40250 does.
Implement CScreen::ProjectPosition/UnprojectPosition (were stubs) with
D3DXVec3Project/Unproject, and ApplicationStringTable_GetString(DWORD) over
UserInterface.rc's English string table. port.login_flow projects the ground
item's name tail in an ALT frame and picks it back by screen position.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-24 01:10:41 +09:00
co-authored by Claude Opus 5.5
parent 72b19b677d
commit 070a27b2cb
19 changed files with 1874 additions and 211 deletions
@@ -19,7 +19,6 @@ void AddStubConstants_shop(PyObject* poModule);
void AddStubConstants_skill(PyObject* poModule);
void AddStubConstants_snd(PyObject* poModule);
void AddStubConstants_systemSetting(PyObject* poModule);
void AddStubConstants_textTail(PyObject* poModule);
void AddStubConstants_udp(PyObject* poModule);
namespace {
@@ -691,46 +690,6 @@ PyMethodDef methods_systemSetting[] = {
{ "SetShadowLevel", stub_systemSetting_SetShadowLevel, METH_VARARGS },
{ NULL, NULL }
};
// 40250 UserInterface/PythonTextTailModule.cpp: textTail export names.
PyObject* stub_textTail_Clear(PyObject*, PyObject*) { return stub_call_named("textTail.Clear", Py_BuildNone()); }
PyObject* stub_textTail_UpdateAllTextTail(PyObject*, PyObject*) { return stub_call_named("textTail.UpdateAllTextTail", Py_BuildNone()); }
PyObject* stub_textTail_UpdateShowingTextTail(PyObject*, PyObject*) { return stub_call_named("textTail.UpdateShowingTextTail", Py_BuildNone()); }
PyObject* stub_textTail_Render(PyObject*, PyObject*) { return stub_call_named("textTail.Render", Py_BuildNone()); }
PyObject* stub_textTail_ShowCharacterTextTail(PyObject*, PyObject*) { return stub_call_named("textTail.ShowCharacterTextTail", Py_BuildNone()); }
PyObject* stub_textTail_ShowItemTextTail(PyObject*, PyObject*) { return stub_call_named("textTail.ShowItemTextTail", Py_BuildNone()); }
PyObject* stub_textTail_GetPosition(PyObject*, PyObject*) { return stub_call_named("textTail.GetPosition", Py_BuildValue("fff", 0.0, 0.0, 0.0)); }
PyObject* stub_textTail_IsChat(PyObject*, PyObject*) { return stub_call_named("textTail.IsChat", Py_BuildValue("i", 0)); }
PyObject* stub_textTail_ArrangeTextTail(PyObject*, PyObject*) { return stub_call_named("textTail.ArrangeTextTail", Py_BuildNone()); }
PyObject* stub_textTail_HideAllTextTail(PyObject*, PyObject*) { return stub_call_named("textTail.HideAllTextTail", Py_BuildNone()); }
PyObject* stub_textTail_ShowAllTextTail(PyObject*, PyObject*) { return stub_call_named("textTail.ShowAllTextTail", Py_BuildNone()); }
PyObject* stub_textTail_Pick(PyObject*, PyObject*) { return stub_call_named("textTail.Pick", Py_BuildValue("i", 0)); }
PyObject* stub_textTail_SelectItemName(PyObject*, PyObject*) { return stub_call_named("textTail.SelectItemName", Py_BuildNone()); }
PyObject* stub_textTail_EnablePKTitle(PyObject*, PyObject*) { return stub_call_named("textTail.EnablePKTitle", Py_BuildNone()); }
PyObject* stub_textTail_RegisterCharacterTextTail(PyObject*, PyObject*) { return stub_call_named("textTail.RegisterCharacterTextTail", Py_BuildNone()); }
PyObject* stub_textTail_RegisterChatTail(PyObject*, PyObject*) { return stub_call_named("textTail.RegisterChatTail", Py_BuildNone()); }
PyObject* stub_textTail_RegisterInfoTail(PyObject*, PyObject*) { return stub_call_named("textTail.RegisterInfoTail", Py_BuildNone()); }
PyObject* stub_textTail_AttachTitle(PyObject*, PyObject*) { return stub_call_named("textTail.AttachTitle", Py_BuildNone()); }
PyMethodDef methods_textTail[] = {
{ "Clear", stub_textTail_Clear, METH_VARARGS },
{ "UpdateAllTextTail", stub_textTail_UpdateAllTextTail, METH_VARARGS },
{ "UpdateShowingTextTail", stub_textTail_UpdateShowingTextTail, METH_VARARGS },
{ "Render", stub_textTail_Render, METH_VARARGS },
{ "ShowCharacterTextTail", stub_textTail_ShowCharacterTextTail, METH_VARARGS },
{ "ShowItemTextTail", stub_textTail_ShowItemTextTail, METH_VARARGS },
{ "GetPosition", stub_textTail_GetPosition, METH_VARARGS },
{ "IsChat", stub_textTail_IsChat, METH_VARARGS },
{ "ArrangeTextTail", stub_textTail_ArrangeTextTail, METH_VARARGS },
{ "HideAllTextTail", stub_textTail_HideAllTextTail, METH_VARARGS },
{ "ShowAllTextTail", stub_textTail_ShowAllTextTail, METH_VARARGS },
{ "Pick", stub_textTail_Pick, METH_VARARGS },
{ "SelectItemName", stub_textTail_SelectItemName, METH_VARARGS },
{ "EnablePKTitle", stub_textTail_EnablePKTitle, METH_VARARGS },
{ "RegisterCharacterTextTail", stub_textTail_RegisterCharacterTextTail, METH_VARARGS },
{ "RegisterChatTail", stub_textTail_RegisterChatTail, METH_VARARGS },
{ "RegisterInfoTail", stub_textTail_RegisterInfoTail, METH_VARARGS },
{ "AttachTitle", stub_textTail_AttachTitle, METH_VARARGS },
{ NULL, NULL }
};
// 40250 UserInterface/PythonNetworkDatagramModule.cpp: udp export names.
PyObject* stub_udp_Enable(PyObject*, PyObject*) { return stub_call_named("udp.Enable", Py_BuildNone()); }
PyObject* stub_udp_Disable(PyObject*, PyObject*) { return stub_call_named("udp.Disable", Py_BuildNone()); }
@@ -812,11 +771,6 @@ void init_2v0_gameplay_stubs() {
PyModule_AddIntConstant(module, "__port_stub__", 1);
AddStubConstants_systemSetting(module);
}
{
PyObject* module = Py_InitModule("textTail", methods_textTail);
PyModule_AddIntConstant(module, "__port_stub__", 1);
AddStubConstants_textTail(module);
}
{
PyObject* module = Py_InitModule("udp", methods_udp);
PyModule_AddIntConstant(module, "__port_stub__", 1);