桜乱忍者(Auto-Run Ninja)
スマホ用タッチ板Wall×Walk
・前作:http://wonderfl.net/c/oIST
概要
・自動で走る忍者をタッチでジャンプさせてゴールに導く
操作方法(How to Play)
・タッチ(Touch)
・ジャンプ(Jump)
・(Flash上ではSPACEでもジャンプ可能)
Android版
・https://play.google.com/store/apps/details?id=air.showohealer.game.ninjarun
/**
* Copyright o_healer ( http://wonderfl.net/user/o_healer )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/aQYx
*/
/*
「桜乱忍者(Auto-run Ninja)」
・スマホ用タッチ板Wall×Walk
・前作:http://wonderfl.net/c/oIST
概要
・自動で走る忍者をタッチでジャンプさせてゴールに導く
操作方法(How to Play)
・タッチ(Touch)
・ジャンプ(Jump)
・(Flash上ではSPACEでもジャンプ可能)
Android版
・https://play.google.com/store/apps/details?id=air.showohealer.game.ninjarun
*/
/*
・追加案
・「ゴール」ではなく「メダル集め」にする
・メダルが1個ならゴールと同じ扱い
・メダルが2個以上ならショートカットの抑止やチキンレースの推奨、探索などが可能
・アクトレーザーでも使うことになりそうなので採用して共通フォーマットにしたい
・というかタッチ版アクトレーザーではすでにやっているので、それをコピペすればOK?
・「秘伝書」を回収する?
*/
package{
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.net.*;
import flash.text.*;
import flash.filters.*;
import flash.ui.*;
import flash.system.*;
import flash.desktop.*;
[SWF(width="465", height="465", frameRate="30", backgroundColor="0x000000")]
public class GameMainWonderfl extends Sprite{
//==File==
//*
static public const BITMAP_URL:String = "http://assets.wonderfl.net/images/related_images/8/8c/8c09/8c096abe8a77528385efcb4b2e4873afe0a0c5eb";
/*/
[Embed(source='Graphics.png')]
private static var Bitmap_Graphic: Class;
//*/
//==Const==
//画面サイズ
static public const VIEW_W:int = 465;
static public const VIEW_H:int = 465;
static public const AD_H:int = 0;
//マップ要素
static public var MapIter:int = 0;
static public const O:uint = MapIter++;
static public const W:uint = MapIter++;
static public const P:uint = MapIter++;
static public const G:uint = MapIter++;
static public const X:uint = MapIter++;
//マップ
static public var s_MapIter:int = 0;
static public const MAP:Array = [
{
name:"Tutorial1",
map:[//○Tutorial1 : Free Run
[W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W],
[W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W],
[W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W],
[W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W],
[W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W],
[W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W],
[W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W],
[W,O,O,O,O,P,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,G,O,O,O,O,O,W],
[W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W],
[W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W],
[W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W],
[W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W],
[W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W,W,W,W,W,W,O,O,W],
[W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W],
[W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W],
[W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W],
]
},
{
name:"Tutorial2",
map:[//○Tutorial2 : Timing
[O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,P,O,O,O,O,O,O,],
[O,O,W,W,W,W,W,W,W,W,W,O,O,],
[O,O,W,W,W,W,W,W,W,W,W,O,O,],
[O,O,W,W,W,W,W,W,W,W,W,O,O,],
[O,O,W,W,W,W,W,W,W,W,W,O,O,],
[O,O,W,W,W,W,W,W,W,W,W,O,O,],
[O,O,W,W,W,W,W,W,W,W,W,O,O,],
[O,O,W,W,W,W,W,W,W,W,W,O,O,],
[O,O,W,W,W,W,W,W,W,W,W,O,O,],
[O,O,W,W,W,W,W,W,W,W,W,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,W,W,W,W,W,W,W,O,O,O,],
[O,O,O,W,W,W,W,W,W,W,O,O,O,],
[O,O,O,W,W,W,W,W,W,W,O,O,O,],
[O,O,O,W,W,W,W,W,W,W,O,O,O,],
[O,O,O,W,W,W,W,W,W,W,O,O,O,],
[O,O,O,W,W,W,W,W,W,W,O,O,O,],
[O,O,O,W,W,W,W,W,W,W,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,W,W,W,W,W,O,O,O,O,],
[O,O,O,O,W,W,W,W,W,O,O,O,O,],
[O,O,O,O,W,W,W,W,W,O,O,O,O,],
[O,O,O,O,W,W,W,W,W,O,O,O,O,],
[O,O,O,O,W,W,W,W,W,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,W,W,W,O,O,O,O,O,],
[O,O,O,O,O,W,W,W,O,O,O,O,O,],
[O,O,O,O,O,W,W,W,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,G,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,],
]
},
{
name:"Tutorial3",
map:[//○Tutorial3 : Needle
[W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W],
[W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W],
[W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W],
[W,O,O,X,O,O,W,W,W,W,W,O,O,X,O,O,W],
[W,O,O,X,O,O,W,W,W,W,W,O,O,X,O,O,W],
[W,O,O,X,O,O,W,W,W,W,W,O,O,X,O,O,W],
[W,O,O,X,O,O,W,W,W,W,W,O,O,X,O,O,W],
[W,O,O,X,O,O,W,W,W,W,W,O,O,X,O,O,W],
[W,O,O,X,O,O,O,O,G,O,O,O,O,X,O,O,W],
[W,O,O,X,O,O,O,O,O,O,O,O,O,X,O,O,W],
[W,O,O,X,X,X,X,X,X,X,X,X,X,X,O,O,W],
[W,O,O,O,O,O,O,O,P,O,O,O,O,O,O,O,W],
[W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W],
[W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W],
]
},
{
name:"Tutorial4",
map:[//○Tutorial4 : Reverse
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,X,O,W,O,O],
[O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,G,O,O,O,O,O,P,O,O,O,O,O,O,O,O,O,W,O,O],
[O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,O,O],
[O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,G,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,W,W,W,W,X,X,X,W,W,W,W,W,W,W,W,W,W,W,W,W,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
]
},
{
name:"Tutorial5",
map:[//○Tutorial5 : Reduce Vel
[O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,W,X,X,X,W,O,O,O,O,],
[O,O,O,O,W,O,O,O,W,O,O,O,O,],
[O,O,O,O,W,O,O,O,W,O,O,O,O,],
[O,O,O,O,W,O,O,O,W,O,O,O,O,],
[O,O,O,O,W,O,O,O,W,O,O,O,O,],
[O,O,O,O,W,O,O,O,W,O,O,O,O,],
[O,O,O,O,W,O,O,O,W,O,O,O,O,],
[O,O,O,O,W,O,O,O,W,O,O,O,O,],
[O,O,O,O,W,O,O,O,W,O,O,O,O,],
[O,O,O,O,W,O,O,O,W,O,O,O,O,],
[O,O,O,O,W,O,O,O,W,O,O,O,O,],
[O,O,O,O,W,O,O,O,W,O,O,O,O,],
[O,O,O,O,W,O,X,O,W,O,O,O,O,],
[O,O,O,O,W,O,X,O,W,O,O,O,O,],
[O,O,O,O,W,O,X,O,W,O,O,O,O,],
[O,O,O,O,W,O,X,O,W,O,O,O,O,],
[O,O,O,O,W,O,X,O,W,O,O,O,O,],
[O,O,O,O,W,O,X,O,W,O,O,O,O,],
[O,O,O,O,W,O,X,O,W,O,O,O,O,],
[O,O,O,O,W,O,X,O,W,O,O,O,O,],
[O,O,O,O,W,O,X,O,W,O,O,O,O,],
[O,O,O,O,W,O,X,O,W,O,O,O,O,],
[W,W,W,W,W,O,X,O,W,O,O,O,O,],
[W,G,O,O,O,O,X,O,W,O,O,O,O,],
[W,X,X,X,X,X,X,O,W,O,O,O,O,],
[W,P,O,O,O,O,O,O,W,O,O,O,O,],
[W,W,W,W,W,W,W,W,W,O,O,O,O,],
]
},
{
name:"Timing1",
map:[//○Timing1 : Seq HighJump
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,P,O,O,O,X,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,W,W,W,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,W,W,W,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,W,O,O,O,O,O,W,W,W,W,W,W,W,O,O,],
[O,W,W,W,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,W,O,O,O,O,O,W,W,W,W,W,W,W,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,W,O,O,O,O,O,W,W,W,W,W,W,W,O,O,],
[O,O,O,O,O,O,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,X,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,O,O,O,O,O,O,O,O,G,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
]
},
{
name:"Timing2",
map:[//○Timing2 : i shuu : Difficult
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,W,W,W,W,W,W,W,W,W,X,W,W,W,W,W,X,W,W,W,W,W,X,W,W,W,W,X,W,W,W,W,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O],
[O,X,O,O,X,W,W,X,W,W,W,W,W,X,W,W,W,W,W,X,W,W,W,W,W,X,W,W,X,O,O,W,O],
[O,W,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,W,O],
[O,W,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,X,O],
[O,W,O,O,W,O,O,W,W,W,W,W,W,X,W,W,W,W,W,X,W,W,W,W,W,W,O,O,W,O,O,W,O],
[O,W,O,O,X,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,W,O,O,X,O,O,W,O],
[O,W,O,O,W,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,W,O,O,W,O],
[O,W,O,O,W,O,O,W,O,O,W,W,W,X,W,W,W,W,W,X,W,W,W,O,O,W,O,O,W,O,O,X,O],
[O,W,O,O,X,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,W,O,O,W,O,O,W,O],
[O,W,O,O,W,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,W,O,O,X,O,O,W,O],
[O,W,O,O,W,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,G,O,X,O,O,X,O,O,W,O,O,W,O],
[O,X,O,O,W,O,O,W,W,W,W,W,W,X,W,W,W,W,W,W,W,W,W,O,O,W,O,O,W,O,O,W,O],
[O,W,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,W,O,O,X,O],
[O,W,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,W,O,O,W,O],
[O,W,O,O,W,W,W,X,W,W,W,W,W,X,W,W,W,W,W,W,W,W,W,W,W,W,O,O,W,O,O,W,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,W,O],
[O,W,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,W,O],
[O,W,W,W,W,W,W,W,W,W,W,W,W,W,W,X,W,W,W,W,W,W,X,W,W,W,W,W,W,O,O,W,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O],
[O,W,P,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O],
[O,W,W,W,W,W,W,W,W,X,W,W,W,W,W,W,W,W,W,X,W,W,W,W,X,X,X,X,X,X,X,X,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
]
},
{
name:"Timing3",
map:[//○Timing3 : Jump Jump Jump : Easy
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,X,X,X,X,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,W,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,X,X,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,P,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,W,O,O,O,O,O,O,O,X,O,O,O,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,O,O],
[O,O,O,O,O,O,O,X,X,X,X,X,O,O,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,G,O,O,O],
[O,O,O,O,O,O,O,O,O,O,X,O,O,O,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
]
},
{
name:"Timing4",
map:[//○Timing4 : Renda
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,X,W,W,W,W,W,W,W,W,W,W,X,O,O,O,O,X,W,W,W,W,W,W,W,W,X,O,O,O,X,W,W,W,W,W,X,O,O,X,W,W,W,X,O,O,X,W,W,W,X,O,X,W,W,W,X,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,P,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,G,O,O],
[X,W,W,W,W,W,X,O,O,O,O,X,W,W,W,W,W,W,W,W,W,X,O,O,O,O,X,W,W,W,W,W,W,X,O,O,O,X,W,W,W,X,O,O,O,X,W,W,W,X,O,X,W,W,W,X,O,X,W,W,W,X,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
]
},
/*
{
name:"Technique1",
map:[//○Technique1 : Adjust Stay Block
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,P,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,G,O,O,O,O,O,O,O,O,O,O,O],
[O,W,O,W,O,W,O,X,O,X,O,X,O,X,O,X,O,X,O,W,O,W,O,X,O,W,O,W,O,W,O,W,O,W,O,W,O,W,O,X,O,W,O,W,O,W,O,W,O,W,O,W,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
]
},
//*/
{
name:"Technique1",
map:[//Technique ; ○Pause & Jump
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O],
[O,P,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,X,O,O,O,X,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,X,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,X,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,X,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O],
[O,O,X,O,O,O,X,W,W,W,W,W,W,W,W,W,W,W,W,W,O,O,O,O,O,O],
[O,O,X,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,X,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,X,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,X,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,X,O,O,O,O,G,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,W,W,W,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
]
},
{
name:"Technique2",
map:[//○Technique : Mini Jump (Reduce Vel 2)
[O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,W,O,O,W,O,X,O,W,O,O,O,O,O],
[O,O,O,O,W,O,O,W,O,X,O,G,O,O,O,O,O],
[O,O,O,O,W,O,O,W,O,X,O,O,O,O,O,O,O],
[O,O,O,O,W,O,O,W,O,X,O,O,O,O,O,O,O],
[O,O,O,O,W,O,O,W,O,X,O,O,O,O,O,O,O],
[O,O,O,O,W,O,O,W,O,X,O,O,O,O,O,O,O],
[O,O,O,O,W,O,O,W,O,X,O,O,O,O,O,O,O],
[O,O,O,O,W,O,O,W,O,X,O,O,O,O,O,O,O],
[O,O,O,O,W,O,O,W,O,X,O,O,O,O,O,O,O],
[O,O,O,O,W,O,O,W,O,X,O,O,O,O,O,O,O],
[O,O,O,O,W,O,O,W,O,X,O,O,O,O,O,O,O],
[O,O,O,O,W,O,O,W,O,X,O,O,O,O,O,O,O],
[O,O,O,O,W,O,O,W,O,X,O,O,O,O,O,O,O],
[O,O,O,O,W,O,O,W,O,X,O,O,O,O,O,O,O],
[O,P,O,O,O,O,O,W,O,X,O,O,O,O,O,O,O],
[O,W,W,W,W,W,W,W,O,X,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O],
]
},
{
name:"Technique3",
map:[//○Technique : Loop Break
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,W,W,W,W,W,W,W,O,O],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,W,O,O],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,W,O,O],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,W,O,O],
[O,O,O,O,O,O,O,O,X,O,O,O,O,O,W,O,O],
[O,O,G,O,P,O,O,O,O,O,O,O,O,O,W,O,O],
[O,X,W,W,W,W,W,W,W,W,W,W,W,W,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
]
},
{
name:"Technique4",
map:[//Pole Walk
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O],
[O,O,P,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,W,W,W,O,O,O],
[O,W,W,W,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,W,W,W,O,O,O],
[O,W,W,W,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,W,W,W,O,O,O],
[O,W,W,W,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,O,G,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
]
},
/*
{
name:"Technique7",
map:[//LongJump or HighJump
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,P,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,W,W,W,W,W,O,O,O,O,X,O,O,O,O,O,O,O,O,W,W,W,O,O,O,O,X,O,O,O,O,O,O,O,O,O,W,W,W,O,],
[O,W,W,W,W,W,O,O,O,O,O,X,O,O,O,O,O,O,O,W,W,W,O,O,O,O,X,O,O,O,O,O,O,O,O,O,W,W,W,O,],
[O,W,W,W,W,W,O,O,X,X,X,X,X,O,O,O,O,O,O,W,W,W,O,O,O,O,X,O,O,O,O,O,O,O,O,O,W,W,W,O,],
[O,W,W,W,W,W,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,G,O,O,],
[O,W,W,W,W,W,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,],
]
},
//*/
{
name:"Technique5",
map:[//Escape
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,W,W,W,W,W,W,W,W,W,W,W,O,O],
[O,O,W,O,O,O,O,O,O,O,O,O,W,O,O],
[O,O,W,O,O,O,O,O,O,O,O,O,W,O,O],
[O,O,W,O,O,W,W,W,W,W,O,O,W,O,O],
[O,O,W,O,O,W,W,W,W,W,O,O,W,O,O],
[O,O,W,O,O,W,W,W,W,W,O,O,W,O,O],
[O,O,W,O,O,W,W,W,W,W,O,O,W,O,O],
[O,O,W,O,O,W,W,W,W,W,O,O,W,O,O],
[O,O,W,O,O,O,O,G,O,O,O,O,W,O,O],
[O,O,W,O,O,O,O,O,O,O,O,O,W,O,O],
[O,O,W,O,O,O,O,X,O,O,O,O,W,O,O],
[O,O,W,O,O,O,O,W,O,O,O,O,W,O,O],
[O,O,W,W,X,O,O,W,O,O,X,W,W,O,O],
[O,O,O,O,O,O,O,W,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,W,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,W,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,W,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,W,O,O,O,O,O,O,O],
[O,O,W,W,X,O,O,W,O,O,X,W,W,O,O],
[O,O,W,O,O,O,O,W,O,O,O,O,W,O,O],
[O,O,W,O,O,O,O,X,O,O,O,O,W,O,O],
[O,O,W,O,O,O,O,O,O,O,O,O,W,O,O],
[O,O,W,O,O,O,O,P,O,O,O,O,W,O,O],
[O,O,W,O,O,W,W,W,W,W,O,O,W,O,O],
[O,O,W,O,O,W,W,W,W,W,O,O,W,O,O],
[O,O,W,O,O,W,W,W,W,W,O,O,W,O,O],
[O,O,W,O,O,W,W,W,W,W,O,O,W,O,O],
[O,O,W,O,O,W,W,W,W,W,O,O,W,O,O],
[O,O,W,O,O,O,O,O,O,O,O,O,W,O,O],
[O,O,W,O,O,O,O,O,O,O,O,O,W,O,O],
[O,O,W,W,W,W,W,W,W,W,W,W,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
]
},
/*
{
name:"Technique All",
map:[//All Technique
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[X,O,P,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[X,O,W,O,W,O,W,O,W,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
]
},
//*/
{
name:"Tower1",
map:[//○Tower1 : Tower Inner
[O,O,O,O,O,O,X,W,W,W,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,X,O,G,O,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,X,O,O,O,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,X,O,O,O,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,X,O,O,O,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,X,O,O,O,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,X,O,O,O,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,X,O,O,O,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,X,O,O,O,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,W,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,X,O,O,O,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,X,O,O,O,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,P,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,W,W,W,W,O,O,O,O,O,O,],
]
},
{
name:"Tower2",
map:[//○Tower2 : Parallel : Easy
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,G,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,W,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,W,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,P,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,W,W,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
]
},
{
name:"Tower3",
map:[//○Tower3 : Reduce Vel
[O,O,O,O,O,O,O,O,G,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,W,W,W,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,W,W,W,X,W,W,W,W,W,W,W,X,W,W,W,O,],
[O,O,O,O,O,X,O,O,W,O,O,X,O,O,O,O,O,],
[O,O,O,O,O,W,O,O,W,O,O,W,O,O,O,O,O,],
[O,O,O,O,O,W,O,O,W,O,O,W,O,O,O,O,O,],
[O,O,O,O,O,W,O,O,W,O,O,W,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,W,W,W,X,X,X,X,X,W,W,W,O,O,O,],
[O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,W,W,W,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,W,W,W,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,],
[O,O,O,W,W,W,W,X,X,X,W,W,W,W,O,O,O,],
[O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,O,O,],
[O,O,O,O,W,W,W,W,W,W,W,W,W,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,P,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,W,W,W,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
]
},
{
name:"Tower4",
map:[//○Tower4 : Difficult
[O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,X,O,O,O,O,O,O,O,O,O,X,O,],
[O,W,O,O,O,O,O,O,O,O,O,W,O,],
[O,W,O,O,O,O,O,O,O,O,O,W,O,],
[O,W,O,O,O,O,O,O,O,O,O,W,O,],
[O,W,O,O,O,O,O,O,O,O,O,W,O,],
[O,W,O,O,O,O,X,O,O,O,O,W,O,],
[O,W,O,O,O,O,W,O,O,O,O,W,O,],
[O,W,O,O,O,O,W,O,O,O,O,W,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,W,W,W,X,X,X,X,X,W,W,W,O,],
[O,O,O,O,O,O,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,X,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,X,O,O,W,O,O,X,O,O,O,],
[O,O,O,X,O,O,W,O,O,X,O,O,O,],
[O,O,O,W,O,O,W,O,O,W,O,O,O,],
[O,O,O,W,O,O,X,O,O,W,O,O,O,],
[O,O,O,W,O,O,X,O,O,W,O,O,O,],
[O,O,O,W,O,O,X,O,O,W,O,O,O,],
[O,O,O,W,O,O,W,O,O,W,O,O,O,],
[O,O,O,X,O,O,W,O,O,X,O,O,O,],
[O,O,O,X,O,O,W,O,O,X,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,W,W,W,X,W,X,W,W,W,O,O,],
[O,O,W,W,W,W,W,W,W,W,W,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,O,W,O,O,O,O,O,O,],
[O,O,O,O,O,P,W,G,O,O,O,O,O,],
[O,O,O,O,O,W,X,W,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,],
]
},
{
name:"Maze1",
map:[//○Maze1 : No Way (LongJump for Escape)
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,W,W,O,W,W,O,X,X,O,X,X,O,X,X,O,X,X,O,W,W,O,W,W,O,O],
[O,O,W,W,O,W,W,O,X,X,O,X,X,O,X,X,O,X,X,O,W,W,O,W,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,W,W,O,X,X,O,X,X,O,W,W,O,W,W,O,X,X,O,X,X,O,W,W,O,O],
[O,O,W,W,O,X,X,O,X,X,O,W,W,O,W,W,O,X,X,O,X,X,O,W,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,W,W,O,X,X,O,X,X,O,W,W,O,X,X,O,X,X,O,X,X,O,W,W,O,O],
[O,O,W,W,O,X,X,O,X,X,O,W,W,O,X,X,O,X,X,O,X,X,O,W,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,W,W,O,X,X,O,X,X,O,W,W,O,X,X,O,X,X,O,X,X,O,W,W,O,O],
[O,O,W,W,O,X,X,O,X,X,O,W,W,O,X,X,O,X,X,O,X,X,O,W,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,P,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,W,W,O,W,W,O,W,W,O,W,W,O,W,W,O,W,W,O,X,X,G,W,W,O,O],
[O,O,W,W,O,W,W,O,W,W,O,W,W,O,W,W,O,W,W,O,X,X,O,W,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,W,W,O,X,X,O,X,X,O,W,W,O,X,X,O,X,X,O,X,X,O,W,W,O,O],
[O,O,W,W,O,X,X,O,X,X,O,W,W,O,X,X,O,X,X,O,X,X,O,W,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,W,W,O,X,X,O,X,X,O,W,W,O,X,X,O,X,X,O,X,X,O,W,W,O,O],
[O,O,W,W,O,X,X,O,X,X,O,W,W,O,X,X,O,X,X,O,X,X,O,W,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,W,W,O,X,X,O,X,X,O,W,W,O,W,W,O,X,X,O,X,X,O,W,W,O,O],
[O,O,W,W,O,X,X,O,X,X,O,W,W,O,W,W,O,X,X,O,X,X,O,W,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,W,W,O,W,W,O,X,X,O,X,X,O,X,X,O,X,X,O,W,W,O,W,W,O,O],
[O,O,W,W,O,W,W,O,X,X,O,X,X,O,X,X,O,X,X,O,W,W,O,W,W,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
]
},
{
name:"Maze2",
map:[//○Maze2 : Search & Reach
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O,W,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,W,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,W,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,W,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,W,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,W,O,],
[O,O,O,O,O,O,O,O,O,O,O,W,W,W,W,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,X,O,W,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,W,O,],
[O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,X,O,W,O,],
[O,O,O,O,O,O,O,W,O,W,O,O,O,O,P,O,O,O,O,W,O,W,O,O,O,O,O,O,O,O,X,O,W,O,],
[O,O,O,O,O,W,O,W,O,W,O,O,O,W,W,W,O,O,O,W,O,W,O,W,O,O,O,O,O,O,X,O,W,O,],
[O,O,O,W,O,W,O,W,O,W,O,O,O,W,W,W,O,O,O,W,O,W,O,W,O,W,O,O,O,O,X,O,W,O,],
[O,O,O,O,O,W,O,W,O,W,O,O,O,W,W,W,O,O,O,W,O,W,O,W,O,O,O,O,O,O,X,O,W,O,],
[O,O,O,O,O,O,O,W,O,W,O,O,O,O,O,O,O,O,O,W,O,W,O,O,O,O,O,O,O,O,X,G,W,O,],
[O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,X,W,W,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,W,W,W,W,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
]
},
{
name:"Maze3",
map:[//○Maze3 : Middle
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,X,O,O,O,O,O,W,W,W,X,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,O,],
[O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,P,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,],
[O,X,O,O,W,X,W,O,O,W,X,W,O,O,W,W,W,O,O,W,W,W,O,W,W,W,W,W,W,W,W,W,W,W,W,W,W,O,W,O,],
[O,X,O,O,W,X,X,O,O,W,X,W,O,O,W,X,W,O,O,W,W,W,O,W,X,X,X,W,X,X,X,W,O,O,O,O,W,O,W,O,],
[O,X,O,O,W,W,W,O,O,W,W,W,O,O,W,W,W,O,O,W,W,W,O,W,O,O,O,W,O,O,O,W,O,O,O,O,W,O,W,O,],
[O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,W,O,O,O,W,O,O,O,O,W,O,W,O,],
[O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,O,W,O,O,O,W,O,O,O,W,O,O,O,O,W,O,W,O,],
[O,X,O,O,W,X,W,O,O,W,W,W,O,O,W,W,W,O,O,W,G,W,O,W,O,O,O,W,O,O,O,W,O,O,O,O,W,O,W,O,],
[O,X,O,O,W,X,W,O,O,X,X,W,O,O,W,X,W,O,O,W,O,W,O,W,O,O,O,W,O,O,O,W,O,O,O,O,W,O,W,O,],
[O,X,O,O,W,X,W,O,O,W,W,W,O,O,W,W,W,O,O,W,O,W,O,W,O,O,O,W,O,O,O,W,O,O,O,O,W,O,W,O,],
[O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,W,O,W,O,O,O,W,O,O,O,W,O,O,O,O,W,O,W,O,],
[O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,W,O,W,O,O,O,W,O,O,O,W,O,O,O,O,W,O,W,O,],
[O,X,O,O,W,X,W,O,O,W,X,W,O,O,W,W,W,O,O,W,O,W,O,W,O,O,O,W,O,O,O,W,O,O,O,O,W,O,W,O,],
[O,X,O,O,W,X,X,O,O,W,X,W,O,O,W,X,W,O,O,W,O,W,O,W,O,O,O,W,O,O,O,W,O,O,O,O,W,O,W,O,],
[O,X,O,O,W,W,W,O,O,W,W,W,O,O,W,W,W,O,O,W,O,W,O,W,O,O,O,W,O,O,O,W,O,O,O,O,W,O,W,O,],
[O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,W,O,W,O,O,O,W,O,O,O,W,W,W,W,W,W,O,W,O,],
[O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,W,X,W,O,O,O,W,O,O,O,O,O,O,O,O,O,O,W,O,],
[O,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,O,W,W,W,O,O,O,W,W,W,W,W,W,W,W,W,W,W,W,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
]
},
{
name:"Zig Zag",
map:[//○Normal Jump Stage
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,G,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,W,W,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,W,W,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,W,W,W,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,W,W,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,P,O,O,O,O,O,O,W,W,W,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,W,W,W,W,W,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,],
]
},
{
name:"Vortex",
map:[//
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,X,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,X,O,O,O,X,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,W,O,X,O,O,O,O,O,O,O,X,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,W,O,X,O,O,O,O,O,W,O,O,O,O,O,X,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,W,O,X,O,O,O,O,O,W,O,X,O,W,O,O,O,O,O,X,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,W,O,X,O,O,O,O,O,W,O,X,O,O,O,X,O,W,O,O,O,O,O,X,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,W,O,X,O,O,O,O,O,W,O,X,O,O,O,O,O,O,O,X,O,W,O,O,O,O,O,X,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,W,O,X,O,O,O,O,O,W,O,X,O,O,O,O,O,W,O,O,O,O,O,X,O,W,O,O,O,O,O,X,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,P,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,W,O,X,O,O,O,O,O,W,O,X,O,W,O,X,O,W,O,O,O,O,O,X,O,W,O,O,O,O,O,X,O,W,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,W,O,X,O,O,O,O,O,W,O,X,O,W,O,O,O,O,O,X,O,W,O,O,O,O,O,O,O,O,O,X,O,W,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,W,O,X,O,O,O,O,O,W,O,O,O,O,O,X,O,W,O,O,O,O,O,O,O,O,O,O,O,W,O,X,O,W,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,G,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,W,O,X,O,O,O,O,O,O,O,X,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,X,O,W,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,W,O,X,O,O,O,X,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,X,O,W,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,X,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
]
},
{
name:"Escape",
map:[//
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,G,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,X,O,O,O,X,O,O,O],
[O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,W,O,O,O,W,W,W,W,W,W,W,W,W,W,W,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,W,O,O,O,W,O,O,O,O,O,O,O,O,O,W,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,W,O,O,O,W,O,O,O,O,O,O,O,O,O,W,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,X,O,O,O,W,O,O,O,O,P,O,O,O,O,X,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,O,O,O,O,W,O,O,O,W,W,W,O,O,O,O,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,O,O,O,O,W,O,O,O,W,W,W,O,O,O,O,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,O,O,O,O,W,O,O,O,W,W,W,O,O,O,O,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,X,O,O,O,W,O,O,O,O,O,O,O,O,O,X,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,W,O,O,O,W,O,O,O,O,O,O,O,O,O,W,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,W,O,O,O,W,O,O,O,O,O,O,O,O,O,W,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,W,O,O,O,W,W,W,W,W,W,W,W,W,W,W,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O],
[O,O,O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O],
[O,O,O,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
]
},
{
name:"Landing",
map:[//
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,O,P,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,W,W,W,W,W,W,W,W,X,O,W,O,X,W,W,W,W,W,W,W,W,W,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,W,W,W,W,W,W,W,W,X,O,W,O,X,W,W,W,W,W,W,W,W,W,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,X,O,O,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,W,O,O,O,O,O,O],
[O,W,W,W,W,W,W,W,W,W,X,O,W,O,X,W,W,W,W,W,W,W,W,W,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,G,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
[O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O],
]
},
];
//ステージのサイズ(初期化時に計算する)
static public var BitmapW:int = 100;
static public var BitmapH:int = 100;
//マップの要素の最大数
static public const MAP_NUM_MAX_X:int = 128;
static public const MAP_NUM_MAX_Y:int = 128;
//モード
static public var ModeIter:int = 0;
static public const MODE_MAIN:int = ModeIter++;
static public const MODE_GOAL:int = ModeIter++;
static public const MODE_GAME_OVER:int = ModeIter++;
//==Var==
//ルート
public var m_Layer_Root :Sprite = new Sprite();
public var m_Layer_BG :Sprite = new Sprite();
public var m_Layer_Game:Sprite = new Sprite();
//Scale
public var m_GlobalScl:Number = 1;
//背景&パス
public var m_BitmapData_Ori:BitmapData;
public var m_BitmapData_Path:BitmapData;
//プレイヤー
public var m_Player:Player;
//ゴール
public var m_Goal:Goal;
//Button
public var m_ButtonPause:Button;
public var m_Pause_Push:Boolean = false;
public var m_Pause_Exec:Boolean = false;
//テキスト
public var m_Text:TextField = new TextField();
//Popup系UI
public var m_Popup_Queue:Vector.<Popup> = new Vector.<Popup>();
public var m_TopPopup:Popup = null;
//モード
public var m_Mode:int = MODE_MAIN;
//==Function==
//Static Global Access
static private var m_Instance:GameMainWonderfl;
static public function Instance():GameMainWonderfl{return m_Instance;}
//#Init
public function GameMainWonderfl(){
m_Instance = this;
//*
//wonderfl用:Bitmapを外部からロードする場合
//Load
addEventListener(
Event.ADDED_TO_STAGE,//ステージに追加されたら
function(e:Event):void{
var loader:Loader = new Loader();
loader.load(new URLRequest(BITMAP_URL), new LoaderContext(true));//画像のロードを開始して
loader.contentLoaderInfo.addEventListener(
Event.COMPLETE,//ロードが完了したら
function(e:Event):void{
ImageManager.Init(loader.content);//それを保持した後
Init();//初期化に入る
}
);
}
);
//キャプチャのタイミング指定
Wonderfl.capture_delay(30);//30秒後に実行
/*/
//ローカル用:Bitmapを事前ロードできる場合
//ブロック画像のセット(&その他初期化)
ImageManager.Init(new Bitmap_Graphic());
//本体の初期化
addEventListener(Event.ADDED_TO_STAGE, Init);
//*/
}
//#Init
public function Init(e:Event=null):void{
//Settings
{
stage.scaleMode = StageScaleMode.NO_SCALE;//Stage3Dとの共存のため、倍率は自前で決めることにする
stage.align = StageAlign.TOP_LEFT;
}
//レイヤー
{
addChild(m_Layer_Root);
m_Layer_Root.addChild(m_Layer_BG);
m_Layer_Root.addChild(m_Layer_Game);
}
//Global Scale
{
ResetGlobalScale();
}
//BG
{
//PerlinNoise + ColorTransform
const PanelLen:int = 16;//VIEW_W / 4;
const Octave:int = 2;//変化は雑でいい
const stitch:Boolean = true;//端はループできる感じで
const fractalNoise:Boolean = true;//なめらかな変化で
const channel:uint = 0x7;//全色
const grayScale:Boolean = true;//RGBは全て同じ値で
const base_ratio_min:Number = 0.5;
const base_ratio_max:Number = 1.0;
const r_ratio:Number = 0.1;
const r_offset:uint = 0xD0;//0x80;
const g_ratio:Number = 0.1;
const g_offset:uint = 0xB0;//0x80;
const b_ratio:Number = 0.02;
const b_offset:uint = 0x50;//0x80;
var bmd_bg:BitmapData = new BitmapData(VIEW_W, VIEW_H, false, 0x000000);
bmd_bg.lock();
//PerlinNoise
bmd_bg.perlinNoise(PanelLen,PanelLen, Octave, 1000*Math.random(), stitch, fractalNoise, channel, grayScale);
/*
//ColorTransform
bmd_bg.colorTransform(bmd_bg.rect, new ColorTransform(0,g_ratio,0,1, 0,g_offset,0,0));
/*/
for(var yy:int = 0; yy < bmd_bg.height; ++yy){
var base_ratio:Number = Util.Lerp(base_ratio_min, base_ratio_max, 1.0 * (bmd_bg.height - yy) / bmd_bg.height);
for(var xx:int = 0; xx < bmd_bg.width; ++xx){
var color_ori:uint = bmd_bg.getPixel(xx, yy);
var r:uint = (color_ori >> 16) & 0xFF;
var g:uint = (color_ori >> 8) & 0xFF;
var b:uint = (color_ori >> 0) & 0xFF;
r = base_ratio * (r * r_ratio + r_offset);
g = base_ratio * (g * g_ratio + g_offset);
b = base_ratio * (b * b_ratio + b_offset);
bmd_bg.setPixel(xx, yy, (r << 16) | (g << 8) | (b << 0));
}
}
//*/
bmd_bg.unlock();
m_Layer_BG.addChild(new Bitmap(bmd_bg));
}
//m_BitmapData_Ori
//m_BitmapData_Path
{
m_BitmapData_Ori = new BitmapData(MAP_NUM_MAX_X * 32, MAP_NUM_MAX_Y * 32, true, 0x00000000);
m_BitmapData_Path = new BitmapData(MAP_NUM_MAX_X * 32, MAP_NUM_MAX_Y * 32, true, 0x00000000);
m_Layer_Game.addChild(new Bitmap(m_BitmapData_Ori));
}
//Player
{
m_Player = new Player();
m_Layer_Game.addChild(m_Player);
}
//Goal
{
m_Goal = new Goal();
m_Layer_Game.addChild(m_Goal);
}
//Pause Button
{
m_ButtonPause = new Button(ImageManager.GetButtonBitmapData());
m_Layer_Root.addChild(m_ButtonPause);
m_ButtonPause.x = VIEW_W - 64/2;
m_ButtonPause.y = 64/2;
}
//Text
{
m_Text.selectable = false;
m_Text.autoSize = TextFieldAutoSize.LEFT;
m_Text.defaultTextFormat = new TextFormat('Verdana', 60, 0xFFFF00, true);
m_Text.text = '';
m_Text.filters = [new GlowFilter(0xFF0000)];
m_Layer_Root.addChild(m_Text);
}
//Key
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, OnKeyDown);
}
//Touch
{
stage.addEventListener(MouseEvent.MOUSE_DOWN, OnMouseDown);
stage.addEventListener(MouseEvent.MOUSE_MOVE, OnMouseMove);
stage.addEventListener(MouseEvent.MOUSE_UP, OnMouseUp);
}
//Update
{
addEventListener(Event.ENTER_FRAME, Update);
}
//Reset
{
Reset(true);
}
//最初のState
{
//ちょっと強引にステージ選択画面にする
Push(new Popup_StageSelect());
Pop();//上のResetでPushされたものをPopしておく
}
}
//
public function ResetGlobalScale():void{
var stageWidth :int = stage.stageWidth;
var stageHeight:int = stage.stageHeight;
/*
CONFIG::RELEASE
{
stageWidth = Capabilities.screenResolutionX;
stageHeight = Capabilities.screenResolutionY;
}
//*/
//GlobalScale
var GlobalX:Number = 0;
var GlobalY:Number = 0;
var GlobalScale:Number = 1;
{
var GlobalScaleX:Number = stageWidth / VIEW_W;
var GlobalScaleY:Number = stageHeight / VIEW_H;
if(GlobalScaleX < GlobalScaleY){
GlobalScale = GlobalScaleX;
GlobalY += stageHeight/2 - GlobalScale * VIEW_H/2;
}else{
GlobalScale = GlobalScaleY;
GlobalX += stageWidth/2 - GlobalScale * VIEW_W/2;
}
}
m_GlobalScl = GlobalScale;
// m_View.width = GAME_H * GlobalScale;
// m_View.height = GAME_H * GlobalScale;
m_Layer_Root.x = GlobalX;
m_Layer_Root.y = GlobalY;
m_Layer_Root.scaleX = GlobalScale;
m_Layer_Root.scaleY = GlobalScale;
}
//Key
private function OnKeyDown(event:KeyboardEvent):void{
switch(event.keyCode){
case Keyboard.BACK://バックキー
// case Keyboard.ESCAPE://PC動作チェック用
//デフォルトの挙動をキャンセル
event.preventDefault();
//アプリを終了
// NativeApplication.nativeApplication.exit();
break;
}
}
//Touch
private function OnMouseDown(e:MouseEvent):void{
if(m_TopPopup != null){
m_TopPopup.OnMouseDown();
return;
}
if(m_ButtonPause.IsRectIn()){
m_Pause_Push = true;
m_Pause_Exec = true;
return;
}
m_Player.OnMouseDown(e);
}
private function OnMouseMove(e:MouseEvent):void{
if(m_TopPopup != null){
m_TopPopup.OnMouseMove();
return;
}
if(m_Pause_Push && !m_ButtonPause.IsRectIn()){
m_Pause_Exec = false;
}
}
private function OnMouseUp(e:MouseEvent):void{
if(m_TopPopup != null){
m_TopPopup.OnMouseUp();
return;
}
if(m_Pause_Push && m_ButtonPause.IsRectIn()){
if(m_Pause_Exec){
Push(new Popup_Pause());
}
return;
}
m_Player.OnMouseUp(e);
}
//#Reset
public function Reset(in_RestructFlag:Boolean):void{
var map:Array = MAP[s_MapIter].map;
var NumX:int = map[0].length;
var NumY:int = map.length;
//Param
{
BitmapW = NumX * 32;
BitmapH = NumY * 32;
}
//m_BitmapData_Ori
//m_BitmapData_Path
if(in_RestructFlag)
{
ImageManager.DrawBG(map, m_BitmapData_Ori, m_BitmapData_Path);
/*
//Debug
{
var bmd:BitmapData = new BitmapData(BitmapW, BitmapH, true, 0x00000000);
{
var palette:Array = new Array(256);
for(var i:int = 0; i < 256; i++){
palette[i] = 0x00000000;
}
palette[Player.PATH_U] = 0xFF008800;
palette[Player.PATH_D] = 0xFF008800;
palette[Player.PATH_L] = 0xFF008800;
palette[Player.PATH_R] = 0xFF008800;
palette[Player.PATH_UorL] = 0xFF00FF00;
palette[Player.PATH_UorR] = 0xFF00FF00;
palette[Player.PATH_DorL] = 0xFFFF0000;
palette[Player.PATH_DorR] = 0xFF00FF00;
palette[Player.PATH_UandL] = 0xFF00FF00;
palette[Player.PATH_UandR] = 0xFF00FF00;
palette[Player.PATH_DandL] = 0xFFFF0000;
palette[Player.PATH_DandR] = 0xFF00FF00;
palette[Player.PATH_DAMAGE] = 0xFFFF0000;
const POS_ZERO:Point = new Point(0,0);
bmd.paletteMap(m_BitmapData_Path, m_BitmapData_Path.rect, POS_ZERO, null, null, palette);
//bmd.paletteMap(ImageManager.m_BitmapData_Path, ImageManager.m_BitmapData_Path.rect, POS_ZERO, null, null, palette);
}
m_Layer_Game.addChild(new Bitmap(bmd));
}
//*/
}
//MAPからパラメータ取得
var PlayerX:int = 0;
var PlayerY:int = 0;
var GoalX:int = 0;
var GoalY:int = 0;
{
for(var y:int = 0; y < NumY; y++){
for(var x:int = 0; x < NumX; x++){
switch(map[y][x]){
case P:
PlayerX = (x + 0.5) * 32;
PlayerY = (y + 0.5) * 32;
break;
case G:
GoalX = (x + 0.5) * 32;
GoalY = (y + 0.5) * 32;
break;
}
}
}
}
//Player
{
m_Player.Reset(PlayerX, PlayerY);
}
//Goal
{
m_Goal.Reset(GoalX, GoalY);
}
//Mode
{
m_Mode = MODE_MAIN;
}
//Text
{
m_Text.text = '';
}
//Init Camera
{
Update_Camera();
}
//StageName
if(in_RestructFlag)
{
Push(new Popup_StageName(MAP[s_MapIter].name));
}
}
//#Update
public function Update(e:Event=null):void{
var DeltaTime:Number = 1/24.0;
//Popup
if(m_TopPopup != null){
m_TopPopup.Update(DeltaTime);
if(m_TopPopup.IsEnd()){
Pop();
}
return;//ダイアログ表示中
}
//Button
{
m_ButtonPause.Update(DeltaTime);
}
//Player
{
m_Player.Update();
}
//Camera
{
Update_Camera();
}
//Goal
{
m_Goal.Update();
}
}
//Update :Camera
public function Update_Camera():void{
var CAMERA_W:int = VIEW_W;
var CAMERA_H:int = VIEW_H;
var trgX:Number = m_Player.x*m_GlobalScl - CAMERA_W/2.0;
var trgY:Number = m_Player.y*m_GlobalScl - CAMERA_H/2.0;
var MinX:Number = 0.0;
var MaxX:Number = (BitmapW - CAMERA_W) * m_GlobalScl;
var MinY:Number = 0.0;
var MaxY:Number = (BitmapH - CAMERA_H) * m_GlobalScl;
if(trgX > MaxX){
trgX = MaxX;
}
if(trgY > MaxY){
trgY = MaxY;
}
if(trgX < MinX){
trgX = MinX;
}
if(trgY < MinY){
trgY = MinY;
}
/*
m_Layer_Game.x = -trgX;
m_Layer_Game.y = -trgY;
/*/
// m_Layer_Game.scrollRect = new Rectangle(trgX/m_GlobalScl, trgY/m_GlobalScl, VIEW_W / m_GlobalScl, VIEW_H / m_GlobalScl);
m_Layer_Game.scrollRect = new Rectangle(trgX/m_GlobalScl, trgY/m_GlobalScl, VIEW_W, VIEW_H);
//*/
}
//#Path
public function GetPathIndex(in_X:int, in_Y:int):int{
return m_BitmapData_Path.getPixel(in_X, in_Y);
}
//Popup : Push
public function Push(in_Popup:Popup):void{
if(m_Popup_Queue.length <= 0){
m_TopPopup = in_Popup;
}
m_Layer_Root.addChild(in_Popup);
m_Popup_Queue.push(in_Popup);
}
//Popup : Pop
public function Pop():void{
if(m_TopPopup != null){
m_TopPopup.parent.removeChild(m_TopPopup);
m_Popup_Queue.shift();
}
if(m_Popup_Queue.length <= 0){
m_TopPopup = null;
}else{
m_TopPopup = m_Popup_Queue[0];
}
}
//#Goal
public function OnGoal():void{
//Mode
{
m_Mode = MODE_GOAL;
}
/*
//Text
{
//Text
m_Text.text = 'Clear';
//Centering
m_Text.x = (stage.stageWidth - m_Text.width) / 2;
m_Text.y = (stage.stageHeight - m_Text.height) / 2;
}
//*/
//Popup
{
Push(new Popup_Result(true));
}
}
//#Game Over : Damage
public function OnDead_Damage():void{
//Mode
{
m_Mode = MODE_GAME_OVER;
}
/*
//Text
{
//Text
m_Text.text = 'Game Over';
//Centering
m_Text.x = (stage.stageWidth - m_Text.width) / 2;
m_Text.y = (stage.stageHeight - m_Text.height) / 2;
}
//*/
//Popup
{
Push(new Popup_Result(false));
}
}
//#Game Over : Fall
public function OnDead_Fall():void{
//Mode
{
m_Mode = MODE_GAME_OVER;
}
/*
//Text
{
//Text
m_Text.text = 'Game Over';
//Centering
m_Text.x = (stage.stageWidth - m_Text.width) / 2;
m_Text.y = (stage.stageHeight - m_Text.height) / 2;
}
//*/
//Popup
{
Push(new Popup_Result(false));
}
}
//#IsGameOver
public function IsEnd():Boolean{
return (m_Mode != MODE_MAIN);
}
}
}
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.net.*;
import flash.text.*;
import flash.filters.*;
import flash.ui.*;
import flash.system.*;
//Base : Popup
class Popup extends Sprite
{
//==Static==
//全てPopするためのフラグ
// static public var s_AllEndFlag:Boolean = false;
//==Const==
//プレートの高さ(押しやすいようにする)
static public const PLATE_H:int = 64;
//ついでに幅も
static public const PLATE_W:int = 400;
//==Var==
//次のポップアップ
public var m_NextPopup:Popup = null;
//Flag
protected var m_EndFlag:Boolean = false;
//==Function==
//Init
public function Popup(){
// s_AllEndFlag = false;
}
//Update
public function Update(in_DeltaTime:Number):void{
//Override
}
//Touch
public function OnMouseDown():void{
//Override
}
public function OnMouseMove():void{
//Override
}
public function OnMouseUp():void{
//Override
}
//
public function GetNextPopup():Popup{
return m_NextPopup;
}
public function ClearNextPopup():void{
m_NextPopup = null;
}
//Flag
public function IsEnd():Boolean{
return m_EndFlag;// || s_AllEndFlag;
}
}
//Base : Popup Scroll
class Popup_Scroll extends Popup
{
//==Static==
//毎回生成するのは高コストなので、一度生成したら保持しておく
static public var s_BitmapData_BG:BitmapData = null;
static public var s_NinePatch_Button_Content:NinePatch;
//==Const==
//
static public const CONTENT_GAP_NORMAL :int = 122;
static public const CONTENT_GAP_STAGESELECT :int = 70;
//Type
static public var s_TypeIter:int = 0;
static public const TYPE_PAUSE :int = s_TypeIter++;
static public const TYPE_RESULT :int = s_TypeIter++;
static public const TYPE_STAGESELECT:int = s_TypeIter++;
//==Var==
//Layer
public var m_Layer_Root:Sprite = new Sprite();
public var m_Layer_BG:Sprite = new Sprite();
public var m_Layer_Content:Sprite = new Sprite();
public var m_Layer_Scroll:Sprite = new Sprite();
//Type
public var m_Type:int;
//
public var m_ContentGap:int;
//Title
public var m_BitmapData_Title:BitmapData;
//Content
public var m_BitmapData_Content:Vector.<BitmapData>;
public var m_ContentAlign:int;
//ボタン
public var m_ButtonManager:ButtonManager = new ButtonManager();
//Slide
public var m_PushFlag:Boolean = false;
// public var m_SrcTouchYXNumber = 0;
// public var m_DstTouchX:Number = 0;
public var m_SrcTouchY:Number = 0;
public var m_DstTouchY:Number = 0;
public var m_ScrollGap:Number = 0;
//==Function==
//Init
public function Popup_Scroll(in_Type:int, in_Title:String, in_MesList:Vector.<String>, in_ContentAlign:int = -1){
super();
//Param
{
m_Type = in_Type;
if(0 <= in_ContentAlign){
m_ContentAlign = in_ContentAlign;
}else{
m_ContentAlign = FontText.ALIGN_LEFT;
}
m_ContentGap = (in_Type == TYPE_STAGESELECT)? CONTENT_GAP_STAGESELECT: CONTENT_GAP_NORMAL;
}
var bmd_ori:BitmapData = ImageManager.m_BitmapData_Ori;
var bmd:BitmapData;
var rad_x:int;
var rad_y:int;
var w:int;
var h:int;
var ori_x:int;
var ori_y:int;
var ori_w:int;
var ori_h:int;
const HeaderH:int = 64;
const FooterH:int = 8;
const offset:int = 0;//8;
const TotalW:int = GameMainWonderfl.VIEW_W - 2*offset;
const TotalH:int = GameMainWonderfl.VIEW_H - 2*offset - GameMainWonderfl.AD_H;
var ContentAreaH:int = TotalH - HeaderH - FooterH;
//Layer
{
addChild(m_Layer_Root);
m_Layer_Root.y = GameMainWonderfl.AD_H;
m_Layer_Root.addChild(m_Layer_BG);
// m_Layer_Content.x = GameMainWonderfl.VIEW_W/2;
// m_Layer_Content.y = 88;
m_Layer_Content.y = HeaderH + offset;
m_Layer_Content.scrollRect = new Rectangle(-GameMainWonderfl.VIEW_W/2, -m_ContentGap/2, GameMainWonderfl.VIEW_W, ContentAreaH);
m_Layer_Root.addChild(m_Layer_Content);
m_Layer_Content.addChild(m_Layer_Scroll);
}
//BG
{
if(s_BitmapData_BG == null){
var mtx:Matrix = new Matrix();
s_BitmapData_BG = new BitmapData(TotalW, TotalH, true, 0x00000000);
rad_x = 12;
rad_y = 12;
w = TotalW;
h = HeaderH;
ori_x = 80 + 64*2;
ori_y = 0;
ori_w = 64;
ori_h = 64;
s_BitmapData_BG.draw(NinePatch.Create(bmd_ori, rad_x, rad_y, w, h, ori_x, ori_y, ori_w, ori_h), mtx);
mtx.ty += h;
rad_x = 12;
rad_y = 12;
w = TotalW;
h = TotalH - HeaderH;
ori_x = 80 + 64*2;
ori_y = 64;
ori_w = 64;
ori_h = 64;
s_BitmapData_BG.draw(NinePatch.Create(bmd_ori, rad_x, rad_y, w, h, ori_x, ori_y, ori_w, ori_h), mtx);
mtx.ty += h;
}
var bmp_bg:Bitmap = new Bitmap(s_BitmapData_BG);
bmp_bg.x = offset;
bmp_bg.y = offset;
m_Layer_BG.addChild(bmp_bg);
}
//Title
{
m_BitmapData_Title = new BitmapData(GameMainWonderfl.VIEW_W, 64, true, 0x00000000);
FontText.DrawText(m_BitmapData_Title, in_Title, m_BitmapData_Title.width/2, m_BitmapData_Title.height/2, 32, 0x000000);
var bmp_title:Bitmap = new Bitmap(m_BitmapData_Title);
bmp_title.y = 8;
m_Layer_Root.addChild(bmp_title);
}
//Content
{
if(s_NinePatch_Button_Content == null){
rad_x = 12;
rad_y = 12;
w = PLATE_W - 64;
h = PLATE_H;
ori_x = 16*5 + 64;
ori_y = 0;
ori_w = 64;
ori_h = 64;
s_NinePatch_Button_Content = NinePatch.Create(bmd_ori, rad_x, rad_y, w, h, ori_x, ori_y, ori_w, ori_h);
}
var item_list:Vector.<String> = in_MesList;
// new <String>["AA", "BB", "CC"];//!!test
var num:int = item_list.length;
m_BitmapData_Content = new Vector.<BitmapData>(num);
var src_rect:Rectangle = new Rectangle(0,0,PLATE_W,PLATE_H);
var dst_point:Point = new Point(0,0);
for(var i:int = 0; i < num; ++i){
//Frame
{
bmd = new BitmapData(PLATE_W, PLATE_H, true, 0x00000000);
src_rect.x = 0;
src_rect.y = 0;
src_rect.width = PLATE_W - 64;
dst_point.x = 64;
bmd.copyPixels(s_NinePatch_Button_Content.m_BitmapData, src_rect, dst_point);
switch(m_Type){
case TYPE_PAUSE:
case TYPE_RESULT:
switch(i){
case 0: src_rect.x = 16*5 + 64*0; src_rect.y = 64*0; break;
case 1: src_rect.x = 16*5 + 64*0; src_rect.y = 64*1; break;
case 2: src_rect.x = 16*5 + 64*1; src_rect.y = 64*1; break;
}
break;
case TYPE_STAGESELECT:
src_rect.x = 16*5 + 64*0; src_rect.y = 64*0; break;
break;
}
src_rect.width = 64;
dst_point.x = 0;
bmd.copyPixels(bmd_ori, src_rect, dst_point);
}
switch(m_ContentAlign){
case FontText.ALIGN_LEFT:
FontText.DrawText(bmd, item_list[i], 64+8, bmd.height/2, 32, 0x000000, m_ContentAlign);
break;
case FontText.ALIGN_CENTER:
FontText.DrawText(bmd, item_list[i], bmd.width/2, bmd.height/2, 32, 0x000000, m_ContentAlign);
break;
case FontText.ALIGN_RIGHT:
//No Support
break;
}
var button_content:Button = new Button(bmd);
button_content.x = 0;//GameMainWonderfl.VIEW_W/2;
button_content.y = i * m_ContentGap;
m_Layer_Scroll.addChild(button_content);
m_ButtonManager.AddButton(button_content);
m_BitmapData_Content[i] = bmd;
}
}
//Slide
{
m_ScrollGap = Math.min(ContentAreaH - in_MesList.length * m_ContentGap, 0);
}
}
//Update
override public function Update(in_DeltaTime:Number):void{
m_ButtonManager.Update(in_DeltaTime);
}
//Touch
override public function OnMouseDown():void{
// m_SrcTouchX = m_DstTouchX = m_Layer_Content.mouseX;
m_SrcTouchY = m_DstTouchY = m_Layer_Content.mouseY;
m_PushFlag = true;
m_ButtonManager.OnMouseDown();
}
override public function OnMouseMove():void{
CheckSlide();
m_ButtonManager.OnMouseMove();
}
override public function OnMouseUp():void{
m_PushFlag = false;
var index:int = m_ButtonManager.OnMouseUp();
if(index < 0){//No Select
return;
}
OnSelect(index);
}
protected function OnSelect(in_Index:int):void{
//override
}
//
public function CheckSlide():void{
if(! m_PushFlag){
return;
}
// var last_touch_x:int = m_Layer_Content.mouseX;
var last_touch_y:int = m_Layer_Content.mouseY;
//Slide
m_Layer_Scroll.y += last_touch_y - m_DstTouchY;
if(0 < m_Layer_Scroll.y){m_Layer_Scroll.y = 0;}
if(m_Layer_Scroll.y < m_ScrollGap){m_Layer_Scroll.y = m_ScrollGap;}
//一定以上スライドさせたらボタンの反応を無効化
if(m_ContentGap/2 < Math.abs(m_DstTouchY - m_SrcTouchY)){
m_ButtonManager.Cancel();
}
// m_DstTouchX = last_touch_x;
m_DstTouchY = last_touch_y;
}
}
//Popup : Result
class Popup_Result extends Popup_Scroll
{
//==Var==
public var m_SelectedIndex:int = -1;
public var m_IsClear:Boolean;
//==Function==
//Init
public function Popup_Result(in_IsClear:Boolean){
super(Popup_Scroll.TYPE_RESULT, GetTitle(in_IsClear), GetMesList(in_IsClear));
m_IsClear = in_IsClear;
}
//
public function GetTitle(in_IsClear:Boolean):String{
if(in_IsClear){
return Util.IsJapanese()? "クリア!": "Clear!";
}else{
return Util.IsJapanese()? "失敗...": "Fail...";
}
}
//
public function GetMesList(in_IsClear:Boolean):Vector.<String>{
var item_list_clear_jp:Vector.<String> =
new <String>["次へ", "もう一度", "ステージ選択"];
var item_list_clear_en:Vector.<String> =
new <String>["Next Stage", "Replay", "Select Stage"];
var item_list_fail_jp:Vector.<String> =
new <String>["もう一度", "ステージ選択"];
var item_list_fail_en:Vector.<String> =
new <String>["Replay", "Select Stage"];
if(in_IsClear){
return Util.IsJapanese()? item_list_clear_jp: item_list_clear_en;
}else{
return Util.IsJapanese()? item_list_fail_jp: item_list_fail_en;
}
}
//Touch
override protected function OnSelect(in_Index:int):void{
if(m_IsClear){
switch(in_Index){
case 0:
//++
GameMainWonderfl.s_MapIter++;
if(GameMainWonderfl.MAP.length <= GameMainWonderfl.s_MapIter){
GameMainWonderfl.s_MapIter = 0;
}
//Reset
GameMainWonderfl.Instance().Reset(true);
//End
m_EndFlag = true;
break;
case 1:
//Reset
GameMainWonderfl.Instance().Reset(false);
//End
m_EndFlag = true;
break;
case 2:
//Menu
GameMainWonderfl.Instance().Push(new Popup_StageSelect());
//End
m_EndFlag = true;
break;
}
}else{
switch(in_Index){
case 0:
//Reset
GameMainWonderfl.Instance().Reset(false);
//End
m_EndFlag = true;
break;
case 1:
//Menu
GameMainWonderfl.Instance().Push(new Popup_StageSelect());
//End
m_EndFlag = true;
break;
}
}
m_SelectedIndex = in_Index;
}
//Update
override public function Update(in_DeltaTime:Number):void{
super.Update(in_DeltaTime);
/*
switch(m_SelectedIndex){
case 1:
GlobalData.Instance.ChangeTask(GlobalData.TASK_MENU_GROUND);
break;
}
//*/
}
}
//Popup : Pause
class Popup_Pause extends Popup_Scroll
{
//==Var==
public var m_SelectedIndex:int = -1;
//==Function==
//Init
public function Popup_Pause(){
super(Popup_Scroll.TYPE_PAUSE, Util.IsJapanese()? "メニュー": "Menu", GetMesList());
}
//
public function GetMesList():Vector.<String>{
var item_list_jp:Vector.<String> =
new <String>["続ける", "最初から", "ステージ選択"];
var item_list_en:Vector.<String> =
new <String>["Continue", "Restart", "Select Stage"];
return Util.IsJapanese()? item_list_jp: item_list_en;
}
//Touch
override protected function OnSelect(in_Index:int):void{
switch(in_Index){
case 0:
//End
m_EndFlag = true;
break;
case 1:
//Reset
GameMainWonderfl.Instance().Reset(false);
//End
m_EndFlag = true;
break;
case 2:
//Menu
GameMainWonderfl.Instance().Push(new Popup_StageSelect());
//End
m_EndFlag = true;
break;
}
m_SelectedIndex = in_Index;
}
//Update
override public function Update(in_DeltaTime:Number):void{
super.Update(in_DeltaTime);
/*
switch(m_SelectedIndex){
case 1:
GlobalData.Instance.ChangeTask(GlobalData.TASK_MENU_GROUND);
break;
}
//*/
}
}
//Popup : StageSelect
class Popup_StageSelect extends Popup_Scroll
{
//==Var==
public var m_SelectedIndex:int = -1;
//==Function==
//Init
public function Popup_StageSelect(){
super(Popup_Scroll.TYPE_STAGESELECT, Util.IsJapanese()? "ステージ選択": "Select Stage", GetMesList());
}
//
public function GetMesList():Vector.<String>{
var num:int = GameMainWonderfl.MAP.length;
var item_list:Vector.<String> = new Vector.<String>(num);
for(var i:int = 0; i < num; ++i){
item_list[i] = GameMainWonderfl.MAP[i].name;
}
return item_list;
}
//Touch
override protected function OnSelect(in_Index:int):void{
//Index
GameMainWonderfl.s_MapIter = in_Index;
if(GameMainWonderfl.MAP.length <= GameMainWonderfl.s_MapIter){
GameMainWonderfl.s_MapIter = 0;
}
//Reset
GameMainWonderfl.Instance().Reset(true);
//End
m_EndFlag = true;
m_SelectedIndex = in_Index;
}
//Update
override public function Update(in_DeltaTime:Number):void{
super.Update(in_DeltaTime);
/*
switch(m_SelectedIndex){
case 1:
GlobalData.Instance.ChangeTask(GlobalData.TASK_MENU_GROUND);
break;
}
//*/
}
}
//Base : StageName
class Popup_StageName extends Popup
{
//==Const==
//Time
static public const TIME_WAIT :Number = 2.0;
static public const TIME_FADE :Number = 1.0;
//Mode
static public var s_ModeIter:int = 0;
static public const MODE_WAIT :int = s_ModeIter++;
static public const MODE_FADE :int = s_ModeIter++;
//==Var==
//Time
public var m_Timer:Number = 0;
//Mode
public var m_Mode:int = 0;
//==Function==
//Init
public function Popup_StageName(in_StageName:String){
super();
var bmd:BitmapData = new BitmapData(GameMainWonderfl.VIEW_W, GameMainWonderfl.VIEW_H, false, 0x000000);
FontText.DrawText(bmd, in_StageName, bmd.width/2, bmd.height/2, 32, 0xFFFFFF);
addChild(new Bitmap(bmd));
}
//Update
override public function Update(in_DeltaTime:Number):void{
m_Timer += in_DeltaTime;
switch(m_Mode){
case MODE_WAIT:
if(TIME_WAIT <= m_Timer){
m_Timer -= TIME_WAIT;
++m_Mode;
}
break;
case MODE_FADE:
{
var ratio:Number = m_Timer / TIME_FADE;
if(TIME_FADE <= m_Timer){
ratio = 1;
m_EndFlag = true;
}
this.alpha = 1 - ratio;
}
break;
}
}
}
class Button extends Sprite
{
//==Const==
static public const SCALE_OFF :Number = 1;
static public const SCALE_ON :Number = 1.1;
//==Var==
//Graphic
public var m_Layer_Scale:Sprite = new Sprite();
public var m_Bitmap:Bitmap;
//Flag
public var m_PressFlag:Boolean = false;
//==Function==
//Init
public function Button(in_BMD:BitmapData){
/*
m_Layer_Scale.x = in_BMD.width/2;
m_Layer_Scale.y = in_BMD.height/2;
addChild(m_Layer_Scale);
/*/
addChild(m_Layer_Scale);
//*/
var bmp:Bitmap = new Bitmap(in_BMD);
bmp.x = -in_BMD.width/2;
bmp.y = -in_BMD.height/2;
m_Layer_Scale.addChild(bmp);
m_Bitmap = bmp;
}
//Update
public function Update(in_DeltaTime:Number):void{
var lerp_ratio:Number = 0.9;
var scl:Number = Util.Lerp(m_Layer_Scale.scaleX, (m_PressFlag? SCALE_ON: SCALE_OFF), lerp_ratio);
m_Layer_Scale.scaleX = m_Layer_Scale.scaleY = scl;
}
//Range
public function IsRectIn():Boolean{
return m_Bitmap.bitmapData.rect.contains(m_Bitmap.mouseX, m_Bitmap.mouseY);
}
//
public function SetPressFlag(in_Flag:Boolean):void{
m_PressFlag = in_Flag;
}
}
class ButtonManager
{
//==Var==
public var m_Button:Vector.<Button> = new Vector.<Button>();
public var m_TouchIndex:int = -1;
//==Function==
//Register
public function AddButton(in_Button:Button):void{
m_Button.push(in_Button);
}
//Update
public function Update(in_DeltaTime:Number):void{
var num:int = m_Button.length;
for(var i:int = 0; i < num; ++i){
var button:Button = m_Button[i];
button.Update(in_DeltaTime);
}
}
//Touch
public function OnMouseDown():void{
m_TouchIndex = -1;
var num:int = m_Button.length;
for(var i:int = 0; i < num; ++i){
var button:Button = m_Button[i];
var parent:DisplayObjectContainer = button.parent;
if(IsRangeIn(button)){
m_TouchIndex = i;
button.SetPressFlag(true);
break;
}
}
}
public function OnMouseMove():void{
if(0 <= m_TouchIndex){
var button:Button = m_Button[m_TouchIndex];
if(! button.IsRectIn()){
button.SetPressFlag(false);
m_TouchIndex = -1;
}
}
}
public function OnMouseUp():int{
var touch_index:int = m_TouchIndex;
if(0 <= m_TouchIndex){
var button:Button = m_Button[m_TouchIndex];
button.SetPressFlag(false);
}
m_TouchIndex = -1;
return touch_index;
}
//Check Range
public function IsRangeIn(in_Button:Button):Boolean{
//そもそもボタンの範囲外なら反応しない
if(! in_Button.IsRectIn()){
return false;
}
//親のどこかのScrollRectの範囲外になってたら反応しない(スクロール対応)
for(var content:DisplayObjectContainer = in_Button.parent; content != null; content = content.parent){
if(content.scrollRect == null){
continue;
}
if(! content.scrollRect.contains(content.mouseX / content.scaleX, content.mouseY / content.scaleY)){
return false;
}
}
return true;
}
//Cancel
//- 主にボタンを押しながらのスライド用
public function Cancel():void{
if(0 <= m_TouchIndex){
var button:Button = m_Button[m_TouchIndex];
button.SetPressFlag(false);
}
m_TouchIndex = -1;
}
}
//#Image
class ImageManager
{
//==BG==
//#Graphic
static public var m_GraphicIndexIter:int = 0;
static public const GRAPHIC_INDEX_BG:int = m_GraphicIndexIter++;
static public const GRAPHIC_INDEX_WALL:int = m_GraphicIndexIter++;
static public const GRAPHIC_INDEX_WALL_X:int = m_GraphicIndexIter++;
static public const GRAPHIC_INDEX_WALL_Y:int = m_GraphicIndexIter++;
static public const GRAPHIC_INDEX_WALL_XorY:int = m_GraphicIndexIter++;
static public const GRAPHIC_INDEX_WALL_XandY:int = m_GraphicIndexIter++;
static public const GRAPHIC_INDEX_NEEDLE:int = m_GraphicIndexIter++;
static public const GRAPHIC_INDEX_NEEDLE_X:int = m_GraphicIndexIter++;
static public const GRAPHIC_INDEX_NEEDLE_Y:int = m_GraphicIndexIter++;
static public const GRAPHIC_INDEX_NEEDLE_XY:int = m_GraphicIndexIter++;
static public const GRAPHIC_INDEX_NUM:int = m_GraphicIndexIter;
//#Path
static public var m_PathIndexIter:int = 0;
static public const PATH_INDEX_NONE:int = m_PathIndexIter++;
static public const PATH_INDEX_WALL_X:int = m_PathIndexIter++;
static public const PATH_INDEX_WALL_Y:int = m_PathIndexIter++;
static public const PATH_INDEX_WALL_XorY:int = m_PathIndexIter++;
static public const PATH_INDEX_WALL_XandY:int = m_PathIndexIter++;
static public const PATH_INDEX_DAMAGE_X:int = m_PathIndexIter++;
static public const PATH_INDEX_DAMAGE_Y:int = m_PathIndexIter++;
static public const PATH_INDEX_DAMAGE_XorY:int = m_PathIndexIter++;
static public const PATH_INDEX_DAMAGE_XandY:int = m_PathIndexIter++;
static public const PATH_INDEX_WALL_X_DAMAGE_Y:int = m_PathIndexIter++;
static public const PATH_INDEX_WALL_Y_DAMAGE_X:int = m_PathIndexIter++;
static public const PATH_INDEX_NUM:int = m_PathIndexIter;
//#Offset:地形からどれだけ浮かせるか
static public const PATH_OFFSET:int = 12;
//#enum:Quater
static public const LU:int = 0;
static public const RU:int = 1;
static public const LD:int = 2;
static public const RD:int = 3;
//#enum:Pos
static public const POS_X:int = 0;
static public const POS_Y:int = 1;
//#Graphic
static public var m_BitmapData_Ori:BitmapData;
static public var m_BitmapData_Path:BitmapData;
//#Mapping
static public var GRAPHIC_INDEX_TO_POS:Array;
static public var PATH_INDEX_TO_POS:Array;
//#Palette
static public var m_Palette_ForView:Array;
static public var m_Palette_ForPath:Array;
//==Button==
//
static public var m_BitmapData_Pause:BitmapData;
//==Player==
//#Bitmap
static public var m_PlayerBitmap:Array = new Array(3);
//==Goal==
//
static public var m_BirmapData_Goal:BitmapData;
//==Utility==
static public const POS_ZERO:Point = new Point(0,0);
//#Init
static public function Init(in_Graphic:DisplayObject):void{
var x:int, y:int, i:int;
//m_BitmapData_Ori
{
m_BitmapData_Ori = new BitmapData(512, 512, true, 0x00000000);
m_BitmapData_Ori.draw(in_Graphic);
}
//m_BitmapData_Path
{
var rect:Rectangle = new Rectangle(0,0,1,1);
m_BitmapData_Path = new BitmapData(256, 256, false, 0x000000);
//U
rect.x = PATH_OFFSET; rect.y = PATH_OFFSET; rect.width = 3*16-2*PATH_OFFSET; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_U);
//D
rect.x = PATH_OFFSET; rect.y = 3*16-1-PATH_OFFSET; rect.width = 3*16-2*PATH_OFFSET; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_D);
//L
rect.x = PATH_OFFSET; rect.y = PATH_OFFSET; rect.width = 1; rect.height = 3*16-2*PATH_OFFSET;
m_BitmapData_Path.fillRect(rect, Player.PATH_L);
//R
rect.x = 3*16-1-PATH_OFFSET; rect.y = PATH_OFFSET; rect.width = 1; rect.height = 3*16-2*PATH_OFFSET;
m_BitmapData_Path.fillRect(rect, Player.PATH_R);
//UorL
m_BitmapData_Path.setPixel(PATH_OFFSET, PATH_OFFSET, Player.PATH_UorL);
//UorR
m_BitmapData_Path.setPixel(3*16-1-PATH_OFFSET, PATH_OFFSET, Player.PATH_UorR);
//DorL
m_BitmapData_Path.setPixel(PATH_OFFSET, 3*16-1-PATH_OFFSET, Player.PATH_DorL);
//DorR
m_BitmapData_Path.setPixel(3*16-1-PATH_OFFSET, 3*16-1-PATH_OFFSET, Player.PATH_DorR);
//UandL
rect.x = 3*16; rect.y = PATH_OFFSET; rect.width = PATH_OFFSET+1; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_U);
rect.x = 3*16+PATH_OFFSET; rect.y = 0; rect.width = 1; rect.height = PATH_OFFSET+1;
m_BitmapData_Path.fillRect(rect, Player.PATH_L);
m_BitmapData_Path.setPixel(3*16+PATH_OFFSET, PATH_OFFSET, Player.PATH_UandL);
//UandR
rect.x = 5*16-1-PATH_OFFSET; rect.y = PATH_OFFSET; rect.width = PATH_OFFSET+1; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_U);
rect.x = 5*16-1-PATH_OFFSET; rect.y = 0; rect.width = 1; rect.height = PATH_OFFSET+1;
m_BitmapData_Path.fillRect(rect, Player.PATH_R);
m_BitmapData_Path.setPixel(5*16-1-PATH_OFFSET, PATH_OFFSET, Player.PATH_UandR);
//DandL
rect.x = 3*16; rect.y = 2*16-1-PATH_OFFSET; rect.width = PATH_OFFSET+1; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_D);
rect.x = 3*16+PATH_OFFSET; rect.y = 2*16-1-PATH_OFFSET; rect.width = 1; rect.height = PATH_OFFSET+1;
m_BitmapData_Path.fillRect(rect, Player.PATH_L);
m_BitmapData_Path.setPixel(3*16+PATH_OFFSET, 2*16-1-PATH_OFFSET, Player.PATH_DandL);
//DandR
rect.x = 5*16-1-PATH_OFFSET; rect.y = 2*16-1-PATH_OFFSET; rect.width = PATH_OFFSET+1; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_D);
rect.x = 5*16-1-PATH_OFFSET; rect.y = 2*16-1-PATH_OFFSET; rect.width = 1; rect.height = PATH_OFFSET+1;
m_BitmapData_Path.fillRect(rect, Player.PATH_R);
m_BitmapData_Path.setPixel(5*16-1-PATH_OFFSET, 2*16-1-PATH_OFFSET, Player.PATH_DandR);
//Damage:U
rect.x = PATH_OFFSET; rect.y = 3*16+PATH_OFFSET; rect.width = 3*16-2*PATH_OFFSET; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
//Damage:D
rect.x = PATH_OFFSET; rect.y = 6*16-1-PATH_OFFSET; rect.width = 3*16-2*PATH_OFFSET; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
//Damage:L
rect.x = PATH_OFFSET; rect.y = 3*16+PATH_OFFSET; rect.width = 1; rect.height = 3*16-2*PATH_OFFSET;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
//Damage:R
rect.x = 3*16-1-PATH_OFFSET; rect.y = 3*16+PATH_OFFSET; rect.width = 1; rect.height = 3*16-2*PATH_OFFSET;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
//Damage:UandL
rect.x = 3*16; rect.y = 3*16+PATH_OFFSET; rect.width = PATH_OFFSET+1; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
rect.x = 3*16+PATH_OFFSET; rect.y = 3*16; rect.width = 1; rect.height = PATH_OFFSET+1;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
m_BitmapData_Path.setPixel(3*16+PATH_OFFSET, PATH_OFFSET, Player.PATH_UandL);
//Damage:UandR
rect.x = 5*16-1-PATH_OFFSET; rect.y = 3*16+PATH_OFFSET; rect.width = PATH_OFFSET+1; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
rect.x = 5*16-1-PATH_OFFSET; rect.y = 3*16; rect.width = 1; rect.height = PATH_OFFSET+1;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
m_BitmapData_Path.setPixel(5*16-1-PATH_OFFSET, PATH_OFFSET, Player.PATH_UandR);
//Damage:DandL
rect.x = 3*16; rect.y = 5*16-1-PATH_OFFSET; rect.width = PATH_OFFSET+1; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
rect.x = 3*16+PATH_OFFSET; rect.y = 5*16-1-PATH_OFFSET; rect.width = 1; rect.height = PATH_OFFSET+1;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
m_BitmapData_Path.setPixel(3*16+PATH_OFFSET, 2*16-1-PATH_OFFSET, Player.PATH_DandL);
//Damage:DandR
rect.x = 5*16-1-PATH_OFFSET; rect.y = 5*16-1-PATH_OFFSET; rect.width = PATH_OFFSET+1; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
rect.x = 5*16-1-PATH_OFFSET; rect.y = 5*16-1-PATH_OFFSET; rect.width = 1; rect.height = PATH_OFFSET+1;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
m_BitmapData_Path.setPixel(5*16-1-PATH_OFFSET, 2*16-1-PATH_OFFSET, Player.PATH_DandR);
//Damage+Wall
rect.x = 5*16+PATH_OFFSET; rect.y = 0*16+PATH_OFFSET; rect.width = 1; rect.height = 2*16-2*PATH_OFFSET;
m_BitmapData_Path.fillRect(rect, Player.PATH_L);
rect.x = 7*16-1-PATH_OFFSET; rect.y = 0*16+PATH_OFFSET; rect.width = 1; rect.height = 2*16-2*PATH_OFFSET;
m_BitmapData_Path.fillRect(rect, Player.PATH_R);
rect.x = 5*16+PATH_OFFSET; rect.y = 2*16+PATH_OFFSET; rect.width = 2*16-2*PATH_OFFSET; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_U);
rect.x = 5*16+PATH_OFFSET; rect.y = 4*16-1-PATH_OFFSET; rect.width = 2*16-2*PATH_OFFSET; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_D);
rect.x = 5*16+PATH_OFFSET; rect.y = 0*16+PATH_OFFSET; rect.width = 2*16-2*PATH_OFFSET; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
rect.x = 5*16+PATH_OFFSET; rect.y = 2*16-1-PATH_OFFSET; rect.width = 2*16-2*PATH_OFFSET; rect.height = 1;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
rect.x = 5*16+PATH_OFFSET; rect.y = 2*16+PATH_OFFSET; rect.width = 1; rect.height = 2*16-2*PATH_OFFSET;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
rect.x = 7*16-1-PATH_OFFSET; rect.y = 2*16+PATH_OFFSET; rect.width = 1; rect.height = 2*16-2*PATH_OFFSET;
m_BitmapData_Path.fillRect(rect, Player.PATH_DAMAGE);
}
//GRAPHIC_INDEX_TO_POS
{//GRAPHIC_INDEX_~から画像の位置へのマッピング(さらにどの隅での処理かも含む)(そして左から何マス目、上から何マス目、という指定)
GRAPHIC_INDEX_TO_POS = new Array(GRAPHIC_INDEX_NUM);
//[LU][RU][LD][RD]
GRAPHIC_INDEX_TO_POS[GRAPHIC_INDEX_BG] = [[3,2], [3,2], [3,2], [3,2]];
GRAPHIC_INDEX_TO_POS[GRAPHIC_INDEX_WALL] = [[1,1], [1,1], [1,1], [1,1]];
GRAPHIC_INDEX_TO_POS[GRAPHIC_INDEX_WALL_X] = [[0,1], [2,1], [0,1], [2,1]];
GRAPHIC_INDEX_TO_POS[GRAPHIC_INDEX_WALL_Y] = [[1,0], [1,0], [1,2], [1,2]];
GRAPHIC_INDEX_TO_POS[GRAPHIC_INDEX_WALL_XorY] = [[0,0], [2,0], [0,2], [2,2]];
GRAPHIC_INDEX_TO_POS[GRAPHIC_INDEX_WALL_XandY] = [[3,0], [4,0], [3,1], [4,1]];
GRAPHIC_INDEX_TO_POS[GRAPHIC_INDEX_NEEDLE] = [[3,3], [4,3], [3,4], [4,4]];
GRAPHIC_INDEX_TO_POS[GRAPHIC_INDEX_NEEDLE_X] = [[0,4], [2,4], [0,4], [2,4]];
GRAPHIC_INDEX_TO_POS[GRAPHIC_INDEX_NEEDLE_Y] = [[1,3], [1,3], [1,5], [1,5]];
GRAPHIC_INDEX_TO_POS[GRAPHIC_INDEX_NEEDLE_XY] = [[0,3], [2,3], [0,5], [2,5]];
}
//PATH_INDEX_TO_POS
{//PATH_INDEX_~からパス用画像の位置へのマッピング
PATH_INDEX_TO_POS = new Array(PATH_INDEX_NUM);
//[LU][RU][LD][RD]
PATH_INDEX_TO_POS[PATH_INDEX_NONE] = [[1,1], [1,1], [1,1], [1,1]];
PATH_INDEX_TO_POS[PATH_INDEX_WALL_X] = [[0,1], [2,1], [0,1], [2,1]];
PATH_INDEX_TO_POS[PATH_INDEX_WALL_Y] = [[1,0], [1,0], [1,2], [1,2]];
PATH_INDEX_TO_POS[PATH_INDEX_WALL_XorY] = [[0,0], [2,0], [0,2], [2,2]];
PATH_INDEX_TO_POS[PATH_INDEX_WALL_XandY] = [[3,0], [4,0], [3,1], [4,1]];
PATH_INDEX_TO_POS[PATH_INDEX_DAMAGE_X] = [[0,4], [2,4], [0,4], [2,4]];
PATH_INDEX_TO_POS[PATH_INDEX_DAMAGE_Y] = [[1,3], [1,3], [1,5], [1,5]];
PATH_INDEX_TO_POS[PATH_INDEX_DAMAGE_XorY] = [[0,3], [2,3], [0,5], [2,5]];
PATH_INDEX_TO_POS[PATH_INDEX_DAMAGE_XandY] = [[3,3], [4,3], [3,4], [4,4]];
PATH_INDEX_TO_POS[PATH_INDEX_WALL_X_DAMAGE_Y] = [[5,0], [6,0], [5,1], [6,1]];
PATH_INDEX_TO_POS[PATH_INDEX_WALL_Y_DAMAGE_X] = [[5,2], [6,2], [5,3], [6,3]];
}
//m_Palette_ForView
{
m_Palette_ForView = new Array(256);
var index_graphic:int = GRAPHIC_INDEX_BG;
for(i = 0; i < 256; i++){
//区切りごとにindexを変更。次の区切りまではその値をセット
switch(i){
case 0:
case 6:
case 18:
case 24:
index_graphic = GRAPHIC_INDEX_BG; break;
case 3:
case 21:
index_graphic = GRAPHIC_INDEX_NEEDLE_Y; break;
case 9:
case 15:
index_graphic = GRAPHIC_INDEX_NEEDLE_X; break;
case 12:
index_graphic = GRAPHIC_INDEX_NEEDLE_XY; break;
case 27:
index_graphic = GRAPHIC_INDEX_NEEDLE; break;
case 54:
case 63:
index_graphic = GRAPHIC_INDEX_WALL_XorY; break;
case 60:
case 69:
index_graphic = GRAPHIC_INDEX_WALL_X; break;
case 72:
index_graphic = GRAPHIC_INDEX_WALL_Y; break;
case 78:
index_graphic = GRAPHIC_INDEX_WALL_XandY; break;
case 80:
index_graphic = GRAPHIC_INDEX_WALL; break;
}
m_Palette_ForView[i] = index_graphic;
}
}
//m_Palette_ForPath
{
m_Palette_ForPath = new Array(256);
var index_path:int = GRAPHIC_INDEX_BG;
for(i = 0; i < 256; i++){
//区切りごとにindexを変更。次の区切りまではその値をセット
switch(i){
case 0:
case 27:
index_path = PATH_INDEX_NONE; break;
case 2:
index_path = PATH_INDEX_WALL_XandY; break;
case 6:
index_path = PATH_INDEX_WALL_Y; break;
case 18:
index_path = PATH_INDEX_WALL_X; break;
case 24:
index_path = PATH_INDEX_WALL_XorY; break;
case 3:
index_path = PATH_INDEX_DAMAGE_Y; break;
case 21:
index_path = PATH_INDEX_WALL_X_DAMAGE_Y; break;
case 9:
index_path = PATH_INDEX_DAMAGE_X; break;
case 15:
index_path = PATH_INDEX_WALL_Y_DAMAGE_X; break;
case 12:
index_path = PATH_INDEX_DAMAGE_XorY; break;
case 1:
index_path = PATH_INDEX_DAMAGE_XandY; break;
}
m_Palette_ForPath[i] = index_path;
}
}
//m_PlayerBitmap
{
var mtx:Matrix = new Matrix();
//var rect:Rectangle = new Rectangle(0,0, 32,32);
rect.width = rect.height = 32;
for(i = 0; i < 3; i++){
//Init
m_PlayerBitmap[i] = new Bitmap(new BitmapData(24, 32, true, 0x00000000));
//Pos
m_PlayerBitmap[i].x = -24/2;
m_PlayerBitmap[i].y = -29 + PATH_OFFSET;
//Draw Graphic
mtx.tx = -i*24;
mtx.ty = -6*16;
m_PlayerBitmap[i].bitmapData.draw(m_BitmapData_Ori, mtx);
//Set Alpha
// rect.x = i*24;
// rect.y = 8*16;
// m_PlayerBitmap[i].bitmapData.copyChannel(m_BitmapData_Ori, rect, POS_ZERO, BitmapDataChannel.RED, BitmapDataChannel.ALPHA);
}
}
//m_BitmapData_Pause
{
m_BitmapData_Pause = new BitmapData(64, 64, true, 0x00000000);
mtx.tx = -16*5 - 64*3;
mtx.ty = 0;
m_BitmapData_Pause.draw(m_BitmapData_Ori, mtx);
}
//m_BirmapData_Goal
{
m_BirmapData_Goal = new BitmapData(24, 32, true, 0x00000000);
mtx.tx = 0;
mtx.ty = -128;
m_BirmapData_Goal.draw(m_BitmapData_Ori, mtx);
}
}
//#Draw : BG
static public function DrawBG(in_Map:Array, out_BitmapData_View:BitmapData, out_BitmapData_Path:BitmapData):void
{
var x:int, y:int, i:int;
var mtx:Matrix = new Matrix();
var NumX:int = in_Map[0].length;
var NumY:int = in_Map.length;
//Clear
{
out_BitmapData_View.fillRect(out_BitmapData_View.rect, 0x00000000);
out_BitmapData_Path.fillRect(out_BitmapData_Path.rect, 0x00000000);
}
//Map => Bitmap_Base
//Mapの要素を元に、「0:空白」「1:トゲ」「2:壁」というBitmapを生成
var BitmapData_Base:BitmapData;
{
BitmapData_Base = new BitmapData(NumX, NumY, false, 0x000000);
for(y = 0; y < NumY; y++){
for(x = 0; x < NumX; x++){
var index:int = 0;//default(O, P, G)
{
switch(in_Map[y][x]){
case GameMainWonderfl.W:
index = 2;
break;
case GameMainWonderfl.X:
index = 1;
break;
}
}
BitmapData_Base.setPixel(x, y, index);
}
}
}
//Bitmap_Base => Bitmap_LU,Bitmap_RU,Bitmap_LD,Bitmap_RD
//Bitmap_Baseを元に、四隅の隣接状況をそれぞれ求める(Uniqueな値になるようにする)
var BitmapData_Quater:Array = new Array(4);
{
//Create Filter
const filter:Array = [
new ConvolutionFilter(3,3,
[//LU
1, 3, 0,
9, 27, 0,
0, 0, 0,
]
),
new ConvolutionFilter(3,3,
[//RU
0, 3, 1,
0, 27, 9,
0, 0, 0,
]
),
new ConvolutionFilter(3,3,
[//LD
0, 0, 0,
9, 27, 0,
1, 3, 0,
]
),
new ConvolutionFilter(3,3,
[//RD
0, 0, 0,
0, 27, 9,
0, 3, 1,
]
),
];
for(i = 0; i < 4; i++){
//Init
BitmapData_Quater[i] = new BitmapData(NumX, NumY, false, 0x000000);
//Apply Filter
BitmapData_Quater[i].applyFilter(BitmapData_Base, BitmapData_Base.rect, POS_ZERO, filter[i]);
}
}
//Bitmap_LU,Bitmap_RU,Bitmap_LD,Bitmap_RD => ForView & ForPath
//Uniqueな値から、対応するIndexへと変換する
var BitmapData_ForView:Array = new Array(4);
var BitmapData_ForPath:Array = new Array(4);
{
for(i = 0; i < 4; i++){
//Init
BitmapData_ForView[i] = new BitmapData(NumX, NumY, false, 0x000000);
BitmapData_ForPath[i] = new BitmapData(NumX, NumY, false, 0x000000);
//Apply Palette
BitmapData_ForView[i].paletteMap(BitmapData_Quater[i], BitmapData_Quater[i].rect, POS_ZERO, null, null, m_Palette_ForView);
BitmapData_ForPath[i].paletteMap(BitmapData_Quater[i], BitmapData_Quater[i].rect, POS_ZERO, null, null, m_Palette_ForPath);
}
}
//Draw
//上で求めたIndexに基づき描画
{
var rect:Rectangle = new Rectangle(0,0, 16,16);
for(y = 0; y < NumY; y++){
for(x = 0; x < NumX; x++){
for(i = 0; i < 4; i++){
rect.x = x * 32 + 16 * ((i&1)>>0);
rect.y = y * 32 + 16 * ((i&2)>>1);
//#view
mtx.tx = rect.x - 16 * GRAPHIC_INDEX_TO_POS[BitmapData_ForView[i].getPixel(x, y)][i][POS_X];
mtx.ty = rect.y - 16 * GRAPHIC_INDEX_TO_POS[BitmapData_ForView[i].getPixel(x, y)][i][POS_Y];
out_BitmapData_View.draw(m_BitmapData_Ori, mtx, null, null, rect);
//#Path
mtx.tx = rect.x - 16 * PATH_INDEX_TO_POS[BitmapData_ForPath[i].getPixel(x, y)][i][POS_X];
mtx.ty = rect.y - 16 * PATH_INDEX_TO_POS[BitmapData_ForPath[i].getPixel(x, y)][i][POS_Y];
out_BitmapData_Path.draw(m_BitmapData_Path, mtx, null, null, rect);
}
}
}
}
}
//Image : Button : Pause
static public function GetButtonBitmapData():BitmapData{
return m_BitmapData_Pause;
}
//Image : Player
static public function GetPlayerGraphic(in_Index:int):Bitmap{
const Index2Index:Array = [0, 1, 2, 1];
return m_PlayerBitmap[Index2Index[in_Index]];
}
//Image : Goal
static public function CreateGoalGraphic():Bitmap{
var result:Bitmap = new Bitmap(m_BirmapData_Goal);
result.x = -m_BirmapData_Goal.width/2;
result.y = -m_BirmapData_Goal.height/2;
result.blendMode = BlendMode.ADD;
return result;
}
}
//#Player
class Player extends Sprite
{
//==Const==
//パス
static public var PathIter:int = 0;
static public const PATH_NONE:int = PathIter++;
static public const PATH_U:int = PathIter++;
static public const PATH_D:int = PathIter++;
static public const PATH_L:int = PathIter++;
static public const PATH_R:int = PathIter++;
static public const PATH_UorL:int = PathIter++;
static public const PATH_UorR:int = PathIter++;
static public const PATH_DorL:int = PathIter++;
static public const PATH_DorR:int = PathIter++;
static public const PATH_UandL:int = PathIter++;
static public const PATH_UandR:int = PathIter++;
static public const PATH_DandL:int = PathIter++;
static public const PATH_DandR:int = PathIter++;
static public const PATH_DAMAGE:int = PathIter++;
static public const PATH_NUM:int = PathIter;
//軸
static public const AXIS_X:int = 0;
static public const AXIS_Y:int = 1;
static public const AXIS_NUM:int = 2;
//方向
static public const DIR_U:int = 0;
static public const DIR_D:int = 1;
static public const DIR_L:int = 2;
static public const DIR_R:int = 3;
static public const DIR_NUM:int = 4;
//移動力
static public const MOVE_POW:Number = 150.0;
//地上での減速率
static public const BREAK_RATIO:Number = 0.98;
//ジャンプ速度
static public const JUMP_VEL:Number = 120.0;
//重力
static public const GRAVITY:Number = 150.0;
//入力
static public var InputIter:int = 0;
static public const INPUT_U:int = InputIter++;
static public const INPUT_D:int = InputIter++;
static public const INPUT_L:int = InputIter++;
static public const INPUT_R:int = InputIter++;
static public const INPUT_JUMP:int = InputIter++;
static public const INPUT_RESET:int = InputIter++;
static public const INPUT_NUM:int = InputIter;
//アニメーション
static public const ANIM_NUM:int = 4;
//移動
static public const MOVE_NONE:uint = 0x11;
static public const MOVE_U:uint = 0x11 - 0x10;
static public const MOVE_D:uint = 0x11 + 0x10;
static public const MOVE_L:uint = 0x11 - 0x01;
static public const MOVE_R:uint = 0x11 + 0x01;
static public const MOVE_UL:uint = 0x11 - 0x10 - 0x01;
static public const MOVE_UR:uint = 0x11 - 0x10 + 0x01;
static public const MOVE_DL:uint = 0x11 + 0x10 - 0x01;
static public const MOVE_DR:uint = 0x11 + 0x10 + 0x01;
//パスによる移動方向の変化(初期化時に作成)
static public var PALETTE_MOVE:Array = new Array(PATH_NUM);//[PATH_NUM][MOVE_XX] = MOVE_YY
//Utility
static public const POS_ZERO:Point = new Point(0,0);
//==Var==
//スタート位置(初期化、リセット用)
public var m_StartPosX:int = 0;
public var m_StartPosY:int = 0;
//現在位置(小数点まで保持版)(でもなんか普通のxでも上手くいってる気がする)
public var m_PosX:Number = 0;
public var m_PosY:Number = 0;
//現在速度
public var m_VelX:Number = 0;
public var m_VelY:Number = 0;
//現在加速度
public var m_AccX:Number = 0;
public var m_AccY:Number = 0;
//現在のパス
public var m_PathIndex:int = PATH_NONE;
//地面に居るか
public var m_OnGround:Boolean = false;//最初は空中からスタートすると仮定
//現在の姿勢(足→頭の方向)
public var m_HeadDir:int = DIR_U;
//入力
public var m_Input:Array = new Array(INPUT_NUM);
public var m_Input_Old:Array = new Array(INPUT_NUM);
public var m_Input_Edge:Array = new Array(INPUT_NUM);
//現在表示中の画像のIndex
public var m_AnimIndex:Number = 0;
//表示に使う画像
public var m_Graphic:Array;
//死んでいるか
public var m_IsDead:Boolean = false;
//移動処理用のもろもろ
public var m_MoveList:BitmapData = new BitmapData(256, 1, false, MOVE_NONE);//1ドットずつ移動する処理の配列相当(移動方向の変換処理のためBitmapDataで)
public var m_Util:BitmapData = new BitmapData(16, 1, false, MOVE_NONE);//汎用
//==Function==
//Init
public function Player(){
//Param
{
InitPaletteForMove();
}
//Init Later
addEventListener(
Event.ADDED_TO_STAGE,//stageに触れるようになるまで遅延
Init
);
}
//Init
public function Init(e:Event=null):void{
//Init Once Only
{
removeEventListener(Event.ADDED_TO_STAGE, Init);
}
//Input
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, SetKeyFlag(true));
stage.addEventListener(KeyboardEvent.KEY_UP, SetKeyFlag(false));
// stage.addEventListener(MouseEvent.MOUSE_DOWN, OnMouseDown);
// stage.addEventListener(MouseEvent.MOUSE_UP, OnMouseUp);
}
//Graphic
{
m_Graphic = new Array(ANIM_NUM);
for(var i:int = 0; i < ANIM_NUM; i++){
m_Graphic[i] = ImageManager.GetPlayerGraphic(i);
}
addChild(m_Graphic[0]);
}
//Update
// {//→本体で一括処理する
// addEventListener(Event.ENTER_FRAME, Update);
// }
//残りはResetと同じ処理
{
Reset(this.x, this.y);
}
}
//Init : Palette
public function InitPaletteForMove():void{
//PALETTE_MOVEの初期化
//現在のパス位置に応じて移動方向を変えるパレットを準備
//要素を変えないパレットの生成
const createBasePalette:Function = function():Array{
var arr:Array = new Array(256);
for(var i:int = 0; i < 256; i++){
arr[i] = i;
}
return arr;
};
//PATH_NONE:空中:移動を変更する必要がないのでそのままで
PALETTE_MOVE[PATH_NONE] = createBasePalette();
//PATH_U:天井走り中:上下方向の移動は無効化
PALETTE_MOVE[PATH_U] = createBasePalette();
PALETTE_MOVE[PATH_U][MOVE_U] = MOVE_NONE;
PALETTE_MOVE[PATH_U][MOVE_D] = MOVE_NONE;
PALETTE_MOVE[PATH_U][MOVE_UL] = MOVE_L;
PALETTE_MOVE[PATH_U][MOVE_UR] = MOVE_R;
PALETTE_MOVE[PATH_U][MOVE_DL] = MOVE_L;
PALETTE_MOVE[PATH_U][MOVE_DR] = MOVE_R;
//PATH_D:地面走り中:PATH_Uと同じなので、同じものを参照する
PALETTE_MOVE[PATH_D] = PALETTE_MOVE[PATH_U];
//PATH_L:壁走り中(壁が左にある):左右方向の移動は無効化
PALETTE_MOVE[PATH_L] = createBasePalette();
PALETTE_MOVE[PATH_L][MOVE_L] = MOVE_NONE;
PALETTE_MOVE[PATH_L][MOVE_R] = MOVE_NONE;
PALETTE_MOVE[PATH_L][MOVE_UL] = MOVE_U;
PALETTE_MOVE[PATH_L][MOVE_UR] = MOVE_U;
PALETTE_MOVE[PATH_L][MOVE_DL] = MOVE_D;
PALETTE_MOVE[PATH_L][MOVE_DR] = MOVE_D;
//PATH_R:壁走り中(壁が右にある):同じくPATH_Lを参照
PALETTE_MOVE[PATH_R] = PALETTE_MOVE[PATH_L];
//PATH_UorL:空間の左上隅:移動は右か下のみ
PALETTE_MOVE[PATH_UorL] = createBasePalette();
PALETTE_MOVE[PATH_UorL][MOVE_U] = MOVE_R;
PALETTE_MOVE[PATH_UorL][MOVE_D] = MOVE_D;
PALETTE_MOVE[PATH_UorL][MOVE_L] = MOVE_D;
PALETTE_MOVE[PATH_UorL][MOVE_R] = MOVE_R;
PALETTE_MOVE[PATH_UorL][MOVE_UL] = MOVE_NONE;
PALETTE_MOVE[PATH_UorL][MOVE_UR] = MOVE_R;
PALETTE_MOVE[PATH_UorL][MOVE_DL] = MOVE_D;
PALETTE_MOVE[PATH_UorL][MOVE_DR] = MOVE_NONE;
//PATH_UorR:空間の右上隅:移動は左か下のみ
PALETTE_MOVE[PATH_UorR] = createBasePalette();
PALETTE_MOVE[PATH_UorR][MOVE_U] = MOVE_L;
PALETTE_MOVE[PATH_UorR][MOVE_D] = MOVE_D;
PALETTE_MOVE[PATH_UorR][MOVE_L] = MOVE_L;
PALETTE_MOVE[PATH_UorR][MOVE_R] = MOVE_D;
PALETTE_MOVE[PATH_UorR][MOVE_UL] = MOVE_L;
PALETTE_MOVE[PATH_UorR][MOVE_UR] = MOVE_NONE;
PALETTE_MOVE[PATH_UorR][MOVE_DL] = MOVE_NONE;
PALETTE_MOVE[PATH_UorR][MOVE_DR] = MOVE_D;
//PATH_DorL:空間の左下隅:移動は右か上のみ
PALETTE_MOVE[PATH_DorL] = createBasePalette();
PALETTE_MOVE[PATH_DorL][MOVE_U] = MOVE_U;
PALETTE_MOVE[PATH_DorL][MOVE_D] = MOVE_R;
PALETTE_MOVE[PATH_DorL][MOVE_L] = MOVE_U;
PALETTE_MOVE[PATH_DorL][MOVE_R] = MOVE_R;
PALETTE_MOVE[PATH_DorL][MOVE_UL] = MOVE_U;
PALETTE_MOVE[PATH_DorL][MOVE_UR] = MOVE_NONE;
PALETTE_MOVE[PATH_DorL][MOVE_DL] = MOVE_NONE;
PALETTE_MOVE[PATH_DorL][MOVE_DR] = MOVE_R;
//PATH_DorR:空間の右下隅:移動は左か上のみ
PALETTE_MOVE[PATH_DorR] = createBasePalette();
PALETTE_MOVE[PATH_DorR][MOVE_U] = MOVE_U;
PALETTE_MOVE[PATH_DorR][MOVE_D] = MOVE_L;
PALETTE_MOVE[PATH_DorR][MOVE_L] = MOVE_L;
PALETTE_MOVE[PATH_DorR][MOVE_R] = MOVE_U;
PALETTE_MOVE[PATH_DorR][MOVE_UL] = MOVE_NONE;
PALETTE_MOVE[PATH_DorR][MOVE_UR] = MOVE_U;
PALETTE_MOVE[PATH_DorR][MOVE_DL] = MOVE_L;
PALETTE_MOVE[PATH_DorR][MOVE_DR] = MOVE_NONE;
//PATH_UandL:壁の右下隅:移動は左か上のみ→PATH_DorRと同じなので参照で済ませる
PALETTE_MOVE[PATH_UandL] = PALETTE_MOVE[PATH_DorR];
//PATH_UandR:壁の左下隅:PATH_DorLと同じ
PALETTE_MOVE[PATH_UandR] = PALETTE_MOVE[PATH_DorL];
//PATH_DandL:壁の右上隅:PATH_UorRと同じ
PALETTE_MOVE[PATH_DandL] = PALETTE_MOVE[PATH_UorR];
//PATH_DandR:壁の左上隅:PATH_UorLと同じ
PALETTE_MOVE[PATH_DandR] = PALETTE_MOVE[PATH_UorL];
//PATH_DAMAGE:ダメージエリア:変える必要もないのでNONEと同じで。
PALETTE_MOVE[PATH_DAMAGE] = PALETTE_MOVE[PATH_NONE];
}
//Reset
public function Reset(in_X:int, in_Y:int):void{
//Pos
{
this.x = m_PosX = m_StartPosX = in_X;
this.y = m_PosY = m_StartPosY = in_Y;
}
//Vel
{
m_VelX = 0;
m_VelY = 0;
}
//Acc
{
m_AccX = 0;
m_AccY = 0;
}
//現在のパス
{
//m_PathIndex = PATH_NONE;
m_PathIndex = GameMainWonderfl.Instance().GetPathIndex(this.x, this.y);
}
//地面に居るか
{
m_OnGround = false;//最初は空中からスタートすると仮定
}
//死んでいるか
{
m_IsDead = false;
}
//姿勢
{
this.rotation = 0;
this.scaleX = 1;
}
//Input
{
for(var i:int = 0; i < INPUT_NUM; i++){
m_Input[i] = m_Input_Old[i] = m_Input_Edge[i] = false;
}
}
//
{
m_HeadDir = DIR_U;
m_MoveList.fillRect(m_MoveList.rect, MOVE_NONE);
m_Util.fillRect(m_Util.rect, MOVE_NONE);
}
}
//Input
public function SetKeyFlag(in_Flag:Boolean):Function{
const KEY_R:int = 82;
return function(e:KeyboardEvent):void{
switch(e.keyCode){
case Keyboard.UP: m_Input[INPUT_U] = in_Flag; break;
case Keyboard.DOWN: m_Input[INPUT_D] = in_Flag; break;
case Keyboard.LEFT: m_Input[INPUT_L] = in_Flag; break;
case Keyboard.RIGHT: m_Input[INPUT_R] = in_Flag; break;
case Keyboard.SPACE: m_Input[INPUT_JUMP] = in_Flag; break;
case KEY_R: m_Input[INPUT_RESET] = in_Flag; break;
}
};
}
//Touch
public function OnMouseDown(e:MouseEvent):void{
m_Input[INPUT_JUMP] = true;
}
public function OnMouseUp(e:MouseEvent):void{
m_Input[INPUT_JUMP] = false;
}
//Update
public function Update(e:Event=null):void{
var DeltaTime:Number = 1/24.0;
//Input
{
Update_Input();
}
//Check Reset
{
if(m_Input_Edge[INPUT_RESET]){
//本当はリセットの入力管理は本体側に持たせるべきだが面倒なのでここで。
GameMainWonderfl.Instance().Reset(false);
return;
}
}
//死んでたら以降の処理はしない
{
/*
if(m_IsDead){
return;
}
/*/
//死亡フラグは不要かも
if(GameMainWonderfl.Instance().IsEnd()){
return;
}
//*/
}
//Move
{
Update_Move(DeltaTime);
}
//Anim
{
Update_Anim(DeltaTime);
}
}
//Update : Input
public function Update_Input():void{
//
for(var i:int = 0; i < INPUT_NUM; i++){
m_Input_Edge[i] = (m_Input[i] && !m_Input_Old[i]);
m_Input_Old[i] = m_Input[i];
}
}
//Update : Move
public function Update_Move(in_DeltaTime:Number):void{
var i:int, j:int;
//Acc
{
m_AccX = 0;
m_AccY = 0;
if(m_OnGround){
//着地中は入力を力として扱う
//まずは中央値で初期化
var Pow:uint = MOVE_NONE;
//入力に応じた方向に力を加える
if(m_Input_Edge[INPUT_JUMP]){
//ジャンプ
switch(m_HeadDir){
case DIR_U: m_VelY = -JUMP_VEL; break;
case DIR_D: m_VelY = JUMP_VEL; break;
case DIR_L: m_VelX = -JUMP_VEL; break;
case DIR_R: m_VelX = JUMP_VEL; break;
}
}else{
//壁に沿った入力移動
/*
if(m_Input[INPUT_L]){Pow -= 0x01;}
if(m_Input[INPUT_R]){Pow += 0x01;}
if(m_Input[INPUT_U]){Pow -= 0x10;}
if(m_Input[INPUT_D]){Pow += 0x10;}
/*/
switch(m_PathIndex){
case PATH_D: if(0 < this.scaleX){Pow += 0x01;}else{Pow -= 0x01;} break;
case PATH_L: if(0 < this.scaleX){Pow += 0x10;}else{Pow -= 0x10;} break;
case PATH_U: if(0 < this.scaleX){Pow -= 0x01;}else{Pow += 0x01;} break;
case PATH_R: if(0 < this.scaleX){Pow -= 0x10;}else{Pow += 0x10;} break;
}
//*/
//そして現在の位置に応じて力の方向を変更
m_Util.setPixel(0,0, Pow);
ConvertByPath(m_Util);//, 0, 1
m_AccX = ((m_Util.getPixel(0,0) & 0x0F) >> 0) - 1;
m_AccY = ((m_Util.getPixel(0,0) & 0xF0) >> 4) - 1;
m_AccX *= MOVE_POW;
m_AccY *= MOVE_POW;
//地上に入れば自然減速する
{
if(m_OnGround){
m_VelX *= BREAK_RATIO;//m_HeadDirに応じて変えるのも面倒なので両方やっちゃう
m_VelY *= BREAK_RATIO;
}
}
}
}else{
//空中ならば入力は受け付けず、重力しか働かない
m_AccY = GRAVITY;
}
}
//Vel
{
//Powに応じて加減速
{
m_VelX += m_AccX * in_DeltaTime;
m_VelY += m_AccY * in_DeltaTime;
}
}
//移動目標
var RelTrgX:int;
var RelTrgY:int;
{
m_PosX += m_VelX * in_DeltaTime;
m_PosY += m_VelY * in_DeltaTime;
RelTrgX = Math.round(m_PosX - this.x);
RelTrgY = Math.round(m_PosY - this.y);
}
//端数
var RestX:Number = (RelTrgX < 0)? RelTrgX - (m_PosX - this.x): (m_PosX - this.x) - RelTrgX;
var RestY:Number = (RelTrgY < 0)? RelTrgY - (m_PosY - this.y): (m_PosY - this.y) - RelTrgY;
//端数の反映方向
m_Util.setPixel(0,0, (RelTrgX < 0)? MOVE_L: MOVE_R);
m_Util.setPixel(1,0, (RelTrgY < 0)? MOVE_U: MOVE_D);
//速度
var AbsVelX:Number = Math.abs(m_VelX);
var AbsVelY:Number = Math.abs(m_VelY);
//速度の反映方向
m_Util.setPixel(2,0, (m_VelX < 0)? MOVE_L: MOVE_R);
m_Util.setPixel(3,0, (m_VelY < 0)? MOVE_U: MOVE_D);
//1ドットずつの動きを求める
var MoveNum:int;
{
//何ドット進むか
var NumX:int = Math.abs(RelTrgX);
var NumY:int = Math.abs(RelTrgY);
MoveNum = NumX + NumY;
//移動方向
var MoveX:uint = (RelTrgX < 0)? MOVE_L: MOVE_R;
var MoveY:uint = (RelTrgY < 0)? MOVE_U: MOVE_D;
//初期化
m_MoveList.fillRect(m_MoveList.rect, MOVE_NONE);//不要っちゃ不要
//移動列を詰め込む
//ちゃんとした直線にする意味も特にないので、「縦移動→横移動」みたいな感じで積む
//ジャンプ処理がやりやすいように、必ず初手で空宙に移動するようにする(そうでないとジャンプ方向の移動が打ち消される)
switch(m_HeadDir){
case DIR_U:
case DIR_D:
for(i = 0; i < NumY; i++){
m_MoveList.setPixel(i, 0, MoveY);
}
for(i = 0; i < NumX; i++){
m_MoveList.setPixel(NumY+i, 0, MoveX);
}
break;
case DIR_L:
case DIR_R:
for(i = 0; i < NumX; i++){
m_MoveList.setPixel(i, 0, MoveX);
}
for(i = 0; i < NumY; i++){
m_MoveList.setPixel(NumX+i, 0, MoveY);
}
break;
}
}
//指定された動きに合わせて1ドットずつ移動する
for(i = 0; i < MoveNum; i++){
//Move
{
var ValX:int = ((m_MoveList.getPixel(i,0) & 0x0F) >> 0) - 1;
var ValY:int = ((m_MoveList.getPixel(i,0) & 0xF0) >> 4) - 1;
this.x += ValX;
this.y += ValY;
}
//現在位置のパス取得
{
m_PathIndex = GameMainWonderfl.Instance().GetPathIndex(this.x, this.y);
}
//ダメージエリアに入ったならここで死んで終了
{
if(m_PathIndex == PATH_DAMAGE){
Dead_Damage();
return;
}
}
//現在位置に応じて以降の移動方向を変更(角での移動方向変更などの対応)
{
ConvertByPath(m_MoveList);//, i, MoveNum
ConvertByPath(m_Util);//, 0, 2
}
}
var XtoX:int, XtoY:int, YtoX:int, YtoY:int;
//端数の書き戻し
{
XtoX = ((m_Util.getPixel(0,0) & 0x0F) >> 0) - 1;
XtoY = ((m_Util.getPixel(0,0) & 0xF0) >> 4) - 1;
YtoX = ((m_Util.getPixel(1,0) & 0x0F) >> 0) - 1;
YtoY = ((m_Util.getPixel(1,0) & 0xF0) >> 4) - 1;
m_PosX = this.x + XtoX*RestX + YtoX*RestY;
m_PosY = this.y + XtoY*RestX + YtoY*RestY;
}
//速度をパスに応じて変更
{
XtoX = ((m_Util.getPixel(2,0) & 0x0F) >> 0) - 1;
XtoY = ((m_Util.getPixel(2,0) & 0xF0) >> 4) - 1;
YtoX = ((m_Util.getPixel(3,0) & 0x0F) >> 0) - 1;
YtoY = ((m_Util.getPixel(3,0) & 0xF0) >> 4) - 1;
m_VelX = XtoX*AbsVelX + YtoX*AbsVelY;
m_VelY = XtoY*AbsVelX + YtoY*AbsVelY;
}
//現在の位置に合わせて姿勢制御
{
//回転
switch(m_PathIndex){
case PATH_D: this.rotation = 0; m_HeadDir = DIR_U; break;
case PATH_L: this.rotation = 90; m_HeadDir = DIR_R; break;
case PATH_U: this.rotation = 180; m_HeadDir = DIR_D; break;
case PATH_R: this.rotation = 270; m_HeadDir = DIR_L; break;
//これ以外のパス上では姿勢は更新しない
}
//向き(スケールで実現)
switch(m_HeadDir){//基本は速度で判定。入力があればそちらを優先
case DIR_U:
if(m_VelX < 0){this.scaleX = -1;}
if(m_VelX > 0){this.scaleX = 1;}
// if(m_AccX < 0){this.scaleX = -1;}
// if(m_AccX > 0){this.scaleX = 1;}
break;
case DIR_D:
if(m_VelX < 0){this.scaleX = 1;}
if(m_VelX > 0){this.scaleX = -1;}
// if(m_AccX < 0){this.scaleX = 1;}
// if(m_AccX > 0){this.scaleX = -1;}
break;
case DIR_L:
if(m_VelY < 0){this.scaleX = 1;}
if(m_VelY > 0){this.scaleX = -1;}
// if(m_AccY < 0){this.scaleX = 1;}
// if(m_AccY > 0){this.scaleX = -1;}
break;
case DIR_R:
if(m_VelY < 0){this.scaleX = -1;}
if(m_VelY > 0){this.scaleX = 1;}
// if(m_AccY < 0){this.scaleX = -1;}
// if(m_AccY > 0){this.scaleX = 1;}
break;
}
}
//フラグ更新
{
//地上にいる=パスがある
m_OnGround = (m_PathIndex != PATH_NONE);
}
//落下死チェック
{
if(this.y > GameMainWonderfl.BitmapH+32){
Dead_Fall();
}
}
}
//Update : Anim
public function Update_Anim(in_DeltaTime:Number):void{
var AnimIndex_Old:int = m_AnimIndex;
//考慮する速度・加速度
var Vel:Number;
var Acc:Number;
{
switch(m_HeadDir){
case DIR_U:
case DIR_D:
Vel = Math.abs(m_VelX);
Acc = Math.abs(m_AccX);
break;
case DIR_L:
case DIR_R:
Vel = Math.abs(m_VelY);
Acc = Math.abs(m_AccY);
break;
}
}
//アニメーションの更新量
var DeltaAnim:Number;
{
//速度による更新量
const ANIM_CYCLE_PER_VEL:Number = 20;
var DeltaAnim_ByVel:Number = Vel / ANIM_CYCLE_PER_VEL * in_DeltaTime;
//加速度による更新量
const ANIM_CYCLE_PER_ACC:Number = 10;
var DeltaAnim_ByAcc:Number = Acc / ANIM_CYCLE_PER_VEL * in_DeltaTime;
//大きい方を採用
DeltaAnim = Math.max(DeltaAnim_ByVel, DeltaAnim_ByAcc);
}
//m_AnimIndexの更新
{
m_AnimIndex += DeltaAnim;
while(m_AnimIndex >= ANIM_NUM){m_AnimIndex -= ANIM_NUM;}
}
//新しいAnimIndexになったら表示画像を差し替える
var AnimIndex_New:int = m_AnimIndex;
if(AnimIndex_New != AnimIndex_Old){
//Delete Old
removeChild(m_Graphic[AnimIndex_Old]);
//Create New
addChild(m_Graphic[AnimIndex_New]);
}
}
//移動方向を今のパスに基づいて変更する
public function ConvertByPath(io_MoveList:BitmapData):void{
//for(i++ < 256){List[i] = PALETTE_MOVE[PALETTE_MOVE][List[i]];}
io_MoveList.paletteMap(io_MoveList, io_MoveList.rect, POS_ZERO, null, null, PALETTE_MOVE[m_PathIndex]);
}
//死亡する
public function Dead_Damage():void{
//Check
{
if(m_IsDead){
return;
}
}
//ゲームオーバー処理
{
GameMainWonderfl.Instance().OnDead_Damage();
}
//フラグ
{
m_IsDead = true;
}
}
public function Dead_Fall():void{
//Check
{
if(m_IsDead){
return;
}
}
//ゲームオーバー処理
{
GameMainWonderfl.Instance().OnDead_Fall();//こいつに引数を渡すようにして統合したい
}
//フラグ
{
m_IsDead = true;
}
}
}
//#Goal
class Goal extends Sprite
{
//==Constt==
static public const GOAL_RANGE:int = 9;
static public const ANIM_INTERVAL:Number = 0.5;
//==Var==
public var m_AlphaRatio:Number = 0;
//==Function==
//Init
public function Goal():void{
//Graphic
{
addChild(ImageManager.CreateGoalGraphic());
}
}
//Reset
public function Reset(in_X:int, in_Y:int):void{
//Pos
{
this.x = in_X;
this.y = in_Y;
}
}
//Update
public function Update():void{
//プレイヤーが一定範囲に来たらゴールとする
//そもそもすでにゴールしてたら何も処理しない
{
if(GameMainWonderfl.Instance().IsEnd()){
return;
}
}
//Alpha Anim
{
const ALPHA_MIN:Number = 0.5;
const ALPHA_MAX:Number = 1.0;
const DeltaTime:Number = 1/30;
m_AlphaRatio += DeltaTime / ANIM_INTERVAL;
if(1 <= m_AlphaRatio){
m_AlphaRatio -= 1;
}
this.alpha = Util.Lerp(ALPHA_MIN, ALPHA_MAX, 0.5 + 0.5*Math.cos(2*Math.PI * m_AlphaRatio));
}
//プレイヤーとの距離が一定以上離れていたら何も処理しない
{
var GapX:Number = GameMainWonderfl.Instance().m_Player.x - this.x;
var GapY:Number = GameMainWonderfl.Instance().m_Player.y - this.y;
var Distance:Number = Math.sqrt(GapX*GapX + GapY*GapY);
if(Distance > GOAL_RANGE){
return;
}
}
//上のチェックに全てクリアしたらゴールしたものとして処理する
{
GameMainWonderfl.Instance().OnGoal();
}
}
}
class NinePatch extends Sprite
{
//処理コストが高いので、Popupなどで使う場合は事前に生成しておいて使いまわすこと
//==Var==
//描画結果を使いまわす場合、このBitmapDataを使いまわす
public var m_BitmapData:BitmapData;
//==Function==
//Create
static public function Create(in_BMD:BitmapData, in_RadX:int, in_RadY:int, in_W:int, in_H:int, in_OriX:int = 0, in_OriY:int = 0, in_OriW:int = -1, in_OriH:int = -1):NinePatch{
var nine_patch:NinePatch = new NinePatch();
nine_patch.Init(in_BMD, in_RadX, in_RadY, in_W, in_H, in_OriX, in_OriY, in_OriW, in_OriH);
return nine_patch;
}
//Clone
static public function Clone(in_BMD:BitmapData):NinePatch{
var nine_patch:NinePatch = new NinePatch();
nine_patch.m_BitmapData = in_BMD;
nine_patch.addChild(new Bitmap(in_BMD));
return nine_patch;
}
//Init
public function Init(in_BMD:BitmapData, in_RadX:int, in_RadY:int, in_W:int, in_H:int, in_OriX:int, in_OriY:int, in_OriW:int, in_OriH:int):void{
var OriW:int = (in_OriW <= 0)? in_BMD.width: in_OriW;
var OriH:int = (in_OriH <= 0)? in_BMD.height: in_OriH;
var edge_w:int = OriW - in_RadX*2;
var edge_h:int = OriH - in_RadY*2;
//念のため補正
if(edge_w <= 0){edge_w = 1;}
if(edge_h <= 0){edge_h = 1;}
var bmd:BitmapData = new BitmapData(in_W, in_H, true, 0x00000000);
var src_rect:Rectangle = new Rectangle(0,0,1,1);
var dst_pos:Point = new Point(0,0);
var offset_x:int;
var offset_y:int;
//Corner
{
src_rect.width = in_RadX;
src_rect.height = in_RadY;
//- LU
src_rect.x = in_OriX;
src_rect.y = in_OriY;
dst_pos.x = 0;
dst_pos.y = 0;
bmd.copyPixels(in_BMD, src_rect, dst_pos);
//- RU
src_rect.x = in_OriX + OriW-in_RadX;
src_rect.y = in_OriY;
dst_pos.x = in_W-in_RadX;
dst_pos.y = 0;
bmd.copyPixels(in_BMD, src_rect, dst_pos);
//- LD
src_rect.x = in_OriX;
src_rect.y = in_OriY + OriH-in_RadY;
dst_pos.x = 0;
dst_pos.y = in_H-in_RadY;
bmd.copyPixels(in_BMD, src_rect, dst_pos);
//- RD
src_rect.x = in_OriX + OriW-in_RadX;
src_rect.y = in_OriY + OriH-in_RadY;
dst_pos.x = in_W-in_RadX;
dst_pos.y = in_H-in_RadY;
bmd.copyPixels(in_BMD, src_rect, dst_pos);
}
//Edge
{
//UD
src_rect.x = in_OriX + in_RadX;
src_rect.width = edge_w;
src_rect.height = in_RadY;
for(offset_x = in_RadX; offset_x < in_W - in_RadX; offset_x += edge_w){
dst_pos.x = offset_x;
if(in_W - in_RadX < offset_x + edge_w){
src_rect.width = (in_W - in_RadX) - offset_x;
}
//U
src_rect.y = in_OriY;
dst_pos.y = 0;
bmd.copyPixels(in_BMD, src_rect, dst_pos);
//D
src_rect.y = in_OriY + OriH-in_RadY;
dst_pos.y = in_H-in_RadY;
bmd.copyPixels(in_BMD, src_rect, dst_pos);
}
//LR
src_rect.y = in_OriY + in_RadY;
src_rect.width = in_RadX;
src_rect.height = edge_h;
for(offset_y = in_RadY; offset_y < in_H - in_RadY; offset_y += edge_h){
dst_pos.y = offset_y;
if(in_H - in_RadY < offset_y + edge_h){
src_rect.height = (in_H - in_RadY) - offset_y;
}
//L
src_rect.x = in_OriX;
dst_pos.x = 0;
bmd.copyPixels(in_BMD, src_rect, dst_pos);
//R
src_rect.x = in_OriX + OriW-in_RadX;
dst_pos.x = in_W-in_RadX;
bmd.copyPixels(in_BMD, src_rect, dst_pos);
}
}
//Center
{
src_rect.x = in_OriX + in_RadX;
src_rect.y = in_OriY + in_RadY;
for(offset_x = in_RadX; offset_x < in_W - in_RadX; offset_x += edge_w){
dst_pos.x = offset_x;
if(in_W - in_RadX < offset_x + edge_w){
src_rect.width = (in_W - in_RadX) - offset_x;
}else{
src_rect.width = edge_w;
}
for(offset_y = in_RadY; offset_y < in_H - in_RadY; offset_y += edge_h){
dst_pos.y = offset_y;
if(in_H - in_RadY < offset_y + edge_h){
src_rect.height = (in_H - in_RadY) - offset_y;
}else{
src_rect.height = edge_h;
}
bmd.copyPixels(in_BMD, src_rect, dst_pos);
}
}
}
m_BitmapData = bmd;
addChild(new Bitmap(bmd));
}
}
class FontText
{
//==Embed==
//fontNameではなくfontFamily + embedAsCFF=falseにすること
// [Embed(source="mplus-1c-black.ttf", fontFamily="mplus", embedAsCFF = "false", mimeType='application/x-font')]
// private var font:Class;
//==Const==
//
static public var s_AlignIter:int = 0;
static public const ALIGN_CENTER:int = s_AlignIter++;//Default
static public const ALIGN_LEFT :int = s_AlignIter++;
static public const ALIGN_RIGHT :int = s_AlignIter++;
static public const ALIGN_UP :int = ALIGN_LEFT;
static public const ALIGN_DOWN :int = ALIGN_DOWN;
//==Var==
static public var s_TextField:TextField = null;
static public var s_TextFormat:TextFormat = new TextFormat();
static public var s_TextSprite:Sprite = new Sprite();
//==Function==
static public function DrawText(out_BMD:BitmapData, in_Text:String, in_X:Number, in_Y:Number, in_Size:int, in_Color:uint, in_AlignX:int = 0, in_AlignY:int = 0):void{
if(s_TextField == null){
s_TextField = new TextField();
// s_TextField.embedFonts = true;
s_TextField.autoSize = TextFieldAutoSize.LEFT;
// s_TextFormat.font = "mplus";
s_TextSprite.addChild(s_TextField);
}
//Param
s_TextFormat.size = in_Size;
s_TextFormat.color = in_Color;
s_TextField.defaultTextFormat = s_TextFormat;
s_TextField.text = in_Text;
//Align
switch(in_AlignX){
case ALIGN_LEFT:
s_TextField.x = in_X;
break;
case ALIGN_CENTER:
s_TextField.x = in_X - s_TextField.textWidth/2;
break;
case ALIGN_CENTER:
s_TextField.x = in_X - s_TextField.textWidth;
break;
}
switch(in_AlignY){
case ALIGN_UP:
s_TextField.y = in_Y;
break;
case ALIGN_CENTER:
s_TextField.y = in_Y - s_TextField.textHeight/2;
break;
case ALIGN_DOWN:
s_TextField.y = in_Y - s_TextField.textHeight;
break;
}
//Draw
out_BMD.draw(s_TextSprite);
}
}
class Util
{
//Lerp
static public function Lerp(in_Src:Number, in_Dst:Number, in_Ratio:Number):Number{
return (in_Src * (1 - in_Ratio)) + (in_Dst * in_Ratio);
}
//Clamp
static public function Clamp(in_Val:Number, in_Min:Number, in_Max:Number):Number{
if(in_Val < in_Min){return in_Min;}
if(in_Max < in_Val){return in_Max;}
return in_Val;
}
static public function Clamp01(in_Val:Number):Number{
if(in_Val < 0){return 0;}
if(1 < in_Val){return 1;}
return in_Val;
}
//Language
static public function IsJapanese():Boolean{
//*
return (Capabilities.language == "ja");
/*/
return false;
//*/
}
}