Добавлен , опубликован

Что это?

cJass - это еще одно расширение языка JASS, которое полностью совместимо с популярным vJass. Цель его создания - дать программистам еще больше возможностей по созданию простого и качественного кода. Основными направлениями являются:
  1. Макросредства и стандартная библиотека - избавляют от рутины, позволяя сконцентрироваться на основном коде.
  2. Упрощение синтаксиса - мы не хотим снова начинать спор, какой синтаксис лучше (блоки через begin & end или {}), и более того, мы не навязываем свою точку зрения - все конструкции cJass имеют JASS-style аналоги, тем не менее мы предоставляем выбор.
  3. Оптимизация карты - основная концепция cJass - это то, что все языковые конструкции не должны сказываться на качестве генерируемого кода. Также мы работаем над встроенным оптимизатором.

Как это использовать?

Просто скачайте дистрибутив (пароль для архива: cjass), распакуйте и запустите инсталлятор. У вас уже должен быть установлен Jass New Gen Pack.
Ознакомиться с возможностями можно, прочитав руководство пользователя cJass (off-line версия этого файла также имеется в директории программы).

Что-то не работает!

В настоящий момент мы активно дополняем язык всевозможными конструкциями, поэтому полноценная проверка синтаксиса пока отсутствует. Но мы всегда внимательно изучаем
bug-репорты, которые можно оставить в этой теме.

У меня есть идея: а не плохо бы...

Мы всегда рады выслушать Ваши идеи и предложения по внесению каких либо новых возможностей в язык, расширению стандартной библиотеки и т.д. Иногда мы даже действительно делаем то, что Вы нам предлагаете ;) Наша секция обратной связи ждет Вас!
И напоследок немного истории.
А история программы начинается на ресурсе wc3c.net, когда Vexorian, выслушав предложение от ADOLF'a сделать инструкции инкремента и декремента создает ветку с обсуждением синтаксиса... и благополучно забывает об этом. Тогда ADOLF подумал: "А неплохо было бы сделать свой парсер и включить в него всяких вкусностей". Изначально программа весила меньше заветных 9000 байт, распространялась по сети ICQ/Jabber и ее использовали несколько человек.
Однажды один из ее пользователей - Van Damm (впоследствии стал соавтором) сказал "это очень удобно!" (это было сказано про то, что можно вызывать функции без ключевого слова call) - и тогда мы решили, что если это удобно, почему бы не выложить программу на публичное обозрение. Благодаря zibade у нас появился сайт, где сразу стал отписываться Dark Dragon, который помог выявить львиную долю багов и внес множество интересных предложений.
С тех пор прошло много времени, мы сделали много новых версий, вес программы вырос в 3 раза (сейчас 26 Кбайт). На данный момент у нас есть планы, касающиеся многих конструкций, оптимизатора, и всего прочего.
`
ОЖИДАНИЕ РЕКЛАМЫ...
29
Коллбеки это обалденно. Зачет огромнейший адольфу.
2
DotaMaster666, это понятно. В моем примере optional я поставил перед одной функцией, но почему-то пропадает две.
29
по идее жассхелпер работает после адика, думаешь он бы не заметил отсутствие функции?
6
по идее жассхелпер работает после адика, думаешь он бы не заметил отсутствие функции?
adicParser -> jassHelper -> adicOptimizer.
Кинул багрепорт адику ;)
Коллбеки это обалденно. Зачет огромнейший адольфу.
Мне тоже понравилось)
2
Doc, глянь сам, если время есть.
Мне кажется Removed unused code работает в последнюю очередь, поэтому жассхелпер и не видит ошибки, то бишь адик -> жассхелпер -> Removed unused code. Это мое предположение)
Некрон71 добавил:
Кстати, exehack.lua у меня вообще нет
Обновил только что AdicParser, загрузил мапу, сохранился и выскочили ошибки. Вот пример, который отражает суть этих ошибок:
scope Test initializer Init{

include "cj_types_priv.j"

private struct A{
 
 unit u
 
 static void New(bool b){
     if (b) {
       thistype this=thistype.allocate()
       unit u = CreateUnit (Player(0), 'Hamg', 100., 0., 0.)
       this.u = CreateUnit (Player(0), 'Hpal', 0., 0., 0.)
       BJDebugMsg(GetUnitName(u))
       BJDebugMsg(GetUnitName(this.u))
     }  
 }
 
}
 
 private void Init(){
      A.New(true)
 }

 
}
Будет скомпилировано на Jass:
// scope Test begins
struct Test___A

unit u

static method New takes boolean b returns nothing
      local thistype cjlocgn_00000000
      local unit cjlocgn_00000001
      if (b) then
        set cjlocgn_00000000=thistype.allocate()
        set cjlocgn_00000001=CreateUnit(Player(0),0x48616D67,100.,0.,0.)
        set cjlocgn_00000000.cjlocgn_00000001=CreateUnit(Player(0),0x4870616C,0.,0.,0.) //А должно быть set s__Test___A_u[cjlocgn_00000000]=CreateUnit(Player(0), 0x4870616C, 0., 0., 0.)
        call BJDebugMsg(GetUnitName(cjlocgn_00000001))
        call BJDebugMsg(GetUnitName(cjlocgn_00000000.cjlocgn_00000001)) //А должно быть call BJDebugMsg(GetUnitName(s__Test___A_u[cjlocgn_00000000]))
     endif
endmethod

endstruct


function Test___Init takes nothing returns nothing
      call Test___A.New(true)
endfunction
// scope Test ends
То бишь если локальная переменная объявлена не в начале функции и при этом имеет одинаковое имя с переменной структуры, то происходит такая байда.
Если мы заменим имя либо локальной переменной, либо переменной структуры, то все будет Окей:
// scope Test begins
function s__Test__A_New takes boolean b returns nothing
      local integer cjlocgn_00000000
      local unit cjlocgn_00000001
      if ( b ) then
        set cjlocgn_00000000=s__Test__A__allocate()
        set cjlocgn_00000001=CreateUnit(Player(0), 0x48616D67, 100., 0., 0.)
        set s__Test__A_u[cjlocgn_00000000]=CreateUnit(Player(0), 0x4870616C, 0., 0., 0.)
        call BJDebugMsg(GetUnitName(cjlocgn_00000001))
        call BJDebugMsg(GetUnitName(s__Test__A_u[cjlocgn_00000000]))
      endif
endfunction

function Test__Init takes nothing returns nothing
      call s__Test__A_New(true)
endfunction
// scope Test ends
6
Ну он писал, что это сырые сборки, и просил потестить их. Если что - с главной можно скачать более стабильную дев.
2
DotaMaster666, я знаю, ну вот я кое-что потестил :)
вот тебе пример
scope A{

include "cj_types_priv.j"

#define{
       private SPELL = 'A000'
       private DMG   = 100.
}       


 callback onUnitSpellCast (SPELL) {
    unit caster = GetTriggerUnit(), target = GetSpellTargetUnit()
    float dmg = GetUnitAbilityLevel(caster,SPELL)*DMG
    UnitDamageTarget(caster,target,dmg,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_UNIVERSAL,WEAPON_TYPE_METAL_HEAVY_SLICE)
    debug BJDebugMsg(R2S(dmg))
    flush locals
 }
 

}
Коллбеки - вообще класс . Уважуха адольфу!
30
как я понял, колбеки не требуют библиотек/скопов и их можно просто так сразу писать
по сути упростили создание триггеров и всё, но очень удобно)
24
А, ну я в принципе дефайнами тож самое сделал. Только у меня это все скрыто в конструкции:
[cut]
[code]
scope FireStomp initializer Init
SpellData
SPELL_DAMAGE = 250.0
SPELL_ID = 'A000'
DAMAGE_TYPE = FIRE
DAMAGE_RANGE = 500.0
SPELL_RANG = E
EndSpellData
SpellActions
DamageEnemyAreaSimple()
CreateOnCaster("Flamestrike_Impact_Base.mdl")
EndSpellActions тут зашит эвент+проверка
endscope
[/code]
[/cut]
30
Faion:
DAMAGE_TYPE = FIRE
остальное интереса не представляет =О
24
[quote=Clamp]остальное интереса не представляет =О[/quote]
Я это кинул что бы [s]понтануцца[/s]показать конструкцию. Это почти тож самое что вверху нам показал Некрон.
Разница только в том, что при юзе спелла каждый раз вызывается SpellData(т.е. мое малость медленее). Но зато на все спелы константное кол-во глобалок.
[quote=Clamp]остальное интереса не представляет =О[/quote]
А что тут интересного? По моему сейчас все и везде используют системы элементов.
6
А можно сами макросы то показать?
scope FireStomp initializer Init
Я вот например не вижу функции инит - убиваете читаемость.
24
[quote=DotaMaster666]Я вот например не вижу функции инит - убиваете читаемость.[/quote]
Правильно что ты ее не видишь, и не должен. И ничего не убивает, тебе там ничего не над читать. Эвент и кондишн свернут.
29
DotaMaster666, это ты к чему? Ведь и так все знают, кто бывал в этом разделе
18
Автоматическое обнуление
Рекомендуемым является использование /alf флага (в расширенном NewGenWE установить галочку Locals auto flush) - данная опция добавит flush locals к каждой return, endfunction и endmethod инструкции.
Где эта галочка? Последнюю версию с этого сайта уже скачал, поставил.
Head_Hunter_44 добавил:
Проблема решена.
Если чо
define {
        FL = flush locals
        <return> = {FL; return}
        <endfunction> = {FL; end##function}
        <endmethod> = {FL; end##method}
}
29
лол, так не надо делать.
на вики по сжассу есть объявлениие для бетатестеров, там все написано. тем не менее автофлюш работает пока плохо.
18
Does automatic flush locals require adicparser be enabled?
Yes, also make sure "Locals auto flush" form cJass menu are checked.
У мну нет этой галочки =(
Скиньте ссыль на адик с имеющейся галочкой!
24
[b]Doc[/b], случаем не в курсе когда будет более менее стабильная версия, а то тоже хочется поковырять=)
29
Faion, когда nestharus прогонит все свои либы через сжасс и он ни разу не скрашится, ясночо =)
Алсо:
24
[quote=nestharus ]cJASS converts to vJASS
vJASS converts to JASS
[/quote]
rly? O_o
Чтобы оставить комментарий, пожалуйста, войдите на сайт.