Funscriptの作り方

Funscriptとは

公式仕様(英語):https://godoc.org/github.com/funjack/launchcontrol/protocol/funscript

funjackによって、Fleshlight Launchのために設計されたスクリプト。
拡張子は「.funscript」。

作成方法

専用エディタ(TorpFunscriptGeneratorなど)を利用するとよい。

仕様

概要

JSON形式で記述される。

{
	"version": "1.0",
	"inverted": false,
	"range": 90,
	"actions": [
		{"pos": 0, "at": 100},
		{"pos": 100, "at": 500},
		...
	]
}
項目名説明必須デフォルト値備考
versionfunscriptのバージョン“1.0”
inverted位置を反転させるかどうかfalsetrue または false
range可動域90パーセント値
actions
pos指定位置パーセント値
at指定位置にいる時間ミリ秒(秒数×1000)

詳細

CSVとの主な違いは、速度の指定がないことである。
Funscriptは「この時間にはこの位置に居てほしい」という内容なので、
移動速度は連動プレイヤーが計算して、自動的に決定される。

指定位置は0以上100以下の整数。0が手前、100が奥。

時間はミリ秒の整数。秒数を1000倍した数字を記述する。

実装

ここからは上級者向けの情報です。
https://godoc.org/github.com/funjack/launchcontrol/protocol/funscript
の日本語訳です。

可動域

実装は、スクリプトで指定された可動域を上書きする。

最大値(max)、最小値(min)を定義したとき、以下を満たす必要がある。

(max - min) == range
(max - min) <= 90

デフォルト値:max = 95, min= 5
これは、ファームウェアのリバースエンジニアリングによって得られた値であり、96以上、4以下の値で安全に使用できるかは明らかになっていない。安全第一。

速度決定アルゴリズム

仕様の通り、プレイヤーはFunscriptから与えられた時間と位置をもとに速度を計算する必要がある。
速度決定には”Magic Launch Formula”(Formula=「公式」)が使用される。

Speed = 25000 * (Duration * 90/Distance)^(-1.05)

Speed: Launchに送信する速度
Duration: 1回の動作にかける時間の長さ(ミリ秒)
Distance: 移動量(位置の変位)(1~100)

Speedは常に20~80の範囲内である必要がある。
これより遅いとLaunchがクラッシュし、これより速いとノイズや故障の原因になる可能性がある。

移動アルゴリズム

スクリプトは、invertedtrueでない限り、時間0で最下部(min)に位置し、その後最上部(max)から開始する。
これは最初のアクションの前に実行されるものであり、暗黙の了解であるが、必ずしもスクリプトのアクションリストに入れる必要はない。

各アクションにおいて、

  • 位置(pos)が直前のアクションと同じ場合は移動しない
    ※このアクションを完全に無視するのではなく、次のアクションでは「直前のアクション」として引き続き使用する。
  • invertedtrueの場合は、位置(pos)を反転する
    (0→100, 25→75, 70→30)
  • rangeを掛けて位置(pos)をスケーリング(拡大縮小)する
min=0,  range=50 and pos=75 : 50*75%+0  = 37
min=10, range=90 and pos=80 : 90*80%+10 = 72+10=82
min=20, range=80 and pos=30 : 80*30%+20 = 24+20=44
  • 直前のアクションからの経過時間(duration)と移動量(distance)を算出する
    これらを利用して速度を求める
(例:rangeが100%のとき)
{"pos": 25, "at": 100}, {"pos": 100, "at": 500}

duration= 500-100 = 400
distance = (100-25)*100% = 75

直前のアクションで指定された時間に、これらの位置、速度を送信する。

Funscriptは指定時間には指定位置へすでに移動完了しているように動く。
つまり、実際にposに向かって動き始めるのは、1つ前のアクションの時間である。

CSVのように動き始める時間だけ記述すると、前の動作が終わった直後から動き始めてしまうため、1つ前のアクションとの間隔が大きい場合にとてもゆっくり動いてしまう。

Funscriptは「前の行と位置が同じ場合は動かない」という仕様であるため、
位置は同じで、停止が終わる(=動き始める)時間を記述すれば、その時間から次の行の動作が始まるようにできる。

制約

Launchは明らかに速度に制約がある。
不可能な動きは2種類ある。

  • 速すぎる動き
    (=Funscriptが短い時間(duration)内に大きい動き(distance)を要求した場合)
    Funscriptが要求するよりもストロークが短くなってしまう
  • 遅すぎる動き
    (=Funscriptが小さな動き(distance)を長い時間(duration)内に要求した場合)
    Funscriptが要求するよりも早く動作が完了してしまう

Funscriptは相対移動をベースとしているため、スクリプトの一部が同期から外れるとこがある。
範囲を制限すると高速移動が可能になるが、低速移動が不可能になるかもしれない。

Launchcontrol(このドキュメントがあるプロジェクト)はLaunchへの送信間隔に100msecのしきい値を設けているため、これより頻繁に送信しようとした場合、その部分は同期されない。

コメント

タイトルとURLをコピーしました