88 lines
2.1 KiB
JavaScript
88 lines
2.1 KiB
JavaScript
'use strict';
|
|
|
|
/* Centrale configuratie voor het spel */
|
|
const CONSTANTS = {
|
|
COLS: 10, // breedte van het bord
|
|
ROWS: 20, // hoogte van het bord
|
|
CELL: 30, // pixelgrootte van een cel op het bord
|
|
PREVIEW_CELL: 18, // pixelgrootte van een cel in de previews
|
|
PREVIEW_COUNT: 3, // aantal zichtbare volgende blokken
|
|
COLORS: {
|
|
I: '#00e5f0',
|
|
O: '#f7d000',
|
|
T: '#b14ce0',
|
|
S: '#35d23d',
|
|
Z: '#f03c3c',
|
|
J: '#3c6cf0',
|
|
L: '#f09a20'
|
|
},
|
|
SCORE: {
|
|
SINGLE: 100, // 1 rij
|
|
DOUBLE: 300, // 2 rijen
|
|
TRIPLE: 500, // 3 rijen
|
|
TETRIS: 800, // 4 rijen
|
|
SOFT_DROP: 1, // punt per cel bij zachte drop
|
|
HARD_DROP: 2, // punten per cel bij harde drop
|
|
LINES_PER_LEVEL: 10 // aantal rijen nodig voor een nieuw level
|
|
},
|
|
GRAVITY: [800, 720, 630, 550, 470, 380, 300, 220, 160, 100,
|
|
80, 70, 60, 50, 40, 30, 20, 15, 10, 10], // ms per zetje per level
|
|
HIGHSCORE_KEY: 'neo-tetris.highscores',
|
|
PLAYER_NAME_KEY: 'neo-tetris.playername',
|
|
MAX_HIGHSCORES: 10
|
|
};
|
|
|
|
/* Punten per aantal tegelijk gewiste rijen (index = aantal rijen) */
|
|
const SCORE_POINTS = [0, 100, 300, 500, 800];
|
|
|
|
/* Definitie van de 7 tetromino's als matrices (1 = gevuld blokje) */
|
|
const SHAPES = {
|
|
I: [
|
|
[0, 0, 0, 0],
|
|
[1, 1, 1, 1],
|
|
[0, 0, 0, 0],
|
|
[0, 0, 0, 0]
|
|
],
|
|
O: [
|
|
[1, 1],
|
|
[1, 1]
|
|
],
|
|
T: [
|
|
[0, 1, 0],
|
|
[1, 1, 1],
|
|
[0, 0, 0]
|
|
],
|
|
S: [
|
|
[0, 1, 1],
|
|
[1, 1, 0],
|
|
[0, 0, 0]
|
|
],
|
|
Z: [
|
|
[1, 1, 0],
|
|
[0, 1, 1],
|
|
[0, 0, 0]
|
|
],
|
|
J: [
|
|
[1, 0, 0],
|
|
[1, 1, 1],
|
|
[0, 0, 0]
|
|
],
|
|
L: [
|
|
[0, 0, 1],
|
|
[1, 1, 1],
|
|
[0, 0, 0]
|
|
]
|
|
};
|
|
|
|
const PIECE_TYPES = Object.keys(SHAPES);
|
|
|
|
/* Eenvoudige wall-kicks die proberen een blokje langs obstakels te schuiven bij rotatie */
|
|
const WALL_KICKS = [
|
|
[ 0, 0],
|
|
[-1, 0],
|
|
[ 1, 0],
|
|
[ 0, -1],
|
|
[-2, 0],
|
|
[ 2, 0]
|
|
];
|