Luacraft - набор Typesctipt деклараций, содержащий все объявления наивных функций. На данный момент в NPM репозитории содержится пакет для версии 1.26 (Warcraft III - Lua), содержащий в себе все наивные функции для версии 1.26. Дополнительно определены нативные функции из UjAPI.

Настройка Typescript To Lua

Предполагается, что у вас есть базовые знания по использованию пакетного менеджера и вы можете инициализировать npm проект.
  1. Скачиваем зависимости
Выполните команду npm install -D typescript-to-lua typescript
  1. Добавьте скрипты в package.json
В JSON файл добавьте скрипты для сборки и наблюдения за изменениями:
  "scripts": {
    "build": "tstl",
    "dev": "tstl --watch"
  }
Пример package.json
{
  "name": "irina-bot-data",
  "version": "1.0.0",
  "description": "",
  "main": "./dist/index",
  "types": "./dist/index",
  "scripts": {
    "build": "tstl",
    "dev": "tstl --watch"
  },
  "files": [
    "dist/**/*.lua",
    "dist/**/*.d.ts"
  ],
  "author": "",
  "license": "MIT",
  "devDependencies": {
    "lua-types": "^2.13.0",
    "typescript": "^4.8.4",
    "luacraft-1.26": "^1.0.5",
    "typescript-to-lua": "^1.10.1"
  }
}
  1. Создайте в корне проекта файл tsconfig.json. Заполните его
Пример файла
{
  "compilerOptions": {
    "target": "esnext",
    "lib": ["esnext"],
    "moduleResolution": "node",
    "strict": true,
    "rootDir": "./src",
    "outDir": "./dist",
    "module": "CommonJS"
  },
  "tstl": {
    "luaTarget": "5.3",
  },
  "strictFunctionTypes": true
}
Вы можете изменить входной и выходной каталог, указав их в rootDir и outDir соответственно.

Подключение luacarft к проекту

  1. Устанавливаем пакет luacraft-1.26
Выполняем команду npm install -D luacraft-1.26.
  1. Подключаем декларацию типов к typescript проекту
Для этого в файле tsconfig.json добавляем путь к типам. Декларации разложены по категориям: типы, функции, константы. Вы можете подключить сразу все указав luacraft-1.26/all, либо любые другие, которые необходимы вам. Изучить можно тут: github.com/kirill-782/luacraft-1.26/tree/master/types. Должно получиться что-то на подобии этого:
{
  "compilerOptions": {
    "types": ["luacraft-1.26/all"]
  }
}
Готово. Теперь автокомплит будет подсказывать вам константы, функции. Так же будет контролироваться соблюдение типов. Рекомендуем включить строгий режим для функций объявив в tsconfig.json следующее значение:
"strictFunctionTypes": true

Сборка проекта

Выполните в корне проекта в терминале команду npm run build. Если в коде отсутствуют ошибки - в выходном каталоге появятся LUA файлы, которые можно подключать к карте Warcraft III. Обратите внимание, что Warcraft III ищет файл war3map.lua в корне карты. Его нужно создать самостоятельно и в нем подключить нужные файлы.. Скопируйте файлы в w3x архив карты.
Пример проекта сделаю позже. Возможно, позже сделаю пример по сборке в бандл.
`
ОЖИДАНИЕ РЕКЛАМЫ...
20
Ставь класс, если хочешь писать на прототипном ООП карты для Warcraft III.
30
Встроенный ватчер есть, или нужно самому костылить?
20
nazarpunk, в этом пакете нет вообще кода. Только декларации. Немного не понял что такое ватчер? Это когда скрипт мониторит изменения в файле и перекомпиливает его, когда что то поменялось? Или что то для самого кода?
38
Kokomi, думаю, именно "висящая" команда в консоли, которая ждет изменения/добавления/удаления файлов в папке и перебилживает проект
38
Кстати, алиас команд dev/build - обычно отличается режимом dev/prod сборки, а не то, что одно собирает, а другое - вотчер
20
ScorpioT1000, ну во фронте мало, поэтому сделал так, как было сделано в документации к tstl
20
МрачныйВорон, вы пишите код на typescript, tstl конвертирует его в lua. LUA код подключается к warcraft III. На данный момент подход похож на классический LUA, но планируется по мере свободного времени сделать обертки на типы. Потом можно будет писать код на классах
Что хочу сделать в итоге:
const dumpType = (e: UnitEvent) => {
  if (e.detail.triggerUnit instanceof CustomTestUnit) {
    print("CustomTestUnit");
  } else {
    print("Unit");
  }
};

const customUnit = new CustomTestUnit(Player(1), FourCC("Hpal"), 0, 0, 0);
const unit = new Unit(Player(0), FourCC("Hpal"), 0, 0, 0);

unit.lifeRegen += 10;

unit.addEventListener("selected", dumpType);
customUnit.addEventListener("selected", dumpType);
30
Потом можно будет писать код на классах
Зачем? Это же будет гигансткая обёртка, которая будет предоставлять посредственный функционал.
20
Ev3nt, Я сделал ну максимум 10% от того, что нужно. Самые востребованные мне обертки еще не готовы (виджет, предмет), да и реализация событий юнита требует доработок
38
Получится ещё один вурст скрипт
27
Kokomi, ой сорри. Сначала не понял. Тут оказывается для удобства, ошибки выводит сразу. Хотя это круто. Но мне редко доставляли ошибки, хотя признаюсь, что бывало, что не ту переменную или тип, потом полчаса возишься. Я тут подумал как вы запускаете в мемхаке луа.. я еще не пробовал на древнем 1 26 патче. Не люблю ваши build run как я ненавижу checkpack. Эту штуку придется настраивать. Нужны пошаговые инструкции для нубов
30
Так же будет контролироваться соблюдение типов.
Только код не исполняется и посему не все типы одинаково полезны.
Загруженные файлы
19
МрачныйВорон, UjAPI добавляет новые нативки в игру (в том числе функции из мемхака), war3_lua их парчи и добавляет к себе. Kokomi вручную переписывает их объявление в tstl. :D
20
Ev3nt, вот не надо тут. Я руками только утилиты декларировал. И не надо путать декларации и мой фетиш на ООП
19
Kokomi, предлагаю создать ООП-тян, чтобы Kokomi полностью удовлетворился.
38
Так до портирования дотнет можно дойти, а там и великое будущее за 1.26, ААА проекты, первый варкрафт на Луне, покорение других галактик
Чтобы оставить комментарий, пожалуйста, войдите на сайт.