hextris/js/checking.js
2014-05-18 14:15:13 -04:00

131 lines
5.3 KiB
JavaScript

// HackExeter
function getIndex(list, index) {
if (index > -1) {
return index % list.length;
} else {
return list.length + index;
}
}
function scoreCheckHorizontal(clock, side, index) {
clockSides = clock.blocks;
if (clockSides[getIndex(clockSides, side)][index] && clockSides[getIndex(clockSides, side - 1)][index] && clockSides[getIndex(clockSides, side - 2)][index]) {
if (clockSides[getIndex(clockSides, side)][index].color == clockSides[getIndex(clockSides, side - 1)][index].color && clockSides[getIndex(clockSides, side - 1)][index].color == clockSides[getIndex(clockSides, side - 2)][index].color) {
return -2;
}
}
if (clockSides[getIndex(clockSides, side)][index] && clockSides[getIndex(clockSides, side + 1)][index] && clockSides[getIndex(clockSides, side - 1)][index]) {
if (clockSides[getIndex(clockSides, side)][index].color == clockSides[getIndex(clockSides, side + 1)][index].color && clockSides[getIndex(clockSides, side + 1)][index].color == clockSides[getIndex(clockSides, side - 1)][index].color) {
return -1;
}
}
if (clockSides[getIndex(clockSides, side)][index] && clockSides[getIndex(clockSides, side + 1)][index] && clockSides[getIndex(clockSides, side + 2)][index]) {
if (clockSides[getIndex(clockSides, side)][index].color == clockSides[getIndex(clockSides, side + 1)][index].color && clockSides[getIndex(clockSides, side + 1)][index].color == clockSides[getIndex(clockSides, side + 2)][index].color) {
return 0;
}
}
return "false";
}
function scoreCheckVertical(clock, side, index) {
curSide = clock.blocks[side];
if (curSide[index] && curSide[index - 2] && curSide[index - 1]) {
if (curSide[index].color == curSide[index - 2].color && curSide[index - 2].color == curSide[index - 1].color) {
return -2;
}
}
if (curSide[index] && curSide[index + 1] && curSide[index - 1]) {
if (curSide[index].color == curSide[index + 1].color && curSide[index + 1].color == curSide[index - 1].color) {
return -1;
}
}
if (curSide[index] && curSide[index + 2] && curSide[index + 1]) {
if (curSide[index].color == curSide[index + 2].color && curSide[index + 2].color == curSide[index + 1].color) {
return 0;
}
}
return "false";
}
function consolidateBlocks(clock, side, index) {
horizontal = scoreCheckHorizontal(clock, side, index);
vertical = scoreCheckVertical(clock, side, index);
deleted = [];
if (horizontal != "false") {
scoreScalar *= 2;
deleted.push([side, index, horizontal]);
} else {
deleted.push([]);
}
if (vertical != "false") {
scoreScalar *= 2;
deleted.push([side, index, vertical]);
} else {
deleted.push([]);
}
eraseBlocks(clock, deleted);
return;
}
function eraseBlocks(clock, deleted) {
if (deleted[0].length > 0) {
side = deleted[0][0];
index = deleted[0][1];
horizontal = deleted[0][2];
length = 3;
flag = 0;
if (clock.blocks[getIndex(clock.blocks, side + horizontal + length + 1)][index]) {
try {
flag = clock.blocks[getIndex(clock.blocks, side + horizontal + length)][index].color == clock.blocks[getIndex(clock.blocks, side + horizontal + length + 1)][index].color;
} catch (e) {
console.log(e);
}
}
while (flag) {
if (clock.blocks[getIndex(clock.blocks, side + horizontal + length + 1)][index]) {
flag = clock.blocks[getIndex(clock.blocks, side + horizontal + length)][index].color == clock.blocks[getIndex(clock.blocks, side + horizontal + length + 1)][index].color;
}
length++;
}
console.log(length);
for (var i = 0; i < length; i++) {
clock.blocks[getIndex(clock.blocks, side + horizontal + i)].splice(index, 1);
}
for (var i = 0; i < length; i++) {
if (side + horizontal + i < clock.blocks.length) {
consolidateBlocks(clock, getIndex(clock.blocks, side + horizontal + i), index);
}
}
}
if (deleted[1].length > 0) {
side = deleted[1][0];
index = deleted[1][1];
vertical = deleted[1][2];
vertlength = 3;
while (index + vertical + vertlength < clock.blocks[side].length - 1 && (clock.blocks[slide][index + vertical + length].color == clock.blocks[slide][index + vertical + length + 1].color )) {
vertlength += 1;
}
clock.blocks[side].splice(index + vertical, 2 + (1 * (!deleted[0].length > 0)));
for (var i = 0; i < clock.blocks[side].length - (index + vertical); i++) {
consolidateBlocks(clock, side, index + vertical + i);
}
}
sidesChanged = [];
if (deleted[1].length > 0) {
if (deleted[1][0] != "false") {
sidesChanged.push(deleted[1][0]);
}
}
if (deleted[0].length > 0) {
for (var i = 0; i < length; i++) {
if (deleted[0][2] != "false") {
sidesChanged.push(getIndex(clock.blocks, deleted[0][0] + deleted[0][2] + i));
}
}
}
sidesChanged.forEach(function(o) {
MainClock.blocks[o].forEach(function(block) {
block.settled = 0;
})
});
}