lewpen-tetris-game.as

ActionScript source for Mini Tetris, 307 lines: the start button, and the whole game, with the board, the pieces, rotation, collisions and clearing lines. Raw file

//  0: frame 1

stop();

//  1: frame 1, clip character 4 depth 1 onClipEvent (release)

onClipEvent (release) {
  _root.gotoAndStop(2);
}

//  2: sprite 5 frame 1

function drawPiece() {
  mcPiece.clear();
  var r3;
  var j;
  var r1;
  var r2;
  r2 = piece_y * t_scale;
  for (j = 0; j < 4; j++) {
    r1 = piece_x * t_scale;
    for (r3 = 0; r3 < 4; r3++) {
      if (piece[j][r3]) {
        mcPiece.moveTo(r1, r2);
        mcPiece.beginFill(piece_col);
        mcPiece.lineTo(r1 + t_scale, r2);
        mcPiece.lineTo(r1 + t_scale, r2 + t_scale);
        mcPiece.lineTo(r1, r2 + t_scale);
        mcPiece.endFill();
      }
      r1 += t_scale;
    }
    r2 += t_scale;
  }
}
function drawBoard() {
  mcBoard.clear();
  var r2;
  var j;
  var r1;
  var r3;
  r3 = -t_scale;
  for (j = -1; j <= board_h; j++) {
    r1 = -t_scale;
    for (r2 = -1; r2 <= board_w; r2++) {
      if (board[j][r2]) {
        mcBoard.moveTo(r1, r3);
        mcBoard.beginFill(board[j][r2]);
        mcBoard.lineTo(r1 + t_scale, r3);
        mcBoard.lineTo(r1 + t_scale, r3 + t_scale);
        mcBoard.lineTo(r1, r3 + t_scale);
        mcBoard.endFill();
      }
      r1 += t_scale;
    }
    r3 += t_scale;
  }
}
function setCurrentPiece(piece_index, piece_rotate) {
  var r1;
  var r2;
  for (r2 = 0; r2 < 4; r2++) {
    for (r1 = 0; r1 < 4; r1++) {
      piece[r2][r1] = pieces[piece_index][r2 * 4 + piece_rotate][r1];
    }
  }
}
function testPieceAgainstBoard(x, y) {
  var r1;
  var r2;
  x += piece_x;
  y += piece_y;
  for (r2 = 0; r2 < 4; r2++) {
    for (r1 = 0; r1 < 4; r1++) {
      if (piece[r2][r1] && board[y + r2][x + r1]) {
        return true;
      }
    }
  }
  return false;
}
function rotatePiece(d) {
  var r1 = piece_rotate + d & 3;
  setCurrentPiece(piece_index, r1);
  if (!testPieceAgainstBoard(0, 0)) {
    piece_rotate = r1;
    drawPiece();
  } else {
    setCurrentPiece(piece_index, piece_rotate);
  }
}
function isAnythingBelowPiece() {
  return testPieceAgainstBoard(0, 1);
}
function countBoard() {
  var r1;
  var r2;
  var r3;
  var r;
  r = 0;
  for (r2 = 0; r2 < board_h; r2++) {
    r3 = 0;
    for (r1 = 0; r1 < board_w; r1++) {
      if (board[r2][r1]) {
        r3++;
      }
    }
    board_count[r2] = r3;
    if (r3 == board_w) {
      r++;
    }
  }
  return r;
}
function drawFlashy() {
  var r2;
  var r1;
  mcFlashy.clear();
  r1 = 0;
  for (r2 = 0; r2 < board_h; r2++) {
    if (board_count[r2] == board_w) {
      mcFlashy.moveTo(0, r1);
      mcFlashy.beginFill(16777215);
      mcFlashy.lineTo(board_w * t_scale, r1);
      mcFlashy.lineTo(board_w * t_scale, r1 + t_scale);
      mcFlashy.lineTo(0, r1 + t_scale);
      mcFlashy.endFill();
    }
    r1 += t_scale;
  }
}
function doFall() {
  var r1;
  var r2;
  var r3;
  var c = -1;
  r2 = board_h - 1;
  r3 = r2;
  while (r2 >= 0 && c) {
    c = 0;
    for (r1 = 0; r1 < board_w; r1++) {
      var b = board[r2][r1];
      c += b > 0;
      board[r3][r1] = b;
    }
    board_count[r3] = c;
    if (c == board_w) {
      r3++;
    }
    r2--;
    r3--;
  }
  var rows = r3 - r2;
  for (r2 = r3; r2 > r3 - rows; r2--) {
    for (r1 = 0; r1 < board_w; r1++) {
      board[r2][r1] = 0;
      board_count[r2] = 0;
    }
  }
  return rows;
}
function placeCurrentPieceInBoard() {
  var r1;
  var r2;
  var c;
  for (r2 = 0; r2 < 4; r2++) {
    for (r1 = 0; r1 < 4; r1++) {
      board[piece_y + r2][piece_x + r1] += piece[r2][r1] * piece_col;
    }
  }
  drawBoard();
  if (countBoard()) {
    drawFlashy();
    doing = DOING_FLASH;
    timer_count = 0;
  }
}
function setUpNextPiece() {
  piece_index = Math.floor(Math.random() * 7);
  piece_x = 3;
  piece_y = 0;
  piece_rotate = Math.floor(Math.random() * 4);
  piece_col = piece_cols[piece_index];
  setCurrentPiece(piece_index, piece_rotate);
}
function moveCurrentPieceDown() {
  var r1 = !isAnythingBelowPiece();
  if (r1) {
    piece_y++;
    drawPiece();
  }
  return r1;
}
function doGravity() {
  if (!moveCurrentPieceDown()) {
    placeCurrentPieceInBoard();
    setUpNextPiece();
  }
}
function movePiece(d) {
  if (!testPieceAgainstBoard(d, 0)) {
    piece_x += d;
    drawPiece();
    return true;
  }
  return false;
}
pieces = [[[0, 0, 1, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 1, 0], [1, 1, 1, 1], [0, 1, 0, 0], [1, 1, 1, 1], [0, 0, 1, 0], [0, 0, 0, 0], [0, 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, 1, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 1, 0], [0, 1, 1, 1], [0, 0, 1, 1], [0, 1, 1, 1], [0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 1, 1], [0, 0, 1, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 1, 1], [0, 0, 1, 1], [0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 1], [0, 1, 1, 0], [0, 0, 1, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 1, 1, 0], [0, 0, 0, 1], [0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 1, 1], [0, 0, 1, 1], [0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 1, 1], [0, 1, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 1], [0, 0, 0, 0], [0, 0, 1, 0], [0, 1, 1, 1], [0, 0, 1, 0], [0, 1, 1, 1], [0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [0, 1, 1, 0]], [[0, 0, 0, 0], [0, 1, 1, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 1, 1], [0, 0, 1, 0], [0, 1, 1, 1], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 1, 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, 1, 1, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]];
piece_cols = [10066329, 16711680, 39168, 26367, 16750848, 10027263, 3355443];
createEmptyMovieClip("mcBack", 1000);
createEmptyMovieClip("mcBoard", 1001);
createEmptyMovieClip("mcPiece", 1002);
createEmptyMovieClip("mcFlashy", 1003);
t_scale = 4;
DOING_DROP = 1;
DOING_FLASH = 2;
doing = DOING_DROP;
board_w = 10;
board_h = 20;
board = new Array();
for (j = -1; j <= board_h; j++) {
  board[j] = new Array();
  for (i = -1; i <= board_w; i++) {
    board[j][i] = i < 0 || j < 0 || i == board_w || j == board_h ? 1 : 0;
  }
}
board_count = new Array();
drawBoard();
mcBack.moveTo(0, 0);
mcBack.beginFill(14544639);
mcBack.lineTo(board_w * t_scale, 0);
mcBack.lineTo(board_w * t_scale, board_h * t_scale);
mcBack.lineTo(0, board_h * t_scale);
mcBack.endFill();
piece = new Array();
for (i = 0; i < 4; i++) {
  piece[i] = new Array();
}
piece_x = 0;
piece_y = 0;
piece_index = -1;
piece_rotate = 0;
setUpNextPiece();
drawPiece();
timer_slow = 10;
timer_count = 0;
onEnterFrame = function() {
  if (doing == DOING_DROP) {
    onKeyDown();
    timer_count++;
    if (timer_count >= timer_slow) {
      timer_count = 0;
      doGravity();
    }
  } else {
    mcPiece.clear();
    if (timer_count < 20) {
      if (timer_count % 10 < 5) {
        mcFlashy._alpha = 100;
      } else {
        mcFlashy._alpha = 0;
      }
      timer_count++;
    } else {
      mcFlashy.clear();
      doFall();
      drawBoard();
      drawPiece();
      timer_count = 0;
      doing = DOING_DROP;
    }
  }
};
key_up = false;
key_down = false;
key_left = false;
key_right = false;
key_timer = 0;
onKeyDown = function() {
  if (Key.isDown(37)) {
    if (!key_left) {
      key_count = 0;
    }
    if (key_count != 1 && key_count != 2) {
      movePiece(-1);
    }
    key_count++;
  } else if (Key.isDown(39)) {
    if (!key_right) {
      key_count = 0;
    }
    if (key_count != 1 && key_count != 2) {
      movePiece(1);
    }
    key_count++;
  } else if (Key.isDown(40) && !key_down) {
    timer_count = 0;
    doGravity();
  } else if (Key.isDown(38) && !key_up) {
    rotatePiece(1);
  }
  key_up = Key.isDown(38);
  key_down = false;
  key_left = Key.isDown(37);
  key_right = Key.isDown(39);
};