妖精大戦争のスコアの内部表現について


enum STAGE {
	STG_INIT = 0,	//定義上だけ存在
	STG_A1_1,
	STG_A1_2,
	STG_A1_3,
	STG_A2_2,
	STG_A2_3,
	STG_B1_1,
	STG_B1_2,
	STG_B1_3,
	STG_B2_2,
	STG_B2_3,
	STG_C1_1,
	STG_C1_2,
	STG_C1_3,
	STG_C2_2,
	STG_C2_3,
	STG_EX,
	STG_A1_CLEAR,
	STG_A2_CLEAR,
	STG_B1_CLEAR,
	STG_B2_CLEAR,
	STG_C1_CLEAR,
	STG_C2_CLEAR,
	STG_EX_CLEAR,
};

struct result {
	int score;		// スコアを1/10したもの
	char stage_no;	// ステージID
	char score2;		// スコアの下一桁、なぜここにあるのかは不明
	char name[9];		// 最大8文字、\0終端
	char padding;		// 常に0、おそらくコンパイラにより付加された物
	time_t time;		// 32bit unixtime、ここが0だと時間/ステージ/処理落ち率が---になる
	char unknown[4];	// 常に0
	float slowdown;	// 処理落ち率、0.2はそのまま0.2%と表示される
	char unknown2[4];	// 常に0
};

struct spell_result {
	char name[128];	// 長さ0で????扱い
	int no_damage;	// 銀メダル
	int no_ice;		// 金メダル
	int unknown;		// 不明、到達回数?
	int challenge;	// 銅メダル
	int unknown2;		// 不明
	int unknown3;		// 不明
};

enumやら変数名は適当につけたけど、だいたいこんななはず。
メモリー上の配置は0x0443A5D8、確認してないけどイージーから順に10個ずつ並んでいるんじゃないかな。
スペルの方はルナティックのスコア少し下のほうにあった(正確なアドレスは忘れた)

宣言

さすがに何もやって無さ過ぎると思うので宣言とか。

目的:妖精大戦争のバグを直す!
とりあえず、リプレイ再生でノーアイス増えるのと、雪印がずれている問題は簡単だろうからやる。
他は出来たら。

22:00追記
リプレイでノーアイス増える問題は直せた。
次、雪印直す。

22:45追記
食らいボムで雪印更新されないバグも直せた。
次は、出来そうか調べながら考える。

01:25追記
別ルートにスコアが記録されるバグを直した。
そろそろ時間なので、これでリリースする。

解析改造の用途

解析改造というと普通はチートや有料版の制限外しなど不正利用がメインらしい。
これらの行為は未対策のソフトであれば解析改造の中でも一番簡単な部類ではあるし、入門にはうってつけなのだろうが、さすがにメインとして扱うのはどうかと思う。
少なくとも、解析が好きだというと必ずこれらの用途だと思わるのは理不尽だ。

実際のところ、解析改造は必要悪とでも思われている節があると思っている。
互換な別ソフトを作るため、ウイルスに対抗するため
こういった無くてはならない正当な理由があるため表立って非難は出来ないが、99%は悪い用途にしか使われない、だから使い手のことを疑うのは当然だ。
そして、それらの技術を学ぼうとする人も多くは、禁止されると逆に知りたくなる、といった気持ちが働いているように思えてならない。

けれど実際には、趣味で解析する様な人だっているし、既存アプリに機能を付け加える人や、バグ修正パッチを作る人だっている。
なぜ解析改造という時点で悪いイメージが付きまとうのだろうか?
むしろ、解析改造は悪として、規約や法律という時点から解析改造に対して不利な方向にばかり倒されていること自体がおかしいのではないだろうか?

開発者の権利を侵すことは確かにいけないし、それを守るのは正しい。
けれど、開発者と解析者でお互いの権利が衝突しうる状況下において、とりあえず開発者側に倒すといった方向性であることは確かだ。
だからこそ、解析改造といった行為は、たとえ善意を持った行動であろうとも法律や規約上は悪とされ、胸を張ることの出来ない後ろめたいものとなってしまっている。

要するに、解析改造では、悪いことしてなくても後ろ指差されたり、どんなにがんばってもグレーゾーンから出られなかったりするのが理不尽だああああああ
ってそれだけの話でした。