Skip to content

Commit

Permalink
refactor: make double modifiers enum (#1437)
Browse files Browse the repository at this point in the history
* refactor: make double modifiers enum

* refactor: extract and reuse DoubleModifierCollection

* fix: mistaken function replacement in refactoring

* chore: spotless

* feat: don't add fudges unless necessary

* refactor: use enumset over values()
  • Loading branch information
midgleyc committed Jan 18, 2023
1 parent da1510b commit 5686e1c
Show file tree
Hide file tree
Showing 34 changed files with 1,719 additions and 1,692 deletions.
27 changes: 14 additions & 13 deletions src/net/sourceforge/kolmafia/AreaCombatData.java
Expand Up @@ -8,6 +8,7 @@
import java.util.stream.Stream;
import net.sourceforge.kolmafia.KoLCharacter.Gender;
import net.sourceforge.kolmafia.KoLConstants.Stat;
import net.sourceforge.kolmafia.modifiers.DoubleModifier;
import net.sourceforge.kolmafia.objectpool.EffectPool;
import net.sourceforge.kolmafia.objectpool.FamiliarPool;
import net.sourceforge.kolmafia.objectpool.ItemPool;
Expand Down Expand Up @@ -982,7 +983,7 @@ private void appendItemList(
double itemModifier = AreaCombatData.getDropRateModifier();
boolean stealing = KoLCharacter.canPickpocket();
double pocketModifier =
(100.0 + KoLCharacter.currentNumericModifier(Modifiers.PICKPOCKET_CHANCE)) / 100.0;
(100.0 + KoLCharacter.currentNumericModifier(DoubleModifier.PICKPOCKET_CHANCE)) / 100.0;

for (int i = 0; i < items.size(); ++i) {
AdventureResult item = items.get(i);
Expand All @@ -1005,25 +1006,25 @@ private void appendItemList(
double itemBonus = 0.0;

if (ItemDatabase.isFood(itemId)) {
itemBonus += KoLCharacter.currentNumericModifier(Modifiers.FOODDROP) / 100.0;
itemBonus += KoLCharacter.currentNumericModifier(DoubleModifier.FOODDROP) / 100.0;
} else if (ItemDatabase.isBooze(itemId)) {
itemBonus += KoLCharacter.currentNumericModifier(Modifiers.BOOZEDROP) / 100.0;
itemBonus += KoLCharacter.currentNumericModifier(DoubleModifier.BOOZEDROP) / 100.0;
} else if (ItemDatabase.isCandyItem(itemId)) {
itemBonus += KoLCharacter.currentNumericModifier(Modifiers.CANDYDROP) / 100.0;
itemBonus += KoLCharacter.currentNumericModifier(DoubleModifier.CANDYDROP) / 100.0;
} else if (ItemDatabase.isEquipment(itemId)) {
itemBonus += KoLCharacter.currentNumericModifier(Modifiers.GEARDROP) / 100.0;
itemBonus += KoLCharacter.currentNumericModifier(DoubleModifier.GEARDROP) / 100.0;
if (ItemDatabase.isHat(itemId)) {
itemBonus += KoLCharacter.currentNumericModifier(Modifiers.HATDROP) / 100.0;
itemBonus += KoLCharacter.currentNumericModifier(DoubleModifier.HATDROP) / 100.0;
} else if (ItemDatabase.isWeapon(itemId)) {
itemBonus += KoLCharacter.currentNumericModifier(Modifiers.WEAPONDROP) / 100.0;
itemBonus += KoLCharacter.currentNumericModifier(DoubleModifier.WEAPONDROP) / 100.0;
} else if (ItemDatabase.isOffHand(itemId)) {
itemBonus += KoLCharacter.currentNumericModifier(Modifiers.OFFHANDDROP) / 100.0;
itemBonus += KoLCharacter.currentNumericModifier(DoubleModifier.OFFHANDDROP) / 100.0;
} else if (ItemDatabase.isShirt(itemId)) {
itemBonus += KoLCharacter.currentNumericModifier(Modifiers.SHIRTDROP) / 100.0;
itemBonus += KoLCharacter.currentNumericModifier(DoubleModifier.SHIRTDROP) / 100.0;
} else if (ItemDatabase.isPants(itemId)) {
itemBonus += KoLCharacter.currentNumericModifier(Modifiers.PANTSDROP) / 100.0;
itemBonus += KoLCharacter.currentNumericModifier(DoubleModifier.PANTSDROP) / 100.0;
} else if (ItemDatabase.isAccessory(itemId)) {
itemBonus += KoLCharacter.currentNumericModifier(Modifiers.ACCESSORYDROP) / 100.0;
itemBonus += KoLCharacter.currentNumericModifier(DoubleModifier.ACCESSORYDROP) / 100.0;
}
}

Expand Down Expand Up @@ -1298,7 +1299,7 @@ private static int adjustConditionalWeighting(String zone, String monster, int w
}
}
case "Oil Peak" -> {
int monsterLevel = (int) KoLCharacter.currentNumericModifier(Modifiers.MONSTER_LEVEL);
int monsterLevel = (int) KoLCharacter.currentNumericModifier(DoubleModifier.MONSTER_LEVEL);
return switch (monster) {
case "oil slick" -> monsterLevel < 20 ? 1 : 0;
case "oil tycoon" -> monsterLevel >= 20 && monsterLevel < 50 ? 1 : 0;
Expand Down Expand Up @@ -1440,7 +1441,7 @@ private static int adjustConditionalWeighting(String zone, String monster, int w
};
}
case "The Slime Tube" -> {
int monsterLevel = (int) KoLCharacter.currentNumericModifier(Modifiers.MONSTER_LEVEL);
int monsterLevel = (int) KoLCharacter.currentNumericModifier(DoubleModifier.MONSTER_LEVEL);
return switch (monster) {
case "Slime" -> monsterLevel <= 100 ? 1 : 0;
case "Slime Hand" -> monsterLevel > 100 && monsterLevel <= 300 ? 1 : 0;
Expand Down
44 changes: 25 additions & 19 deletions src/net/sourceforge/kolmafia/DebugModifiers.java
Expand Up @@ -2,27 +2,29 @@

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.EnumMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Objects;
import net.sourceforge.kolmafia.modifiers.DoubleModifier;
import net.sourceforge.kolmafia.persistence.EffectDatabase;
import net.sourceforge.kolmafia.persistence.ItemDatabase;
import net.sourceforge.kolmafia.persistence.SkillDatabase;

public class DebugModifiers extends Modifiers {
private static HashMap<Integer, String> wanted, adjustments;
private static Map<DoubleModifier, String> wanted, adjustments;
private static String currentType;
private static String currentName;
private static StringBuilder buffer;

public static int setup(String parameters) {
DebugModifiers.wanted = new HashMap<>();
DebugModifiers.adjustments = new HashMap<>();
for (int i = 0; i < Modifiers.DOUBLE_MODIFIERS; ++i) {
String name = Modifiers.getModifierName(i);
DebugModifiers.wanted = new EnumMap<>(DoubleModifier.class);
DebugModifiers.adjustments = new EnumMap<>(DoubleModifier.class);
for (var mod : Modifiers.DOUBLE_MODIFIERS) {
String name = Modifiers.getModifierName(mod);
if (name.toLowerCase().contains(parameters)) {
DebugModifiers.wanted.put(i, "<td colspan=3>" + name + "</td>");
DebugModifiers.adjustments.put(i, "<td colspan=2>" + name + "</td>");
DebugModifiers.wanted.put(mod, "<td colspan=3>" + name + "</td>");
DebugModifiers.adjustments.put(mod, "<td colspan=2>" + name + "</td>");
}
}
DebugModifiers.currentType = "type";
Expand All @@ -46,7 +48,7 @@ private static void flushRow() {
DebugModifiers.buffer.append("</td><td>");
DebugModifiers.buffer.append(DebugModifiers.getDesc());
DebugModifiers.buffer.append("</td>");
for (Integer key : DebugModifiers.wanted.keySet()) {
for (DoubleModifier key : DebugModifiers.wanted.keySet()) {
String item = DebugModifiers.adjustments.get(key);
DebugModifiers.buffer.append(Objects.requireNonNullElse(item, "<td></td><td></td>"));
}
Expand All @@ -56,31 +58,35 @@ private static void flushRow() {

@Override
protected void addDouble(
final int index, final double mod, final ModifierType type, final IntOrString key) {
if (index < 0 || index >= Modifiers.DOUBLE_MODIFIERS || mod == 0.0) {
final DoubleModifier modifier,
final double mod,
final ModifierType type,
final IntOrString key) {
if (modifier == null || mod == 0.0) {
return;
}

Lookup lookup = new Lookup(type, key);

super.addDouble(index, mod, type, key);
super.addDouble(modifier, mod, type, key);

if (!DebugModifiers.wanted.containsKey(index)) {
if (!DebugModifiers.wanted.containsKey(modifier)) {
return;
}

String name = lookup.getName();
if (!name.equals(DebugModifiers.currentName) || DebugModifiers.adjustments.containsKey(index)) {
if (!name.equals(DebugModifiers.currentName)
|| DebugModifiers.adjustments.containsKey(modifier)) {
DebugModifiers.flushRow();
}
DebugModifiers.currentType = type.wordsName();
DebugModifiers.currentName = name;
DebugModifiers.adjustments.put(
index,
modifier,
"<td>"
+ KoLConstants.ROUNDED_MODIFIER_FORMAT.format(mod)
+ "</td><td>=&nbsp;"
+ KoLConstants.ROUNDED_MODIFIER_FORMAT.format(this.get(index))
+ KoLConstants.ROUNDED_MODIFIER_FORMAT.format(this.get(modifier))
+ "</td>");
}

Expand All @@ -94,8 +100,8 @@ public static void finish() {

public static void allModifiers() {
DebugModifiers.buffer.append("<tr>");
HashMap<Integer, Iterator<Change>> modifiersChangers = new HashMap<>();
for (Integer key : DebugModifiers.wanted.keySet()) {
Map<DoubleModifier, Iterator<Change>> modifiersChangers = new EnumMap<>(DoubleModifier.class);
for (DoubleModifier key : DebugModifiers.wanted.keySet()) {
String modifier = DebugModifiers.wanted.get(key);
DebugModifiers.buffer.append(modifier);
ArrayList<Change> modChangers = new ArrayList<>();
Expand All @@ -119,7 +125,7 @@ public static void allModifiers() {
DebugModifiers.buffer.append("</tr>");
while (modifiersChangers.size() > 0) {
DebugModifiers.buffer.append("<tr>");
for (Integer key : DebugModifiers.wanted.keySet()) {
for (DoubleModifier key : DebugModifiers.wanted.keySet()) {
Iterator<Change> li = modifiersChangers.get(key);
if (li == null) {
DebugModifiers.buffer.append("<td colspan=3></td>");
Expand Down
27 changes: 14 additions & 13 deletions src/net/sourceforge/kolmafia/FamiliarData.java
Expand Up @@ -14,6 +14,7 @@
import javax.swing.SwingConstants;
import net.java.dev.spellcast.utilities.JComponentUtilities;
import net.sourceforge.kolmafia.KoLConstants.ConsumptionType;
import net.sourceforge.kolmafia.modifiers.DoubleModifier;
import net.sourceforge.kolmafia.objectpool.EffectPool;
import net.sourceforge.kolmafia.objectpool.FamiliarPool;
import net.sourceforge.kolmafia.objectpool.ItemPool;
Expand Down Expand Up @@ -313,11 +314,11 @@ public final void addCombatExperience(String responseText) {
return;
}

double experienceModifier = KoLCharacter.currentNumericModifier(Modifiers.FAMILIAR_EXP);
double experienceModifier = KoLCharacter.currentNumericModifier(DoubleModifier.FAMILIAR_EXP);

int itemId = getItem().getItemId();
if (itemId == ItemPool.MAYFLOWER_BOUQUET) {
String modifierName = Modifiers.getModifierName(Modifiers.FAMILIAR_EXP);
String modifierName = Modifiers.getModifierName(DoubleModifier.FAMILIAR_EXP);
double itemModifier = Modifiers.getNumericModifier(ModifierType.ITEM, itemId, modifierName);

experienceModifier -= itemModifier;
Expand Down Expand Up @@ -825,9 +826,9 @@ private int getModifiedWeight(final boolean includeHidden, final boolean include
// Get current fixed and percent weight modifiers
Modifiers current = KoLCharacter.getCurrentModifiers();
boolean fixodene = KoLConstants.activeEffects.contains(FIDOXENE);
double fixed = current.get(Modifiers.FAMILIAR_WEIGHT);
double hidden = current.get(Modifiers.HIDDEN_FAMILIAR_WEIGHT);
double percent = current.get(Modifiers.FAMILIAR_WEIGHT_PCT);
double fixed = current.get(DoubleModifier.FAMILIAR_WEIGHT);
double hidden = current.get(DoubleModifier.HIDDEN_FAMILIAR_WEIGHT);
double percent = current.get(DoubleModifier.FAMILIAR_WEIGHT_PCT);

FamiliarData familiar = KoLCharacter.getFamiliar();

Expand All @@ -839,9 +840,9 @@ private int getModifiedWeight(final boolean includeHidden, final boolean include
if (item != EquipmentRequest.UNEQUIP) {
Modifiers mods = Modifiers.getItemModifiers(item.getItemId());
if (mods != null) {
fixed -= mods.get(Modifiers.FAMILIAR_WEIGHT);
hidden -= mods.get(Modifiers.HIDDEN_FAMILIAR_WEIGHT);
percent -= mods.get(Modifiers.FAMILIAR_WEIGHT_PCT);
fixed -= mods.get(DoubleModifier.FAMILIAR_WEIGHT);
hidden -= mods.get(DoubleModifier.HIDDEN_FAMILIAR_WEIGHT);
percent -= mods.get(DoubleModifier.FAMILIAR_WEIGHT_PCT);
}
}
}
Expand All @@ -854,9 +855,9 @@ private int getModifiedWeight(final boolean includeHidden, final boolean include
if (item != EquipmentRequest.UNEQUIP) {
Modifiers mods = Modifiers.getItemModifiers(item.getItemId());
if (mods != null) {
fixed += mods.get(Modifiers.FAMILIAR_WEIGHT);
hidden += mods.get(Modifiers.HIDDEN_FAMILIAR_WEIGHT);
percent += mods.get(Modifiers.FAMILIAR_WEIGHT_PCT);
fixed += mods.get(DoubleModifier.FAMILIAR_WEIGHT);
hidden += mods.get(DoubleModifier.HIDDEN_FAMILIAR_WEIGHT);
percent += mods.get(DoubleModifier.FAMILIAR_WEIGHT_PCT);
}
}
}
Expand Down Expand Up @@ -885,15 +886,15 @@ private int getModifiedWeight(final boolean includeHidden, final boolean include
}

// check if the familiar has a weight cap
int cap = (int) current.get(Modifiers.FAMILIAR_WEIGHT_CAP);
int cap = (int) current.get(DoubleModifier.FAMILIAR_WEIGHT_CAP);
int cappedWeight = (cap == 0) ? weight : Math.min(weight, cap);

return Math.max(1, cappedWeight);
}

public static final int itemWeightModifier(final int itemId) {
Modifiers mods = Modifiers.getItemModifiers(itemId);
return mods == null ? 0 : (int) mods.get(Modifiers.FAMILIAR_WEIGHT);
return mods == null ? 0 : (int) mods.get(DoubleModifier.FAMILIAR_WEIGHT);
}

public final int getUncappedWeight() {
Expand Down

0 comments on commit 5686e1c

Please sign in to comment.