Celtic Mod 3.0 Final Release

antaine

King
Joined
Aug 1, 2005
Messages
737
***newest version v3.1
the file v3.1
http://www.filefactory.com/file/b08cf59/n/RFC_with_Celts_v31.zip
see changelog later in this thread
***

Well, here it is, RFC with Celts 3.0, final release. There may be updates down the road as Rhye updates RFC, but this is essentially in its final form.

THE FILE v3.0:
(download link at the bottom of the page)
http://www.filefactory.com/file/b05acc2/n/RFC_with_Celts_v3.zip



PURPOSE:
This mod enables a player to take control of the Celts, who are now a complete civ with three UHVs and all the trappings of the others. This was done at the expense of playable Carthaginians, but there you have it.



HISTORICAL JUSTIFICATION:
It may seem odd that I chose to start the Celts in Ireland, when it is on the Continent that they are most known during the ancient period. There are several reasons for this, and it is not as historically inaccurate as it might first appear.

First, the reasoning: this was of necessity. Starting the Celts in Gaul or Iberia made it virtually impossible for even a human player to survive. The way the medieval civs spawn would virtually necessitate even a human player moving their capital to Ireland in order to survive. As there is a penalty for moving your capital, I figured it was best simply to start the Celts where they would eventually need to be centered.

Besides that, starting them in Switzerland virtually insured prevention of the Roman Empire from forming. For this reason, independent and barbarian city spawns have been used on the Continent (with Gallic Warriors) to reflect their presence as independent Celtic tribes. The English (Saxons) are not started in Germany and expected to recreate the migration to Britain, nor the Franks started east of the Rhine and expected to invade Gaul, so why make the Celts migrate from Switzerland to Gaul to Iberia and then the Isles? In reality, the only major Continental population of Celts is in Brittany, which is not a remnant of Gaul, but a recolonization back from Britain (hence the name, "Bretagne").

When the Celts spawn, 820BC, they were indeed present not only on the Continent, but Ireland and Britain as well. The fact that they are most known on the Continent during the ancient period is a reflection on the limited perspective of our surviving sources' authors more than actual Celtic presence in a particular place outside Roman and Greek borders. Setting the capital in Ireland marks a shift in focus of narrative location rather than an idiosyncrasy. Indeed, some historians argue that proto-Celts and Basques comprise Europe's aboriginal peoples, and some geneticists studying the population in southern and western Ireland (as well as the Basque country) reveal a pattern of initial migration - in other words, the people there now are direct descendants of the original people to settle those locations, even in the face of numerous invasions and migrations throughout the rest of the continent.

Ireland is today the only free and independent Celtic country. Brian Boroimhe's consolidation of power (such as it was) as Árd Rí Éireann (High King) was as close as any collection of Celtic kingdoms or tribes came to cultural and political unification until Ireland's independence in the modern age. There was some Scottish unification, but this was outlived by Irish kingdoms' independence and Scotland was the result of Irish (Gaelic) expansion into northern Britain in the wake of Roman withdrawal from the south in the first place. The selection of Tara, the seat of Ireland's High Kingship, as the Celtic capital is therefore a symbolic starting point for someone trying to unify the Celts and keep them unconquered into the present day. After all, it is London that is most associated with the position of being England's capital, even though Winchester should be the capital in the early stages to maintain historical accuracy.

I have tried not to make concessions for the Celts that Rhye himself did not make for at least one (and preferably two or three) other civilzation(s). Far from overpowering my favorite civ, I have actually been fairly strict and therefore many may find that playing the Celts is harder than other civs both in terms of UHVs and competition with their neighbors. In the end, the Celts were not able to survive English (and others') expansion due to disunity, and only "respawned" as a politically independent entity in the early twentieth century. Trying to buck history should be hard. Other "unconsolidated" civs were given a place in RFC (the Vikings, the Russians, and others), so it's not that outrageous that the Celts could be as well. All civs were given two UHVs they achieved in history and one they never managed to...this is true for the Celts as well...the one they never managed to accomplish amounts to surviving past the Battle of the Boyne in 1690 (1700 to achieve the UHV) without losing any cities to the Romans, Vikings or English. The others, sacking Rome by 410 and colonizing the British Isles, Gaul and northern Spain reflect actual historical events.



CREDITS:
In no way can I take all the credit for this. Rhye did all the hard work of putting together the original (in all senses of the word) mod and Baldyr provided massive help as I was learning python, walking me through some of the changes I needed to make and coding some innovative features himself. usi developed the holy-city-moving-when-razed mod, which I also incorporated early on.




CHANGES:
There have been some changes to maps, resources, spawns in the name of balance. The Celts needed room, especially since they would be besieged by several major civs in the Middle Ages (depending on how the human player decides to pursue UHVs, the Celts will see the Spanish, French, Romans and English all trying to take major bites out of their territory in a very short period of time. Because of this, the Celts spawn in Ireland and expand back to the Continent (if following the UHVs). The AI invariably uses it's extra settlers to colonize Gaul, and culturally acquires 1-3 spawned cities in Britain as well as 2-3 in Ireland (including the capital). The human player, of course, can do anything they like, including founding the capital on a different tile and/or using units to prevent some or all of the Independent spawns.

The Carthaginians are now a minor civ.

The English base name has been made "Saxon" instead of "Briton," who were actually Celts

The patch that moves a holy city that has been razed to another city has been applied.

There have been map changes - some resources, minor changes to the eastern US and selected islands, and a noticeable increase in size for Britain and Ireland (which now needs to accommodate two competing major civs).

There have also been changes to settler and war maps, England's core area, city name maps and additions to the dynamic naming.

There have been changes to the English spawn as they are only provided with one settler (for London). The reason for this is twofold: first, the AI was using the others to colonize Scandinavia and Russia; second, Britain will now be full of 2-4 Celtic and Independent cities (plus London), and opportunity to expand to three more in Ireland (fairly easy after a Celtic collapse). In other words, until they are ready to colonize the Americas, Africa and Australia, the English don't need any more right off the bat.

There have been some changes to the Civilopedia.

Some art scaling has been altered. (if you don't like this, you can just replace Civ4ArtDefines_Unit.xml with a copy of Rhye's original file of the same name and the units will be the size you're used to. It's in Assets/XML/Art)

Time victory has been removed.

Some changes in city spawns and city reallocation (in the name of balance and historical accuracy) have been made to ensure proper expansion of the Vikings, Russians, English, Americans and Romans when controlled by the AI.

Some religious preferences have been changed to produce (roughly) historically accurate religious populations by the Middle Ages.
 
JMerry developed the holy-city-moving-when-razed mod
While I appreciate credit, I'd like it to be for things I actually did. That mod is someone else's work, and I've never heard of it before.
 
wow...I don't know why I have always associated it with you...

I have looked it back up and amended the post to give proper credit. Thanks for letting me know.
 
Oh, my! I believe I missed this thread as I have been busy doing Python on my spare time. :p Still learning at an alarming rate, I might add! :king: Helping out with your project was also a great learning experience and a pleasure.

First of all: Congratulation on a job well done! :goodjob:

Secondly: Is the multiplayer version still gonna happen?

And lastly: Make sure to take some time to actually play the modmod. I believe this was your aim all along, not?
 
Still investigating that. A mod or Rhye's multiplayer isn't going to happen, I don't think. If I can enable multiplayer features in the single player version, then I hope to get a multi player version out. It doesn't work that way hot-seat, so I need a friend on the phone or IM to try setting up an internet game with me through gamespy to test stuff out.
 
Here you is. Just a note, in this game I customized my name and changed the civ name from Celtia to Ireland, but the default is Brennus/Celtia/Celtic

Are there any particular shots people would like to see? The one's I've put up have to do with Celts in the interface and the map alterations I've made.
 
Here you is. Just a note, in this game I customized my name and changed the civ name from Celtia to Ireland, but the default is Brennus/Celtia/Celtic

Are there any particular shots people would like to see? The one's I've put up have to do with Celts in the interface and the map alterations I've made.

One nitpick: Why does you 450 AD UHV say 'Not Yet' while the 1700 one is already accomplished?
 
It's one of the little things that needs fixing. It actually "works" (it gives you credit if you succeed before the deadline, and denies you credit if you 'succeed' after the deadline), it just displays the wrong message if unachieved after the deadline. If I were to sack Rome now, it would read "NO" instead of "Not yet."

I'm sure it's an easy tweak to remedy, but the last time I tried to fix it, I broke it and it failed to register at all. It will probably be remedied in 3.1, which I'm figuring will be released after I incorporate some of rhye's upcoming improvements.
 
It's one of the little things that needs fixing. It actually "works" (it gives you credit if you succeed before the deadline, and denies you credit if you 'succeed' after the deadline), it just displays the wrong message if unachieved after the deadline. If I were to sack Rome now, it would read "NO" instead of "Not yet."

I'm sure it's an easy tweak to remedy, but the last time I tried to fix it, I broke it and it failed to register at all. It will probably be remedied in 3.1, which I'm figuring will be released after I incorporate some of rhye's upcoming improvements.
You actually never got the UHVs working proper? :lol: That was the only real new(ish) piece of Python in the whole modmod! :eek:

I'm now officially giving up on you! :p

And by the way. Without looking at the code (which I already told you i wouldn't do anymore) I'm betting on that the UHV in question still should read "Control Central Italy before AD 450". Because the code I did see before had nothing to do with the "city of Rome". :rolleyes:

And when you do a new version, you should probably update all the XML files also. I betting on that you're basing your current XML on an outdated version right now...

But nuff said.
 
mea culpa, mea culpa.

It technically should read "control central Italy" except that's not what the Celts did, they sacked Rome. But there's always a chance Rome won't exist, or may exist a tile over, making their UHV impossible. Any city founded on the tiles in question will be named "Rome" so I was using it as a workaround.

The problem has to do with the UHV check. I think what it does now is to check when Rome is captured (if it ever is) and see if the year is within the given range. When I tried to fix it, the game was waiting until 450 in order to check if Rome was controlled. I didn't want the UHV result to be "control Rome *in* 450" but "control Rome (however briefly) *before* 450"

I'm sure I just have a <, >, or = out of place in victory.py, I just haven't had time with the thesis writing to go combing through it. I'll get it straightened out before any future update.

Perhaps I need to go back to the code and actually use the city's name as the test instead of the tiles. That way, if the Celts capture by conquest "An Róimh" (what they will rename any "Rome/Roma/etc" to) before 450 they get the UHV. I think that would be ideal.
 
you know what, after all that...it's fixed. The problem was here, it read:

if (iGameTurn <= i450AD):
if (self.checkOwnedArea(iCeltia, tRoimhTL, tRoimhBR, 1)):
self.setGoal(iCeltia, 0, 1)
elif (iGameTurn == i450AD and self.getGoal(iCeltia, 0) == -1):
self.setGoal(iCeltia, 0, 0)

but needed to read:

if (iGameTurn <= i450AD):
if (self.checkOwnedArea(iCeltia, tRoimhTL, tRoimhBR, 1)):
self.setGoal(iCeltia, 0, 1)
elif (iGameTurn >= i450AD and self.getGoal(iCeltia, 0) == -1):
self.setGoal(iCeltia, 0, 0)

I just needed to make the == into a >=. I think when I had attempted to fix it before, I made it a <= and totally messed up the failure requirements.

It displays properly now (although it still only requires control of a city on one of the three tiles that would be an acceptable "Rome").
 
it should also be noted that the Romans spawn a few turns after the Celts. Even if they proceeded straight there upon their start, the Celts would still find "Roma" on one of those three tiles.

I suppose if the Greeks came in and razed Rome, the Celtic player might be able to succeed in re-founding Rome (An Róimh) before 450 and succeeding in the UHV, but I have yet to find this situation develop in practice.

While there would technically be other ways to succeed at the UHV (such as founding Rome yourself), I would suspect that 99 times out of 100, the human player (knowing what the UHV says in the victory screen and not analyzing the code) will march an army down there and attempt to capture whatever city they find in central Italy (which would invariably be a Roman, Independent, Barbarian or maybe Greek "Rome"), which was the desired action all along.

I don't know, are there other thoughts on this? Is setting the requirement to control one city on one of those three tiles too "messy," or is it an acceptably fuzzy way to get the job done?
 
I believe that someone in an early play test (v1?) actually razed Rome (as it was only size 1, I believe) and - of course - didn't realize that all he had to do in order to get the UHV requirement was to build a city on top of the ruins. This is what I'm actually referring to. "Control Central Italy" is what the current code requires, and nothing else.

One way of changing it into "Control the city of Rome" would be to check whether or not any city taken by the Celts is on that very map tile. The city might or might not be the actual city of Rome, but this way the Celts wouldn't get the UHV by simply founding a city on the spot. Maybe razing the city would count also? (Yet more code for you to do.)

Once you've learned enough Python you will be able to do anything you like along these lines, although it seems suboptimal to check against the city name. (A Roman player could just rename the city in order to make the Celtic UHV fail.)
 
hm, well...I can use the mongol code as a model if I want to require the celts to raze rome (which I don't), by simply require 1 city razed in the given three tile area. Nobody has a model for conquering one city in a given area, however. I think I'd have to code a "checkConquestArea" def, which is still a bit beyond me at the moment.

What if I put these two in their respective folders:

###in Victory

def checkCapturedArea(self, iActiveCiv, tTopLeft, tBottomRight, iThreshold):
dummy1, plotList = utils.squareSearch( tTopLeft, tBottomRight, utils.CapturedCityPlots, iActiveCiv )
if (len(plotList) >= iThreshold):
return True
else:
return False

###in RFCUtils

def capturedCityPlots( self, tCoords, result, argsList ):
"""Checks validity of the plot at the current tCoords, returns plot if valid (which stops the search).
Plot is valid if it contains a city belonging to the civ"""
bPaint = True
bContinue = True
pCurrent = gc.getMap().plot( tCoords[0], tCoords[1] )
if (pCurrent.isCity()):
if (pCurrent.getPlotCity().getOriginalOwner() == argsList ):
# this is a good plot, so paint it and continue search
return (None, bPaint, bContinue)
# not a good plot, so don't paint it but continue search
return (None, not bPaint, bContinue)

Now, I don't know how to change the second one to see if the city is not the original owner...I don't understand enough of what I'm looking at there. If I can do that, I can change the UHV so that it looks for a city conquered by the Celts on those three tiles (Rome).

because then I could alter the UHV to read:

if (iGameTurn <= i450AD):
if (self.checkCapturedArea(iCeltia, tRoimhTL, tRoimhBR, 1)):
self.setGoal(iCeltia, 0, 1)
elif (iGameTurn == i450AD and self.getGoal(iCeltia, 0) == -1):
self.setGoal(iCeltia, 0, 0)

no?
 
You're basically on the right track, but you need to add some more code before you could make it work. Also, you don't have to put the definition in Victory.py - you can just call on it by doing "utils.checkCapturedArea(...)" because it says "utils = RFCUtils.RFCUtils()" at the beginning of Victory.py (check, please). Also, if you look up "def checkOwnedArea()" in Victory.py you see that the "return" command only returns one "argument" (a boolean). If you compare with capturedCityPlots() that function actually returns three arguments. This is why you will need an additional line of code before the if statement.

So I guess you could try that at a later point then, once you figure out what the hell I'm going on about... :lol:

There would be other - and better - ways of doing this also. And if you take the time to learn programming you won't need to rely on copying Rhye's code in order to do whatever you wanna achieve.

An example: In Victory.py there is a definition for the function onCityAquired(). In fact I believe this is where another of your Celtic UHVs is set to fail. What you could do is add sort of a reverse code that triggers the Celtic UHV if the city attacker is Celtia and the city coordinates match Rome.

Below is the definition for the function onCityRazed() - you could add an entry for iCeltia and have it also trigger the UHV if the city coordinates match.

The other set of code under def checkPlayerTurn() would of course also have to modified. All of this would, of course, require some basic knowledge of what the different variables and functions do, and also understanding of computer logic. But as I said, its doable and may even be within your reach in the foreseeable future. :king:
 
I'll keep working on it.

For right now, the failure displays properly, and capturing the city before the date triggers a success. The fact that there's an alternate way to succeed hidden in there (founding the city yourself) isn't the end of the world (but I intend to fix it as soon as I can), especially since razing and refounding the city is far more difficult than simply capturing it and gifting it back in peace terms the next turn.
 
the file v3.1
http://www.filefactory.com/file/b08cf59/n/RFC_with_Celts_v31.zip

changes in 3.1

1) I got tired of looking at "Pointe-Saint-Anne" and so America will now rename this Boston. It's a little too far north, but it's the most major city in the area and the map just isn't that accurate.

2) improvements to US reality checks

3) the Celtic victory screen now properly displays failure when the deadline for sacking Rome has passed

4) added reality checks for France
 
Did you ever test out jmerry's Dynamic Starts modmod? I thought you'd wanna merge that to your modmod, since the idea (at least regarding the Americans) was yours originally, or so I believe.

Also, there are later versions of my custom functions available if you wanna add any more "historical events" or such. :D
 
Well, it's not a trivial merge - you can't use any of the files I provided unmodified. The tweaks to the map and to RiseAndFall are pretty straightforward, and I provided instructions for them. That leaves updating the tech and ancestor lists, which is a judgement call about balance. Note that any civ with <2 ancestors should get a static start, with "normal" and "minimal" tech lists identical. That presumably includes the Celts.
 
Top Bottom