/******************************************************************************* * Copyright (c) 2014, 2015 Scott Clarke (scott@dawg6.com). * * This file is part of Dawg6's Demon Hunter DPS Calculator. * * Dawg6's Demon Hunter DPS Calculator is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Dawg6's Demon Hunter DPS Calculator is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. *******************************************************************************/ package com.dawg6.web.dhcalc.client; import com.dawg6.web.dhcalc.shared.calculator.Util; import com.dawg6.web.dhcalc.shared.calculator.WeaponType; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.user.client.ui.CaptionPanel; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; public class WeaponPanel extends Composite { private final CaptionPanel captionPanel; private final ListBox weaponType; private final DoubleSpinner baseMin; private final DoubleSpinner baseMax; private final DoubleSpinner addMin; private final DoubleSpinner addMax; private final NumberSpinner weaponIAS; private final NumberSpinner weaponDamage; private final Label tooltipMin; private final Label tooltipMax; private final Label averageWeaponDamage; private final Label weaponDpsLabel; private final Label weaponApsLabel; private double weaponMin; private double weaponMax; private double weaponAps; private double weaponDps; private boolean disableUpdates = false; private double averageDamage; private final boolean offHand; public WeaponPanel() { this("Weapon", false); } public WeaponPanel(String title, boolean offHand) { this.offHand = offHand; captionPanel = new CaptionPanel(title); initWidget(captionPanel); FlexTable flexTable = new FlexTable(); flexTable.setCellPadding(2); captionPanel.setContentWidget(flexTable); Label label = new Label("Weapon Type:"); label.setWordWrap(false); flexTable.setWidget(0, 0, label); weaponType = new ListBox(); weaponType.setSelectedIndex(0); flexTable.setWidget(0, 1, weaponType); Label label_1 = new Label("Base (Physical) Damage:"); label_1.setWordWrap(false); flexTable.setWidget(1, 0, label_1); baseMin = new DoubleSpinner(); baseMin.box .setTitle("This number is not displayed in-game. It is imported from hero import."); baseMin.setVisibleLength(8); baseMin.setText("0"); flexTable.setWidget(1, 1, baseMin); Label label_2 = new Label(" to "); label_2.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); flexTable.setWidget(1, 2, label_2); baseMax = new DoubleSpinner(); baseMax.box .setTitle("This number is not displayed in-game. It is imported from hero import."); baseMax.setVisibleLength(8); baseMax.setText("0"); flexTable.setWidget(1, 3, baseMax); Label label_3 = new Label("Tooltip Damage:"); label_3.setWordWrap(false); label_3.setStyleName("boldText"); flexTable.setWidget(1, 4, label_3); tooltipMin = new Label(); tooltipMin.setTitle("Shown as \"white\" damage on weapon tooltip."); tooltipMin.setText("0"); tooltipMin.setStyleName("boldText"); flexTable.setWidget(1, 5, tooltipMin); Label label_5 = new Label(" to "); label_5.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); flexTable.setWidget(1, 6, label_5); tooltipMax = new Label(); tooltipMax.setTitle("Shown as \"white\" damage on weapon tooltip."); tooltipMax.setText("0"); tooltipMax.setStyleName("boldText"); flexTable.setWidget(1, 7, tooltipMax); Label label_7 = new Label("Added (Elemental) Damage:"); label_7.setWordWrap(false); flexTable.setWidget(2, 0, label_7); addMin = new DoubleSpinner(); addMin.box.setTitle("Shown as primary stat on weapon."); addMin.setVisibleLength(8); addMin.setText("0"); flexTable.setWidget(2, 1, addMin); Label label_8 = new Label(" to "); label_8.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); flexTable.setWidget(2, 2, label_8); addMax = new DoubleSpinner(); addMax.box.setTitle("Shown as primary stat on weapon."); addMax.setVisibleLength(8); addMax.setText("0"); flexTable.setWidget(2, 3, addMax); Label label_9 = new Label("Average Weapon Damage:"); label_9.setWordWrap(false); label_9.setStyleName("boldText"); flexTable.setWidget(2, 4, label_9); averageWeaponDamage = new Label("0.0"); averageWeaponDamage .setTitle("Average weapon damage used for Skill calculations"); averageWeaponDamage.setStyleName("boldText"); flexTable.setWidget(2, 5, averageWeaponDamage); flexTable.getFlexCellFormatter().setColSpan(2, 5, 3); Label label_11 = new Label("Weapon IAS (%):"); label_11.setWordWrap(false); flexTable.setWidget(3, 0, label_11); weaponIAS = new NumberSpinner(); weaponIAS.box .setTitle("Increased attack speed as a primary attribute on the weapon."); weaponIAS.setVisibleLength(6); flexTable.setWidget(3, 1, weaponIAS); Label label_12 = new Label("Weapon DPS:"); label_12.setWordWrap(false); label_12.setStyleName("boldText"); flexTable.setWidget(3, 4, label_12); weaponDpsLabel = new Label("0.0"); weaponDpsLabel.setTitle("Shown as dps on weapon tooltip."); weaponDpsLabel.setStyleName("boldText"); flexTable.setWidget(3, 5, weaponDpsLabel); flexTable.getFlexCellFormatter().setColSpan(3, 5, 3); Label label_14 = new Label("Weapon Increased Damage (%):"); label_14.setWordWrap(false); flexTable.setWidget(4, 0, label_14); weaponDamage = new NumberSpinner(); weaponDamage.box .setTitle("Increased damage as a primary attribute on the weapon."); weaponDamage.setVisibleLength(6); flexTable.setWidget(4, 1, weaponDamage); Label label_15 = new Label("Weapon APS:"); label_15.setWordWrap(false); label_15.setStyleName("boldText"); flexTable.setWidget(4, 4, label_15); weaponApsLabel = new Label("0.0"); weaponApsLabel.setTitle("As shown on weapon tooltip"); weaponApsLabel.setStyleName("boldText"); flexTable.setWidget(4, 5, weaponApsLabel); flexTable.getFlexCellFormatter().setColSpan(4, 5, 3); this.weaponIAS.setMax(7); this.weaponDamage.setMax(10); weaponType.addItem("None", ""); for (WeaponType wt : WeaponType.values()) { if (!offHand || (wt == WeaponType.HandCrossbow)) weaponType.addItem(wt.getName(), wt.name()); } weaponType.setSelectedIndex(0); ChangeHandler handler = new ChangeHandler() { @Override public void onChange(ChangeEvent event) { if (!disableUpdates) { calculate(); } } }; weaponType.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { disableUpdates = true; WeaponType type = getWeaponTypeEnum(); if (type == null) { baseMin.setValue(0.0); baseMax.setMax(0.0); } else { baseMin.setValue((double) type.getMin()); baseMax.setValue((double) type.getMax()); } disableUpdates = false; calculate(); } }); baseMin.addChangeHandler(handler); baseMax.addChangeHandler(handler); addMin.addChangeHandler(handler); addMax.addChangeHandler(handler); weaponIAS.addChangeHandler(handler); weaponDamage.addChangeHandler(handler); } @Override public void setTitle(String title) { captionPanel.setCaptionText(title); } public ListBox getWeaponType() { return weaponType; } public DoubleSpinner getBaseMin() { return baseMin; } public DoubleSpinner getBaseMax() { return baseMax; } public DoubleSpinner getAddMin() { return addMin; } public DoubleSpinner getAddMax() { return addMax; } public NumberSpinner getWeaponIAS() { return weaponIAS; } public NumberSpinner getWeaponDamage() { return weaponDamage; } public WeaponType getWeaponTypeEnum() { int i = this.weaponType.getSelectedIndex(); String value = this.weaponType.getValue(i); if (value.length() == 0) return null; else return WeaponType.valueOf(value); } public void setWeaponTypeEnum(WeaponType type) { if (type == null) { weaponType.setSelectedIndex(0); } else { for (int i = 0; i < this.weaponType.getItemCount(); i++) { String value = this.weaponType.getValue(i); if (value.equals(type.name())) { weaponType.setSelectedIndex(i); return; } } } } public void calculate() { double wpnDamage = (double) this.weaponDamage.getValue() / 100.0; weaponMin = (baseMin.getValue() + addMin.getValue()) * (1.0 + wpnDamage); weaponMax = (baseMax.getValue() + addMax.getValue()) * (1.0 + wpnDamage); tooltipMin.setText(Util.format(weaponMin)); tooltipMax.setText(Util.format(weaponMax)); WeaponType type = getWeaponTypeEnum(); if (type != null) { weaponAps = type.getAps() * (1.0 + (getValue(this.weaponIAS) / 100.0)); weaponDps = Math.round(((weaponMin + weaponMax) / 2.0) * weaponAps * 10.0) / 10.0; weaponDpsLabel .setText(Util.format((Math.round(weaponDps * 10.0) / 10.0))); weaponApsLabel .setText(Util.format((Math.round(weaponAps * 100.0) / 100.0))); averageDamage = ((weaponMin + weaponMax) / 2.0); averageWeaponDamage.setText(Util.format(Math .round(100.0 * averageDamage) / 100.0)); } else { weaponDpsLabel.setText("0"); weaponApsLabel.setText("0"); averageWeaponDamage.setText("0"); } } protected int getValue(NumberSpinner spinner) { Integer value = spinner.getValue(); if (value == null) { spinner.setValue(0); value = 0; } return value; } public double getWeaponMin() { return weaponMin; } public double getWeaponMax() { return weaponMax; } public double getWeaponAps() { return weaponAps; } public double getWeaponDps() { return weaponDps; } public double getAverageWeaponDamage() { return averageDamage; } public void setWeaponTypeString(String value) { if ((value == null) || (value.trim().length() == 0)) setWeaponTypeEnum(null); else setWeaponTypeEnum(WeaponType.valueOf(value)); } }