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

Need Help Modifying Boarding Camera/Collisions?

Fleebusia

Sailor Apprentice
Are there perhaps any tweaks for the Boarding/Abordage camera that increase the maximum perpendicular viewing angle?

Something that annoys me greatly is that the boarding camera is very restrictive. On large decks I can't move the camera on a vertical axis and can't see what is happening on each deck level.

Similarly, is it possible to reduce collisions on crew members during Abordage? It seems I spend most of the time trying to squeeze into a fight where my crew constantly block me. Perhaps even a setting that delays the spawn of friendly crew so I can actually get to the fight before my crew pile up and block every pathway?

I noticed that the smaller the deck the more casualties I have simply because only one crew will fit into a pathway, blocking me and everyone else. Yesterday I boarded a small ship with 52 crew against my 300, I lost 60 men despite having Sea dog fighters, 3 fighter officers and all the Boarding perks.. Meanwhile I can often board large ships with the same crew and kill 300 enemy with hardly any losses.
 
Last edited:
Probably a better way to phrase the question is:

Is it possible to switch the camera modes so that Boarding uses the same camera as normal 3rd person fight mode?

So far I have tried commenting out "Locations[n].lockCamAngle = 0.4;" in Boarding.c for each deck type, but apparently that wasn't it.
 
Well after much pulling of hairs the best I could come up with was to enable a free cam switch in Locations_camera.c - Annoyingly it only works if not in combat mode. So you have to sheath your weapon to look around in free cam mode.

if(locCameraEnableFree == true) return;


Curiously if you comment out the following it puts you in a quasi-free cam mode. You can both look in free cam and fight by toggling Special camera mode (CTRL) but it's incredibly cumbersome as mouse buttons keep resetting the free cam angle, as does A and D keys.

string controlName = GetEventData();
if(controlName != "ChrCamCameraSwitch") return;

What I don't understand is there doesn't appear to be a definition of what sort of control mode the boarding scene uses. I would have thought its "PrimaryLand" but in that mode the vertical axis is enabled, such is evident when you transition from the Deck to the cabin fight scene.

There is something about the Boarding scene in particular that prohibits use of vertical mouse axis. Something not defined in init_pc.c perhaps? I'm also inclined to think it's some kind of locational variable found in that very file.

Well at least I can look in free cam with my weapon sheathed. It's a start lol.
 
I tried another route but bumped into an equally mysterious problem.

I kept the cam toggle on and tried mapping a cam switch to Fight mode. The strange part is it shows up as mappable in Fightmode options but only from the main menu and disappears once a game is loaded.

CI_CreateAndSetControls( "FightModeControls", "ChrCamCameraSwitch", CI_GetKeyCode("VK_TAB"), 0, true );
MapControlToGroup("ChrCamCameraSwitch","FightModeControls");

controls.fightmodecontrols.ChrCamCameraSwitch=vk_tab
controls.fightmodecontrols.ChrCamCameraSwitch.state=0

Tried mapping it to lots of things but the keybind does not work.
 
Well I still haven't found a solution for the boarding camera but I have discovered a nice little hack to make boarding less retarded, that is to say having more room to fight and more pathfinding options for crew. It's by no means an elegant solution but it gets the job done. I'm filing it under a placeholder solution for now.

Prior to this I had already modified the boarding files, both Boarding.c files where I switched/duplicated boarding locations for each boarding event, which as far as I can tell had no effect at all. Perhaps a new game is required for that I don't know. This is the code for reference:

//ID
Locations[n].id = "Deck_Near_Ship_Medium"; // выслать туда шлюпку
Locations[n].id.label = "Boarding deck";
//Info
Locations[n].image = "loading\sea.tga";
//Sound
Locations[n].type = "residence";
Locations[n].boarding = "true";
//Locations[n].lockCamAngle = 0.4;
//Locations[n].camshuttle = 1;
//Models
//Always
Locations[n].filespath.models = "locations\decks\deckBig";
Locations[n].models.always.deckMedium = "deckBig";
Locations[n].models.always.locators = "deckBig_locators";
//Day
locations[n].models.day.charactersPatch = "deckBig_patch";
Locations[n].models.day.deckMediumFonarsDay = "deckBig_fd";
//Night
locations[n].models.night.charactersPatch = "deckBig_patch";
Locations[n].models.night.deckMediumFonarsNight= "deckBig_fn";
//Environment
locations[n].environment.weather = "true";
locations[n].environment.sea = "true";
//Reload map
LAi_LocationFightDisable(&Locations[n], true);
n = n + 1;

//ID
Locations[n].id = "Deck_Near_Ship_Big"; // выслать туда шлюпку
Locations[n].id.label = "Boarding deck";
//Info
Locations[n].image = "loading\sea.tga";
//Sound
Locations[n].type = "residence";
Locations[n].boarding = "true";
Locations[n].lockCamAngle = 0.4;
Locations[n].camshuttle = 1;
//Models
//Always
Locations[n].filespath.models = "locations\decks\deckBig";
Locations[n].models.always.deckBig = "deckBig";
Locations[n].models.always.locators = "deckBig_locators";
//Day
locations[n].models.day.charactersPatch = "deckBig_patch";
Locations[n].models.day.deckBigFonarsDay = "deckBig_fd";
//Night
locations[n].models.night.charactersPatch = "deckBig_patch";
Locations[n].models.night.deckMediumBigNight= "deckBig_fn";
//Environment
locations[n].environment.weather = "true";
locations[n].environment.sea = "true";
//Reload map
LAi_LocationFightDisable(&Locations[n], true);
n = n + 1;

Locations[n].id = "Deck_Near_Ship_Low"; // выслать туда шлюпку
Locations[n].id.label = "Boarding deck";
//Info
Locations[n].image = "loading\sea.tga";
//Sound
Locations[n].type = "residence";
Locations[n].boarding = "true";
//Locations[n].lockCamAngle = 0.4;
//Locations[n].camshuttle = 1;
//Models
//Always
Locations[n].filespath.models = "locations\decks\deckBig";
Locations[n].models.always.deckLow = "deckBig";
Locations[n].models.always.locators = "deckBig_locators";
//Day
locations[n].models.day.charactersPatch = "deckBig_patch";
Locations[n].models.day.deckBigFonarsDay = "deckBig_fd";
//Night
locations[n].models.night.charactersPatch = "deckBig_patch";
Locations[n].models.night.deckMediumBigNight= "deckBig_fn";
//Environment
locations[n].environment.weather = "true";
locations[n].environment.sea = "true";
//Reload map
LAi_LocationFightDisable(&Locations[n], true);
n = n + 1;

////////////////////////////////////////////////////////////
/// Корабельная палуба для карта - море
////////////////////////////////////////////////////////////
Locations[n].id = "Ship_deck_Medium";
Locations[n].image = "loading\sea.tga";
locations[n].id.label = "Boarding deck";
//Sound
Locations[n].type = "deck";
// нельзя, иначе нет моря Locations[n].boarding = "true";
//Locations[n].lockCamAngle = 0.4;
//Locations[n].camshuttle = 1;
//Models
//Always
Locations[n].filespath.models = "locations\decks\deckBig";
Locations[n].models.always.deckMedium = "deckBig";
Locations[n].models.always.locators = "deckBig_locators";
//Day
locations[n].models.day.charactersPatch = "deckBig_patch";
Locations[n].models.day.deckMediumFonarsDay = "deckBig_fd";
//Night
locations[n].models.night.charactersPatch = "deckBig_patch";
Locations[n].models.night.deckMediumFonarsNight= "deckBig_fn";
//Environment
locations[n].environment.weather = "true";
locations[n].environment.sea = "true";

locations[n].box1 = Items_MakeTime(0, 0, 1, 2003);
locations[n].box2 = Items_MakeTime(0, 0, 1, 2003);
locations[n].box3 = Items_MakeTime(0, 0, 1, 2003);
locations[n].box4 = Items_MakeTime(0, 0, 1, 2003);
n = n + 1;
///////////////////////////////
Locations[n].id = "Ship_deck_Big";
Locations[n].image = "loading\sea.tga";
locations[n].id.label = "Boarding deck";
//Sound
Locations[n].type = "deck";
//Locations[n].lockCamAngle = 0.4;
//Locations[n].camshuttle = 1;
//Models
//Always
Locations[n].filespath.models = "locations\decks\deckBig";
Locations[n].models.always.deckBig = "deckBig";
Locations[n].models.always.locators = "deckBig_locators";
//Day
locations[n].models.day.charactersPatch = "deckBig_patch";
Locations[n].models.day.deckBigFonarsDay = "deckBig_fd";
//Night
locations[n].models.night.charactersPatch = "deckBig_patch";
Locations[n].models.night.deckMediumBigNight= "deckBig_fn";
//Environment
locations[n].environment.weather = "true";
locations[n].environment.sea = "true";

locations[n].box1 = Items_MakeTime(0, 0, 1, 2003);
locations[n].box2 = Items_MakeTime(0, 0, 1, 2003);
locations[n].box3 = Items_MakeTime(0, 0, 1, 2003);
locations[n].box4 = Items_MakeTime(0, 0, 1, 2003);
n = n + 1;
///////////////////////
Locations[n].id = "Ship_deck_Low";
Locations[n].image = "loading\sea.tga";
locations[n].id.label = "Boarding deck";
//Sound
Locations[n].type = "deck";
//Locations[n].lockCamAngle = 0.4;
//Locations[n].camshuttle = 1;
//Models
//Always
Locations[n].filespath.models = "locations\decks\deckBig";
Locations[n].models.always.deckLow = "deckBig";
Locations[n].models.always.locators = "deckBig_locators";
//Day
locations[n].models.day.charactersPatch = "deckBig_patch";
Locations[n].models.day.deckBigFonarsDay = "deckBig_fd";
//Night
locations[n].models.night.charactersPatch = "deckBig_patch";
Locations[n].models.night.deckMediumBigNight= "deckBig_fn";
//Environment
locations[n].environment.weather = "true";
locations[n].environment.sea = "true";

locations[n].box1 = Items_MakeTime(0, 0, 1, 2003);
locations[n].box2 = Items_MakeTime(0, 0, 1, 2003);
locations[n].box3 = Items_MakeTime(0, 0, 1, 2003);
locations[n].box4 = Items_MakeTime(0, 0, 1, 2003);
n = n + 1;

// палубы для всех по типам boal 03.01.05 ------------------------------------------------------->
//ID
Locations[n].id = "BOARDING_SMALL_DECK";
locations[n].id.label = "Boarding deck";
//Info
Locations[n].type = "deck_fight";
Locations[n].filespath.models = "locations\decks\deckMediumVSBig";
Locations[n].image = "loading\Boarding.tga";

//Locations[n].lockCamAngle = 0.4;
//Locations[n].camshuttle = 1;
//Models
//Always
Locations[n].models.always.deckLowVSMedium = "deckMediumVSBig";
Locations[n].models.always.locators = "deckMediumVSBig_locators";
//Day
locations[n].models.day.charactersPatch = "deckMediumVSBig_patch";
Locations[n].models.day.deckBigFonarsDay = "deckMediumVSBig_fd";
//Night
locations[n].models.night.charactersPatch = "deckMediumVSBig_patch";
Locations[n].models.night.deckMediumBigNight= "deckMediumVSBig_fn";
//Environment
locations[n].environment.weather = "true";
locations[n].environment.sea = "true";

Locations[n].boarding = "true";
Locations[n].boarding.locatorNum = 13;
Locations[n].boarding.nextdeck = "";
Locations[n].UpDeckType = true;

n = n + 1;

//ID
Locations[n].id = "BOARDING_MEDIUM_DECK";
locations[n].id.label = "Boarding deck";
//Info
Locations[n].type = "deck_fight";
Locations[n].filespath.models = "locations\decks\deckMediumVSBig";
Locations[n].image = "loading\Boarding.tga";

//Locations[n].lockCamAngle = 0.4;
//Locations[n].camshuttle = 1;
//Models
//Always
Locations[n].models.always.deckLowVSBig = "deckMediumVSBig";
Locations[n].models.always.locators = "deckMediumVSBig_locators";
//Day
locations[n].models.day.charactersPatch = "deckMediumVSBig_patch";
Locations[n].models.day.deckBigFonarsDay = "deckMediumVSBig_fd";
//Night
locations[n].models.night.charactersPatch = "deckMediumVSBig_patch";
Locations[n].models.night.deckMediumBigNigh = "deckMediumVSBig_fn";
//Environment
locations[n].environment.weather = "true";
locations[n].environment.sea = "true";

Locations[n].boarding = "true";
Locations[n].boarding.locatorNum = 13;
Locations[n].boarding.nextdeck = "";
Locations[n].UpDeckType = true;

n = n + 1;

//ID
Locations[n].id = "BOARDING_BIG_DECK";
locations[n].id.label = "Boarding deck";
//Info
Locations[n].type = "deck_fight";
Locations[n].filespath.models = "locations\decks\deckMediumVSBig";
Locations[n].image = "loading\Boarding.tga";

//Locations[n].lockCamAngle = 0.4;
//Locations[n].camshuttle = 1;
//Models
//Always
Locations[n].models.always.deckMediumVSBig = "deckMediumVSBig";
Locations[n].models.always.locators = "deckMediumVSBig_locators";
//Day
locations[n].models.day.charactersPatch = "deckMediumVSBig_patch";
Locations[n].models.day.deckFonarsDay = "deckMediumVSBig_fd";
//Night
locations[n].models.night.charactersPatch = "deckMediumVSBig_patch";
Locations[n].models.night.deckFonarsNigh = "deckMediumVSBig_fn";
//Environment
locations[n].environment.weather = "true";
locations[n].environment.sea = "true";

Locations[n].boarding = "true";
Locations[n].boarding.locatorNum = 13;
Locations[n].boarding.nextdeck = "";
Locations[n].UpDeckType = true;

n = n + 1;

////////////////////
return n;
}

Then I decided to attack the issue with blunt force trauma by switching the deck models and locators which actually works. By "works" I mean to say that now it's impossible to get those tiny cramped deck fights where only one crew can squeeze through. It makes it so each boarding encounter is at minimum a Medium vs Big boarding scene.

In RESOURCE\MODELS\Locations\decks

Copy the folder DeckMediumVSBig somewhere. Now open the DeckLowVSBig in the game directory and copy paste the file names of the following files in this folder and overwrite the ones in the DeckMediumVSBig (the copied folder). Then when you are done copy those renamed files into DeckLowVSBig. Repeat the process for deckLowVSMedium.

These seem to be the bare essential files to get the scenes replaced:

Deck.GM (the main GM file)
Deck_fd.gm
Deck_fn.gm
DeckLocatrors.gm
DeckPatch.ptc

----
You will likely want to do this with the other files for a more completed effect. But these files seem to be the minimum you will need to have functioning interchanged boarding decks. Have not had a chance to test this thoroughly so use at own risk. I would advise making backups of those folders just in case.

So with this ham-fisted tweak you will have nice spacious decks to fight on regardless of what the ship matchup is. No more losing 200/400 crew against 50 enemy because only one guy can actually get into the fight. And no more standing there sucking on your thumb because there is no room for you to get into the fight.
 
Last edited:
Something that annoys me greatly is that the boarding camera is very restrictive. On large decks I can't move the camera on a vertical axis and can't see what is happening on each deck level.
If I recall, that is done to avoid the player seeing that the location models are truncated in height.
 
If I recall, that is done to avoid the player seeing that the location models are truncated in height.
Hmm, I actually didn't notice this at all when looking through free cam. Perhaps I just wasn't looking hard enough lol. Either way it's incredibly frustrating to be deprived of such basic player control. Its still driving me mad. From a gameplay perspective those boarding scenes are what I would consider one of the worst atrocities ever committed in game development history.

I would gladly accept some help with resolving that from such a prolific modder/coder :)
 
Last edited:
Back
Top