Mote-libsを使ってみる その1

Mote-libsはGearSwapのライブラリです。
GearSwapに付属しています。
魔法やウェポンスキル、アビリティで着替える装備を命名規則に沿ってsetsの中に設定しておくと、precastやmidcast、aftercastを記述しなくても、適切な装備を選択して着替えを行ってくれます。
また、モードの設定することで使用する装備を切り換えることが簡単にできます。

Mote-libsの存在は知っていましたが、GearSwapを使い始めた時はGearSwapがどういったものかもあまり理解できていなかったので、
まず素のGearSwapを使って、不満があればMote-libsのようなライブラリを使ってみようと思っていました。

色々なジョブでGearSwapのスクリプトを作ってみましたが、
私の使用用途では素のGearSwapでも十分でした。(FF11標準のマクロや装備セットの不足を解決する目的)
ただ、最初の方に作ったスクリプトはぐちゃぐちゃな感じがあり、GearSwapの要領はなんとなく分かったので、Mote-libsを使って少しずつ作り直してみようと思っています。

(Sel-libs"GearSwap/libs at master · Selindrile/GearSwap · GitHub"の方が高機能で主流かもしれませんが、最初はMote-libsを使用してみます。)

今回は、Mote-libsを使うにあたって、調べたことをまとめておきます。

set_language('japanese')に対応

GearSwapを日本語で使用する場合はset_language('japanese')を実行しますが、Mote-libsと併用するとうまく動作しない部分が出てきます。
まず、set_language('japanese')を実行しても動作するようにMote-libsを変更しました。

変更点

  • 装備セット名に日本語が使用できるように、Mote-Mapping.luaやspell.englishとなっている部分を日本語化
  • set_language('japanese')を設定することで、英語名から日本語名に換わる部分を修正(buffactiveやplayer.main_jobなど)
  • Mote-Utility.luaなど英語名でハードコーディングされている部分を日本語化

本家(
GitHub - Kinematics/Mote-libs: Mote-* library files for GearSwap
)からforkして使用しています。

日本語に対応したMote-libs(jpというブランチにあります。すべての動作を確認できていないため、動かないところ、おかしいところがあるかもしれません。)
GitHub - yyoshisaur/Mote-libs at jp

日本語でできること

装備セット名に日本語が使用できる

sets.midcast['エンダークII'] = {} -- エンダークIIで使用される装備

※SellMapsのグルーピングは英語名のままにしています。

sets.midcast.Endark = {} -- エンダーク、 エンダークIIで使用される装備

バフ名に日本語が使用できる

state.Buff['ラストリゾート'] = buffactive['ラストリゾート'] or false
state.Buff['ダークシール'] = buffactive['ダークシール'] or false
state.Buff['ネザーヴォイド'] = buffactive['ネザーヴォイド'] or false

state.Buffはbuffactiveだけでなくprecast, aftercastで該当するアクションの実行も監視しているので、バフの有無の反映が早いです。

ユーティリティ

Mote-Utility.luaの一部機能やMote-TreasureHunter.luaをset_language('japanese')の環境で使用できるようにしました。

その他

set_language('japanese')とInclude('Mote-Include')の実行順番?

Windowerの日本語フォーラムにあった話題でset_language('japanese')をInclude('Mote-Include.lua')の前に実行すると、GearSwapが動作しなくなる問題があります。
gearswap スレその2 - 1547009802 - したらば掲示板 38番
gearswap スレその2 - 1547009802 - したらば掲示板 44番
set_language('japanese')を先に実行すると、その後のInclude('Mote-Include.lua')内でファイルのパスに日本語が入り、日本語が入ったパスを読み込んだ際に応答がなくなるので、
解決策として先にInclude('Mote-Include.lua')をすると良いようです。

今回、日本語に対応するにあたって、同じ問題が発生したので対処方法の1つを残しておきます。

原因?

ファイルのパスに日本語が入る部分は、Mote-Include.lua

load_sidecar(player.main_job)

で、set_language('japanese')を実行している場合、player.main_jobは日本語になります。
load_sidecar()->optional_include()->gearswap.pathserch()と実行されていき、gearswap.pathserch内の
windower.dir_exists()で応答がなくなります。
windower.dir_existsやwindower.file_existsは引数のパス名に日本語が入っていると応答がなくなるようです。
例えば、windower.dir_exists('あああ')などを実行すると処理が帰ってこなくなります。windower.dir_exists('aaa')であれば、存在しない場合はfalseが帰ってきます。

対処
load_sidecar(gearswap.res.jobs[player.main_job_id].ens)

set_language('japanese')の環境でも英語名を指定するようにしました。
sidercarファイルの命名規則は、英語名なので問題はないと思います。
set_language('japanese')を先に実行しても動作するようになります。(処理的にはどちらを先に実行しても問題ないと思います。)

次回

長くなってしまたので、Mote-libsの使い方などについては次回にしたいと思います。