diff --git a/index.html b/index.html
index e69de29b..130ed149 100644
--- a/index.html
+++ b/index.html
@@ -0,0 +1,99 @@
+
+
+
+
+
+ Yu-Gi-Oh Jo-Ken-po Edition
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Win : 0 | Lose : 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/scripts/engine.js b/src/scripts/engine.js
index e69de29b..3285f867 100644
--- a/src/scripts/engine.js
+++ b/src/scripts/engine.js
@@ -0,0 +1,155 @@
+const state = {
+ player: {
+ score: 0,
+ hand: document.getElementById("player_card"),
+ field: document.getElementById("player-field-card"),
+ },
+ computer: {
+ score: 0,
+ hand: document.getElementById("computer_card"),
+ field: document.getElementById("computer-field-card"),
+ },
+ ui: {
+ scoreBox: document.getElementById("score_points"),
+ avatar: document.getElementById("card-image"),
+ name: document.getElementById("card-name"),
+ type: document.getElementById("card-type"),
+ button: document.getElementById("next"),
+ }
+};
+
+const cardData = [
+ { id: 0, name: "Blue-Eyes White Dragon", type: "Paper", img: "./src/assets/icons/dragon.png", WinOf: [1], LoserOf: [2] },
+ { id: 1, name: "Dark Magician", type: "Rock", img: "./src/assets/icons/magician.png", WinOf: [2], LoserOf: [0] },
+ { id: 2, name: "Exodia the Forbidden One", type: "Scissors", img: "./src/assets/icons/exodia.png", WinOf: [0], LoserOf: [1] }
+];
+
+// Sorteia um ID de carta
+function getRandomCardId() {
+ const randomIndex = Math.floor(Math.random() * cardData.length);
+ return cardData[randomIndex].id;
+}
+
+// Cria uma carta na mão
+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-card-id", idCard);
+ cardImage.classList.add("card");
+
+ if (fieldSide === state.player.hand.id) {
+ cardImage.addEventListener("mouseover", () => {
+ drawSelectCard(idCard);
+ });
+ cardImage.addEventListener("click", () => {
+ setCardsField(idCard);
+ });
+ }
+ return cardImage;
+}
+
+// Quando jogador escolhe carta
+function setCardsField(cardId) {
+ removeAllCardImages();
+
+ let computerCardId = getRandomCardId();
+
+ state.player.field.style.display = "block";
+ state.computer.field.style.display = "block";
+
+ state.player.field.src = cardData[cardId].img;
+ state.computer.field.src = cardData[computerCardId].img;
+
+ let duelResults = checkDuelResults(cardId, computerCardId);
+
+ updateScore();
+ drawButton(duelResults);
+}
+
+// Verifica resultado do duelo
+function checkDuelResults(playerCardId, computerCardId) {
+ let duelResults = "Empate";
+ let playerCard = cardData[playerCardId];
+
+ if (playerCard.WinOf.includes(computerCardId)) {
+ duelResults = "Vitória";
+ playerAudio("win");
+ state.player.score++;
+ } else if (playerCard.LoserOf.includes(computerCardId)) {
+ duelResults = "Derrota";
+ playerAudio("lose");
+ state.computer.score++;
+ }
+ return duelResults;
+}
+
+// Atualiza score
+function updateScore() {
+ state.ui.scoreBox.innerText = `Win: ${state.player.score} | Lose: ${state.computer.score}`;
+}
+
+// Mostra botão "Next"
+function drawButton(duelResults) {
+ state.ui.button.innerText = duelResults;
+ state.ui.button.style.display = "block";
+
+ state.ui.button.addEventListener("click", () => {
+ initGame();
+ }, { once: true });
+}
+
+// Remove cartas das mãos
+function removeAllCardImages() {
+ state.computer.hand.innerHTML = "";
+ state.player.hand.innerHTML = "";
+}
+
+// Mostra info da carta ao passar o mouse
+function drawSelectCard(index) {
+ state.ui.avatar.src = cardData[index].img;
+ state.ui.name.innerText = cardData[index].name;
+ state.ui.type.innerText = "Attribute: " + cardData[index].type;
+}
+
+// Desenha as cartas
+function drawCards(cardNumber, fieldSide) {
+ for (let i = 0; i < cardNumber; i++) {
+ const randomIdCard = getRandomCardId();
+ const cardImage = createCardImage(randomIdCard, fieldSide);
+ document.getElementById(fieldSide).appendChild(cardImage);
+ }
+}
+
+// Áudio
+function playerAudio(status) {
+ const audio = new Audio(`./src/assets/audios/${status}.wav`);
+ audio.play();
+
+
+}
+
+ const bgm = document.getElementById("bgm")
+
+ bgm.play()
+
+
+// Reseta interface
+function resetGameUI() {
+ state.ui.avatar.src = "";
+ state.ui.name.innerText = "Select a Card";
+ state.ui.type.innerText = "";
+ state.player.field.style.display = "none";
+ state.computer.field.style.display = "none";
+ state.ui.button.style.display = "none";
+}
+
+// Inicia jogo
+function initGame() {
+ resetGameUI();
+ drawCards(5, state.player.hand.id);
+ drawCards(5, state.computer.hand.id);
+}
+
+
+initGame();
diff --git a/src/styles/main.css b/src/styles/main.css
index e69de29b..2b93258b 100644
--- a/src/styles/main.css
+++ b/src/styles/main.css
@@ -0,0 +1,240 @@
+
+body{
+ cursor: url("../assets/cursor/yugicursor.png"), default;
+ margin: 0;
+ padding: 0;
+}
+
+/* cursor especial para hover */
+button,
+a,
+img:hover,
+button:hover,
+a:hover{
+ cursor: url("../assets/cursor/yamiyugicursorGLOW.png"), auto;
+}
+
+
+
+/* ---------------- BACKGROUND ---------------- */
+.bg-video{
+ position: absolute;
+ z-index: -2;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ display: flex;
+ justify-content: center;
+}
+
+.bg-video video{
+ height: 100%;
+}
+
+.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%
+ );
+}
+
+/* ---------------- LAYOUT ---------------- */
+.container{
+ position: relative;
+ z-index: 3;
+ height: 100vh;
+ display: flex;
+}
+
+.container__left{
+ width: 35%;
+ min-width: 300px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: space-around;
+ padding: 1rem;
+}
+
+.container__right{
+ width: 65%;
+ padding: 1rem;
+}
+
+.score_box{
+ background-color: #fff;
+ padding: 20px;
+ text-align: center;
+}
+
+.frame{
+ border: 3px solid #000;
+ border-radius: 10px;
+}
+
+.card_details{
+ background-color: #fff;
+ padding: 1rem;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ flex-direction: column;
+ height: auto;
+ width: 100%;
+}
+
+#card-name{
+ font-size: 0.8rem;
+ text-align: center;
+}
+
+#card-type{
+ font-size: 1rem;
+ text-align: center;
+}
+
+.cardbox__container{
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ justify-content: center;
+ align-items: center;
+ padding: 2rem;
+}
+
+/* ---------------- DUEL ---------------- */
+.card-versus__container{
+ display: flex;
+ flex-direction: row;
+ height: 300px;
+ justify-content: center;
+ align-items: center;
+ margin: 4rem 0;
+}
+
+.versus-top,
+.versus-bottom{
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.versus-bottom{
+ margin-top: 1rem;
+}
+
+.versus-result{
+ margin-top: 1.5rem;
+ display: flex;
+ justify-content: center;
+}
+
+#next{
+ display: none;
+ padding: 0.8rem 1.5rem;
+ font-size: 1rem;
+ border-radius: 8px;
+}
+
+/* ---------------- CARTAS ---------------- */
+.card-box{
+ height: auto;
+ min-height: 8rem;
+ width: 100%;
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap; /* para caber em telas pequenas */
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+}
+
+.card-infield{
+ height: 11.2rem;
+ width: 8rem;
+ border: 1px solid #fff;
+ border-radius: 8px;
+ overflow: hidden;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.card{
+ transition: transform 0.2s;
+ max-width: 100px;
+}
+
+.card:hover{
+ transform: scale(1.2);
+}
+
+/* ---------------- RESPONSIVIDADE ---------------- */
+@media (max-width: 1024px) {
+ .container {
+ flex-direction: column;
+ height: auto;
+ }
+
+ .container__left,
+ .container__right {
+ width: 100%;
+ min-width: unset;
+ }
+
+ .cardbox__container {
+ padding: 1rem;
+ }
+
+ .card-versus__container {
+ flex-direction: column;
+ height: auto;
+ margin: 2rem 0;
+ }
+
+ .versus-top,
+ .versus-bottom {
+ flex-direction: column;
+ }
+
+ .card-infield {
+ margin-bottom: 1rem;
+ }
+}
+
+@media (max-width: 600px) {
+ #card-name {
+ font-size: 0.7rem;
+ }
+
+ #card-type {
+ font-size: 0.8rem;
+ }
+
+ .score_box {
+ font-size: 0.9rem;
+ padding: 10px;
+ }
+
+ .card {
+ max-width: 80px;
+ }
+
+ .card-infield {
+ height: 9rem;
+ width: 6rem;
+ }
+
+ #next {
+ font-size: 0.9rem;
+ padding: 0.6rem 1rem;
+ }
+}