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
@@ -1,75 +0,0 @@
// Stand-in for the 40250 logic unit UserInterface/PythonTextTail.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 "UserInterface/StdAfx.h"
#include "UserInterface/PythonTextTail.h"
#include "../../PlatformStub.h"
CPythonTextTail::CPythonTextTail()
{
MT_PLATFORM_STUB();
}
CPythonTextTail::~CPythonTextTail()
{
MT_PLATFORM_STUB();
}
auto CPythonTextTail::RegisterChatTail(DWORD, const char *) -> void
{
MT_PLATFORM_STUB();
}
auto CPythonTextTail::RegisterCharacterTextTail(DWORD, DWORD, const D3DXCOLOR &, float) -> void
{
MT_PLATFORM_STUB();
}
auto CPythonTextTail::SetCharacterTextTailColor(DWORD, const D3DXCOLOR &) -> void
{
MT_PLATFORM_STUB();
}
auto CPythonTextTail::DeleteCharacterTextTail(DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CPythonTextTail::AttachTitle(DWORD, const char *, const D3DXCOLOR &) -> void
{
MT_PLATFORM_STUB();
}
auto CPythonTextTail::DetachTitle(DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CPythonTextTail::AttachLevel(DWORD, const char *, const D3DXCOLOR &) -> void
{
MT_PLATFORM_STUB();
}
auto CPythonTextTail::RegisterItemTextTail(DWORD, const char *, CGraphicObjectInstance *) -> void
{
MT_PLATFORM_STUB();
}
auto CPythonTextTail::DeleteItemTextTail(DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CPythonTextTail::SetItemTextTailOwner(DWORD, const char *) -> void
{
MT_PLATFORM_STUB();
}
// 40250 returns -1 when no item text tail is under the mouse; RegisterItemTextTail is still a stub, so
// m_ItemTextTailMap stays empty and that is always the answer (0 would pick ground item VID 0).
auto CPythonTextTail::Pick(int, int) -> int
{
MT_PLATFORM_STUB();
return -1;
}