Сценарий на любом языке

Published
» Предназначение: Работа с кодом
Версия игры: 1.26a
Эта система позволяет написать сценарий на любом языке, при условии, что программу на нём возможно упаковать в DLL, и встроить его в карту без помощи сторонних лаунчеров. Доступ к нативкам прилагается.
Таким образом, можно разрабатывать карту с большим комфортом и получать на выходе более производительный код.
Если же эту систему захотят использовать те, у кого уже есть готовые карты, написанные на JASS'е, то им придется написать конвертор, что переведет их код на желаемый язык.

Вызов нативок

Для работы сценарию необходимо получить доступ к игре, с чем поможет следующая библиотека:
» JASS API
const
	JASS_API_DLL_NAME = 'JassApi.dll';

type
	PJassString = Pointer;
	
	TJassStringHandle = Dword;
	TJassFunctionHandle = Dword;
	TJassHandle = Dword;

	TSingle = record Value: Single end;

function GetJassNative(Name: PChar): Pointer; stdcall; external JASS_API_DLL_NAME;
function GetStringHandle(Value: PChar): TJassStringHandle; stdcall; external JASS_API_DLL_NAME;
function GetStringFromHandle(StringHandle: TJassStringHandle): PChar; stdcall; external JASS_API_DLL_NAME;
function GetJassString(Value: PChar): PJassString; stdcall; external JASS_API_DLL_NAME;
function GetJassStringContent(JassString: PJassString): PChar; stdcall; external JASS_API_DLL_NAME;
Функция "GetJassNative" позволяет получить указатель на код нативной функции.
При их вызове используется конвенция "cdecl", а следующая таблица покажет, какой тип должен быть у параметров и результата, в зависимости от типов указанных в jass-скрипте.
» типы данных
Тип (JASS) Тип передаваемого значения Тип возвращаемого значения
integer Int32 -
real PSingle TSingle
boolean LongBool -
string PJassString TJassStringHandle
handle TJassHandle -
code TJassFunctionHandle -
Примечания:
  • При передаче строки, её следует превратить в объект с помощью функции "GetJassString".
  • При получении дескриптора строки, её значение можно узнать с помощью функции "GetStringFromHandle".
  • Строки используют кодировку "UTF-8".
  • Важно возвращать вещественные числа завернутыми в структуру, чтобы те передавались посредством регистров центрального процессора, а не через стек математического сопроцессора.
  • Система изменяет тип "code" и теперь вместо дескрипторов JASS-функций, нужно передавать указатели на реальные функции.
Для более подробного изучения этого вопроса, предлагаю рассмотреть пример:
Скачать исходники с примером.

Встраивание в карту

Имея готовый сценарий, остается внедрить его в карту, с чем поможет набор файлов из прикрепленного к этому ресурсу архива.
В папке "scripts" находятся файлы со скриптом, отвечающие за распаковку и загрузку библиотеки "Loader.dll", находящейся в папке "bin".
Далее система загружает библиотеки указанные в файле "config.json", в нём уже прописана пара файлов для работы с нативками, свои нужно добавлять после них.
Оригинальный скрипт следует удалить, предварительно перенеся из него функцию "config" (со всеми зависимостями) в импортируемый "war3map.j".
По окончанию настройки, все файлы можно переместить в архив карты.


Views: 1 778

quq_CCCP #1 - 1 year ago 1
Голосов: +1 / -0
Манул - вершина скромности.
Vlod #2 - 1 year ago 1
Голосов: +1 / -0
Качественная штука, большой потенциал, круто!
WarGoose #3 - 1 year ago (изм. ) 2
Голосов: +2 / -0
Как уже написали выше, мануал довольно скромный. Хотелось бы примеров и на других языках.
Также я решил разобрать вашу карту, чтобы понять, что к чему, но ещё больше запутался :) Я далеко не специалист в pascal, и знаю его не выше школьной программы, поэтому мне не совсем понятно, почему если в исходниках, данных вами, мы видим 3 скрипта: natives.pas, Example.pas и jassapi.pas, то на выходе у вас получилось 4 библиотеки: RedirectCalls.dll, Example.dll, JassApi.dllи некий Loader.dll? Не могли бы вы объяснить?
Ещё я пытался переписать ваш JassApi на C# и заменить одноименную библиотеку, однако я словил ошибки) Проблема в моей библиотеки, в конфликте языков или в том, что JassApi.dll вообще трогать не надо было?)))
Был бы рад получить ответы и развернутый мануал, т.к. идея писать на любимом языке очень нравится)))
IceFog #4 - 1 year ago 1
Голосов: +1 / -0
Не могли бы вы объяснить?
В архиве, прикрепленном к этому ресурсу, изначально находится набор библиотек, которые необходимы для работы системы, так что не стоит их удалять.
Из предоставленных же мною исходников сценария, компилируется файл "Example.dll", который и был использован в карте-примере.
WarGoose #5 - 1 year ago 0
Голосов: +0 / -0
В архиве, прикрепленном к этому ресурсу, изначально находится набор библиотек, которые необходимы для работы системы, так что не стоит их удалять.
А, понял.
Но есть ещё не совсем понятный для меня момент: должна ли dll'ка выполняться сама, или есть определенный метод, который ваши библиотеки вызывают? Просто, например, в c# у библиотек нет точек входа (либо я очень плохо ищу).
P.s. прошу прощения за тупые вопросы.
IceFog #6 - 1 year ago -2
Голосов: +0 / -2
WarGoose, библиотеки и так исполняются при загрузке, так что нет нужды в дополнительных действиях.
Vlod #7 - 7 months ago 0
Голосов: +0 / -0
Хочется подключения интерпретируемых языков, таких как lua, python, js и их библиотек
quq_CCCP #8 - 7 months ago 0
Голосов: +0 / -0
Vlod, зачееем? Вы не можите освоить жасс, который сам по себе недолуа, простой и примитивный, достаточный для построения сценариев карт варкравта. Писать с нуля карту на С++ будет куда сложнее, и имеет смысл лишь конверт для защиты и отптимизации карты, реализации внутри фишек, которых в игре нету и реализовтаь их можно лишь сторонней либой.
Питон - вот интересно зачем? Все сводится в те же самые - мы взяли адресс нативки Создать юнита ( к примеру ) и вызвали её, сунув аргументы, если в жассе это делает вирутальная жассм машина, то тут ты будешь это делать на с\питоне\луа... И да, там все эти фишечки языков типа тута не пашут, надо все ручками написать... Да там алгоритм не будет так ограничен как на жассе, но извините если в 2020 на гуи как курица лапой пишут, что говорить о более сложных алгоритмах и продуманных подходах на других языках?
Те кто так могут и умеют, напишут на жассе, пусть не так оптимально - но в рот мне ноги, кому это усралось, работает, не лагает, утечки пачками не плодит, да и ладно, 2020 год, ни 1 карта чето не взлетела, дота, лтд, петры, вампы - все платформы ими забиты, остальные карты - единичны на снг платформах.
Vlod #9 - 7 months ago 0
Голосов: +0 / -0
Давайте подумаем. На этих языках написано так много, что переписывать это на jass или си не практично