package module.character; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; import module.character.api.ICharacter; import module.command.api.IndexStringPair; import module.utility.Parse; import module.utility.Search; public class GroupList implements Serializable{ /** * */ private static final long serialVersionUID = -4201851626773604174L; public List<Group> gList; public GroupList(){ gList = Collections.synchronizedList(new ArrayList<Group>()); } public void createGroup(ICharacter leader){ gList.add(new Group(leader)); } public Group findGroup(String gName){ IndexStringPair pair = Parse.parseName(gName); int count = 0; for (Group g : gList){ if (Search.searchName(g.getEngName(), pair.name)){ if (count == pair.index) return g; else count++; } } return null; } public Group findGroupExceptGroup(String gName, Group except){ IndexStringPair pair = Parse.parseName(gName); if (gName.equals("team")) return except; int count = 0; for (Group g : gList){ if (g == except) continue; if (Search.searchName(g.getEngName(), pair.name)){ if (count == pair.index) return g; else count++; } } return null; } public ICharacter findChar(String groupName, String charName, int index){ for (Group g : gList){ if (Search.searchName(g.getEngName(), groupName)) { return g.findChar(charName, index); } } return null; } public ICharacter findChar(String groupName, int groupIndex, String charName, int charIndex){ int gIndex = 0; for (Group g : gList) { if (Search.searchName(g.getEngName(), groupName)){ if (gIndex == groupIndex) return g.findChar(charName, charIndex); else gIndex++; } } return null; } public ICharacter findChar(String groupName, String charName){ IndexStringPair gPair = Parse.parseName(groupName); if (gPair == null) return null; IndexStringPair cPair = Parse.parseName(charName); if (cPair == null) return null; int gIndex = 0; for (Group g : gList) { if (Search.searchName(g.getEngName(), gPair.name)){ if (gIndex == gPair.index) return g.findChar(cPair.name, cPair.index); else gIndex++; } } return null; } public ICharacter findCharExceptGroup(Group g, String name){ String[] temp = name.split(" "); if (temp.length == 1){ IndexStringPair pair = Parse.parseName(name); int index = 0; for (Group gg : gList){ if (g == gg) continue; if (gg.list.size() != 1 || gg.list.get(0).charList.size() != 1) continue; else if (Search.searchName(gg.getEngName(), pair.name)){ if (index == pair.index) return gg.list.get(0).charList.get(0); else index++; } } } else { return this.findCharExceptGroup(g, temp[0], temp[1]); } return null; } public ICharacter findAliveChar(String charName){ IndexStringPair cPair = Parse.parseName(charName); if (cPair == null) return null; int gIndex = 0; for (Group g : gList) { for (CharList cList : g.list){ for (ICharacter c : cList.charList){ if (!c.isDown() && Search.searchName(c.getEngName(), cPair.name)){ if (gIndex == cPair.index) return c; else gIndex++; } } } } return null; } public ICharacter findFirstAliveChar(){ for (Group g : this.gList){ for (CharList cList : g.list){ for (ICharacter c : cList.charList){ if (!c.isDown()) return c; } } } return null; // should not be possible, it means no char alive but the battle is still not over! } public ICharacter findCharExceptGroup(Group myGroup, String groupName, String charName){ IndexStringPair gPair = Parse.parseName(groupName); if (gPair == null) return null; IndexStringPair cPair = Parse.parseName(charName); if (cPair == null) return null; if (groupName.equals("team")) { return myGroup.findChar(cPair.name, cPair.index); } int gIndex = 0; for (Group g : gList) { if (Search.searchName(g.getEngName(), gPair.name)){ if (g == myGroup) continue; if (gIndex == gPair.index) return g.findAliveChar(cPair.name, cPair.index); else gIndex++; } } return null; } public ICharacter findChar(int groupId, String name, int index){ try { return gList.get(groupId).findChar(name, index); } catch (IndexOutOfBoundsException e){ return null; } } public boolean removeChar(ICharacter target){ for (Group g : gList){ if (g.removeChar(target)) return true; } return false; } public void addGroupChar(String groupName, ICharacter obj){ for (Group g : gList){ if (Search.searchName(g.getEngName(), groupName)) g.addChar(obj); } } public void addGroupChar(int groupId, ICharacter obj){ try { gList.get(groupId).addChar(obj); } catch (IndexOutOfBoundsException e){ System.out.println("Error: No such groupId."); } } public String displayInfo(){ String output = ""; for (Group g : gList){ output += String.format("%s/%s\n", g.getChiName(), g.getEngName()); } return output; } public String displayInfoExceptGroup(Group g){ String output = ""; for (Group gg : gList){ if (gg != g) { if (gg.getInBattle()){ output += String.format("%s/%s ���b������%s\n", gg.getChiName(), gg.getEngName() , gg.getBattleTask().getEnemyGroups(gg).gList.get(0).getChiName()); output += gg.displayInfoInBattle(); } else output += String.format("%s/%s\n", gg.getChiName(), gg.getEngName()); } } return output; } }