diff --git a/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml b/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml new file mode 100644 index 0000000000..78d2eb0267 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml @@ -0,0 +1,56 @@ + +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.mage</groupId> + <artifactId>mage-server-plugins</artifactId> + <version>0.8.6</version> + </parent> + + <artifactId>mage-player-ai-draft-bot</artifactId> + <packaging>jar</packaging> + <name>Mage Player AI.DraftBot</name> + + <dependencies> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>mage</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>mage-player-ai</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> + + <build> + <sourceDirectory>src</sourceDirectory> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>2.0.2</version> + <configuration> + <source>1.6</source> + <target>1.6</target> + </configuration> + </plugin> + <plugin> + <artifactId>maven-resources-plugin</artifactId> + <configuration> + <encoding>UTF-8</encoding> + </configuration> + </plugin> + + </plugins> + + <finalName>mage-player-ai-draft-bot</finalName> + </build> + + <properties/> + +</project> diff --git a/Mage.Server.Plugins/Mage.Player.AI.DraftBot/src/mage/player/ai/ComputerDraftPlayer.java b/Mage.Server.Plugins/Mage.Player.AI.DraftBot/src/mage/player/ai/ComputerDraftPlayer.java new file mode 100644 index 0000000000..31e514b238 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Player.AI.DraftBot/src/mage/player/ai/ComputerDraftPlayer.java @@ -0,0 +1,68 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.player.ai; + +import mage.Constants.RangeOfInfluence; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author nantuko + */ +public class ComputerDraftPlayer extends ComputerPlayer<ComputerDraftPlayer> implements Player { + + public ComputerDraftPlayer(String name, RangeOfInfluence range) { + super(name, range); + } + + public ComputerDraftPlayer(String name, RangeOfInfluence range, int skill) { + super(name, range); + } + + public ComputerDraftPlayer(final ComputerDraftPlayer player) { + super(player); + } + + @Override + public ComputerDraftPlayer copy() { + return new ComputerDraftPlayer(this); + } + + @Override + public boolean autoLoseGame() { + return true; + } + + @Override + public boolean priority(Game game) { + game.concede(playerId); + return true; + } +} diff --git a/Mage.Server.Plugins/pom.xml b/Mage.Server.Plugins/pom.xml index 55cb409cfc..21e48d2e94 100644 --- a/Mage.Server.Plugins/pom.xml +++ b/Mage.Server.Plugins/pom.xml @@ -23,6 +23,7 @@ <module>Mage.Player.AIMinimax</module> <module>Mage.Player.AI.MA</module> <module>Mage.Player.AIMCTS</module> + <module>Mage.Player.AI.DraftBot</module> <module>Mage.Player.Human</module> <module>Mage.Tournament.BoosterDraft</module> <module>Mage.Tournament.Sealed</module> diff --git a/Mage.Server/config/config.xml b/Mage.Server/config/config.xml index cc832e984a..1fa3719965 100644 --- a/Mage.Server/config/config.xml +++ b/Mage.Server/config/config.xml @@ -7,6 +7,7 @@ <playerType name="Computer - minimax" jar="mage-player-aiminimax.jar" className="mage.player.ai.ComputerPlayer3"/> <playerType name="Computer - mad" jar="mage-player-ai-ma.jar" className="mage.player.ai.ComputerPlayer6"/> <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> <gameTypes> <gameType name="Two Player Duel" jar="mage-game-twoplayerduel.jar" className="mage.game.TwoPlayerMatch" typeName="mage.game.TwoPlayerDuelType"/> diff --git a/Mage.Server/plugins/mage-player-ai-draft-bot.jar b/Mage.Server/plugins/mage-player-ai-draft-bot.jar new file mode 100644 index 0000000000..add4c0bafd Binary files /dev/null and b/Mage.Server/plugins/mage-player-ai-draft-bot.jar differ diff --git a/Mage.Server/plugins/mage-player-ai-ma.jar b/Mage.Server/plugins/mage-player-ai-ma.jar index cac60a4d37..7880ac081c 100644 Binary files a/Mage.Server/plugins/mage-player-ai-ma.jar and b/Mage.Server/plugins/mage-player-ai-ma.jar differ diff --git a/Mage.Server/plugins/mage-player-ai.jar b/Mage.Server/plugins/mage-player-ai.jar index 6954c948f0..45a6a30469 100644 Binary files a/Mage.Server/plugins/mage-player-ai.jar and b/Mage.Server/plugins/mage-player-ai.jar differ diff --git a/Mage.Server/plugins/mage-player-aimcts.jar b/Mage.Server/plugins/mage-player-aimcts.jar index c586e569bf..1d820de797 100644 Binary files a/Mage.Server/plugins/mage-player-aimcts.jar and b/Mage.Server/plugins/mage-player-aimcts.jar differ diff --git a/Mage.Server/plugins/mage-player-aiminimax.jar b/Mage.Server/plugins/mage-player-aiminimax.jar index ab1d34404c..eac2decfb2 100644 Binary files a/Mage.Server/plugins/mage-player-aiminimax.jar and b/Mage.Server/plugins/mage-player-aiminimax.jar differ diff --git a/Mage.Server/plugins/mage-player-human.jar b/Mage.Server/plugins/mage-player-human.jar index ae701fbf9c..fa97286714 100644 Binary files a/Mage.Server/plugins/mage-player-human.jar and b/Mage.Server/plugins/mage-player-human.jar differ diff --git a/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java b/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java index 17b92646d2..b38cffdb7f 100644 --- a/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java +++ b/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java @@ -28,9 +28,6 @@ package mage.server.tournament; -import java.util.Map.Entry; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; import mage.MageException; import mage.cards.decks.Deck; import mage.game.GameException; @@ -52,6 +49,10 @@ import mage.view.ChatMessage.MessageColor; import mage.view.TournamentView; import org.apache.log4j.Logger; +import java.util.Map.Entry; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + /** * * @author BetaSteward_at_googlemail.com diff --git a/Mage/src/mage/game/tournament/TournamentImpl.java b/Mage/src/mage/game/tournament/TournamentImpl.java index ad25b506a2..c92b799a26 100644 --- a/Mage/src/mage/game/tournament/TournamentImpl.java +++ b/Mage/src/mage/game/tournament/TournamentImpl.java @@ -28,27 +28,18 @@ package mage.game.tournament; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.UUID; -import java.util.concurrent.CopyOnWriteArrayList; import mage.cards.Card; import mage.cards.ExpansionSet; import mage.cards.decks.Deck; -import mage.game.events.Listener; -import mage.game.events.PlayerQueryEvent; -import mage.game.events.PlayerQueryEventSource; -import mage.game.events.TableEvent; +import mage.game.events.*; import mage.game.events.TableEvent.EventType; -import mage.game.events.TableEventSource; import mage.game.match.Match; import mage.players.Player; import org.apache.log4j.Logger; +import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; + /** * * @author BetaSteward_at_googlemail.com @@ -177,6 +168,7 @@ public abstract class TournamentImpl implements Tournament { protected void updateResults() { for (TournamentPlayer player: players.values()) { player.setResults(""); + player.setPoints(0); } for (Round round: rounds) { for (TournamentPairing pair: round.getPairs()) { @@ -193,6 +185,18 @@ public abstract class TournamentImpl implements Tournament { sb2.append("-").append(match.getPlayer(player1Id).getWins()).append(") "); players.get(player1Id).setResults(sb1.toString()); players.get(player2Id).setResults(sb2.toString()); + if (match.getPlayer(player1Id).getWins() > match.getPlayer(player2Id).getWins()) { + int points = players.get(player1Id).getPoints(); + players.get(player1Id).setPoints(points + 3); + } else if (match.getPlayer(player1Id).getWins() < match.getPlayer(player2Id).getWins()) { + int points = players.get(player2Id).getPoints(); + players.get(player2Id).setPoints(points + 3); + } else { + int points = players.get(player1Id).getPoints(); + players.get(player1Id).setPoints(points + 1); + points = players.get(player2Id).getPoints(); + players.get(player2Id).setPoints(points + 1); + } } } diff --git a/Mage/src/mage/game/tournament/TournamentPairing.java b/Mage/src/mage/game/tournament/TournamentPairing.java index b1c76da2d0..c2976dccb9 100644 --- a/Mage/src/mage/game/tournament/TournamentPairing.java +++ b/Mage/src/mage/game/tournament/TournamentPairing.java @@ -28,9 +28,10 @@ package mage.game.tournament; -import java.util.UUID; import mage.game.match.Match; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -75,4 +76,14 @@ public class TournamentPairing { player2.setEliminated(); } } + + public void eliminateComputer() { + if (!player1.getPlayer().isHuman()) { + player1.setEliminated(); + return; + } + if (!player2.getPlayer().isHuman()) { + player2.setEliminated(); + } + } } diff --git a/Mage/src/mage/game/tournament/TournamentSingleElimination.java b/Mage/src/mage/game/tournament/TournamentSingleElimination.java index a2b35c3b7e..ed3437c8ef 100644 --- a/Mage/src/mage/game/tournament/TournamentSingleElimination.java +++ b/Mage/src/mage/game/tournament/TournamentSingleElimination.java @@ -28,6 +28,9 @@ package mage.game.tournament; +import java.util.Map; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -40,6 +43,14 @@ public abstract class TournamentSingleElimination extends TournamentImpl { @Override protected void runTournament() { + + for (Map.Entry<UUID, TournamentPlayer> entry: players.entrySet()) { + if (entry.getValue().getPlayer().autoLoseGame()) { + entry.getValue().setEliminated(); + entry.getValue().setResults("Auto Eliminated"); + } + } + while (this.getActivePlayers().size() > 1) { Round round = createRoundRandom(); playRound(round); diff --git a/Mage/src/mage/players/Player.java b/Mage/src/mage/players/Player.java index 4151d2f0f0..60a79475de 100644 --- a/Mage/src/mage/players/Player.java +++ b/Mage/src/mage/players/Player.java @@ -110,6 +110,7 @@ public interface Player extends MageItem, Copyable<Player> { public UserData getUserData(); public void setUserData(UserData userData); public boolean canLose(Game game); + public boolean autoLoseGame(); /** * Returns a set of players which turns under you control. diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 5a39ee7a61..89a6995402 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -1440,4 +1440,9 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Ser public void setCanPaySacrificeCost(boolean canPaySacrificeCost) { this.canPaySacrificeCost = canPaySacrificeCost; } + + @Override + public boolean autoLoseGame() { + return false; + } }