mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 02:30:08 -08:00
Turn under control reworked:
- game: added support when a human is take control over a computer player (related to #12878); - game: fixed game freezes while controlling player leaves/disconnect on active priority/choose of another player;
This commit is contained in:
parent
49b90820e0
commit
0505f5159e
12 changed files with 534 additions and 32 deletions
|
|
@ -66,7 +66,7 @@
|
|||
/>
|
||||
<playerTypes>
|
||||
<playerType name="Human" jar="mage-player-human.jar" className="mage.player.human.HumanPlayer"/>
|
||||
<playerType name="Computer - mad" jar="mage-player-ai-ma.jar" className="mage.player.ai.ComputerPlayer7"/>
|
||||
<playerType name="Computer - mad" jar="mage-player-ai-ma.jar" className="mage.player.ai.ComputerPlayerControllableProxy"/>
|
||||
<playerType name="Computer - monte carlo" jar="mage-player-aimcts.jar" className="mage.player.ai.ComputerPlayerMCTS"/>
|
||||
<playerType name="Computer - draftbot" jar="mage-player-ai-draft-bot.jar" className="mage.player.ai.ComputerDraftPlayer"/>
|
||||
</playerTypes>
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@
|
|||
/>
|
||||
<playerTypes>
|
||||
<playerType name="Human" jar="mage-player-human-${project.version}.jar" className="mage.player.human.HumanPlayer"/>
|
||||
<playerType name="Computer - mad" jar="mage-player-ai-ma-${project.version}.jar" className="mage.player.ai.ComputerPlayer7"/>
|
||||
<playerType name="Computer - mad" jar="mage-player-ai-ma-${project.version}.jar" className="mage.player.ai.ComputerPlayerControllableProxy"/>
|
||||
<playerType name="Computer - draftbot" jar="mage-player-ai-draftbot-${project.version}.jar" className="mage.player.ai.ComputerDraftPlayer"/>
|
||||
</playerTypes>
|
||||
<gameTypes>
|
||||
|
|
|
|||
|
|
@ -786,23 +786,23 @@ public class GameController implements GameCallback {
|
|||
}
|
||||
|
||||
public void sendPlayerUUID(UUID userId, final UUID data) {
|
||||
sendMessage(userId, playerId -> getGameSession(playerId).sendPlayerUUID(data));
|
||||
sendMessage(userId, playerId -> sendDirectPlayerUUID(playerId, data));
|
||||
}
|
||||
|
||||
public void sendPlayerString(UUID userId, final String data) {
|
||||
sendMessage(userId, playerId -> getGameSession(playerId).sendPlayerString(data));
|
||||
sendMessage(userId, playerId -> sendDirectPlayerString(playerId, data));
|
||||
}
|
||||
|
||||
public void sendPlayerManaType(UUID userId, final UUID manaTypePlayerId, final ManaType data) {
|
||||
sendMessage(userId, playerId -> getGameSession(playerId).sendPlayerManaType(data, manaTypePlayerId));
|
||||
sendMessage(userId, playerId -> sendDirectPlayerManaType(playerId, manaTypePlayerId, data));
|
||||
}
|
||||
|
||||
public void sendPlayerBoolean(UUID userId, final Boolean data) {
|
||||
sendMessage(userId, playerId -> getGameSession(playerId).sendPlayerBoolean(data));
|
||||
sendMessage(userId, playerId -> sendDirectPlayerBoolean(playerId, data));
|
||||
}
|
||||
|
||||
public void sendPlayerInteger(UUID userId, final Integer data) {
|
||||
sendMessage(userId, playerId -> getGameSession(playerId).sendPlayerInteger(data));
|
||||
sendMessage(userId, playerId -> sendDirectPlayerInteger(playerId, data));
|
||||
}
|
||||
|
||||
private void updatePriorityTimers() {
|
||||
|
|
@ -1055,7 +1055,8 @@ public class GameController implements GameCallback {
|
|||
} else {
|
||||
// otherwise execute the action under other player's control
|
||||
for (UUID controlled : player.getPlayersUnderYourControl()) {
|
||||
if (gameSessions.containsKey(controlled) && game.getPriorityPlayerId().equals(controlled)) {
|
||||
Player controlledPlayer = game.getPlayer(controlled);
|
||||
if ((gameSessions.containsKey(controlled) || controlledPlayer.isComputer()) && game.getPriorityPlayerId().equals(controlled)) {
|
||||
stopResponseIdleTimeout();
|
||||
command.execute(controlled);
|
||||
}
|
||||
|
|
@ -1098,7 +1099,6 @@ public class GameController implements GameCallback {
|
|||
|
||||
@FunctionalInterface
|
||||
interface Command {
|
||||
|
||||
void execute(UUID player);
|
||||
}
|
||||
|
||||
|
|
@ -1138,6 +1138,81 @@ public class GameController implements GameCallback {
|
|||
return newGameSessionWatchers;
|
||||
}
|
||||
|
||||
private void sendDirectPlayerUUID(UUID playerId, UUID data) {
|
||||
// real player
|
||||
GameSessionPlayer session = getGameSession(playerId);
|
||||
if (session != null) {
|
||||
session.sendPlayerUUID(data);
|
||||
return;
|
||||
}
|
||||
|
||||
// computer under control
|
||||
Player player = game.getPlayer(playerId);
|
||||
if (player != null && player.isComputer()) {
|
||||
player.setResponseUUID(data);
|
||||
}
|
||||
}
|
||||
|
||||
private void sendDirectPlayerString(UUID playerId, String data) {
|
||||
// real player
|
||||
GameSessionPlayer session = getGameSession(playerId);
|
||||
if (session != null) {
|
||||
session.sendPlayerString(data);
|
||||
return;
|
||||
}
|
||||
|
||||
// computer under control
|
||||
Player player = game.getPlayer(playerId);
|
||||
if (player != null && player.isComputer()) {
|
||||
player.setResponseString(data);
|
||||
}
|
||||
}
|
||||
|
||||
private void sendDirectPlayerManaType(UUID playerId, UUID manaTypePlayerId, ManaType manaType) {
|
||||
// real player
|
||||
GameSessionPlayer session = getGameSession(playerId);
|
||||
if (session != null) {
|
||||
session.sendPlayerManaType(manaTypePlayerId, manaType);
|
||||
return;
|
||||
}
|
||||
|
||||
// computer under control
|
||||
Player player = game.getPlayer(playerId);
|
||||
if (player != null && player.isComputer()) {
|
||||
player.setResponseManaType(manaTypePlayerId, manaType);
|
||||
}
|
||||
}
|
||||
|
||||
private void sendDirectPlayerBoolean(UUID playerId, Boolean data) {
|
||||
// real player
|
||||
GameSessionPlayer session = getGameSession(playerId);
|
||||
if (session != null) {
|
||||
session.sendPlayerBoolean(data);
|
||||
return;
|
||||
}
|
||||
|
||||
// computer under control
|
||||
Player player = game.getPlayer(playerId);
|
||||
if (player != null && player.isComputer()) {
|
||||
player.setResponseBoolean(data);
|
||||
}
|
||||
}
|
||||
|
||||
private void sendDirectPlayerInteger(UUID playerId, Integer data) {
|
||||
// real player
|
||||
GameSessionPlayer session = getGameSession(playerId);
|
||||
if (session != null) {
|
||||
session.sendPlayerInteger(data);
|
||||
return;
|
||||
}
|
||||
|
||||
// computer under control
|
||||
Player player = game.getPlayer(playerId);
|
||||
if (player != null && player.isComputer()) {
|
||||
player.setResponseInteger(data);
|
||||
}
|
||||
}
|
||||
|
||||
private GameSessionPlayer getGameSession(UUID playerId) {
|
||||
// TODO: check parent callers - there are possible problems with sync, can be related to broken "fix" logs too
|
||||
// It modify players data, but:
|
||||
|
|
|
|||
|
|
@ -183,7 +183,7 @@ public class GameSessionPlayer extends GameSessionWatcher {
|
|||
game.getPlayer(playerId).setResponseString(data);
|
||||
}
|
||||
|
||||
public void sendPlayerManaType(ManaType manaType, UUID manaTypePlayerId) {
|
||||
public void sendPlayerManaType(UUID manaTypePlayerId, ManaType manaType) {
|
||||
game.getPlayer(playerId).setResponseManaType(manaTypePlayerId, manaType);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
/>
|
||||
<playerTypes>
|
||||
<playerType name="Human" jar="mage-player-human.jar" className="mage.player.human.HumanPlayer"/>
|
||||
<playerType name="Computer - mad" jar="mage-player-ai-ma.jar" className="mage.player.ai.ComputerPlayer7"/>
|
||||
<playerType name="Computer - mad" jar="mage-player-ai-ma.jar" className="mage.player.ai.ComputerPlayerControllableProxy"/>
|
||||
<playerType name="Computer - monte carlo" jar="mage-player-aimcts.jar" className="mage.player.ai.ComputerPlayerMCTS"/>
|
||||
<playerType name="Computer - draftbot" jar="mage-player-ai-draft-bot.jar" className="mage.player.ai.ComputerDraftPlayer"/>
|
||||
</playerTypes>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue