• 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 Marie Celeste

nich666

Sailor Apprentice
Hi, Hope someone can help. I have the Build 14 Aug 2018 version which is working superbly, except lately when boarding a surrendered ship, I can't take it over as there is no captain aboard, or anyone else. I looked all round the vessel and it isn't the Marie Celeste so is there a fix for this? I tried save and re-boot into the game but have to give the ship up and load the save before.
Apologies if this is an old problem fixed a long time ago but long searches through the forum throws up a blank for me.
Grrr. The ships that it happens to are the ones I want. Regards, Brian.
 
This has happened once before:
Unconfirmed Bug - No enemy captain on ship!?

We never did find out why. The only conclusion we could reach is that the save was corrupted and, having no older saves to which to return, the player had to start a new game. If you have an older save which does work and which allows you to board surrendered ships, use that.

But August 2018 is now out of date. Though it won't fix this problem (partly because I've never encountered it and I board surrendered ships all the time), the current update fixes a lot of other bugs. You might want to download the whole mod again from here:
Mod Release - Build 14 Beta [Last Update: 18 April 2019]

It's probably the same base installer that you used, as the current installer is dated May 2018. That page contains a link to a more recent update archive though.
 
Hi Grey, Thanks for the speedy reply. I have had a chance to try it out and I think you're right, I had to try quite a lot of back saves that fortunately I still had, until one worked so that boarding a surrendered ship had the captain on board.
Oddly, some let me fight through the decks as normal but reaching the Capt.'s cabin, he's not there? So I had to go to an even earlier save.
Playing this for a couple of years or so, this is the first time this has happened, strange.
I followed your advice also and replaced the RESOURCE and PROGRAM files with the Mod update you suggested but left the Installer as it is dated 18th. April 2019 already.
I opened the Mod files to glance at the Mods to see if they mention missing captain Bug. It's like reading War and Peace, it's so long, I fell asleep...
So if anyone gets this Marie Celeste problem this is a sort of a fix, except we don't know why.
Regards, and thanks again.
 
Oh well, She [Marie], sails again.
After capturing an East Indiaman with my Heavy Brig (fantastic at beating much bigger ships, but lack of crew numbers holds you back), and finding a captain on board to fight, that was the last captain for me.
The next two ships I boarded, now with the East Indiaman, were devoid of anyone so couldn't interact and take them over.

Whatever corrupted messed up the game. The first ship lets you fight through the decks then in the Captains cabin just the cold breakfast and no one else [eerie].
The second ship surrendered so straight to the empty deck which is pointless.
I gave up. Loaded the latest Installer and the game and started again.
All good so far.
Anyway thanks for trying to help, it is irritating when this happens, but in the sunny south of France who am I to complain. Regards.
 
Could this have anything to do with how you treat enemy captains?
The game cycles between a fixed number of captains behind the scenes and normally the slots should be freed up again after a while.
But that might depend on whether they escape, are set free, ransomed or killed.
 
Hi Pieter, (Pie for short?), Thanks for the reply. It could be that, although I go through the routine that if the captain fights you have no option than to kill him, or die in the attempt.
If I see the ship isn't better than mine for cargo/crews etc. I then let the captain go but take off what I want.

[by the way, in real life I have a downer on smokers and tobacco not allowing any in my home, so always dump any tobacco cargo even if I am scrabbling for money];
now that's plain silly, I know, but there you are, someone please tell me the game isn't real life. Hee hee.

If the captain has a valuable cargo or I want to sell the ship to make money, I always accept him as crew if offered to get the ship, although merchant captains rarely fight I then sack them on shore.
Maybe sacking too many is the reason? (I replace them with females).
I don't know but isn't that the way most players go about the ship captures?
In real life i'm quite placid, but have no qualms blowing them off the deck with a pair of Horse pistols if they get shirty.
Anyway, the restarted new game is behaving (so far), having captured a Heavy Brig I am now hunting for an East Indiaman for a change and to take on battleships.

By the way, not related but seeing you are doing Maritime Research, on TV they have just shown a mini sub at the bottom of the Mariana Trench 7 miles down,
not only is there an Eel and a Lungfish swimming past with at all that pressure, it also showed a plastic bag!!!
I think if most of us look in the fridge they will see more plastic than food.
Game problems aren't very high on the list of World worries, but is still annoying. Regards. Brian.
 
I wonder if hiring and then sacking captains might indeed be the reason? Normally, if he doesn't force a duel, I take him prisoner and then either ransom him for gold or release him for reputation. You can only have three prize ships maximum, so I use my own officers to command them. Maybe one of them is a former enemy captain because I didn't have a spare officer at the time when I took his ship, but I don't make a habit of hiring captured captains. So I've been plundering my way around the Caribbean, capturing and selling lots of ships, and have never ran into the problem of the non-appearing captain. The prize ships are sold, I get my officers back, then I go and do it again.
 
A good point, you might have something there. I'll try locking them in the hold then release him when in dock, as my reputation isn't fantastic it would help.
 
Another thing; unless you're hiring the captain because you have no other officer available to command his ship, you're probably best to take him prisoner, then hire him from the hold. That way you get to see his stats, and in particular his reputation. If you're good ("Bloke", "Matey", "Dashing", "Hero") and he's evil ("Rascal", "Swindler", "Bloody Terror", "Horror of the High Seas"), or vice versa, then he'll try to start a mutiny. "Neutral" will work with anyone, otherwise make sure he's the same side of the scale as you.
 
Right, good advice but I have a string of officers to choose from so that's no problem. I think i'm only just a 'Bloke' bordering and dipping into 'Rascal' and certainly not 'Dashing Hero' except in real life.
When I capture a ship the first thing I do is pay to get the crew to 'Normal' from usually 'Treacherous' so there is no mutiny.
If you're married as I was, I have noticed it sometimes works on the wife... Regards.
 
@Pieter Boelen:
If you release a captive captain, it's done in dialog file "Prisoned_dialog.c". If he's standing up, it does this:
Code:
                   LAi_SetActorType(NPChar);
                   LAi_ActorRunToLocation(NPChar, "reload", LAi_FindRandomLocator("reload"), "None", "", "", "", -1);
                   RemovePassenger(PChar,NPChar);
                   DeleteAttribute(NPChar,"prisoned");
                   DeleteAttribute(NPChar,"standing");
                   NPChar.ClearUponExit = true; // PB: So this guy is cleared upon exit
If he's sitting down then it triggers quest case "Surrendered_Captain_Run", defined in "quests_common.c", which does this:
Code:
           if(CheckAttribute(PChar,"prisonerIDX"))
           {
               NPChar = GetCharacter(sti(PChar.prisonerIDX));
               LAi_ActorRunToLocation(NPChar, "reload", LAi_FindRandomLocator("reload"), "None", "reload", "", "", -1);
               RemovePassenger(PChar,NPChar);
               DeleteAttribute(NPChar,"prisoned");
               DeleteAttribute(PChar,"prisonerIDX");
               NPChar.ClearUponExit = true; // PB: So this guy is cleared upon exit
           }
That attribute "ClearUponExit" appears to be your work and is handled in function 'LogoffCharactersFromLocation', defined in "characters_login.c":
Code:
       if (CheckAttribute(chr, "ClearUponExit")) ClearCharacter(chr); // PB: Erase any character marked to be erased
But I can't see that attribute being set if the captain is executed, or if you fire an officer. If it's added for firing, we'd need to be careful - we don't want to wipe quest officers who, after being fired, might return to a home location so you can find them again. Adding it for executing should be safe, if he's executed then he should be gone for good!
 
Right, good advice but I have a string of officers to choose from so that's no problem. I think i'm only just a 'Bloke' bordering and dipping into 'Rascal' and certainly not 'Dashing Hero' except in real life.
When I capture a ship the first thing I do is pay to get the crew to 'Normal' from usually 'Treacherous' so there is no mutiny.
Paying them won't work unless you keep checking the ship's morale each day, exiting worldmap if you're using it. A captain whose reputation is opposed to yours will keep dropping the ship's morale and will cause a mutiny unless you spot it, pay the crew again, and keep paying them until you get to port and sell the ship. If you're alternating between "Bloke" (good) and "Rascal" (evil) then all your prize captains will do this, though with your reputation at those middling levels, they'll probably do it relatively slowly.
 
Hi Grey, Just had a look, i'm a 'Neutral' so between the Devil and the deep blue sea. It seems to be enough to reach any port without mutiny.
Incidentally I am playing as a Dutchman as they are fighting everyone except the English, Portuguese and can use Pirate ports, so plenty of angst about.
 
@Pieter Boelen :
But I can't see that attribute being set if the captain is executed, or if you fire an officer. If it's added for firing, we'd need to be careful - we don't want to wipe quest officers who, after being fired, might return to a home location so you can find them again. Adding it for executing should be safe, if he's executed then he should be gone for good!
I wonder if these would help?

In "quests_common.c", cases "LandEnc_OfficerFired", "LandEnc_OfficerFiredGood" and "LandEnc_OfficerFiredGoodPayed":
Code:
if (HasSubStr(GetAttribute(NPChar,"ID"), "Enc_Officer") && !CheckAttribute(NPChar,"homelocation")) NPChar.ClearUponExit = true;
If I understand the purpose of 'NPChar.ClearUponExit' correctly, that should wipe an officer who has just been fired, provided he's a random officer rather than a named quest officer, and has no "homelocation" defined to allow him to reappear.

In "Prisoned_dialog.c", cases "kill_prisoner", "Exit_hanged" and "Exit_sharks", just add:
Code:
NPChar.ClearUponExit = true;
If he's being duelled, hanged or thrown to the sharks, it doesn't really matter who he is, he shouldn't be returning during this game!
 
I think enemy captains/prisoners usually have a different ID than "Enc_Officer".
But other than that, it makes sense to me. Worth a try, I'd say. :onya

(Also... Be prepared for unexpected side-effects. It's difficult to think through all eventualities in advance...)
 
Enemy captains and prisoners can have whatever ID they like; if they're being fed to the sharks then their ID isn't being checked by the code to be added in "Prisoned_dialog.c". But if you hire a prisoner then he goes through 'FindFreeRandomOfficer', which clones him into an "Enc_Officer". So I reckon anyone you can fire is either an "Enc_Officer" or a named quest officer, and that's why the code for firing an officer in "quests_common.c" has the ID check.
 
In that case though, shouldn't the clearing be (also) done on the original character after the cloning process?
 
See also:
Unconfirmed Bug - No enemy captain on ship!?

In particular, post #28:
Yes. And it gets weird.

As @UnwantedNewborn says, if I load up one of the quicksave games which has the surrendered ship in front of me, and board the ship, no captain appears. If I first go to the hold and ransom a prisoner, then board the ship, the captain is there. I take him prisoner, go looking for something else to capture (not easy when you're in a 3rd rate Centaure class with no grapeshot, which means one salvo is liable to blow the target ship out of the water :D), and that ship surrenders, its captain fails to appear as well. This, incidentally, confirms that the issue is nothing to do with the "Napitan" model.

Reload the quicksave. Instead of ransoming a prisoner, I go to the captain's cabin, talk to an officer, and fire him. This should also reduce the number of passengers by 1. When I board the surrendered ship, the enemy captain doesn't appear.
That tends to point to the problem being with fired officers.

There's a savegame in post #5 of that thread, so I'll have a look at that, do some digging, try the fix which I suggested for "quests_common.c" to clear fired officer, and see if that helps. This may take a while...
 
In that case though, shouldn't the clearing be (also) done on the original character after the cloning process?
It should be. Apparently it isn't.

I put this into "console.c":
Code:
   for(n=0; n<=CABINCAPTAINS_MAX; n++)
   {
       i = GetCharacterIndex("Enc_CabinCaptain_" + n);
       if(i==-1) traceandlog("Enc_CabinCaptain_" + n + ": no character index");
       else
       {
           ch = GetCharacter(i);
           traceandlog("Enc_CabinCaptain_" + n + ": name = '" + GetMySimpleName(ch) + "', location = '" + ch.location + "', bAllies = " + bAllies(ch));
           if(GetAttribute(ch,"chr_ai.group")==LAI_GROUP_PLAYER) traceandlog("Character is in player AI group");
       }
   }
   i = FindFreeCabinCaptain();
   if(i == -1) traceandlog("No free cabins");
   else traceandlog("'" + Characters[i].id + "' is free");
Then I ran it, first on my own game ("Tales of a Sea Hawk", main story completed, doing a bit of freeplay) and then on the savegame from the previous thread. Attached is the resulting "compile.log" - as I didn't quit the game before reloading the other savegame, the results from both sweeps are in there.

Some of the Enc_CabinCaptains certainly shouldn't be there. Fortún Barrio and Nuño Luengo are ex-prisoners whom I hired as officers. Enc_CabinCaptain_9 is Silehard, who isn't a prisoner any more because I handed him over to the Port Royale governor, but he's a one-off special case. Some of the Enc_CabinCaptains really are still prisoners. And a lot are showing as not being 'bAllies', which is fine because function 'FindFreeCabinCaptain()' will reuse those slots; in this case, it detected that 'Enc_CabinCaptain_12' is free, which is indeed the first one down the list that isn't 'bAllies'.

Then scroll down to find the results from the other savegame. All Enc_CabinCaptains are marked as 'bAllies' because they're still in LAI_GROUP_PLAYER, so 'FindFreeCabinCaptain()' can't find a free slot.

So the long term solution is probably to make 'TIH_PrisonerHiredAsOfficerProcess' clear the original prisoner after he's been cloned into an officer; and as a short term fix for anyone who runs into this problem, I could probably knock up some console code to scan through all Enc_CabinCaptains and wipe them if they're not genuine prisoners or passengers.
 

Attachments

  • compile.log
    11.1 KB · Views: 370
Back
Top