/******************************************************************************* * Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors * 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://robocode.sourceforge.net/license/epl-v10.html * * Contributors: * Luis Crespo * - Initial API and implementation * Flemming N. Larsen * - Added independent Rank column * - Various optimizations * - Ported to Java 5 * - Updated to use the getPlacementString() methods from the StringUtil, * which replaces the same method from robocode.util.Utils * - Added additional scores, so that the rankings are similar to the battle * results * - Updated to contain both current and total scores in the columns where it * makes sense * Robert D. Maupin * - Replaced old collection types like Vector and Hashtable with * synchronized List and HashMap * Endre Palatinus, Eniko Nagy, Attila Csizofszki and Laszlo Vigh * - Score with % (percentage) in the table view *******************************************************************************/ package net.sf.robocode.battle; import robocode.control.snapshot.IScoreSnapshot; import robocode.control.snapshot.ITurnSnapshot; import javax.swing.table.AbstractTableModel; /** * This table model extracts the robot ranking from the current battle, * in order to be displayed by the RankingDialog. * * @author Luis Crespo (original) * @author Flemming N. Larsen (contributor) * @author Robert D. Maupin (contributor) * @author Endre Palatinus, Eniko Nagy, Attila Csizofszki and Laszlo Vigh (contributors) */ @SuppressWarnings("serial") public class BattleRankingTableModel extends AbstractTableModel { IScoreSnapshot[] scoreSnapshotList; // The sum of the scores gathered by the robots in the actual round private double currentSum; // The sum of the scores gathered by the robots in the previous rounds private double totalSum; /** * Function for counting the sum of the scores gathered by the robots. */ private void countTotalScores() { currentSum = 0; totalSum = 0; for (IScoreSnapshot score : scoreSnapshotList) { currentSum += score.getCurrentScore(); totalSum += score.getTotalScore(); } } public void updateSource(ITurnSnapshot snapshot) { if (snapshot != null) { scoreSnapshotList = snapshot.getSortedTeamScores(); countTotalScores(); } else { scoreSnapshotList = null; } } public int getColumnCount() { return 12; } public int getRowCount() { return scoreSnapshotList == null ? 0 : scoreSnapshotList.length; } @Override public String getColumnName(int col) { switch (col) { case 0: return "Rank"; case 1: return "Robot Name"; case 2: return " Total Score "; case 3: return " Survival "; case 4: return "Surv Bonus"; case 5: return " Bullet Dmg "; case 6: return " Bullet Bonus "; case 7: return "Ram Dmg * 2"; case 8: return "Ram Bonus"; case 9: return " 1sts "; case 10: return " 2nds "; case 11: return " 3rds "; default: return ""; } } public Object getValueAt(int row, int col) { final IScoreSnapshot statistics = scoreSnapshotList[row]; switch (col) { case 0: return getPlacementString(row + 1); case 1: return statistics.getName(); case 2: { final double current = statistics.getCurrentScore(); final double total = statistics.getTotalScore(); return (int) (current + 0.5) + " / " + (int) (total + current + 0.5) + " (" + (int) (current / currentSum * 100) + " / " + (int) ((total + current) / (totalSum + currentSum) * 100) + "%)"; } case 3: { final double current = statistics.getCurrentSurvivalScore(); final double total = statistics.getTotalSurvivalScore(); return (int) (current + 0.5) + " / " + (int) (total + current + 0.5); } case 4: return (int) (statistics.getTotalLastSurvivorBonus() + 0.5); case 5: { final double current = statistics.getCurrentBulletDamageScore(); final double total = statistics.getTotalBulletDamageScore(); return (int) (current + 0.5) + " / " + (int) (total + current + 0.5); } case 6: { final double current = statistics.getCurrentBulletKillBonus(); final double total = statistics.getTotalBulletKillBonus(); return (int) (current + 0.5) + " / " + (int) (total + current + 0.5); } case 7: { final double current = statistics.getCurrentRammingDamageScore(); final double total = statistics.getTotalRammingDamageScore(); return (int) (current + 0.5) + " / " + (int) (total + current + 0.5); } case 8: { final double current = statistics.getCurrentRammingKillBonus(); final double total = statistics.getTotalRammingKillBonus(); return (int) (current + 0.5) + " / " + (int) (total + current + 0.5); } case 9: return "" + statistics.getTotalFirsts(); case 10: return "" + statistics.getTotalSeconds(); case 11: return "" + statistics.getTotalThirds(); default: return ""; } } public static String getPlacementString(int i) { String result = "" + i; if (i > 3 && i < 20) { result += "th"; } else if (i % 10 == 1) { result += "st"; } else if (i % 10 == 2) { result += "nd"; } else if (i % 10 == 3) { result += "rd"; } else { result += "th"; } return result; } }