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

Annoying problem at shipyard

Peter Blood

Privateer
I have to go to my friend, Owen McDory at the Oxbay shipyard, but despite our friendship, he refuses to talk to me simply because I am horror of the high seas! I am an English Ensign after doing secondary quests for Silheard, I have level two comerce skill, but he still won't talk to me! Is there a way this can be fixed? Whenever you want the service of a shipwright, he refuses to help you, but you can still talk to him if he is a quest character? That is my suggestion.
 
Most quest characters is doesnt matter about your rep... you need to get your commerce higher than 5 or your rep higher than swindler for him to talk to you...

I dont think we should change it cause I wouldnt talk to someone just cause they needed me if they were a known ....... :rofl
 
If you've got commerce over 5, then they'll talk again but they'll have you pay more than if you're a nice lad.
 
We really should make being a horror an advantage, say in pirate places and places without a good soldier/fort to defend them... where you should get a discount ;)
 
Indeed; that'd be a good idea. Probably easy to realize too. Find the shipyard and store owner dialogs from any pirate location and swap the reputation to check from "if below Swindler, don't talk to you unless your commerce is greater than 5" to "if above Matey, don't talk to you unless your commerce is greater than 5". :rofl
 
I am at lvl 6 commerce now, he will talk to me, but not about the quest! My only two options are to say....

"Get out Nathaniel, before I call the guards!"
________________________________

"Very Well."

"Lets keep this a secret, why don't you make some repairs for me, the soldiers dont have to know!"
 
Crap; that doesn't help! You're absolutely right though. Looking at the code, that's what it's programmed to do. :modding

These are the checks being performed before you are or are not allows to go into the regular talk with a shipyard or store owner:
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 mNation = sti(merch.nation);
int rep = sti(char.reputation);
float rel = 0.0;
// KK -->
if (ENABLE_FLAGS == 0)
rel = GetRMRelation(char, mNation);
else
rel = GetActualRMRelation(mNation); // PB: was GetFlagRMRelation
// <-- KK
//find loc
bool strengthcomp;
int locIdx = FindLoadedLocation();
if(locIdx<0) return true;
if( !CheckAttribute(&Locations[locIdx],"townsack") ) return true;

//town fight strength vs. squadron fight strength.
int ttroops = GetTownNumTroops(Locations[locIdx].townsack);
int ptroops = GetSquadronCrewQuantity(char);
if(ttroops > ptroops * 4) strengthcomp = true;
if(ptroops > ttroops * 3) strengthcomp = true;

//actual checks
if(mNation == PIRATE) return true;
if(rel > REL_NEUTRAL && rep > TRADEREP_MIN) return true;
if(rel > REL_WAR  && rep > TRADEREP_NEUTRAL) return true;
if(rep > TRADEREP_WAR && strengthcomp && rep > TRADEREP_STRENGTH) return true;
if(rep > TRADEREP_ALL) return true;
//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(CheckQuestAttribute("generate_trade_quest.iTradeNation", GetCurrentLocationNation()) && char.quest.generate_trade_quest.iTradeColony == GetCurrentTownID()) return true;
}
//MAXIMUS <-[we are here already, why we can't complete our mission?]-
return false;
}
 
Looking at that code, it seems a bit confused to me to a certain extent.

This means you can ONLY get into the regular dialog IF:
- If the shipyard or store owner is a pirate (they don't care)
- If you are neutral or friendly with their nation AND your reputation is above Horror of the High Seas
- If you are at war with their nation AND your reputation is Rascal or better
- If your reputation is Matey or better and you've got "a lot of crewmembers" and your reputation is above Swindler
^ Why is there TWO reputation checks in here???

"A lot of crewmembers" is defined as being true IF:
- The town has more than 4 times the number of crewmembers of your fleet
- Your fleet has more than 3 times the number of troops as the town
^ Doesn't the one check here negate the other one? This looks very confused!

- Always if your reputation is Hero
 
base yourself around the pirate bases until you've managed to increase your reputation enough. they should give you anything you need until then. just be sure to have a hostile nation to gather loot and shipwreck survivors from, it'll help immensely.
 
Looks like you need to get your reputation up only a small bit to Bloody Terror and then he'll talk like normal. If you want, I can also tell you how to change the above code so he won't care anymore.

Ideally, I'd like to change the above code to something that actually makes sense. Does anyone have any good ideas on when they should and should not be willing to talk normally to you?
 
I like pirates not talking to you if your to much of a goody goody...

If your commerce is 5+ then you should be able to trade at a penelty (except maybe horror of high seas for normal, and hero for pirate)

maybe if your at war with a nation neutral and above... and if your allied/neutral, bloody terror (or whatever the second lowest is) they wont trade but will if it is higher ;)
 
Does this sound if it makes more sense?
Also, feel free to provide further suggestions:
- If you are Hostile to their nation and you're a Hero
- If their nation is Wary or you and you're Neutral or better
(no trading with untrustworthy enemies)
- If you are Neutral with their nation and are a Rascal or better
(yes to trading with untrustworthy people who are not your enemy)
- If you are Neutral with their nation and you are below Rascal and you've got a lot of crew to intimidate them
- If you have a rank with their nation, whatever your reputation
 
How about we try this one?
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 mNation = sti(merch.nation);
int rep = sti(char.reputation);
float rel = 0.0;
// KK -->
if (ENABLE_FLAGS == 0)
rel = GetRMRelation(char, mNation);
else
rel = GetActualRMRelation(mNation); // PB: was GetFlagRMRelation
// <-- KK
//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 you are Hostile with their nation, but you are a Hero
if(rel <= REL_WAR         && rep >  TRADEREP_ALL                     ) return true ;

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

// If their nation is Neutral and you are a Swindler or better
if(rel <  REL_NEUTRAL     && rep >= TRADEREP_STRENGTH                ) return true ;

// If their nation is Neutral, you are worse than a Swindler, but you can intimidate them
if(rel <  REL_NEUTRAL     && 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 ;

// Pirates will not talk to you if you are too much of a nice guy
if(mNation == PIRATE      && rep >  TRADEREP_NEUTRAL                 ) return false;

// 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(CheckQuestAttribute("generate_trade_quest.iTradeNation", GetCurrentLocationNation()) && char.quest.generate_trade_quest.iTradeColony == GetCurrentTownID()) return true;
}
//MAXIMUS <-[we are here already, why we can't complete our mission?]-
return false;
}
This replaces the existing function in PROGRAM\Characters\CharacterUtilite.c .
TRADEREP_MIN and TRADEREP_WAR are no longer used.

If your reputation is Hero, you can talk to store/shipyard owners if you are Hostile to their nation
If your reputation is Neutral or above, you can talk to store/shipyard owners if their nation is Wary or better
If your reputation is Swindler or above, you can talk to store/shipyard owners if their nation is Neutral
If your reputation is below Swindler, you can talk to store/shipyard owners if you've got enough crew to intimidate them (= 3x more crew than the town has troops)
If you've got a rank with their nation, you can always talk to store/shipyard owners
Pirate shipyard owners will not talk to you if your reputation is above Neutral

This is all untested, but worth a try. Test reports and further suggestions are welcome!
 
Please at least stick it in your code somewhere to prevent it from ending up lost. :?
 
Back
Top