<おしらせ1>
またまた、いつの間にか掲示板がダウンしていたようですね。ログを見ると、およそ2年半ぶりの改修です。
この間、何度かメールでご要望があったようですが、この度ようやく重い腰を上げて掲示板を修復いたしました。
管理不行き届きで申し訳ありません。

<おしらせ2>
サイト管理を楽にするために体裁を変更しています。
本サイトのメインコンテンツであったSPWAWの解説記事は以下からアクセス可能です。
SPWAW解説記事一覧


<5分で調べたSPWAW界の近況>

びっくりしたことーその1「Depot リニューアル」
SPWAW界を長年牽引してきた世界最大のファンサイトSPWAW DEPOTが、昨年の4月に閉鎖、13年の歴史に幕を下ろしたようです。
と同時にDepotメンバーの一人 Falconさんが新たなサイトSPWAW DEPOTを立ち上げたようですね(笑)。
まあ、中心メンバーが入れ替わって、こじんまりした感はありますが、実質的にはリニューアルって感じですかね。
旧DEPOTの遺産は相続されているようで、今後ともがんばって欲しいところです。
https://www.tapatalk.com/groups/spwawdepot/

びっくりしたことーその2「砲撃要請画面ラグ解消」
マルチコアCPUが普及した頃でしょうか、ある程度以上のスペックのPCでは、砲撃要請画面で挙動がおかしくなる不具合がありましたね。
それが原因でSPWAWを離れた・・という方もおられたような記憶がありますが、どうやらこの不具合、ついに修正されたようです。
これもDEPOTメンバーのおかげみたいですね。Matrix Games 公認(というか黙認ですね)のもと 、本体ファイル MECH.EXE をいじることに成功したようです。
https://www.tapatalk.com/groups/spwawde ... -t277.html


というわけで、この機会にもう一度SPWAWをやってみようかな、と思われた方は次のリンクからダウンロードをどうぞ。
DEPOTで全てのファイルのホスティングも始めたようです。
https://www.tapatalk.com/groups/spwawde ... es-t6.html

セーブデータエディター

SPWaWに関する質問に誰かが答えるはず
島風
暗号解読部長
Posts: 58
Joined: 2007.Mar.12(Mon) 21:51

任務その2

Post by 島風 » 2007.Jun.05(Tue) 22:09

島風です。
 実力以上に評価していただき、ありがとうございます。これを励みにさらに奮闘努力いたします。ちなみに僕はパソコンの自作とシミュレーションウォーゲームと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ファイルに出力されるかどうかを決めるダンプデータがどこなのかも今のところわかりません。
 毎回同じ締めですが、「まだまだ奥が深い」です。

User avatar
Nor
大佐
大佐
Posts: 783
Joined: 2004.Feb.08(Sun) 05:09
Location: 日本

Re: 任務その2

Post by Nor » 2007.Jun.06(Wed) 23:47

お返事遅れました。

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

それにしても、微妙なバリエーションとは言え、圧縮データの指定方法が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: 2007.Mar.12(Mon) 21:51

ほっと一息

Post by 島風 » 2007.Jun.08(Fri) 01:16

島風です。
 ありがとうございます、なんだかほっと一息、です。: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ターンまで行きましたが、ゲームが落ちたりはしておらず、今のところ大丈夫です(まだまだ先が長ーい)。

User avatar
Nor
大佐
大佐
Posts: 783
Joined: 2004.Feb.08(Sun) 05:09
Location: 日本

Re: ほっと一息

Post by Nor » 2007.Jun.08(Fri) 03:42

いえいえいえいえ、何から何まで教えていただいて、こちらこそ大変有難く思っております。

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

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

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

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

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

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

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

つまり、

Code: Select all

section2〜7,28〜29 HEXグラフィック情報
section8  レコード長20 グラフィック以外のHEX情報
というわけです。セクション8については、ちょっと調べればさらに詳しい情報がわかります。しかし、これらのマップ関連データの編集はWAWMAPにお任せするのがベストでしょう。セクション2は圧縮されていないので形式としては扱いやすそうなんですけどね。 :cool:
Image

島風
暗号解読部長
Posts: 58
Joined: 2007.Mar.12(Mon) 21:51

思えば遠くへ....

Post by 島風 » 2007.Jun.09(Sat) 02:01

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

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

の順番で表示され、ときどき砲撃要請相手を間違えてしまいます。
 あと、「コアユニットの途中追加」もほしいですね。思いついたら、またお知らせしますね。
section2〜7,28〜29 HEXグラフィック情報
section8 レコード長20 グラフィック以外のHEX情報
 一気にセクションの意味が明らかになりましたね。マップに関しては、セーブデータのかなりの部分を割いてある、ということですね。
これらのマップ関連データの編集はWAWMAPにお任せするのがベストでしょう。
 はい、よろこんで、おまかせです。

User avatar
Nor
大佐
大佐
Posts: 783
Joined: 2004.Feb.08(Sun) 05:09
Location: 日本

Re: 思えば遠くへ....

Post by Nor » 2007.Jun.09(Sat) 17:31

島風 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

User avatar
Nor
大佐
大佐
Posts: 783
Joined: 2004.Feb.08(Sun) 05:09
Location: 日本

追記

Post by Nor » 2007.Jun.09(Sat) 19:29

セクション17の構造がもう少しわかったので追記します。

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

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

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

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

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

ユニット座標は0行からと2000行からの二つありますが、座標そのものを示す先頭4バイトは同一で、残り16バイトの値は異なります。
Image

User avatar
Nor
大佐
大佐
Posts: 783
Joined: 2004.Feb.08(Sun) 05:09
Location: 日本

本日の研究成果

Post by Nor » 2007.Jun.10(Sun) 02:18

セクション17の構造はマップデータに似ている・・・そういえばこれまでキャンペーンのセーブデータばかり見てたけど、シナリオデータやマップデータを直接みたらどうよ?とひらめきました。というわけで基本的かつ重要な知見です。

Code: Select all

<セーブデータのセクション構成>
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: 2007.Mar.12(Mon) 21:51

ユニットの所属順に並べ替えることは可能だけどとても大変

Post by 島風 » 2007.Jun.12(Tue) 01:15

島風です。
 ややっ、少し油断していたら、新たな情報と任務がっ! 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については、確かに興味深いですね。解析を始めますが、結果報告までには時間が掛かるかもしれません。よろしいですか、指揮官殿。

User avatar
Nor
大佐
大佐
Posts: 783
Joined: 2004.Feb.08(Sun) 05:09
Location: 日本

Re: ユニットの所属順に並べ替えることは可能だけどとても大変

Post by Nor » 2007.Jun.12(Tue) 15:54

あああ、そういえば私も実験したのに、いろいろ手を広げすぎて肝心の結果を報告するのを忘れておりましたっ!
私が試した方法は、毎度のことですが随分いい加減なものでして・・・

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

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のデータ構造をわかっている範囲でお知らせします。怪しいものもありますが・・。

Code: Select all

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を上書き!!さらにヘッダ情報を次のように書き換えます。

Code: Select all

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

島風
暗号解読部長
Posts: 58
Joined: 2007.Mar.12(Mon) 21:51

なんてすごいコロンブスの卵

Post by 島風 » 2007.Jun.15(Fri) 00:47

島風です。
とりあえず圧縮解除したセクション1のデータを用意して適当にデータを変更。そして、いきなり元のセーブファイルのセクション1を上書き!!さらにヘッダ情報を次のように書き換えます。つまり、「セクション1のサイズは206400バイトで、圧縮指定なく先頭から読み込んでね」ということです。
・・・・で、これでSPWAWはちゃんとセーブファイルを読み込んでくれました!!WAWEDでも読み込めます。な〜〜〜〜んだ!!!!
 なななんと!!!!!  :eek:
これは目から鱗というか、なんてすごいコロンブスの卵でしょう。うーむ、普段圧縮データしか見ていなかったものだから、そちらに思考が完全に取られていました。これは思いつかなかったです。すばらしい〜。 :cheers
....でもかなりでかくなりますね、ファイル。

 さて、すたっくしているじょぶを、こんぴゅーたーとは逆に下から少しずつ処理しています。

 セクション17の構造

ですが、味方のユニットは、Norさんが書かれたように、0行からと2000行からの両方に座標があり、それぞれ座標以外は異なったデータになっていますね。しかし、敵のユニットは、0行からの味方ユニットに続いてデータが並んでおり、さらに、400行からもそれ以前に出てきたデータと全く同じものが入っています。 400行以前に出てくるデータを書き換えると、ゲームでの位置が変わりますが、400行からのデータを変えても位置は変わりません。ちなみに、例によって敵味方併せて800近いユニットが出てくるダス・ライヒのチタデレでは、敵ユニットの座標データは0〜799行に1つしかありません。と、いうことは、小規模シナリオの400行からの敵座標データは無意味なのでしょうか。謎です。
 それと、セクション17の0〜799行の各列の意味について少し分かりました。既にNorさんから報告があった情報まであわせると、

Code: Select all

00列 ユニットのx座標 下2桁 ユニットが破壊されると「FF」
01列 ユニットのx座標 上2桁(推定) ユニットが破壊されると「FF」
02列 ユニットのY座標 下2桁 ユニットが破壊されると「FF」
03列 ユニットのY座標 上2桁(推定) ユニットが破壊されると「FF」
0E列 被発見フラグ(0=被発見、1=未発見)
10列 陣営(0=味方 1=敵)
12列 同じヘックスにスタックしているユニットの通し番号
13列 同じヘックスにスタックしているユニット数
 です。06列と07列は、異なるユニット番号でも同じ種類のユニットであれば共通で、また、同じユニット番号ではシナリオが変わっても変化しないので、ユニットの種類ごとに特有の値を取ると思われます。特に07列は例えば普通の歩兵は03、走行車両は79以上の値をとるので、例えば発見されやすさとか、逆にin cover状態の取りにくさ等を表しているのかなぁ、と考えたりします。

 さて、ここで提案というかお願いというか質問ですが、セーブデータ構造について結構情報がたまって来つつあります。ですが、断片的に散在しているのでわかりにくくもなっています。そこで、Wikipediaのように、誰でも追加・修正が可能なデータベースを、このHP内に作ることは可能なのでしょうか。何となくエクセルの表の様な感じで、セクション番号、ユニットあたりのデータ長、ユニットデータの各列の意味、等の項目が並んだ物を想像しているのですが.....。

User avatar
Nor
大佐
大佐
Posts: 783
Joined: 2004.Feb.08(Sun) 05:09
Location: 日本

Re: なんてすごいコロンブスの卵

Post by Nor » 2007.Jun.15(Fri) 13:54

島風 wrote:さて、ここで提案というかお願いというか質問ですが、セーブデータ構造について結構情報がたまって来つつあります。ですが、断片的に散在しているのでわかりにくくもなっています。そこで、Wikipediaのように、誰でも追加・修正が可能なデータベースを、このHP内に作ることは可能なのでしょうか。何となくエクセルの表の様な感じで、セクション番号、ユニットあたりのデータ長、ユニットデータの各列の意味、等の項目が並んだ物を想像しているのですが.....。
さっそく実現しました!ちょいと編集機能がショボいですが、実用性は充分かと思います。
まずは↓のポストを見てください。
viewtopic.php?t=661

島風 wrote:しかし、敵のユニットは、0行からの味方ユニットに続いてデータが並んでおり、さらに、400行からもそれ以前に出てきたデータと全く同じものが入っています。 400行以前に出てくるデータを書き換えると、ゲームでの位置が変わりますが、400行からのデータを変えても位置は変わりません。ちなみに、例によって敵味方併せて800近いユニットが出てくるダス・ライヒのチタデレでは、敵ユニットの座標データは0〜799行に1つしかありません。と、いうことは、小規模シナリオの400行からの敵座標データは無意味なのでしょうか。謎です。
なるほどなるほど。細かく比較するといろんなことがわかりますな。興味深い点があるので、私もデータの具体例を挙げてみます。

まず、使用データは自作の「歩兵演習」キャンペーンのセーブファイルです。このキャンペーンは2シナリオからなり、1シナリオ目の終了時点(シナリオ移行時)にセーブしたデータを使用しました。

このデータでは、0〜15行は自ユニットのデータが並び、16行目から21行目まで敵ユニットのデータが次のように並びます。

Code: Select all

255 255 255 255 000 000 112 004 255 255 003 000 000 000 000 255 001 000 000 001 
255 255 255 255 000 000 136 004 255 255 004 000 004 000 000 255 001 000 000 001 
255 255 255 255 000 000 136 004 255 255 003 000 000 000 000 255 001 000 000 001 
024 000 003 000 000 000 085 004 255 255 000 000 000 000 000 255 001 000 000 001 
255 255 255 255 000 000 106 004 255 255 001 000 000 000 000 255 001 000 000 001 
020 000 003 000 000 000 085 004 255 255 003 000 003 000 000 255 001 000 000 001 
ご覧の通り、敵は6ユニットで、そのうち4ユニットは壊滅しています。

で、400行目から407行目のデータは次のようになっています。

Code: Select all

024 000 023 000 000 000 097 004 255 255 003 000 000 000 001 255 001 000 000 001 
255 255 255 255 000 000 000 000 003 000 003 000 000 000 001 255 001 000 000 000 
255 255 255 255 000 000 000 000 003 000 003 000 000 000 001 255 001 000 000 000 
022 000 024 000 000 000 136 004 255 255 000 000 000 000 001 255 001 000 000 001 
022 000 022 000 000 000 136 004 255 255 003 000 000 000 001 255 001 000 000 001 
024 000 003 000 000 000 085 004 255 255 000 000 000 000 001 255 001 000 000 001 
016 000 003 000 000 000 085 004 255 255 003 000 000 000 001 255 001 000 000 001 
020 000 003 000 000 000 085 004 255 255 003 000 000 000 001 255 001 000 000 001 
まず、敵は6ユニットしかいないはずなのに、データは8行あることに気づきます。これは謎ですが401〜402行目のデータは座標がないので空だとみなすべきなのでしょう。

次に、残りの6行分のデータを16行目からのデータと比較すると、生き残っている敵ユニットの座標は同一ですが、壊滅ユニットの座標が存在すると言う点が決定的に異なります。

この壊滅ユニットの座標をマップ上で見てみると、実は初期配置座標とぴったり一致するのです(何せ作者だからはっきりわかります :cool: )。しかし、なぜ初期配置座標なんかがセーブデータに残るのか?壊滅時の座標が残るならまだ理解できそうですが、この座標は壊滅時のものではないことも間違いありません。

結局、何だかよくわかりませんが、もしかすると401〜402行目の空データは、シナリオ作成時に一度は購入したものの、返却したユニットのものなのかもしれません(作者だけど、このシナリオは何年も前に作ったものなので、残念ながらそこまでは覚えてない! :oops: )。

というわけで、400行目からの敵ユニットデータは、本当にあってもなくてもど〜でも良いものなのかもしれませんね。
そして、『ダス・ライヒのチタデレでは、敵ユニットの座標データは0〜799行に1つしかありません。』ということですが、じゃあ敵の座標ってどこにあるのよ???って感じですね。無いわけは無いんですけどねえ。謎が謎を呼ぶなあ・・・ :pale

06列と07列は、異なるユニット番号でも同じ種類のユニットであれば共通で、また、同じユニット番号ではシナリオが変わっても変化しないので、ユニットの種類ごとに特有の値を取ると思われます。特に07列は例えば普通の歩兵は03、走行車両は79以上の値をとるので、例えば発見されやすさとか、逆にin cover状態の取りにくさ等を表しているのかなぁ、と考えたりします。
上記データの06〜07列を見ると、06列の値が・・・16行目からのものと400行目からのものでは微妙に違う!!なんで??

そして、これらのユニットは全て歩兵タイプ(上からHQ×1、機関銃×2、偵察×3)で、07列の値はすべて「04」です。07列の意味は島風さんご指摘のような感じかもしれませんね。しかし外部からは見えないプログラム内部のパラメータだとしたら、これ以上どうにもなりませんなあ・・・。 :porc
Image

島風
暗号解読部長
Posts: 58
Joined: 2007.Mar.12(Mon) 21:51

要無し?

Post by 島風 » 2007.Jun.19(Tue) 01:58

島風です。
さっそく実現しました!ちょいと編集機能がショボいですが、実用性は充分かと思います。
まずは↓のポストを見てください。
viewtopic.php?t=661
 指揮官様、編集可能なデータベースの「おおもと」を作成いただきありがとうございます。 :cheers
 早速登録させていただきました。たくさんの方に参加していただけるといいですね!!  :wink:

 ところで、HPにアクセスし編集作業を行おうとすると、登録アドレスとパスワードの入力が求められます。正しく入力したつもりですが、

**@** にはこのスプレッドシートへのアクセス権限がありません。

と、断られてしましました。何かこちらのアクセスのしかたに問題があるのでしょうか。


そして、『ダス・ライヒのチタデレでは、敵ユニットの座標データは0〜799行に1つしかありません。』ということですが、じゃあ敵の座標ってどこにあるのよ???って感じですね。
 そうですね。小規模シナリオでは、味方ユニットの位置データに引き続き、0〜399行の中に敵ユニットの位置座標データも並んでいます。そして、400行からにもそれ以前に出てきた敵の位置座標のデータのコピーがあります。しかし、チタデレではユニット数が多いので、0〜799行に味方・敵の位置座標のデータがびっしり詰め込まれていて、敵の位置座標データのコピーの分がないんですね。コピーはいらへんのかいっ、って感じです。
上記データの06〜07列を見ると、06列の値が・・・16行目からのものと400行目からのものでは微妙に違う!!なんで??
 何ででしょう?? 06列の値が異なっているのは、0行と、4行の壊滅したユニットですね。壊滅と関係あるようにも思えますが、1行と2行は壊滅しても06列の値は同じです。なぜでしょう?? 
 うーむ、「生データ」はやはり説得力と迫力がありますね。それを見せていただくことで、こちらからも意見を言えるし、自分が何を気づかなかったのかも分かってきます。なるほど、僕は各シナリオの0ターン同士を比べたので、違いが見えてこなかったのですね。やはり、検証作業は複数人員でやるのがいいですね。解析精度も上がります。

 えー、さて、

セクション17の400行目からは本当に必要か

ですが、やっぱりいらないのかな、と思われます。通常のデータファイルでは、400〜799行のうち、敵の位置が入っていない部分は 0E 列は 01 、それ以外は FF となっています。そこで、Das Reich #14 Partisans!! の0ターンのセーブデータをバイナリエディターでいじくって、セクション17の400行目からを

Code: Select all

FF FF FF FF FF FF FF FF FF FF FF FF FF FF 01 FF FF FF FF FF
に書き換えて、敵の位置情報を消してみました。その前後の圧縮形式と、セクションのヘッダー部分にあるセクションデータのバイト数も修正しました。さて、ゲームを開始したところ、通常通り進み(Wurfrahmen 40とSdKfz 251/2の間接射撃でぼこぼこに殴り倒し、直接射撃の機会はあまりありませんでした)、ちゃんと終了し(もちろん、DVですが、あまりおもしろくない勝ち方ですね)、次のシナリオへと進むことができました。
 また、シナリオの途中のターンや終了時のターンのデータファイルでは、0〜399行のうち、敵・味方問わず、移動や消滅した部隊のデータは書き換えられていまたしが、400行目からはそのまま( 0E 列は 01 、それ以外は FF )で変化していませんでした。やっぱり、ゲームをするには特に関係のないデータのようです。


 さて、この解析の途中で、セクション17の0〜399行ので2列分の意味が新たに分かりました。

Code: Select all

0A列はユニットの車体の向き
0C列は砲塔の向き
3時の方向が「0」、5時が「1」、7時が「2」、9時が「3」、11時が「4」、1時が「5」
です。砲塔を持たないユニットは、この2列は同じ値を取ります。ただし、この2列は「おおまかな」向きのみを表していて、例えば2時は「0」、12時は「5」、10時は「3」、8時は「2」、6時は「1」、4時は「0」です。同一種類のユニットで、3時を向いていて「0」のユニットと、4時を向いていて「0」のユニットでは、0〜399行および2000行からのデータも、位置座標以外の違いはないことから、本当に細かな向きはどこか別の場所にあるのではと思われます。うーむ、どこでしょう???? 久しぶりですが、「まだまだ奥が深い」。

User avatar
Nor
大佐
大佐
Posts: 783
Joined: 2004.Feb.08(Sun) 05:09
Location: 日本

Re: 要無し?

Post by Nor » 2007.Jun.19(Tue) 02:58

島風 wrote:ところで、HPにアクセスし編集作業を行おうとすると、登録アドレスとパスワードの入力が求められます。正しく入力したつもりですが、

**@** にはこのスプレッドシートへのアクセス権限がありません。

と、断られてしましました。何かこちらのアクセスのしかたに問題があるのでしょうか。
う〜む・・・謎ですなあ。編集権の付与はちゃんと出来てると思うのですが・・
編集画面への入り方は2つあって、ひとつは、
http://spreadsheets.google.com/pub?key= ... GQBxDJyfUQ
1.↑を開いて、画面右下にある「このページを編集」という部分をクリック
2.Googleアカウント入力画面になるので、メルアドとパスワードを入力

もうひとつの方法は、
http://docs.google.com/?hl=ja
1. ↑を開いて、最初にGoogleアカウントを入力する。
2. 編集可能なファイルの一覧が表示されるので選択

というものです。とりあえず二番目の方法を試してもらえますか?

砲塔を持たないユニットは、この2列は同じ値を取ります。ただし、この2列は「おおまかな」向きのみを表していて、例えば2時は「0」、12時は「5」、10時は「3」、8時は「2」、6時は「1」、4時は「0」です。同一種類のユニットで、3時を向いていて「0」のユニットと、4時を向いていて「0」のユニットでは、0〜399行および2000行からのデータも、位置座標以外の違いはないことから、本当に細かな向きはどこか別の場所にあるのではと思われます。うーむ、どこでしょう???? 久しぶりですが、「まだまだ奥が深い」。
やあやあ、初めて私がズバリ答えられる質問です!! :cool:
ユニットの向きはセクション1の98〜9Bです。98・99が車体の向き、9A・9Bが砲塔の向きです。3時方向を0度とした角度で表されるようで、例えば、

Code: Select all

0=3時、90=6時、180=9時、270=12時
になることを突き止めています。

う〜ん、しかしセクション1に精密な向きを表すデータがあるのに、セクション17にも大まかな方向データがあるのか??
セクション17のデータは、最大値が5なら60度単位になってるみたいので、もしかして視界チェック(LOS表示)とかに利用されているのかもしれませんね。
Image

島風
暗号解読部長
Posts: 58
Joined: 2007.Mar.12(Mon) 21:51

セクション8、わずか1列分

Post by 島風 » 2007.Jun.19(Tue) 23:29

島風です。
う〜む・・・謎ですなあ。編集権の付与はちゃんと出来てると思うのですが・・
 すみません。そちらへ送付したアドレスが間違っていました。 :porc
正しいアドレスを送付しましたので、編集権の付与をもう一度やっていただけませんか。

 さて、セクション8の構造ですが、

Code: Select all

100(X座標) * 240(Y座標) * 20バイト(1ヘックスあたりのデータ量) = 480000 バイト
(0,0)から下向き(Y座標が増える方向)に20バイトずつ増加していく
 例えば  (0,0)のアドレス00〜13(H)、(0,239)のアドレス12AC〜12BF(H)
     (1.0)のアドレス12C0〜12D4(H)、(1,239)のアドレス1256C〜257F(H)
となっているようです。
 僕は今日やっと気づいたのですが、WAW Ed の Tools の Dump File から、任意のセクションの非圧縮(展開された)データを書き出しできるのですね。そこで、(17,15)にいるHQの向きを「1」と「2」にして両者のデータを比べたところ、

Code: Select all

               HQの向き「1」 HQの向き「2」
セクション1の向き(98〜9B列)      63         117
セクション8のデータの大きさ	  16751	   16753
セクション8のデータ(18カ所)
セクション17の向き(0A列)     1      2
のみが異なっていました。(Norさん、セクション1のユニットの向きの情報ありがとうございました。それから、追加情報ですが、セクション17の向きは、歩兵などの非車両ユニットは0A列にしか値がありませんでした。) 
 セクション8のデータでは、18ヘックス分のデータ、しかも、どのヘックスデータも10(H)列めが「00」か「01」かで異なっていました。

Code: Select all

1の向きの時の値が「00」、2の向きの時の値が「01」のヘックス
   (18,16)(18,17)(19,16)(19,17)(19,18)(19,19)(20,16)(20,17)(20,18)
1の向きの時の値が「01」、2の向きの時の値が「00」のヘックス
   (14,17)(15,16)(15,17)(15,18)(15,19)(16,16)(16,17)(16,18)(17,16)
これをみると、HQユニットの向きを変えることで値が変わったのは、HQユニットがいるヘックスではなくて、HQユニットから見える(10(H)列めが「00」)、または、見えなくなった(10(H)列めが「01」)ヘックスだ、ということです。
 地形データがない、すなわちそのシナリオの「番外」のヘックスでは、10(H)列めをふくめ20バイト全て「00」になっています。地形データがあるヘックスは、基本的には10(H)列めは「01」ですが、味方ユニットからLOSが通っているヘックスでは「00」になっているようです。試しに、視線が通っていないけど敵のユニットがいるヘックスデータの10(H)列めを「00」にしても、敵ユニットが見えたりはしませんでした。ちゃんと見えるかどうか再計算され、値が「01」に戻ってしまいます。

 セクション17のA0、0C列は、Norさんの言われたように、LOSに関係しているのかもしれませんね。ただし、確かめる方法は、ちょっと思いつきません。セクション17のA0、0C列をエディターで書き換えても、LOSが通るかどうかは再計算されません。で、再計算させるにはゲーム画面で右クリックしたりしますが、その際には、ユニットの向きなどもゲームプログラムが書き換えてしまうので、エディターで書き換えた値が上書きされLOSの計算に反映されないからからです。残念。 :sad:

 それから、セクション8のその他の列データについては、いまのところ手をつけていません。なんだか、とても、難しそうです。 :?

Post Reply