#!/usr/bin/perl

#
# auto dungeon generetor
#

$N = 1;
$S = 2;
$E = 4;
$W = 8;
$U = 16;
$D = 32;

$X = shift @ARGV;
$Y = shift @ARGV;
$dun_tag = shift @ARGV;
$dun_sgn = 1;

if($dun_tag eq "DUN_"){
  $dun_name = "եǥѡ";
  $dun_type = "ϲ";
}
elsif($dun_tag eq "MAN_"){
  $dun_name = "";
  $dun_type = "ϲ";
}
elsif($dun_tag eq "TOW_"){
  $dun_name = "饹ȥ";
  $dun_type = "";
  $dun_sgn = -1;
}

while(<>)
{
  chop;
  if(/^%%% /){
    if($LVL){
      for($i = 0 ; $i < $Y ; ++$i){
	for($j = 0 ; $j < $X ; ++$j){
	  my $t = "$LVL$i$j";
	  if($L[$i*2][$j*2] eq '+'){
	    $MAP{$t} |= ($U | $D);
	  }
	  elsif($L[$i*2][$j*2] eq '>'){
	    $MAP{$t} |= $D;
	  }
	  elsif($L[$i*2][$j*2] eq '<'){
	    $MAP{$t} |= $U;
	  }
	  my $sym = $L[$i*2][$j*2];
	  if($sym =~ /\w/){
	    $SYM{$t} = $sym;
	    if($sym le '9'){
	      $NUM{$t} = ord($sym) - ord('0');
	    }
	    else{
	      $NUM{$t} = ord($sym) - ord('a') + 10;
	    }
	  }
	}
      }
      for($i = 0 ; $i < $Y ; ++$i){
	for($j = 0 ; $j < $X-1 ; ++$j){
	  my $t = sprintf("%d%d%d", $LVL, $i, $j);
	  my $tt = sprintf("%d%d%d", $LVL, $i, $j+1);

	  if($L[$i*2][$j*2+1] eq '-'){
	    $MAP{$t} |= $E;
	    $MAP{$tt} |= $W;
	  }
	}
      }
      for($i = 0 ; $i < $Y-1 ; ++$i){
	for($j = 0 ; $j < $X ; ++$j){
	  my $t = sprintf("%d%d%d", $LVL, $i, $j);
	  my $tt = sprintf("%d%d%d", $LVL, $i+1, $j);

	  if($L[$i*2+1][$j*2] eq '|'){
	    $MAP{$t} |= $N;
	    $MAP{$tt} |= $S;
	  }
	}
      }
    }

    $LVL = $';
    @L = ();
  }
  else{
    my @l = split("", $_);
    unshift(@L, \@l);
  }
}

foreach $t (sort keys %MAP){
  my @DIR;
  my ($k, $i, $j) = ($t =~ /(.+)(.)(.)$/);
  print <<_T_;
# $dun_tag$t $dun_name$dun_type$k
%%% $dun_tag$t

_T_
  if($MAP{$t} & $N){
    my $n = sprintf("$dun_tag%d%d%d", $k, $i+1, $j);
    push(@DIR, "");
    print "\@n:::NewScene($n):ʤϿŤ⤤\n";
  }
  if($MAP{$t} & $S){
    my $n = sprintf("$dun_tag%d%d%d", $k, $i-1, $j);
    push(@DIR, "");
    print "\@s:::NewScene($n):ʤϿŤ⤤\n";
  }
  if($MAP{$t} & $E){
    my $n = sprintf("$dun_tag%d%d%d", $k, $i, $j+1);
    push(@DIR, "");
    print "\@e:::NewScene($n):ʤϿŤ⤤\n";
  }
  if($MAP{$t} & $W){
    my $n = sprintf("$dun_tag%d%d%d", $k, $i, $j-1);
    push(@DIR, "");
    print "\@w:::NewScene($n):ʤϿŤ⤤\n";
  }
  if($MAP{$t} & $U){
    my $n = sprintf("$dun_tag%d%d%d", $k - $dun_sgn, $i, $j);
    print "\@u:::NewScene($n):ʤϿŤ˳ʤФä\n";
  }
  if($MAP{$t} & $D){
    my $n = sprintf("$dun_tag%d%d%d", $k + $dun_sgn, $i, $j);
    print "\@d:::NewScene($n):ʤϿŤ˳ʤߤꤿ\n";
  }
  undef $_;
  if(@DIR){
    $_ = join("", @DIR);
    $_ = "ƻ$_³Ƥ롣";
  }
  my $ud;
  if($MAP{$t} & $U and $MAP{$t} & $D){
    $ud = "ˤϡؤγʤȡؤγʤ";
  }
  elsif($MAP{$t} & $U){
    $ud = "ˤϡؤγʤ";
  }
  elsif($MAP{$t} & $D){
    $ud = "ˤϡؤγʤ";
  }

  $dr = undef;
  $dr2 = undef;

  if($NUM{"$t"}){
    $dr2 = <<_T_;
\@use skeleton key::::ǽǤⳫʤ
\@open door|enter::::ɥˤϸäƤ롣
\@look door::::
ɥˤϡ

--ҥ٥Ȥ̵¥ۥƥ--

$NUM{$t}漼[]

Ƚ񤫤Ƥ롣
_T_
    $dr = "ˤϥɥꡤ$NUM{$t}漼Ƚ񤫤Ƥʡ";
  }

  if($dun_tag eq "DUN_"){ 
    print <<_T_;
#\@use light:I_Have(ITEM_LIGHT):UseItem(ITEM_LIGHT,1)::
#ʤϥ饤Ȥµܤ褦ˤʤä
#\@* *:!I_Use(ITEM_LIGHT):::ðŤǲ⸫ʤ
#\@*:!I_Use(ITEM_LIGHT):::ðŤǲ⸫ʤ
\@msg::::
եǥѡȤ"ϲµ"$dun_type$k
$_$ud
\@look|look dungeon::::
µܤ¤ǥӽβλΤΤ
ΤˤΤ褦µܤΤƤˤĤĤ
Ƥ롣
$ud
\@map
:look|use/I_Have(ITEM_MAP)/UseMap($k, 0)//
:look|use////
ʤϡϿޤäƤʤ
\@compass
:look|use/I_Have(ITEM_COMPASS)///
ʤϽեǥѡȤϲ$k̤$i⡤$jˤ롣
:look|use////
ʤϡѥäƤʤ
\@search::::
ä˲⸫Ĥʤä
_T_
  }
  elsif($dun_tag eq "MAN_"){
    print <<_T_;
#\@use light:I_Have(ITEM_LIGHT):UseItem(ITEM_LIGHT,1)::
#ʤϥ饤Ȥµܤ褦ˤʤä
#\@* *:!I_Use(ITEM_LIGHT):::ðŤǲ⸫ʤ
#\@*:!I_Use(ITEM_LIGHT):::ðŤǲ⸫ʤ
\@msg::::
ϲϩʤꥭĥ
$_$ud
\@look|look dungeon::::
ɥɥɤˡĥɡˤνʤȤĹ̵ѤȤ
ȤæФ褦
\@map
:look|use/I_Have(ITEM_MAP)/UseMap($k, 1)//
:look|use////
ʤϡϿޤäƤʤ
\@compass
:look|use/I_Have(ITEM_COMPASS)///
ʤ$dun_nameϲ$k̤$i⡤$jˤ롣
:look|use////
ʤϡѥäƤʤ
\@search::::
ä˲⸫Ĥʤä
_T_
  }
  elsif($dun_tag eq "TOW_"){
    print <<_T_;
\@msg::::
衪ӣˣɼҤ$dun_type$k
$_$ud$dr
\@look::::
ФɤǺ줿ϭŷˤ饤ȤϩŬ٤
ŤȤƤꡤŪ򤫤⤷Ƥ롣
Τϲʤ

$ud$dr
$dr2
\@map
:use|look/I_Have(ITEM_MAP)/UseMap($k, 2)//
:use|look////
ʤϿޤäƤʤ
\@look compass|use compass:I_Have(ITEM_COMPASS):::
ʤ$dun_name$k̤$i⡤$jˤ롣
\@look compass|use compass::::
ʤϥѥäƤʤ
\@look dungeon|look tower::::
кΩɤʤΤ
\@search::::
ä˲⸫Ĥʤä
_T_
  }
}
