Improved layout to separate zones for each player and the table

This commit is contained in:
Sasha 2018-05-21 23:28:33 +02:00
parent 57f93ca116
commit c5b9b0b170
4 changed files with 76 additions and 59 deletions

View File

@ -1,7 +1,7 @@
function Dom() { function Dom() {
return { return {
clear: clear clear: clear
} }
function clear(elem) { function clear(elem) {
while(elem.firstChild) { while(elem.firstChild) {

View File

@ -1,3 +1,24 @@
#game > div {
position: absolute;
left: 0;
right: 0;
}
#them {
top: 0;
bottom: 75%;
}
#table {
top: 25%;
bottom: 25%;
}
#you {
top: 75%;
bottom: 0;
}
#game .card { #game .card {
background: url("/cards.jpg") no-repeat; background: url("/cards.jpg") no-repeat;
background-size: 400% 1200%; background-size: 400% 1200%;
@ -79,7 +100,7 @@
display: none; display: none;
} }
#river li.card.candidate, #hand.yourTurn li.card { #river li.card.candidate, #you .hand.yourTurn li.card {
cursor: pointer; cursor: pointer;
} }
@ -87,24 +108,10 @@
box-shadow: 0 0 0.5em 0.1em #fc0; box-shadow: 0 0 0.5em 0.1em #fc0;
} }
#hand li.card.selected { #you .hand li.card.selected {
margin-top: -1em; margin-top: -1em;
} }
#opponent, #own {
position: absolute;
left: 0;
right: 0;
}
#opponent {
top: 0;
}
#own {
bottom: 0;
}
#game ul { #game ul {
display: inline-block; display: inline-block;
margin-left: 3em; margin-left: 3em;
@ -112,15 +119,15 @@
float: right; float: right;
} }
#opponent .card, #own .card { #them .card, #you .card {
margin-left: -3em; margin-left: -3em;
} }
#game #hand { #game #you .hand {
margin-left: 0; margin-left: 0;
float: left; float: left;
} }
#hand .card { #you .hand .card {
margin-left: 0.5em; margin-left: 0.5em;
} }

View File

@ -1,14 +1,20 @@
function Game(modules) { function Game(modules) {
var turned = document.getElementById('turned'); var turned = document.getElementById("turned");
var status = { var status = {
dom: document.getElementById('status'), dom: document.getElementById("status"),
playing: false, playing: false,
step: null, step: null,
month: null month: null,
}; };
var sets = { var sets = {
river: cardSet('river'), river: {
hand: cardSet('hand'), card: null,
dom: document.getElementById("river")
},
hand: {
card: null,
dom: document.getElementById("you").getElementsByClassName("hand")[0]
}
}; };
var selected = null; var selected = null;
@ -17,18 +23,11 @@ function Game(modules) {
setStatus(o.game); setStatus(o.game);
setCaptures(o.game); setCaptures(o.game);
[ [
{name: 'river', cards: o.game.river}, ['river', o.game.river, RiverCard],
{name: 'hand', cards: o.game.players[modules.session.getKey()].hand} ['hand', o.game.players[modules.session.getKey()].hand, HandCard]
].forEach(setCardSet); ].forEach(function(args) {setCardSet.apply(null, args)});
if(status.step == "Turned") { if(status.step == "Turned") {
modules.dom.clear(turned); setTurned(o.game.step.contents);
var card = new Card(o.game.step.contents);
turned.appendChild(card.dom);
turned.classList.remove("hidden");
if(status.playing) {
selected = card.name;
showCandidates(modules.hanafuda.Card[selected], true);
}
} else { } else {
turned.classList.add("hidden"); turned.classList.add("hidden");
} }
@ -46,13 +45,6 @@ function Game(modules) {
}); });
} }
function cardSet(id) {
return {
card: null,
dom: document.getElementById(id)
};
}
function matchingInRiver(card) { function matchingInRiver(card) {
return modules.fun.mapFilter( return modules.fun.mapFilter(
modules.fun.of(sets.river.card), modules.fun.of(sets.river.card),
@ -80,28 +72,43 @@ function Game(modules) {
function setCaptures(game) { function setCaptures(game) {
for(var key in game.players) { for(var key in game.players) {
var elem = document.getElementById(modules.session.is(key) ? "own" : "opponent"); var elem = document.getElementById(modules.session.is(key) ? "you" : "them");
elem.getElementsByClassName('score')[0].textContent = game.scores[key] + " pts"; elem.getElementsByClassName('score')[0].textContent = game.scores[key] + " pts";
Array.prototype.forEach.call(elem.getElementsByTagName('ul'), modules.dom.clear); var byClass = {}
Object.values(modules.hanafuda.Family).forEach(function(family) {
byClass[family.class] = elem.getElementsByClassName(family.class)[0];
modules.dom.clear(byClass[family.class]);
});
game.players[key].meld.forEach(function(cardName) { game.players[key].meld.forEach(function(cardName) {
var card = new Card(cardName); var card = new Card(cardName);
elem.getElementsByClassName(card.value.family.class)[0].appendChild(card.dom); byClass[card.value.family.class].appendChild(card.dom);
}); });
} }
} }
function setCardSet(conf) { function setCardSet(setName, cardNames, constructor) {
var set = sets[conf.name]; constructor = constructor || Card;
var constructor = conf.name == "river" ? RiverCard : HandCard; var set = sets[setName];
modules.dom.clear(set.dom);
set.card = {}; set.card = {};
conf.cards.forEach(function(cardName) { modules.dom.clear(set.dom);
cardNames.forEach(function(cardName) {
var card = new constructor(cardName); var card = new constructor(cardName);
set.card[cardName] = card; set.card[cardName] = card;
set.dom.appendChild(card.dom); set.dom.appendChild(card.dom);
}); });
} }
function setTurned(cardName) {
var card = new Card(cardName);
modules.dom.clear(turned);
turned.appendChild(card.dom);
turned.classList.remove("hidden");
if(status.playing) {
selected = cardName;
showCandidates(modules.hanafuda.Card[selected], true);
}
}
function showCandidates(card, yes) { function showCandidates(card, yes) {
matchingInRiver(card).forEach(function(riverCard) {riverCard.setCandidate(yes);}); matchingInRiver(card).forEach(function(riverCard) {riverCard.setCandidate(yes);});
} }

View File

@ -36,18 +36,21 @@
</form> </form>
</div> </div>
<div id="game"> <div id="game">
<ul id="status"></ul> <div id="them">
<ul id="river"></ul> <ul class="hand"></ul>
<ul id="turned" class="hidden"></ul>
<div id="opponent">
<ul class="kasu"></ul> <ul class="kasu"></ul>
<ul class="tane"></ul> <ul class="tane"></ul>
<ul class="tan"></ul> <ul class="tan"></ul>
<ul class="hikari"></ul> <ul class="hikari"></ul>
<span class="score"></span> <span class="score"></span>
</div> </div>
<div id="own"> <div id="table">
<ul id="hand"></ul> <ul id="turned" class="hidden"></ul>
<ul id="river"></ul>
<ul id="status"></ul>
</div>
<div id="you">
<ul class="hand"></ul>
<ul class="kasu"></ul> <ul class="kasu"></ul>
<ul class="tane"></ul> <ul class="tane"></ul>
<ul class="tan"></ul> <ul class="tan"></ul>