どんなModなのか
ロケーション名を画面に表示します。
これだけですとバニラと何が違うのかという話ですが、毎回表示される、効果音も毎回鳴る、という点が異なります。
フォントの設定はパスした
このModは付属のWindows Shell Scriptを用いてfontconfig.txtを修正することを要求してきます。
私の環境では弄りまくっていて、これ以上余計なものを追加したくなかったため、何が必要なのか読み解いて最小限の変更に済ませました。
必要なのはこれだけです。
map "$PopUser1" = "Pelinal" Normal
map "$PopUser2" = "Pelinal" Normal
map "$PopUser3" = "Pelinal" Normal
map "$PopUser4" = "Pelinal" Normal
map "$PopUser5" = "Pelinal" Normal
map "$VicUser1" = "Pelinal" Normal
map "$VicUser2" = "Pelinal" Normal
map "$VicUser3" = "Pelinal" Normal
map "$VicUser4" = "Pelinal" Normal
map "$VicUser5" = "Pelinal" Normal
PopUserが本当に必要な設定で、フォント名は既に導入して使っているものをそのまま使うようにしました。
5つあるのはMCMで選択できるようにするためでしょうか。どうでもよかったので全部同じにしました。
VicUserが何なのかよくわかりませんでしたが、とりあえず書いておきました。
不具合を修正した
バージョン1.0の時点で、セーブデータをロードしてゲームを再開したところ、動作しなくなったので、中身を調べてみました。
PopupLocationNames.espのForm IDがすべて、どういうわけかiWant Widgets.eslのものになっていました。よくわかりませんが、同じことをしているプラグインが複数存在するとForm IDが衝突してまずいことになるのは明白なので、SSEEditで修正しました。
SKSEのModEventをRegisterするRegisterForModEvent関数が初回稼働時だけしか実行していないので、ロードのたびに毎回処理するようにしました。
マップマーカーを優先するようにした
このModの動作原理は、Locationが変化したらLocationの名前を画面に表示する、というものです。
Locationの名前は地名というよりは地域名であり、マップに表示されるマップマーカーの名称とは異なります。
Papyrusのみでマップマーカーを検知したりするのは面倒なので、HUD側のActiveScriptに処理を追加することにしました。
このため、hudmenu.swfに手を加えることになります。
編集にはJPEXS Free Flash Decompilerを使いました。
scripts、__Packages、HUDMenuになります。
function SetLocationName(aLocation)
{
(省略)
skse.SendModEvent("LocationName",aLocation);
}
関数の最後に追加したこのskse.SendModEventが、SKSEのModEventを送信する処理になります。これをPapyrus側から取得します。
DISCOVEREDの表示を消した
新しい場所に行くと「RAT HILL MINE DISCOVERED」というようなメッセージが表示されます。これがこのModの表示とダブってしまうので、消すことにしました。
この表示はhudmenu.swfのAnimatedLetterで行っているようです。おそらくゲームエンジン内にハードコーディングされており、止めることができないため、こちらもhudmenu.swf自体に手を入れて表示させないようにします。
scripts、__Packages、AnimatedLetterになります。
function ShowQuestUpdate(aQuestName, aQuestStatus)
{
if(aQuestName.length > 0 && aQuestStatus.length > 0)
{
var _loc4_ = new TextField();
_loc4_.text = aQuestStatus + ": ";
this.QuestName = _loc4_.text + aQuestName;
}
else
{
this.QuestName = aQuestName;
}
var _loc5_ = aQuestName.split(" ").length - 1;
var _loc6_ = aQuestName.split(" ")[_loc5_];
if(_loc6_ == "DISCOVERED")
{
return undefined;
}
(省略)
}
このメッセージ自体は、クエストの開始や終了、スキルの上昇、ドラゴンソウルの獲得などでも表示されるため、区別する必要があります。
そこで、メッセージをスペースで分割して、最後の文字が “DISCOVERED” だったら処理を中断するようにしました。このDISCOVEREDという文字列自体はGameSettingsにあるようで、翻訳したりカスタマイズしている場合は、バニラに戻す必要があります。
ちなみに、デバッグには前述のskse.SendModEventを使うとPapyrusで動作を確認できます。