星をみるひと 攻略 - 解析ツール
はじめに | 基礎データ | 乱数解析 | 戦闘システム | MAPイベント | パスワード解析 | 解析ツール |
ソース
|
(1)コード変換
星をみるひとのコード体系は次の通り。パスワード画面とは異なり、カタカナは使えない。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | ” | : | 力 | . | ||||||||||||
1 | ||||||||||||||||
2 | ||||||||||||||||
3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ゛ | ゜ | 、 | 。 | ! | ? |
4 | _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
5 | P | Q | R | S | T | U | V | W | X | Y | Z | あ | い | う | え | お |
6 | か | き | く | け | こ | さ | し | す | せ | そ | た | ち | つ | て | と | な |
7 | に | ぬ | ね | の | は | ひ | ふ | へ | ほ | ま | み | む | め | も | や | ゆ |
8 | よ | ら | り | る | れ | ろ | わ | を | ん | ゃ | ゅ | ょ | っ | ぁ | ぇ | ー |
9 | ||||||||||||||||
A | ||||||||||||||||
B | ||||||||||||||||
C | ||||||||||||||||
D | ||||||||||||||||
E | ||||||||||||||||
F | / |
変換プログラム
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> /*星をみるひとROMからテキストデータ取得*/ /*Linux 3.10.0-1127.13.1.el7.x86_64 + gcc (GCC) 4.8.5 で動作確認。*/ /*雑に gcc hoshimiru_kaiseki.c で a.outが生成されるので ./a.out 星をみるひと.nes でテキスト生成されました。*/ int fd, rb, cc, romc; char outbuf[4096], *otp; char binbuf[4096], *btp; unsigned char *buf, *p, *fin; char *hoshicode[] = { " ","”",":","力", "."," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", "0","1","2","3", "4","5","6","7", "8","9","゛","゜", "、","。","!","?", "_","A","B","C", "D","E","F","G", "H","I","J","K", "L","M","N","O", "P","Q","R","S", "T","U","V","W", "X","Y","Z","あ", "い","う","え","お", "か","き","く","け", "こ","さ","し","す", "せ","そ","た","ち", "つ","て","と","な", "に","ぬ","ね","の", "は","ひ","ふ","へ", "ほ","ま","み","む", "め","も","や","ゆ", "よ","ら","り","る", "れ","ろ","わ","を", "ん","ゃ","ゅ","ょ", "っ","ぁ","ぇ","ー", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," "," ", " "," "," ","/" }; int main(int argc, char * argv[]) { if((fd = open(argv[1], O_RDONLY) ) < 0) return 1; buf = calloc(1024 * 1024 , sizeof(char)); for(p = buf; (rb = read(fd, p, 256)) != 0 ; p += rb); fin = p; otp = outbuf; *otp = 0; btp = binbuf; *btp = 0; for(romc = 0, cc = 0, p = buf; p < fin; cc++, p++, romc++){ if(cc == 16){ romc = 0; } if(cc % 16 == 0){ if(cc > 0){ printf("%s %s \n", binbuf, outbuf); printf("%07x: BANK%02d:%04x: ", cc, romc / (16 * 1024) , romc % (16 * 1024) ); }else{ printf("%07x: HEADER:%04x: ", cc, romc / (16 * 1024) ); } btp = binbuf; *btp = 0; otp = outbuf; *otp = 0; } btp += sprintf(btp, "%02x", *p); if(cc % 2 == 1)btp += sprintf(btp, " "); *btp = 0; otp += sprintf(otp, hoshicode[*p]); *otp = 0; } printf("%s %s \n", binbuf, outbuf); free(buf); close(fd); return 0; }
(2)乱数解析
敵パーティの解析に使ったプログラム
#include/*ほしみる乱数で敵パーティ解析 はじめの世界*/ int nextrand(int i0505, int i56) { int A, tmpA, i06; A = (i0505 + i56) & 0xFF; i06 = A; A = A & 0x81; tmpA = A ^ 0x81; if(A==0 || tmpA == 0){ A = i06 + i06 + 1; }else{ A = i06 + i06 ; } A = A & 0xFF; i0505 = A; return i0505; } int main(int argc, char * argv[]) { int a, b, t, h; int ene[4]; /*敵パーティ*/ char *nam[]={ " 1:じゃんく "," 2:ふらっか ","12:さらまんど ","15:ぺるぜでぶ "," 9:らむじ ", "10:ちぇいさ "," 8:くらっしゃ ","23:ふっかつしゃ"," 1:じゃんく "," 2:ふらっか ", "12:さらまんど ","15:ぺるぜでぶ "," 9:らむじ "," 1:じゃんく "," 2:ふらっか ", "12:さらまんど ","**: " }; /* アークCITYは以下 char *nam[]={ " 4:しゅーた "," 3:すとーか ","12:のーずあい ","19:さんふらん ","24:ばたりあん ", "25:えるみねーた","11:めしあ ","20:ゆりげーる "," 7:くれおぱとら"," 4:しゅーた ", " 3:すとーか ","12:のーずあい ","19:さんふらん ","24:ばたりあん "," 4:しゅーた ", " 3:すとーか ","**: " }; */ /* 宇宙タワーは以下 char *nam[]={ " 5:らんじゃ ","17:ぽいすん ","18:ゆりだぬす ","16:ばーすとのう","14:もっこし ", " 6:しろいわに ","22:どな ","21:すりーぱ "," 5:らんじゃ "," 5:らんじゃ ", "17:ぽいすん ","17:ぽいすん ","18:ゆりだぬす ","18:ゆりだぬす ","16:ばーすとのう", "14:もっこし ","**: " }; */ for(t = 0; t < 256; t++){ for(b = 0; b < 256; b++){ /*直前の乱数値設定*/ a = b; /*敵パーティ初期化*/ ene[0] = 16; ene[1] = 16; ene[2] = 16; ene[3] = 16; /*エンカウント判定*/ a = nextrand(a, t); h = a & 0x1E; /*アークCITYは 0x0E 宇宙タワーは 0x06 */ if(h == 0x04){ /*2番目のID抽選*/ a = nextrand(a, t); ene[1] = a & 0x0f; /*1番目が出現するか判定*/ a = nextrand(a, t); h = a & 0x07; if(h == 0){ ene[0] = ene[1]; } /*3番目の出現判定*/ a = nextrand(a, t); h = a & 0x0e; /*アークCITYは 0x06 宇宙タワーは 0x06 */ if(h == 0x04){ /*3番目のID抽選*/ a = nextrand(a, t); ene[2] = a & 0x0f; /*4番目の出現判定*/ a = nextrand(a, t); h = a & 0x0e; if(h == 0){ ene[3] = ene[2]; } } printf("%s %s %s %s\n", nam[ene[0]], nam[ene[1]], nam[ene[2]], nam[ene[3]]); } } } return 0; }