FORKED

wonderflで音楽♪SandStorm+うろおぼえVicViper from:from:なんとかディウス forked from: wonderflで音楽♪SandStorm+うろおぼえVicViper from:from:なんとかディウス [diff(1)]

  1. // forked from keim_at_Si's wonderflで音楽♪SandStorm+うろおぼえVicViper from:from:なんとかディウス
  2. // forked from gyuque's マルチポー forked from: ゲームっぽくしてみた
  3. // forked from ton's ゲームっぽくしてみたforked from: なんとかディウスっぽい背景
  4. // forked from gyuque's なんとかディウスっぽい背景
  5. // ゲームっぽくしてみた
  6. // 十字キーで移動
  7. // スペースキーで弾発射
  8. //   -> すいません..Shiftに変更させてもらいました.keim_at_Si
  9. // だれか当たり判定つけて><
  10. package
  11. {
  12.     import flash.display.*;
  13.     import flash.geom.*;
  14.     import flash.events.*;
  15.     import flash.ui.Keyboard;
  16.     import flash.media.Sound;
  17.     [SWF(width="320", height="240", backgroundColor="0x000000", frameRate="30")]  
  18.     public class Nemesis extends Sprite
  19.     {
  20.         public static const W:int = 320;
  21.         public static const H:int = 240;
  22.         
  23.         public static var KeyMapping:Object = {};
  24.         private var mScroll:int = 0;
  25.         private var mMyPos:Point;
  26.         private var mBGen:MountainGen = new MountainGen(160);
  27.         private var mTGen:MountainGen = new MountainGen(1601);
  28.         private var mBBGen:MountainGen = new MountainGen(1801true);
  29.         private var mBBGScreen:BitmapData = new BitmapData(W, H, true0);
  30.         private var mBBGScreenBmp:Bitmap;
  31.         private var mBBGScreenBmp2:Bitmap;
  32.         private var mBGScreen:BitmapData = new BitmapData(W, H, true0);
  33.         private var mBGScreenBmp:Bitmap;
  34.         private var mBGScreenBmp2:Bitmap;
  35.         private var mStarbg:StarBG = new StarBG(W, H, 30);
  36.         
  37.         private var ship:Ship = new Ship(0xffffff, true);
  38.         private var mKeyState:KeyState = new KeyState();
  39.         function Nemesis()
  40.         {
  41.             mapKey(Keyboard.UP, KeyState.K_UP);
  42.             mapKey(Keyboard.DOWN, KeyState.K_DOWN);
  43.             mapKey(Keyboard.LEFT,KeyState.K_LEFT);
  44.             mapKey(Keyboard.RIGHT, KeyState.K_RIGHT);
  45.             mapKey(Keyboard.SHIFT, KeyState.K_TRG1);
  46.             setupBG();
  47.             setupShip();
  48.             addEventListener(Event.ENTER_FRAME, tick);
  49.             stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);
  50.             stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUpHandler);
  51.             _initializeSound();
  52.         }
  53.         private function setupShip():void {
  54.             ship.x = 40;
  55.             ship.y = H / 2;
  56.             var m1:Ship = new Multiple();
  57.             ship.appendMultiple(m1);
  58.             var m2:Ship = new Multiple();
  59.             ship.appendMultiple(m2);
  60.             ship.fillMoveBuffer();           
  61.             addChild(m1);
  62.             addChild(m2);
  63.             addChild(ship);
  64.         }
  65.         private function setupBG():void {
  66.             addChild(mStarbg);
  67.             mBBGScreenBmp = new Bitmap(mBBGScreen);
  68.             addChild(mBBGScreenBmp);
  69.             mBBGScreenBmp2 = new Bitmap(mBBGScreen);
  70.             addChild(mBBGScreenBmp2);
  71.             mBGScreenBmp = new Bitmap(mBGScreen);
  72.             addChild(mBGScreenBmp);
  73.             mBGScreenBmp2 = new Bitmap(mBGScreen);
  74.             addChild(mBGScreenBmp2);
  75.             var i:int;
  76.             mBGen.step();
  77.             mTGen.step();
  78.             mBBGen.step();
  79.             for (i = 0;i < W;i++) {
  80.                 mBGen.step();
  81.                 mTGen.step();
  82.                 mBGen.draw(mBGScreen, i, 80);
  83.                 mTGen.draw(mBGScreen, i, 0false);
  84.                 mBBGen.step();
  85.                 mBBGen.draw(mBBGScreen, i, 60);
  86.             }
  87.         }
  88.         private static function mapKey(raw:uint, _to:uint):void {
  89.             KeyMapping[raw] = _to;   
  90.         }
  91.         
  92.         private var _clrrc:Rectangle = new Rectangle(001, H);
  93.         private function tick(e:Event):void
  94.         {
  95.             var ox:int = mScroll % W;
  96.             var ox2:int = int(mScroll/2) % W;
  97.             _clrrc.x = ox;
  98.             mBGScreen.fillRect(_clrrc, 0);
  99.             mStarbg.tick();
  100.             mBGen.step();
  101.             mTGen.step();
  102.             mStarbg.draw();
  103.             mBGen.draw(mBGScreen, ox, 80);
  104.             mTGen.draw(mBGScreen, ox, 0false);
  105.             if ((mScroll%2)==1) {
  106.                 _clrrc.x = ox2;
  107.                 mBBGScreen.fillRect(_clrrc, 0);
  108.                 mBBGen.step();
  109.                 mBBGen.draw(mBBGScreen, ox2, 60);
  110.             }
  111.             mBGScreenBmp.x = -ox;
  112.             mBGScreenBmp2.x = W-ox;
  113.             mBBGScreenBmp.x = -ox2;
  114.             mBBGScreenBmp2.x = W-ox2;
  115.             ship.moveByKeyState(mKeyState.state);
  116.             ship.tick();
  117.             ship.draw();
  118.             mScroll++;
  119.         }
  120.         
  121.         private function onKeyDownHandler(e:KeyboardEvent):void {
  122.             if (KeyMapping.hasOwnProperty(e.keyCode))
  123.                 mKeyState.setState(KeyMapping[e.keyCode]);
  124.         }
  125.         private function onKeyUpHandler(e:KeyboardEvent):void {
  126.             if (KeyMapping.hasOwnProperty(e.keyCode))
  127.                 mKeyState.delState(KeyMapping[e.keyCode]);
  128.         }       
  129.     // Sound
  130.     //------------------------------------------------------------
  131.         private function _initializeSound() : void {
  132.             var A:String = "$v12@0s32w24o4l1[[4cr|crrc]cgfe[crcrrc]|[crcrrc]]v6<gggeeeccc>ggg";
  133.             A+="v12[8crcrrccrcrcc] [v12[3crcrcccccrcc]|v6<gggeeeccc>ggg] crcrcccccrcc [4crcr3]";
  134.             A+="[v12[5crcrrc]|[crcrrc]v8<ggeecc>]v8c<g>c<g>c<ggc>g<gc>g<ggec>gc";
  135.             var B:String = "$v14@3s32o0k4l3[14rc]l1[12c]";
  136.             B+="l3[14rc]rl1r[8c] [l3[6rc]|l1[12c]]rcrcl1[3r3ccc][6c] [l3[4rc]|[3rc]l1[6c]]l1[6c][3rc][12c]";
  137.             var C1:String = "@3o0l1@o0v8s4 [d21v12s32cccv8s4d24]";
  138.             var C2:String = "p6l2[8ee1e1e1eeee1]";
  139.             var C3:String = "p4@o0@3o0k8v3s1[8c12]v6s6l6k0[4d] d48d24d24";
  140.             var C4:String = "p4@i0@3o0k0v6s1r96l6s32[4c] r96";
  141.             var Cm:String = "$"+C1+"@2v10s4o6k123@o1"+C2+C3;
  142.             var Cc:String = "$"+"r96@0v3s20o5@i5"+C2+C4;
  143.             var D:String = "$l1[8g2gggggggg<d>g]";
  144.             D+="[16g2gg<d>g] <[c2[8c]gc>b2[8b]<f+>b|a2[8a]<e>a<[7d]c>b<c>ba<]<d+2[8d+]a+d+f2[8f]<c>f";
  145.             D+="g2gg>g<gf2ff>f<fe2ee>e<edc>b<c>ba";
  146.             D+="[g2[5g]<d>ggb<d>f+2[5f+]<d>f+f+a<d>e2[5e]beegb<c2cc>g<cd>a<d>a<cd>]";
  147.             var Dl:String = "@0v6s64o7k80@o1"+D;
  148.             var Dm:String = "@2v7s8o3@i1@o1"+D;
  149.             var Dc:String = "@0v6s16o4@i3"+D;
  150.             var E:String = "l1g9gb<dg12>a9a<cfa12>b9b<dgb12c9cfa<c12>>"
  151.             E+="l2[g6<d12|dc>b<c6g18>]c>b<c>a20<cd"
  152.             E+="e8f+gd8c>ba8g4l1gab<cdef+gab<cd>l2e8f+gd8f+4g8aa+aa+<c6>a+1<c1d24>>"
  153.             E+="l1g9gag<d8c2>b2g9gag<g6f+2d2>a2g9gag<d8c2>b2g8<l2egf+ga8"
  154.             var Ea:String="p5$@1v8s4o6k0"+E, Eb:String="p4$@2v12s2o5k2"+E, Ed:String="p2r2$@1v2s2o5"+E;
  155.             var F:String = "$@1p2v4s2o4 l12[g<g>f<f>]"
  156.             F+="v3s1l2[g18gab|f9l1v4s24fffv3s1f8l2ef]<c12> @2s16v8l1fa<c>a<cfcfafa<c"
  157.             F+="@1v4o4l12s1c>ba<dc>b<d+f v8s4l6gfed v4o4l12s1[gf+ec6d6]";
  158.             var G:String = "$@1p6v4s2o4 l12[b<b>a<a>]"
  159.             G+="v3s1l2[b18b<cd>|a9l1v4s24aaas1v3a8l2ga]<f12 @2k2s16v8l1fa<c>a<cfcfafa<c"
  160.             G+="@1v4o4l12s1gf+eagf+a+<c v8s4l6dc>ba v4o5l12s1[dd>bg6a6]";
  161.             var H:String = "$@1p4v4s2o5 l12[d<d>c<c>] r96 s1edcdedd+f v8s8l6gfed v4o5l12s1[bage6f+6]"
  162.             var I:String = "$@1v2s32o7 l1[[4gd>bgb<d]|[4fc>afa<c]][fc>afa<c]fdecd>b<c>abgaf"
  163.             I+="o6s0[[4gbg<d>b<c>][4faf<c>ab]]";
  164.             I+="o7v4s32[[bgeceg][af+d>b<df+]|[gec>a<ce]>def+gab<cdef+ga][gd+>a+ga+<d+][afc>a<cf]";
  165.             I+="bgege>b<afcfc>a<ge>b<e>bg<f+d>a<d>af+"
  166.             I+="o6[[gb<d>ab<g>][a<df+>a<da>][b<eg>b<gb>]<cegcg<c>df+ada<d>>]";
  167.             _module = new TinySiOPM(20481024, _onSoundFrame);
  168.             _sequencer = new Sequencer(5, [A,B,Cm,Cc,Dl,Dm,Dc,Ea,Eb,Ed,F,G,H,I]);
  169.             _sound = new Sound();
  170.             _sound.addEventListener("sampleData", _onStream);
  171.             _sound.play();
  172.         }
  173.         
  174.         private function _onSoundFrame() : void {
  175.             if (_sequencer.onSoundFrame()) {
  176.             }
  177.         }
  178.         
  179.         private function _onStream(e:SampleDataEvent) : void {
  180.             var moduleOut:Vector.<Number> = _module.render();
  181.             for (var i:int = 0; i<4096; i++) {
  182.                 e.data.writeFloat(moduleOut[i]);
  183.             }
  184.         }
  185.     }
  186. }
  187. import flash.display.*;
  188. import flash.events.Event;
  189. import flash.geom.Point;
  190. import flash.media.Sound;
  191. var _sound:Sound;
  192. var _module:TinySiOPM;
  193. var _sequencer:Sequencer;
  194. class KeyState
  195. {
  196.     public static const K_UP:uint    = 0x01;
  197.     public static const K_DOWN:uint  = 0x02;
  198.     public static const K_LEFT:uint  = 0x04;
  199.     public static const K_RIGHT:uint = 0x08;
  200.     public static const K_TRG1:uint  = 0x10;
  201.     public static const K_TRG2:uint  = 0x20;
  202.     private var mState:uint = 0;
  203.     public function setState(s:uint):void {
  204.         mState |= s;
  205.     }
  206.     public function delState(s:uint):void {
  207.         mState &= ~s;
  208.     }
  209.     public function get state():uint {
  210.         return mState;
  211.     }
  212. }
  213. class Ship extends Sprite
  214. {
  215.     private var speed:int = 4;
  216.     protected var mCount:int = 0;
  217.     private var mMovBuf:PositionRingBuffer;
  218.     private var mMultiples:Array;
  219.     private var _shotCount:int;
  220.     public var color:uint;
  221.     function Ship(color:uint, enable_buf:Boolean = false)
  222.     {
  223.         this.color = color;
  224.         draw();
  225.         _shotCount = 0;
  226.         if (enable_buf)
  227.             mMovBuf = new PositionRingBuffer(100);
  228.     }
  229.     public function fillMoveBuffer():void {
  230.         for (var i:int = 0;i < 100;i++)
  231.             mMovBuf.push(x, y, false);
  232.     }
  233.     public function appendMultiple(m:Ship):void
  234.     {
  235.         if (!mMultiples) mMultiples = [];
  236.         mMultiples.push(m);
  237.     }
  238.     public function draw():void
  239.     {
  240.         var g:Graphics = graphics;
  241.         g.clear();
  242. /*
  243.         g.lineStyle(0, color);
  244.         g.lineTo( -30, -10);
  245.         g.lineTo( -30, 10);
  246.         g.lineTo(0, 0);
  247.         g.endFill();
  248. */
  249.         g.beginFill(0xc0c0c0);
  250.         g.drawPath(Vector.<int>([1,2,2,2,2,2]),
  251.             Vector.<Number>([16,-2,-10,-4,-15,-3,-25,5,-20,5,-10,1]));
  252.         g.endFill();
  253.         g.beginFill(0x808080);
  254.         g.drawPath(Vector.<int>([1,2,2,2]),
  255.             Vector.<Number>([-15,-2,-15,2,-20,2,-20,-2]));
  256.         g.endFill();
  257.         g.beginFill(0x80a0f0);
  258.         g.drawPath(Vector.<int>([1,2,2,2]),
  259.             Vector.<Number>([-8,-4,-2,-3,5,0,-15,0]));
  260.         g.endFill();
  261.         g.beginFill(0xffffff);
  262.         g.drawPath(Vector.<int>([1,2,2,2]),
  263.             Vector.<Number>([-8,-1,-18,-7,-22,-7,-15,0]));
  264.         g.endFill();
  265.         g.beginFill(0xe0e0e0);
  266.         g.drawPath(Vector.<int>([1,2,2,2,2,2]),
  267.             Vector.<Number>([16,1,-10,-1,-15,0,-25,8,-20,8,-10,4]));
  268.         g.endFill();
  269.                 
  270.         if (mMultiples) {
  271.             for each(var m:Ship in mMultiples)
  272.                 m.draw();
  273.         }
  274.     }
  275.     public function moveByKeyState(s:uint):void
  276.     {
  277.              if (s&KeyState.K_UP)    y -= speed;
  278.         else if (s&KeyState.K_DOWN)  y += speed;
  279.              if (s&KeyState.K_LEFT)  x -= speed;
  280.         else if (s&KeyState.K_RIGHT) x += speed;
  281.         if (s&KeyState.K_TRG1) 
  282.             fireShot();
  283.              if (x - width< 0) x = width;
  284.         else if (x > Nemesis.W) x = Nemesis.W;
  285.              if (y - height/2 < 0) y = height/2;
  286.         else if (y + height/2 > Nemesis.H) y = Nemesis.H - height/2
  287.         mMovBuf.push(x, y);
  288.     }
  289.     public function tick():void {
  290.         if (mMultiples) {
  291.             var len:int = mMultiples.length;
  292.             for (var i:int = 0;i < len;i++) {
  293.                 mMultiples[i].x = mMovBuf.getX((i+1)*8) - 10;
  294.                 mMultiples[i].y = mMovBuf.getY((i+1)*8);
  295.             }
  296.             for each(var m:Ship in mMultiples)
  297.                 m.tick();
  298.         }
  299.         mCount++;
  300.      }
  301.     public function fireShot():void {
  302.         if (!(mCount%5) && _shotCount<2) {
  303.             var bullet:Bullet = new Bullet(this);
  304.             bullet.x = x;
  305.             bullet.y = y;
  306.             parent.addChild(bullet);
  307.             _shotCount++;
  308.             if (mMultiples) // = if player...('A`)
  309.                 _module.noteOn(1440,0,0.5,11,64,-256);
  310.         }
  311.         if (mMultiples) {
  312.             for each(var m:Ship in mMultiples)
  313.                 m.fireShot();
  314.         }
  315.     }
  316.     public function onShotRemoved() : void {
  317.         _shotCount--;
  318.     }
  319. }
  320. class Multiple extends Ship
  321. {
  322.     import flash.geom.Matrix;
  323.     public static const GRAD_COLORS:Array = [0xffba33, 0xaa0000];
  324.     public static const GRAD_ALPHAS:Array = [11];
  325.     public static const GRAD_RATIOS:Array = [100255];
  326.     private var mGradTrans:Matrix = new Matrix();
  327.     function Multiple()
  328.     {
  329.         super(0);
  330.     }
  331.     public override function draw():void
  332.     {
  333.         var g:Graphics = graphics;
  334.         var r:Number = Math.sin(mCount*0.9)*0.7 + 9;
  335.         mGradTrans.createGradientBox(r*2, r*1.8,0 , -r*1.1, -r*0.9);
  336.         g.clear();
  337.         g.beginGradientFill(GradientType.RADIAL, GRAD_COLORS, GRAD_ALPHAS, GRAD_RATIOS, mGradTrans);
  338.         g.drawEllipse(-r, -r*0.8, r*2, r*1.6);
  339.         g.endFill();
  340.     }
  341. }
  342. class PositionRingBuffer
  343. {
  344.     private var xs:Array;
  345.     private var ys:Array;
  346.     private var length:uint;
  347.     private var pos:int = 0;
  348.     function PositionRingBuffer(len:uint)
  349.     {
  350.         length = len;
  351.         xs = new Array(len);
  352.         ys = new Array(len);
  353.     }
  354.     public function push(x:int, y:int, chk:Boolean = true):void {
  355.         var i:int = (pos + length - 1) % length;
  356.         if (chk) {
  357.             if (xs[i] == x && ys[i] == y) return;
  358.         }
  359.         xs[pos] = x;
  360.         ys[pos] = y;
  361.         pos = ++pos % length;
  362.     }
  363.     public function getX(i:int):int {
  364.         i = (pos - i + length) % length;
  365.         return xs[i];
  366.     }
  367.     public function getY(i:int):int {
  368.         i = (pos - i + length) % length;
  369.         return ys[i];
  370.     }
  371. }
  372. class Bullet extends Sprite
  373. {
  374.     public var color:uint;
  375.     public var size:uint;
  376.     public var speed:uint;
  377.     private var _ship:Ship;
  378.     function Bullet(ship:Ship, color:uint = 0xeeddaa, size:uint = 3, speed:uint = 20)
  379.     {
  380.         this._ship = ship;
  381.         this.color = color;
  382.         this.size = size;
  383.         this.speed = speed;
  384.         
  385.         this.graphics.beginFill(color);
  386.         this.graphics.drawEllipse(-size, -size/2, size*1.8, size);
  387.         this.graphics.drawCircle(-size*1.30, size/2);
  388.         this.graphics.drawCircle(-size*1.80, size/3);
  389.         this.graphics.endFill();
  390.         
  391.         addEventListener(Event.ENTER_FRAME, updateHandler);
  392.     }
  393.     
  394.     private function updateHandler(e:Event):void 
  395.     {
  396.         this.x += speed;
  397.         
  398.         if (this.x + size / 2 > Nemesis.W) {
  399.             this.parent.removeChild(this);
  400.             removeEventListener(Event.ENTER_FRAME, updateHandler);
  401.             _ship.onShotRemoved();
  402.         }
  403.     }
  404. }
  405. class MountainGen
  406. {
  407.     private var mPrevBuffer:Array;
  408.     private var mHeight:int;
  409.     private var mCount:int = 0;
  410.     private var tmpBuffer:Array;
  411.     private var mGenFunc:Function;
  412.     private var mDark:Boolean;
  413.     
  414.     function MountainGen(h:int, generator:int = 0, dark:Boolean = false)
  415.     {
  416.                 mDark = dark;
  417.         mHeight = h;
  418.         mGenFunc = generator ? genWav2 : genWav;
  419.         mPrevBuffer = new Array(h);
  420.         tmpBuffer   = new Array(h);
  421.     }
  422.     public function draw(b:BitmapData, x:int, y:int, rev:Boolean = true):void
  423.     {
  424.         var i:int;
  425.         for (i = 0;i < mHeight;i++) {
  426.             if (tmpBuffer[i]) {
  427.                 var c:int = tmpBuffer[i];
  428.                 b.setPixel32(x, rev ? (y+mHeight-i) : (y+i), makeColor(c));
  429.             }
  430.         }
  431.     }
  432.     private function makeColor(c:int):uint
  433.     {
  434.         if (mDark)
  435.             return 0xff000000 | (c/7+5) | ((c/7 + 80)<<16) | ((c/6+50) << 8);
  436.         return 0xff000000 | (c/3+11) | ((c/5 + 170)<<16) | ((c/2+60) << 8);
  437.     }
  438.     public function step():void
  439.     {
  440.         var t:Number = Number(mCount) * 0.02;
  441.         var h:int = mGenFunc(t) * mHeight;
  442.         var i:int, k:int, m:int;
  443.         for (i = 0;i < mHeight;i++) {
  444.             mPrevBuffer[i] = tmpBuffer[i];
  445.         }
  446.         
  447.         for (i = 0;i < mHeight;i++) {
  448.             tmpBuffer[i] = (i < h) ? (Math.random()*80 + 80) : 0;
  449.             if (tmpBuffer[i]) {
  450.                 if (mPrevBuffer[i])
  451.                     tmpBuffer[i] = (tmpBuffer[i] + mPrevBuffer[i]*7)/8;
  452.                 if (mPrevBuffer[i] == 0 || i == (h-1)) {
  453.                     m = 50;
  454.                     for (k = i;k >= 0 && m > 0;k--, m-=4) {
  455.                         if (m > 33) m--;
  456.                         tmpBuffer[k] += m;
  457.                         m += Math.random()*7;
  458.                     }
  459.                 }
  460.                 if (mPrevBuffer[i+1] && i == (h-1)) {
  461.                     m = -48;
  462.                     for (k = i;k >= 0 && m < 0;k--, m++) {
  463.                         tmpBuffer[k] += m;
  464.                         if (tmpBuffer[k]<1) tmpBuffer[k] = 1;
  465.                     }
  466.                 }
  467.            }
  468.         }
  469.        for (i = 0;i < mHeight;i++)
  470.             tmpBuffer[i] = (tmpBuffer[i] < 0) ? 0 : (tmpBuffer[i] > 255) ? 255 : tmpBuffer[i];
  471.         mCount++;
  472.     }
  473.     private static function genWav(t:Number, nest:int = 0):Number
  474.     {
  475.         var v:Number = Math.sin(t);
  476.         v += Math.sin(t*3) * 0.1;
  477.         v += Math.cos(0.1 + t*10) * 0.02;
  478.         v *= Math.sin(t*0.1);
  479.         if (nest < 5)
  480.             v += genWav2(t*2.01+nest)*0.5;
  481.         v = v*0.2 + 0.22;
  482.         return (v<0) ? 0 : (v>1) ? 1 : v;
  483.     }
  484.     private static function genWav2(t:Number, nest:int = 0):Number
  485.     {
  486.         var v:Number = Math.sin(t);
  487.         v += Math.cos(t*3) * 0.1;
  488.         v += Math.cos(0.1 + t*9) * 0.02;
  489.         v *= Math.cos(0.2 + t*0.15);
  490.         if (nest < 5)
  491.             v += genWav2(t*2.01+nest)*0.5;
  492.         v = v*0.2 + 0.23;
  493.         return (v<0) ? 0 : (v>1) ? 1 : v;
  494.     }
  495. }
  496. class StarBG extends Sprite
  497. {
  498.     private var mWidth:int;
  499.     private var mHeight:int;
  500.     private var mStars:Array;
  501.     private var mStarVs:Array;
  502.     private var mN:int;
  503.     function StarBG(w:int, h:int, n:int)
  504.     {
  505.         mWidth = w;
  506.         mHeight = h;
  507.         mN = n;
  508.         mStars  = new Array(n);
  509.         mStarVs = new Array(n);
  510.         for (var i:int = 0;i < n;i++) {
  511.             mStars[i] = new Point(int( Math.random()*w ), int( Math.random()*h ));
  512.             mStarVs[i] = Math.random() + 0.2;
  513.         }
  514.     }
  515.     public function tick():void
  516.     {
  517.         var n:int = mN;
  518.         for (var i:int = 0;i < n;i++) {
  519.             mStars[i].x -= Number(mStarVs[i]);
  520.             if (mStars[i].x < 0) {
  521.                 mStars[i].x += mWidth;
  522.                 mStars[i].y = int( Math.random()*mHeight );
  523.             }
  524.         }
  525.     }
  526.     public function draw():void
  527.     {
  528.         var g:Graphics = graphics;
  529.         var n:int = mN;
  530.         g.clear();
  531.         for (var i:int = 0;i < n;i++) {
  532.             g.beginFill(0xffffff);
  533.             g.drawCircle( mStars[i].x, mStars[i].y , 0.4);
  534.         }
  535.     }
  536. }
  537. // MML Sequencer
  538. //   http://wonderfl.kayac.com/user/keim_at_Si
  539. //--------------------------------------------------
  540. class Sequencer {
  541.     private var _tracks:Array, _count:int=Track.speed+1;
  542.     function Sequencer(speed:int, mmls:Array) { Track.speed=speed; mml=mmls; }
  543.     public function onSoundFrame() : Boolean {
  544.         if (++_count == Track.speed) {
  545.             for each (var tr:Track in _tracks) tr.execute();
  546.             _count = 0;
  547.             return true;
  548.         }
  549.         return false;
  550.     }
  551.     public function set mml(list:Array) : void {
  552.         _tracks = [];
  553.         for each (var seq:String in list) _tracks.push(new Track(seq));
  554.         _count = 0;
  555.     }
  556. }
  557. class Track {
  558.     static public var codeA:int="a".charCodeAt(), nt:Array=[9,11,0,2,4,5,7], speed:int=3;
  559.     public var oct:int, len:int, tl:int, dt:int, cnt:int, seq:String, sgn:int, stac:Array, osc:Osc;
  560.     private var _rex:RegExp=/(@i|@o|[a-gkloprsvw<>[|\]$@])([#+])?(\d+)?/g;
  561.     function Track(seq:String) {
  562.         osc = (new Osc()).reset().activate(false);
  563.         reset(seq);
  564.     }
  565.     public function reset(seq_:String) : void {
  566.         seq=seq_; oct=5; len=4; tl=256; dt=0; cnt=0; sgn=0; _rex.lastIndex=0; stac=[];
  567.     }
  568.     public function execute() : void {
  569.         if (--cnt <= 0) {
  570.             for (var i:int=0; i<100; i++) {
  571.                 var res:* = _rex.exec(seq);
  572.                 if (!res) {
  573.                     if (sgn) { _rex.lastIndex = sgn; continue; }
  574.                     else     { cnt = int.MAX_VALUE; break; }
  575.                 }
  576.                 var cmd:int = res[1].charCodeAt();
  577.                 if (cmd>=codeA && cmd<=codeA+6) {
  578.                     cnt = (res[3]) ? int(res[3]) : len;
  579.                     osc.len = cnt * speed;
  580.                     osc.pt = ((nt[cmd-codeA]+oct*12+((res[2])?1:0))<<4) + dt;
  581.                     osc.tl = tl;
  582.                     break;
  583.                 } else if (res[1] == 'r') {
  584.                     cnt = (res[3]) ? int(res[3]) : len;
  585.                     break;
  586.                 } else {
  587.                     switch(res[1]){
  588.                     case 'k': dt    = int(res[3]); break;
  589.                     case 'l': len = int(res[3]); break;
  590.                     case 'o': oct = int(res[3]); break;
  591.                     case 'v': tl    = TinySiOPM.log(int(res[3])*0.0625); break;
  592.                     case '<': oct++; break;
  593.                     case '>': oct--; break;
  594.                     case '@':  osc.ws = int(res[3]);    break;
  595.                     case 's':  osc.dr = int(res[3])<<2break;
  596.                     case 'w':  osc.sw = -int(res[3]);   break;
  597.                     case 'p':  osc.pan = (int(res[3])<<4)-64break;
  598.                     case '@i': osc.mod = int(res[3]);   break;
  599.                     case '@o': osc.out = int(res[3]);   break;
  600.                     case '$': sgn = _rex.lastIndex; break;
  601.                     case '[': stac.unshift({p:_rex.lastIndex,c:((res[3])?int(res[3]):2),j:0}); break;
  602.                     case '|'if (stac[0].c == 1) { _rex.lastIndex = stac[0].j; stac.shift(); } break;
  603.                     case ']'
  604.                         stac[0].j = _rex.lastIndex;
  605.                         if (--stac[0].c == 0) stac.shift();
  606.                         else _rex.lastIndex = stac[0].p;
  607.                         break;
  608.                     }
  609.                 }
  610.             }
  611.         }
  612.     }
  613. }
  614. class TinySiOPM {
  615.     private var _output:Vector.<Number>, _zero:Vector.<int>, _pipe:Vector.<int>;
  616.     private var _pitchTable:Vector.<int> = new Vector.<int>(2048true);
  617.     private var _logTable:Vector.<int> = new Vector.<int>(6144true);
  618.     private var _panTable:Vector.<Number> = new Vector.<Number>(129true);
  619.     private var _bufferSize:int, _callbackFrams:int, _onSoundFrame:Function;
  620.     
  621.     // Pass the buffer size and the function calls in each frame.
  622.     function TinySiOPM(bufferSize:int=2048, callbackFrams:int=1024, onSoundFrame:Function=null) {
  623.         var i:int, j:int, p:Number, v:Number, t:Vector.<int>, ft:Array=[0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0];
  624.         for (i=0, p=0; i<192; i++, p+=0.00520833333)                            // create pitchTable[128*16]
  625.             for(v=Math.pow(2, p)*12441.464342886, j=i; j<2048; v*=2, j+=192) _pitchTable[j] = int(v);
  626.         for (i=0; i<32; i++) _pitchTable[i] = (i+1)<<6;                         // [0:31] for white noize
  627.         for (i=0, p=0.0078125; i<256; i+=2, p+=0.0078125)                       // create logTable[12*256*2]
  628.             for(v=Math.pow(213-p), j=i; j<3328; v*=0.5, j+=256) _logTable[j+1] = -(_logTable[j]=int(v));
  629.         for (i=3328; i<6144; i++) _logTable[i] = 0;                             // [3328:6144] is 0-fill area
  630.         for (i=0, p=0; i<129; i++, p+=0.01217671571) _panTable[i]=Math.sin(p)*0.5;  // pan table;
  631.         for (t=Osc.createTable(10), i=0, p=0; i<1024; i++, p+=0.00613592315) t[i] = log(Math.sin(p)); // sin=0
  632.         for (t=Osc.createTable(10), i=0, p=0.75; i<1024; i++, p-=0.00146484375) t[i] = log(p);        // saw=1
  633.         for (t=Osc.createTable(5),    i=0; i<16; i++) t[i+16] = (t[i] = log(ft[i]*0.0625)) + 1;       // famtri=2
  634.         for (t=Osc.createTable(15), i=0; i<32768; i++) t[i] = log(Math.random()-0.5);                 // wnoize=3
  635.         for (i=0; i<8; i++) for (t=Osc.createTable(4), j=0; j<16; j++) t[j] = (j<=i) ? 192 : 193;     // pulse=4-11
  636.         _zero = new Vector.<int>(bufferSize, true);                             // allocate zero buffer
  637.         _pipe = new Vector.<int>(bufferSize, true);                             // allocate fm pipe buffer
  638.         _output = new Vector.<Number>(bufferSize*2true);                      // allocate stereo out
  639.         _bufferSize = bufferSize;
  640.         _callbackFrams = callbackFrams; 
  641.         _onSoundFrame = onSoundFrame;                                           // set parameters
  642.         for (i=0; i<bufferSize; i++) { _pipe[i]=_zero[i]=0; }                   // clear buffers
  643.     }
  644.     
  645.     // calculate index of logTable
  646.     static public function log(n:Number) : int {
  647.         return (n<0) ? ((n<-0.00390625) ? (((int(Math.log(-n) * -184.66496523 + 0.5) + 1) << 1) + 1) : 2047)
  648.                      : ((n> 0.00390625) ? (( int(Math.log( n) * -184.66496523 + 0.5) + 1) << 1)      : 2046);
  649.     }
  650.     
  651.     // Returns stereo output as Vector.<Number>(bufferSize*2).
  652.     public function render() : Vector.<Number> {
  653.         var i:int, j:int, ph:int, dph:int, mod:int, sh:int, tl:int, lout:int, v:int, imax:int
  654.             osc:Osc, tm:Osc, l:Number, r:Number, wv:Vector.<int>, fm:Vector.<int>, base:Vector.<int>, 
  655.             out:Vector.<int>=_pipe, lt:Vector.<int>=_logTable, stereoOut:Vector.<Number> = _output;
  656.         imax = _bufferSize<<1;
  657.         for (i=0; i<imax; i++) stereoOut[i] = 0;
  658.         for (imax=_callbackFrams; imax<=_bufferSize; imax+=_callbackFrams) {
  659.             if (_onSoundFrame!=null) _onSoundFrame();
  660.             tm = Osc._tm;
  661.             for (osc=tm.n; osc!=tm; osc=osc.update()) {
  662.                 dph=_pitchTable[osc.pt]; ph=osc.ph; mod=osc.mod+10; sh=osc.sh; tl=osc.tl; wv=osc.wv;
  663.                 fm=(osc.mod==0)?_zero:_pipe; base=(osc.out!=2)?_zero:_pipe;
  664.                 for (i = imax-_callbackFrams; i < imax; i++) {
  665.                     v = ((ph + (fm[i] << mod))& 0x3ffffff) >> sh;
  666.                     lout = wv[v] + tl;
  667.                     out[i] = lt[lout] + base[i];
  668.                     ph = (ph + dph) & 0x3ffffff;
  669.                 }
  670.                 osc.ph = ph;
  671.                 if (osc.out==0) {
  672.                     l = _panTable[64-osc.pan] * 0.0001220703125;
  673.                     r = _panTable[64+osc.pan] * 0.0001220703125;
  674.                     for (i=imax-_callbackFrams, j=i*2; i<imax; i++) {
  675.                         stereoOut[j] += out[i]*l; j++;
  676.                         stereoOut[j] += out[i]*r; j++;
  677.                     }
  678.                 }
  679.             }
  680.         }
  681.         return stereoOut;
  682.     }
  683.     
  684.     // note on
  685.     public function noteOn(pitch:int, length:int=0, vol:Number=0.5, wave:int=0, decay:int=6, sweep:int=0, pan:int=0) : Osc {
  686.         var osc:Osc = Osc.alloc().reset();
  687.         osc.pt = pitch;
  688.         osc.len = length;
  689.         osc.tl = log(vol);
  690.         osc.ws = wave;
  691.         osc.dr = decay<<2;
  692.         osc.sw = sweep; 
  693.         osc.pan = pan;
  694.         return osc.activate(true);
  695.     }
  696. }
  697. class Osc {
  698.     // create new wave table and you can refer the table by '@' command.
  699.     static public function createTable(b:int) : Vector.<int> {
  700.         _w.push(new Vector.<int>(1<<b,true)); _s.push(26-b);
  701.         return _w[_w.length-1];
  702.     }
  703.     static public var _w:Array=[], _s:Array=[], _fl:Osc=new Osc(), _tm:Osc=new Osc();
  704.     static public function alloc():Osc{ if(_fl.p==_fl)return new Osc();var r:Osc=_fl.p;_fl.p=r.p;r.p.n=_fl;return r; }
  705.     public function into(x:Osc):Osc{ p=x.p;n=x;p.n=this;n.p=this;return this; }
  706.     public var p:Osc, n:Osc, fl:Osc, pt:int, len:int, ph:int;
  707.     public var tl:int, sw:int, dr:int, wv:Vector.<int>, sh:int, mod:int, out:int, pan:int;
  708.     public function set ws(t:int) : void { wv=_w[t]; sh=_s[t]; }
  709.     public function Osc() { p = n = this; }
  710.     public function update() : Osc { tl+=dr; pt+=sw; pt&=2047return (--len==0||tl>3328) ? (inactivate().n) : n; }
  711.     public function reset() : Osc { ph=0; pt=0; len=0; tl=3328; sw=0; dr=24; pan=0; ws=0; mod=0; out=0return this; }
  712.     public function activate(autoFree:Boolean=false) : Osc { into(_tm); fl=(autoFree)?_fl:nullreturn this; }
  713.     public function inactivate() : Osc { tl=3328if(!fl)return thisvar r:Osc=p; p.n=n; n.p=p; into(fl); return r; }
  714.     public function isActive() : Boolean { return (tl<3328); }
  715. }
noswf

wonderflで音楽♪SandStorm+うろおぼえVicViper from:from:なんとかディウス forked from: wonderflで音楽♪SandStorm+うろおぼえVicViper from:from:なんとかディウス [diff(1)]

  1. // forked from keim_at_Si's wonderflで音楽♪SandStorm+うろおぼえVicViper from:from:なんとかディウス
  2. // forked from gyuque's マルチポー forked from: ゲームっぽくしてみた
  3. // forked from ton's ゲームっぽくしてみたforked from: なんとかディウスっぽい背景
  4. // forked from gyuque's なんとかディウスっぽい背景
  5. // ゲームっぽくしてみた
  6. // 十字キーで移動
  7. // スペースキーで弾発射
  8. //   -> すいません..Shiftに変更させてもらいました.keim_at_Si
  9. // だれか当たり判定つけて><
  10. package
  11. {
  12.     import flash.display.*;
  13.     import flash.geom.*;
  14.     import flash.events.*;
  15.     import flash.ui.Keyboard;
  16.     import flash.media.Sound;
  17.     [SWF(width="320", height="240", backgroundColor="0x000000", frameRate="30")]  
  18.     public class Nemesis extends Sprite
  19.     {
  20.         public static const W:int = 320;
  21.         public static const H:int = 240;
  22.         
  23.         public static var KeyMapping:Object = {};
  24.         private var mScroll:int = 0;
  25.         private var mMyPos:Point;
  26.         private var mBGen:MountainGen = new MountainGen(160);
  27.         private var mTGen:MountainGen = new MountainGen(1601);
  28.         private var mBBGen:MountainGen = new MountainGen(1801true);
  29.         private var mBBGScreen:BitmapData = new BitmapData(W, H, true0);
  30.         private var mBBGScreenBmp:Bitmap;
  31.         private var mBBGScreenBmp2:Bitmap;
  32.         private var mBGScreen:BitmapData = new BitmapData(W, H, true0);
  33.         private var mBGScreenBmp:Bitmap;
  34.         private var mBGScreenBmp2:Bitmap;
  35.         private var mStarbg:StarBG = new StarBG(W, H, 30);
  36.         
  37.         private var ship:Ship = new Ship(0xffffff, true);
  38.         private var mKeyState:KeyState = new KeyState();
  39.         function Nemesis()
  40.         {
  41.             mapKey(Keyboard.UP, KeyState.K_UP);
  42.             mapKey(Keyboard.DOWN, KeyState.K_DOWN);
  43.             mapKey(Keyboard.LEFT,KeyState.K_LEFT);
  44.             mapKey(Keyboard.RIGHT, KeyState.K_RIGHT);
  45.             mapKey(Keyboard.SHIFT, KeyState.K_TRG1);
  46.             setupBG();
  47.             setupShip();
  48.             addEventListener(Event.ENTER_FRAME, tick);
  49.             stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);
  50.             stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUpHandler);
  51.             _initializeSound();
  52.         }
  53.         private function setupShip():void {
  54.             ship.x = 40;
  55.             ship.y = H / 2;
  56.             var m1:Ship = new Multiple();
  57.             ship.appendMultiple(m1);
  58.             var m2:Ship = new Multiple();
  59.             ship.appendMultiple(m2);
  60.             ship.fillMoveBuffer();           
  61.             addChild(m1);
  62.             addChild(m2);
  63.             addChild(ship);
  64.         }
  65.         private function setupBG():void {
  66.             addChild(mStarbg);
  67.             mBBGScreenBmp = new Bitmap(mBBGScreen);
  68.             addChild(mBBGScreenBmp);
  69.             mBBGScreenBmp2 = new Bitmap(mBBGScreen);
  70.             addChild(mBBGScreenBmp2);
  71.             mBGScreenBmp = new Bitmap(mBGScreen);
  72.             addChild(mBGScreenBmp);
  73.             mBGScreenBmp2 = new Bitmap(mBGScreen);
  74.             addChild(mBGScreenBmp2);
  75.             var i:int;
  76.             mBGen.step();
  77.             mTGen.step();
  78.             mBBGen.step();
  79.             for (i = 0;i < W;i++) {
  80.                 mBGen.step();
  81.                 mTGen.step();
  82.                 mBGen.draw(mBGScreen, i, 80);
  83.                 mTGen.draw(mBGScreen, i, 0false);
  84.                 mBBGen.step();
  85.                 mBBGen.draw(mBBGScreen, i, 60);
  86.             }
  87.         }
  88.         private static function mapKey(raw:uint, _to:uint):void {
  89.             KeyMapping[raw] = _to;   
  90.         }
  91.         
  92.         private var _clrrc:Rectangle = new Rectangle(001, H);
  93.         private function tick(e:Event):void
  94.         {
  95.             var ox:int = mScroll % W;
  96.             var ox2:int = int(mScroll/2) % W;
  97.             _clrrc.x = ox;
  98.             mBGScreen.fillRect(_clrrc, 0);
  99.             mStarbg.tick();
  100.             mBGen.step();
  101.             mTGen.step();
  102.             mStarbg.draw();
  103.             mBGen.draw(mBGScreen, ox, 80);
  104.             mTGen.draw(mBGScreen, ox, 0false);
  105.             if ((mScroll%2)==1) {
  106.                 _clrrc.x = ox2;
  107.                 mBBGScreen.fillRect(_clrrc, 0);
  108.                 mBBGen.step();
  109.                 mBBGen.draw(mBBGScreen, ox2, 60);
  110.             }
  111.             mBGScreenBmp.x = -ox;
  112.             mBGScreenBmp2.x = W-ox;
  113.             mBBGScreenBmp.x = -ox2;
  114.             mBBGScreenBmp2.x = W-ox2;
  115.             ship.moveByKeyState(mKeyState.state);
  116.             ship.tick();
  117.             ship.draw();
  118.             mScroll++;
  119.         }
  120.         
  121.         private function onKeyDownHandler(e:KeyboardEvent):void {
  122.             if (KeyMapping.hasOwnProperty(e.keyCode))
  123.                 mKeyState.setState(KeyMapping[e.keyCode]);
  124.         }
  125.         private function onKeyUpHandler(e:KeyboardEvent):void {
  126.             if (KeyMapping.hasOwnProperty(e.keyCode))
  127.                 mKeyState.delState(KeyMapping[e.keyCode]);
  128.         }       
  129.     // Sound
  130.     //------------------------------------------------------------
  131.         private function _initializeSound() : void {
  132.             var A:String = "$v12@0s32w24o4l1[[4cr|crrc]cgfe[crcrrc]|[crcrrc]]v6<gggeeeccc>ggg";
  133.             A+="v12[8crcrrccrcrcc] [v12[3crcrcccccrcc]|v6<gggeeeccc>ggg] crcrcccccrcc [4crcr3]";
  134.             A+="[v12[5crcrrc]|[crcrrc]v8<ggeecc>]v8c<g>c<g>c<ggc>g<gc>g<ggec>gc";
  135.             var B:String = "$v14@3s32o0k4l3[14rc]l1[12c]";
  136.             B+="l3[14rc]rl1r[8c] [l3[6rc]|l1[12c]]rcrcl1[3r3ccc][6c] [l3[4rc]|[3rc]l1[6c]]l1[6c][3rc][12c]";
  137.             var C1:String = "@3o0l1@o0v8s4 [d21v12s32cccv8s4d24]";
  138.             var C2:String = "p6l2[8ee1e1e1eeee1]";
  139.             var C3:String = "p4@o0@3o0k8v3s1[8c12]v6s6l6k0[4d] d48d24d24";
  140.             var C4:String = "p4@i0@3o0k0v6s1r96l6s32[4c] r96";
  141.             var Cm:String = "$"+C1+"@2v10s4o6k123@o1"+C2+C3;
  142.             var Cc:String = "$"+"r96@0v3s20o5@i5"+C2+C4;
  143.             var D:String = "$l1[8g2gggggggg<d>g]";
  144.             D+="[16g2gg<d>g] <[c2[8c]gc>b2[8b]<f+>b|a2[8a]<e>a<[7d]c>b<c>ba<]<d+2[8d+]a+d+f2[8f]<c>f";
  145.             D+="g2gg>g<gf2ff>f<fe2ee>e<edc>b<c>ba";
  146.             D+="[g2[5g]<d>ggb<d>f+2[5f+]<d>f+f+a<d>e2[5e]beegb<c2cc>g<cd>a<d>a<cd>]";
  147.             var Dl:String = "@0v6s64o7k80@o1"+D;
  148.             var Dm:String = "@2v7s8o3@i1@o1"+D;
  149.             var Dc:String = "@0v6s16o4@i3"+D;
  150.             var E:String = "l1g9gb<dg12>a9a<cfa12>b9b<dgb12c9cfa<c12>>"
  151.             E+="l2[g6<d12|dc>b<c6g18>]c>b<c>a20<cd"
  152.             E+="e8f+gd8c>ba8g4l1gab<cdef+gab<cd>l2e8f+gd8f+4g8aa+aa+<c6>a+1<c1d24>>"
  153.             E+="l1g9gag<d8c2>b2g9gag<g6f+2d2>a2g9gag<d8c2>b2g8<l2egf+ga8"
  154.             var Ea:String="p5$@1v8s4o6k0"+E, Eb:String="p4$@2v12s2o5k2"+E, Ed:String="p2r2$@1v2s2o5"+E;
  155.             var F:String = "$@1p2v4s2o4 l12[g<g>f<f>]"
  156.             F+="v3s1l2[g18gab|f9l1v4s24fffv3s1f8l2ef]<c12> @2s16v8l1fa<c>a<cfcfafa<c"
  157.             F+="@1v4o4l12s1c>ba<dc>b<d+f v8s4l6gfed v4o4l12s1[gf+ec6d6]";
  158.             var G:String = "$@1p6v4s2o4 l12[b<b>a<a>]"
  159.             G+="v3s1l2[b18b<cd>|a9l1v4s24aaas1v3a8l2ga]<f12 @2k2s16v8l1fa<c>a<cfcfafa<c"
  160.             G+="@1v4o4l12s1gf+eagf+a+<c v8s4l6dc>ba v4o5l12s1[dd>bg6a6]";
  161.             var H:String = "$@1p4v4s2o5 l12[d<d>c<c>] r96 s1edcdedd+f v8s8l6gfed v4o5l12s1[bage6f+6]"
  162.             var I:String = "$@1v2s32o7 l1[[4gd>bgb<d]|[4fc>afa<c]][fc>afa<c]fdecd>b<c>abgaf"
  163.             I+="o6s0[[4gbg<d>b<c>][4faf<c>ab]]";
  164.             I+="o7v4s32[[bgeceg][af+d>b<df+]|[gec>a<ce]>def+gab<cdef+ga][gd+>a+ga+<d+][afc>a<cf]";
  165.             I+="bgege>b<afcfc>a<ge>b<e>bg<f+d>a<d>af+"
  166.             I+="o6[[gb<d>ab<g>][a<df+>a<da>][b<eg>b<gb>]<cegcg<c>df+ada<d>>]";
  167.             _module = new TinySiOPM(20481024, _onSoundFrame);
  168.             _sequencer = new Sequencer(5, [A,B,Cm,Cc,Dl,Dm,Dc,Ea,Eb,Ed,F,G,H,I]);
  169.             _sound = new Sound();
  170.             _sound.addEventListener("sampleData", _onStream);
  171.             _sound.play();
  172.         }
  173.         
  174.         private function _onSoundFrame() : void {
  175.             if (_sequencer.onSoundFrame()) {
  176.             }
  177.         }
  178.         
  179.         private function _onStream(e:SampleDataEvent) : void {
  180.             var moduleOut:Vector.<Number> = _module.render();
  181.             for (var i:int = 0; i<4096; i++) {
  182.                 e.data.writeFloat(moduleOut[i]);
  183.             }
  184.         }
  185.     }
  186. }
  187. import flash.display.*;
  188. import flash.events.Event;
  189. import flash.geom.Point;
  190. import flash.media.Sound;
  191. var _sound:Sound;
  192. var _module:TinySiOPM;
  193. var _sequencer:Sequencer;
  194. class KeyState
  195. {
  196.     public static const K_UP:uint    = 0x01;
  197.     public static const K_DOWN:uint  = 0x02;
  198.     public static const K_LEFT:uint  = 0x04;
  199.     public static const K_RIGHT:uint = 0x08;
  200.     public static const K_TRG1:uint  = 0x10;
  201.     public static const K_TRG2:uint  = 0x20;
  202.     private var mState:uint = 0;
  203.     public function setState(s:uint):void {
  204.         mState |= s;
  205.     }
  206.     public function delState(s:uint):void {
  207.         mState &= ~s;
  208.     }
  209.     public function get state():uint {
  210.         return mState;
  211.     }
  212. }
  213. class Ship extends Sprite
  214. {
  215.     private var speed:int = 4;
  216.     protected var mCount:int = 0;
  217.     private var mMovBuf:PositionRingBuffer;
  218.     private var mMultiples:Array;
  219.     private var _shotCount:int;
  220.     public var color:uint;
  221.     function Ship(color:uint, enable_buf:Boolean = false)
  222.     {
  223.         this.color = color;
  224.         draw();
  225.         _shotCount = 0;
  226.         if (enable_buf)
  227.             mMovBuf = new PositionRingBuffer(100);
  228.     }
  229.     public function fillMoveBuffer():void {
  230.         for (var i:int = 0;i < 100;i++)
  231.             mMovBuf.push(x, y, false);
  232.     }
  233.     public function appendMultiple(m:Ship):void
  234.     {
  235.         if (!mMultiples) mMultiples = [];
  236.         mMultiples.push(m);
  237.     }
  238.     public function draw():void
  239.     {
  240.         var g:Graphics = graphics;
  241.         g.clear();
  242. /*
  243.         g.lineStyle(0, color);
  244.         g.lineTo( -30, -10);
  245.         g.lineTo( -30, 10);
  246.         g.lineTo(0, 0);
  247.         g.endFill();
  248. */
  249.         g.beginFill(0xc0c0c0);
  250.         g.drawPath(Vector.<int>([1,2,2,2,2,2]),
  251.             Vector.<Number>([16,-2,-10,-4,-15,-3,-25,5,-20,5,-10,1]));
  252.         g.endFill();
  253.         g.beginFill(0x808080);
  254.         g.drawPath(Vector.<int>([1,2,2,2]),
  255.             Vector.<Number>([-15,-2,-15,2,-20,2,-20,-2]));
  256.         g.endFill();
  257.         g.beginFill(0x80a0f0);
  258.         g.drawPath(Vector.<int>([1,2,2,2]),
  259.             Vector.<Number>([-8,-4,-2,-3,5,0,-15,0]));
  260.         g.endFill();
  261.         g.beginFill(0xffffff);
  262.         g.drawPath(Vector.<int>([1,2,2,2]),
  263.             Vector.<Number>([-8,-1,-18,-7,-22,-7,-15,0]));
  264.         g.endFill();
  265.         g.beginFill(0xe0e0e0);
  266.         g.drawPath(Vector.<int>([1,2,2,2,2,2]),
  267.             Vector.<Number>([16,1,-10,-1,-15,0,-25,8,-20,8,-10,4]));
  268.         g.endFill();
  269.                 
  270.         if (mMultiples) {
  271.             for each(var m:Ship in mMultiples)
  272.                 m.draw();
  273.         }
  274.     }
  275.     public function moveByKeyState(s:uint):void
  276.     {
  277.              if (s&KeyState.K_UP)    y -= speed;
  278.         else if (s&KeyState.K_DOWN)  y += speed;
  279.              if (s&KeyState.K_LEFT)  x -= speed;
  280.         else if (s&KeyState.K_RIGHT) x += speed;
  281.         if (s&KeyState.K_TRG1) 
  282.             fireShot();
  283.              if (x - width< 0) x = width;
  284.         else if (x > Nemesis.W) x = Nemesis.W;
  285.              if (y - height/2 < 0) y = height/2;
  286.         else if (y + height/2 > Nemesis.H) y = Nemesis.H - height/2
  287.         mMovBuf.push(x, y);
  288.     }
  289.     public function tick():void {
  290.         if (mMultiples) {
  291.             var len:int = mMultiples.length;
  292.             for (var i:int = 0;i < len;i++) {
  293.                 mMultiples[i].x = mMovBuf.getX((i+1)*8) - 10;
  294.                 mMultiples[i].y = mMovBuf.getY((i+1)*8);
  295.             }
  296.             for each(var m:Ship in mMultiples)
  297.                 m.tick();
  298.         }
  299.         mCount++;
  300.      }
  301.     public function fireShot():void {
  302.         if (!(mCount%5) && _shotCount<2) {
  303.             var bullet:Bullet = new Bullet(this);
  304.             bullet.x = x;
  305.             bullet.y = y;
  306.             parent.addChild(bullet);
  307.             _shotCount++;
  308.             if (mMultiples) // = if player...('A`)
  309.                 _module.noteOn(1440,0,0.5,11,64,-256);
  310.         }
  311.         if (mMultiples) {
  312.             for each(var m:Ship in mMultiples)
  313.                 m.fireShot();
  314.         }
  315.     }
  316.     public function onShotRemoved() : void {
  317.         _shotCount--;
  318.     }
  319. }
  320. class Multiple extends Ship
  321. {
  322.     import flash.geom.Matrix;
  323.     public static const GRAD_COLORS:Array = [0xffba33, 0xaa0000];
  324.     public static const GRAD_ALPHAS:Array = [11];
  325.     public static const GRAD_RATIOS:Array = [100255];
  326.     private var mGradTrans:Matrix = new Matrix();
  327.     function Multiple()
  328.     {
  329.         super(0);
  330.     }
  331.     public override function draw():void
  332.     {
  333.         var g:Graphics = graphics;
  334.         var r:Number = Math.sin(mCount*0.9)*0.7 + 9;
  335.         mGradTrans.createGradientBox(r*2, r*1.8,0 , -r*1.1, -r*0.9);
  336.         g.clear();
  337.         g.beginGradientFill(GradientType.RADIAL, GRAD_COLORS, GRAD_ALPHAS, GRAD_RATIOS, mGradTrans);
  338.         g.drawEllipse(-r, -r*0.8, r*2, r*1.6);
  339.         g.endFill();
  340.     }
  341. }
  342. class PositionRingBuffer
  343. {
  344.     private var xs:Array;
  345.     private var ys:Array;
  346.     private var length:uint;
  347.     private var pos:int = 0;
  348.     function PositionRingBuffer(len:uint)
  349.     {
  350.         length = len;
  351.         xs = new Array(len);
  352.         ys = new Array(len);
  353.     }
  354.     public function push(x:int, y:int, chk:Boolean = true):void {
  355.         var i:int = (pos + length - 1) % length;
  356.         if (chk) {
  357.             if (xs[i] == x && ys[i] == y) return;
  358.         }
  359.         xs[pos] = x;
  360.         ys[pos] = y;
  361.         pos = ++pos % length;
  362.     }
  363.     public function getX(i:int):int {
  364.         i = (pos - i + length) % length;
  365.         return xs[i];
  366.     }
  367.     public function getY(i:int):int {
  368.         i = (pos - i + length) % length;
  369.         return ys[i];
  370.     }
  371. }
  372. class Bullet extends Sprite
  373. {
  374.     public var color:uint;
  375.     public var size:uint;
  376.     public var speed:uint;
  377.     private var _ship:Ship;
  378.     function Bullet(ship:Ship, color:uint = 0xeeddaa, size:uint = 3, speed:uint = 20)
  379.     {
  380.         this._ship = ship;
  381.         this.color = color;
  382.         this.size = size;
  383.         this.speed = speed;
  384.         
  385.         this.graphics.beginFill(color);
  386.         this.graphics.drawEllipse(-size, -size/2, size*1.8, size);
  387.         this.graphics.drawCircle(-size*1.30, size/2);
  388.         this.graphics.drawCircle(-size*1.80, size/3);
  389.         this.graphics.endFill();
  390.         
  391.         addEventListener(Event.ENTER_FRAME, updateHandler);
  392.     }
  393.     
  394.     private function updateHandler(e:Event):void 
  395.     {
  396.         this.x += speed;
  397.         
  398.         if (this.x + size / 2 > Nemesis.W) {
  399.             this.parent.removeChild(this);
  400.             removeEventListener(Event.ENTER_FRAME, updateHandler);
  401.             _ship.onShotRemoved();
  402.         }
  403.     }
  404. }
  405. class MountainGen
  406. {
  407.     private var mPrevBuffer:Array;
  408.     private var mHeight:int;
  409.     private var mCount:int = 0;
  410.     private var tmpBuffer:Array;
  411.     private var mGenFunc:Function;
  412.     private var mDark:Boolean;
  413.     
  414.     function MountainGen(h:int, generator:int = 0, dark:Boolean = false)
  415.     {
  416.                 mDark = dark;
  417.         mHeight = h;
  418.         mGenFunc = generator ? genWav2 : genWav;
  419.         mPrevBuffer = new Array(h);
  420.         tmpBuffer   = new Array(h);
  421.     }
  422.     public function draw(b:BitmapData, x:int, y:int, rev:Boolean = true):void
  423.     {
  424.         var i:int;
  425.         for (i = 0;i < mHeight;i++) {
  426.             if (tmpBuffer[i]) {
  427.                 var c:int = tmpBuffer[i];
  428.                 b.setPixel32(x, rev ? (y+mHeight-i) : (y+i), makeColor(c));
  429.             }
  430.         }
  431.     }
  432.     private function makeColor(c:int):uint
  433.     {
  434.         if (mDark)
  435.             return 0xff000000 | (c/7+5) | ((c/7 + 80)<<16) | ((c/6+50) << 8);
  436.         return 0xff000000 | (c/3+11) | ((c/5 + 170)<<16) | ((c/2+60) << 8);
  437.     }
  438.     public function step():void
  439.     {
  440.         var t:Number = Number(mCount) * 0.02;
  441.         var h:int = mGenFunc(t) * mHeight;
  442.         var i:int, k:int, m:int;
  443.         for (i = 0;i < mHeight;i++) {
  444.             mPrevBuffer[i] = tmpBuffer[i];
  445.         }
  446.         
  447.         for (i = 0;i < mHeight;i++) {
  448.             tmpBuffer[i] = (i < h) ? (Math.random()*80 + 80) : 0;
  449.             if (tmpBuffer[i]) {
  450.                 if (mPrevBuffer[i])
  451.                     tmpBuffer[i] = (tmpBuffer[i] + mPrevBuffer[i]*7)/8;
  452.                 if (mPrevBuffer[i] == 0 || i == (h-1)) {
  453.                     m = 50;
  454.                     for (k = i;k >= 0 && m > 0;k--, m-=4) {
  455.                         if (m > 33) m--;
  456.                         tmpBuffer[k] += m;
  457.                         m += Math.random()*7;
  458.                     }
  459.                 }
  460.                 if (mPrevBuffer[i+1] && i == (h-1)) {
  461.                     m = -48;
  462.                     for (k = i;k >= 0 && m < 0;k--, m++) {
  463.                         tmpBuffer[k] += m;
  464.                         if (tmpBuffer[k]<1) tmpBuffer[k] = 1;
  465.                     }
  466.                 }
  467.            }
  468.         }
  469.        for (i = 0;i < mHeight;i++)
  470.             tmpBuffer[i] = (tmpBuffer[i] < 0) ? 0 : (tmpBuffer[i] > 255) ? 255 : tmpBuffer[i];
  471.         mCount++;
  472.     }
  473.     private static function genWav(t:Number, nest:int = 0):Number
  474.     {
  475.         var v:Number = Math.sin(t);
  476.         v += Math.sin(t*3) * 0.1;
  477.         v += Math.cos(0.1 + t*10) * 0.02;
  478.         v *= Math.sin(t*0.1);
  479.         if (nest < 5)
  480.             v += genWav2(t*2.01+nest)*0.5;
  481.         v = v*0.2 + 0.22;
  482.         return (v<0) ? 0 : (v>1) ? 1 : v;
  483.     }
  484.     private static function genWav2(t:Number, nest:int = 0):Number
  485.     {
  486.         var v:Number = Math.sin(t);
  487.         v += Math.cos(t*3) * 0.1;
  488.         v += Math.cos(0.1 + t*9) * 0.02;
  489.         v *= Math.cos(0.2 + t*0.15);
  490.         if (nest < 5)
  491.             v += genWav2(t*2.01+nest)*0.5;
  492.         v = v*0.2 + 0.23;
  493.         return (v<0) ? 0 : (v>1) ? 1 : v;
  494.     }
  495. }
  496. class StarBG extends Sprite
  497. {
  498.     private var mWidth:int;
  499.     private var mHeight:int;
  500.     private var mStars:Array;
  501.     private var mStarVs:Array;
  502.     private var mN:int;
  503.     function StarBG(w:int, h:int, n:int)
  504.     {
  505.         mWidth = w;
  506.         mHeight = h;
  507.         mN = n;
  508.         mStars  = new Array(n);
  509.         mStarVs = new Array(n);
  510.         for (var i:int = 0;i < n;i++) {
  511.             mStars[i] = new Point(int( Math.random()*w ), int( Math.random()*h ));
  512.             mStarVs[i] = Math.random() + 0.2;
  513.         }
  514.     }
  515.     public function tick():void
  516.     {
  517.         var n:int = mN;
  518.         for (var i:int = 0;i < n;i++) {
  519.             mStars[i].x -= Number(mStarVs[i]);
  520.             if (mStars[i].x < 0) {
  521.                 mStars[i].x += mWidth;
  522.                 mStars[i].y = int( Math.random()*mHeight );
  523.             }
  524.         }
  525.     }
  526.     public function draw():void
  527.     {
  528.         var g:Graphics = graphics;
  529.         var n:int = mN;
  530.         g.clear();
  531.         for (var i:int = 0;i < n;i++) {
  532.             g.beginFill(0xffffff);
  533.             g.drawCircle( mStars[i].x, mStars[i].y , 0.4);
  534.         }
  535.     }
  536. }
  537. // MML Sequencer
  538. //   http://wonderfl.kayac.com/user/keim_at_Si
  539. //--------------------------------------------------
  540. class Sequencer {
  541.     private var _tracks:Array, _count:int=Track.speed+1;
  542.     function Sequencer(speed:int, mmls:Array) { Track.speed=speed; mml=mmls; }
  543.     public function onSoundFrame() : Boolean {
  544.         if (++_count == Track.speed) {
  545.             for each (var tr:Track in _tracks) tr.execute();
  546.             _count = 0;
  547.             return true;
  548.         }
  549.         return false;
  550.     }
  551.     public function set mml(list:Array) : void {
  552.         _tracks = [];
  553.         for each (var seq:String in list) _tracks.push(new Track(seq));
  554.         _count = 0;
  555.     }
  556. }
  557. class Track {
  558.     static public var codeA:int="a".charCodeAt(), nt:Array=[9,11,0,2,4,5,7], speed:int=3;
  559.     public var oct:int, len:int, tl:int, dt:int, cnt:int, seq:String, sgn:int, stac:Array, osc:Osc;
  560.     private var _rex:RegExp=/(@i|@o|[a-gkloprsvw<>[|\]$@])([#+])?(\d+)?/g;
  561.     function Track(seq:String) {
  562.         osc = (new Osc()).reset().activate(false);
  563.         reset(seq);
  564.     }
  565.     public function reset(seq_:String) : void {
  566.         seq=seq_; oct=5; len=4; tl=256; dt=0; cnt=0; sgn=0; _rex.lastIndex=0; stac=[];
  567.     }
  568.     public function execute() : void {
  569.         if (--cnt <= 0) {
  570.             for (var i:int=0; i<100; i++) {
  571.                 var res:* = _rex.exec(seq);
  572.                 if (!res) {
  573.                     if (sgn) { _rex.lastIndex = sgn; continue; }
  574.                     else     { cnt = int.MAX_VALUE; break; }
  575.                 }
  576.                 var cmd:int = res[1].charCodeAt();
  577.                 if (cmd>=codeA && cmd<=codeA+6) {
  578.                     cnt = (res[3]) ? int(res[3]) : len;
  579.                     osc.len = cnt * speed;
  580.                     osc.pt = ((nt[cmd-codeA]+oct*12+((res[2])?1:0))<<4) + dt;
  581.                     osc.tl = tl;
  582.                     break;
  583.                 } else if (res[1] == 'r') {
  584.                     cnt = (res[3]) ? int(res[3]) : len;
  585.                     break;
  586.                 } else {
  587.                     switch(res[1]){
  588.                     case 'k': dt    = int(res[3]); break;
  589.                     case 'l': len = int(res[3]); break;
  590.                     case 'o': oct = int(res[3]); break;
  591.                     case 'v': tl    = TinySiOPM.log(int(res[3])*0.0625); break;
  592.                     case '<': oct++; break;
  593.                     case '>': oct--; break;
  594.                     case '@':  osc.ws = int(res[3]);    break;
  595.                     case 's':  osc.dr = int(res[3])<<2break;
  596.                     case 'w':  osc.sw = -int(res[3]);   break;
  597.                     case 'p':  osc.pan = (int(res[3])<<4)-64break;
  598.                     case '@i': osc.mod = int(res[3]);   break;
  599.                     case '@o': osc.out = int(res[3]);   break;
  600.                     case '$': sgn = _rex.lastIndex; break;
  601.                     case '[': stac.unshift({p:_rex.lastIndex,c:((res[3])?int(res[3]):2),j:0}); break;
  602.                     case '|'if (stac[0].c == 1) { _rex.lastIndex = stac[0].j; stac.shift(); } break;
  603.                     case ']'
  604.                         stac[0].j = _rex.lastIndex;
  605.                         if (--stac[0].c == 0) stac.shift();
  606.                         else _rex.lastIndex = stac[0].p;
  607.                         break;
  608.                     }
  609.                 }
  610.             }
  611.         }
  612.     }
  613. }
  614. class TinySiOPM {
  615.     private var _output:Vector.<Number>, _zero:Vector.<int>, _pipe:Vector.<int>;
  616.     private var _pitchTable:Vector.<int> = new Vector.<int>(2048true);
  617.     private var _logTable:Vector.<int> = new Vector.<int>(6144true);
  618.     private var _panTable:Vector.<Number> = new Vector.<Number>(129true);
  619.     private var _bufferSize:int, _callbackFrams:int, _onSoundFrame:Function;
  620.     
  621.     // Pass the buffer size and the function calls in each frame.
  622.     function TinySiOPM(bufferSize:int=2048, callbackFrams:int=1024, onSoundFrame:Function=null) {
  623.         var i:int, j:int, p:Number, v:Number, t:Vector.<int>, ft:Array=[0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0];
  624.         for (i=0, p=0; i<192; i++, p+=0.00520833333)                            // create pitchTable[128*16]
  625.             for(v=Math.pow(2, p)*12441.464342886, j=i; j<2048; v*=2, j+=192) _pitchTable[j] = int(v);
  626.         for (i=0; i<32; i++) _pitchTable[i] = (i+1)<<6;                         // [0:31] for white noize
  627.         for (i=0, p=0.0078125; i<256; i+=2, p+=0.0078125)                       // create logTable[12*256*2]
  628.             for(v=Math.pow(213-p), j=i; j<3328; v*=0.5, j+=256) _logTable[j+1] = -(_logTable[j]=int(v));
  629.         for (i=3328; i<6144; i++) _logTable[i] = 0;                             // [3328:6144] is 0-fill area
  630.         for (i=0, p=0; i<129; i++, p+=0.01217671571) _panTable[i]=Math.sin(p)*0.5;  // pan table;
  631.         for (t=Osc.createTable(10), i=0, p=0; i<1024; i++, p+=0.00613592315) t[i] = log(Math.sin(p)); // sin=0
  632.         for (t=Osc.createTable(10), i=0, p=0.75; i<1024; i++, p-=0.00146484375) t[i] = log(p);        // saw=1
  633.         for (t=Osc.createTable(5),    i=0; i<16; i++) t[i+16] = (t[i] = log(ft[i]*0.0625)) + 1;       // famtri=2
  634.         for (t=Osc.createTable(15), i=0; i<32768; i++) t[i] = log(Math.random()-0.5);                 // wnoize=3
  635.         for (i=0; i<8; i++) for (t=Osc.createTable(4), j=0; j<16; j++) t[j] = (j<=i) ? 192 : 193;     // pulse=4-11
  636.         _zero = new Vector.<int>(bufferSize, true);                             // allocate zero buffer
  637.         _pipe = new Vector.<int>(bufferSize, true);                             // allocate fm pipe buffer
  638.         _output = new Vector.<Number>(bufferSize*2true);                      // allocate stereo out
  639.         _bufferSize = bufferSize;
  640.         _callbackFrams = callbackFrams; 
  641.         _onSoundFrame = onSoundFrame;                                           // set parameters
  642.         for (i=0; i<bufferSize; i++) { _pipe[i]=_zero[i]=0; }                   // clear buffers
  643.     }
  644.     
  645.     // calculate index of logTable
  646.     static public function log(n:Number) : int {
  647.         return (n<0) ? ((n<-0.00390625) ? (((int(Math.log(-n) * -184.66496523 + 0.5) + 1) << 1) + 1) : 2047)
  648.                      : ((n> 0.00390625) ? (( int(Math.log( n) * -184.66496523 + 0.5) + 1) << 1)      : 2046);
  649.     }
  650.     
  651.     // Returns stereo output as Vector.<Number>(bufferSize*2).
  652.     public function render() : Vector.<Number> {
  653.         var i:int, j:int, ph:int, dph:int, mod:int, sh:int, tl:int, lout:int, v:int, imax:int
  654.             osc:Osc, tm:Osc, l:Number, r:Number, wv:Vector.<int>, fm:Vector.<int>, base:Vector.<int>, 
  655.             out:Vector.<int>=_pipe, lt:Vector.<int>=_logTable, stereoOut:Vector.<Number> = _output;
  656.         imax = _bufferSize<<1;
  657.         for (i=0; i<imax; i++) stereoOut[i] = 0;
  658.         for (imax=_callbackFrams; imax<=_bufferSize; imax+=_callbackFrams) {
  659.             if (_onSoundFrame!=null) _onSoundFrame();
  660.             tm = Osc._tm;
  661.             for (osc=tm.n; osc!=tm; osc=osc.update()) {
  662.                 dph=_pitchTable[osc.pt]; ph=osc.ph; mod=osc.mod+10; sh=osc.sh; tl=osc.tl; wv=osc.wv;
  663.                 fm=(osc.mod==0)?_zero:_pipe; base=(osc.out!=2)?_zero:_pipe;
  664.                 for (i = imax-_callbackFrams; i < imax; i++) {
  665.                     v = ((ph + (fm[i] << mod))& 0x3ffffff) >> sh;
  666.                     lout = wv[v] + tl;
  667.                     out[i] = lt[lout] + base[i];
  668.                     ph = (ph + dph) & 0x3ffffff;
  669.                 }
  670.                 osc.ph = ph;
  671.                 if (osc.out==0) {
  672.                     l = _panTable[64-osc.pan] * 0.0001220703125;
  673.                     r = _panTable[64+osc.pan] * 0.0001220703125;
  674.                     for (i=imax-_callbackFrams, j=i*2; i<imax; i++) {
  675.                         stereoOut[j] += out[i]*l; j++;
  676.                         stereoOut[j] += out[i]*r; j++;
  677.                     }
  678.                 }
  679.             }
  680.         }
  681.         return stereoOut;
  682.     }
  683.     
  684.     // note on
  685.     public function noteOn(pitch:int, length:int=0, vol:Number=0.5, wave:int=0, decay:int=6, sweep:int=0, pan:int=0) : Osc {
  686.         var osc:Osc = Osc.alloc().reset();
  687.         osc.pt = pitch;
  688.         osc.len = length;
  689.         osc.tl = log(vol);
  690.         osc.ws = wave;
  691.         osc.dr = decay<<2;
  692.         osc.sw = sweep; 
  693.         osc.pan = pan;
  694.         return osc.activate(true);
  695.     }
  696. }
  697. class Osc {
  698.     // create new wave table and you can refer the table by '@' command.
  699.     static public function createTable(b:int) : Vector.<int> {
  700.         _w.push(new Vector.<int>(1<<b,true)); _s.push(26-b);
  701.         return _w[_w.length-1];
  702.     }
  703.     static public var _w:Array=[], _s:Array=[], _fl:Osc=new Osc(), _tm:Osc=new Osc();
  704.     static public function alloc():Osc{ if(_fl.p==_fl)return new Osc();var r:Osc=_fl.p;_fl.p=r.p;r.p.n=_fl;return r; }
  705.     public function into(x:Osc):Osc{ p=x.p;n=x;p.n=this;n.p=this;return this; }
  706.     public var p:Osc, n:Osc, fl:Osc, pt:int, len:int, ph:int;
  707.     public var tl:int, sw:int, dr:int, wv:Vector.<int>, sh:int, mod:int, out:int, pan:int;
  708.     public function set ws(t:int) : void { wv=_w[t]; sh=_s[t]; }
  709.     public function Osc() { p = n = this; }
  710.     public function update() : Osc { tl+=dr; pt+=sw; pt&=2047return (--len==0||tl>3328) ? (inactivate().n) : n; }
  711.     public function reset() : Osc { ph=0; pt=0; len=0; tl=3328; sw=0; dr=24; pan=0; ws=0; mod=0; out=0return this; }
  712.     public function activate(autoFree:Boolean=false) : Osc { into(_tm); fl=(autoFree)?_fl:nullreturn this; }
  713.     public function inactivate() : Osc { tl=3328if(!fl)return thisvar r:Osc=p; p.n=n; n.p=p; into(fl); return r; }
  714.     public function isActive() : Boolean { return (tl<3328); }
  715. }
noswf

wonderflで音楽♪SandStorm+うろおぼえVicViper from:from:なんとかディウス forked from: wonderflで音楽♪SandStorm+うろおぼえVicViper from:from:なんとかディウス [diff(1)]

  1. // forked from keim_at_Si's wonderflで音楽♪SandStorm+うろおぼえVicViper from:from:なんとかディウス
  2. // forked from gyuque's マルチポー forked from: ゲームっぽくしてみた
  3. // forked from ton's ゲームっぽくしてみたforked from: なんとかディウスっぽい背景
  4. // forked from gyuque's なんとかディウスっぽい背景
  5. // ゲームっぽくしてみた
  6. // 十字キーで移動
  7. // スペースキーで弾発射
  8. //   -> すいません..Shiftに変更させてもらいました.keim_at_Si
  9. // だれか当たり判定つけて><
  10. package
  11. {
  12.     import flash.display.*;
  13.     import flash.geom.*;
  14.     import flash.events.*;
  15.     import flash.ui.Keyboard;
  16.     import flash.media.Sound;
  17.     [SWF(width="320", height="240", backgroundColor="0x000000", frameRate="30")]  
  18.     public class Nemesis extends Sprite
  19.     {
  20.         public static const W:int = 320;
  21.         public static const H:int = 240;
  22.         
  23.         public static var KeyMapping:Object = {};
  24.         private var mScroll:int = 0;
  25.         private var mMyPos:Point;
  26.         private var mBGen:MountainGen = new MountainGen(160);
  27.         private var mTGen:MountainGen = new MountainGen(1601);
  28.         private var mBBGen:MountainGen = new MountainGen(1801true);
  29.         private var mBBGScreen:BitmapData = new BitmapData(W, H, true0);
  30.         private var mBBGScreenBmp:Bitmap;
  31.         private var mBBGScreenBmp2:Bitmap;
  32.         private var mBGScreen:BitmapData = new BitmapData(W, H, true0);
  33.         private var mBGScreenBmp:Bitmap;
  34.         private var mBGScreenBmp2:Bitmap;
  35.         private var mStarbg:StarBG = new StarBG(W, H, 30);
  36.         
  37.         private var ship:Ship = new Ship(0xffffff, true);
  38.         private var mKeyState:KeyState = new KeyState();
  39.         function Nemesis()
  40.         {
  41.             mapKey(Keyboard.UP, KeyState.K_UP);
  42.             mapKey(Keyboard.DOWN, KeyState.K_DOWN);
  43.             mapKey(Keyboard.LEFT,KeyState.K_LEFT);
  44.             mapKey(Keyboard.RIGHT, KeyState.K_RIGHT);
  45.             mapKey(Keyboard.SHIFT, KeyState.K_TRG1);
  46.             setupBG();
  47.             setupShip();
  48.             addEventListener(Event.ENTER_FRAME, tick);
  49.             stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);
  50.             stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUpHandler);
  51.             _initializeSound();
  52.         }
  53.         private function setupShip():void {
  54.             ship.x = 40;
  55.             ship.y = H / 2;
  56.             var m1:Ship = new Multiple();
  57.             ship.appendMultiple(m1);
  58.             var m2:Ship = new Multiple();
  59.             ship.appendMultiple(m2);
  60.             ship.fillMoveBuffer();           
  61.             addChild(m1);
  62.             addChild(m2);
  63.             addChild(ship);
  64.         }
  65.         private function setupBG():void {
  66.             addChild(mStarbg);
  67.             mBBGScreenBmp = new Bitmap(mBBGScreen);
  68.             addChild(mBBGScreenBmp);
  69.             mBBGScreenBmp2 = new Bitmap(mBBGScreen);
  70.             addChild(mBBGScreenBmp2);
  71.             mBGScreenBmp = new Bitmap(mBGScreen);
  72.             addChild(mBGScreenBmp);
  73.             mBGScreenBmp2 = new Bitmap(mBGScreen);
  74.             addChild(mBGScreenBmp2);
  75.             var i:int;
  76.             mBGen.step();
  77.             mTGen.step();
  78.             mBBGen.step();
  79.             for (i = 0;i < W;i++) {
  80.                 mBGen.step();
  81.                 mTGen.step();
  82.                 mBGen.draw(mBGScreen, i, 80);
  83.                 mTGen.draw(mBGScreen, i, 0false);
  84.                 mBBGen.step();
  85.                 mBBGen.draw(mBBGScreen, i, 60);
  86.             }
  87.         }
  88.         private static function mapKey(raw:uint, _to:uint):void {
  89.             KeyMapping[raw] = _to;   
  90.         }
  91.         
  92.         private var _clrrc:Rectangle = new Rectangle(001, H);
  93.         private function tick(e:Event):void
  94.         {
  95.             var ox:int = mScroll % W;
  96.             var ox2:int = int(mScroll/2) % W;
  97.             _clrrc.x = ox;
  98.             mBGScreen.fillRect(_clrrc, 0);
  99.             mStarbg.tick();
  100.             mBGen.step();
  101.             mTGen.step();
  102.             mStarbg.draw();
  103.             mBGen.draw(mBGScreen, ox, 80);
  104.             mTGen.draw(mBGScreen, ox, 0false);
  105.             if ((mScroll%2)==1) {
  106.                 _clrrc.x = ox2;
  107.                 mBBGScreen.fillRect(_clrrc, 0);
  108.                 mBBGen.step();
  109.                 mBBGen.draw(mBBGScreen, ox2, 60);
  110.             }
  111.             mBGScreenBmp.x = -ox;
  112.             mBGScreenBmp2.x = W-ox;
  113.             mBBGScreenBmp.x = -ox2;
  114.             mBBGScreenBmp2.x = W-ox2;
  115.             ship.moveByKeyState(mKeyState.state);
  116.             ship.tick();
  117.             ship.draw();
  118.             mScroll++;
  119.         }
  120.         
  121.         private function onKeyDownHandler(e:KeyboardEvent):void {
  122.             if (KeyMapping.hasOwnProperty(e.keyCode))
  123.                 mKeyState.setState(KeyMapping[e.keyCode]);
  124.         }
  125.         private function onKeyUpHandler(e:KeyboardEvent):void {
  126.             if (KeyMapping.hasOwnProperty(e.keyCode))
  127.                 mKeyState.delState(KeyMapping[e.keyCode]);
  128.         }       
  129.     // Sound
  130.     //------------------------------------------------------------
  131.         private function _initializeSound() : void {
  132.             var A:String = "$v12@0s32w24o4l1[[4cr|crrc]cgfe[crcrrc]|[crcrrc]]v6<gggeeeccc>ggg";
  133.             A+="v12[8crcrrccrcrcc] [v12[3crcrcccccrcc]|v6<gggeeeccc>ggg] crcrcccccrcc [4crcr3]";
  134.             A+="[v12[5crcrrc]|[crcrrc]v8<ggeecc>]v8c<g>c<g>c<ggc>g<gc>g<ggec>gc";
  135.             var B:String = "$v14@3s32o0k4l3[14rc]l1[12c]";
  136.             B+="l3[14rc]rl1r[8c] [l3[6rc]|l1[12c]]rcrcl1[3r3ccc][6c] [l3[4rc]|[3rc]l1[6c]]l1[6c][3rc][12c]";
  137.             var C1:String = "@3o0l1@o0v8s4 [d21v12s32cccv8s4d24]";
  138.             var C2:String = "p6l2[8ee1e1e1eeee1]";
  139.             var C3:String = "p4@o0@3o0k8v3s1[8c12]v6s6l6k0[4d] d48d24d24";
  140.             var C4:String = "p4@i0@3o0k0v6s1r96l6s32[4c] r96";
  141.             var Cm:String = "$"+C1+"@2v10s4o6k123@o1"+C2+C3;
  142.             var Cc:String = "$"+"r96@0v3s20o5@i5"+C2+C4;
  143.             var D:String = "$l1[8g2gggggggg<d>g]";
  144.             D+="[16g2gg<d>g] <[c2[8c]gc>b2[8b]<f+>b|a2[8a]<e>a<[7d]c>b<c>ba<]<d+2[8d+]a+d+f2[8f]<c>f";
  145.             D+="g2gg>g<gf2ff>f<fe2ee>e<edc>b<c>ba";
  146.             D+="[g2[5g]<d>ggb<d>f+2[5f+]<d>f+f+a<d>e2[5e]beegb<c2cc>g<cd>a<d>a<cd>]";
  147.             var Dl:String = "@0v6s64o7k80@o1"+D;
  148.             var Dm:String = "@2v7s8o3@i1@o1"+D;
  149.             var Dc:String = "@0v6s16o4@i3"+D;
  150.             var E:String = "l1g9gb<dg12>a9a<cfa12>b9b<dgb12c9cfa<c12>>"
  151.             E+="l2[g6<d12|dc>b<c6g18>]c>b<c>a20<cd"
  152.             E+="e8f+gd8c>ba8g4l1gab<cdef+gab<cd>l2e8f+gd8f+4g8aa+aa+<c6>a+1<c1d24>>"
  153.             E+="l1g9gag<d8c2>b2g9gag<g6f+2d2>a2g9gag<d8c2>b2g8<l2egf+ga8"
  154.             var Ea:String="p5$@1v8s4o6k0"+E, Eb:String="p4$@2v12s2o5k2"+E, Ed:String="p2r2$@1v2s2o5"+E;
  155.             var F:String = "$@1p2v4s2o4 l12[g<g>f<f>]"
  156.             F+="v3s1l2[g18gab|f9l1v4s24fffv3s1f8l2ef]<c12> @2s16v8l1fa<c>a<cfcfafa<c"
  157.             F+="@1v4o4l12s1c>ba<dc>b<d+f v8s4l6gfed v4o4l12s1[gf+ec6d6]";
  158.             var G:String = "$@1p6v4s2o4 l12[b<b>a<a>]"
  159.             G+="v3s1l2[b18b<cd>|a9l1v4s24aaas1v3a8l2ga]<f12 @2k2s16v8l1fa<c>a<cfcfafa<c"
  160.             G+="@1v4o4l12s1gf+eagf+a+<c v8s4l6dc>ba v4o5l12s1[dd>bg6a6]";
  161.             var H:String = "$@1p4v4s2o5 l12[d<d>c<c>] r96 s1edcdedd+f v8s8l6gfed v4o5l12s1[bage6f+6]"
  162.             var I:String = "$@1v2s32o7 l1[[4gd>bgb<d]|[4fc>afa<c]][fc>afa<c]fdecd>b<c>abgaf"
  163.             I+="o6s0[[4gbg<d>b<c>][4faf<c>ab]]";
  164.             I+="o7v4s32[[bgeceg][af+d>b<df+]|[gec>a<ce]>def+gab<cdef+ga][gd+>a+ga+<d+][afc>a<cf]";
  165.             I+="bgege>b<afcfc>a<ge>b<e>bg<f+d>a<d>af+"
  166.             I+="o6[[gb<d>ab<g>][a<df+>a<da>][b<eg>b<gb>]<cegcg<c>df+ada<d>>]";
  167.             _module = new TinySiOPM(20481024, _onSoundFrame);
  168.             _sequencer = new Sequencer(5, [A,B,Cm,Cc,Dl,Dm,Dc,Ea,Eb,Ed,F,G,H,I]);
  169.             _sound = new Sound();
  170.             _sound.addEventListener("sampleData", _onStream);
  171.             _sound.play();
  172.         }
  173.         
  174.         private function _onSoundFrame() : void {
  175.             if (_sequencer.onSoundFrame()) {
  176.             }
  177.         }
  178.         
  179.         private function _onStream(e:SampleDataEvent) : void {
  180.             var moduleOut:Vector.<Number> = _module.render();
  181.             for (var i:int = 0; i<4096; i++) {
  182.                 e.data.writeFloat(moduleOut[i]);
  183.             }
  184.         }
  185.     }
  186. }
  187. import flash.display.*;
  188. import flash.events.Event;
  189. import flash.geom.Point;
  190. import flash.media.Sound;
  191. var _sound:Sound;
  192. var _module:TinySiOPM;
  193. var _sequencer:Sequencer;
  194. class KeyState
  195. {
  196.     public static const K_UP:uint    = 0x01;
  197.     public static const K_DOWN:uint  = 0x02;
  198.     public static const K_LEFT:uint  = 0x04;
  199.     public static const K_RIGHT:uint = 0x08;
  200.     public static const K_TRG1:uint  = 0x10;
  201.     public static const K_TRG2:uint  = 0x20;
  202.     private var mState:uint = 0;
  203.     public function setState(s:uint):void {
  204.         mState |= s;
  205.     }
  206.     public function delState(s:uint):void {
  207.         mState &= ~s;
  208.     }
  209.     public function get state():uint {
  210.         return mState;
  211.     }
  212. }
  213. class Ship extends Sprite
  214. {
  215.     private var speed:int = 4;
  216.     protected var mCount:int = 0;
  217.     private var mMovBuf:PositionRingBuffer;
  218.     private var mMultiples:Array;
  219.     private var _shotCount:int;
  220.     public var color:uint;
  221.     function Ship(color:uint, enable_buf:Boolean = false)
  222.     {
  223.         this.color = color;
  224.         draw();
  225.         _shotCount = 0;
  226.         if (enable_buf)
  227.             mMovBuf = new PositionRingBuffer(100);
  228.     }
  229.     public function fillMoveBuffer():void {
  230.         for (var i:int = 0;i < 100;i++)
  231.             mMovBuf.push(x, y, false);
  232.     }
  233.     public function appendMultiple(m:Ship):void
  234.     {
  235.         if (!mMultiples) mMultiples = [];
  236.         mMultiples.push(m);
  237.     }
  238.     public function draw():void
  239.     {
  240.         var g:Graphics = graphics;
  241.         g.clear();
  242. /*
  243.         g.lineStyle(0, color);
  244.         g.lineTo( -30, -10);
  245.         g.lineTo( -30, 10);
  246.         g.lineTo(0, 0);
  247.         g.endFill();
  248. */
  249.         g.beginFill(0xc0c0c0);
  250.         g.drawPath(Vector.<int>([1,2,2,2,2,2]),
  251.             Vector.<Number>([16,-2,-10,-4,-15,-3,-25,5,-20,5,-10,1]));
  252.         g.endFill();
  253.         g.beginFill(0x808080);
  254.         g.drawPath(Vector.<int>([1,2,2,2]),
  255.             Vector.<Number>([-15,-2,-15,2,-20,2,-20,-2]));
  256.         g.endFill();
  257.         g.beginFill(0x80a0f0);
  258.         g.drawPath(Vector.<int>([1,2,2,2]),
  259.             Vector.<Number>([-8,-4,-2,-3,5,0,-15,0]));
  260.         g.endFill();
  261.         g.beginFill(0xffffff);
  262.         g.drawPath(Vector.<int>([1,2,2,2]),
  263.             Vector.<Number>([-8,-1,-18,-7,-22,-7,-15,0]));
  264.         g.endFill();
  265.         g.beginFill(0xe0e0e0);
  266.         g.drawPath(Vector.<int>([1,2,2,2,2,2]),
  267.             Vector.<Number>([16,1,-10,-1,-15,0,-25,8,-20,8,-10,4]));
  268.         g.endFill();
  269.                 
  270.         if (mMultiples) {
  271.             for each(var m:Ship in mMultiples)
  272.                 m.draw();
  273.         }
  274.     }
  275.     public function moveByKeyState(s:uint):void
  276.     {
  277.              if (s&KeyState.K_UP)    y -= speed;
  278.         else if (s&KeyState.K_DOWN)  y += speed;
  279.              if (s&KeyState.K_LEFT)  x -= speed;
  280.         else if (s&KeyState.K_RIGHT) x += speed;
  281.         if (s&KeyState.K_TRG1) 
  282.             fireShot();
  283.              if (x - width< 0) x = width;
  284.         else if (x > Nemesis.W) x = Nemesis.W;
  285.              if (y - height/2 < 0) y = height/2;
  286.         else if (y + height/2 > Nemesis.H) y = Nemesis.H - height/2
  287.         mMovBuf.push(x, y);
  288.     }
  289.     public function tick():void {
  290.         if (mMultiples) {
  291.             var len:int = mMultiples.length;
  292.             for (var i:int = 0;i < len;i++) {
  293.                 mMultiples[i].x = mMovBuf.getX((i+1)*8) - 10;
  294.                 mMultiples[i].y = mMovBuf.getY((i+1)*8);
  295.             }
  296.             for each(var m:Ship in mMultiples)
  297.                 m.tick();
  298.         }
  299.         mCount++;
  300.      }
  301.     public function fireShot():void {
  302.         if (!(mCount%5) && _shotCount<2) {
  303.             var bullet:Bullet = new Bullet(this);
  304.             bullet.x = x;
  305.             bullet.y = y;
  306.             parent.addChild(bullet);
  307.             _shotCount++;
  308.             if (mMultiples) // = if player...('A`)
  309.                 _module.noteOn(1440,0,0.5,11,64,-256);
  310.         }
  311.         if (mMultiples) {
  312.             for each(var m:Ship in mMultiples)
  313.                 m.fireShot();
  314.         }
  315.     }
  316.     public function onShotRemoved() : void {
  317.         _shotCount--;
  318.     }
  319. }
  320. class Multiple extends Ship
  321. {
  322.     import flash.geom.Matrix;
  323.     public static const GRAD_COLORS:Array = [0xffba33, 0xaa0000];
  324.     public static const GRAD_ALPHAS:Array = [11];
  325.     public static const GRAD_RATIOS:Array = [100255];
  326.     private var mGradTrans:Matrix = new Matrix();
  327.     function Multiple()
  328.     {
  329.         super(0);
  330.     }
  331.     public override function draw():void
  332.     {
  333.         var g:Graphics = graphics;
  334.         var r:Number = Math.sin(mCount*0.9)*0.7 + 9;
  335.         mGradTrans.createGradientBox(r*2, r*1.8,0 , -r*1.1, -r*0.9);
  336.         g.clear();
  337.         g.beginGradientFill(GradientType.RADIAL, GRAD_COLORS, GRAD_ALPHAS, GRAD_RATIOS, mGradTrans);
  338.         g.drawEllipse(-r, -r*0.8, r*2, r*1.6);
  339.         g.endFill();
  340.     }
  341. }
  342. class PositionRingBuffer
  343. {
  344.     private var xs:Array;
  345.     private var ys:Array;
  346.     private var length:uint;
  347.     private var pos:int = 0;
  348.     function PositionRingBuffer(len:uint)
  349.     {
  350.         length = len;
  351.         xs = new Array(len);
  352.         ys = new Array(len);
  353.     }
  354.     public function push(x:int, y:int, chk:Boolean = true):void {
  355.         var i:int = (pos + length - 1) % length;
  356.         if (chk) {
  357.             if (xs[i] == x && ys[i] == y) return;
  358.         }
  359.         xs[pos] = x;
  360.         ys[pos] = y;
  361.         pos = ++pos % length;
  362.     }
  363.     public function getX(i:int):int {
  364.         i = (pos - i + length) % length;
  365.         return xs[i];
  366.     }
  367.     public function getY(i:int):int {
  368.         i = (pos - i + length) % length;
  369.         return ys[i];
  370.     }
  371. }
  372. class Bullet extends Sprite
  373. {
  374.     public var color:uint;
  375.     public var size:uint;
  376.     public var speed:uint;
  377.     private var _ship:Ship;
  378.     function Bullet(ship:Ship, color:uint = 0xeeddaa, size:uint = 3, speed:uint = 20)
  379.     {
  380.         this._ship = ship;
  381.         this.color = color;
  382.         this.size = size;
  383.         this.speed = speed;
  384.         
  385.         this.graphics.beginFill(color);
  386.         this.graphics.drawEllipse(-size, -size/2, size*1.8, size);
  387.         this.graphics.drawCircle(-size*1.30, size/2);
  388.         this.graphics.drawCircle(-size*1.80, size/3);
  389.         this.graphics.endFill();
  390.         
  391.         addEventListener(Event.ENTER_FRAME, updateHandler);
  392.     }
  393.     
  394.     private function updateHandler(e:Event):void 
  395.     {
  396.         this.x += speed;
  397.         
  398.         if (this.x + size / 2 > Nemesis.W) {
  399.             this.parent.removeChild(this);
  400.             removeEventListener(Event.ENTER_FRAME, updateHandler);
  401.             _ship.onShotRemoved();
  402.         }
  403.     }
  404. }
  405. class MountainGen
  406. {
  407.     private var mPrevBuffer:Array;
  408.     private var mHeight:int;
  409.     private var mCount:int = 0;
  410.     private var tmpBuffer:Array;
  411.     private var mGenFunc:Function;
  412.     private var mDark:Boolean;
  413.     
  414.     function MountainGen(h:int, generator:int = 0, dark:Boolean = false)
  415.     {
  416.                 mDark = dark;
  417.         mHeight = h;
  418.         mGenFunc = generator ? genWav2 : genWav;
  419.         mPrevBuffer = new Array(h);
  420.         tmpBuffer   = new Array(h);
  421.     }
  422.     public function draw(b:BitmapData, x:int, y:int, rev:Boolean = true):void
  423.     {
  424.         var i:int;
  425.         for (i = 0;i < mHeight;i++) {
  426.             if (tmpBuffer[i]) {
  427.                 var c:int = tmpBuffer[i];
  428.                 b.setPixel32(x, rev ? (y+mHeight-i) : (y+i), makeColor(c));
  429.             }
  430.         }
  431.     }
  432.     private function makeColor(c:int):uint
  433.     {
  434.         if (mDark)
  435.             return 0xff000000 | (c/7+5) | ((c/7 + 80)<<16) | ((c/6+50) << 8);
  436.         return 0xff000000 | (c/3+11) | ((c/5 + 170)<<16) | ((c/2+60) << 8);
  437.     }
  438.     public function step():void
  439.     {
  440.         var t:Number = Number(mCount) * 0.02;
  441.         var h:int = mGenFunc(t) * mHeight;
  442.         var i:int, k:int, m:int;
  443.         for (i = 0;i < mHeight;i++) {
  444.             mPrevBuffer[i] = tmpBuffer[i];
  445.         }
  446.         
  447.         for (i = 0;i < mHeight;i++) {
  448.             tmpBuffer[i] = (i < h) ? (Math.random()*80 + 80) : 0;
  449.             if (tmpBuffer[i]) {
  450.                 if (mPrevBuffer[i])
  451.                     tmpBuffer[i] = (tmpBuffer[i] + mPrevBuffer[i]*7)/8;
  452.                 if (mPrevBuffer[i] == 0 || i == (h-1)) {
  453.                     m = 50;
  454.                     for (k = i;k >= 0 && m > 0;k--, m-=4) {
  455.                         if (m > 33) m--;
  456.                         tmpBuffer[k] += m;
  457.                         m += Math.random()*7;
  458.                     }
  459.                 }
  460.                 if (mPrevBuffer[i+1] && i == (h-1)) {
  461.                     m = -48;
  462.                     for (k = i;k >= 0 && m < 0;k--, m++) {
  463.                         tmpBuffer[k] += m;
  464.                         if (tmpBuffer[k]<1) tmpBuffer[k] = 1;
  465.                     }
  466.                 }
  467.            }
  468.         }
  469.        for (i = 0;i < mHeight;i++)
  470.             tmpBuffer[i] = (tmpBuffer[i] < 0) ? 0 : (tmpBuffer[i] > 255) ? 255 : tmpBuffer[i];
  471.         mCount++;
  472.     }
  473.     private static function genWav(t:Number, nest:int = 0):Number
  474.     {
  475.         var v:Number = Math.sin(t);
  476.         v += Math.sin(t*3) * 0.1;
  477.         v += Math.cos(0.1 + t*10) * 0.02;
  478.         v *= Math.sin(t*0.1);
  479.         if (nest < 5)
  480.             v += genWav2(t*2.01+nest)*0.5;
  481.         v = v*0.2 + 0.22;
  482.         return (v<0) ? 0 : (v>1) ? 1 : v;
  483.     }
  484.     private static function genWav2(t:Number, nest:int = 0):Number
  485.     {
  486.         var v:Number = Math.sin(t);
  487.         v += Math.cos(t*3) * 0.1;
  488.         v += Math.cos(0.1 + t*9) * 0.02;
  489.         v *= Math.cos(0.2 + t*0.15);
  490.         if (nest < 5)
  491.             v += genWav2(t*2.01+nest)*0.5;
  492.         v = v*0.2 + 0.23;
  493.         return (v<0) ? 0 : (v>1) ? 1 : v;
  494.     }
  495. }
  496. class StarBG extends Sprite
  497. {
  498.     private var mWidth:int;
  499.     private var mHeight:int;
  500.     private var mStars:Array;
  501.     private var mStarVs:Array;
  502.     private var mN:int;
  503.     function StarBG(w:int, h:int, n:int)
  504.     {
  505.         mWidth = w;
  506.         mHeight = h;
  507.         mN = n;
  508.         mStars  = new Array(n);
  509.         mStarVs = new Array(n);
  510.         for (var i:int = 0;i < n;i++) {
  511.             mStars[i] = new Point(int( Math.random()*w ), int( Math.random()*h ));
  512.             mStarVs[i] = Math.random() + 0.2;
  513.         }
  514.     }
  515.     public function tick():void
  516.     {
  517.         var n:int = mN;
  518.         for (var i:int = 0;i < n;i++) {
  519.             mStars[i].x -= Number(mStarVs[i]);
  520.             if (mStars[i].x < 0) {
  521.                 mStars[i].x += mWidth;
  522.                 mStars[i].y = int( Math.random()*mHeight );
  523.             }
  524.         }
  525.     }
  526.     public function draw():void
  527.     {
  528.         var g:Graphics = graphics;
  529.         var n:int = mN;
  530.         g.clear();
  531.         for (var i:int = 0;i < n;i++) {
  532.             g.beginFill(0xffffff);
  533.             g.drawCircle( mStars[i].x, mStars[i].y , 0.4);
  534.         }
  535.     }
  536. }
  537. // MML Sequencer
  538. //   http://wonderfl.kayac.com/user/keim_at_Si
  539. //--------------------------------------------------
  540. class Sequencer {
  541.     private var _tracks:Array, _count:int=Track.speed+1;
  542.     function Sequencer(speed:int, mmls:Array) { Track.speed=speed; mml=mmls; }
  543.     public function onSoundFrame() : Boolean {
  544.         if (++_count == Track.speed) {
  545.             for each (var tr:Track in _tracks) tr.execute();
  546.             _count = 0;
  547.             return true;
  548.         }
  549.         return false;
  550.     }
  551.     public function set mml(list:Array) : void {
  552.         _tracks = [];
  553.         for each (var seq:String in list) _tracks.push(new Track(seq));
  554.         _count = 0;
  555.     }
  556. }
  557. class Track {
  558.     static public var codeA:int="a".charCodeAt(), nt:Array=[9,11,0,2,4,5,7], speed:int=3;
  559.     public var oct:int, len:int, tl:int, dt:int, cnt:int, seq:String, sgn:int, stac:Array, osc:Osc;
  560.     private var _rex:RegExp=/(@i|@o|[a-gkloprsvw<>[|\]$@])([#+])?(\d+)?/g;
  561.     function Track(seq:String) {
  562.         osc = (new Osc()).reset().activate(false);
  563.         reset(seq);
  564.     }
  565.     public function reset(seq_:String) : void {
  566.         seq=seq_; oct=5; len=4; tl=256; dt=0; cnt=0; sgn=0; _rex.lastIndex=0; stac=[];
  567.     }
  568.     public function execute() : void {
  569.         if (--cnt <= 0) {
  570.             for (var i:int=0; i<100; i++) {
  571.                 var res:* = _rex.exec(seq);
  572.                 if (!res) {
  573.                     if (sgn) { _rex.lastIndex = sgn; continue; }
  574.                     else     { cnt = int.MAX_VALUE; break; }
  575.                 }
  576.                 var cmd:int = res[1].charCodeAt();
  577.                 if (cmd>=codeA && cmd<=codeA+6) {
  578.                     cnt = (res[3]) ? int(res[3]) : len;
  579.                     osc.len = cnt * speed;
  580.                     osc.pt = ((nt[cmd-codeA]+oct*12+((res[2])?1:0))<<4) + dt;
  581.                     osc.tl = tl;
  582.                     break;
  583.                 } else if (res[1] == 'r') {
  584.                     cnt = (res[3]) ? int(res[3]) : len;
  585.                     break;
  586.                 } else {
  587.                     switch(res[1]){
  588.                     case 'k': dt    = int(res[3]); break;
  589.                     case 'l': len = int(res[3]); break;
  590.                     case 'o': oct = int(res[3]); break;
  591.                     case 'v': tl    = TinySiOPM.log(int(res[3])*0.0625); break;
  592.                     case '<': oct++; break;
  593.                     case '>': oct--; break;
  594.                     case '@':  osc.ws = int(res[3]);    break;
  595.                     case 's':  osc.dr = int(res[3])<<2break;
  596.                     case 'w':  osc.sw = -int(res[3]);   break;
  597.                     case 'p':  osc.pan = (int(res[3])<<4)-64break;
  598.                     case '@i': osc.mod = int(res[3]);   break;
  599.                     case '@o': osc.out = int(res[3]);   break;
  600.                     case '$': sgn = _rex.lastIndex; break;
  601.                     case '[': stac.unshift({p:_rex.lastIndex,c:((res[3])?int(res[3]):2),j:0}); break;
  602.                     case '|'if (stac[0].c == 1) { _rex.lastIndex = stac[0].j; stac.shift(); } break;
  603.                     case ']'
  604.                         stac[0].j = _rex.lastIndex;
  605.                         if (--stac[0].c == 0) stac.shift();
  606.                         else _rex.lastIndex = stac[0].p;
  607.                         break;
  608.                     }
  609.                 }
  610.             }
  611.         }
  612.     }
  613. }
  614. class TinySiOPM {
  615.     private var _output:Vector.<Number>, _zero:Vector.<int>, _pipe:Vector.<int>;
  616.     private var _pitchTable:Vector.<int> = new Vector.<int>(2048true);
  617.     private var _logTable:Vector.<int> = new Vector.<int>(6144true);
  618.     private var _panTable:Vector.<Number> = new Vector.<Number>(129true);
  619.     private var _bufferSize:int, _callbackFrams:int, _onSoundFrame:Function;
  620.     
  621.     // Pass the buffer size and the function calls in each frame.
  622.     function TinySiOPM(bufferSize:int=2048, callbackFrams:int=1024, onSoundFrame:Function=null) {
  623.         var i:int, j:int, p:Number, v:Number, t:Vector.<int>, ft:Array=[0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0];
  624.         for (i=0, p=0; i<192; i++, p+=0.00520833333)                            // create pitchTable[128*16]
  625.             for(v=Math.pow(2, p)*12441.464342886, j=i; j<2048; v*=2, j+=192) _pitchTable[j] = int(v);
  626.         for (i=0; i<32; i++) _pitchTable[i] = (i+1)<<6;                         // [0:31] for white noize
  627.         for (i=0, p=0.0078125; i<256; i+=2, p+=0.0078125)                       // create logTable[12*256*2]
  628.             for(v=Math.pow(213-p), j=i; j<3328; v*=0.5, j+=256) _logTable[j+1] = -(_logTable[j]=int(v));
  629.         for (i=3328; i<6144; i++) _logTable[i] = 0;                             // [3328:6144] is 0-fill area
  630.         for (i=0, p=0; i<129; i++, p+=0.01217671571) _panTable[i]=Math.sin(p)*0.5;  // pan table;
  631.         for (t=Osc.createTable(10), i=0, p=0; i<1024; i++, p+=0.00613592315) t[i] = log(Math.sin(p)); // sin=0
  632.         for (t=Osc.createTable(10), i=0, p=0.75; i<1024; i++, p-=0.00146484375) t[i] = log(p);        // saw=1
  633.         for (t=Osc.createTable(5),    i=0; i<16; i++) t[i+16] = (t[i] = log(ft[i]*0.0625)) + 1;       // famtri=2
  634.         for (t=Osc.createTable(15), i=0; i<32768; i++) t[i] = log(Math.random()-0.5);                 // wnoize=3
  635.         for (i=0; i<8; i++) for (t=Osc.createTable(4), j=0; j<16; j++) t[j] = (j<=i) ? 192 : 193;     // pulse=4-11
  636.         _zero = new Vector.<int>(bufferSize, true);                             // allocate zero buffer
  637.         _pipe = new Vector.<int>(bufferSize, true);                             // allocate fm pipe buffer
  638.         _output = new Vector.<Number>(bufferSize*2true);                      // allocate stereo out
  639.         _bufferSize = bufferSize;
  640.         _callbackFrams = callbackFrams; 
  641.         _onSoundFrame = onSoundFrame;                                           // set parameters
  642.         for (i=0; i<bufferSize; i++) { _pipe[i]=_zero[i]=0; }                   // clear buffers
  643.     }
  644.     
  645.     // calculate index of logTable
  646.     static public function log(n:Number) : int {
  647.         return (n<0) ? ((n<-0.00390625) ? (((int(Math.log(-n) * -184.66496523 + 0.5) + 1) << 1) + 1) : 2047)
  648.                      : ((n> 0.00390625) ? (( int(Math.log( n) * -184.66496523 + 0.5) + 1) << 1)      : 2046);
  649.     }
  650.     
  651.     // Returns stereo output as Vector.<Number>(bufferSize*2).
  652.     public function render() : Vector.<Number> {
  653.         var i:int, j:int, ph:int, dph:int, mod:int, sh:int, tl:int, lout:int, v:int, imax:int
  654.             osc:Osc, tm:Osc, l:Number, r:Number, wv:Vector.<int>, fm:Vector.<int>, base:Vector.<int>, 
  655.             out:Vector.<int>=_pipe, lt:Vector.<int>=_logTable, stereoOut:Vector.<Number> = _output;
  656.         imax = _bufferSize<<1;
  657.         for (i=0; i<imax; i++) stereoOut[i] = 0;
  658.         for (imax=_callbackFrams; imax<=_bufferSize; imax+=_callbackFrams) {
  659.             if (_onSoundFrame!=null) _onSoundFrame();
  660.             tm = Osc._tm;
  661.             for (osc=tm.n; osc!=tm; osc=osc.update()) {
  662.                 dph=_pitchTable[osc.pt]; ph=osc.ph; mod=osc.mod+10; sh=osc.sh; tl=osc.tl; wv=osc.wv;
  663.                 fm=(osc.mod==0)?_zero:_pipe; base=(osc.out!=2)?_zero:_pipe;
  664.                 for (i = imax-_callbackFrams; i < imax; i++) {
  665.                     v = ((ph + (fm[i] << mod))& 0x3ffffff) >> sh;
  666.                     lout = wv[v] + tl;
  667.                     out[i] = lt[lout] + base[i];
  668.                     ph = (ph + dph) & 0x3ffffff;
  669.                 }
  670.                 osc.ph = ph;
  671.                 if (osc.out==0) {
  672.                     l = _panTable[64-osc.pan] * 0.0001220703125;
  673.                     r = _panTable[64+osc.pan] * 0.0001220703125;
  674.                     for (i=imax-_callbackFrams, j=i*2; i<imax; i++) {
  675.                         stereoOut[j] += out[i]*l; j++;
  676.                         stereoOut[j] += out[i]*r; j++;
  677.                     }
  678.                 }
  679.             }
  680.         }
  681.         return stereoOut;
  682.     }
  683.     
  684.     // note on
  685.     public function noteOn(pitch:int, length:int=0, vol:Number=0.5, wave:int=0, decay:int=6, sweep:int=0, pan:int=0) : Osc {
  686.         var osc:Osc = Osc.alloc().reset();
  687.         osc.pt = pitch;
  688.         osc.len = length;
  689.         osc.tl = log(vol);
  690.         osc.ws = wave;
  691.         osc.dr = decay<<2;
  692.         osc.sw = sweep; 
  693.         osc.pan = pan;
  694.         return osc.activate(true);
  695.     }
  696. }
  697. class Osc {
  698.     // create new wave table and you can refer the table by '@' command.
  699.     static public function createTable(b:int) : Vector.<int> {
  700.         _w.push(new Vector.<int>(1<<b,true)); _s.push(26-b);
  701.         return _w[_w.length-1];
  702.     }
  703.     static public var _w:Array=[], _s:Array=[], _fl:Osc=new Osc(), _tm:Osc=new Osc();
  704.     static public function alloc():Osc{ if(_fl.p==_fl)return new Osc();var r:Osc=_fl.p;_fl.p=r.p;r.p.n=_fl;return r; }
  705.     public function into(x:Osc):Osc{ p=x.p;n=x;p.n=this;n.p=this;return this; }
  706.     public var p:Osc, n:Osc, fl:Osc, pt:int, len:int, ph:int;
  707.     public var tl:int, sw:int, dr:int, wv:Vector.<int>, sh:int, mod:int, out:int, pan:int;
  708.     public function set ws(t:int) : void { wv=_w[t]; sh=_s[t]; }
  709.     public function Osc() { p = n = this; }
  710.     public function update() : Osc { tl+=dr; pt+=sw; pt&=2047return (--len==0||tl>3328) ? (inactivate().n) : n; }
  711.     public function reset() : Osc { ph=0; pt=0; len=0; tl=3328; sw=0; dr=24; pan=0; ws=0; mod=0; out=0return this; }
  712.     public function activate(autoFree:Boolean=false) : Osc { into(_tm); fl=(autoFree)?_fl:nullreturn this; }
  713.     public function inactivate() : Osc { tl=3328if(!fl)return thisvar r:Osc=p; p.n=n; n.p=p; into(fl); return r; }
  714.     public function isActive() : Boolean { return (tl<3328); }
  715. }
noswf

wonderflで音楽♪SandStorm+うろおぼえVicViper from:from:なんとかディウス forked from: wonderflで音楽♪SandStorm+うろおぼえVicViper from:from:なんとかディウス [diff(1)]

  1. // forked from keim_at_Si's wonderflで音楽♪SandStorm+うろおぼえVicViper from:from:なんとかディウス
  2. // forked from gyuque's マルチポー forked from: ゲームっぽくしてみた
  3. // forked from ton's ゲームっぽくしてみたforked from: なんとかディウスっぽい背景
  4. // forked from gyuque's なんとかディウスっぽい背景
  5. // ゲームっぽくしてみた
  6. // 十字キーで移動
  7. // スペースキーで弾発射
  8. //   -> すいません..Shiftに変更させてもらいました.keim_at_Si
  9. // だれか当たり判定つけて><
  10. package
  11. {
  12.     import flash.display.*;
  13.     import flash.geom.*;
  14.     import flash.events.*;
  15.     import flash.ui.Keyboard;
  16.     import flash.media.Sound;
  17.     [SWF(width="320", height="240", backgroundColor="0x000000", frameRate="30")]  
  18.     public class Nemesis extends Sprite
  19.     {
  20.         public static const W:int = 320;
  21.         public static const H:int = 240;
  22.         
  23.         public static var KeyMapping:Object = {};
  24.         private var mScroll:int = 0;
  25.         private var mMyPos:Point;
  26.         private var mBGen:MountainGen = new MountainGen(160);
  27.         private var mTGen:MountainGen = new MountainGen(1601);
  28.         private var mBBGen:MountainGen = new MountainGen(1801true);
  29.         private var mBBGScreen:BitmapData = new BitmapData(W, H, true0);
  30.         private var mBBGScreenBmp:Bitmap;
  31.         private var mBBGScreenBmp2:Bitmap;
  32.         private var mBGScreen:BitmapData = new BitmapData(W, H, true0);
  33.         private var mBGScreenBmp:Bitmap;
  34.         private var mBGScreenBmp2:Bitmap;
  35.         private var mStarbg:StarBG = new StarBG(W, H, 30);
  36.         
  37.         private var ship:Ship = new Ship(0xffffff, true);
  38.         private var mKeyState:KeyState = new KeyState();
  39.         function Nemesis()
  40.         {
  41.             mapKey(Keyboard.UP, KeyState.K_UP);
  42.             mapKey(Keyboard.DOWN, KeyState.K_DOWN);
  43.             mapKey(Keyboard.LEFT,KeyState.K_LEFT);
  44.             mapKey(Keyboard.RIGHT, KeyState.K_RIGHT);
  45.             mapKey(Keyboard.SHIFT, KeyState.K_TRG1);
  46.             setupBG();
  47.             setupShip();
  48.             addEventListener(Event.ENTER_FRAME, tick);
  49.             stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);
  50.             stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUpHandler);
  51.             _initializeSound();
  52.         }
  53.         private function setupShip():void {
  54.             ship.x = 40;
  55.             ship.y = H / 2;
  56.             var m1:Ship = new Multiple();
  57.             ship.appendMultiple(m1);
  58.             var m2:Ship = new Multiple();
  59.             ship.appendMultiple(m2);
  60.             ship.fillMoveBuffer();           
  61.             addChild(m1);
  62.             addChild(m2);
  63.             addChild(ship);
  64.         }
  65.         private function setupBG():void {
  66.             addChild(mStarbg);
  67.             mBBGScreenBmp = new Bitmap(mBBGScreen);
  68.             addChild(mBBGScreenBmp);
  69.             mBBGScreenBmp2 = new Bitmap(mBBGScreen);
  70.             addChild(mBBGScreenBmp2);
  71.             mBGScreenBmp = new Bitmap(mBGScreen);
  72.             addChild(mBGScreenBmp);
  73.             mBGScreenBmp2 = new Bitmap(mBGScreen);
  74.             addChild(mBGScreenBmp2);
  75.             var i:int;
  76.             mBGen.step();
  77.             mTGen.step();
  78.             mBBGen.step();
  79.             for (i = 0;i < W;i++) {
  80.                 mBGen.step();
  81.                 mTGen.step();
  82.                 mBGen.draw(mBGScreen, i, 80);
  83.                 mTGen.draw(mBGScreen, i, 0false);
  84.                 mBBGen.step();
  85.                 mBBGen.draw(mBBGScreen, i, 60);
  86.             }
  87.         }
  88.         private static function mapKey(raw:uint, _to:uint):void {
  89.             KeyMapping[raw] = _to;   
  90.         }
  91.         
  92.         private var _clrrc:Rectangle = new Rectangle(001, H);
  93.         private function tick(e:Event):void
  94.         {
  95.             var ox:int = mScroll % W;
  96.             var ox2:int = int(mScroll/2) % W;
  97.             _clrrc.x = ox;
  98.             mBGScreen.fillRect(_clrrc, 0);
  99.             mStarbg.tick();
  100.             mBGen.step();
  101.             mTGen.step();
  102.             mStarbg.draw();
  103.             mBGen.draw(mBGScreen, ox, 80);
  104.             mTGen.draw(mBGScreen, ox, 0false);
  105.             if ((mScroll%2)==1) {
  106.                 _clrrc.x = ox2;
  107.                 mBBGScreen.fillRect(_clrrc, 0);
  108.                 mBBGen.step();
  109.                 mBBGen.draw(mBBGScreen, ox2, 60);
  110.             }
  111.             mBGScreenBmp.x = -ox;
  112.             mBGScreenBmp2.x = W-ox;
  113.             mBBGScreenBmp.x = -ox2;
  114.             mBBGScreenBmp2.x = W-ox2;
  115.             ship.moveByKeyState(mKeyState.state);
  116.             ship.tick();
  117.             ship.draw();
  118.             mScroll++;
  119.         }
  120.         
  121.         private function onKeyDownHandler(e:KeyboardEvent):void {
  122.             if (KeyMapping.hasOwnProperty(e.keyCode))
  123.                 mKeyState.setState(KeyMapping[e.keyCode]);
  124.         }
  125.         private function onKeyUpHandler(e:KeyboardEvent):void {
  126.             if (KeyMapping.hasOwnProperty(e.keyCode))
  127.                 mKeyState.delState(KeyMapping[e.keyCode]);
  128.         }       
  129.     // Sound
  130.     //------------------------------------------------------------
  131.         private function _initializeSound() : void {
  132.             var A:String = "$v12@0s32w24o4l1[[4cr|crrc]cgfe[crcrrc]|[crcrrc]]v6<gggeeeccc>ggg";
  133.             A+="v12[8crcrrccrcrcc] [v12[3crcrcccccrcc]|v6<gggeeeccc>ggg] crcrcccccrcc [4crcr3]";
  134.             A+="[v12[5crcrrc]|[crcrrc]v8<ggeecc>]v8c<g>c<g>c<ggc>g<gc>g<ggec>gc";
  135.             var B:String = "$v14@3s32o0k4l3[14rc]l1[12c]";
  136.             B+="l3[14rc]rl1r[8c] [l3[6rc]|l1[12c]]rcrcl1[3r3ccc][6c] [l3[4rc]|[3rc]l1[6c]]l1[6c][3rc][12c]";
  137.             var C1:String = "@3o0l1@o0v8s4 [d21v12s32cccv8s4d24]";
  138.             var C2:String = "p6l2[8ee1e1e1eeee1]";
  139.             var C3:String = "p4@o0@3o0k8v3s1[8c12]v6s6l6k0[4d] d48d24d24";
  140.             var C4:String = "p4@i0@3o0k0v6s1r96l6s32[4c] r96";
  141.             var Cm:String = "$"+C1+"@2v10s4o6k123@o1"+C2+C3;
  142.             var Cc:String = "$"+"r96@0v3s20o5@i5"+C2+C4;
  143.             var D:String = "$l1[8g2gggggggg<d>g]";
  144.             D+="[16g2gg<d>g] <[c2[8c]gc>b2[8b]<f+>b|a2[8a]<e>a<[7d]c>b<c>ba<]<d+2[8d+]a+d+f2[8f]<c>f";
  145.             D+="g2gg>g<gf2ff>f<fe2ee>e<edc>b<c>ba";
  146.             D+="[g2[5g]<d>ggb<d>f+2[5f+]<d>f+f+a<d>e2[5e]beegb<c2cc>g<cd>a<d>a<cd>]";
  147.             var Dl:String = "@0v6s64o7k80@o1"+D;
  148.             var Dm:String = "@2v7s8o3@i1@o1"+D;
  149.             var Dc:String = "@0v6s16o4@i3"+D;
  150.             var E:String = "l1g9gb<dg12>a9a<cfa12>b9b<dgb12c9cfa<c12>>"
  151.             E+="l2[g6<d12|dc>b<c6g18>]c>b<c>a20<cd"
  152.             E+="e8f+gd8c>ba8g4l1gab<cdef+gab<cd>l2e8f+gd8f+4g8aa+aa+<c6>a+1<c1d24>>"
  153.             E+="l1g9gag<d8c2>b2g9gag<g6f+2d2>a2g9gag<d8c2>b2g8<l2egf+ga8"
  154.             var Ea:String="p5$@1v8s4o6k0"+E, Eb:String="p4$@2v12s2o5k2"+E, Ed:String="p2r2$@1v2s2o5"+E;
  155.             var F:String = "$@1p2v4s2o4 l12[g<g>f<f>]"
  156.             F+="v3s1l2[g18gab|f9l1v4s24fffv3s1f8l2ef]<c12> @2s16v8l1fa<c>a<cfcfafa<c"
  157.             F+="@1v4o4l12s1c>ba<dc>b<d+f v8s4l6gfed v4o4l12s1[gf+ec6d6]";
  158.             var G:String = "$@1p6v4s2o4 l12[b<b>a<a>]"
  159.             G+="v3s1l2[b18b<cd>|a9l1v4s24aaas1v3a8l2ga]<f12 @2k2s16v8l1fa<c>a<cfcfafa<c"
  160.             G+="@1v4o4l12s1gf+eagf+a+<c v8s4l6dc>ba v4o5l12s1[dd>bg6a6]";
  161.             var H:String = "$@1p4v4s2o5 l12[d<d>c<c>] r96 s1edcdedd+f v8s8l6gfed v4o5l12s1[bage6f+6]"
  162.             var I:String = "$@1v2s32o7 l1[[4gd>bgb<d]|[4fc>afa<c]][fc>afa<c]fdecd>b<c>abgaf"
  163.             I+="o6s0[[4gbg<d>b<c>][4faf<c>ab]]";
  164.             I+="o7v4s32[[bgeceg][af+d>b<df+]|[gec>a<ce]>def+gab<cdef+ga][gd+>a+ga+<d+][afc>a<cf]";
  165.             I+="bgege>b<afcfc>a<ge>b<e>bg<f+d>a<d>af+"
  166.             I+="o6[[gb<d>ab<g>][a<df+>a<da>][b<eg>b<gb>]<cegcg<c>df+ada<d>>]";
  167.             _module = new TinySiOPM(20481024, _onSoundFrame);
  168.             _sequencer = new Sequencer(5, [A,B,Cm,Cc,Dl,Dm,Dc,Ea,Eb,Ed,F,G,H,I]);
  169.             _sound = new Sound();
  170.             _sound.addEventListener("sampleData", _onStream);
  171.             _sound.play();
  172.         }
  173.         
  174.         private function _onSoundFrame() : void {
  175.             if (_sequencer.onSoundFrame()) {
  176.             }
  177.         }
  178.         
  179.         private function _onStream(e:SampleDataEvent) : void {
  180.             var moduleOut:Vector.<Number> = _module.render();
  181.             for (var i:int = 0; i<4096; i++) {
  182.                 e.data.writeFloat(moduleOut[i]);
  183.             }
  184.         }
  185.     }
  186. }
  187. import flash.display.*;
  188. import flash.events.Event;
  189. import flash.geom.Point;
  190. import flash.media.Sound;
  191. var _sound:Sound;
  192. var _module:TinySiOPM;
  193. var _sequencer:Sequencer;
  194. class KeyState
  195. {
  196.     public static const K_UP:uint    = 0x01;
  197.     public static const K_DOWN:uint  = 0x02;
  198.     public static const K_LEFT:uint  = 0x04;
  199.     public static const K_RIGHT:uint = 0x08;
  200.     public static const K_TRG1:uint  = 0x10;
  201.     public static const K_TRG2:uint  = 0x20;
  202.     private var mState:uint = 0;
  203.     public function setState(s:uint):void {
  204.         mState |= s;
  205.     }
  206.     public function delState(s:uint):void {
  207.         mState &= ~s;
  208.     }
  209.     public function get state():uint {
  210.         return mState;
  211.     }
  212. }
  213. class Ship extends Sprite
  214. {
  215.     private var speed:int = 4;
  216.     protected var mCount:int = 0;
  217.     private var mMovBuf:PositionRingBuffer;
  218.     private var mMultiples:Array;
  219.     private var _shotCount:int;
  220.     public var color:uint;
  221.     function Ship(color:uint, enable_buf:Boolean = false)
  222.     {
  223.         this.color = color;
  224.         draw();
  225.         _shotCount = 0;
  226.         if (enable_buf)
  227.             mMovBuf = new PositionRingBuffer(100);
  228.     }
  229.     public function fillMoveBuffer():void {
  230.         for (var i:int = 0;i < 100;i++)
  231.             mMovBuf.push(x, y, false);
  232.     }
  233.     public function appendMultiple(m:Ship):void
  234.     {
  235.         if (!mMultiples) mMultiples = [];
  236.         mMultiples.push(m);
  237.     }
  238.     public function draw():void
  239.     {
  240.         var g:Graphics = graphics;
  241.         g.clear();
  242. /*
  243.         g.lineStyle(0, color);
  244.         g.lineTo( -30, -10);
  245.         g.lineTo( -30, 10);
  246.         g.lineTo(0, 0);
  247.         g.endFill();
  248. */
  249.         g.beginFill(0xc0c0c0);
  250.         g.drawPath(Vector.<int>([1,2,2,2,2,2]),
  251.             Vector.<Number>([16,-2,-10,-4,-15,-3,-25,5,-20,5,-10,1]));
  252.         g.endFill();
  253.         g.beginFill(0x808080);
  254.         g.drawPath(Vector.<int>([1,2,2,2]),
  255.             Vector.<Number>([-15,-2,-15,2,-20,2,-20,-2]));
  256.         g.endFill();
  257.         g.beginFill(0x80a0f0);
  258.         g.drawPath(Vector.<int>([1,2,2,2]),
  259.             Vector.<Number>([-8,-4,-2,-3,5,0,-15,0]));
  260.         g.endFill();
  261.         g.beginFill(0xffffff);
  262.         g.drawPath(Vector.<int>([1,2,2,2]),
  263.             Vector.<Number>([-8,-1,-18,-7,-22,-7,-15,0]));
  264.         g.endFill();
  265.         g.beginFill(0xe0e0e0);
  266.         g.drawPath(Vector.<int>([1,2,2,2,2,2]),
  267.             Vector.<Number>([16,1,-10,-1,-15,0,-25,8,-20,8,-10,4]));
  268.         g.endFill();
  269.                 
  270.         if (mMultiples) {
  271.             for each(var m:Ship in mMultiples)
  272.                 m.draw();
  273.         }
  274.     }
  275.     public function moveByKeyState(s:uint):void
  276.     {
  277.              if (s&KeyState.K_UP)    y -= speed;
  278.         else if (s&KeyState.K_DOWN)  y += speed;
  279.              if (s&KeyState.K_LEFT)  x -= speed;
  280.         else if (s&KeyState.K_RIGHT) x += speed;
  281.         if (s&KeyState.K_TRG1) 
  282.             fireShot();
  283.              if (x - width< 0) x = width;
  284.         else if (x > Nemesis.W) x = Nemesis.W;
  285.              if (y - height/2 < 0) y = height/2;
  286.         else if (y + height/2 > Nemesis.H) y = Nemesis.H - height/2
  287.         mMovBuf.push(x, y);
  288.     }
  289.     public function tick():void {
  290.         if (mMultiples) {
  291.             var len:int = mMultiples.length;
  292.             for (var i:int = 0;i < len;i++) {
  293.                 mMultiples[i].x = mMovBuf.getX((i+1)*8) - 10;
  294.                 mMultiples[i].y = mMovBuf.getY((i+1)*8);
  295.             }
  296.             for each(var m:Ship in mMultiples)
  297.                 m.tick();
  298.         }
  299.         mCount++;
  300.      }
  301.     public function fireShot():void {
  302.         if (!(mCount%5) && _shotCount<2) {
  303.             var bullet:Bullet = new Bullet(this);
  304.             bullet.x = x;
  305.             bullet.y = y;
  306.             parent.addChild(bullet);
  307.             _shotCount++;
  308.             if (mMultiples) // = if player...('A`)
  309.                 _module.noteOn(1440,0,0.5,11,64,-256);
  310.         }
  311.         if (mMultiples) {
  312.             for each(var m:Ship in mMultiples)
  313.                 m.fireShot();
  314.         }
  315.     }
  316.     public function onShotRemoved() : void {
  317.         _shotCount--;
  318.     }
  319. }
  320. class Multiple extends Ship
  321. {
  322.     import flash.geom.Matrix;
  323.     public static const GRAD_COLORS:Array = [0xffba33, 0xaa0000];
  324.     public static const GRAD_ALPHAS:Array = [11];
  325.     public static const GRAD_RATIOS:Array = [100255];
  326.     private var mGradTrans:Matrix = new Matrix();
  327.     function Multiple()
  328.     {
  329.         super(0);
  330.     }
  331.     public override function draw():void
  332.     {
  333.         var g:Graphics = graphics;
  334.         var r:Number = Math.sin(mCount*0.9)*0.7 + 9;
  335.         mGradTrans.createGradientBox(r*2, r*1.8,0 , -r*1.1, -r*0.9);
  336.         g.clear();
  337.         g.beginGradientFill(GradientType.RADIAL, GRAD_COLORS, GRAD_ALPHAS, GRAD_RATIOS, mGradTrans);
  338.         g.drawEllipse(-r, -r*0.8, r*2, r*1.6);
  339.         g.endFill();
  340.     }
  341. }
  342. class PositionRingBuffer
  343. {
  344.     private var xs:Array;
  345.     private var ys:Array;
  346.     private var length:uint;
  347.     private var pos:int = 0;
  348.     function PositionRingBuffer(len:uint)
  349.     {
  350.         length = len;
  351.         xs = new Array(len);
  352.         ys = new Array(len);
  353.     }
  354.     public function push(x:int, y:int, chk:Boolean = true):void {
  355.         var i:int = (pos + length - 1) % length;
  356.         if (chk) {
  357.             if (xs[i] == x && ys[i] == y) return;
  358.         }
  359.         xs[pos] = x;
  360.         ys[pos] = y;
  361.         pos = ++pos % length;
  362.     }
  363.     public function getX(i:int):int {
  364.         i = (pos - i + length) % length;
  365.         return xs[i];
  366.     }
  367.     public function getY(i:int):int {
  368.         i = (pos - i + length) % length;
  369.         return ys[i];
  370.     }
  371. }
  372. class Bullet extends Sprite
  373. {
  374.     public var color:uint;
  375.     public var size:uint;
  376.     public var speed:uint;
  377.     private var _ship:Ship;
  378.     function Bullet(ship:Ship, color:uint = 0xeeddaa, size:uint = 3, speed:uint = 20)
  379.     {
  380.         this._ship = ship;
  381.         this.color = color;
  382.         this.size = size;
  383.         this.speed = speed;
  384.         
  385.         this.graphics.beginFill(color);
  386.         this.graphics.drawEllipse(-size, -size/2, size*1.8, size);
  387.         this.graphics.drawCircle(-size*1.30, size/2);
  388.         this.graphics.drawCircle(-size*1.80, size/3);
  389.         this.graphics.endFill();
  390.         
  391.         addEventListener(Event.ENTER_FRAME, updateHandler);
  392.     }
  393.     
  394.     private function updateHandler(e:Event):void 
  395.     {
  396.         this.x += speed;
  397.         
  398.         if (this.x + size / 2 > Nemesis.W) {
  399.             this.parent.removeChild(this);
  400.             removeEventListener(Event.ENTER_FRAME, updateHandler);
  401.             _ship.onShotRemoved();
  402.         }
  403.     }
  404. }
  405. class MountainGen
  406. {
  407.     private var mPrevBuffer:Array;
  408.     private var mHeight:int;
  409.     private var mCount:int = 0;
  410.     private var tmpBuffer:Array;
  411.     private var mGenFunc:Function;
  412.     private var mDark:Boolean;
  413.     
  414.     function MountainGen(h:int, generator:int = 0, dark:Boolean = false)
  415.     {
  416.                 mDark = dark;
  417.         mHeight = h;
  418.         mGenFunc = generator ? genWav2 : genWav;
  419.         mPrevBuffer = new Array(h);
  420.         tmpBuffer   = new Array(h);
  421.     }
  422.     public function draw(b:BitmapData, x:int, y:int, rev:Boolean = true):void
  423.     {
  424.         var i:int;
  425.         for (i = 0;i < mHeight;i++) {
  426.             if (tmpBuffer[i]) {
  427.                 var c:int = tmpBuffer[i];
  428.                 b.setPixel32(x, rev ? (y+mHeight-i) : (y+i), makeColor(c));
  429.             }
  430.         }
  431.     }
  432.     private function makeColor(c:int):uint
  433.     {
  434.         if (mDark)
  435.             return 0xff000000 | (c/7+5) | ((c/7 + 80)<<16) | ((c/6+50) << 8);
  436.         return 0xff000000 | (c/3+11) | ((c/5 + 170)<<16) | ((c/2+60) << 8);
  437.     }
  438.     public function step():void
  439.     {
  440.         var t:Number = Number(mCount) * 0.02;
  441.         var h:int = mGenFunc(t) * mHeight;
  442.         var i:int, k:int, m:int;
  443.         for (i = 0;i < mHeight;i++) {
  444.             mPrevBuffer[i] = tmpBuffer[i];
  445.         }
  446.         
  447.         for (i = 0;i < mHeight;i++) {
  448.             tmpBuffer[i] = (i < h) ? (Math.random()*80 + 80) : 0;
  449.             if (tmpBuffer[i]) {
  450.                 if (mPrevBuffer[i])
  451.                     tmpBuffer[i] = (tmpBuffer[i] + mPrevBuffer[i]*7)/8;
  452.                 if (mPrevBuffer[i] == 0 || i == (h-1)) {
  453.                     m = 50;
  454.                     for (k = i;k >= 0 && m > 0;k--, m-=4) {
  455.                         if (m > 33) m--;
  456.                         tmpBuffer[k] += m;
  457.                         m += Math.random()*7;
  458.                     }
  459.                 }
  460.                 if (mPrevBuffer[i+1] && i == (h-1)) {
  461.                     m = -48;
  462.                     for (k = i;k >= 0 && m < 0;k--, m++) {
  463.                         tmpBuffer[k] += m;
  464.                         if (tmpBuffer[k]<1) tmpBuffer[k] = 1;
  465.                     }
  466.                 }
  467.            }
  468.         }
  469.        for (i = 0;i < mHeight;i++)
  470.             tmpBuffer[i] = (tmpBuffer[i] < 0) ? 0 : (tmpBuffer[i] > 255) ? 255 : tmpBuffer[i];
  471.         mCount++;
  472.     }
  473.     private static function genWav(t:Number, nest:int = 0):Number
  474.     {
  475.         var v:Number = Math.sin(t);
  476.         v += Math.sin(t*3) * 0.1;
  477.         v += Math.cos(0.1 + t*10) * 0.02;
  478.         v *= Math.sin(t*0.1);
  479.         if (nest < 5)
  480.             v += genWav2(t*2.01+nest)*0.5;
  481.         v = v*0.2 + 0.22;
  482.         return (v<0) ? 0 : (v>1) ? 1 : v;
  483.     }
  484.     private static function genWav2(t:Number, nest:int = 0):Number
  485.     {
  486.         var v:Number = Math.sin(t);
  487.         v += Math.cos(t*3) * 0.1;
  488.         v += Math.cos(0.1 + t*9) * 0.02;
  489.         v *= Math.cos(0.2 + t*0.15);
  490.         if (nest < 5)
  491.             v += genWav2(t*2.01+nest)*0.5;
  492.         v = v*0.2 + 0.23;
  493.         return (v<0) ? 0 : (v>1) ? 1 : v;
  494.     }
  495. }
  496. class StarBG extends Sprite
  497. {
  498.     private var mWidth:int;
  499.     private var mHeight:int;
  500.     private var mStars:Array;
  501.     private var mStarVs:Array;
  502.     private var mN:int;
  503.     function StarBG(w:int, h:int, n:int)
  504.     {
  505.         mWidth = w;
  506.         mHeight = h;
  507.         mN = n;
  508.         mStars  = new Array(n);
  509.         mStarVs = new Array(n);
  510.         for (var i:int = 0;i < n;i++) {
  511.             mStars[i] = new Point(int( Math.random()*w ), int( Math.random()*h ));
  512.             mStarVs[i] = Math.random() + 0.2;
  513.         }
  514.     }
  515.     public function tick():void
  516.     {
  517.         var n:int = mN;
  518.         for (var i:int = 0;i < n;i++) {
  519.             mStars[i].x -= Number(mStarVs[i]);
  520.             if (mStars[i].x < 0) {
  521.                 mStars[i].x += mWidth;
  522.                 mStars[i].y = int( Math.random()*mHeight );
  523.             }
  524.         }
  525.     }
  526.     public function draw():void
  527.     {
  528.         var g:Graphics = graphics;
  529.         var n:int = mN;
  530.         g.clear();
  531.         for (var i:int = 0;i < n;i++) {
  532.             g.beginFill(0xffffff);
  533.             g.drawCircle( mStars[i].x, mStars[i].y , 0.4);
  534.         }
  535.     }
  536. }
  537. // MML Sequencer
  538. //   http://wonderfl.kayac.com/user/keim_at_Si
  539. //--------------------------------------------------
  540. class Sequencer {
  541.     private var _tracks:Array, _count:int=Track.speed+1;
  542.     function Sequencer(speed:int, mmls:Array) { Track.speed=speed; mml=mmls; }
  543.     public function onSoundFrame() : Boolean {
  544.         if (++_count == Track.speed) {
  545.             for each (var tr:Track in _tracks) tr.execute();
  546.             _count = 0;
  547.             return true;
  548.         }
  549.         return false;
  550.     }
  551.     public function set mml(list:Array) : void {
  552.         _tracks = [];
  553.         for each (var seq:String in list) _tracks.push(new Track(seq));
  554.         _count = 0;