Computer memory is divided into 'bytes', which are 8 'bits', and each 'bit' can be 0 or 1. A byte can have 256 values, either 0 to 255, or -128 to 127 if interpreted as a number. So, if a unit's information has several bytes of information, and one of those bytes corresponds to the unit's type, it is
relatively easy to tell the program that instead of 0-79 being valid unit types, 0-127 (or maybe 126) are valid unit types. It's not impossible to overcome this sort of thing,
@TheNamelessOne seems to have somehow overcome a 1 byte limit for the number of cities.
Another way to interpret a byte is as a group of 8 'flags'. For example, a tile can be revealed or not revealed for each tribe. If there are 8 tribes, each tribe can have a bit to determine if the tile is revealed to them,and one byte per tile can store the map revelation information. Having more tribes would mean using 2 bytes per tile (at least up to 16 tribes), and there are a
lot of tiles. Probably one of the earliest decisions they made was that there would be 7 tribes plus barbs, so everything they wrote would be based on that assumption. While it would have been good practice to have a parameter in the source code 'numberOfTribes', I could easily see just using 7, since it would never be changed. Even tech costs are linked to the fact that there are 7 tribes (look up the 'key civ' if you don't know what that is). So even if we had the source code, it would be a bit of a job to go through and change everything to recompile for more tribes. Not to mention, the new game would be incompatible with old saved games.