Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
0487636
Expose the classic HUD's extra parts to the theme
vguille Oct 11, 2026
fbbadc9
Add a classic (0.97) theme
vguille Oct 14, 2026
b8c7e0c
Keep the classic HUD extras off the per-frame heap; document the theme
vguille Oct 11, 2026
83293fc
Fix the classic pet bar and server list states on the new upstream
vguille Oct 11, 2026
9b5a77e
Move the classic pet bar, party list and event HUDs aside of open win…
vguille Oct 11, 2026
40ca4ae
Address the classic theme review: stacking and class arrows
vguille Oct 14, 2026
ebb5f7f
Size the classic scene windows' text like the native text, honouring …
vguille Oct 14, 2026
3d4b82a
Keep the classic character window's derived lines clear of the next s…
vguille Oct 15, 2026
e015198
Stack the classic HUD under the windows, so they cover the dragons as…
vguille Oct 15, 2026
8be53c2
Hide the classic right dragon whole while a window docks on the right
vguille Oct 16, 2026
2118d8b
Give the command window (D) the classic plates
vguille Oct 16, 2026
225329a
Rewrite the classic message boxes on the current message box contract
vguille Oct 16, 2026
1bd23f6
Give the login and character scenes the 0.97 Esc menu
vguille Oct 16, 2026
896ae30
Give the in-game Esc menu the 0.97 plates
vguille Oct 16, 2026
f7309cd
Give the in-game confirmations the 0.97 tall box
vguille Oct 16, 2026
169d3c6
Document the classic theme's dialogs and command window
vguille Oct 16, 2026
46d1061
Drop the line-height values RmlUi does not parse from the classic theme
vguille Oct 17, 2026
3cacffc
Dress the classic menus, hints and lists in 0.97's parts
vguille Oct 17, 2026
999448e
Dress the classic friend, chat room and letter windows as Season 1's
vguille Oct 17, 2026
4ac9ae5
Give the classic character-side windows classic parts
vguille Oct 17, 2026
c573835
Give the classic NPC and event windows classic parts
vguille Oct 17, 2026
0c5c38a
Give the classic duel, Castle Siege and cash shop windows the later c…
vguille Oct 17, 2026
840414e
Document the classic theme's later-client art and additive copies
vguille Oct 17, 2026
96e726d
Show the Season 1 and 2 clients' HUD parts in the classic theme
vguille Oct 17, 2026
59d8450
Give the classic theme legacy's skill icons and show the pet commands
vguille Oct 18, 2026
28b7d8b
Restyle the classic settings window over legacy's new one
vguille Oct 19, 2026
ea3f32c
Fix the classic pet window's tabs and no-pet message
vguille Oct 24, 2026
9bdd716
Show the whole guild window in the classic theme
vguille Oct 24, 2026
47bec0d
Draw the classic Chaos Goblin menu as Season 2's box
vguille Oct 24, 2026
a63596f
Draw the classic social windows' outline in Season 1's order
vguille Oct 24, 2026
2f304b0
Show the guild window's tab hit areas only with a guild
vguille Oct 24, 2026
10d40af
Let the classic guild mark editor take clicks again
vguille Oct 24, 2026
0982761
Let the classic item windows' grids take clicks again
vguille Oct 24, 2026
1702b09
Let the classic chat bar take the pointer
vguille Oct 24, 2026
0d1c5ec
Show the Rena previews in the classic Golden Archer window
vguille Oct 24, 2026
44bb36a
Keep the classic settings window's box edges sharp
vguille Oct 25, 2026
ff33532
Fit the classic NPC windows' headers in the 0.97 band
vguille Oct 25, 2026
6430110
Put the classic potion counts in the bar's ovals
vguille Oct 25, 2026
08770ef
Show the login options in the classic login box
vguille Oct 25, 2026
6df9cd4
Draw the classic pet window's stats as Season 1 does
vguille Oct 25, 2026
2ca031e
Draw the classic trainer and Lahap menus as Season 2's boxes
vguille Oct 25, 2026
85aba86
Draw the classic Elpis, reset, Delgado and cherry menus in classic boxes
vguille Oct 25, 2026
b2ca1ba
Give the classic progress box, password warning and chat commands cla…
vguille Oct 25, 2026
77a2d78
Lower the classic mix button under the recipe texts
vguille Oct 25, 2026
a1095e2
Draw the classic mix lists smaller on small canvases
vguille Oct 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ build-linux/
!src/bin/Data/Interface/
!src/bin/Data/Interface/RmlUi/
!src/bin/Data/Interface/RmlUi/**
# The classic theme's original interface and login art (themes/classic).
!src/bin/Data/Interface/Classic/
!src/bin/Data/Interface/Classic/**
!src/bin/Data/Logo/
!src/bin/Data/Logo/Classic/
!src/bin/Data/Logo/Classic/**
# Item data (JSON, written by the item editor) is source-controlled.
!src/bin/Data/Items/
!src/bin/Data/Items/**
Expand Down
48 changes: 45 additions & 3 deletions docs/rmlui-ui-system/theming-and-modding.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Theming & Modding

How to edit and select themes, use shared design tokens, and supply custom assets. The client
ships `legacy` and `modern`, plus `legacy-inherited-test` for checking inheritance without visual
overrides. Additional theme folders work without recompilation and can inherit an existing theme.
ships `legacy`, `modern` and `classic` (the 0.97 interface, below), plus `legacy-inherited-test`
for checking inheritance without visual overrides. Additional theme folders work without recompilation and can inherit an existing theme.
A separate user/mod override layer is not implemented.

## Shared markup and theme-specific structure
Expand Down Expand Up @@ -118,11 +118,19 @@ RML, templates, RCSS and theme-local images use the first matching whole file. A
stylesheet replaces its ancestor's file; rules are not automatically combined. Paths to common
assets outside the theme folder keep their ordinary meaning.

`[Tokens]`, `[Capabilities]` and `[Fonts]` inherit individual keys. A child value wins, including
`[Tokens]`, `[Capabilities]`, `[Fonts]` and `[Stacking]` inherit individual keys. A child value wins, including
`NativeTextSize=0` or an empty font entry. Display names stay specific to the child. Names use
letters, digits, `_` and `-` and are normalized to lowercase. Missing ancestors, invalid names
and inheritance cycles make a theme unavailable for selection.

`[Stacking]` moves one of the theme's documents in the stacking order, when its layout makes two
documents overlap the other way round. The classic theme puts its HUD under the windows
(`main_frame.rml=1.95`; the lowest window is 2.0), so a window docked or dragged over the bar's
ends covers the dragons there, as in 0.97, and its chat input over the windows and under the
tooltips (`chat_input.rml=10.65`; tooltips are 10.69). The depths are the original windows' layer
depths, listed in `UI/RmlBridge/RmlStackingOrder.cpp`; a document the theme does not list keeps
its own.

1. Create `src/bin/Data/Interface/RmlUi/themes/<your-theme-name>/`.
2. Declare `Base=legacy` or `Base=modern` in `[Theme]`, or supply your own complete stylesheets.
Every window links `base.rcss` for shared rules such as buttons, checkbox states, backdrops
Expand Down Expand Up @@ -339,6 +347,40 @@ families for the session, so a family loaded by an earlier theme remains availab
a theme retries optional files; restart the client to replace a font file whose family is
already loaded. Referencing a player's installed font does not package it with the theme.

## The classic (0.97) theme

`RmlTheme=classic` gives the interface of the original 0.97 client, drawn with its own art. It
inherits `legacy` and restyles the login box, server list, character select and creation, HUD,
inventory, character, party, NPC shop, storage, trade, Chaos Machine, guild, event entries,
message boxes, confirmations, the Esc menus, the command window (D) and chat. The NPC menus that
share the Esc menu's document keep legacy's look, as 0.97 has none of them. Where the Season 1 and
2 clients, which kept the classic interface, add a part for something MuMain has, the theme draws
it as they did instead of hiding it: on the HUD the SD column and the command window and friend
buttons, in the character window the quest and pet buttons, in the inventory the personal shop
button. A window 0.97 does not have follows those clients, else the closest classic window. The
art lives outside the RmlUi tree, in `Data/Interface/Classic` and `Data/Logo/Classic`, so its file
names cannot collide with S6 files of the same name.

What changes for the player, besides the look:

- **Character creation:** the class is chosen with arrows, which step through the classes the
client enables.
- **World:** no map title when entering a map.

The HUD model also exposes what the classic bar shows and the S6 bar does not: `party_open` /
`guild_open` / `command_open` with `mainframe_party_click` / `mainframe_guild_click` /
`mainframe_command_click` (the command window under the D key's rules) and their tooltips, and
`coord_x` / `coord_y`.

The character creation model has `job_previous` / `job_next`: the enabled class before and after
the selected one, or -1, for a theme that steps through the classes with arrows
(`charmake_select_job(job_next)`) instead of a button per class.

The pet / durability HUD (`item_endurance.rml`) marks `#pets` with `.in-party` while the hero is
in a party, so a theme can keep the pet column clear of the party list. The classic theme also
places the pet column, the party list and the event HUDs from `--world-left` / `--world-right`, so
they move aside when windows open, as in 0.97.

## Coordinates, scaling, and positioning — what a theme actually controls

### Scaling: a global user setting, opt-in per element
Expand Down
Binary file added src/bin/Data/Interface/Classic/099b/Cursorid.OZT
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/Menu01.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/Menu03.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/Menu04.tga
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/btn_pshop.OZJ
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/check.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/cmdType.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/coin.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/command.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/dialogue2_2.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/dialogue2_3.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/dialogue2_4.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/dialogue2_5.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/dialogue2_6.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/dialogue2_7.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/dialogue2_8.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/dialogue3.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/dialogue4.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/dialogue4_1.ozt
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/pet1.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/pet2.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/quest1.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/quest2.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/setitem.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/skill2.OZJ
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/win_check.OZT
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/win_mail.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/win_man.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/win_mark.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/win_push.OZJ
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/win_resize.OZT
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/099b/win_size.OZJ
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Accept_box01.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Accept_box02.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Back1.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Back2.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Back3.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Bar.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Buy_01.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Buy_02.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Cancel.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Cancel2.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Cursor.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Cursorattack.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Cursordontmove.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Cursoreye.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Cursorget.ozt
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Cursorpush.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Cursorrepair.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Cursorsitdown.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Cursortalk.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Dialogue1.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Dialogue2.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Dialogue2_1.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Exit_01.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Exit_02.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Font.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Fontinput.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Fonttest.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Guild.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Guild.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Inventorybox2.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_Back02.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_back01.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_boots.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_box.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_cap.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_fairy.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_gloves.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_lower.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_money.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_necklace.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_ring.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_upper.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_weapon01.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_weapon02.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Item_wing.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Level01.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Level_01.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Level_02.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Level_box.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Lock_01.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Lock_02.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Lock_03.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Lock_04.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Menu01_new.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Menu02.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Menu03_new.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Menu03_new_ag.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Menu04.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Menu_blue.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Menu_character.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Menu_green.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Menu_inventory.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Menu_party.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Menu_red.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Message_box.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Message_box1.ozj
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Message_box2.ozj
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/MiniMap.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Mix_button1.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Mix_button2.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Money_01.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Money_02.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Nis_back.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Nis_bar.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Nis_btnalpha.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Nis_btnarrow.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Nis_btnchat.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Nis_btnend.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Nis_btnmax.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Nis_btnmin.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Nis_btnsize.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Nis_hframe.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Nis_rsframe.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Nis_rsframe.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Nis_vframe.ozj
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Ok.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Ok2.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Progress.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Progress_add.ozt
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Progress_back.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Repair_01.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Repair_02.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Sell_01.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Sell_02.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Skill.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/Trading_line.ozj
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s1/DuelWindow.OZJ
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s1/Menu03_new.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s1/Quest1.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s1/Quest2.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s1/btn_pshop.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s1/btn_pshop2.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s1/menu01_new2.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s1/pet1.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s1/pet2.OZJ
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s1/win_letter.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s1/win_push.OZJ
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/buy0.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/buy1.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/buy2.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/deco4.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/leftmenubt0.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/leftmenubt1.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/menu01_new.OZJ
Binary file not shown.
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/page0.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/page1.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/page2.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/page3.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/page4.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/page5.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/return0.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/return1.OZT
Binary file not shown.
Binary file added src/bin/Data/Interface/Classic/s2/return2.OZT
Binary file not shown.
Binary file not shown.
Binary file not shown.
9 changes: 5 additions & 4 deletions src/bin/Data/Interface/RmlUi/guild_info.rml
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,11 @@
data-style-font-size="hint_line3.text_px + 'px'">{{hint_line3.text}}</span>
</div>

<!-- The tabs' hit areas: the original's 56-unit columns over the top 90 units. -->
<div class="gi-tab-hit" id="gi_tab_hit_0" data-event-mousedown="guild_info_tab(0)"></div>
<div class="gi-tab-hit" id="gi_tab_hit_1" data-event-mousedown="guild_info_tab(1)"></div>
<div class="gi-tab-hit" id="gi_tab_hit_2" data-event-mousedown="guild_info_tab(2)"></div>
<!-- The tabs' hit areas: the original's 56-unit columns over the top 90 units, only with a guild,
as the tabs themselves. -->
<div class="gi-tab-hit" id="gi_tab_hit_0" data-if="!no_guild" data-event-mousedown="guild_info_tab(0)"></div>
<div class="gi-tab-hit" id="gi_tab_hit_1" data-if="!no_guild" data-event-mousedown="guild_info_tab(1)"></div>
<div class="gi-tab-hit" id="gi_tab_hit_2" data-if="!no_guild" data-event-mousedown="guild_info_tab(2)"></div>
<!-- The header every tab shares. -->
<div class="gi-page" data-if="!no_guild">
<span id="gi_title" class="sharp-text gi-line"
Expand Down
2 changes: 1 addition & 1 deletion src/bin/Data/Interface/RmlUi/item_endurance.rml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
the theme places the column). The hovered icon's tooltip is in window pixels at the
pointer. Behind the other documents of its context (the original drew it at layer depth
3.5, under the panels). Takes no pointer events: C++ hit-tests the drawn frames and icons. -->
<div id="pets">
<div id="pets" data-class-in-party="in_party">
<div id="pet_column">
<div id="arrows_row" data-if="arrows != ''">
<span id="arrows" class="counter-scaled-xy" data-style-font-size="text_px + 'px'"
Expand Down
3 changes: 2 additions & 1 deletion src/bin/Data/Interface/RmlUi/npc_quest.rml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
</div>
<!-- The live 3D quest-condition items, drawn by C++ beside their rows over the frame. -->
<img id="nq_item" class="nq-item"/>
<span class="sharp-text" id="title" data-style-font-size="text_px + 'px'">{{npc_name}}</span>
<!-- .with-quest-title lets a theme place the name by whether the quest title shows under it. -->
<span class="sharp-text" id="title" data-class-with-quest-title="show_quest_title" data-style-font-size="text_px + 'px'">{{npc_name}}</span>
<div class="sharp-text nq-quest-title" data-class-hidden="!show_quest_title" data-style-font-size="text_px + 'px'">{{quest_title}}</div>

<div class="nq-divider" data-class-hidden="!show_conditions"></div>
Expand Down
31 changes: 31 additions & 0 deletions src/bin/Data/Interface/RmlUi/themes/classic/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Classic theme

The interface of the original 0.97 client, drawn with its own art.

- **Inherits from `legacy`** (`theme.ini`, `[Theme] Base=legacy`). Ship a window's `.rcss` (or a
`.rml` fork) here only when restyling that window; everything else, tokens included, comes
from `legacy`.
- **Art** is the original files, unconverted:
- `Data/Interface/Classic/` — the 0.97 client's `Data/Interface`;
- `Data/Interface/Classic/099b/` — classic-era files the 0.99b client adds (not in 0.97);
- `Data/Interface/Classic/s1/`, `s2/` — files of the Season 1 and Season 2 clients, which kept
the classic interface, for the parts and windows 0.97 does not have (the bar's thirds with the
command window and friend buttons' boxes and the SD column, the quest, pet and personal shop
buttons, the duel crest, the quest book, Season 1's text button, the Season 2 cash shop's
pieces);
- `Data/Logo/Classic/` — the 0.97 login box and character select art.
- **Paths** are relative to the stylesheet: from a stylesheet here, `../../../Classic/Menu01_new.jpg`
and `../../../../Logo/Classic/0box.jpg`. The engine opens `.jpg` as `.OZJ` and `.tga` as `.OZT`.
- **Sizes**: an `@spritesheet` gives each sprite its real size.
`tools/classic_theme/oz_texture_sizes.py ../../../Classic --recursive` lists them.
- **Derived textures**: where 0.97 tiles or stretches a texture over a known size, the result ships
beside the originals (`Nis_vframe_tall`, `Message_box2_268`, `Message_box2_230`); where the
original drew a texture additively (its black ground vanishing), a copy with that as alpha
(`Progress_add`, `s1/DuelWindow_add`). All built by
`tools/classic_theme/make_classic_derived_textures.py`.
- **C++**: the HUD's extra parts are bound by `UI/HUD/MainFrameExtras`.

Comments in each stylesheet name the 0.97 client function it follows (its address in `main.exe`)
and the positions in the original 640x480 frame. A window 0.97 does not have follows the Season 1
or Season 2 client when that client has it (the function's address in that client's `main.exe`),
else it takes the parts of the closest classic window.
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/* Classic theme for the guild war / battle soccer score (CBattleSoccerScore). The 0.97 client's
(004bc220): no frame, at the top of the area the open windows leave free, its x 20
left of that area's centre (the classic workspace centres the 640 frame on it, so x 300): two
rows at y 4 and 19, each the guild mark (8 x 8) at 0, the score at 13 and the name at 30, bold on
a black 50% box, red (255, 60, 0) or blue (0, 150, 255). Legacy's rules first, then the classic
ones. */

/* Legacy theme for CBattleSoccerScore, reproducing the original's RenderBackImage()/
RenderContents(): the 131 x 70 figure-ground back, then two lines from (x + 30, y + 33), 22 apart:
the score, the guild mark at + 21 (8 x 8) and the name at + 33, in the bold font on a 50% black
text box (SetBgColor(0, 0, 0, 128)), red (255, 60, 0) or blue (0, 150, 255). Reference px relative
to the window's top-left, under .screen's W/640 x H/480 stretch (see battle_soccer_score.rml). */

@spritesheet bss-back-sheet { src: "../../../newui_Figure_ground.tga"; bss-back: 0px 0px 131px 70px; }

body { pointer-events: none; }

.screen {
position: absolute;
left: 0;
top: 0;
width: 640px;
height: 480px;
transform-origin: left top;
pointer-events: none;
}

#panel { position: absolute; width: 131px; height: 70px; font-family: "token(font-body)"; }
#back { position: absolute; left: 0; top: 0; width: 131px; height: 70px; decorator: image(bss-back); }

.team { display: block; position: absolute; left: 30px; width: 100px; height: 8px; }
.team-text {
display: block;
position: absolute;
top: 0;
transform-origin: left top;
white-space: nowrap;
font-weight: bold;
color: #0096ff;
background-color: #00000080;
}
.team.red .team-text { color: #ff3c00; }
.team-score { left: 0; }
.team-name { left: 33px; }

.mark { position: absolute; left: 21px; top: 0; width: 8px; height: 8px; }
.mark-cell { display: block; float: left; width: 1px; height: 1px; }

/* RenderContents()'s own two rows. The container takes no space. */
.teams { position: static; }
.team:nth-child(1) { top: 33px; }
.team:nth-child(2) { top: 55px; }

/* The HUD takes no pointer events where it is placed (base.rcss gives a placed panel them). */
#panel.slot-placed { pointer-events: none; }

/* --- Classic ---------------------------------------------------------------------------------- */
#back { display: none; }
.team { left: 0; }
.team:nth-child(1) { top: 4px; }
.team:nth-child(2) { top: 19px; }
.mark { left: 0; }
.team-score { left: 13px; }
.team-name { left: 30px; }
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/* Classic (0.97) Blood Castle entry. 0.97: "Messenger of Archangel", the description from y 64,
and six plates 140x33 from y 170, 40 apart, tinted (0.7, 0.7, 0.9), labelled in pale blue
(190, 220, 255). MuMain: the description from y 46 to 156, its eight bands from y 160 to 388,
above the Close at 395; more content scrolls. */
.entry-lines { top: 46px; height: calc(110px * var(--root-scale)); }
.entry-buttons { top: 160px; height: calc(228px * var(--root-scale)); }
.entry-btn.enabled .entry-btn-art { image-color: #b3b3e6; }
.entry-btn.enabled .entry-label { color: rgb(190, 220, 255); }
3 changes: 3 additions & 0 deletions src/bin/Data/Interface/RmlUi/themes/classic/buff_strip.rcss
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/* Classic (0.97): no buff icons -- 0.97 showed buffs only as their effects on the character. */

#strip_slot, #panel { display: none; }
Loading