マクロ×KittyCombo

 ヒコ日誌

マクロ解析

コチラの記事で武器熟練度上げのマクロが紹介されています。
正直言うとマクロが1行で書かれていると何が書いてあるのかさっぱり解りません。(仕方ないだろ)
なのでChat GPT(チャッピー)に依頼して改行してもらいます。

/run
local RepDura,RepAmmo,RepTool=20,"Runic Thorn","Simple Repair Hammer"

function RepMacro(RepairDura,AmmoName)

    if RepAmmo~="" and RepAmmo~=nil then
        local _,_,amm = GetInventoryItemDurable("player", 9)
        if not amm then
            UseItemByName(AmmoName)
            DEFAULT_CHAT_FRAME:AddMessage("補充しました> "..AmmoName)
        end
    end

    local tg={10,15,16}

    for _,WeaponID in pairs(tg) do
        local dura, duraM, nm = GetInventoryItemDurable("player", WeaponID)

        if nm and dura<RepairDura then
            UseItemByName(RepTool)
            PickupEquipmentItem(WeaponID)
            DEFAULT_CHAT_FRAME:AddMessage("修理しました> "..nm)
            return
        end
    end

end

RepMacro(RepDura,RepAmmo)
Kitty.attack()

(あ、RepMacroって関数が書かれてたのね。ふ~ん)
とようやく解りました。
ついでにフローチャートもお願いしてみました。

              ╭───────────╮
              │    開始              │
              ╰─────┬─────╯
                    │
                    ▼
          ┌───────────────────┐
          │ RepMacroを呼び出す                   │
          └────────┬──────────┘
                   │
                   ▼
              ◇ RepAmmoあり? ◇
              ╱             ╲
           No               Yes
            │                 │
            │                 ▼
            │      ┌────────────────────┐
            │      │ スロット9の弾薬確認                    │
            │      └─────────┬──────────┘
            │                │
            │                ▼
            │         ◇ 弾薬あり? ◇
            │         ╱          ╲
            │      Yes            No
            │       │              │
            │       │              ▼
            │       │    ┌────────────────────┐
            │       │    │ UseItemByName()                        │
            │       │    │ 補充ログを表示                         │
            │       │    └────┬───────────────┘
            │       │              │
            └───┴───────┘
                       │
                       ▼
         ┌────────────────────────────┐
         │ tg={10,15,16} を順番に処理                             │
         └────────────┬───────────────┘
                      │
                      ▼
             ◇ nmあり かつ dura<閾値? ◇
                ╱                  ╲
             No                    Yes
              │                     │
              ▼                     ▼
      次のWeaponIDへ        ┌──────────────────┐
         │                  │ UseItemByName()                   │
         │                  │ PickupEquipment                   │
         │                  │ 修理ログ表示                      │
         │                  └────────┬─────────┘
         │                           │
         │                           ▼
         │                    ┌────────────┐
         │                    │   return               │
         │                    └─────┬──────┘
         │                          │
         └──────────────┐           │
                        ▼           │
                ◇ 全て確認した? ◇   │
                  ╱            ╲     │
               No              Yes   │
                │               │     │
                └───────▲───────┘     │
                        │             │
                        └─────────────┘
                              │
                              ▼
                  ┌───────────────────┐
                  │ Kitty.attack()    │
                  └────────┬──────────┘
                           │
                           ▼
                     ╭───────────╮
                     │    終了    │
                     ╰───────────╯

(頑張った方なんですが線の修正が面倒くさすぎたのでそのまま貼ってしまいます。)
ぶっちゃけ見づらいので文字でまとめてもらった。

## まとめ

このマクロは、実行するたびに次の順番で処理を行います。

1. 弾薬スロット(9番)を確認し、弾薬が装備されていなければ「Runic Thorn」を補充します。
2. 修理対象の装備を **遠隔武器(10番)→右手武器(15番)→左手武器(16番)** の順に確認します。
3. 耐久値が設定値(20)未満の装備を最初に見つけた時点で、その装備だけを「Simple Repair Hammer」で修理します。
4. 修理後は `return` により修理処理を終了するため、**1回の実行で修理されるのは最大1本だけ**です。
5. 修理の有無に関係なく、最後に `Kitty.attack()` を実行して処理を終了します。

なるほど。ありがとうチャッピー!

カスタマイズ

マクロ

(ここからは実験、練習も含めた私の勝手な考えです。)
先のマクロでは1マクロ内で判定→修理を装備4か所行っています。
マクロ実行の度に4点参照しに行く動きがなんとなく嫌だったので、マクロをもう少しシンプルにしたいと思い分解することにします。
具体的には
・矢の補充を除外(Sやってないんです、サーセン)
・複数装備を指定せず単体で固定してしまう
・判定部分を除外し、修理マクロとして独立(ポチっと押したら修理)
これを目指しチャッピーを調教して作ってもらいました。

/run
local RepTool="Simple Repair Hammer"

function RepMacro()
    local dura,duraM,nm=GetInventoryItemDurable("player",15)

    if nm then
        UseItemByName(RepTool)
        PickupEquipmentItem(15)
        DEFAULT_CHAT_FRAME:AddMessage("右手修理しました> "..nm)
    end
end

RepMacro()
Kitty.attack()

だいぶスッキリしたと思います。
「dura,duraMは必要なのか?」と思いましたがGetInventoryItemDurableの戻り値が3つなので定義が必要だそうです。
そのまま貼れるように改行無し版も残しておきます。

JavaScript
/run local RepTool="Simple Repair Hammer" function RepMacro() local dura,duraM,nm=GetInventoryItemDurable("player",15) if nm then UseItemByName(RepTool) PickupEquipmentItem(15) DEFAULT_CHAT_FRAME:AddMessage("右手修理しました> "..nm) end end RepMacro() Kitty.attack()

ゲーム画面だとこんな感じ。マクロ名は適当。(左手用=16、修理コメントも修正)

マクロを押す→右手を修理。マクロを押す→左手を修理。
2種類用意はしましたが用途が熟練度上げ用マクロなので、このままでは耐久値判定が無いため意味がありません。
この先はKittyComboと併せて考えていきます。

KittyCombo

まずはアドオン「KittyCombo 2.0」を導入します。(省略)
RoM(というかMys)のKittyComboの中身には日本語が思いっきり残ってましたが、
(自分はよく知りませんがMiranda氏が作った??)
CoAで再作成され使い勝手は個人的にあがったと感じています。
エクスポート/インポートの機能がありますがRoMとなんの互換性も無いのでイチから作ってください。
日本語に対応してませんが組んだことがあるならなんとかなります。
(ZipangのDiscordにバックアップがあるよ!)


Kitty Comboを起動して「+」をクリックし新規作成画面に遷移します。

新規作成初期

ここから設定したマクロをドラッグ&ドロップしてリストに登録します。
サブRを想定しているので左手も追加しています。マクロ名は人それぞれです。

行をダブルクリックして条件設定画面に遷移します。

左のプルダウンメニューから「Script」を選択すると「Edit Script」ボタンが現れるので、クリックして編集画面に遷移します。

ここに耐久値判定の条件式を設定します。
右手=15、2は閾値なのでお好みで変えてください。
書き終えたら「Done」→「Back」→「Back」→「Save」で確定させましょう。
「Save」しない限り保存されないことは覚えておきましょう。

JavaScript
local dura = GetInventoryItemDurable("player", 15)
return dura and dura < 2
### 処理内容

このコードは、**右手武器(装備スロット15)の現在の耐久値を取得し、その耐久値が2未満かどうかを判定して返します。**

* 右手武器の耐久値を取得します。
* 耐久値を取得できた場合は、「耐久値が2未満か」を判定します。

  * 2未満なら `true`
  * 2以上なら `false`
* 右手に装備がないなどで耐久値を取得できなかった場合は `nil` を返します。

つまり、このコードは**「右手武器の耐久値が2未満なら真(true)を返す」**という判定を行うためのものです。

Ch/Rなので殴る用のスキルやらを登録するとこんな感じにしてます。

あとはひたすら殴り続けて耐久値が下がるのをぼんやり待ちます。すると

修理のログが出ます。が

とんでもない量のログが流れます。ハンマーが大量消費されているわけではありません。
チャッピー曰く

### 修理ログが大量に表示される理由

このマクロでは、右手武器が装備されているかどうかだけを確認しています。

```lua
if nm then
```

そのため、右手武器が装備されている限り、マクロを実行するたびに

* 修理ハンマーを使用する
* 「右手修理しました > 武器名」を表示する

という処理が毎回行われます。

つまり、`Kitty.attack()` を含むこのマクロが連続して実行される環境では、その回数だけ修理ログも表示されます。

以前のように

```lua
if nm and dura < RepairDura then
```

としていた場合は、耐久値が設定値未満のときだけ修理とログ表示を行っていたため、ログが大量に流れることはありませんでした。

う~ん、イマイチ言ってる意味が解らない…
長々と書いてきましたが結局のところ、イジる必要性がなかったっぽい^^;
もうちょっと練れそうですがここらで一旦終了します。

まとめ

チャッピー賢くない?
結果的に試みた事は無駄に終わりましたが、Kittyやマクロの仕様を色々と知れて面白かったと思います。
kitty Comboはやれること多くなってそうなのでまだまだ記事が書けるかもしれませんね。(書くとは言っていない)

コメント

  1. !?マクロ分解されてた笑
    面白記事ありがとう!!
    今思えば矢(投擲)の補充は別マクロとして分けた方が分かりやすかったですよね。

    複数処理させる&指定したいものを先頭に書くための関数化なので、
    もし1部位だけで書く、パラメータも固定となるなら関数化も不要になって、
    もっとわかりやすい書き方にできると思います。
    あとスロットに装備がない場合でもnil(値なし)ではなく””(空文字)として返ってしまう昔からのバカな仕様があったり。
    PickupEquipmentItem関数で一時的に武器が外れてしまうとか、元々の使用されている関数の動作を理解している必要があります。