GearSwapでモグワードローブ整理

2022年2月のバージョンアップで待望のモグワードローブ5~8が実装されました。
モグワードローブ(以下ワードローブ)を追加で課金する前に一旦ワードローブを整理したいです。
ワードローブ内での装備の使用状況やGearSwapから使用していない装備を見つけて整理に役立てたいと思います。

GearSwapのエクスポート機能

GearSwapのエクスポート機能は現在装備中のアイテムをGearSwapで使用できる形式で出力するときによく使用しています。
このエクスポート機能にはオプションがいくつかあります。
GearSwap :: Windower Documentation

ロードされているジョブでsetsに記述されている装備を出力する
//gs export sets

すべての収納にあるアイテムを出力する
//gs export all

このエクスポート機能はgearswap/export.luaで実装されています。この辺りの機能を使って、実現できないか考えます。

closetCleaner

gearswap/libsにclosetCleanerというライブラリがあります。
jp.ffxiah.com
これがまさにGearSwapで使用していない装備を見つけるライブラリです。
しかし、使ってみたところ各ジョブのスクリプトをロードして、setsをコピーするところでスタックオーバーフローが発生しうまく動きませんでした。(動かす方法があれば教えてください!)
closetCleanerは2017年12月の更新を最後にその後アップデートはされていません。
github.com

organizer-lib

organizerはmogmasterのような収納管理アドオンです。
gearswap/libs/organizer-lib.libはGearSwapで使用している装備をorganizerで読み込める形式のファイルで出力するライブラリのようです。
gearswap/export.luaと同じようにorganizerで必要な情報(ジョブで使用する装備がマイバッグ、ワードローブのどこに格納されているか等)をファイルにエクスポートしています。

作ってみる

前置きが長くなりましたが、organizer-libを参考、改変して、ワードローブの不要な装備を見つける機能を作ってみました。
github.com

あまり賢いやり方ではないかもしれませんが、ジョブ毎に使用している装備をファイルに出力し、ワードローブ内の装備を比較していく方法にしました。

  1. GearSwapのジョブスクリプトにインクルードする(include('myexoprt')を追加)
  2. ジョブチェンジをしてsetsの装備をファイルに出力する(GearSwapを使用しているすべてのジョブで//gs myexportを実行する)
  3. 2.で出力したファイルからジョブ毎の使用装備とワードローブ内装備を比較して、使われていないアイテムを探す(//gs myexport check)

最終的にはexport/myexportフォルダにplayername_results.csvとplayername_lonely.csvが作られ、results.csvはワードローブ内装備の各ジョブでの装備の使用状況、lonely.csvはどのジョブからの参照されていない装備が出力されます。
スプレッドシートExcelから参照するとフィルタなども出来て扱いやすいかと思い、csvの形式で出力しました。

f:id:yyoshisaur:20220411000532p:plain
各ジョブの使用状況 results.csv
f:id:yyoshisaur:20220411000540p:plain
使われていない装備 lonely.csv

GearSwapで使用されている装備全てを列挙できているわけではなく、setsに設定してある装備のみが対象になります。

equip({body="BAチュニック+3"})

のように、precastやmidcastで直接記述されている装備は含まれていません。
setsに設定してある装備だけですが、不要な装備を探すことができ、GearSwapで使用している装備をジョブを横断して確認できるようになったので、ワードローブ整理をやり易くなりました。

おまけ

オーグメント比較

同名の装備でオーグメントを比較したい場合、extdata.compare_augments(goal_augs, current)が使えます。
引数のgoal_augsとcurrentには比較したいオーグメントを渡します。
ソースコード(res/extdata.lua)のコメントにもあるように
goal_augsのオーグメントがcurrentのオーグメントに含まれている場合、真を返し、goal_augsのオーグメントの項目数がcurrentのオーグメントの項目数より多い場合または、オーグメント自体の数値が異なる場合、偽を返します。

extdata = require('extdata')

item1 = {
        ["id"] = 26736, 
        ["name"] = "テルキネキャップ", 
        ["augments"] = {
            [1]="Enh. Mag. eff. dur. +10"
        }
}

item2 = {
        ["id"] = 26736, 
        ["name"] = "テルキネキャップ", 
        ["augments"] = {
            [1]="Mag. Evasion+25", 
            [2]="\"Fast Cast\"+5", 
            [3]="Enh. Mag. eff. dur. +10"
        }
}

extdata.compare_augments(item1.augments, item2.augments) -- true
extdata.compare_augments(item2.augments, item1.augments) -- false

上記の例では引数を入れ替えると真偽が変わるので、使用する際はどちらが目標とするオーグメントか注意する必要があります。
また、GearSwapも装備選択の際にcompare_augmentsを使ってオーグメントの比較が行われているので、アルスカ防具や醴泉島ギアス防具のランダムオーグメントなどで完全なオーグメントをsetsに設定しなくても意図した装備を選択してくれます。
(例えば、複数オーグメントがついていても、ファランクス効果アップの目的なら'Phalanx +5'だけ記述しておけば、装備を見つけてくれます。)