forked from: 周辺視野拡大トレーニング

by tepe forked from 周辺視野拡大トレーニング (diff: 16)
デバッグ
private var exp:int;
ベストスコア
スコア
コンボ数
リトライ回数
表示されるポイント
レベルアップ経験値

save.clear();//セーブデータリセット
整列
フォント名
文字のポイントサイズ
全画面
setPanel(4+Math.random()*11,3+Math.random()*4);
gameStart();
setPanel(4+Math.random()*11,3+Math.random()*4);
gameStart();
stage.displayState = StageDisplayState.NORMAL;
新しいパターンでスタート
setPanel(4+Math.random()*11,3+Math.random()*4);
レベルを下げてスタート
------------------------------------->        
セーブデータ初期化
スタート画面表示
txt.y = 350;
addChild(txt2);
ゲーム画面遷移
----------------------------      
txt.text+=a.toString()+" ";
var p:panel = list.pop(a);
delete list[a];

スクリーンサイズ
スケールの調整
panelMain.scaleX = panelMain.scaleY = scale;

addChild(txt3);
ゲーム開始
txt.text = "game start";
パネルクリック
正解クリック
missCnt++;
numList[checkNum-1].draw(0x000000);
txt.text = checkNum.toString()+ "    score:"+score.toString();
クリア
onClick
ゲームクリア
removeEventListener(Event.ENTER_FRAME,onFrame);
レベルアップ
x: px,
x: px,
var scale:Number = 1;
x: px,
x: px,
else clearStr ="";
ゲームオーバー
クリア
txt.text = checkNum.toString()+"      
♥0 | Line 1037 | Modified 2015-06-23 15:09:51 | MIT License
play

ActionScript3 source code

/**
 * Copyright tepe ( http://wonderfl.net/user/tepe )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/f38F
 */

// forked from tepe's 周辺視野拡大トレーニング
package {
    import flash.display.*;
    import flash.events.*;
    import flash.text.*;
    import flash.net.*;
    import flash.system.*;
    import caurina.transitions.Tweener;
    
    public class FlashTest extends Sprite {
        private var checkNum:int = 1;
        private var txt:TextField = new TextField();
        private var txt2:TextField = new TextField();
        private var txt3:TextField = new TextField();//デバッグ
        private var panelNum:int;
        private var panelList:Array;
        private var numList:Array;
        private var panelMain:Sprite = new Sprite();
        private var stTime:Date;
        private var prevTime:Date;
        
        private var level:int;
        //private var exp:int;
        private var bestScore:int;//ベストスコア
        private var score:int;//スコア
        private var combo:int;//コンボ数
        private var retryCnt:int;//リトライ回数
        private var saveData:Object = new Object();
        
        private var panelX:int;
        private var panelY:int;
        
        private var scoreCnt:int;//表示されるポイント
        private var expCnt:int;
        private var save:SaveData;
        private var deffScore:Object = new Object();
        private var deffState:Object;
        
        //レベルアップ経験値
        private var nextLv:Array = [0,50,100,150,250,400,
                                    600,800,1000,1500,2000,2500,
                                    
                                    3500,4700,6000,7900,10000,
                                    12000,14000,16000,18000,21000,
                                    
                                    24000,27000,30000,32000,33000,
                                    34000,35000,37000,38000,40000,
                                    
                                    42000,45000,50000,55000,60000,
                                    65000,70000,80000,90000,100000,
                                    
                                    110000,125000,140000,155000,170000,
                                    195000,220000,250000,270000,300000
                                    ];
 
 
        
        public function FlashTest() {
            // write as3 code here..  
            
            save = new SaveData("my_data");
            
            //save.clear();//セーブデータリセット
            
            if(save.length==0)initSaveData();
            saveData = save.data;
            if(saveData.hasOwnProperty("deff"))deffScore = saveData["deff"];
            var format:TextFormat = new TextFormat();
            format.align = TextFormatAlign.LEFT;    // 整列
            format.font = "MS ゴシック";        // フォント名
            format.size = 30;        // 文字のポイントサイズ
            
            txt.defaultTextFormat = format;          
            txt2.defaultTextFormat = format;
 
   
            setStartPanel();
            
        }
        
        //全画面
        private function f1(e:MouseEvent):void{
            txt.x = 0;
            txt.y = 0;
            
            txt2.x = 400;
            txt2.width = 200;
            txt2.height = 50;
            addChild(txt2);
            
            stage.displayState = StageDisplayState.FULL_SCREEN;
            //setPanel(4+Math.random()*11,3+Math.random()*4);
            txt2.text = saveData["exp"];
            expCnt = saveData["exp"];
            
            //gameStart();
            f2();
            
            var menu:ActionBtn = new ActionBtn();
                menu.x = -120;
                menu.y = 20 ;
                addChild(menu);
                menu.init({id: 1, label: "トレーニング終了", width: 80});
                menu.addEventListener(MouseEvent.CLICK, function():void{
                    //setPanel(4+Math.random()*11,3+Math.random()*4);
                    //gameStart();
                    //stage.displayState = StageDisplayState.NORMAL;
                    setStartPanel();
                });
             
            var menu2:ActionBtn = new ActionBtn();
                menu2.x = 600 ;
                menu2.y = 20 ;
                addChild(menu2);
                menu2.init({id: 2, label: "リセット", width: 80});
                menu2.addEventListener(MouseEvent.CLICK,f2);
        }

        
        //新しいパターンでスタート
        private function f2(e:MouseEvent=null):void{
            var a:int = 6 + saveData["level"]/3;
            var b:int = a-((a-2)*Math.random());
            var limitX:int = 25;
            var limitY:int = 12;
            if(saveData["level"]<35)limitX = 13;
            else if(saveData["level"]<40)limitX = 17
            if(limitX<b)b=limitX;

            var c:int = a-b+2;
            
            if(saveData["level"]<20)limitY = 5;
            else if(saveData["level"]<25)limitY = 6;
            else if(saveData["level"]<30)limitY = 7;
            else if(saveData["level"]<35)limitY = 8;
            else if(saveData["level"]<40)limitY = 9;
            else if(saveData["level"]<45)limitY = 10;
            else if(saveData["level"]<50)limitY = 11;
            
            if(limitY<c)c=limitY;
            
            
            setPanel(b,c);
            //setPanel(4+Math.random()*11,3+Math.random()*4);
            gameStart();
        }
        
        
        
        //レベルを下げてスタート
        private function f3():void{
            
            if(panelX<panelY)panelY-=2;
            else panelX-=2
            
            if(panelX<1)panelX=1;
            if(panelY<1)panelY=1;
            
            setPanel(panelX,panelY);
            gameStart();
        }
        
 

//------------------------------------->        
        //セーブデータ初期化
        private function initSaveData():void{
            var obj:Object = new Object();
            var exp:int=0;
            var level:int=1;
            obj["exp"]=0;
            obj["level"]=level;
            
            save.data=obj;
        }

        
        //スタート画面表示
        private function setStartPanel():void{
            removeEventListener(Event.ENTER_FRAME,onFrame);
            while(0<panelMain.numChildren)panelMain.removeChildAt(0);
            while(0<this.numChildren)removeChildAt(0);
            
            addChild(txt);
            //txt.y = 350;
            txt.width =400;
            txt.text = checkNum.toString();
            addChild(panelMain);
            
            txt2.x = 400;
            txt2.width = 200;
            txt2.height = 50;
            //addChild(txt2);
            stage.displayState = StageDisplayState.NORMAL;
            txt.x = 40;
            txt.y = 150;
            txt.text = "周辺視野拡大トレーニング2\n\n"+"    クリック";            
            
            addEventListener(MouseEvent.MOUSE_UP,f1);//ゲーム画面遷移
            
        }
        


        
 //----------------------------      
        private function setPanel(sizeX:int,sizeY:int):void{
            var name:String = (sizeX*sizeY).toString();
            if(!deffScore.hasOwnProperty(name)){
                var obj:Object = new Object();
                deffScore[name] = obj;
                deffState = obj;
                deffState["clearCnt"] = 0;
                deffState["score"] = 0;
                deffState["miss"] = 3;
                deffState["name"] = name;
                deffState["combo"] = 0;
                deffState["best"] = 0;
                deffScore[name] = deffState;
                
            }
            else{
                deffState = deffScore[name];
            }
            
            removeEventListener(MouseEvent.MOUSE_UP,f1);
            while(0<panelMain.numChildren)panelMain.removeChildAt(0);
            panelMain.y = 50;
            panelMain.x = (455/2)-sizeX*26;
            retryCnt=0;
            bestScore=0;
            
            panelX=sizeX;
            panelY=sizeY;
            
            var list:Array = new Array();
            panelList = new Array();
            for(var i:int=0;i<sizeY;i++){
                for(var j:int=0;j<sizeX;j++){
                    var p1:panel = new panel();
                    p1.x = (p1.width+1)*j;
                    p1.y = (p1.height+1)*i;
                    p1.addEventListener(MouseEvent.MOUSE_UP,onClick);
                    panelMain.addChild(p1);
                    list.push(p1);
                    panelList.push(p1);
                    
                    
                } 
            }
            
            panelNum=sizeX*sizeY;
            var cnt:int=1;
            numList = new Array();
            while(0<list.length){
                var a:int=(list.length)*Math.random();
                //txt.text+=a.toString()+" ";
                //var p:panel = list.pop(a);
                list[a].num = cnt;
                numList.push(list[a]);
                list.splice(a,1);
                //delete list[a];
                cnt++;
            }
            
            ///*
            //スクリーンサイズ
            var screenW:int = Capabilities.screenResolutionX/1.3;
            var screenH:int = Capabilities.screenResolutionY/3;
            //スケールの調整
            var scaleX:Number=1;
            var scaleY:Number=1;
            if(screenW < sizeX*(panelList[0].width*2)){ 
                scaleX = (screenW / ((panelList[0].width*2)*sizeX));
                //panelMain.scaleX = panelMain.scaleY = scale;
                
            }
            
            if(screenH < sizeY*26*2){
                 scaleY = (screenH / ((26*2)*sizeY));
            }
            
            if(scaleY<scaleX)panelMain.scaleX = panelMain.scaleY = scaleY;
            else panelMain.scaleX = panelMain.scaleY = scaleX;
            
            
            
            panelMain.x = (455/2) - (panelMain.width/2);
            //*/
            
            test1();
            addChild(txt3);
            
        }
        
        private function test1():void{
            //addChild(txt3);
            txt3.text = "test";
            txt3.y = 30;
            var str:String = new String();
            for(var key:String in deffState){
                str += key+":"+deffState[key].toString()+"  ";
            }
            if(deffState["clearCnt"]==0)str += " 未クリア"
            for(var i:int=0;i<3-missCnt;i++){
                str+= " ★";    
            }
            
            txt3.text = str;
            txt3.width = txt3.textWidth+10;
            txt3.height = txt3.textHeight+5;
        }
        
        
        private var endTime:Number;

        //ゲーム開始
        private function gameStart():void{
            checkNum=1;
            for(var i:int=0;i<panelList.length;i++){
                panelList[i].alpha = 1.0;
            }
            
            
            score = 0;
            scoreCnt=0;
            combo=0;
            missCnt=0;
            //txt.text = "game start";
            txt.text = "Lv:"+saveData["level"].toString()+" ["+checkNum.toString()+ "]    score:"+scoreCnt.toString();
            stTime = new Date();
            endTime = stTime.time
            
            prevTime = new Date();
            addEventListener(Event.ENTER_FRAME,onFrame);
            test1();
            
        }
        
        private var missCnt:int=0;

        //パネルクリック
        private function onClick(e:MouseEvent):void{

            if(2<missCnt)return;
            
            if(e.currentTarget.text != numList[checkNum-1].text){
                combo=0;
                return;
            }
            //正解クリック
            var now:Date = new Date();
            var time:int = now.valueOf()-prevTime.valueOf();
            var pt:int = 0;
            if(time<1000){
                score += 200;
                pt = 200;
                combo++;
            }
            else if(time<2000){
                score += 100;
                pt = 100;
                combo++;
            }
            else if(time<3000){
                score += 50;
                pt = 50;
                combo++;
            }
            else if(time<4000){
                score += 30;
                pt = 30;
                combo++;
                
            }
            else if(time<5000){
                score += 20;
                pt = 20;
                combo=0;
                //missCnt++;
            }
            else{
                score += 10;
                pt = 10;
                combo=0;
                missCnt++;
            }
                
            if(deffState["combo"]<combo){
                deffState["combo"] = combo;
                new ScoreIndicator(this,20,30,"コンボ更新",0xffffff,0x000000,20); 
                
            }
            if(deffState["score"] < score){
                deffState["score"] = score;
            }
            if(deffState["best"] < checkNum){
                new ScoreIndicator(this,220,30,"自己ベスト更新",0xffffff,0x000000,20);
            }
                
                
            pt+= combo*10;
            var c1:int = 0x0000ff;
            var c2:int = 0xffffff;
                
            var n:int = 3;
            if(combo<n*1){
                c1 = 0xaaaaff;
                c2 = 0x000000;
                    
            }
            else if(combo<n*2){
                c1 = 0x00aaff;
                c2 = 0x000000;
            }
            else if(combo<n*3){
                c1 = 0x00ff00;
                c2 = 0x000000;
                
            }
            else if(combo<n*4){
                c1 = 0xaaff00;
                c2 = 0x000000;
                    
            }
            else if(combo<n*5){
                c1 = 0xffff00;
                c2 = 0x000000;
            }
            else if(combo<n*6){
                c1 = 0xffaa00;
                c2 = 0x000000;
            }
            else if(combo<n*7){
                c1 = 0xff0000;
                c2 = 0x000000;
            }
            else if(combo<n*8){
                c1 = 0xff00ff;
                c2 = 0x000000;
            }
            else if(combo<n*9){
                c1 = 0x00aa00;
                c2 = 0xffffff;
            }

            test1();



            score += combo*10;
            prevTime = now;
            new ScoreIndicator(panelMain,panelMain.mouseX,panelMain.mouseY,"+"+pt.toString(),c2,c1,20);
            if(1<combo)new ScoreIndicator(panelMain,panelMain.mouseX,panelMain.mouseY+10,combo.toString()+"combo",c2,c1,10);    
            e.currentTarget.alpha = 0.3;
            e.currentTarget.draw(0x000000);
            //numList[checkNum-1].draw(0x000000);
                
            checkNum++;
            //txt.text = checkNum.toString()+ "    score:"+score.toString();
            if(panelNum+1==checkNum){
                    
               
                if(deffState["score"] < score)deffState["score"] = score;
                if(missCnt < deffState["miss"])deffState["miss"] = missCnt;
                test1();
                deffState["best"]=checkNum-1;
                
                if(deffState["clearCnt"]==0)new ScoreIndicator(this,223,200,"stage clear!!",0xffff00,0x000000,50); 
                else new ScoreIndicator(this,223,200,"stage clear!!",0xffffff,0x000000,40); 
                deffState["clearCnt"] = deffState["clearCnt"]+1;
                gameClear();//クリア
                checkNum=0;
            }
 

        }//onClick
        
        //ゲームクリア
        private var clearStr:String;
        private function gameClear():void{
            //removeEventListener(Event.ENTER_FRAME,onFrame);
            if(bestScore<score && 0<retryCnt){
                 clearStr = "BestScore  "+bestScore.toString()+" -> "+score.toString();
                 bestScore = score;
            }
            else{
                if(retryCnt==0) bestScore = score;
                clearStr = "best "+bestScore.toString()+" score:"+score.toString();
            }
            
            
            
            var a:int = numList.length;
            var ex:int = (score/200)*(a/5)
            clearStr += " +"+ex.toString()+"pt";
            saveData["exp"] += ex;
            var lv:int = saveData["level"];
            while(nextLv[lv] <= saveData["exp"]){//レベルアップ
                if(nextLv.length<=saveData["level"])break;
                saveData["level"]++;
                new ScoreIndicator(this,20,30,"レベルアップ!",0xffffff,0xaa0000,20); 
                
                lv = saveData["level"];
            }
            deffScore[deffState.name] = deffState;
            saveData["deff"] = deffScore;

            save.data =saveData;
            
            
            
            var menu4:ActionBtn = new ActionBtn();
                menu4.x = 700 ;
                menu4.y = 230 ;
                addChild(menu4);
                menu4.init({id: 2, label: "次へ", width: 80});
                menu4.addEventListener(MouseEvent.MOUSE_UP,function():void{ 
                    Tweener.addTween(menu3, {
                        time: 0.5,
                        //x: px,
                        alpha: 0,
                        transition: "easeOutQuar",
                        onComplete: function():void{
                            addEventListener(Event.ENTER_FRAME,onFrame);
                            if(missCnt<2)f2();
                            else f3();
                            removeChild(menu3);
                            removeChild(menu4);
                            menu3=null;
                            menu4=null;
                        }
                    });
                    Tweener.addTween(menu4, {
                        time: 0.5,
                        //x: px,
                        alpha: 0,
                        transition: "easeOutQuar"
                    });
                });
            //var scale:Number = 1;
            var px:Number = (455/2) + 70;

            Tweener.addTween(menu4, {
                time: 0.8,
                x: px,
                transition: "easeOutQuar"
            });
            
            var menu3:ActionBtn = new ActionBtn();
                menu3.x = 700 ;
                menu3.y = 230 ;
                addChild(menu3);
                menu3.init({id: 2, label: "リトライ", width: 80});
                menu3.addEventListener(MouseEvent.MOUSE_UP,function():void{
                    Tweener.addTween(menu3, {
                        time: 0.5,
                        //x: px,
                        alpha: 0,
                        transition: "easeOutQuar",
                        onComplete: function():void{
                            addEventListener(Event.ENTER_FRAME,onFrame);
                            if(0<checkNum)numList[checkNum-1].draw(0x000000);
                            retryCnt++;
                            gameStart();
                            removeChild(menu3);
                            removeChild(menu4);
                            menu3=null;
                            menu4=null;
                        }

                    });
                    Tweener.addTween(menu4, {
                        time: 0.5,
                        //x: px,
                        alpha: 0,
                        transition: "easeOutQuar"
                    });
                });
            var px2:Number = (455/2) - 70;
            Tweener.addTween(menu3, {
                time: 0.8,
                x: px2,
                transition: "easeOutQuar"
            });
            test1();
        }
   
        

        
        private function getTime():Number{
            var now:Date = new Date();
            var time:Number = now.valueOf()-stTime.valueOf();
            return time/1000;
        }

        private function onFrame(e:Event):void{
            var now:Date = new Date();
            var time:int = now.valueOf()-prevTime.valueOf();
            
            if(scoreCnt<score){
                if(scoreCnt+200<score)scoreCnt=score-200;
                scoreCnt+=10;
                txt.text = "Lv:"+saveData["level"].toString()+" ["+checkNum.toString()+ "]    score:"+scoreCnt.toString();
                
            }
            if(expCnt<saveData["exp"]){
                var val:int = (saveData["exp"]-expCnt)/5;
                if(val<2)expCnt++;
                else expCnt += val;
                var lv:int = saveData["level"]
                var n:int = nextLv[lv];
                txt2.text = "exp:"+(n-expCnt).toString();
            }
            //else clearStr ="";


            
            if(time<5000){
                return;
            }
            else if(time<8000){
                numList[checkNum-1].draw(0x00ff00);
                //ゲームオーバー
                if(2<=missCnt){
                    new ScoreIndicator(this,223,200,"終了",0x000000,0xcccccc,50); 
                    deffState["best"]=checkNum;
                    missCnt++;
                    gameClear();//クリア
                    missCnt=0;
                    return;
                }
                return;
            }
            else if(time<10000){
                numList[checkNum-1].draw(0xffaa00);
                return;
            }
            else if(time<11000){
                numList[checkNum-1].draw(0xff0000);
                return;
            }
            
            

            //txt.text = checkNum.toString()+"        time:"+getTime().toString();
        }//onFrame
        


    }//class
    

}//package



///---------------------------------------------------------
import flash.display.*;
import flash.events.*;
import flash.text.*;
class panel extends Sprite{
    private var _num:int;
    public var tf:TextField;
    public function panel(){
        tf = new TextField();
        var format:TextFormat = new TextFormat();
        format.align = TextFormatAlign.CENTER;    // 整列
        format.font = "MS ゴシック";        // フォント名
        format.size = 25;        // 文字のポイントサイズ
        tf.defaultTextFormat = format;
        
        tf.selectable = false;
        tf.width = 50;
        tf.height = 40;
        tf.y = 8;
        tf.text = "test";
        
        addChild(tf);
        draw();

    }
    
    public function set text(str:String):void{
        tf.text = str;
    }
    public function get text():String{
        return tf.text;
    }


    public function set num(n:int):void{
        _num = n;
        tf.text = _num.toString();
    }
    public function get num():int{
        return _num;
    }

    public function draw(col:uint=0x000000):void{
        this.graphics.clear();
        this.graphics.lineStyle(2,col);
        //this.graphics.drawRect(0,0,50,50);
        this.graphics.beginFill(0x000000,0);
        this.graphics.drawRoundRect(0,0,50,50,5,5);
        this.graphics.endFill();
        
    }

}




//////////////////////////////////////////////////

// ActionBtnクラス

//////////////////////////////////////////////////



import flash.display.Sprite;

import flash.display.Shape;

import flash.text.TextField;

import flash.text.TextFieldType;

import flash.text.AntiAliasType;

import flash.text.TextFormat;

import flash.text.TextFormatAlign;

import flash.filters.DropShadowFilter;

import flash.geom.Matrix;

import flash.display.GradientType;

import flash.display.SpreadMethod;

import flash.display.InterpolationMethod;

import flash.geom.ColorTransform;

import flash.events.Event;

import flash.events.MouseEvent;



class ActionBtn extends Sprite {

    public var id:uint;

    private var shade:Shape;

    private var base:Shape;

    private var front:Shape;

    private var light:Shape;

    private var overlay:Shape;

    private var txt:TextField;

    private var label:String = "";

    private static var fontType:String = "_ゴシック";

    private var _width:uint = 60;

    private static var _height:uint = 32;

    private static var corner:uint = 6;

    private static var tHeight:uint = 17;

    private static var bColor:uint = 0xFFFFFF;

    private static var sColor:uint = 0x000000;

    private static var baseColor:uint = 0x0066CC;

    private static var lightColor:uint = 0x00FFFF;

    private static var overColor:uint = 0x3333FF;

    private static var tColor:uint = 0xFFFFFF;

    private static var defaultColorTrans:ColorTransform;

    private static var disableColor:uint = 0xCCCCCC;

    private static var disableColorTrans:ColorTransform;

    private var mode:int;

    private var _selected:Boolean = false;

    private var _enabled:Boolean = true;



    public function ActionBtn() {

    }



    public function init(option:Object):void {

        if (option.id != undefined) id = option.id;

        if (option.label != undefined) label = option.label;

        if (option.width != undefined) _width = option.width;

        draw();

    }

    private function draw():void {

        defaultColorTrans = new ColorTransform();

        disableColorTrans = new ColorTransform();

        disableColorTrans.color = disableColor;

        shade = new Shape();

        base = new Shape();

        front = new Shape();

        light = new Shape();

        overlay = new Shape();

        txt = new TextField();

        addChild(shade);

        addChild(base);

        addChild(front);

        addChild(light);

        addChild(overlay);

        addChild(txt);

        createBase(shade, _width, _height, corner, bColor);

        shade.filters = [new DropShadowFilter(1, 90, sColor, 0.4, 4, 4, 2, 3, false, false)];

        createBase(base, _width-2, _height-2, corner, baseColor);

        createFront(front, _width, _height, corner);

        createLight(light, _width-2, _height-2, corner);

        createOverlay(overlay, _width-2, _height-2, corner);

        txt.x = -_width/2;

        txt.y = -tHeight + _height/4;

        txt.width = _width;

        txt.height = tHeight;

        txt.type = TextFieldType.DYNAMIC;

        txt.selectable = false;

        //txt.embedFonts = true;

        //txt.antiAliasType = AntiAliasType.ADVANCED;

        var tf:TextFormat = new TextFormat();

        tf.font = fontType;

        tf.size = 10;

        tf.align = TextFormatAlign.CENTER;

        txt.defaultTextFormat = tf;

        txt.textColor = tColor;

        txt.text = label;

        txt.filters = [new DropShadowFilter(0, 90, sColor, 0.5, 2, 2, 2, 3, false, false)];

        light.alpha = 0;

        enabled = true;

        mouseChildren = false;

    }

    private function rollOver(evt:MouseEvent = null):void {

        mode = 1;

        addEventListener(Event.ENTER_FRAME, action, false, 0, true);

    }

    private function rollOut(evt:MouseEvent = null):void {

        mode = -1;

        addEventListener(Event.ENTER_FRAME, action, false, 0, true);

    }

    private function action(evt:Event):void {

        light.alpha += 0.1*mode;

        if (light.alpha < 0) {

            light.alpha = 0;

            removeEventListener(Event.ENTER_FRAME, action);

        }

        if (light.alpha > 1) {

            light.alpha = 1;

            removeEventListener(Event.ENTER_FRAME, action);

        }

    }

    private function _up():void {

        base.transform.colorTransform = defaultColorTrans;

        front.transform.colorTransform = defaultColorTrans;

    }

    private function _down():void {

        base.transform.colorTransform = defaultColorTrans;

        front.transform.colorTransform = defaultColorTrans;

        light.alpha = 1;

    }

    private function _disable():void {

        base.transform.colorTransform = disableColorTrans;

        front.transform.colorTransform = disableColorTrans;

    }

    public function get selected():Boolean {

        return _selected;

    }

    public function set selected(param:Boolean):void {

        _selected = param;

        enabled = !_selected;

        if (_selected) {

            _down();

        } else {

            _up();

            rollOut();

        }

    }

    public function get enabled():Boolean {

        return _enabled;

    }

    public function set enabled(param:Boolean):void {

        _enabled = param;

        buttonMode = _enabled;

        mouseEnabled = _enabled;

        useHandCursor = _enabled;

        if (_enabled) {

            _up();

            addEventListener(MouseEvent.MOUSE_OVER, rollOver, false, 0, true);

            addEventListener(MouseEvent.MOUSE_OUT, rollOut, false, 0, true);

        } else {

            _disable();

            removeEventListener(MouseEvent.MOUSE_OVER, rollOver);

            removeEventListener(MouseEvent.MOUSE_OUT, rollOut);

        }

    }

    private function createBase(target:Shape, w:uint, h:uint, c:uint, color:uint, alpha:Number = 1):void {

        target.graphics.beginFill(color, alpha);

        target.graphics.drawRoundRect(-w/2, -h/2, w, h, c*2);

        target.graphics.endFill();

    }

    private function createFront(target:Shape, w:uint, h:uint, c:uint):void {

        var colors:Array = [baseColor, baseColor];

        var alphas:Array = [0, 0.5];

        var ratios:Array = [0, 255];

        var matrix:Matrix = new Matrix();

        matrix.createGradientBox(w, h, 0.5*Math.PI, -w/2, -h/2);

        target.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, matrix, SpreadMethod.PAD, InterpolationMethod.RGB, 0);

        target.graphics.drawRoundRect(-w/2, -h/2, w, h, c*2);

        target.graphics.endFill();

    }

    private function createLight(target:Shape, w:uint, h:uint, c:uint):void {

        var colors:Array = [lightColor, overColor];

        var alphas:Array = [1, 0];

        var ratios:Array = [40, 160];

        var matrix:Matrix = new Matrix();

        matrix.createGradientBox(w*2, h*3, 0, -w, -h*0.9);

        target.graphics.beginGradientFill(GradientType.RADIAL, colors, alphas, ratios, matrix, SpreadMethod.PAD, InterpolationMethod.RGB, 0);

        target.graphics.drawRoundRect(-w/2, -h/2, w, h, c*2);

        target.graphics.endFill();

    }

    private function createOverlay(target:Shape, w:uint, h:uint, c:uint):void {

        target.graphics.beginFill(bColor, 0.3);

        target.graphics.drawEllipse(-w*1.125, -h*4.375, w*2.25, h*4.375);

        target.graphics.endFill();

        var _mask:Shape = new Shape();

        _mask.graphics.beginFill(sColor);

        _mask.graphics.drawRoundRect(-w/2, -h/2, w, h, c*2);

        _mask.graphics.endFill();

        addChild(_mask);

        target.mask = _mask;

    }



}





//////////////////////////////////////////////////

// BitmapTileクラス

//////////////////////////////////////////////////



import flash.display.Shape;

import flash.display.BitmapData;

import flash.geom.ColorTransform;



class BitmapTile extends Shape {

    private var _width:uint;

    private var _height:uint;



    public function BitmapTile(w:uint, h:uint, Tile:Class, color:uint = 0x000000) {

        _width = w;

        _height = h;

        draw(Tile, color);

    }



    private function draw(Tile:Class, color:uint):void {

        var tile:BitmapData = new Tile();

        var bitmapdata:BitmapData = new BitmapData(tile.width, tile.height);

        var colorTrans:ColorTransform = new ColorTransform();

        colorTrans.color = color;

        bitmapdata.draw(tile, null, colorTrans);

        graphics.beginBitmapFill(bitmapdata, null, true);

        graphics.drawRect(0, 0, _width, _height);

        graphics.endFill();

    }



}





import flash.display.BitmapData;



class Tile6 extends BitmapData {

    private static var size:uint = 6;

    private static var color:uint = 0xFF000000;



    public function Tile6() {

        super(size, size, true, 0x00000000);

        init();

    }



    private function init():void {

        setPixel32(0, 2, color);

        setPixel32(0, 5, color);

        setPixel32(1, 1, color);

        setPixel32(1, 4, color);

        setPixel32(2, 0, color);

        setPixel32(2, 3, color);

        setPixel32(3, 2, color);

        setPixel32(3, 5, color);

        setPixel32(4, 1, color);

        setPixel32(4, 4, color);

        setPixel32(5, 0, color);

        setPixel32(5, 3, color);

    }



}



//-------Objectデータをローカルに保存する------------------------------------------------

    import flash.net.*;

    class SaveData{

        private var so:SharedObject;

        //オブジェクト名を指定して開く

        public function SaveData(name:String){

            so = SharedObject.getLocal(name);

        }



        //データロード

        public function get data():Object{

            var obj:Object;

            if(so){ 

                obj = so.data;

                return obj;

            }      

            return null;

        }

        

        //データセーブ

        public function set data(obj:Object):void{

            if(so){

                for(var str:String in obj){

                    so.data[str] = obj[str];

                }

            }

        }

        //データ消去

        public function clear():void{

            if(so){

                so.clear();

            }

        }

        public function get length():int{

            var cnt:int=0;

            for(var str:String in so.data)cnt++;

            return cnt;

        }



        

        //データ確認

        public function show():String{

            var text:String = new String();

            for(var str:String in so.data){ 

                text += str;

                text += "="+so.data[str].toString()+"\n";

            }

            return text;

        }



    }
    
    
    
    
    
// -----------------------------------------------------------------------------------------

// ScoreIndicator

// -----------------------------------------------------------------------------------------

//package {
    import flash.display.*;
    import flash.events.Event; 
    import flash.text.TextField;
    import org.libspark.betweenas3.BetweenAS3;
    import org.libspark.betweenas3.easing.*;
    import org.libspark.betweenas3.tweens.ITween;    

    //public
    class ScoreIndicator extends Sprite {
        private var _chars:Vector.<TextField>;
        private var _charIndex:int;
        private var _numCompleted:int;
        //private var color1:uint = 0x0000ff;
        private var color1:uint = 0xffffff;
        //private var color2:uint = 0x00007f;
        private var color2:uint = 0xaaaaff;
        private var _size:Number;
        private var _time:Number;
        
        public function ScoreIndicator(parent:DisplayObjectContainer, centerX:int, bottomY:int, text:String,
                            c1:uint=0xffffff,c2:uint=0xaaaaff,size:Number=50,time:Number=2.3) {
            parent.addChild(this);
            this.mouseEnabled = false;
            x = centerX;
            y = bottomY;
            _size = size;
            _time = time;            
            color1 = c1;
            color2 = c2;          
            _chars = new Vector.<TextField>();
            _charIndex = 0;
            _numCompleted = 0;
            
            splitText(text);//文字列を文字に分割
            alignChars();
            playTween();
            
            addEventListener(Event.ENTER_FRAME, checkEveryTweenCompleted);
        }
        
        //文字列分割
        private function splitText(text:String):void {
            //this.scaleX = 2;
            //this.scaleY = 2;
            // 文字のスタイルを設定する
            var builder:TextBuilder = new TextBuilder();
            builder.autoCorrect(false).autoSize().bold();
            
            //カラー設定
            //var dmg : Number = Number(text);
            //var c : uint = 256 * (1 - dmg / 10000);
            //builder.font(Main.FONT, Main.EMBED).fontColor(color1 | c<<8 | c).fontSize(50);
            builder.font().fontColor(color1).fontSize(_size);
//            builder.textBorder(true, 0x404040, 2, 4);
            //var d : uint = c / 2;
            //builder.textBorder(true, color2 | d<<8 | d, 10, 20);
            builder.textBorder(true, color2, 10, (_size/6));
           
            for (var i:int = 0; i < text.length; i++) {
                _chars.push(builder.build(text.charAt(i)));
            }
        }
        
        private function alignChars():void {
            var i:int, charsWidth:Number = 0;
            
            for (i = 0; i < _chars.length; i++) {
                charsWidth += _chars[i].textWidth;
            }
2            
            if(_chars[0]){
                _chars[0].x = -int(charsWidth / 2);
                _chars[0].y = -_chars[0].textHeight;
            }
            
            for (i = 1; i < _chars.length; i++) {
                _chars[i].x = _chars[i - 1].x + _chars[i - 1].textWidth;
                _chars[i].y = -_chars[i].textHeight;
            }
        }
        
        //モーショントゥイーン
        private function playTween(event:Event = null):void {
            if (event) { removeEventListener(Event.ENTER_FRAME, playTween); }
            
            var char:TextField = _chars[_charIndex++];
            addChild(char);
            
            // 各文字に適用するトゥーイン
            var tween:ITween = BetweenAS3.bezierTo(char, { y: char.y }, { $y: -(char.textHeight * 2) }, 0.3, Sine.easeInOut);
            tween.onComplete = tweenCompleteHandler;
            tween.play();
            
            if (_charIndex < _chars.length) {
                addEventListener(Event.ENTER_FRAME, playTween);
            }
        }
        
        //
        private function tweenCompleteHandler():void {
            _numCompleted++;
        }
        
        private function checkEveryTweenCompleted(event:Event):void {
            if (_numCompleted == _chars.length) {
                removeEventListener(Event.ENTER_FRAME, checkEveryTweenCompleted);
                BetweenAS3.serial(
                    BetweenAS3.to(this, { alpha: 0 }, _time, Quint.easeInOut),
                    BetweenAS3.removeFromParent(this)
                ).play();
            }
        }
    }
//}


// -----------------------------------------------------------------------------------------

// TextBuilder
/// -----------------------------------------------------------------------------------------
//package {
    import flash.filters.GlowFilter;
    import flash.text.*;
    
    //public
    class TextBuilder {
        public static const ALIGN_LEFT:String = "left";
        public static const ALIGN_RIGHT:String = "right";
        public static const ALIGN_CENTER:String = "center";
        
        private var _posX:Number;
        private var _posY:Number;
        
        private var _width:Number;
        private var _height:Number;
        
        private var _background:Boolean;
        private var _backgroundColor:uint;
        
        private var _border:Boolean;
        private var _borderColor:uint;
        
        private var _fontName:String;
        private var _embedFonts:Boolean;
        private var _advancedAntiAlias:Boolean;
        
        private var _fontSize:int;
        private var _fontColor:uint;
        private var _bold:Boolean;
        
        private var _textBorder:Boolean;
        private var _textBorderColor:uint;
        private var _textBorderBlur:Number;
        private var _textBorderStrength:Number;
        
        private var _align:String;
        private var _autoSizeEnabled:Boolean;
        private var _autoCorrectPositionY:Boolean;
        private var _wordWrap:Boolean;
        
        public function TextBuilder() {
            clear();
        }
        
        public function clear():TextBuilder {
            _posX = 0;
            _posY = 0;
            _width = 100;
            _height = 100;
            _background = false;
            _backgroundColor = 0xffffff;
            _border = false;
            _borderColor = 0x000000;
            _fontName = "Arial";
            _embedFonts = false;
            _advancedAntiAlias = false;
            _fontSize = 12;
            _fontColor = 0x000000;
            _bold = false;
            _textBorder = false;
            _textBorderColor = 0xffff00;
            _textBorderBlur = 4;
            _textBorderStrength = 2;
            _align = TextBuilder.ALIGN_LEFT;
            _autoSizeEnabled = false;
            _autoCorrectPositionY = true;
            _wordWrap = false;
            return this;
        }
        
        public function position(x:Number, y:Number):TextBuilder {
            _posX = x;
            _posY = y;
            return this;
        }
        
        public function size(width:Number, height:Number):TextBuilder {
            _width = width;
            _height = height;
            return this;
        }
        
        public function background(enabled:Boolean, color:uint = 0xffffff):TextBuilder {
            _background = enabled;
            _backgroundColor = color;
            return this;
        }
        
        public function border(enabled:Boolean, color:uint = 0x000000):TextBuilder {
            _border = enabled;
            _borderColor = color;
            return this;
        }
        
        public function font(name:String="Arial", embed:Boolean = false, advancedAntiAlias:Boolean = false):TextBuilder {
            _fontName = name;
            _embedFonts = embed;
            _advancedAntiAlias = advancedAntiAlias;
            return this;
        }
        
        public function fontSize(size:int):TextBuilder {
            _fontSize = size;
            return this;
        }
        
        public function fontColor(color:uint):TextBuilder {
            _fontColor = color;
            return this;
        }
        
        public function bold(enabled:Boolean = true):TextBuilder {
            _bold = enabled;
            return this;
        }
        
        public function textBorder(enabled:Boolean, color:uint = 0xffff00, blur:Number = 4, strength:Number = 2):TextBuilder {
            _textBorder = enabled;
            _textBorderColor = color;
            _textBorderBlur = blur;
            _textBorderStrength = strength;
            return this;
        }
        
        public function align(value:String = TextBuilder.ALIGN_LEFT):TextBuilder {
            _align = value;
            return this;
        }
        
        public function autoSize(enabled:Boolean = true):TextBuilder {
            _autoSizeEnabled = enabled;
            return this;
        }
        
        public function autoCorrect(positionY:Boolean = true):TextBuilder {
            _autoCorrectPositionY = positionY;
            return this;
        }
        
        public function wordWrap(enabled:Boolean = true):TextBuilder {
            _wordWrap = enabled;
            return this;
        }
        
        public function build(text:String):TextField {
            var textField:TextField = new TextField();
            
            textField.x = _posX;
            textField.y = _posY;
            textField.width = _width;
            textField.height = _height;
            
            var format:TextFormat = new TextFormat(_fontName, _fontSize, _fontColor, _bold);
            if (_autoSizeEnabled) {
                switch(_align) {
                    case TextBuilder.ALIGN_LEFT: { textField.autoSize = TextFieldAutoSize.LEFT; break; }
                    case TextBuilder.ALIGN_RIGHT: { textField.autoSize = TextFieldAutoSize.RIGHT; break; }
                    case TextBuilder.ALIGN_CENTER: { textField.autoSize = TextFieldAutoSize.CENTER; break; }
                }
            }else {
                switch(_align) {
                    case TextBuilder.ALIGN_LEFT: { format.align = TextFormatAlign.LEFT; break; }
                    case TextBuilder.ALIGN_RIGHT: { format.align = TextFormatAlign.RIGHT; break; }
                    case TextBuilder.ALIGN_CENTER: { format.align = TextFormatAlign.CENTER; break; }
                }
            }
            
            textField.embedFonts = _embedFonts;
            textField.antiAliasType = (_advancedAntiAlias ? AntiAliasType.ADVANCED : AntiAliasType.NORMAL);
            textField.defaultTextFormat = format;
            textField.text = text;
           
            if (textField.background = _background) { textField.backgroundColor = _backgroundColor; }
            if (textField.border = _border) { textField.borderColor = _borderColor; }
            if (_textBorder) { textField.filters = [new GlowFilter(_textBorderColor, 1, _textBorderBlur, _textBorderBlur, _textBorderStrength)]; }
            if (!(textField.wordWrap = _wordWrap) && _autoCorrectPositionY) { textField.y += Math.max(0, Math.ceil((_height - (textField.textHeight + 4)) / 2)); }
            textField.mouseEnabled = textField.selectable = false;
            
            return textField;
        }
        
        public function clone():TextBuilder {
            var clone:TextBuilder = new TextBuilder();
            clone._posX = _posX;
            clone._posY = _posY;
            clone._width = _width;
            clone._height = _height;
            clone._background = _background;
            clone._backgroundColor = _backgroundColor;
            clone._border = _border;
            clone._borderColor = _borderColor;
            clone._fontName = _fontName;
            clone._embedFonts = _embedFonts;
            clone._advancedAntiAlias = _advancedAntiAlias;
            clone._fontSize = _fontSize;
            clone._fontColor = _fontColor;
            clone._bold = _bold;
            clone._textBorder = _textBorder;
            clone._textBorderColor = _textBorderColor;
            clone._textBorderBlur = _textBorderBlur;
            clone._textBorderStrength = _textBorderStrength;
            clone._align = _align;
            clone._autoSizeEnabled = _autoSizeEnabled;
            clone._autoCorrectPositionY = _autoCorrectPositionY;
            clone._wordWrap = _wordWrap;
            return clone;
        }
    }
//}

Forked