/* 新桃太郎伝説 文字コード解析 使い方: smmddeco 入力するROMイメージのファイル名 出力ファイル名 (出力ファイル名で指定したファイルが存在しても確認も何もなしに書き込むので注意。) 移動中の会話メッセージは正しく変換できません。 */ #include #include static const char *tbl_charcode_mb1_hiragana[] = { "", "\n", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "__", "__", "__", "__", "__", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", " ", "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", "W", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "(", ")", "「", "」", "~", "ー", "*", "(C)","+", "-", "/", "kg", "→", "←", "<", ">", "『", "』", "cm", "〓", "〓", "あ", "い", "う", "え", "お", "か", "き", "く", "け", "こ", "さ", "し", "す", "せ", "そ", "た", "ち", "つ", "て", "と", "な", "に", "ぬ", "ね", "の", "は", "ひ", "ふ", "へ", "ほ", "ま", "み", "む", "め", "も", "や", "ゆ", "よ", "ら", "り", "る", "れ", "ろ", "わ", "を", "ん", "で", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "が", "ぎ", "ぐ", "げ", "ご", "ざ", "じ", "ず", "ぜ", "ぞ", "だ", "ぢ", "づ", "ど", "ば", "び", "ぶ", "べ", "ぼ", "ぱ", "ぴ", "ぷ", "ぺ", "ぽ", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "ぁ", "ぃ", "ぅ", "ぇ", "ぉ", "っ", "ゃ", "ゅ", "ょ", "ゎ", "〓", "〓", "〓", "〓", "〓", "〓" }; static const char *tbl_charcode_mb1_katakana[] = { "", "\n", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "__", "__", "__", "__", "__", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", " ", "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", "W", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "(", ")", "「", "」", "~", "ー", "*", "(C)","+", "-", "/", "kg", "→", "←", "<", ">", "『", "』", "cm", "〓", "〓", "ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", "デ", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "ド", "バ", "ビ", "ブ", "ベ", "ボ", "パ", "ピ", "プ", "ペ", "ポ", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "ァ", "ィ", "ゥ", "ェ", "ォ", "ッ", "ャ", "ュ", "ョ", "〓", "〓", "〓", "〓", "〓", "〓", "〓" }; static const char *tbl_charcode_mb2_0x02[] = { /* まだ未解析 */ "0x0200", "0x0201", "0x0202", "0x0203", "0x0204", "0x0205", "0x0206", "0x0207", "0x0208", "0x0209", "0x020A", "0x020B", "0x020C", "0x020D", "0x020E", "0x020F", "0x0210", "0x0211", "0x0212", "0x0213", "0x0214", "0x0215", "0x0216", "0x0217", "0x0218", "0x0219", "0x021A", "0x021B", "0x021C", "0x021D", "0x021E", "0x021F", "0x0220", "0x0221", "0x0222", "0x0223", "0x0224", "0x0225", "0x0226", "0x0227", "0x0228", "0x0229", "0x022A", "0x022B", "0x022C", "0x022D", "0x022E", "0x022F", "0x0230", "0x0231", "0x0232", "0x0233", "0x0234", "0x0235", "0x0236", "0x0237", "0x0238", "0x0239", "0x023A", "0x023B", "0x023C", "0x023D", "0x023E", "0x023F", "0x0240", "0x0241", "0x0242", "0x0243", "0x0244", "0x0245", "0x0246", "0x0247", "0x0248", "0x0249", "0x024A", "0x024B", "0x024C", "0x024D", "0x024E", "0x024F", "0x0250", "0x0251", "0x0252", "0x0253", "0x0254", "0x0255", "0x0256", "0x0257", "0x0258", "0x0259", "0x025A", "0x025B", "0x025C", "0x025D", "0x025E", "0x025F", "0x0260", "0x0261", "0x0262", "0x0263", "0x0264", "0x0265", "0x0266", "0x0267", "0x0268", "0x0269", "0x026A", "0x026B", "0x026C", "0x026D", "0x026E", "0x026F", "0x0270", "0x0271", "0x0272", "0x0273", "0x0274", "0x0275", "0x0276", "0x0277", "0x0278", "0x0279", "0x027A", "0x027B", "0x027C", "0x027D", "0x027E", "0x027F", "0x0280", "0x0281", "0x0282", "0x0283", "0x0284", "0x0285", "0x0286", "0x0287", "0x0288", "0x0289", "0x028A", "0x028B", "0x028C", "0x028D", "0x028E", "0x028F", "0x0290", "0x0291", "0x0292", "0x0293", "0x0294", "0x0295", "0x0296", "0x0297", "0x0298", "0x0299", "0x029A", "0x029B", "0x029C", "0x029D", "0x029E", "0x029F", "桃太郎", "「けっ! しゃっきん してるやつなど\n はなしたくも ないわいっ!」", "「100両 もってないぞ!\n しかたがない! いま もってる\n お金だけでも もらってやろう!」\nは もっていた\n両を うばわれた!", "「これは オレさまの てまちんだ!\n 100両ためて また\n くることだな! へっへっへ!」", "「金の ないやつは\n このまちに ようがない!\n かえれ! かえれ!」", "「この はしを\n わたりたくば 100両よこせ!」", "せんにん", "ぢゃ!」", "ウヒャヒャ…", "いらっしゃーい", "ももたろう", "あたえた", "オニ", "おにがしま", "のじゅつ", "わし", "きんたん", "じゅつ", "どうぐ", "つかう", "回復した!", "チュチュン!", "おまえ", "まえ", "せいぎ", "ゆうき", "あい", "たび", "なか", "ありがとうございま", "たから", "じぞう", "おにぎり", "おきゃく", "「おお!", "ポイントの", "つかった!", "ください", "きんたろう", "むら", "すずめ", "わたし", "やしゃひめ", "うらしま", "まつり", "ちから", "あしゅら", "じごく", "ヘイ! ヘイ!", "おきゃくさん!", "ごようで?」","いただきます", "ございますか?", "「どなたが ", "道具袋", " 道具袋が", "なりますか?", " きょうは ", "0x02DA", "0x02DB", "0x02DC", "0x02DD", "0x02DD", "0x02DF", "0x02E0", "0x02E1", "0x02E2", "0x02E3", "0x02E4", "0x02E5", "0x02E6", "0x02E7", "0x02E8", "0x02E9", "0x02EA", "0x02EB", "0x02EC", "0x02ED", "0x02EE", "0x02EF", "0x02F0", "0x02F1", "0x02F2", "0x02F3", "0x02F4", "0x02F5", "0x02F6", "0x02F7", "0x02F8", "0x02F9", "0x02FA", "0x02FB", "0x02FC", "0x02FD", "0x02FE", "0x02FF", }; static const char *tbl_charcode_mb2[] = { /* 0x18 */ "桃", "太", "郎", "金", "浦", "島", "寝", "雪", "夜", "叉", "姫", "雷", "風", "神", "毒", "強", "東", "西", "南", "北", "村", "体", "力", "心", "段", "両", "話", "術", "道", "具", "調", "装", "備", "命", "令", "素", "母", "乱", "針", "族", "好", "安", "臣", "衛", "軌", "然", "校", "徒", "民", "妹", "限", "休", "巣", "竿", "背", "絶", "草", "級", "意", "祖", "親", "奴", "晩", "読", "大", "王", "技", "松", "竹", "梅", "麻", "人", "気", "度", "上", "下", "刀", "割", "小", "霞", "銀", "次", "吉", "犬", "何", "制", "総", "揮", "演", "口", "宏", "原", "画", "居", "孝", "幸", "楽", "関", "之", "監", "督", "哲", "美", "藤", "康", "博", "丈", "夫", "鳥", "特", "念", "勝", "社", "男", "市", "匹", "巻", "富", "止", "等", "賞", "商", "色", "今", "集", "宝", "情", "第", "一", "三", "九", "千", "面", "弦", "待", "満", "子", "山", "女", "木", "天", "牛", "不", "火", "水", "文", "月", "白", "乏", "世", "氷", "台", "主", "切", "生", "衣", "地", "虫", "死", "血", "吸", "多", "呑", "耳", "伊", "伏", "毎", "旬", "如", "沙", "貝", "赤", "邪", "坊", "吹", "吽", "見", "尾", "身", "魔", "受", "車", "父", "乙", "昔", "来", "化", "舟", "欲", "兄", "弟", "顔", "岩", "門", "青", "虎", "狗", "卒", "阿", "知", "狐", "怪", "臥", "苦", "河", "雨", "波", "刹", "勇", "食", "首", "炭", "海", "逆", "茨", "界", "蛯", "飛", "是", "鬼", "剛", "馬", "竜", "粉", "酒", "殺", "狼", "骨", "害", "翁", "黄", "漁", "黒", "貧", "異", "悪", "蛇", "婆", "魚", "船", "葉", "象", "無", "童", "嵐", "極", "喜", "悲", "儀", "式", "菩", "薩", "枯", "終", "値", "決", /* 0x19 */ "賊", "獏", "福", "猿", "獄", "緑", "漂", "様", "奪", "聞", "餓", "魃", "魅", "蓮", "霊", "敵", "龍", "燈", "醜", "磯", "羅", "図", "役", "利", "軍", "沼", "向", "坂", "国", "橋", "改", "員", "病", "闘", "器", "動", "残", "右", "少", "法", "智", "将", "闇", "味", "頭", "均", "位", "巳", "参", "題", "歌", "野", "寺", "材", "栄", "思", "直", "君", "徳", "近", "抜", "砂", "浜", "隕", "吐", "幻", "影", "百", "姥", "歴", "史", "数", "学", "豆", "土", "妖", "五", "丁", "鉄", "丸", "杖", "指", "姉", "運", "毛", "肉", "臼", "歯", "盲", "腸", "肛", "助", "代", "曲", "湯", "番", "汁", "並", "蜂", "乃", "語", "双", "遊", "報", "告", "矛", "盾", "亀", "進", "占", "産", "実", "雲", "猛", "嫌", "銭", "胸", "祭", "娘", "腕", "林", "開", "戻", "英", "泣", "潜", "発", "用", "砦", "花", "咲", "屋", "敷", "音", "洞", "窟", "仙", "庵", "足", "柄", "養", "老", "滝", "謎", "解", "塔", "恨", "持", "重", "職", "路", "溝", "底", "泉", "家", "旅", "立", "鹿", "角", "里", "宮", "城", "微", "笑", "希", "望", "都", "々", "蟹", "七", "夕", "畑", "名", "取", "郷", "雀", "宿", "静", "豊", "殿", "階", "仲", "間", "八", "部", "床", "谷", "川", "爪", "痕", "修", "行", "茶", "店", "袋", "手", "売", "品", "兵", "差", "額", "新", "買", "焼", "出", "物", "薬", "作", "説", "明", "掘", "刃", "包", "声", "餌", "入", "引", "前", "泊", "私", "井", "戸", "回", "復", "万", "皿", "全", "平", "和", "暗", "記", "時", "光", "者", "江", "穴", "怨", "牢", "夢", "虹", "左", "源", "内", "奈", "落", "縄", "池", "衆", "合", "焦", "熱", "寒", "鼻", "途", "ゞ", "最", /* 0x1a */ /* 巳:1A06のほうは真ん中の横棒が192Fより下にある。辰巳の巳は1A06 */ /* ※はびろ~んが話す言葉 */ "後", "先", "菓", "日", "本", "辰", "巳", "銘", "信", "糸", "呂", "年", "笛", "投", "箱", "自", "在", "歩", "打", "創", "崑", "崙", "順", "以", "攻", "撃", "言", "守", "戦", "逃", "相", "撲", "砲", "鳳", "凰", "冬", "方", "医", "工", "末", "計", "凶", "呪", "友", "個", "料", "亭", "志", "当", "理", "晶", "場", "所", "使", "沈", "汚", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "瓦", "鎖", "釜", "兜", "毘", "剣", "玄", "武", "朱", "予", "皮", "胴", "枚", "ニ", "鎧", "腹", "綿", "防", "高", "津", "正", "義", "凪", "朝", "師", "着", "潮", "琥", "珀", "真", "珠", "流", "星", "愛", "桜", "十", "単", "牙", "深", "紅", "絹", "綾", "折", "羽", "薄", "菜", "柳", "長", "隼", "団", "孫", "六", "菊", "字", "染", "棒", "銅", "炎", "怒", "独", "鈷", "錫", "稲", "妻", "空", "荒", "越", "中", "共", "迦", "楼", "伐", "四", "形", "息", "灼", "弓", "矢", "張", "侍", "有", "献", "加", "弱", "誰", "対", "負", "飲", "倍", "連", "続", "釣", "客", "奇", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "※", "退", "脱", "罪", "魂", "億", "現", "沓", "系", "鳴", "電", "旋", "突", "烈", "走", "忍", "尻", "筒", "涙", "壷", "元", "玉", "恒", "丹", "消", "寄", "効", "能", "隠", "蔵", "札", "根", "性", "照", "石", "晴", "呼", "会", "塩", "書", "秘", "伝", "早", "禁", "断", "古", "券", "鈴", "鏡", "室", "樹", "事", "ゐ", "甚", "痛", "盗", "苔", "森", "祠", "半", "分", "目", "点", "漢", "問", "算", "漬", "細", "崩", "追", "統", "願", "歳", /* 0x1b */ /*1B4Dが読み取れない(虍に禺のように見えるが…)*/ "増", "田", "景", "良", "澤", "隆", "誠", "達", "也", "崇", "篤", "佐", "久", "彦", "保", "若", "由", "弘", "恵", "沢", "笠", "敏", "秀", "貴", "昭", "洋", "章", "浩", "治", "茂", "司", "笹", "忠", "俊", "典", "熊", "岡", "経", "雅", "米", "捨", "版", "外", "広", "果", "録", "登", "別", "府", "温", "砕", "支", "配", "士", "斧", "那", "他", "敗", "仁", "礼", "須", "弥", "州", "辺", "葦", "週", "短", "公", "円", "偶", "変", "帰", "通", "評", "腰", "膀", "胱", "?", "肝", "臓", "肥", "脳", "管", "盤", "夏", "腱", "垂", "乳", "陰", "筋", "踵", "節", "房", "胆", "彩", "尿", "球", "眼", "精", "靭", "帯", "副", "腎", "胞", "奥", "視", "胃", "脈", "甲", "鼓", "膜", "亜", "脂", "肪", "股", "格", "試", "尚", "業", "仕", "労", "浮", "降", "耐", "種", "類", "遠", "固", "密", "滴", "答", "移", "失", "堂", "殊", "頼", "成", "杉", "織", "陸", "寿", "圧", "仏", "像", "園", "絵", "辻", "邦", "永", "圭", "祐", "哉", "脇", "賢", "堀", "渡", "宣", "崎", "協", "建", "淵", "植", "幹", "克", "昇", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", "〓", }; int main(int argc,char *argv[]){ int ch, ch2, katakana=0; FILE *infp = NULL, *outfp = NULL; char *infilename = NULL,*outfilename = NULL; if(argc < 3){ fprintf(stderr,"Usage : smmddeco src-filename dst-filename\n"); exit(1); } infilename=argv[1]; if((infp=fopen(infilename,"rb"))==NULL){ fprintf(stderr,"Can't open input file : %s\n",infilename); exit(1); } outfilename=argv[2]; if((outfp=fopen(outfilename,"wt"))==NULL){ fprintf(stderr,"Can't open output file : %s\n",outfilename); exit(1); } while((ch = fgetc(infp)) != EOF){ if (ch == 0x00){ /* 文字列終端 */ katakana=0; fputc('\n', outfp); } else if (ch == 0x02){ /* 定型文字列等 */ if ((ch2 = fgetc(infp)) == EOF){ break; } fputs(tbl_charcode_mb2_0x02[ch2], outfp); } /* 0x03:ひらがな切り替え 0x04:カタカナ切り替え 0x05~0x08:文字色 05:白 06:緑 07:赤 08:黄 0x09:文字列 0x0a:数字 0x0b:ウェイト(ボタン待ち、改ページ無し) 0x0c:改ページ 0x0d:メッセージ終端? 0x0e:何も出力しない? 0x0f:戦闘メッセージ終端 0x10:メッセージ終端? 0x11:先頭キャラの名前 0x12:ウェイト */ else if (ch == 0x03){ katakana=0; } else if (ch == 0x04){ katakana=1; } else if (0x05 <= ch && ch <= 0x0b){ } else if (ch == 0x0c){ fputc('\n', outfp); } else if (ch == 0x0d){ katakana=0; fputc('\n', outfp); } else if (ch == 0x0e){ } else if (ch == 0x0f){ } else if (ch == 0x10){ katakana=0; fputc('\n', outfp); } else if (ch == 0x11){ /* ほとんどの場合桃太郎 */ /* fputs("(先頭)", outfp); */ } else if (ch == 0x12){ } else if (0x18 <= ch && ch <= 0x1b){ if ((ch2 = fgetc(infp)) == EOF){ break; } fputs(tbl_charcode_mb2[((ch - 0x18) << 8) | ch2], outfp); } else if (0x1c <= ch && ch <= 0x1e){ if ((ch2 = fgetc(infp)) == EOF){ break; } /* fputs("〓", outfp); */ } else if (ch == 0x1f){ if ((ch2 = fgetc(infp)) == EOF){ break; } /* たぶん 使われていない */ /* fputs("姫", outfp); */ } else if (katakana){ fputs(tbl_charcode_mb1_katakana[ch], outfp); } else{ fputs(tbl_charcode_mb1_hiragana[ch], outfp); } } fclose(infp); fclose(outfp); infp = NULL; outfp = NULL; return 0; }