Show your private server maintenance notes inside the Metin2 client
This reviewed replacement displays a local locale/patchnotes.txt through a stock client window. Administrators can explain fixes, balance changes and player actions in their normal client patch release. It does not download updates, change game files, execute commands or contact a remote service.

What was corrected
The supplied integration replaces the shared MakeImageBox helper under a different name, uses a font-setting key as a translated label, and includes an incomplete native mouse-wheel function. Missing fallback files or malformed headers can abort loading; short lists scroll in the wrong direction and widget cleanup is incomplete.
M2City r1 replaces that rendering path with a 540x400 BoardWithTitleBar, sixteen reusable text rows and Previous/Next buttons. It therefore changes the original decorative scrolling design. No new native clipping/wheel methods, shared UI helper replacement, feature macro or custom UIScript are needed by this replacement. The four original decorative PNGs remain in the original archive only and are not used by the reviewed window.

The parser requires complete BEGIN/UPDATE/END sections with version, date and body. It bounds the file to 64 KiB, ten releases, 400 body lines and 800 displayed rows; malformed/incomplete releases are ignored and missing notes produce an empty-state message. It closes file handles, loads once per window, normalizes text to plain content and wraps decoded Unicode by measured font width before encoding it for the native renderer. Close/Escape hides the existing window; Destroy clears callbacks and owned references.

Installation
Use reviewed/uipatchnotes.py, the notes template and INTEGRATION.txt. Import the lowercase module name exactly, construct one PatchNoteWindow per live Interface/system-menu instance and bind your menu action with ui.__mem_func__. Use the existing stock middle-button textures and keep current shared UI/font code.
Place the notes in your selected locale pack, with locale/en/patchnotes.txt as fallback, newest release first. UTF-8 is the default; pass the actual legacy codec explicitly if your client and file use one. Replace the template with real changes before shipping. Show loads once, so subsequent patch notes are read on the next UI instance/login through your normal patcher workflow.
Close the window with HideAllWindows and conflicting screens. At logout/warp, Destroy and clear the Interface reference. Verify menu spacing, font/codec, native pack_open read(size)/close, BoardWithTitleBar, text measurement and button enable/disable methods against your branch. The detailed instructions describe all required lifecycle hooks.

Validation and source limits
All eighteen supplied text/source files were read. Isolated tests cover missing/malformed files, encoding and size limits, 250 body lines through sixteen pages, long Unicode rows, row caps, repeated opens, Escape and 100 cleanup cycles. These use fake widgets and do not establish actual font rendering, native engine compatibility or in-game behavior. Test supported resolutions and real login/logout in staging.
A related integration-support discussion is linked below; it is context, not proof of the exact archive's origin. No original author was independently established. Original archive/notices retained; the supplying owner confirmed redistribution, with no blanket open-source relicensing.
Related Metin2 patchnotes integration discussion

Editorial resource — M2City
Version: Owner-supplied legacy integration; M2City r1 (2026-11-04); exact fork unspecified
Rights: Owner explicitly confirmed public redistribution. Preserve original notices; no open-source relicensing.
Validation: All eighteen text/source files read. Replacement parser tested for byte/line/entry limits, malformed and incomplete sections, UTF-8/cp1254 and missing-file fallback; handles close. Fake widgets tested 250 lines across 16 pages, measured Unicode wrapping, 800-row cap, repeats, Escape and 100 teardown cycles. Original decorative PNGs unused. No actual client rendering, full native build or gameplay test.
Source: Owner-supplied archive, reviewed files and retained notices; exact upstream release not established
SHA-256: 41e288cd828ba0e72363d1b996512ca5b79e357d608f3d0388e91205ae5562e1