エンジニア的ゲーム理論

FFXIVやPCが好きなITスペシャリストの屁理屈とか

スペスペ用タイムラインからPaisleyParkのREST APIを操作する

f:id:hackermind:20191110102438p:plain

PaisleyParkはHTTPサーバを通じたREST APIでの操作が可能です。

REST API · LeonBlade/PaisleyPark Wiki · GitHub

このREST APIをタイムライン定義からコールすることでフェーズ移行等に応じた任意のマーカー配置を自動化することが可能です。シンプルにタイムラインに組み込む例を紹介します。

スペスペたいむのexec機能について

トリガーにマッチした際に任意のパスを呼び出す機能です。アプリケーションであったりスクリプトであったり、Windowsの関連付けによって操作できるものであれば特に制約なく動かせます。

ACT.Hojoring/Reference.cshtml at master · anoyetta/ACT.Hojoring · GitHub

PaisleyParkのHTTPサーバ機能の有効化

REST APIによるコントロールのリクエストを受け付けるためのHTTPサーバ機能を有効化する必要があります。

f:id:hackermind:20191110102218p:plain

  • 任意のポートを指定してStartを押すとHTTPサーバが起動します。
    • 画像の例では1337ですが、既存アプリケーションと被らなければ何でもOK
  • 右のチェックボックスにチェックを入れるとアプリケーションの起動時に自動的にHTTPサーバ機能が有効になります。

プリセット名を指定する場合

timelineフォルダ直下にscriptsフォルダを作成して、そこにスクリプトを置いています。

scripts\load_waymarks_preset.ps1
# 実行時に引数として与えられた名称のプリセットをロードする

Param( [parameter(mandatory=$true)][String] $key)
Invoke-RestMethod -Uri http://localhost:1337/preset/$key/load -Method POST

タイムラインからの呼び出し例

スクリプトのパスをexecに、引数となるプリセット名を args に指定します。リファレンスにも書いてありますが、exec 実行時の作業ディレクトリはtimelineとなります。

  <t 
    name="初期マーカー"
    sync="00:[id4]:戦闘開始まで"
    exec="scripts\load_waymarks_preset.ps1"
    args="bt4"
    exec-hidden="true" />

JSONによる任意のマーカー配置定義を使用する場合

マーカー配置を記述したJSONをPOSTすることで任意の場所にマーカーを置くこともできます。既存マーカーを動かさず特定のマーカーだけを再配置する場合なんかに便利かもしれないですが、前述のプリセット指定の方が楽だと思います。

scripts\load_waymarks_preset.ps1
# 実行時に引数として与えられたjsonファイルからペイロードを生成

Param( [parameter(mandatory=$true)][String] $file)

$uri = "http://localhost:1337/place"
$payload = ConvertFrom-Json (Get-Content (Convert-Path $file) -Encoding UTF8 -Raw) | ConvertTo-Json -Compress

Invoke-RestMethod -Uri $uri -Body $payload -Method POST -ContentType "application/json"

引数として受け取ったJSONファイルを元にPOSTリクエストで投げるワンライナーなペイロードを組み立てています。

ちなみに、全マーカーを定義した場合のJSONファイルの全体像はこんな感じになります。%APPDATA%\PaisleyPark\settings.json 内に記述された既存プリセットをベースにJSONを組み立てると楽です。

{
  "A": {
    "X": 7.056696,
    "Y": 0.0581359863,
    "Z": -7.041502,
    "ID": 0,
    "Active": true
  },
  "B": {
    "X": 7.25711632,
    "Y": 0.0581359863,
    "Z": 6.970316,
    "ID": 1,
    "Active": true
  },
  "C": {
    "X": -7.05540562,
    "Y": 0.05813694,
    "Z": 7.002947,
    "ID": 2,
    "Active": true
  },
  "D": {
    "X": -6.939519,
    "Y": 0.0581378937,
    "Z": -7.17268944,
    "ID": 3,
    "Active": true
  },
  "One": {
    "X": -0.03871727,
    "Y": -0.0500011444,
    "Z": -0.0106658936,
    "ID": 4,
    "Active": true
  },
  "Two": {
    "X": 0.0,
    "Y": 0.0,
    "Z": 0.0,
    "ID": 5,
    "Active": false
  }
}

2マーカーだけを追加で置きたい場合はこんな具合でしょうか。他のマーカーはそのままです。

{
  "Two": {
    "X": -0.03871727,
    "Y": -0.0500011444,
    "Z": -0.0106658936,
    "ID": 4,
    "Active": true
  }
}

タイムラインからの呼び出し例

スクリプトのパスをexecに、引数となるJSONファイル名を args に指定します。どちらもtimelineフォルダからの相対パスである点に注意が必要です。

  <t 
    name="初期マーカー"
    sync="00:[id4]:戦闘開始まで"
    exec="scripts\set_waymarks.ps1"
    args="scripts\bt4.json"
    exec-hidden="true" />