洞窟物語 「どこでもセーブ」パッチ

Posted on

概要

 「洞窟物語」という、開発室pixel製作のWindows用フリーゲームに、「どこでもセーブ」機能を追加します。

 おまけとして、「消音」機能を開放します。

ダウンロード

いろいろ

 パッチの使用は自己責任でお願いします(おやくそく)。

 死亡中にセーブを書くと、リトライしても即死するので、ご注意ください。

適当な解説

20061010-01.JPG

 その手のリソースエディタを適当に覗くと、「デバッガセーブ」と「消音」のメニューが隠されていることに気づくと思います。これは・・・去年に撮ったスクリーンショットですね。リソースエディタでは解除できないので、DeleteMenu関数を探して、解除します。

 昨日気づいたんですが、デバッガセーブの吐いたデータは、実はほとんど普通のセーブデータに近いものです。で、いろいろ解析していじった結果、デバッガセーブのメニューから、普通のセーブを生成出来るようになりました。

 デバッガセーブのメニューはいつでも選べるため、どこでもセーブできることになります。以下、この改造版デバッガセーブメニューを、「どこでもセーブ」と呼びます。

 ただし、ゲームを始める前に「どこでもセーブ」で保存してしまうと、ゲームを始める前の「どこでもセーブ」のデータは普通のセーブとして読むとエラーが起きてしまいます。わかりづらいと思いますが、要はゲーム本編を開始する前に「どこでもセーブ」でセーブを書くとデータが破壊されるということです。

 これを解決するために、ゲームを開始するまでメニューをグレーにしておきました。パラサイトルーチンまで駆使して、自分なりには結構凝ってます。ってかパラサイトルーチンを本格的に噛ましたのはこれが初めてかな?やっと改造っぽくなってまいりましたw

20061010-02.JPG

 で、いろいろリソースエディタでテキストその他をいじって完成、と。。。

よくわからなかった今後の課題

  • セーブファイルの読み込み時に、ほぼ同時期に”290.rec”というファイルを読み込もうとします。何?

追記 20:45

 290.recは多分隠しダンジョンのレコード記録用ファイルですね。。。ダンジョン出したこと無いから分からなかった。。

GBA版パネルでポン修正パッチ 「セレクトへ戻る」使用不能

Posted on

効用

 スタートを押して出るPAUSEメニューで、「セレクトへ戻る」を使っても「このままつづける」と同じ効果になります。ついでに最初に出てくる警告メッセージも削除してあります。

パッチ概要

 先日パネルでポンのエンドレスで99万9999(6桁カンスト)しようとした所、AでPAUSEメニューを出したときに間違えて「セレクトへ戻る」を押してしまい、スコアがパーになりました。それで頭に来たので、このメニューを無効化するパッチを製作しました。

 パネポン発売一周年記念ってことで。

書き換えポイント

0810eb34:d00a
0810eb38:d00a

ジャンプ先の調整です。

0810eb4c:2001
0810eb4e:7020

カーソルの指している位置を無理やり「このままつづける」に変更します。

ちなみに,

0810eb4c:2000

にすると,「最初から」になります.一応.目的から言ってそれはやりませんがw

書き換えパッチ

 IPSと実行ファイルの二つを用意しました。

その他

 製作時間は2日で合計4時間ぐらい。そんなもんですかね。パッチをあてたROMを起動するにはフラッシュカードとかSuperCardとかその手のが必要ですが、前者はともかくSuperCardとかM3Adapterは電池を食うので、バッテリー切れでスコアがパーになる可能性もあります。ご注意ください。エミュレータでやるんだったらどこでもセーブがあるので、このパッチ自体不要だと思います。

 逆汗でもしてもらえれば分かるんですが、カーソルのさしている先で処理を分岐する所が、いらないといえばいらない分岐をしているので、そこを消してなんとか他の命令を書き込むスペースをギリギリ確保しています。良かった、良かった。ただしその分,エラー処理が消えてます.まあいいか.

bitGenerations用「警告-健康と安全のために」解除パッチャー

Posted on

 ウェイトコードと、一部のループをつぶしています。OrbitalとColorisの処理を参考にして作ったので、OrbitalとColorisでは完璧に動作します。

ダウンロード

 使用にはJavaが動作する環境が必要です。使用方法はファイル名をコマンドライン引数にして実行するだけです。

 Windowsの場合はサーナイトのアイコンのプログラムにドラッグ&ドロップするだけで使えます。複数ファイルOKです。(と思ったけどサーナイトのアイコンのプログラムの方のバグで無理な場合もあるかも?そのときはひとつづつお願いします。。。。)

使用は自己責任でお願いします。(おやくそく)

動作リスト

  • 1st
    • Boundish—?
    • Dial Hex—?
    • Dot Stream—?
  • 2nd
    • Sound Voyager–?
    • Orbital–○
    • Digi Drive–?
    • Coloris–○

○:完璧に動作する

△:すこし問題あり

×:解除できない、または起動できない

?:不明

テスト結果を募集中です。ご協力お願いします。

GBA「警告-健康と安全のために」メッセージ解析

Posted on

 DSに合わせて最近の任天堂製GBAソフトにつくようになった、「警告-健康と安全のために」という題名の警告メッセージ。最初の一回だけとはいえ、イライラします。確実に興ざめです。消すべく解析してみました。

共通のパッチャーは・・・作れない!

 RTCの時計無効化パッチや、セーブパッチ(って何やってるのか知りませんけど)は共通のパッチ用プログラムがあって、なかなか便利です。これはハードウェアである以上使用方法が一緒だからだと思いますが、そうなるとハードウェアとはあまり関係が無い警告メッセージは共通パッチャは作れません。個別に解析する必要があります。

 いや、当初は作れるかなと思っていたんです。このプログラムはどうせ同じプログラムを使いまわしてると思ってたので。しかし・・・。警告メッセージのプログラムは共通ではありません。

 わかりやすい違いは、たとえばポケモン不思議のダンジョンです。ほかのゲームの警告メッセージは、「ボタンを押してください」の点滅がフェードイン、フェードアウトを繰り返す滑らかな点滅なのに対し、このゲームだけはフェードインもフェードアウトもせず、いきなり黒文字がでて、いきなり消えます。

 なめらかな点滅のもの同士でも、逆アセンブルリスト上、ずいぶん異なります。ここまで違うのはコンパイルオプションの最適化の影響ではないと思います。

BitGenerationsだけは共通パッチャ作れそう

 BitGenerationsの「Orbital」を解析して発見した特徴的なビット列を「Coloris」でも発見しました。これらはさすがに同じプログラムを使いまわしているようです。

 そのすぐ後に出た「リズム天国」も調べてみたところ、発見できませんでした。やはり開発プロジェクトごとにこのプログラムを作っているようです。まあそんなに難しくもないですしね。

BitGenerationsのメッセージプログラムの特徴

  • 0x04000006のIOレジスタを何度も用いたウェイトコード。なぜか関数に纏めずに毎回毎回直に書いてるので検索すればすくにわかる。
  • その周辺で0x04000130のキー入力を読んでる。普通は専用関数に飛ばすし、その関数はひとつだけ。(ドクマリパネポンは例外として共通メニュー、ゲーム本編*2、お試し版*2で合計5つ存在します)

これだけだと不十分で一瞬表示されてしまうこともあるので、一部のループも回避しないと駄目っぽいです。

解析のためのヒント

 まずはキー入力だと思います。BitGenerationsは制御コードに直に描いてあったので、見つけやすいです。何かひとつでもボタンを押しているかどうかのチェックを行っているというのもヒントだと思います。

 それを見つけたらあとは周辺のadd r0,#0x1とか、レジスタとの条件分岐とか、丁寧に読むのが面倒だったらそこらへんのを適当につぶしてれば見つかると思います。フェードイン用、文字が点滅し始めるまで用、文字の点滅用、フェードアウト用で4つくらいはカウントと条件分岐があるはずです。

 ジャンプ命令を使って飛ばそうというのは若干無謀です。大人しくちょこまかいじった方が安定しているようです。

BitGenerations用のパッチャ作ってくるノシ

 やっぱJavaかな。特定の環境でしか動かないプログラムはできるだけ作りたくない。まあ動かすまでが面倒ですが、こんなのを使う人間ならすでにJavaの実行環境くらい持ってる気がw

「成分解析」 for CGI written in C

Posted on

もしかして,自分,馬鹿じゃね?(何を今更

これ,プログラミングの練習に丁度いいですね.そうですね,HelloWorldの次の次の次の次くらいに書くには丁度良いですね.

っていうか,その,ポインタで結構苦戦しました(ぉ

Javaの参照型で慣れてるつもりだったんですが,ダメダメですね.

「成分解析」 for CGI written in Cの成分解析結果 :
「成分解析」 for CGI written in Cの40%はやらしさで出来ています。
「成分解析」 for CGI written in Cの34%は柳の樹皮で出来ています。
「成分解析」 for CGI written in Cの22%は砂糖で出来ています。
「成分解析」 for CGI written in Cの2%は鍛錬で出来ています。
「成分解析」 for CGI written in Cの1%は努力で出来ています。
「成分解析」 for CGI written in Cの1%はツンデレで出来ています。

うるさいうるさいうるさい!(ぉ

(04/07追記)GETメソッドにしてみました.こっちの方が簡単なのに,なんでPOSTにしてたんだろ?掲示板とかだとPOSTの方が良いらしいんですが.つか宿題終わってねぇ(‘A`)

(04/12追記)同じパーセンテージの時に,少し結果が変わってしまうのを修正.

「成分解析」 for Java

Posted on

 「成分解析」解析結果に基づいて,JavaAppletで作っちゃいました.よって,本家と同じ結果を返します.あれ?宿題やるんじゃないの?(‘A`)

 重そうなので下においておきます.つーかさ,Javaでツール作るって結構難しいね.符号なしの型が無いからさ.Cでも本格的にお勉強しようかしら.

 なお,本家には10種類以上表示できないバグ(“あ”といれて見ればわかる.99%にしかならない)があるのですが,Java版では本来の動作をさせています.

 (04/06追記)CでCGIにも移植しました.

Read more

東鳩2のその他のソースが見れるぞ!

Posted on

ToHeart2ほかAquaPlus/LeafのGPLゲーをいじるスレ

 GPLライセンスのライブラリを使ってしまったのでしょうがなく公開しています,という話.5本くらいのゲームのソースが入って,全部で20メガちょいです(解凍後).

 普段なかなか見れない,商用ゲームのソースが見れるという事でちょっとワクワク.まあ,「プレイヤーがデバッガー」らしい,エロゲですからじぇんじぇん期待してませんけどね.

DirectX SDKのインストール

 なんかVisualC++ Express EditionでのコンパイルにはDirectXとPlatformSDKが居るっぽいので現在ダウンロード中.DirectX SDK,300メガ以上あるんですけど.なにこれ.インストールしようとしたら,

Extracting file failed.It is most likely caused by low memory (low disk space for swapping file) or corrupted Cabinet file.

・・・残りの容量はどう考えてもあるので,どうもファイル破損みたいです.何度かダウンロードし直したら大丈夫でした.

ソースウォッチング

 ソースですが・・・なんでコメントが殆ど無いんだよ(;´Д`)

 エロゲなだけにコメントも卑猥なの・・・?

ToHeart2のGM_AvgMsg.cppを見てください.先頭の8行なんて,こうですよ,こう.


 何も無いじゃないかって?つ「ドラッグ」・・・なんのためなんだ,これw

 最初のリンク先ではスペルミスなんかも指摘されてましたが・・・絶対に自分のソースは見られたくないな,と思った瞬間でした^^;

で,さらに東鳩2ソースと格闘中 リンカが外部参照エラー

PlatformSDKとDirectXSDKを入れた後,こちらの方法でほとんどうまくいっています.

が,しかし,「afxres.h」が無いというエラーが.こちらを参考にしてください.しかし私の場合,なぜかインクルードパスとして指定しているとことに入れてもダメだったので,新しくヘッダファイルをプロジェクトに追加して作りましたです.

 すると,コンパイルはできました.コンパイルは.Warningが恐ろしいくらい出るけどな†1wwwww

 ・・・でも,リンクが出来ない^^;

ToHeart2.exe : fatal error LNK1120: 外部参照 103 が未解決です。

 らしいですよ・・・何が問題なんだろう.GetMessageAとか一般的なAPIが呼べてない・・・.

 ライブラリのパスとして,PlatformSDKとDirectXのlibのパスが指定されています.うーん,なんで?

解決 しかし,コンパイル・リンクともに正常終了

user32.lib comdlg32.lib advapi32.lib GDI32.lib shell32.lib ole32.lib

をリンカの追加オプションとして指定したところ,何とか通りました.絶対パス通ってないじゃんw

うーん,PlatformSDKのlib内にあることは確認したんですが,なぜか認識されてないようです.

まあ,通ったので良しとします.と言いたいのですが・・・なぜか強制終了して起動しない_| ̄|○

 「Microsoft Visual Studio 8\VC\include\Vector」の756行目でダメらしいです.ソース見たけど良く分からないのでパス.

結局,この3時間は何だったのか

 ちくしょう,3時間ぐらい掛かったのに,結局出来ませんでしたね.元々ゲームデータが無いから出来ないけどさ^^;

 あ,でもデータを入れたらうまくいく可能性も残ってるよな.でもその検証には製品版が・・・製品版は18禁なので買えなくて・・・結局何のためにやってるんだ,自分.コンパイルしても意味が無い・・・かも?_| ̄|○

 あ,ちなみにビルド時の合計Warning数は256でした.ぴったりですね.調整してるの?w

  • †1: 使ってない変数が多い.多分,デバッグ用コードを抜いたんだな・・・

「成分解析」解析結果

Posted on

今2ちゃんねるで「成分解析」というソフトがはやってるみたいですね.絶好の解析練習対象なので,やっちゃいました.

なお,解析結果が正しいとは限りません.結果は自己責任で使ってください(使う人って居るの?w

(04/04追記)Javaに移植しました.

(04/06追記)CでCGIにも移植しました.

(04/15追記)魔界の仮面弁士さんが各種移植版をまとめてくれました!感謝.

この結果を使った場合,ぜひ私に教えてください.あと情報提供元も明記してくれるとうれしいなとか思ったり.商用利用のときは必ず連絡してください.(しないと思うけどなw)

文字列の変換

まずは,文字列を合成することからはじめる.

長い文字列(Shift-JIS形式)を,4バイトの数値へ変換する.

 

返したい数値をcodeとする.

また,N=0とする.

  1. 与えられた文字列のNバイト目を取得する.これをstrとする.
  2. strを((N and 3) << 3)だけ左シフトする.
  3. codeに上の結果を足す.
  4. Nに1を足す
  5. 1に戻る

こうして,4バイトの数codeを得る.

 

種類とパーセンテージの取り出し

種類とパーセンテージを取りだす関数を用いる.この関数をランダム関数と呼ぶことにする.

ランダム関数は後に示す.

 

[残りのパーセンテージ]に100を代入する

  1. 種類の決定
    1. ランダム関数を用いて得た結果を100で割って余りを求める
    2. その余りが種類である.品物リストは最後に示す.
    3. 今までに得た品物リストと比較し,同じであったらループの最初へ戻る
  2. パーセンテージの決定
    1. ランダム関数を再度用いて得られた結果を[残りのパーセンテージ]で割った余りを求める
    2. それに1を足したものがパーセンテージである.
    3. [残りのパーセンテージ]から上で得た結果を引く.
  3. [残りのパーセンテージ]が0になったら抜ける.でなければ最初に戻る.

なお,残りのパーセンテージが50%の時は,「~の半分は~」になり,残りの種類も50%の時は「~のもう半分は~」になります.100%のときは「~はすべて~」になりますのでご注意ください.

 

ランダム関数

言葉での説明が辛いので擬似コードで書く.

引数には前回の結果を使う.

初回の引数は「文字列の変換」で得られた数値である.

unsigined int seed = 0; //グローバル変数.
		//初期化には,文字列から変換した数値を使う
unsigned int random(){
	int result;
	seed *= 214013;
	seed += 2531011; // ->次に呼び出されたときのseedに使う
	result = seed;
	result = result >> 0x10;
	result &= 0x7fff;
	return result;
}

 

ソート関数

結果を得た後,パーセンテージでソートする必要がある.これがそのソート用の関数である.

    public void sort(Element[] elt) {
        for (int i = elt.length - 1; i > 0; i--) {
            int prev = 0;
            for (int j = 1; j <= i; j++) {
                if (!(elt[prev].Parcentage <= elt[j].Parcentage)) {
                    prev = j;
                }
            }
            /*iとprevについて入れ替える*/
            swap(elt, i, prev);
        }
    }

Javaで書くとこのような感じになる.基本的にバブルソートである.すいませんセレクションソートって言うらしいです.

 

感想

この解析に二時間以上かかってます.ダメっすよね,うん.

でもまあ,最後まで解析できたということで60点くらいはあげてもいいかなぁ.

ちなみに,

ψ(プサイ)の成分解析結果 : 
ψ(プサイ)の43%は食塩で出来ています。
ψ(プサイ)の36%は血で出来ています。
ψ(プサイ)の18%は厳しさで出来ています。
ψ(プサイ)の2%は真空で出来ています。
ψ(プサイ)の1%は鉄の意志で出来ています。

どうみてもしょっぱすぎです.本当にありがとうございました(何

 

品物リスト

0x00:下心
0x01:微妙さ
0x02:優雅さ
0x03:華麗さ
0x04:かわいさ
0x05:やさしさ
0x06:やましさ
0x07:やらしさ
0x08:むなしさ
0x09:ツンデレ
0x0a:厳しさ
0x0b:世の無常さ
0x0c:ハッタリ
0x0d:ビタミン
0x0e:努力
0x0f:気合
0x10:根性
0x11:砂糖
0x12:食塩
0x13:愛
0x14:電波
0x15:毒電波
0x16:元気玉
0x17:怨念
0x18:大阪のおいしい水
0x19:明太子
0x1a:勇気
0x1b:運
0x1c:電力
0x1d:小麦粉
0x1e:汗と涙(化合物)
0x1f:覚悟
0x20:大人の都合
0x21:見栄
0x22:欲望
0x23:嘘
0x24:真空
0x25:呪詛
0x26:信念
0x27:夢
0x28:記憶
0x29:鉄の意志
0x2a:カルシウム
0x2b:魔法
0x2c:希望
0x2d:不思議
0x2e:勢い
0x2f:度胸
0x30:乙女心
0x31:罠
0x32:花崗岩
0x33:宇宙の意思
0x34:犠牲
0x35:毒物
0x36:鉛
0x37:海水
0x38:蛇の抜け殻
0x39:波動
0x3a:純金
0x3b:情報
0x3c:知識
0x3e:知恵
0x3e:魂の炎
0x3f:媚び
0x40:保存料
0x41:着色料
0x42:税金
0x43:歌
0x44:苦労
0x45:柳の樹皮
0x46:睡眠薬
0x47:スライム
0x48:アルコール
0x49:時間
0x4a:果物
0x4b:玉露
0x4c:利益
0x4d:赤い何か
0x4e:白い何か
0x4f:鍛錬
0x50:月の光
0x51:回路
0x52:野望
0x53:陰謀
0x54:雪の結晶
0x55:株
0x56:黒インク
0x57:白インク
0x58:カテキン
0x59:祝福
0x5a:気の迷い
0x5b:マイナスイオン
0x5c:濃硫酸
0x5d:ミスリル
0x5e:お菓子
0x5f:言葉
0x60:心の壁
0x61:成功の鍵
0x62:理論
0x63:血

Read more

ポケモン個々のデータのチェックサム

Posted on

 現在,たまーに,ですが,ポケモン一匹一匹のデータを解析中です.どうも色々と暗号化みたいなものがかかっている様で,なかなかうまくいきません.復号化†1ルーチンから攻めようかと思ったのですが,かなり複雑で行き詰まり(ぉ,今度は暗号化ルーチンから攻めようかと思ったら実行時間が1フレームを超えるほど処理が長く(苦笑),なかなか苦戦しています・・・.

 かと言って某ポケモンエディタを解析するんじゃなんか負けな気もするので,がんばります・・・.暗号化,復号化,どっちから攻めようかなぁ・・・.

 まずは「ダメタマゴ」にならないためにチェックサムの計算から解析する事にしました.すこしポケモンのステータス(技等)を書き換えて絞り込んだ結果,チェックサムは一匹目は030042acより2バイトっぽい事が分かりました.で,データから計算したチェックサムとここに書かれているデータを比較してるわけですが,まずはそのチェックを外してみました.そのためには以下のようにプログラムを書き換えてください.R/S専用です.

「ダメタマゴ」チェックサムのチェックをはずす(R/S専用)

0803a026:e00a(halfword)

※VBAはプログラムを書き換えられないのでメモリビューアで自力で書き換えてください.

 逆アセンブルしてみれば分かりますが,単なるジャンプ命令に変えてるだけです.

 これで適当に1バイトずついじって,どのデータが何処にあるか分かるかも・・・と思いきや,一箇所のデータがほかの場所にも相互に作用しているらしく,バグって落ちます・・・_| ̄|○

 また,チェックサムより前のデータをいじくると「ダメタマゴ」ではないけど,タマゴになったケースもありました.チェックサムはここだけなんですが,これは・・・本当にタマゴになった†2,という可能性もアリですね.

 なお,肝心のチェックサム計算方法ですが・・・復号化するときに使ったのと同じルーチンを多様して求めている,までしか今のところ分かりません^^;

 「まずは復号化ルーチンを解析してからにしろや^^」,という事でしょうか・・・.

 なお,コードは私への連絡先を示す,という条件付きで転載許可します.まあ誰も転載しないと思うけどねぇ.一応ね,一応.

  • †1: 複合化?はぁ?^^
  • †2: エラーが発生して,でなく,タマゴになるようにデータを書き換えてしまった

ポケモンセーブデータエディタ 公開しました

Posted on

公開されたみたいですね.チートはほどほどに.バグ報告・実装してほしい機能などその他募集中です.

以下,さっき私のサーチしたコードを乗せておきます.

 

ポケコロのポケクーポン最大

;ポケコロのポケクーポン最大

both:04:33b:ffffff

なぜかポケクーポンは3バイトみたいです.中途半端.それ以上増やしても,画面の表示が増えません.しょうがない.また,開始アドレスが4の倍数でないのもすごく不思議だ・・・.不思議なソフトですね・・・.

 

ふるびたかいず

すごく長いコードになりました.よって「続きを読む」にしておきます.一応分割もできたんですが,めんどくさかったのでこのままでw

基本的に差分とってるだけです.この差分をとる作業を簡単に出来るように,次のバージョンでは自動で差分をとってコード化する機能をつけて見ようかなぁと.まあチケット関係のイベントがこれ以上ない今となってはあまりメリットが無いんですが・・・(‘A`)

 

うーん,このツールが1年前に出来ていればすぐにこのコード出せたんですけどね.ソフト制作が遅すぎた・・・.もうちょっと速ければ,既存のポケモンのデータ改造ツールと肩を並べられたかも・・・.あまりプログラミング技術を持っていない人でもそこそこにコンピュータ関連の知識があれば簡単にこのコードは作れる(上で実装しようか検討していた機能を実装すれば,それこそ知識がほとんど無くてもコード作成可能に・・・)ので,そこがアドバンテージになった・・・かもしれないのになぁ.残念.

Read more