日本鋼豹司令部 トップページへ SPWAW解説記事は、トップページからどうぞ。

セーブデータエディター

Total votes: 0
暗号解読部長
Posts: 58
Joined: Mon Mar 12, 2007 12:51 UTC
 初めまして、島風です。
SPWAWは、数年前から断続的に楽しんでおり、そのころから本HPの情報は大変役に立っております。本HPの運営・管理者をはじめ、記事投稿されている諸兄方に敬意を表します。
 さて、僕は大部隊を平面的に指揮することや敵防衛拠点を正面から攻略していくことが苦手です。そこで、歩兵を戦車や輸送車に乗せて、戦闘正面を4〜8ヘックスに絞り込んで、煙幕スクリーンと砲撃に頼りまくって戦線を突き抜け、後方で展開して後ろから攻めることが多いです(スターリングラードキャンペーンのママエフ・クルガン丘もこれで攻略したのですが、それでもかなりの損害を出すへっぴり腰ぶりです。こんな指揮官の下では僕は戦いたくありません)。ですので、素早く移動する必要があるのですが、敵歩兵の近接強襲と地雷が障害となります。そこでオートバイ兵などの偵察部隊は、かわいそうですが、目視による能動的な敵発見や、発砲されることでの敵発見、それから、踏んで爆発することによる地雷発見という、大切な役割があります。ところが、ダス・ライヒキャンペーンで、ふと気がつくとオートバイ兵のリーコンユニット属性が消え、代わりに Fast response artillery が付いてしまい、大変困ったことになりました。結局バイナリエディターで、他のオートバイ兵とデータを比較して修正することができましたが、これはかなり面倒です。
 枕が長くなりましたが、SPWAWのセーブデータエディターはないのでしょうか。一応、webの検索をかけてみましたがそれらしきものを探すことができませんでした(どこかの英語のHPでは「チートにつながるからダメよ」らしきことが書いてありましたが)。
 どなたかご存じの方がおられれば、教えて頂けませんか。よろしくお願いします。
暗号解読部長
Posts: 58
Joined: Mon Mar 12, 2007 12:51 UTC
 こんばんは、島風です。
ダスライヒのキャンペーン中に、今度は Sdkfz 251/2 の砲撃要請時間が突然長くなってしまい、おかしいなとユニットデータをみたら、Fast response artillery が無くなって、recon unit になっていました。どうやらセーブゲームエディターはなさそうです(見つけられなかった)ので、再びバイナリエディターでデータを修復しました。
 いろいろと迷いましたが、同じような症状でお困りの方もおられるかと思いますので、少しだけデータ修復のヒントを書くことにしました。ただし、バイナリエディターでファイルの書き換えを行う場合、間違った所を書き換えたり、間違った操作をすると、データが読み込めなかったり、ゲームがクラッシュしたり等、予期しないことが起きる可能性がありますので、あくまでも自己責任でお願いします。
1. 0ターン目のデータを修復する。
2. データは、ユニット名+ユニットの様々なデータ、の順に並んでいる、と思われる。
3. ユニットの様々なデータの終わりの方に、recon unit 等のユニットの特性がある。
 ご参考まで。
Last edited by 島風 on Sat May 19, 2007 03:56 UTC, edited 1 time in total.
Nor
大佐
rank
Posts: 783
Joined: Sat Feb 07, 2004 20:09 UTC
はじめまして。

ご質問の件ですが、いちおうSPWAWにもセーブデータエディタらしきものは同梱されています。WAW EDというプログラムです。

・WAW EDの開き方
「スタート」→「すべてのプログラム」→「Steel Panthers World At War」→「World At War Game Editor」


もともとこのツールはシナリオ作成者用のもので、シナリオデータやセーブデータを読み込んで、基本的な項目(経験・士気など)を一括で簡単に変更できるというのがウリです。

しかし残念ながら、簡単に変更できる項目の中には、ユニットの特殊能力は入っておりません。したがって、ユニットの特殊能力を変更するには、別途バイナリエディタを使用するしかなさそうです。

実は、WAW EDにはバイナリエディタ機能もついているのですが、非常に使いにくいのでお勧めできません。また、WAW EDの目玉機能として、読み込んだシナリオ・セーブデータをCSV形式に変換して出入力できる機能があるのですが、これが不思議なことに出力はできても入力ができない(ごくごく稀に入力に成功する場合はある)という致命的な欠陥があります。なので、今回のご質問の件については、WAW EDはあまり役に立たないでしょう。 :mad:

バイナリエディタでセーブファイルを覗いて見ると、各ユニットは256個のデータ項目を持っています。↓の記事でも言及されていますが、各項目が何を意味するかは今のところまだはっきりとしていません。
viewtopic.php?t=539

そこで、Fast response artillery や recon unit という特殊能力を規定する項目が「どこ」で、「値は何」なのかを公表していただければ、後に続く方にもきっと役立つと思われます(例えば、B7はユニットの状態で、値は0=ready,1=in-Cover,2=Entrenhedなど)。

ちなみに、Fast response artillery や recon unit という属性は、フォーメーション単位で指定する特殊能力のようです(ユニット単位で指定する特殊能力は Engineer Ability)。キャンペーンの最中にユニットを他のクラスにアップグレードすると、特殊能力がおかしくなってしまうのは、どうやらこの辺りが原因のようです。

このバグ(というよりプログラム上の制限)を発生させないようにするには、違うクラスのユニットにはアップグレードしないという縛りを自らに課すくらいしか方法が無いようです。

以上、あまりお役に立たない情報ばかりですが・・・。 :porc
image
暗号解読部長
Posts: 58
Joined: Mon Mar 12, 2007 12:51 UTC
島風です。
 Norさん、レスありがとうございます。直接お返事をいただけて光栄です。WAW ED の存在は知りませんでした。大変参考になりました。
 前回あまり細かいことを書かなかったのは、最初の文章に書いた「チートにつながるからダメよ」というのが頭のどこかに引っかかっていたためです。皆さんのお役に立てるなら、しょぼい知識でお恥ずかしい限りですが、これまでにわかったことを書きます。

 まず、 WAW EDで出力されるCSVファイルでは、
EA
がユニットの特殊能力を表しているようです。一の位が一桁が特殊能力(0がなにもなし、1がRecon unit、2がFast response artillery)、十の位が部隊の質(何も表示がなければ通常部隊、1が経験値にボーナスがある部隊(SSや特殊部隊)、2は二線級のユニット(Opel Command Carや捕虜など))のようです。例えば、12は経験値にボーナスがあるFast response artilleryで、SS部隊にいる50mm迫撃砲などです。

 0ターンの.datファイルをバイナリーエディターで開くと、まず、各部隊のユニットデータが、最初に部隊を購入した順番に並んでいます。特定の部隊を探し出すには、連続して並んでいる経験値とモラルの値(16進法になおした数字)を利用すると便利です。ユニットの名前から、次のユニットの名前の1バイト前までがそのユニットのデータのようで、ユニットごとにデータの長さが異なっているようです(5/18に修正しました)。また、分隊長等の人物のデータはもっと後ろ方に固まっています。ユニットデータについては、名前の後に、経験値、モラル、装甲、砲弾の数、攻撃目標座標などが並んでいます。さて、特殊能力ですが、後ろから、数バイト〜十数バイトの範囲に1バイトのデータとして存在します。場所はユニットの種類などによって異なっているようです。ユニットのデータの長さが同じであれば同じ位置にありますが、長さが異なっている場合は異なる位置にあるようです。データは、例えば01は経験値にボーナスがないRecon unit、 0C(10進法に直すと12)は験値にボーナスがあるFast response artilleryを示しています。
 僕はこの値を、バイナリエディターで書き換えてユニットの特殊能力を修正しました。今のところデータを読み込めなかったり、ゲームがクラッシュしたりはありませんが、もし何か異常に気づいたら報告します。

 僕もいつか、Norさんが書いておられる縛りを自らに課したり、「戦闘中に負傷して以前の能力を無くしたり、戦闘経験を積んだおかげで新しい能力に目覚めた」と解釈してそのまま続ける、ようになれるよう、がんばってみます。
暗号解読部長
Posts: 58
Joined: Mon Mar 12, 2007 12:51 UTC
島風です。

 ユニットの特殊能力の修正方法についてまとめてみました。

1. バイナリエディターでdatファイルを開く。
2. ユニット名(文字列)や、連続している経験値とモラルの値(16進法の数字)でユニットを検索。
3. 後ろから24番目(csvファイルのEAに相当)に相当するデータを探す。
4. 以下の値に修正。
  何もなし                      = 00
  経験値ボーナスなしの Recon unit          = 01
  経験値ボーナスなしの Fast responce artillery     = 02
  経験値プラスボーナスありの通常ユニット       = 0A
  経験値プラスボーナスありの Recon unit       = 0B
  経験値プラスボーナスありの Fast responce artillery = 0C

 1.2.について、ユニットデータはユニット名の最初の文字から始まり(過去の投稿も修正しました)、次のユニット名の1つ前まで、csvファイルでは 00〜FF,100,101 の合計258個で構成されているようです。  

 3.については、単純に後ろから24番目になっていないのでご注意ください。csvファイルとバイナリーファイルを比較したところ、csvファイルで同じ数字が3つ以上連続しているデータを、バイナリーファイルでは基本的には3バイトに省略してありました。その書式は

80+繰り返し数 繰り返される数字 1バイトの数字

で、3番目の数字が何を意味しているのかは突き止めることができていません。例えば、256(16進法でFF)が10(16進法ではA)回連続、0(16進法データとしては00)が20(16進法では14)回連続のばあい、それぞれ、

8A FF 02
94 00 0D

となっています。また、連続している数字が繰り返される場合、例えば、256が6回、0が4回、1が4回、0が4回繰り返しで、次が90(16進法で5A)の場合、

86 FF 84 00 84 01 84 00 01 5A

となっています。さて、僕のWurfrahmen 40のバイナリーデータの最後の部分を書き出してみると、

04 00 00 02 00 00 1E 8E 00 03 15 00 0B 83 00 0D

となっています。後ろから見ていくと、「83 00 0D」は00が3回繰り返しで3個分のデータ、「15 00 0B」はそのまま3個分のデータ(合計後ろから6個分)、「8E 00 03」は00が14回繰り返しで14個分のデータ(合計後ろから20個分)、「00 00 1E」はそのまま3個分のデータ(合計後ろから23個分)、で、つぎの「02」が後ろから24個目のデータで、これがcsvファイルのEAに相当する、ユニットの特殊能力の値です。ここでは「02」なので、経験値ボーナスなしの Fast responce artilleryです。ちなみに、ドイツのSS中隊に含まれる「GE 50mm Mortar」はこの値が「0C」で経験値プラスボーナスありのFast responce artillery になっているのに対し、分隊単位で別途購入した「GE 50mm Mortar」は同じ名前でもこの値が「02」で経験値プラスボーナスなしのFast responce artillery となっていました。また、03〜09までの数字は無視されるようで、特殊能力がつくことはありませんでした。

viewtopic.php?t=539

を読ませていただきましたが、Norさんもデータの解析をされたそうですね。今回いろいろと見てみましたが、どうしてもわからなかったのが「ユニットの現在位置」を示している箇所です。わからなかったからといって、ゲームを楽しむ上では特に関係ないのですが、やっぱり気になります。ご存じの方がおられましたら、教えていただけませんか。
Nor
大佐
rank
Posts: 783
Joined: Sat Feb 07, 2004 20:09 UTC
非常に丁寧な説明ありがとうございます!私はもっぱらWAW Edで出力するcsvデータばかり見ていたので、バイナリデータとの違いの件について初耳でした。需要は少ないでしょうが、役立つ人にはきっと役立つ情報だと思います。 :pirat
ちなみに、ドイツのSS中隊に含まれる「GE 50mm Mortar」はこの値が「0C」で経験値プラスボーナスありのFast responce artillery になっているのに対し、分隊単位で別途購入した「GE 50mm Mortar」は同じ名前でもこの値が「02」で経験値プラスボーナスなしのFast responce artillery となっていました。
"elite"属性は、Formation単位で付加されるものだということは確かなようですね。
どうしてもわからなかったのが「ユニットの現在位置」を示している箇所です。
お礼のつもりでちょっと探してみたのですが、私もわかりませんでした。 :oops:

WAW Edには、"position/Property Editor"という機能があり、セーブファイルを読み込めば、各ユニットの現在位置座標(x,y)が一覧表示されます。この機能を使って、あるユニットの座標を変更し、そのデータをcsvで出力して、変更前のcsvと比較してみましたが・・・

結果は全項目で完全一致してしまいました。つまり、どうやらWAW Edで出力できるcsvデータには、ユニットの座標データは含まれていないようです。WAW Edで見る限り、セーブファイルは49個のセクションにわかれているようで、CSVで出力できるユニット関連データはそのごく一部でしかないようです。

というわけで、全くお役にたてず申し訳ないです。しかし、WAW Ed上で任意のユニット座標を変更し、それをセーブファイルに保存して、元ファイルとバイナリエディタ上で比較すれば・・・とっても面倒そうですが、こうすればわかるかもしれません。 :porc
image
暗号解読部長
Posts: 58
Joined: Mon Mar 12, 2007 12:51 UTC
島風です。
 Norさんのご提案を受け、「WAW Ed上で任意のユニット座標を変更し、それをセーブファイルに保存して、元ファイルとバイナリエディタ上で比較」したところ、それらしき場所(ユニットの座標の数値が並んでいる箇所)がありました。ですが、この場所は、Norさんご指摘の通り、CSVでは出力されないようです。また、座標以外にも、ファイルのサイズを含め、実に広範囲にデータが変わっていました。どうやら、素人が手をつけては行けない、禁断の領域のようです。
 Norさん、いろいろとありがとうございました。これからも、このHPを参考に、SPWAWを楽しんでいきたいと思います。
Nor
大佐
rank
Posts: 783
Joined: Sat Feb 07, 2004 20:09 UTC
え〜、超遅レスですが、WAWEdの話です。

どうやら今年二月に新バージョンが出ていた模様です。
http://www.militarygamer.com/Hosted/Chl ... /index.htm

そして、このバージョンではCSVファイルの読込不具合が解消されています。私も試してみましたが、全く問題なくCSVが読めるようになりました。

そこで、4年前に作成したもののお蔵入りとなっていた「経験・士気修正マクロ」を再度引っ張り出し、新たにいくつかの手を加えて「修正君壱号」としてリリースすることにしました。

詳しくは同梱の取説を見ていただくとして、この「修正君壱号」では、島風さんが当初お悩みであったユニット特殊能力の修正機能を装備しました。これを使えば、バイナリエディタを使うよりは多少楽になると思います。

この機能が実装できたのは、島風さんが特殊能力データのありかを探ってくれたおかげなので、改めて感謝します。 :salut

「修正君壱号」の簡単な説明は↓
http://headquarters.s4.xrea.com/spwaw/know/tech.html#04
「修正君壱号」のダウンロードは↓
http://headquarters.s4.xrea.com/spwaw/spwaw_down.html
image
暗号解読部長
Posts: 58
Joined: Mon Mar 12, 2007 12:51 UTC
こんばんは、島風です。
 Norさん、「修正君壱号」をアップして頂きありがとうございます。バイナリーエディターをいじることなく特殊能力の維持ができるというのは、僕を含め多くの方にとって大変有用な機能だと思います。僕の情報が少しでもお役にたてて嬉しいです。今ちょうどDRのチタデレ作戦の真っ最中で、いつになったら終わることやらわかりませんが、次回アップグレード時から使わせて頂きます。
Nor
大佐
rank
Posts: 783
Joined: Sat Feb 07, 2004 20:09 UTC
え〜、ほとんどの人は興味ない話題でしょうが・・・

島風さんがセーブデータ圧縮法則の一部を解読してくれ、久々にマクロなんか触ったこともあって、あわよくばWAWEdを介さずにエクセルでセーブデータを読み込んで圧縮解除するマクロを組めないものかと、ここ数日ずっとセーブデータのダンプを眺めておりました。 :oops:

結論から言うと、やっぱ無理! :porc
80+繰り返し数 繰り返される数字 1バイトの数字
確かに、圧縮されているデータはこの法則に従って圧縮解除できるのですが、じゃあ80以上の値なら全て圧縮開始バイトなのかというとそうでもありません。
例えば、
98 00 01
というバイト列は、いかにも圧縮指定っぽいのですが、実は変換なしです。どうやら、3バイト目の謎が解けない限り圧縮解除は無理だろうという結論に落ち着きました。 :porc


で、ここからが本題。この探索過程でWAWEdに関する資料を探っていたところ、WAWEdを使って簡単に特殊能力が変更できる方法が分かったのでお知らせしておきます。

今のところ、「修正君」はあくまで特殊能力を前面から維持する機能しかもっておらず、経験・士気値も修正してしまうので、何らかの事情で特殊能力だけを自由に変更したいという場合に使えるかもしれません。

***************************

<手順1>
WAWEdを起動して任意のシナリオorセーブデータをLoadする。

<手順2>
メニューの「Tool」-「HEX Editor」から内臓バイナリエディタを起動。

<手順3>
「Section」項目を "1"、「Size」項目を "258" にする(添付図参照)。
これでデータがユニット単位で綺麗に並びます。

<手順4>
「Display」項目を任意に設定。
バイナリエディタの知識がない方は "Dec" (10進数表示)がオススメ。

<手順5>
特殊能力を示す "EA" 列までスクロールし、
変更したいユニットの該当セルをクリックして、
手順4で選択した表示形式に従って任意の値を入力する。

<手順6>
値を変更したセルがアクティブになっている状態で、「Retain」ボタンを押す

<手順7>
エディタ画面を閉じて、セーブデータを書き戻す。

***************************

操作は以上です。実質的にはバイナリエディタを使っているのですが、SPWAWに同梱されているWAWEd(旧バージョンでも可)だけで完結できるのが最大の特徴です。おそらく、慣れればこの方法が一番簡単だと思います。

注意点は、表示形式に応じて入力値を変更しなければならないこと。
例えば、「エリートで特殊能力は無し」にしたいなら、
  • "Dec"表示の場合、値は10進数で入力するので、"10"
    "Hex"表示の場合、値は16進数で入力するので、"0A"
    "Combo"表示の場合も、16進数なので、"0A"
となります。16進数入力で"A"と入力すると、文字列の”A”と認識されてしまうので、必ず二桁で入力する必要があります。

もう一つの注意点は、入力したら必ずセルがアクティブな状態で「Retain」ボタンを押すこと。これを忘れると変更が反映されません。

ちなみに、このセクション1のデータは、CSVファイルで出力されるユニットデータと全く同一です。セーブファイルをバイナリエディタで覗いた場合との違いは、圧縮が解除されてるかどうかだけです。
wawed_hex.gif
Attachment: wawed_hex.gif
image
Nor
大佐
rank
Posts: 783
Joined: Sat Feb 07, 2004 20:09 UTC
え〜、ほとんど誰の役にも立たないエディットシリーズ第二回です。 :cool:
今回のテーマは、島風さんよりリクエストのあった「ユニット座標の変更」です。

地道な試行錯誤でついに発見しましたよ!!
例によってWAWEdで全ての操作を行います。

詳細手順は省略しますが、WAWEdのHEXエディタで、

「Section」項目を "17"、「Size」項目を "20" にする。
これでデータがユニット単位で綺麗に並びます。

このセクション17のデータは、
  • 00列 ユニットのX座標
    02列 ユニットのY座標
    0E列 被発見フラグ(0=被発見、1=未発見)
となっているようです。この3つは確かでしょう。残り17個のバイト列が何を指すかは未だ解読できておりませんが・・・。
image
暗号解読部長
Posts: 58
Joined: Mon Mar 12, 2007 12:51 UTC
島風です。
 「ほとんど誰の役にも立たないエディットシリーズ」って、これ、いいですね、とてもコアな感じて。

 さて、圧縮データの3バイト目の意味がわかりました(たぶん)。これは、

次の圧縮データが何バイト後にくるか-1

の数字のようです。例えば

86 00 02 09 01 83 00 01

の場合、3番目の 02 は次の繰り返しのデータが 2+1=3 バイト後の 83 から始まっていることを表しています。また、繰り返しが連続する場合、すなわち、3番目に相当する値が 0 の時は、以前に書いたように、省略されます。Norさんが書かれていた

98 00 01

の前がどうなっているか、検証していただけませんか。

 それから、紹介していただいた HEX Editor による修正ですが、「Section」項目は直接数字を入れのではなくて、上下矢印で変えてやらないとだめなんですね。気づくのに小一時間かかってしましました。
 それにしても、「ユニット座標の変更」をよく見つけられましたね。「地道な試行錯誤」と簡単に書いてありますが、かなりの時間をかけられたのではないでしょうか。
残り17個のバイト列が何を指すかは未だ解読できておりませんが・・・。
 うわぁ、とても気になりますね。なんたがうずうずしてきました。悪魔のおいでおいでが........。いやいや、Kurskで待っている戦友たちをほっとくわけにはいきません。まずはチタデレを終えてから、に、します。
Nor
大佐
rank
Posts: 783
Joined: Sat Feb 07, 2004 20:09 UTC
島風 wrote:
さて、圧縮データの3バイト目の意味がわかりました(たぶん)。これは、
次の圧縮データが何バイト後にくるか-1
の数字のようです。例えば
86 00 02 09 01 83 00 01
の場合、3番目の 02 は次の繰り返しのデータが 2+1=3 バイト後の 83 から始まっていることを表しています。また、繰り返しが連続する場合、すなわち、3番目に相当する値が 0 の時は、以前に書いたように、省略されます。Norさんが書かれていた
98 00 01
の前がどうなっているか、検証していただけませんか。
もはやいちいち書くまでもありません。私の手元のデータも全てこの法則で圧縮解除できました!!!:shocked
う〜む・・・言われてみればむちゃむちゃ簡単な・・・しかし自分では絶対気づかなかった・・・

この件を調べるにあたって、Matrix GamesやDepotの掲示板も検索しまくったのですが、似たような質問はあったものの、答えられる人は皆無。データ圧縮の仕組みを知っているのは、開発陣を除けばごくごく少数(WAWEdやCampaign Watcherなど関連ツールの作者)だけらしいです。

というわけで、島風さん・・・・あ、あんた・・・・天才だ!!
この功績を称して「暗号解読主任」の称号を贈ります。 :cheers


これで「セーブデータをエクセルで読み込み計画」も何とかなりそうな気がします。
セーブデータの構造でわからないことはまだまだ無数にあるので、これからも頼りにしてまっせ。 :pirat

というわけで、早速質問です。 :cool:

**********************
WAWEdで出力できるダンプテーブル情報(圧縮解除済み)によれば、
セーブデータのセクション0は0〜20バイト目まで、セクション1は34バイト目から800ユニット分(258×800=206400バイト)のようです。

セクション0は単なるヘッダ情報のようで、どのセーブファイルでも完全に同一だと思われます。セクション1はご存知の通りユニット情報です。セーブファイルでは常に800ユニット分の容量が確保されているようです。

ここで気になるのが、セクション0と1の間にあるデータです。
WAWEdではダンプできないこのセクション0.5とでも言うべきわずか13バイトのデータは、バイナリエディタでみると次のようになっています。
01 00 00 00 FD 17 00 00 01 00 00 00 05
いくつかのセーブファイルを比較してみると、先頭から5〜6バイト(例では"FD 17")の値だけが変化するようです。

さてさて、私の素人予想としては、この値は何かのオフセット値ではないか?と愚考しているのですが、果たしてどんなもんでしょ??

ちなみに、セクション1と2の間にも、WAWEdでダンプできないこのようなデータ部があるようです。もしかすると、WAWEdはセーブデータを圧縮解除する際にこういう部分の情報を使っており、ゲームとは直接関係ないのでダンプ可能範囲から外しているんじゃないかと・・。

いやいや、この意味がわからないと困るというわけではないし、全く急がないので、もしもお暇があればちらっと見てやってください。 :salut
image
暗号解読部長
Posts: 58
Joined: Mon Mar 12, 2007 12:51 UTC
島風です。
 Norさん、この身には過ぎるお褒めの言葉をいただき、ありがとうございます。謹んで「暗号解読主任」の称号を受けさせていただきます。微力ですが、精一杯つとめさせていただきます。
 ですが、これは、僕一人の力で解明できたわけではありません。バイナリーファイルと WAW ED の出力ファイルを見比べて、たまたま気づいただけで、Norさんに WAW ED を紹介してもらわなければ全くお手上げでした。また、僕は全く知らなかったデータ解析のヒント(csvファイルのことやHex エディターのsection, sizeなど)をいただけたのもたいへん参考になりました。


 では、早速第1回目の任務(宿題への回答)、

セクション間のデータはどのような情報を含んでいるのか

ですが、先頭から5〜7(〜8)バイトの数字は、そのセクションのデータのバイト数のようです。
 データはセクション0からセクション48までの合計49セクションから構成されています。そして、セクション0を除く各セクションの前には、Norさんご指摘のような各セクションのデータの「ヘッダー」の様な部分が12バイトあります。書式は例えば、

01 00 00 00 61 E6 01 00 01 00 00 00 ; セクション1の前

04 00 00 00 F4 02 00 00 01 00 00 00 ; セクション4の前

となっています。最初の数字はセクション番号で、そのあとの3バイトは必ず「00 00 00」です。次から3(〜4)バイトがそのセクションデータの大きさをバイト数で表したもので、セクション4の例では「F4 02 00」の部分で、これは16進法で「2F4」10進法で「756」バイトの大きさがあることを示しています。DRのチタデレのような大規模シナリオだと、セクション1の例のように「61 E6 01」となり、これは16進法で「1E661」10進法で「124513」バイトの大きさがあることを示しています。
 また、9バイト目は「00」と「01」の場合があります。「00」の場合、セクションの最初のバイトデータはそのまま数字データとして扱われ、Hex エディターでダンプされます。「01」の場合、セクションの最初のバイトデータは数字データとしては扱われず、例えば繰り返し書式の最初の 80+# であったりして、Hex エディターでダンプされません。また、9バイト目が「01」で、セクションの最初のバイトデータが繰り返し書式の 80+# ではない場合もあります。例えばセクション1の最初のバイトデータは 「05」 ですが、これは、5+1=6 バイト後から繰り返し書式の 80+# が始まることを意味しています(070605修正)。
 続く10〜12バイトは全セクションで「00 00 00」でした。

 各セクションは1バイトと短いものから、セクション1のように大きいものまでさまざまです。Norさんはセクション0, 1, 17が、それぞれ、ファイルのヘッダー、ユニットの基本データ、位置座標を示すことを明らかにされました。ですが、それ以外のセクションが何を意味するかはまだ不明です。うーん、まだまだ奥が深いですね。
Last edited by 島風 on Mon Jun 04, 2007 23:07 UTC, edited 1 time in total.
Nor
大佐
rank
Posts: 783
Joined: Sat Feb 07, 2004 20:09 UTC
またしても・・なんという完璧な回答!!それもこんな短時間で!!私はモニタの前で一人、狂喜乱舞しております!!いやあ、マジで鳥肌立ちました! :gun
わずか一日ですが、この功績を称えて「暗号解読部長」に格上げです。 :cheers

そうか、各セクションのヘッダは12バイトですか!そして1バイト目が「セクション番号」とは!!!こんな単純なことにも気づかなかった自分が情けない。 :pale
さらに注目の5~7バイト目はデータ容量か!バイナリエディタで計算がピタリとあって大感激でゴザイマス。
さらにさらに、9バイト目の謎まであっさり解いてしまうとは!!さぞや名のある本職さんなのでしょうね。いやあもう感激に耐えません。 :cool:

Norさんはセクション0, 1, 17が、それぞれ、ファイルのヘッダー、ユニットの基本データ、位置座標を示すことを明らかにされました。ですが、それ以外のセクションが何を意味するかはまだ不明です。
え〜と、現時点で私が知っているのは、実はもうちょっとありまして・・・・

セクション34   レコード長32   リーダー関連(指揮官技能、階級など)
セクション35   レコード長46   編隊構造(編隊番号、構造など)
セクション37   レコード長なし? シナリオ情報(年月、場所、対戦国、VHデータなど)

という具合です。そしておそらくセクション2はマップデータじゃないかと思っております。今後も何か発見があればお知らせします。


さてさて、最後にまたしても質問でございます。 :oops:
**************************

単刀直入に疑問点を言うと、セクション1の終わり方の規則を知りたいのです。

セクション1の容量は800ユニット分のデータに相当する206400バイトが確保されているようです。しかし、実際にデータとして記録されているユニット数はまちまちです。

そして、最終ユニットのデータの後には、"FF 00" という値が繰り返され、さらにその後に "C9 00" というような2バイト分のデータが存在します。その後は、今回教えていただいたセクション2のヘッダが来ます。

例えば、手元のデータでは最終ユニットのデータ終了部分は次のようになっています。
8D 00 01 01 FF 00 FF 00 ...
最初の3バイトは、例の圧縮情報です。その後に"01"が立って、"FF 00" が繰り返されています。ですが、1ユニットは258バイト分のデータを持つので、実際には"01"の後にさらに9バイト分の"00"が存在することを確認しています。

このことから、最終ユニットのデータ末尾に"00"が連続する場合は、"80+α"という圧縮情報を示さずに、"FF 00" の繰り返しでデータを埋めていくようです。

この例では、登場ユニットは22個なので、理屈で言えば残り778ユニット分のデータ(200724バイト)と最終ユニットの末尾にある9バイト分の"00"の合計200733バイトが、全て”00”で埋められるはずです。で、とりあえずアホみたいに"FF 00"の数を数えてみました。 :porc

その結果、ユニット数22の場合は、"FF 00"の繰り返しは3160バイトありました。つまり、"FF"は1580個、"00"が1580個です。さらに、ユニット数20の場合は3168バイト。ユニット数140の場合は2680バイトでした。

どうやら実ユニット数が多いほど、"FF 00"の繰り返し回数が減っていくのは間違いない。で、単純に繰り返しバイト数を残りユニット数(800−実ユニット数)で割り算してみると、いずれも4.06くらいになります。つまり、"FF 00 FF 00"という4バイト程度で1ユニット分258バイトのデータを埋めている勘定になりますが・・・・こんぴゅーたーがこんなアバウトな計算をしてるわけがない!! :evil:


というわけで、今度は是非この謎を解いてくださいませ。セクション2のヘッダ直前にある2バイト分のデータが鍵を握っているような気がするのですが・・・・・ :salut
image
暗号解読部長
Posts: 58
Joined: Mon Mar 12, 2007 12:51 UTC
島風です。
 実力以上に評価していただき、ありがとうございます。これを励みにさらに奮闘努力いたします。ちなみに僕はパソコンの自作とシミュレーションウォーゲームとRPGと釣りが趣味のしがないサラリーマンで、業界関係者ではありませんです。

 さて、任務その2、

セクション1の終わり方の規則

 についてですが、「FF 00」という書式をそのまま圧縮書式に当てはめて「00」を並べてある、ようです。FF(16進法)-80(16進法)=7F(16進法)=127(10進法)なので、「FF 00」は「00」を127バイト繰り返す、という意味になります。また、「C9 00」は同様に「00」の73バイト繰り返しを表します。

Norさんの例の場合、

 「FF 00」が1580個なので圧縮による「00」が1580x127=200660バイト(これは最終ユニットのデータの後の9バイトの「00」も含んでいます)
 引き続き「C9 00」なので圧縮による「00」が73バイト

ですので、

 登場しない23ユニット以降の「00」データは合計200724(200660+73-9)バイト
 200724/258(1ユニット分のデータバイト数)=778ユニット分

です。登場ユニットが22個なので、合計800ユニット分になります。コア60ユニットでDRのチタデレをやると、きっちり800ユニット目までデータが詰まっています!

 ただ、セクション1の終わりの部分は「C9 00」等のように2バイトになっていて、連続しない圧縮書式は3バイト、という法則に合っていません。いくつか理由が考えられますが、1つは各セクションのデータ長がヘッダー部分できっちり定義されているのでそれ以上の長さのデータは無視する。または、圧縮書式の後ろ数バイト以内に「00 00 00」がくる場合は特例扱いとする、のかもしれません。

 じつは、バイナリーデータで「00」が3バイト以上続くのはセクション0とそれ以降のセクションのヘッダー部分にしか無く、特別扱いされる書式のようです。ダンプデータで「00」が3バイト続く時は、バイト数の節約にならないのに圧縮書式で3バイトで表してある理由はこの辺にあるようです。

 さて、解析の途中で、WAW ED の csv ファイルでは出力されませんが、Hex エディターではダンプされるユニットデータがある、のに気づきました。シナリオは、Das Reich #12 Human Waves で、csvでは ソビエト軍は361ユニット分しか表示されませんが、Hex エディターでは+52個分のデータがダンプされます。僕はシナリオを作ったことがないのでわかりませんが、これらは後からわいてくるユニットなのでしょうか。また、csvファイルに出力されるかどうかを決めるダンプデータがどこなのかも今のところわかりません。
 毎回同じ締めですが、「まだまだ奥が深い」です。
Nor
大佐
rank
Posts: 783
Joined: Sat Feb 07, 2004 20:09 UTC
お返事遅れました。

またまた、あっさりとスゴイ回答を頂き感謝感激です。同時に自分のアホさ加減にはガッカリです。それはともかく、前回投稿の修正分(セクション先頭バイトの意味)も含めると、これでほぼセーブデータのフォーマット解析は終わったんじゃないでしょうかね。

それにしても、微妙なバリエーションとは言え、圧縮データの指定方法が3つもあるなんて! :shock:

とりあえずざっとエクセルのマクロを組んでテストしてみたところ、全セクションのヘッダ情報読取と、セクション1の圧縮解除&データ一覧の書き出しに成功しました。いやいや、島風さんがいなかったら絶対に不可能な作業でした。改めて感謝します。 :salut

この段階でふと気づいたのですが、値を書き換えるのは簡単だけど、それを再圧縮する作業が非常に面倒そうです。経験値や士気値なんかを書き換えるのは問題ないでしょうが、圧縮部分に触れるような改変は・・・ちゃんと再圧縮できるのか非常に不安です。 :porc

キャンペーンウォッチャーの作者が、セーブデータの解析に成功しておきながら、一切エディット機能を持たせないプログラムを組んだのも、今になってはよくわかる気がします。

さて、解析の途中で、WAW ED の csv ファイルでは出力されませんが、Hex エディターではダンプされるユニットデータがある、のに気づきました。シナリオは、Das Reich #12 Human Waves で、csvでは ソビエト軍は361ユニット分しか表示されませんが、Hex エディターでは+52個分のデータがダンプされます。僕はシナリオを作ったことがないのでわかりませんが、これらは後からわいてくるユニットなのでしょうか。また、csvファイルに出力されるかどうかを決めるダンプデータがどこなのかも今のところわかりません。
う〜ん、謎ですね。もしかすると島風さんのご想像通り、増援ユニットは出力されないのかもしれません。私は現在手元にまともなセーブデータがないので、ちょっと検証不能ですが。

あるいは、WAWEdのバグというか不具合の可能性もあるかもしれません。
私の経験では、WAWEdはうまく対戦陣営を取得できない場合があるようです。国籍取得に失敗した場合、メイン画面に表示されるSIDE2の国籍が西ドイツ(West Germany)になるようです。しかし、ゲーム情報画面では正しく国籍IDが表示されるのですが・・。
また、この場合CSVデータには、両対戦国のユニットが全て出力されます。正しく国籍が取得されている場合は、どちらか一方の陣営ユニットのみの出力になります。

もともとWAWEdは、Steel Panthers2や3用のエディットツールで、SPWAWがリリースされる際に、作者のFred ChlandaがMatrix Gamesに請われて、ちょっと改変したもののようです。それゆえに、ヘルプやマニュアルでもSPWAW向けの説明は極端に少なく、作者自身もSPWAWをほとんどプレイしたことがないと言っている(!)ほどなので、動作自体もどこまで信用できるのかよく分からない・・・というのが正直なところです。

つーても、私にとってはかなり役立つツールなのは間違いありません。で、WAWEdを使って新たに発見したことを。

セクション2   レコード長不明  マップデータ。確定。
セクション47  レコード長64  マップテキスト

です。え〜、今回は質問はありません。ご安心ください。 :wink:
image
暗号解読部長
Posts: 58
Joined: Mon Mar 12, 2007 12:51 UTC
島風です。
 ありがとうございます、なんだかほっと一息、です。:smile:

 圧縮については、確かに大変そうですね。僕はマクロを組んだことがないので、「とりあえずざっとエクセルのマクロを組んでテスト」できるNorさんはすごいなと思います。ですので、あくまで想像ですが、圧縮時には、何バイト分のデータが連続しているかを調べて、3バイト以上であれば圧縮書式に書き換えて、とりあえず圧縮形式の3バイト目は開けておいて、引き続きデータを調べていって、次の圧縮形式が決まったところで、前の圧縮形式の3バイト目の数字を決定する。そのため分岐命令が複雑になるのでしょうね。また、セクションのデータ量も変化するのでヘッダー部の書き換えも必要となります。また、最後の「00」の繰り返しが129個の場合、

FF 00 02 00 00

と、書かれているようです。3バイト目の「02」で指定されている次の圧縮書式の開始点は、次のセクションのヘッダー部分になりますが、恐らく無視されるのでしょう。もし「02」を入れないと、この部分は「00 00 00」となり、ヘッダー部分以外では禁止されている書式になってしまいます。うーむ、やっぱり大変そうですね。

 ところで、Das Reich #12 Human Waves で WAW ED の csv ファイルで出力されないユニットについては、ご指摘の通り、バグというか不具合というか「仕様」のようです。言われて初めて国別(?)にデータが分かれているのに気づきました。Human Waves では、「Germany」でドイツ軍とソビエト軍あわせて400ユニット分がcsv出力され、「Soviet Union」で残りのソビエト軍52ユニット分がcsv出力されました。後からわいてくるユニットかもしれない、という仮説は間違っているようです。
 WAW EDは、まあ確かに万全ではありませんが、とても役に立つツールである、という意見には大賛成です。

 ところでセクション2はマップデータ確定、とのことですが、どのようにして調べはったのでしょう、すごいですね。このセクションは、実際のマップのサイズにかかわらず複数のシナリオで全く同じデータ長、BB80(16進)=48000(10進) バイトです。バイナリデータを見ると、何となく2バイト1組(例えば1方が基礎地形データ、もう片方が補助データ(例えば砲弾の跡がつくとかなど))になっている印象があります。マニュアルでも、最大マップサイズは横100×縦240ヘックス(=24000ヘックス)と書かれてありますしね。

 それでは、また何か分かったらご報告します。そうそう、チタデレはコア60ユニットで10ターンまで行きましたが、ゲームが落ちたりはしておらず、今のところ大丈夫です(まだまだ先が長ーい)。
Nor
大佐
rank
Posts: 783
Joined: Sat Feb 07, 2004 20:09 UTC
いえいえいえいえ、何から何まで教えていただいて、こちらこそ大変有難く思っております。

データ圧縮についての細かい知見もありがとうございます。そうそう、そういう具体例を知っておかないと上手くいかないような気がするんですよね。

しかし、よくよく考えてみると、特にゲーム外でエディットしたい項目って・・・・・個人的にはあまり無いような気がします。そもそも、私がツールを作ろうとした動機は、
1.キャンペーンのセーブファイルを対象として、
2.ゲーム内やWAWEDでも変更できない(or 面倒な)項目が、
3.簡単に変更できる
というものでした。

とりあえず盛り込みたい機能は、修正君壱号で取り上げた「経験」「士気」の自動修正と、「特殊能力」の引継ぎくらいでしょうか。この3つのうち圧縮操作が必要になる可能性があるのは、「特殊能力」だけでしょうか(消失した特殊能力を復活させる場合)。

他に何か盛り込みたい機能があるか考えてみましたが・・・「編隊構造の変更」と、さらに欲を出すなら、「コアユニットの途中追加」くらいかなあ。でも私は最近全くキャンペーンをやっていないので、あまり切実な要求がないというのが本音です。他に何か、こんなことが実現できたらいいなあというものがあれば、是非是非教えてください。 :salut

ところでセクション2はマップデータ確定、とのことですが、どのようにして調べはったのでしょう、すごいですね。
いやいや、全然すごくないです。 :porc
セクション2のダンプデータを見たとき、これって以前見たことあるような・・・確かマップ関連で・・・と感じておりました。で、マップデータとセクション2を照らし合わせると、最初の16バイトはX座標が0のHEXアイコン番号らしいと気づきました。

で、マップデータを確認するときに、WAWMapという、これもFred Chlanda氏のマップエディットツールを使ったのですが、何とこのツールでそのままセクション2のデータがダンプできることに気づきました。そう、かつて私はこのツールでマップデータをダンプしたことがあったので、何となく見覚えがあったのでした。 :pirat

で、さらにさらに、このツールにマップ関連のセクション番号が明記されていることに、今更ながら気づきました。参考画像↓
viewtopic.php?t=314

つまり、
section2〜7,28〜29 HEXグラフィック情報
section8  レコード長20 グラフィック以外のHEX情報
というわけです。セクション8については、ちょっと調べればさらに詳しい情報がわかります。しかし、これらのマップ関連データの編集はWAWMAPにお任せするのがベストでしょう。セクション2は圧縮されていないので形式としては扱いやすそうなんですけどね。 :cool:
image
暗号解読部長
Posts: 58
Joined: Mon Mar 12, 2007 12:51 UTC
島風です。
しかし、よくよく考えてみると、特にゲーム外でエディットしたい項目って・・・・・個人的にはあまり無いような気がします。 とりあえず盛り込みたい機能は、修正君壱号で取り上げた「経験」「士気」の自動修正と、「特殊能力」の引継ぎくらいでしょうか。
 そうですね。今思い出しましたが、そもそもこちらへ質問させて頂いた最初の目的は、「特殊能力」の引継ぎ・修正をどうするか、ということでした。それがいつの間にやら、「- 00 FFのダンプ・バイナリーパラダイスへようこそ -  データフォーマット解析研究室」になっちゃいました。思えば遠くへキターもんだー、です。:lol:
他に何か盛り込みたい機能があるか考えてみましたが・・・「編隊構造の変更」と、さらに欲を出すなら、「コアユニットの途中追加」くらいかなあ。 他に何か、こんなことが実現できたらいいなあというものがあれば、是非是非教えてください。 
 せっかくですので、要望を。「編隊構造の変更」に含まれるのかもしれませんが、セクション1のユニットデータを、ユニットの所属順に並べ替える機能が欲しいです。ゲームの途中でユニットの所属を変えても(僕は結構たくさん Pack mules を買い込むので、しょっちゅう所属が変わります)、セーブファイルのユニットデータの並び順は変わりません。ケーム内ではほとんどの場合問題はありませんが、例えば B2 ユニットを Cグループに所属替えしようとすると、DeployのRoster画面や、砲撃要請画面等で、

 旧B2ユニット
 C0ユニット
 C1ユニット

の順番で表示され、ときどき砲撃要請相手を間違えてしまいます。
 あと、「コアユニットの途中追加」もほしいですね。思いついたら、またお知らせしますね。
section2〜7,28〜29 HEXグラフィック情報
section8 レコード長20 グラフィック以外のHEX情報
 一気にセクションの意味が明らかになりましたね。マップに関しては、セーブデータのかなりの部分を割いてある、ということですね。
これらのマップ関連データの編集はWAWMAPにお任せするのがベストでしょう。
 はい、よろこんで、おまかせです。
Nor
大佐
rank
Posts: 783
Joined: Sat Feb 07, 2004 20:09 UTC
島風 wrote:
今思い出しましたが、そもそもこちらへ質問させて頂いた最初の目的は、「特殊能力」の引継ぎ・修正をどうするか、ということでした。それがいつの間にやら、「- 00 FFのダンプ・バイナリーパラダイスへようこそ - データフォーマット解析研究室」になっちゃいました。思えば遠くへキターもんだー、です。
そうでした。そもそも私がWAWEDを介さずにセーブデータが読みたいなんて高望みをしたのが原因でした。 :oops:
島風 wrote:
せっかくですので、要望を。「編隊構造の変更」に含まれるのかもしれませんが、セクション1のユニットデータを、ユニットの所属順に並べ替える機能が欲しいです。ゲームの途中でユニットの所属を変えても(僕は結構たくさん Pack mules を買い込むので、しょっちゅう所属が変わります)、セーブファイルのユニットデータの並び順は変わりません。ケーム内ではほとんどの場合問題はありませんが、例えば B2 ユニットを Cグループに所属替えしようとすると、DeployのRoster画面や、砲撃要請画面等で、

 旧B2ユニット
 C0ユニット
 C1ユニット

の順番で表示され、ときどき砲撃要請相手を間違えてしまいます。
なるほどなるほど。そういえば、そんな不具合がありましたね。確かにこれは修正したいものです。ぜひ採用しましょう。

しかし・・・結論から言うと、これを実現するにはセクション1のデータだけ並べ替えてもだめなようです。 :mad:

ユニットの基本データはセクション1に集中していますが、関連データとして、指揮官情報(セクション34)、編隊構造(同35)、位置情報(同17)があります。

このうち、指揮官情報はユニットごとのデータをもっておりますが、セクション1の指揮官番号(8A列)に対応するデータを持っている(10列)ので、セクション1のデータ並び順を変更しても問題ないようです。

また、編隊構造は、編隊ごとのデータしかもっておらず、編隊間の上下関係しか規定しないようなので、あまり関係しないかもしれません。

問題は位置情報です。セクション17は20バイトで並べると、先頭から順にユニット座標データが並びますが、ユニットを特定するようなシリアル番号を持っていないようです。つまり、セクション1だけ並べ替えてしまうと、位置座標がずれてしまうのです(実験済み)。 :evil:


というわけで、セクション17の構造をもうちょっと調べる必要がありそうです。以前、便宜的にレコード長20とお知らせしましたが、これはかなり怪しいです。確かに20バイトで並べると、先頭から順にユニットデータが並びますが、さらに下を見ていくと、何度も類似形式の繰り返しがあることがわかります。おそらく400行単位で繰り返しが起こっています。ちなみに最後のほうには、砲弾痕の座標データも入っているようです。

つーわけで、またも島風さんにとってはヤブヘビっぽい展開ですが、何か発見があればお知らせくださいませ。 :salut
image
Nor
大佐
rank
Posts: 783
Joined: Sat Feb 07, 2004 20:09 UTC
セクション17の構造がもう少しわかったので追記します。

データを20個ごとに並べた場合、

0行〜ユニット座標
400行〜敵の初期配置?
800行〜VH座標
1200行〜Entrenched座標
2000行〜ユニット座標
3800行〜砲弾痕座標

と、ざっとこんな感じで並んでいるようです。

VH座標はセクション37にもありますが、セクション37では座標+価値+占領中の陣営という情報が含まれているのに対して、セクション17では座標情報のみ?のようです。

Entrenched座標と砲弾痕座標は、画像を表示する座標を示していると思われます。

ユニット座標は0行からと2000行からの二つありますが、座標そのものを示す先頭4バイトは同一で、残り16バイトの値は異なります。
image
Nor
大佐
rank
Posts: 783
Joined: Sat Feb 07, 2004 20:09 UTC
セクション17の構造はマップデータに似ている・・・そういえばこれまでキャンペーンのセーブデータばかり見てたけど、シナリオデータやマップデータを直接みたらどうよ?とひらめきました。というわけで基本的かつ重要な知見です。
<セーブデータのセクション構成>
0〜47,51,48
計50セクション

<シナリオ・キャンペーンデータのセクション構成>
0〜47,51
計49セクション

<マップデータのセクション構成>
0,2,3,4,5,6,7,8,16,17,20,28,29,38,39,47,48,(52,53,54,55,56,57,58,59) 
計17〜25セクション

不思議なことに、マップデータには二種類あるようで、セクション52〜59が含まれるものと含まれないものがありました。また、これらのセクションはセーブデータには含まれません。原因はよくわかりませんが、ともかく、マップデータに含まれるものがマップ関連のセクション番号とみなしてよいでしょう。

しかし困ったことに、ユニット座標情報が含まれるセクション17もマップ関連データに入っています。セクション17の謎は深まるばかりです。 :roll:

もう一点面白いのは、49セクションしかないシナリオをプレイして途中でセーブすると、セーブデータの最後にセクション48が追加されて、合計50セクションになってしまうことです。
・・・・・ということは、80バイト(実質40バイト)のセクション48はセーブ情報??と思いましたが、マップデータにも含まれてる!・・・ってことで結局よくわかりません。 :pirat


とりあえず、今回分かったマップ関連セクションと、これまでに何となく内容が判明しているセクションを除くと、以下のセクションの正体がまだつかめていません。

<不明セクション>
9,10,11,12,13,14,15,18,19,21,22,23,24,25,26,27,30,31,32,33,36,40,41,42,43,44,45,46,51

こうして並べると随分わかってないような気がしますが、これらのセクションの大半はデータが空(00やFF)か、容量が非常に小さい(1〜4バイト程度)ものです。なので、正体を掴むのはかなり難しいような気がしますね・・・。 :porc
image
暗号解読部長
Posts: 58
Joined: Mon Mar 12, 2007 12:51 UTC
島風です。
 ややっ、少し油断していたら、新たな情報と任務がっ! Norさんは「月月火水木金金」で勤務されているのですね!!

 と、とりあえず、順番に。と、言いましても、自己レス、というか、

「ユニットの所属順に並べ替えることは可能か」

についてです。結論から言うと、「可能だがとても大変」です。
 位置情報まで入れると大変なので、まずは位置情報を気にしなくてよい0ターンのデータについて調べてみました。試行錯誤の結果、手順として、

1) セクション1のユニットデータをcsvで書き出しす。エクセル上で14列・15列(それぞれ、所属部隊のアルファベット・数字、を表します)を基準にユニットデータを並べ替える。(この時、csvファイルを別名でも保存しておけば、付け直す以前の指揮官番号と指揮官の名前の対応を確認でき、4)以降の作業を効率よく行うことができます。)
2) 次に8A列の「指揮官番号」を0から順に付け直す。
3) csvファイルをセーブしてエクセルを終了。WAW EDのペースト機能を使ってcsvを読み込み、データファイルをセーブする。WAW ED 一旦終了。
4) バイナリエディターで、セクション34の指揮官データをセクション1に合わせて並べ替え、かつ、10・11列の指揮官番号(10列は下二桁、11列は上二桁)を新しい物に更新する。また、このとき、圧縮形式の3バイト目の数字を矛盾がないように修正する。
5) バイナリエディター、または、WAW ED の Hex Editor で、セクション35の編隊構造データの、12・13、14・15、1A・1B列を新しい指揮官番号に修正する。12・13列は中隊長番号(12列は下二桁、13列は上二桁、以下同様。中隊単位で購入した場合のみ「0」以外の番号が付く。小隊以下で購入した場合は 「0=HQ」 が指定されている)、14・15列、1A・1B列はともに小隊長番号で両方とも修正する必要があります(14・15列のみではユニットのグラフィックにカッコ()が付くだけで、1A・1B列まで修正すると「Change whole formation」の変更ができるようになりました)。データファイルをセーブする。

 何とも面倒です。1)の次に3)をやったのみでは、グラフィックにカッコは付きますが「Change whole formation」の変更ができない小隊長が出てきました。どうやら、指揮官は0から順番に並んでいて、かつ、指揮官番号も0から順番に付いていないと、ユニット、指揮官、指揮能力、の正しい組み合わせにならないようです。また、4)は WAW ED で変更する手段を見つけることができませんでした。
 そもそもSPWAWでは、初期購入したユニット編成のままゲームを進めていくことを前提にプログラムを組んであるように感じます。所属を変更するのはあくまで「おまけ」の機能であって、セクション1の所属のみ書き換えれば済むようにして、それ以上は面倒みませんよ、ということなのでしょう。

 さて、Norさんが書かれていた、セクション17の構造と、セクション48、52〜59については、確かに興味深いですね。解析を始めますが、結果報告までには時間が掛かるかもしれません。よろしいですか、指揮官殿。
Nor
大佐
rank
Posts: 783
Joined: Sat Feb 07, 2004 20:09 UTC
あああ、そういえば私も実験したのに、いろいろ手を広げすぎて肝心の結果を報告するのを忘れておりましたっ!
私が試した方法は、毎度のことですが随分いい加減なものでして・・・

準備*****************

1.キャンペーンで次のようにユニットを購入
A0、B0・B1、C0・C1

2.配置画面でB1をC編隊に編入。つまり編隊構造としては、
A0−B0
  −C0・C1・C2(旧B1)
となります。この状態で司令部画面を開くと、C2・C0・C1のならびになります。

実験*****************

1.CSV形式に出力したセクション1のデータを、編隊・分隊番号に従って並び替える。具体的には、旧B1ユニット行をC1ユニット行の直後に移動しました。

2.セクション34の指揮官データをバイナリエディタで開き、1と同様に、旧B1ユニットのデータ行をC1ユニット行の直後に移動しました。

3.セクション17の位置データをバイナリエディタで開き、1と同様に、旧B1ユニットのデータ行(上から三番目)をC1ユニット行(上から5番目)の直後に移動しました。

ちなみにセクション17のユニット座標データは2箇所ある(0行目からと2000行目から)のですが、0行目から始まる方だけを修正すれば実際の座標は変更されるようでした。でも気持ち悪いから両方変更しました。

*******************

つまり、島風さんの手順と異なる点は、
・ユニットの通し番号(セクション1の8A列、セクション34の10・11列)は変更しなかった
・セクション35の編隊情報は変更しなかった
・セクション17を変更した
・バイナリデータを修正する際に、圧縮形式なんか全く忘れていた :shock:
という4点です。

島風さんの詳細な実験手順を読んで、今更ながらに何でこれで動いたんだ?!と思いますが、とりあえずこの作業だけで、司令部画面のユニット表示順、指揮官情報、座標座標が正しく変更されていること、および編隊単位の命令実行が可能なことを何となく(!)確認しました。 :porc

おそらく、お互いの実験から確認できる点は、セクション1とセクション34の並び順が一致していないと、正しい指揮官情報が反映されない、という点ですね。

ただ、ユニット番号まで変更しなければいけないかどうかは、私の実験では確認されませんでした。ちなみに、壊滅したユニットの番号は、255(10進)になるようです。

また、セクション35の編隊情報に関しては、この実験では、B0以下は全てA0直属で中隊長が存在せず、ユニット番号も変更していないので、結果的に問題なかったのかもしれません。
ちなみに、ユニットの再編によって所属ユニットが存在しなくなった編隊でも、セクション35の情報には残るようです。

というわけで、ユニットの並び替えは何だか難しそうだ!というのは確かなようですね。ま、おいおい研究を重ねていきたいと思います。 :pirat


ついでにセクション35のデータ構造をわかっている範囲でお知らせします。怪しいものもありますが・・。
00〜0F 編隊名称(OOBのFormation情報に由来)
10     編隊番号(OOBのFormation情報に由来)
12〜13  直属ユニット(上官)のユニット番号(セクション1の8Aなどと同一)
14〜15  ユニット番号(セクショ ン1の8Aなどと同一)
16     体勢?(advance=0C、Defend=02)
1A〜1B  ユニット番号(セクショ ン1の8Aなどと同一)
1E     編隊番号(味方は0から、敵は100から)
20     コアフラグ?(01はコア編隊)

さらにさらに、全然関係ないデータの再圧縮の話です。圧縮プログラムをつらつら考えてみましたが、やっぱり複雑!一つのセクションだけならまだしも、セーブデータ全部をミス無く圧縮なんてできるのか?!いずれは真っ向から勝負すべきだとわかってはいるのですが、まずは変化球で試してみました。 :oops:

とりあえず圧縮解除したセクション1のデータを用意して適当にデータを変更。そして、いきなり元のセーブファイルのセクション1を上書き!!さらにヘッダ情報を次のように書き換えます。
01 00 00 00 40 26 03 00 00 00 00 00
つまり、「セクション1のサイズは206400バイトで、圧縮指定なく先頭から読み込んでね」ということです。

・・・・で、これでSPWAWはちゃんとセーブファイルを読み込んでくれました!!WAWEDでも読み込めます。な〜〜〜〜んだ!!!! :cheers

イザとなればこんなセコイ方法でもデータが書き戻せることを確認できたので、ホッとしております。 :pirat

さて、Norさんが書かれていた、セクション17の構造と、セクション48、52〜59については、確かに興味深いですね。解析を始めますが、結果報告までには時間が掛かるかもしれません。よろしいですか、指揮官殿。
もちろんですとも!!私がこの作業に費やす時間は日によって大きく差があり、生業や睡眠を忘れて没頭することもあれば(!)、全くノータッチの日もあります。こんなパターンに島風さんがお付き合いしてくれる必要は全くありません。あくまで時間と気力に余裕がある時だけお付き合いいだければ幸いです。特に締め切りもありませんので、趣味の一環としてのんびりとやってください。 :salut
image