package es.csic.iiia.fabregues.dip.comm; import java.util.List; import java.util.Vector; import es.csic.iiia.fabregues.dip.board.Game; import es.csic.iiia.fabregues.dip.board.Power; import es.csic.iiia.fabregues.dip.board.Province; import es.csic.iiia.fabregues.dip.board.Region; import es.csic.iiia.fabregues.dip.orders.BLDOrder; import es.csic.iiia.fabregues.dip.orders.DSBOrder; import es.csic.iiia.fabregues.dip.orders.HLDOrder; import es.csic.iiia.fabregues.dip.orders.MTOOrder; import es.csic.iiia.fabregues.dip.orders.Order; import es.csic.iiia.fabregues.dip.orders.OrderType; import es.csic.iiia.fabregues.dip.orders.REMOrder; import es.csic.iiia.fabregues.dip.orders.RTOOrder; import es.csic.iiia.fabregues.dip.orders.SUPMTOOrder; import es.csic.iiia.fabregues.dip.orders.SUPOrder; import es.csic.iiia.fabregues.dip.orders.WVEOrder; /** * Creates an order from a String[] * * @author Angela Fabregues, IIIA-CSIC, fabregues@iiia.csic.es */ public class StringA2Order { protected Game game; public StringA2Order(Game game){ this.game = game; } public boolean isSUPorder(String[] order) { if(order.length < 6){ return false; } int index = ParseService.findClose(ParseService.substring(order, 6)); if(order.length < 6+index+1){ return false; } try{ OrderType orderType = OrderType.valueOf(order[6+index]); if(OrderType.SUP.equals(orderType)){ return true; } }catch (IllegalArgumentException e) { } return false; } /** * Pot processar ordres en el seg�ents formats: * ( AUS AMY BUD ) HLD ) * SUB ( ( AUS AMY BUD ) HLD ) * ORD ( SPR 1901 ) ( ( AUS AMY BUD ) HLD ) ( SUC ) * * @param orderMsg * @return */ public Order processOrder(String[] orderMsg){ String result = ""; if(orderMsg[0].equals("ORD")){ orderMsg = ParseService.substring(orderMsg, 5); int beginIndex = ParseService.findClose(orderMsg); for(int i=beginIndex+1; i < orderMsg.length-1; i++){ result+=" "+orderMsg[i]; } result = result.substring(1, result.length()); orderMsg = ParseService.substring(orderMsg, 1); }else if(orderMsg[0].equals("SUB")){ orderMsg = ParseService.substring(orderMsg, 2); } Power power; OrderType order; if(!orderMsg[0].equals("(")){ //power WVE order = OrderType.valueOf(orderMsg[1]); power = game.getPower(orderMsg[0]); //waive return handleWVE(power, result); }else{ Region region = ParseService.getRegion(game, orderMsg); int index = ParseService.findClose(orderMsg); order = OrderType.valueOf(orderMsg[index]); index++; Province province; String[] regionMsg; Region regionSupported; Region destRegion; power = ParseService.getPower(game, orderMsg); switch(order){ case HLD: return handleHLD(power, region, result); case MTO: String[] regionStr = ParseService.substring(orderMsg, index); if(regionStr[0].equals("(")){ destRegion = ParseService.getDestinationRegion(game, region.getName().substring(3, 6), regionStr); }else{ //busquem la regi� de la provincia que tingui el tipus mateix de la regi� que es mou destRegion = game.getAdjacentRegionIn(game.getProvince(regionStr[0]), region); } return handleMTO(power, region, destRegion, result); case SUP: regionMsg = ParseService.substring(orderMsg, index); regionSupported = ParseService.getRegion(game, regionMsg); Power supportedPower = ParseService.getPower(game, regionMsg); index += ParseService.findClose(regionMsg); if(orderMsg.length > index && orderMsg[index].equals("MTO")){ // no MTO province = game.getProvince(orderMsg[index+1]); destRegion = game.getAdjacentRegionIn(province, regionSupported); return handleSUP(power, region, supportedPower, regionSupported, destRegion, result); }else{ return handleSUP(power, region, supportedPower, regionSupported, result); } case CVY: regionMsg = ParseService.substring(orderMsg, index); regionSupported = ParseService.getRegion(game, regionMsg); index += ParseService.findClose(regionMsg); //CTO province = game.getProvince(orderMsg[index+1]); // no estem preparats per fer un convoy return handleCVY(region, regionSupported, province, result); case CTO: province = game.getProvince(orderMsg[index+1]); index += 3; //VIA String[] seasString = ParseService.substring(orderMsg, index); int nSeas = ParseService.findClose(seasString)-2; Province[] seas = new Province[nSeas]; index++; for(int i=0; i<nSeas; i++){ seas[i] = game.getProvince(orderMsg[index+i]); } // no estem preparats per fer un convoy return handleCTO(region, province, seas, result); case RTO: String[] regionStrs = ParseService.substring(orderMsg, index); if(regionStrs[0].equals("(")){ destRegion = ParseService.getDestinationRegion(game, region.getName().substring(3, 6), regionStrs); }else{ //busquem la regi� de la provincia que tingui el tipus mateix de la regi� que es mou destRegion = game.getAdjacentRegionIn(game.getProvince(regionStrs[0]), region); } return handleRTO(region, power, destRegion, result); case DSB: //Power powerDisbanding = ParseService.getPower(game, orderMsg); return handleDSB(region, power, result); case BLD: //build return handleBLD(power, region, result); case REM: return handleREM(power, region, result); case WVE: //waive // No hauria d'arribar aqu�, aquest cas es tracte m�s amunt perqu� no t� (region) al davant //log.printError("ups"); break; default: //log.printError("ups"); } } return null; } private static Order handleREM(Power power, Region region, String result) { Order order = new REMOrder(power, region); order.setResult(result); // Preparat per a ser sobreescrit return order; } private static Order handleBLD(Power power, Region region, String result) { // Preparat per a ser sobreescrit Order order = new BLDOrder(power, region); order.setResult(result); return order; } private static Order handleDSB(Region region, Power power, String result) { // Preparat per a ser sobreescrit Order order = new DSBOrder(region, power); order.setResult(result); return order; } private static Order handleRTO(Region region, Power power, Region rtoRegion, String result) { // Preparat per a ser sobreescrit Order order = new RTOOrder(region, power, rtoRegion); order.setResult(result); return order; } private static Order handleCTO(Region region, Province province, Province[] seas, String result) { // Preparat per a ser sobreescrit return null;//new CTOOrder(region); } private static Order handleCVY(Region region, Region regionSupported, Province province, String result) { // Preparat per a ser sobreescrit return null;//new CVYOrder(region); } protected Order handleSUP(Power power, Region region, Power supportedPower, Region regionSupported, Region destination, String result) { Order order = new SUPMTOOrder(power, region, new MTOOrder(supportedPower, regionSupported, destination)); order.setResult(result); // Preparat per a ser sobreescrit return order; } protected Order handleSUP(Power power, Region region, Power supportedPower, Region regionSupported, String result) { Order order = new SUPOrder(power, region, new HLDOrder(supportedPower, regionSupported)); order.setResult(result); // Preparat per a ser sobreescrit return order; } protected Order handleMTO(Power power, Region region, Region mtoRegion, String result) { Order order = new MTOOrder(power, region, mtoRegion); order.setResult(result); // Preparat per a ser sobreescrit return order; } private static Order handleWVE(Power power, String result) { Order order = new WVEOrder(power); order.setResult(result); // Preparat per a ser sobreescrit return order; } private static Order handleHLD(Power power, Region region, String result) { Order order = new HLDOrder(power, region); order.setResult(result); // Preparat per a ser sobreescrit return order; } /** * Checks the correct number of brackets on an Order * Cuts an order into different ones * @param message * @param game * @return List<String[]> with all orders */ public static List<Order> processOrders(String[] message, Game game) { Vector<Order> orders = new Vector<Order>(); Vector<String> order = null; int bracket = 0; OrderParser op = new OrderParser(game); for(String str: message){ if(str.equals("SUB")){ continue; }else if(str.equals("(")){ if(bracket == 0){ order = new Vector<String>(); }else{ order.add(str); } bracket ++; }else if(str.equals(")")){ bracket --; if(bracket == 0){ orders.add(op.processOrder(order.toArray(new String[order.size()]))); }else{ order.add(str); } }else{ order.add(str); } if(bracket<0){ return null; } } return orders; } }