Будет просто шикарно, особенно если EmmyDoc расставить.
В принципе не сложно, но объявления типов я буду игнорировать, луа не типизированный язык и будет глупо добавлять правила парсинга объявления типов..))
Спасибо за развернутый ответ! :)
Проект и правда очень перспективный с выходом reforged'a и может помочь многим картостроителям... ибо боли у нас всех общие)))
Drulia_san, мне интересно, программку сам же написал? С нуля? Что использовал для этого или большая часть ручной работы думая своей головой? Интересно мнение разработчика, каково писать такую программку и сколько это заняло времени/сил (раскрыть секреты производства) ;)
Да, писал с нуля исключительно сам, начал еще летом, потом времени не было и было лень закончить, продолжил в начале ноября. Изначально это был проект для меня, думал напишу кое-как ради того чтоб свою карту конвертировать, которая была под угрозой. Все компоненты написаны мной (обертка для регулярок, логгер и тд), используется лишь stl и немного winapi. Ты сам можешь посмотреть там ссылка на гитхаб висит, можешь поковырять там что угодно. Позже это начало вырастать в нечто большее и решил это выложить. По времени в общей сложности заняло месяц где-то если сложить всё вместе, опять же можешь глянуть календарь активности на гитхабе) Если ты заметил, там класс называется Parser2, потому что был первый парсер и он был ужасен, пришлось переписывать снова.
Я использовал чистый винапи по нескольким причинам:
Никто не будет запускать это на линуксе\маке, весь геймдев по варкрафту был есть и будет на винде
Он быстрый и очень функциональный
Я и любой кто захочет это собрать сможет это сделать сходу ничего не подключая и не скачивая
Хотелось облегчить проект от лишних библиотек вроде Qt, MFC
ScopteRectuS, Drulia_san, Вот только такая конструкция вызывается ДО инициализации и при срабатывании сборщика мусора триггеры созданые таким образом могут потеряться. Будете потом ловить странный сложно воспроизводимый баг "триггеры вдруг перестали работать, что делать". Поэтому нужен инжект в оригинальный процесс инициализации.
Сборщик мусора уничтожает луашные объекты и ссылки, объекты типа триггер, юнит и прочее - живут совсем в других местах, которые сборщик мусора не имеет права трогать, они уничтожаются по ссылке функциями типа DestroySomething Он может максимум обнулить глобальную ссылку на триггер gg_trg_MyTrigger, но сам триггер никто не зачистит. Он останется жив и будет работать, функции которые он дергает впитать в себя он уже успел, если вдруг триггер станет nil - на него просто нельзя будет получить ссылку, он останется изолирован в памяти, но по сути его трогать-то больше и не надо.
Новые юниты для рас (мультиплеера) - очень сомнительно, т.к. они стремятся сохранить кроссплей между старым и новым варкрафтом.
Они собираются добавить в классический варик модельки в "классическом стиле" женщины дк и дх для совместимости, не думай что старый варик останется нетронутым, они их будут друг под друга подгонять
Если лень читать статью про инжект точки входа, сделай так:
Создай гуи триггер с событием "Инициализация карты" (Map Initialization), добавь туда действие "Custom script" и вставь в текст скрипта это:
entryPoint()
Потом объяви где-то функцию entryPoint:
function entryPoint()
InitTrig_PickHeroes( )
end
И вызови из неё инит своего триггера, и руками туда добавляешь инит всех своих кастомных триггеров. Если у тебя есть общий код инициализации карты то функцию инициализации тоже вызови из entryPoint
В луа все триггеры ты создаешь вручную, инициализируешь вручную, вызываешь их инит тоже вручную как указано выше. Но глобальные переменные объявлять не надо если что, всё что не локалка - то глобалка.
поддерживаю, как-то прогал на ночь, так эти скобки в глазах слипались донельзя
Надо просто спать идти в таких случаях =) Если сонным прогать потом с утра охренеешь с той каши что увидишь в редакторе и вопросов самому себе "как мне вообще такое пришло в голову"
А если серьезно поддерживаю вышесказанное от Doc, мусорные слова в духе endloop endfunction endif, call set захламляют видимость и сбивают с умных мыслей, когда скобочка просто закрывает блок и не привлекает к себе внимания, когда глаза скользят по словам, а новичкам нужно просто по-практиковаться и начинать с чего-то простого, например с Lua, у него синтаксис идеален для начинающих
А как по мне, синтаксис пайтона 3 куда лучше, чем в С, долой {} скобки!
Имхо, когда я вижу стену кода в С стиле с кучей {} скобок, которая ещё и растёт вширь, мне становится плохо.
Периодически приходится работать с питоном и честно говоря я его не люблю за его подход построения блоков через отступы, старые добрые фигурные скобочки моё всё, впрочем каждому своё) Ну и как я описал выше, для любителей JASS я добавил его полную поддержку, cJass теперь не обязателен во входящих файлах
Ну да, так как многие их предпочитают за компактность, лаконичность и читабельность. Я сомневаюсь что многим людям нравится писать local перед типом данных, call перед каждым вызовом и set перед каждым присвоением, и конечно же типы данных без сокращений вроде integer и boolean. Писать на JASS имеет смысл только для сохранения совместимости своей карты где бы она ни была редактирована (или еще какие-то конкретные технические нужды). Этим я и обосновываю почему синтаксис С рулит.
И я бы еще раз не делал выводов о том, что "я не играл ни в одну карту на cJass", потому что черт его знает что там внутри той или иной карты. Я так же могу сказать что не играл ни в одну карту на wurst script потому что с первого взгляда я реально их не видел, но его многие используют.
Не уверен, но возможно сборщик мусора в луа удаляет триггер потому что он локальный и после выхода из функции на него больше никто нигде не ссылается, попробуй присвоить его глобальной переменной.
Исправили баг когда кастомные скилы героя пытались выглядеть как его оригинальные (у героя на основе паладина все скилы словно пытались быть его дефолтными)
Исправили баг с модельками, теперь их видно
Исправили баги с путями юнитов, они больше не ходят через горы
Устранили еще кучу всего и сделали кастомки рабочими
Из недостатков:
Кастомки по сети всё еще недоступны
Все скилы ночных эльфов в кастомках баганные. Например герои с кастомной метаморфозой на основе превращения друида-медведя - всегда превращаются в медведя.
Drulia_san:
в эту эфемерную карту я ясное дело поиграл ментально
то я сам спрашиваю
Никому нет дела до твоего отношения к cJass и до того, что ты считаешь его невостребованным, к тому, что ты конечно же в курсе про все карты на свете и на чем они там сделаны, успокойся.
Заинтересованным: И да, как было предложено выше - я реализовал распознавание строк и строчных переменных\аргументов\функций. При склеивании их оператор + должен корректно меняться на ..
Осталось добавить парсинг структур и всё.
В целом советую подумать о разборе типов переменных, система типов в жассе/вжасс очень банальная энивей и ничего принципиально сложного быть не должно.
Это так, те кто кто обильно пользуются структурами не смогут получить выгоды от этой утилиты, а те у кого 1-2 класса (но много экземпляров создается повсеместно) могут их переписать вручную и просто поменять объявления объектов\их использование. Но в будущем я всё же добавлю поддержку структур с их последующей конвертацией в мета-табличные реализации. Да я не думаю что абсолютно все ими прямо таки активно пользуются в картах, мне разве что класс снарядов понадобился, который их метает с кучей различных вариаций, а так по большей части чисто функциональщина. (Я не утверждаю как персонаж выше что структуры не востребованы, у всех по-разному).
реализация слишком базовая, нет никакой гарантии что код в итоге выйдет корректным (та же конкатенация строк).
Для скриптов с чисто функциональным подходом почти идеально так как поддерживаются все базовые фичи языка (плюс некоторые дополнительные), к примеру в одной своей карте пару десятков триггеров конвертировал (там одна функциональщина на cJass) и получилось довольно неплохо, разве что в некоторых триггерах пришлось конкатенацию строк руками подправить и всё работает. Ну код все равно придется проверять, но намного меньше грязной работы, ради чего собственно и весь движ.
в треде самой карты обычно пишут на чём она сделана,
Да да, конечно, везде пишут "да и кстати я ее на cJass писал. Это средство разработки , всем пофигу на чем работает карта. И вообще, все нормальные карты проходят через оптимайзер и обфусцируются до обычной каши из jass. И не все карты выкладывают в места вроде хгм, например я свой проект который уже несколько лет делаю. Так что давай без поспешных выводов.
Редактор ландшафта -> Файл -> Экспортировать скрипт карты. Пишешь небольшой парсер, который отсекает всё до первого триггера, затем каждый триггер в отдельный файл, затем всё после последнего триггера в отдельный файл.
Drulia_san, можно запоминать последний путь? Не очень удобно каждый раз его вбивать.
Окей, последние пути будут храниться в конфиге начиная со следующей версии 1.03
В качестве альтернативы можешь создать батник, он умеет и через консоль, первый аргумент - входящий путь, второй куда выхлоп класть
Drulia_san, в lua номерация массивов начинается с 1 в отличии от cjass. Это как-то учтено или придётся ручками все переборы править?
Не учитывал это, но исправлю моменты где используются целочисленные константы в индексах - увеличу на один. Но вот итерации придется править вручную, i = 0 менять на i = 1
Семантический анализатор тут всё же не предусмотрен
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
Ред. Drulia_san
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
Ред. Drulia_san
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
Я использовал чистый винапи по нескольким причинам:
Ред. Drulia_san
» WarCraft 3 / Reforged на LUA
» WarCraft 3 / Бета версия Warcraft III Reforged 1.32
Ред. Drulia_san
» WarCraft 3 / Reforged на LUA
Ред. Drulia_san
» WarCraft 3 / Reforged на LUA
Создай гуи триггер с событием "Инициализация карты" (Map Initialization), добавь туда действие "Custom script" и вставь в текст скрипта это:
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
А если серьезно поддерживаю вышесказанное от Doc, мусорные слова в духе endloop endfunction endif, call set захламляют видимость и сбивают с умных мыслей, когда скобочка просто закрывает блок и не привлекает к себе внимания, когда глаза скользят по словам, а новичкам нужно просто по-практиковаться и начинать с чего-то простого, например с Lua, у него синтаксис идеален для начинающих
Ред. Drulia_san
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
Ред. Drulia_san
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
Ред. Drulia_san
» WarCraft 3 / Ентер Рект
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
Добавил поддержку обычного JASS, теперь можно конвертировать любые скрипты вообще. Но пока что структуры всё еще не поддерживаются.
» WarCraft 3 / Бета версия Warcraft III Reforged 1.32
Ред. Drulia_san
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
Осталось добавить парсинг структур и всё.
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
Ред. Drulia_san
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
» WarCraft 3 / Как быстро экспортировать код
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
Ред. Drulia_san
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
В качестве альтернативы можешь создать батник, он умеет и через консоль, первый аргумент - входящий путь, второй куда выхлоп класть
Ред. Drulia_san
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua
Семантический анализатор тут всё же не предусмотрен
» WarCraft 3 / cJass2Lua(v1.12) - Преобразователь кода cJass и JASS в Lua