Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: store everfull dart perks #2232

Merged
merged 1 commit into from
Mar 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions src/data/defaults.txt
Original file line number Diff line number Diff line change
Expand Up @@ -654,6 +654,7 @@ user essenceOfAnnoyanceCost 5000
user essenceOfBearAvailable true
user essenceOfBearCost 1000
user EVEDirections LLRLR0
user everfullDartPerks
user expressCardUsed false
user extraCosmeticModifiers
user extraRolloverAdventures 0
Expand Down
3 changes: 3 additions & 0 deletions src/net/sourceforge/kolmafia/KoLmafia.java
Original file line number Diff line number Diff line change
Expand Up @@ -890,6 +890,9 @@ private static void refreshSessionData() {
// Items that conditionally grant skills
InventoryManager.checkSkillGrantingEquipment();

// check dart perks on logon
InventoryManager.checkDartPerks();

// Check Horsery if we haven't today
if (Preferences.getBoolean("horseryAvailable")
&& Preferences.getString("_horseryCrazyMox").length() == 0) {
Expand Down
1 change: 1 addition & 0 deletions src/net/sourceforge/kolmafia/objectpool/ItemPool.java
Original file line number Diff line number Diff line change
Expand Up @@ -3742,6 +3742,7 @@ public class ItemPool {
public static final int QUICK_RELEASE_UTILITY_BELT = 11557;
public static final int MOTION_SENSOR = 11558;
public static final int FOCUSED_MAGNETRON_PISTOL = 11559;
public static final int EVERFULL_DART_HOLSTER = 11561;
public static final int RESEARCH_FRAGMENT = 11562;

private ItemPool() {}
Expand Down
26 changes: 26 additions & 0 deletions src/net/sourceforge/kolmafia/persistence/ItemDatabase.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import javax.swing.ImageIcon;
import net.java.dev.spellcast.utilities.JComponentUtilities;
import net.sourceforge.kolmafia.AdventureResult;
Expand Down Expand Up @@ -50,8 +51,12 @@
import net.sourceforge.kolmafia.session.ElVibratoManager.Punchcard;
import net.sourceforge.kolmafia.session.EquipmentManager;
import net.sourceforge.kolmafia.utilities.FileUtilities;
import net.sourceforge.kolmafia.utilities.HTMLParserUtils;
import net.sourceforge.kolmafia.utilities.LogStream;
import net.sourceforge.kolmafia.utilities.StringUtilities;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
import org.htmlcleaner.XPatherException;
import org.json.JSONException;
import org.json.JSONObject;

Expand Down Expand Up @@ -2345,6 +2350,27 @@
}
}

public static void parseDartPerks(final String desc) {
if (!desc.contains("Active Perks")) {
Preferences.setString("everfullDartPerks", "");
} else {
HtmlCleaner cleaner = HTMLParserUtils.configureDefaultParser();
TagNode doc = cleaner.clean(desc);
String xpath = "//ul/li/text()";

Object[] result;
try {
result = doc.evaluateXPath(xpath);
} catch (XPatherException ex) {

Check warning on line 2364 in src/net/sourceforge/kolmafia/persistence/ItemDatabase.java

View check run for this annotation

Codecov / codecov/patch

src/net/sourceforge/kolmafia/persistence/ItemDatabase.java#L2364

Added line #L2364 was not covered by tests
// do nothing
return;

Check warning on line 2366 in src/net/sourceforge/kolmafia/persistence/ItemDatabase.java

View check run for this annotation

Codecov / codecov/patch

src/net/sourceforge/kolmafia/persistence/ItemDatabase.java#L2366

Added line #L2366 was not covered by tests
}

var perks = Arrays.stream(result).map(Object::toString).collect(Collectors.joining(","));
Preferences.setString("everfullDartPerks", perks);
}
}

public static boolean unusableInBeecore(final int itemId) {
return switch (itemId) {
case
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,7 @@ public class Preferences {
"ensorceleeLevel",
"entauntaunedColdRes",
"envyfishMonster",
"everfullDartPerks",
"falloutShelterChronoUsed",
"falloutShelterCoolingTankUsed",
"familiarSweat",
Expand Down
5 changes: 5 additions & 0 deletions src/net/sourceforge/kolmafia/session/ChoiceControl.java
Original file line number Diff line number Diff line change
Expand Up @@ -6753,6 +6753,11 @@
// Moonlighting
handleAfterAvatar(ChoiceManager.lastDecision);
break;

case 1525:
// Dart Perks
InventoryManager.checkDartPerks();

Check warning on line 6759 in src/net/sourceforge/kolmafia/session/ChoiceControl.java

View check run for this annotation

Codecov / codecov/patch

src/net/sourceforge/kolmafia/session/ChoiceControl.java#L6759

Added line #L6759 was not covered by tests
break;
}
}

Expand Down
9 changes: 9 additions & 0 deletions src/net/sourceforge/kolmafia/session/InventoryManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -1822,6 +1822,15 @@
checkItemDescription(id);
}

public static void checkDartPerks() {
var dartHolster = ItemPool.EVERFULL_DART_HOLSTER;
if (!InventoryManager.equippedOrInInventory(ItemPool.get(dartHolster, 1))) {
return;
}

checkItemDescription(dartHolster);
}

Check warning on line 1832 in src/net/sourceforge/kolmafia/session/InventoryManager.java

View check run for this annotation

Codecov / codecov/patch

src/net/sourceforge/kolmafia/session/InventoryManager.java#L1831-L1832

Added lines #L1831 - L1832 were not covered by tests

private static final AdventureResult GOLDEN_MR_ACCESSORY =
ItemPool.get(ItemPool.GOLDEN_MR_ACCESSORY, 1);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,7 @@
.parsePowerfulGlove(responseText);
case ItemPool.RING -> ItemDatabase.parseRing(responseText);
case ItemPool.LATTE_MUG -> LatteRequest.parseDescription(responseText);
case ItemPool.EVERFULL_DART_HOLSTER -> ItemDatabase.parseDartPerks(responseText);

Check warning on line 438 in src/net/sourceforge/kolmafia/session/ResponseTextParser.java

View check run for this annotation

Codecov / codecov/patch

src/net/sourceforge/kolmafia/session/ResponseTextParser.java#L438

Added line #L438 was not covered by tests
default -> changesFromTimeToTime = false;
}

Expand Down
42 changes: 42 additions & 0 deletions test/net/sourceforge/kolmafia/persistence/ItemDatabaseTest.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
package net.sourceforge.kolmafia.persistence;

import static internal.helpers.Networking.html;
import static internal.helpers.Player.withProperty;
import static internal.matchers.Preference.hasStringValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.emptyString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;

import java.util.EnumSet;
import net.sourceforge.kolmafia.KoLCharacter;
import net.sourceforge.kolmafia.KoLConstants.ConsumptionType;
import net.sourceforge.kolmafia.objectpool.ItemPool;
import net.sourceforge.kolmafia.persistence.ItemDatabase.Attribute;
import net.sourceforge.kolmafia.preferences.Preferences;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

Expand Down Expand Up @@ -94,4 +101,39 @@ public void checksItemFlags() {
assertThat(ItemDatabase.isPasteable(ItemPool.SEAL_CLUB), is(true));
assertThat(ItemDatabase.isChocolateItem(ItemPool.SEAL_CLUB), is(false));
}

@Nested
class EverfullDartPerks {
@BeforeEach
public void beforeEach() {
KoLCharacter.reset("EverfullDartPerks");
Preferences.reset("EverfullDartPerks");
}

@Test
public void parsesNoPerks() {
var cleanups = withProperty("everfullDartPerks", "Throw a second dart quickly");

try (cleanups) {
var response = html("request/test_desc_item_everfull_dart_holster_no_perks.html");
ItemDatabase.parseDartPerks(response);
assertThat("everfullDartPerks", hasStringValue(equalTo("")));
}
}

@Test
public void parsesPerks() {
var cleanups = withProperty("everfullDartPerks", "");

try (cleanups) {
var response = html("request/test_desc_item_everfull_dart_holster_perks.html");
ItemDatabase.parseDartPerks(response);
assertThat(
"everfullDartPerks",
hasStringValue(
equalTo(
"Deal 25-50% more damage,You are less impressed by bullseyes,25% Better bullseye targeting,Extra stats from stats targets,Butt awareness,Add Sleaze Damage")));
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html><head><title>Item Description</title><link rel="stylesheet" type="text/css" href="https://d2uyhvukfffg5a.cloudfront.net/styles.20230117d.css"><style>a.hand {cursor: pointer;}</style><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/keybinds.min.2.js"></script><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/window.20111231.js"></script></head><body><div id="description" class=small><center><img src="https://d2uyhvukfffg5a.cloudfront.net/itemimages/dartholster.gif" height=30 width=30 alt="dartholster"><br><b>Everfull Dart Holster</b></center><p><blockquote>This is your trusty dart holster. Put it on your hip. Draw a dart, throw it. Draw a dart. Throw it. Draw a dart throw it. Draw a dart, throw it. Draw a dart. Throw it. You get the idea.<!-- itemid: 11561 --><br><br>Type: <b>accessory</b><Br>Cannot be traded or discarded<p><center><b><font color=blue>Combat Initiative +50%<br>All Attributes +10%<br>Throw Darts in Battle</font></b></center><br><b>NOTE:</b> You may not equip more than one of these at a time.</blockquote><script type="text/javascript"><!--var resizetries = 0;var fsckinresize;setTimeout(fsckinresize = function () {var desch = document.getElementById('description').offsetHeight;if (desch < 100 && resizetries < 5) {setTimeout(fsckinresize, 100);resizetries++;}if (desch < 100) desch = 200;//alert('resizing on try #' + resizetries);if (self.resizeTo && window.outerHeight) {self.resizeTo(400, desch + (window.outerHeight - window.innerHeight) + 50);}else if (self.resizeTo ) { self.resizeTo(400, desch+130); }else { window.innerHeight = newh; }}, 100);//--></script></div></body></html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<title>Item Description</title>
<link rel="stylesheet" type="text/css" href="https://d2uyhvukfffg5a.cloudfront.net/styles.20230117d.css">
<style>
a.hand {
cursor: pointer;
}
</style>
<script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/keybinds.min.2.js"></script>
<script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/window.20111231.js"></script>
</head>
<body>

<div id="description" class=small><center><img src="https://d2uyhvukfffg5a.cloudfront.net/itemimages/dartholster.gif" height=30 width=30 alt="dartholster"><br><b>Everfull Dart Holster</b></center><p><blockquote>This is your trusty dart holster. Put it on your hip. Draw a dart, throw it. Draw a dart. Throw it. Draw a dart throw it. Draw a dart, throw it. Draw a dart. Throw it. You get the idea.<p><b>Active Perks</b><ul><li>Deal 25-50% more damage<li>You are less impressed by bullseyes<li>25% Better bullseye targeting<li>Extra stats from stats targets<li>Butt awareness<li>Add Sleaze Damage</ul><!-- itemid: 11561 --><br><br>Type: <b>accessory</b><Br>Cannot be traded or discarded<p><center><b><font color=blue>Combat Initiative +50%<br>All Attributes +10%<br>Throw Darts in Battle</font></b></center><br><b>NOTE:</b> You may not equip more than one of these at a time.</blockquote><script type="text/javascript">
<!--
var resizetries = 0;
var fsckinresize;
setTimeout(fsckinresize = function () {
var desch = document.getElementById('description').offsetHeight;
if (desch < 100 && resizetries < 5) {
setTimeout(fsckinresize, 100);
resizetries++;
}
if (desch < 100) desch = 200;
//alert('resizing on try #' + resizetries);
if (self.resizeTo && window.outerHeight) {
self.resizeTo(400, desch + (window.outerHeight - window.innerHeight) + 50);
}
else if (self.resizeTo ) { self.resizeTo(400, desch+130); }
else { window.innerHeight = newh; }
}, 100);
//-->
</script>
</div>
</body>
</html>