I could always make bridges just another type of road. So boats couldn't traverse them at all. But that wouldn't be as nice from a map design point of view
EDIT: I think I should explain the game mechanic and internal data structures a bit to make it easier to see why it would be hard to add something like that.
Basically,
this file contains all the information about all the elements in the game. All tiles, all units, weapons, armors... it's all there. For example you can see that for any given Terrain I have six bits of information: id number, name, default defense bonus, unit classes it can build, unit classes it can repair and flags (like capturable or fund-producing). Both the server and the client get this information. In addition to that I have
another file that tells the client which part of the sprite sheet corresponds to what sprite, just simple x/y coordinates for any terrain id-subtype-owner or unit type id-owner and so on combos. Other than these two files, there's no code that differs for any of the units or tiles. The code gets the current situation and those files as input and produces the wanted output.
I don't have a giant if-structure in my code to see how a specific unit moves in a specific terrain for instance. I have generic functions (like
this) that rely on data about the game elemets to differentiate the result. This is why I can't have a "if terrain is water" type of conditions, because it would break the generic nature of the code and essentially hard code that terrain id to be water. The renderer simply goes through the tiles, checks their type/subtype/owner, picks the correct sprite sheet coordinates, and draws the tile. If the tile has a unit, draws the unit too the same way. Done.
You can see why adding complexity to a highly generalized system like this could be problematic. This system works well for the intended game, but isn't really flexible for exceptional behavior. The server for instance has no idea how the game is represented to the player. It only knows there's a type 3 unit owned by player 1 in terrain type 0 subtype 2 owned by nobody located in (3, 4) and stuff like that. All the rendering related stuff is in the client, which could potentially make exceptions like the one you're suggesting, but since it really adds nothing to the game I'm a little hesitant to use my time making exceptions to beautifully generic code