/******************************************************************************* * 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.shared.calculator; public class DamageRow { public final DamageMultiplierList multipliers = new DamageMultiplierList(); private final double scalar; public final boolean primary; public final int maxAdditional; public final int numProjectiles; public final DamageSource source; public final String note; public final DamageType type; public final int radius; public final double dotDuration; public final boolean dot; public DamageRow(ActiveSkill skill, Rune rune, double scalar, boolean primary, int maxAdditional, int numProjectiles, DamageType type, DamageMultiplier... multipliers) { this(skill, rune, scalar, primary, maxAdditional, numProjectiles, 0, "", type, multipliers); } public DamageRow(ActiveSkill skill, Rune rune, double scalar, boolean primary, int maxAdditional, int numProjectiles, String note, DamageType type, DamageMultiplier... multipliers) { this(skill, rune, scalar, primary, maxAdditional, numProjectiles, 0, note, type, multipliers); } public DamageRow(ActiveSkill skill, Rune rune, double scalar, double dotDuration, boolean primary, int maxAdditional, int numProjectiles, String note, DamageType type, DamageMultiplier... multipliers) { this(skill, rune, scalar, dotDuration, primary, maxAdditional, numProjectiles, 0, note, type, multipliers); } public DamageRow(ActiveSkill skill, Rune rune, double scalar, boolean primary, int maxAdditional, int numProjectiles, int radius, DamageType type, DamageMultiplier... multipliers) { this(skill, rune, scalar, primary, maxAdditional, numProjectiles, radius, "", type, multipliers); } public DamageRow(ActiveSkill skill, Rune rune, double scalar, boolean primary, int maxAdditional, DamageType type, DamageMultiplier... multipliers) { this(skill, rune, scalar, primary, maxAdditional, 1, 0, "", type, multipliers); } public DamageRow(ActiveSkill skill, Rune rune, double scalar, double duration, boolean primary, int maxAdditional, DamageType type, DamageMultiplier... multipliers) { this(skill, rune, scalar, duration, primary, maxAdditional, 1, 0, "", type, multipliers); } public DamageRow(ActiveSkill skill, Rune rune, double scalar, boolean primary, int maxAdditional, String note, DamageType type, DamageMultiplier... multipliers) { this(skill, rune, scalar, primary, maxAdditional, 1, 0, note, type, multipliers); } public DamageRow(ActiveSkill skill, Rune rune, double scalar, double dotDuration, boolean primary, int maxAdditional, String note, DamageType type, DamageMultiplier... multipliers) { this(skill, rune, scalar, dotDuration, primary, maxAdditional, 1, 0, note, type, multipliers); } public DamageRow(DamageSource source, double scalar, boolean primary, int maxAdditional, String note, DamageType type, DamageMultiplier... multipliers) { this(source, scalar, 0.0, primary, maxAdditional, 1, 0, note, type, multipliers); } public DamageRow(DamageSource source, double scalar, boolean primary, int maxAdditional, int numProjectiles, int radius, String note, DamageType type, DamageMultiplier... multipliers) { this(source, scalar, 0.0, primary, maxAdditional, numProjectiles, radius, note, type, multipliers); } public DamageRow(DamageSource source, double scalar, double dotDuration, boolean primary, int maxAdditional, String note, DamageType type, DamageMultiplier... multipliers) { this(source, scalar, dotDuration, primary, maxAdditional, 1, 0, note, type, multipliers); } public DamageRow(ActiveSkill skill, Rune rune, double scalar, boolean primary, int maxAdditional, int numProjectiles, int radius, String note, DamageType type, DamageMultiplier... multipliers) { this(new DamageSource(skill, rune), scalar, 0.0, primary, maxAdditional, numProjectiles, radius, note, type, multipliers); } public DamageRow(ActiveSkill skill, Rune rune, double scalar, double dotDuration, boolean primary, int maxAdditional, int numProjectiles, int radius, String note, DamageType type, DamageMultiplier... multipliers) { this(new DamageSource(skill, rune), scalar, dotDuration, primary, maxAdditional, numProjectiles, radius, note, type, multipliers); } public DamageRow(DamageSource source, double scalar, double dotDuration, boolean primary, int maxAdditional, int numProjectiles, int radius, String note, DamageType type, DamageMultiplier... multipliers) { this.source = source; this.numProjectiles = numProjectiles; this.radius = radius; this.dotDuration = dotDuration; this.dot = dotDuration > 0.0; // Sentry damage and enforcer won't effect gem procs if (source.skill != null) { if (source.skill == ActiveSkill.BOLT) { // Sentry Skill damage is additive for sentry bolts and rockets this.multipliers.add(DamageMultiplier.Sentry); } else if (source.skill != ActiveSkill.Companion) { // Sentry Skill damage is multiplicative for skills fired by M4 this.multipliers.add(DamageMultiplier.SentryM4); } // Spitfire Turret's rockets don't get Enforce bonus? if ((source.skill != ActiveSkill.SENTRY) || (source.rune != Rune.Spitfire_Turret) || !new DamageMultiplierList(multipliers).contains(DamageMultiplier.Rockets)) { this.multipliers.add(DamageMultiplier.Enforcer); } } this.multipliers.add(DamageMultiplier.CtW); this.multipliers.add(DamageMultiplier.BoT); this.multipliers.add(DamageMultiplier.BotP); this.multipliers.add(DamageMultiplier.BotS); this.multipliers.add(DamageMultiplier.BotS25); this.multipliers.add(DamageMultiplier.OdysseysEnd); this.multipliers.add(DamageMultiplier.Wolf); this.multipliers.add(DamageMultiplier.Bbv); this.multipliers.add(DamageMultiplier.TW); this.multipliers.add(DamageMultiplier.Paranoia); this.multipliers.add(DamageMultiplier.Piranhas); this.multipliers.add(DamageMultiplier.InnerSanctuary); this.multipliers.add(DamageMultiplier.CripplingWave); this.multipliers.add(DamageMultiplier.Conviction); this.multipliers.add(type.getMultiplier()); this.multipliers.add(DamageMultiplier.Dexterity); this.multipliers.add(DamageMultiplier.MfD); this.multipliers.add(DamageMultiplier.Vaxo); this.multipliers.add(DamageMultiplier.Calamity); this.multipliers.add(DamageMultiplier.Toxicity); this.multipliers.add(DamageMultiplier.BW1); this.multipliers.add(DamageMultiplier.BW2); this.multipliers.add(DamageMultiplier.UE4); this.multipliers.add(DamageMultiplier.COE); this.multipliers.add(DamageMultiplier.Occulus); this.multipliers.add(DamageMultiplier.EW); if ((source.skill != null) && (source.skill.getSkillType() == SkillType.Primary)) { this.multipliers.add(DamageMultiplier.Simplicity); this.multipliers.add(DamageMultiplier.HW); this.multipliers.add(DamageMultiplier.DD); } if ((source.skill == ActiveSkill.RoV) || (source.skill == ActiveSkill.CR)) { this.multipliers.add(DamageMultiplier.N4); this.multipliers.add(DamageMultiplier.RoVN6); } else { this.multipliers.add(DamageMultiplier.N6); } if (source.skill == ActiveSkill.CHAK) { this.multipliers.add(DamageMultiplier.ILLWILL); } if (source.skill != ActiveSkill.Companion) { this.multipliers.add(DamageMultiplier.Taeguk); this.multipliers.add(DamageMultiplier.Harrington); this.multipliers.add(DamageMultiplier.Strongarm); this.multipliers.add(DamageMultiplier.ArcheryDamage); this.multipliers.add(DamageMultiplier.Hysteria); this.multipliers.add(DamageMultiplier.HexingPants); if (source.skill != ActiveSkill.ST) { this.multipliers.add(DamageMultiplier.Zeis); this.multipliers.add(DamageMultiplier.SteadyAim); } } else { this.multipliers.add(DamageMultiplier.Enforcer); this.multipliers.add(DamageMultiplier.APS); this.multipliers.add(DamageMultiplier.IAS); this.multipliers.add(DamageMultiplier.Companion); } if (source.skill != null) { if (source.skill.getDamageMultiplier() != null) this.multipliers.add(source.skill.getDamageMultiplier()); } this.multipliers.add(DamageMultiplier.Elite); this.multipliers.addAll(multipliers); this.type = type; this.scalar = scalar; this.primary = primary; this.maxAdditional = maxAdditional; this.note = note; } public double getScalar(CharacterData data) { return this.scalar; } }