Resolution merge conflicts
This commit is contained in:
@@ -17,6 +17,7 @@ body {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
font-family: 'Arial', sans-serif;
|
font-family: 'Arial', sans-serif;
|
||||||
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
main {
|
main {
|
||||||
@@ -28,6 +29,36 @@ main {
|
|||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
min-width: fit-content;
|
min-width: fit-content;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.game-layout {
|
||||||
|
width: min(95vw, 1000px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbox {
|
||||||
|
width: 100%;
|
||||||
|
background: #dfe5f8;
|
||||||
|
border-radius: 10px;
|
||||||
|
padding: 14px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbox h2 {
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbox p {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
color: #334;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glass-palette {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ================================
|
/* ================================
|
||||||
@@ -63,6 +94,12 @@ main {
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
position: relative;
|
position: relative;
|
||||||
background-color: #2a2a2a;
|
background-color: #2a2a2a;
|
||||||
|
user-select: none;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell.can-drop {
|
||||||
|
outline: 2px dashed rgba(0, 0, 0, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ================================
|
/* ================================
|
||||||
@@ -71,7 +108,6 @@ main {
|
|||||||
|
|
||||||
.empty {
|
.empty {
|
||||||
background-color: #DADEEF;
|
background-color: #DADEEF;
|
||||||
border-color: #DADEEF;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.empty:hover {
|
.empty:hover {
|
||||||
@@ -118,6 +154,10 @@ main {
|
|||||||
background-position: center;
|
background-position: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.door-open {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
background-color: #DADEEF;
|
background-color: #DADEEF;
|
||||||
background-image: url("../img/tiles/ButtonComplete.svg"), url("../img/tiles/Tuile.svg");
|
background-image: url("../img/tiles/ButtonComplete.svg"), url("../img/tiles/Tuile.svg");
|
||||||
@@ -126,6 +166,10 @@ main {
|
|||||||
background-position: center;
|
background-position: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.button-active {
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
|
||||||
.demi-wall {
|
.demi-wall {
|
||||||
background-color: #DADEEF;
|
background-color: #DADEEF;
|
||||||
background-image: url("../img/tiles/VerticaleSemi.svg");
|
background-image: url("../img/tiles/VerticaleSemi.svg");
|
||||||
@@ -174,7 +218,6 @@ main {
|
|||||||
background-position: center;
|
background-position: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ================================
|
/* ================================
|
||||||
LIGHT LASER
|
LIGHT LASER
|
||||||
================================ */
|
================================ */
|
||||||
@@ -221,6 +264,16 @@ main {
|
|||||||
object-fit: contain;
|
object-fit: contain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.button-door {
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* ================================
|
/* ================================
|
||||||
RESPONSIVE
|
RESPONSIVE
|
||||||
================================ */
|
================================ */
|
||||||
|
|||||||
@@ -13,9 +13,23 @@ const legend = {
|
|||||||
demiWallCornerUpLeft: 9,
|
demiWallCornerUpLeft: 9,
|
||||||
demiWallCornerUpRight: 10,
|
demiWallCornerUpRight: 10,
|
||||||
demiWallCornerDownLeft: 11,
|
demiWallCornerDownLeft: 11,
|
||||||
demiWallCornerDownRight: 12
|
demiWallCornerDownRight: 12,
|
||||||
|
doorOpen: 13,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const laserColors = {
|
||||||
|
white: "white",
|
||||||
|
red: "red",
|
||||||
|
blue: "blue",
|
||||||
|
yellow: "yellow",
|
||||||
|
};
|
||||||
|
|
||||||
|
const glassOptions = [
|
||||||
|
laserColors.red,
|
||||||
|
laserColors.blue,
|
||||||
|
laserColors.yellow,
|
||||||
|
];
|
||||||
|
|
||||||
// Grid test
|
// Grid test
|
||||||
|
|
||||||
let levels = [
|
let levels = [
|
||||||
@@ -31,6 +45,8 @@ let levels = [
|
|||||||
[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],
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
let currentLevelIndex = 0;
|
let currentLevelIndex = 0;
|
||||||
@@ -39,6 +55,8 @@ let currentLevelIndex = 0;
|
|||||||
let laserDirection = { dx: 0, dy: 0 };
|
let laserDirection = { dx: 0, dy: 0 };
|
||||||
let laserSegments = {};
|
let laserSegments = {};
|
||||||
let mirrorOrientations = {};
|
let mirrorOrientations = {};
|
||||||
|
let activatedButtons = {};
|
||||||
|
let openedDoors = {};
|
||||||
|
|
||||||
function normalizeLaserDirection(dx, dy) {
|
function normalizeLaserDirection(dx, dy) {
|
||||||
const epsilon = 0.0001;
|
const epsilon = 0.0001;
|
||||||
@@ -79,6 +97,31 @@ function getLaserSegmentClass(segmentDirection) {
|
|||||||
return "laser-diagonal-up";
|
return "laser-diagonal-up";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function openAdjacentDoors(x, y) {
|
||||||
|
// Open adjacent doors (up, down, left, right)
|
||||||
|
const directions = [
|
||||||
|
{ dx: 0, dy: -1 },
|
||||||
|
{ dx: 0, dy: 1 },
|
||||||
|
{ dx: -1, dy: 0 },
|
||||||
|
{ dx: 1, dy: 0 }
|
||||||
|
];
|
||||||
|
|
||||||
|
for (let dir of directions) {
|
||||||
|
const newX = x + dir.dx;
|
||||||
|
const newY = y + dir.dy;
|
||||||
|
|
||||||
|
if (newX >= 0 && newX < levels[currentLevelIndex][0].length &&
|
||||||
|
newY >= 0 && newY < levels[currentLevelIndex].length) {
|
||||||
|
if (levels[currentLevelIndex][newY][newX] === legend.door) {
|
||||||
|
openedDoors[`${newY},${newX}`] = true;
|
||||||
|
levels[currentLevelIndex][newY][newX] = legend.doorOpen; // Change state to open
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
loadGrid(); // Refresh grid to show opened doors
|
||||||
|
}
|
||||||
|
|
||||||
function initializeMirrorOrientations() {
|
function initializeMirrorOrientations() {
|
||||||
mirrorOrientations = {}; // Reset
|
mirrorOrientations = {}; // Reset
|
||||||
for (let y = 0; y < levels[currentLevelIndex].length; y++) {
|
for (let y = 0; y < levels[currentLevelIndex].length; y++) {
|
||||||
@@ -139,16 +182,30 @@ function loadGrid() {
|
|||||||
break;
|
break;
|
||||||
case legend.door:
|
case legend.door:
|
||||||
cell.classList.add("door");
|
cell.classList.add("door");
|
||||||
|
if (openedDoors[`${y},${x}`]) {
|
||||||
|
cell.classList.add("door-open");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case legend.button:
|
case legend.button:
|
||||||
cell.classList.add("button");
|
cell.classList.add("button");
|
||||||
|
if (activatedButtons[`${y},${x}`]) {
|
||||||
|
cell.classList.add("button-active");
|
||||||
|
}
|
||||||
|
let button = document.createElement("button");
|
||||||
|
button.classList.add("button-door");
|
||||||
|
button.type = "button";
|
||||||
|
button.onclick = () => {
|
||||||
|
activatedButtons[`${y},${x}`] = !activatedButtons[`${y},${x}`];
|
||||||
|
if (activatedButtons[`${y},${x}`]) {
|
||||||
|
openAdjacentDoors(x, y);
|
||||||
|
}
|
||||||
|
traceLaser();
|
||||||
|
};
|
||||||
|
cell.appendChild(button);
|
||||||
break;
|
break;
|
||||||
case legend.wall:
|
case legend.wall:
|
||||||
cell.classList.add("wall");
|
cell.classList.add("wall");
|
||||||
break;
|
break;
|
||||||
case legend.demiWall:
|
|
||||||
cell.classList.add("demi-wall");
|
|
||||||
break;
|
|
||||||
case legend.target:
|
case legend.target:
|
||||||
cell.classList.add("target");
|
cell.classList.add("target");
|
||||||
break;
|
break;
|
||||||
@@ -169,6 +226,9 @@ function loadGrid() {
|
|||||||
case legend.demiWallCornerDownRight:
|
case legend.demiWallCornerDownRight:
|
||||||
cell.classList.add("demi-wall-corner-down-right");
|
cell.classList.add("demi-wall-corner-down-right");
|
||||||
break;
|
break;
|
||||||
|
case legend.doorOpen:
|
||||||
|
cell.classList.add("door-open");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
lign.appendChild(cell);
|
lign.appendChild(cell);
|
||||||
@@ -212,6 +272,7 @@ let isLevelFinished = false;
|
|||||||
function traceLaser() {
|
function traceLaser() {
|
||||||
// Reset light laser from previous trace
|
// Reset light laser from previous trace
|
||||||
laserSegments = {};
|
laserSegments = {};
|
||||||
|
// Ne pas réinitialiser activatedButtons et openedDoors pour préserver l'état des boutons manuels
|
||||||
for (let y = 0; y < levels[currentLevelIndex].length; y++) {
|
for (let y = 0; y < levels[currentLevelIndex].length; y++) {
|
||||||
for (let x = 0; x < levels[currentLevelIndex][y].length; x++) {
|
for (let x = 0; x < levels[currentLevelIndex][y].length; x++) {
|
||||||
if (levels[currentLevelIndex][y][x] === legend.ligthLaser) {
|
if (levels[currentLevelIndex][y][x] === legend.ligthLaser) {
|
||||||
@@ -288,15 +349,27 @@ function traceLaser() {
|
|||||||
laserActive = false;
|
laserActive = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case legend.demiWall:
|
case legend.door:
|
||||||
|
if (openedDoors[`${currentY},${currentX}`]) {
|
||||||
|
// La porte est ouverte, le laser la traverse
|
||||||
|
levels[currentLevelIndex][currentY][currentX] = legend.ligthLaser;
|
||||||
|
laserSegments[`${currentY},${currentX}`] = { ...laserDirection };
|
||||||
|
} else {
|
||||||
|
// La porte est fermée, le laser s'arrête
|
||||||
laserActive = false;
|
laserActive = false;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case legend.door:
|
case legend.doorOpen:
|
||||||
laserActive = false;
|
// Porte ouverte - le laser la traverse
|
||||||
|
levels[currentLevelIndex][currentY][currentX] = legend.ligthLaser;
|
||||||
|
laserSegments[`${currentY},${currentX}`] = { ...laserDirection };
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case legend.button:
|
case legend.button:
|
||||||
|
// Activer le bouton et ouvrir les portes adjacentes
|
||||||
|
activatedButtons[`${currentY},${currentX}`] = true;
|
||||||
|
openAdjacentDoors(currentX, currentY);
|
||||||
levels[currentLevelIndex][currentY][currentX] = legend.ligthLaser;
|
levels[currentLevelIndex][currentY][currentX] = legend.ligthLaser;
|
||||||
laserSegments[`${currentY},${currentX}`] = { ...laserDirection };
|
laserSegments[`${currentY},${currentX}`] = { ...laserDirection };
|
||||||
laserActive = false;
|
laserActive = false;
|
||||||
@@ -306,13 +379,13 @@ function traceLaser() {
|
|||||||
laserDirection = reflectLaser(laserDirection, 135);
|
laserDirection = reflectLaser(laserDirection, 135);
|
||||||
break;
|
break;
|
||||||
case legend.demiWallCornerUpRight:
|
case legend.demiWallCornerUpRight:
|
||||||
laserDirection = reflectLaser(laserDirection, 90);
|
laserDirection = reflectLaser(laserDirection, 45);
|
||||||
break;
|
break;
|
||||||
case legend.demiWallCornerDownLeft:
|
case legend.demiWallCornerDownLeft:
|
||||||
laserDirection = reflectLaser(laserDirection, 135);
|
laserDirection = reflectLaser(laserDirection, 45);
|
||||||
break;
|
break;
|
||||||
case legend.demiWallCornerDownRight:
|
case legend.demiWallCornerDownRight:
|
||||||
laserDirection = reflectLaser(laserDirection, 45);
|
laserDirection = reflectLaser(laserDirection, 315);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -331,11 +404,20 @@ function traceLaser() {
|
|||||||
|
|
||||||
traceLaser();
|
traceLaser();
|
||||||
|
|
||||||
|
// Reset level state
|
||||||
|
function resetLevel() {
|
||||||
|
activatedButtons = {};
|
||||||
|
openedDoors = {};
|
||||||
|
laserSegments = {};
|
||||||
|
laserDirection = { dx: 0, dy: 0 };
|
||||||
|
isLevelFinished = false;
|
||||||
|
initializeMirrorOrientations();
|
||||||
|
traceLaser();
|
||||||
|
}
|
||||||
|
|
||||||
// If level finishh -> call this function
|
// If level finishh -> call this function
|
||||||
function finish() {
|
function finish() {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
alert("Réussi !");
|
alert("Réussi !");
|
||||||
}, 100);
|
}, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user