106 lines
2.8 KiB
JavaScript
106 lines
2.8 KiB
JavaScript
import * as Card from GUI.Card;
|
|
import * as State from GUI.Screen.Game.State;
|
|
import * as Async from UnitJS.Async;
|
|
import * as Dom from UnitJS.Dom;
|
|
|
|
var queue = [];
|
|
|
|
return {
|
|
animate: animate,
|
|
catchUp: catchUp,
|
|
delay: delay,
|
|
getQueue: getQueue
|
|
};
|
|
|
|
function animate(movement) {
|
|
return Async.bind(
|
|
Async.apply(function() {
|
|
var card;
|
|
var movingCards = [];
|
|
var side = (State.state.playing) ? 'you' : 'them';
|
|
var dest = State.sets.river;
|
|
if(movement.captures != undefined) {
|
|
card = Card.make(movement.played);
|
|
dest = State.sets[side];
|
|
movingCards.push([State.sets.river, dest, Card.make(movement.captures)]);
|
|
} else {
|
|
card = RiverCard.make(movement.played);
|
|
}
|
|
if(movement.source == 'Hand') {
|
|
movingCards.push([State.sets[side].hand, dest, card]);
|
|
} else {
|
|
var cardSet = {};
|
|
cardSet[card.name] = State.state.turnedCard || TurnedCard.make(card.name);
|
|
State.state.turnedCard = null;
|
|
movingCards.push([{card: cardSet, dom: State.dom.deck}, dest, card]);
|
|
}
|
|
return movingCards;
|
|
}),
|
|
function(movingCards) {
|
|
return Async.parallel.apply(null,
|
|
movingCards.map(function(args) { return moveCard.apply(null, args); })
|
|
);
|
|
}
|
|
);
|
|
}
|
|
|
|
function catchUp() {
|
|
if(queue.length > 0) {
|
|
var length = queue.length;
|
|
Async.run.apply(null, queue.concat(
|
|
Async.apply(function() {
|
|
queue = queue.slice(length);
|
|
catchUp();
|
|
})
|
|
));
|
|
}
|
|
}
|
|
|
|
function delay(animation) {
|
|
queue.push(animation);
|
|
}
|
|
|
|
function getQueue() {
|
|
return queue;
|
|
}
|
|
|
|
function insertCard(toSet, card) {
|
|
if(toSet.dom != undefined) {
|
|
toSet.card[card.name] = card;
|
|
toSet.dom.appendChild(card.dom);
|
|
} else {
|
|
insertCard(toSet[card.value.family.class], card);
|
|
}
|
|
}
|
|
|
|
function moveCard(fromSet, toSet, card) {
|
|
var from, originalCard;
|
|
var slot = Dom.make('li', {class: ['card', 'slot']});
|
|
if (fromSet.card[card.name] != undefined) {
|
|
originalCard = fromSet.card[card.name].dom;
|
|
delete fromSet.card[card.name];
|
|
} else {
|
|
originalCard = fromSet.dom.children[fromSet.dom.children.length - 1];
|
|
}
|
|
from = originalCard.getBoundingClientRect();
|
|
fromSet.dom.replaceChild(slot, originalCard);
|
|
card.dom.style.visibility = 'hidden';
|
|
insertCard(toSet, card);
|
|
var to = card.dom.getBoundingClientRect();
|
|
card.dom.style.left = (from.left - to.left) + 'px';
|
|
card.dom.style.top = (from.top - to.top) + 'px';
|
|
card.dom.classList.add('moving');
|
|
card.dom.style.visibility = null;
|
|
return Async.sequence(
|
|
Async.wait(10),
|
|
Async.apply(function() {
|
|
card.dom.style.left = 0;
|
|
card.dom.style.top = 0;
|
|
}),
|
|
Async.wait(1000),
|
|
Async.apply(function() {
|
|
fromSet.dom.removeChild(slot);
|
|
card.dom.classList.remove('moving');
|
|
})
|
|
);
|
|
}
|