• New Horizons on Maelstrom
    Maelstrom New Horizons


    Visit our website www.piratehorizons.com to quickly find download links for the newest versions of our New Horizons mods Beyond New Horizons and Maelstrom New Horizons!

Fixed Sidequests: Virginie and Lucas Interference at Martinique

morgan terror

Magnificent bastard
Storm Modder
Public Relations
I really should have seen this coming, but i forgot that two of my quests overlapped, and now i'm stuck in saint pierre tavern. The quests concern the girl won in a card game quest and the quest for the missing son of the spanish admiral. Basically, the kidnapper belonging to the second quest noticed me and told me to go outside, but his dialogue prevented the one belonging to Virginie from triggering. I was hoping Virginie's dialogue would come up after the kidnapper finished, but no such luck. That's the trouble with two dialogue trees automatically triggering in the same location, i guess. The earliest savegame i have is from when i landed on martinique. Is there any way to force-start Virginie's dialogue now, or perhaps delay it until i've finished my business with the kidnappers? It's possible that even if i force-start the dialogue it'll get stuck outside the tavern again due to the kidnapper walking to the other side of the street out there. Any help would be greatly appreciated. I'd rather not be forced to murder Virginie to bypass this... unless i could resurrect her afterwards to circumvent it that way. :p
 
Yeah, two quests getting mixed together does happen. Your problem sounds like a tuff nut to crack.
 
You have a save prior to that point?

Does indeed sound tricky and I am still too busy with real life to properly look into stuff.
 
You have a save prior to that point?

Does indeed sound tricky and I am still too busy with real life to properly look into stuff.

Kind of, but it's on martinique already, so those two quests are already set to happen as soon as i choose to enter the tavern. Would it be possible to roll one of the quests back to a prior stage? Maybe cancel one of them entirely, so i can restart it? Wrestling through the current mess of dialogue triggers sounds more difficult.

The alternative is to allow me to leave the tavern, which is curently being prevented. Then i can finish my business with the kidnappers first, after which we could look into getting Virginie's dialogue started back up. Fixing both of them at once is impractical.
 
Last edited:
Here's the problem. In "Virginie d'Espivant_dialog.c":
Code:
    case "she_story_good":
       Diag.CurrentNode = Diag.TempNode;
       NPChar.quest.meeting = NPC_Meeting;
       DialogExit();
//       AddDialogExitQuest("gambled_girl_to_FdF");
       LAi_SetActorType(NPChar);
       LAi_ActorGoToLocator(NPChar, "reload", LocatorExitSence(PChar.location, "from", "tavern"), "gambled_girl_to_FdF", -1);
       AddQuestRecord("gambled_girl", 7);
     break;
That's the end of the conversation in which you offered to take her to St. Pierre, some time before you got to Martinique. It looks as though a simple exit to next quest case has been disabled in favour of a move resulting in the same quest case, which is "gambled_girl_to_FdF". In any case, the quest now moves to "quests_common.c":
Code:
    case "gambled_girl_to_FdF"://MAXIMUS: -->
       LAi_type_actor_Reset(CharacterFromID("Virginie d'Espivant"));
       AddPassenger(pchar, CharacterFromID("Virginie d'Espivant"), 0);
       SetCharacterRemovable(characterFromID("Virginie d'Espivant"), false);
       if(GetCharacterShipCabin(pchar)!="Cabin_none")
       {
         ChangeCharacterAddressGroup(characterFromID("Virginie d'Espivant"), GetCharacterShipCabin(pchar), "goto", "goto1");
         characters[GetCharacterIndex("Virginie d'Espivant")].chr_ai.type = LAI_TYPE_CITIZEN;
         SetEventHandler("CharacterTypeUpdate","LAi_CharacterTypeUpdate",1);
         PostEvent("CharacterTypeUpdate",3000,"s","Virginie d'Espivant");
       }
       else ChangeCharacterAddress(CharacterFromID("Virginie d'Espivant"), "none", "none");//MAXIMUS: <--
       OfficersReaction("good");
       pchar.quest.gambling_with_girl = "to_FDF";
       pchar.quest.gambled_girl_comes_to_FDF_tavern.win_condition.l1 = "location";
       pchar.quest.gambled_girl_comes_to_FDF_tavern.win_condition.l1.location = "Falaise_De_fleur_tavern";
       pchar.quest.gambled_girl_comes_to_FDF_tavern.win_condition = "gambled_girl_comes_to_FDF_tavern_complete";
       Locations[FindLocation("Falaise_De_Fleur_tavern")].reload.l1.disable = 1;
       Locations[FindLocation(pchar.location)].reload.l1.disable = 0;
     break;
That unlocks the door of the room where you did the gambling and locks the inside door of St. Pierre tavern. This basically means you're stuffed because both quests are already set to proceed to this deadlock before you got to Martinique.

I don't know much about using the console, not least because it requires running the game in windowed mode, which doesn't work very well on my machine. So @Pieter Boelen is going to have to tell you how to use the console to issue the command 'Locations[FindLocation("Falaise_De_Fleur_tavern")].reload.l1.disable = 0;', which ought to open the door and allow you to continue the Spanish admiral's son quest. If you're lucky, once that's done you can re-enter the tavern and hopefully the card game girl quest will then continue.

Killing Virginie won't help you as it will prevent her from ever progressing that quest. ;) However, as a last resort there is a way out. Stay out of the tavern for a month. The kidnappers will lose patience, poor Lucas will get the chop, so will his quest, and that will let you enter the tavern without being bothered by the kidnappers.

Long term solution: either Billy Brock or Raymond Bouchez could be set to type "Guardian" in "quests_side.c" or "quests_common.c" respectively, so that you have to initiate dialog with him. The other can behave as now and be the one to initiate dialog. Also, if Raymond is to be set to "Guardian", move that 'Locations[FindLocation("Falaise_De_Fleur_tavern")].reload.l1.disable = 1;' to where you talk to Raymond so that the tavern door does not lock until the conversation between him, you, Virginie and the strumpet is under way. (Personally I'd favour making Billy Brock "Guardian" type so that you go and talk to him when you're ready. This makes more sense than having you be the one to initiate the Raymond/Virginie/strumpet dialogs.)
 
Long term solution: either Billy Brock or Raymond Bouchez could be set to type "Guardian" in "quests_side.c" or "quests_common.c" respectively, so that you have to initiate dialog with him. The other can behave as now and be the one to initiate dialog. Also, if Raymond is to be set to "Guardian", move that 'Locations[FindLocation("Falaise_De_Fleur_tavern")].reload.l1.disable = 1;' to where you talk to Raymond so that the tavern door does not lock until the conversation between him, you, Virginie and the strumpet is under way. (Personally I'd favour making Billy Brock "Guardian" type so that you go and talk to him when you're ready. This makes more sense than having you be the one to initiate the Raymond/Virginie/strumpet dialogs.)

It would be nice to have a permanent fix. Overlapping quests have been causing problems for ages now. Funnily enough, i remember having these exact same quests overlap in that tavern before, but it only resulted in the two dialogue trees constantly taking turns to pop up, eventually resulting in both their bugless conclusions. This time one simply took complete priority over the other and messed things up.

I'm really giving pieter way too much work, and i'm only halfway through reporting all the bugs i've found. I'll try to do some more work on modding the random encounter dialogues today. It should go more smoothly, now i know how most of the code works.
 
I don't know much about using the console, not least because it requires running the game in windowed mode, which doesn't work very well on my machine.
It doesn't require windowed mode, but windowed mode does make it easier because you can Alt+Tab in and out of the game and execute whatever you want without closing the game down.
But you CAN close the game down and use it even in fullscreen mode.

So @Pieter Boelen is going to have to tell you how to use the console
Tutorial - Modding Tips & Tricks | PiratesAhoy!

It would be nice to have a permanent fix. Overlapping quests have been causing problems for ages now. Funnily enough, i remember having these exact same quests overlap in that tavern before, but it only resulted in the two dialogue trees constantly taking turns to pop up, eventually resulting in both their bugless conclusions. This time one simply took complete priority over the other and messed things up.
It is quite difficult to tackle all possible instances where quests interfere with each other.
But if they're reported, at least they may be dealt with some time. A savegame in a recent modpack version would be easiest to work with though. :facepalm

I'm really giving pieter way too much work, and i'm only halfway through reporting all the bugs i've found.
And I really have time nor energy to tackle the ever-growing list of bugs. We'll never get to a Beta 4 public release this way and I'll never get to bloody play the game.
Do keep reporting them though; it is better to know about issues than to not know. And some may be quick-fixes.

I'm definitely discouraged from modding at the moment because the Levelling system is still not behaving itself.
And I really do - not - want to have to touch that myself again.
 
A savegame in a recent modpack version would be easiest to work with though. :facepalm

From where exactly? According to what grey roger tells me, i should be giving a savegame from before the girl won in a card game quest was even started, but i don't have one of those. The best i have is one from before i enter the tavern, in beta 3.3.

And I really have time nor energy to tackle the ever-growing list of bugs. We'll never get to a Beta 4 public release this way and I'll never get to bloody play the game.
Do keep reporting them though; it is better to know about issues than to not know. And some may be quick-fixes.

I'm definitely discouraged from modding at the moment because the Levelling system is still not behaving itself.
And I really do - not - want to have to touch that myself again.

Then we're a bit stuck for now. I really wish i could do more, since i do enjoy modding the game, but anything more complicated than dialogue is utterly mistifying to me, and even that's sometimes a struggle. I still promised to tackle the options menu after i've finished the random encounters though; not forgotten that.
 
From where exactly? According to what grey roger tells me, i should be giving a savegame from before the girl won in a card game quest was even started, but i don't have one of those. The best i have is one from before i enter the tavern, in beta 3.3.
The tavern scene is the one that needs adjusting anyway, so a savegame just prior to entering would be good.
Shame it is Beta 3.4 though, because any fix done to that would have to be worked into the VERY different Beta 4 sidequest file.
Just to make this extra annoying. :(

Then we're a bit stuck for now. I really wish i could do more, since i do enjoy modding the game, but anything more complicated than dialogue is utterly mistifying to me, and even that's sometimes a struggle. I still promised to tackle the options menu after i've finished the random encounters though; not forgotten that.
We all learn as we go along. What you don't know now, you may have learned next year. ;)

In my case though, I now find myself in a situation where I do work very similar to "fixing PotC" for my real job.
So my enthusiasm to "fix more bugs when I get home every day" isn't what it used to be.
 
Well, here's the savegame, for what it's worth. I'll just occupy myself with modding in the meantime, see when this gets looked at. It belongs in the standard storyline.
 

Attachments

  • -=Player=- Martinique. Saint Pierre January 5th, 1751.zip
    975.7 KB · Views: 126
What does this do?
Code:
StartQuestMovie(true, false, false);TrackQuestMovie("start","Lucas_ransom_delivery");
It's in "quests_side.c", case "Lucas_ransom_delivery", and if that's what's fouling up the progress of "Girl Won in a Card Game" then I'm going to have to rethink my strategy...

Otherwise I'm going to replace 'LAi_ActorDialog(CharacterFromID("Billy Brock"), PChar, "", 4.0, -1)' with 'LAi_SetGuardianTypeNoGroup(CharacterFromID("Billy Brock")' at case "Lucas_sign1" so that you have to talk to Billy Brock, he doesn't initiate dialog himself, which may give Raymond Bouchez a chance to get in first. Or have a quest attribute set by one of the quests to be detected by the other so that it can stay out of the way.

@Pieter Boelen: what's currently wrong with "Leveling.c"? Did it work better in an earlier version (possibly Beta 3.4, as that was the last version reckoned to be good enough for general release; or possibly 5th December, which seemed pretty playable to me) and how hard would it be to pull "Leveling.c" back to that earlier version?
 
What does this do?
Code:
StartQuestMovie(true, false, false);TrackQuestMovie("start","Lucas_ransom_delivery");
It's in "quests_side.c", case "Lucas_ransom_delivery", and if that's what's fouling up the progress of "Girl Won in a Card Game" then I'm going to have to rethink my strategy...
Depending on the true/false use there, that CAN lock every single reload in the location. I've used it for that purpose when you "kill a town guard/item trader" functionality.

@Pieter Boelen: what's currently wrong with "Leveling.c"? Did it work better in an earlier version (possibly Beta 3.4, as that was the last version reckoned to be good enough for general release; or possibly 5th December, which seemed pretty playable to me) and how hard would it be to pull "Leveling.c" back to that earlier version?
It isn't just Leveling.c; it are several files working together.
This is the main issue we've got with it now: Confirmed Bug - Levelling: Skill Progression too Fast | PiratesAhoy!
 
What does this do?
Code:
StartQuestMovie(true, false, false);TrackQuestMovie("start","Lucas_ransom_delivery");
Depending on the true/false use there, that CAN lock every single reload in the location. I've used it for that purpose when you "kill a town guard/item trader" functionality.
What else does it do? What's liable to not work if it's commented out?

Locking reloads isn't a problem here. The tavern only has two. One of them is the room upstairs which is normally locked anyway unless you rent the room, and the other is the front door which "Girl Won in a Card Game" already locked and will subsequently unlock.

Meanwhile, here's plan B. In "quests_common.c", case "gambled_girl_to_FdF", there is 'pchar.quest.gambling_with_girl = "to_FDF"'. In "quests_side.c", split case "Lucas_ransom_start" so that part 1 gives you the money and places the kidnappers, then part 2 sets up the "PChar.quest.Lucas_ransom_deadline.win_condition" and "PChar.quest.Lucas_ransom_delivery.win_condition". At the start of case "Lucas_ransom_delivery", have something like:
Code:
        if(CheckQuestAttribute("gambling_with_girl", "to_FDF")) LAi_QuestDelay("Lucas_ransom_start2", 0.0);
If I'm right, that would take the quest back to the part which sets up the win_conditions, then you can do all the stuff with Virginie and Raymond, leave, go back in and case "Lucas_ransom_delivery" should then activate. When you leave the tavern and speak to Virginie, "pchar.quest.gambling_with_girl" is set to "to_hovernor" so that 'CheckQuestAttribute' ought to fail and not send the quest back to "Lucas_ransom_start2" again.
 
Can't remember by the top of my head. Search for that function name in PROGRAM\QUESTS to see exactly what it does.
I did, it's in "quests_movie.c", and I can't make much sense of it, which is why I asked. ;)

Any comments on "plan B"?

Typo in the stock game code, probably.
Yes, and the thing about typos like that is that the computer couldn't care less whether you spell it "governor", "hovernor" or "xyzzy", just so long as you mis-spell it exactly the same way throughout. Which the author of this quest has indeed done, so you probably don't want to correct it unless you fancy searching for all occurrences of "hovernor" and correcting the lot. :D
 
I did, it's in "quests_movie.c", and I can't make much sense of it, which is why I asked. ;)
If you post the code here, I might be able to tell you. Don't have access to my game files right now.

Yes, and the thing about typos like that is that the computer couldn't care less whether you spell it "governor", "hovernor" or "xyzzy", just so long as you mis-spell it exactly the same way throughout. Which the author of this quest has indeed done, so you probably don't want to correct it unless you fancy searching for all occurrences of "hovernor" and correcting the lot. :D
I have occasionally fixed similar typos, but that is a risky thing to do in case you miss a spot.
 
If you post the code here, I might be able to tell you. Don't have access to my game files right now.
Code:
bool StartQuestMovie(bool noReload, bool noSave, bool lockPlayerCtrl)
{
   Trace("::: QUESTMOVIE: StartQuestMovie func call");// TIH bugtracking
   Event("EventStartQuestMovie", "lll", noReload, noSave, lockPlayerCtrl);
   //Stack level
   int prevLevel = questMovieProcess - 1;
   string level = "L" + questMovieProcess;
   questMovieStack.(level) = "";
   aref stk;
   makearef(stk, questMovieStack.(level));
   //Set current parameters
   stk.noReload = noReload;
   stk.noSave = noSave;
   stk.lock = lockPlayerCtrl;
   //Set parameters
   if(questMovieProcess > 0)
   {
     InterfaceStates.Buttons.Save.enable = noSave;
     if(lockPlayerCtrl != false)
     {
       QuestMovieLockPlayer();
     }else{
       QuestMovieUnLockPlayer();
     }
   }else{
     questMovieOldSaveState = InterfaceStates.Buttons.Save.enable;
     InterfaceStates.Buttons.Save.enable = noSave;
     if(lockPlayerCtrl != false) QuestMovieLockPlayer();
   }
   questMovieProcess = questMovieProcess + 1;
   if (noReload) bQuestDisableSeaEnter = true; // KK
   //Trace("::: QUESTMOVIE: StartQuestMovie func complete");// TIH bugtracking
   return true;
}

And this was plan B:
In "quests_side.c", split case "Lucas_ransom_start" thus:
Code:
    case "Lucas_ransom_start":
       PChar.quest.Lucas = "ransom";

       AddMoneyToCharacter(PChar, 20000);

       ChangeCharacterAddressGroup(CharacterFromID("Billy Brock"), "Falaise_de_fleur_tavern", "goto", "goto3");
       ChangeCharacterAddressGroup(CharacterFromID("Snorri Baldursson"), "Falaise_de_fleur_tavern", "goto", "goto2");
       ChangeCharacterAddressGroup(CharacterFromID("Francis Snake"), "Ransom_house_f2", "goto", "goto1");
       ChangeCharacterAddressGroup(CharacterFromID("Lucas Da Saldanha"), "Ransom_house_f2", "goto", "goto4");
       Locations[FindLocation("Falaise_De_Fleur_location_03")].reload.l12.close_for_night = 0;
       Locations[FindLocation("Falaise_De_Fleur_location_03")].reload.l12.label = "Kidnappers' Hideout";
       Locations[FindLocation("Falaise_de_fleur_tavern")].vcskip = true; // NK

       LAi_QuestDelay("Lucas_ransom_start2", 0.0); // This added to get to the next bit
    break;                                              //   <-- This is the split
                                                             //    <--
    case "Lucas_ransom_start2":   //    <--
       PChar.quest.Lucas_ransom_deadline.win_condition.l1 = "Timer";
       PChar.quest.Lucas_ransom_deadline.win_condition.l1.date.day = GetAddingDataDay(0, 1, 0);
       PChar.quest.Lucas_ransom_deadline.win_condition.l1.date.month = GetAddingDataMonth(0, 1, 0);
       PChar.quest.Lucas_ransom_deadline.win_condition.l1.date.year = GetAddingDataYear(0, 1, 0);
       PChar.quest.Lucas_ransom_deadline.win_condition = "Lucas_ransom_deadline";

       PChar.quest.Lucas_ransom_delivery.win_condition.l1 = "location";
       PChar.quest.Lucas_ransom_delivery.win_condition.l1.character = PChar.id;
       PChar.quest.Lucas_ransom_delivery.win_condition.l1.location = "Falaise_de_fleur_tavern";
       PChar.quest.Lucas_ransom_delivery.win_condition = "Lucas_ransom_delivery";

       //JOURNAL
       AddQuestRecord("Lucas", 5);
     break;

And then in case "Lucas_ransom_delivery", have this:
Code:
if(CheckQuestAttribute("gambling_with_girl", "to_FDF")) LAi_QuestDelay("Lucas_ransom_start2", 0.0);
... so that if "Girl Won in a Card Game" is at that point where you're taking her to St. Pierre tavern, "Missing Son of Spanish Admiral" will loop back to where it sets up the win_conditions, hopefully leaving Virginie free to confront Raymond. You leave the tavern with her, her quest completes, the tavern door inside is unlocked, then you should be able to go back in and trigger "Lucas_ransom_delivery" again, which should now proceed because attribute "gambling_with_girl" isn't "to_FDF" any more.

(Big chunks of code hidden behind "spoiler" tags so that the rest of the post isn't lost in the mess.)
 
Sometimes "quest movies" add black bars at the top/bottom of the screen, such as the opening of Nigel/Artois, but I think that isn't the case here, is it?
Looks like all it does here is to disable all reloads regardless of what location it takes place in.

I know "Virginie" can START in ANY tavern. But can this scene take place in ANY tavern as well?
If it is always Martinique, you could remove the StartQuestMovie call and just lock those locators that need locking when they need locking, I suppose.
 
The scene with Virginie and Raymond is indeed specific to St. Pierre. You can win her by gambling anywhere, but she wants to meet Raymond and he's always at St. Pierre.

Unless you can think of a reason why it won't work, I'm growing more inclined to go for plan B, i.e. have Lucas check if Virginie is about to go to St. Pierre tavern, and if so, loop back to the setting of win_conditions so that it's ready to try again after you've finished with Virginie. That way the flow of both quests is preserved; the entire scene with the kidnappers should merely be delayed until Virginie is out of the way and the tavern is unlocked.
 
Back
Top