Skip to content
Open

h9 #9

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions arenas.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>MK - JSMarathon - Arenas</title>
<link rel="stylesheet" href="style.css">
</head>

<body>
<div class="root">
<div class="arenas arena1">
<form class="control">
<div class="inputWrap">
<h2>HIT</h2>
<div class="ul">
<input type="radio" name="hit" value="head" id="headHit" required>
<label for="headHit">
<span>HEAD</span>
</label>
<input type="radio" name="hit" value="body" id="bodyHit" required>
<label for="bodyHit">
<span>BODY</span>
</label>
<input type="radio" name="hit" value="foot" id="footHit" required>
<label for="footHit">
<span>FOOT</span>
</label>
</div>
</div>
<div class="inputWrap">
<h2>defence</h2>
<div class="ul">
<input type="radio" name="defence" value="head" id="headDefence" required>
<label for="headDefence">
<span>HEAD</span>
</label>
<input type="radio" name="defence" value="body" id="bodyDefence" required>
<label for="bodyDefence">
<span>BODY</span>
</label>
<input type="radio" name="defence" value="foot" id="footDefence" required>
<label for="footDefence">
<span>FOOT</span>
</label>
</div>
</div>
<div class="buttonWrap">
<button class="button" type="submit">
Fight
</button>
</div>
</form>
</div>
<div class="chat"></div>
<div class="wall-left"></div>
<div class="wall-right"></div>
</div>
<script src="main.js" type="module"></script>
</body>

</html>
23 changes: 23 additions & 0 deletions classes.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import { createElement } from './utils.js'

export class Player {
constructor(props) {
this.player = props.player;
this.name = props.name;
this.hp = props.hp;
this.img = props.img;
this.rootSelector = props.rootSelector;
this.avatar = props.avatar;
}
changeHP = (amount) => {
if (this.hp - amount <= 0) {
Expand All @@ -14,4 +18,23 @@ export class Player {
}
elHP = () => document.querySelector(`.player${this.player} .life`);
renderHP = () => this.elHP().style.width = this.hp + '%';
createPlayer = () => {
const $player = createElement('div', 'player' + this.player);
const $progressBar = createElement('div', 'progressbar');
const $life = createElement('div', 'life');
const $name = createElement('div', 'name');
const $character = createElement('div', 'character');
const $img = createElement('img');

$life.style.width = this.hp + '%';
$name.innerText = this.name;
$img.src = this.img;

$progressBar.appendChild($life);
$progressBar.appendChild($name);
$character.appendChild($img);
$player.appendChild($progressBar);
$player.appendChild($character);
return document.querySelector(`.${this.rootSelector}`).appendChild($player);
}
}
76 changes: 68 additions & 8 deletions game.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,82 @@
import { createPlayer, createReloadButton, showResult, $arenas, $formFight } from './utils.js';
import { getRandom, createReloadButton, $formFight } from './utils.js';
import { generateLogs, renderLogs } from './logs.js';
import { player1 as player, player2 as enemy} from './player.js';
import { isWinner, enemyAttack, playerAttack } from './combat.js';
import { Player } from './classes.js'

let player;
let enemy;

export default class Game {
start = () => {

$arenas.appendChild(createPlayer(player));
$arenas.appendChild(createPlayer(enemy));
getEnemy = async() => {
const body = fetch('https://reactmarathon-api.herokuapp.com/api/mk/player/choose').then(res => res.json());
return body;
};

getPlayer = async () => {
const body = fetch('https://reactmarathon-api.herokuapp.com/api/mk/players').then(res => res.json());
return body;
};

madeFight = async (hit,defence) => {
const body = fetch('http://reactmarathon-api.herokuapp.com/api/mk/player/fight', {
method: 'POST',
body: JSON.stringify({
hit,
defence
})
}).then(res => res.json());
return body;
};

start = async () => {

const enemies = await this.getEnemy();
const players = await this.getPlayer();

const p1 = JSON.parse(localStorage.getItem('player1'));
const p2 = enemies;
player = new Player({
...p1,
player: 1,
rootSelector: 'arenas'
})
enemy = new Player({
...p2,
player: 2,
rootSelector: 'arenas'
})

const { hp: playerHP } = player;
const { hp: enemyHP } = enemy;

function showResult() {
if (playerHP === 0 && playerHP < enemyHP) {
isWinner(enemy);
} else if (enemyHP === 0 && enemyHP < playerHP) {
isWinner(player);
} else if (playerHP === 0 && enemyHP === 0) {
isWinner();
}
}

player.createPlayer();
enemy.createPlayer();

renderLogs(generateLogs('start', player, enemy));
// const test = await this.madeFight('head','head');

$formFight.addEventListener('submit', function(e) {
$formFight.addEventListener('submit', async (e) => {

e.preventDefault();

const {value: enemyHitValue, hit: enemyHit, defence: enemyDefence} = enemyAttack();
const {value: playerHitValue, hit: playerHit, defence: playerDefence} = playerAttack();

const {hit: playerHitTo, defence: playerDefenceTo} = playerAttack();

let resp = await this.madeFight(playerHitTo, playerDefenceTo);

const {value: enemyHitValue, hit: enemyHit, defence: enemyDefence} = resp.player2;
const {value: playerHitValue, hit: playerHit, defence: playerDefence} = resp.player1;

if (enemyHit !== playerDefence) {
player.changeHP(enemyHitValue);
Expand Down
140 changes: 140 additions & 0 deletions index.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
@font-face {
font-family: 'Mortal Kombat 3';
src: url('./assets/fonts/MortalKombat3-Regular.eot');
src: url('./assets/fonts/MortalKombat3-Regular.eot?#iefix') format('embedded-opentype'),
url('./assets/fonts/MortalKombat3-Regular.woff2') format('woff2'),
url('./assets/fonts/MortalKombat3-Regular.woff') format('woff'),
url('./assets/fonts/MortalKombat3-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
font-display: swap;
}


*, *:before, *:after {
box-sizing: border-box;
}

body {
background-color: #424542;
}

.root {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
padding-top: 30px;
min-height: 100vh;
min-width: 100vh;
background-size: contain;
background-position: center;
position: relative;
}

.title {
position: absolute;
font-family: "Mortal Kombat 3";
font-size: 48px;
color: #FFF;
top: 10px;
left: 50%;
color: #efefef;
text-shadow: 4px 2px 1px #000;
transform: translate(-50%, 0);
white-space: nowrap;
}

.player {
position: absolute;
width: 210px;
height: 367px;
z-index: 3;
bottom: 44px;
left: 50%;
margin-left: -105px;
transform: translate(-205%, 0px);
}

.player img {
max-width: 100%;
max-height: 100%;
height: 100%;
}

.parent {
display: grid;
grid-template-columns: repeat(7, 1fr);
grid-template-rows: repeat(4, 1fr);
grid-column-gap: 0px;
grid-row-gap: 0px;
}

.div1 { grid-area: 1 / 1 / 2 / 2; }
.div2 { grid-area: 1 / 2 / 2 / 3; }
.div3 { grid-area: 1 / 3 / 2 / 4; }
.div4 { grid-area: 1 / 4 / 2 / 5; }
.div5 { grid-area: 1 / 5 / 2 / 6; }
.div6 { grid-area: 1 / 6 / 2 / 7; }
.div7 { grid-area: 1 / 7 / 2 / 8; }
.div8 { grid-area: 2 / 1 / 3 / 2; }
.div9 { grid-area: 2 / 2 / 3 / 3; }
.div10 { grid-area: 2 / 3 / 3 / 4; }
.div11 { grid-area: 2 / 4 / 3 / 5; }
.div12 { grid-area: 2 / 5 / 3 / 6; }
.div13 { grid-area: 2 / 6 / 3 / 7; }
.div14 { grid-area: 2 / 7 / 3 / 8; }
.div15 { grid-area: 3 / 2 / 4 / 3; }
.div16 { grid-area: 3 / 3 / 4 / 4; }
.div17 { grid-area: 3 / 4 / 4 / 5; }
.div18 { grid-area: 3 / 5 / 4 / 6; }
.div19 { grid-area: 3 / 6 / 4 / 7; }
.div20 { grid-area: 4 / 2 / 5 / 3; }
.div21 { grid-area: 4 / 3 / 5 / 4; }
.div22 { grid-area: 4 / 4 / 5 / 5; }
.div23 { grid-area: 4 / 5 / 5 / 6; }
.div24 { grid-area: 4 / 6 / 5 / 7; }

.row {
display: flex;
position: relative;
z-index: 1;
}

.row:hover {
z-index: 2;
}
.character {
width: 137px;
height: 176px;
position: relative;
z-index: 1;
cursor: pointer;
}

.character:hover,
.character.active {
z-index: 2;
}

.character:hover:before,
.character.active:before {
content: "";
display: block;
width: calc(100% + 4px);
height: calc(100% + 4px);
top: -2px;
left: -2px;
position: absolute;
border: 14px solid #21aa21;
}
.character.disabled {
cursor: default;
}
.character.disabled:hover:before {
display: none;
}

.character img {
width: 100%;
}
Loading