Darkside(リンクエラー修正しました)

2016年09月の記事

<< 前のページ

2016年9月30日(金) 21:18

なぜか失敗

 直線部分でガードビーム沿いを走るので、右重心移動でガードビームに突っ込み、左重心移動で離脱。
 ガードビームにぶつけて減速するのを4フレームに調整し、その4フレームだけブレーキを掛ける。

 そのような操作パターンを探すのは、容易に思われた。
 だが、いざやってみると解が出て来ない。どんな操作をしても、狙い通りに4フレームだけ急減速させられるパターンが出力されない。スクリプトが間違っているのか?それとも何か見落としていて、理論的に不可能な目標なのか?

 直進走行から横スライドで所定のタイミングとフレーム数だけガードビームに接触させる。これは S-JET 最適化の中でも最も簡単なのpは間違いない。それなのに、ここまで苦労するとは先が思いやられる。
 幸いにして、F-ZERO に関してはもうTASを早く完成させたいという欲求がそれほど大きくない。たっぷり時間を掛けて完成度を上げる気分になれている。既に、デスウインド2に着手して1ヶ月が過ぎた。何とか1ヶ月で完了させたいと当初は思っていたが、冗談ではんまい。それこそ生活崩壊寸前にでもならない限り、レースゲームのTASを1ヶ月で仕上げるなど不可能だ。やったとしても、思い切り最適に程遠いものしか出来ないだろう。

 少し手抜きしても1ヵ月半は確実に必要だし、本来なら2ヶ月以上は欲しい。そして、キングリーグには5つのコースがある。
 既にハード調達済みの工作ネタを途中で若干やるつもりだが、それ以外はずっとTAS製作して、年内に次のポートタウン2まで仕上がるかどうか、というスケジュール感だ。

 初代 F-ZERO では、TASで使えるテクニックの大半が人力実機で可能である。それこそ、理論的に可能なことはすべて人間が可能という世界である。理論限界と人間の限界がほぼ一致していたというのが、初代のタイムアタックが盛り上がりまくった要因の1つでもある。しかしTAS製作は、逆に盛り上がらない。どんなに頑張っても、うまい人間の域を抜け出すのは困難だからだ。
 そんな初代にあって、人間には無理でTASだけに可能なテクニックは2つしかない。1つはミュートシティーのヘアピン抜けで、もう1つが S-JET の最適化。前者はミュートシティーのみで有効なのに対し、後者は全コースで絡んで来る。

 幾ら大変であっても、そのような S-JET の最適化で手抜きするわけには行かない。

written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2016年9月29日(木) 21:28

ややこし過ぎる

 S-JET 最適化は余りに複雑なので、いきなり完成版のスクリプトを製作しようとしても意図通りに動作する可能性は低い。そこでまず、単にガードビームに沿ってインベタ走行するだけのスクリプトから始める。
 走行ラインの適正化だけを目的として製作し、動作させると危惧した通りダート上で周期引継ぎが発生。478キロを割り込んでいるのにダート上だから、速度が回復しない。

 ホームストレート最後のダート地帯は、右左右と3つ続いている。右端をイン走行すると、2つのダートを通過せえばならない。その両方において、速度回復位置がダート上にならないよう調整せねばならない。
 直進部分なので、ブレーキ掛けたいタイミングでガードビームに接触させるような走りは可能だと期待できる。しかしこれ、手動で試しに調整してみたが非常に難しい。つまり、スクリプトで自動処理できるようになるまでは、周期タイミング調整すらできない。

 先は、非常に長い。

 取り合えずスクリプトを動作させ続けると、右コーナーの前半で早くも曲がり切れなくなってしまった。

 これは S-JET で速度が上がっていることもあるが、旋回に重心移動を併用していないことも大きい。
 というのも、狙ったタイミングでガードビームに突っ込んで、狙ったタイミングでガードビームから離れるという操作を行う場合、重心移動で調節するのが簡単だからである。
 旋回に重心移動を使うと、常時重心移動している状態なので、突っ込み調整に簡単に重心移動を使えなくなる。

 しかし、重心移動抜きで旋回しようってのは、無謀だった。いや、それは想定内である。一応確認してみただけだ。このスクリプトでは、ガードビームに突っ込むのを禁止してある。
 ガードビームに突っ込まねば、曲がり切れない・・・ことを確認するのが隠れた目的。

 重心移動を併用すれば、ガードビームに突っ込まなくても曲がれるかもしれない。しかし、ガードビームとの接触具合を重心移動で調整できなくなるので、ガードビーム減速を諦めてブレーキのみによる S-JET 最適化になる。どっちが速いかは、試してみなければ分からない。
 最適化の追求は、とにかく手間が掛かる。

 減速禁止を外してスクリプトを動かすと、ガードビームに突っ込んだまま重心移動無しで曲がり切れた。
 でも考えると、、突っ込みっ放しではガードビームとの離脱具合を重心移動で調整できたところで意味がない。
 困ったものだ。

 重心移動併用で旋回し、ガードビームに突っ込まず、ブレーキだけで S-JET 最適化。
 重心移動抜きで旋回し、ガードビームに常時突っ込んで、やはりブレーキだけで S-JET 最適化。
 旋回部分では、2つに1つ。さて、どっちが速いか。ガードビームとブレーキを併用した部分的急減速による S-JET 最適化はできない。それは、直進部分のみで可能。

 速度的には、ガードビームに突っ込まない方が速い。しかし、走行距離はガードビームに突っ込んだ方が短い。

 それでも、曲がり切る操作が存在すると確認できたことは意味がある。後回しにして、まずは直進部分の最適化を始めれば良いだろう。

written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2016年9月28日(水) 21:14

S-JET 最適化

 初代 F-ZERO のスーパージェットは、複雑な仕様になっている。2年半以上経っているので、改めて説明しておこう。
 S-JET を噴射すると、一気に速度が上昇する。通常の最高速は内部メモリーの値にして 2304(16進数で0x900)だが、S-JET により+256されて 2560 になる。その後は1フレームごとに4ずつ減少し、2304 に戻ったらまた 2560 に増える。1周期は64フレームで、持続時間は255フレーム。4周期目で256フレーム目に 2304 に戻ったら、もう加速しない。

 内部メモリーに格納されている値と、画面の時速表示は比例しない。画面表示される速度は、ゲーム上の演出である。

 このような仕様であるため、速度が落ちてきた時にブレーキを掛けると速くなるのだ。
 次のサイクルに早く入ることができて、低い速度で走るフレームの割合が減少し、平均速度が上がる。
 適切なタイミングでブレーキを掛けるのは人力では至難であり、ここでTASならではのアドバンテージが発揮できる。ただし、TASであっても製作は極めて面倒だ。
 ブレーキを掛けた場合の減速は、速度2432(0x980)以上では15。それより遅いと14である。自然減速の4を睨んで、組み合わせを考えねばならない。組み合わせが悪いと、減速終了時に速度が2304を割り込んでしまい、速度ロスが生じる。

 更に、ダート上では速度が回復しない。周期の最後がダート上にならないよう調整せねばならない。

 まだある。
 ミュートシティーと異なり、デスウインドではガードビーム際で S-JET を使う。そうすると、意図的にガードビームと接触させることでブレーキ以上の減速が可能となる。ブレーキと併用することで、減速が16増える。すなわち、1フレームで31ないし30の減速。これで平均速度を更に上げられるが、実現するためのキー操作は遥かに複雑になる。

 トドメに、S-JET の後半は右コーナーリング。ここは、S-JET で速度が上がっているので曲がり切れない。ガードビームに突っ込んだまま走ると旋回性能が向上し、綺麗に曲がれる。しかし、常時ブレーキが掛かっているようなものだ。その部分では、平均速度を上げるための最適なキー操作がまた変わる。

 こんな感じでデスウインドの S-JET 最適化は、複雑に複雑を重ねたとんでもない作業である。

written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2016年9月27日(火) 21:29

直進するだけの簡単な仕事

 ダッシュプレートに乗ってしまえば、後はホームストレートを突っ走るだけ。走行ラインが少々異なっても、1周目23秒79は確定だ。マスタークラスならソニックスタートが速くなるから、これより短縮される。

 純粋に理屈で考えれば、ダッシュプレートに乗った位置からホームストレート終端の右端へと、ゆっくり斜め走行するのが最短である。しかし、F-ZERO
は非力な16ビット機で動作しており、走行角度の分解能が低い。微妙な走行角度の差が表現できない。
 だから人力では、ダッシュプレートとホームストレート終端の右端を直線で結んだ走行を行うのは無理だ。

 TASならば、自動運転スクリプトを使用して直線に近い走行が可能。
 現実には、そうやって直進しても、折れ線走行しても、タイムに有意差が出ない可能性が高い。しかし、動画を見る側からすると違う。人力では非現実的な頻繁なハンドル操作により小さな角度の斜め走行を行うというのは、人外を感じさせる効果がある。

 だが実際にスクリプトを動かすと、直線上を走ってくれない。角度が小さ過ぎて、ハンドル操作を変えても計算結果が同一になり、期待した判定結果にならないようだ。
 試走フレーム数を増やしたりあれこれ試すが駄目で、結局は目標座標を逃げ水にして解決。試走終了位置より少しだけ先の位置に目標座標を定め、走るたびに目標座標を少しずつ先に進める。目標座標は、ダッシュプレートとホームストレート終端の右端を結ぶ直線上のみに設定する。

 試走終了位置と目標座標が接近していれば、ハンドル操作による微小な位置の差が判定結果に現れ易くなる。こうして期待通りに、左右の小刻みなハンドル操作で小さな角度で直進する走行が実現。

 S-JET 噴射は、ダートの直前で行う。
 S-JET は極めて複雑であり、当然に別スクリプトで処理する。そこで、ダート直前でスクリプトを打ち切る。だが、どうやっても右ガードビームに突っ込むことになってしまう。
 調べると、試走時に S-JET を噴射させるタイミングが1フレーム早い。これを正確にダート直前まで待たねば、次のスクリプトが機能しない。

 ダートに突入したという判定は、減速の発生により可能である。しかし、ガードビームに突っ込んだ場合にも、減速が発生する。両者を区別するのが意外に厄介で、S-JET 噴射を手抜きして座標判定にしていたのだ。
 頑張って本来の判定で機能するようにスクリプトを修正する。面倒くさい。こういう細部がどれだけ面倒くさいかは、やってみなければ分からない。
 2点間を直進するだけの簡単な仕事に見えた今回のスクリプトは、大作業だった。

 ちなみになぜ S-JET 噴射が1フレーム違うだけで破滅するかと言えば、S-JET 噴射中は横風に流されないからである。実際には絶対に右ガードビームに突っ込むしかない初期状態なのに、S-JET を現実より1フレーム早く噴射してしまうと、1フレーム手前から横風が効かなくなって右ガードビームに突っ込まずに済む。
 それで大丈夫だと判定され、使い物にならない解が出て来る。

written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2016年9月26日(月) 20:57

後半半円の後半

 後半部分は、アクセルオフを含んだハンドル検索を行う。

 コーナー形状的に、中間部分でのインベタは困難だし速いわけでもない。

 クリッピングポイントから一直線にダッシュプレートを目指す。

 ここも、目標座標をどう設定するかが難問。
 ダッシュプレート座標の、真っ直ぐ先を設定する。

 ダッシュプレートの中央部分を目指すようにスクリプトを動作させ、直進安定する頃合で打ち切る。
 その後は別のスクリプトに引き継ぎ、2段階旋回だ。

 何フレームか右ハンドル、その後は何フレームか重心移動併用。これで、ダッシュプレートの右端に乗るパターンを探す。走行距離を短くするためだ。
 ついでに、アクセル瞬断を含めてやる。

 結果として判明したのは、アクセル瞬断のタイミングは最速に無関係だし、アクセル踏みっ放しでも変わらないということ。また、ダッシュプレートの端ギリギリを少々外しても速さは同じ。そこまで神経質に最適化しても意味がない。変わらない。
 極端に操作パターンが変わればタイムに影響するが、スクリプトで調査する意味がある範囲は狭い。

written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

<< 前のページ

Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4