※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


forked from : keim_at_Si's Old-skool LCD rendering [diff(640)]

TALK
Press key "z" or "n" on start.
at 2009/09/03 00:40:25 by
スクリプト見ても文字と記号の羅列が何をやっているかまったくわかりませんw
at 2009/12/06 20:25:22 by
このDSLの元になってる CannonML のURLを参考に張っておきます.http://www.yomogi.sakura.ne.jp/~si/SolidImage/cml/index.html
at 2009/12/07 14:31:56 by
FAVORITE BY
:
Fun and cool!
:
nice
:
:
:
shmups
:
:
:
このゲームいいなあ
:
:
Gameおもしれー!
:
gameUn shoot 'old school'
:
:
ゲームシューティングゲーム、白黒ドット画面
:
:
:
Gamegood!
:
:
gameふつうにゲームだ、、
:
Game像素
:
:
:
LCDRetroGameクオリティがハンパないっす…。
:
:
:
gameレトロゲー風シューティング/面白い。
:
gamejeux lcd
:
:
:
gameAmazing, made it to phase 3 :( pretty fun :D
:
:
すごいなー
:
:
ShmupGameTiny Cannon ML
:
:
:
:
:
:
space invaders on lcd screen
:
Flash Liteで動けば楽しそう
:
:
:
:
:
gameかっこいい。結構むずい。
:
gameシューティング 質感がイイ!!
:
spritesmega
:
shootingrendergameCannonML560行でこれはw 液晶っぽい表示がGOOD
:
:
totally rad
:
cool
:
cool
:
i love this code
:
Space Invaders
:
Tiny Cannon ML
:
Superb!
:
すご
:
弾幕が最初から多くてうけるw
:
シューティング
:
えぐいなぁ
:
( ゚д゚)<スゲェ・・
:
CML x Nomltest = <3
:
MMLみたいな敵スクリプト勉強になります。
:
すげー
:
ヌルヌルすごい
:
Good Shooting
:
ポケコンシューティング
:
cool
FORKED
  1. // forked from keim_at_Si's shmups on LCD
  2. // forked from keim_at_Si's wonderflでポケコン
  3. //   phase 6 + Beep音.
  4. //   move;arrow or wasd/shot;ctrl,z,n/slow;shift,x,m
  5. //--------------------------------------------------
  6. package {
  7.     import flash.display.*;
  8.     import flash.events.*;
  9.     [SWF(width="465", height="465", backgroundColor="0", frameRate="30")]
  10.     public class main extends Sprite {
  11.         function main() {
  12.             // key mapping
  13.             _key = new KeyMapper(stage);
  14.             _key.map(0,37,65).map(1,38,87).map(2,39,68).map(3,40,83).map(4,17,90,78).map(5,16,88,77);
  15.             // lcd render
  16.             _lcd = new LCDRender();
  17.             _lcd.charMap[65] = LCDRender.hex2bmp("70607c6070");
  18.             addChild(_lcd);
  19.             addEventListener("enterFrame", _onEnterFrame);
  20.             
  21.             // beep
  22.             _beep = new Beep();
  23.             _actorManager[FIBER]     = new ActorManager(Fiber);
  24.             _actorManager[BULLET]    = new ActorManager(Actor).pat("070507"3).pat("0e1b111b0e"5);
  25.             _actorManager[SHOT]      = new ActorManager(Actor).pat("3f0000003f"6).pat("3f"6);
  26.             _actorManager[ENEMY]     = new ActorManager(Actor, _actorManager[SHOT]);
  27.             _actorManager[PARTICLE]  = new ActorManager(Actor).pat("01"1);
  28.             _actorManager[EXPLOSION] = new ActorManager(Explosion);
  29.             _actorManager[ENEMY].pat("583c563f3f563c58"76).pat("2b7e353c3c357e2b"1420).pat("2b7e353c3c357e2b"2120).pat("01"1);
  30.             _actorManager[EXPLOSION].pat("0000060909060000").pat("1669b9c644463d02").pat("1285324884844a30");
  31.             _actorManager[EXPLOSION].pat("0002000060905021").pat("0000000000000080");
  32.             for (var i:int=0, p:Number=0; i<5120; i++, p+=0.0015339807878856411) sin[i] = Math.sin(p);
  33.             _player = Player(_playerManager.alloc());
  34.             _player.changeStatus(0);
  35.             _player.life = 3;
  36.             score = 0;
  37.             _sceneManager.changeScene(0);
  38.         }
  39.         private function _onEnterFrame(e:Event) : void {
  40.             frameCount++;
  41.             _lcd.cls();
  42.             if (frameCount & 1) _actorManager[PARTICLE].alloc().init(Math.random()*9600int(Math.random()*3)+1);
  43.             if (_sceneManager.update()) _player.update(_actorManager[BULLET]);
  44.             for (var i:int = 0; i<6; i++) _actorManager[i].updateAll();
  45.             _lcd.render();
  46.         }
  47.     }
  48. }
  49. // internal variables
  50. const FIBER:int = 0;
  51. const BULLET:int = 1;
  52. const SHOT:int = 2;
  53. const ENEMY:int = 3;
  54. const PARTICLE:int = 4;
  55. const EXPLOSION:int = 5;
  56. var sin:Vector.<Number> = new Vector.<Number>(5120true);
  57. var _lcd:LCDRender;
  58. var _key:KeyMapper;
  59. var _beep:Beep;
  60. var _sceneManager:SceneManager = new SceneManager();
  61. var _playerManager:ActorManager = new ActorManager(Player).pat("7820782f782078"7);
  62. var _actorManager:Vector.<ActorManager> = new Vector.<ActorManager>(6true);
  63. var _player:Player;
  64. var frameCount:int;
  65. var score:int;
  66. var phase:int;
  67. var shotScript:Vector.<String> = Vector.<String>([
  68.     "&c1[99999ha180f40{&p0}f{&p1v20w1ha190vd40}f{&p1v-20w1ha170vd40}w2f40{&p0}40w2f40f{&p1v20w1ha200vd40}f{&p1v-20w1ha160vd40}w2f40{&p0}w2]",
  69.     "&c1[99999ha180f40{&p0}f{&p1v20w1v0,-40}f{&p1v-20w1v0,-40}w2]"
  70. ]);
  71. import flash.display.*;
  72. import flash.geom.*;
  73. import flash.filters.*;
  74. import flash.events.*;
  75. import flash.media.*;
  76. import flash.utils.*;
  77. class LCDRender extends Bitmap {
  78.     public var data:BitmapData = new BitmapData(9696false0);
  79.     public var charMap:Vector.<BitmapData> = Vector.<BitmapData>([
  80.         hex2bmp("0000000000"), hex2bmp("00005f0000"), hex2bmp("0003000300"), hex2bmp("143e143e14"), //  !"#
  81.         hex2bmp("242a7f2a12"), hex2bmp("4c2c106864"), hex2bmp("3649592650"), hex2bmp("0000030000"), // $%&'
  82.         hex2bmp("001c224100"), hex2bmp("0041221c00"), hex2bmp("22143e1422"), hex2bmp("08083e0808"), // ()*+
  83.         hex2bmp("0050300000"), hex2bmp("0808080808"), hex2bmp("0060600000"), hex2bmp("2010080402"), // ,-./
  84.         hex2bmp("3e5149453e"), hex2bmp("00427f4000"), hex2bmp("4261514946"), hex2bmp("2241494936"), // 0123
  85.         hex2bmp("3824227f20"), hex2bmp("4f49494931"), hex2bmp("3e49494932"), hex2bmp("0301710907"), // 4567
  86.         hex2bmp("3649494936"), hex2bmp("264949493e"), hex2bmp("0036360000"), hex2bmp("0056360000"), // 89:;
  87.         hex2bmp("0814224100"), hex2bmp("1414141414"), hex2bmp("0041221408"), hex2bmp("0201510906"), // <=>?
  88.         hex2bmp("3e4159551e"), hex2bmp("7c2221227c"), hex2bmp("7f49494936"), hex2bmp("3e41414122"), // @ABC
  89.         hex2bmp("7f4141423c"), hex2bmp("7f49494941"), hex2bmp("7f09090901"), hex2bmp("3e4149493a"), // DEFG
  90.         hex2bmp("7f0808087f"), hex2bmp("00417f4100"), hex2bmp("2040413f01"), hex2bmp("7f08142241"), // HIJK
  91.         hex2bmp("7f40404040"), hex2bmp("7f020c027f"), hex2bmp("7f0408107f"), hex2bmp("3e4141413e"), // LMNO
  92.         hex2bmp("7f09090906"), hex2bmp("3e4151215e"), hex2bmp("7f09192946"), hex2bmp("2649494932"), // PQRS
  93.         hex2bmp("01017f0101"), hex2bmp("3f4040403f"), hex2bmp("1f2040201f"), hex2bmp("1f601c601f"), // TUVW
  94.         hex2bmp("6314081463"), hex2bmp("0708700807"), hex2bmp("6151494543"), hex2bmp("00007f4100"), // XYZ[
  95.         hex2bmp("0204081020"), hex2bmp("00417f0000"), hex2bmp("0002010200"), hex2bmp("4040404040"), // \]^_
  96.     ]);
  97.     
  98.     private var _screen:BitmapData = new BitmapData(384384true0);
  99.     private var _display:BitmapData = new BitmapData(400400false0);
  100.     private var _cls:BitmapData = new BitmapData(400400false0);
  101.     private var _matS2D:Matrix = new Matrix(1,0,0,1,8,8);
  102.     private var _shadow:DropShadowFilter = new DropShadowFilter(44500.666);
  103.     private var _residueMap:Vector.<Number> = new Vector.<Number>(9216true);
  104.     private var _toneFilter:uint, _dotColor:uint, _residue:Number;
  105.     private var _dot:Rectangle = new Rectangle(0,0,3,3);
  106.     private var _pt:Point = new Point();
  107.     private var _shape:Shape = new Shape();
  108.     
  109.     static public function hex2bmp(hex:String, height:int=8, scale:int=1) : BitmapData {
  110.         var i:int, pat:int,
  111.             rect:Rectangle = new Rectangle(00, scale, scale),
  112.             bmp:BitmapData = new BitmapData((hex.length>>1)*scale, height, true0);
  113.         for (i=0, rect.x=0; i<hex.length; i+=2, rect.x+=scale)
  114.             for (rect.y=0, pat=parseInt(hex.substr(i, 2), 16); pat!=0; rect.y+=scale, pat>>=1) {
  115.                 bmp.fillRect(rect, -(pat&1));
  116.             }
  117.         return bmp;
  118.     }
  119.     
  120.     function LCDRender(bit:int=2, backColor:uint = 0xb0c0b0, 
  121.                       dot0Color:uint = 0xb0b0b0, dot1Color:uint = 0x000000, residue:Number = 0.4) {
  122.         _toneFilter = (0xff00 >> bit) & 0xff;
  123.         _dotColor = dot1Color;
  124.         _cls.fillRect(_cls.rect, backColor);
  125.         _residue = residue;
  126.         for (_dot.x=8; _dot.x<392; _dot.x+=4)
  127.             for (_dot.y=8; _dot.y<392; _dot.y+=4)
  128.                 _cls.fillRect(_dot, dot0Color);
  129.         charMap.length = 96;
  130.         for (var i:int=32; i<64; i++) charMap[i+32] = charMap[i];
  131.         super(_display);
  132.         x = 32;
  133.         y = 32;
  134.     }
  135.     
  136.     public function cls() : void {
  137.         data.fillRect(data.rect, 0);
  138.     }
  139.     
  140.     public function line(x0:int, y0:int, x1:int, y1:int, color:int=255, thick:Number=1) : void {
  141.         _shape.graphics.clear();
  142.         _shape.graphics.lineStyle(thick, color);
  143.         _shape.graphics.moveTo(x0, y0);
  144.         _shape.graphics.lineTo(x1, y1);
  145.         data.draw(_shape);
  146.     }
  147.     public function gprint(x:int, y:int, bmp:BitmapData) : void {
  148.         _pt.x = x - (bmp.width >> 1);
  149.         _pt.y = y - (bmp.height >> 1);
  150.         data.copyPixels(bmp, bmp.rect, _pt);
  151.     }
  152.         
  153.     public function print(x:int, y:int, str:String) : void {
  154.         _pt.x = x;
  155.         _pt.y = y;
  156.         var bmp:BitmapData;
  157.         for (var i:int=0; i<str.length; i++, _pt.x+=6) {
  158.             bmp = charMap[str.charCodeAt(i)-32];
  159.             data.copyPixels(bmp, bmp.rect, _pt);
  160.         }
  161.     }
  162.     
  163.     public function render() : void {
  164.         var x:int, y:int, gray:int, mask:uint, i:int;
  165.         _screen.fillRect(_screen.rect, 0);
  166.         for (i=0, _dot.y=0, y=0; y<96; _dot.y+=4, y++) {
  167.             for (_dot.x=0, x=0; x<96; _dot.x+=4, x++, i++) {
  168.                 gray = ((data.getPixel(x, y) & _toneFilter)>>1) + int(_residueMap[i]);
  169.                 if (gray > 255) gray = 255;
  170.                 _residueMap[i] = gray * _residue;
  171.                 if (gray) _screen.fillRect(_dot, (gray<<24) | _dotColor);
  172.             }
  173.         }
  174.         _screen.applyFilter(_screen, _screen.rect, _screen.rect.topLeft, _shadow);
  175.         _display.copyPixels(_cls, _cls.rect, _cls.rect.topLeft);
  176.         _display.draw(_screen, _matS2D);
  177.     }
  178. }
  179. class KeyMapper {
  180.     public  var keys:uint = 0;
  181.     private var _map:Vector.<int> = new Vector.<int>(256true);
  182.     
  183.     function KeyMapper(stage:Stage) : void { 
  184.         for (var i:int=0; i<256; i++) _map[i]=31;
  185.         stage.addEventListener("keyDown"function(e:KeyboardEvent) : void {
  186.             keys |= 1<<_map[e.keyCode];
  187.         });
  188.         stage.addEventListener("keyUp",   function(e:KeyboardEvent) : void {
  189.             keys &= ~(1<<_map[e.keyCode]);
  190.         });
  191.     }
  192.     
  193.     public function map(bit:int, ...args) : KeyMapper {
  194.         for (var i:int=0; i<args.length; i++) _map[args[i]] = bit;
  195.         return this;
  196.     }
  197. }
  198. class Beep {
  199.     private var _phase:int, _pitch:int, _count:int, _sweep:int;
  200.     private var _sound:Sound = new Sound();
  201.     private var _step:Vector.<int> = new Vector.<int>(256true);
  202.     private var _wave:Vector.<Number> = new Vector.<Number>(16true);
  203.     
  204.     function Beep() {
  205.         var i:int;
  206.         _sound.addEventListener("sampleData", _onStream);
  207.         for (i=0; i<16; i++) _wave[i] = 0;
  208.         for (i=0; i<256; i++) _step[i] = i;
  209.         _wave[14] = -(_wave[15] = 0.1);
  210.         _sweep = _count = _pitch = _phase = 0;
  211.         _sound.play();
  212.     }
  213.     
  214.     public function play(pitch:int, length:int, sweep:int) : void {
  215.         _pitch = pitch;
  216.         _count = length+1;
  217.         _sweep = sweep;
  218.     }
  219.     
  220.     private function _onStream(e:SampleDataEvent) : void {
  221.         var l:int, i:int, n:Number, data:ByteArray = e.data;
  222.         for (l=0; l<2; l++) {
  223.             if (--_count == 0) { _pitch = _sweep = 0; }
  224.             _pitch += _sweep;
  225.             for (i=0; i<1024; i++) {
  226.                 _phase = (_phase+_step[_pitch&255]) & 4095;
  227.                 data.writeFloat(_wave[_phase>>8]);
  228.                 data.writeFloat(_wave[_phase>>8]);
  229.             }
  230.         }
  231.     }
  232. }
  233. class SceneManager {
  234.     public var id:int;
  235.     public var initPhase:int = 0;
  236.     private var _stage:Actor, _stageScript:String;
  237.     private var _groupScript:Array = [
  238.         ["&c2&p3p6v12[8f{&l1vd24i20vw10f8w10vd-20}w2]ko",
  239.          "&c2&p3p90v-12[8f{&l1vd24i20vw10f8w10vd-20}w2]ko"
  240.          "&p1&l20v0,12i8v0,1w8[2ha-56f8hs16[7w5f8]w5ha56f8hs-16[7w5f8]w5]a0,1",
  241.          "[40ha90f100{w1b5,120f10{&p1}ko}ha-90f100w30]"],
  242.         ["&c2&p3p12v24[5f{&l2v0,20i10vw10ht[6f-10{i30hv180vd20}w1hs0]w30hti60vd40}w2]ko",
  243.          "&c2&p3p84v-24[5f{&l2v0,20i10vw10ht[6f-10{i30hv180vd20}w1hs0]w30hti60vd40}w2]ko"
  244.          "&p1&l20v0,12i8v0,1w8b3,40ht10f6w24ht-10f6w48a0,1",
  245.          "[20b4,100htf8{&p0}w3b1ha135[5f15{&p1i10vw10vd20}w1]w11ha215[5f15w1]w8]"],
  246.         ["&c2&p3p6v12[8f{&l1b2,0,2vd24i20vw10f8w10vd-20}w2]ko",
  247.          "&c2&p3p90v-12[8f{&l1b2,0,2vd24i20vw10f8w10vd-20}w2]ko"
  248.          "&p1&l20v0,12i8v0,1w8b4,60,6f8{&p1}w24b4,60,-6f8w48a0,1",
  249.          "[20haf20{&p1i15vw20hab12,330f5w10ha15b12,330f10ko}[2ha90f50{w1vd-4w1hv[4f-15{&p1}w2]ko}w16ha-90f50w16]]"],
  250.         ["&c2&p3p4,16[4f{&l3hr60[2v20,1w6f8w12v-20,1w6f8w12]}w2]ko",
  251.          "&c2&p3p92,16[4f{&l3hr60[2v-20,1w6f8w12v20,1w6f8w12]}w2]ko"
  252.          "&p1&l20v0,12i8v0,1w8[3b3,40f1{&p1hvi40vd12}w16]a0,1",
  253.          "b4,120[40ht40f6{&p1}hs-10bv2[4w2f]w12ht-40f6hs10bv2[4w2f]w12]"],
  254.         ["&c2&p3p6v10[4f{&l2v0,48i10vw10a0,-1hr90b3,240[f4w20]}w4]fko",
  255.          "&c2&p3p90v-10[4f{&l2v0,48i10vw10a0,-1hr90b3,240[f4w20]}w4]ko",
  256.          "&p1&l20v0,12i8v0,1w8[2b2,10ht8f6hs-2bv1[7fw2]ht-8f6hs2bv1[7fw2]w24]a0,1",
  257.          "ha[40b1f{vb7,120f8{&p1}hsw20b6,100f16{&p0}ko}[8w1b2,60f-10{&p1[60ad1w2]}]w24]"],
  258.         ["&c2&p3p84[2f{&l4i4v0,20w4bv2f6[3v-20,0w4v0,-16fw4v20,0w4v0,24fw4]}w8]ko",
  259.          "&c2&p3p12[2f{&l4i4v0,20w4bv2f6[3v20,0w4v0,-16fw4v-20,0w4v0,24fw4]}w8]ko",
  260.          "&p1&l20v0,12i8v0,1w8[2ha-48f6{&p1}hs16bv1[5w2f]w6ha40f6hs-16bv1[5w2f]w6]a0,1",
  261.          "@{b3,240hs10[320f20{&p1hv90w5f10}w4]}b3,240hs-10[320f20{&p1hv90w5f10}w4]"]
  262.     ];
  263.     function SceneManager() {
  264.         _stageScript  = "&c2&p3&l0,1p48w64[2f$0w32f$1w32]f$0w16f$1w16f$2w48p24f$2p72f$2w64";
  265.         _stageScript += "[2f$0w24p16f$2w24f$1w24p84f$2w24]w32p24f$2p72f$2[2w16f$0w16f$1]w64p48f$3ko";
  266.         for (var i:int=0; i<_groupScript.length; i++) {
  267.             _groupScript[i][3] = "&p2&l100v0,20i8v0,1w8@{v10[10i64v-10w64v10w64]a0,1}"+_groupScript[i][3];
  268.         }
  269.     }
  270.     
  271.     public function changeScene(id:int) : void {
  272.         this.id = id;
  273.         frameCount = 0;
  274.         switch (id) {
  275.         case 1: _start(); break;
  276.         case 2: _stage.kill(); break;
  277.         }
  278.     }
  279.     
  280.     private function _start() : void {
  281.         _beep.play(0,32,32);
  282.         if (phase == _groupScript.length) { changeScene(3); return; }
  283.         _stage = _actorManager[ENEMY].alloc().init(480002);
  284.         Fiber(_actorManager[FIBER].alloc()).motion(_stage, _stageScript, _groupScript[phase++]);
  285.     }
  286.     
  287.     public function update() : Boolean {
  288.         for (var i:int=0, x:Number=90; i<_player.life; i++, x-=6) _lcd.print(x, 0'a');
  289.         _lcd.print( 00String(score));
  290.         switch (id) {
  291.         case 0:
  292.             _lcd.print(032"-TINY CANNON ML-"); _lcd.print(664"PRESS SHOT KEY");
  293.             if (frameCount>30 && (_key.keys & 16)) {
  294.                 _actorManager[BULLET].freeAll();
  295.                 _actorManager[ENEMY].freeAll();
  296.                 _player.init(48,80);
  297.                 _player.life = 3;
  298.                 score = 0;
  299.                 phase = initPhase;
  300.                 changeScene(1);
  301.             }
  302.             break;
  303.         case 1:
  304.             if (frameCount<60) _lcd.print(2744"PHASE:"+String(phase));
  305.             if (_actorManager[ENEMY].isEmpty) changeScene(1);
  306.             return true;
  307.         case 2:
  308.             _lcd.print(944"- GAME OVER -");
  309.             if (frameCount>30 && (_key.keys & 16)) changeScene(0);
  310.             break;
  311.         case 3:
  312.             _lcd.print(1544"ALL CLEAR !");
  313.             if (frameCount>30 && (_key.keys & 16)) changeScene(0);
  314.             break;
  315.         }
  316.         return false;
  317.     }
  318. }
  319. class ActorManager {
  320.     private var _actorClass:Class, _evaluator:ActorManager, _freeList:Actor, _activeList:Actor;
  321.     public  var _pattern:Vector.<BitmapData> = new Vector.<BitmapData>();
  322.     public  var _size2:Vector.<Number> = new Vector.<Number>();
  323.     
  324.     public function get isEmpty() : Boolean { return (_activeList.next==_activeList); }
  325.     
  326.     function ActorManager(actorClass:Class, evaluator:ActorManager=null) {
  327.         _actorClass = actorClass;
  328.         _evaluator = evaluator;
  329.         _freeList = new Actor(this);
  330.         _activeList = new Actor(this);
  331.     }
  332.     
  333.     public function pat(hex:String, h:int=8, size:Number=0) : ActorManager {
  334.         _pattern.push(LCDRender.hex2bmp(hex, h, ((h-1)>>3) + 1));
  335.         _size2.push(size*size);
  336.         return this;
  337.     }
  338.     
  339.     public function alloc() : Actor {
  340.         var actor:Actor = _freeList.pop() || new _actorClass(this);
  341.         _activeList.push(actor);
  342.         return actor;
  343.     }
  344.     
  345.     public function free(act:Actor) : Actor {
  346.         var next:Actor = act.next;
  347.         act.prodNum++;
  348.         act.remove();
  349.         _freeList.push(act);
  350.         return next;
  351.     }
  352.     
  353.     public function updateAll() : void {
  354.         for (var act:Actor=_activeList.next; act!=_activeList; act=act.update(_evaluator));
  355.     }
  356.     
  357.     public function freeAll() : void {
  358.         for (var act:Actor=_activeList.next; act!=_activeList; act=free(act));
  359.     }
  360.     
  361.     public function hitEval(obj:Actor, dist2:Number) : int {
  362.         for (var cnt:int=0, act:Actor=_activeList.next; act!=_activeList; act=act.next)  {
  363.             var dx:Number = act.x - obj.x, dy:Number = act.y - obj.y;
  364.             if (dx*dx+dy*dy < dist2) { act=free(act).prev; cnt++; }
  365.         }
  366.         return cnt;
  367.     }
  368. }
  369. class Actor {
  370.     public var x:Number, y:Number, vx:Number, vy:Number, ax:Number, ay:Number, ac:int;
  371.     public var childManager:ActorManager, life:int, bonus:int, range:Boolean, patNum:int, prodNum:int=0;
  372.     protected var _manager:ActorManager;
  373.     
  374.     function Actor(manager:ActorManager) {
  375.         _manager = manager;
  376.         prev = this
  377.         next = this;
  378.     }
  379.     
  380.     public function init(x:Number, y:Number, vx:Number=0, vy:Number=0, patNum:int=0) : Actor {
  381.         pos(x, y).vel(vx, vy).acc(000);
  382.         this.patNum = patNum;
  383.         range = true;
  384.         life = 0;
  385.         bonus = 0;
  386.         childManager = _actorManager[BULLET];
  387.         return this;
  388.     }
  389.     
  390.     public function pos(x:Number, y:Number) : Actor {
  391.         this.x = x;
  392.         this.y = y;
  393.         return this;
  394.     }
  395.     
  396.     public function vel(vx:Number, vy:Number, term:int=0) : Actor {
  397.         if (term == 0) {
  398.             this.vx = vx;
  399.             this.vy = vy;
  400.         } else {
  401.             var n:Number = 1 / term;
  402.             acc((vx-this.vx)*n, (vy-this.vy)*n, term);
  403.         }
  404.         return this;
  405.     }
  406.     
  407.     public function acc(ax:Number, ay:Number, ac:int) : Actor {
  408.         this.ax = ax;
  409.         this.ay = ay;
  410.         this.ac = ac;
  411.         return this;
  412.     }
  413.     
  414.     public function update(eval:ActorManager) : Actor {
  415.         x += vx + ax * 0.5;
  416.         y += vy + ax * 0.5;
  417.         vx += ax;
  418.         vy += ay;
  419.         if (--ac == 0) { ax=0; ay=0; }
  420.         if (range && (x<0 || x>95 || y<0 || y>95)) return _manager.free(this);
  421.         if (eval && life>0 && (life-=eval.hitEval(this, _manager._size2[patNum]))<=0) {
  422.             score += bonus;
  423.             _actorManager[EXPLOSION].alloc().init(x, y, vx, vy+1).vel(0,0,20);
  424.             _beep.play(64,4,-8);
  425.             return _manager.free(this);
  426.         }
  427.         _lcd.gprint(x+0.5, y+0.5, _manager._pattern[patNum]);
  428.         return next;
  429.     }
  430.     
  431.     public function kill() : void {
  432.         _manager.free(this);
  433.     }
  434.     
  435.     public var prev:Actor, next:Actor;
  436.     public function push(act:Actor) : void { act.next=this; act.prev=prev; prev.next=act; prev=act; }
  437.     public function pop() : Actor { return (prev==this) ? null : prev.remove(); }
  438.     public function remove() : Actor { prev.next=next; next.prev=prev; return this; }
  439. }
  440. class Player extends Actor {
  441.     private var _status:int, _statusCount:int, _statusCounts:Vector.<int>=Vector.<int>([20,60,0,0]);
  442.     public var prevShot:int=0, shotFiber:Fiber=null;
  443.     
  444.     function Player(manager:ActorManager) { super(manager); }
  445.     
  446.     override public function update(eval:ActorManager) : Actor {
  447.         var inkey:uint = _key.keys;
  448.         if (--_statusCount == 0) changeStatus(_status+1);
  449.         if (_status == 0) {
  450.             y -= _statusCount*0.2;
  451.         } else {
  452.             vx = ((inkey>>2) & 1) - (inkey & 1);
  453.             vy = ((inkey>>3) & 1) - ((inkey>>1) & 1);
  454.             if ((inkey & 32) == 0) { vx<<=1; vy<<=1; }
  455.             inkey &= 48;
  456.             if (inkey != prevShot) {
  457.                 if (shotFiber) { shotFiber.kill(); shotFiber = null; }
  458.                 if (inkey&16) shotFiber = Fiber(_actorManager[FIBER].alloc()).motion(this, shotScript[int(inkey==48)]);
  459.             }
  460.             prevShot = inkey;
  461.             if (x+vx<3 || x+vx>92) vx=0;
  462.             if (y+vy<3 || y+vy>92) vy=0;
  463.             x += vx;
  464.             y += vy;
  465.         }
  466.         if (_status == 2 && eval.hitEval(this4)) miss();
  467.         if (_status == 2 || (frameCount & 1)) _lcd.gprint(x, y, _manager._pattern[0]);
  468.         return next;
  469.     }
  470.     
  471.     public function changeStatus(s:int) : void {
  472.         _status = s;
  473.         _statusCount = _statusCounts[s];
  474.         if (s==0) y+=38;
  475.     }
  476.     
  477.     public function miss() : void {
  478.         if (shotFiber) { shotFiber.kill(); shotFiber = null; }
  479.         for (var i:int=0; i<8; i++) 
  480.             _actorManager[EXPLOSION].alloc().init(x, y, Math.random()*4-2, Math.random()*2-1).vel(0,0,20);
  481.         _beep.play(192,40,-4);
  482.         if (--life == 0) _sceneManager.changeScene(2);
  483.         else changeStatus(0);
  484.     }
  485. }
  486. class Explosion extends Actor {
  487.     private var _animCount:int;
  488.     
  489.     function Explosion(manager:ActorManager) { super(manager); }
  490.     
  491.     override public function init(x:Number, y:Number, vx:Number=0, vy:Number=0, patNum:int=0) : Actor {
  492.         _animCount = 0;
  493.         return super.init(x, y, vx, vy, patNum);
  494.     }
  495.     
  496.     override public function update(eval:ActorManager) : Actor {
  497.         patNum = (++_animCount)>>2;
  498.         return (_animCount==19) ? _manager.free(this) : super.update(eval);
  499.     }
  500. }
  501. class Fiber extends Actor {
  502.     private const VRAT:Number = 0.2;
  503.     private const ARAT:Number = 0.04;
  504.     
  505.     public var actor:Actor, script:String, prevScript:String, counter:int, childScript:Vector.<String>;
  506.     private var _bc:int, _ba:Number, _bv:Number, _interval:int, _prodNum:int, _loopStac:Array = [];
  507.     public var rex:RegExp = /(h[avtsr]|bv|[av]d|ko|&[clp]|[pvaiwfb@[\]])([-\d]+)?,?([-\d]+)?,?([-\d]+)?(\{)?(\$(\d+))?/g;
  508.     public var rex2:RegExp = /[{}]/g;
  509.     
  510.     function Fiber(manager:ActorManager) { super(manager); }
  511.     public function motion(actor:Actor, script:String, childScript:Array=null) : Fiber {
  512.         pos(00).vel(00).acc(002);
  513.         _bc = 1;
  514.         _ba = 0;
  515.         _bv = 0;
  516.         _interval = 0;
  517.         this.actor  = actor;
  518.         this.script = script;
  519.         this.childScript = (childScript) ? Vector.<String>(childScript) : new Vector.<String>();
  520.         prevScript = null;
  521.         _prodNum = actor.prodNum;
  522.         childManager = actor.childManager;
  523.         counter = 1;
  524.         _loopStac.length = 0;
  525.         rex.lastIndex = 0;
  526.         return this;
  527.     }
  528.     
  529.     override public function update(eval:ActorManager) : Actor {
  530.         var res:*, p0:int, p1:int, p2:int, i:int, n:Number;
  531.         if (actor.prodNum != _prodNum) return _manager.free(this);
  532.         if (--counter == 0) {
  533.             for (res = rex.exec(script); res; res = rex.exec(script)) {
  534.                 p0 = res[2] || 0;
  535.                 p1 = res[3] || 0;
  536.                 p2 = res[4] || 0;
  537.                 switch (res[1]) {
  538.                 case 'w': counter = p0; return next;
  539.                 case 'i': _interval = p0; break;
  540.                 case 'p': actor.pos(p0, p1); break;
  541.                 case 'v': actor.vel(p0*VRAT, p1*VRAT, _interval); break;
  542.                 case 'a': actor.acc(p0*ARAT, p1*ARAT, 0); break;
  543.                 case 'f': _fire(p0 * VRAT, seq()); break;
  544.                 case 'ha': acc(p0, 00); break;
  545.                 case 'hv': acc(p0, 01); break;
  546.                 case 'ht': acc(p0, 02); break;
  547.                 case 'hs': ax=p0; ac=3break;
  548.                 case 'hr': acc(p0, 04); break;
  549.                 case 'bv': vy = p0 * VRAT; break;
  550.                 case 'b': _bc = p0 || 1; _ba = p1*0.017453292519943295; _bv = p2*VRAT; break;
  551.                 case '@': Fiber(_actorManager[FIBER].alloc()).motion(actor, seq()); break;
  552.                 case '&l': actor.life = p0; actor.bonus = p0*10; actor.range = (p1 == 0); break;
  553.                 case '&p': actor.patNum = p0; break;
  554.                 case '&c': childManager = _actorManager[BULLET+p0]; break;
  555.                 case 'ko': actor.kill(); return _manager.free(this);
  556.                 case '[': _loopStac.unshift({c:p0, p:rex.lastIndex}); break;
  557.                 case ']'
  558.                     if (--_loopStac[0].c == 0) _loopStac.shift();
  559.                     else rex.lastIndex = _loopStac[0].p;
  560.                     break;
  561.                 case 'vd':
  562.                     i = int(angle * 651.8986469044033) & 4095;
  563.                     actor.vel(sin[i+1024]*p0*VRAT, sin[i]*p0*VRAT, _interval);
  564.                     break;
  565.                 case 'ad':
  566.                     i = int(angle * 651.8986469044033) & 4095;
  567.                     actor.acc(sin[i+1024]*p0*VRAT, sin[i]*p0*VRAT, 0);
  568.                     break;
  569.                 }
  570.             }
  571.             counter = 0;
  572.             return _manager.free(this);
  573.         }
  574.         return next;
  575.         
  576.         function seq() : String {
  577.             if (res[5]) {
  578.                 rex2.lastIndex = rex.lastIndex;
  579.                 for (res=rex2.exec(script), i=1; res; res=rex2.exec(script)) {
  580.                     i += (res[0]=='{');
  581.                     if (res[0] == '}' && --i == 0) {
  582.                         prevScript = script.substring(rex.lastIndex, rex2.lastIndex - 1);
  583.                         break;
  584.                     }
  585.                 }
  586.                 rex.lastIndex = rex2.lastIndex;
  587.             }
  588.             if (res[7]) prevScript = childScript[int(res[7])];
  589.             return prevScript;
  590.         }
  591.     }
  592.     
  593.     public function get angle() : Number {
  594.         switch (ac) {
  595.         case 0: ay = ax * 0.017453292519943295 + 1.5707963267948965break;
  596.         case 1: ay = ax * 0.017453292519943295 + Math.atan2(actor.vy, actor.vx); break;
  597.         case 2: ay = ax * 0.017453292519943295 + Math.atan2(_player.y-actor.y, _player.x-actor.x); break;
  598.         case 3: ay += ax * 0.017453292519943295break;
  599.         case 4: ay = (Math.random()-0.5) * ax * 0.017453292519943295 + 1.5707963267948965break;
  600.         }
  601.         return ay;
  602.     }
  603.     
  604.     private function _fire(vel:Number, script:String) : void {
  605.         vx = (vel = vel || (vx+vy));
  606.         var i:int, iang:int, ang:Number=angle, div:Number = (_bc>1) ? 1/(_bc-1) : 1,
  607.             astep:Number = _ba*div, vstep:Number = _bv*div, fired:Actor;
  608.         for (i=0, ang-=_ba*0.5, vel-=_bv*0.5; i<_bc; i++, ang+=astep, vel+=vstep) {
  609.             iang = int(ang*651.8986469044033)&4095;
  610.             fired = childManager.alloc().init(actor.x, actor.y, sin[iang+1024]*vel, sin[iang]*vel);
  611.             if (script) Fiber(_actorManager[FIBER].alloc()).motion(fired, script);
  612.         }
  613.     }
  614. }
noswf
  1. // forked from keim_at_Si's shmups on LCD
  2. // forked from keim_at_Si's wonderflでポケコン
  3. //   phase 6 + Beep音.
  4. //   move;arrow or wasd/shot;ctrl,z,n/slow;shift,x,m
  5. //--------------------------------------------------
  6. package {
  7.     import flash.display.*;
  8.     import flash.events.*;
  9.     [SWF(width="465", height="465", backgroundColor="0", frameRate="30")]
  10.     public class main extends Sprite {
  11.         function main() {
  12.             // key mapping
  13.             _key = new KeyMapper(stage);
  14.             _key.map(0,37,65).map(1,38,87).map(2,39,68).map(3,40,83).map(4,17,90,78).map(5,16,88,77);
  15.             // lcd render
  16.             _lcd = new LCDRender();
  17.             _lcd.charMap[65] = LCDRender.hex2bmp("70607c6070");
  18.             addChild(_lcd);
  19.             addEventListener("enterFrame", _onEnterFrame);
  20.             
  21.             // beep
  22.             _beep = new Beep();
  23.             _actorManager[FIBER]     = new ActorManager(Fiber);
  24.             _actorManager[BULLET]    = new ActorManager(Actor).pat("070507"3).pat("0e1b111b0e"5);
  25.             _actorManager[SHOT]      = new ActorManager(Actor).pat("3f0000003f"6).pat("3f"6);
  26.             _actorManager[ENEMY]     = new ActorManager(Actor, _actorManager[SHOT]);
  27.             _actorManager[PARTICLE]  = new ActorManager(Actor).pat("01"1);
  28.             _actorManager[EXPLOSION] = new ActorManager(Explosion);
  29.             _actorManager[ENEMY].pat("583c563f3f563c58"76).pat("2b7e353c3c357e2b"1420).pat("2b7e353c3c357e2b"2120).pat("01"1);
  30.             _actorManager[EXPLOSION].pat("0000060909060000").pat("1669b9c644463d02").pat("1285324884844a30");
  31.             _actorManager[EXPLOSION].pat("0002000060905021").pat("0000000000000080");
  32.             for (var i:int=0, p:Number=0; i<5120; i++, p+=0.0015339807878856411) sin[i] = Math.sin(p);
  33.             _player = Player(_playerManager.alloc());
  34.             _player.changeStatus(0);
  35.             _player.life = 3;
  36.             score = 0;
  37.             _sceneManager.changeScene(0);
  38.         }
  39.         private function _onEnterFrame(e:Event) : void {
  40.             frameCount++;
  41.             _lcd.cls();
  42.             if (frameCount & 1) _actorManager[PARTICLE].alloc().init(Math.random()*9600int(Math.random()*3)+1);
  43.             if (_sceneManager.update()) _player.update(_actorManager[BULLET]);
  44.             for (var i:int = 0; i<6; i++) _actorManager[i].updateAll();
  45.             _lcd.render();
  46.         }
  47.     }
  48. }
  49. // internal variables
  50. const FIBER:int = 0;
  51. const BULLET:int = 1;
  52. const SHOT:int = 2;
  53. const ENEMY:int = 3;
  54. const PARTICLE:int = 4;
  55. const EXPLOSION:int = 5;
  56. var sin:Vector.<Number> = new Vector.<Number>(5120true);
  57. var _lcd:LCDRender;
  58. var _key:KeyMapper;
  59. var _beep:Beep;
  60. var _sceneManager:SceneManager = new SceneManager();
  61. var _playerManager:ActorManager = new ActorManager(Player).pat("7820782f782078"7);
  62. var _actorManager:Vector.<ActorManager> = new Vector.<ActorManager>(6true);
  63. var _player:Player;
  64. var frameCount:int;
  65. var score:int;
  66. var phase:int;
  67. var shotScript:Vector.<String> = Vector.<String>([
  68.     "&c1[99999ha180f40{&p0}f{&p1v20w1ha190vd40}f{&p1v-20w1ha170vd40}w2f40{&p0}40w2f40f{&p1v20w1ha200vd40}f{&p1v-20w1ha160vd40}w2f40{&p0}w2]",
  69.     "&c1[99999ha180f40{&p0}f{&p1v20w1v0,-40}f{&p1v-20w1v0,-40}w2]"
  70. ]);
  71. import flash.display.*;
  72. import flash.geom.*;
  73. import flash.filters.*;
  74. import flash.events.*;
  75. import flash.media.*;
  76. import flash.utils.*;
  77. class LCDRender extends Bitmap {
  78.     public var data:BitmapData = new BitmapData(9696false0);
  79.     public var charMap:Vector.<BitmapData> = Vector.<BitmapData>([
  80.         hex2bmp("0000000000"), hex2bmp("00005f0000"), hex2bmp("0003000300"), hex2bmp("143e143e14"), //  !"#
  81.         hex2bmp("242a7f2a12"), hex2bmp("4c2c106864"), hex2bmp("3649592650"), hex2bmp("0000030000"), // $%&'
  82.         hex2bmp("001c224100"), hex2bmp("0041221c00"), hex2bmp("22143e1422"), hex2bmp("08083e0808"), // ()*+
  83.         hex2bmp("0050300000"), hex2bmp("0808080808"), hex2bmp("0060600000"), hex2bmp("2010080402"), // ,-./
  84.         hex2bmp("3e5149453e"), hex2bmp("00427f4000"), hex2bmp("4261514946"), hex2bmp("2241494936"), // 0123
  85.         hex2bmp("3824227f20"), hex2bmp("4f49494931"), hex2bmp("3e49494932"), hex2bmp("0301710907"), // 4567
  86.         hex2bmp("3649494936"), hex2bmp("264949493e"), hex2bmp("0036360000"), hex2bmp("0056360000"), // 89:;
  87.         hex2bmp("0814224100"), hex2bmp("1414141414"), hex2bmp("0041221408"), hex2bmp("0201510906"), // <=>?
  88.         hex2bmp("3e4159551e"), hex2bmp("7c2221227c"), hex2bmp("7f49494936"), hex2bmp("3e41414122"), // @ABC
  89.         hex2bmp("7f4141423c"), hex2bmp("7f49494941"), hex2bmp("7f09090901"), hex2bmp("3e4149493a"), // DEFG
  90.         hex2bmp("7f0808087f"), hex2bmp("00417f4100"), hex2bmp("2040413f01"), hex2bmp("7f08142241"), // HIJK
  91.         hex2bmp("7f40404040"), hex2bmp("7f020c027f"), hex2bmp("7f0408107f"), hex2bmp("3e4141413e"), // LMNO
  92.         hex2bmp("7f09090906"), hex2bmp("3e4151215e"), hex2bmp("7f09192946"), hex2bmp("2649494932"), // PQRS
  93.         hex2bmp("01017f0101"), hex2bmp("3f4040403f"), hex2bmp("1f2040201f"), hex2bmp("1f601c601f"), // TUVW
  94.         hex2bmp("6314081463"), hex2bmp("0708700807"), hex2bmp("6151494543"), hex2bmp("00007f4100"), // XYZ[
  95.         hex2bmp("0204081020"), hex2bmp("00417f0000"), hex2bmp("0002010200"), hex2bmp("4040404040"), // \]^_
  96.     ]);
  97.     
  98.     private var _screen:BitmapData = new BitmapData(384384true0);
  99.     private var _display:BitmapData = new BitmapData(400400false0);
  100.     private var _cls:BitmapData = new BitmapData(400400false0);
  101.     private var _matS2D:Matrix = new Matrix(1,0,0,1,8,8);
  102.     private var _shadow:DropShadowFilter = new DropShadowFilter(44500.666);
  103.     private var _residueMap:Vector.<Number> = new Vector.<Number>(9216true);
  104.     private var _toneFilter:uint, _dotColor:uint, _residue:Number;
  105.     private var _dot:Rectangle = new Rectangle(0,0,3,3);
  106.     private var _pt:Point = new Point();
  107.     private var _shape:Shape = new Shape();
  108.     
  109.     static public function hex2bmp(hex:String, height:int=8, scale:int=1) : BitmapData {
  110.         var i:int, pat:int,
  111.             rect:Rectangle = new Rectangle(00, scale, scale),
  112.             bmp:BitmapData = new BitmapData((hex.length>>1)*scale, height, true0);
  113.         for (i=0, rect.x=0; i<hex.length; i+=2, rect.x+=scale)
  114.             for (rect.y=0, pat=parseInt(hex.substr(i, 2), 16); pat!=0; rect.y+=scale, pat>>=1) {
  115.                 bmp.fillRect(rect, -(pat&1));
  116.             }
  117.         return bmp;
  118.     }
  119.     
  120.     function LCDRender(bit:int=2, backColor:uint = 0xb0c0b0, 
  121.                       dot0Color:uint = 0xb0b0b0, dot1Color:uint = 0x000000, residue:Number = 0.4) {
  122.         _toneFilter = (0xff00 >> bit) & 0xff;
  123.         _dotColor = dot1Color;
  124.         _cls.fillRect(_cls.rect, backColor);
  125.         _residue = residue;
  126.         for (_dot.x=8; _dot.x<392; _dot.x+=4)
  127.             for (_dot.y=8; _dot.y<392; _dot.y+=4)
  128.                 _cls.fillRect(_dot, dot0Color);
  129.         charMap.length = 96;
  130.         for (var i:int=32; i<64; i++) charMap[i+32] = charMap[i];
  131.         super(_display);
  132.         x = 32;
  133.         y = 32;
  134.     }
  135.     
  136.     public function cls() : void {
  137.         data.fillRect(data.rect, 0);
  138.     }
  139.     
  140.     public function line(x0:int, y0:int, x1:int, y1:int, color:int=255, thick:Number=1) : void {
  141.         _shape.graphics.clear();
  142.         _shape.graphics.lineStyle(thick, color);
  143.         _shape.graphics.moveTo(x0, y0);
  144.         _shape.graphics.lineTo(x1, y1);
  145.         data.draw(_shape);
  146.     }
  147.     public function gprint(x:int, y:int, bmp:BitmapData) : void {
  148.         _pt.x = x - (bmp.width >> 1);
  149.         _pt.y = y - (bmp.height >> 1);
  150.         data.copyPixels(bmp, bmp.rect, _pt);
  151.     }
  152.         
  153.     public function print(x:int, y:int, str:String) : void {
  154.         _pt.x = x;
  155.         _pt.y = y;
  156.         var bmp:BitmapData;
  157.         for (var i:int=0; i<str.length; i++, _pt.x+=6) {
  158.             bmp = charMap[str.charCodeAt(i)-32];
  159.             data.copyPixels(bmp, bmp.rect, _pt);
  160.         }
  161.     }
  162.     
  163.     public function render() : void {
  164.         var x:int, y:int, gray:int, mask:uint, i:int;
  165.         _screen.fillRect(_screen.rect, 0);
  166.         for (i=0, _dot.y=0, y=0; y<96; _dot.y+=4, y++) {
  167.             for (_dot.x=0, x=0; x<96; _dot.x+=4, x++, i++) {
  168.                 gray = ((data.getPixel(x, y) & _toneFilter)>>1) + int(_residueMap[i]);
  169.                 if (gray > 255) gray = 255;
  170.                 _residueMap[i] = gray * _residue;
  171.                 if (gray) _screen.fillRect(_dot, (gray<<24) | _dotColor);
  172.             }
  173.         }
  174.         _screen.applyFilter(_screen, _screen.rect, _screen.rect.topLeft, _shadow);
  175.         _display.copyPixels(_cls, _cls.rect, _cls.rect.topLeft);
  176.         _display.draw(_screen, _matS2D);
  177.     }
  178. }
  179. class KeyMapper {
  180.     public  var keys:uint = 0;
  181.     private var _map:Vector.<int> = new Vector.<int>(256true);
  182.     
  183.     function KeyMapper(stage:Stage) : void { 
  184.         for (var i:int=0; i<256; i++) _map[i]=31;
  185.         stage.addEventListener("keyDown"function(e:KeyboardEvent) : void {
  186.             keys |= 1<<_map[e.keyCode];
  187.         });
  188.         stage.addEventListener("keyUp",   function(e:KeyboardEvent) : void {
  189.             keys &= ~(1<<_map[e.keyCode]);
  190.         });
  191.     }
  192.     
  193.     public function map(bit:int, ...args) : KeyMapper {
  194.         for (var i:int=0; i<args.length; i++) _map[args[i]] = bit;
  195.         return this;
  196.     }
  197. }
  198. class Beep {
  199.     private var _phase:int, _pitch:int, _count:int, _sweep:int;
  200.     private var _sound:Sound = new Sound();
  201.     private var _step:Vector.<int> = new Vector.<int>(256true);
  202.     private var _wave:Vector.<Number> = new Vector.<Number>(16true);
  203.     
  204.     function Beep() {
  205.         var i:int;
  206.         _sound.addEventListener("sampleData", _onStream);
  207.         for (i=0; i<16; i++) _wave[i] = 0;
  208.         for (i=0; i<256; i++) _step[i] = i;
  209.         _wave[14] = -(_wave[15] = 0.1);
  210.         _sweep = _count = _pitch = _phase = 0;
  211.         _sound.play();
  212.     }
  213.     
  214.     public function play(pitch:int, length:int, sweep:int) : void {
  215.         _pitch = pitch;
  216.         _count = length+1;
  217.         _sweep = sweep;
  218.     }
  219.     
  220.     private function _onStream(e:SampleDataEvent) : void {
  221.         var l:int, i:int, n:Number, data:ByteArray = e.data;
  222.         for (l=0; l<2; l++) {
  223.             if (--_count == 0) { _pitch = _sweep = 0; }
  224.             _pitch += _sweep;
  225.             for (i=0; i<1024; i++) {
  226.                 _phase = (_phase+_step[_pitch&255]) & 4095;
  227.                 data.writeFloat(_wave[_phase>>8]);
  228.                 data.writeFloat(_wave[_phase>>8]);
  229.             }
  230.         }
  231.     }
  232. }
  233. class SceneManager {
  234.     public var id:int;
  235.     public var initPhase:int = 0;
  236.     private var _stage:Actor, _stageScript:String;
  237.     private var _groupScript:Array = [
  238.         ["&c2&p3p6v12[8f{&l1vd24i20vw10f8w10vd-20}w2]ko",
  239.          "&c2&p3p90v-12[8f{&l1vd24i20vw10f8w10vd-20}w2]ko"
  240.          "&p1&l20v0,12i8v0,1w8[2ha-56f8hs16[7w5f8]w5ha56f8hs-16[7w5f8]w5]a0,1",
  241.          "[40ha90f100{w1b5,120f10{&p1}ko}ha-90f100w30]"],
  242.         ["&c2&p3p12v24[5f{&l2v0,20i10vw10ht[6f-10{i30hv180vd20}w1hs0]w30hti60vd40}w2]ko",
  243.          "&c2&p3p84v-24[5f{&l2v0,20i10vw10ht[6f-10{i30hv180vd20}w1hs0]w30hti60vd40}w2]ko"
  244.          "&p1&l20v0,12i8v0,1w8b3,40ht10f6w24ht-10f6w48a0,1",
  245.          "[20b4,100htf8{&p0}w3b1ha135[5f15{&p1i10vw10vd20}w1]w11ha215[5f15w1]w8]"],
  246.         ["&c2&p3p6v12[8f{&l1b2,0,2vd24i20vw10f8w10vd-20}w2]ko",
  247.          "&c2&p3p90v-12[8f{&l1b2,0,2vd24i20vw10f8w10vd-20}w2]ko"
  248.          "&p1&l20v0,12i8v0,1w8b4,60,6f8{&p1}w24b4,60,-6f8w48a0,1",
  249.          "[20haf20{&p1i15vw20hab12,330f5w10ha15b12,330f10ko}[2ha90f50{w1vd-4w1hv[4f-15{&p1}w2]ko}w16ha-90f50w16]]"],
  250.         ["&c2&p3p4,16[4f{&l3hr60[2v20,1w6f8w12v-20,1w6f8w12]}w2]ko",
  251.          "&c2&p3p92,16[4f{&l3hr60[2v-20,1w6f8w12v20,1w6f8w12]}w2]ko"
  252.          "&p1&l20v0,12i8v0,1w8[3b3,40f1{&p1hvi40vd12}w16]a0,1",
  253.          "b4,120[40ht40f6{&p1}hs-10bv2[4w2f]w12ht-40f6hs10bv2[4w2f]w12]"],
  254.         ["&c2&p3p6v10[4f{&l2v0,48i10vw10a0,-1hr90b3,240[f4w20]}w4]fko",
  255.          "&c2&p3p90v-10[4f{&l2v0,48i10vw10a0,-1hr90b3,240[f4w20]}w4]ko",
  256.          "&p1&l20v0,12i8v0,1w8[2b2,10ht8f6hs-2bv1[7fw2]ht-8f6hs2bv1[7fw2]w24]a0,1",
  257.          "ha[40b1f{vb7,120f8{&p1}hsw20b6,100f16{&p0}ko}[8w1b2,60f-10{&p1[60ad1w2]}]w24]"],
  258.         ["&c2&p3p84[2f{&l4i4v0,20w4bv2f6[3v-20,0w4v0,-16fw4v20,0w4v0,24fw4]}w8]ko",
  259.          "&c2&p3p12[2f{&l4i4v0,20w4bv2f6[3v20,0w4v0,-16fw4v-20,0w4v0,24fw4]}w8]ko",
  260.          "&p1&l20v0,12i8v0,1w8[2ha-48f6{&p1}hs16bv1[5w2f]w6ha40f6hs-16bv1[5w2f]w6]a0,1",
  261.          "@{b3,240hs10[320f20{&p1hv90w5f10}w4]}b3,240hs-10[320f20{&p1hv90w5f10}w4]"]
  262.     ];
  263.     function SceneManager() {
  264.         _stageScript  = "&c2&p3&l0,1p48w64[2f$0w32f$1w32]f$0w16f$1w16f$2w48p24f$2p72f$2w64";
  265.         _stageScript += "[2f$0w24p16f$2w24f$1w24p84f$2w24]w32p24f$2p72f$2[2w16f$0w16f$1]w64p48f$3ko";
  266.         for (var i:int=0; i<_groupScript.length; i++) {
  267.             _groupScript[i][3] = "&p2&l100v0,20i8v0,1w8@{v10[10i64v-10w64v10w64]a0,1}"+_groupScript[i][3];
  268.         }
  269.     }
  270.     
  271.     public function changeScene(id:int) : void {
  272.         this.id = id;
  273.         frameCount = 0;
  274.         switch (id) {
  275.         case 1: _start(); break;
  276.         case 2: _stage.kill(); break;
  277.         }
  278.     }
  279.     
  280.     private function _start() : void {
  281.         _beep.play(0,32,32);
  282.         if (phase == _groupScript.length) { changeScene(3); return; }
  283.         _stage = _actorManager[ENEMY].alloc().init(480002);
  284.         Fiber(_actorManager[FIBER].alloc()).motion(_stage, _stageScript, _groupScript[phase++]);
  285.     }
  286.     
  287.     public function update() : Boolean {
  288.         for (var i:int=0, x:Number=90; i<_player.life; i++, x-=6) _lcd.print(x, 0'a');
  289.         _lcd.print( 00String(score));
  290.         switch (id) {
  291.         case 0:
  292.             _lcd.print(032"-TINY CANNON ML-"); _lcd.print(664"PRESS SHOT KEY");
  293.             if (frameCount>30 && (_key.keys & 16)) {
  294.                 _actorManager[BULLET].freeAll();
  295.                 _actorManager[ENEMY].freeAll();
  296.                 _player.init(48,80);
  297.                 _player.life = 3;
  298.                 score = 0;
  299.                 phase = initPhase;
  300.                 changeScene(1);
  301.             }
  302.             break;
  303.         case 1:
  304.             if (frameCount<60) _lcd.print(2744"PHASE:"+String(phase));
  305.             if (_actorManager[ENEMY].isEmpty) changeScene(1);
  306.             return true;
  307.         case 2:
  308.             _lcd.print(944"- GAME OVER -");
  309.             if (frameCount>30 && (_key.keys & 16)) changeScene(0);
  310.             break;
  311.         case 3:
  312.             _lcd.print(1544"ALL CLEAR !");
  313.             if (frameCount>30 && (_key.keys & 16)) changeScene(0);
  314.             break;
  315.         }
  316.         return false;
  317.     }
  318. }
  319. class ActorManager {
  320.     private var _actorClass:Class, _evaluator:ActorManager, _freeList:Actor, _activeList:Actor;
  321.     public  var _pattern:Vector.<BitmapData> = new Vector.<BitmapData>();
  322.     public  var _size2:Vector.<Number> = new Vector.<Number>();
  323.     
  324.     public function get isEmpty() : Boolean { return (_activeList.next==_activeList); }
  325.     
  326.     function ActorManager(actorClass:Class, evaluator:ActorManager=null) {
  327.         _actorClass = actorClass;
  328.         _evaluator = evaluator;
  329.         _freeList = new Actor(this);
  330.         _activeList = new Actor(this);
  331.     }
  332.     
  333.     public function pat(hex:String, h:int=8, size:Number=0) : ActorManager {
  334.         _pattern.push(LCDRender.hex2bmp(hex, h, ((h-1)>>3) + 1));
  335.         _size2.push(size*size);
  336.         return this;
  337.     }
  338.     
  339.     public function alloc() : Actor {
  340.         var actor:Actor = _freeList.pop() || new _actorClass(this);
  341.         _activeList.push(actor);
  342.         return actor;
  343.     }
  344.     
  345.     public function free(act:Actor) : Actor {
  346.         var next:Actor = act.next;
  347.         act.prodNum++;
  348.         act.remove();
  349.         _freeList.push(act);
  350.         return next;
  351.     }
  352.     
  353.     public function updateAll() : void {
  354.         for (var act:Actor=_activeList.next; act!=_activeList; act=act.update(_evaluator));
  355.     }
  356.     
  357.     public function freeAll() : void {
  358.         for (var act:Actor=_activeList.next; act!=_activeList; act=free(act));
  359.     }
  360.     
  361.     public function hitEval(obj:Actor, dist2:Number) : int {
  362.         for (var cnt:int=0, act:Actor=_activeList.next; act!=_activeList; act=act.next)  {
  363.             var dx:Number = act.x - obj.x, dy:Number = act.y - obj.y;
  364.             if (dx*dx+dy*dy < dist2) { act=free(act).prev; cnt++; }
  365.         }
  366.         return cnt;
  367.     }
  368. }
  369. class Actor {
  370.     public var x:Number, y:Number, vx:Number, vy:Number, ax:Number, ay:Number, ac:int;
  371.     public var childManager:ActorManager, life:int, bonus:int, range:Boolean, patNum:int, prodNum:int=0;
  372.     protected var _manager:ActorManager;
  373.     
  374.     function Actor(manager:ActorManager) {
  375.         _manager = manager;
  376.         prev = this
  377.         next = this;
  378.     }
  379.     
  380.     public function init(x:Number, y:Number, vx:Number=0, vy:Number=0, patNum:int=0) : Actor {
  381.         pos(x, y).vel(vx, vy).acc(000);
  382.         this.patNum = patNum;
  383.         range = true;
  384.         life = 0;
  385.         bonus = 0;
  386.         childManager = _actorManager[BULLET];
  387.         return this;
  388.     }
  389.     
  390.     public function pos(x:Number, y:Number) : Actor {
  391.         this.x = x;
  392.         this.y = y;
  393.         return this;
  394.     }
  395.     
  396.     public function vel(vx:Number, vy:Number, term:int=0) : Actor {
  397.         if (term == 0) {
  398.             this.vx = vx;
  399.             this.vy = vy;
  400.         } else {
  401.             var n:Number = 1 / term;
  402.             acc((vx-this.vx)*n, (vy-this.vy)*n, term);
  403.         }
  404.         return this;
  405.     }
  406.     
  407.     public function acc(ax:Number, ay:Number, ac:int) : Actor {
  408.         this.ax = ax;
  409.         this.ay = ay;
  410.         this.ac = ac;
  411.         return this;
  412.     }
  413.     
  414.     public function update(eval:ActorManager) : Actor {
  415.         x += vx + ax * 0.5;
  416.         y += vy + ax * 0.5;
  417.         vx += ax;
  418.         vy += ay;
  419.         if (--ac == 0) { ax=0; ay=0; }
  420.         if (range && (x<0 || x>95 || y<0 || y>95)) return _manager.free(this);
  421.         if (eval && life>0 && (life-=eval.hitEval(this, _manager._size2[patNum]))<=0) {
  422.             score += bonus;
  423.             _actorManager[EXPLOSION].alloc().init(x, y, vx, vy+1).vel(0,0,20);
  424.             _beep.play(64,4,-8);
  425.             return _manager.free(this);
  426.         }
  427.         _lcd.gprint(x+0.5, y+0.5, _manager._pattern[patNum]);
  428.         return next;
  429.     }
  430.     
  431.     public function kill() : void {
  432.         _manager.free(this);
  433.     }
  434.     
  435.     public var prev:Actor, next:Actor;
  436.     public function push(act:Actor) : void { act.next=this; act.prev=prev; prev.next=act; prev=act; }
  437.     public function pop() : Actor { return (prev==this) ? null : prev.remove(); }
  438.     public function remove() : Actor { prev.next=next; next.prev=prev; return this; }
  439. }
  440. class Player extends Actor {
  441.     private var _status:int, _statusCount:int, _statusCounts:Vector.<int>=Vector.<int>([20,60,0,0]);
  442.     public var prevShot:int=0, shotFiber:Fiber=null;
  443.     
  444.     function Player(manager:ActorManager) { super(manager); }
  445.     
  446.     override public function update(eval:ActorManager) : Actor {
  447.         var inkey:uint = _key.keys;
  448.         if (--_statusCount == 0) changeStatus(_status+1);
  449.         if (_status == 0) {
  450.             y -= _statusCount*0.2;
  451.         } else {
  452.             vx = ((inkey>>2) & 1) - (inkey & 1);
  453.             vy = ((inkey>>3) & 1) - ((inkey>>1) & 1);
  454.             if ((inkey & 32) == 0) { vx<<=1; vy<<=1; }
  455.             inkey &= 48;
  456.             if (inkey != prevShot) {
  457.                 if (shotFiber) { shotFiber.kill(); shotFiber = null; }
  458.                 if (inkey&16) shotFiber = Fiber(_actorManager[FIBER].alloc()).motion(this, shotScript[int(inkey==48)]);
  459.             }
  460.             prevShot = inkey;
  461.             if (x+vx<3 || x+vx>92) vx=0;
  462.             if (y+vy<3 || y+vy>92) vy=0;
  463.             x += vx;
  464.             y += vy;
  465.         }
  466.         if (_status == 2 && eval.hitEval(this4)) miss();
  467.         if (_status == 2 || (frameCount & 1)) _lcd.gprint(x, y, _manager._pattern[0]);
  468.         return next;
  469.     }
  470.     
  471.     public function changeStatus(s:int) : void {
  472.         _status = s;
  473.         _statusCount = _statusCounts[s];
  474.         if (s==0) y+=38;
  475.     }
  476.     
  477.     public function miss() : void {
  478.         if (shotFiber) { shotFiber.kill(); shotFiber = null; }
  479.         for (var i:int=0; i<8; i++) 
  480.             _actorManager[EXPLOSION].alloc().init(x, y, Math.random()*4-2, Math.random()*2-1).vel(0,0,20);
  481.         _beep.play(192,40,-4);
  482.         if (--life == 0) _sceneManager.changeScene(2);
  483.         else changeStatus(0);
  484.     }
  485. }
  486. class Explosion extends Actor {
  487.     private var _animCount:int;
  488.     
  489.     function Explosion(manager:ActorManager) { super(manager); }
  490.     
  491.     override public function init(x:Number, y:Number, vx:Number=0, vy:Number=0, patNum:int=0) : Actor {
  492.         _animCount = 0;
  493.         return super.init(x, y, vx, vy, patNum);
  494.     }
  495.     
  496.     override public function update(eval:ActorManager) : Actor {
  497.         patNum = (++_animCount)>>2;
  498.         return (_animCount==19) ? _manager.free(this) : super.update(eval);
  499.     }
  500. }
  501. class Fiber extends Actor {
  502.     private const VRAT:Number = 0.2;
  503.     private const ARAT:Number = 0.04;
  504.     
  505.     public var actor:Actor, script:String, prevScript:String, counter:int, childScript:Vector.<String>;
  506.     private var _bc:int, _ba:Number, _bv:Number, _interval:int, _prodNum:int, _loopStac:Array = [];
  507.     public var rex:RegExp = /(h[avtsr]|bv|[av]d|ko|&[clp]|[pvaiwfb@[\]])([-\d]+)?,?([-\d]+)?,?([-\d]+)?(\{)?(\$(\d+))?/g;
  508.     public var rex2:RegExp = /[{}]/g;
  509.     
  510.     function Fiber(manager:ActorManager) { super(manager); }
  511.     public function motion(actor:Actor, script:String, childScript:Array=null) : Fiber {
  512.         pos(00).vel(00).acc(002);
  513.         _bc = 1;
  514.         _ba = 0;
  515.         _bv = 0;
  516.         _interval = 0;
  517.         this.actor  = actor;
  518.         this.script = script;
  519.         this.childScript = (childScript) ? Vector.<String>(childScript) : new Vector.<String>();
  520.         prevScript = null;
  521.         _prodNum = actor.prodNum;
  522.         childManager = actor.childManager;
  523.         counter = 1;
  524.         _loopStac.length = 0;
  525.         rex.lastIndex = 0;
  526.         return this;
  527.     }
  528.     
  529.     override public function update(eval:ActorManager) : Actor {
  530.         var res:*, p0:int, p1:int, p2:int, i:int, n:Number;
  531.         if (actor.prodNum != _prodNum) return _manager.free(this);
  532.         if (--counter == 0) {
  533.             for (res = rex.exec(script); res; res = rex.exec(script)) {
  534.                 p0 = res[2] || 0;
  535.                 p1 = res[3] || 0;
  536.                 p2 = res[4] || 0;
  537.                 switch (res[1]) {
  538.                 case 'w': counter = p0; return next;
  539.                 case 'i': _interval = p0; break;
  540.                 case 'p': actor.pos(p0, p1); break;
  541.                 case 'v': actor.vel(p0*VRAT, p1*VRAT, _interval); break;
  542.                 case 'a': actor.acc(p0*ARAT, p1*ARAT, 0); break;
  543.                 case 'f': _fire(p0 * VRAT, seq()); break;
  544.                 case 'ha': acc(p0, 00); break;
  545.                 case 'hv': acc(p0, 01); break;
  546.                 case 'ht': acc(p0, 02); break;
  547.                 case 'hs': ax=p0; ac=3break;
  548.                 case 'hr': acc(p0, 04); break;
  549.                 case 'bv': vy = p0 * VRAT; break;
  550.                 case 'b': _bc = p0 || 1; _ba = p1*0.017453292519943295; _bv = p2*VRAT; break;
  551.                 case '@': Fiber(_actorManager[FIBER].alloc()).motion(actor, seq()); break;
  552.                 case '&l': actor.life = p0; actor.bonus = p0*10; actor.range = (p1 == 0); break;
  553.                 case '&p': actor.patNum = p0; break;
  554.                 case '&c': childManager = _actorManager[BULLET+p0]; break;
  555.                 case 'ko': actor.kill(); return _manager.free(this);
  556.                 case '[': _loopStac.unshift({c:p0, p:rex.lastIndex}); break;
  557.                 case ']'
  558.                     if (--_loopStac[0].c == 0) _loopStac.shift();
  559.                     else rex.lastIndex = _loopStac[0].p;
  560.                     break;
  561.                 case 'vd':
  562.                     i = int(angle * 651.8986469044033) & 4095;
  563.                     actor.vel(sin[i+1024]*p0*VRAT, sin[i]*p0*VRAT, _interval);
  564.                     break;
  565.                 case 'ad':
  566.                     i = int(angle * 651.8986469044033) & 4095;
  567.                     actor.acc(sin[i+1024]*p0*VRAT, sin[i]*p0*VRAT, 0);
  568.                     break;
  569.                 }
  570.             }
  571.             counter = 0;
  572.             return _manager.free(this);
  573.         }
  574.         return next;
  575.         
  576.         function seq() : String {
  577.             if (res[5]) {
  578.                 rex2.lastIndex = rex.lastIndex;
  579.                 for (res=rex2.exec(script), i=1; res; res=rex2.exec(script)) {
  580.                     i += (res[0]=='{');
  581.                     if (res[0] == '}' && --i == 0) {
  582.                         prevScript = script.substring(rex.lastIndex, rex2.lastIndex - 1);
  583.                         break;
  584.                     }
  585.                 }
  586.                 rex.lastIndex = rex2.lastIndex;
  587.             }
  588.             if (res[7]) prevScript = childScript[int(res[7])];
  589.             return prevScript;
  590.         }
  591.     }
  592.     
  593.     public function get angle() : Number {
  594.         switch (ac) {
  595.         case 0: ay = ax * 0.017453292519943295 + 1.5707963267948965break;
  596.         case 1: ay = ax * 0.017453292519943295 + Math.atan2(actor.vy, actor.vx); break;
  597.         case 2: ay = ax * 0.017453292519943295 + Math.atan2(_player.y-actor.y, _player.x-actor.x); break;
  598.         case 3: ay += ax * 0.017453292519943295break;
  599.         case 4: ay = (Math.random()-0.5) * ax * 0.017453292519943295 + 1.5707963267948965break;
  600.         }
  601.         return ay;
  602.     }
  603.     
  604.     private function _fire(vel:Number, script:String) : void {
  605.         vx = (vel = vel || (vx+vy));
  606.         var i:int, iang:int, ang:Number=angle, div:Number = (_bc>1) ? 1/(_bc-1) : 1,
  607.             astep:Number = _ba*div, vstep:Number = _bv*div, fired:Actor;
  608.         for (i=0, ang-=_ba*0.5, vel-=_bv*0.5; i<_bc; i++, ang+=astep, vel+=vstep) {
  609.             iang = int(ang*651.8986469044033)&4095;
  610.             fired = childManager.alloc().init(actor.x, actor.y, sin[iang+1024]*vel, sin[iang]*vel);
  611.             if (script) Fiber(_actorManager[FIBER].alloc()).motion(fired, script);
  612.         }
  613.     }
  614. }
noswf
  1. // forked from keim_at_Si's shmups on LCD
  2. // forked from keim_at_Si's wonderflでポケコン
  3. //   phase 6 + Beep音.
  4. //   move;arrow or wasd/shot;ctrl,z,n/slow;shift,x,m
  5. //--------------------------------------------------
  6. package {
  7.     import flash.display.*;
  8.     import flash.events.*;
  9.     [SWF(width="465", height="465", backgroundColor="0", frameRate="30")]
  10.     public class main extends Sprite {
  11.         function main() {
  12.             // key mapping
  13.             _key = new KeyMapper(stage);
  14.             _key.map(0,37,65).map(1,38,87).map(2,39,68).map(3,40,83).map(4,17,90,78).map(5,16,88,77);
  15.             // lcd render
  16.             _lcd = new LCDRender();
  17.             _lcd.charMap[65] = LCDRender.hex2bmp("70607c6070");
  18.             addChild(_lcd);
  19.             addEventListener("enterFrame", _onEnterFrame);
  20.             
  21.             // beep
  22.             _beep = new Beep();
  23.             _actorManager[FIBER]     = new ActorManager(Fiber);
  24.             _actorManager[BULLET]    = new ActorManager(Actor).pat("070507"3).pat("0e1b111b0e"5);
  25.             _actorManager[SHOT]      = new ActorManager(Actor).pat("3f0000003f"6).pat("3f"6);
  26.             _actorManager[ENEMY]     = new ActorManager(Actor, _actorManager[SHOT]);
  27.             _actorManager[PARTICLE]  = new ActorManager(Actor).pat("01"1);
  28.             _actorManager[EXPLOSION] = new ActorManager(Explosion);
  29.             _actorManager[ENEMY].pat("583c563f3f563c58"76).pat("2b7e353c3c357e2b"1420).pat("2b7e353c3c357e2b"2120).pat("01"1);
  30.             _actorManager[EXPLOSION].pat("0000060909060000").pat("1669b9c644463d02").pat("1285324884844a30");
  31.             _actorManager[EXPLOSION].pat("0002000060905021").pat("0000000000000080");
  32.             for (var i:int=0, p:Number=0; i<5120; i++, p+=0.0015339807878856411) sin[i] = Math.sin(p);
  33.             _player = Player(_playerManager.alloc());
  34.             _player.changeStatus(0);
  35.             _player.life = 3;
  36.             score = 0;
  37.             _sceneManager.changeScene(0);
  38.         }
  39.         private function _onEnterFrame(e:Event) : void {
  40.             frameCount++;
  41.             _lcd.cls();
  42.             if (frameCount & 1) _actorManager[PARTICLE].alloc().init(Math.random()*9600int(Math.random()*3)+1);
  43.             if (_sceneManager.update()) _player.update(_actorManager[BULLET]);
  44.             for (var i:int = 0; i<6; i++) _actorManager[i].updateAll();
  45.             _lcd.render();
  46.         }
  47.     }
  48. }
  49. // internal variables
  50. const FIBER:int = 0;
  51. const BULLET:int = 1;
  52. const SHOT:int = 2;
  53. const ENEMY:int = 3;
  54. const PARTICLE:int = 4;
  55. const EXPLOSION:int = 5;
  56. var sin:Vector.<Number> = new Vector.<Number>(5120true);
  57. var _lcd:LCDRender;
  58. var _key:KeyMapper;
  59. var _beep:Beep;
  60. var _sceneManager:SceneManager = new SceneManager();
  61. var _playerManager:ActorManager = new ActorManager(Player).pat("7820782f782078"7);
  62. var _actorManager:Vector.<ActorManager> = new Vector.<ActorManager>(6true);
  63. var _player:Player;
  64. var frameCount:int;
  65. var score:int;
  66. var phase:int;
  67. var shotScript:Vector.<String> = Vector.<String>([
  68.     "&c1[99999ha180f40{&p0}f{&p1v20w1ha190vd40}f{&p1v-20w1ha170vd40}w2f40{&p0}40w2f40f{&p1v20w1ha200vd40}f{&p1v-20w1ha160vd40}w2f40{&p0}w2]",
  69.     "&c1[99999ha180f40{&p0}f{&p1v20w1v0,-40}f{&p1v-20w1v0,-40}w2]"
  70. ]);
  71. import flash.display.*;
  72. import flash.geom.*;
  73. import flash.filters.*;
  74. import flash.events.*;
  75. import flash.media.*;
  76. import flash.utils.*;
  77. class LCDRender extends Bitmap {
  78.     public var data:BitmapData = new BitmapData(9696false0);
  79.     public var charMap:Vector.<BitmapData> = Vector.<BitmapData>([
  80.         hex2bmp("0000000000"), hex2bmp("00005f0000"), hex2bmp("0003000300"), hex2bmp("143e143e14"), //  !"#
  81.         hex2bmp("242a7f2a12"), hex2bmp("4c2c106864"), hex2bmp("3649592650"), hex2bmp("0000030000"), // $%&'
  82.         hex2bmp("001c224100"), hex2bmp("0041221c00"), hex2bmp("22143e1422"), hex2bmp("08083e0808"), // ()*+
  83.         hex2bmp("0050300000"), hex2bmp("0808080808"), hex2bmp("0060600000"), hex2bmp("2010080402"), // ,-./
  84.         hex2bmp("3e5149453e"), hex2bmp("00427f4000"), hex2bmp("4261514946"), hex2bmp("2241494936"), // 0123
  85.         hex2bmp("3824227f20"), hex2bmp("4f49494931"), hex2bmp("3e49494932"), hex2bmp("0301710907"), // 4567
  86.         hex2bmp("3649494936"), hex2bmp("264949493e"), hex2bmp("0036360000"), hex2bmp("0056360000"), // 89:;
  87.         hex2bmp("0814224100"), hex2bmp("1414141414"), hex2bmp("0041221408"), hex2bmp("0201510906"), // <=>?
  88.         hex2bmp("3e4159551e"), hex2bmp("7c2221227c"), hex2bmp("7f49494936"), hex2bmp("3e41414122"), // @ABC
  89.         hex2bmp("7f4141423c"), hex2bmp("7f49494941"), hex2bmp("7f09090901"), hex2bmp("3e4149493a"), // DEFG
  90.         hex2bmp("7f0808087f"), hex2bmp("00417f4100"), hex2bmp("2040413f01"), hex2bmp("7f08142241"), // HIJK
  91.         hex2bmp("7f40404040"), hex2bmp("7f020c027f"), hex2bmp("7f0408107f"), hex2bmp("3e4141413e"), // LMNO
  92.         hex2bmp("7f09090906"), hex2bmp("3e4151215e"), hex2bmp("7f09192946"), hex2bmp("2649494932"), // PQRS
  93.         hex2bmp("01017f0101"), hex2bmp("3f4040403f"), hex2bmp("1f2040201f"), hex2bmp("1f601c601f"), // TUVW
  94.         hex2bmp("6314081463"), hex2bmp("0708700807"), hex2bmp("6151494543"), hex2bmp("00007f4100"), // XYZ[
  95.         hex2bmp("0204081020"), hex2bmp("00417f0000"), hex2bmp("0002010200"), hex2bmp("4040404040"), // \]^_
  96.     ]);
  97.     
  98.     private var _screen:BitmapData = new BitmapData(384384true0);
  99.     private var _display:BitmapData = new BitmapData(400400false0);
  100.     private var _cls:BitmapData = new BitmapData(400400false0);
  101.     private var _matS2D:Matrix = new Matrix(1,0,0,1,8,8);
  102.     private var _shadow:DropShadowFilter = new DropShadowFilter(44500.666);
  103.     private var _residueMap:Vector.<Number> = new Vector.<Number>(9216true);
  104.     private var _toneFilter:uint, _dotColor:uint, _residue:Number;
  105.     private var _dot:Rectangle = new Rectangle(0,0,3,3);
  106.     private var _pt:Point = new Point();
  107.     private var _shape:Shape = new Shape();
  108.     
  109.     static public function hex2bmp(hex:String, height:int=8, scale:int=1) : BitmapData {
  110.         var i:int, pat:int,
  111.             rect:Rectangle = new Rectangle(00, scale, scale),
  112.             bmp:BitmapData = new BitmapData((hex.length>>1)*scale, height, true0);
  113.         for (i=0, rect.x=0; i<hex.length; i+=2, rect.x+=scale)
  114.             for (rect.y=0, pat=parseInt(hex.substr(i, 2), 16); pat!=0; rect.y+=scale, pat>>=1) {
  115.                 bmp.fillRect(rect, -(pat&1));
  116.             }
  117.         return bmp;
  118.     }
  119.     
  120.     function LCDRender(bit:int=2, backColor:uint = 0xb0c0b0, 
  121.                       dot0Color:uint = 0xb0b0b0, dot1Color:uint = 0x000000, residue:Number = 0.4) {
  122.         _toneFilter = (0xff00 >> bit) & 0xff;
  123.         _dotColor = dot1Color;
  124.         _cls.fillRect(_cls.rect, backColor);
  125.         _residue = residue;
  126.         for (_dot.x=8; _dot.x<392; _dot.x+=4)
  127.             for (_dot.y=8; _dot.y<392; _dot.y+=4)
  128.                 _cls.fillRect(_dot, dot0Color);
  129.         charMap.length = 96;
  130.         for (var i:int=32; i<64; i++) charMap[i+32] = charMap[i];
  131.         super(_display);
  132.         x = 32;
  133.         y = 32;
  134.     }
  135.     
  136.     public function cls() : void {
  137.         data.fillRect(data.rect, 0);
  138.     }
  139.     
  140.     public function line(x0:int, y0:int, x1:int, y1:int, color:int=255, thick:Number=1) : void {
  141.         _shape.graphics.clear();
  142.         _shape.graphics.lineStyle(thick, color);
  143.         _shape.graphics.moveTo(x0, y0);
  144.         _shape.graphics.lineTo(x1, y1);
  145.         data.draw(_shape);
  146.     }
  147.     public function gprint(x:int, y:int, bmp:BitmapData) : void {
  148.         _pt.x = x - (bmp.width >> 1);
  149.         _pt.y = y - (bmp.height >> 1);
  150.         data.copyPixels(bmp, bmp.rect, _pt);
  151.     }
  152.         
  153.     public function print(x:int, y:int, str:String) : void {
  154.         _pt.x = x;
  155.         _pt.y = y;
  156.         var bmp:BitmapData;
  157.         for (var i:int=0; i<str.length; i++, _pt.x+=6) {
  158.             bmp = charMap[str.charCodeAt(i)-32];
  159.             data.copyPixels(bmp, bmp.rect, _pt);
  160.         }
  161.     }
  162.     
  163.     public function render() : void {
  164.         var x:int, y:int, gray:int, mask:uint, i:int;
  165.        _screen.fillRect(_screen.rect, 0x0);
  166.         for (i=0, _dot.y=0, y=0; y<96; _dot.y+=4, y++) {
  167.             for (_dot.x=0, x=0; x<96; _dot.x+=4, x++, i++) {
  168.                 gray = ((data.getPixel(x, y) & _toneFilter)>>1) + int(_residueMap[i]);
  169.                 if (gray > 255) gray = 255;
  170.                // _residueMap[i] = gray * _residue;
  171.                 if (gray) _screen.fillRect(_dot, (gray<<24) | _dotColor);
  172.             }
  173.         }
  174.         //_screen.applyFilter(_screen, _screen.rect, _screen.rect.topLeft, _shadow); 
  175.         _display.fillRect(_display.rect,0);
  176.         _display.copyPixels(_cls, _cls.rect, _cls.rect.topLeft);
  177.         _display.draw(_screen, _matS2D);
  178.     }
  179. }
  180. class KeyMapper {
  181.     public  var keys:uint = 0;
  182.     private var _map:Vector.<int> = new Vector.<int>(256true);
  183.     
  184.     function KeyMapper(stage:Stage) : void { 
  185.         for (var i:int=0; i<256; i++) _map[i]=31;
  186.         stage.addEventListener("keyDown"function(e:KeyboardEvent) : void {
  187.             keys |= 1<<_map[e.keyCode];
  188.         });
  189.         stage.addEventListener("keyUp",   function(e:KeyboardEvent) : void {
  190.             keys &= ~(1<<_map[e.keyCode]);
  191.         });
  192.     }
  193.     
  194.     public function map(bit:int, ...args) : KeyMapper {
  195.         for (var i:int=0; i<args.length; i++) _map[args[i]] = bit;
  196.         return this;
  197.     }
  198. }
  199. class Beep {
  200.     private var _phase:int, _pitch:int, _count:int, _sweep:int;
  201.     private var _sound:Sound = new Sound();
  202.     private var _step:Vector.<int> = new Vector.<int>(256true);
  203.     private var _wave:Vector.<Number> = new Vector.<Number>(16true);
  204.     
  205.     function Beep() {
  206.         var i:int;
  207.         _sound.addEventListener("sampleData", _onStream);
  208.         for (i=0; i<16; i++) _wave[i] = 0;
  209.         for (i=0; i<256; i++) _step[i] = i;
  210.         _wave[14] = -(_wave[15] = 0.1);
  211.         _sweep = _count = _pitch = _phase = 0;
  212.         _sound.play();
  213.     }
  214.     
  215.     public function play(pitch:int, length:int, sweep:int) : void {
  216.         _pitch = pitch;
  217.         _count = length+1;
  218.         _sweep = sweep;
  219.     }
  220.     
  221.     private function _onStream(e:SampleDataEvent) : void {
  222.         var l:int, i:int, n:Number, data:ByteArray = e.data;
  223.         for (l=0; l<2; l++) {
  224.             if (--_count == 0) { _pitch = _sweep = 0; }
  225.             _pitch += _sweep;
  226.             for (i=0; i<1024; i++) {
  227.                 _phase = (_phase+_step[_pitch&255]) & 4095;
  228.                 data.writeFloat(_wave[_phase>>8]);
  229.                 data.writeFloat(_wave[_phase>>8]);
  230.             }
  231.         }
  232.     }
  233. }
  234. class SceneManager {
  235.     public var id:int;
  236.     public var initPhase:int = 0;
  237.     private var _stage:Actor, _stageScript:String;
  238.     private var _groupScript:Array = [
  239.         ["&c2&p3p6v12[8f{&l1vd24i20vw10f8w10vd-20}w2]ko",
  240.          "&c2&p3p90v-12[8f{&l1vd24i20vw10f8w10vd-20}w2]ko"
  241.          "&p1&l20v0,12i8v0,1w8[2ha-56f8hs16[7w5f8]w5ha56f8hs-16[7w5f8]w5]a0,1",
  242.          "[40ha90f100{w1b5,120f10{&p1}ko}ha-90f100w30]"],
  243.         ["&c2&p3p12v24[5f{&l2v0,20i10vw10ht[6f-10{i30hv180vd20}w1hs0]w30hti60vd40}w2]ko",
  244.          "&c2&p3p84v-24[5f{&l2v0,20i10vw10ht[6f-10{i30hv180vd20}w1hs0]w30hti60vd40}w2]ko"
  245.          "&p1&l20v0,12i8v0,1w8b3,40ht10f6w24ht-10f6w48a0,1",
  246.          "[20b4,100htf8{&p0}w3b1ha135[5f15{&p1i10vw10vd20}w1]w11ha215[5f15w1]w8]"],
  247.         ["&c2&p3p6v12[8f{&l1b2,0,2vd24i20vw10f8w10vd-20}w2]ko",
  248.          "&c2&p3p90v-12[8f{&l1b2,0,2vd24i20vw10f8w10vd-20}w2]ko"
  249.          "&p1&l20v0,12i8v0,1w8b4,60,6f8{&p1}w24b4,60,-6f8w48a0,1",
  250.          "[20haf20{&p1i15vw20hab12,330f5w10ha15b12,330f10ko}[2ha90f50{w1vd-4w1hv[4f-15{&p1}w2]ko}w16ha-90f50w16]]"],
  251.         ["&c2&p3p4,16[4f{&l3hr60[2v20,1w6f8w12v-20,1w6f8w12]}w2]ko",
  252.          "&c2&p3p92,16[4f{&l3hr60[2v-20,1w6f8w12v20,1w6f8w12]}w2]ko"
  253.          "&p1&l20v0,12i8v0,1w8[3b3,40f1{&p1hvi40vd12}w16]a0,1",
  254.          "b4,120[40ht40f6{&p1}hs-10bv2[4w2f]w12ht-40f6hs10bv2[4w2f]w12]"],
  255.         ["&c2&p3p6v10[4f{&l2v0,48i10vw10a0,-1hr90b3,240[f4w20]}w4]fko",
  256.          "&c2&p3p90v-10[4f{&l2v0,48i10vw10a0,-1hr90b3,240[f4w20]}w4]ko",
  257.          "&p1&l20v0,12i8v0,1w8[2b2,10ht8f6hs-2bv1[7fw2]ht-8f6hs2bv1[7fw2]w24]a0,1",
  258.          "ha[40b1f{vb7,120f8{&p1}hsw20b6,100f16{&p0}ko}[8w1b2,60f-10{&p1[60ad1w2]}]w24]"],
  259.         ["&c2&p3p84[2f{&l4i4v0,20w4bv2f6[3v-20,0w4v0,-16fw4v20,0w4v0,24fw4]}w8]ko",
  260.          "&c2&p3p12[2f{&l4i4v0,20w4bv2f6[3v20,0w4v0,-16fw4v-20,0w4v0,24fw4]}w8]ko",
  261.          "&p1&l20v0,12i8v0,1w8[2ha-48f6{&p1}hs16bv1[5w2f]w6ha40f6hs-16bv1[5w2f]w6]a0,1",
  262.          "@{b3,240hs10[320f20{&p1hv90w5f10}w4]}b3,240hs-10[320f20{&p1hv90w5f10}w4]"]
  263.     ];
  264.     function SceneManager() {
  265.         _stageScript  = "&c2&p3&l0,1p48w64[2f$0w32f$1w32]f$0w16f$1w16f$2w48p24f$2p72f$2w64";
  266.         _stageScript += "[2f$0w24p16f$2w24f$1w24p84f$2w24]w32p24f$2p72f$2[2w16f$0w16f$1]w64p48f$3ko";
  267.         for (var i:int=0; i<_groupScript.length; i++) {
  268.             _groupScript[i][3] = "&p2&l100v0,20i8v0,1w8@{v10[10i64v-10w64v10w64]a0,1}"+_groupScript[i][3];
  269.         }
  270.     }
  271.     
  272.     public function changeScene(id:int) : void {
  273.         this.id = id;
  274.         frameCount = 0;
  275.         switch (id) {
  276.         case 1: _start(); break;
  277.         case 2: _stage.kill(); break;
  278.         }
  279.     }
  280.     
  281.     private function _start() : void {
  282.         _beep.play(0,32,32);
  283.         if (phase == _groupScript.length) { changeScene(3); return; }
  284.         _stage = _actorManager[ENEMY].alloc().init(480002);
  285.         Fiber(_actorManager[FIBER].alloc()).motion(_stage, _stageScript, _groupScript[phase++]);
  286.     }
  287.     
  288.     public function update() : Boolean {
  289.         for (var i:int=0, x:Number=90; i<_player.life; i++, x-=6) _lcd.print(x, 0'a');
  290.         _lcd.print( 00String(score));
  291.         switch (id) {
  292.         case 0:
  293.             _lcd.print(032"-TINY CANNON ML-"); _lcd.print(664"PRESS SHOT KEY");
  294.             if (frameCount>30 && (_key.keys & 16)) {
  295.                 _actorManager[BULLET].freeAll();
  296.                 _actorManager[ENEMY].freeAll();
  297.                 _player.init(48,80);
  298.                 _player.life = 3;
  299.                 score = 0;
  300.                 phase = initPhase;
  301.                 changeScene(1);
  302.             }
  303.             break;
  304.         case 1:
  305.             if (frameCount<60) _lcd.print(2744"PHASE:"+String(phase));
  306.             if (_actorManager[ENEMY].isEmpty) changeScene(1);
  307.             return true;
  308.         case 2:
  309.             _lcd.print(944"- GAME OVER -");
  310.             if (frameCount>30 && (_key.keys & 16)) changeScene(0);
  311.             break;
  312.         case 3:
  313.             _lcd.print(1544"ALL CLEAR !");
  314.             if (frameCount>30 && (_key.keys & 16)) changeScene(0);
  315.             break;
  316.         }
  317.         return false;
  318.     }
  319. }
  320. class ActorManager {
  321.     private var _actorClass:Class, _evaluator:ActorManager, _freeList:Actor, _activeList:Actor;
  322.     public  var _pattern:Vector.<BitmapData> = new Vector.<BitmapData>();
  323.     public  var _size2:Vector.<Number> = new Vector.<Number>();
  324.     
  325.     public function get isEmpty() : Boolean { return (_activeList.next==_activeList); }
  326.     
  327.     function ActorManager(actorClass:Class, evaluator:ActorManager=null) {
  328.         _actorClass = actorClass;
  329.         _evaluator = evaluator;
  330.         _freeList = new Actor(this);
  331.         _activeList = new Actor(this);
  332.     }
  333.     
  334.     public function pat(hex:String, h:int=8, size:Number=0) : ActorManager {
  335.         _pattern.push(LCDRender.hex2bmp(hex, h, ((h-1)>>3) + 1));
  336.         _size2.push(size*size);
  337.         return this;
  338.     }
  339.     
  340.     public function alloc() : Actor {
  341.         var actor:Actor = _freeList.pop() || new _actorClass(this);
  342.         _activeList.push(actor);
  343.         return actor;
  344.     }
  345.     
  346.     public function free(act:Actor) : Actor {
  347.         var next:Actor = act.next;
  348.         act.prodNum++;
  349.         act.remove();
  350.         _freeList.push(act);
  351.         return next;
  352.     }
  353.     
  354.     public function updateAll() : void {
  355.         for (var act:Actor=_activeList.next; act!=_activeList; act=act.update(_evaluator));
  356.     }
  357.     
  358.     public function freeAll() : void {
  359.         for (var act:Actor=_activeList.next; act!=_activeList; act=free(act));
  360.     }
  361.     
  362.     public function hitEval(obj:Actor, dist2:Number) : int {
  363.         for (var cnt:int=0, act:Actor=_activeList.next; act!=_activeList; act=act.next)  {
  364.             var dx:Number = act.x - obj.x, dy:Number = act.y - obj.y;
  365.             if (dx*dx+dy*dy < dist2) { act=free(act).prev; cnt++; }
  366.         }
  367.         return cnt;
  368.     }
  369. }
  370. class Actor {
  371.     public var x:Number, y:Number, vx:Number, vy:Number, ax:Number, ay:Number, ac:int;
  372.     public var childManager:ActorManager, life:int, bonus:int, range:Boolean, patNum:int, prodNum:int=0;
  373.     protected var _manager:ActorManager;
  374.     
  375.     function Actor(manager:ActorManager) {
  376.         _manager = manager;
  377.         prev = this
  378.         next = this;
  379.     }
  380.     
  381.     public function init(x:Number, y:Number, vx:Number=0, vy:Number=0, patNum:int=0) : Actor {
  382.         pos(x, y).vel(vx, vy).acc(000);
  383.         this.patNum = patNum;
  384.         range = true;
  385.         life = 0;
  386.         bonus = 0;
  387.         childManager = _actorManager[BULLET];
  388.         return this;
  389.     }
  390.     
  391.     public function pos(x:Number, y:Number) : Actor {
  392.         this.x = x;
  393.         this.y = y;
  394.         return this;
  395.     }
  396.     
  397.     public function vel(vx:Number, vy:Number, term:int=0) : Actor {
  398.         if (term == 0) {
  399.             this.vx = vx;
  400.             this.vy = vy;
  401.         } else {
  402.             var n:Number = 1 / term;
  403.             acc((vx-this.vx)*n, (vy-this.vy)*n, term);
  404.         }
  405.         return this;
  406.     }
  407.     
  408.     public function acc(ax:Number, ay:Number, ac:int) : Actor {
  409.         this.ax = ax;
  410.         this.ay = ay;
  411.         this.ac = ac;
  412.         return this;
  413.     }
  414.     
  415.     public function update(eval:ActorManager) : Actor {
  416.         x += vx + ax * 0.5;
  417.         y += vy + ax * 0.5;
  418.         vx += ax;
  419.         vy += ay;
  420.         if (--ac == 0) { ax=0; ay=0; }
  421.         if (range && (x<0 || x>95 || y<0 || y>95)) return _manager.free(this);
  422.         if (eval && life>0 && (life-=eval.hitEval(this, _manager._size2[patNum]))<=0) {
  423.             score += bonus;
  424.             _actorManager[EXPLOSION].alloc().init(x, y, vx, vy+1).vel(0,0,20);
  425.             _beep.play(64,4,-8);
  426.             return _manager.free(this);
  427.         }
  428.         _lcd.gprint(x+0.5, y+0.5, _manager._pattern[patNum]);
  429.         return next;
  430.     }
  431.     
  432.     public function kill() : void {
  433.         _manager.free(this);
  434.     }
  435.     
  436.     public var prev:Actor, next:Actor;
  437.     public function push(act:Actor) : void { act.next=this; act.prev=prev; prev.next=act; prev=act; }
  438.     public function pop() : Actor { return (prev==this) ? null : prev.remove(); }
  439.     public function remove() : Actor { prev.next=next; next.prev=prev; return this; }
  440. }
  441. class Player extends Actor {
  442.     private var _status:int, _statusCount:int, _statusCounts:Vector.<int>=Vector.<int>([20,60,0,0]);
  443.     public var prevShot:int=0, shotFiber:Fiber=null;
  444.     
  445.     function Player(manager:ActorManager) { super(manager); }
  446.     
  447.     override public function update(eval:ActorManager) : Actor {
  448.         var inkey:uint = _key.keys;
  449.         if (--_statusCount == 0) changeStatus(_status+1);
  450.         if (_status == 0) {
  451.             y -= _statusCount*0.2;
  452.         } else {
  453.             vx = ((inkey>>2) & 1) - (inkey & 1);
  454.             vy = ((inkey>>3) & 1) - ((inkey>>1) & 1);
  455.             if ((inkey & 32) == 0) { vx<<=1; vy<<=1; }
  456.             inkey &= 48;
  457.             if (inkey != prevShot) {
  458.                 if (shotFiber) { shotFiber.kill(); shotFiber = null; }
  459.                 if (inkey&16) shotFiber = Fiber(_actorManager[FIBER].alloc()).motion(this, shotScript[int(inkey==48)]);
  460.             }
  461.             prevShot = inkey;
  462.             if (x+vx<3 || x+vx>92) vx=0;
  463.             if (y+vy<3 || y+vy>92) vy=0;
  464.             x += vx;
  465.             y += vy;
  466.         }
  467.         if (_status == 2 && eval.hitEval(this4)) miss();
  468.         if (_status == 2 || (frameCount & 1)) _lcd.gprint(x, y, _manager._pattern[0]);
  469.         return next;
  470.     }
  471.     
  472.     public function changeStatus(s:int) : void {
  473.         _status = s;
  474.         _statusCount = _statusCounts[s];
  475.         if (s==0) y+=38;
  476.     }
  477.     
  478.     public function miss() : void {
  479.         if (shotFiber) { shotFiber.kill(); shotFiber = null; }
  480.         for (var i:int=0; i<8; i++) 
  481.             _actorManager[EXPLOSION].alloc().init(x, y, Math.random()*4-2, Math.random()*2-1).vel(0,0,20);
  482.         _beep.play(192,40,-4);
  483.         if (--life == 0) _sceneManager.changeScene(2);
  484.         else changeStatus(0);
  485.     }
  486. }
  487. class Explosion extends Actor {
  488.     private var _animCount:int;
  489.     
  490.     function Explosion(manager:ActorManager) { super(manager); }
  491.     
  492.     override public function init(x:Number, y:Number, vx:Number=0, vy:Number=0, patNum:int=0) : Actor {
  493.         _animCount = 0;
  494.         return super.init(x, y, vx, vy, patNum);
  495.     }
  496.     
  497.     override public function update(eval:ActorManager) : Actor {
  498.         patNum = (++_animCount)>>2;
  499.         return (_animCount==19) ? _manager.free(this) : super.update(eval);
  500.     }
  501. }
  502. class Fiber extends Actor {
  503.     private const VRAT:Number = 0.2;
  504.     private const ARAT:Number = 0.04;
  505.     
  506.     public var actor:Actor, script:String, prevScript:String, counter:int, childScript:Vector.<String>;
  507.     private var _bc:int, _ba:Number, _bv:Number, _interval:int, _prodNum:int, _loopStac:Array = [];
  508.     public var rex:RegExp = /(h[avtsr]|bv|[av]d|ko|&[clp]|[pvaiwfb@[\]])([-\d]+)?,?([-\d]+)?,?([-\d]+)?(\{)?(\$(\d+))?/g;
  509.     public var rex2:RegExp = /[{}]/g;
  510.     
  511.     function Fiber(manager:ActorManager) { super(manager); }
  512.     public function motion(actor:Actor, script:String, childScript:Array=null) : Fiber {
  513.         pos(00).vel(00).acc(002);
  514.         _bc = 1;
  515.         _ba = 0;
  516.         _bv = 0;
  517.         _interval = 0;
  518.         this.actor  = actor;
  519.         this.script = script;
  520.         this.childScript = (childScript) ? Vector.<String>(childScript) : new Vector.<String>();
  521.         prevScript = null;
  522.         _prodNum = actor.prodNum;
  523.         childManager = actor.childManager;
  524.         counter = 1;
  525.         _loopStac.length = 0;
  526.         rex.lastIndex = 0;
  527.         return this;
  528.     }
  529.     
  530.     override public function update(eval:ActorManager) : Actor {
  531.         var res:*, p0:int, p1:int, p2:int, i:int, n:Number;
  532.         if (actor.prodNum != _prodNum) return _manager.free(this);
  533.         if (--counter == 0) {
  534.             for (res = rex.exec(script); res; res = rex.exec(script)) {
  535.                 p0 = res[2] || 0;
  536.                 p1 = res[3] || 0;
  537.                 p2 = res[4] || 0;
  538.                 switch (res[1]) {
  539.                 case 'w': counter = p0; return next;
  540.                 case 'i': _interval = p0; break;
  541.                 case 'p': actor.pos(p0, p1); break;
  542.                 case 'v': actor.vel(p0*VRAT, p1*VRAT, _interval); break;
  543.                 case 'a': actor.acc(p0*ARAT, p1*ARAT, 0); break;
  544.                 case 'f': _fire(p0 * VRAT, seq()); break;
  545.                 case 'ha': acc(p0, 00); break;
  546.                 case 'hv': acc(p0, 01); break;
  547.                 case 'ht': acc(p0, 02); break;
  548.                 case 'hs': ax=p0; ac=3break;
  549.                 case 'hr': acc(p0, 04); break;
  550.                 case 'bv': vy = p0 * VRAT; break;
  551.                 case 'b': _bc = p0 || 1; _ba = p1*0.017453292519943295; _bv = p2*VRAT; break;
  552.                 case '@': Fiber(_actorManager[FIBER].alloc()).motion(actor, seq()); break;
  553.                 case '&l': actor.life = p0; actor.bonus = p0*10; actor.range = (p1 == 0); break;
  554.                 case '&p': actor.patNum = p0; break;
  555.                 case '&c': childManager = _actorManager[BULLET+p0]; break;
  556.                 case 'ko': actor.kill(); return _manager.free(this);
  557.                 case '[': _loopStac.unshift({c:p0, p:rex.lastIndex}); break;
  558.                 case ']'
  559.                     if (--_loopStac[0].c == 0) _loopStac.shift();
  560.                     else rex.lastIndex = _loopStac[0].p;
  561.                     break;
  562.                 case 'vd':
  563.                     i = int(angle * 651.8986469044033) & 4095;
  564.                     actor.vel(sin[i+1024]*p0*VRAT, sin[i]*p0*VRAT, _interval);
  565.                     break;
  566.                 case 'ad':
  567.                     i = int(angle * 651.8986469044033) & 4095;
  568.                     actor.acc(sin[i+1024]*p0*VRAT, sin[i]*p0*VRAT, 0);
  569.                     break;
  570.                 }
  571.             }
  572.             counter = 0;
  573.             return _manager.free(this);
  574.         }
  575.         return next;
  576.         
  577.         function seq() : String {
  578.             if (res[5]) {
  579.                 rex2.lastIndex = rex.lastIndex;
  580.                 for (res=rex2.exec(script), i=1; res; res=rex2.exec(script)) {
  581.                     i += (res[0]=='{');
  582.                     if (res[0] == '}' && --i == 0) {
  583.                         prevScript = script.substring(rex.lastIndex, rex2.lastIndex - 1);
  584.                         break;
  585.                     }
  586.                 }
  587.                 rex.lastIndex = rex2.lastIndex;
  588.             }
  589.             if (res[7]) prevScript = childScript[int(res[7])];
  590.             return prevScript;
  591.         }
  592.     }
  593.     
  594.     public function get angle() : Number {
  595.         switch (ac) {
  596.         case 0: ay = ax * 0.017453292519943295 + 1.5707963267948965break;
  597.         case 1: ay = ax * 0.017453292519943295 + Math.atan2(actor.vy, actor.vx); break;
  598.         case 2: ay = ax * 0.017453292519943295 + Math.atan2(_player.y-actor.y, _player.x-actor.x); break;
  599.         case 3: ay += ax * 0.017453292519943295break;
  600.         case 4: ay = (Math.random()-0.5) * ax * 0.017453292519943295 + 1.5707963267948965break;
  601.         }
  602.         return ay;
  603.     }
  604.     
  605.     private function _fire(vel:Number, script:String) : void {
  606.         vx = (vel = vel || (vx+vy));
  607.         var i:int, iang:int, ang:Number=angle, div:Number = (_bc>1) ? 1/(_bc-1) : 1,
  608.             astep:Number = _ba*div, vstep:Number = _bv*div, fired:Actor;
  609.         for (i=0, ang-=_ba*0.5, vel-=_bv*0.5; i<_bc; i++, ang+=astep, vel+=vstep) {
  610.             iang = int(ang*651.8986469044033)&4095;
  611.             fired = childManager.alloc().init(actor.x, actor.y, sin[iang+1024]*vel, sin[iang]*vel);
  612.             if (script) Fiber(_actorManager[FIBER].alloc()).motion(fired, script);
  613.         }
  614.     }
  615. }
noswf
  1. // forked from keim_at_Si's shmups on LCD
  2. // forked from keim_at_Si's wonderflでポケコン
  3. //   phase 6 + Beep音.
  4. //   move;arrow or wasd/shot;ctrl,z,n/slow;shift,x,m
  5. //--------------------------------------------------
  6. package {
  7.     import flash.display.*;
  8.     import flash.events.*;
  9.     [SWF(width="465", height="465", backgroundColor="0", frameRate="30")]
  10.     public class main extends Sprite {
  11.         function main() {
  12.             // key mapping
  13.             _key = new KeyMapper(stage);
  14.             _key.map(0,37,65).map(1,38,87).map(2,39,68).map(3,40,83).map(4,17,90,78).map(5,16,88,77);
  15.             // lcd render
  16.             _lcd = new LCDRender();
  17.             _lcd.charMap[65] = LCDRender.hex2bmp("70607c6070");
  18.             addChild(_lcd);
  19.             addEventListener("enterFrame", _onEnterFrame);
  20.             
  21.             // beep
  22.             _beep = new Beep();
  23.             _actorManager[FIBER]     = new ActorManager(Fiber);
  24.             _actorManager[BULLET]    = new ActorManager(Actor).pat("070507"3).pat("0e1b111b0e"5);
  25.             _actorManager[SHOT]      = new ActorManager(Actor).pat("3f0000003f"6).pat("3f"6);
  26.             _actorManager[ENEMY]     = new ActorManager(Actor, _actorManager[SHOT]);
  27.             _actorManager[PARTICLE]  = new ActorManager(Actor).pat("01"1);
  28.             _actorManager[EXPLOSION] = new ActorManager(Explosion);
  29.             _actorManager[ENEMY].pat("583c563f3f563c58"76).pat("2b7e353c3c357e2b"1420).pat("2b7e353c3c357e2b"2120).pat("01"1);
  30.             _actorManager[EXPLOSION].pat("0000060909060000").pat("1669b9c644463d02").pat("1285324884844a30");
  31.             _actorManager[EXPLOSION].pat("0002000060905021").pat("0000000000000080");
  32.             for (var i:int=0, p:Number=0; i<5120; i++, p+=0.0015339807878856411) sin[i] = Math.sin(p);
  33.             _player = Player(_playerManager.alloc());
  34.             _player.changeStatus(0);
  35.             _player.life = 3;
  36.             score = 0;
  37.             _sceneManager.changeScene(0);
  38.         }
  39.         private function _onEnterFrame(e:Event) : void {
  40.             frameCount++;
  41.             _lcd.cls();
  42.             if (frameCount & 1) _actorManager[PARTICLE].alloc().init(Math.random()*9600int(Math.random()*3)+1);
  43.             if (_sceneManager.update()) _player.update(_actorManager[BULLET]);
  44.             for (var i:int = 0; i<6; i++) _actorManager[i].updateAll();
  45.             _lcd.render();
  46.         }
  47.     }
  48. }
  49. // internal variables
  50. const FIBER:int = 0;
  51. const BULLET:int = 1;
  52. const SHOT:int = 2;
  53. const ENEMY:int = 3;
  54. const PARTICLE:int = 4;
  55. const EXPLOSION:int = 5;
  56. var sin:Vector.<Number> = new Vector.<Number>(5120true);
  57. var _lcd:LCDRender;
  58. var _key:KeyMapper;
  59. var _beep:Beep;
  60. var _sceneManager:SceneManager = new SceneManager();
  61. var _playerManager:ActorManager = new ActorManager(Player).pat("7820782f782078"7);
  62. var _actorManager:Vector.<ActorManager> = new Vector.<ActorManager>(6true);
  63. var _player:Player;
  64. var frameCount:int;
  65. var score:int;
  66. var phase:int;
  67. var shotScript:Vector.<String> = Vector.<String>([
  68.     "&c1[99999ha180f40{&p0}f{&p1v20w1ha190vd40}f{&p1v-20w1ha170vd40}w2f40{&p0}40w2f40f{&p1v20w1ha200vd40}f{&p1v-20w1ha160vd40}w2f40{&p0}w2]",
  69.     "&c1[99999ha180f40{&p0}f{&p1v20w1v0,-40}f{&p1v-20w1v0,-40}w2]"
  70. ]);
  71. import flash.display.*;
  72. import flash.geom.*;
  73. import flash.filters.*;
  74. import flash.events.*;
  75. import flash.media.*;
  76. import flash.utils.*;
  77. class LCDRender extends Bitmap {
  78.     public var data:BitmapData = new BitmapData(9696false0);
  79.     public var charMap:Vector.<BitmapData> = Vector.<BitmapData>([
  80.         hex2bmp("0000000000"), hex2bmp("00005f0000"), hex2bmp("0003000300"), hex2bmp("143e143e14"), //  !"#
  81.         hex2bmp("242a7f2a12"), hex2bmp("4c2c106864"), hex2bmp("3649592650"), hex2bmp("0000030000"), // $%&'
  82.         hex2bmp("001c224100"), hex2bmp("0041221c00"), hex2bmp("22143e1422"), hex2bmp("08083e0808"), // ()*+
  83.         hex2bmp("0050300000"), hex2bmp("0808080808"), hex2bmp("0060600000"), hex2bmp("2010080402"), // ,-./
  84.         hex2bmp("3e5149453e"), hex2bmp("00427f4000"), hex2bmp("4261514946"), hex2bmp("2241494936"), // 0123
  85.         hex2bmp("3824227f20"), hex2bmp("4f49494931"), hex2bmp("3e49494932"), hex2bmp("0301710907"), // 4567
  86.         hex2bmp("3649494936"), hex2bmp("264949493e"), hex2bmp("0036360000"), hex2bmp("0056360000"), // 89:;
  87.         hex2bmp("0814224100"), hex2bmp("1414141414"), hex2bmp("0041221408"), hex2bmp("0201510906"), // <=>?
  88.         hex2bmp("3e4159551e"), hex2bmp("7c2221227c"), hex2bmp("7f49494936"), hex2bmp("3e41414122"), // @ABC
  89.         hex2bmp("7f4141423c"), hex2bmp("7f49494941"), hex2bmp("7f09090901"), hex2bmp("3e4149493a"), // DEFG
  90.         hex2bmp("7f0808087f"), hex2bmp("00417f4100"), hex2bmp("2040413f01"), hex2bmp("7f08142241"), // HIJK
  91.         hex2bmp("7f40404040"), hex2bmp("7f020c027f"), hex2bmp("7f0408107f"), hex2bmp("3e4141413e"), // LMNO
  92.         hex2bmp("7f09090906"), hex2bmp("3e4151215e"), hex2bmp("7f09192946"), hex2bmp("2649494932"), // PQRS
  93.         hex2bmp("01017f0101"), hex2bmp("3f4040403f"), hex2bmp("1f2040201f"), hex2bmp("1f601c601f"), // TUVW
  94.         hex2bmp("6314081463"), hex2bmp("0708700807"), hex2bmp("6151494543"), hex2bmp("00007f4100"), // XYZ[
  95.         hex2bmp("0204081020"), hex2bmp("00417f0000"), hex2bmp("0002010200"), hex2bmp("4040404040"), // \]^_
  96.     ]);
  97.     
  98.     private var _screen:BitmapData = new BitmapData(384384true0);
  99.     private var _display:BitmapData = new BitmapData(400400false0);
  100.     private var _cls:BitmapData = new BitmapData(400400false0);
  101.     private var _matS2D:Matrix = new Matrix(1,0,0,1,8,8);
  102.     private var _shadow:DropShadowFilter = new DropShadowFilter(44500.666);
  103.     private var _residueMap:Vector.<Number> = new Vector.<Number>(9216true);
  104.     private var _toneFilter:uint, _dotColor:uint, _residue:Number;
  105.     private var _dot:Rectangle = new Rectangle(0,0,3,3);
  106.     private var _pt:Point = new Point();
  107.     private var _shape:Shape = new Shape();
  108.     
  109.     static public function hex2bmp(hex:String, height:int=8, scale:int=1) : BitmapData {
  110.         var i:int, pat:int,
  111.             rect:Rectangle = new Rectangle(00, scale, scale),
  112.             bmp:BitmapData = new BitmapData((hex.length>>1)*scale, height, true0);
  113.         for (i=0, rect.x=0; i<hex.length; i+=2, rect.x+=scale)
  114.             for (rect.y=0, pat=parseInt(hex.substr(i, 2), 16); pat!=0; rect.y+=scale, pat>>=1) {
  115.                 bmp.fillRect(rect, -(pat&1));
  116.             }
  117.         return bmp;
  118.     }
  119.     
  120.     function LCDRender(bit:int=2, backColor:uint = 0xb0c0b0, 
  121.                       dot0Color:uint = 0xb0b0b0, dot1Color:uint = 0x000000, residue:Number = 0.4) {
  122.         _toneFilter = (0xff00 >> bit) & 0xff;
  123.         _dotColor = dot1Color;
  124.         _cls.fillRect(_cls.rect, backColor);
  125.         _residue = residue;
  126.         for (_dot.x=8; _dot.x<392; _dot.x+=4)
  127.             for (_dot.y=8; _dot.y<392; _dot.y+=4)
  128.                 _cls.fillRect(_dot, dot0Color);
  129.         charMap.length = 96;
  130.         for (var i:int=32; i<64; i++) charMap[i+32] = charMap[i];
  131.         super(_display);
  132.         x = 32;
  133.         y = 32;
  134.     }
  135.     
  136.     public function cls() : void {
  137.         data.fillRect(data.rect, 0);
  138.     }
  139.     
  140.     public function line(x0:int, y0:int, x1:int, y1:int, color:int=255, thick:Number=1) : void {
  141.         _shape.graphics.clear();
  142.         _shape.graphics.lineStyle(thick, color);
  143.         _shape.graphics.moveTo(x0, y0);
  144.         _shape.graphics.lineTo(x1, y1);
  145.         data.draw(_shape);
  146.     }
  147.     public function gprint(x:int, y:int, bmp:BitmapData) : void {
  148.         _pt.x = x - (bmp.width >> 1);
  149.         _pt.y = y - (bmp.height >> 1);
  150.         data.copyPixels(bmp, bmp.rect, _pt);
  151.     }
  152.         
  153.     public function print(x:int, y:int, str:String) : void {
  154.         _pt.x = x;
  155.         _pt.y = y;
  156.         var bmp:BitmapData;
  157.         for (var i:int=0; i<str.length; i++, _pt.x+=6) {
  158.             bmp = charMap[str.charCodeAt(i)-32];
  159.             data.copyPixels(bmp, bmp.rect, _pt);
  160.         }
  161.     }
  162.     
  163.     public function render() : void {
  164.         var x:int, y:int, gray:int, mask:uint, i:int;
  165.         _screen.fillRect(_screen.rect, 0);
  166.         for (i=0, _dot.y=0, y=0; y<96; _dot.y+=4, y++) {
  167.             for (_dot.x=0, x=0; x<96; _dot.x+=4, x++, i++) {
  168.                 gray = ((data.getPixel(x, y) & _toneFilter)>>1) + int(_residueMap[i]);
  169.                 if (gray > 255) gray = 255;
  170.                 _residueMap[i] = gray * _residue;
  171.                 if (gray) _screen.fillRect(_dot, (gray<<24) | _dotColor);
  172.             }
  173.         }
  174.         _screen.applyFilter(_screen, _screen.rect, _screen.rect.topLeft, _shadow);
  175.         _display.copyPixels(_cls, _cls.rect, _cls.rect.topLeft);
  176.         _display.draw(_screen, _matS2D);
  177.     }
  178. }
  179. class KeyMapper {
  180.     public  var keys:uint = 0;
  181.     private var _map:Vector.<int> = new Vector.<int>(256true);
  182.     
  183.     function KeyMapper(stage:Stage) : void { 
  184.         for (var i:int=0; i<256; i++) _map[i]=31;
  185.         stage.addEventListener("keyDown"function(e:KeyboardEvent) : void {
  186.             keys |= 1<<_map[e.keyCode];
  187.         });
  188.         stage.addEventListener("keyUp",   function(e:KeyboardEvent) : void {
  189.             keys &= ~(1<<_map[e.keyCode]);
  190.         });
  191.     }
  192.     
  193.     public function map(bit:int, ...args) : KeyMapper {
  194.         for (var i:int=0; i<args.length; i++) _map[args[i]] = bit;
  195.         return this;
  196.     }
  197. }
  198. class Beep {
  199.     private var _phase:int, _pitch:int, _count:int, _sweep:int;
  200.     private var _sound:Sound = new Sound();
  201.     private var _step:Vector.<int> = new Vector.<int>(256true);
  202.     private var _wave:Vector.<Number> = new Vector.<Number>(16true);
  203.     
  204.     function Beep() {
  205.         var i:int;
  206.         _sound.addEventListener("sampleData", _onStream);
  207.         for (i=0; i<16; i++) _wave[i] = 0;
  208.         for (i=0; i<256; i++) _step[i] = i;
  209.         _wave[14] = -(_wave[15] = 0.1);
  210.         _sweep = _count = _pitch = _phase = 0;
  211.         _sound.play();
  212.     }
  213.     
  214.     public function play(pitch:int, length:int, sweep:int) : void {
  215.         _pitch = pitch;
  216.         _count = length+1;
  217.         _sweep = sweep;
  218.     }
  219.     
  220.     private function _onStream(e:SampleDataEvent) : void {
  221.         var l:int, i:int, n:Number, data:ByteArray = e.data;
  222.         for (l=0; l<2; l++) {
  223.             if (--_count == 0) { _pitch = _sweep = 0; }
  224.             _pitch += _sweep;
  225.             for (i=0; i<1024; i++) {
  226.                 _phase = (_phase+_step[_pitch&255]) & 4095;
  227.                 data.writeFloat(_wave[_phase>>8]);
  228.                 data.writeFloat(_wave[_phase>>8]);
  229.             }
  230.         }
  231.     }
  232. }
  233. class SceneManager {
  234.     public var id:int;
  235.     public var initPhase:int = 0;
  236.     private var _stage:Actor, _stageScript:String;
  237.     private var _groupScript:Array = [
  238.         ["&c2&p3p6v12[8f{&l1vd24i20vw10f8w10vd-20}w2]ko",
  239.          "&c2&p3p90v-12[8f{&l1vd24i20vw10f8w10vd-20}w2]ko"
  240.          "&p1&l20v0,12i8v0,1w8[2ha-56f8hs16[7w5f8]w5ha56f8hs-16[7w5f8]w5]a0,1",
  241.          "[40ha90f100{w1b5,120f10{&p1}ko}ha-90f100w30]"],
  242.         ["&c2&p3p12v24[5f{&l2v0,20i10vw10ht[6f-10{i30hv180vd20}w1hs0]w30hti60vd40}w2]ko",
  243.          "&c2&p3p84v-24[5f{&l2v0,20i10vw10ht[6f-10{i30hv180vd20}w1hs0]w30hti60vd40}w2]ko"
  244.          "&p1&l20v0,12i8v0,1w8b3,40ht10f6w24ht-10f6w48a0,1",
  245.          "[20b4,100htf8{&p0}w3b1ha135[5f15{&p1i10vw10vd20}w1]w11ha215[5f15w1]w8]"],
  246.         ["&c2&p3p6v12[8f{&l1b2,0,2vd24i20vw10f8w10vd-20}w2]ko",
  247.          "&c2&p3p90v-12[8f{&l1b2,0,2vd24i20vw10f8w10vd-20}w2]ko"
  248.          "&p1&l20v0,12i8v0,1w8b4,60,6f8{&p1}w24b4,60,-6f8w48a0,1",
  249.          "[20haf20{&p1i15vw20hab12,330f5w10ha15b12,330f10ko}[2ha90f50{w1vd-4w1hv[4f-15{&p1}w2]ko}w16ha-90f50w16]]"],
  250.         ["&c2&p3p4,16[4f{&l3hr60[2v20,1w6f8w12v-20,1w6f8w12]}w2]ko",
  251.          "&c2&p3p92,16[4f{&l3hr60[2v-20,1w6f8w12v20,1w6f8w12]}w2]ko"
  252.          "&p1&l20v0,12i8v0,1w8[3b3,40f1{&p1hvi40vd12}w16]a0,1",
  253.          "b4,120[40ht40f6{&p1}hs-10bv2[4w2f]w12ht-40f6hs10bv2[4w2f]w12]"],
  254.         ["&c2&p3p6v10[4f{&l2v0,48i10vw10a0,-1hr90b3,240[f4w20]}w4]fko",
  255.          "&c2&p3p90v-10[4f{&l2v0,48i10vw10a0,-1hr90b3,240[f4w20]}w4]ko",
  256.          "&p1&l20v0,12i8v0,1w8[2b2,10ht8f6hs-2bv1[7fw2]ht-8f6hs2bv1[7fw2]w24]a0,1",
  257.          "ha[40b1f{vb7,120f8{&p1}hsw20b6,100f16{&p0}ko}[8w1b2,60f-10{&p1[60ad1w2]}]w24]"],
  258.         ["&c2&p3p84[2f{&l4i4v0,20w4bv2f6[3v-20,0w4v0,-16fw4v20,0w4v0,24fw4]}w8]ko",
  259.          "&c2&p3p12[2f{&l4i4v0,20w4bv2f6[3v20,0w4v0,-16fw4v-20,0w4v0,24fw4]}w8]ko",
  260.          "&p1&l20v0,12i8v0,1w8[2ha-48f6{&p1}hs16bv1[5w2f]w6ha40f6hs-16bv1[5w2f]w6]a0,1",
  261.          "@{b3,240hs10[320f20{&p1hv90w5f10}w4]}b3,240hs-10[320f20{&p1hv90w5f10}w4]"]
  262.     ];
  263.     function SceneManager() {
  264.         _stageScript  = "&c2&p3&l0,1p48w64[2f$0w32f$1w32]f$0w16f$1w16f$2w48p24f$2p72f$2w64";
  265.         _stageScript += "[2f$0w24p16f$2w24f$1w24p84f$2w24]w32p24f$2p72f$2[2w16f$0w16f$1]w64p48f$3ko";
  266.         for (var i:int=0; i<_groupScript.length; i++) {
  267.             _groupScript[i][3] = "&p2&l100v0,20i8v0,1w8@{v10[10i64v-10w64v10w64]a0,1}"+_groupScript[i][3];
  268.         }
  269.     }
  270.     
  271.     public function changeScene(id:int) : void {
  272.         this.id = id;
  273.         frameCount = 0;
  274.         switch (id) {
  275.         case 1: _start(); break;
  276.         case 2: _stage.kill(); break;
  277.         }
  278.     }
  279.     
  280.     private function _start() : void {
  281.         _beep.play(0,32,32);
  282.         if (phase == _groupScript.length) { changeScene(3); return; }
  283.         _stage = _actorManager[ENEMY].alloc().init(480002);
  284.         Fiber(_actorManager[FIBER].alloc()).motion(_stage, _stageScript, _groupScript[phase++]);
  285.     }
  286.     
  287.     public function update() : Boolean {
  288.         for (var i:int=0, x:Number=90; i<_player.life; i++, x-=6) _lcd.print(x, 0'a');
  289.         _lcd.print( 00String(score));
  290.         switch (id) {
  291.         case 0:
  292.             _lcd.print(032"-TINY CANNON ML-"); _lcd.print(664"PRESS SHOT KEY");
  293.             if (frameCount>30 && (_key.keys & 16)) {
  294.                 _actorManager[BULLET].freeAll();
  295.                 _actorManager[ENEMY].freeAll();
  296.                 _player.init(48,80);
  297.                 _player.life = 3;
  298.                 score = 0;
  299.                 phase = initPhase;
  300.                 changeScene(1);
  301.             }
  302.             break;
  303.         case 1:
  304.             if (frameCount<60) _lcd.print(2744"PHASE:"+String(phase));
  305.             if (_actorManager[ENEMY].isEmpty) changeScene(1);
  306.             return true;
  307.         case 2:
  308.             _lcd.print(944"- GAME OVER -");
  309.             if (frameCount>30 && (_key.keys & 16)) changeScene(0);
  310.             break;
  311.         case 3:
  312.             _lcd.print(1544"ALL CLEAR !");
  313.             if (frameCount>30 && (_key.keys & 16)) changeScene(0);
  314.             break;
  315.         }
  316.         return false;
  317.     }
  318. }
  319. class ActorManager {
  320.     private var _actorClass:Class, _evaluator:ActorManager, _freeList:Actor, _activeList:Actor;
  321.     public  var _pattern:Vector.<BitmapData> = new Vector.<BitmapData>();
  322.     public  var _size2:Vector.<Number> = new Vector.<Number>();
  323.     
  324.     public function get isEmpty() : Boolean { return (_activeList.next==_activeList); }
  325.     
  326.     function ActorManager(actorClass:Class, evaluator:ActorManager=null) {
  327.         _actorClass = actorClass;
  328.         _evaluator = evaluator;
  329.         _freeList = new Actor(this);
  330.         _activeList = new Actor(this);
  331.     }
  332.     
  333.     public function pat(hex:String, h:int=8, size:Number=0) : ActorManager {
  334.         _pattern.push(LCDRender.hex2bmp(hex, h, ((h-1)>>3) + 1));
  335.         _size2.push(size*size);
  336.         return this;
  337.     }
  338.     
  339.     public function alloc() : Actor {
  340.         var actor:Actor = _freeList.pop() || new _actorClass(this);
  341.         _activeList.push(actor);
  342.         return actor;
  343.     }
  344.     
  345.     public function free(act:Actor) : Actor {
  346.         var next:Actor = act.next;
  347.         act.prodNum++;
  348.         act.remove();
  349.         _freeList.push(act);
  350.         return next;
  351.     }
  352.     
  353.     public function updateAll() : void {
  354.         for (var act:Actor=_activeList.next; act!=_activeList; act=act.update(_evaluator));
  355.     }
  356.     
  357.     public function freeAll() : void {
  358.         for (var act:Actor=_activeList.next; act!=_activeList; act=free(act));
  359.     }
  360.     
  361.     public function hitEval(obj:Actor, dist2:Number) : int {
  362.         for (var cnt:int=0, act:Actor=_activeList.next; act!=_activeList; act=act.next)  {
  363.             var dx:Number = act.x - obj.x, dy:Number = act.y - obj.y;
  364.             if (dx*dx+dy*dy < dist2) { act=free(act).prev; cnt++; }
  365.         }
  366.         return cnt;
  367.     }
  368. }
  369. class Actor {
  370.     public var x:Number, y:Number, vx:Number, vy:Number, ax:Number, ay:Number, ac:int;
  371.     public var childManager:ActorManager, life:int, bonus:int, range:Boolean, patNum:int, prodNum:int=0;
  372.     protected var _manager:ActorManager;
  373.     
  374.     function Actor(manager:ActorManager) {
  375.         _manager = manager;
  376.         prev = this
  377.         next = this;
  378.     }
  379.     
  380.     public function init(x:Number, y:Number, vx:Number=0, vy:Number=0, patNum:int=0) : Actor {
  381.         pos(x, y).vel(vx, vy).acc(000);
  382.         this.patNum = patNum;
  383.         range = true;
  384.         life = 0;
  385.         bonus = 0;
  386.         childManager = _actorManager[BULLET];
  387.         return this;
  388.     }
  389.     
  390.     public function pos(x:Number, y:Number) : Actor {
  391.         this.x = x;
  392.         this.y = y;
  393.         return this;
  394.     }
  395.     
  396.     public function vel(vx:Number, vy:Number, term:int=0) : Actor {
  397.         if (term == 0) {
  398.             this.vx = vx;
  399.             this.vy = vy;
  400.         } else {
  401.             var n:Number = 1 / term;
  402.             acc((vx-this.vx)*n, (vy-this.vy)*n, term);
  403.         }
  404.         return this;
  405.     }
  406.     
  407.     public function acc(ax:Number, ay:Number, ac:int) : Actor {
  408.         this.ax = ax;
  409.         this.ay = ay;
  410.         this.ac = ac;
  411.         return this;
  412.     }
  413.     
  414.     public function update(eval:ActorManager) : Actor {
  415.         x += vx + ax * 0.5;
  416.         y += vy + ax * 0.5;
  417.         vx += ax;
  418.         vy += ay;
  419.         if (--ac == 0) { ax=0; ay=0; }
  420.         if (range && (x<0 || x>95 || y<0 || y>95)) return _manager.free(this);
  421.         if (eval && life>0 && (life-=eval.hitEval(this, _manager._size2[patNum]))<=0) {
  422.             score += bonus;
  423.             _actorManager[EXPLOSION].alloc().init(x, y, vx, vy+1).vel(0,0,20);
  424.             _beep.play(64,4,-8);
  425.             return _manager.free(this);
  426.         }
  427.         _lcd.gprint(x+0.5, y+0.5, _manager._pattern[patNum]);
  428.         return next;
  429.     }
  430.     
  431.     public function kill() : void {
  432.         _manager.free(this);
  433.     }
  434.     
  435.     public var prev:Actor, next:Actor;
  436.     public function push(act:Actor) : void { act.next=this; act.prev=prev; prev.next=act; prev=act; }
  437.     public function pop() : Actor { return (prev==this) ? null : prev.remove(); }
  438.     public function remove() : Actor { prev.next=next; next.prev=prev; return this; }
  439. }
  440. class Player extends Actor {
  441.     private var _status:int, _statusCount:int, _statusCounts:Vector.<int>=Vector.<int>([20,60,0,0]);
  442.     public var prevShot:int=0, shotFiber:Fiber=null;
  443.     
  444.     function Player(manager:ActorManager) { super(manager); }
  445.     
  446.     override public function update(eval:ActorManager) : Actor {
  447.         var inkey:uint = _key.keys;
  448.         if (--_statusCount == 0) changeStatus(_status+1);
  449.         if (_status == 0) {
  450.             y -= _statusCount*0.2;
  451.         } else {
  452.             vx = ((inkey>>2) & 1) - (inkey & 1);
  453.             vy = ((inkey>>3) & 1) - ((inkey>>1) & 1);
  454.             if ((inkey & 32) == 0) { vx<<=1; vy<<=1; }
  455.             inkey &= 48;
  456.             if (inkey != prevShot) {
  457.                 if (shotFiber) { shotFiber.kill(); shotFiber = null; }
  458.                 if (inkey&16) shotFiber = Fiber(_actorManager[FIBER].alloc()).motion(this, shotScript[int(inkey==48)]);
  459.             }
  460.             prevShot = inkey;
  461.             if (x+vx<3 || x+vx>92) vx=0;
  462.             if (y+vy<3 || y+vy>92) vy=0;
  463.             x += vx;
  464.             y += vy;
  465.         }
  466.         if (_status == 2 && eval.hitEval(this4)) miss();
  467.         if (_status == 2 || (frameCount & 1)) _lcd.gprint(x, y, _manager._pattern[0]);
  468.         return next;
  469.     }
  470.     
  471.     public function changeStatus(s:int) : void {
  472.         _status = s;
  473.         _statusCount = _statusCounts[s];
  474.         if (s==0) y+=38;
  475.     }
  476.     
  477.     public function miss() : void {
  478.         if (shotFiber) { shotFiber.kill(); shotFiber = null; }
  479.         for (var i:int=0; i<8; i++) 
  480.             _actorManager[EXPLOSION].alloc().init(x, y, Math.random()*4-2, Math.random()*2-1).vel(0,0,20);
  481.         _beep.play(192,40,-4);
  482.         if (--life == 0) _sceneManager.changeScene(2);
  483.         else changeStatus(0);
  484.     }
  485. }
  486. class Explosion extends Actor {
  487.     private var _animCount:int;
  488.     
  489.     function Explosion(manager:ActorManager) { super(manager); }
  490.     
  491.     override public function init(x:Number, y:Number, vx:Number=0, vy:Number=0, patNum:int=0) : Actor {
  492.         _animCount = 0;
  493.         return super.init(x, y, vx, vy, patNum);
  494.     }
  495.     
  496.     override public function update(eval:ActorManager) : Actor {
  497.         patNum = (++_animCount)>>2;
  498.         return (_animCount==19) ? _manager.free(this) : super.update(eval);
  499.     }
  500. }
  501. class Fiber extends Actor {
  502.     private const VRAT:Number = 0.2;
  503.     private const ARAT:Number = 0.04;
  504.     
  505.     public var actor:Actor, script:String, prevScript:String, counter:int, childScript:Vector.<String>;
  506.     private var _bc:int, _ba:Number, _bv:Number, _interval:int, _prodNum:int, _loopStac:Array = [];
  507.     public var rex:RegExp = /(h[avtsr]|bv|[av]d|ko|&[clp]|[pvaiwfb@[\]])([-\d]+)?,?([-\d]+)?,?([-\d]+)?(\{)?(\$(\d+))?/g;
  508.     public var rex2:RegExp = /[{}]/g;
  509.     
  510.     function Fiber(manager:ActorManager) { super(manager); }
  511.     public function motion(actor:Actor, script:String, childScript:Array=null) : Fiber {
  512.         pos(00).vel(00).acc(002);
  513.         _bc = 1;
  514.         _ba =