<?php i18n_http_output("SJIS"); ?>
<?php 
    
/*    PHP Test#04 : MapEditor
        Programmed by FUKAYA Takashi

        *MEMO
        
        主要変数
            basedir        ファイル保存用ベースディレクトリ
        
        DBMファイル (mapedit.dbm)
            auther        作者
            passwd        編集パスワード
            width        横サイズ
            height        縦サイズ
            

        HIDDENパラメータ
            prmX        表示X座標
            prmY        表示Y座標
            prmW        表示横ブロック数
            prmH        表示縦ブロック数
            prmMulti    複数ブロック置き換えモード
            prmBoxsel    ボックス選択モード
            prmDst        移動量

            prmCopyXmin コピー元矩形
            prmCopyXmax コピー元矩形
            prmCopyYmin コピー元矩形
            prmCopyYmax コピー元矩形

            prmPhase    画面状態
                         1:編集
                        10:マップ選択
                        11:新規マップ

            prmMapfile    編集中のマップファイル名

        
        # PHPって変数定義の強制って出来ないのかなあ
    */

    // ==================== PHP DEFINES ====================


    // ==================== PHP FUNCTIONS ====================

    /* ▼ 変数一覧を表示(デバッグ用)
    */
    
function prtvars() {
        echo 
"<HR>\n";
        echo 
"<B>変数一覧 (" count($GLOBALS) . ")</B><BR>\n";
        
reset$GLOBALS );
        while( list( 
$key$value ) = each$GLOBALS ) ) {
               echo 
"$key = $value<br>\n";
        }
         echo 
"<HR>\n";

    } 

    
/* ▼ マップブロックキー作成
    */
    
function MapKey($x,$y) {
        return (string)
$x "_" . (string)$y;
    }

    
/* ▼ マップデータ拡張
    */
    
function ExpandMap($w,$h) {
        global 
$dbmid,$mapw,$maph;

        for (
$x=0$x<$w$x++ ) {
            for (
$y=0$y<$h$y++ ) {
                if ( !
dbmexists$dbmid MapKey($x,$y)) ) dbmreplace$dbmid MapKey($x,$y) , "0");
//                dbmreplace( $dbmid , MapKey($x,$y) , "1");
            
}
        }
        
$mapw $w;
        
$maph $h;
        
dbmreplace$dbmid "width" $mapw);    
        
dbmreplace$dbmid "height" $maph);    

    }

    
/* ▼ マップ選択矩形取得
    */
    
function GetSelectBox() {
        global 
$selXmin,$selYmin,$selXmax,$selYmax,$prmW,$prmH;
        
$selXmin = -1;
        
$selXmax = -1;
        
$selYmin = -1;
        
$selYmax = -1;
        for (
$x=0$x<$prmW$x++ ) {
            for (
$y=0$y<$prmH$y++ ) {
                if ( 
$GLOBALS"chkmap" MapKey($x,$y) ] == "1" ) {
                    if ( 
$selXmin>$x || $selXmin==-$selXmin $x;
                    if ( 
$selXmax<$x || $selXmax==-$selXmax $x;
                    if ( 
$selYmin>$y || $selYmin==-$selYmin $y;
                    if ( 
$selYmax<$y || $selYmax==-$selYmax $y;
                }
            }
        }

    }



    
// ==================== PHP STARTUP CODE ====================
    
    // ● 処理開始
    
$basedir "mapedit/";
    
$msg "";
//    $mapfile = "mapedit.dbm";

    // パラメータ処理
    
if ( empty($prmPhase) ) $prmPhase 11;
//    if ( empty($prmMapfile) ) $prmMapfile = "default";

    
if ( empty($prmW) ) $prmW 15;
    if ( empty(
$prmH) ) $prmH 10;
    if ( empty(
$prmX) || $prmX<$prmX 0;
    if ( empty(
$prmY) || $prmY<$prmY 0;
    if ( empty(
$prmDst) ) $prmDst 5;




    
// ● 画面移動関連処理 (DBオープン前)

    
if  ( $Submit == "マップ選択" ) {
        
$prmPhase 11;
    }

    if  ( 
$Submit == "パスワード変更" ) {
        
$prmPhase 2;
    }

    if  ( 
$Submit == "データエクスポート" ) {
        
$prmPhase 3;
    }

    if  ( 
$Submit == "新規マップ作成" ) {
        
$prmPhase 12;
    }

    
// マップ新規作成画面での処理
    
if ( $prmPhase == 12 ) {
        if  ( 
$Submit == "マップ作成"  ) {
            
// 新規マップ作成
            
            // 値チェック
            
$msg "";
            if ( empty(
$txtMapfile) ) $msg .= "マップ名が入力されていません。<BR>";
            if (  
is_file($basedir .$txtMapfile ".dbm" ) )   $msg .= "同名のマップが既に存在します。<BR>";
            if ( empty(
$txtAuther) ) $msg .= "作者名が入力されていません。<BR>";
            if ( (int)
$txtWidth $msg .= "マップ幅は1以上を指定して下さい。<BR>";
            if ( (int)
$txtHeight $msg .= "マップ高さは1以上を指定して下さい。<BR>";
            if (  
$txtPasswd != $txtPasswd2 $msg .= "パスワードの1つ目と2つ目(確認用)が異なっています。<BR>";
            
            if ( empty(
$msg)  ) {
                
// 新規マップ作成
                
$dbmid dbmopen($basedir $txtMapfile ".dbm" "c");
                if ( 
$dbmid == TRUE ) {
                    
$prmMapfile $txtMapfile ".dbm";
                    
                    
dbmreplace$dbmid "auther" $txtAuther );
                    
dbmreplace$dbmid "passwd" $txtPasswd );
                    
ExpandMap($txtWidth,$txtHeight ); 
                    
                    
dbmclose$dbmid );
                    
$prmPhase 1;        // マップ編集モードへ移行
                
}else{
                    
$msg .= "データベースの作成に失敗しました。<BR>";
                }
            }
        } else if  ( 
$Submit == "キャンセル"  ) {
            
$prmPhase 11;
        }        
    }

    
// マップ選択画面での処理
    
if ( $prmPhase == 11 ) {
        if ( 
$Submit == "マップ編集" ) {
            if (  
is_file($basedir $rbMap ) ||  is_file($basedir $rbMap ".db" ) ) $dbmid2 dbmopen($basedir $rbMap "w");
            if (
$dbmid2 <> ) {
                
$prmMapfile $rbMap;
                
$p dbmfetch$dbmid2 "passwd" );
                if (  
$txtPasswd == $p ) {
                    
// マップ選択成功
                    
$prmPhase 1;
                } else {
                    
$msg "パスワードが違います。";
                }
                
dbmclose$dbmid2 );
            }else{
                
$msg "マップを選択してから[マップ編集]ボタンを押してください。";
            }
        }
    }



    
// ● DBMオープン
    
if ( $prmPhase 10 ) {
        
$dbmid dbmopen($basedir $prmMapfile "w");
        
$mapw = (int) dbmfetch($dbmid,"width");        
        
$maph = (int) dbmfetch($dbmid,"height");
        if ( 
$mapw == || $maph == 0) {  ExpandMap(20,15 ); }
    }else{
        
$dbmid dbmopen(  "__dummy__.dbm""w");
    }

    
// ● ブロックリスト

    
$blk = array(
        
0    =>    "wall_n.gif",

        
1    =>    "wall_c.gif",
        
2    =>    "wall_c2.gif",
        
3    =>    "wall_c3.gif",
        
4    =>    "wall_c4.gif",

        
11    =>    "wall_r.gif",
        
12    =>    "wall_t.gif",
        
13    =>    "wall_l.gif",
        
14    =>    "wall_b.gif",

        
21    =>    "wall_rb.gif",
        
22    =>    "wall_lb.gif",
        
23    =>    "wall_lt.gif",
        
24    =>    "wall_rt.gif",

        
25    =>    "wall_crb.gif",
        
26    =>    "wall_clb.gif",
        
27    =>    "wall_clt.gif",
        
28    =>    "wall_crt.gif",


        
31    =>    "wall_srb.gif",
        
32    =>    "wall_slb.gif",
        
33    =>    "wall_slt.gif",
        
34    =>    "wall_srt.gif",

        
35    =>    "wall_scrb.gif",
        
36    =>    "wall_sclb.gif",
        
37    =>    "wall_sclt.gif",
        
38    =>    "wall_scrt.gif"
    
);


    
// ● ユーザー操作処理
    
if ( $prmPhase == ) {
        
// ■ マップ編集画面
        
        // 実行ボタン
        
if ( $Submit == "サイズ変更" ) {
            if ( (int)
$txtWidth $msg .= "マップ幅は1以上を指定して下さい。<BR>";
            if ( (int)
$txtHeight $msg .= "マップ高さは1以上を指定して下さい。<BR>";

            if (empty( 
$msg ) ) ExpandMap($txtWidth,$txtHeight ); 
        } else if ( 
$Submit == "指定範囲をコピー" ) {
            
GetSelectBox();
            if ( 
$selXmin != -) {
                
$prmCopyXmin $selXmin $prmX;
                
$prmCopyXmax $selXmax $prmX;
                
$prmCopyYmin $selYmin $prmY;
                
$prmCopyYmax $selYmax $prmY;
            }            
        } else if ( 
$Submit == "一括指定" ) {
            if ( 
$putchar == "paste" ) {
                
GetSelectBox();
                if ( 
$selXmin != -&& !empty($prmCopyXmin) ) {
                    for (
$x=$selXmin$x<=$selXmin + ($prmCopyXmax-$prmCopyXmin) ; $x++ ) {
                        for (
$y=$selYmin$y<=$selYmin + ($prmCopyYmax-$prmCopyYmin)  ; $y++ ) {
                            
dbmreplace$dbmid MapKey($x $prmX,$y $prmY) , dbmfetch($dbmidMapKey($x $selXmin $prmCopyXmin,$y $selYmin $prmCopyYmin) )  );
                        }
                    }
                }else{
                    
$msg .= "コピー先座標が指定されていません(コピー先の左上のチェックボックスをチェックしてください)。";
                }
            }else{
                
// 通常
                
if ( $prmBoxsel != "1" ) {
                    for (
$x=0$x<$prmW$x++ ) {
                        for (
$y=0$y<$prmH$y++ ) {
                            if ( 
$GLOBALS"chkmap" MapKey($x,$y) ] == "1" dbmreplace$dbmid MapKey($x $prmX,$y $prmY) , $putchar );
                        }
                    }
                }else{
                    
GetSelectBox();
                    if ( 
$selXmin != -) {
                        for (
$x=$selXmin$x<=$selXmax$x++ ) {
                            for (
$y=$selYmin$y<=$selYmax$y++ ) {
                                
dbmreplace$dbmid MapKey($x $prmX,$y $prmY) , $putchar );
                            }
                        }
                    }
                }
            }
            
        }else if  ( 
$Submit == "上" ) {
             
$prmY -= $prmDst;
        }else if  ( 
$Submit == "下" ) {
             
$prmY += $prmDst;
        }else if  ( 
$Submit == "左" ) {
             
$prmX -= $prmDst;
        }else if  ( 
$Submit == "右" ) {
             
$prmX += $prmDst;

            
        }else if  ( 
$Submit == "XX" ) {

        }

        if ( 
$prmX<$prmX 0;
        if ( 
$prmY<$prmY 0;


        
// ○ マップクリックチェック
        
for ($x=0$x<$prmW$x++ ) {
            for (
$y=0$y<$prmH$y++ ) {
                if ( 
$GLOBALS"map"MapKey($x,$y) . "_x" ] != "" ) {
                    if ( 
$putchar == "paste" ) {
                        if (  !empty(
$prmCopyXmin) ) {
                            for (
$xo=0$xo<= ($prmCopyXmax-$prmCopyXmin) ; $xo++ ) {
                                for (
$yo=0$yo<= ($prmCopyYmax-$prmCopyYmin)  ; $yo++ ) {
                                    
dbmreplace$dbmid MapKey($xo+$x $prmX,$yo+$y $prmY) , dbmfetch($dbmidMapKey($xo $prmCopyXmin,$yo $prmCopyYmin) )  );
                                }
                            }
                        }
                    }else{
                        
// 通常
                        
dbmreplace$dbmid MapKey($x $prmX,$y $prmY) , $putchar );
                    }

                }
            }
        }

    }else if ( 
$prmPhase == ) {
        
// ■ マップ編集画面 - パスワード変更画面
        
        // 実行ボタン
        
if ( $Submit == "決定" ) {
            
            if (  
$txtPasswdNow != dbmfetch$dbmid "passwd" ) ) $msg .= "現在のパスワードが一致しません。<BR>";
            if (  
$txtPasswd != $txtPasswd2 $msg .= "変更後のパスワードの1つ目と2つ目(確認用)が異なっています。<BR>";
            
            if ( empty(
$msg) ) {
                
dbmreplace$dbmid "passwd" $txtPasswd );
                
$msg .= "パスワードを変更しました。<BR>";
                
$prmPhase 1;    // 編集画面へ移行
            
}
            
        }else if ( 
$Submit == "キャンセル" ) {
             
$prmPhase 1;    // 編集画面へ移行
        
}
        

    }else if ( 
$prmPhase == ) {
        
// ■ マップ編集画面 - データエクスポート
        
        // ソース生成
        
$expsrc "";
        
$expsrcext "";
        
$m substr$prmMapfile 0,strlen($prmMapfile)-) ;

        switch (
$select) {
            case 
1:        // CSV形式
                
$expsrc .= $mapw "," $maph "\n";
                for (
$y=0$y<$maph$y++ ) {
                    for (
$x=0$x<$mapw$x++ ) {
                        
$expsrc .= dbmfetch$dbmid MapKey($x,$y) ) ;
                        if ( 
$x<$mapw-$expsrc .= ","; else $expsrc .= "\n"
                    }
                }
                
$expsrc .= "\n"
                
$expsrcext ".csv";
                break;
                
            case 
2:        // C言語ソース形式
                
$expsrc .= "// マップ名:" $prmMapfile "\n";
                
$expsrc .= "// 作者名  :" dbmfetch($dbmid,"auther") . "\n\n";
                
                
$expsrc .= "#define MAP_" $m "_WIDTH = " $mapw "\n";
                
$expsrc .= "#define MAP_" $m "_HEIGHT = " $maph "\n\n";

                
$expsrc .= "int nMap_" .$m  "[$maph][$mapw]={\n";
                for (
$y=0$y<$maph$y++ ) {
                    
$expsrc .= "\t";
                    for (
$x=0$x<$mapw$x++ ) {
                        
$expsrc .= dbmfetch$dbmid MapKey($x,$y) ) ;
                        if ( 
$x<$mapw-|| $y<$maph-$expsrc .= ",";  
                    }
                    
$expsrc .= "\n";
                }
                
$expsrc .= "};\n\n"
                
$expsrcext ".c";
                break;
                
            case 
3:        // BASIC(DATA文)ソース形式
                
$expsrc .= "' マップ名:" $prmMapfile "\n";
                
$expsrc .= "' 作者名  :" dbmfetch($dbmid,"auther") . "\n\n";
                
                
$expsrc .= "map_" .$m "_width = " $mapw "\n";
                
$expsrc .= "map_" .$m "_height = " $maph "\n\n";

                
$expsrc .= "LABEL \"" .$m "\"\n";
                for (
$y=0$y<$maph$y++ ) {
                    
$expsrc .= "DATA ";
                    for (
$x=0$x<$mapw$x++ ) {
                        
$expsrc .= dbmfetch$dbmid MapKey($x,$y) ) ;
                        if ( 
$x<$mapw-$expsrc .= ",";  
                    }
                    
$expsrc .= "\n";
                }
                
$expsrc .= "\n"
                
$expsrcext ".bas";
                break;
                
            case 
4:        // アセンブラ(Z80的)ソース形式
                
$expsrc .= "# MapName:" $prmMapfile "\n";
                
$expsrc .= "# Auther :" dbmfetch($dbmid,"auther") . "\n\n";
                
                
$expsrc .= "# MapSize (Width,Height)\n";
                
$expsrc .= "MAPSIZE_" $m ":\n";
                
$expsrc .= "\tDS\t" $mapw "," $maph "\n\n";

                
$expsrc .= "# MapData\n";
                
$expsrc .= "MAPDATA_" $m ":\n";
                for (
$y=0$y<$maph$y++ ) {
                    
$expsrc .= "\tDB\t";
                    for (
$x=0$x<$mapw$x++ ) {
                        
$expsrc .= dbmfetch$dbmid MapKey($x,$y) ) ;
                        if ( 
$x<$mapw-$expsrc .= ",";  
                    }
                    
$expsrc .= "\n";
                }
                
$expsrc .= "\n"
                
$expsrcext ".asm";
                break;
                
            case 
5:        // 16進数データ
                
for ($y=0$y<$maph$y++ ) {
                    for (
$x=0$x<$mapw$x++ ) {
                        
$expsrc .= sprintf("%02X" dbmfetch$dbmid MapKey($x,$y) ) );
                    }
                    
$expsrc .= "\n";
                }
                
$expsrc .= "\n"
                
$expsrcext ".hex";
                break;
                
            case 
6:        // DEFCHAR形式ソース
                
for ($y=0$y<$maph$y++ ) {
                    
$expsrc .= sprintf("POKE BASE + &H%04X , DEFCHR(\"",$y*$mapw);
                    for (
$x=0$x<$mapw$x++ ) {
                        
$expsrc .= sprintf("%02X" dbmfetch$dbmid MapKey($x,$y) ) );
                    }
                    
$expsrc .= "\")\n";
                }
                
$expsrc .= "\n"
                
$expsrcext ".bas";
                break;

                
            default:
                
$expsrc "ソース形式を選択してください";
        }

        if ( 
$chkMakeFile == ) {
            
// ソースファイル作成
            
$fp fopen $basedir $m $expsrcext  "wb");
            
fputs$fp $expsrc );
            
fclose$fp );
        }


        
// 実行ボタン
        
if ( $Submit == "決定" ) {
            
        }else if ( 
$Submit == "キャンセル" ) {
             
$prmPhase 1;    // 編集画面へ移行
        
}
        
    }


    
// ==================== PHP STARTUP CODE END ====================
?>







<!-- ● HTML開始 -->

<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<link rev="made" href="mailto:fukaya@dokokano.com">
<title>PHP TEST#04 : Map Editor</title>
</head>

<body bgcolor="#000000" text="#ffffff" topmargin="0" link="#9999FF" vlink="#FF66FF" alink="#CCCCFF">
<!-- ● タイトル部分 --> 
<table align="center" background="bgCir01.gif" width="90%" border="0" cellspacing="0" >
        <tr>
            <td height="3" bgcolor="#ff0000" ></td>
        </tr>
        <tr align="center"> 
            <td > <font size="-1" color="#ff0000"><font size="+4" color="#FFFFFF"> <font size="+3">PHP 
          TEST#04</font> : MapEditor</font>` <br>
          <?php 
        $tm 
time();
        echo 
"(ただいまの時刻は " date("Y/m/d H:i:s",$tm) . ")"
      
?><br>
          </font> </td>
        </tr>
        <tr>
            <td height="3" bgcolor="#ff0000" ></td>
        </tr>
    </table>


    <div align="center"> <BR>

    <!-- ● 入力フォーム -->

    <form method="post" action="mapedit.php3">

        <?php if ( $prmPhase==11 ) { ?>

        <!-- ■■■■ 11:マップ選択 -->
        <table border="0" width="90%"><tr><td>
            
            <font size="+2">● マップ選択
            </font><br>
            <br>
             編集するマップを選択して [マップ編集]ボタンを押してください。<br>
             ※マップ名の後ろに「*」があるものは、編集パスワードが必要です。<br>
            <br>
            <table width="100%" border="0">
                <tr bgcolor="#666666">
                    <td width="6%"><font size="-1">選択</font></td>
                            <td width="24%"><font size="-1">マップ名</font></td>
                            <td width="19%"><font size="-1">作者</font></td>
                            <td width="12%"><font size="-1">サイズ</font></td>
                            <td width="26%"><font size="-1">最終編集日付</font></td>
                            <td width="13%"><font size="-1">備考</font></td>
                </tr>

                <?php    // マップ一覧
                    
$d dir$basedir );
                    while(
$entry=$d->read()) {
                        
                        if ( 
substr$entry , -) == ".db" ) { // 2001.05.29
                            
$entry substr($entry,0,strlen($entry)-);
                        }
                        
                        if ( 
substr$entry , -) == ".dbm" ) {
                            
$dbmid2 dbmopen($basedir $entry"r");
                
?>
                            
                        <tr bgcolor="#333333">
                                
                            <td width="6%">
                                    
                                <input type="radio" name="rbMap"  <?php echo "value=$entry";  if ($entry==$prmMapfile ) echo " checked"?> >
                                </td>
                            <td width="24%"><?php echo $entry; if (dbmfetch($dbmid2,"passwd")) echo " *";  ?></td>
                            <td width="19%"><?php echo dbmfetch($dbmid2,"auther"); ?></td>
                            <td width="12%"><?php echo dbmfetch($dbmid2,"width") . "x" dbmfetch($dbmid2,"height"); ?></td>
                            <td width="26%"><?php $tm=filemtime($basedir $entry); echo date("Y/m/d H:i:s",$tm); ?></td>
                            <td width="13%"> </td>
                        </tr>
                <?php
                            dbmclose
$dbmid2 );
                        }
                    }
                
?>
            </table>        
            <div align="center">
                        <p><BR>
            
                            <input type="submit" name="Submit" value="マップ編集">
                (<font size="-1">編集パスワード 
                </font>
                            <input type="password" name="txtPasswd">
                            )
                </p>
                        <p>
    
                            <input type="submit" name="Submit" value="新規マップ作成">
                <br>
                <br>
                <font size="+1" color="#FF3333"><b><?php echo $msg ?>
                </b></font><BR>

            </p>
                    </div>
        
        </td></tr></table>


        <?php } else if ( $prmPhase==12 ) { ?>
        <!-- ■■■■ 12:新規マップ作成 -->
        <table border="0" width="90%">
            <tr>
                <td>


                    <div align="left"><font size="+2">● 新規マップ作成</font><br>
                        <br>
                         作成するマップの情報を入力して [マップ作成]ボタンを押してください。<br>
                        <br>
                    </div>
                    <div align="center">
                        
            <table border="0" width="442">
              <tr>
                                
                <td bgcolor="#666666">
<div align="right">マップ名</div></td>
                                
                <td bgcolor="#333333">
<input type="text" name="txtMapfile"  <?php echo "value=$txtMapfile"?> > .dbm</td>
                            </tr>
                            <tr>                        
                                
                <td bgcolor="#666666">
<div align="right">作者名</div></td>
                                
                <td bgcolor="#333333">
<input type="text" name="txtAuther"  <?php echo "value=$txtAuther"