Getting pretty long waits between turns now...
I tend to play huge maps, with 11 civs including mine.
I do experience some slow down playing FF...usually somewhere around turn 700 or so in a marathon game. It's not too bad, but it does get noticeably slower.
Ffh runs pretty well. There is some slow down, but it hardly seems like it's there.
This is *really* slow though. I'm at turn 250 (marathon) and I'm waiting over a minute (I just timed one - 62 seconds) between turns. I've never actually timed FF when it starts to crawl, but I don't think the wait was that long.
Not sure what kind of checks and code you are running between turns, but it's slowing things down tremendously.
I guess this isn't positive feedback, but wanted to let you know.
Time to do some streamlining!![]()
4 in 150 turns may be a bit too powerful for the grigori. On the other hand, if it gets them at a somewhat constant rate (aka, always get 4 every 150 turns, not 4 first 150 turns, 2 next 150 turns, and whatnot) it might encourage people to go out and loose them more, and it won't be as much of a setback. Or on the other hand the player has the option to hold them all till the end of the game and end up with a large number of very powerful hero's, but loose their early game potential.
That being said, its still better than 15 in the first 150 turns (I think thats what I ended up getting). As for the special place guardians, well, i started off next to the pyre of the seraphic, stepped on it, and it spawned the guardian. It attacked (my city was right next door), took out my archer, and promptly got owned by one of my heroic warriors. Now, having an unbeatable guardian is bad, but having one that can be killed that easily is a bit... sad. Maybe up their power just a touch?
Other than these minor issues though, is a nice little mod. I'll definitely be following it more in the future.
-Colin
The Grigori are getting tune down a little I put their spawn rate at 1/3 of what it is now in the next patch so we'll have to see how it goes.
The Guardian you killed, The Eye of Bhall shouldn't have died so easliy. In truth it is supposed to spawn Azers to help defend itself and pillage the countryside. I'll have to see if I can get it to create them more consistatly.
I probably will have to get to some streamlining. I think that a large part of it is caused by the can build callback that is running from Turin's AI mod.
Yeah the canbuild function seems to get called extremely often in the lategame. I put a print command in one of the functions to test something and after 300 turns the log file was pushing 100 MB. I may have to look for a different way to get the AI to build sensible improvements. Curiously the slowdown only seems to get really bad after 250+ turns.
In FF the canBuild Callback is enabled by default and it doesn't cause any performance problems. At worst, a worker needs about 20ms on a huge map (ofcourse the actual ms depend on your cpu but since my comp isn't the fastest it should be a good average). That means 100 AI workers equal 2seconds waiting time. After all you can just disable the python callback to measure how much time it uses but I doubt it is even 1second per turn.

As far as I know canbuild is only used by AI_workermove AI_workerseamove and there sub functions and not by any other unitsI think the problem is not that it checks for units that are worker but just every single unit by my understanding. Of course I will have to move all functions from the unitCannotMoveInto which certainly is called for every unit into the DLL.

Hello, did you make any changes to the dll? Im guessing no because the file seemed to be able to load quickly, but Im just curious because I have heard that changing the dll makes the file massive, although the quick installation times speaks for otherwise.
If there is simply a more streamlined way to insert dll changes into a download, or if Im simply misinformed, please do tell![]()
As far as I know canbuild is only used by AI_workermove AI_workerseamove and there sub functions and not by any other units
I think there is a model for Odio currently, and either that or something grey or black based upon the Repentant Angel model would work.
( Is the Ira strength mechanic not overpowered? Just saying >_> )
Found a bug where units casting escape spell makes the game crash to desktop.
I was playing the Inmici. What is the point of the Inmici by the way? I am seeing that they have EXCELLENT archers that are completely for the defense, while they have some of the best Knights, and all their melee units are aimed at slowing the enemy down (nets) and all of their units are good for capturing slaves. Is their anything special that they do with slaves? or Did ye merely want a race that focused primarily on the Slave/ colliseaum aspects of the Roman empire? Perhaps you wanted them able to make buildings quickly by rushing the slaves they get from combat.
If you could explain this civ (as you have the other new ones in the first post) I would appreciate it, as well as better explaining certain civs in the Civilopedia
and perhaps giving the Inmici some city names![]()
I have no interface after inastaling patch D and i can't turn it on by any known means to me, is ther some way to turn it? I have no minimap, no possible command for unit visible, no info on selected unit even city screen, help!!!
edit:
and i can't toggle "options" when presing "esc" or form main menu.
at first clean latest patched ff2, overwrited with .22 and .22D
Got bunch of errors already during loading and later interface is not working.
In FF the canBuild Callback is enabled by default and it doesn't cause any performance problems. At worst, a worker needs about 20ms on a huge map (ofcourse the actual ms depend on your cpu but since my comp isn't the fastest it should be a good average). That means 100 AI workers equal 2seconds waiting time. After all you can just disable the python callback to measure how much time it uses but I doubt it is even 1second per turn.
if pPlayer.isHuman() == False:
print ("canbuild call")
if eTeam.isHasTech(gc.getInfoTypeForString('TECH_CONSTRUCTION')) == True :
if pPlayer.getCivics(gc.getInfoTypeForString('CIVICOPTION_GOVERNMENT')) == gc.getInfoTypeForString('CIVIC_ARISTOCRACY') or pPlayer.getCivics(gc.getInfoTypeForString('CIVICOPTION_GOVERNMENT')) == gc.getInfoTypeForString('CIVIC_THEOCRACY') or pPlayer.getCivics(gc.getInfoTypeForString('CIVICOPTION_LABOR')) == gc.getInfoTypeForString('CIVIC_GUILDS') or pPlayer.getCivics(gc.getInfoTypeForString('CIVICOPTION_CULTURAL_VALUES')) == gc.getInfoTypeForString('CIVIC_SCHOLARSHIP'):
if iBuild == gc.getInfoTypeForString('BUILD_COTTAGE'):
return 0
if iBuild == gc.getInfoTypeForString('BUILD_FORT'):
return 0
if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_LJOSALFAR') or pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_SVARTALFAR'):
if iBuild == gc.getInfoTypeForString('BUILD_LUMBERMILL'):
return 0
if not pPlayer.hasTrait(gc.getInfoTypeForString('TRAIT_FALLOW')) :
if iBuild == gc.getInfoTypeForString('BUILD_WORKSHOP'):
return 0
if gc.getBuildInfo(iBuild).getType()[0:11] == 'BUILD_MANA_':
if pPlayer.isHasTech(gc.getInfoTypeForString('TECH_ELEMENTALISM')):
# These civs always need a fire node
if pPlayer.getCivilizationType() in (gc.getInfoTypeForString('CIVILIZATION_LUCHUIRP'), gc.getInfoTypeForString('CIVILIZATION_LJOSALFAR'), gc.getInfoTypeForString('CIVILIZATION_SVARTALFAR')):
if not pPlayer.hasBonus(gc.getInfoTypeForString('BONUS_MANA_FIRE')):
if iBuild != gc.getInfoTypeForString('BUILD_MANA_FIRE'):
return 0
if pPlayer.isHasTech(gc.getInfoTypeForString('TECH_NECROMANCY')):
#These civs should spectrespam and build the necrotower
if pPlayer.getCivilizationType() in (gc.getInfoTypeForString('CIVILIZATION_SHEAIM'), gc.getInfoTypeForString('CIVILIZATION_CALABIM')):
if iBuild not in (gc.getInfoTypeForString('BUILD_MANA_DEATH'),gc.getInfoTypeForString('BUILD_MANA_CHAOS'),gc.getInfoTypeForString('BUILD_MANA_ENTROPY'),gc.getInfoTypeForString('BUILD_MANA_SHADOW'),gc.getInfoTypeForString('BUILD_MANA_ENCHANTMENT')):
return 0
if pPlayer.hasBonus(gc.getInfoTypeForString('BONUS_MANA_CHAOS')):
if iBuild == gc.getInfoTypeForString('BUILD_MANA_CHAOS'):
return 0
if pPlayer.hasBonus(gc.getInfoTypeForString('BONUS_MANA_SHADOW')) or pPlayer.hasHolyCity(gc.getInfoTypeForString('RELIGION_COUNCIL_OF_ESUS')):
if iBuild == gc.getInfoTypeForString('BUILD_MANA_SHADOW'):
return 0
if pPlayer.hasBonus(gc.getInfoTypeForString('BONUS_MANA_ENTROPY')) or pPlayer.hasHolyCity(gc.getInfoTypeForString('RELIGION_THE_ASHEN_VEIL')) :
if iBuild == gc.getInfoTypeForString('BUILD_MANA_ENTROPY'):
return 0
if pPlayer.hasBonus(gc.getInfoTypeForString('BONUS_MANA_ENCHANTMENT')):
if iBuild == gc.getInfoTypeForString('BUILD_MANA_ENCHANTMENT'):
return 0
#one enchantment node for everyone
if pPlayer.isHasTech(gc.getInfoTypeForString('TECH_ALTERATION')):
if not pPlayer.hasBonus(gc.getInfoTypeForString('BONUS_MANA_ENCHANTMENT')):
if iBuild != gc.getInfoTypeForString('BUILD_MANA_ENCHANTMENT'):
return 0
elif iBuild == gc.getInfoTypeForString('BUILD_MANA_ENCHANTMENT'):
return 0
#and a body node
if not pPlayer.hasBonus(gc.getInfoTypeForString('BONUS_MANA_BODY')):
if iBuild != gc.getInfoTypeForString('BUILD_MANA_BODY'):
return 0
elif iBuild == gc.getInfoTypeForString('BUILD_MANA_BODY'):
return 0
lil' work for you, Cyther.
Python exception
http://www.2shared.com/file/6555750/9ff3062c/python.html
I don't know why, but it really gets called extremely often. I just tested the following code in a 2 player AI autoplay duel game for 1 turn:
Code:if pPlayer.isHuman() == False: print ("canbuild call") if eTeam.isHasTech(gc.getInfoTypeForString('TECH_CONSTRUCTION')) == True : if pPlayer.getCivics(gc.getInfoTypeForString('CIVICOPTION_GOVERNMENT')) == gc.getInfoTypeForString('CIVIC_ARISTOCRACY') or pPlayer.getCivics(gc.getInfoTypeForString('CIVICOPTION_GOVERNMENT')) == gc.getInfoTypeForString('CIVIC_THEOCRACY') or pPlayer.getCivics(gc.getInfoTypeForString('CIVICOPTION_LABOR')) == gc.getInfoTypeForString('CIVIC_GUILDS') or pPlayer.getCivics(gc.getInfoTypeForString('CIVICOPTION_CULTURAL_VALUES')) == gc.getInfoTypeForString('CIVIC_SCHOLARSHIP'): if iBuild == gc.getInfoTypeForString('BUILD_COTTAGE'): return 0 if iBuild == gc.getInfoTypeForString('BUILD_FORT'): return 0 if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_LJOSALFAR') or pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_SVARTALFAR'): if iBuild == gc.getInfoTypeForString('BUILD_LUMBERMILL'): return 0 if not pPlayer.hasTrait(gc.getInfoTypeForString('TRAIT_FALLOW')) : if iBuild == gc.getInfoTypeForString('BUILD_WORKSHOP'): return 0 if gc.getBuildInfo(iBuild).getType()[0:11] == 'BUILD_MANA_': if pPlayer.isHasTech(gc.getInfoTypeForString('TECH_ELEMENTALISM')): # These civs always need a fire node if pPlayer.getCivilizationType() in (gc.getInfoTypeForString('CIVILIZATION_LUCHUIRP'), gc.getInfoTypeForString('CIVILIZATION_LJOSALFAR'), gc.getInfoTypeForString('CIVILIZATION_SVARTALFAR')): if not pPlayer.hasBonus(gc.getInfoTypeForString('BONUS_MANA_FIRE')): if iBuild != gc.getInfoTypeForString('BUILD_MANA_FIRE'): return 0 if pPlayer.isHasTech(gc.getInfoTypeForString('TECH_NECROMANCY')): #These civs should spectrespam and build the necrotower if pPlayer.getCivilizationType() in (gc.getInfoTypeForString('CIVILIZATION_SHEAIM'), gc.getInfoTypeForString('CIVILIZATION_CALABIM')): if iBuild not in (gc.getInfoTypeForString('BUILD_MANA_DEATH'),gc.getInfoTypeForString('BUILD_MANA_CHAOS'),gc.getInfoTypeForString('BUILD_MANA_ENTROPY'),gc.getInfoTypeForString('BUILD_MANA_SHADOW'),gc.getInfoTypeForString('BUILD_MANA_ENCHANTMENT')): return 0 if pPlayer.hasBonus(gc.getInfoTypeForString('BONUS_MANA_CHAOS')): if iBuild == gc.getInfoTypeForString('BUILD_MANA_CHAOS'): return 0 if pPlayer.hasBonus(gc.getInfoTypeForString('BONUS_MANA_SHADOW')) or pPlayer.hasHolyCity(gc.getInfoTypeForString('RELIGION_COUNCIL_OF_ESUS')): if iBuild == gc.getInfoTypeForString('BUILD_MANA_SHADOW'): return 0 if pPlayer.hasBonus(gc.getInfoTypeForString('BONUS_MANA_ENTROPY')) or pPlayer.hasHolyCity(gc.getInfoTypeForString('RELIGION_THE_ASHEN_VEIL')) : if iBuild == gc.getInfoTypeForString('BUILD_MANA_ENTROPY'): return 0 if pPlayer.hasBonus(gc.getInfoTypeForString('BONUS_MANA_ENCHANTMENT')): if iBuild == gc.getInfoTypeForString('BUILD_MANA_ENCHANTMENT'): return 0 #one enchantment node for everyone if pPlayer.isHasTech(gc.getInfoTypeForString('TECH_ALTERATION')): if not pPlayer.hasBonus(gc.getInfoTypeForString('BONUS_MANA_ENCHANTMENT')): if iBuild != gc.getInfoTypeForString('BUILD_MANA_ENCHANTMENT'): return 0 elif iBuild == gc.getInfoTypeForString('BUILD_MANA_ENCHANTMENT'): return 0 #and a body node if not pPlayer.hasBonus(gc.getInfoTypeForString('BONUS_MANA_BODY')): if iBuild != gc.getInfoTypeForString('BUILD_MANA_BODY'): return 0 elif iBuild == gc.getInfoTypeForString('BUILD_MANA_BODY'): return 0
and the log file shows 995 instances of canbuild call, with just the 3 starting units + barabarians and no workers at all. So putting more than a few if statements into it gets expensive really fast.
For a turn 400 large pangaea save "canbuild call" gets written 75000 times after a single turn, so it's extremely expensive lategame.