/*******************************************************************************
* Copyright (c) 2001-2011 Mad Cow Entertainment and Corporation
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* �bel Heged�s - initial API and implementation
*******************************************************************************/
package madcow.magic.model.support;
import java.util.StringTokenizer;
import java.util.logging.Logger;
import org.eclipse.emf.common.util.EList;
import madcow.magic.database.card.Card;
import madcow.magic.database.card.Creature;
import madcow.magic.database.card.ManaType;
import madcow.magic.database.card.RarityType;
import madcow.magic.database.core.CardCSVFields;
/**
*
* @author �bel Heged�s
*
*/
public final class MagicDBCardHelper {
/**
*
* @param card
* @param typeString
* @return
*/
public static boolean parseType(Card card, String typeString) {
boolean result = false;
if(typeString.contains("Legendary")){
card.setLegendary(true);
}
if(typeString.contains("Tribal")){
card.setTribal(true);
}
int separatorIndex = typeString.indexOf('-');
if(0 > separatorIndex)
separatorIndex = typeString.indexOf('�');
if(0 < separatorIndex){
String firstPart = typeString.substring(0, separatorIndex).trim();
if(null != firstPart && !"".equals(firstPart)){
card.setTypeString(firstPart);
result = true;
}
String secondPart = typeString.substring(separatorIndex+1).trim();
if(null != secondPart && !"".equals(secondPart)){
card.setSubtype(secondPart);
result = true;
}
} else{
if(0 < typeString.length()){
card.setTypeString(typeString);
result = true;
}
}
return result;
}
public static boolean parseManaCost(Card card, String manaCostString) {
boolean result = false;
int converted = 0;
if(null != manaCostString){
card.setManacostString(manaCostString);
}
while(!"".equals(manaCostString)){
ManaType next = null;
int amount = 1;
if(manaCostString.startsWith(ManaType.WHITE.getLiteral())){
next = ManaType.WHITE;
converted++;
} else if(manaCostString.startsWith(ManaType.BLUE.getLiteral())){
next = ManaType.BLUE;
converted++;
} else if(manaCostString.startsWith(ManaType.BLACK.getLiteral())){
next = ManaType.BLACK;
converted++;
} else if(manaCostString.startsWith(ManaType.RED.getLiteral())){
next = ManaType.RED;
converted++;
} else if(manaCostString.startsWith(ManaType.GREEN.getLiteral())){
next = ManaType.GREEN;
converted++;
} else if(manaCostString.startsWith(ManaType.WHITE_BLUE.getLiteral())){
next = ManaType.WHITE_BLUE;
converted++;
} else if(manaCostString.startsWith(ManaType.BLUE_BLACK.getLiteral())){
next = ManaType.BLUE_BLACK;
converted++;
} else if(manaCostString.startsWith(ManaType.BLACK_RED.getLiteral())){
next = ManaType.BLACK_RED;
converted++;
} else if(manaCostString.startsWith(ManaType.RED_GREEN.getLiteral())){
next = ManaType.RED_GREEN;
converted++;
} else if(manaCostString.startsWith(ManaType.GREEN_WHITE.getLiteral())){
next = ManaType.GREEN_WHITE;
converted++;
} else if(manaCostString.startsWith(ManaType.WHITE_BLACK.getLiteral())){
next = ManaType.WHITE_BLACK;
converted++;
} else if(manaCostString.startsWith(ManaType.BLUE_RED.getLiteral())){
next = ManaType.BLUE_RED;
converted++;
} else if(manaCostString.startsWith(ManaType.BLACK_GREEN.getLiteral())){
next = ManaType.BLACK_GREEN;
converted++;
} else if(manaCostString.startsWith(ManaType.RED_WHITE.getLiteral())){
next = ManaType.RED_WHITE;
converted++;
} else if(manaCostString.startsWith(ManaType.GREEN_BLUE.getLiteral())){
next = ManaType.GREEN_BLUE;
converted++;
} else if(manaCostString.startsWith(ManaType.TWO_WHITE.getLiteral())){
next = ManaType.TWO_WHITE;
converted += 2;
} else if(manaCostString.startsWith(ManaType.TWO_BLUE.getLiteral())){
next = ManaType.TWO_BLUE;
converted += 2;
} else if(manaCostString.startsWith(ManaType.TWO_BLACK.getLiteral())){
next = ManaType.TWO_BLACK;
converted += 2;
} else if(manaCostString.startsWith(ManaType.TWO_RED.getLiteral())){
next = ManaType.TWO_RED;
converted += 2;
} else if(manaCostString.startsWith(ManaType.TWO_GREEN.getLiteral())){
next = ManaType.TWO_GREEN;
converted += 2;
} else if(manaCostString.startsWith(ManaType.MANY.getLiteral())){
next = ManaType.MANY;
} else
try{
if (-1 < Integer.parseInt(manaCostString.substring(0, 1))) {
next = ManaType.COLORLESS;
amount = Integer.parseInt(manaCostString
.substring(0, 1));
if(0 < amount)
converted += amount;
}
} catch (NumberFormatException e) {
next = ManaType.OTHER;
}
if(null != next){
card.getManacost().add(next);
if(1 < amount){
for (int i = 1; i < amount; i++) {
card.getManacost().add(next);
}
}
if(next != ManaType.OTHER){
manaCostString = manaCostString.substring(next.getLiteral().length());
} else {
break;
}
}
}
card.setConvertedManaCost(converted);
if(0 < card.getManacost().size())
result = true;
return result;
}
public static int initializeCardFromCSV(Card card, EList<EList<String>> values, int index) {
index = MagicDatabaseHelper.initializeMagicElementFromCSV(card, values, index);
//setDescription("");
EList<String> line = values.get(index);
try {
card.setNumber(Integer.parseInt(line.get(CardCSVFields.NUMBER_VALUE).trim()));
card.setName(line.get(CardCSVFields.NAME_VALUE).trim());
if(!MagicDBCardHelper.parseType(card, line.get(CardCSVFields.TYPE_VALUE).trim())){
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).warning("Type not formatted correctly");
}
if(!MagicDBCardHelper.parseManaCost(card, line.get(CardCSVFields.MANA_COST_VALUE).trim())){
if(null == card.getManacostString()){
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).warning("Mana cost not formatted correctly");
}
}
card.setRarity(RarityType.get(line.get(CardCSVFields.RARITY_VALUE).trim()));
card.setArtist(line.get(CardCSVFields.ARTIST_VALUE).trim());
if(CardCSVFields.SET_VALUE < line.size()){
card.setDescription(line.get(CardCSVFields.SET_VALUE).trim());
}
} catch (NumberFormatException e) {
// TODO alter logging to internal logger
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).warning("Number not formatted correctly " + e.getMessage());
} catch (Exception e) {
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).warning("Unknown error occurred");
e.printStackTrace();
}
return index + 1;
}
public static int initializeCreatureFromCSV(Creature cr, EList<EList<String>> values, int index) {
int result = initializeCardFromCSV(cr, values, index);
// super.init successful
if(result > index){
String typeStringToProcess = null;
// subtype contains power and toughness
if(null != cr.getSubtype() && !"".equals(cr.getSubtype())){
typeStringToProcess = cr.getSubtype();
} // type contains power and toughness
else if(null != cr.getTypeString() && !"".equals(cr.getTypeString())){
typeStringToProcess = cr.getTypeString();
}
StringTokenizer st = new StringTokenizer(typeStringToProcess, " ");
if(0 < st.countTokens())
while (st.hasMoreTokens()) {
String token = st.nextToken();
int tIndex = 0;
if(0 < (tIndex = token.indexOf('/'))){
String powerS = token.substring(0, tIndex).trim();
String toughS = token.substring(tIndex+1, token.length());
try{
if(!powerS.contains("*")){
cr.setPower(Integer.parseInt(powerS));
} else {
cr.setPower(-1);
}
if(!toughS.contains("*")){
cr.setToughness(Integer.parseInt(toughS));
} else {
cr.setToughness(-1);
}
} catch (NumberFormatException e) {
// TODO alter logging to internal logger
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).warning("Creature P/S not formatted correctly " + e.getMessage());
}
}
}
}
return result;
}
}