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);
};