Да
Нет
При такой реализации ограничения юнитов в стеке возникает проблема - в городе можно построить сколь угодно много юнитов и задача штурма становится неразрешимой, т.к. невозможно подвести под стены армию больше, чем гарнизон.
Какие идеи по поводу ограничения гарнизона?
Вариант 1
В файле Assets\Python\CvGameUtils.py
находишь функцию def canTrain(self,argsList):
и изменяешь ее
Код:def canTrain(self,argsList): pCity = argsList[0] eUnit = argsList[1] bContinue = argsList[2] bTestVisible = argsList[3] bIgnoreCost = argsList[4] bIgnoreUpgrades = argsList[5] # begin if pCity.plot().getNumUnits() > 10: return True # end return False
Вариант 2
В файле Assets\XML\PythonCallbackDefines.xml
находишь тэг USE_CANNOT_TRAIN_CALLBACK
и задаешь значение 1
В файле Assets\Python\CvGameUtils.py
находишь функцию def cannotTrain(self,argsList):
и изменяешь ее
Заместь 10 можно выставить то число которое тебе больше нравитсяКод:def cannotTrain(self,argsList): pCity = argsList[0] eUnit = argsList[1] bContinue = argsList[2] bTestVisible = argsList[3] bIgnoreCost = argsList[4] bIgnoreUpgrades = argsList[5] # begin if pCity.plot().getNumUnits() > 10: return True # end return False
Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
Мой мод
Надо добавить услове
в def unitCannotMoveInto(self,argsList):
в def canTrain(self,argsList): или def cannotTrain(self,argsList):Код:pUnit = gc.getPlayer(ePlayer).getUnit(iUnitId) if not (pUnit.isSpy() or pUnit.getDomainType() == DomainTypes.DOMAIN_AIR):
В SDK в файлх Cv*.h питоновские функции помеченыКод:pUnitInfo = gc.getUnitInfo(eUnit) if not (pUnitInfo.isSpy() or pUnitInfo.getDomainType() == DomainTypes.DOMAIN_AIR):
В XML файлах названия тегов такие же как и названия функций, только заместь b - is, а заместь i - get (bSpy - isSpy(), iCost - getCost())
Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
Мой мод
Должно работать
Код:def unitCannotMoveInto(self,argsList): ePlayer = argsList[0] iUnitId = argsList[1] iPlotX = argsList[2] iPlotY = argsList[3] # begin iMaxUnits = 10 pPlot = gc.getMap().plot(iPlotX, iPlotY) pCity = pPlot.getPlotCity() if pCity: iMaxUnits += pCity.getPopulation() * 2 / 3 if pPlot.getNumUnits() > iMaxUnits: return True # end return FalseКод:def cannotTrain(self,argsList): pCity = argsList[0] eUnit = argsList[1] bContinue = argsList[2] bTestVisible = argsList[3] bIgnoreCost = argsList[4] bIgnoreUpgrades = argsList[5] # begin if pCity.plot().getNumUnits() > 10 + pCity.getPopulation() * 2 / 3: return True # end return False
Последний раз редактировалось NeseryozniyVET; 24.05.2011 в 02:56.
Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
Мой мод
Добавлю только, что аналогично и в городах - если войска под завязку, то напасть невозможно.
Значит нужно какое-то новое решение. Какое, пока не знаю.
Код:def unitCannotMoveInto(self,argsList): ePlayer = argsList[0] iUnitId = argsList[1] iPlotX = argsList[2] iPlotY = argsList[3] # begin pUnit = gc.getPlayer(ePlayer).getUnit(iUnitId) if not (pUnit.isSpy() or pUnit.getDomainType() == DomainTypes.DOMAIN_AIR): eTeam = pUnit.getTeam() pTeam = gc.getTeam(eTeam) iNumUnits = plot.getNumUnits() if iNumUnits > 0: iUnits = 0 pPlot = gc.getMap().plot(iPlotX, iPlotY) for i in range (iNumUnits): pLoopUnit = plot.getUnitByIndex(i) if (eTeam != pLoopUnit.getTeam()) and (not pTeam.isAtWar(pLoopUnit.getTeam())): # юниты противников не считаем if not(pLoopUnit.isSpy() or pLoopUnit.getDomainType() == DomainTypes.DOMAIN_AIR): iUnits += 1 iNumUnits = 10 pCity = pPlot.getPlotCity() if pCity: iNumUnits += pCity.getPopulation() * 2 / 3 if iUnits > iNumUnits: return True # end return False
Последний раз редактировалось NeseryozniyVET; 26.05.2011 в 11:20.
Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
Мой мод
NeseryozniyVET, все работает, огромное спасибо!
В первом приближении получился вот такой мод http://vas.civfanatics.ru/vas_mod/Stack/Stack.zip с ограничением 3 юнита в стеке. При желании можно задать любое другое количество, меняя переменные iMaxUnits и iMaxUnitInfos в файле cvgameutils.py, оптимальный размер стека думаю можно будет определить опытным путем по результатам серии игр. Первая пробная партия показала, что ИИ не совсем идиот, и стеков отдельно из копейщиков, отдельно из секирщиков, отдельно из катапульт не водит, старается делать смешанные.
Однако, с ростом городов гарнизоны в них начинают превосходить любую атакующую армию. Чтобы как то с этим бороться установил одного недовольного жителя на каждый военный юнит в городе, увеличив на 1 бонусное количество счастливых жителей во всех городах. Соответственно несколько изменил институты власти - дал монархии 3 счастливых горожанина в 5-ти крупнейших городах, у представительства 1-го в крупнейших городах. Что из этого выйдет - посмотрим.
Всем, кому интересно ограничение стека просьба писать, какие особенности возникают в такой игре, и, соответственно какие возможны усовершенствования.
Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
Мой мод
Благодарю, работает!
Ксатати, интересный мод http://vas.civfanatics.ru/vas_mod/Stack/Stack.zip получается - взятие города приобретает реализм. Сначала окружение со всех сторон и осада, затем обстрел из орудий, затем отвод орудий на запасные позиции, подтягивание штурмовых отрядов и только потом штурм.
isHiddenNationality()
Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
Мой мод
Эта система была в третей цыве - ИМХО плохая идея, особенно если по твоей територии ходит союзник.Код:def unitCannotMoveInto(self,argsList): ePlayer = argsList[0] iUnitId = argsList[1] iPlotX = argsList[2] iPlotY = argsList[3] # begin pLoopUnit = gc.getPlayer(ePlayer).getUnit(iUnitId) if not (pLoopUnit.isSpy() or pLoopUnit.getDomainType() == DomainTypes.DOMAIN_AIR or pLoopUnit.isHiddenNationality()): iNumUnits = plot.getNumUnits() if iNumUnits > 0: eTeam = pLoopUnit.getTeam() pTeam = gc.getTeam(eTeam) pPlot = gc.getMap().plot(iPlotX, iPlotY) for i in range (iNumUnits): pLoopUnit = plot.getUnitByIndex(i) eLoopTeam = pLoopUnit.getTeam() if (eTeam != eLoopTeam) and (not pTeam.isAtWar(eLoopTeam)): if not(pLoopUnit.isSpy() or pLoopUnit.getDomainType() == DomainTypes.DOMAIN_AIR or pLoopUnit.isHiddenNationality()): return True # end return False
Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
Мой мод
Спасибо. По моей территории союзники не ходят: договор об открытых границах я перенёс на более поздний срок, т. к. пользы от союзников никакой, а вот воевать многие ходят через две цивилизации на третью. В жизни всегда начинали захваты территорий с земель соседей, и у меня теперь нападают только на тех, с кем есть общие границы (или по морю).