/*
* Copyright (c) 1998-2017 by Richard A. Wilkes. All rights reserved.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, version 2.0. If a copy of the MPL was not distributed with
* this file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This Source Code Form is "Incompatible With Secondary Licenses", as
* defined by the Mozilla Public License, version 2.0.
*/
package com.trollworks.gcs.weapon;
import com.trollworks.gcs.widgets.outline.ListHeaderCell;
import com.trollworks.gcs.widgets.outline.ListTextCell;
import com.trollworks.toolkit.annotation.Localize;
import com.trollworks.toolkit.ui.widget.outline.Cell;
import com.trollworks.toolkit.ui.widget.outline.Column;
import com.trollworks.toolkit.ui.widget.outline.Outline;
import com.trollworks.toolkit.ui.widget.outline.OutlineModel;
import com.trollworks.toolkit.ui.widget.outline.TextCell;
import com.trollworks.toolkit.utility.Localization;
import com.trollworks.toolkit.utility.text.Numbers;
import javax.swing.SwingConstants;
/** Definitions for weapon columns. */
public enum WeaponColumn {
/** The weapon name/description. */
DESCRIPTION {
@Override
public String toString(Class<? extends WeaponStats> weaponClass) {
if (weaponClass == MeleeWeaponStats.class) {
return MELEE;
}
if (weaponClass == RangedWeaponStats.class) {
return RANGED;
}
return DESCRIPTION_TITLE;
}
@Override
public String getToolTip() {
return DESCRIPTION_TOOLTIP;
}
@Override
public Cell getCell(boolean forEditor) {
return new WeaponDescriptionCell();
}
@Override
public String getDataAsText(WeaponStats weapon) {
StringBuilder builder = new StringBuilder();
String notes = weapon.getNotes();
builder.append(weapon.toString());
if (notes.length() > 0) {
builder.append(" - "); //$NON-NLS-1$
builder.append(notes);
}
return builder.toString();
}
@Override
public boolean isValidFor(Class<? extends WeaponStats> weaponClass, boolean forEditor) {
return !forEditor;
}
},
/** The weapon usage type. */
USAGE {
@Override
public String toString(Class<? extends WeaponStats> weaponClass) {
return USAGE_TITLE;
}
@Override
public String getToolTip() {
return USAGE_TOOLTIP;
}
@Override
public String getDataAsText(WeaponStats weapon) {
return weapon.getUsage();
}
},
/** The weapon skill level. */
LEVEL {
@Override
public String toString(Class<? extends WeaponStats> weaponClass) {
return LEVEL_TITLE;
}
@Override
public String getToolTip() {
return LEVEL_TOOLTIP;
}
@Override
public Cell getCell(boolean forEditor) {
if (forEditor) {
return new TextCell(SwingConstants.RIGHT, false);
}
return new ListTextCell(SwingConstants.RIGHT, false);
}
@Override
public Object getData(WeaponStats weapon) {
return new Integer(weapon.getSkillLevel());
}
@Override
public String getDataAsText(WeaponStats weapon) {
int level = weapon.getSkillLevel();
if (level < 0) {
return "-"; //$NON-NLS-1$
}
return Numbers.format(level);
}
},
/** The weapon accuracy. */
ACCURACY {
@Override
public String toString(Class<? extends WeaponStats> weaponClass) {
return ACCURACY_TITLE;
}
@Override
public String getToolTip() {
return ACCURACY_TOOLTIP;
}
@Override
public String getDataAsText(WeaponStats weapon) {
return ((RangedWeaponStats) weapon).getAccuracy();
}
@Override
public boolean isValidFor(Class<? extends WeaponStats> weaponClass, boolean forEditor) {
return weaponClass == RangedWeaponStats.class;
}
},
/** The weapon parry. */
PARRY {
@Override
public String toString(Class<? extends WeaponStats> weaponClass) {
return PARRY_TITLE;
}
@Override
public String getToolTip() {
return PARRY_TOOLTIP;
}
@Override
public String getDataAsText(WeaponStats weapon) {
return ((MeleeWeaponStats) weapon).getResolvedParry();
}
@Override
public boolean isValidFor(Class<? extends WeaponStats> weaponClass, boolean forEditor) {
return weaponClass == MeleeWeaponStats.class;
}
},
/** The weapon block. */
BLOCK {
@Override
public String toString(Class<? extends WeaponStats> weaponClass) {
return BLOCK_TITLE;
}
@Override
public String getToolTip() {
return BLOCK_TOOLTIP;
}
@Override
public String getDataAsText(WeaponStats weapon) {
return ((MeleeWeaponStats) weapon).getResolvedBlock();
}
@Override
public boolean isValidFor(Class<? extends WeaponStats> weaponClass, boolean forEditor) {
return weaponClass == MeleeWeaponStats.class;
}
},
/** The weapon damage. */
DAMAGE {
@Override
public String toString(Class<? extends WeaponStats> weaponClass) {
return DAMAGE_TITLE;
}
@Override
public String getToolTip() {
return DAMAGE_TOOLTIP;
}
@Override
public String getDataAsText(WeaponStats weapon) {
return weapon.getResolvedDamage();
}
},
/** The weapon reach. */
REACH {
@Override
public String toString(Class<? extends WeaponStats> weaponClass) {
return REACH_TITLE;
}
@Override
public String getToolTip() {
return REACH_TOOLTIP;
}
@Override
public String getDataAsText(WeaponStats weapon) {
return ((MeleeWeaponStats) weapon).getReach();
}
@Override
public boolean isValidFor(Class<? extends WeaponStats> weaponClass, boolean forEditor) {
return weaponClass == MeleeWeaponStats.class;
}
},
/** The weapon range. */
RANGE {
@Override
public String toString(Class<? extends WeaponStats> weaponClass) {
return RANGE_TITLE;
}
@Override
public String getToolTip() {
return RANGE_TOOLTIP;
}
@Override
public String getDataAsText(WeaponStats weapon) {
return ((RangedWeaponStats) weapon).getResolvedRange();
}
@Override
public boolean isValidFor(Class<? extends WeaponStats> weaponClass, boolean forEditor) {
return weaponClass == RangedWeaponStats.class;
}
},
/** The weapon rate of fire. */
RATE_OF_FIRE {
@Override
public String toString(Class<? extends WeaponStats> weaponClass) {
return RATE_OF_FIRE_TITLE;
}
@Override
public String getToolTip() {
return RATE_OF_FIRE_TOOLTIP;
}
@Override
public String getDataAsText(WeaponStats weapon) {
return ((RangedWeaponStats) weapon).getRateOfFire();
}
@Override
public boolean isValidFor(Class<? extends WeaponStats> weaponClass, boolean forEditor) {
return weaponClass == RangedWeaponStats.class;
}
},
/** The weapon shots. */
SHOTS {
@Override
public String toString(Class<? extends WeaponStats> weaponClass) {
return SHOTS_TITLE;
}
@Override
public String getToolTip() {
return SHOTS_TOOLTIP;
}
@Override
public String getDataAsText(WeaponStats weapon) {
return ((RangedWeaponStats) weapon).getShots();
}
@Override
public boolean isValidFor(Class<? extends WeaponStats> weaponClass, boolean forEditor) {
return weaponClass == RangedWeaponStats.class;
}
},
/** The weapon bulk. */
BULK {
@Override
public String toString(Class<? extends WeaponStats> weaponClass) {
return BULK_TITLE;
}
@Override
public String getToolTip() {
return BULK_TOOLTIP;
}
@Override
public String getDataAsText(WeaponStats weapon) {
return ((RangedWeaponStats) weapon).getBulk();
}
@Override
public boolean isValidFor(Class<? extends WeaponStats> weaponClass, boolean forEditor) {
return weaponClass == RangedWeaponStats.class;
}
},
/** The weapon recoil. */
RECOIL {
@Override
public String toString(Class<? extends WeaponStats> weaponClass) {
return RECOIL_TITLE;
}
@Override
public String getToolTip() {
return RECOIL_TOOLTIP;
}
@Override
public String getDataAsText(WeaponStats weapon) {
return ((RangedWeaponStats) weapon).getRecoil();
}
@Override
public boolean isValidFor(Class<? extends WeaponStats> weaponClass, boolean forEditor) {
return weaponClass == RangedWeaponStats.class;
}
},
/** The weapon minimum strength. */
MIN_ST {
@Override
public String toString(Class<? extends WeaponStats> weaponClass) {
return MIN_ST_TITLE;
}
@Override
public String getToolTip() {
return MIN_ST_TOOLTIP;
}
@Override
public String getDataAsText(WeaponStats weapon) {
return weapon.getStrength();
}
};
@Localize("Weapons")
@Localize(locale = "de", value = "Waffen")
@Localize(locale = "ru", value = "Оружие")
@Localize(locale = "es", value = "Armas")
static String DESCRIPTION_TITLE;
@Localize("Melee Weapons")
@Localize(locale = "de", value = "Nahkampfwaffen")
@Localize(locale = "ru", value = "Контактные орудия")
@Localize(locale = "es", value = "Armas de cuerpo a cuerpo")
static String MELEE;
@Localize("Ranged Weapons")
@Localize(locale = "de", value = "Fernkampfwaffen")
@Localize(locale = "ru", value = "Дистанционные орудия")
@Localize(locale = "es", value = "Armas de ataque a distancia")
static String RANGED;
@Localize("The name/description of the weapon")
@Localize(locale = "de", value = "Der Name und die Beschreibung der Waffe.")
@Localize(locale = "ru", value = "Название/описание оружия")
@Localize(locale = "es", value = "Nombre/Descripción del arma")
static String DESCRIPTION_TOOLTIP;
@Localize("Usage")
@Localize(locale = "de", value = "Nutzung")
@Localize(locale = "ru", value = "Применение")
@Localize(locale = "es", value = "Uso")
static String USAGE_TITLE;
@Localize("The usage type of the weapon (swung, thrust, thrown, fired, etc.)")
@Localize(locale = "de", value = "Wie die Waffe benutzt wird (Schwung, Stoß, Wurf, Schuss usw.).")
@Localize(locale = "ru", value = "Тип использования оружия (рубящее, колющее, метательное, огнестрельное, и т.д.)")
@Localize(locale = "es", value = "Tipo de ataque del arma (tajo, penetración, arrojadiza, de fuego, etc.)")
static String USAGE_TOOLTIP;
@Localize("Damage")
@Localize(locale = "de", value = "Schaden")
@Localize(locale = "ru", value = "Повреждения")
@Localize(locale = "es", value = "Daño")
static String DAMAGE_TITLE;
@Localize("The damage the weapon inflicts")
@Localize(locale = "de", value = "Der Schaden, den die Waffe anrichtet.")
@Localize(locale = "ru", value = "Наносимый оружием урон")
@Localize(locale = "es", value = "Daño inflingido por el arma")
static String DAMAGE_TOOLTIP;
@Localize("Reach")
@Localize(locale = "de", value = "Reichw.")
@Localize(locale = "ru", value = "Досягаемость")
@Localize(locale = "es", value = "Alcance")
static String REACH_TITLE;
@Localize("The reach of the weapon")
@Localize(locale = "de", value = "Die Reichweite der Waffe.")
@Localize(locale = "ru", value = "Досягаемость оружия")
@Localize(locale = "es", value = "Alcance del arma")
static String REACH_TOOLTIP;
@Localize("Parry")
@Localize(locale = "de", value = "Parade")
@Localize(locale = "ru", value = "Парирование")
@Localize(locale = "es", value = "Parada")
static String PARRY_TITLE;
@Localize("The Parry value with the weapon")
@Localize(locale = "de", value = "Der Paradewert der Waffe.")
@Localize(locale = "ru", value = "Величина парирования при использовании оружия")
@Localize(locale = "es", value = "Valor de parada con el arma")
static String PARRY_TOOLTIP;
@Localize("Block")
@Localize(locale = "de", value = "Block")
@Localize(locale = "ru", value = "Блок")
@Localize(locale = "es", value = "Bloqueo")
static String BLOCK_TITLE;
@Localize("The Block value with the weapon")
@Localize(locale = "de", value = "Der Abblockwert der Waffe.")
@Localize(locale = "ru", value = "Величина блока при использовании оружия")
@Localize(locale = "es", value = "Valor de bloqueo con el arma")
static String BLOCK_TOOLTIP;
@Localize("Acc")
@Localize(locale = "de", value = "Gen")
@Localize(locale = "ru", value = "Точн.")
@Localize(locale = "es", value = "Pre")
static String ACCURACY_TITLE;
@Localize("The accuracy bonus for the weapon")
@Localize(locale = "de", value = "Der Genauigkeitswert der Waffe.")
@Localize(locale = "ru", value = "Премия точности для оружия")
@Localize(locale = "es", value = "Bonificación por precisión del arma")
static String ACCURACY_TOOLTIP;
@Localize("Range")
@Localize(locale = "de", value = "Reichw.")
@Localize(locale = "ru", value = "Дальность")
@Localize(locale = "es", value = "Alcance")
static String RANGE_TITLE;
@Localize("The range of the weapon")
@Localize(locale = "de", value = "Die Reichweite der Waffe.")
@Localize(locale = "ru", value = "Дальность оружия")
@Localize(locale = "es", value = "Alcance del arma")
static String RANGE_TOOLTIP;
@Localize("RoF")
@Localize(locale = "de", value = "SR")
@Localize(locale = "ru", value = "Сс")
@Localize(locale = "es", value = "CD")
static String RATE_OF_FIRE_TITLE;
@Localize("The rate of fire of the weapon")
@Localize(locale = "de", value = "Die Schussrate der Waffe.")
@Localize(locale = "ru", value = "Скорострельность оружия")
@Localize(locale = "es", value = "Cadencia de disparo del arma")
static String RATE_OF_FIRE_TOOLTIP;
@Localize("Shots")
@Localize(locale = "de", value = "Schuss")
@Localize(locale = "ru", value = "Боезапас")
@Localize(locale = "es", value = "Disparos")
static String SHOTS_TITLE;
@Localize("The number of shots the weapon can fire before reloading/recharging")
@Localize(locale = "de", value = "Die Anzahl der Schüsse, die die Waffe abfeuern kann, bevor sie neu geladen werden muss.")
@Localize(locale = "ru", value = "Количество выстрелов до перезарядки/подзарядки")
@Localize(locale = "es", value = "Cantidad de disparos que puede realizar un arma antes de ser recargada")
static String SHOTS_TOOLTIP;
@Localize("Bulk")
@Localize(locale = "de", value = "Handl.")
@Localize(locale = "ru", value = "Размер")
@Localize(locale = "es", value = "Tamaño")
static String BULK_TITLE;
@Localize("The modifier to skill due to the bulk of the weapon")
@Localize(locale = "de", value = "Abschlag auf die Fertigkeit wegen der Handlichkeit der Waffe.")
@Localize(locale = "ru", value = "Модификатор умения за счет размера оружия")
@Localize(locale = "es", value = "Modificador a la habilidad por el tamaño del arma")
static String BULK_TOOLTIP;
@Localize("Rcl")
@Localize(locale = "de", value = "RS")
@Localize(locale = "ru", value = "Отдч")
@Localize(locale = "es", value = "Ret")
static String RECOIL_TITLE;
@Localize("The recoil modifier for the weapon")
@Localize(locale = "de", value = "Der Rückstoßwert der Waffe.")
@Localize(locale = "ru", value = "Модификатор отдачи оружия")
@Localize(locale = "es", value = "Modificador por el retroceso del arma")
static String RECOIL_TOOLTIP;
@Localize("ST")
@Localize(locale = "de", value = "ST")
@Localize(locale = "ru", value = "СЛ")
@Localize(locale = "es", value = "FU")
static String MIN_ST_TITLE;
@Localize("The minimum strength required to use the weapon properly")
@Localize(locale = "de", value = "Die mindestens benötigte Stärke, um die Waffe richtig führen zu können.")
@Localize(locale = "ru", value = "Минимальная сила для использования оружия")
@Localize(locale = "es", value = "Valor mínimo en Fuerza para usar correctamente el arma")
static String MIN_ST_TOOLTIP;
@Localize("Lvl")
@Localize(locale = "de", value = "FW")
@Localize(locale = "ru", value = "Уров")
@Localize(locale = "es", value = "Niv")
static String LEVEL_TITLE;
@Localize("The skill level with the weapon")
@Localize(locale = "de", value = "Der Fertigkeitswert, mit dem die Waffe beherrscht wird.")
@Localize(locale = "ru", value = "Уровень умения владения оружием")
@Localize(locale = "es", value = "Nivel de habilidad con el arma")
static String LEVEL_TOOLTIP;
static {
Localization.initialize();
}
/**
* @param weapon The {@link WeaponStats} to get the data from.
* @return An object representing the data for this column.
*/
public Object getData(WeaponStats weapon) {
return getDataAsText(weapon);
}
/**
* @param weapon The {@link WeaponStats} to get the data from.
* @return Text representing the data for this column.
*/
public abstract String getDataAsText(WeaponStats weapon);
/** @return The tooltip for the column. */
public abstract String getToolTip();
/**
* @param forEditor Whether this is for an editor or not.
* @return The {@link Cell} used to display the data.
*/
@SuppressWarnings("static-method")
public Cell getCell(boolean forEditor) {
if (forEditor) {
return new TextCell(SwingConstants.LEFT, false);
}
return new ListTextCell(SwingConstants.LEFT, false);
}
/**
* @param weaponClass The weapon class to check.
* @param forEditor Whether this is for an editor or not.
* @return Whether this column is valid for the specified weapon class.
*/
@SuppressWarnings("static-method")
public boolean isValidFor(Class<? extends WeaponStats> weaponClass, boolean forEditor) {
return true;
}
/**
* @param weaponClass The weapon class to use.
* @return The title of the column.
*/
public abstract String toString(Class<? extends WeaponStats> weaponClass);
@Override
public final String toString() {
return toString(WeaponStats.class);
}
/**
* Adds all relevant {@link Column}s to a {@link Outline}.
*
* @param outline The {@link Outline} to use.
* @param weaponClass The weapon class to use.
* @param forEditor Whether this is for an editor or not.
*/
public static void addColumns(Outline outline, Class<? extends WeaponStats> weaponClass, boolean forEditor) {
OutlineModel model = outline.getModel();
for (WeaponColumn one : values()) {
if (one.isValidFor(weaponClass, forEditor)) {
Column column = new Column(one.ordinal(), one.toString(weaponClass), one.getToolTip(), one.getCell(forEditor));
if (!forEditor) {
column.setHeaderCell(new ListHeaderCell(true));
}
model.addColumn(column);
}
}
}
}