Author

Web系ソフトウェアエンジニアを志望
開発記録や個人的な技術に対する思いを綴ります

FOCUS個人開発/設計
OSArch Linux+Omarchy
STACKTypeScript・Next.js
STATUS学習中 → 就活中

FFXIVのSEでClaude Codeを通知するhooksを作ってみた

tech

5分で読めます・2373文字

プロフィール

はじめまして。光の戦士 RyoK73です。

みなさんはFinal Fantasy XIVというオンラインゲームをご存知でしょうか?

Final Fantasy XIV

2013年に新生エオルゼアとして復活し、現在まで約13年続くスクエア・エニックス提供のMMORPGです。

私は5番目の拡張パッケージ「黄金の遺産(レガシー)」リリース直前に開始し、現在はストーリーを攻略中です。
また、2027年1月には第6弾拡張パッケージ「白銀の探求者(ワンダラー)」の発売が予定されています。

details 拡張パッケージ発売変遷

発売日パッケージ名
2013年8月27日新生エオルゼア
2015年6月23日蒼天のイシュガルド
2017年6月20日紅蓮の解放者(リベレーター)
2019年7月2日漆黒の反逆者(ヴィランズ)
2021年12月7日暁月の終焉(フィナーレ)
2024年7月2日黄金の遺産(レガシー)
2027年1月予定白銀の探求者(ワンダラー)

そこで私は、FFXIVのサウンドエフェクトでClaude Code Hooksを通知するリポジトリを作成しました。

claude-code-ffxiv-hooks

本記事ではその経緯と導入方法について解説していきます。

FFXIV × Claude Codeという体験

FFXIVはストーリーや音楽、独特なゲームプレイが面白い作品です。
漆黒の反逆者からのストーリーは非常に重厚で、私がFFXIVをプレイし始めたきっかけでした。

そんなFFXIVですが、ストーリーやゲーム内システム以外にも、魅力が多くあり、その中の一つがサウンドエフェクト(SE)です。

プレイ中に幾度となく耳にするSE...お気に入りのものから、もう聞きたくない...と言ったものまで様々あります(笑)

  1. マルチプレイマッチング時にシャキーンというSEが流れることから転じて、
    マッチングを待つことがシャキ待ちと呼ばれたり...
  2. 新生エオルゼア編に登場するミンフィリアというキャラクターの
    チャット時のフォンフォンフォンというSEにはうんざりしている人も数多くいることでしょう(笑)

この素晴らしいSEを開発体験にも活用できないだろうか...

そんな思いつきから、今回このリポジトリを作成するに至りました。

導入すると、Claude Codeで開発しながら、まるでFFXIVのゲームをしているような気分になれます。
もはやhookがトリガーするのが楽しみでしょうがなくなり、開発モチベーションも爆上がりです...!

各hookとゲーム内SEの対応表

HookデフォルトSEゲーム内体験
StopNotificationログイン後の通知 (設定でオフにしてる人多いかも...)
SubagentStopGuildleve Complete新生編のギルドリーヴ完了時
NotificationLinkshell Transmissionおなじみリンクシェル着信音(ミンフィリア...)
PermissionRequestFeature UnlockedID/フライングマウント解放
PostToolUse (Bash 成功)Confirmタブ切り替え時/セリフ選択時...
PostToolUse (Bash 失敗)Errorエラー音(私もあまり聞き覚えがないです...)
PostToolUse (Edit/Write/MultiEdit)Obtain Itemアイテム取得時

課題と設計

hooks-config.json.claude/settings.jsonを再設計する

Claude Codeは今やエンジニアだけのものではありません。
コードに触れていない人だって利用しています。

しかし、今回のようにサウンドを好きなゲームのものに設定して...とするのは煩雑です。
また、変更があるたびに.claude/settings.jsonを編集する必要もあります。

そこで、今回はすべての設定を行うためのhooks-config.jsonというファイルを用意し、.claude/settings.jsonhooks-config.jsonを参照するだけという構成にしました。

利用する際に.claude/settings.jsonを編集する必要はありません。

  • 再生ソフト
  • 通知音量
  • hookEvent
  • サウンドエフェクトファイル
  • 有効・無効

これらがhooks-config.jsonを編集するだけで即座に通知に反映されます。


スコープ設計と実行権限

Claude Codeは起動ディレクトリを信頼境界としてコマンドを実行します。
そのため、起動ディレクトリより上位のパスにあるファイルを実行できませんでした

そこで、Claude Codeの起動スコープごとに動作フローを分岐させています。

install.sh --local (ref)の場合

  1. (ref)/.claude/settings.jsonを生成します。

  2. Claude Code起動時、settings.jsonからclaude-code-ffxiv-hooks/scripts/play.shを実行しようとします。
    ただし、先述のとおりClaude Codeは起動ディレクトリより上位を参照できないため..play.shを実行することができませんでした。

  3. そのため、

ref
└── .claude/
├── play.sh
├── play_bash_result.sh
├── settings.json
├── settings.local.json
└── settings_backups/
└── settings.*.json(バックアップ5件)

と実行ファイルも同時にコピーする設計にしました。

ref/.claude/play.shからclaude-code-ffxiv-hooks/hooks-config.jsonを参照することは問題なく可能です。
あくまでClaude Codeの実行権限への回避設計となります。

install.sh --globalの場合

  1. $HOME/.claude/settings.jsonを生成します。
  2. Claude Code起動時は、$HOME権限でclaude-code-ffxiv-hooks/scripts/play.shを実行します。
    ここでは、$HOMEより下位のディレクトリを参照するため、実行ファイルをコピーすることはありません。

スクエア・エニックス コンテンツポリシー

本リポジトリでは、Final Fantasy XIV Fan Kitのスマートフォン向け着信音を使用し通知しています。

今回利用させていただく/sounds/ffxiv_sounds/ に含まれるサウンドエフェクトは SQUARE ENIX CO., LTD. の著作物です。MITライセンスの適用範囲外となります。

© SQUARE ENIX

ご利用の際はファイナルファンタジーXIV 著作物利用ルールを必ずご確認ください。
非営利・個人利用の範囲内でのみご使用いただけます。商用・営利目的での利用は禁止されています。

そのため、リポジトリ内にはSEファイル自体は含めず、利用する際に直接Fan Kitからダウンロードする形を採用しています。

最後に

ヒカセンであってもなくても、気になった方はぜひリポジトリを覗いてみてください!