- •Справочник по скриптовому api HoMm V, версия 1.3
- •1. Про всякое.
- •2. Немножко про lua.
- •3. Реализация скрипт-системы в HoMmv.
- •Void print( s1, s2, ... )
- •Void print_to( sFileName, v1, v2, ... )
- •Void startThread( fProc, vParam1, vParam2, ... )
- •Void SetAiHeroAttractor( sObjectName, sHeroName, nPriority )
- •Void EnableHeroAi( sHeroName, bEnable )
- •Void UnreserveHero( sHeroName )
- •NCount GetHeroCreatures( sHeroName, nCreatureId )
- •Void AddHeroCreatures( sHeroName, nCreateureId, nCount )
- •Void RemoveHeroCreatures( sHeroName, nCreatureId, nCount )
- •Void GiveHeroWarMachine( sHeroName, nWarMachineId )
- •Void HasHeroWarMachine( sHeroName, nWarMachineId ) bool RemoveHeroWarMachine( sHeroName, nWarMachineId )
- •Void RemoveObject( sObjectName )
- •Bool IsObjectExists( sObjectName )
- •Bool IsObjectEnabled( sObjectName )
- •Void SetObjectEnabled( sObjectName, bEnable )
- •TsObjects GetObjectNamesByType( sObjectTypeSubstr )
- •Void AddObjectCreatures( sObjectName, nGreatureId, nCount ) nCount GetObjectCreatures( sObjectName, nCreatureId )
- •Void RemoveObjectCreatures( sObjectName, nCreatureId, nCount )
- •Void SetObjectDwellingCreatures( sObjectName, nCreatureId, nCount ) nCount GetObjectDwellingCreatures( sTownName, nCreatureId )
- •Void CreateArtifact( sArtName, nArtId, nX, nY, nFloorId )
- •Void CreateMonster( sMonsterName, nCreatureId, nCount, nX, nY, nFloorId, nMonsterMoodId, nCreatureCourageId )
- •Void StartDialogSceneInt( spDialogSceneXdb, sCallback, sSaveName )
- •Void StartCutSceneInt( spAnimSceneXdb, sCallback, sSaveName )
- •Void MessageBoxInt(spTxt, sCallback, sSaveName)
- •Void SetWarfogBehaviour( nOnLand, nOnSea )
- •Void Trigger(nTriggerType, ...)
- •Void StopTrigger()
- •Void PlayObjectAnimation( sObjectId, sAnimId, nAction )
- •3.3. Тактический режим.
- •3.3.1 Общее положение дел.
- •Void UnitDeath(sUnitName)
- •Void addUnit(nCreatureId, nSideId, nX, nY, nCount, sUnitName)
- •Void removeUnit( sUnitName )
- •Void UnitCastAimedSpell( sUnitName, nSpellId, sTarget)
- •Void UnitCastGlobalSpell( sUnitName, nSpellId )
- •Void UnitCastAreaSpell( sUnitName, nSpellId, nX, nY )
- •Void displace( sUnitName, nX, nY )
- •Number GetWarMachineType( sUnitName )
- •Number GetBuildingType( sUnitName )
- •SUnitName combatReadyPerson()
- •String unitNames()
Void StopTrigger()
Что за триггер стопорит данная функция, есть ли у нее параметры – «науке пока не известно».
Void PlayObjectAnimation( sObjectId, sAnimId, nAction )
Данная функция отсутствует в API, хотя официальное руководство по скриптам утверждает обратное.
3.3. Тактический режим.
При старте тактического режима игра делает следующее:
Загружает файл /scripts/combat-startup.lua и все прописанные в нем с помощью doFile скрипты
Вызывает функции createCombatAliases() и createTutorialAliases()
Приступает к интерпретации файла тактического скрипта. Упомянутый тактический скрипт может появиться в результате
Использования примитивов StartCombat или SetHeroCombatScript
Дизайна файла карты (AdvMapDesc)
Дизайна файла определения героя (AdvMapHero)
Так или иначе, если файл скрипта в наличии, то интерпретатор последовательно выполняет из него строки, не являющиеся телами функций, после чего приступает к последовательному вызову хуков в зависимости от ситуации. Всего в наличии четыре хука.
3.3.1 Общее положение дел.
Итак, имеется две армии. Собственно различие между ними скрипт проводит по признаку атакующий/обороняющийся. Атакующая сторона всегда содержит в своем составе героя. Обороняющаяся может героя не иметь. Имена героев и стеков не имеют никакого отношения к именам использующимся на стратегической карте. Существует единственный примитив, позволяющий соотносить имена героев между стратегическим и тактическим режимом – GetHeroName.
3.3.2 Хуки.
bool DoPrepare()
Вызывается на этапе расстановки стеков игроком. На данном этапе состав армии игрока не определен, соотв. функции будут показывать, что в наличии есть только собственно герой. Возвращаемое значение роли не играет. В файле /scripts/combat-startup.lua данный хук заменен на void Prepere(), пользуйтесь либо одним либо другим по собственному разумению.
bool DoStart()
Вызвается на старте сражения непосредственно после расстановки войск обеими сторонами. Возвращаемое значение роли не играет. В файле /scripts/combat-startup.lua данный хук заменен на void Start(), пользуйтесь либо одним либо другим по собственному разумению.
bool UnitMove(sUnitName)
Вызывается перед каждым ходом стека AI игрока. Имя стека передается в качестве параметра. Если функция возвращает true, то AI не предпринимает над стеком к/л осмысленных действий, считая, что Вы позаботились об этом в теле хука. Кстати, по поводу «true». В файле /scripts/combat-startup.lua в отличие от файла /scripts/advmap-startup.lua отсутствует определение константы true, поэтому ее нужно либо доопределить самостоятельно, либо пользовать вместо нее not nil.
В файле /scripts/combat-startup.lua данный хук заменен на целый набор функций:
bool AttackerUnitMove(sUnitName)
bool AttackerHeroMove(sUnitName)
bool AttackerCreatureMove(sUnitName)
bool AttackerWarMachineMove(sUnitName)
bool AttackerBuildingMove(sUnitName)
bool DefenderUnitMove(sUnitName)
bool DefenderHeroMove(sUnitName)
bool DefenderCreatureMove(sUnitName)
bool DefenderWarMachineMove(sUnitName)
bool DefenderBuildingMove(sUnitName)
Опять таки, пользуйтесь тем, чем Вам удобнее.
