Добавлен , опубликован
Препроцессор для JASS, который по умолчанию встроен в Reforged и большинство сборок JNGP, основная идея которого заключается в расширении языка таким образом, что валидный JASS является валидным VJASS.

Установка

Для работы вам потребуется правильная версия JNGP. Просто распакуйте его не в папку с игрой. Идеальным вариантом будет D:/.

Пароль для распаковки

JNGP

AdicHelper

Из-за совместимости со старым говнокодом эта папка по умолчанию включена в сборку. Если не хотите дебажить код с помощью генератора случайных чисел, то обязательно удалите эту папку.

Настройка

  • Enable JassHelper - включает дополнительный функционал работы с кодом.
  • Debug Mode - режим отладки. Об этом ниже.
  • Disable vJass syntax - отключает препроцессор VJASS.
  • Disable script optimization - отключает оптимизацию кода. Оптимизатор написан ногами, так что лучше его отключить.

import

Пожалуй самая полезная директива. Позволяет использовать внешний код:
//! import "main.j"
На место этой строки будет помещено содержимое файла main.j находящегося в одной папке с картой. Один и тот же файл не может быть импортирован дважды.

Внешние редакторы

Встроенный в редактор TESH был хорош в момент своего выхода, но времена идут и код нынче модно редактировать в специально обученных для этого программах:
Наилучшим способом будет организовать структуру таким образом:
D:/MyMaps/MyAwesomeMap
	└── map.w3x
		├── main.j
		└── src
			├── lib
			|	├── libA.j
			|	└── libB.j
			└── spell
				├── spellA.j
				└── spellB.j
Нестандартный код карты
//! import "main.j"
main.j
//! import "spell/spellA.j"
//! import "spell/spellB.j"
spellA.j
//! import "../lib/libA.j"
spellB.j
//! import "../lib/libB.j"
Теперь при сохранении карты в редакторе код будет собран из указанных файлов, которые можно просто редактировать и хранить на гитхабе.

globals

Как следует из описания эти блоки должны находиться до объявления первой функции, что делает невозможным создание глобальных переменных не прибегая к редактору триггеров. Поэтому при компиляции VJASS переносит эти блоки в начало файла war3map.j:
function MyFunc takes nothing returns nothing
	call BJDebugMsg(s)
endfunction

globals
	string s = "Этот блок перенесён в начало файла"
endglobals

scope

Позволяют обернуть код в отдельный именованный блок. При компиляции никаких дополнительных действий с кодом внутри областей произведено не будет.
scope MyScope initializer Init
	// Этот блок будет исполнен в штатном режиме
endscope

initializer

Указывает функцию, которая будет выполнена перед завершением функции main. Ради этого области и затевались.
scope MyScope initializer Init
	private function Init takes nothing returns nothing
		// Эта функция будет выполнена перед завершением функции main
	endfunction
endscope
Функция инициализации не должна ничего принимать и ничего возвращать.

key

Новый тип, который является integer, но есть нюанс - при компиляции ему будет присвоено уникальное значение.
globals
	key MyKey
endglobals
Позволяет гарантировано избежать коллизий при использовании хэштаблиц.

debug

Удобная опция в меню, которая позволяет исключать из компиляции отладочный код. Так же при компиляции будет добавлена глобальная переменная DEBUG_MODE типа boolean.
function MyFunc takes nothing returns nothing
    debug call BJDebugMsg("Это сообщение будет показано только в режиме отладки!"))
	 if DEBUG_MODE then
    	debug call BJDebugMsg("Этот блок исполнится только в режиме отладки!"))
	endif
endfunction
При отключённом режиме отладки этот код будет скомпилирован таким образом:
function MyFunc takes nothing returns nothing
	 if false then
    	debug call BJDebugMsg("Этот блок исполнится только в режиме отладки!"))
	endif
endfunction

inject

Позволяет заменить функции main и config на собственные.

config

//! inject config 
// Этот блок будет выполнен в лобби
//! endinject

main

//! inject config 
// Этот код будет выполнен до выполнения initializer функций
//! dovjassinit
// Этот код будет выполнен после выполнения initializer функций
//! endinject

Полезные ссылки

`
ОЖИДАНИЕ РЕКЛАМЫ...
31
Вышла новая версия! Прокрутить к ресурсу
Добавлен краткий обзор самых необходимых возможностей.
28
Disable script optimization - отключает оптимизацию кода. Оптимизатор написан ногами, так что лучше его отключить.
Как раз наоборот, включать эту опцию не стоит примерно никогда. Оптимизатор написан нормально. Только если используется мемхак её стоит включать.
Режим отладки её автоматом включает, но режим отладки должен быть включён только во время разработки.

Глобалку DEBUG_MODE стоит использовать со статичными условиями, а не обычными.
Ответы (9)
31
Как раз наоборот, включать эту опцию не стоит примерно никогда.
Когда я на постоянке включил эту опцию, то жизнь наладилась и волосы стали гладкими и шелковистым.

VJASS не может нормально скомпилить простой код, а я должен поверить что там оптимизатор нормально написан?
library Anal
	globals
		private integer time = 'time'
	endglobals
endlibrary
Глобалку DEBUG_MODE стоит использовать со статичными условиями, а не обычными.
Можно и с обычными, тогда при компиляции вместо неё будет подставлен литерал.
28
nazarpunk, а ты доку прочитай, там оптимизация достаточно простая, просто inline функций в некоторых ситуациях. Она никак навредить не может.
31
PT153, это та {кавычки}документация{кавычки}, в которой ниразу не описана неявная сортировка library. Доверять сему опусу не горю никаким желанием.
28
nazarpunk, неявная сортировка? Либы сортируются в порядке зависимости друг от друга, что тут неявного?
31
Либы сортируются в порядке зависимости друг от друга, что тут неявного?
Это если указана зависимость:
library B 
	public function B1 takes nothing returns nothing
	endfunction
endlibrary

library A
	public function A1 takes nothing returns nothing
		call B_B1()		
	endfunction
endlibrary
28
nazarpunk, ну так зависимости и нужно указывать, иначе порядок не гарантирован. Тут ничего удивительного нет.
31
PT153, порядок гарантирован алфавитом:
library Anal_01_B 
	public function B1 takes nothing returns nothing
	endfunction
endlibrary

library Anal_02_A
	public function A1 takes nothing returns nothing
		call Anal_01_B_B1()		
	endfunction
endlibrary
28
nazarpunk, возможно, я сурс код не смотрел. Но юзать алфавит вместо зависимостей прохладная история.
31
Но юзать алфавит вместо зависимостей прохладная история.
Давеча настраивал nginx и там порядок чтения конфигов определяют алфавитом и никто не умер.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.