Сейчас 18:31:08 Понедельник, 25 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Нужна помощь по AI
aledukarДата: Среда, 21 Сентября 2011, 13:44:46 | Сообщение # 1
1 уровень
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Блокировки:
Hi all! Хочу разобраться как создать свой mele Ai (на Jass) для своей рассы на примере Orc.ai. Помогите плз разобраться реьят.
 

lawsonДата: Среда, 21 Сентября 2011, 16:49:58 | Сообщение # 2
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Помог бы, если нужнен был бы ИИ для АоС или Арены.

Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Среда, 21 Сентября 2011, 16:50:40
 

aledukarДата: Среда, 21 Сентября 2011, 17:16:23 | Сообщение # 3
1 уровень
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Блокировки:
Quote (lawson)
Помог бы, если нужнен был бы ИИ для АоС или Арены.

Спс пока что я этим не занимаюсь =) Вот что то меня задело ии на развитие, вот тока через редактор ИИ туповатый получается =\
 

ЭльфийкаДата: Среда, 21 Сентября 2011, 23:54:37 | Сообщение # 4
4 уровень
Группа: Проверенные
Сообщений: 87
Награды: 0
Репутация: 115
Блокировки:
..описывается ситуация с багами для версий 1.18 – 1.22.
Программирование ИИ отличается от строительства карт. Используются разные наборы встроенных функций, разные инструменты и стили программирования.

- Триггеры не используются, потому что не получается задать событие для триггера.

- Скрипты пишутся не в интегрированной среде, а в добрых текстовых редакторах: EmEditor, JassShopPro, WinAsm и т. п. После чего всовываются в карту посредством WinMPQ 1.64.

- Есть важные функции доступные для скрипта карты, но не доступные ИИ, и наоборот. Встроенные ошибки тоже разные.

После загрузки карты стартует поток карты. Для его запуска компилируются файлы Scripts\common.j, Scripts\blizzard.j, war3map.j в указанной последовательности. Выполнение начинается с функции config. Она выполняется еще до нажатия кнопки Начать игру. Первые два файла можно отредактировать и запихнуть в архив карты. В теле config должны присутствовать специальные функции, инициализирующие карту в строго определенной последовательности. Разрешены вызовы только математических нативок.
Поток карты может запускать скрипты ИИ для компьютерных игроков (StartMeleeAI или StartCampaignAI) и собственные потоки с помощью ExecuteFunc.
Каждый ИИ запускается в отдельном процессе, может запускать собственные потоки. Для него компилируются Scripts\common.j ,Scripts\common.ai и файл, указанный в аргументах StartMeleeAI или StartCampaignAI. Выполнение начинается с функции main. Первые два файла можно отредактировать и запихнуть в архив карты.
Потоки в ИИ полноценные, не ограниченные количеством действий, с полноценной паузой.
Файл Scripts\common.j содержит декларации общих функций и констант. Багов в нем не отмечено.
Файл Scripts\blizzard.j содержит вспомогательные функции для WE. В нем много тавтологии и багов.
Файл Scripts\common.ai содержит декларации функций, доступных только скриптам ИИ и функции, одинаковые для всех игроков карты, не зависимо от расы. В скриптах карты можно применять только GetUnitGoldCost , GetUnitWoodCost и GetUnitBuildTime.
Дополнительные функции, недоступные скрипту карты, предоставляют инфу о контексте ИИ (индекс игрока, инструмент командиров, инструмент городков). Возможность обойтись без этих функций есть. Есть и потребность, поскольку капитаны работают неважно, а инструмент городков просо безобразно. Не знаю только какие GHz и Мб понадобятся после замены командира на код jass.
Недоступность некоторых функций для ИИ обусловлена исключительно багами в game.dll. Это функции I2S, R2S, Filter, OrderId2String, UnitId2String, ForGroup, TownWithMine, GetEnumPlayer, GetEnumDestructable и аргументы UNIT_TYPE_ATTACKS_FLYING, UNIT_TYPE_ATTACKS_GROUND, boolexpr, trigger, code, . Их нетрудно заменить. Но это еще и EnumDestructablesInRect, EnumItemsInRect, неисправность которых делает ИИ слепым по отношению к валяющимся артефактам и всем уничтожаемым объектам. При вызове этих двух функций в центре карты случайно появляются items.

Условности

Все условные обозначения выделяются жирным шрифтом.
[…] – необязательный элемент.
{…} – Фрагмент который может повторяться несколько раз
возвращаемоезначение имяфункции([аргументы]) – так будут описываться функции.

ЧАСТЬ 3 ФУНКЦИИ ИЗ COMMON.AI

Капитаны

Капитанов предусмотрено два: капитан защитник и нормальный полноценный капитан. Разговор пойдет только о нормальном капитане. Он обеспечивает перемещение своего войска к цели, скученность этого войска, управляет войском в бою, используя бегство и заклинания, управляет дирижаблем. Все это работает, но не очень хорошо. Капитан создается функцией CreateCaptains(). Войска отдаются капитану функцией AddAssault, кроме того во время сражения капитан самовольно мобилизует ближайших юнитов, не давая им заниматься полезной работой; излечимо. Под управлением капитана некоторые войска разнообразия ради становятся задирами (гиппогрифы, дриады) - нападают не на указанную цель, а на всех врагов, некоторые трусами (охотницы, жрицы Элуны) - хз почему отбегают. Капитан считает домом последний построенный городок.
nothing SetCampaignAI ( nothing ) - капитан игнорирует ситуацию у союзников.
nothing SetMeleeAI ( nothing ) - капитан будет бросать все дела и бежать помогать союзнику, если тот сражается, надо это или не надо.
nothing SetTargetHeroes ( boolean state) - капитан будет стараться убивать вражеских героев в сражении.
nothing SetPeonsRepair ( boolean state) - разрешает работникам восстанавливать здания.
nothing SetRandomPaths ( boolean state) - капитан будет вести войска не напрямую.
nothing SetDefendPlayer ( boolean state) - разрешает капитану бежать защищать свой городок или городок союзника.
nothing SetHeroesFlee ( boolean state) - разрешает бегство героев.
nothing SetHeroesBuyItems ( boolean state) - разрешает героям покупать предметы. Покупаются: сферы, свитки возвращения, дирижабли.
nothing SetWatchMegaTargets ( boolean state) - войска будут стараться прежде всего убить юнитов вражеских игроков, а не нейтрально-враждебных юнитов.
nothing SetIgnoreInjured ( boolean state) - разрешает капитану отсылать домой юнитов со здоровьем менее половины.
nothing SetHeroesTakeItems ( boolean state) - слабейший герой будет подбирать предметы. К сожалению не всегда. Ценность предмета определяется полем в ВЕ Характеристики - приоритет.
nothing SetUnitsFlee ( boolean state) - разрешает бегство юнитов. Капитан учитывает только уровень юнита.
nothing SetGroupsFlee ( boolean state) - разрешает бегство всей армии.
nothing SetSlowChopping ( boolean state) - работники будут приносить только по одной единице ресурса.
nothing SetCaptainChanges ( boolean allow) - разрешает смену главного лагеря.
nothing SetSmartArtillery ( boolean state) - артиллерия будет прежде всего атаковать постройки.
nothing SetReplacementCount ( integer qty) - максимальное количество смен дома капитана. ?
nothing GroupTimedLife ( boolean allow) -
nothing RemoveInjuries ( nothing ) - капитан отсылает юнитов со здоровьем меньше половины домой.
nothing RemoveSiege ( nothing ) - капитан отсылает осадные орудия домой.
nothing InitAssault ( nothing ) - Забирает у капитанов все войска.
boolean AddAssault ( integer qty, integer id) - мобилизует для атакующего капитана qty юнитов типа id. Функция действует только в момент вызова. RemoveGuardPosition/RecycleGuardPosition - позволяет препятствовать мобилизации конкретного юнита.
boolean AddDefenders ( integer qty, integer id) - выделяет для капитана защитника qty юнитов типа id. Реально юниты переходят в его ведение после AddGuardPost и FillGuardPosts.
nothing AttackMoveKill ( unit target) - капитан ведет войско для атаки на указанного юнита. Задиры в войске могу атаковать кого-нибудь по дороге.
nothing AttackMoveXY ( integer x, integer y ) - капитан движется в указанный пункт, атакуя всех подряд.
nothing StopGathering ( nothing ) -
nothing AddGuardPost ( integer id, real x, real y ) - разрешает капитану защитнику взять одного юнита типа id для защиты им пункта (x,y). Юнит берется из числа выделенных AddDefenders.
nothing FillGuardPosts ( nothing ) - передает капитану защитнику оговоренное в AddGuardPost количество войск.
nothing ReturnGuardPosts ( nothing ) - лишает капитана защитника войска.
nothing CreateCaptains ( nothing ) - создает атакующего капитана.
nothing SetCaptainHome ( integer which, real x, real y) -
nothing ResetCaptainLocs ( nothing ) -
nothing ShiftTownSpot ( real x, real y ) -
nothing TeleportCaptain ( real x, real y ) -
nothing ClearCaptainTargets ( nothing ) - прекращает атаку. Отступление или гибель войск еще не означают, что атака окончена.
nothing CaptainAttack ( real x, real y ) -
nothing CaptainVsUnits ( player id ) -
nothing CaptainVsPlayer ( player id ) -
nothing CaptainGoHome ( nothing ) - отправляет капитана домой.
boolean CaptainIsHome ( nothing ) - истина, если капитан вернулся домой.
boolean CaptainIsFull ( nothing ) - истина если в войске есть указанное в AddAssault количество юнитов.
boolean CaptainIsEmpty ( nothing ) - истина, если у капитана нет войска.
integer CaptainGroupSize ( nothing ) - количество юнитов в войске.
integer CaptainReadiness ( nothing ) - процент наличия в войске отведенных AddAssault юнитов.
boolean CaptainRetreating ( nothing ) - капитан решил вернуться домой. Бывает после боя, бегства и рядом с целью, если капитан подтягивает войска.
integer CaptainReadinessHP ( nothing ) - процент сохранившегося здоровья у войск капитана. Могут учитываться отнятые у капитана войска.
integer CaptainReadinessMa ( nothing ) - процент сохранившейся манны у войск капитана.
boolean CaptainAtGoal ( nothing ) - истина, если капитан выполнил задание (находится у цели).
boolean CaptainInCombat ( boolean attack_captain ) - истина, если капитан управляет боем
nothing LoadZepWave ( integer x, integer y ) - капитан использует дирижабли для перемещения в указанную точку через препятствия. Дирижабли высаживают пассажиров не в указанной точке, а в точке, из которой можно добраться пешком до указанной точки. Если указанная точка и так достижима, то эта функция только удлиняет путь. Замечено, что дирижабль, переданный в ведение капитана, не всегда реагирует на эту функцию, если точка доступна.

Городки и добыча ресурсов

Городок – это группа зданий, построенная вокруг рудника. Городок существует пока все здания не будут уничтожены и на этом месте не появится чужое здание. Городки нумеруются по порядку возникновения, начиная с нуля. После уничтожения какого-либо городка или после истощения самого первого рудника в нумерации городков возникают сбои. Городки с индексом больше 4 могут нумероваться некорректно или вовсе не нумероваться. -1 означает любой городок.
integer GetMinesOwned ( nothing ) - количество рудников во всех городках.
integer GetGoldOwned ( nothing ) - совокупное количество золота во всех рудниках всех городков.
integer TownWithMine ( nothing ) - минимальный индекс городка с рудником.
boolean TownHasMine ( integer townid ) - истина, если в городке есть рудник.
boolean TownHasHall ( integer townid ) - истина, если в указанном городке есть центральная постройка.
nothing ClearHarvestAI ( nothing ) - вызывается перед переопределением HarvestGold и HarvestWood.
nothing HarvestGold ( integer town, integer peons) - в городке town будет peons золотодобытчиков.
nothing HarvestWood ( integer town, integer peons) - в городке town будет peons лесорубов.

Строительство

expansion – это рудник до которого можно дойти из начальной позиции ИИ быстрее всего.
integer GetNextExpansion ( nothing ) - возвращает индекс, который получит следующий построенный ИИ городок.
boolean SetProduce ( integer qty, integer id, integer town) - построить или нанять qty юнитов типа id в городке town.
nothing PurchaseZeppelin ( nothing ) - отсылает кого – нибудь за дирижаблим. Не работает.
unit GetExpansionFoe ( nothing ) - возвращает врага, находящегося на масте expansion.
boolean SetExpansion ( unit peon, integer id) - строитель peon отправляется строить в expansion здание id. Возвращает истину, если хватает ресурсов и ничто не мешает строительству. Строительству может помешать рельеф, здания и предметы.
boolean SetUpgrade ( integer id ) - начинает исследование. Возвращает истину при успешном начале.
integer GetExpansionX ( nothing ) - горизонтальная координата expansion.
integer GetExpansionY ( nothing ) - вертикальная координата expansion.
unit GetExpansionPeon ( nothing ) - возвращает строителя, который должен быстрее всех добраться до expansion

Остальные функции из common.ai

nothing DebugS ( string str ) -
nothing DebugFI ( string str, integer val) -
nothing DebugUnitID ( string str, integer val) -
nothing DisplayText ( integer p, string str) - в режиме отладки выводит текст игроку p.
nothing DisplayTextI ( integer p, string str, integer val ) - в режиме отладки выводит текст и данные игроку p.
nothing DisplayTextII ( integer p, string str, integer v1, integer v2) - в режиме отладки выводит текст и данные игроку p.
nothing DisplayTextIII ( integer p, string str, integer v1, integer v2, integer v3) - в режиме отладки выводит текст и данные игроку p.
boolean DoAiScriptDebug ( nothing ) - переходит в режим отладки
integer GetAiPlayer ( nothing ) - возвращает номер игрока за которого играет ИИ
integer GetHeroId ( nothing ) - используется в SetHeroLevels.
integer GetHeroLevelAI ( nothing ) - используется в SetHeroLevels.
integer GetUnitCount ( integer iunitid ) - количество юнитов типа iunitid в распоряжении ИИ, включая недостроенные и недонанятые.
integer GetPlayerUnitTypeCount ( player p, integer iunitid ) - количество юнитов типа iunitid в распоряжении указанного игрока.
integer GetUnitCountDone ( integer iunitid ) - количество юнитов типа iunitid в распоряжении ИИ.
integer GetTownUnitCount ( integer id, integer tn, boolean dn ) - количество юнитов типа id в городке tn включая недостроенные и недонанятые.
integer GetUnitGoldCost ( integer iunitid ) - стоимость юнита в золоте
integer GetUnitWoodCost ( integer iunitid ) - стоимость юнита в дровах.
integer GetUnitBuildTime ( integer iunitid ) - время строительства любого юнита такого типа.
integer GetUpgradeLevel ( integer id ) - степень исследованности исследования. Например: адепт – 1, наставник – 2.
integer GetUpgradeGoldCost ( integer id ) - стоимость исследования в золоте.
integer GetUpgradeWoodCost ( integer id ) - стоимость исследования в дровах.
unit GetMegaTarget ( nothing ) - возвращает вражеского юнита, находящегося в невыгодном положении.
unit GetBuilding ( player p ) - возвращает здание указанного игрока.
integer GetEnemyPower ( nothing ) -
nothing SetAllianceTarget ( unit id ) - выделяет юнита для союзников.
unit GetAllianceTarget ( nothing ) - возвращает юнита, которого союзник выделил при помощи SetAllianceTarget.
nothing Unsummon ( unit iunitid) - работник рассеет здание.
nothing SetHeroLevels ( code func ) - указанная функция будет вызываться всякий раз когда герой ИИ повышает уровень. Функция возвращает способность которую изучит герой. Функция может узнать уровень героя через GetHeroLevelAI() и тип героя через GetHeroId().
nothing SetNewHeroes ( boolean state) -
boolean MergeUnits ( integer qty, integer a, integer b, integer make) - объединяет qty пар юнитов типов a и b с получением юнитов типа make. Используется только для гиппогрифов с наездницами.
boolean ConvertUnits ( integer qty, integer id) - превращает qty юнитов типа id. Только для обсидиановых статуй.
unit GetCreepCamp ( integer min, integer max, boolean flyers_ok) - возвращает нейтрально-враждебного юнита, если сумма уровней в его отряде находится в указанном диапазоне. flyers_ok – разрешает проверять и летающих тварей.
nothing StartGetEnemyBase ( nothing ) - запускает неявный триггер поиска подходящего лагеря. Результат поиска возвращается GetEnemyBase. После срабатывания триггер удаляется.
boolean WaitGetEnemyBase ( nothing ) - истина если сработал неявный триггер GetEnemyBase.
unit GetEnemyBase ( nothing ) - возвращает здание в основном городке одного из врагов, если прикрытие городка достаточно слабо.
unit GetEnemyExpansion ( nothing ) - возвращает здание в дополнительном городке одного из врагов, если прикрытие городка достаточно слабо.
nothing SetStagePoint ( real x, real y ) -
boolean SuicidePlayer ( player id, boolean check_full) -
boolean SuicidePlayerUnits ( player id, boolean check_full) -
boolean IsTowered ( unit target) - истина, если в данное время здание может атаковать.
boolean CreepsOnMap ( nothing ) - истина, если на карте остались нейтрально-враждебные
nothing SuicideUnit ( integer count, integer iunitid) - отправляет count юнитов типа iunitid громить случайного враждебного игрока не отступая и игнорируя туман.
nothing SuicideUnitEx ( integer count, integer uid, integer pid ) - count юнитов типа uid отправляются громить игрока pid не отступая и игнорируя туман.
nothing StartThread ( code func ) - запуск нового потока с функции func.
nothing Sleep ( real seconds ) - пауза потока на указанное время.
boolean UnitAlive ( unit id ) - юнит жив.
boolean UnitInvis ( unit id ) -
integer IgnoredUnits ( integer iunitid ) - количество юнитов типа iunitid не мобилизованных капитаном.
boolean TownThreatened ( nothing ) - истина, если какой–либо городок ИИ атакован.
nothing DisablePathing ( nothing ) -
nothing SetAmphibious ( nothing ) -
integer CommandsWaiting ( nothing ) - возвращает количество не обработанных команд в стеке, переданных скрипту ИИ другими скриптами.
integer GetLastCommand ( nothing ) - возвращает последнюю команду, переданную скрипту ИИ другими скриптами.
integer GetLastData ( nothing) – возвращает данные, переданные с последней командой .
nothing PopLastCommand ( nothing ) - удаляет последнюю команду с прикрепленными данными, переданную скрипту ИИ другими скриптами.
integer MeleeDifficulty ( nothing ) - 1-компьютер слабый, 2-средний 3-сильный
Посмотри, как это сделано в AMAI (PE) 2.53 и 54
 

aledukarДата: Четверг, 22 Сентября 2011, 16:20:46 | Сообщение # 5
1 уровень
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Блокировки:
Эльфийка, Спасибо огромное, буду потихоньку переваривать =) Тему в топку.
P.S: + не могу тебе поставить , жаль =\
 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz