fix: 装备属性面板避让逻辑 + 多项功能更新

- item_tooltip_view.gd: 新增 avoid_rect 属性,tooltip 与装备窗口重叠时自动推到左侧
- inventory_ui.gd: 悬停装备时传入窗口矩形作为避让区域
- 包含其他累积的功能开发和测试文件
This commit is contained in:
shen
2026-09-21 16:38:59 -07:00
parent 1522a8a1a1
commit c93894313a
5498 changed files with 4558004 additions and 1442 deletions
+15 -13
View File
@@ -31,11 +31,11 @@ int main() {
// --- struct sizes (redundant with static_assert, but explicit) ---
CHECK(sizeof(Handshake) == 13, "sizeof Handshake");
CHECK(sizeof(CGText) == 1, "sizeof CG_TEXT base");
CHECK(sizeof(SimplePlayer) == 103, "sizeof SimplePlayer");
CHECK(sizeof(GCMainCharacter) == 86, "sizeof GCMainCharacter");
CHECK(sizeof(GCMainCharacter3BGM) == 111 && sizeof(GCMainCharacter4BGM) == 115,
CHECK(sizeof(SimplePlayer) == 63, "sizeof SimplePlayer");
CHECK(sizeof(GCMainCharacter) == 46, "sizeof GCMainCharacter");
CHECK(sizeof(GCMainCharacter3BGM) == 71 && sizeof(GCMainCharacter4BGM) == 75,
"sizeof main-character BGM variants");
CHECK(sizeof(GCCharacterAdd2) == 120 && sizeof(GCCharacterUpdate) == 35,
CHECK(sizeof(GCCharacterAdd2) == 80 && sizeof(GCCharacterUpdate) == 35,
"sizeof character add/update variants");
CHECK(sizeof(GCFishing) == 7, "sizeof GC_FISHING");
CHECK(sizeof(GCWarpClassic) == 15, "sizeof classic GC_WARP");
@@ -43,7 +43,7 @@ int main() {
"sizeof auth success packets");
CHECK(sizeof(GCPasspodFailed) == 130 && sizeof(GCXTrapRequest) == 129 && sizeof(GCHSRequest) == 403,
"sizeof optional security packets");
CHECK(sizeof(GCLoginSuccess) == 489, "sizeof GCLoginSuccess (NEWSLOT, 4 players)");
CHECK(sizeof(GCLoginSuccess) == 329, "sizeof GCLoginSuccess (NEWSLOT, 4 players)");
CHECK(sizeof(GCPoints) == 1 + 255 * 4, "sizeof GCPoints");
CHECK(sizeof(GCPointChange) == 17, "sizeof GCPointChange (int header quirk)");
CHECK(sizeof(CGMove) == 16, "sizeof CGMove");
@@ -55,16 +55,16 @@ int main() {
// --- size-table lookup (body size, no trailing seq byte) ---
CHECK(packet_size_gc(HDR_GC_PHASE) == 2, "gc size PHASE");
CHECK(packet_size_gc(HDR_GC_MAIN_CHARACTER) == 86, "gc size MAIN_CHARACTER");
CHECK(packet_size_gc(HDR_GC_MAIN_CHARACTER) == 46, "gc size MAIN_CHARACTER");
CHECK(packet_size_gc(HDR_GC_WARP) == sizeof(GCWarpClassic), "gc size WARP");
CHECK(packet_size_gc(HDR_GC_MAIN_CHARACTER3_BGM) == 111 &&
packet_size_gc(HDR_GC_MAIN_CHARACTER4_BGM_VOL) == 115, "gc size MAIN_CHARACTER BGM");
CHECK(packet_size_gc(HDR_GC_CHARACTER_ADD2) == 120 &&
CHECK(packet_size_gc(HDR_GC_MAIN_CHARACTER3_BGM) == 71 &&
packet_size_gc(HDR_GC_MAIN_CHARACTER4_BGM_VOL) == 75, "gc size MAIN_CHARACTER BGM");
CHECK(packet_size_gc(HDR_GC_CHARACTER_ADD2) == 80 &&
packet_size_gc(HDR_GC_CHARACTER_UPDATE2) == 35, "gc size character variants");
CHECK(packet_size_gc(HDR_GC_FISHING) == 7, "gc size FISHING");
CHECK(packet_size_gc(HDR_GC_AUTH_SUCCESS) == 6 &&
packet_size_gc(HDR_GC_XTRAP_CS1_REQUEST) == 129, "gc size auth/security");
CHECK(packet_size_gc(HDR_GC_LOGIN_SUCCESS_NEWSLOT) == 489, "gc size LOGIN_SUCCESS_NEWSLOT");
CHECK(packet_size_gc(HDR_GC_LOGIN_SUCCESS_NEWSLOT) == 329, "gc size LOGIN_SUCCESS_NEWSLOT");
CHECK(packet_size_gc(HDR_GC_CHARACTER_POINTS) == 1021, "gc size CHARACTER_POINTS");
CHECK(packet_size_gc(HDR_GC_EXCHANGE) == 47, "gc size EXCHANGE");
CHECK(packet_size_gc(HDR_GC_SAFEBOX_MONEY_CHANGE) == 5, "gc size SAFEBOX_MONEY_CHANGE");
@@ -97,9 +97,11 @@ int main() {
CHECK(!is_dynamic_gc(HDR_GC_MALL_SET), "GC_MALL_SET NOT dynamic");
CHECK(!is_dynamic_gc(HDR_GC_SAFEBOX_SET), "GC_SAFEBOX_SET NOT dynamic");
CHECK(!is_dynamic_gc(HDR_GC_PARTY_ADD), "GC_PARTY_ADD NOT dynamic");
// client map registers GC_WHISPER STATIC, but its wSize sits where
// TDynamicSizePacketHeader.size does — we frame it via the dynamic path.
CHECK(is_dynamic_gc(HDR_GC_WHISPER), "GC_WHISPER framed as dynamic (wSize prefix)");
// ClientVS22 registers GC_WHISPER as a static fixed head; RecvWhisperPacket
// consumes the text tail separately using wSize.
CHECK(!is_dynamic_gc(HDR_GC_WHISPER), "GC_WHISPER uses static fixed head");
CHECK(packet_size_gc(HDR_GC_WHISPER) == sizeof(GCWhisperHead),
"GC_WHISPER size is the fixed header");
CHECK(is_dynamic_cg(HDR_CG_CHAT) && is_dynamic_cg(HDR_CG_WHISPER), "CG chat/whisper dynamic");
CHECK(!is_dynamic_cg(HDR_CG_SHOP), "CG_SHOP NOT dynamic");