#!/usr/local/bin/perl # # DC版みずいろ のシナリオデータを出力してみる # # Ver.0.01 2002/05/06 新規作成 # use FileHandle; # $debug = 1; # $inst_dir = "E:\\DATA\\VCDROM\\MIZU_DC\\FILE\\"; # DCみずいろのファイルがあるディレクトリ $CR ="\n"; $ZERO = pack( "C", 0 ); # $name1 = "健三郎"; $name2 = "ぴゅー"; # #$start = 0x04b020; # シナリオの先頭? $start = 0x000000; # シナリオの先頭 # $scenario_file = $inst_dir."EVENTDAT.FAR"; until ( open( FILE,$scenario_file ) ) { print "$!($scenario_file)\n"; exit; } binmode FILE; # $output_file ="mizu_scn.txt"; until ( open( OUT,"> $output_file" ) ) { print "$!($output_file)\n"; exit; } autoflush OUT; # seek( FILE, $start, 0 ); $FP = $start; while( 1 ) { unless ( read( FILE, $com, 1 ) ) { exit; } $c = unpack( "C", $com ); if ( $c == 0 ) { # NOP # } elsif ( $c == 0x01 ) { # ラベル定義? read( FILE, $para, 1 ); # 謎パラメータ。実際は命令語は 2byte か? $label = &get_text(); &PRINT( "#label \"".$label."\"", 0 ); &PRINT_PARA( $para ,0 ); } elsif ( $c == 0x02 ) { # データセットコマンド? &PRINT( "DATA=(".unpack("H2",$com).")", 1 ); $para = &get_line(); &PRINT_PARA( $para , 1 ); } elsif ( $c == 0x03 ) { # テキスト表示 read( FILE, $para, 1 ); # 謎パラメータ if ( $para eq pack( "C", 1 ) ) { $text = &get_text(); &PRINT( "#print \"".$text."\"".$CR, 0 ); } else { &PRINT( "#NOT_print=(".unpack( "H2",$para).")", 1); $para = &get_line(); &PRINT_PARA( $para , 1 ); } } elsif ( $c == 0x05 ) { # たぶんテキスト画面関係 &PRINT( "TEXT=(".unpack("H2",$com).")", 1 ); $para = &get_line(); &PRINT_PARA( $para ,1 ); # } elsif ( $c == 0x0e ) { # なにカナ、なにカナ? # read( FILE, $dummy, 1 ); # if ( $dummy ne $ZERO ) { # print "Woo. 14 の次が 0じゃないでス(".unpack("C",$dummy).")".$CR; # exit; # } # print OUT "#0E 00;".$CR; } elsif ( $c == 0x0d ) { # ボイスだと思われ read( FILE, $para, 1 ); # 謎パラメータ if ( $para eq pack( "C", 2 ) ) { $text = &get_text(); &PRINT( "#voice \"".$text."\"".$CR, 0); } else { &PRINT( "#NOT_voice=(".unpack( "H2",$para).")", 1); $para = &get_line(); &PRINT_PARA( $para , 1); } } elsif ( $c == 0x16 ) { # ??? read( FILE, $para, 1 ); # 謎パラメータ if ( $para eq pack( "C", 2 ) ) { $text = &get_text(); &PRINT( "#label?? \"".$text."\"", 1); &PRINT_PARA( $para, 1); } else { &PRINT( "#NOT_label??=(".unpack( "H2",$para).")", 1); $para = &get_line(); &PRINT_PARA( $para , 1); } } elsif ( $c == 0x1c ) { # 選択肢 read( FILE, $para, 1 ); # 謎パラメータ if ( $para eq pack( "C", 2 ) ) { $text = &get_text(); &PRINT( "#select \"".$text."\"".$CR, 0); } else { &PRINT( "#NOT select=(".unpack( "H2",$para).")", 1); $para = &get_line(); &PRINT_PARA( $para, 1); } } elsif ( $c == 0x1d ) { # セリフ外の人名表示 read( FILE, $para, 1 ); # 謎パラメータ if ( $para eq pack( "C", 1 ) ) { $text = &get_text(); &PRINT( "#prints \"".$text."\"".$CR, 1); } else { &PRINT( "#NOT_prints=(".unpack( "H2",$para).")", 1); $para = &get_line(); &PRINT_PARA( $para, 1); } } elsif ( $c == 0x46 ) { # Fav2 シナリオ領域でない? 0800 バイト read( FILE, $para, 3 ); if ( $para eq "aV2" ) { read( FILE, $para, 28 ); $para = "FaV2".$para; &PRINT( "00|".&text_dump( $para )." ".&visible( $para ).$CR, 2); $i = 1; while ( $i < (0x800 / 32 ) ) { read( FILE, $para, 32 ); &PRINT( sprintf( "%02d",$i )."|".&text_dump( $para )." ".&visible( $para ).$CR, 2 ); $i ++; } } else { &PRINT( "#NOT_FaV2 (F".&visible( $para ).") (46 ".&text_dump( $para ).")", 1); $para = &get_line(); &PRINT_PARA( $para, 1); } } elsif ( $c == 0x5f ) { # テキストエリア消去 read( FILE, $dummy, 1 ); if ( $dummy ne $ZERO ) { print "Woo. 95 の次が 0じゃないでス(".unpack("C",$dummy).")".$CR; exit; } &PRINT( "#cls;".$CR, 0); } elsif ( $c == 0x76 ) { # "vav" シーンの開始? read( FILE, $para, 0x1f ); &PRINT( "#scene start".$CR, 0); &PRINT( "#scene start / par=".&text_dump( $para ) . "(".&visible( $para ).")".$CR, 1); } elsif ( $c == 0xff ) { # シーンの区切り? # 次の "vav" まですっとばす &PRINT( "#scene end".$CR, 0); } else { # わかんね # read( FILE, $sub, 1 ); # 謎パラメータ # read( FILE, $len, 1 ); # パラメータ長? # $len = unpack( "C", $len ); # read( FILE, $para, $len); &PRINT( "command=(".unpack("H2",$com).")", 1 ); # print OUT "sub =(".unpack( "C",$sub).")".$CR; # print OUT "len =(".unpack( "C",$len).")".$CR; $para = &get_line(); &PRINT_PARA( $para, 1); } } exit; # sub get_line { my( $c, $message ); $message = ""; while ( 1 ) { read( FILE, $c, 1 ); if ( $c eq $ZERO ) { last; } else { $message .= $c; } } return( $message ); } sub text_dump { my( $len, $i, $c, $dump, $text ); $text = @_[ 0 ]; $dump = ""; $i = 0; $len = length( $text ); while ( $i < $len ) { $c = substr( $text, $i, 1 ); $dump .= unpack( "H2", $c ) ." "; $i ++; } chop( $dump ); return( $dump ); } sub get_text { my( $len, $text ); read( FILE, $len, 1 ); # テキスト長? $len = unpack( "C", $len ); read( FILE, $text, $len ); if ( chop( $text ) ne $ZERO ) { print OUT "strgings error!($text)(".&text_dump( $text ).")"; } if ( $text =~ /\$1/ ) { $text =~ s/\$1/$name1/; } elsif ( $text =~ /\$2/ ) { $text =~ s/\$2/$name2/; } return( $text ); } sub visible { my( $org, $text, $c ); $org = @_[ 0 ]; while ( $c = chop( $org ) ) { if ( unpack( "C", $c ) < 0x20 ) { $c = "."; # 0x1F 以下のコントロールコードは "." に } $text = $c . $text; } return( $text ); } sub PRINT { my( $message, $debug_level ); $message = @_[ 0 ]; $debug_level = @_[ 1 ]; if ( $debug > $debug_level ) { print OUT $message; } } sub PRINT_PARA { my( $para, $debug_level ); $para = @_[ 0 ]; $debug_level = @_[ 1 ]; if ( $debug > $debug_level ) { print OUT " / par=".&text_dump( $para ) . "(".&visible( $para ).")".$CR; } }