Really I would just remove them from immigration screen and keep them in the spice route.
It makes sense that a major commercial port would have ships for sale, maybe their price needs to be increased.
but they can be rushed at home and bought at the spice route, so really I think they are jsut unnecessary in the immigration screen and fit better with the spice route screen.
This makes sense. The only thing is the price to "rush" is a bit higher than the purchase price. However, I just tested things. If you have enough of the required materials such as 147 lumber and 30 tools the price to rush a Coastal Merchant is actually cheaper. So, maybe there is no imbalance here. Errr, except you lose the profit of lumber and tools.
Anyway, yes, this can be fixed by changing <iEuropeCost>-1000</iEuropeCost> to the -1000 or just -1.
The easy generic fix would be to only allow buying units using the same domain as the trade screen in question. DOMAIN_LAND should be possible to buy everywhere.
Writing it this generic will help if we add more domain types in the future.
Yep, except Immigration is not a "Trade Screen" with a domain. Anyway, I have added code to the Immigration.py to prevent sea units from being purchased there. Perhaps this should be made actually moddable where we have a global define to determine if sea units can be purchased there. Or, add iImmigationScreen price to UnitInfos.xml
I have tracked down a few of the other bugs...
The problem with Inventors not being able to build an Tinker's House is because they have no free building assigned in UnitInfos.xml. I added Tinker's House and it works fine now.
We just need to add <bisNoneTradeable>1</bisNoneTradeable> to all Techs that are not Tradeable such as Anarchy.
I have added code to so that when a unit Converts to another unit its promotions checks for bCivilian promotions and it does not give those to the new unit. The New unit of course can have its own bCivilian promotions.
bCivilian promotions at the moment are given as free promotions when the unit is first created. If we make a system were Civilians can actually gain promotions this will need to be changed as come Civilian promotions should be transferable. We should then call them bInnate Promotions, meaning they are specifically for that Unit and will not transfer.
The "Ships Waiting in Europe" message, well I looked over it and the code originates in Python and I wasn't sure how to address this. However, the thought just came to mind that I can check the units getUnitTradeMarket() and perhaps use that to tell what trade screen the unit is in and go to the correct screen. However, I haven't found the code yet that pulls up the screen.

So, we may have to write our own code.
The code in question is in CvAdvisorUtils.py:
if (player.countNumTravelUnits(UnitTravelStates.UNIT_TRAVEL_STATE_IN_EUROPE, DomainTypes.DOMAIN_SEA)
We may can change countNumTravelUnits to look for the trade screen as well.