CDW リプレイを実装した


2022年 6月 17日
 
 
 元祖ダイスウォーズには全占領した後リプレイがある。

 これをやってみた。


 
 

 考え方として、まずベタに考えると 1動作につき 1マップ、データ化すると考える。

 すると 1マップ最大 X × 55 + Y × 31 = 1705だとして、× 何ターンもデータ化すると量が多すぎる。

 しかもダイス増のデータも要るし、キャラクターユニットの情報も要る。
 
 
 そこで考え方として、初期マップ状態に対する「変化のみをデータ化する」という事を考える。

 つまり 1つ占領してマップが変わったら、その占領された国の情報だけをデータ化する。

 同様にダイス増もキャラクターユニットも、その変化した国のデータのみを記録する。
 
 
 次の考えたかとして、HSPは 1データ 4バイトある。

 16進数だと FF FF FF FFという事になるけど、10進数だと 2147483648という数までとなる。

 2進数や 16進数を扱うのは自分には難しいので、素直に 10進数で考えてみる。

 そこで、1つのデータのケタを 4つに分けてつかう。

 214 748 364 8 という風に分けて、それぞれデータを入れる。

 1つ目~3つ目はデータ、最後の 4つ目はデータの種類を表すフラグデータとする。

 これによって HSPで扱う 1データで、この場合は 3つのマップ変化データを扱える。

 つまり 3分の1のデータ圧縮と考えられる。
 
 
 初期

 リプレイデータは repdになります。

 repcは何番目のデータかで、repkは先の通り 1データの何番目のデータかです。

 repcが 2からなのは、セーブデータとして repd(0)には repcの値が、repd(1)には repkの値が、それぞれ格納されるためです。
 
 
 データ書き込み

 データの 4番目、つまり 1ケタ目のデータは何のデータかを表すフラグになってます。

 switch文の repfです。

 フラグ 1はダイス増ですね、どの国のダイスが +1されたかだけ記録してます。

 repk+によって、1データの何番目に書き込むか指定してます、1~3になってます。
 
 
 フラグ 2は勝った場合、占領した場合の変化です。

 データ 10ケタからは占領した国、10000ケタからは占領された国で、これは 3分割では無くて2分割になってます。

 なぜかと言うと、データの最大値が 214 748 364 8であるために、1データ目は 214が最大値になってしまうためで、もし国の最大数が 214以上だと表せなくなります。

 もう一つの理由は、1データで一つの戦勝処理を表した方が分かりやすいからだと思います。
 
 
 フラグ 3は負けた場合のデータです。
 
 
 
 データを元にリプレイを表示

 データの 1ケタ目をフラグ repfとして、同じように switch文で分岐処理します。

 1はダイス増、2は占領、3は負け処理です。

 キャラクターユニットの移動は、元のマップからの変化でのみ処理してます。

 つまり、もしどこかで間違えると、ずっと間違ったまま処理されます。

 少しややこしいのは、キャラクターユニットの表情の変化です。

 表情の値は cupfです。

 詳細は忘れましたけど、その国の番が回ってきた時に表情をフラットにするのに苦心したと思います。
 
 
 
 これでリプレイのデータ量は、大体 10000前後~多くても 30000以内くらいです。

 10000データという事は 40000バイト、つまり 4MBです。

 今の所セーブ箇所が 8個になる予定なので、× 8で最大 32MBくらいになると思います。

コメントを残す

メールアドレスが公開されることはありません。