mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 18:50:06 -08:00
Mage.Server/config/init.txt for adding cards to any zone in testMode. Fix for icon being null. Temporary fix for expansionSetCode being null for BasicLands.
This commit is contained in:
parent
17f2e7dab5
commit
c82d3c6dd9
8 changed files with 155 additions and 9 deletions
|
|
@ -8,3 +8,9 @@ resource-path=C:\\Program Files (x86)\\Wizards of the Coast\\Magic Online III\\G
|
||||||
#symbols-resource-path=resources/images/symbols/
|
#symbols-resource-path=resources/images/symbols/
|
||||||
#resource-path=resources/images/
|
#resource-path=resources/images/
|
||||||
card-scaling-factor=0.4
|
card-scaling-factor=0.4
|
||||||
|
|
||||||
|
# parameters for debugging and testing faster
|
||||||
|
default-deck-path=C:\\UW Control.dck
|
||||||
|
# 0: Human, 1: Computer - default, 2: Computer - minimax, 3: Computer - minimax hybrid
|
||||||
|
default-other-player-index=1
|
||||||
|
default-computer-name=computer
|
||||||
|
|
@ -39,6 +39,7 @@ import java.io.IOException;
|
||||||
import javax.swing.JFileChooser;
|
import javax.swing.JFileChooser;
|
||||||
import javax.swing.filechooser.FileFilter;
|
import javax.swing.filechooser.FileFilter;
|
||||||
import mage.client.MageFrame;
|
import mage.client.MageFrame;
|
||||||
|
import mage.client.util.Config;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
@ -54,6 +55,8 @@ public class NewPlayerPanel extends javax.swing.JPanel {
|
||||||
fcSelectDeck = new JFileChooser();
|
fcSelectDeck = new JFileChooser();
|
||||||
fcSelectDeck.setAcceptAllFileFilterUsed(false);
|
fcSelectDeck.setAcceptAllFileFilterUsed(false);
|
||||||
fcSelectDeck.addChoosableFileFilter(new DeckFilter());
|
fcSelectDeck.addChoosableFileFilter(new DeckFilter());
|
||||||
|
if (Config.defaultDeckPath != null) this.txtPlayerDeck.setText(Config.defaultDeckPath);
|
||||||
|
if (Config.defaultComputerName != null) this.txtPlayerName.setText(Config.defaultComputerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPlayerName(String playerName) {
|
public void setPlayerName(String playerName) {
|
||||||
|
|
|
||||||
|
|
@ -37,13 +37,14 @@ package mage.client.table;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import javax.swing.DefaultComboBoxModel;
|
import javax.swing.DefaultComboBoxModel;
|
||||||
import javax.swing.JOptionPane;
|
|
||||||
import mage.cards.decks.DeckCardLists;
|
import mage.cards.decks.DeckCardLists;
|
||||||
import mage.client.MageFrame;
|
import mage.client.MageFrame;
|
||||||
import mage.client.remote.Session;
|
import mage.client.remote.Session;
|
||||||
|
import mage.client.util.Config;
|
||||||
import mage.client.util.Event;
|
import mage.client.util.Event;
|
||||||
import mage.client.util.Listener;
|
import mage.client.util.Listener;
|
||||||
import mage.util.Logging;
|
import mage.util.Logging;
|
||||||
|
|
@ -70,6 +71,12 @@ public class TablePlayerPanel extends javax.swing.JPanel {
|
||||||
session = MageFrame.getSession();
|
session = MageFrame.getSession();
|
||||||
cbPlayerType.setModel(new DefaultComboBoxModel(session.getPlayerTypes()));
|
cbPlayerType.setModel(new DefaultComboBoxModel(session.getPlayerTypes()));
|
||||||
this.lblPlayerNum.setText("Player " + playerNum);
|
this.lblPlayerNum.setText("Player " + playerNum);
|
||||||
|
if (Config.defaultOtherPlayerIndex != null) {
|
||||||
|
try {
|
||||||
|
Integer index = Integer.parseInt(Config.defaultOtherPlayerIndex);
|
||||||
|
cbPlayerType.setSelectedIndex(index);
|
||||||
|
} catch (NumberFormatException e) {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean joinTable(UUID roomId, UUID tableId) throws FileNotFoundException, IOException, ClassNotFoundException {
|
public boolean joinTable(UUID roomId, UUID tableId) throws FileNotFoundException, IOException, ClassNotFoundException {
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,9 @@ import java.io.IOException;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import com.sun.xml.internal.ws.api.streaming.XMLStreamReaderFactory.Default;
|
||||||
|
|
||||||
import mage.client.cards.CardDimensions;
|
import mage.client.cards.CardDimensions;
|
||||||
import mage.util.Logging;
|
import mage.util.Logging;
|
||||||
|
|
||||||
|
|
@ -59,6 +62,11 @@ public class Config {
|
||||||
public static final boolean useResource;
|
public static final boolean useResource;
|
||||||
public static final CardDimensions dimensions;
|
public static final CardDimensions dimensions;
|
||||||
|
|
||||||
|
public static final String defaultGameType;
|
||||||
|
public static final String defaultDeckPath;
|
||||||
|
public static final String defaultOtherPlayerIndex;
|
||||||
|
public static final String defaultComputerName;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
Properties p = new Properties();
|
Properties p = new Properties();
|
||||||
try {
|
try {
|
||||||
|
|
@ -72,6 +80,11 @@ public class Config {
|
||||||
cardsResourcePath = p.getProperty("cards-resource-path");
|
cardsResourcePath = p.getProperty("cards-resource-path");
|
||||||
resourcePath = p.getProperty("resource-path");
|
resourcePath = p.getProperty("resource-path");
|
||||||
cardScalingFactor = Double.valueOf(p.getProperty("card-scaling-factor"));
|
cardScalingFactor = Double.valueOf(p.getProperty("card-scaling-factor"));
|
||||||
|
defaultGameType = p.getProperty("default-game-type", "Human");
|
||||||
|
defaultDeckPath = p.getProperty("default-deck-path");
|
||||||
|
defaultOtherPlayerIndex = p.getProperty("default-other-player-index");
|
||||||
|
defaultComputerName = p.getProperty("default-computer-name");
|
||||||
|
|
||||||
dimensions = new CardDimensions(cardScalingFactor);
|
dimensions = new CardDimensions(cardScalingFactor);
|
||||||
File test = new File(cardsResourcePath);
|
File test = new File(cardsResourcePath);
|
||||||
if (test.isDirectory()) {
|
if (test.isDirectory()) {
|
||||||
|
|
|
||||||
|
|
@ -117,6 +117,7 @@ public class ImageHelper {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append(Config.setIconsResourcePath).append("graphic_").append(symbolCode).append("_").append(card.getRarity().getSymbolCode()).append(".png");
|
sb.append(Config.setIconsResourcePath).append("graphic_").append(symbolCode).append("_").append(card.getRarity().getSymbolCode()).append(".png");
|
||||||
BufferedImage icon = loadImage(sb.toString(), ICON_MAX_HEIGHT);
|
BufferedImage icon = loadImage(sb.toString(), ICON_MAX_HEIGHT);
|
||||||
|
if (icon != null)
|
||||||
g.drawImage(icon, ICON_MAX_XOFFSET - icon.getWidth(), ICON_MAX_YOFFSET, null);
|
g.drawImage(icon, ICON_MAX_XOFFSET - icon.getWidth(), ICON_MAX_YOFFSET, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
14
Mage.Server/config/init.txt
Normal file
14
Mage.Server/config/init.txt
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
# You may add any card to any zone here
|
||||||
|
#
|
||||||
|
# Format: <zone>:<nickname>:<card name>:<amount>
|
||||||
|
#
|
||||||
|
# zone ::= hand | battlefield | graveyard
|
||||||
|
# nickname - Player's name you connect to the game with
|
||||||
|
#
|
||||||
|
#
|
||||||
|
hand:player:mage.sets.magic2010.LightningBolt:1
|
||||||
|
hand:player:mage.sets.magic2011.Fireball:2
|
||||||
|
battlefield:player:mage.sets.magic2011.BrindleBoar:2
|
||||||
|
graveyard:player:mage.sets.magic2011.BrindleBoar:1
|
||||||
|
hand:player:mage.sets.magic2011.DoomBlade:1
|
||||||
|
battlefield:player:mage.cards.basiclands.Swamp:2
|
||||||
|
|
@ -28,31 +28,40 @@
|
||||||
|
|
||||||
package mage.server.game;
|
package mage.server.game;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Map.Entry;
|
import java.util.HashSet;
|
||||||
|
import java.util.Scanner;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.Map.Entry;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import mage.Constants;
|
||||||
import mage.Constants.Zone;
|
import mage.Constants.Zone;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.Cards;
|
import mage.cards.Cards;
|
||||||
import mage.cards.decks.Deck;
|
import mage.cards.decks.Deck;
|
||||||
import mage.cards.decks.DeckCardLists;
|
import mage.cards.decks.DeckCardLists;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.TableEvent;
|
|
||||||
import mage.server.ChatManager;
|
|
||||||
import mage.server.util.ThreadExecutor;
|
|
||||||
import mage.game.events.Listener;
|
import mage.game.events.Listener;
|
||||||
import mage.game.events.PlayerQueryEvent;
|
import mage.game.events.PlayerQueryEvent;
|
||||||
|
import mage.game.events.TableEvent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
|
import mage.server.ChatManager;
|
||||||
|
import mage.server.util.ThreadExecutor;
|
||||||
import mage.util.Logging;
|
import mage.util.Logging;
|
||||||
import mage.view.AbilityPickerView;
|
import mage.view.AbilityPickerView;
|
||||||
import mage.view.CardsView;
|
import mage.view.CardsView;
|
||||||
import mage.view.ChatMessage.MessageColor;
|
|
||||||
import mage.view.GameView;
|
import mage.view.GameView;
|
||||||
|
import mage.view.ChatMessage.MessageColor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
@ -205,6 +214,7 @@ public class GameController implements GameCallback {
|
||||||
for (Card card: deck.getCards()) {
|
for (Card card: deck.getCards()) {
|
||||||
card.putOntoBattlefield(game, Zone.OUTSIDE, playerId);
|
card.putOntoBattlefield(game, Zone.OUTSIDE, playerId);
|
||||||
}
|
}
|
||||||
|
addCardsForTesting(game, game.getPlayer(playerId));
|
||||||
updateGame();
|
updateGame();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -368,4 +378,93 @@ public class GameController implements GameCallback {
|
||||||
endGame(result);
|
endGame(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces cards in player's hands by specified in config/init.txt.<br/>
|
||||||
|
* <br/>
|
||||||
|
* <b>Implementation note:</b><br/>
|
||||||
|
* 1. Read init.txt line by line<br/>
|
||||||
|
* 2. Parse line using the following format: line ::= <zone>:<nickname>:<card name>:<amount><br/>
|
||||||
|
* 3. If zone equals to 'hand', add card to player's library<br/>
|
||||||
|
* 3a. Then swap added card with any card in player's hand<br/>
|
||||||
|
* 3b. Parse next line (go to 2.), If EOF go to 4.<br/>
|
||||||
|
* 4. Log message to all players that cards were added (to prevent unfair play).<br/>
|
||||||
|
* 5. Exit<br/>
|
||||||
|
*/
|
||||||
|
private void addCardsForTesting(Game game, Player player) {
|
||||||
|
try {
|
||||||
|
File f = new File(Constants.INIT_FILE_PATH);
|
||||||
|
Pattern pattern = Pattern.compile("([a-zA-Z]*):([\\w]*):([a-zA-Z ,.!\\d]*):([\\d]*)");
|
||||||
|
if (!f.exists()) {
|
||||||
|
//TODO: log warning with Logger
|
||||||
|
System.err.println("WARN! Couldn't find init file: " + Constants.INIT_FILE_PATH);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
System.err.println("Parsing init.txt for player : " + player.getName());
|
||||||
|
|
||||||
|
Scanner scanner = new Scanner(f);
|
||||||
|
while (scanner.hasNextLine()) {
|
||||||
|
String line = scanner.nextLine().trim();
|
||||||
|
if (line.startsWith("#")) continue;
|
||||||
|
Matcher m = pattern.matcher(line);
|
||||||
|
if (m.matches()) {
|
||||||
|
|
||||||
|
String zone = m.group(1);
|
||||||
|
String nickname = m.group(2);
|
||||||
|
|
||||||
|
if (nickname.equals(player.getName())) {
|
||||||
|
Zone gameZone;
|
||||||
|
if ("hand".equalsIgnoreCase(zone)) {
|
||||||
|
gameZone = Zone.HAND;
|
||||||
|
} else if ("battlefield".equalsIgnoreCase(zone)) {
|
||||||
|
gameZone = Zone.BATTLEFIELD;
|
||||||
|
} else if ("graveyard".equalsIgnoreCase(zone)) {
|
||||||
|
gameZone = Zone.GRAVEYARD;
|
||||||
|
} else {
|
||||||
|
continue; // go parse next line
|
||||||
|
}
|
||||||
|
|
||||||
|
String cardName = m.group(3);
|
||||||
|
Integer amount = Integer.parseInt(m.group(4));
|
||||||
|
for (int i = 0; i < amount; i++) {
|
||||||
|
Card card = CardImpl.createCard(cardName);
|
||||||
|
if (card != null) {
|
||||||
|
Set<Card> cards = new HashSet<Card>();
|
||||||
|
cards.add(card);
|
||||||
|
game.loadCards(cards, player.getId());
|
||||||
|
swapWithAnyCard(game, player, card, gameZone);
|
||||||
|
} else {
|
||||||
|
//TODO: log warning with Logger
|
||||||
|
System.err.println("ERROR! Couldn't create a card: " + cardName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//TODO: log warning with Logger
|
||||||
|
System.err.println("WARN! Was skipped: " + line);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//TODO: log warning with Logger
|
||||||
|
System.err.println("WARN! Init string wasn't parsed: " + line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
//TODO: add logger
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swap cards between specified card from library and any hand card.
|
||||||
|
*
|
||||||
|
* @param game
|
||||||
|
* @param card Card to put to player's hand
|
||||||
|
*/
|
||||||
|
private void swapWithAnyCard(Game game, Player player, Card card, Zone zone) {
|
||||||
|
if (zone.equals(Zone.BATTLEFIELD)) {
|
||||||
|
card.putOntoBattlefield(game, Zone.OUTSIDE, player.getId());
|
||||||
|
} else {
|
||||||
|
card.moveToZone(zone, game, false);
|
||||||
|
}
|
||||||
|
System.out.println("Added card to player's " + zone.toString() + ": " + card.getName() +", player = " + player.getName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,11 +28,14 @@
|
||||||
|
|
||||||
package mage;
|
package mage;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public final class Constants {
|
public final class Constants {
|
||||||
|
|
||||||
|
public static final String INIT_FILE_PATH = "config" + File.separator + "init.txt";
|
||||||
|
|
||||||
public enum ColoredManaSymbol {
|
public enum ColoredManaSymbol {
|
||||||
W("W"), U("U"), B("B"), R("R"), G("G");
|
W("W"), U("U"), B("B"), R("R"), G("G");
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue