Advertisement
Guest User

Untitled

a guest
Mar 11th, 2017
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Haxe 12.21 KB | None | 0 0
  1. import com.ludamix.triad.ascii.XBIN;
  2. import com.ludamix.triad.ascii.ASCIIMap;
  3. import com.ludamix.triad.ascii.ASCIISheet;
  4. import com.ludamix.triad.io.AssetCache;
  5. import com.ludamix.triad.audio.Audio;
  6. import com.ludamix.triad.audio.Sequencer;
  7. import com.ludamix.triad.audio.SMFParser;
  8. import com.ludamix.triad.audio.TableSynth;
  9. import com.ludamix.triad.entity.EDatabase;
  10. import com.ludamix.triad.grid.RogueBoard;
  11. import com.ludamix.triad.io.ButtonManager;
  12. import haxe.io.Bytes;
  13. import nme.Assets;
  14. import nme.events.Event;
  15. import nme.events.KeyboardEvent;
  16. import nme.Lib;
  17. import nme.ui.Keyboard;
  18.  
  19. class DalekGamestate extends EDatabase
  20. {
  21.    
  22.     public var board : RogueBoard;
  23.     public var amap : ASCIIMap;
  24.     public var seq : Sequencer;
  25.     public var buttonmanager : ButtonManager;
  26.     public var game_global : Dalek;
  27.    
  28.     public var level_count : Int;
  29.    
  30.     public function init(seq, amap, buttonmanager, game_global)
  31.     {
  32.         this.game_global = game_global;
  33.         this.seq = seq;
  34.         this.amap = amap;
  35.         this.buttonmanager = buttonmanager;
  36.         level_count = 1;
  37.        
  38.         spawnLevel();
  39.        
  40.         board.cameraTL(0, 0, 80, 25, amap);
  41.         amap.update();
  42.     }
  43.    
  44.     public function randPos()
  45.     {
  46.         return {x:Std.int(Math.random() * 80), y:Std.int(Math.random() * 25)};
  47.     }
  48.    
  49.     public function endLevel()
  50.     {
  51.         for (e in rows.keys())
  52.         {
  53.             call(rows.get(e), "despawn");
  54.         }
  55.         flushEntities();
  56.        
  57.         game_global.playSampledSound();
  58.         level_count++;
  59.         spawnLevel();
  60.     }
  61.    
  62.     public function spawnLevel()
  63.     {
  64.         var ar = new Array();
  65.         for (n in 0...80 * 25) ar.push({solid:false, repr: new RogueRepr(0xB0,2,5,0)});
  66.         board = new RogueBoard(80, 25, ar, 2, new RogueRepr(0,0,0,0));
  67.        
  68.         for (n in 0...500)
  69.         {
  70.             var pos = randPos();
  71.             board.setTile(pos.x,pos.y, 1,
  72.                 {solid:true,repr:new RogueRepr(6,-1,10,1)} );
  73.         }
  74.        
  75.         for (n in 0...level_count)
  76.         {
  77.             var pos = randPos();
  78.             spawnFood(pos.x,pos.y);
  79.             board.setTile(pos.x,pos.y, 1, emptyTile());
  80.         }
  81.         var pos = randPos();
  82.         spawnPlayer(pos.x,pos.y);
  83.         board.setTile(pos.x,pos.y, 1, emptyTile());
  84.        
  85.     }
  86.    
  87.     public inline function emptyTile()
  88.     {
  89.         return {solid:false, repr: new RogueRepr(-1,-1,-1,0)};
  90.     }
  91.    
  92.     public function playSound(name : String, ?priority : Int = 1)
  93.     {
  94.         var events = SMFParser.load(seq, Assets.getBytes(name));
  95.         for (e in events)
  96.         {
  97.             e.channel = 0;
  98.             e.priority = priority; // 0 = music, 1+ = sounds
  99.         }
  100.         seq.pushEvents(events.copy());     
  101.     }
  102.    
  103.     public inline function solid( x : Int, y : Int ) : Bool
  104.     {
  105.         if (board.outOfBounds(x, y)) return true;
  106.         else return (board.layer(0).c2t(x, y).solid || board.layer(1).c2t(x, y).solid);
  107.     }
  108.    
  109.     public function spawnPlayer(x,y)
  110.     {
  111.         var laser = { x:0, y:0, xv:0, yv:0, time:0 };
  112.         var repr = new RogueRepr(1, -1, 15, 2);
  113.         var actor = board.createActor(x, y, function(a) { return repr;} );
  114.         var behavior = {
  115.             if_unlocked:[function(db : DalekGamestate, stack : EStack, payload : Dynamic)
  116.                 { if (laser.time<1)
  117.                     stack.last().call(db, stack, payload[0], payload[1]); } ],
  118.             position_free:[function(db : EDatabase, stack : EStack, payload : Dynamic)
  119.                 { var pos = call(stack.last(), "position"); pos.x += payload.x; pos.y += payload.y;
  120.                     return !solid(pos.x, pos.y); } ],                  
  121.             try_direction:[function(db : EDatabase, stack : EStack, payload : Dynamic)
  122.                 { if (call(stack.last(), "position_free", payload))
  123.                     call(stack.last(), "move", payload); } ],
  124.             do_fire:[function(db : EDatabase, stack : EStack, payload : Dynamic)
  125.                 { laser.xv = payload.xv; laser.yv = payload.yv; laser.time = 3;
  126.                     playSound("assets/sfx_laser.mid");  } ],
  127.             laser_info:[function(db : EDatabase, stack : EStack, payload : Dynamic)
  128.                 { var pos = call(stack.last(), "position");
  129.                   laser.x = pos.x+laser.xv; laser.y = pos.y+laser.yv; return Reflect.copy(laser); } ],
  130.             laser_tick:[function(db : EDatabase, stack : EStack, payload : Dynamic)
  131.                 { laser.time-=1; } ]
  132.             };
  133.         var ent = spawn([createDespawnable(),createTags(["player"]),actor,behavior]);
  134.     }
  135.    
  136.     public function spawnFood(x,y)
  137.     {
  138.         var repr = new RogueRepr(7, -1, 15, 1);
  139.         var actor = board.createActor(x, y, function(a) { return repr; } );
  140.         var behavior = {
  141.             eat:[function(db : EDatabase, stack : EStack, payload : Dynamic)
  142.                 { stack.last().call(db, stack, "despawn");
  143.                     playSound("assets/sfx_food.mid"); } ] };
  144.         var ent = spawn([createDespawnable(), actor, createTags(["food"]), behavior]);
  145.     }
  146.    
  147.     public function spawnFire(x,y)
  148.     {
  149.         board.setTile(x, y, 1, emptyTile());
  150.         var repr = [new RogueRepr(176, 4, 12, 1), new RogueRepr(177, 4, 12, 1),
  151.             new RogueRepr(178, 4, 12, 1), new RogueRepr(219, 4, 12, 1)];
  152.         var actor = board.createActor(x, y, function(a) { return repr[Std.int(Math.random()*4)]; } );
  153.         var ent = spawn([createDespawnable(), actor, createTags(["fire"])]);
  154.     }
  155.    
  156.     public function updateGameplay(_)
  157.     {
  158.        
  159.         var moved = false; // when holding down the buttons it's possible to send multiple input events.
  160.         for (event in buttonmanager.events)
  161.         {
  162.             if (event.state == ButtonManager.DOWN && !moved)
  163.             {
  164.                 switch(event.button)
  165.                 {
  166.                     case "Up": moved = true;
  167.                         for (n in tags.get("player")) call(n, "if_unlocked", ["try_direction", { x:0, y: -1 } ]);
  168.                     case "Down": moved = true;
  169.                         for (n in tags.get("player")) call(n, "if_unlocked", ["try_direction", { x:0, y: 1 } ]);
  170.                     case "Left": moved = true;
  171.                         for (n in tags.get("player")) call(n, "if_unlocked", ["try_direction", { x: -1, y: 0 } ]);
  172.                     case "Right": moved = true;
  173.                         for (n in tags.get("player")) call(n, "if_unlocked", ["try_direction", { x:1, y: 0 } ]);
  174.                     case "Fire Up": moved = true;
  175.                         for (n in tags.get("player")) call(n, "if_unlocked", ["do_fire", { xv:0, yv: -1 } ]);                      
  176.                     case "Fire Down": moved = true;
  177.                         for (n in tags.get("player")) call(n, "if_unlocked", ["do_fire", { xv:0, yv: 1 } ]);
  178.                     case "Fire Left": moved = true;
  179.                         for (n in tags.get("player")) call(n, "if_unlocked", ["do_fire", { xv:-1, yv: 0 } ]);                      
  180.                     case "Fire Right": moved = true;
  181.                         for (n in tags.get("player")) call(n, "if_unlocked", ["do_fire", { xv:1, yv: 0 } ]);                       
  182.                 }
  183.             }
  184.         }
  185.        
  186.         for (player in tags.get("player"))
  187.         {
  188.             var pos = call(player, "position");
  189.             for (act in board.infos(pos.x, pos.y).actors)
  190.             {
  191.                 call(act.id, "eat");
  192.             }
  193.         }
  194.        
  195.         if (tags.exists("fire"))
  196.         for (ent in tags.get("fire"))
  197.         {
  198.             var pos = call(ent, "position");
  199.             board.setDirty(pos.x, pos.y);
  200.         }
  201.        
  202.         board.cameraTL(0, 0, 80, 25, amap);
  203.         if (tags.exists("player"))
  204.         for (player in tags.get("player"))
  205.         {
  206.             var vec : Dynamic = call(player, "laser_info");
  207.             if (vec.time > 0)
  208.             {
  209.                 while (!board.outOfBounds(vec.x, vec.y) && (vec.xv!=0 || vec.yv!=0) && !solid(vec.x,vec.y))
  210.                 {
  211.                     if (vec.xv!=0)
  212.                         amap.spriteMono(String.fromCharCode(196), 1, vec.x, vec.y, 11, -1);
  213.                     else
  214.                         amap.spriteMono(String.fromCharCode(179), 1, vec.x, vec.y, 11, -1);
  215.                     board.setDirty(vec.x, vec.y);
  216.                     var infos = (board.infos(vec.x, vec.y));
  217.                     for (a in infos.actors)
  218.                     {
  219.                         call(a.id, "eat");
  220.                     }
  221.                     vec.x += vec.xv;
  222.                     vec.y += vec.yv;
  223.                 }
  224.                 if (!board.outOfBounds(vec.x, vec.y))
  225.                 {
  226.                     playSound("assets/sfx_boom.mid",2);
  227.                     spawnFire(vec.x, vec.y);
  228.                 }
  229.             }
  230.             call(player, "laser_tick");        
  231.         }
  232.        
  233.         amap.update();
  234.         flushEntities();
  235.        
  236.         if (!tags.exists("food") || tags.get("food").length<1)
  237.         {
  238.             endLevel();
  239.         }
  240.     }
  241.    
  242. }
  243.  
  244. class Dalek
  245. {
  246.    
  247.     // Discover and eliminate foods - horse_ebooks
  248.     // The Dalek Starvation Challenge
  249.    
  250.     public var amap : ASCIIMap;
  251.     public var asheet : ASCIISheet;
  252.     public var buttonmanager : ButtonManager;
  253.     public var seq : Sequencer;
  254.    
  255.     public var db : DalekGamestate;
  256.  
  257.     public function new()
  258.     {
  259.         makeSettings();
  260.     }
  261.    
  262.     public function makeSettings()
  263.     {
  264.         Audio.init({Volume:{vol:1.0,on:true}},true);
  265.         Audio.SFXCHANNEL = "Volume";
  266.         Audio.BGMCHANNEL = "Volume";
  267.         buttonmanager =
  268.         new ButtonManager([ { name:"Up", code:{keyCode:Keyboard.UP,charCode:0}, group:"Movement" },
  269.                             { name:"Down", code:{keyCode:Keyboard.DOWN,charCode:0}, group:"Movement" },
  270.                             { name:"Left", code:{keyCode:Keyboard.LEFT,charCode:0}, group:"Movement" },
  271.                             { name:"Right", code:{keyCode:Keyboard.RIGHT,charCode:0}, group:"Movement" },
  272.                             { name:"Fire Left", code: { keyCode:65, charCode:97 }, group:"Shooting" },
  273.                             { name:"Fire Up", code: { keyCode:87, charCode:119 }, group:"Shooting" },
  274.                             { name:"Fire Down", code: { keyCode:83, charCode:115 }, group:"Shooting" },
  275.                             { name:"Fire Right", code: { keyCode:68, charCode:100 }, group:"Shooting" },
  276.                             ],
  277.                             3);
  278.                            
  279.         CommonStyle.init(buttonmanager);
  280.        
  281.         Lib.current.stage.addChild(CommonStyle.settings);
  282.        
  283.         CommonStyle.settings.onClose = function() { makeTitle(); };
  284.        
  285.         seq = new Sequencer();
  286.         for (n in 0...1)
  287.             seq.addSynth(new TableSynth());
  288.         for (n in 0...16)
  289.             seq.addChannel(seq.synths,TableSynth.generatorOf(TableSynth.defaultPatch()));
  290.        
  291.     }
  292.    
  293.     public function makeTitle()
  294.     {
  295.         asheet = new ASCIISheet(AssetCache.getBitmapData("assets/VGA8x16.png"), 8, 16,
  296.             [0x000000, 0x0000AA, 0x00AA00, 0x00AAAA, 0xAA0000, 0xAA00AA, 0xAA5500, 0xAAAAAA, 0x555555, 0x5555FF,
  297.             0x55FF55,0x55FFFF,0xFF5555,0xFF55FF,0xFFFF55,0xFFFFFF]);
  298.         amap = new ASCIIMap(asheet, 80, 25);
  299.        
  300.         Lib.current.stage.addChild(amap);
  301.        
  302.         seq.play("synth", "Volume");
  303.        
  304.         var events = SMFParser.load(seq, Assets.getBytes("assets/theme.mid"));
  305.         for (e in events)
  306.         {
  307.             e.channel = 0;
  308.             e.priority = 0;
  309.         }
  310.        
  311.         seq.pushEvents(events.copy());     
  312.        
  313.         titlepos = 0;
  314.        
  315.         stars = new Array();
  316.         for (n in 0...100)
  317.             stars.push( { ang:Math.random() * Math.PI * 2, dist:Math.random() * 80 } );
  318.         titletimer = 0;
  319.        
  320.         Lib.current.addEventListener(Event.ENTER_FRAME, doTitle);
  321.         Lib.current.stage.addEventListener(KeyboardEvent.KEY_DOWN, titleAdvance);
  322.     }
  323.    
  324.     public var titlepos : Int;
  325.     public var titletimer : Int;
  326.    
  327.     public var stars : Array<{ang:Float,dist:Float}>;
  328.    
  329.     public inline function starPos(star : {ang:Float,dist:Float})
  330.     {
  331.         var x = Math.sin(star.ang) * star.dist;
  332.         var y = Math.cos(star.ang) * star.dist;
  333.         return { x:Std.int(x),y:Std.int(y) };
  334.     }
  335.    
  336.     public inline function starDraw(star : {ang:Float,dist:Float})
  337.     {
  338.         var pos = starPos(star);
  339.         if (star.dist<8)
  340.             amap.spriteMono(".", 1, Std.int(pos.x + 80 >> 1), Std.int(pos.y + 25 >> 1), 8, 0);
  341.         else if (star.dist<20)
  342.             amap.spriteMono(".", 1, Std.int(pos.x + 80 >> 1), Std.int(pos.y + 25 >> 1), 7, 0);
  343.         else
  344.             amap.spriteMono(".", 1, Std.int(pos.x + 80>>1), Std.int(pos.y + 25>>1), 15, 0);
  345.     }
  346.    
  347.     public function doTitle(_)
  348.     {
  349.         // display the title and then instructions...
  350.         // last things to do before I ship - 1. compact assets 2. make the title starfield animate...
  351.        
  352.         if (titlepos == 0)
  353.         {
  354.             for (x in 0...amap.char.worldW)
  355.             {
  356.                 for (y in 0...amap.char.worldH)
  357.                     amap.spriteMono(" ", 1, x,y, 0, 0);
  358.             }
  359.             for (s in stars)
  360.             {
  361.                 s.dist += 1.0;
  362.                 s.ang += 0.1;
  363.                 if (s.dist > 80) s.dist = 0.;
  364.                 starDraw(s);
  365.             }
  366.             var str = "DALEK STARVATION CHALLENGE";
  367.             amap.text(str, (80 >> 1) - (str.length >> 1), 25 >> 1, Std.int(Math.random() * 15), 0);
  368.            
  369.             titletimer = (titletimer + 1) % 160;
  370.             if (titletimer < 80)
  371.             {
  372.                 str = "2012 Triplefox";
  373.             }
  374.             else
  375.             {
  376.                 str = "Press any key to continue";
  377.             }
  378.             amap.text(str, (80 >> 1) - (str.length >> 1), 24, Std.int(Math.random()*15), 0);
  379.         }
  380.         else
  381.         {
  382.             var xb = XBIN.load(Bytes.ofData(Assets.getBytes("assets/instructions.xb")));
  383.             amap.blit(xb.image24());
  384.         }
  385.        
  386.         amap.update();
  387.        
  388.     }
  389.    
  390.     public function playSampledSound()
  391.     {
  392.         seq.stop();
  393.         var xsnd = Audio.play("assets/exterminate_trim.mp3");
  394.         xsnd.addEventListener(Event.SOUND_COMPLETE, function(_) { seq.play("synth", "Volume"); } );    
  395.     }
  396.    
  397.     public function titleAdvance(_)
  398.     {
  399.         playSampledSound();
  400.        
  401.         titlepos++;
  402.         if (titlepos >= 2)
  403.         {
  404.             Lib.current.removeEventListener(Event.ENTER_FRAME, doTitle);
  405.             Lib.current.stage.removeEventListener(KeyboardEvent.KEY_DOWN, titleAdvance);
  406.             makeGame();
  407.         }
  408.     }
  409.    
  410.     public function makeGame()
  411.     {
  412.        
  413.         db = new DalekGamestate();
  414.         db.init(seq, amap, buttonmanager, this);
  415.        
  416.         Lib.current.addEventListener(Event.ENTER_FRAME, db.updateGameplay);
  417.        
  418.     }
  419.    
  420. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement