[MOD] MagisterModmod

A new version has just been released.

You may download the Installer here or the Archive here.


This version is based on Tholal's More Naval AI v2.5, and will break saved games.
 
Glad to see that our Wyvern Riders / updated Dragon Fanatics turned out so well! Do your Riders retain the Rebellious promotion even when you control a dragon? I'm assuming not, but it doesn't say anything about that in their 'pedia entry.

Any chance of a changelog? I'm curious about a fair few things based on the new MNAI patch, including the WorldBuilder "Adventure Mode" option and many of the WB -> GameData -> Global Defines options.

I noticed that the Doviello food yield on tundras is glitched, and causes crashes whenever a Doviello player's territory includes a tundra tile. I haven't tested it, but the new Lanun commerce bonus on "riverside Coast" tiles might cause some problems too.

One other minor oversight that isn't related to this new patch, but I noticed that the Infernals can't build farms to gain access to the Mushroom resource. Not that they particularly need it, but it's a trading commodity nonetheless.
 
The rebellious promotion of which you speak is not particular to the Wyvern Riders, but is the same for any unit of the Cult of the Dragon religion. Any such unit may randomly become rebellious when its owner does not have a dragon, but none can remain rebellious if it does.

That is actually speaking a bit loosely. The Kuriotates, Sheaim, and Barbarian State are always treated as if they control dragons. Other players are considered as having dragons if at least one of the dragons is controlled by their team.

I'm afraid that I am not organized enough to give a complete changelog, but I can explain various changes when I think of them.

Adventure Mode is not actually new. It is a game option which Kael included for the sake of scenarios like the Gift of Kylorin. Basically, it makes the units giant so that it is easier to think of the game on the scale of a first person dungeon adventure rather than on the scale of a war between empires.

I merely decided to make game options like Adventure Mode visible, and to add TXT_KEYs so that they don't take up so much space under WB -> GameData -> Global Defines options.

The only actual Game Option I changed is turning Load Screen Scenario into Control Whole Team. It was previously to tell Kael's dummy scenario to open the scenario screen as soon as the game starts. The scenario screen has never really worked in MNAI anyway. As Control Whole Team, it allows a human player to alternate between controlling his teammates. (You, Aurelazza, were sent the code that does this in a PM a while back, but it should be new to everyone else.)


I am still exploring the features that Tholal borrowed from Playpting's Enhanced World Builder. I am by no means an expert on them, and am concerned that some worldbuilder changes sometimes cause the game to crash, but I really do like the new functionality to adds.

The only change I made to new worldbuilder code is re-purposing the Made Intercept toggle to instead be a Has Casted toggle. I don't think there are actually any units in FfH2 that can intercept, as there are no air fighter units, which makes the ability to restore casting ability much more useful.


I noticed in one of my first games after the release that the game crashed as soon as I (Charadon of the Doviello) founded by first city, but I had no idea why. Thank you for pointed me to the extra yields as the cause.

----------
In my latest game, I discovered that Acheron is no longer being held in his city. I think I have figured out why.


Many versions back I removed the Held promotion from Acheron and instead inserted some code into effectCultusDraconis that caused him to return to his city after every move. I did this because the Held promotion prevented him from being any danger to units amassing just outside his city. It blocked moves, and thus attacks, and also prevented him from using his Breath Fire or Roar abilities. I did not want him to have to rely on Disciples of Acheron and Sons of the Inferno to preemptively defend himself.


A while back (I forget whether this was before my previous release or just afterwards) I discovered that the way I had been forcing Acheron to go back to his city was also preventing him from being captured when defeated by a unit with the Subdue Beast promotion. It furthermore prevented the creation of his sluagh or his bones, which made it impossible to resurrect him. This was a serious enough issue that I decided to give him back the Held promotion.

I gave back the Held promotion after the previous release of MNAI changed how it worked. In Base FfH2, it prevents a unit from casting spells in addition to holding them in place. I requested that Tholal change this so that those two effects were caused by different tags. In the previous release bHeld no longer blocked casting, but the new bCastingBlocked tag was not introduced until MNAI v2.5. After the latest merge, I made the Held promotion block casting again.



In response to complaints about how it was too easy to explore lairs competitively, I made it so that lairs would often spawn Big Bads with a new Lair Guardian promotion. This promotion holds the unit in place, increases its defensive bonus, makes it more likely to defend, makes it hidden nationality, makes its summons hidden nationality, and of course does not block casting. I gave it a PyPerTurn effect to remove the promotion if the lair was destroyed (this never happens for Unique Features but often happens for regular lairs) or if the guardian was captured (since many of the possible guardians are animals).

Shortly before my latest release, I decided to switch Acheron to use the Lair Guardian promotion too, so that he could still Breath Fire/Roar. I adjusted its PyPerTurn effect so that the promotion would also not be removed if the unit was in a city that possessed the Dragon's Hoard.

Once I noticed Acheron approaching my city, I realized my mistake; in my modmod, the Dragon's Hoard does not enter the game until Acheron is defeated. I should have instead checked for Acheron's Wyrmhold instead.
Spoiler :

Code:
def effectGuardLair(pCaster):
	if pCaster.isBarbarian():
		pPlot = pCaster.plot()
		if pPlot.isCity():
			[S][COLOR="Red"]if pPlot.getPlotCity().getNumBuilding(gc.getInfoTypeForString('BUILDING_THE_DRAGONS_HOARD')):[/COLOR][/S]
			[COLOR="Green"]if pPlot.getPlotCity().getNumBuilding(gc.getInfoTypeForString('BUILDING_WYRMHOLD_ACHERON')):[/COLOR]
				return False
		iImp = pPlot.getImprovementType()
		if iImp != -1:
			if gc.getImprovementInfo(iImp).isPermanent():
				return False
	pCaster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_LAIR_GUARDIAN'), False)
	return False

I'm wondering now though if it might be better to allow Lair Guardians to be held in any barbarian city.

Alternately, it might be interested to make Lair Guardian only hold a unit in a city if it is the Cult of the Dragon Holy City. This would make the Kuriotate World Spell (which moves the Holy City status) very dangerous, as casting it could send Acheron on a rampage. I am seriously considering this, as the spells current effects are kind of bland. I'd probably want to give it a later tech prereq too if I do this though, as I would not want Cardith to kill himself this way.

I just thought of another possible boost to Legends too. I could make it grant a significant number of production points toward Stir from Slumber, the way that Mulcarn's Last Breath can hasten The Draw.
 
Letting Acheron loose with a worldspell seems fun in a chaotic, "let the world burn" kind of way. Not so sure that that fits the Kuriotates civ, however. Perhaps if it were to focus on spreading the Cult by gifting a number of the caster's units Evangelist and the CotD promotions? The idea of having it speed up Stir From Slumber certainly doesn't seem like a bad one.

Have you noticed that with the Control Whole Team option, as soon as you switch from Civ A to Civ B, all of Civ A's cities will change the plots they work? In my experience it always places a heavy emphasis on production, meaning cottages rarely get a chance to grow.
 
I just tested it. Moving the holy city did result in Acheron loosing the Lair Guardian promotion. That made it possible for him to leave the city, but he never actually chose to do so during the several turns that I chose to wait.

I remember Kael having issues with Acheron's unpredictability too, before he finally gave up and just gave him the Held promotion. He could go dozens of games without ever deciding to leave his lair, and then in the next game might decide to conquer the world.


I don't think that freeing Acheron intentionally would fit the Kuriotates very well, but it is fine as a potential side effect. Acheron needed to tap the passion of the Orcs in order to enter Erebus, and then stayed with them for their worship. Once dragon worship is widespread, he may wish to venture forth to find more followers. He is prideful and insecure enough that rumors of a dragon greater than himself could make him feel the need to prove his own power to the world. He might even fear his old enemy Eurabatres so much that he feels the need to exterminate his worshipers before they are able to restore The Golden One to his former glory.


Speeding up Stir from Slumber works nicely. At first I chose to make it add 700 hammers (since I just coped the code from Mulcarn's Last Breath), but that resulted in there being over 100 overflow that let me build other things faster too. I decided to reduce it to 500, which left my size 3 city with 12 more turns to finish it. That seems good enough.

Gifting the caster a few Dragon Fanatics is how Legends works in the last few releases. That is the impression that I and at least a few other players of the game found unimpressive.

Dragon Fanatics are bit more useful in this release though. I changed the Cult of the Dragon Evangelize to City spell so that it works in tiles adjacent to a city, rather than needing to be in the city. They are still blocked (in python) from entering rival cities when not at war, because Tholal did not fix the problems associated with that. (A bAlwaysHostile unit is not treated as hostile when it in entering such a city, and may do so peacefully. When in the city, it cannot be attacked without causing a war but it can prevent the city's own units from entering the plot. This is an even bigger problem because it the AI units cannot understand it and will keep trying to enter the city, causing an infinite loop.)

For some unknown reason, the code I used before to block bAlwaysHostile units from entering Super Forts does not seem to work anymore. As such, I commented it out. That means that Dragon Fanatics and Wyvern Riders are now able to capture Superforts from your rivals without declaring war.



Edit: Oh, I now realize that you probably mean gifting many of the unit the player already has the ability to spread the religion, rather than giving them units that can do so. That probably would be an improvement. It would be easier to just give Evangelist to all of the units that the spell converts to CotD though, rather than only to those belonging to the caster.

I'm thinking that doing all of those things would be fine if the spell had a prereq of Divine Essence. That is very late in the game, but the Kuriotates are usually quite strong in te mid game as it is. Having the same tech prereq as Stir from Slumber makes sense if it is to be used to hasten the ritual.

-----

I'm not sure whether the issue with Control Whole Team is actually related to the workers being reassigned. The number of turns left for things to get completed goes back once you switch back. I think the difference is that the AI controlled player gets the bonuses that the game gives to all computer players; cheating is the only way an AI can really compete with a human mind. I don't believe that this has any real effect though, as the bonuses disappear when you take control of the player again.
 
Stir from Slumber requires the Divine Essence technology and the presence of The Cult of the Dragon religion in the city where it is performed. Any player can perform it, although not many would want to do so.

Its effect is to allow the all of the dragons to enter the world at the site of their bones. Eurabatres goes to Cardith Lorda of the Kuriotates. Abashi goes to Tebryn Arbandi of the Sheaim, or another Sheaim leader if he is not in the game. Drifa goes to Auric Ulvin of the Illians only if The Draw had already been completed, and otherwise is given to the barbarian state. Acheron is given to the Barbarian state if they have not actually trained him before that. Thalatth is given to the Barbarian state unless the player that completed the ritual has Octopus Overlords as his state religion, in which case the razed dragon will serve him instead.
 
The only actual Game Option I changed is turning Load Screen Scenario into Control Whole Team. It was previously to tell Kael's dummy scenario to open the scenario screen as soon as the game starts. The scenario screen has never really worked in MNAI anyway. As Control Whole Team, it allows a human player to alternate between controlling his teammates. (You, Aurelazza, were sent the code that does this in a PM a while back, but it should be new to everyone else.)

This is awesome.
Can it extend to a turn-by-turn basis?
 
I'm not quite sure what you mean by that, but I think you may be asking if it can be made to work the way it already works.

The mechanic works through this code which I placed at the very end of def onEndPlayerTurn(self, argsList):

Code:
		if gc.getGame().isOption(GameOptionTypes.GAMEOPTION_WB_LOAD_SCREEN):#I have reporposed this to be Control Teammates
			if not gc.getGame().isHotSeat():#In hotseat games this may result in skipping players
				if pPlayer.isHuman():
					iTeam = pPlayer.getTeam()
					if gc.getTeam(iTeam).getNumMembers() > 1:
						for iLoopPlayer in range(iPlayer,gc.getMAX_PLAYERS()):
							pLoopPlayer = gc.getPlayer(iLoopPlayer)
							if iTeam == pLoopPlayer.getTeam():
								if pLoopPlayer.isAlive():
									if not pLoopPlayer.isHuman():
										CyGame().reassignPlayerAdvanced(iPlayer, iLoopPlayer, -1)
										break
						else:
							for iLoopPlayer in range(0,iPlayer):
								pLoopPlayer = gc.getPlayer(iLoopPlayer)
								if iTeam == pLoopPlayer.getTeam():
									if pLoopPlayer.isAlive():
										if not pLoopPlayer.isHuman():
											CyGame().reassignPlayerAdvanced(iPlayer, iLoopPlayer, -1)
											break

Once a human player's turn is over, he is immediately reassigned to take over the next living member of his team. As such, you already play as every teammate every turn.


(You could end up skipping players if the game option was used in a Hotseat game. I tested it, and found that I kept hopping around in a very confusing way. That is why I decided to block it in Hotseat games. Come to think of it, there would probably be similar if not worse issues on other kinds of multiplayer games. I think I'll disable it with them too.)


I just now changed the Open Mercurian Gate spell so that it no longer has a popup asking if you wish to switch to controlling Basum when the Control Whole Team game option is active. Since you'd control him anyway, the popup just wastes times an resources in order to give you the option of ending your turn early.


I just realized that I also placed the Control Whole Team code at the end of def onSetPlayerAlive(self, argsList):, so that you switch to your next teammate when your current player is defeated. I think I did this to test the code before I made it a game option. I forgot to include the conditional to check for the gameoption until now, and I don't actually recall whether I actually tested to see if it works. I guess I'll do that now.

Edit: The code in def onSetPlayerAlive(self, argsList): was bugged, because the parameter that is usually called iPlayer should be called iPlayerID there instead. I just fixed it so it works fine now.
 
Yeah, it seemed too good to be true :)
Thanks, that is seriously awesome.
 
Yeah, it's a brilliant little tidbit of code for sure. Now this might just have been a fluke, but when I was playing "The Wages of Sin" as Os-Gabella / Hyborem, I clearly recall assigning a city to work cottage tiles as Ozzy, switching to Hybo, then returning to find that instead of low-yield cottages my Sheaim city was working high-yield mines / plantations. I switched back to the cottages, and next turn it had reverted to the mines/plantations again.

Does anybody know at what point in the turn the AI assesses all workable plots and assigns citizens to them? Because it would appear that it happens at the start or end of a *game* turn, not the specific civ's turn.

Should we expect a fix-patch for the Doviello tundra-yield crashes some time soon?
 
I'm not sure about


I could release an update now, but I'd rather wait to find out when Tholal will be releasing MNAI v2.51. There are a couple of little bugs on his end I'd like to be able to fix at the same time. If I don't get an ETA on v2.51, or if it is distant, then I'll release another update in less than a week.


You can fix the Doviella Tundra yield issue yourself by editing CIV4CivilizationInfos.xml so that all instances of <iYield></iYield> are changed to <iYield>0</iYield>.

It is a shame that the Doviello are so unplayable for now, as they got one of the more significant improvements in this release. The Scavenger promotion (which their civ trait gives to all Animal, Beast, Mella, and Recon units) now allows units to be upgraded anywhere, including in unowned and enemy territory. (Adventurer and Angel do too, but you cannot directly build whole armies with those promotions.)


----
I discovered and fixed a bug that was preventing summons from entering enemy forts, and also got it working again so that bAlwaysHostile units cannot capture forts while not at war with the former owner.

I decided to reduce down the chances of Cult of the Dragon revolts happening randomly, but also change the Roar spell so an actual dragon can incite its worshipers in an adjacent hostile city to revolt or even capture the city without combat. (Its effects on units are unchanged.) It only works on cities that have the Cult of the Dragon religion present and also belong to an enemy player that does not have a dragon.

(It uses the usual cf.isHasDragon(pPlayer) call, so the Kuriotates, Sheaim, and Barbarians are always treated as having dragons, as are players whose teammates actually control a dragon.) It will not work on a city that has Unyielding Order.

Now that I think of it, Abashi and Eurabatres probably should be able to take over cities and capture units from rebellious Sheaim and Kuriotate splinter groups. I think I'll change it so that the civ type is only a protection before the dragons themselves enter the world, and you actually have to be on the dragon's team after that to get the benefit.

I'll also switch Legends so that it rushes Stir from Slumber no matter who is performing the ritual. The code is actually simpler that way.
 
Did you intend to give the Doviello 1 bonus food on tundra tiles, or was the <iYield></iYield> still intended to be 0?

Oh, and can you think of any changes which might have invalidated the Huge pre-settled scenario map by Nikis-Knight? The callback defines slowdown made it unplayable in the game's later stages, but now it seems to crash whenever I try and run it.
 
I think that I mistakenly gave them extra :commerce: from Tundras and Wastelands, as well as from rivers running through them. I believe I intended is the way I have it now: the Doviello get +1 :food: from Tundras and +1 :hammers: from Wastelands.


I'm not entirely sure which map you mean. Is it the one called "KE huge ICE Empires v1.1 for MagisterModmod.CivBeyondSwordWBSave"? That seems to be running very slowly for me, but without any errors. (The "for MagisterModmod" part distinguishes it from an older original which I believe had compatibility issues related to Mushrooms and Penguins being resources instead of bonuses in my modmod.)

I don't think that there have been any recent changes that could render a map incompatible, but the last release of my modmod is certainly incompatible with any saved games from previous versions.


----

I just thought you might like to know that I have made some changes to the enhanced worldbuilder.

First, I upgraded the "Platy World Builder" component to the new version that platyping released just yesterday. It seems a bit more stable now; you don't get crashes form forgetting to press enter after inputting a number. (Edit: Actually, that can still happen if you forget to press enter after typing a new value into the research progress box.) The windows are re-sized based on your resolution, so they are easier to navigate.

More important is the new functionality. The Player Data window now includes a drop down menu that lets you change the player's Alignment. The Unit Data window now has a drop down menu to let you change the Unit's Religion and a number box to let you change the unit's Duration. The Made Intercept button was also put back to its original purpose, as I was able to add a separate new radio button for Has Casted.
 
I have just uploaded the new release.

You may download the Installer here or the Archive here.


I am pretty sure that this will not be compatible with any previous release.

(That is mostly because I replaced the Hallowed Ground improvement with a Hallowed Ground Feature. This is used in the Lord of the Balor's scenario to hold back the spread of hell and to prevent demons from crossing the defensive mountain range. Switching it to a feature allows a Runes of Kilmorph player to build improvements on those peaks. It should also allow me to make it impassible to all units that have the Demon promotion in their xml defines, thus making the block in python more efficient. Unfortunately, doing so seemed to be causing some strange unexplained errors in worldbuilder.)
 
Playing the latest version and cast recruit in one of my cities as the Lanun. Got 4 Thalal the blue dragons.
EDIT: Also, AIs keep cancelling open borders in favor of right of passage on me before suggesting open borders a few turns later, though this may be because I'm Esus at the moment in which case it's almost shrewd.
 
The issue with recruiting Thalatth comes from a slight mistake I made when I altered the Recruit spell to allow it to recruit whatever a city's default conscripted units would be. The problem is that pCity.getConscriptUnit() returns the UnitType index, not the UnitClass index, and the code was finding that civ's UnitType for the UnitClass that should itself have been a unit type. I fixed this issue by adding an "else:" and changing a bit of indentation.

Spoiler :
Code:
def spellRecruit(pCaster):
	iReligion = pCaster.getReligion()
	pPlot = pCaster.plot()
	pCity = pPlot.getPlotCity()
	pPlayer = gc.getPlayer(pCaster.getOwner())
	eTeam = gc.getTeam(pPlayer.getTeam())
	iLoop = (pCity.getPopulation() / 3) + 1
	if pCity.getNumBuilding(gc.getInfoTypeForString('BUILDING_TEMPLE_OF_THE_ORDER')) == 1:
		iLoop *= 2
	for i in range(iLoop):
		iRnd = CyGame().getSorenRandNum(100, "Bob")
		iUnit = -1
		if iRnd > 60:
			iUnit = pCity.getConscriptUnit()
		else:
			if iRnd < 10:
				iUnit = gc.getInfoTypeForString('UNITCLASS_SCOUT')
				if eTeam.isHasTech(gc.getInfoTypeForString('TECH_HUNTING')):
					iUnit = gc.getInfoTypeForString('UNITCLASS_HUNTER')
				if eTeam.isHasTech(gc.getInfoTypeForString('TECH_ANIMAL_HANDLING')):
					iUnit = gc.getInfoTypeForString('UNITCLASS_RANGER')
			elif iRnd < 20:
				iUnit = gc.getInfoTypeForString('UNITCLASS_SCOUT')
				if eTeam.isHasTech(gc.getInfoTypeForString('TECH_HUNTING')):
					iUnit = gc.getInfoTypeForString('UNITCLASS_HUNTER')
				if eTeam.isHasTech(gc.getInfoTypeForString('TECH_POISONS')):
					iUnit = gc.getInfoTypeForString('UNITCLASS_ASSASSIN')
			elif iRnd < 30:
				iUnit = gc.getInfoTypeForString('UNITCLASS_SCOUT')
				if eTeam.isHasTech(gc.getInfoTypeForString('TECH_HORSEBACK_RIDING')):
					iUnit = gc.getInfoTypeForString('UNITCLASS_HORSEMAN')
				if eTeam.isHasTech(gc.getInfoTypeForString('TECH_STIRRUPS')):
					iUnit = gc.getInfoTypeForString('UNITCLASS_HORSE_ARCHER')
			elif iRnd < 40:
				iUnit = gc.getInfoTypeForString('UNITCLASS_SCOUT')
				if eTeam.isHasTech(gc.getInfoTypeForString('TECH_HORSEBACK_RIDING')):
					iUnit = gc.getInfoTypeForString('UNITCLASS_HORSEMAN')
				if eTeam.isHasTech(gc.getInfoTypeForString('TECH_TRADE')):
					iUnit = gc.getInfoTypeForString('UNITCLASS_CHARIOT')
			elif iRnd < 50:
				iUnit = gc.getInfoTypeForString('UNITCLASS_WARRIOR')
				if eTeam.isHasTech(gc.getInfoTypeForString('TECH_BRONZE_WORKING')):
					iUnit = gc.getInfoTypeForString('UNITCLASS_AXEMAN')
				if eTeam.isHasTech(gc.getInfoTypeForString('TECH_IRON_WORKING')):
					iUnit = gc.getInfoTypeForString('UNITCLASS_CHAMPION')
			elif iRnd < 60:
				iUnit = gc.getInfoTypeForString('UNITCLASS_WARRIOR')
				if eTeam.isHasTech(gc.getInfoTypeForString('TECH_ARCHERY')):
					iUnit = gc.getInfoTypeForString('UNITCLASS_ARCHER')
				if eTeam.isHasTech(gc.getInfoTypeForString('TECH_BOWYERS')):
					iUnit = gc.getInfoTypeForString('UNITCLASS_LONGBOWMAN')
			if iUnit != -1:
				infoCiv = gc.getCivilizationInfo(pPlayer.getCivilizationType())
				iUnit = infoCiv.getCivilizationUnits(iUnit)
		if iUnit != -1:
			newUnit = pPlayer.initUnit(iUnit, pCaster.getX(), pCaster.getY(), UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)
			pCity.applyBuildEffects(newUnit)
			newUnit.setReligion(iReligion)
	pCaster.setHasPromotion(gc.getInfoTypeForString('PROMOTION_RECRUITER'), False)
	if pCaster.getUnitClassType() == gc.getInfoTypeForString('UNITCLASS_GREAT_GENERAL'):
		pCaster.kill(True, PlayerTypes.NO_PLAYER)

I doubt that AI behavior like that has anything to do with changes I made. Perhaps you should take it up with Tholal.

---


I don't feel like releasing a whole new version yet, but I thought some of you might want to use the updated version of world builder that I already shared here.. It should work if you simply copy this assets folder over that of either MagisterModmod or More Naval AI. (I think it would even work with Base FfH2, except that it would lack the various mouseover TXT_KEY_WB_HELPs because it would be missing about 7 lines of code in CvGameUtils.py. I did not include that file because those lines are already present in MNAI v2.5, and there are numerous other parts of that file that unique to MagisterModmod .)
 
I Checked out this new worldbuilder. In addition to new features, I got a chance to research seafaring tech...(1 turn) a to build shrine of the champion wonder( I did not have even my hero yet)...also from the start you can build smugglers port...
 
I just realized that I forgot to delete Playpting's version of CvGameUtils.py from the file structure. It should not be there.

Since you allowed the MagisterModmod (or MNAI, or base FfH2( version of CvGameUtils.py to be overwritten (by one that is just like that of BtS, except for lines dealing with help TXT_KEY's in world builder), you will probably need to reinstall the mod (unless you have a backup and can just copy that one file. You can then again copy the new CvScreensInterface.py, CvWorldBuilderScreen.py, and Platy World Builder.xml in order to get the new worldbuilder working without problems.



That explains the ability to build Smugger's Ports and the Shrine of the Champion. In base FfH2 or MNAI it would explain the ability to research Seafaring. (There is no seafaring tech in MagisterModmod; it is a civilization trait instead.) It would also prevent some key mechanics of MagisterModmod (such as Rings of Warding preventing hostile summons from entering a city) from functioning.
 
Back
Top Bottom