add some communication functions
Some checks failed
Extinction Online CI / build (false, 6.0.x, linux-x64) (push) Failing after 3s
Extinction Online CI / build (false, 6.0.x, osx-x64) (push) Failing after 0s
Extinction Online CI / build (false, 6.0.x, win-x64) (push) Failing after 1s
Extinction Online CI / build (true, 6.0.x, linux-x64) (push) Failing after 1s
Extinction Online CI / build (true, 6.0.x, osx-x64) (push) Failing after 1s
Extinction Online CI / build (true, 6.0.x, win-x64) (push) Failing after 1s

This commit is contained in:
noyciy7037 2023-06-10 00:06:54 +09:00
parent 704ad00af8
commit 8136e91a0f
Signed by: noyciy7037
GPG Key ID: 46A54FA18BBA58FF
4 changed files with 39 additions and 6 deletions

View File

@ -1,4 +1,6 @@
"use strict"; "use strict";
const AsyncFunction = async function () {}.constructor;
function discard(target, card) { function discard(target, card) {
console.log("DIS!CAR!D!"); console.log("DIS!CAR!D!");
postMessage({ type: "game", game: { command: "discard", target: target, card: card } }); postMessage({ type: "game", game: { command: "discard", target: target, card: card } });
@ -16,7 +18,7 @@ onmessage = e => {
console.log(e); console.log(e);
switch (e.data.type) { switch (e.data.type) {
case "run": case "run":
let fun = new Function("target", "players", e.data.function); let fun = new AsyncFunction("target", "players", e.data.function);
fun(e.data.target, e.data.players); fun(e.data.target, e.data.players);
break; break;
} }

View File

@ -84,7 +84,8 @@ const cardTypes = {
annihilation: { annihilation: {
id: "annihilation", id: "annihilation",
prefix: "I", prefix: "I",
count: 1 count: 1,
onGet: "players.forEach(player => {if(player.cards.length <= 5)player.cards.forEach(card => {discard(player,card);})});"
}, },
drop: { drop: {
id: "drop", id: "drop",

View File

@ -147,6 +147,9 @@ class EXOUtils {
case "discard": case "discard":
controller.cardCommands.remove(e.data.game.target.clientId, e.data.game.card, null, true); controller.cardCommands.remove(e.data.game.target.clientId, e.data.game.card, null, true);
break; break;
case "selectCard":
controller.cardCommands.selectCard(e.data.game.target.clientId, e.data.game.card, null, true);
break;
} }
break; break;
} }

View File

@ -8,12 +8,14 @@ class HostController {
players = new Map(); players = new Map();
turnOrder; turnOrder;
turn = -1; turn = -1;
latestWaitingId = 0;
waiting = new Map();
constructor() { constructor() {
this.playerController = new PlayerController(); this.playerController = new PlayerController();
} }
gameStart() { async gameStart() {
// ターンを決定 // ターンを決定
this.turnOrder = EXOUtils.shuffleArray([...this.players.keys()]); this.turnOrder = EXOUtils.shuffleArray([...this.players.keys()]);
@ -30,7 +32,8 @@ class HostController {
// 山札をシャッフル // 山札をシャッフル
EXOUtils.shuffleArray(this.deck); EXOUtils.shuffleArray(this.deck);
this.distributionCards(); await this.distributionCards();
this.nextTurn();
} }
async distributionCards() { async distributionCards() {
@ -60,6 +63,20 @@ class HostController {
}*/ }*/
} }
async nextTurn() {
// ターンを進める
++this.turn;
if (this.turnOrder.length >= this.turn) this.turn = 0;
const turnPlayer = players[this.turnOrder[this.turn]];
// カードを一枚引く
await turnPlayer.addCard(this.deck[0]);
this.deck.splice(0, 1);
await new Promise(resolve => setTimeout(resolve, 700));
// 操作待ち
}
onGameMessage(message) { onGameMessage(message) {
if (message.body.side != side.host) if (message.body.side != side.host)
this.playerController.onGameMessage(message); this.playerController.onGameMessage(message);
@ -72,19 +89,29 @@ class HostController {
messageBuilder.send(); messageBuilder.send();
} }
clientOperations = {
selectedCards: () => { }
}
cardCommands = { cardCommands = {
remove: (target, card, index, canRecycle) => { remove: (target, card, index, canRecycle) => {
const player = controller.players.get(target); const player = controller.players.get(target);
index = player.cards.findIndex(it => it.id == card.id); index = player.cards.findIndex(it => it.id == card.id && it.cardType.id == card.cardType.id);
card = player.cards[index]; card = player.cards[index];
if (canRecycle) if (canRecycle)
this.discarded.push(...player.cards.splice(index, 1)); this.discarded.push(...player.cards.splice(index, 1));
else else
this.cardCommands.backIntoDeck(card); this.cardCommands.backIntoDeck(card);
new MessageBuilder().game().addCommand(commands.worker, target, "remove", [target, card, index, canRecycle]).send(); new MessageBuilder().game().addCommand(commands.worker, target, "remove", [target, { cardType: { id: card.cardType.id }, idIndex: card.idIndex }, index, canRecycle]).send();
}, },
backIntoDeck: (card) => { backIntoDeck: (card) => {
this.deck.splice(Math.floor(Math.random() * (this.deck.length + 1)), 0, card); this.deck.splice(Math.floor(Math.random() * (this.deck.length + 1)), 0, card);
}, },
selectCard: (target, count, waitingId) => {
const player = controller.players.get(target);
waitingId = ++this.latestWaitingId;
this.waiting.set(waitingId, this.clientOperations.selectedCards);
new MessageBuilder(target).game().addCommand(commands.worker, target, "selectCard", [target, count, waitingId]).send();
},
}; };
} }