New Map City Names Development Thread

Leoreth

Bofurin
Retired Moderator
Joined
Aug 23, 2009
Messages
37,618
Location
風鈴高等学校
Hey, I wanted to create this post to give an update on what I have been doing in recent days. Like I already mentioned, I shifted my focus to the city name aspect of the new map, which so far I haven't been working on. The way I see it, city names break down into three broad categories:
  1. Tile names
  2. Renaming cities into different languages
  3. Renaming cities based on other factors such as era, civics, etc.
All of these require attention. For (1), the mod is already in a very good place due to the base map that is already in active use. Cities are getting names assigned, even if these names are not changing based on owner or other circumstances. Nevertheless, I see that there is room for improvement. The map that is in use is older and does not reflect all the map changes that have been made. This is most noticeable e.g. in Egypt where the location of the Nile has been changed, leading to incorrect city names. But in general, in many situations I have made different decisions where certain city locations should be. This is often, but not always, driven more by gameplay considerations rather than geographical accuracy, for example to reduce overlap and allow more historically accurate cities to exist, or to allow access to important resources. Like I have said before, when this happens, it always means that the choice of location is deliberate and it is the name that is wrong - now I am going to fix the names. On top of that, there are certain regions of the world where I disagree with the name assignment for geographical reasons as well. Lastly, some tiles on the map are still unnamed (receiving the conspicuous "?" name) and I also plan to identify and address that.

Even though that is a substantial list of examples, working on those should not take very long compared to the other two categories, which is why I focused my attention on them.

For that purpose, what I did was to first collect city names from the two primary sources: city names used by 1.17, and city name changes suggested in the comments of the city name map ODF document. The latter was a very valuable resource, but unfortunately the format of libreoffice comments made them very difficult to process, so I had to spend a lot of tedious work into systematically converting them into a spreadsheet.

(Just to give some idea of the scale: 1.17 contained 1963 city name changes, and the suggestions doc contains 7569 suggested city name changes.)

That is all that has happened so far. It took a lot of time, but now the data is in a format that is hopefully easier to work with going forward. The next step is going to be to review and research all these suggestions, and work them into a collection of city renames that a) I agree with historically/geographically and b) works with the way it is meant to be implemented in the mod. While I think all the suggestions were well resourced, they came from different people with different intentions and understandings of how things are supposed to work, so I need to align and correct them if necessary, so that they fit my intentions for the city name system. That again will probably be a lot of manual work that requires a lot of time.


What actually is the system I have in mind, and why are so many changes necessary? I have talked about this before, but I want to reiterate the idea to give everyone proper context. The main difference for 1.18 compared to 1.17 is that there is now only one global map of city names used by every language, as opposed to every language having their own map of tile names. This may sound like a loss of detail, but the benefit is that there is now only one map to maintain and keep accurate. The challenge of having 20+ different maps was that it was easy for them to get out of sync (e.g. the same name being associated with different tiles in different maps) and it was a lot of effort to make any changes, because it required updating every individual map. In consequence, it meant that only few changes were made, which prevented the addition of more detail and granularity to city names overall.

Does this mean that on every tile there can only be one city name? We all know that historically the same tile can contain different cities. For example, Babylon and Baghdad are two entirely different cities sharing the same tile, but that does not mean that a hypothetical Babylonian civ taking back Baghdad should rename the city back to Babilû. The game is still going to track this difference, it just isn't going to use maps for that purpose.

With that approach, I can also solve another problem with the 1.17 city name system. Which is that whenever a city is renamed, the new name is determined based on its current name. That's a problem because then the code needs to account for all current names the city can have - it easy to miss one possibility and then not rename the city, even though a name for the target language is actually available. Accounting for all these cases also further bloats the code and makes changes more difficult. In the 1.18 system, the current name does not matter (except as a fallback when the city name remains unchanged): instead the name is always determined from scratch from the name of its tile, combined with the tracked tile name changes I mentioned above.


Once this system is in place, it will allow adding and maintaining city names with less effort and less potential for error, which eventually allows for a greater degree of detail and more participation. However, it also means that the 1.17 name changes cannot be taken as they are, but most be adapted for this new system, as do all the suggestions I have received.

I have also thought of other ways to leverage that system to better ensure that always the most accurate city name is being used. For example, currently, in the absence of a city name for a civilization's language, a city's name remains unchanged or the static list of city names for the civilization is being used. I already have plans to use various fallback methods to determine a more appropriate name, including the city's previous owner, languages from the same geographical area as the current owner, and the language of the civilization with the highest settler value on the tile.


This is all to give some context on why this effort is likely to require a lot of additional time, and why I consider that time worthwhile. I think eventually it would be great to include the community in the project to add even more city names to the mod. But right now I first need to process the existing city name (suggestions) into a format that reflects how I want things to work, so that people can adjust their suggestions to that approach. Before that, any contribution would just add to the amount of work I need to do.

There is definitely room for further expansion of detail and granularity in the future though. For example, I briefly looked into the Civ6 Rosetta mod, which seems to be a treasure trove of city names that we could cross reference and incorporate into DoC. But for now, I decided that extracting all of its content into a format that would be useable by DoC would require too much time on my end. Maybe later on, someone else can take a stab at it.


Lastly, despite this, I plan to take breaks along the process to return to other aspects of the mod. I haven't made any gameplay related changes in a while, but I am aware that there are issues currently. I first wanted to bring the first step in this project to a close before coming back to that. Part of this post (and this thread) is to let you know that after reaching this point, I will pause for a bit and return to gameplay development.

Likewise, once I am back at it, I will use this thread to post (hopefully shorter) updates. That's all!
 
I think it's time for an update.

Like I said elsewhere, I already put a lot of work into fixing the base map to align city names with map changes, preferred city locations implemented in starting locations and settler maps, and where I disagreed with the original proposed locations for other reasons.

Since then, I focused on the actual different translations and name changes for cities. I am slowly working myself through the existing suggestions for name changes in alphabetical order, reviewing them and adding additional research, and them implementing them into the code.

So far I have covered city names starting with A and B, just to give you an idea about the time it takes. Here's an example of what things look like for one of the most name rich cities, Byzantium/Constantinople/Istanbul:
Code:
    "Byzantion": {
        iArabic: "Bizantiya",
        iChinese: "Baizhanting",
        iDutch: _,
        iEnglish: "Byzantium",
        iFrench: "Byzance",
        iGerman: "Byzanz",
        iItalian: "Bisanzio",
        iGreek: _,
        iLatin: (
            rename("Constantinopolis", iReligion=iOrthodoxy),
            "Byzantium",
        ),
        iLocal: "Lygos", # Thracian
        iPolish: "Bizancjum",
        iPortuguese: u"Bizâncio",
        iRussian: "Visantiy",
        iSpanish: "Bizancio",
        iSwedish: "Bysans",
    },
    "Constantinopolis": {  # renamed from Byzantion
        iArabic: "Qustantiniyya",
        iChinese: "Junhorsehockyandingbao", # CFC insists on censoring the actual name because we are all children here
        iDutch: "Constantinopel",
        iEnglish: "Constantinople",
        iFrench: "Constantinople",
        iGerman: "Konstantinopel",
        iGreek: "Konstantinoupolis",
        iItalian: "Constantinopoli",
        iJapanese: "Konsutantinopuru",
        iKorean: "Konseutantinopolliseu",
        iLatin: _,
        iNorse: u"Miklagarðr",
        iPersian: (
            translate("Takht-e Rum", iBefore=iClassical),
            "Qostantiniye",
        ),
        iPolish: u"Carogród",
        iPortuguese: "Constantinopla",
        iRussian: "Tsargrad",
        iSpanish: "Constantinopla",
        iSwedish: u"Miklagård",
        iTurkish: (
            rename("Istanbul", iAfter=iGlobal),
            "Kostantiniyye",
        ),
    },
    "Istanbul": {  # renamed from Byzantion
        iArabic: _,
        iCeltic: u"Iostanbúl",
        iChinese: "Yisitanbao",
        iDutch: "Istanboel",
        iEnglish: _,
        iFrench: "Stamboul",
        iGerman: _,
        iItalian: _,
        iJapanese: "Isutamburu",
        iKorean: "Iseutanbul",
        iPolish: "Istambul",
        iPortuguese: "Istambul",
        iRussian: "Stambul",
        iSpanish: "Estambul",
        iTurkish: _,
    },
People familiar with the existing city name manager will notice a few differences. Most obviously, the structure is now base name first, languages second as opposed to language first, base names second. This is more convenient for the code, but also when editing city names. It makes it easier to see which languages already exist for a given name and which are missing without producing inconsistencies or duplicates.

Secondly, special characters are now given in unicode strings like u"Bizâncio" rather than having to be HTML escaped. That should make everything much more readable, similar to how great people names already work. To be clear, this does not mean that city names have full unicode support. The game is still limited to characters from the Latin-1 code page, so many otherwise useful characters are not available. This is just a more convenient way of defining city names.

The key that identifies a city is always its name on the city name map, in this case "Byzantion". So when a city is founded or acquired, the name of its tile is looked up, and then the game checks this map to determine the name for a given language. The existing name of the city is not used and never matters at all.

Unlike in the previous city name manager, there is also no separate extra code to change city names in other ways - for example, previously the change from Constantinople to Istanbul specifically happened on era change. Instead, this is now defined as part of the renaming dictionary in the form of conditional names. For example, you can see translate("Takht-e Rum", iBefore=iClassical) which means that the name "Takht-e Rum" is only used in the Classical era or earlier. Otherwise, the next name in the list is used. translate(<some name>) without any conditions is equivalent to always using the name - conversely, a plain string simply means there are no conditions attached to the name.

This city also makes use of the rename functionality to change the base name of a tile. With rename("Constantinopolis", iReligion=iOrthodoxy) the base name of the tile is changed from Byzantion to Constantinopolis, so that every language will from now on use its translations of Constantinopolis, instead of Byzantion. However, if there is no translation available in a given language, the previous base name can still be used as a fallback. This is relevant especially for Istanbul, where not every language has its own translation for the name and will instead fall back to its version of Constantinopolis.

A further quirk is the use of the _ character. This is simply a shorthand for "the name in this language is identical to the base name".

You can also see the introduction of the iLocal language. This is a catch-all language to represent all languages that are not associated with a particular civilization, but rather local/native to the tile that a city is on. In this case, it stands in for Thracian, but it can be any such language. For example, it is used to reflect precolonial names for many places around the world. Local languages are always used for barbarian, native, and independent cities, or when none of the owner's languages have a name for the tile.

The new city names manager is very large and already on track to outscale the existing one by a significant margin. Only for the letters A and B there are already around 2800 lines of code to represent city names. I hope this illustrates the capabilities and scope of what I am working on somewhat.

For now I will take a break on this for a bit and focus on other aspects of the mod for a while, before picking it up again.
 
You can also see the introduction of the iLocal language. This is a catch-all language to represent all languages that are not associated with a particular civilization, but rather local/native to the tile that a city is on. In this case, it stands in for Thracian, but it can be any such language. For example, it is used to reflect precolonial names for many places around the world. Local languages are always used for barbarian, native, and independent cities, or when none of the owner's languages have a name for the tile.
Question: when would this come into play?

Let's say I'm an absolute madman and I capture Constantinople from the Ottomans while playing the Inca in the year 1762. Would the city keep the Turkish name, or would it revert to Lygos?

Likewise, if the Bulgar lancer stack spawns while all but one of Constantinople's defenders are fighting the Arabs and they capture the city, would it then revert to Lygos, or stay as the Greek name?
 
This city also makes use of the rename functionality to change the base name of a tile. With rename("Constantinopolis", iReligion=iOrthodoxy) the base name of the tile is changed from Byzantion to Constantinopolis, so that every language will from now on use its translations of Constantinopolis, instead of Byzantion. However, if there is no translation available in a given language, the previous base name can still be used as a fallback. This is relevant especially for Istanbul, where not every language has its own translation for the name and will instead fall back to its version of Constantinopolis.
Very cool. European languages should probably always use a version of Constantinople instead of Istanbul - the name was only changed by the Nationalist Turkish government in the 1920s, so had European powers managed to gain the city, it would have stayed Constantinople, just like how Eastern Bloc cities don't take communist names unless communism is adopted.
 
Question: when would this come into play?

Let's say I'm an absolute madman and I capture Constantinople from the Ottomans while playing the Inca in the year 1762. Would the city keep the Turkish name, or would it revert to Lygos?

Likewise, if the Bulgar lancer stack spawns while all but one of Constantinople's defenders are fighting the Arabs and they capture the city, would it then revert to Lygos, or stay as the Greek name?
The logic is not fully in place yet, but the intention is for that not to happen. There are also other intended fallback mechanisms, including the name given by the previous owner, as well as using languages of the civ with the highest settler map value or belonging to a similar linguistic/geographical group as yours. If any of these names becomes out of place it is also always possible to adjust the conditions. For example instead of "Lygos" it could be translate("Lygos", iBefore=iClassical) to prevent it from showing up in ahistorical eras. Stuff like this is better to do when it turns out it is actually needed though.
Very cool. European languages should probably always use a version of Constantinople instead of Istanbul - the name was only changed by the Nationalist Turkish government in the 1920s, so had European powers managed to gain the city, it would have stayed Constantinople, just like how Eastern Bloc cities don't take communist names unless communism is adopted.
If you look at the condition of changing the name to Istanbul, it is actually specifically associated with the iTurkish language. So if Constantinople remains under control of a civilization that does not have Turkish in its language list, its name will not change to Istanbul even when entering the Global era.
 
If you look at the condition of changing the name to Istanbul, it is actually specifically associated with the iTurkish language. So if Constantinople remains under control of a civilization that does not have Turkish in its language list, its name will not change to Istanbul even when entering the Global era.
What happens if a European civ conquers Istanbul in the global era?

I can also help with Celtic names.
Constantinople - Cathair Chonstaintín
Beijing - Péicing
Delhi - Deilí
Venice - An Veinéis
Warsaw - Vársá
Cracow - Crachóbh
Jerusalem - Iarúsailéim (I would also recommend using "Hiérosolyme" for medieval French, even though it is not the modern French name)
Thessalonica - Teasalóinic (I've actually conquered this one when playing as the Celts before)
 
Great work - this is looking fantastic!

Happy to provide Rosetta data whenever/however is helpful as well
 
What happens if a European civ conquers Istanbul in the global era?

I can also help with Celtic names.
Constantinople - Cathair Chonstaintín
Beijing - Péicing
Delhi - Deilí
Venice - An Veinéis
Warsaw - Vársá
Cracow - Crachóbh
Jerusalem - Iarúsailéim (I would also recommend using "Hiérosolyme" for medieval French, even though it is not the modern French name)
Thessalonica - Teasalóinic (I've actually conquered this one when playing as the Celts before)
In that case it will use their language's name for Istanbul, if they have any. Most European nations have accepted the name Istanbul after the Turkish republic made it official.

Thanks for the suggestions. Forgive me for not tracking these. Once I have completed my work on the first pass (which is still a way off), I will open it for feedback and suggestions. It is easier to keep track of it that way. This is already enough work that I cannot allow myself to get side tracked with making changes or additions for cities I have already worked through.

Great work - this is looking fantastic!

Happy to provide Rosetta data whenever/however is helpful as well
Oh hey, nice to see you in this thread and thanks for the nice words. I actually took a brief look into Rosetta before starting with this in earnest, but realised that I didn't know enough about how it worked to make effective use of it. I wanted to reach out to you eventually, I'm sure you have a lot of extremely useful and hard to find city names that I would never find on my own. But like I said above, for now I am trying to stay focused so I can remain (somewhat) sane.
 
Last edited:
In that case it will use their language's name for Istanbul, if they have any. Most European nations have accepted the name Istanbul after the Turkish republic made it official.
Yes, but any modern conquest of Istanbul/Constantinople by a Western power would probably result in the name being returned to Constantinople, since the only reason I could imagine any Western power doing that in the modern age is out of some crusaderboo "retake Constantinople" ideology. (There is an Irish name for Istanbul, interestingly enough - Iostanbúl. That surprised me, since Irish is far less gung-ho about throwing out established translations of geographical names than English is, probably because Irish isn't a global lingua franca like English is. Languages that are mostly used by only one ethnic group, Irish, Afrikaans, Yiddish, etc...tend to be more conservative)
Thanks for the suggestions. Forgive me for not tracking these. Once I have completed my work on the first pass (which is still a way off), I will open it for feedback and suggestions. It is easier to keep track of it that way. This is already enough work that I cannot allow myself to get side tracked with making changes or additions for cities I have already worked through.
I'm happy to do the Celtic names for all relevant cities when you are ready for them. Many less significant cities, especially outside of Europe, do not have an Irish name, though. My plan is to use Irish for Celtic city names, since it is the most widespread Celtic language and since it is the most ancient one that still exists. (Scottish and Manx come from Old Irish).

How do you feel about having different languages based on location of the capital? i.e. if Germany's capital is in Hamburg, it would use Low German instead of Standard German, if China's capital is in Canton, it would use Cantonese instead of Mandarin, etc, if France's capital is in Provence, it would use Provencal instead of French...It could be interesting to have China use Wade-Giles or Postal Map instead of pinyin if its capital is in Taiwan.
 
How do you feel about having different languages based on location of the capital? i.e. if Germany's capital is in Hamburg, it would use Low German instead of Standard German, if China's capital is in Canton, it would use Cantonese instead of Mandarin, etc, if France's capital is in Provence, it would use Provencal instead of French...It could be interesting to have China use Wade-Giles or Postal Map instead of pinyin if its capital is in Taiwan.
This sounds incredibly cool, but also sounds like a metric butt-ton of work for Leoreth.
 
Yes, but any modern conquest of Istanbul/Constantinople by a Western power would probably result in the name being returned to Constantinople, since the only reason I could imagine any Western power doing that in the modern age is out of some crusaderboo "retake Constantinople" ideology.
I think that's overthinking it. You could come up with a lot of hypothetical scenarios what the situation would be if certain things were to happen. I prefer a simpler approach of using the established names right now.

I'm happy to do the Celtic names for all relevant cities when you are ready for them. Many less significant cities, especially outside of Europe, do not have an Irish name, though. My plan is to use Irish for Celtic city names, since it is the most widespread Celtic language and since it is the most ancient one that still exists. (Scottish and Manx come from Old Irish).
Yeah. I haven't been that rigorous about it, but the pattern that emerged is using Classical Celtic names where appropriate (e.g. Gaulish in Gaul, Celtiberian in Spain etc. to the extent that we can know or infer from Latin names), and use Irish for modern city names around the world. The exception is on Great Britain, where I preferred Welsh or Scottish based on location (so far it mostly came up for cities in or near Wales).

How do you feel about having different languages based on location of the capital? i.e. if Germany's capital is in Hamburg, it would use Low German instead of Standard German, if China's capital is in Canton, it would use Cantonese instead of Mandarin, etc, if France's capital is in Provence, it would use Provencal instead of French...It could be interesting to have China use Wade-Giles or Postal Map instead of pinyin if its capital is in Taiwan.
This sounds incredibly cool, but also sounds like a metric butt-ton of work for Leoreth.
Yeah, that basically sums it up. It's definitely possible, all that is needed is to define the language and the condition when it would be used. It's just that it's a lot of work then to input all those city names. In case of your examples, all of them are quite rare and would need to be triggered by the player to have a chance of occurring, so I don't consider it worth the effort in the first implementation.

I have thought about things like Old or Middle English though. I think it would be cool to have names change more through time. Whether that would be implemented as a separate language or more involved city name conditions is still open, though. And also, at this point not in scope.
 
(I would also recommend using "Hiérosolyme" for medieval French, even though it is not the modern French name)
Forgot to comment on this - I agree, I think part of the fun of the dynamic city names system is the surprise when something rare happens, so these unconventional names should be able to appear. Alternatively, it is also possible to associate them with certain eras. I haven't gotten to Jerusalem yet (I think it is under the Yerushalayim key, so it will take a while) but here is a similar example for Acre:
Code:
    "Akka": {
        iArabic: _,
        iBabylonian: _,
        iEgyptian: (
            translate(u"Ptolemaïs", iPeriod=iPeriodPtolemaic),
            "Aak",
        ),
        iEnglish: (
            translate("Saint John of Acre", iBefore=iMedieval),
            "Acre",
        ),
        iFrench: (
            translate("Saint-Jean d'Acre", iBefore=iMedieval),
            "Acre",
        ),
        iGreek: u"Antiókheia tês en Ptolemaïdis",
        iItalian: (
            translate("San Giovanni d'Acri", iBefore=iMedieval),
            "Acri",
        ),
        iLatin: "Colonia Ptolemais",
        iPhoenician: "Ak",
        iSpanish: (
            translate("San Juan de Acre", iBefore=iMedieval),
            "Acre",
        ),
    },
 
About Istanbul:
In Polish It's named Stambuł (I don't know why this I is removed). I don't recall seeing Istambuł anywhere.
 
Forgot to comment on this - I agree, I think part of the fun of the dynamic city names system is the surprise when something rare happens, so these unconventional names should be able to appear. Alternatively, it is also possible to associate them with certain eras. I haven't gotten to Jerusalem yet (I think it is under the Yerushalayim key, so it will take a while) but here is a similar example for Acre:
Don't know if this suggestion would be something you want to act on now because you've already done Acre, but Sigurðr Jórsalafari visited during his crusade and the Norse word for it was Akrsborg. He also visited Jórsalaborg (Jerusalem) and Sæt (Sidon).
 
Oh, that's cool.
 
Top Bottom