А почему все в качестве индекса массива юзают цифры
Лично я юзаю хендлы вместо юнитов чтобы не связываться лишний раз со сборщиком мусора и мнением вара о том, когда пора удалять юнита из памяти. Кроме того, это не точно, но вроде числовые ключи работают чуть быстрее объектных, даже если таблица не в режиме массива, а в режиме массива, когда записи идут подряд, без пропусков, числовые ключи гарантированно быстрее строковых и обьектных.
В мультиплеере разногласия со сборщиком мусора могут быть чреваты потенциальным десинком, поэтому перестраховуюсь. А вот в одиночных картах можно не просто юнита в качестве ключа использовать, а еще и перевести таблицу в режим слабых ссылок, чтобы запись полностью удалилась автоматически когда вар решит удалить юнита из памяти. Правда это не факт что произойдет при вашей жизни или при жизни текущей сессии карты, но это уже нюансы.
PT153, индексация идет с 1 только с точки зрения стандартных функций работы с таблицей-массивом, а при прямом обращении к элементам можно хоть с розового слоника нумерацию начинать. Тут проблема в другом - полностью перезаписывалась таблица когда не было одной из записей в ней.
ChugunovRoman, на момент когда я последний раз трогал оригинал руками - в зависимости от выбраного режима. В отладочном режиме творится муть с заворачиванием кода в строки и всякое такое, но он подтягивает все файлы какие найдет. В релизном выполняется минификация кода и вроде нет заворачивания в строки, но нужно явно указывать что подтягивать.
А есть какие-нибудь сборщики для JASS'а и его диалектов? По типу как WLPM?
Понятия не имею, если честно - когда я с жассом работал мне хватало того что умеет жассхелпер. Но, например, тот же warcraft-vscode собирает код скриптом внутри плагина к вскоду - запилить свой форк и научить его собирать жасс в теории не очень сложно. Хотя я уверен что есть готовые плагины к вскоду рассчитанные именно на сборку карты в жасс версии.
Самый треш там в отладочном режиме. В "релизном" чуть по лучше, но для релизного надо явно указывать все связи между файлами или заносить их в список, чтобы он включил их в сборку.
Не пробовал, но скорее всего можно, если там есть поддержка запаковки из командной строки. Я честно спионерил внешний mpq-упаковщик у автора warcraft-vscode, одна из его особенностей в том, что ему можно передать файл со списком файлов которые надо запаковать, что очень удобно когда файлов много и не все файлы из папки надо паковать.
Свой сборщик Lua? Есть репа на гитхабе? Скинешь ссыль? может помогу
Репы на гитхабе пока нет, будет после первого релиза. Тогда и поговорим о помощи, если еще будет желание.
На данный момент проект состоит из трех частей:
внешний mpq-упаковщик, пока берется оригинальный из warcraft-vscode.
плагин изначально запиленый на основе warcraft-vscode, но без лишнего функционала, фактически это обертка внутри вскода над внешними сборщиками, также выполняет отправку карты на тестирование в игру. Требует значительной доработки и вполне может быть заменен чем-то другим.
псевдо-компилятор на c++, который выполняет две задачи - сборку исходников в один файл и препроцессинг кода для добавления небольших, но приятных фич вроде макроса RAW('A000'), в результате парсинга которого в итоговый код попадет числовое значение равкода (для сравнения, сейчас в луа версии карты используется функция FourCC, которая конвертирует строку равкода в число на этапе выполнения кода, автоматической конверсии равкода в число нет, в отличии от того как это работало в JASS).
По поводу поделиться системой сборки в текущем состоянии - там еще слишком много багов для этого, иначе я бы уже выложил первую версию в релиз.
В общем, поставил я warcraft-vscode и вроде пока все норм.
Все норм, если не смотреть на тот ужас, который он делает с кодом в итоговой карте.
ChugunovRoman, например, свою собственную систему сборки под вскод я делал на основе warcraft-vscode от Dencer. По началу я пользовался этим плагином как есть, а потом автор начал творить дичь с кодом и пришлось писать свой плагин, а с нуля писать времени и желания не было.
По факту - карта просто пакуется внешним mpq-упаковщиком после сборки кода и потом отправляется в игру через параметр командной строки.
Где можно найти какие-нибудь наработки на Lua или различные примеры кода?
Небольшое количество есть в статьях прямо тут на сайте, но мало и в основном не очень качественно т.к. мало кто этим пока занимается.
P.S. свой сборщик я допилю и тоже когда-нибудь выложу, но пока не до этого.
ChugunovRoman, обычно это обходят через сборку и запуск карты на проверку из среды разработки для кода.
Т.е. код генерируемый WE используется как часть бандла и обратно war3map.lua не импортируется, вместо этого вместе с бандлом собирается отдельная карта, которая не открывается в WE, а только запускается в игре.
Из минусов - проверка карты из редактора запускает карту без внешнего кода. Естественно, запуск карты на тестирование автоматизируется, чтобы можно было сделать это одним нажатием кнопки в среде разработки, а не вручную, но всеравно приходится сохранять карту в WE, потом переключаться во внешнюю среду разработки и запускать проверку карты оттуда.
Более того, есть готовые решения и для сборки кода и для сборки карты.
В теории - его можно попробовать подсунуть редактору через один костыль... Но на практике я этого не делал ибо зачем если есть Lua.
Костыль подразумевает подсовывание жассхелперу вместо pjass стака из нескольких программ, включая cjass и отдельную копию жасс-хелпера и отдельный pjass, а результат этого кормится оригинальному жассхелперу в редакторе. Я этот метод, правда с другим стаком программ, исследовал когда на PTR первые пробы с Lua делал и пытался добавить свой препроцессор к редактору, потом жассхелпер убрали из Lua режима полностью, но это не важно ведь в жасс режиме он никуда не делся.
quq_CCCP, т.е. последовательность SetRandomSeed(100500) GetRandomInt(0, 1000000) выдаст мне на выходе 100500, а не следующее число из потока после 100500?
Впрочем, это ничего не решает - всеравно придется жонглировать сидом туда-сюда постоянно, что не очень удобно.
8gabriel8, на Lua - легко. На жассе даже пробовать не буду. А если ты конкретно про алгоритм корректировки шанса, то это или по экспериментировать с разными формулами надо будет или по искать статью в сети, близы этот способ в WoW использовали в какой-то момент и вроде кроме близов еще кто-то. Сам я планирую для своей карты такой рандом реализовать для критов и подобного, соответственно свою версию на Lua выложу, но это когда еще будет (не скоро).
8gabriel8, есть еще другой способ - сдвигать диапазон "попадания" по мере накопления вызовов, таким образом чтобы среднее кол-во попаданий на нужное кол-во вызовов было правильным. Грубо говоря - повышать реальный шанс срабатывания если среднее кол-во фактических попаданий ниже желаемого и снижать если выше. Но для этого нужен не особый генератор, а надстройка сверху генератора, которая позволяет хранить кол-во вызовов и попаданий для каждого контекста в котором используется.
8gabriel8, в этом и фишка, что результат такой генерации зависит от одного единственного числа (сид), меняем это число и получаем другой результат, не меняем это число, получаем одинаковый результат. В результате получаем возможность зная сид получить результат который уже получали раньше и, соответственно, возможность тестировать что-то в одинаковых условиях, не смотря на рандомную природу генератора, а также возможность надежно воспроизвести какую-то ситуацию, если это нужно. Естественно, игрок получает случайный сид и, соответственно, случайный результат генерации, в отличии от разработчика в отладочном режиме.
8gabriel8, позволь напомнить тебе постановку задачи - выдача одинакового ланда при одинаковом сиде и разного ланда при разном сиде. И это не костыль, это достаточно распространенная практика при случайной генерации, здорово помогающая при отладке.
достаточно менять RandomSeed на лету и все будет норм
Если бы была возможность получить текущий сид, еще можно было бы как-то плясать с бубном вокруг этого, но такой возможности нет, сид можно только задать. Да и заворачивать каждый вызов рандома в проверку на то какой из сидов должен использоваться, подставлять его, запоминать новый - не кажется ли вам что проще отдельный генератор потока случайных чисел написать, чем возиться с этим?
На всякий случай напомню еще, что в событии EVENT_PLAYER_UNIT_DAMAGING работают функции позволяющие изменить урон и его тип до того как он будет нанесен
BlzSetEventDamage
BlzSetEventDamageType
BlzSetEventWeaponType
BlzSetEventAttackType
Как же так, гуй же может все что может жасс и даже больше... (сарказм)
Практически не пользуюсь гуем, поэтому не замечал что там нет новых событий 1.31.
видимо событие Specific unit - получает урон - не работает с переменной
Работает. Со значением переменной на момент добавления события в триггер.
Но в 1.31 есть же общее событие получения урона. Даже два - до обсчета брони и после. С возможностью изменить урон и тип урона в первом событии.
Зачем, если есть константы?
ATTACK_TYPE_NORMAL=ConvertAttackType(0)
ATTACK_TYPE_MELEE=ConvertAttackType(1)
ATTACK_TYPE_PIERCE=ConvertAttackType(2)
ATTACK_TYPE_SIEGE=ConvertAttackType(3)
ATTACK_TYPE_MAGIC=ConvertAttackType(4)
ATTACK_TYPE_CHAOS=ConvertAttackType(5)
ATTACK_TYPE_HERO=ConvertAttackType(6)
И аналогичные для двух других нативок.
Ред. prog
» WarCraft 3 / lua таблица в таблице
В мультиплеере разногласия со сборщиком мусора могут быть чреваты потенциальным десинком, поэтому перестраховуюсь. А вот в одиночных картах можно не просто юнита в качестве ключа использовать, а еще и перевести таблицу в режим слабых ссылок, чтобы запись полностью удалилась автоматически когда вар решит удалить юнита из памяти. Правда это не факт что произойдет при вашей жизни или при жизни текущей сессии карты, но это уже нюансы.
» WarCraft 3 / lua таблица в таблице
» WarCraft 3 / JNGP Lua Edition
Ред. prog
» WarCraft 3 / JNGP Lua Edition
Ред. prog
» WarCraft 3 / JNGP Lua Edition
На данный момент проект состоит из трех частей:
Ред. prog
» WarCraft 3 / JNGP Lua Edition
По факту - карта просто пакуется внешним mpq-упаковщиком после сборки кода и потом отправляется в игру через параметр командной строки.
» WarCraft 3 / JNGP Lua Edition
Т.е. код генерируемый WE используется как часть бандла и обратно war3map.lua не импортируется, вместо этого вместе с бандлом собирается отдельная карта, которая не открывается в WE, а только запускается в игре.
Из минусов - проверка карты из редактора запускает карту без внешнего кода. Естественно, запуск карты на тестирование автоматизируется, чтобы можно было сделать это одним нажатием кнопки в среде разработки, а не вручную, но всеравно приходится сохранять карту в WE, потом переключаться во внешнюю среду разработки и запускать проверку карты оттуда.
Более того, есть готовые решения и для сборки кода и для сборки карты.
» WarCraft 3 / Заклинание: Вихрь Иллюзий
» WarCraft 3 / DistanceBetweenPoints возвращает бред
Ред. prog
» WarCraft 3 / Событие - приводит способность в действие - изменить тип урона
» WarCraft 3 / Событие - приводит способность в действие - изменить тип урона
Ред. prog
» WarCraft 3 / Cjass
» WarCraft 3 / Cjass
» WarCraft 3 / Генератор псевдослучайных чисел
Впрочем, это ничего не решает - всеравно придется жонглировать сидом туда-сюда постоянно, что не очень удобно.
» WarCraft 3 / Генератор псевдослучайных чисел
Ред. prog
» WarCraft 3 / Генератор псевдослучайных чисел
» WarCraft 3 / call DestroyTrigger( GetTriggeringTrigger() )
» WarCraft 3 / call DestroyTrigger( GetTriggeringTrigger() )
» WarCraft 3 / Генератор псевдослучайных чисел
» WarCraft 3 / Генератор псевдослучайных чисел
» WarCraft 3 / Событие - получает урон - как отловить наносящего?
BlzSetEventDamage
BlzSetEventDamageType
BlzSetEventWeaponType
BlzSetEventAttackType
Ред. prog
» WarCraft 3 / Событие - получает урон - как отловить наносящего?
Практически не пользуюсь гуем, поэтому не замечал что там нет новых событий 1.31.
Ред. prog
» WarCraft 3 / Событие - получает урон - как отловить наносящего?
Но в 1.31 есть же общее событие получения урона. Даже два - до обсчета брони и после. С возможностью изменить урон и тип урона в первом событии.
» WarCraft 3 / Событие - получает урон - как отловить наносящего?
ATTACK_TYPE_NORMAL=ConvertAttackType(0)
ATTACK_TYPE_MELEE=ConvertAttackType(1)
ATTACK_TYPE_PIERCE=ConvertAttackType(2)
ATTACK_TYPE_SIEGE=ConvertAttackType(3)
ATTACK_TYPE_MAGIC=ConvertAttackType(4)
ATTACK_TYPE_CHAOS=ConvertAttackType(5)
ATTACK_TYPE_HERO=ConvertAttackType(6)
И аналогичные для двух других нативок.
Ред. prog
» WarCraft 3 / Событие - получает урон - как отловить наносящего?
BlzGetEventDamageType
BlzGetEventWeaponType
BlzGetEventAttackType