Skip to content

Romances with NPCs progress incorrectly

I recently went through the game, but due to certain circumstances I lost my saves, so I had to start over.
During the first playthrough, the romances were fine. For the second playthrough, I decided to add some mods that add new banters.
And after that, in the new playthrough, I noticed the following problem: romances with npc began to progress incorrectly, the LoveTalks do not go sequentially one to another, but jump over one dialogue. Accordingly, half of the dialogues disappear.

An example:
I spoke with Viconia about the kidnapping of Imoen by Cowled Wizards (one of the initial dialogues), and in the next dialogue she began to apologize for talking about her life in Beregost — although this dialogue about Beregost was skipped. At the first time, I thought that this was a one-time bug and didnt do anything, but this began to happen with all further dialogues — they are skipped through one.

I would like to avoid reinstalling the game once again — and would like to keep mods with new banters — I hope it's possible to manually fix the script or something. Of course, I could just manually edit the LoveTalk variable through the console after each dialogue, but most likely certain important stages of the romances are regulated not only by this variable, and I don’t know the mechanics of romances so deeply.
Here is my list of mods (in the order they were installed) — new mods that potentially lead to this error are separately marked:
EEeX
Bubb's Spell Menu
Reveal Hidden Gameplay Options
HQ Sound clips
BG2 Unfinished Business
Pocket Plane Banter Pack — added in last playthrough
IEP Banter Pack — added in last playthrough
Heroes, Thieves, and Moneylenders — added in last playthrough
BG2 Flirt Pack — added in last playthrough
Spell Revisions
Tweak Antology
Sword Coast Stratagems

Comments

  • KhyronKhyron Member Posts: 636
    Generally speaking I think it's a big mistake to add more than one banter pack.. unless they are specifically stated to be compatible, always assume they are not - they often edit the same files, which means whichever gets installed last partially overwrites an earlier mod.

    Your savegame might be screwed forever, I don't know. But I would whipe the folder, reinstall and use only ONE mod that alters Banters/LoveTalks at all.. and preferrably anything that touches npc's at all really.

  • jasteyjastey Member Posts: 2,785
    edited December 2022
    @Khyron Whoa, phrasing as if mods usually overwrite other mods is a bit harsh considering the time and effort modders in IE spent to make mods compatible.
    Especially banter packs are so trivial technically wise that there should be no problem to go along each other, all that can happen is content wise that the topics of talks do not match.

    If the banter packs - or several, for that matter, would break romances, we would have heard about it by now.

    @regular_doppelganger unfortunately I have no idea what would cause this if it is really every second lovetalk that is skipped, that is an unusual pattern. I know that the original romances are not scripted fail proof, meaning if one lovetalk should trigger and you give a mouse click in that instance, it will not trigger and the variable will be increased. Maybe that happened for you in some instances.
    For checking and also to see the whole romance, you could reset the lovetalk variable to something earlier and make the talks trigger by setting the timer by hand, something like setting Viconia's "LoveTalk","LOCALS" variable to 1 and triggering it by setting the timer variable "ViconiaRomance","GLOBAL" to "1".
    Meaning:
    place the mouse so it is over Viconia and Viconia is highlighted, type into the cheat console:
    C:SetGlobal("LoveTalk","LOCALS",1)
    
    Then the cheat to shorten the timer:
    C:SetGlobal("ViconiaRomance","GLOBAL",1)
    
    This should trigger the lovetalk almost instantly.
    After that, repeat the last command to go through the lovetalks (the timer only, the lovetalk variables will be increased by the dialogue/script automatically).
    Note: There is lovetalk where you need to rest instead of advance the timer:
    Global("LoveTalk","LOCALS",39)
    Global("LoveTalk","LOCALS",49)
    Global("LoveTalk","LOCALS",61)

    If this doesn't trigger the lovetalks, check the value of the local variable. If it is increased more than by 1, then the script does something weird.
  • KhyronKhyron Member Posts: 636
    *shrug* Your mileage may vary I guess.

    The romance is broken in a way you usually don't see, he has a bunch of mods installed that may alter interjections one way or another.. I don't really see the mystery here. A combination of mods has probably screwed something up beyond repair, but could possibly be saved by manually overriding using the console.. for probably the rest of SoA at least - not much fun.

    I still suggest a clean install, load the save and see what happens. If the vanilla romance works, then start reinstalling mods until it doesn't.. then roll back to last functioning state.

    I've played with mods enough to have landed on that once an install/save starts troubling, there's a very real risk that you will encounter more problems down the line - even if you can mitigate the current one using console. It might be a harsh way to go about it, but if lovetalks poop out before i even enter the underdark then I'm not gonna continue farther just to have the Bodhi encounter fail, or lack of dead body, or unresponsive amanuator temple.. It very often isn't just that one issue that pops up, rather it often serves as a sign of issues to come.

    if at first it doesn't work.. kill it with fire xD
  • jmerryjmerry Member Posts: 3,882
    In the standard game, the LoveTalk variable is primarily handled by the NPC's script, incrementing it twice per talk. One when the timer expires in the block that tells the NPC to talk to the protagonist, one after that in the block that resets the timer.

    So, you'd be looking at VICONIA.BCS. The relevant chunk of the script in the standard version:
    IF
    	InParty(Myself)
    	RealGlobalTimerExpired("ViconiaRomance","GLOBAL")
    	!Global("ViconiaRomanceActive","GLOBAL",0)
    	!Global("ViconiaRomanceActive","GLOBAL",3)
    	Global("ViconiaMatch","GLOBAL",1)
    	!AreaCheck("AR1300")  // De'Arnise Keep Destroyed
    	!AreaType(DUNGEON)
    	See(Player1)
    	CombatCounter(0)
    	!See([ENEMY])
    	!Range([NEUTRAL],10)
    	OR(33)
    		Global("LoveTalk","LOCALS",1)
    		Global("LoveTalk","LOCALS",3)
    		Global("LoveTalk","LOCALS",5)
    		Global("LoveTalk","LOCALS",7)
    		Global("LoveTalk","LOCALS",9)
    		Global("LoveTalk","LOCALS",11)
    		Global("LoveTalk","LOCALS",13)
    		Global("LoveTalk","LOCALS",15)
    		Global("LoveTalk","LOCALS",17)
    		Global("LoveTalk","LOCALS",19)
    		Global("LoveTalk","LOCALS",21)
    		Global("LoveTalk","LOCALS",23)
    		Global("LoveTalk","LOCALS",25)
    		Global("LoveTalk","LOCALS",27)
    		Global("LoveTalk","LOCALS",29)
    		Global("LoveTalk","LOCALS",31)
    		Global("LoveTalk","LOCALS",33)
    		Global("LoveTalk","LOCALS",35)
    		Global("LoveTalk","LOCALS",37)
    		Global("LoveTalk","LOCALS",43)
    		Global("LoveTalk","LOCALS",45)
    		Global("LoveTalk","LOCALS",47)
    		Global("LoveTalk","LOCALS",53)
    		Global("LoveTalk","LOCALS",55)
    		Global("LoveTalk","LOCALS",57)
    		Global("LoveTalk","LOCALS",59)
    		Global("LoveTalk","LOCALS",63)
    		Global("LoveTalk","LOCALS",65)
    		Global("LoveTalk","LOCALS",67)
    		Global("LoveTalk","LOCALS",69)
    		False()
    		Global("LoveTalk","LOCALS",73)
    		Global("LoveTalk","LOCALS",75)
    THEN
    	RESPONSE #100
    		IncrementGlobal("LoveTalk","LOCALS",1)
    		PlaySong(40)
    		Interact(Player1)
    END
    
    IF
    	InParty(Myself)
    	RealGlobalTimerExpired("ViconiaRomance","GLOBAL")
    	Global("ViconiaMatch","GLOBAL",1)
    	OR(38)
    		Global("LoveTalk","LOCALS",2)
    		Global("LoveTalk","LOCALS",4)
    		Global("LoveTalk","LOCALS",6)
    		Global("LoveTalk","LOCALS",8)
    		Global("LoveTalk","LOCALS",10)
    		Global("LoveTalk","LOCALS",12)
    		Global("LoveTalk","LOCALS",14)
    		Global("LoveTalk","LOCALS",16)
    		Global("LoveTalk","LOCALS",18)
    		Global("LoveTalk","LOCALS",20)
    		Global("LoveTalk","LOCALS",22)
    		Global("LoveTalk","LOCALS",24)
    		Global("LoveTalk","LOCALS",26)
    		Global("LoveTalk","LOCALS",28)
    		Global("LoveTalk","LOCALS",30)
    		Global("LoveTalk","LOCALS",32)
    		Global("LoveTalk","LOCALS",34)
    		Global("LoveTalk","LOCALS",36)
    		Global("LoveTalk","LOCALS",38)
    		Global("LoveTalk","LOCALS",40)
    		Global("LoveTalk","LOCALS",42)
    		Global("LoveTalk","LOCALS",44)
    		Global("LoveTalk","LOCALS",46)
    		Global("LoveTalk","LOCALS",48)
    		Global("LoveTalk","LOCALS",50)
    		Global("LoveTalk","LOCALS",52)
    		Global("LoveTalk","LOCALS",54)
    		Global("LoveTalk","LOCALS",56)
    		Global("LoveTalk","LOCALS",58)
    		Global("LoveTalk","LOCALS",60)
    		Global("LoveTalk","LOCALS",62)
    		Global("LoveTalk","LOCALS",64)
    		Global("LoveTalk","LOCALS",66)
    		Global("LoveTalk","LOCALS",68)
    		Global("LoveTalk","LOCALS",70)
    		Global("LoveTalk","LOCALS",72)
    		Global("LoveTalk","LOCALS",74)
    		Global("LoveTalk","LOCALS",76)
    THEN
    	RESPONSE #100
    		IncrementGlobal("LoveTalk","LOCALS",1)
    		RealSetGlobalTimer("ViconiaRomance","GLOBAL",TEN_HOURS)
    END
    
    Lines 174-274 in unmodified BG2EE. Plus some smaller blocks for talks that have different triggers, not included above.
    What does it look like in your version? Search for IncrementGlobal("LoveTalk" to find the relevant script elements. Or just LoveTalk to find everywhere it comes up and filter those yourself.
  • @jmerry There is a block in my VICONIA.BCS file that is exactly the same as the block you gave above.
    However, in addition to this block, there is also another block that includes IncrementGlobal("LoveTalk" — I don't know if there is such a block in the original game without mods. I'm attaching it here just in case.
    IF
    	InParty(Myself)
    	PartyRested()
    	!Global("ViconiaRomanceActive","GLOBAL",0)
    	!Global("ViconiaRomanceActive","GLOBAL",3)
    	Global("ViconiaMatch","GLOBAL",1)
    	!AreaType(DUNGEON)
    	See(Player1)
    	CombatCounter(0)
    	OR(4)
    		Global("LoveTalk","LOCALS",41)
    		Global("LoveTalk","LOCALS",51)
    		Global("LoveTalk","LOCALS",63)
    		False()
    THEN
    	RESPONSE #100
    		IncrementGlobal("LoveTalk","LOCALS",1)
    		PlaySong(40)
    		Interact(Player1)
    END
    
    IF
    	InParty(Myself)
    	RealGlobalTimerExpired("ViconiaRomance","GLOBAL")
    	PartyRested()
    	!Global("ViconiaRomanceActive","GLOBAL",0)
    	!Global("ViconiaRomanceActive","GLOBAL",3)
    	Global("ViconiaMatch","GLOBAL",1)
    	!AreaType(DUNGEON)
    	See(Player1)
    	CombatCounter(0)
    	OR(33)
    		Global("LoveTalk","LOCALS",1)
    		Global("LoveTalk","LOCALS",3)
    		Global("LoveTalk","LOCALS",5)
    		Global("LoveTalk","LOCALS",7)
    		Global("LoveTalk","LOCALS",9)
    		Global("LoveTalk","LOCALS",11)
    		Global("LoveTalk","LOCALS",13)
    		Global("LoveTalk","LOCALS",15)
    		Global("LoveTalk","LOCALS",17)
    		Global("LoveTalk","LOCALS",19)
    		Global("LoveTalk","LOCALS",21)
    		Global("LoveTalk","LOCALS",23)
    		Global("LoveTalk","LOCALS",25)
    		Global("LoveTalk","LOCALS",27)
    		Global("LoveTalk","LOCALS",29)
    		Global("LoveTalk","LOCALS",31)
    		Global("LoveTalk","LOCALS",33)
    		Global("LoveTalk","LOCALS",35)
    		Global("LoveTalk","LOCALS",37)
    		Global("LoveTalk","LOCALS",43)
    		Global("LoveTalk","LOCALS",45)
    		Global("LoveTalk","LOCALS",47)
    		Global("LoveTalk","LOCALS",53)
    		Global("LoveTalk","LOCALS",55)
    		Global("LoveTalk","LOCALS",57)
    		Global("LoveTalk","LOCALS",59)
    		Global("LoveTalk","LOCALS",63)
    		Global("LoveTalk","LOCALS",65)
    		Global("LoveTalk","LOCALS",67)
    		Global("LoveTalk","LOCALS",69)
    		False()
    		Global("LoveTalk","LOCALS",73)
    		Global("LoveTalk","LOCALS",75)
    THEN
    	RESPONSE #100
    		RealSetGlobalTimer("ViconiaRomance","GLOBAL",FIVE_ROUNDS)
    END
    

    @jastey I reset the Viconia romance to the very beginning as you suggested - now it seems to be working correctly, although I'm not sure that the old problem will not appear again.
  • jmerryjmerry Member Posts: 3,882
    That other block is also normal; it's for the "just rested" talks. Which means that the source of the problem likely lies elsewhere, in a different script or dialogue.
  • jasteyjastey Member Posts: 2,785
    edited December 2022
    Like I said, the triggering of the romance is done in the same script block as the setting of the needed variable. If you accidentally give a click command in this instance, the lovetalk will not fire. The script sees the LT variable, can't rerun the according scriptblock to start the LT because the trigger variable value isn't valid any more, but the LT variable value triggers the next block which again increments the variable by one, closing the lovetalk off, and all you might have noticed is that Viconia stopped walking for two times.

    If this was a mod, I'd recommend a recode to make it more stable. This would be an idea for a tweak fix mod, actually.
  • jasteyjastey Member Posts: 2,785
    There is one thing you could do to make it more stable. With Near Infinity in Viconia.bcs, find this script block:
    IF
    	InParty(Myself)
    	RealGlobalTimerExpired("ViconiaRomance","GLOBAL")
    	!Global("ViconiaRomanceActive","GLOBAL",0)
    	!Global("ViconiaRomanceActive","GLOBAL",3)
    	Global("ViconiaMatch","GLOBAL",1)
    	!AreaCheck("AR1300")  // De'Arnise Keep Destroyed
    	!AreaType(DUNGEON)
    	See(Player1)
    	CombatCounter(0)
    	!See([ENEMY])
    	!Range([NEUTRAL],10)
    	OR(33)
    		Global("LoveTalk","LOCALS",1)
    		Global("LoveTalk","LOCALS",3)
    		Global("LoveTalk","LOCALS",5)
    		Global("LoveTalk","LOCALS",7)
    		Global("LoveTalk","LOCALS",9)
    		Global("LoveTalk","LOCALS",11)
    		Global("LoveTalk","LOCALS",13)
    		Global("LoveTalk","LOCALS",15)
    		Global("LoveTalk","LOCALS",17)
    		Global("LoveTalk","LOCALS",19)
    		Global("LoveTalk","LOCALS",21)
    		Global("LoveTalk","LOCALS",23)
    		Global("LoveTalk","LOCALS",25)
    		Global("LoveTalk","LOCALS",27)
    		Global("LoveTalk","LOCALS",29)
    		Global("LoveTalk","LOCALS",31)
    		Global("LoveTalk","LOCALS",33)
    		Global("LoveTalk","LOCALS",35)
    		Global("LoveTalk","LOCALS",37)
    		Global("LoveTalk","LOCALS",43)
    		Global("LoveTalk","LOCALS",45)
    		Global("LoveTalk","LOCALS",47)
    		Global("LoveTalk","LOCALS",53)
    		Global("LoveTalk","LOCALS",55)
    		Global("LoveTalk","LOCALS",57)
    		Global("LoveTalk","LOCALS",59)
    		Global("LoveTalk","LOCALS",63)
    		Global("LoveTalk","LOCALS",65)
    		Global("LoveTalk","LOCALS",67)
    		Global("LoveTalk","LOCALS",69)
    		False()
    		Global("LoveTalk","LOCALS",73)
    		Global("LoveTalk","LOCALS",75)
    THEN
    	RESPONSE #100
    		IncrementGlobal("LoveTalk","LOCALS",1)
    		PlaySong(40)
    		Interact(Player1)
    END
    

    And change the lower part to:
    THEN
    	RESPONSE #100
    		SetInterrupt(FALSE)
    		IncrementGlobal("LoveTalk","LOCALS",1)
    		PlaySong(40)
    		Interact(Player1)
    		SetInterrupt(TRUE)
    END
    
    Compile the changed bcs and save it.

    The SetInterrupt(FALSE) prevents that the script actions can be interrupted until Viconia is done with all of them. This should lead to the LTs firing accordingly.
Sign In or Register to comment.