# Lua Scripting System ## Configuration ``` javascript { //general purpose script, Lua or ERM, runs on server "myScript": { "source":"path/to/script/with/ext", "implements":"ANYTHING" }, //custom battle spell effect, Lua only, runs on both client and server //script ID will be used as effect 'type' (with mod prefix) "mySpellEffect": { "source":"path/to/script/with/ext", "implements":"BATTLE_EFFECT" }, //TODO: object|building type //custom map object or building, Lua only, runs on both client and server //script ID will be used as 'handler' (with mod prefix) "myObjectType": { "source":"path/to/script/with/ext", "implements":"MAP_OBJECT" }, //TODO: server query //TODO: client query } ``` ## Lua ### API Reference TODO **In near future Lua API may change drastically several times. Information here may be outdated** #### Globals - DATA - persistent table - - DATA.ERM contains ERM state, anything else is free to use. - GAME - IGameInfoCallback API - BATTLE - IBattleInfoCallback API - EVENT_BUS - opaque handle, for use with events API - SERVICES - root "raw" access to all static game objects - - SERVICES:artifacts() - - SERVICES:creatures() - - SERVICES:factions() - - SERVICES:heroClasses() - - SERVICES:heroTypes() - - SERVICES:spells() - - SERVICES:skills() - require(URI) - -works similar to usual Lua require - -require("ClassName") - loads additional API and returns it as table (for C++ classes) - -require("core:relative.path.to.module") - loads module from "SCRIPTS/LIB" - -TODO require("modName:relative.path.to.module") - loads module from dependent mod - -TODO require(":relative.path.to.module") - loads module from same mod - logError(text) - backup error log function #### Low level events API ``` Lua -- Each event type must be loaded first local PlayerGotTurn = require("events.PlayerGotTurn") -- in this example subscription handles made global, do so if there is no better place -- !!! do not store them in local variables sub1 = PlayerGotTurn.subscribeAfter(EVENT_BUS, function(event) --do smth end) sub2 = PlayerGotTurn.subscribeBefore(EVENT_BUS, function(event) --do smth end) ``` #### Lua standard library VCMI uses LuaJIT, which is Lua 5.1 API, see [upstream documentation](https://www.lua.org/manual/5.1/manual.html) Following libraries are supported - base - table - string - math - bit ## ERM ### Features - no strict limit on function/variable numbers (technical limit 32 bit integer except 0)) - TODO semi compare - DONE macros ### Bugs - TODO Broken XOR support (clashes with \`X\` option) ### Triggers - TODO **!?AE** Equip/Unequip artifact - WIP **!?BA** when any battle occurs - WIP **!?BF** when a battlefield is prepared for a battle - TODO **!?BG** at every action taken by any stack or by the hero - TODO **!?BR** at every turn of a battle - *!?CM (client only) click the mouse button.* - TODO **!?CO** Commander triggers - TODO **!?DL** Custom dialogs - DONE **!?FU** function - TODO **!?GE** "global" event - TODO **!?GM** Saving/Loading - TODO **!?HE** when the hero \# is attacked by an enemy hero or visited by an allied hero - TODO **!?HL** hero gains a level - TODO **!?HM** every step a hero \# takes - *!?IP Multiplayer support.* - TODO **!?LE** (!$LE) An Event on the map - WIP **!?MF** stack taking physical damage(before an action) - TODO **!?MG** casting on the adventure map - *!?MM scroll text during a battle* - TODO **!?MR** Magic resistance - TODO **!?MW** Wandering Monsters - WIP **!?OB** (!$OB) visiting objects - DONE **!?PI** Post Instruction. - TODO **!?SN** Sound and ERA extensions - *!?TH town hall* - TODO **!?TL** Real-Time Timer - TODO **!?TM** timed events ### Receivers #### VCMI - **!!MC:S@varName@** - declare new "normal" variable (technically v-var with string key) - TODO Identifier resolver - WIP Bonus system #### ERA - DONE !!if !!el !!en - TODO !!br !!co - TODO !!SN:X #### WoG - TODO !!AR Артефакт (ресурс) в определенной позиции - TODO !!BA Битва - !!BA:A$ return 1 for battle evaluation - TODO !!BF Препятствия на поле боя - TODO !!BG Действий монстров в бою - TODO !!BH Действия героя в бою - TODO !!BM Монстр в битве - WIP !!BU Универсальные параметры битвы - TODO !!CA Замок - TODO !!CD Разрушения замков - TODO !!CE События в замке - TODO !!CM Клика мышью - TODO !!DL Нестандартный диалог (только ТЕ или выше) - TODO !!CO Командиры - WIP !!DO Многократный вызов функции - TODO !!EA Бонусы опыта существ - TODO !!EX Опыт стека - DONE !!FU Однократный вызов функции - TODO !!GE Глобальное событие - WIP !!HE Герой - TODO !!HL Новый уровень героя - TODO !!HO Взаимодействия героев - TODO !!HT Подсказки по правому клику - WIP !!IF Диалоги и флагов - TODO !!IP Сетевой сервис битвы - TODO !!LE Локальное события - WIP !!MA Общие параметры монстров - DONE !!MC Макросы - WIP !!MF Получение физ. урона в бою - TODO !!MM Текст в битве - WIP !!MO Монстр в определенной позиции - TODO !!MP Контроль MP3 - TODO !!MR Сопротивления магии - TODO !!MW Бродячих монстров - WIP !!OB Объект в определенной позиции - TODO !!OW Параметры игрока - TODO !!PM Пирамиды или новые объекты - TODO !!PO Информация квадрата карты - TODO (???) !!QW Журнала - TODO !!SN Проигрываемые звуков - TODO !!SS Настройка заклинаний (только ТЕ или выше) - TODO !!TL Контроль времени хода (только ТЕ или выше) - TODO !!TM Временный таймер - TODO !!TR Квадрата карты (почва, проходимость, т.п.) - TODO !!UN Универсальная команда - *!#VC Контроль переменных* - WIP !!VR Установка переменных ### Persistence