Добавлен , опубликован
Я ещё не закончил планирование как будет обрабатываеть kjass parser, но я хочу чтобы это хоть в более или менее отличалось от vJass и cJass. Поэтому я набрасал немного черного варианта Синтаксиса kjass.
Но программу ещё не написал, потом что пока определяюсь что лучше использовать. Векторы или массивы. Множества или ХешМассивы. Вот думаю ещё, все убрать в консоль(Никаких лишних форм, все показывается в консоли), или CLR + консоль(Есть прогрессбар-статус, Отчет об ошибках сообщается в консоли), или чисто CLR(Все показывается в формах), или же MFС(Передумал). Или чисто WinApi(Рассматриваю как вариант, но всё же строчить компоненты в rc не охота, или прописывать вручную по параметрам. Мало веса - тоже важно, как и скорость ы...)...
Вот как мне правильно импортировать из sfmpq в C++ функции так, чтобы хендл получала переменная при открытии. Чтобы я знал, что архив я открыл или прочее.. Мне лишь нужны будут операции над извлечением из архива, затем после обработки, добавлением обратно.
ReadMe

Объявление функций

Функции объявляются так же, как и в cJass, но вместо nothing можно ставить null
null Test(){
 debugmsg "Test?";
}

int Minus(){
	return -1;
}
ultra - Псевдокод-функция, не define.. Служит для эмуляции типа func(&type, n+1);
inline - прописывает функцию перед её вызовом в нескольких экземплярах
line - перемещает функцию к самой первой обращающееся функции к лайновой функции. Т.е. ближе к месту самого первого вызова.
fine - устанавливает прыжок для inline

Объявление переменных

int - Целое
flo - Вещественное
str - Строка
bool - Логическое
Остальные как обычно.
varlist каркас для объявления нескольких переменных внутри функций. Исключительно только для функций. Типы и имена должны перечисляться через запятую, однако переменные не должны совпадать с глобальными.
varlist C{
	unit c, unit g, timer t
	int id, flo x, flo y
}

null func(){
local C = { GetSpellAbilityUnit(), GetSpellTargetUnit(), .Create, t.Handle, GetWidgetX( c), GetWidgetX(c) }
// code...
}
funclist - почти тоже самое, что и varlist, но перечисляются типы, но только в круглых скобках. Возвращаемый тип ставиться перед круглыми скобками.
funclist funcx = null(str);

funcx func2(s){
	debugmsg s;
}
struct - Статическая структура. Как в vJass, но тупо статическая. Одна может принимать вид конструкции у другой, при этом может иметь свою конструкцию.
struct A{
	unit	Speller = null //sts_A_Speller
	unit	Target	= null
	flo		TargetX = 0.
	flo		TargetY = 0.
	int		HandleId = 0
	timer	Timer	= null
}

struct B<-A{
	int Counts = 0
}

null ops(){
A.Speller = GetSpellTargetUnit(); // Правильно
A.Counts = 0; // Не правильно 
B.Speller = GetSpellTargetUnit(); // Правильно
B.Counts = 0; // Правильно
}

Директивы

$_ALL, $_RANGED - для массивов
$_func - для функций ( code ) function function_name
0x, $ - Hex
0a, $$ = Rave

Массивы

int a[ ][100] - двумерны
int b[ ] - одномерный
Внимание: Работает только внутри функций..
b[9] = {$_ALL | 0} Диапазоном от 0 до 9 [0..8] установит 0.
a[5][20] = {$_ALL}{$_ALL | 0} Диапазоном от 0 до 5 [0..4] и от 0 до 20 [0..19] , установит 0
b[] = {$_RANGED| 5 | 7 |0} Диапазоном с 5 по 7 [5..7] установит 0.
b[][] = {$_RANGED| 5 | 10}{$_RANGED| 0 | 100| 0} Диапазоном с 5 по 7 [5..7] и с 0 по 100 [0..100] установит 0.

Объекты и Классы

object - создаёт динамическую структуру симулирующую объект. Максимальный размер через обязательный ключ setsize не может быть больше 1024 и меньше 16.
replecator - особый ключ для компилятора, который запрещает плодить переменные массивы для объекта, вместо этого он использует одну и туже переменную для каждой ветки, но если память уже не может выделена для следующей ветки, то создаётся новая переменная массив. Можно включать и выключать.
initialization - Для управления переменными объекта, при создании.
finalization - Для управления переменными объекта, при удалении.
callback - Таймерная функция внутри объекта.
object TestObj setsize 1024 
{
	replecator on
	int a
	int b
	replecator off
	int c[8]
	int d[4][4] 
	initialization
	{
		.a = 0
		.b = 0
		.c[8] = { $_ALL | 0 }
		.d[4][4] = { $_ALL | 0 }{ $_ALL | 0 }
	}
	
	callback{
		// код омгф код????
	}
	
	finalization
	{
		.a = 0
		.b = 0
		.c[8] = { $_ALL | 0 }
		.d[4][4] = { $_ALL | 0 }{ $_ALL | 0 }
	}
}
class - Может подключать к себе объект через ключ extends . В отличии от объекта он не имеет ограничений. Может так же иметь finalization, initialization и callback, который автоматический создаёт таймер и шаг к нему.
Класс может иметь и статический каркас, который наследуется из другого класса. Т.е. он использует конструкцию типов из другого, но не методы. В статическом каркасе нельзя объявлять перемененные.
-> Доступ к классу внутри класса или self->
. Доступ к объектку внутри класса или this.
Класс без extends - так же как объект, по сути превращается в полноценную структуры. Так же как vJass.
class MyClass extends TestObj
{
	unit Unit
	int  Data
	
	callback{
		self = expiredid
		if ->Data > 0 {
			->Data-=2;
		}
		else
		{
			->timer.Delete
			->Delete
		}
	}
	
	initialization(unit c, int b)
	{
		this = object.Create
		.a = GetUnitLevel(c)
		.b = GetUnitPointValue(c)
		->Unit = c 
		->Data = b
		->onTimer( 0.5, true, $_func callback )
	}
	
	finalization
	{
		.Delete
		->Data = null
	}
}
Создаются классы, объекты, и типы из handle с помощью спец. функции .Create или ->Create, а удаляются через .Delete или ->Delete.

Отладка

debugmessager - Устанавливает функцию для сообщений. По умолчанию BJDebugMsg;
debugmessager = BJDebugMsg; 
debugmsg - вбивает в функцию сообщений параметры.
debugmsg "Отладка...";
autodebug - Добавляет отладочный код, который показывает в игре, какая строчка кода выполняется до запуска.
autodebug on;
autodebug off;

Прочее

Типа case:
int test(str String){
	case of String {
		on "test 1": return 1
		on "test 2": return 2
		on "test 3": return 3
		on "test 4": return 4
		otherwise: return 0
	}
	return NULL
}
В планах:
if error NOMINUS on this{
	debugmsg "Значение this не корректно!"
} 
Пакет:
packet(MyPacket) load on {
	inside trigger Trigger = null
	
	inside null Action(){
	
	}
	
	finalization{
		/*
		Код 
	*/
	}
	
	initialization{
	/*
		Код 
	*/
	}
}
НЗМ: Если писать подробнее, то это геммор xd.. Хотя вдруг я решу не делать некоторые примочки для компилятора псевдо-кода KJassSyntax.
Опрос: Стоит ли бросить эту затею?
1. 
Да, мартышкин труд.
2. 
Лучше изучай C++ для другого дела, чтобы пригодно было. Например для разработки собственных игр или софта.
3. 
Нет (+Свой комментарий или молча нет)
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
7
7 лет назад
0
Идея прекрасная, но почему бы не придерживаться си-подобного синтаксиса? Что еще за "flo", "str"?
0
29
7 лет назад
0
синтаксис ужасен, даже у vjass намного приятнее и гармоничнее был
0
29
7 лет назад
0
ELB359:
Идея прекрасная, но почему бы не придерживаться си-подобного синтаксиса? Что еще за "flo", "str"?
Можно придерживаться, но у меня мысль как бы облегчить для быстрого настрачивания строк кода. Хотя может можно и не писать. + Я ещё точно не решил..
Догадаться не сложно: float string
alexprey:
синтаксис ужасен, даже у vjass намного приятнее и гармоничнее был
Вынужден согласиться, но это лишь черновой вариант. Был и такой вариант.
Загруженные файлы
1
24
7 лет назад
Отредактирован prog
1
KingMaximax, лучше бы потратил время с пользой и запилил полноценный редактор кода с контекстным автодополнением и генерацией часто используемых конструкций по шаблонам. Это куда больше времени экономит, чем издевательство над синтаксисом.
А еще лучше - учил бы Unreal Engine.
0
29
7 лет назад
0
prog:
KingMaximax, лучше бы потратил время с пользой и запилил полноценный редактор кода с контекстным автодополнением и генерацией часто используемых конструкций по шаблонам. Это куда больше времени экономит, чем издевательство над синтаксисом.
А еще лучше - учил бы Unreal Engine.
Что-то вроде вбил в поля названия, а программа генерировала конструкцию?
Может вы имели ввиду Unity, а не Unreal Engine. Или всё-таки ареал?
0
29
7 лет назад
0
Что-то вроде вбил в поля названия, а программа генерировала конструкцию?
посмотри как работает любая нормальная IDE, например Idea, VSCode, Visual Studio
0
7
7 лет назад
0
Как насчет реализации чего-то вроде вывода форматированных строк:
Это
printf("{0} имеет {1} ед. хп", u, hp);
Станет этим
DisplayTextToPlayer(GetLocalPlayer(), 0.0, 0.0, GetUnitName(u) + " имеет " + R2S(hp) +" ед. хп")
Или более лаконично, как в шарпе с интерполяцией.
Хотя и парсить все переменные не очень весело.
1
29
7 лет назад
1
ELB359, лучше тогда как в шарпе интерполированные строки
4
29
7 лет назад
4
prog, зачем, если есть wurst и Eclipse?
По поводу этого поста это просто ад богохульство грех и содомия по всем пунктам, не мог сдержать крика когда читал.
0
24
7 лет назад
Отредактирован prog
0
Doc, ну так автору же хочется чем-то выделиться и что-то свое запилить - я и предложил более перспективный вариант с учетом этого.

Может вы имели ввиду Unity, а не Unreal Engine. Или всё-таки ареал?
Поскольку в посте упоминается именно C++, то тут все-же лучше анрил. А юнити это шарпы и совсем другая песочница.
1
29
7 лет назад
1
Поскольку в посте упоминается именно C++, то тут все-же лучше анрил. А юнити это шарпы и совсем другая песочница.
Понятно. Хотя я иногда видел посты "противостоянием" фракций «unity» и «unreal» в других источниках. Если отбросить разницу в песочницах, и прочем. А по общему показателю они равны, или один из них - всё таки лучше.

На счёт kJass: Я просто хотел более менее упростить. Хотя пока я пришел к выводу: Что это не нужно, изобретения велосипеда. Прежде чем делать всё это я решил пока ещё обдумать и взвесить:
Что мы имеем на данный момент:
  1. На хайве вышла новая сборка 1.5f ~ месяц назад.
  2. Близзарды выпустили патч 1.27б с на 1 зубок,
  3. Нужность изготовления нового парсера псевдоскрипта равна нулю (лишь возможно что хотя бы 10%)
  4. Взесив vJass и cJass + надобность написания kjass'а || результам голосования и здешним рассуждением от других пользователей, + своя голова на плечах.. Не особо нужно... может сделать что-то нибудь другое...
.~ELB359,
PS: Чуть не забыл, в сJass есть эмуляция FormatString(строка формата) aka C++,
См. пункт 6.3.2 в руководстве от автора cJass.
cjass.xgm.guru/manual-ru, %u если не выдаёт имя юнита, то хз
Хотя vJass сам себя перезапускает порядком 2 раза.. Смотрел исходники.. "no coments"..
0
7
7 лет назад
0
Чуть не забыл, в сJass есть эмуляция FormatString
Благодарю!
0
24
7 лет назад
0
А по общему показателю они равны, или один из них - всё таки лучше
У каждого есть свои плюсы и свои минусы, которые далеки от симметрии и еще и постоянно в движении - с каждой новой версией что-нибудь меняется - появляются новые фичи и новые баги. Лично мне по ряду причин больше нравится UE4 и так уж сложилось, что он еще и под мои задачи лучше подходит, чем юнити.
0
15
7 лет назад
0
Гораздо круче было бы не городить диалект Jass'a, а написать более менее полноценный транслятор JavaScript'a или C# в тот же Jass.
2
7
7 лет назад
Отредактирован ELB359
2
AlexSan, хм, что-то вроде этого?
было
List<Unit> gp = new List<Unit>();
gp.AddFromArea(50f,60f,300f,null);
foreach (var u in gp) { 
	u.Kill(); 
}
стало
local group gp
set gp = CreateGroup()
call EnumUnitsInRange(gp,50.,60.,300.,null)
local unit u
set u = FirstOfGroup()
loop
	set u = FirstOfGroup(gp)
	exitwhen u == null
	call KillUnit(u)
endloop
call DestroyGroup(gp)
0
15
7 лет назад
0
ELB359:
AlexSan, хм, что-то вроде этого?
Типа того.
0
29
7 лет назад
0
ELB359, только обнулить хендловые переменные забыл
0
29
7 лет назад
0
И такое уже есть)))
0
7
7 лет назад
0
alexprey, разве, а где конкретно?
Doc, опять-таки wurst?)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.