#!/usr/local/bin/perl
# ▼ 設定諸々
$logfile     = 'log.txt';
$enumfile    = 'enum.txt';
$includefile = 'include.txt';
$alltable    = 'sample_npc_table.csv';


# ▲ 設定ここまで

if ($ARGV[0]) {
    @log     = ReadFile($logfile);
    @include = ReadFile($includefile);
    @enum    = ReadFile($enumfile);
    
    $time = &FormatDate();

       
    foreach (@ARGV) {
	&edit_file($_);
	&make_enum_list();
	&make_include_list();
    } 

    if (@templog[0]) {
	unshift @templog, "▼ $timeに追加\n";
	push    @templog, "▲ ここまで前回の追加\n";
    }

    push @log, @templog;

    &WriteFile($enumfile, @enum);
    print "\033[32m$enumfile\033[mを作成しました\n";  
    &WriteFile($includefile, @include);
    print "\033[32m$includefile\033[mを作成しました\n";  
    &WriteFile($logfile, @log);
    print "\033[32m$logfile\033[mを作成しました\n";  
} else {
    print("[file] : 変換元となる .ffo ファイル\n");
}
exit(1);
#==============================================================================
#  余計な文字列削除
#==============================================================================
sub edit_file
{
    my ($file) = @_;
        
    my @base    = ReadFile($file);
    my @table   = ReadFile($alltable);
    
    
    my $max = 4; #いらないデータ行
    if ($base[0] =~ m/FFI DATA Ver/) {
	$max = 6;
    }    

    my $wallnum = $base[3];
    my $floornum = $base[4];
    $wallnum =~ s/[A-Z]|,|\n//g;
    $floornum =~ s/[A-Z]|,|\n//g;
    my $wall = sprintf("%d", $wallnum);
    my $floor = sprintf("%d", $floornum);
    

    $file   =~ s/\.ffi|FFI\///g;

    $cfile1 = "C/$file\.c";
    $cfile2 = "C/$file\_2.c";

    $file   =~ s/room//g;
    $file   =~ tr/a-z/A-Z/;
    
    my $label = $file;
    my $num = $file;
    $label =~ s/[0-9]|\_//g;
    $num   =~ s/[A-Z]|\_//g;
    $num--;
    my $hexnum = sprintf("%X", $num);
    $label = "$label$hexnum";

    $enum1 = "FG_NPC_RM$file\_e";
    $enum2 = "FG_NPC_RM$file\_2\_e";

    my $flag = 0;
    foreach (@table) {

	if (/$label/) {
	    my(@value) = split(/,/);
#	    print "$value[6] $value[7] $value[8] $value[9]\n";
#	    print "$wall $floor $enum1 $enum2\nに置き換えます\n";
	    $value[6] = $wall;
	    $value[7] = $floor;
	    $value[8] = $enum1;
	    $value[9] = $enum2;
	    $_ = join(',',@value);
	    $flag = 1;
	}
    }

    if ($flag == 0) {
	print "$label見つかりませんでした！！！アレ───？？\n";
	$error = "$label見つかりませんでした！！！アレ───？？\n";
    }
    
    my $head1 = "{ $enum1,\n\t{\n";
    my $head2 = "{ $enum2,\n\t{\n";
 
   
    my $foot = "\t}\n},\n";
    my $write1;
    my $write2;

    if ($base[137] !~ 'STR_DR0') {
	print "137 $enum1でドアが見つかりません\n";
    }
    if ($base[138] !~ 'STR_DR0') {
	print "138 $enum1でドアが見つかりません\n";
    }
    
    my $cellcount = 0;
    my $count = 0;
    foreach (@base) {
	chomp;
	if ($count < $max) {
	    # 何もしない
	} elsif ($count < 256+$max)  {
	    if ($cellcount == 0) {
		$write1 .= "\t$_";
		$cellcount++;
	    } elsif ($cellcount == 15) {
		$write1 .= "$_\n";
		$cellcount = 0;
	    } else {	
		$write1 .= "$_";
		$cellcount++;
	    }
	   
	} else {
	    if ($cellcount == 0) {
		$write2 .= "\t$_";
		$cellcount++;
	    } elsif ($cellcount == 15) {
		$write2 .= "$_\n";
		$cellcount = 0;
	    } else {	
		$write2 .= "$_";
		$cellcount++;
	    }
	    
	}
	$count++;
    }

    $write1 = "$head1$write1$foot";
    $write2 = "$head2$write2$foot"; 

    &WriteFile($alltable, @table);
    print "\033[32m$alltable\033[mを修正しました\n";
    &WriteFile($cfile1, $write1);
    print "\033[32m$cfile1\033[mを作成しました\n";
    &WriteFile($cfile2, $write2);
    print "\033[32m$cfile2\033[mを作成しました\n";
}
#==============================================================================
#  enumlistの作成 loglistの作成
#==============================================================================
sub make_enum_list
{
    my $writeflag = 1;
    
    foreach (@enum) {
	if (/$enum1/) {
	    $writeflag = 0;
	}
    }
 
    if ($writeflag) {
	my $num1 = sprintf("%03d", $#enum+1);
	my $num2 = sprintf("%03d", $#enum+2);
	push @enum, "\t$enum1,\t/* NPC $num1 */\n", "\t$enum2,\t/* NPC $num2 */\n";
	push @templog, "NPC$num1番目に $enum1 で $cfile1 を作成\n", "NPC$num2番目に $enum2 で $cfile2 を作成\n";
    }
}
#==============================================================================
#  includelistの作成
#==============================================================================
sub make_include_list
{
    my $writeflag = 1;
    
    foreach (@include) {
	if (/$cfile1/) {
	    $writeflag = 0;
	}
    }

    if ($writeflag) {
	my $num1 = sprintf("%03d", $#include+1);
	my $num2 = sprintf("%03d", $#include+2);

	push @include, "#include \"./$cfile1\"\t/* NPC $num1 */\n","#include \"./$cfile2\"\t/* NPC $num2 */\n";
    }
    
}

#==============================================================================
#  デバッグメッセージ
#==============================================================================
sub Debug
{ 
    print "#=============================================#\n";
    print "# Debug Message                               #\n";
    print "#=============================================#\n";
    print @_;
    exit(0);
}
#==============================================================================
#  エラーメッセージの出力、エラー終了
#==============================================================================
sub PrintError
{ 
    print @_;
    exit(0);
}
#------------------------------------------------------------------------------
#  ファイルからデータを読み込み変数に格納する
#  出力 @lines   : 一行づつ格納した配列
#------------------------------------------------------------------------------
sub ReadFile
{
    local(@lines);    
    
    open(FILE, "<@_") || &PrintError("@_の読み込みに失敗しました。\n");
    @lines = <FILE>;
    close(FILE);
    return @lines;
}
#------------------------------------------------------------------------------
#  ファイルにデータを書き込む
#------------------------------------------------------------------------------
sub WriteFile
{
    local($file, @lines) = @_; 

    open(FILE, "+>$file") || &PrintError("$fileへの書き込みができません。");
    print FILE @lines;
    close(FILE);
}
#==============================================================================
#  ◆ 時間を整形
#     ● 入力  $time : 整形したい時間 （1970年からの秒）
#     ○ 出力  $timefmt形式で取得した時間を返す（初期設定参照）
#==============================================================================
##  初期設定変数
sub FormatDate
{
    $timefmt  = "year/month/date ( day ) hour:min:sec";
    @monthfmt = ("1","2","3","4","5","6","7","8","9","10","11","12");
    @dayfmt   = ("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
    my($sec, $min, $hour, $date, $month, $year, $day) = localtime(time);
    my($rettime) = $timefmt;

    $rettime =~ s/year/$year += 1900/eg;
    $rettime =~ s/month/$monthfmt[$month]/g;
    $rettime =~ s/date/$date/g;
    $rettime =~ s/day/$dayfmt[$day]/g;
    $rettime =~ s/hour/sprintf("%02d", $hour)/eg;
    $rettime =~ s/min/sprintf("%02d", $min)/eg;
    $rettime =~ s/sec/sprintf("%02d", $sec)/eg;
 
    return $rettime;
}
