• 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!

Unconfirmed Bug Crewmemers at hideout "refuse to trade"?

Basically what the title says, I came to Cozumel hideout and ran into this, every crewmemeber in the interior has this dialogue for some reason

upload_2020-4-13_18-44-24.png
 
I don't think it is a bug. They are not necessarily your crew members, are they? ;)

Please correct me if I am wrong.
 
Update: It appears that Johan Elting Storyline doesn't have the same dialogue problem with the crewmembers in the hideout, and seems fine.

upload_2020-4-14_12-1-35.png
 
It appears that Johan Elting Storyline doesn't have the same dialogue problem with the crewmembers in the hideout, and seems fine.
That helped me find the used dialog files:
KR_crewmember.c
Lair_crewmember.c
Lair_crewmember3.c

All three contain a link to the 'TradeCheck' in the "First time" dialog case.
This is the same function for making traders refuse business with you if you're hostile or have a terrible reputation.
It does quite a bit:
Code:
//find if merch will allow char to trade, based on char's RMRel with merch's
//nation, and char's rep.
bool TradeCheck(ref char, ref merch, bool first)
{
   if (LAi_IsCapturedLocation) return true; // KK
   int pNation = sti(char.nation);
   int mNation = sti(merch.nation);
   int rep = sti(char.reputation);
   float rel = 0.0;
   // PURSEON -->
   if(first)
   {
       rel = GetRMRelation(GetMainCharacter(), mNation);
       if(GetNationRelation(pNation, mNation) < RELATION_ENEMY && pNation != PERSONAL_NATION)       // your flag is NOT hostile to the merchant
       {
           if(rel <= REL_AFTERATTACK)                                                               // but you are flying a false flag!
           {
               if (frnd() < GetChanceDetectFalseFlag() || CheckAttribute(merch,"FalseFlagDetect"))   // checks if the merchant will believe you
               {
                   merch.FalseFlagDetect = true;                                                   // you have been caught and the merchant won't be so trusting next time
               }
               else
               {
                   rel = RelationToRMRelation(GetNationRelation(pNation, mNation))                   // believes your false flag
               }
           }
           else
           {
               DeleteAttribute(merch, "FalseFlagDetect");                                           // you are actually friendly
           }
       }
       else
       {
           if(rel <= REL_WAR)                                                                       // are you at war or not?
           {
               merch.FalseFlagDetect = true;                                                       // merchant KNOWS you are an enemy and remembers this
           }
           else
           {
               DeleteAttribute(merch, "FalseFlagDetect");                                           // you are actually friendly
           }
       }
       merch.traderelation = rel;
   }
   else
   {
       rel = sti(merch.traderelation); // PB: Use the SAME relation for the WHOLE dialog
   }
   // <--PURSEON
   //find loc
   bool strengthcomp;
   int locIdx = FindLoadedLocation();
   if(locIdx<0) return true;
   if( !CheckAttribute(&Locations[locIdx],"townsack") ) return true;

   // PB: Recoded Checks -->

   // -- Town fight strength vs. squadron fight strength --

   // Store/shipyard owner can be intimidated if player has three times more crew than the town has troops
   int ttroops = GetTownNumTroops(Locations[locIdx].townsack);
   int ptroops = GetSquadronCrewQuantity(char);

   if(ptroops > ttroops * 3) strengthcomp = true;

   // -- Actual Checks --

   if(mNation == PIRATE)
   {
       // Pirates don't do business with the navy
       if(ProfessionalNavyNation() == UNKNOWN_NATION)
       {
           // If you aren't hostile with the pirates, they'll always accept you
           if(rel  >  REL_WAR)                                                   return true;
           // If you have no loyalties to any one nation, they'll accept you too
           if(GetLetterOfMarqueQuantity() == 0)                               return true;
       }
   }
   else
   {
       // If you are Hostile with their nation, but you are a Hero
       if(rel <=  REL_WAR         && rep >= TRADEREP_ALL                     )   return true;

       // If you are less than Neutral to their nation, but you are a Horror of the High Seas
       if(rel <  REL_NEUTRAL         && rep <= TRADEREP_MIN                  )   return true;

       // If their nation is less than Hostile to you and you are Matey or better
       if(rel  >  REL_WAR         && rep >= TRADEREP_WAR                     )   return true;

       // If their nation is better than Wary and you are Neutral or better
       if(rel  >= REL_AFTERATTACK && rep >= TRADEREP_NEUTRAL                 )   return true;

       // If their nation is Friendly then they'll trade with you regardless of reputation
       if(rel >= REL_NEUTRAL                                                 ) return true;

       // If their nation is better than Neutral, you are Swindler or better and can intimidate them
       if(rel  >= REL_AMNESTY     && rep >= TRADEREP_STRENGTH && strengthcomp)   return true;

       // You have a Letter of Marque with the nation and have been promoted at least once
       if(GetRank(GetMainCharacter(), mNation) > 0                           )   return true;

       // You are friendly to the pirates, flying a pirate flag and the town is tolerant of pirates
       if(CheckForPirateException(merch)                                     )   return true;
   }

   // PB: Recoded Checks <--

//MAXIMUS -[we are here already, why we can't complete our mission?]->
   if(first && CheckQuestAttribute("generate_trade_quest_progress", "begin") || CheckQuestAttribute("generate_trade_quest_progress",  "failed"))
   {
       if(char.quest.generate_trade_quest_progress.iTradeColony == GetCurrentTownID()) return true;
   }
//MAXIMUS <-[we are here already, why we can't complete our mission?]-
   return false;
}

I assume that is the reason why you ran into this issue.
Shouldn't be storyline-dependent then.

Doesn't seem to make a whole lot of sense though for your own crewmembers.
Not sure why it is there at all. Maybe because the dialog file was copied from elsewhere?

Perhaps the right thing to do is to just remove that code altogether.
For example, find:
Code:
           if(TradeCheck(PChar, NPChar, true)) { // NK
           if(NPChar.quest.meeting == "0")
           {
               d.Text = DLG_TEXT[4] + DLG_TEXT[5];
               Link.l1 = DLG_TEXT[6];
               Link.l1.go = "meeting";
               NPC_Meeting = "1";
           }
           else
           {
               dialog.snd1 = "";
               dialog.snd2 = "";
               dialog.snd3 = "";
               d.Text = RandPhrase(TimeGreeting() + DLG_TEXT[8] + GetMyAddressForm(NPChar, PChar, ADDR_CIVIL, false, false) + " " + DLG_TEXT[9] + DLG_TEXT[10], DLG_TEXT[11] + DLG_TEXT[12], DLG_TEXT[13], &dialog, dialog.snd1, dialog.snd2, dialog.snd3);
               Link.l1 = DLG_TEXT[14];
               Link.l1.go = "Wait_Time";
               Link.l2 = DLG_TEXT[26];
               Link.l2.go = "clothesyou";
               Link.l3 = DLG_TEXT[16];
               Link.l3.go = "exit";
           }
           // NK -->
           }
           else
           {
               dialog.text = DLG_TEXT[27] + GetMyAddressForm(NPChar, PChar, ADDR_CIVIL, false, false) + DLG_TEXT[28];
               Link.l1 = DLG_TEXT[29];
               Link.l1.go = "exit";
           }
           // NK <--
Replace with:
Code:
           if(NPChar.quest.meeting == "0")
           {
               d.Text = DLG_TEXT[4] + DLG_TEXT[5];
               Link.l1 = DLG_TEXT[6];
               Link.l1.go = "meeting";
               NPC_Meeting = "1";
           }
           else
           {
               dialog.snd1 = "";
               dialog.snd2 = "";
               dialog.snd3 = "";
               d.Text = RandPhrase(TimeGreeting() + DLG_TEXT[8] + GetMyAddressForm(NPChar, PChar, ADDR_CIVIL, false, false) + " " + DLG_TEXT[9] + DLG_TEXT[10], DLG_TEXT[11] + DLG_TEXT[12], DLG_TEXT[13], &dialog, dialog.snd1, dialog.snd2, dialog.snd3);
               Link.l1 = DLG_TEXT[14];
               Link.l1.go = "Wait_Time";
               Link.l2 = DLG_TEXT[26];
               Link.l2.go = "clothesyou";
               Link.l3 = DLG_TEXT[16];
               Link.l3.go = "exit";
           }

@Grey Roger and/or @The Nameless Pirate; do you think that makes sense?
 
Makes sense to me.

Though are they your crew members?

If you are on a storyline that they are not yours, then you get the reply that you can't trade with them.

When they are yours, in the Assassin storyline they greet you as their captain.
 
Ah, I always thought that we were walking into someone else's hideout. xD

If it is supposed to be your hideout, then what you said makes perfect sense.
 
Back
Top