Bug You are too drunk to continue

ckb

Minion
Staff member
I have been getting an error of "You are too drunk to continue." in aftercore, even though I am not. This may be related to this bug about drunkness..
Mafia is reporting my inebriety at 17/14, when it should be 17/20 I think.

> modtrace liver

type source Liver Capacity
Skill Liver of Steel +5.00 = +5.00
Skill Drinking to Drink +1.00 = +6.00


I'll try to get more info on why this is happening, or what else might cause this to happen.
 

gausie

D̰͕̝͚̤̥̙̐̇̑͗̒e͍͔͎͈͔ͥ̉̔̅́̈l̠̪̜͓̲ͧ̍̈́͛v̻̾ͤe͗̃ͥ̐̊ͬp̔͒ͪ
Staff member
I can't work this out, I have seen the error reported by others. I don't understand how passive skills are showing in modtrace but not being counted by getInebrietyLimit.
 

ckb

Minion
Staff member
Some other things I noticed:
This problem does not happen with older builds (r27596)
In my adventures today, I did not have the relay browser running. Loading the relay browser fixed the problem (I assume because it loaded and parsed the charpane)
 
Last edited:

ckb

Minion
Staff member
I logged out and logged back in again after adventuring and overdrinking. Mafia now reports inebriety_limit() = 14, still with +6 Liver Capacity.
Opening and refreshing the Relay browser (and the charpane) correct this to inebriety_limit() = 20
 

heeheehee

Developer
Staff member
Huh. This is fascinating:

> inebriety_limit

Returned: 9

> modtrace liver

type source Liver Capacity
Skill Liver of Steel +5.00 = +5.00
Skill Hard Drinker +5.00 = +10.00
Skill Hollow Leg +1.00 = +11.00
Skill Drinking to Drink +1.00 = +12.00

> inebriety_limit

Returned: 21

That said, I can reproduce pretty reliably.
 

heeheehee

Developer
Staff member
modtrace calls recalculateAdjustments, but that happens at the end of the invocation...?

> inebriety_limit

Returned: 9

> numeric_modifier Liver Capacity

Returned: 0.0

> modtrace liver capacity


type source Liver Capacity
Skill Liver of Steel +5.00 = +5.00
Skill Hard Drinker +5.00 = +10.00
Skill Hollow Leg +1.00 = +11.00
Skill Drinking to Drink +1.00 = +12.00


> numeric_modifier Liver Capacity

Returned: 12.0

Well, at least we're consistent. And it looks like that call to modtrace recomputes the modifiers.
 

heeheehee

Developer
Staff member
It's not just organ capacities, it turns out -- other skill modifiers are affected, too.

> numeric_modifier weapon damage

Returned: 30.0

> modtrace weapon damage

type source Weapon Damage Weapon Damage Percent
Equipment Power 15% weapon power +30.00 = +30.00
Skill Claws of the Walrus +7.00 = +37.00

> numeric_modifier weapon damage

Returned: 37.0
 

heeheehee

Developer
Staff member
Yeah, this isn't a new bug per se, but rather one that became much, much more visible with the organ tracking change. I checked out an earlier revision (r27601 contained the organ tracking change), and saw the same results for Weapon Damage:
> get_revision

Returned: 27596

> numeric_modifier weapon damage

Returned: 30.0
 

Ryo_Sangnoir

Developer
Staff member
I posted some investigation in https://kolmafia.us/threads/missing-1-drunk-capacity-starting-with-27601.29257/ -- there's a race condition to do with the passive skill cache. I don't know whether this is the root cause, but it might be.

Okay, so somebody else reported this (from after freeing the king), so I did some investigation and found the following, copied here for ease of reference:

yeah, I can see a race
`Modifiers.availablePassiveSkillModifiersByVariable` is cleared by `resetModifiers` which is called by `liberateKing`, but changing the `kingLiberated` preference sets `availableSkillsChanged` to `true`, which repopulates it in `applyPassiveModifiers`

I think this also applies whenever a skill provided by a piece of equipment is added or removed.
 

Ryo_Sangnoir

Developer
Staff member
A side issue is that, after modtrace recalculates your adjustments, the sidepane still shows the previous value -- it needs a KoLCharacter.updateStatus() call to update.
 

heeheehee

Developer
Staff member
Yeah. I think this was broken by r26962.

(and by "think" I mean I checked the output of `numeric_modifier weapon damage` on login with both r26961 and r26962, and confirmed that r26962 introduced the regression I've been using as my test case.)
 

ckb

Minion
Staff member
As a hacky fix, I added this to my afterAdventureScript
Code:
if (my_inebriety()>inebriety_limit()) { visit_url("charpane.php"); }

That will reset Mafia's inebriety_limit
 

heeheehee

Developer
Staff member
@Ryo_Sangnoir A simpler explanation: during LoginManager.initialize(), we call recalculateAdjustments() on login (in KoLCharacter.reset()) well before we populate our skills (via the CharSheetRequest in KoLmafia.refreshSession()).

Code:
diff --git a/src/net/sourceforge/kolmafia/KoLmafia.java b/src/net/sourceforge/kolmafia/KoLmafia.java
index 109340ccbd..562156635c 100644
--- a/src/net/sourceforge/kolmafia/KoLmafia.java
+++ b/src/net/sourceforge/kolmafia/KoLmafia.java
@@ -695,6 +695,8 @@ public abstract class KoLmafia {
     // It would be nice to not have to do this
     IslandManager.ensureUpdatedBigIsland();
 
+    KoLCharacter.recalculateAdjustments();
+
     KoLmafia.setIsRefreshing(false);
   }
seems to fix the issue for me.
 

heeheehee

Developer
Staff member
I was playing around with trying to get it to work in tests, but there are some quirks with how we manage passives -- both campground details as well as familiar modifiers (e.g. Underwater Familiar) were blocking applyPassiveModifiers from correctly detecting that skills had been reset.
 

heeheehee

Developer
Staff member
I looked at it some more, and that's not actually quite right. applyPassiveModifiers was always populating availablePassiveSkillModifiersByVariable, even if there were no skills loaded.

Anyways. #2011.
 

heeheehee

Developer
Staff member
Oh, I understand the race you described now. We fire a listener for (skill) whenever we add a new skill, which in turn sets availableSkillsChanged.

I suppose we want a mechanism to wait until any pending listeners have finished executing.
 

heeheehee

Developer
Staff member
#2012 sidesteps that by just updating availableSkillsChanged in a synchronous fashion, and adding an explicit call to recalculateAdjustments() in CharSheetRequest. I could probably revert the change in #2011, since I'm pretty sure this is a more comprehensive fix, but, that commit doesn't really hurt anything (other than result in a small performance hit on session refresh).
 

Ryo_Sangnoir

Developer
Staff member
Oh, I understand the race you described now. We fire a listener for (skill) whenever we add a new skill, which in turn sets availableSkillsChanged.
The other part of this is that (when it's a combat skill) sometimes we fire "addAvailableSkill" and sometimes "addAvailableCombatSkill". The former recalculates modifiers and the latter doesn't. I am curious as to whether we could just always use the latter.
 
Top