; ============================================================ ; MultiFollow Controller (複数グループ対応版) ; multifollow.lua と組み合わせて使う、ポチポチ操作用のGUIパネル。 ; ゲーム画面には一切触れないので、クリックがゲームに突き抜ける心配はない。 ; ; 動作環境: AutoHotkey v1.1系 (v2では動きません) ; ; 使い方: ; 1. あらかじめ C:\FFXI_MultiFollow\ フォルダを作成しておく ; 2. 各キャラで multifollow.lua を一度ロードすると、 ; このフォルダの roster.txt に自動でキャラ名が登録される ; 3. このスクリプトを実行(常駐) ; 4. 「名簿を再読込」でキャラ一覧を読み込む ; 5. 各キャラの行で「追従先」を選ぶ((なし)=自由行動=リーダー扱い) ; 複数グループを同時に組める(例: B,C→A / E,F→D を同時設定) ; 6. 「反映」または「追従 ON/OFF」ボタンで一括切替(ワンボタン操作) ; ============================================================ #SingleInstance, Force #Persistent ControlFile := "C:\FFXI_MultiFollow\control.txt" RosterFile := "C:\FFXI_MultiFollow\roster.txt" MaxSlots := 8 Seq := 0 StateOn := false SlotNames := [] Gui, Add, Text, x10 y10, 各キャラの追従先を選んでください((なし)=自由行動): Gui, Add, Button, x10 y+8 gReloadRoster, 名簿を再読込 Loop, %MaxSlots% { Gui, Add, Text, x10 y+10 w110 vNAME%A_Index% Hidden, Gui, Add, DropDownList, x+10 yp-3 w180 vLEADER%A_Index% Hidden, } Gui, Add, Button, x10 y+20 w100 gApply, 反映 Gui, Add, Button, x+10 w100 gToggleState vStateBtn, 追従 OFF Gui, Add, Text, x10 y+15 w340 vStatusText, 状態: 未反映 Gui, Show,, MultiFollow Controller GoSub, ReloadRoster return ; ------------------------------------------------------------ ReloadRoster: NewNames := [] if FileExist(RosterFile) { Loop, Read, %RosterFile% { line := Trim(A_LoopReadLine) if (line = "") continue dup := false for i, n in NewNames if (n = line) dup := true if (!dup) NewNames.Push(line) } } SlotNames := NewNames Loop, %MaxSlots% { idx := A_Index if (idx <= SlotNames.Length()) { GuiControl, Text, NAME%idx%, % SlotNames[idx] GuiControl, Show, NAME%idx% ; 追従先の選択肢 = (なし) + 自分以外の全キャラ ddl := "(なし)|" for i, n in SlotNames if (n != SlotNames[idx]) ddl .= n . "|" GuiControl,, LEADER%idx%, %ddl% GuiControl, Choose, LEADER%idx%, 1 GuiControl, Show, LEADER%idx% } else { GuiControl, Hide, NAME%idx% GuiControl, Hide, LEADER%idx% } } GuiControl,, StatusText, % "名簿を読み込みました(" SlotNames.Length() "人)" return ; ------------------------------------------------------------ ; 各行の選択から "フォロワー名=リーダー名,..." のCSVを作る((なし)の行は含めない) BuildFollowMap(ByRef FollowMap) { global MaxSlots, SlotNames FollowMap := "" Loop, %MaxSlots% { idx := A_Index if (idx > SlotNames.Length()) continue sel := LEADER%idx% if (sel != "" && sel != "(なし)") FollowMap .= (FollowMap = "" ? "" : ",") . SlotNames[idx] . "=" . sel } } WriteControlFile(FollowMap) { global ControlFile, Seq, StateOn FileDelete, %ControlFile% FileAppend, % "SEQ:" Seq "`n", %ControlFile% FileAppend, % "FOLLOW:" FollowMap "`n", %ControlFile% FileAppend, % "STATE:" (StateOn ? "ON" : "OFF") "`n", %ControlFile% } ; ------------------------------------------------------------ Apply: Gui, Submit, NoHide Seq += 1 BuildFollowMap(FollowMap) WriteControlFile(FollowMap) GuiControl,, StatusText, % "反映しました(" FollowMap ")" return ; ------------------------------------------------------------ ToggleState: Gui, Submit, NoHide StateOn := !StateOn Seq += 1 BuildFollowMap(FollowMap) WriteControlFile(FollowMap) GuiControl,, StateBtn, % StateOn ? "追従 ON" : "追従 OFF" GuiControl,, StatusText, % "状態を切り替えました: " (StateOn ? "ON" : "OFF") return ; ------------------------------------------------------------ GuiClose: ExitApp