//============================================================ // 迷路管理NPC by はにわ 2009/08/09 // // 任意MAP上に迷路を作成するNPCです。 //------------------------------------------------------------ moc_fild01.gat,70,20,4 script 迷路管理職員#Maze 874,{ //----------------------------------------- //設定 //----------------------------------------- //迷路作成時の処理刻み幅 処理時に転送量オーバーが起きて落ちる時は小さくする set 'xa,5; //迷路設置MAP NPCを配置したMAPを指定して下さい set 'mapname,"moc_fild01.gat"; //壁として配置するモンスターのID db/mob_id.txtを参照 set 'mobid,1905; //迷路X始点 /whereで出てくるX座標を設定する set 'xo,75; //迷路Y始点 /whereで出てくるY座標を設定する set 'yo,25; //通路幅 set 'ws,5; //迷路Xサイズ 壁1セル+(通路幅+壁1セル)*任意値 set 'xs,1+('ws+1)*10; //迷路Yサイズ 壁1セル+(通路幅+壁1セル)*任意値 set 'ys,1+('ws+1)*10; //出口ランダムフラグ(1;ランダム、それ以外:右上固定) set 'fo,0; //実行可能GMレベル set 'gml,99; //----------------------------------------- //関数 //----------------------------------------- //拡張配列 大きさ[127*15][127*15]の疑似配列 function setMapType; function setMapType { set 'eMapType[(getarg(0)/128)&15][(getarg(1)/128)&15][getarg(0)%128][getarg(1)%128],getarg(2); return; } function getMapType; function getMapType { return 'eMapType[(getarg(0)/128)&15][(getarg(1)/128)&15][getarg(0)%128][getarg(1)%128]; } //迷路設置 function CreateMaze; function CreateMaze { set 'com,getarg(0)*100/'xs; mes "[迷路管理職員]"; mes "迷路の再作成が"+'com+"%完了しました。"; mes "nextボタンが出なくなるまでクリックして下さい。"; next; for(set 'x,getarg(0);'x < getarg(0)+getarg(1);set 'x,'x+1) { for(set 'y,0;'y < 'ys;set 'y,'y+1) { if(getMapType('x,'y) == 1) { set 'xx,'x+'xo; set 'yy,'y+'yo; gmcommand "@changemaptype "+'xx+" "+'yy+" 0"; gmcommand "@monster 壁 "+'mobid+" 1 "+'xx+" "+'yy; gmcommand "@changemaptype "+'xx+" "+'yy+" 1"; } else { set 'xx,'x+'xo; set 'yy,'y+'yo; gmcommand "@changemaptype "+'xx+" "+'yy+" 0"; } } } return; } //迷路取り壊し function DeleteMaze; function DeleteMaze { set 'com,getarg(0)*100/'xs; mes "[迷路管理職員]"; mes "迷路の取り壊しが"+'com+"%完了しました。"; mes "nextボタンが出なくなるまでクリックして下さい。"; next; for(set 'x,getarg(0);'x < getarg(0)+getarg(1);set 'x,'x+1) { for(set 'y,0;'y < 'ys;set 'y,'y+1) { set 'xx,'x+'xo; set 'yy,'y+'yo; gmcommand "@changemaptype "+'xx+" "+'yy+" 0"; } } return; } //壁設定 function SetWall; function SetWall { //壁を延ばす方向を決める set 'ori, rand(4); if ('ori == 0) { //壁を延ばす先が壁になっていれば確定 if (getMapType(getarg(0)+'ws+1,getarg(1)) == 1) { for(set 'wcnt,0;'wcnt < 'ws+1;set 'wcnt,'wcnt+1) { setMapType getarg(0)+'wcnt, getarg(1), 1; } } } else if ('ori == 1) { if (getMapType(getarg(0),getarg(1)+'ws+1) == 1) { for(set 'wcnt,0;'wcnt < 'ws+1;set 'wcnt,'wcnt+1) { setMapType getarg(0), getarg(1)+'wcnt, 1; } } } else if ('ori == 2) { if (getMapType(getarg(0)-'ws+1,getarg(1)) == 1) { for(set 'wcnt,0;'wcnt < 'ws+1;set 'wcnt,'wcnt+1) { setMapType getarg(0)-'wcnt, getarg(1), 1; } } } else { if (getMapType(getarg(0),getarg(1)-'ws+1) == 1) { for(set 'wcnt,0;'wcnt < 'ws+1;set 'wcnt,'wcnt+1) { setMapType getarg(0), getarg(1)-'wcnt, 1; } } } return; } //----------------------------------------- //メイン処理 //----------------------------------------- //GM判定 if (getgmlevel < 'gml) { mes "[迷路管理職員]"; mes "いらっしゃいませ。"; mes "こちらはGMLv"+'gml+"の方を対象とした"; mes "サービスをさせて頂いております。"; mes "以後お見知りおきを願います。"; close; } mes "[迷路管理職員]"; mes "いらっしゃいませ。"; mes "こちらでは迷路の再作成依頼を承っております。"; next; switch (select("迷路の再作成を依頼する","迷路を取り壊す","なんでもない")) { case 1: mes "[迷路管理職員]"; mes "迷路を再設計します。"; mes "nextボタンをクリックして下さい。"; mes "数分かかる事がありますので"; mes "しばらくお待ち願います。"; next; //迷路初期化&外枠設定 for(set 'x,0;'x < 'xs;set 'x,'x+1) { for(set 'y,0;'y < 'ys;set 'y,'y+1) { if ('x == 0) { setMapType 'x, 'y, 1; } else if ('x == 'xs-1) { setMapType 'x, 'y, 1; } else if ('y == 0) { setMapType 'x, 'y, 1; } else if ('y == 'ys-1) { setMapType 'x, 'y, 1; } else { setMapType 'x, 'y, 0; } } } //迷路設計(壁未設置がある限りループ) set 'wf,0; while('wf == 0){ set 'wf,1; for(set 'x,'ws+1;'x < 'xs-'ws+1;set 'x,'x+'ws+1) { for(set 'y,'ws+1;'y < 'ys-'ws+1;set 'y,'y+'ws+1) { //処理対象とするセルが壁未設置なら壁設置処理を実行する if (getMapType('x,'y) == 0) { SetWall 'x, 'y; set 'wf,0; } } } } //入口設定(左下を入口とする) setMapType 0, 0, 0; setMapType 0, 1, 0; setMapType 0, 2, 0; setMapType 1, 0, 0; setMapType 1, 0, 0; //出口設定 if ('fo == 1) { //出口の場所をランダムにする set 'ori, rand(3); if ('ori == 0) { //右上を出口とする setMapType 'xs-1, 'ys-1, 0; setMapType 'xs-1, 'ys-2, 0; setMapType 'xs-1, 'ys-3, 0; setMapType 'xs-2, 'ys-1, 0; setMapType 'xs-3, 'ys-1, 0; } else if ('ori == 1) { //右下を出口とする setMapType 0, 'ys-1, 0; setMapType 0, 'ys-2, 0; setMapType 0, 'ys-3, 0; setMapType 1, 'ys-1, 0; setMapType 1, 'ys-1, 0; } else { //左上を出口とする setMapType 'xs-1, 0, 0; setMapType 'xs-1, 1, 0; setMapType 'xs-1, 2, 0; setMapType 'xs-2, 0, 0; setMapType 'xs-3, 0, 0; } } else { //右上を出口とする setMapType 'xs-1, 'ys-1, 0; setMapType 'xs-1, 'ys-2, 0; setMapType 'xs-1, 'ys-3, 0; setMapType 'xs-2, 'ys-1, 0; setMapType 'xs-3, 'ys-1, 0; } //壁をクリア(全モンスタークリア) gmcommand "@killmonster2 this"; //迷路設置 for(set 'lcnt,0;'lcnt < 'xs;set 'lcnt,'lcnt+'xa) { CreateMaze 'lcnt, 'xa; } //リログしたらセーブポイントへ戻す setmapflag "this",mf_nosave,SavePoint; //ワープポータル、テレポート禁止 setmapflag "this",mf_noteleport; //アイスウォール禁止 setmapflag "this",mf_noicewall; //スキル使用禁止(ノピティギを対象としたいけど速度増加も禁止されるから微妙) setmapflag "this",mf_noskill; mes "[迷路管理職員]"; mes "お待たせ致しました。"; mes "それではごゆっくりとお楽しみ下さい。"; close; case 2: //迷路取り壊し for(set 'lcnt,0;'lcnt < 'xs;set 'lcnt,'lcnt+'xa) { DeleteMaze 'lcnt, 'xa; } //壁をクリア(全モンスタークリア) gmcommand "@killmonster2 this"; case 3: mes "[迷路管理職員]"; mes "またのお越しをお待ちしております。"; close; } }