Why can flight be turned on and off? It just adds more clutter, and there appears to be no downside to leaving it permanently on.
Do you not build roads to important places? Flying units don't get road bonuses.
I think what he meant was, if you live in the US and can download both files maybe you could reupload them somewhere else?
Glad to see you're still alive and kicking MagisterCultuum. In the meantime did you look for alternative upload solutions? Ever tried http://1339.cf/ or https://maxfile.ro/? No nonsense, no registration needed, simply upload and share the link.
I didn't practice as much as I probably should have and the AutoCAD Civil 3D trial period is officially over now, but that doesn't actually seem to be stop me from using the program so it is probably no big deal.Thanks MagisterCultuum, i wish you good luck with the job!
There's no hurry even though i'm really itching to play, your priorities are sound.
Civ placement is handled before the python code that makes temporary terrain changes ever runs. As such, it is based on the permanent map features which will appear in the future if teraforming spells or events don't change anything.You're right, I also got confused by the oceans and resource placement.
How does the map account for civ placement? Does it go by the map as it is, or the future resource/terrain?
I looked at it, but did not play many turns or examine carefully enough to get a good sense of was going on.Did you look at the save?
I posted a screen shot for you.I don't know if that happened. What does the event look like, exactly?
This is the first I'm hearing about it. What are the conditions for it, and is there a way to disable it?
def warScript(self, iPlayer):
pPlayer = gc.getPlayer(iPlayer)
eTeam = gc.getTeam(pPlayer.getTeam())
if not eTeam.isAVassal():
iCiv = pPlayer.getCivilizationType()
iDoviello = gc.getInfoTypeForString('CIVILIZATION_DOVIELLO')
iInfernal = gc.getInfoTypeForString('CIVILIZATION_INFERNAL')
iLjosalfar = gc.getInfoTypeForString('CIVILIZATION_LJOSALFAR')
iSvartalfar = gc.getInfoTypeForString('CIVILIZATION_SVARTALFAR')
iEvil = gc.getInfoTypeForString('ALIGNMENT_EVIL')
iMastery = gc.getInfoTypeForString('BUILDINGCLASS_TOWER_OF_MASTERY')
iAltarDivine = gc.getInfoTypeForString('BUILDING_ALTAR_OF_THE_LUONNOTAR_DIVINE')
iAltarExalted = gc.getInfoTypeForString('BUILDING_ALTAR_OF_THE_LUONNOTAR_EXALTED')
iEnemy = -1
for iPlayer2 in range(gc.getMAX_PLAYERS()):
pPlayer2 = gc.getPlayer(iPlayer2)
if pPlayer2.isAlive():
iTeam2 = pPlayer2.getTeam()
if eTeam.isAtWar(iTeam2):
if CyGame().getSorenRandNum(100, "War Script") < 5:
self.dogpile(iPlayer, iPlayer2)
if self.warScriptAllow(iPlayer, iPlayer2):
if pPlayer2.getBuildingClassMaking(iMastery) > 0:
if eTeam.getAtWarCount(True) == 0:
self.startWar(iPlayer, iPlayer2, WarPlanTypes.WARPLAN_TOTAL)
iCiv2 = pPlayer2.getCivilizationType()
if CyGame().getGlobalCounter() > 20:
if (iCiv == iSvartalfar and iCiv2 == iLjosalfar) or (iCiv2 == iSvartalfar and iCiv == iLjosalfar):
if CyGame().getPlayerRank(iPlayer) > CyGame().getPlayerRank(iPlayer2):
self.startWar(iPlayer, iPlayer2, WarPlanTypes.WARPLAN_TOTAL)
if pPlayer.getAlignment() == iEvil:
if CyGame().getGlobalCounter() > 40 or iCiv in [iInfernal, iDoviello]:
if eTeam.getAtWarCount(True) == 0 and CyGame().getPlayerRank(iPlayer2) > CyGame().getPlayerRank(iPlayer):
if iEnemy == -1 or CyGame().getPlayerRank(iPlayer2) > CyGame().getPlayerRank(iEnemy):
iEnemy = iPlayer2
if pPlayer2.getNumBuilding(iAltarDivine) > 0 or pPlayer2.getNumBuilding(iAltarExalted) > 0:
if eTeam.getAtWarCount(True) == 0:
self.startWar(iPlayer, iPlayer2, WarPlanTypes.WARPLAN_TOTAL)
if iEnemy != -1:
if CyGame().getPlayerRank(iPlayer) > CyGame().getPlayerRank(iEnemy):
self.startWar(iPlayer, iEnemy, WarPlanTypes.WARPLAN_TOTAL)
def warScriptAllow(self, iPlayer, iPlayer2):
if iPlayer == gc.getBARBARIAN_PLAYER():
return False
pPlayer = gc.getPlayer(iPlayer)
iTeam = pPlayer.getTeam()
eTeam = gc.getTeam(iTeam)
pPlayer2 = gc.getPlayer(iPlayer2)
iTeam2 = pPlayer2.getTeam()
if not eTeam.isHasMet(iTeam2):
return False
if eTeam.AI_getAtPeaceCounter(iTeam2) < 20:
return False
# if pPlayer.AI_getAttitude(iPlayer2) <= gc.getLeaderHeadInfo(pPlayer.getLeaderType()).getDeclareWarRefuseAttitudeThreshold():
# return False
if eTeam.isAtWar(iTeam2):
return False
if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_INFERNAL'):
if pPlayer2.getStateReligion() == gc.getInfoTypeForString('RELIGION_THE_ASHEN_VEIL'):
return False
return True
def dogpile(self, iPlayer, iVictim):
pPlayer = gc.getPlayer(iPlayer)
iBal = gc.getInfoTypeForString('CIVILIZATION_BALSERAPHS')
for iPlayer2 in range(gc.getMAX_PLAYERS()):
pPlayer2 = gc.getPlayer(iPlayer2)
iChance = -1
if pPlayer2.isAlive():
if self.dogPileAllow(iPlayer, iPlayer2) and self.warScriptAllow(iPlayer2, iVictim):
iChance = pPlayer2.AI_getAttitude(iPlayer) * 5
if iChance > 0:
iChance -= (pPlayer2.AI_getAttitude(iVictim) * 5) - 10
if not CyGame().isOption(gc.getInfoTypeForString('GAMEOPTION_AGGRESSIVE_AI')):
iChance -= 10
if iChance > 0:
iChance += (CyGame().getGlobalCounter() / 3)
if pPlayer2.getCivilizationType() == iBal:
iChance = CyGame().getSorenRandNum(50, "Dogpile")
if CyGame().getSorenRandNum(100, "Dogpile") < iChance:
self.startWar(iPlayer2, iVictim, WarPlanTypes.WARPLAN_DOGPILE)
def dogPileAllow(self, iPlayer, iPlayer2):
pPlayer = gc.getPlayer(iPlayer)
pPlayer2 = gc.getPlayer(iPlayer2)
if pPlayer2.isHuman():
return False
if iPlayer == iPlayer2:
return False
iTeam = gc.getPlayer(iPlayer).getTeam()
iTeam2 = gc.getPlayer(iPlayer2).getTeam()
if iTeam == iTeam2:
return False
if pPlayer2.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_ELOHIM'):
return False
if gc.getTeam(iTeam2).isAVassal():
return False
return True
It's annoying for players. How do I remove any 'category' from them completely? Auric Ascended appears to be this way, so I assume it can be done, but I don't want to mess up files I don't understand.
Two more questions: Why can flight be turned on and off? It just adds more clutter, and there appears to be no downside to leaving it permanently on. And Decius appears to be evil ingame, though the character menu says he is neutral. Did you intend to make him evil?
You could remove the "Winged" promotion while leaving the "Flying" promotion in place for any unit you do not want to let toggle flying on and off.I did not know this. But the hawk should at least have the option removed. How do I do that?
a note on Sheaim...
currently playing them... and I found that the early game is "a-religious".
I tried a "bee-line" to pyre-zombies. not really a bee-line as I took the time to take hunting, calendar, animal husbandry and a few other to resist the enemies.
however I received religions from other civs during my early game but I couldn't take those.... it was frustrating.
OO gave me -2 fire mana... and pyre zombies need fire mana.
RoK was ok... but brings me to "neutral"... and pyre zombies need "evil".
so I didn't try to get FoL in case it would be science spent for nothing.
I think the Pyre zombie could get less restrictions : maybe remove the "evil" and replace it by "cannot be built by good" ?
Hey,i can't download from the dl website(can't in my region) in the link you give in the OP.Anyone have a other up to date DL?
Hm, could it be that all those who have problems downloading are outside of the United States? I recall getting a mail some weeks ago that MyFlare discontinues offering its services to people outside the USA. At the time I thought this was only for uploaders, but with all the recent complaints it appears to me that this applies to downloads as well.
You can fix the DL?![]()
I did not know this. But the hawk should at least have the option removed. How do I do that?
I think what he meant was, if you live in the US and can download both files maybe you could reupload them somewhere else?
I guess so, if I actually was living in America.
I don't think locations is really relevant here.I live in the US and I am also getting a blank page when I try to load the download links.
I think that it's a perfect solution.It requires python instead of the more efficient xml, but ok.
I just changed it so that non-good players can build it, but as banned any member of the Overcouncil from training any undead unit after the resolution to ban death mana.
The unit's Strategy text needed updating anyway, so I included the new restriction descriptions there.
- Are there any quests in the game? I don’t recall having seen any.
Great News
I tested it and found the same problem, but have not found a solution yet and did not want this rarely-played scenario to hold up the release for everyone- The Radiant Guard scenario seems altogether unplayble. The game crashes after showing the intro/outro screen.
I don't think "quests" are really used in any FfH2 mod. I'm not very familiar with how they work- Are there any quests in the game? I don’t recall having seen any.
I don't think there is a way to make it remember civs. It could be made to remember game options, but that can cause problems due to options carrying over from other mods where they do different hings. With hidden options, you could get stuck using some game option that was only meant for a specific scenario and would cause massive problems in a random game.- Could you make the custom game remember the previous settings and civs selection?
- Concering the hawks. Wouldn’t it be more fitting to use them as a regular summoned unit with the duration of one turn and ignoring terrain(a bit like floating eyes in the original FFH)? Right now the hawks can reveal a ridiculously huge amount of terrain in one flight. My idea is that certain recon units could buy this „spell“ in hunting lodges.
- Suggestion about cities: Conquered cities would change their cultural appearance as soon as the conquering nation reaches majority on the city‘s nationality bar.
I use Moddb, which seems to work fine. I've no idea where the problems are coming from or the advantages/disadvantages are of different sites, though.
So, it looks like there have been 22 downloads so far. Anyone care to offer feedback?
I'll probably release another version within a week, but I want to make sure that all the bugs are fixed and that I can to implement any decent fan suggestions first.
Since the release I have fixed a couple of minor bugs, made a couple things run more efficiently, added a few more PyHelp tags and clarified the text in a couple old ones.
I now have Vitalize, Spring, and Scorch explaining exactly the changes you will see once they are cast. (It won't explain the real terrain changes if there is temp terrain there, as the player shouldn't know about that.)
For Spring, that includes the directions of the Smoke or Flames it removes.
I now have Shape Shift telling you what unit and promotions the changeling will copy, and Assume True Form identifying what that true form is.
I realized that it actually would not be that hard to change the Teach Spellcasting and Teach Golems so that they inform you exactly what promotions may be taught to what units. I think the code is even more efficient this way, so I'm going with it.
I made Teach Golems also list how many units would be taught something that turn.
The odds of a single unit with Govannon's Ethics teaching something can be determined simply by it xp and whether it has anything to teach anyone, but calculating such odds for a whole group of units that know different spells is practically impossible. The odds displayed for groups in my last version are wrong and misleading. I just now changed it so that odds will only be displayed when there is a single selected unit capable of teaching something.
I'm still trying to decide whether the daunting task of explaining Sanctify's exact effects is worth coding.
I may make spells like Ring of Fire also state the direction of where they change the terrain/feature/improvement. I have to loop through directions rather than tiles for this though, and can't do it for spells with more than a one tile range.
I'm still considering the value of adding PyHelp even to xml only spells, to identify exactly what units they can target. Originally I thought it would be way too inefficient, but I think the code would only run if a human mouses over the button. The big inefficiencies come from AI's checking spell prereqs.
def helpBlockedByNullstone(lpUnits, eSpell):
szBuffer = ''
pCaster = lpUnits[0]
pPlot = pCaster.plot()
if pPlot.isCityRadius():
if CyGame().getBuildingClassCreatedCount(gc.getInfoTypeForString('BUILDINGCLASS_NULLSTONE_CITADEL')) > 0:
iNullstone = gc.getInfoTypeForString('BUILDING_NULLSTONE_CITADEL')
iTeam = pCaster.getTeam()
bBlock = False
[COLOR="Red"]
if pPlot.isCity():
pCity = pPlot.getPlotCity()
[COLOR="Green"] if pCity.getNumBuilding(iNullstone) > 0:[/COLOR]
if pCity.getTeam() != iTeam:
bBlock = True[/COLOR]
if not bBlock:
pCity = pPlot.getWorkingCity()
if not pCity.isNone():
if pCity.getNumBuilding(iNullstone) > 0:
if pCity.getTeam() != iTeam:
bBlock = True
if not bBlock:
iX = pCaster.getX()
iY = pCaster.getY()
for iiX in range(iX-3, iX+4, 1):
for iiY in range(iY-3, iY+4, 1):
pPlot = CyMap().plot(iiX, iiY)
if pPlot.isNone():continue
if pPlot.isCity():
pCity = pPlot.getPlotCity()
if pCity.getNumBuilding(iNullstone) > 0:
if pCity.getTeam() != iTeam:
bBlock = True
if bBlock:
pPlayer = gc.getPlayer(pCity.getOwner())
sName = "<color=%d,%d,%d,%d>%s</color>" %(pPlayer.getPlayerTextColorR(), pPlayer.getPlayerTextColorG(), pPlayer.getPlayerTextColorB(), pPlayer.getPlayerTextColorA(), pCity.getName() )
szBuffer = CyTranslator().getText("TXT_KEY_SPELL_HELP_NULLSTONE_RAZE", (sName, sName,))
return szBuffer
def effectBlockedByNullstone(pCaster):
pPlot = pCaster.plot()
if pPlot.isCityRadius():
if CyGame().getBuildingClassCreatedCount(gc.getInfoTypeForString('BUILDINGCLASS_NULLSTONE_CITADEL')) > 0:
iNullstone = gc.getInfoTypeForString('BUILDING_NULLSTONE_CITADEL')
iTeam = pCaster.getTeam()
bBlock = False
[COLOR="Red"] if pPlot.isCity():
pCity = pPlot.getPlotCity()
[COLOR="Green"] if pCity.getNumBuilding(iNullstone) > 0:[/COLOR]
if pCity.getTeam() != iTeam:
bBlock = True[/COLOR]
if not bBlock:
pCity = pPlot.getWorkingCity()
if not pCity.isNone():
if pCity.getNumBuilding(iNullstone) > 0:
if pCity.getTeam() != iTeam:
bBlock = True
if not bBlock:
iX = pCaster.getX()
iY = pCaster.getY()
for iiX in range(iX-3, iX+4, 1):
for iiY in range(iY-3, iY+4, 1):
pPlot = CyMap().plot(iiX, iiY)
if pPlot.isNone():continue
if pPlot.isCity():
pCity = pPlot.getPlotCity()
if pCity.getNumBuilding(iNullstone) > 0:
if pCity.getTeam() != iTeam:
bBlock = True
if bBlock:
pCaster.setHasCasted(True)
return True
return False
def helpBlockedByNullstone(lpUnits, eSpell):
szBuffer = ''
pCaster = lpUnits[0]
pPlot = pCaster.plot()
if pPlot.isCityRadius():
if CyGame().getBuildingClassCreatedCount(gc.getInfoTypeForString('BUILDINGCLASS_NULLSTONE_CITADEL')) > 0:
iNullstone = gc.getInfoTypeForString('BUILDING_NULLSTONE_CITADEL')
iTeam = pCaster.getTeam()
pCity = pPlot.getWorkingCity()
if not pCity.isNone():
if pCity.getNumBuilding(iNullstone) > 0:
if pCity.getTeam() != iTeam:
pPlayer = gc.getPlayer(pCity.getOwner())
sName = "<color=%d,%d,%d,%d>%s</color>" %(pPlayer.getPlayerTextColorR(), pPlayer.getPlayerTextColorG(), pPlayer.getPlayerTextColorB(), pPlayer.getPlayerTextColorA(), pCity.getName() )
return CyTranslator().getText("TXT_KEY_SPELL_HELP_NULLSTONE_RAZE", (sName, sName,))
else:
iX = pCaster.getX()
iY = pCaster.getY()
for iiX in range(iX-3, iX+4, 1):
for iiY in range(iY-3, iY+4, 1):
pPlot = CyMap().plot(iiX, iiY)
if pPlot.isNone():continue
if pPlot.isCity():
pCity = pPlot.getPlotCity()
if pCity.getNumBuilding(iNullstone) > 0:
if pCity.getTeam() != iTeam:
pPlayer = gc.getPlayer(pCity.getOwner())
sName = "<color=%d,%d,%d,%d>%s</color>" %(pPlayer.getPlayerTextColorR(), pPlayer.getPlayerTextColorG(), pPlayer.getPlayerTextColorB(), pPlayer.getPlayerTextColorA(), pCity.getName() )
return CyTranslator().getText("TXT_KEY_SPELL_HELP_NULLSTONE_RAZE", (sName, sName,))
return szBuffer
def effectBlockedByNullstone(pCaster):
pPlot = pCaster.plot()
if pPlot.isCityRadius():
if CyGame().getBuildingClassCreatedCount(gc.getInfoTypeForString('BUILDINGCLASS_NULLSTONE_CITADEL')) > 0:
iNullstone = gc.getInfoTypeForString('BUILDING_NULLSTONE_CITADEL')
iTeam = pCaster.getTeam()
pCity = pPlot.getWorkingCity()
if not pCity.isNone():
if pCity.getNumBuilding(iNullstone) > 0:
if pCity.getTeam() != iTeam:
pCaster.setHasCasted(True)
return True
else:
iX = pCaster.getX()
iY = pCaster.getY()
for iiX in range(iX-3, iX+4, 1):
for iiY in range(iY-3, iY+4, 1):
pPlot = CyMap().plot(iiX, iiY)
if pPlot.isNone():continue
if pPlot.isCity():
pCity = pPlot.getPlotCity()
if pCity.getNumBuilding(iNullstone) > 0:
if pCity.getTeam() != iTeam:
pCaster.setHasCasted(True)
return True
return False