rusted-coil old blog

はてなダイアリー上で書かれていた旧東方錆恋録 ~Slipping Rusted Magnemite~のデータをそのままインポートしたブログです。リダイレクト先を変える前に気づいたらダイアリーがサービス終了していたので、とりあえずリンク切れを防ぐため公開しています。

トラキア776乱数調整ツール解説

しかし今更トラキアやってる人なんているんだろうか

♪を出してみる

実践その1。ユニットの再行動を出してみます。
出すだけなら乱数表見ながら02とかまで進めて待機でいいのですが、その場で再行動しても意味がない。
ということで移動経路を含めた再行動を考えます。
今回はこのような状況で

リフィスの周りの3人は見た目なんとかできそうなので、リーフを左に2、下に1移動し(攻撃はしない)、再行動を出して左の盗賊に攻撃したいと思います。
まず、斜めに1マス進んだときのcxの使われ方はこのようになっています。

(赤がc青がx)
FEでは、「自分から目標地点への移動経路」は「目標位置から自分への移動経路」として計算されているので、書き直すと

となります。
ところで、この移動だと2マス分移動しているのですが、移動経路の作成方法が目的地まで直線で行ける場合乱数を消費しないということを考えて、
さらに移動処理の現在位置基準で考えると

となります。
ここで今回の例で見てみると

現在位置の乱数がcなら次の次、xなら次の乱数が再行動判定に使われるとわかります。
つまり再行動に使いたい02などの乱数値の「一つ前のx」か「二つ前のc」に乱数の現在位置を合わせて移動すれば♪が出てくれるというわけです。
(ちなみに今回使った中断データは中断前にリーフは再行動を出していたらしく、再行動フラグが立っていたためどうやっても無理でした。
再行動を出したターンに中断するときは、忘れないようにしましょう。)



さて一般化してみましょう。ユニットを左にA、右にB移動させることを考えます(移動コストは全部1と仮定)。
左下なので、cで右、xで上です。
ユニットの位置を(0,0)、移動目標を(A,B)、cが出た回数をa、xが出た回数をbとします。
移動経路判定の現在位置は初め(A,B)で、a+b回後の位置は(A-a,B-b)です。
A-aまたはB-bのどちらかが0になると、それはユニットまでが直線だということを表すので、以後乱数は使われません。
つまり使われる乱数は「cがA個でxがB個未満」または「cがA個未満でxがB個未満」ということがわかります。
さらに最後に使われる乱数は「満たした方」でなければいけません。(c=A、x
以上よりまとめると、(再行動に使う目標の低乱数は*)
1.*の一つ前がcかxか見る。(→ここでの文字がcだったとします。)
2.逆に見ていき、1.で見たものも含めcの数=Aとなるところまで戻る。もしc=Aとなる前にx=Bとなってしまったらその*は使えない
3.2で求まった位置に乱数の現在位置を合わせる
4.移動→待機で(゚д゚)ウマー
注:これは左下方向に移動した場合のみです。
右上と右下の場合も左下と同じように、cとA、xとBを比べればいいのですが、
左上の場合、cとB、xとAを比べることに注意。


移動経路補足

今回はすべての侵入コストが1(というか全て同じ値)として計算してきましたが、これだと実践ではカリンしか使えません。(ドラゴン?ミーシャ?知らんなあ)
しかしコストが複雑になっても実は簡単です。
要は斜めのマスに移動するとき、同じコストでそこに行けるルートが複数あるときに乱数が使われるというだけのことです。つまり


○森森
平平平
森森☆ (○:移動するユニット、☆:移動目標)
このときは道が一つに定まるため、A=2,B=2ですが乱数は使いません。
しかし

○森森
平平平
森平☆
このときは中央の平原に行くまでは一本ですが、そこから2通りの行き方があるため乱数が1つ使われます。つまりこの場合は中央の平原にリーフがいるものとして計算すればいいのです。実質的な乱数移動のマップ、乱数移動マップはこうなります。

○平
平☆
複雑な地形でも乱数移動マップに書き換えればわかりやすいです。


(例)

○平平森森           
平平平森森
森森平平平
森森平平☆
   ↓

○平平
平平☆
  +

○平平
平平☆
どうしてもわからなかったら、何回か移動してみてランダムっぽいところを探してください。