ExtinctionOnline/static/js/host-controller.js

90 lines
3.1 KiB
JavaScript

"use strict";
const firstCardCount = 5;
class HostController {
playerController = null;
deck = new Array();
discarded = new Array();
players = new Map();
turnOrder;
turn = -1;
constructor() {
this.playerController = new PlayerController();
}
gameStart() {
// ターンを決定
this.turnOrder = EXOUtils.shuffleArray([...this.players.keys()]);
// ゲームを開始
let startMessage = new MessageBuilder().game();
startMessage.addCommand(commands.gameStart, null, ...this.turnOrder).send();
// すべてのカードを生成
Object.keys(cardTypes).forEach(key => {
for (let i = 0; i < cardTypes[key].count; ++i)
this.deck.push(new Card(cardTypes[key], i + 1));
});
// 山札をシャッフル
EXOUtils.shuffleArray(this.deck);
this.distributionCards();
}
async distributionCards() {
for (let i = 0; i < firstCardCount; ++i) {
for (const player of this.players) {
await player[1].addCard(this.deck[0]);
this.deck.splice(0, 1);
await new Promise(resolve => setTimeout(resolve, 700));
}
}
/*
// プレイヤーに5枚ずつ配布
for (const player of this.players) {
// 本人通達用
let messageBuilder = new MessageBuilder(player[0]).game();
// 他人通達用
let messageBuilderForRoom = new MessageBuilder().game();
for (let j = 0; j < firstCardCount; ++j) {
player[1].cards.push(this.deck[0]);
messageBuilder.addCommand(commands.addCard, player[0], this.deck[0].cardType.id, this.deck[0].idIndex);
messageBuilderForRoom.addCommand(commands.addCard, player[0], cardTypes.unknown.id, -1)
this.deck.splice(0, 1);
}
messageBuilder.send();
messageBuilderForRoom.send();
}*/
}
onGameMessage(message) {
if (message.body.side != side.host)
this.playerController.onGameMessage(message);
}
joinNewPlayer(obj) {
this.players.set(obj.from, new Player(obj.from));
let messageBuilder = new MessageBuilder().game();
messageBuilder.addCommand(commands.syncRoomData, null, clientId, [...this.players.keys()]);
messageBuilder.send();
}
cardCommands = {
remove: (target, card, index, canRecycle) => {
const player = controller.players.get(target);
index = player.cards.findIndex(it => it.id == card.id);
card = player.cards[index];
if (canRecycle)
this.discarded.push(...player.cards.splice(index, 1));
else
this.cardCommands.backIntoDeck(card);
new MessageBuilder().game().addCommand(commands.worker, target, "remove", [target, card, index, canRecycle]).send();
},
backIntoDeck: (card) => {
this.deck.splice(Math.floor(Math.random() * (this.deck.length + 1)), 0, card);
},
};
}