Browse and join every public room in Big Walk with one click. Burst multi-round search, modded-room tagging with 'modded only' filter, 'my language only' filter, live player counts, 15-language UI, config hot-reload. Stutter-free searching.
Rare-script room names now render (Korean, Thai, Indic, Tibetan, Mongolian): five Windows system fonts — Malgun Gothic, Tahoma, Nirmala UI, Microsoft Himalaya, Mongolian Baiti — are added as dynamic font candidates, and the mod pre-bakes the characters that actually appear in scanned room names into the matching font. The missing-glyph boxes for these scripts are gone.
Precise missing-glyph diagnostic: once per list build, the mod reports any character no loaded font can render (codepoint + character + sample room name) in a single log line, so any remaining box can be identified and fixed in one shot.
Smoother room-list scrolling:
Room-name glyph pre-baking now starts during the scan (as results merge into the cache) instead of after the list appears, so scrolling into rare-script regions never triggers on-the-fly glyph baking or atlas expansion.
TMP's default fallback font (LiberationSans) and the dynamic-font fallback rendering path are pre-warmed at startup with a persistent hidden probe, eliminating the one-time multi-second stall on the first render of a character that is missing from every font.
Conservative scan behavior: the base glyph preload pauses during searches and throttles while the panel is open, so search completion time stays fast and steady (no per-frame preload competing with result merging).
1.4.6
Main menu no longer stutters for ~2 s at startup: dynamic font creation now starts on the very first frame (while the game is still loading) instead of when the main menu appears, so the heaviest candidate (19 MB msyh.ttc) parses before the menu is interactive; transient TMP-not-ready failures retry with a fast exponential backoff (0.5/1/2/3 s); while the menu is interactive the glyph preload throttles to a 2 ms budget so hover tooltips respond instantly; font candidates are created lightest-first.
Room list is now viewport-virtualized — the definitive fix for list stutter:
Only ~15 card slots ever exist (a recycled pool) instead of up to 6,000 cards / 18,000 text objects. The list appears instantly when the search finishes (no blank gap, no progressive fill), and scrolling stays smooth at any list size because only the visible window is materialized.
Scroll position is preserved across filter / language / refresh rebuilds; the scrollbar behaves exactly as before.
The style is pixel-identical to previous versions: 68-high full-width cards, three lines at 18/14/13, same paddings, colors, and 5-px spacing.
Runtime glyph baking eliminated: card-text rendering no longer triggers TMP runtime glyph baking (atlas expansion + 16.7 MB texture uploads) that previously caused multi-second single-frame freezes. After every scan the mod pre-bakes the characters of the full scanned room set (not just the current filter view) into the dynamic fonts, so filter toggles, search, and scrolling never reveal un-baked characters.
Astral-plane characters now render (e.g. CJK Extension B rare characters above U+10000): a SimSun-ExtB (simsunb.ttf) font candidate is added for codepoints beyond the basic multilingual plane; emoji and symbols were already covered.
Precise missing-glyph diagnostic: once per list build, the mod reports every character that no loaded font can render (codepoint + character + sample room name) in a single log line — so any remaining boxes can be identified and fixed in one shot.
Log hygiene: the base-preload per-font "partial glyph add failed" spam is gone (a single session summary instead); success-state logs (preload complete, zero missing glyphs) are demoted to debug; the missing-glyph diagnostic only runs after the base preload has finished, so it no longer false-reports characters that are about to be pre-baked.
Robustness from a full review of the 1.4.5-era code:
Room pre-bake now uses its own buffer (it previously shared — and could corrupt — the in-flight base-preload chunk); its chunk size was adjusted so every frame stays inside the time budget even with the full-set pre-bake.
Diagnostic gating, null guards, allocation cleanups, and lifecycle fixes across the virtualized list and pre-bake paths.
Comments corrected to match the current implementation.
1.4.5
"My language only" filter no longer mixes Japanese rooms into the Chinese list:
Room-level multi-signal classification: a room counts as non-Chinese when its world or host name shows Japanese traits — 2+ kana, 1+ katakana, Japanese-only marks (々 〆), Japanese-only kanji (歩 駅 広 桜…), or Hangul — and those traits take priority over Chinese traits. Simplified-Chinese core characters (2+) are a strong Chinese signal that Japanese text never contains, so weeb-style Chinese names like "阿酱の房间" and "这些房间だよ" stay in the Chinese list.
Single-kana names with no simplified characters (e.g. "東京の夜") are now correctly excluded from Chinese.
The Japanese filter gets the symmetric fix: Chinese decorative names with simplified characters no longer appear in it (zero false positives, since Japanese text never contains simplified characters).
Pure shared-kanji Japanese names (e.g. 北海道) remain indistinguishable at the character-set level — a documented residual limitation of unified CJK encoding.
Search-completion stutter eliminated: after a scan, cards are created over multiple frames (<=200/frame) instead of all at once — the multi-second main-thread freeze observed on huge room lists (2.3 s in logs) is gone; the list appears progressively while the status bar shows the final count immediately.
Targeted modded-room search can no longer mislabel rooms: results are now verified against the recorded bwpl_open tag (HasTag) instead of assuming every result is a modded room — if the native filter parameter ever fails silently, unmodded rooms can no longer be falsely tagged; SetParameter failures are now logged.
Robustness fixes from a deep review pass:
Dynamic font creation can no longer spin forever on a permanently-failing candidate: a candidate is skipped after 10 consecutive transient failures, and the completion logic (family-name fallback / terminal states / preload queue + fallback registration) is extracted so it stays reachable from every path.
A font that throws during glyph preload is now destroyed after removal (no orphan ~16-32 MB assets) and removed from the global fallback list with logging; the preload index no longer skips the last font after a removal mid-chunk.
fallbackFontAssets == null no longer spams a warning every 3 s (gives up after 10 tries; the game never writes this list back).
Scanning no longer clears the room cache mid-batch — a short CacheClearSeconds could previously drop already-merged rooms and strip modded tags mid-merge.
Language-group changes while the panel is hidden are replayed on the next open (a Chinese↔Japanese switch in-game could previously leave the "my language only" filter on the stale group).
Refreshing no longer leaves a stale "selected" highlight on a card whose selection was just cleared.
Comments corrected to match reality (EOS rate-limit mechanics, multi-round search purpose, concurrency notes) — no behavior change.
1.4.4
Special characters (emoji / kaomoji / rare symbols) now render through TMP's render-time global fallback (TMP_Settings.fallbackFontAssets): the game's TMP build renders rich-text <font> tags as literal text, so the previous per-text wrapping approach showed raw tags. The mod's dynamic fonts (prebaked with the 7792-codepoint base set) are appended to the global fallback list — add-only and idempotent — so any TMP text whose font chain lacks a glyph picks them up automatically, no tag wrapping needed.
Smoother startup:
Dynamic font creation is now framed (one candidate per frame, started early at launch) instead of creating all four fonts synchronously in the main-menu inject frame — the heaviest candidate (19 MB msyh.ttc) no longer stalls the menu's first frames.
Full-speed glyph preloading runs under a ~4 ms/frame time budget instead of a fixed 4 fonts × 200 codepoints per frame, so startup frames no longer jitter.
Robustness fixes from review:
Framed-creation state machine no longer stops after the first font (the guard now uses the in-progress flag, not the list count).
Font registration is deferred until all fonts are created (previously a partial set could be registered first and short-circuit the rest).
If the file-path CreateFontAsset overload is stripped by IL2CPP, the family-name overload is now retried as a fallback (previously unreachable because the system font files always exist).
A font that fails during preload is removed from the global fallback list too — no stale references.
Preload chunk buffers are exact-length (no trailing NUL codepoints passed to TryAddCharacters); TryAddCharacters return values are now checked and logged.
Dead code from the retired rich-text approach removed; comments synced with the implementation.
1.4.3
Searching is now stutter-free — the headline fix of this release:
Search results merge into the cache in small per-frame batches (≤200 rooms/frame) instead of all at once — the "Searching…" animation plays smoothly, tooltips respond instantly, and the room list appears without a frozen gap, even with thousands of results.
The list render after a search only toggles cards whose visibility actually changed (previously it hid the entire pool then re-shown every card — up to ~9,000 SetActive calls).
Glyph preloading is adaptive: full speed at game start while the panel is closed (finishes in ~0.7s before you can open the panel), throttled to a few ms/frame while browsing, and paused entirely during a search — preload work never competes with your interaction.
Search can no longer get stuck on "Searching…" when the EOS manager becomes unavailable mid-batch (fallback and timeout guards cover every state).
Full hardening from two independent review passes over everything since 1.4.0:
Search-box input is debounced (150 ms) — typing filters rebuild the list once instead of per keystroke.
Transient dynamic-font creation failures now retry automatically (a single early hiccup previously disabled special-character fonts for the whole session); rejected font assets are properly released; a re-created font re-queues its glyph preload.
Session search results merge with the same per-frame budget; all result-processing cursors reset correctly on refresh/timeout.
Removed dead code (write-only timing list), extracted duplicated button / room-conversion / label logic, rewrote stale comments to match the implementation, and synced the version string between plugin and project file.
1.4.1.1
Adaptive tooltip boxes for the Refresh and Modded-only buttons: dark background (matches the panel) with a white outline, sized to exactly wrap the text; long translations wrap to multiple lines (measured synchronously via GetPreferredValues) instead of overflowing the screen edge, and re-fit when the language switches.
"Modded only" + language switch fixed: host/code labels on room cards now follow the game language even when the list is filtered to modded rooms — the batched text refresh now drives a separate visible-card list, so reused pooled cards are refreshed too (previously they kept the language from when they were created).
Reuse the game's prebuilt fallback fonts: all 9 TMP font assets from FontFallbackData.fallbackPrototypes (the exact fonts the vanilla UI uses for its 15-language coverage) are appended to the mod UI font, giving the mod UI identical character coverage to the vanilla game.
Dynamic fallback fonts from Windows system fonts: stopped calling IL2CPP-stripped TMP APIs (which threw "Method unstripping failed" and silently disabled glyph preloading). Dynamic TMP fonts are now created from msyh.ttc / Segoe UI Symbol / Segoe UI Emoji / Arial and appended to the fallback chain, so kaomoji and special symbols render instead of missing-glyph boxes.
Expanded preload base set (~7,400 codepoints): geometric shapes, box drawing, block elements, enclosed alphanumerics, arrows, kana, Greek, Cyrillic-adjacent math, CJK punctuation, fullwidth forms, dingbats and every emoji extension block (1F300–1FAFF: new emoji, region flags, mahjong, playing cards, chess, math alphanumerics, CJK radicals, combining marks, presentation forms).
Performance — list stutter eliminated: preload now bakes only the base symbol set. The full language scripts (CJK / Hangul / Cyrillic, ~29k codepoints) are covered by the game's own static fallback fonts and were never rendered from the dynamic fonts, so per-frame glyph baking finishes in ~0.6s instead of ~3s and atlas memory drops dramatically.
Robustness: glyph preload can no longer deadlock on a bad batch (the cursor advances before baking, and broken fonts are dropped from the fallback chain); dynamic-font creation retries after transient failures; the fallback chain is re-ensured every 3s while the panel is open (closing the window where the game's SetLanguage rebuilds and drops appended fonts); card-pool trimming is O(n) and prefers hidden cards (it no longer destroys cards that are about to be reused); dead wrappers and stale comments cleaned up.
1.4.0
"My language only" filter: follows the game language automatically — Chinese (simplified + traditional, same script) / Japanese / Korean / Russian each filter rooms by their own script; Latin-family languages (EN/FR/IT/DE/ES/PT/PL/TR/CS/ES-419) share one group. Toggle label & status text switch per language instantly.
Missing-glyph boxes (□) fully eliminated: root cause was TMP baking glyphs at runtime on the shared game font — the fallback font now pre-bakes ONLY the current language's full script (CJK / Hangul / kana / Cyrillic + a universal Latin/symbol base) in the background, so no random boxes in the mod UI or the game's own UI, with minimal memory cost (approx 8-88 MB depending on language; unused scripts cost nothing).
Robustness (full code review): rate-limit early-stop can no longer hang the panel on "Searching..."; panel Show is crash-guarded; card text updates use cached TMP references; card pool trims the oldest cards; localized room display name (no hardcoded Chinese); proper Unload cleanup.
1.3.2
Missing-glyph boxes (□) fixed: player/world names containing characters outside the vanilla font atlas (rare CJK, symbols, emoji) now render through dynamically created fallback fonts — Microsoft YaHei (CJK/Latin/symbols) and Segoe UI Emoji are appended to the captured font's fallbackFontAssetTable and ReadFontAssetDefinition() is called so TMP falls back instead of drawing boxes. Idempotent (cached + existence-checked) and re-ensured on every panel open, so it survives the game rebuilding the fallback table on language switch.
1.3.1
Original join chain fully reused (including error UI): joining now calls the game's own JoinMenu.ConnectTo(joinCode) — it registers the OnFailedConnection listener (via ShipmatesEventDispatcher) that shows the original error menu (MainMenuManager.ShowErrorMenu) when a connection fails, and displays the original "Connecting…" screen. Previously the mod called NetworkMinder.SetTransportAndConnect directly, silently swallowing connect failures.
Falls back to the direct call (no error UI) only if the original JoinMenu isn't present in the scene.
1.3.0
Modded-room tagging: rooms hosted by mod users can carry a bwpl_open="1" tag; a new "Modded only" filter shows exactly those rooms.
Targeted modded-room search: TaggedRounds (default 5) searches filtered by bwpl_open="1" run before the normal scan — one round already returns all modded rooms while fewer than 200 exist, and more rounds accumulate as the modded community grows. Implemented with the native EOS binding using the correct handle (Handle.InnerHandle) — fixing the earlier 0xc0000005 crash.
In-game toggle: a persistent "Room tag" switch on the Host page (always visible, plain-text label + tip) — no config editing needed to tag your room.
F5 developer mode: open/close the public-room panel in any scene (auto-applies the game's UI mode: unlocked cursor, character input stopped) to verify your own room is recognized as a modded room.
Config hot-reload: every setting takes effect immediately when the cfg file changes — no restart required.
UI text rendering fix: mod text now clones the game's own font template (labels and tooltips previously created text objects that rendered nothing under IL2CPP).
Anti-dedup perturbation: each targeted round sends a different maxResults (150-199) so EOS treats them as distinct requests and returns different random windows (identical requests get suppressed after a few rounds).
Two-phase scan: targeted (modded) search completes first, then the normal random search — modded rooms are always available even mid-scan.
Performance: card pool trims the oldest cards instead of a full rebuild when over the cap; card selection is O(1); host-switch scanning only runs in the main menu.
1.1.2
CN-only toggle refined: a room is now "Chinese" when it contains Han characters and no Japanese kana — Japanese rooms with mixed kanji+kana names (e.g. "みんなの部屋") are excluded, while Chinese rooms stay fully matched.
1.1.1
Default search rounds tuned to 30: rounds beyond 30 hit the EOS rate limit and return ~0 results, so more rounds no longer add coverage — 30 is the measured sweet spot.
1.1.0
Player counts on cards: current/max players (e.g. 3/8) from EOS lobby info; full rooms are hidden automatically.
Three-line card layout: world name / host name / players + room code — all four fields fully readable.
15-language localization following the game language (zh-simplified & traditional, ja, ko, en, fr, it, de, es, es-419, pt-BR, ru, pl, tr, cs), switching live; language switch refreshes texts with zero lag (batched card-label updates, no rebuild).
Auto-scan only on first open; re-entering keeps the existing list (Refresh re-scans).
Smart cache: manual refresh never clears the list (same-minute refresh only adds); cache auto-cleans every 60s (configurable CacheClearSeconds).
Scrollbar fixed (official Unity Scrollbar component, minimum handle size, no flicker/vanishing with thousands of rooms).
Status bar denominator now counts rooms after the full-room filter (e.g. 50/1500 instead of 50/3000).
Burst 100-round search (~3s) restored; EOS rate-limit safety net ends the round early with a single notice when throttled.
Join now uses the original game flow (NetworkMinder.SetTransportAndConnect) — rooms actually connect.
Full main-thread refactor: no await on game Tasks (eliminates the crash class behind 0xc0000005), snapshot-copy room data, defensive UI rebuild/cleanup.