port 4-a: text input through CPythonIME (login typed, in-game chat)
- UserInterface/PythonIME(+Module) ported verbatim; ime module stubs removed, initime() after initdbg() - EterLib/IME.cpp in platform/: 40250 buffer/WMChar bodies, IMM/TSF processors no-op; committed multi-byte text via PythonBoot::UIChar emulating GCS_RESULTSTR - GameApplicationAdapter RunIME* -> CWindowManager; Godot keys -> ui_ime_key/ui_char - port.login_flow/login_live type the account through the IME; chat CG_CHAT round-trip on the fake server - python_game_render_test logs in with Godot key events Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
1bda4390d6
commit
6ea0fa9889
@@ -655,6 +655,22 @@ bool FakeLoginServer::ServeGame(Connection& c, int index)
|
||||
if (!ok)
|
||||
return Fail(name + ": send GC_EXCHANGE");
|
||||
}
|
||||
// CInputMain::Chat (input_main.cpp): the line comes back to the speaker (PacketAround includes them)
|
||||
// as a CHAT_TYPE_TALKING GC_CHAT "<name> : <text>" carrying their vid and empire.
|
||||
if (header == HDR_CG_CHAT)
|
||||
{
|
||||
CGChatHead head;
|
||||
std::memcpy(&head, packet, sizeof(head));
|
||||
const size_t text_len = size > sizeof(head) ? size - sizeof(head) : 0;
|
||||
const std::string text(reinterpret_cast<const char*>(packet + sizeof(head)),
|
||||
strnlen(reinterpret_cast<const char*>(packet + sizeof(head)), text_len));
|
||||
Event(name + ":chat " + std::to_string(head.type) + " " + text);
|
||||
const std::string line = std::string(kCharacterName) + " : " + text;
|
||||
GCChatHead chat = {HDR_GC_CHAT, static_cast<std::uint16_t>(sizeof(GCChatHead) + line.size() + 1),
|
||||
0 /* CHAT_TYPE_TALKING */, kMainVID, 1};
|
||||
if (!c.Send(chat) || !c.Send(line.c_str(), line.size() + 1))
|
||||
return Fail(name + ": send GC_CHAT");
|
||||
}
|
||||
if (header == HDR_CG_MOVE)
|
||||
{
|
||||
CGMove move;
|
||||
|
||||
Reference in New Issue
Block a user