Repository navigation
Conversation
b77152f to
bfd5682
Compare
|
Comments (AI-assisted) It isn't ready to merge under our architecture rules. Theme inheritance, separate asset folders, and capability declarations are sound, but these issues remain. (reference: docs/rmlui-ui-system) Must fix
Should fix
|
|
@sven-n can you weigh in on this? re: on how the current S6 chat, and this to-be-introduced classic chat, should be designed together with your discord chat in the long run? or we can just implement as-is, and leave the chat design unification to you? |
|
The chat which is synced with discord is mainly guild/alliance chat. I think the UI is not so much affected by that. I'll need some time to test the new discord PR first before I can say anything more detailed 😅 |
|
Ah, I understand. So it's more on the handler side of the chat inputs. (I thought there was going to be a discord widget xD) |
|
Hello @vguille, I'll changed the target to main since dev/rmlui-ui-system was already merged. |
bfd5682 to
323b639
Compare
|
Hi @nitoygo , thanks a lot for the review, and congrats on getting #610 merged! I was really happy to see the theme system land in I've updated the PR: it's now rebased on
The description is updated with the details. So far I've tested at 1600x900 and 100% UI scale only; I'll go through the §25 resolution / scale matrix next. Thanks for publishing Could you take another look when you have time? Two earlier questions are still open: should the theme stay |
|
@nitoygo I've pushed three more commits after running the §25 resolution / UI-scale matrix (details in the description): the character window's derived lines no longer run into the next stat box at 75%; the classic scene windows' text follows the native text size (0.97 drew its font at screen pixels, so this matches both the original and legacy's rule); and the classic HUD is stacked under the windows through One observation on the placement service, nothing this PR needs: |
|
dang i love it :D |
Yeah, the placement service (for the workspace layout) is still not that mature. As more people try it and notice some limitations, we will have to somehow redesign so it works well for different/more complex cases. |
61c53c2 to
0193c7a
Compare
|
character selection scene and login scene need the right world and than everything is insane 👯 |
UI/HUD/MainFrameExtras: game state the classic (0.97) bar shows and the S6 one does not, added to the main_frame model in upstream's naming (party_open / guild_open with clicks and tooltips, coord_x / coord_y, left_covered / right_covered). Only data: the theme draws them. A theme that does not bind them pays nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
themes/classic builds on legacy (theme.ini Base=legacy) and ships only the windows it restyles, drawn with the 0.97 client's own art: - login box and server list, character select frame and creation window, HUD (bar, orbs, AG, experience, Q/W/E, skills, Party / Guild buttons, coordinates), inventory, character, party, pet and item durability HUD, NPC shop, storage, trade, Chaos Machine, guild window and creation, event entries (Devil Square, Blood Castle, Golden Archer), message boxes and the chat (0.97's frameless lines at the top-left corner, or its framed window); - no login Menu / Credits bar, map title or buff strip, as in 0.97; - Verdana from the player's system ([Fonts]), the bundled face as fallback. The art is the original files, unconverted, kept out of the RmlUi tree so their names cannot collide with S6 files: - Data/Interface/Classic: the 0.97 Data/Interface (099b/ for the few classic-era files 0.99b adds); - Data/Logo/Classic: the 0.97 login box art. .gitignore lets both folders in. A few textures 0.97 tiles or stretches over a fixed size ship pre-built (tools/classic_theme), as do the skill icon rules. Each stylesheet names the 0.97 function it follows (its main.exe address) and the positions in the original 640x480 frame. The HUD data it binds is in the previous commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Following docs/CODING_RULES.md, the HUD extras convert a tooltip only when its source text changes and format the coordinates only when the hero changes tiles. docs/rmlui-ui-system/theming-and-modding.md gets a short section on the classic theme: what changes for the player and the data another theme can reuse. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- item_endurance.rcss follows the new layout, where the theme places the pet column (#pets in the screen's stretch, #pet_column, the arrow row) instead of C++: the pet's bar is back at 0.97's (575, 16), its name ending at x 625 and the arrows at (550, 4). The durability icons keep legacy's placement. - server_select.rcss covers every state base.rcss now styles on the server buttons (.server-group-btn / .server-option-btn): the selected group, hover and press kept the legacy sprites (the selected group turned red) and colours. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dows 0.97 places several overlays from the right edge of the area its open windows leave free (004cb520: 640, 450 or 260) instead of the screen's, so they move aside when a window opens: - the pet's life and the arrow count follow --world-right, 50 further left in a party so they stay clear of the party list (004bec00, 004bf540); the pet HUD's model gets an in_party field and #pets an .in-party class for it; - the party list is placed by the theme again, left of the docked windows (it lost its place when upstream moved that to the themes); - the event HUD frame is centred on the free area, as 0.97 centred its scores and timers (004bc220, 004bf090). Before, the pet bar stayed at x 575 and was drawn over the party window. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Stacking: a theme may restack its documents in theme.ini [Stacking] (inherited like the other sections), applied when a document loads (ThemedStackingDepth). The classic theme raises chat_input.rml over the HUD there instead of C++ forcing its z-index every frame. - Character creation: the model exposes job_previous / job_next, the nearest enabled class each way; the classic arrows use them instead of stopping at the fourth class. - Tests: class stepping, [Stacking] and the classic theme's chat input depth. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the UI scale The classic create window and the scene message boxes stretch their art with the window height (--px), but 0.97 drew its font at screen pixels inside the stretched frame (CreateFontA with the default height; a line height of 12-15 px stepped by the screen width), so their text follows the native text size, as legacy's login box and server list do: 13rem under the scene-window-scale root for the create window, 1rem for the message boxes. The fixed 13px they had ignored the player's UI scale. The stylesheets say so, and the message box's comment loses a stray reference. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…tat box The classic window leaves 36 reference px between an attribute's first derived line and the next stat box, but the rows were 13 (three of them 39), so the strips always ran into the box and, where the panel is smaller than the native text (UI scale 75% at 800x600), the third line's glyphs crossed onto it. The rows are 12 now: three end on the box at every panel scale. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… in 0.97 0.97 draws its windows over the bar's ends, where the dragons stand. The classic theme hid a dragon when the placement service said a docked window covered that side, which left it hidden after the player dragged the inventory away (the uncovered world follows the slot, not the window). The theme now stacks main_frame.rml under the windows ([Stacking], 1.95: under the lowest window at 2.0, over the event HUDs at 1.92), so whatever stands on a dragon covers it, wherever the player leaves it. The left_covered / right_covered bindings are gone. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
On a wide screen the bar is centred and the windows dock at the screen's edge, so a docked window covered only part of the right dragon (half of it at 1920x1080). While the windows docked on the right reach past the bar's right end (--world-right against 50vw + 320dp), the dragon's width clamps to zero; otherwise it is its 108dp. At 4:3 the window still covers it, as in 0.97. A window dragged away keeps the dragon hidden until the workspace places it again, since --world-right follows the slot. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The classic theme had no command_window.rcss, so the D window kept legacy's S6 buttons (newui_btn_empty) and target box inside the 0.97 frame. 0.97 has no command window (its player commands are chat commands), so the classic sheet is legacy's with classic art: the twelve buttons are the 0.97 text plate, Message_box squashed to the button box, brightened and warmed under the mouse and while armed, as 0.97 lights its plates; the target box is 0.99b's Cursorid_wnd. Positions, ids and events are legacy's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The classic message_box_view.rcss was written when C++ placed the in-game boxes and laid out their lines and buttons; since the themes place and lay them out, it left every box (progress, Blood Castle / Chaos Castle results, Devil Square ranking, jewel dissolve, guild appointment) without a place or a line layout. It now starts from legacy's current sheet with 0.97's art: 213 wide like 0.97's boxes, the Message_box1 stone between Message_box2 edges, Ok/Ok2 and the Bar plate for the labelled buttons, and 0.97's own geometry where it has the box (the Blood Castle result 213x170 and the Devil Square ranking 213x290 at y 60, from RenderMessageBox 0051af50). Kinds 0.97 does not have keep legacy's layout, narrowed to 213. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The classic theme hid what the 0.97 bar has no place for. The Season 1 and 2 clients, which kept the classic interface, made a place for some of it, so the theme now draws those parts as they did instead of hiding features the client has: - HUD: Season 2's left third (with the command window button's box and the SD column's recess) and Season 1's right third (with the friend button's box); the SD column (Season 2's FUN_005eb880), the command window button (FUN_0040af9e) and the friend button (Season 1's 00493930), which blinks Season 1's letter for a new letter or chat; - character window: Season 1's quest and pet buttons; - inventory: Season 1's personal shop button, with Close and Repair where Season 1 draws them. MainFrameExtras exposes command_open, command_tooltip and mainframe_command_click, which toggles the command window under the D key's rules (nothing in Chaos Castle, a notice in a battle zone). The cash shop and menu buttons, the fourth item hotkey, the S6 skill row and the Master Level button stay hidden: no classic client has a place for them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The classic theme drew skills 1-56 with 0.97's Skill.jpg (32x36 icons with their own stone frame). Skills the later clients added have no icon there, so the classic theme now uses legacy's skill_icons.rcss for every skill: the 20x28 icons centred in the 32x36 cells of the ring and the list. gen_classic_skill_icons.py and the classic skill_icons.rcss are gone. The Dark Lord's pet commands were hidden, which took them away from the player in this theme (architecture principles §22). They now have their own row of the same cells, centred just above the skill list, while the list is open. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Legacy's option_window.rcss was rewritten (wider panel, a scrolling settings area, the close cross, and the tuning rows of the Enhanced features: chevrons, sliders, Reset buttons, More settings), and the classic copy still carried the old layout. The classic file is now legacy's followed by the classic parts: 0.97's dialog stone and edges, the title, tabs and Reset buttons as 0.97 text plates, and the classic social windows' check boxes, scrollbar and line colours. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
b6e4d91 to
28b7d8b
Compare
The tabs are sharp text, and legacy's two-class size rules for them (56x22 times the panel scale) beat the classic theme's plain .tab-btn, so the inactive tab came out larger and lower, over the active one. The classic sizes now use the same selectors and the panel scale, and the tabs are 78 wide side by side across the frame so the English labels fit (Season 1's 49 held its short labels). Without a pet, the message is Season 1's: red (220, 60, 60) with a black shadow, in the middle of the frame, with no band; legacy's subtitle goes, as Season 1 has one title and the tab names the pet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The classic theme forked guild_info.rml to show the Guild and Members pages together and hid the tabs, the figures, the roles, the alliance and most buttons, as 0.97 has one guild window. A theme should dress a window, not take its features away (architecture principles §22), so the fork of the markup goes and every page, figure, list and button stays, in the classic pieces: Season 1's win_button tabs (dimmed, the current one lit and taller, as in its pet window), the tables as single lines in the classic social windows' colour, 0.97's text colours, the buttons on Season 1's text_button (its labelled buttons' art, as the classic MU Helper's) within the frame, and the Season 1 scrollbar. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The chaos-mix menu still had the Season 6 look. Season 2 already had this menu with the same three buttons (message box 0x8e), so the classic theme now copies it: Message_box2 edges around five Message_box1 strips stretched to 60, the orange title, the Message_box plates at 150x35 tinted grey and lit under the mouse, and the pale blue bold labels. The recipe lines keep Season 2's heights and spacing but are centred, since MuMain's longer lines ran past the box's edge from Season 2's x. Season 2 has no Close button, so it is hidden; Esc still closes the menu. The stone comes as a derived texture, Message_box1_60x5. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The friends, chat and letter windows drew the top band, then the sides over it, then the bottom band over the sides, so the top and bottom corners differed and the corner dots were missing. Draw the 5-unit outline as CUIBaseWindow::DrawOutLine() did: the bands across the full width, then each side's 146 and 106 lines down the full height (the inner lines cross into the corners), the sides' 37 only between the bands, and a dot in each corner except the bottom-right one of a window that resizes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The tab strip and labels are inside the no-guild check but the three hit areas were not, so a theme that draws them (the classic plates) showed three empty tabs over the join hint for a character without a guild. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The classic guild creation sheet is a copy of legacy's made before legacy gave the mark grid's and palette's cells the pointer, so in the classic theme the cells kept .gm-cell's pointer-events: none and neither picking a colour nor painting did anything. Restore legacy's rule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The classic inventory, shop, storage, trade and Chaos Machine sheets are copies of legacy's made before legacy's panels stopped taking the pointer once the workspace places them, so in the classic theme the panel caught the clicks meant for the native item grid and an item could not be picked up. Restore legacy's #panel.slot-placed rule in the five, and legacy's panel text size in the shop, storage, trade and party windows (not in the Chaos Machine, where it moves the lists off 0.97's place). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Since the chat bar asks IsPointerOver(), a bar that takes no pointer lets a click on it fall through to the world and walk the character. The classic bar's panel took none; it now takes the pointer as legacy's does, and the two halves of its art still take none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The classic rows predate legacy placing the live Rena previews by their item boxes, so the two icons were not drawn. Place them left of each count's "X". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
I'm taking this out of draft. I believe it's ready for review, and if you agree, for merging. The branch is rebased on the current What stays out of this PR The PR is only the theme plus the data it binds. Everything that changes how the game behaves, rather than how it looks, I took out and kept in my own fork:
What the theme system would need for a fully classic interface without C++ To bring the whole classic interface here, I'd like to know what you'd expect for each of these:
Parts still in the Season 6 look A few buttons and icons stay as legacy draws them, because no classic client had the feature: the inventory expansion button, the skill icons (the classic atlas has no icon for the later skills, so every skill uses legacy's, to keep them consistent) and the NPC menus from later seasons (Elpis, Delgardo, cherry blossom, jewel integration, trainer, stat reset). Where Season 1 or 2 had a window, the theme copies it from their executables. I didn't want to generate art for those, so the theme only ships original textures. I'd like your opinion: would you accept AI-made textures for them, drawn in the classic style and kept as close to the original parts as possible, so nothing looks artificial? Or would you rather keep original art only, with the legacy look where there's none? Reminder: thin dark line around UI sprites (engine) This is still open and isn't specific to the theme: every RmlUi image with transparency gets a thin dark line along its box (the classic HUD's dragons, legacy's MU Helper bar). RmlUi textures are no longer padded to a power of two ( Thanks! |
Legacy's settings window is 440 wide, so 0.97's dialog stone (213x40) and edge strip (213x5) were stretched about twice over and their 5-texel sides blurred into wide bands on the left and right. Ship both widened ahead of time instead (make_classic_derived_textures.py): the sides keep their width and only the stone between them stretches, in proportion. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The classic docked frame's header (Item_Back01's dark band, y 5-30) is shorter than legacy's, and the NPC windows kept legacy's header lines: the quest title of the NPC quest window (Sebina, Marlon) and the subject of the quest progress windows fell on the band's ornament, and the NPC dialogue's Gens contribution banner sat on it. Close the two lines up inside the band, and move the banner under the ornament. The NPC quest window shows only the name for a Dark Lord or Magic Gladiator at Marlon, so npc_quest.rml marks the name with .with-quest-title when the quest title shows; alone it stays where the other classic windows put their title. Legacy has no rule for the class. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Q/W/E stack counts were centred above the item icons, over the slots' frames. 0.97 itself draws them (004be48b) with RenderNumber at x 226 + 31i, y 447, which puts them in the oval the bar's art has right of each slot. Place the label there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The classic login hid "Remember Username" and "Remember Password", which neither 0.97 nor Season 1 (the same box) has, and nothing else in the theme reached them. Put them on the two blank plates of the box's second row, each with the classic social windows' check box. The labels are sized with the box, not at the native text size, and break into two lines at their space, so the longest word (German's "Benutzernamen") fits at every resolution. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Interesting! Do you have plans to add a follow up to add support to the engine? |
The level sat in legacy's group-box title between the tabs and the frame, and the life bar was legacy's textured gauge. Season 1 (00412bb0) writes the level in gold on a Level_box at (13, 96), the stat lines from y 120 every 15 at x 24 over a band of black at 50%, and draws the life bar untextured: a 145x8 dark red back with the life, up to 143x6, in red. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Season 2 client already has the trainer's menu and pet recovery (00462c5b, 00463377) and Lahap's jewel menu (message box 0xa1), so the classic theme copies them instead of legacy's S6 boxes: the 213-wide stone box from Message_box1 rows between Message_box2 edges (the rows come from a derived texture, Message_box1_40x6), gold labels on 120x22 plates and exit_01 as Close for the trainer, 150x35 plates with pale blue labels and a Close plate for Lahap. The trainer's title is orange without a band, as the Chaos Goblin's and Lahap's (Season 2 writes it black on a grey band). The other npc-menu menus (Lucky Item, seed master, seed researcher), which no classic client has, take the trainer's box. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
While testing the classic theme against OpenMU (Dark Lord, trainer, Lahap), I found a few dialogs a theme can't reach. I'd like to know how you'd want them handled. Generic menus without a Only three
A theme has nothing to tell them apart, from each other or from any later menu without a kind. They get no Adding a
One kind for different menus
State hidden with
Everything else I found still in the legacy look can be reached from a theme: Elpis, the stat reset helper, Delgado, the cherry blossom menu, and the native boxes shown through Thanks! |
Elpis takes the Season 2 client's window (006d3959, 006d3b05): the 214x250 stone box at y 65 with its two strips, the white title, the text from (20, 50) and three win_button buttons, no Close (Esc closes it). The stat reset helper, Delgado and the cherry blossom menu, which no classic client has, take the trainer's Season 2 box. The trainer box's plates now widen for labels longer than them (other languages, these menus). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ssic parts The native progress box (crown switch, seal registration, Illusion Temple) draws Season 1's progress bar (Progress_back with the 0.97 fill) instead of S6's switch bar. The login's save-password warning takes the classic confirmation's stone box and plates. The chat commands window (J) takes the classic plates for its two buttons. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every mixing NPC opens the same window (CMixInventory). The classic one put its button at 0.97's (75, 300), where 0.97's short texts ended, but MuMain's lists and descriptions run to about y 367, so the button covered them (seed extraction, for one). Put it at legacy's y 380, keeping 0.97's x. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The mix window's lists are at the native text size, which does not shrink with the window: per unit of the window it is 9.6 at a dp ratio of 1.25 (800x600) and 11.7 at 0.94 (800x600 at 75%), against 7.5 at 2. There the long recipes (seed extraction) wrapped into more lines and ran under the Mix button even at y 380. On those canvases (max-resolution 1.3x and 1x) the list lines are drawn at 85% and 75%. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>








Summary
As discussed in #610, this adds a classic (0.97) theme, on top of the current
main(7a0a02a1f). The PR is the theme plus the data it binds: no behaviour changes in C++, nothing that only one theme turns on, and no window loses a feature in it.Compared with the version first reviewed:
UI/Chat/ClassicChat), the "no move marker" hook and the classic[Capabilities]keys (ThemeCapability) are out of this PR, removed from every commit. They change how the game behaves, not how it looks, so they can come later as their own PR if you want them. The chat now runs on the stock keys with the 0.97 look;guild_info.rmlto reduce it to 0.97's notice-and-members window;option_window.rml(including the Enhanced look's tuning rows);[Stacking]).What stays in C++
Only data for the theme, in upstream's naming:
UI/HUD/MainFrameExtras: added to themain_framemodel.party_open/guild_open/command_openwithmainframe_party_click/mainframe_guild_click/mainframe_command_clickand their tooltips, andcoord_x/coord_y. The command button toggles the command window under the D key's rules (nothing in Chaos Castle, a notice in a battle zone).CharMakeWin:job_previous/job_next, the nearest enabled class each way (-1 for none), for a theme that steps through classes with arrows (Character/ClassStep.h, tested).ItemEnduranceInfo:in_party, so a theme can keep the pet column clear of the party list.RmlTheme: a[Stacking]section intheme.ini, inherited like the other sections and applied byApplyStackingDepthwhen a document loads (ThemedStackingDepth, tested). Documents a theme doesn't list keep the table's depth.13 files, about 300 lines.
Commits
MainFrameExtras).themes/classicwithBase=legacy, shipping only the windows it restyles. The original art is unconverted and lives outside the RmlUi tree, as you suggested:Data/Interface/Classic(plus099b/,s1/,s2/for the few later classic-era files) andData/Logo/Classic;.gitignorelets both folders in. Verdana comes from the player's system via[Fonts], with the bundled face as fallback. Each stylesheet names the original client function it follows (itsmain.exeaddress) and the positions in the original 640x480 frame.docs/CODING_RULES.mdfollow-ups and a section intheming-and-modding.md).--world-right,in_party).[Stacking],job_previous/job_next, tests).[Stacking] main_frame.rml=1.95).guild_info.rmlgoes; every page, figure, list and button stays, with Season 1's tabs and labelled buttons (text_button), single-line tables and the Season 1 scrollbar.0x8e), so the theme copies it: its stone box, orange title, grey plates lit under the mouse and pale blue labels, from a derived texture (Message_box1_60x5, added totools/classic_theme/make_classic_derived_textures.py). The recipe lines keep Season 2's heights but are centred, since MuMain's longer lines ran past the box from Season 2's x.CUIBaseWindow::DrawOutLine()drew it (the inner lines crossing into the corners, a dot in each corner but a resizeable window's bottom-right one); before, the top and bottom corners differed.guild_info.rml's three hit areas sat outside the no-guild check that hides the tab strip and labels, so a theme that draws them showed three empty tabs over the join hint.#panel.slot-placed { pointer-events: none; }, so their panels caught the native grid's clicks and an item couldn't be picked up; legacy's panel text size comes back too (shop, storage, trade, party).IsPointerOver(), and the classic one took no pointer, so a click on it walked the character.Message_box1_440x300,Message_box2_440, inmake_classic_derived_textures.py): the sides keep their width and only the stone between them stretches.npc_dialogue.rcssandquest_progress.rcss).004be48b) at x 226 + 31i, y 447, in the oval the bar has right of each slot.Level_box, the stat lines on dark bands, and the life bar untextured (a dark red back with the life in red), as Season 1 draws them (00412bb0).00462c5b,00463377, message box0xa1), with a derived texture (Message_box1_40x6). The othernpc-menumenus, which no classic client has, take the trainer's box.006d3959); the stat reset helper, Delgado and the cherry blossom menu take the trainer's box, its plates widening for longer labels.@media (max-resolution)).Where a window doesn't exist in 0.97, the theme follows the Season 1 or Season 2 client when it has the window (checked against their executables); otherwise it takes the parts of the closest classic window.
Changes to existing files
Small, and all extending existing models:
MainFrameWindow.cpp:MainFrameExtras::BindModel/SyncModel(one line each).CharMakeWin.h/.cpp:job_previous/job_nextin the model.RmlTheme.h/.cpp:ThemedStackingDepth()and the[Stacking]lookup inApplyStackingDepth.ItemEnduranceRmlModel.h/ItemEnduranceInfo.cpp/item_endurance.rml: thein_partyfield and class.guild_info.rml:data-if="!no_guild"on the three tab hit areas, like the tabs they belong to (nothing visible changes in legacy).npc_quest.rml: awith-quest-titleclass on the NPC's name while the quest title shows under it, so a theme can place the name alone (a Dark Lord or Magic Gladiator at Marlon) differently (legacy has no rule for it).docs/rmlui-ui-system/theming-and-modding.md:[Stacking]and a section on the classic theme.What the classic theme still hides
Parts no classic client has a place for, each still reachable from the keyboard: the cash shop button (X), the window menu button (Esc / U), the fourth item hotkey slot (R still uses it), the S6 five-slot skill row (1-0 still work), the Master Level button and the Chaos Goblin menu's Close button (Season 2's box has none; Esc does the same).
Lahap's jewel picker and amount and the personal shop's currency menu keep legacy's look: they have no
kinda theme can target (details in the comment of 25/10).Things worth discussing
classic-097,Base=classic, hiding those parts in RCSS) or astheme.iniswitches? I'll follow whichever you prefer, in a later PR.MainFrameExtras: these fields could simply live inCMainFrameWindow's model. I kept them in a separate file to make the review easier.config.ini.Known issue: thin dark line around UI sprites (engine)
Every RmlUi sprite with transparency gets a thin dark line along its box: the classic HUD dragons, but also legacy's MU Helper bar. It isn't theme-specific (measured on
bd5f66a99; the cause is unchanged on7a0a02a1f, where images still sample throughlinear_samplerandclamp_sampleronly serves the post-process passes):596f23f8astopped padding RmlUi textures to a power of two (LoadImageExclusive(..., false)).linear_samplerusesSDL_GPU_SAMPLERADDRESSMODE_REPEATwith linear filtering.A/B on the same frame: switching
linear_samplertoCLAMP_TO_EDGEremoves the line completely (the row on the dragons' top edge goes from luminance 55.5 to 68.0, while the neighbouring rows stay identical). I didn't keep that change, since it would break image repetition.Possible fixes:
REPEATonly for decorators that tile;Happy to test whichever you prefer.
Testing
Built on Windows (preset
windows-x64, RelWithDebInfo) against RmlUiafc25fec, and tested against a local server. On the current head,character_class_step_testsandrml_stacking_order_testspass, as do the drift, syntax and geometry checks. Intheme_file_interface_tests(run per case, as CTest does), 16 of 18 cases pass, including the[Stacking]one; the two that abort (0xc0000409: "focused confirmation input claims its document..." and "options keep displayed theme identities...") abort the same way on plainmain(7a0a02a1f) on my machine, so they aren't from this PR.tools/rml_preview.pyonly: the 0.97 test server has no Dark Lord.tools/rml_preview.py); the guild window without a guild (no empty tabs, the whole join hint) and with one (tabs as before, in the preview); the guild creation's emblem (a colour picked and cells painted); an item picked up from the classic inventory, which failed before commit 33, and the inventory's buttons still working; the shop, storage, trade and party windows unchanged by commit 33 (before / after captures); the Golden Archer's Rena previews. The chat bar (commit 34) follows legacy's rule and wasn't clicked in the game.The settings window's sides (in the game); Sebina's quest window header (in the game), and the name-only case, the NPC dialogue with the Gens banner and the quest progress windows in
tools/rml_preview.py(the 0.97 test server has none of them).The potion count in the bar's oval (in the game).
The login box's two options at the 24 resolution / UI scale combinations of the matrix above, and a click checking and unchecking one (in the game).
Against OpenMU with a Dark Lord: the pet window with a Dark Horse, Lahap's menu, and the trainer's menu and pet recovery (the trainer's boxes opened from my fork's debug console, with the same stylesheets).
The Elpis, stat reset, Delgado and cherry blossom menus and the progress box (the same way), and the seed extraction's mix window at the 24 resolution / UI scale combinations. The save-password warning in
tools/rml_preview.py; the chat commands window (J) wasn't opened in the game.Screenshots
Select Server

















Login
Select character
HUD with potion count position fixed
Inventory and Vault
MU Helper
Character stats
Friends Chat
Chaos Machine
Party
Priest Sebina
Guild NPC
Option Menu
Warp Window
Guild Members List
Assistant
Julia
Related issues
Follow-up to #610 (#610 (comment)), where the classic theme was proposed.
Checklist
docs/CODING_RULES.md.docs/build/README.md).windows-x64, RelWithDebInfo), against RmlUiafc25fec.