非想天則北斗化計画

三田祭がどうのこうので休みになりました。
ということでスミス氏によりキャラセレ(とステージ)のBGMが北斗になって一気に北斗らしくなった非想天則ですが、やはりあのBGMにはジョインジョイン選択音が必要だと痛感していた訳です。BGM変更はSWRSToysを使ってできるのですが、効果音の変更は.datファイルの再構築(展開はBrightmoonで)が必要であり、スミス氏から要望が寄せられていました。
ということでBrightmoonのソースコードを横に置いて同じようなことをするプログラムを書きながら仕組みを追いかけました。読んだのはmainwnd.cpp、arctmp.cpp、mt.hpp、hinanawi.hpp/cppあたり。hinanawi.cppから継承元・呼び出し元をたどってこのファイルだけ読めばいいことを確認しました。


で、展開と違って面倒なのはサブディレクトリも含めたファイルの列挙なので、Javaってしまったのが間違いでした。多分メルセンヌツイスタ*1(以下MT)がアレっちゃったんでしょう。ずいぶん手間取りましたがとにかく完成はしました。ただし、中に入っているのは.cv0 .cv1 .cv2 .cv3などのよくわからないファイルとなっています。

  • .cv0 テキスト
  • .cv1 csv
  • .cv2 画像データ
  • .cv3 効果音

らしいです。
この辺りは一般形式への変換はちらほら見かける気がしますが、この形式への変換で見つけたのはth105_SEについているオマケ、cvn_convert。

cvn_convert.exe
おまけ、cv0〜3と一般形式を相互変換します。
ドラッグ&ドロップでcv0←→txt、cv1←→csv、cv2→png、cv3←→wavに変換します。
png→cv2ができないのは仕様です。

だそうです。ソースを見たところ、cv3はフォーマット構造体と波形データがくっついてるだけで、wavファイルからチャンク名を取り除いただけのようなものになっています。多分他もそんなに難しい形式じゃない…はず。

Q:てんこあいしてる?
A:いや別に

Q:シャンハーイ?
A:シャンハーイ!

……あれ?
AIの作者でした。
なんだかんだで人数少ないよね。いろいろと。
多分ここが一番いろいろなページに飛べるかと。勝手に張っちゃう。ガラクタ置き場にAIやSEが落ちてます。ブログでは解析風景の記事も読めますよ。
http://wordpress.click3.org/?page_id=2


th105_SEで展開したファイルを見た後のロードマップ

  • th105_SEのソースをいじるかBrightmoonの出力を合成するかして、元形式と一般形式の両方が含まれるdataフォルダ構成を作る。
  • なんらかの一般形式をいじる
  • th105_SEのオマケツールで元形式を上書きする
  • 今回作成したツールを改変し、元形式の拡張子のみパックするようにする。
  • 非想天則本体へdatをコピー。

これ、なんかものすごくソフトウェアのビルド作業に似てる…!makefile使えそうで怖い。


黄昏のスクリーンショットの加工禁止の記述から同一性保持権の主張を読み取ると、例えばBGMや効果音の変わった動画等は自粛すべきだと思います、基本的に。BGM差し替え・パレット変更した対戦動画とかよく見るけどね。さすがにこういうのを禁止するのはやりすぎだと思う。その程度。ただ、データファイルの抜き出し禁止は名指しで書かれているし、つまりはこの記事を読んでできた結果を動画サイトにアップするのはおすすめしない。


今回使用したメモ
大げさに言うと悪用禁止

list_count[2]
list_size[4]
list_data[list_size]
file_data[?]

* list_data
(
	offset(absolute file pointer in file)[4]
	size[4]
	name_len[1]
	name(string)[name_len]
)[list_count]

* list_data xor
	RNG_MT mt(list_size + 6);
	for(uint32_t i = 0; i < list_size; ++i)
		list_buf[i] ^= mt.next_int32() & 0xFF;
	uint8_t k = 0xC5, t = 0x83;
	for(uint32_t i = 0; i < list_size; ++i) {
		list_buf[i] ^= k; k += t; t +=0x53;
	}

* file_data xor
  uint8_t k = (entry->offset >> 1) | 0x23;
  for(uint32_t i = 0; i < entry->size; ++i)
    data[i] ^= k;

*1:高品質高速乱数アルゴリズム