/** * @author Luke Tyler Downey * Copyright 2011 Glow Interactive * * This software contains original work and/or modifications to * original work, which are redistributed under the following terms. * * * This program 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. * * This program 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/>. */ /** * Copyright 2011 Brian Cairns * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.glowinteractive.reforger; import java.util.EnumMap; import java.util.EnumSet; public final class Model implements AbstractModel { private static final int HIT_CAP = 601; private static final int EXP_CAP = 781; private static final float HIT_COEFFICIENT_TO_CAP = 1.10f; private static final float HIT_COEFFICIENT_CAPPED = 0.60f; private static final float CRI_COEFFICIENT = 0.80f; private static final float HST_COEFFICIENT = 0.70f; private static final float EXP_COEFFICIENT_TO_CAP = 1.05f; private static final float EXP_COEFFICIENT_CAPPED = 0.00f; private static final float MST_COEFFICIENT = 0.90f; // EP values of hit & exp at their respective caps. private static final float EP_HIT_CAP = HIT_CAP * HIT_COEFFICIENT_TO_CAP; private static final float EP_EXP_CAP = EXP_CAP * EXP_COEFFICIENT_TO_CAP; @Override public float calculateEP(int[] stats) { float result = 0.0f; int hit = stats[Stat.HIT.ordinal()]; if (hit > HIT_CAP) { result += (hit - HIT_CAP) * HIT_COEFFICIENT_CAPPED; result += EP_HIT_CAP; } else { result += hit * HIT_COEFFICIENT_TO_CAP; } result += stats[Stat.CRI.ordinal()] * CRI_COEFFICIENT; result += stats[Stat.HST.ordinal()] * HST_COEFFICIENT; int exp = stats[Stat.EXP.ordinal()]; if (exp > EXP_CAP) { result += (exp - EXP_CAP) * EXP_COEFFICIENT_CAPPED; result += EP_EXP_CAP; } else { result += exp * EXP_COEFFICIENT_TO_CAP; } result += stats[Stat.MST.ordinal()] * MST_COEFFICIENT; return result; } @Override public EnumMap<Stat, EnumSet<Stat>> candidateMappings() { EnumMap<Stat, EnumSet<Stat>> result = new EnumMap<Stat, EnumSet<Stat>>(Stat.class); EnumSet<Stat> stats; stats = EnumSet.noneOf(Stat.class); stats.add(Stat.EXP); stats.add(Stat.MST); stats.add(Stat.CRI); result.put(Stat.HIT, stats); stats = EnumSet.noneOf(Stat.class); stats.add(Stat.HIT); stats.add(Stat.EXP); stats.add(Stat.MST); result.put(Stat.CRI, stats); stats = EnumSet.noneOf(Stat.class); stats.add(Stat.HIT); stats.add(Stat.EXP); stats.add(Stat.MST); stats.add(Stat.CRI); result.put(Stat.HST, stats); stats = EnumSet.noneOf(Stat.class); stats.add(Stat.HIT); stats.add(Stat.MST); stats.add(Stat.CRI); result.put(Stat.EXP, stats); stats = EnumSet.noneOf(Stat.class); stats.add(Stat.HIT); stats.add(Stat.EXP); result.put(Stat.MST, stats); return result; } @Override public float calculateEPDeltaMax(Stat from, int amount) { switch (from) { case HIT: return amount * (EXP_COEFFICIENT_TO_CAP - HIT_COEFFICIENT_CAPPED); // NOTE: Verify next-best stat case CRI: return amount * (HIT_COEFFICIENT_TO_CAP - CRI_COEFFICIENT); case HST: return amount * (HIT_COEFFICIENT_TO_CAP - HST_COEFFICIENT); case EXP: return amount * (HIT_COEFFICIENT_TO_CAP - EXP_COEFFICIENT_CAPPED); case MST: return amount * (HIT_COEFFICIENT_TO_CAP - MST_COEFFICIENT); } return 0.0f; } }