Ord.io Logo
Ord.io
Inscription

1,167,357

<!DOCTYPE html>
<html>

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>DogePunks Invaders</title>
  <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js'></script>


  <style>
    #gameboard {
      background-color: black;
    }

    #game-wrapper {
      margin: 0 auto;
      width: 500px;
    }

    body {
      background-image: url('https://luminex-public.s3.eu-west-1.amazonaws.com/collections/dogepunks/media/dogepunks-invaders-bg.webp');
    }
  </style>
</head>

<body>
  <br>
  <div id='game-wrapper'>
    <canvas id='gameboard' width='500' height='500'></canvas>
  </div>




  <script>
    // Global level variable
    var level = 1;


    var AlienFlock = function AlienFlock() {
      this.invulnrable = true;
      this.dx = 10;
      this.dy = 0;
      this.hit = 1;
      this.lastHit = 0;
      this.speed = 10;

      this.draw = function() {};

      this.die = function() {
        if (Game.board.nextLevel()) {
          Game.loadBoard(new GameBoard(Game.board.nextLevel()));
        } else {
          Game.callbacks['win']();
        }
      }

      this.step = function(dt) {
        if (this.hit && this.hit != this.lastHit) {
          this.lastHit = this.hit;
          this.dy = this.speed;
        } else {
          this.dy = 0;
        }
        this.dx = this.speed * this.hit;

        var max = {},
          cnt = 0;
        this.board.iterate(function() {
          if (this instanceof Alien) {
            if (!max[this.x] || this.y > max[this.x]) {
              max[this.x] = this.y;
            }
            cnt++;
          }
        });

        if (cnt == 0) {
          this.die();
        }

        this.max_y = max;
        return true;
      };

    }



    var Alien = function Alien(opts) {
      this.flock = opts['flock'];
      this.frame = 0;
      this.mx = 0;
    }

    Alien.prototype.draw = function(canvas) {
      Sprites.draw(canvas, this.name, this.x, this.y, this.frame);
    }

    Alien.prototype.die = function() {
      GameAudio.play('die');
      this.flock.speed += 1;
      this.board.remove(this);
    }

    Alien.prototype.step = function(dt) {
      this.mx += dt * this.flock.dx;
      this.y += this.flock.dy;
      if (Math.abs(this.mx) > 10) {
        if (this.y == this.flock.max_y[this.x]) {
          this.fireSometimes();
        }
        this.x += this.mx;
        this.mx = 0;
        this.frame = (this.frame + 1) % 2;
        if (this.x > Game.width - Sprites.map.alien1.w * 2) this.flock.hit = -1;
        if (this.x < Sprites.map.alien1.w) this.flock.hit = 1;
      }
      return true;
    }

    Alien.prototype.fireSometimes = function() {
      if (Math.random() * 100 < 10) {
        this.board.addSprite('missile', this.x + this.w / 2 - Sprites.map.missile.w / 2,
          this.y + this.h, {
            dy: 100
          });
      }
    }

    var Player = function Player(opts) {
      this.reloading = 0;
    }

    Player.prototype.draw = function(canvas) {
      Sprites.draw(canvas, 'player', this.x, this.y);
    }


    Player.prototype.die = function() {
      GameAudio.play('die');
      Game.callbacks['die']();
    }

    Player.prototype.step = function(dt) {
      if (Game.keys['left']) {
        this.x -= 100 * dt;
      }
      if (Game.keys['right']) {
        this.x += 100 * dt;
      }

      if (this.x < 0) this.x = 0;
      if (this.x > Game.width - this.w) this.x = Game.width - this.w;

      this.reloading--;

      // Missiles limit
      if (Game.keys['fire'] && this.reloading <= 0 && this.board.missiles < 3 * (1 + (level / 3))) {
        GameAudio.play('fire');
        this.board.addSprite('missile',
          this.x + this.w / 2 - Sprites.map.missile.w / 2,
          this.y - this.h, {
            dy: -100,
            player: true
          });
        this.board.missiles++;
        this.reloading = 10;
      }
      return true;
    }


    var Missile = function Missile(opts) {
      this.dy = opts.dy;
      this.player = opts.player;
    }

    Missile.prototype.draw = function(canvas) {
      Sprites.draw(canvas, 'missile', this.x, this.y);
    }

    Missile.prototype.step = function(dt) {
      this.y += this.dy * dt;

      var enemy = this.board.collide(this);
      if (enemy) {
        enemy.die();
        return false;
      }
      return (this.y < 0 || this.y > Game.height) ? false : true;
    }

    Missile.prototype.die = function() {
      if (this.player) this.board.missiles--;
      if (this.board.missiles < 0) this.board.missiles = 0;
      this.board.remove(this);
    }



    var levelData = {
      1: [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0]
      ],
      2: [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0],
        [0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0],
        [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
        [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
        [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
        [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0]
      ],
      3: [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0],
        [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0],
        [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
        [0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0],
        [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
        [0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0],
        [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]
      ],
      4: [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 2, 2, 0, 0, 0, 2, 2, 0, 0],
        [0, 2, 1, 1, 2, 0, 2, 1, 1, 2, 0],
        [0, 2, 1, 1, 2, 2, 2, 1, 1, 2, 0],
        [0, 0, 2, 2, 0, 2, 0, 2, 2, 0, 0],
        [0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
      ]
    };


    for (var l = 5; l < 25; l++) {
      var level_data = [];
      // Generate random levels after level 4
      var rows = 11;
      var cols = 11;
      // var enemySpeed = 50 + 10 * level; // Increase enemy speed with each level

      var enemyCount = 0
      for (var i = 0; i < rows; i++) {

        var enemyRow = [];

        for (var j = 0; j < cols; j++) {
          var enemyType = Math.floor(Math.random() * 3); // Random enemy type (0, 1, or 2)
          if (enemyType > 0) {
            enemyCount++;
          }

          if (enemyCount > 8 * (l * 1.55)) {
            enemyType = 0;
          }
          // var x = 30 + j * 30 + [0, 4, 0][enemyType - 1] * j;
          // var y = 30 + i * 30;
          // var enemy = new Enemy(enemyType, enemySpeed, x, y);
          enemyRow.push(enemyType);
        }
        level_data.push(enemyRow);
        levelData[l] = level_data;
      }
    };

    var Game = new function() {
      var KEY_CODES = {
        37: 'left',
        39: 'right',
        32: 'fire'
      };
      this.keys = {};

      this.initialize = function(canvas_dom, level_data, sprite_data, callbacks) {
        this.canvas_elem = $(canvas_dom)[0];
        this.canvas = this.canvas_elem.getContext('2d');
        this.width = $(this.canvas_elem).attr('width');
        this.height = $(this.canvas_elem).attr('height');

        $(window).keydown(function(event) {
          if (KEY_CODES[event.keyCode]) Game.keys[KEY_CODES[event.keyCode]] = true;
        });

        $(window).keyup(function(event) {
          if (KEY_CODES[event.keyCode]) Game.keys[KEY_CODES[event.keyCode]] = false;
        });

        this.level_data = level_data;
        this.callbacks = callbacks;
        Sprites.load(sprite_data, this.callbacks['start']);
      };

      this.loadBoard = function(board) {
        Game.board = board;
      };

      this.loop = function() {
        Game.board.step(30 / 1000);
        Game.board.render(Game.canvas);
        setTimeout(Game.loop, 30);
      };
    };

    var Sprites = new function() {
      this.map = {};

      this.load = function(sprite_data, callback) {
        this.map = sprite_data;
        this.image = new Image();
        this.image.onload = callback;
        this.image.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkBAMAAAAxqGI4AAAAKlBMVEUAAAD///9GlUbZAAD///9t///z1uHj///g9fjFxcUA/AD8/PygZQDh//9v4QupAAAABXRSTlP/////APu2DlMAAAF3SURBVHgB7NLBaQMxFIThwbDJ2R0sTgfpIOACdNn7nnzO7bkDbwtuYauM5GGNIPIlvNnwQD9ImZM+JzFedXQMwGFE4+7IK+Q08qq3DjmM2z6M7kiJCLc3QoMvczJ35OPzlA8Rbm+kfliJMCLMG6n/2fWXwB/hIZI3kYi/SfnsRLjdkRwfBqodE2m0F3I+n78ckSGhcYdEpsSr3gJkSES4NcijlFfiLlI4hH+hqZwE/uSJhwzTs1TtiEh5micB2wb8kRwRbglSPjsRbjECbjgj9cNKZMA0IRHhFiCNlMixXQxknjchTxVyuQAwMyBPGTI/kTch8m7sW4osesSMSL6VyHUPJDO3fCmRAlyXHRBTI0bEMiZD7nYrygO5C5GFiCkR2wPZEiLtFMhaFxapCRYWWX8VFFkbhUTWZh3pSEc68qc60hGw+Ai2giM0WEf+H3F4oyM/k969e+PwsESA5wAj7S3hvUCCJaOW3L07TCyRvXv34qglmAAAk810EB8H3DYAAAAASUVORK5CYII=';
      };

      this.draw = function(canvas, sprite, x, y, frame) {
        var s = this.map[sprite];
        if (!frame) frame = 0;
        canvas.drawImage(this.image, s.sx + frame * s.w, s.sy, s.w, s.h, x, y, s.w, s.h);
      };
    }

    var GameScreen = function GameScreen(text, text2, text_level, callback) {
      this.step = function(dt) {
        if (Game.keys['fire'] && callback) callback();
      };

      this.render = function(canvas) {
        canvas.clearRect(0, 0, Game.width, Game.height);


        var myImage = new Image();
        myImage.src = 'data:image/webp;base64,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'
        // Draw the image on the canvas
        var imageX = (Game.width - myImage.width) - 70;
        var imageY = (Game.height - myImage.height) - 170;
        canvas.drawImage(myImage, imageX, imageY);

        canvas.font = "bold 40px arial";
        var measure = canvas.measureText(text);
        canvas.fillStyle = "#FFFFFF";
        canvas.fillText(text, Game.width / 2 - measure.width / 2, Game.height / 2);

        canvas.font = "bold 20px arial";
        var measure2 = canvas.measureText(text2);
        canvas.fillText(text2, Game.width / 2 - measure2.width / 2, Game.height / 2 + 40);

        canvas.font = "bold 15px arial";
        var measure3 = canvas.measureText(text_level);
        canvas.fillText(text_level, Game.width / 2 - measure3.width / 2, Game.height / 2 + 75);

        canvas.font = "bold 15px arial";
        var about = "https://dogepunks.xyz/"
        var measure4 = canvas.measureText(about);
        canvas.fillText(about, 20, Game.height - 15);

      };
    };


    function Enemy(type, speed, x, y) {
      this.type = type;
      this.speed = speed;
      this.x = x;
      this.y = y;

      // Additional properties and methods specific to the enemy
    }


    var GameBoard = function GameBoard(level_number) {
      this.removed_objs = [];
      this.missiles = 0;
      this.level = level_number;
      var board = this;

      this.add = function(obj) {
        obj.board = this;
        this.objects.push(obj);
        return obj;
      };
      this.remove = function(obj) {
        this.removed_objs.push(obj);
      };

      this.addSprite = function(name, x, y, opts) {
        var sprite = this.add(new Sprites.map[name].cls(opts));
        sprite.name = name;
        sprite.x = x;
        sprite.y = y;
        sprite.w = Sprites.map[name].w;
        sprite.h = Sprites.map[name].h;
        return sprite;
      };


      this.iterate = function(func) {
        for (var i = 0, len = this.objects.length; i < len; i++) {
          func.call(this.objects[i]);
        }
      };

      this.detect = function(func) {
        for (var i = 0, val = null, len = this.objects.length; i < len; i++) {
          if (func.call(this.objects[i])) return this.objects[i];
        }
        return false;
      };

      this.step = function(dt) {
        this.removed_objs = [];
        this.iterate(function() {
          if (!this.step(dt)) this.die();
        });

        for (var i = 0, len = this.removed_objs.length; i < len; i++) {
          var idx = this.objects.indexOf(this.removed_objs[i]);
          if (idx != -1) this.objects.splice(idx, 1);
        }
      };

      this.render = function(canvas) {
        canvas.clearRect(0, 0, Game.width, Game.height);


        // Draw the current level text on the top right corner
        canvas.font = "bold 23px arial";
        canvas.fillStyle = "#FFFFFF";
        var levelText = "DogePunks Invaders";
        canvas.fillText(levelText, Game.width / 2 + 10 - canvas.measureText(levelText).width - 10, 30);

        // Draw the current level text on the top right corner
        canvas.font = "bold 20px arial";
        canvas.fillStyle = "#FFFFFF";
        var levelText = "Level: " + this.level;
        canvas.fillText(levelText, Game.width - canvas.measureText(levelText).width - 10, 30);


        this.iterate(function() {
          this.draw(canvas);
        });
      };

      this.collision = function(o1, o2) {
        return !((o1.y + o1.h - 1 < o2.y) || (o1.y > o2.y + o2.h - 1) ||
          (o1.x + o1.w - 1 < o2.x) || (o1.x > o2.x + o2.w - 1));
      };

      this.collide = function(obj) {
        return this.detect(function() {
          if (obj != this && !this.invulnrable)
            return board.collision(obj, this) ? this : false;
        });
      };

      this.loadLevel = function(level) {
        this.objects = [];
        this.player = this.addSprite('player', // Sprite
          Game.width / 2, // X
          Game.height - Sprites.map['player'].h - 10); // Y

        var flock = this.add(new AlienFlock());
        for (var y = 0, rows = level.length; y < rows; y++) {
          for (var x = 0, cols = level[y].length; x < cols; x++) {
            var alien = Sprites.map['alien' + level[y][x]];
            if (alien) {
              this.addSprite('alien' + level[y][x], // Which Sprite
                (alien.w + 10) * x, // X
                alien.h * y, // Y
                {
                  flock: flock
                }); // Options
            }
          }
        }
      };

      this.nextLevel = function() {
        level = level_number + 1;
        return Game.level_data[level_number + 1] ? (level_number + 1) : false
      };

      this.loadLevel(Game.level_data[level_number]);
    };

    var GameAudio = new function() {
      this.load_queue = [];
      this.loading_sounds = 0;
      this.sounds = {};

      var channel_max = 10;
      audio_channels = new Array();
      for (a = 0; a < channel_max; a++) {
        audio_channels[a] = new Array();
        audio_channels[a]['channel'] = new Audio();
        audio_channels[a]['finished'] = -1;
      }

      this.load = function(files, callback) {
        var audioCallback = function() {
          GameAudio.finished(callback);
        }

        for (name in files) {
          var filename = files[name];
          this.loading_sounds++;
          var snd = new Audio();
          this.sounds[name] = snd;
          snd.addEventListener('canplaythrough', audioCallback, false);
          snd.src = filename;
          snd.load();
        }
      };

      this.finished = function(callback) {
        this.loading_sounds--;
        if (this.loading_sounds == 0) {
          callback();
        }
      };

      this.play = function(s) {
        for (a = 0; a < audio_channels.length; a++) {
          thistime = new Date();
          if (audio_channels[a]['finished'] < thistime.getTime()) {
            audio_channels[a]['finished'] = thistime.getTime() + this.sounds[s].duration * 1000;
            audio_channels[a]['channel'].src = this.sounds[s].src;
            audio_channels[a]['channel'].load();
            audio_channels[a]['channel'].play();
            break;
          }
        }
      };
    };




    var spriteData = {
      'alien1': {
        sx: 0,
        sy: 0,
        w: 23,
        h: 18,
        cls: Alien,
        frames: 2
      },
      'alien2': {
        sx: 0,
        sy: 18,
        w: 23,
        h: 18,
        cls: Alien,
        frames: 2
      },
      'player': {
        sx: 0,
        sy: 36,
        w: 26,
        h: 17,
        cls: Player
      },
      'missile': {
        sx: 0,
        sy: 86,
        w: 3,
        h: 14,
        cls: Missile
      }
    }

    function startGame() {
      var screen = new GameScreen("DogePunks Invaders", "press space to start", "Level: " + level,
        function() {
          Game.loadBoard(new GameBoard(1));
        });
      Game.loadBoard(screen);
      Game.loop();
    }

    function endGame() {
      var screen = new GameScreen("Game Over", "(press space to restart)", "Level: " + level,
        function() {
          Game.loadBoard(new GameBoard(1));
        });
      Game.loadBoard(screen);
    }


    function winGame() {
      var screen = new GameScreen("You Win!", "(press space to restart)", "Level: " + level,
        function() {
          Game.loadBoard(new GameBoard(1));
        });
      Game.loadBoard(screen);
    }

    $(function() {
      GameAudio.load({
          'fire': 'data:audio/ogg;base64,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',
          'die': 'data:audio/ogg;base64,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'
        },
        function() {
          Game.initialize("#gameboard", levelData, spriteData, {
            "start": startGame,
            "die": endGame,
            "win": winGame
          });
        });
    });
  </script>


</body>

</html>
Owner Image

bad bunny

163 days ago

Hey, I'm from Bitboy.games and we're interested on putting your game on our gaming platform. If you want to discuss more, please feel free to dm me on telegram @cryptoinsights0
Owner Image

bc1ph...u60va

1 year ago

Send nodes
  • ID

    63ef7...2d5i0

  • Owned By
  • File Type

    HTMLtext/html;charset=utf-8

  • File Size

    47.183 KB

  • Created

    April 18, 2023, 11:15 AM UTC

    1 year ago

  • Creation Block
  • Creation Transaction
  • Creation Fee

    60,225sats

  • Tags

Sat

  • Sat Number
  • Sat Name

    iweloxscjva

  • Sat Creation Block
  • Sat Creation Year

    2011

  • Inscriptions
  • Cursed Inscriptions

    No cursed inscriptions yet

  • SATRIBUTES

    No Satributes