diff --git a/index.html b/index.html
index e69de29b..fb61dbf7 100644
--- a/index.html
+++ b/index.html
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Yu-Gi-Yo | Game Edition
+
+
+
+
+
+
+
+
+
+
+
+ Win : 0 | Lose : 0
+
+
+
+
Select
+
Your Champion
+
+
+
+
+
+
+
+
diff --git a/src/scripts/engine.js b/src/scripts/engine.js
index e69de29b..7e26ece1 100644
--- a/src/scripts/engine.js
+++ b/src/scripts/engine.js
@@ -0,0 +1,179 @@
+const state = {
+ score: {
+ playerScore: 0,
+ computerScore: 0,
+ scoreBox: document.getElementById("score_points"),
+ },
+ cardSprites: {
+ avatar: document.getElementById("card-image"),
+ name: document.getElementById("card-name"),
+ type: document.getElementById("card-type"),
+ },
+ fieldCards: {
+ player: document.getElementById("player-field-card"),
+ computer: document.getElementById("computer-field-card"),
+ },
+ actions: {
+ button: document.getElementById("next-duel"),
+ },
+};
+
+const playerSides = {
+ player1: "player-cards",
+ player2: "computer-cards",
+};
+
+const pathImages = "./src/assets/icons/";
+
+const cardData = [
+ {
+ id: 0,
+ name: "Blue Eyes White Dragon",
+ type: "Paper",
+ img: `${pathImages}dragon.png`,
+ WinOf: [1],
+ LoseOf: [2],
+ },
+ {
+ id: 1,
+ name: "Dark Magician",
+ type: "Rock",
+ img: `${pathImages}magician.png`,
+ WinOf: [2],
+ LoseOf: [0],
+ },
+ {
+ id: 2,
+ name: "Exodia",
+ type: "Scissors",
+ img: `${pathImages}exodia.png`,
+ WinOf: [0],
+ LoseOf: [1],
+ },
+];
+
+async function getRandomCards() {
+ const randomIndex = Math.floor(Math.random() * cardData.length);
+ return cardData[randomIndex].id;
+}
+
+async function createCardImage(IdCard, fieldSide) {
+ const cardImage = document.createElement("img");
+ cardImage.setAttribute("height", "100px");
+ cardImage.setAttribute("src", "./src/assets/icons/card-back.png");
+ cardImage.setAttribute("data-id", IdCard);
+ cardImage.classList.add("cards");
+
+ if (fieldSide === playerSides.player1) {
+ cardImage.addEventListener("click", () => {
+ setCardsField(cardImage.getAttribute("data-id"));
+ });
+
+ cardImage.addEventListener("mouseover", () => {
+ drawSelectCard(IdCard);
+ });
+ }
+
+ return cardImage;
+}
+
+async function setCardsField(cardId) {
+ await removeAllCardsImages();
+
+ let computerCardId = await getRandomCards();
+
+ state.fieldCards.player.style.display = "block";
+ state.fieldCards.computer.style.display = "block";
+
+ state.cardSprites.avatar.src = "";
+ state.cardSprites.name.innerText = "";
+ state.cardSprites.type.innerText = "";
+
+ state.fieldCards.player.src = cardData[cardId].img;
+ state.fieldCards.computer.src = cardData[computerCardId].img;
+
+ let duelResults = await checkDuelResults(cardId, computerCardId);
+
+ await updateScore();
+ await drawButton(duelResults);
+}
+
+async function updateScore() {
+ state.score.scoreBox.innerText = `Win: ${state.score.playerScore} | Lose: ${state.score.computerScore}`;
+}
+
+async function drawButton(text) {
+ state.actions.button.innerText = text;
+ state.actions.button.style.display = "block";
+}
+
+async function checkDuelResults(playerCardId, computerCardId) {
+ let duelResults = "Draw";
+ let playerCard = cardData[playerCardId];
+
+ if (playerCard.WinOf.includes(computerCardId)) {
+ duelResults = "Win";
+ await playAudio(duelResults);
+ state.score.playerScore++;
+ }
+
+ if (playerCard.LoseOf.includes(computerCardId)) {
+ duelResults = "Lose";
+ await playAudio(duelResults);
+ state.score.computerScore++;
+ }
+
+ return duelResults;
+}
+
+async function removeAllCardsImages() {
+ let cards = document.querySelector("#computer-cards");
+ let imgElements = cards.querySelectorAll("img");
+ imgElements.forEach((img) => img.remove());
+
+ cards = document.querySelector("#player-cards");
+ imgElements = cards.querySelectorAll("img");
+ imgElements.forEach((img) => img.remove());
+}
+
+async function drawSelectCard(index) {
+ state.cardSprites.avatar.src = cardData[index].img;
+ state.cardSprites.name.innerText = cardData[index].name;
+ state.cardSprites.type.innerText = "Attribute : " + cardData[index].type;
+}
+
+async function drawCards(cardNumbers, fieldSide) {
+ for (let i = 0; i < cardNumbers; i++) {
+ const randomIdCard = await getRandomCards();
+ const cardImage = await createCardImage(randomIdCard, fieldSide);
+
+ console.log(fieldSide);
+
+ document.getElementById(fieldSide).appendChild(cardImage);
+ }
+}
+
+async function resetDuel() {
+ (state.cardSprites.avatar.src = ""),
+ (state.actions.button.style.display = "none");
+
+ state.fieldCards.player.style.display = "none";
+ state.fieldCards.computer.style.display = "none";
+
+ init();
+}
+
+async function playAudio(status) {
+ const audio = new Audio(`./src/assets/audios/${status}.wav`);
+ audio.play();
+}
+
+function init() {
+ drawCards(5, playerSides.player1);
+ drawCards(5, playerSides.player2);
+
+ const bgm = document.getElementById("bgm");
+ bgm.play();
+}
+
+init();
diff --git a/src/styles/main.css b/src/styles/main.css
index e69de29b..c1cd9a1e 100644
--- a/src/styles/main.css
+++ b/src/styles/main.css
@@ -0,0 +1,145 @@
+body {
+ cursor: url("../assets/cursor/yugicursor.png"), default;
+}
+
+button,
+a,
+img:hover,
+button:hover,
+a:hover {
+ cursor: url("../assets/cursor/yamiyugicursorGLOW.png"), auto;
+}
+
+.bg-video {
+ position: absolute;
+ z-index: -2;
+ width: 100vw;
+ height: 100vh;
+ overflow: hidden;
+ display: flex;
+ justify-content: center;
+}
+
+.bg-video .video {
+ height: 100vh;
+}
+
+.bg-video::after {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100vh;
+ width: 100vw;
+ background: linear-gradient(
+ 90deg,
+ rgba(0, 0, 0, 1) 0%,
+ rgba(0, 0, 0, 0.8) 50%,
+ rgba(0, 0, 0, 1) 100%
+ );
+}
+
+.container {
+ position: relative;
+ z-index: 3;
+ display: flex;
+ height: 100vh;
+}
+
+.container__left {
+ width: 35%;
+ border: 1px solid red;
+ max-width: 450px;
+ flex-direction: column;
+ align-items: center;
+ justify-content: space-around;
+ display: flex;
+}
+
+.container__right {
+ width: 65%;
+}
+
+.score_box {
+ background-color: #fff;
+ padding: 30px;
+}
+
+.frame {
+ border: 3px solid #000;
+ border-radius: 8px;
+}
+
+.card_details {
+ background-color: #fff;
+ padding: 1.6rem;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: space-between;
+ height: 5rem;
+ width: 85%;
+}
+
+#card-name {
+ font-size: 0.8rem;
+}
+
+#card-type {
+ font-size: 1rem;
+}
+
+.card-box__container {
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ padding: 1px;
+}
+
+.card-versus__container {
+ display: flex;
+ flex-direction: column;
+ padding-top: 0.1rem;
+ height: 300px;
+ justify-items: center;
+ align-content: center;
+}
+
+.versus-top,
+.versus-bottom {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.versus-bottom {
+ margin-top: 1rem;
+}
+
+#next-duel {
+ display: none;
+}
+
+.card-box {
+ height: 9rem;
+ width: 100%;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.card-infield {
+ height: 11.2rem;
+ width: 8rem;
+ border-radius: 8px;
+}
+
+.cards {
+ transition: transform 0.2s;
+}
+
+.cards:hover {
+ transform: scale(1.2);
+}
diff --git a/src/styles/reset.css b/src/styles/reset.css
index 29747c5d..0f9ba689 100644
--- a/src/styles/reset.css
+++ b/src/styles/reset.css
@@ -1,5 +1,4 @@
* {
- box-sizing: border-box;
margin: 0;
padding: 0;
border: 0;