Guest User

Untitled

a guest
Oct 30th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package com.playpower.views
  2. {
  3.     import flash.display.Bitmap;
  4.     import flash.display.BitmapData;
  5.     import flash.display.Graphics;
  6.     import flash.display.MovieClip;
  7.     import flash.display.Sprite;
  8.     import flash.events.Event;
  9.     import flash.events.KeyboardEvent;
  10.     import flash.events.MouseEvent;
  11.     import flash.events.TimerEvent;
  12.     import flash.geom.Rectangle;
  13.     import flash.utils.ByteArray;
  14.     import flash.utils.Timer;
  15.  
  16.     import com.carlcalderon.arthropod.Debug;
  17.     import com.playpower.core.*;
  18.     import com.playpower.events.CustomEvent;
  19.     import com.playpower.ui.OutlineButton;
  20.  
  21.  
  22.     public class CHREditor extends Sprite
  23.     {
  24.         public var _controller:Controller;
  25.         public var _w:Number;
  26.         public var _h:Number;
  27.         private var _lines:Sprite;
  28.         private var _btnArr:Array;
  29.         private var _bmd:BitmapData;
  30.         private var _bg:Bitmap;
  31.         private var _clr:*;
  32.         private var _paletteTileNum:Number;
  33.         private var _curTileNum:Number;
  34.         private var _colorIndexArr:Array;
  35.         private var _selTileArr:Array;
  36.        
  37.         // have no idea why these were continually reset. they are stored in the singleton for now
  38.         //private var _selectedTile:Number = 120;
  39.         //private var _curAttr:Number;
  40.        
  41.         public var _chrArr:ByteArray;
  42.         public var _palArr:ByteArray;
  43.         private var _dragTimer:Timer;
  44.        
  45.         // these are being continually reset, too
  46.         /*private var _tile0:Number;
  47.         private var _tile1:Number;
  48.         private var _tile2:Number;
  49.         private var _tile3:Number;*/
  50.  
  51.         /* BIT MATH
  52.          0 + 0 = 0
  53.          1 + 0 = 1
  54.          0 + 1 = 2
  55.          1 + 1 = 3
  56.          
  57.          HAVE TO READ ONE BIT FROM EACH BIT PLANES AND USE ABOVE FORMULA
  58.          TO CALC THE VALUE
  59.          
  60.          TAKE FIRST ARRAY VALUE + OFFSET OVER BY 8 TO GET SECOND VALUE
  61.          ADD THESE TWO VALUES TOGETHER TO GET FINAL VAL
  62.          */
  63.        
  64.         public function CHREditor(w:Number,h:Number)
  65.         {
  66.             _w = w;
  67.             _h = h;
  68.            
  69.             _controller = Controller.getInstance();
  70.             _btnArr = new Array();
  71.             _colorIndexArr = [];
  72.            
  73.             _dragTimer = new Timer(10);
  74.             _dragTimer.addEventListener(TimerEvent.TIMER, _onDragTimer, false, 0, true);
  75.            
  76.             _palArr = new ByteArray();
  77.             _chrArr = new ByteArray();
  78.            
  79.             this.addEventListener(Event.ADDED_TO_STAGE, _onAddedToStage, false, 0, true);
  80.         }
  81.  
  82.         public function _onAddedToStage($e:Event):void
  83.         {
  84.             this.removeEventListener(Event.ADDED_TO_STAGE, _onAddedToStage);
  85.    
  86.             // DRAW GRIDS (BOTH NAM & CHR)
  87.             if(_controller.gridEnabled)
  88.             {
  89.                 _bmd = new BitmapData(_w,_h,false,Constants.CLR_00);
  90.                 _bg = new Bitmap(_bmd);
  91.                 this.addChild(_bg);
  92.                
  93.                 _lines = new Sprite();
  94.                 this.addChild(_lines);
  95.                 var c:int = 0;
  96.                 for(var i=0; i<_w+Constants.GUTTER_WIDTH; i+=Constants.GUTTER_WIDTH)
  97.                 {
  98.                     if(i <= _h)
  99.                     {
  100.                         // draw x-axis
  101.                         var x_axis:Sprite = new Sprite();
  102.                         var x_axis_g:Graphics = x_axis.graphics;
  103.                         x_axis_g.lineStyle(1, Constants.GRID_CLR, _controller.gridAlpha);
  104.                         x_axis_g.moveTo(0,i);
  105.                         x_axis_g.lineTo(_w,i);
  106.                         _lines.addChild(x_axis);
  107.                     }
  108.                    
  109.                     // draw y-axis
  110.                     var y_axis:Sprite = new Sprite();
  111.                     var y_axis_g:Graphics = y_axis.graphics;
  112.                     y_axis_g.lineStyle(1, Constants.GRID_CLR, _controller.gridAlpha);
  113.                     y_axis_g.moveTo(i,0);
  114.                     y_axis_g.lineTo(i,_h);
  115.                     _lines.addChild(y_axis);
  116.                    
  117.                     c++;
  118.                 }
  119.                
  120.                 var yy:Number = 0;
  121.                 var xx:Number = 0;
  122.                 for(var k=0; k<Math.pow(_w/Constants.BUTTON_DIMS,2); k++)
  123.                 {
  124.                     // place invisible buttons across grid
  125.                     if(yy < _h)
  126.                     {
  127.                         var btn:OutlineButton = new OutlineButton();
  128.                         btn.init(k.toString(),Constants.BUTTON_DIMS,Constants.BUTTON_DIMS);
  129.                        
  130.                         btn.addEventListener(MouseEvent.MOUSE_DOWN, _onMouseDown, false, 0, true);
  131.                         btn.addEventListener(MouseEvent.MOUSE_UP, _onMouseUp, false, 0, true);
  132.                        
  133.                         if ( (k*Constants.BUTTON_DIMS)%_w == 0 && k!=0 )
  134.                         {
  135.                             xx = 0;
  136.                             yy += Constants.BUTTON_DIMS;
  137.                            
  138.                             // keeps from rendering a widowed button tile on a line below the grid
  139.                             if(yy == _h) break;
  140.                         }
  141.                         btn.x = xx*Constants.BUTTON_DIMS;
  142.                         btn.y = yy;
  143.                         this.addChild(btn);
  144.                         _btnArr.push(btn);
  145.                        
  146.                         xx++;
  147.                     }
  148.                 }
  149.            
  150.                 var x_axis2:Sprite = new Sprite();
  151.                 var x_axis2_g:Graphics = x_axis2.graphics;
  152.                 x_axis2_g.lineStyle(1, Constants.GRID_CLR3, _controller.gridAlpha);
  153.                 x_axis2_g.moveTo(_h/2,0);
  154.                 x_axis2_g.lineTo(_h/2,_w);
  155.                 this.addChild(x_axis2);
  156.                
  157.                 var y_axis2:Sprite = new Sprite();
  158.                 var y_axis2_g:Graphics = y_axis2.graphics;
  159.                 y_axis2_g.lineStyle(1, Constants.GRID_CLR3, _controller.gridAlpha);
  160.                 y_axis2_g.moveTo(0,_w/2);
  161.                 y_axis2_g.lineTo(_h,_w/2);
  162.                 this.addChild(y_axis2);
  163.                
  164.                 _lines.alpha = Constants.ALPHA_SLIDER_DEFAULT/Constants.ALPHA_SLIDER_MAX_VAL;
  165.             }
  166.         }
  167.        
  168.         public function setLinesAlpha(a:Number):void
  169.         {
  170.             _lines.alpha = a;
  171.         }
  172.        
  173.         public function setChrBuffer(b:ByteArray):void
  174.         {
  175.             _chrArr = b;
  176.         }
  177.        
  178.         public function setPalBuffer(b:ByteArray):void
  179.         {
  180.             _palArr = b;
  181.         }
  182.        
  183.         public function updateEditor(paletteTileNum:Number, clr:String):void
  184.         {
  185.             _clr = clr; // this is the selected color byte
  186.             _paletteTileNum = paletteTileNum%4;
  187.            
  188.             loadEditor();
  189.         }
  190.        
  191.         public function loadEditor():void
  192.         {
  193.             //trace("loadEditor");
  194.             _controller.selectedTile1 = _controller.selectedTile + 1;
  195.             _controller.selectedTile2 = _controller.selectedTile + 16;
  196.             _controller.selectedTile3 = _controller.selectedTile + 17;
  197.             /*trace("_controller.selectedTile: " + _controller.selectedTile);
  198.             trace("_controller.selectedTile1: " + _controller.selectedTile1);
  199.             trace("_controller.selectedTile2: " + _controller.selectedTile2);
  200.             trace("_controller.selectedTile3: " + _controller.selectedTile3);*/
  201.             _selTileArr = [_controller.selectedTile, _controller.selectedTile1, _controller.selectedTile2, _controller.selectedTile3];
  202.            
  203.             _colorIndexArr = [];
  204.             _drawTile(0,0,_controller.selectedTile);
  205.             _drawTile(8,0,_controller.selectedTile1);
  206.             _drawTile(0,8,_controller.selectedTile2);
  207.             _drawTile(8,8,_controller.selectedTile3);
  208.         }
  209.        
  210.         private function _drawTile(xPos:Number, yPos:Number, tileNum:Number):void
  211.         {
  212.             tileNum <<= 4;
  213.             xPos <<= 4;
  214.             yPos <<= 4;
  215.            
  216.             _bmd.lock();
  217.             for(var i=tileNum; i<tileNum+8; i++)
  218.             {
  219.                 var b0 = 0; //first bitplane;
  220.                 var b1 = 0; // second bitplane;
  221.                 b0 = _chrArr[i];   // first plane
  222.                 b1 = _chrArr[i + 0x08];  // first plane + 8 bytes, stored in sequential, not interleaved format
  223.                
  224.                 for (var xx = 0; xx < 128; xx += 16)
  225.                 {
  226.                     var colorIndex:int = (((b0 & 0x80) >> 7) + ((b1 & 0x80) >> 6));
  227.                     _colorIndexArr.push(colorIndex);
  228.                     var n:int = colorIndex + (_controller.curAttr*4);
  229.                     var s:String = _palArr[n].toString(16).toUpperCase();
  230.                     if(s.length < 2) s = "0"+s;
  231.                     var clr:int = Constants["CLR_"+s];
  232.                    
  233.                     for(var j = 0; j < 16; j++)
  234.                     {
  235.                         for(var k = 0; k < 16; k++)
  236.                         {
  237.                             _bmd.setPixel(xPos + xx + k, yPos + j, clr);
  238.                         }
  239.                     }
  240.                        
  241.                     b0 <<= 1;
  242.                     b1 <<= 1;
  243.                 }
  244.                
  245.                 yPos += 16;
  246.             }
  247.             _bmd.unlock();     
  248.         }
  249.        
  250.         // Draw directly to the CHR buffer based on a point
  251.         // xLoc (0-127)
  252.         // yLoc (0-127)
  253.         // pClr   (0-3)
  254.         private function _drawCHRPixel(xLoc:int, yLoc:int, pClr:int):void
  255.         {
  256.             trace("xLoc = " + xLoc);
  257.             trace("yLoc = " + yLoc);
  258.             // Which byte in the array to start with, could have combined it with that up there ^
  259.             //var _startPoint:int = (_curTileNum*16) + (yLoc % 8); // % 8
  260.             var _startPoint:int = (_curTileNum*16) + (yLoc % 8); // % 8
  261.             var tempByte0:int = 0;
  262.             var tempByte1:int = 0;
  263.             var bitMask:int = 0;
  264.            
  265.             // Work out the bit based on pClr (0-3)
  266.             tempByte0 = pClr & 0x01;
  267.             // Test the second bit and align it
  268.             tempByte1 = (pClr & 0x02) >> 1;
  269.            
  270.             // Create the mask so we know which bit to operate on
  271.             // Since the bit is in the rightmost position (LSb)
  272.             // we need to do a little math on xLoc to figure out how much to shift left
  273.             bitMask = 1 << (7-(xLoc % 8));
  274.            
  275.             // These operation will force a bit to 0/1 based on the mask
  276.             // AND 0b11101111 forces bit to 0
  277.             // OR  0b00010000 forces bit to 1
  278.             if(tempByte0 == 0)
  279.             {
  280.                 _chrArr[(_startPoint)] &= (bitMask ^ 0xFF);
  281.             }
  282.             else
  283.             {
  284.                 _chrArr[(_startPoint)] |= bitMask;
  285.             }
  286.            
  287.             if(tempByte1 == 0)
  288.             {
  289.                 _chrArr[(_startPoint + 0x08)] &= (bitMask ^ 0xFF);
  290.             }
  291.             else
  292.             {
  293.                 _chrArr[(_startPoint + 0x08)] |= bitMask;
  294.             }
  295.            
  296.             //trace("xLoc:" + xLoc + " yLoc:" + yLoc + " pClr:" + pClr + " _tileNum:" + _tileNum + " _startPoint: " + _startPoint);
  297.         }
  298.        
  299.         private function _drawToEditor(xx:Number, yy:Number):void
  300.         {
  301.             // continually update pixels for show only
  302.             var clr:int = Constants["CLR_"+_clr];
  303.             _bmd.lock();
  304.             for(var j=0; j<256; j++)
  305.             {
  306.                 for(var i=0; i<256; i++)
  307.                 {
  308.                     _bmd.setPixel(xx + (i/Constants.BUTTON_DIMS), yy + (j/Constants.BUTTON_DIMS),clr);
  309.                 }
  310.             }
  311.             _bmd.unlock();
  312.         }
  313.        
  314.         private function _onDragTimer($e:TimerEvent):void
  315.         {
  316.             var xx:Number = Math.floor(mouseX/Constants.BUTTON_DIMS)*Constants.BUTTON_DIMS;
  317.             var yy:Number = Math.floor(mouseY/Constants.BUTTON_DIMS)*Constants.BUTTON_DIMS;
  318.            
  319.             _drawToEditor(xx, yy);
  320.             _curTileNum = _selTileArr[_getTileNum(xx, yy)];
  321.             _drawCHRPixel((xx/16) + (_curTileNum/16), (yy/16) + (_curTileNum/16), _paletteTileNum);
  322.         }
  323.        
  324.         private function _onMouseDown($e:MouseEvent):void
  325.         {
  326.             if(!_dragTimer.running)
  327.             {
  328.                 _dragTimer.start();
  329.             }
  330.         }
  331.        
  332.         private function _getTileNum(xx:Number,yy:Number):Number
  333.         {
  334.             var val = NaN;
  335.             if(xx >= 0 && xx < 128 && yy >= 0 && yy < 128)
  336.             {
  337.                 val = 0;
  338.             }
  339.             else if(xx >= 128 && xx <= 256 && yy >= 0 && yy < 128)
  340.             {
  341.                 val = 1;
  342.             }
  343.             else if(xx >= 0 && xx < 128 && yy >= 128 && yy <= 256)
  344.             {
  345.                 val = 2;
  346.             }
  347.             else if(xx >= 128 && xx <= 256 && yy >= 128 && yy <= 256)
  348.             {
  349.                 val = 3 ;
  350.             }
  351.             return val;
  352.         }
  353.        
  354.         private function _onMouseUp($e:MouseEvent):void
  355.         {
  356.             _dragTimer.stop();
  357.            
  358.             var btn:OutlineButton = $e.currentTarget as OutlineButton;
  359.             var xx:Number = btn.x;
  360.             var yy:Number = btn.y;
  361.            
  362.             _drawToEditor(xx, yy);
  363.             _getTileNum(xx, yy);
  364.             _curTileNum = _selTileArr[_getTileNum(xx, yy)];
  365.             _drawCHRPixel((xx/16) + (_curTileNum/16), (yy/16) + (_curTileNum/16), _paletteTileNum);
  366.            
  367.             dispatchEvent( new CustomEvent(CustomEvent.UPDATE_BUFFER, {val:_chrArr}) );
  368.         }
  369.        
  370.         public function destroy():void
  371.         {
  372.             this.removeChild(_bg);
  373.             _bg = null;
  374.             _controller = null;
  375.             this.removeChild(_lines);
  376.             while(_lines.numChildren > 0) _lines.removeChildAt(0);
  377.             _lines = null;
  378.             // clear btn arr
  379.         }
  380.     }
  381.  
  382. }
Add Comment
Please, Sign In to add comment