UIのカスタムについて

UIのカスタム時は必ず編集開始前のバックアップを取り、UserInterfaceフォルダに新しい名前のフォルダを作ってそこで作業するようにすると吉。
以下の記事は3D(EC)クライアント patch 4.0.19.1 時のUIを参考にしています

DDS画像を閲覧・保存する

カスタムUIで取り扱う画像形式は、DirectDraw Surface(DDS)。
特にプラグインなどの設定をしなくてもこの形式を読み書きできる画像編集ソフト、Paint.net を使うと手軽。

DDSファイルの保存

メニューのファイル→保存を選択、出た窓のファイルの種類で「DirectDrow サーフェイス(DDS)(*.dds)」を選択、保存ボタンをクリック、
「構成の保存」という窓が出るので、圧縮やオプションを設定する。
ドロップダウンボックスから公式マニュアル指定の「DXT3(明示的アルファ)」を選択、あとの設定はデフォルトのままでおk。(追加オプションは両方オフ)

編集時の注意: DXT3(DXTC)は不可逆圧縮されるので、画像編集時のデータ保存はPNGなどの可逆圧縮形式を使っておいたほうがいいよ!

編集時の注意その2: 自作のTextureファイルを作成する場合、DXT3(DXTC)だと画像の縦横の長さが4の倍数でないといけないという決まりがあるらしい。
64×64や256×256、512×64など、縦も横もそれぞれ4で割り切れる数値で。
・・・などという制限があるのだけど、Paint.netだと4の倍数で作らなくても警告も出ず保存できてしまうので、SAクライアント上でうまく表示されない場合、ここらへんの確認も。

UIに含まれるファイルについて

さぁ、始めよう - Ultima Online SA Client UI Manual」に書いてあるようなこと。すっ飛ばしてもらってかまいません。

3Dクライアントのユーザーインターフェイスは、未設定時やデフォルト設定時には Ultima Online Stygian Abyss\UserInterface\Default.zip の中身と同じものが使われる。
デフォルトUIを元に新しいカスタムUIを作る時は、これを解凍して改造していくことになる。
以下はUIの仕様メモ。

  • Ultima Online Stygian Abyss\UserInterface フォルダ内に作った(又はコピーした)フォルダの名前が、ゲーム中で選択するUIセットの名前になる
  • カスタムUIでは、デフォルトのUIに含まれる全ての要素を含める必要はない。カスタムUIのフォルダに含まれていない必要UIファイルはデフォルトのものが使われることになる

ユーザーインターフェイスを構成するファイルの種類は、(把握してる限り)以下の種類になるます。

  • XMLファイル
  • Luaファイル(スクリプト。XMLが参照する関数が書かれている)
  • DDS画像ファイル(Icon,Texture)
  • フォント(デフォルトでは中身入っていないけど、カスタムUIに含めることができる)
  • modファイル(UI Moduleのファイル。インターフェイスにに新たな機能を付加したい時とかにつくるもの、らしい。あとで別に説明)

XMLファイルは、UIの構成が書かれてるっぽい。各ウインドウのどの位置に何を描画するかとか、このUIには何が含まれているかとか。
Luaファイルは各インターフェイスの部品の具体的な振る舞いが記述されていて、XMLファイルから参照される
DDS画像ファイルとフォントはXMLファイル内でアセット(Assets。資産みたいな意味らしい)として登録して呼び出させる。

基本的にUIに含まれている全てのXMLファイルは、 Interface.xml と InterfaceCore.xml からインクルードされ、まとまったひとつのファイルのように処理されるみたい。
ユーザーインターフェイスでは、この2つのXMLから呼び出されるファイル(また、それらから呼び出される一連のXMLファイル)に記述されていないファイルは基本的に使用できない。
(UI中のフォントフォルダにフォントを入れただけではクライアントから認識されない)

例外がmod(UI Module)で、これはカスタムUIフォルダ内に放り込めば、Interface.xml と InterfaceCore.xmlから連なるファイル群に記述されていなくても
認識されるらしい。なので、デフォルトの機能を改変したのではない新しい独立した機能をつけるのに都合がよいようだ。しかしよくわかっていない。

フォントの変更

各ウインドウに表示されるいろいろな文字のフォントを変えたい場合、

  1. その文字を表示しているウインドウのXMLファイルを探して、中からその部分のLabel要素を特定する
  2. デフォルトに無いフォントを指定したい場合、Fontsフォルダにそのフォントをコピーし、同フォルダ内のFonts.xml に、アセットとして記述する
  3. 1で特定したLabel要素内の「font="~」を、変えたいフォントのnameに書き換える

と言う手順になる。(FontsフォルダとFonts.xml が無い場合は、Default.zip からコピーを。)

すでにフォントが含まれているカスタムUIで、もうこの種類のフォントで表示してるところ全部変っちゃってもいいわ!って時は、Fontsフォルダに使いたいフォントを入れて、
Fonts.xml ですでに記述されているフォントのファイル名だけ変えてしまう。何処で使っているのか把握していないと、えらいところまで変わってしまうかもしれない諸刃の剣。

デフォルトUIで使われているフォント

4.0.20.2 で確認)

Fonts.xmlには記述されていない、クライアントに組み込まれているフォント。
デフォルトUIのSourceから抽出してみた。左がname 、
右はChannelWindow の現在のチャンネル部分のLabelに指定されたフォントを置き換えてみた画像。
フォントを置き換えたい場合、以下のものにname を置き換えれば、特にFonts.xmlにフォントを足さなくても字面を変えることができる。(大きさと太さくらいしかあまり違いが無いけど)

UO_CondensedText_15pt UO_CondensedText_15pt
UO_DefaultText UO_DefaultText
UO_DefaultText_15pt
(日本語は含まれていないよう)
UO_DefaultText_15pt
UO_Default_Outline_Text UO_Default_Outline_Text
UO_GoldButtonText UO_GoldButtonText
UO_NeueText UO_NeueText
UO_NeueText_18pt UO_NeueText_18pt
UO_Overhead_Chat UO_Overhead_Chat
UO_Overhead_Name UO_Overhead_Name
UO_Subtitle UO_Subtitle
UO_Subtitle_large UO_Subtitle_large
UO_Title UO_Title
UO_Title_Large UO_Title_Large

これらのフォントのnameで別のフォントファイルを指定することはできないようだった。

マクロ作成時のアイコン選択窓を拡張する(MacroPickerWindow)

デフォルトUIとそれに準拠したユーザー製カスタムUIで、マクロのアイコン選択窓をやや広くする改造。

MacroPickerWindow

MacroPickerWindow.xml の編集

Source\MacroPickerWindow.xml をテキストエディタなどで開き、以下の部分を変更する

  • デフォルトUIだと17行目あたり。<Window name="MacroPickerWindowTemplate"~

    1. <Window name="MacroPickerWindowTemplate" movable="false" layer="popup">
    2.     <Size>
    3.         <AbsPoint x="230" y="200" />
    4.     </Size>

    この<Size>~</Size>の数値を以下に変更

    1. <Size>
    2.     <AbsPoint x="318" y="300" />
    3. </Size>
  • 47行目付近。<ScrollWindow name="$parentView"~/

    1. <ScrollWindow name="$parentView" childscrollwindow="$parentScrollChild" scrollbar="$parentScrollbar" lineheight="60"  draganddrop="true" autoHideScrollBar="true">
    2.     <Size>
    3.         <AbsPoint x="215" y="192" />
    4.     </Size>

    この<Size>~</Size>の数値を以下に変更

    1.     <Size>
    2.         <AbsPoint x="310" y="292" />
    3.     </Size>
  • 62行目付近。<Window name ="$parentScrollChild" >

    1. <Window name ="$parentScrollChild" >
    2.     <Size>
    3.         <AbsPoint x="200" y="0"/>
    4.     </Size>
    5.  

    この<Size>~</Size>の数値を以下に変更

    1.     <Size>
    2.         <AbsPoint x="300" y="0" />
    3.     </Size>

以上3箇所でxmlファイルの修正は終わり。次はluaファイルを少々変更。

MacroPickerWindow.lua の編集

Source\MacroPickerWindow.lua をテキストエディタなどで開き、以下の1箇所を変更

  • 11行目付近。MacroPickerWindow.numMacrosPerRow ~の部分

    1. MacroPickerWindow.numMacrosPerRow = 4

    この最後の数値を4から6に変更する

    1. MacroPickerWindow.numMacrosPerRow = 6

この数値がアイコンの横に並ぶ数。
もっと横並びを増やしたい場合は、それに合わせてxmlファイルの変更する数値を再計算、数によってはマクロ編集窓の閉じるボタンに被ってしまうので
アイコン選択窓の出る位置を変更しないといけなくなるのだけど、そこは調べていない。


Pinco's UI のカスタマイズ

機能満載のPinco's UI
ちょっとした変更と文字化けの修正。

Pinco'sUI はフォルダの名称を変更すると一部機能が呼び出せなくなってしまうので、コピーし名称変更したフォルダの中身を編集して使用をするということはしづらいです。
バックアップしたフォルダの方の名前を変えるようにすると良し。
アップデート用のexeを起動する際は、バックアップの方の変更を加えていないフォルダの名前を戻してアップデートするんだ!
(自分の場合、アップデート前に更にバックアップフォルダをコピーして、アップデート後のフォルダとの差異を確認してます)

文字化けを修正

(この項目はすべて Pinco's UI 5.1a1 時の記述)

スペルブック、キャラクター特性、Container Search の日本語が含まれていないフォントで日本語を表示しようとしている文字化けを修正する
置き換えるフォントは好きなのでおk。以下はクライアントに内蔵されてるフォントを指定しています

スペルブックの文字化け(spellbook.xml)

Source\spellbook.xml 109行目、Label name="$parentDesc" に指定されたフォントを変更。

  1.                 <Label name="$parentDesc" font="font_verdana_bold" linespacing="20" maxchars="64" textalign="left" autoresize="true" handleinput="false">

font="font_verdana_bold" 部分を UO_GoldButtonText あたりの太字フォントに変更

  1.                 <Label name="$parentDesc" font="UO_GoldButtonText" linespacing="20" maxchars="64" textalign="left" autoresize="true" handleinput="false">

キャラクター特性の文字化け(CharacterAbilities.xml)

ペーパードールから開くキャラクター特性窓の文字化け解消
Source\CharacterAbilities.xml の以下の語句を全て変更する。何箇所かあるので、エディタの置換機能でまとめて置換してしまう。

  • font="font_verdana_bold"

    font="UO_GoldButtonText"

  • font="font_verdana_shadow_med"

    font="UO_DefaultText"

Container Search の文字化け (ContainerSearch.xml)

Pinco's UI 5.1からついた機能。コンテナ内のアイテム検索窓
Mods\Container Search\ContainerSearch.xml の 36行目

  1.                 <Label name="$parentName" font="font_verdana_bold_shadow_small" maxchars="64" textalign="left" draganddrop="true" wordwrap="true">

以下のように変更

  1.                 <Label name="$parentName" font="UO_DefaultText" maxchars="64" textalign="left" draganddrop="true" wordwrap="true">

画像を圧縮する

Pinco's UI 5.0c に入っているDDS画像ファイルは、すべて(?)DXTC圧縮がされていないようです。
DXT3のDDSで保存しなおすと、ファイルサイズが大体1/3~1/4くらいになります。
でもファイルの数がいっぱいすぎ。どれくらい負荷が軽減されるかも謎。適当に大きいファイルだけ保存しなおすのも手。
いつも使う画像を大体圧縮したら、うちのPCだとUIリロード時に固まる時間が明らかに減ったよ。

Iconsフォルダ

このフォルダの画像は全て64×64ピクセルの大きさなので、そのまま保存しなおせばおk。
Paint.netで保存しなおす場合、DDSの構成の保存でDXT3を一度選択しファイルを保存しておけば次も設定がそのままでてくるので、
複数のIconファイルをドロップする → ctrl+s でセーブ → Enter → ctrl+w で保存済みのファイルを閉じる、を繰り返す。
でもいっぺんにやると手が
(自分の場合、スペルアイコンは2Dクライアントと同じがいいな等の理由で、一部BitterBlack_SAのアイコンファイルと差し替えた)

texturesフォルダ

このフォルダの中身はそのまま保存しなおしても3Dクライアントで読めないのが多い。縦横のサイズが4の倍数になっていないものが混在してるので
DDSのDXT3で保存しなおす場合、4の倍数になるようにサイズを増やしてやる必要があります。
textureファイルの場合、XMLから呼び出す際に、画像ファイル中の開始座標と使用するサイズも指定しているので、右下に空白部分が足されても問題なし。

modsフォルダ

よく使う機能のmodのなかに画像が入っていたら、保存しなおしてみるといいかも。基本的にtexturesフォルダの中身と同じ。

ホットバーに格納されたSTRや抵抗の表記から最大値を外す(HotbarSystem.lua)

(この項目はすべて Pinco's UI 5.1a1 時の記述)

デフォルトUIでは、ホットバーに格納したステイタス表示のうち、STRやDEX、INT、各種抵抗値は現在の値しか表示されていませんが、
Pinco's UI ではHPなどと同じように、現在の数値/最大値 で表示されています。これをデフォルトUIと同じように戻したい時に。

ホットバー内のステイタス表示方法変更

※下段は背景画像をBitterBlack_SA のものに差し替えてあります

  • Pinco's UI\Source\HotbarSystem.lua をテキストエディタなどで開いて665行を見ると、以下のような関数(function)が始まっていて715行まで続いてます。

    1. function HotbarSystem.UpdatePlayerStatLabel(element, id)

    この関数の下のほう、700行目からの箇所を編集します

    1.         if(statsName == "TithingPoints" or statsName == "Gold")then 
    2.             if (WindowData.PlayerStatus[statsName] >= 1000 )then
    3.                 local tithConcat = WindowData.PlayerStatus[statsName] / 1000
    4.                 tithConcat = math.floor(tithConcat)
    5.                 labelString = StringToWString(tostring(tithConcat).."K")
    6.             end 
    7.             LabelSetText(element.."Stats", labelString )
    8.         elseif (CharacterSheet.Caps[statsName]) then
    9.             local cap = CharacterSheet.Caps[statsName] + CharacterSheet.CapsBonus[statsName]
    10.             LabelSetText(element.."StatsTop", labelString  )
    11.             LabelSetText(element.."StatsBottom", StringToWString(tostring(cap)) )
    12.         else
    13.             LabelSetText(element.."Stats", labelString )
    14.         end
    15.  
    16.     end

    デフォルトUIと同じ命令に書き換えて、表示をデフォルトUIと同じにします。
    706行目から712行目までをコメントアウトし、714行目の空白行に、「LabelSetText(element.."Stats", labelString )」と付け足し。
    (luaでは「--」から行末までがコメントアウトになります)変更を加えると以下のように。

    1.         if(statsName == "TithingPoints" or statsName == "Gold")then
    2.             if (WindowData.PlayerStatus[statsName] >= 1000 )then
    3.                 local tithConcat = WindowData.PlayerStatus[statsName] / 1000
    4.                 tithConcat = math.floor(tithConcat)
    5.                 labelString = StringToWString(tostring(tithConcat).."K")
    6.             end
    7. --            LabelSetText(element.."Stats", labelString )
    8. --        elseif (CharacterSheet.Caps[statsName]) then
    9. --            local cap = CharacterSheet.Caps[statsName] + CharacterSheet.CapsBonus[statsName]
    10. --            LabelSetText(element.."StatsTop", labelString  )
    11. --            LabelSetText(element.."StatsBottom", StringToWString(tostring(cap)) )
    12. --        else
    13. --            LabelSetText(element.."Stats", labelString )
    14.         end
    15.         LabelSetText(element.."Stats", labelString )    --追加行
    16.     end

    余談: Luaのコメントアウトの方法はいくつかあるようなのだけど、UIの他の部分でも使われている方法で書いてみた。

ここまでの作業で以下のような状態になります。ちょっと底に張りつき気味。

ステイタス表示変更作業途中経過
  • 数字の書体を一部変えてみることにします。整数表示になっている部分と、分数表示の分子の部分だけ大きくする(BitterBlack_SAみたいに)
    Pinco's UIではここのフォントの指定も HotbarSystem.lua でやっちゃってるので、前の作業と同じく HotbarSystem.lua 内での作業です。
    621行目の以下の関数のあたり。

    1. function HotbarSystem.SetHotbarIcon(element, iconId)

    この関数の中の631-633行目でフォントの指定をしています。

    1.         LabelSetFont(element.."StatsTop",  "font_verdana_bold_shadow_med3", WindowUtils.FONT_DEFAULT_TEXT_LINESPACING)
    2.         LabelSetFont(element.."StatsBottom",  "font_verdana_bold_shadow_med3", WindowUtils.FONT_DEFAULT_TEXT_LINESPACING)
    3.         LabelSetFont(element.."Stats",  "font_verdana_bold_shadow_med3", WindowUtils.FONT_DEFAULT_TEXT_LINESPACING)

    631行目"StatsTop"が分数表示の分子部分、632行目"StatsBottom"が分数表示の分母部分。633行目"Stats"が整数表示の部分の指定になります。
    分子部分と整数表示部分だけ変えたいので、631行と633行のフォント指定"font_verdana_bold_shadow_med3"を他のフォントのnameに置き換えることにする。
    とりあえず"UO_DefaultText"に変更。

    1.         LabelSetFont(element.."StatsTop",  "UO_DefaultText", WindowUtils.FONT_DEFAULT_TEXT_LINESPACING)
    2.         LabelSetFont(element.."StatsBottom",  "font_verdana_bold_shadow_med3", WindowUtils.FONT_DEFAULT_TEXT_LINESPACING)
    3.         LabelSetFont(element.."Stats",  "UO_DefaultText", WindowUtils.FONT_DEFAULT_TEXT_LINESPACING)

これで最初の画像の下段の状態になりました。

最大ステータスの表示も整数表示になっちゃってここは分数表示のほうがわかりやすかったりしますが、
いつもホットバーで表示させておかなくてもいいところな気がするので、そこはペーパードールからのキャラクター窓で確認することにする

Pinco's UI に、SRMods Template で作られたUIモジュールを追加する場合

flurryさんのUIモジュールの開発テンプレート、「SRModsTemplate」で作成されたモジュールをPinco's UIに追加する場合、
SRModsTemplateのModuleRegisterがメインメニューに出力するモジュールリストの文字と、Pinco's UIで追加されているDebug Windowの文字が
重なって表示されるんですが(Pinco's UI 5.0cとSRModsTemplate1005で確認)
、それを場当たり的に何とかする方向。
ModuleRegisterのLua内で解決したかったのですが、知識が乏しすぎる為、mainmenuwindow.xmlも一部書き換えてます。

以下の記述はPinco's UI 5.2a の時のものです。(これを書いている時点の最新版は5.5なので大分前のものに)
Pinco's UI 5.2a あたりで(詳しくは未確認)メインメニューにSR_Mods独自のメニューは追加表示そのものがされなくなりました。
修正できるところまでできなかったので、思い切ってメインメニューにSR_Mods項目を表示させる部分を非常に場当たり的に削除することにしてみました。

以前のバージョンの記事の退避はこちら

メインメニューに関するところ / ModuleRegister.lua

メインメニューにSR_Mods項目を表示させようとする関数。

ModuleRegister\ModuleRegister.lua の559行から633行(SRModsTemplate1005.zip版)

  1. function mod.AddMainMenuItem( windowName, itemText )
  2.     -- メインメニューの拡張の際に使用する変数
  3.     local width, height = 0, 0
  4.     local addWidth, addHeight = 0, 0
~~~ 中略 ~~~
  1.     }
  2.     
  3.     return true
  4. end

この関数の中身だけコメントアウトしてしまう。559行の最後と632行の最後に、以下の赤字部分を書き足します

  1. function mod.AddMainMenuItem( windowName, itemText ) --[[
  2.     -- メインメニューの拡張の際に使用する変数
  3.     local width, height = 0, 0
  4.     local addWidth, addHeight = 0, 0
~~~ 中略 ~~~
  1.     }
  2.     
  3.     return true ]]
  4. end

--[[ と ]] が、複数行のコメントアウトになります。これでメインメニューに表示させようとする処理部分の修正は終わりです。
関数そのものはあるようでいて、何もしない状態に。

ゲーム内からModuleManagerを呼び出す

しかしこのままではメインメニューに表示されるはずだったModuleManager等にアクセスできないので、ゲーム内のマクロに登録して、
いつでもそれらを呼び出せるようにします。

マクロを新規作成、「Command」ひとつを組み込んで以下のScriptを記述

script WindowSetShowing("ModuleManager", true)

これでこのマクロボタンをクリックすれば、いつでもSR_ModsのModule Managerを呼び出すことができるようになりました。
(先頭にスラッシュ「/」を付けて発言窓に入力しても、この一行スクリプトを実行することができます)

  • 過去、SRMods公式からカスタムUIをダウンロードして現在も使用している場合は、メインメニュー等に登録されるはずのほかの窓も、
    同じように記述すればマクロボタンで呼び出せます
    • (例)操船ウインドウ
      script WindowSetShowing("SteeringWindow", true)
    • (例)色情報の取得
      script WindowSetShowing("ObjectColorManager", true)

Setting WindowにSR_Mod用の設定を表示/ModuleRegister.lua

(Pinco's UI 5.1a1 あたりでの変更に伴う改造。この項目は Pinco's UI 5.1a1 で確認。5.1はアップデート飛ばしてしまったのでわかりません)

Pinco's UI のsettingswindow.lua 等にあった変更で、SRModsのModuleRegisterが読み込まれず「SRModsTemplate」で作成されたモジュールが反映されなくなり、 処理が中断されたのかSettingWindowに現れないSR_Mods用の設定欄を例によって場当たり的になんとかする。

ModuleRegister\ModuleRegister.lua の134,135行目(SRModsTemplate1005.zip版)

  1. -- タブの追加
  2.     local lastSettingName = string.match( SettingsWindow.Modes.windows[SettingsWindow.Modes.NUM_MODES],"Settings(.+)Window")

135行目の最後の部分、"Settings(.+)Window&quot を現状のPinco's UIのsettingswindow.lua に合わせて"NewChatSettingsWindow" に書き換え。以下のように。

  1. -- タブの追加
  2.     local lastSettingName = string.match( SettingsWindow.Modes.windows[SettingsWindow.Modes.NUM_MODES],"NewChatSettingsWindow")

これは何をしているのかというと、「メインメニュー一番最後の項目の名前を調べて、正規検索でSettingsなんとかWindowでマッチした名称を変数lastSettingNameとしてこの関数内で扱うよ」というような部分(だと思う)に変更を加えている。
単純にマッチさせる部分をPinco's UIでの最後のメニュー項目に置き換えたのだけど、135行目の= の後は正規検索部分無しでいきなり"NewChatSettingsWindow"でもいいのかも。今試せないのだけど。(2011/12/08 追記)

とりあえずこれでSettingsWindowに「モジュール」タブが表示されたはず。おかしなところにですが。
これでSRModsTemplateを使用したモジュールの個々の機能も反映されるようになったように見える。どうだろう。
間違ってるよ!とかもっとこう変更したほうがいいよ!とかあったら是非お知らせください・・・