Commit Graph
283 Commits
Author SHA1 Message Date
shenleiandClaude Opus 5.5 5dcac9cbd4 Add VIP cards and the VIP panel (mt_vip)
Cards 38001 (7 days) and 38002 (30 days) extend all seven original premium
services of the account; the server side is metin2-server port_premium.h
(docs/FEATURE-VIP.md).

- mt_vip: /mt_vip 1 status, VIP button by the minimap, remaining time per
  service, chat line on card use.
- tools/server/vip-card: 40250 ships both cards with size 0 (two share a
  cell, neither moves); give them one cell, stacking, a log and no NPC sale,
  and name them on the server.
- locale_proto_patch: optional item shape table (size, flags, anti flags)
  so the client proto matches; data/zh_40250/item_shapes_server.tsv.
- Item mall (9010): 7 days 5,000,000, 30 days 18,000,000 gold.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 02:13:15 +09:00
shenleiandClaude Opus 5.5 b14fb2ffe9 Record the batch chest production deploy
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 23:47:50 +09:00
shenleiandClaude Opus 5.5 b8363693f1 Add batch gift box opening window (mt_chest)
Ctrl + right click on an ITEM_GIFTBOX opens a count window (1/10/50/all,
max 200) that sends /mt_chest and sums the MTCH1 gains into chat. Without
Ctrl or against a server without the command the original use runs.
Exports item.ITEM_TYPE_GIFTBOX. Verified live on the 203 channel5 core.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 23:31:03 +09:00
shenleiandClaude Opus 5.5 10f8c9760e Record the attribute lock production deploy
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 23:11:31 +09:00
shenleiandClaude Opus 5.5 a22c064587 Add attribute lock buttons to the switchbot window
Five per-slot toggles next to start/stop, shown only when the server
sends the MTSB1 lock line; locked attributes are marked in the current
attribute line. Server side: metin2-server docs/FEATURE-ATTR-LOCK.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 23:06:00 +09:00
shenleiandClaude Opus 5.5 ffe097ec57 Add world boss window (AVA2 uitrack world-boss tab, read-only)
mt_boss lists the server's timed boss regens from the MTF1 "bosses"
query: alive/max, countdown, map-local position and period, paged by 8,
with per-boss spawn reminders that only fire on a fresh alive snapshot.
Teleport is left out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 22:36:04 +09:00
shenleiandClaude Opus 5.5 13a462b6fc Add client-only channel switch (AVA2 ENABLE_CHANNEL_CHANGE)
mt_channel lists the serverInfo channels of the current server and switches by
running the original paths: /logout, then the login window connects to the
chosen channel with the account kept by MainStream, and the original
stream.isAutoSelect starts the same character. No server change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 21:37:02 +09:00
shenleiandClaude Opus 5.5 aeb67f3c9c Hide near trees drawn as PC blockers when trees are switched off
A tree close to the camera is drawn by RenderPCBlocker, not RenderTree,
so background.SetVisiblePart(PART_TREE, 0) left it on screen. Skip tree
blockers while PART_TREE is hidden. Live screenshots on the 203 test
core confirm the tree, the GM mark and the weapon glow now disappear.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 21:24:53 +09:00
shenleiandClaude Opus 5.5 e546f91e03 Add AVA2-style display options (effect level, trees, clouds)
Client-only port of ENABLE_GRAPHIC_ON_OFF / HIDE_OBJECTS: five effect
levels toggle attached actor effects via Active/Deactive, tree and cloud
parts use background.SetVisiblePart, plus shortcuts for the original
name and damage options. mt_display window, mt_display.cfg, port.display
test, docs/AVA2-DISPLAY.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 21:11:25 +09:00
shenleiandClaude Opus 5.5 e22d7ba6fd Add batch pickup on the pickup key for the server mt_pickup command
Embedded module mt_pickup wraps GameWindow.PickUpItem (Z / `): with batch
pickup on it sends /mt_pickup 1 MASK (0.5 s gap, one in flight, presses
swallowed while waiting); after 3 s without a reply it notes once in chat
and falls back to the original single pickup. Settings window (on/off and
8 categories, persisted in mt_pickup.cfg) behind a "拾取" button under the
switchbot entry by the minimap.

Live tested against 203 (channel-5 test core, port 13040) with the macOS
native client.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 20:45:37 +09:00
shenleiandClaude Opus 5.5 514eae6745 Record live switchbot busy/no_scroll/rejected results
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 19:49:21 +09:00
shenleiandClaude Opus 5.5 6b1d21a2c5 Add switchbot (自动洗练) window for the server mt_switchbot command
Embedded module mt_switchbot: a paced request queue (0.3 s gap, one in
flight, 4 s timeout -> unsupported), atomic attrs lists from the server,
two alternatives of up to 5 targets, 10-1000 roll limits, live state and
stop reasons. Entry button under the wiki button by the minimap. The
selection follows the server-reported cell when the item moves mid-run
and falls back to the same vnum when it moves while idle.

Live tested against 203 (channel-5 test core, port 13040) with the macOS
native client.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 19:45:14 +09:00
shenandshen 4e2d39b612 Add feature queries, dungeon information and event calendar UI 2026-10-15 02:28:01 -07:00
shenandshen 9d9993b007 Add searchable wiki catalogue and biology material navigation 2026-10-15 00:48:50 -07:00
shenandshen 6472d17306 Add mobile touch UI and AVA2 biology system with server tools 2026-10-14 19:12:38 -07:00
shenandshen e7f2202a94 Improve auto-hunt navigation, recovery and mounted skill casting 2026-10-01 07:46:44 -07:00
shenandshen 586bae51e4 Set every mount shop item price to one gold 2026-10-01 01:09:29 -07:00
shenandshen f2848af3ac Fix null character access in server bonus status query 2026-09-30 23:10:22 -07:00
shenandshen eb5833747a Expand auto-hunt pursuit ranges and show server bonus effects 2026-09-30 23:02:04 -07:00
shenandshen 922954dd97 Optimize fixed-function Vulkan shaders for Adreno 512 and recover Android surfaces 2026-09-30 21:48:07 -07:00
shenandshen 1e4762ccf4 Fix Android 10 resource sync and fullscreen; record Global ROM comparison 2026-09-30 19:35:52 -07:00
shenandshen b8b0a84149 Add render isolation probes and profile Mi 8 Lite terrain bottleneck 2026-09-30 18:10:12 -07:00
shenandshen d45c5c6cf5 Fix Android directory CRC login crash and record Mi 8 Lite device tests 2026-09-30 17:54:11 -07:00
shenandshen 059ceadec2 Expand movement ring to all 65 registered maps with paged categories 2026-09-30 17:33:13 -07:00
shenandshen cf9ed052b1 Start packaged macOS client at manual server login 2026-09-30 17:14:30 -07:00
shenandshen 8a6aeaedf0 Add free cloak-style auto-hunt pull for 3 10 or 20 monster groups 2026-09-30 17:07:24 -07:00
shenandshen d1f8d3dddd Improve macOS Retina UI clarity and bundle HD assets 2026-09-30 16:13:31 -07:00
shenandshen 905f23f135 Fix model track-group movement and RGB destination-alpha blending 2026-09-30 08:13:29 -07:00
shenleiandClaude Opus 5.5 f345bd5d3b Ring 70058: usable from level 1, tooltip says unlimited and no cooldown
The item_proto limit (LEVEL 30) kept new characters from using the warp
ring. ring-warp/install.sh now clears it in share/conf/item_proto.txt and
the player.item_proto mirror. The client proto gets the same limit through
a new item_limits_server.tsv fed to locale_proto_patch, and the zh
itemdesc overlay replaces the "50 uses" text.

Verified on 203: a fresh level-1 character opened the warp menu four times
in a row (one real warp in between), ring still in the bag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 20:59:21 +09:00
shenleiandClaude Opus 5.5 01cc252a1d Host: 2x UI textures from hd_ui.pak (AI-upscaled 40250 UI art)
The phone magnifies the 600-high 40250 UI about 1.8x, so the 1x window art
and icons look soft next to the oversampled text. scripts/build_hd_ui.py
upscales every UI image the zh client loads (d:/ymir work/ui/, icon/,
locale/zh/) with realesrgan-x4plus, reduces it to 2x and back-projects the
residual so the board grain the network denoises away comes back; the host
uploads a texture found in hd_ui.pak in place of the pack file. Layout,
sizes and UVs stay the engine's 1x ones. MT_HD_UI=0 disables it; the pak
(135 MB, Ymir art) is built into the client dir and synced to the phone,
never committed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 20:04:46 +09:00
shenleiandClaude Opus 5.5 c5b709d38d Merge branch 'tools/android-deploy'
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 18:52:01 +09:00
shenleiandClaude Opus 5.5 8182445f8b Merge branch 'feat/app-icon'
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 18:52:00 +09:00
shenleiandClaude Opus 5.5 8ec8f1a445 UserInterface: poll the network stream on the 60 Hz update clock
40250 runs CPythonApplication::Process every 16/17 ms and only skips the
render when late, so GamePhase gets its three-packets-a-poll budget 60
times a second. The host polled once per rendered frame: at 30 fps idle
(or a slow phone) mob move packets queued behind character add/del
bursts for up to a second and mobs stopped, then jumped. Poll once per
elapsed 60 Hz tick. Real-server A/B: move push gap p50 138-178 -> 70-92
ms, p90 580-785 -> 358-403 ms.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 18:36:49 +09:00
shenleiandClaude Opus 5.5 3aa4c482e9 tools/server: shop-item-time patch — NPC shop items carry a new item's time sockets
40250 game zeroes alSockets for NPC (shop.cpp) and extended (shopEx.cpp) shop items, so
uitooltip shows 'remaining 0 min' for mounts and item-mall time items. MT_GetNewItemSockets
fills them with ITEM_MANAGER::CreateItem's rules (UNIQUE remain time, auto potions,
LIMIT_REAL_TIME, LIMIT_TIMER_BASED_ON_WEAR). Deployed on 203; mount shop 20368 verified.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 17:55:36 +09:00
shenleiandClaude Opus 5.5 f9be09d2c2 fix(touch): show the joystick and skill buttons only in the game phase
The controls keyed off CPythonBackground's warp map name, which the
loading window sets before the game window exists, so the loading screen
already showed them. Also require CPythonNetworkStream's phase to be
"Game" (PORT_IsGamePhase, exposed as PythonBoot::InGamePhase).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 17:33:46 +09:00
shenleiandClaude Opus 5.5 5c8d583b31 fix(touch): raise the soft keyboard only for a tap on the visible focused EditLine
A chat line keeps the IME focus under a hidden board (interfacemodule
__HideWindows for an NPC dialog, the focus handed back by
UnlockWindow/DeactivateWindow), and IsPointInsideFocusedWindow only
checked its own show flag and rect, so taps on the NPC dialog or the
minimap buttons opened the keyboard. Require the whole parent chain to
render and the picked window to be the focused one or its child.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 17:00:39 +09:00
shenleiandClaude Opus 5.5 78d14776b8 fix(platform): decode GDI ANSI text with the font charset's code page
TextOutA / GetTextExtentPoint32A in the Win32 GDI shim always decoded with CP_ACP (1252), so the
server notices drawn by uiTip.TipBoard / BigBoard (CTextBar, a GB2312_CHARSET font in the 936
locale) showed GBK bytes as Latin-1 mojibake. Windows GDI decodes ANSI calls with the code page of
the selected font's charset; the shim now keeps lfCharSet on the font and does the same.
port.text_bar checks TextOutA of GBK bytes against TextOutW of the Unicode text, and the extent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 16:42:44 +09:00
shenleiandClaude Opus 5.5 cd9e5b259d android: build.sh installs and syncs the game files when a phone is attached
After building the APK, android/build.sh now picks the attached device (ANDROID_SERIAL for several),
installs the APK (reinstalling on a signature mismatch), syncs the zh client into files/Client and, with
--launch, wakes the phone and starts the app. Without a device it only builds.

push-client.sh is now incremental (android/sync_client.py): the device keeps files/Client/.mt_sync
(size, mtime, path of what the last sync wrote), so later syncs send only new and changed files as one
tar streamed through `adb shell -T run-as` (no copy in /data/local/tmp) and delete the ones gone
locally. Only game resources are synced; settings and logs the app writes there are kept. --locale zh
rebuilds build/zh-locale/Client first when its inputs changed. android/adb_env.sh picks adb and falls
back to server port 5038 when :5037 cannot bind.

Verified against a fake adb device: first sync (1.4 GB, byte-identical), no-op resync, changed files,
deletions, locale switch, --full, the install/launch path and the no-device path.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 16:36:21 +09:00
shenleiandClaude Opus 5.5 a60ed6b03f Add the Metin2 app icon for Android, macOS and iOS
branding/icon/icon.svg (a cracked Metin stone with glowing runes, inside a studded gold ring, in front of
a blood moon over ink mountains) is the single source; build_icons.sh renders it with headless Chrome and
writes the committed outputs: Android legacy + adaptive mipmaps (wired into the manifest), the macOS
AppIcon.icns and the iOS AppIcon.appiconset. scripts/package_mac_app.sh wraps mt_native_render into a
local Metin2.app using that icon.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 16:23:42 +09:00
shenleiandClaude Opus 5.5 58a3d01027 port: ScriptLib Resource.cpp verbatim 40250; PythonUtils mapped (already verbatim)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 16:10:32 +09:00
shenleiandClaude Opus 5.5 f9cd63713f docs: PORT-PLAN numbers after the platform TODO sweep
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 15:08:26 +09:00
shenleiandClaude Opus 5.5 b497fce393 port: UserInterface.cpp entry unit — ApplicationSetErrorString/StringTable_Initialize verbatim, Main ADAPTED to PythonBoot, Win32 entry N_A
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 15:08:00 +09:00
shenleiandClaude Opus 5.5 fd4d9a39df port: GrpDetector verbatim 40250 over a host IDirect3D8 (Direct3DCreate8); GrpDevice::Create verbatim
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 15:02:12 +09:00
shenleiandClaude Opus 5.5 65c43a84cd port: GrpDevice verbatim 40250 (Create over the recording device, declaration vertex shaders -> stream-0 FVF)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 14:50:21 +09:00
shenleiandClaude Opus 5.5 b5d413afa6 port: GrpScreen verbatim 40250 (2d draws via UIRender, D3D8 shim device-lost/Present/ID3DXMesh)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 14:40:57 +09:00
shenleiandClaude Opus 5.5 d73f5ea4bd port: SkyBox verbatim 40250 (native-terrain gate, qualified pure-virtual Destroy)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 14:31:07 +09:00
shenleiandClaude Opus 5.5 cfae658b6a audit: GrpTextInstance port-map (verbatim, Render draws via UI commands)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 14:21:57 +09:00
shenleiandClaude Opus 5.5 6f32387567 audit: GrpFontTexture port-map (40250 bodies, HiDPI oversample adaptations)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 14:21:37 +09:00
shenleiandClaude Opus 5.5 65777331f7 port: GrpImageInstance/GrpExpandedImageInstance verbatim; fix SCREEN blend factor
Both units are the 40250 bodies; only the PDT-stream draw becomes
UIRenderAddImage (with the rendering mode). SCREEN/COLOR_DODGE were packed as
0x28 (INVDESTALPHA+ONE); 40250 uses INVDESTCOLOR+ONE (0x2A). OnIsType calls the
base OnIsType instead of 40250's recursing IsType. port.grp_resource covers the
quads, UVs, colour and blend mode.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 14:21:13 +09:00
shenleiandClaude Opus 5.5 010e99f070 port: Grp texture/image/buffer units toward 40250 (+ port.grp_resource)
GrpImage/GrpSubImage verbatim; GrpImageTexture DDS path through CDXTCImage
header + low-texture-memory mip bias, CreateDeviceObjects/CreateFromDiskFile
verbatim; GrpTexture::SetTextureStage via STATEMANAGER. Port-map entries for
GrpTexture/Image/SubImage/ImageTexture/IndexBuffer/VertexBuffer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 14:15:45 +09:00