Добавлен Волчачка,
опубликован
Я ещё не закончил планирование как будет обрабатываеть kjass parser, но я хочу чтобы это хоть в более или менее отличалось от vJass и cJass. Поэтому я набрасал немного черного варианта Синтаксиса kjass.
Но программу ещё не написал, потом что пока определяюсь что лучше использовать. Векторы или массивы. Множества или ХешМассивы. Вот думаю ещё, все убрать в консоль(Никаких лишних форм, все показывается в консоли), или CLR + консоль(Есть прогрессбар-статус, Отчет об ошибках сообщается в консоли), или чисто CLR(Все показывается в формах), или же MFС(Передумал). Или чисто WinApi(Рассматриваю как вариант, но всё же строчить компоненты в rc не охота, или прописывать вручную по параметрам. Мало веса - тоже важно, как и скорость ы...)...
Но программу ещё не написал, потом что пока определяюсь что лучше использовать. Векторы или массивы. Множества или ХешМассивы. Вот думаю ещё, все убрать в консоль(Никаких лишних форм, все показывается в консоли), или 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
inline - прописывает функцию перед её вызовом в нескольких экземплярах
line - перемещает функцию к самой первой обращающееся функции к лайновой функции. Т.е. ближе к месту самого первого вызова.
fine - устанавливает прыжок для inline
Объявление переменных
int - Целое
flo - Вещественное
str - Строка
bool - Логическое
Остальные как обычно.
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
$_func - для функций ( code ) function function_name
0x, $ - Hex
0a, $$ = Rave
0a, $$ = Rave
Массивы
int a[ ][100] - двумерны
int b[ ] - одномерный
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.
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 - особый ключ для компилятора, который запрещает плодить переменные массивы для объекта, вместо этого он использует одну и туже переменную для каждой ветки, но если память уже не может выделена для следующей ветки, то создаётся новая переменная массив. Можно включать и выключать.
replecator - особый ключ для компилятора, который запрещает плодить переменные массивы для объекта, вместо этого он использует одну и туже переменную для каждой ветки, но если память уже не может выделена для следующей ветки, то создаётся новая переменная массив. Можно включать и выключать.
initialization - Для управления переменными объекта, при создании.
finalization - Для управления переменными объекта, при удалении.
callback - Таймерная функция внутри объекта.
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.
Нет (+Свой комментарий или молча нет)
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Что мы имеем на данный момент:
PS: Чуть не забыл, в сJass есть эмуляция FormatString(строка формата) aka C++,
См. пункт 6.3.2 в руководстве от автора cJass.
Отредактирован ELB359
было
Doc, опять-таки wurst?)