JassReplacer

» опубликован
» Предназначение: Работа с кодом
Утилита для преобразования Jass кода в cJass .
  • автоматически расставляет отступы.
  • распутывает навороченные GUI условия.
Использование
Скопируйте исходный код в буфер обмена (CTRL+C) и запустите программу.
После чего вы можете вставить отредактированный код в свою карту.
Пример
» Исходный код: 276 строк
function Trig_ff_Func001C takes nothing returns boolean
    if ( not ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE) == true ) ) then
        return false
    endif
    if ( not ( GetSpellAbilityId() == 'AUan' ) ) then
        return false
    endif
    if ( not ( GetDestructableTypeId(GetLastCreatedDestructable()) == 'LTlt' ) ) then
        return false
    endif
    return true
endfunction

function Trig_ff_Func002Func001C takes nothing returns boolean
    if ( not ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_ANCIENT) == true ) ) then
        return false
    endif
    if ( not ( 'AUau' == 'AUan' ) ) then
        return false
    endif
    if ( not ( 'YTfc' == 'LTlt' ) ) then
        return false
    endif
    return true
endfunction

function Trig_ff_Func002C takes nothing returns boolean
    return true
endfunction

function Trig_ff_Func003Func001C takes nothing returns boolean
    if ( not ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_FLYING) == true ) ) then
        return false
    endif
    if ( not ( GetSpellAbilityId() == 'AEsv' ) ) then
        return false
    endif
    if ( not ( GetDestructableTypeId(GetLastCreatedDestructable()) == 'LTbs' ) ) then
        return false
    endif
    return true
endfunction

function Trig_ff_Func003Func002C takes nothing returns boolean
    if ( ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE) == true ) ) then
        return true
    endif
    if ( ( GetSpellAbilityId() == 'AUan' ) ) then
        return true
    endif
    if ( ( GetDestructableTypeId(GetLastCreatedDestructable()) == 'LTlt' ) ) then
        return true
    endif
    return false
endfunction

function Trig_ff_Func003C takes nothing returns boolean
    if ( not Trig_ff_Func003Func001C() ) then
        return false
    endif
    if ( not Trig_ff_Func003Func002C() ) then
        return false
    endif
    return true
endfunction

function Trig_ff_Func004Func002C takes nothing returns boolean
    if ( not ( GetTerrainTypeBJ(GetRectCenter(GetPlayableMapRect())) == 'Ldrt' ) ) then
        return false
    endif
    if ( not ( GetUnitStateSwap(UNIT_STATE_LIFE, GetTriggerUnit()) >= 10 ) ) then
        return false
    endif
    if ( not ( GetUnitTypeId(GetTriggerUnit()) == 'hfoo' ) ) then
        return false
    endif
    return true
endfunction

function Trig_ff_Func004Func004Func001C takes nothing returns boolean
    if ( not ( UnitCanSleepBJ(GetTriggerUnit()) == true ) ) then
        return false
    endif
    if ( not ( GetLearnedSkillBJ() == 'AHbz' ) ) then
        return false
    endif
    if ( not ( GetOwningPlayer(GetTriggerUnit()) == Player(0) ) ) then
        return false
    endif
    return true
endfunction

function Trig_ff_Func004Func004C takes nothing returns boolean
    if ( Trig_ff_Func004Func004Func001C() ) then
        return true
    endif
    return false
endfunction

function Trig_ff_Func004C takes nothing returns boolean
    if ( not ( UnitCanSleepBJ(GetTriggerUnit()) == true ) ) then
        return false
    endif
    if ( not Trig_ff_Func004Func002C() ) then
        return false
    endif
    if ( not ( IsUnitPausedBJ(GetTriggerUnit()) == true ) ) then
        return false
    endif
    if ( not Trig_ff_Func004Func004C() ) then
        return false
    endif
    if ( not ( IsUnitAliveBJ(GetTriggerUnit()) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_ff_Func005Func001C takes nothing returns boolean
    if ( ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_SUMMONED) == true ) ) then
        return true
    endif
    if ( ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_POISONED) == true ) ) then
        return true
    endif
    return false
endfunction

function Trig_ff_Func005C takes nothing returns boolean
    if ( not Trig_ff_Func005Func001C() ) then
        return false
    endif
    return true
endfunction

function Trig_ff_Func006Func001Func002C takes nothing returns boolean
    if ( not ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_GROUND) == true ) ) then
        return false
    endif
    if ( not ( GetSpellAbilityId() == 'Acdh' ) ) then
        return false
    endif
    if ( not ( GetDestructableTypeId(GetLastCreatedDestructable()) == 'LTbs' ) ) then
        return false
    endif
    return true
endfunction

function Trig_ff_Func006Func001C takes nothing returns boolean
    if ( ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_GROUND) == true ) ) then
        return true
    endif
    if ( Trig_ff_Func006Func001Func002C() ) then
        return true
    endif
    return false
endfunction

function Trig_ff_Func006C takes nothing returns boolean
    if ( not Trig_ff_Func006Func001C() ) then
        return false
    endif
    return true
endfunction

function Trig_ff_Func007Func001Func001C takes nothing returns boolean
    if ( not ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_FLYING) == true ) ) then
        return false
    endif
    if ( not ( GetSpellAbilityId() == 'AEsv' ) ) then
        return false
    endif
    if ( not ( GetDestructableTypeId(GetLastCreatedDestructable()) == 'LTbs' ) ) then
        return false
    endif
    return true
endfunction

function Trig_ff_Func007Func001Func002C takes nothing returns boolean
    if ( ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE) == true ) ) then
        return true
    endif
    if ( ( GetSpellAbilityId() == 'AUan' ) ) then
        return true
    endif
    if ( ( GetDestructableTypeId(GetLastCreatedDestructable()) == 'LTlt' ) ) then
        return true
    endif
    return false
endfunction

function Trig_ff_Func007Func001C takes nothing returns boolean
    if ( Trig_ff_Func007Func001Func001C() ) then
        return true
    endif
    if ( Trig_ff_Func007Func001Func002C() ) then
        return true
    endif
    return false
endfunction

function Trig_ff_Func007C takes nothing returns boolean
    if ( not Trig_ff_Func007Func001C() ) then
        return false
    endif
    return true
endfunction

function Trig_ff_Func008Func001Func001C takes nothing returns boolean
    if ( ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE) == true ) ) then
        return true
    endif
    if ( ( GetSpellAbilityId() == 'AUan' ) ) then
        return true
    endif
    if ( ( GetDestructableTypeId(GetLastCreatedDestructable()) == 'LTlt' ) ) then
        return true
    endif
    return false
endfunction

function Trig_ff_Func008Func001C takes nothing returns boolean
    if ( Trig_ff_Func008Func001Func001C() ) then
        return true
    endif
    return false
endfunction

function Trig_ff_Func008C takes nothing returns boolean
    if ( not Trig_ff_Func008Func001C() ) then
        return false
    endif
    return true
endfunction

function Trig_ff_Actions takes nothing returns nothing
    if ( Trig_ff_Func001C() ) then
    else
    endif
    if ( Trig_ff_Func002C() ) then
        if ( Trig_ff_Func002Func001C() ) then
        else
        endif
    else
    endif
    if ( Trig_ff_Func003C() ) then
    else
    endif
    if ( Trig_ff_Func004C() ) then
    else
    endif
    if ( Trig_ff_Func005C() ) then
    else
    endif
    if ( Trig_ff_Func006C() ) then
    else
    endif
    if ( Trig_ff_Func007C() ) then
    else
    endif
    if ( Trig_ff_Func008C() ) then
        set bj_forLoopAIndex = 1
        set bj_forLoopAIndexEnd = 10
        loop
            exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
            set bj_forLoopAIndex = bj_forLoopAIndex + 1
        endloop
    else
    endif
endfunction

//===========================================================================
function InitTrig_ff takes nothing returns nothing
    set gg_trg_ff = CreateTrigger(  )
    call TriggerAddAction( gg_trg_ff, function Trig_ff_Actions )
endfunction
» Конечный код 40 строк
  nothing Trig_ff_Actions ( ){ 
    if IsUnitType(GetTriggerUnit(),UNIT_TYPE_STRUCTURE) and GetSpellAbilityId()=='AUan' and GetDestructableTypeId(GetLastCreatedDestructable())=='LTlt' {
    }else{
   }
   if true {
     if IsUnitType(GetTriggerUnit(),UNIT_TYPE_ANCIENT) and 'AUau'=='AUan' and 'YTfc'=='LTlt' {
     }else{
    }
    }else{
   }
    if (IsUnitType(GetTriggerUnit(),UNIT_TYPE_FLYING) and GetSpellAbilityId()=='AEsv' and GetDestructableTypeId(GetLastCreatedDestructable())=='LTbs') and (IsUnitType(GetTriggerUnit(),UNIT_TYPE_STRUCTURE) or GetSpellAbilityId()=='AUan' or GetDestructableTypeId(GetLastCreatedDestructable())=='LTlt') {
    }else{
   }
    if UnitCanSleepBJ(GetTriggerUnit()) and (GetTerrainTypeBJ(GetRectCenter(GetPlayableMapRect()))=='Ldrt' and GetUnitStateSwap(UNIT_STATE_LIFE,GetTriggerUnit())>=10 and GetUnitTypeId(GetTriggerUnit())=='hfoo') and IsUnitPausedBJ(GetTriggerUnit()) and ((UnitCanSleepBJ(GetTriggerUnit()) and GetLearnedSkillBJ()=='AHbz' and GetOwningPlayer(GetTriggerUnit())==Player(0))) and IsUnitAliveBJ(GetTriggerUnit()) {
    }else{
   }
    if (IsUnitType(GetTriggerUnit(),UNIT_TYPE_SUMMONED) or IsUnitType(GetTriggerUnit(),UNIT_TYPE_POISONED)) {
    }else{
   }
    if (IsUnitType(GetTriggerUnit(),UNIT_TYPE_GROUND) or (IsUnitType(GetTriggerUnit(),UNIT_TYPE_GROUND) and GetSpellAbilityId()=='Acdh' and GetDestructableTypeId(GetLastCreatedDestructable())=='LTbs')) {
    }else{
   }
    if ((IsUnitType(GetTriggerUnit(),UNIT_TYPE_FLYING) and GetSpellAbilityId()=='AEsv' and GetDestructableTypeId(GetLastCreatedDestructable())=='LTbs') or (IsUnitType(GetTriggerUnit(),UNIT_TYPE_STRUCTURE) or GetSpellAbilityId()=='AUan' or GetDestructableTypeId(GetLastCreatedDestructable())=='LTlt')) {
    }else{
   }
    if ((IsUnitType(GetTriggerUnit(),UNIT_TYPE_STRUCTURE) or GetSpellAbilityId()=='AUan' or GetDestructableTypeId(GetLastCreatedDestructable())=='LTlt')) {
    bj_forLoopAIndex = 1
    bj_forLoopAIndexEnd = 10
     loop{
     exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
     bj_forLoopAIndex = bj_forLoopAIndex + 1
    }
    }else{
   }
 }
 //===========================================================================
  nothing InitTrig_ff ( ){ 
   gg_trg_ff = CreateTrigger( )
   TriggerAddAction( gg_trg_ff, function Trig_ff_Actions )
 }

Oбновления

Roadmap
» v.1.01
  • Вертикальное выравнивание кода


Просмотров: 2 999

leroydraigo #1 - 2 года назад (отредактировано ) 0
Удивлен что такую проги еще не было, только было бы замечательно если бы она еще основные утечки устраняла
Jack-of-shadow #2 - 2 года назад 2
leroydraigo:
Смысл больше в том, чтоб рабочий GUI концепт было проще дорабатывать в джасс.
Автоматически устранять утечки это несколько проблемно. Но вот PolarProjectionBJ, DistanceBetweenPoints и ForGroup я думал поковырять. Также большинство BJ функций можно было бы вытащить, так так половина из них просто обертка.
leroydraigo #3 - 2 года назад 0
Jack-of-shadow, Не думал о том чтобы группы, точки и юнитов заносить в локалки?
Jack-of-shadow #4 - 2 года назад (отредактировано ) 0
leroydraigo:
Jack-of-shadow, Не думал о том чтобы группы, точки и юнитов заносить в локалки?
юнитов да, про группы уже написал, а вот с точками кажется слегка путано. Скажем GetUnitLocation(u) может быть вызвана несколько раз, но юнит может переместится, а может остаться на месте. И вот тут не ясно - требуется ли две отдельные переменные или одна изменяющаяся. (вдруг где то есть их сравнение) Да и не люблю точки, но в чтоб координаты все переводить слишком много функций нужно учесть.
uranus #5 - 2 года назад 0
Спасибо за проделанную работу! У меня есть совсем небольшие "придирки", но раз уж мы говорим о cJASS, то было приятно реализовать и это, дабы сэкономить место, и чтобы не резало глаза:
  1. Инкремент/декремент
bj_forLoopAIndex = bj_forLoopAIndex + 1 в bj_forLoopAIndex++
  1. Условные операторы and и or в && и || соотвественно
  2. Цикл loop { exitwhen(условие) } в while(условие), или хотя бы exitwhen на if (условие) break в теле цикла.
nvc123 #6 - 2 года назад 0
uranus, луп лучше не трогать
с этим бага в cjass была
хз поправили в новых версиях или нет
uranus #7 - 2 года назад 0
nvc123, а можно подробнее? И, кстати, почему слово for нельзя использовать для своих целей, если оно не используется в JASS и cJASS?
nvc123 #8 - 2 года назад 1
uranus, вайл не является часть cjass
это просто дефайн записанный в файле cj_types.j
и иногда этот дефайн тупит
уже много раз подобное случалось
особенно если скидываешь код другим людям
не говоря уже о том что у некоторых этого дефайна может вовсе не быть
поэтому я убрал этот дефайн из cj_types.j и всем остальным тоже советую
uranus, слово for используется в cjass так же как и while
т.е. оно зарезервировано для дефайнов
Jack-of-shadow #9 - 2 года назад 1
uranus:
Да, первый и второй пункт добавлю, exitwhen тоже. Возможно ещё получиься ускорть саму конвертацию. Я похоже что то упустил и иногда почти 3 сек тупит.

Почти допилил вертикальное выравнивание. Это на любителя конено, поэтому будет две параллельные версии. Первая align all, вторая только для объявления локалок.
NekoriDes #10 - 2 года назад 0
nvc123:
это просто дефайн записанный в файле cj_types.j
Гонишь. По крайней мере в новой версии jngp while работает без подключения библиотеки.
uranus #11 - 2 года назад (отредактировано ) 0
Я увидел нечто странное в файле cj_types:
while(cond) = whilenot not(cond)
NekoriDes #12 - 2 года назад 0
uranus, так в документации об этом написано
Daro #13 - 2 года назад 0
Утила выглядит довольно перспективно .Проверяли на больших пачках кода?
Цикл while() довольно проблемный , у меня он не сохранялся до этого.К тому же он обратный и еще криво считает.Не вижу в нем надобности в ВЕ никакой.
Doc #14 - 2 года назад 0
Где сурсы?
Jack-of-shadow #15 - 2 года назад 0
Daro:
Утила выглядит довольно перспективно .Проверяли на больших пачках кода?
Пробовал, вроде не ломалась.
Doc:
Где сурсы?
Внутри, оно на vbs'e можешь винраром открыть. Но лучше не надо, там все упорото очень)
Daro #16 - 2 года назад 0
Хотел бы я похвалить, но вот что -то утила твоя не справилась с конвентированым гуи-муи скиллом и раставила неправильно скобки в массиве интегра.Проверь на гуи-муи.Если можешь допиливай чтоб было похоже на скрипт аллигер ( тот что отступы раставляет).Советую нацелиться на разгребание мусора от ГУИ.Могло бы реально помочь тем, кто взломаные карты ковыряет.
uranus:
Я увидел нечто странное в файле cj_types:
while(cond) = whilenot not(cond)
Пологаю эту баганую строчку лучше совсем удалить из бибилиотек.
quq_CCCP #17 - 2 года назад 0
Daro, хм, гуи конвертить в jass а затем в cjass, мсье знает толк в извращениях...
Так если че ваше гуи превратится в чистый jass после сохранения карты и если оно работает и гуи это ваше призвание - оставьте все как есть, имхо лучше оно работать не будет.
Ну а эта тула я так понял чтобы облекчить жизнь людям которые учили с++ и пишут карты онли на сjass чтобы переводить чужой код (вроде всяких наработок или вовсе чего то из чужой карты) в удобный для них формат.
Jack-of-shadow #18 - 2 года назад (отредактировано ) 0
Daro:
раставила неправильно скобки в массиве интегра.
точно!, на массивах я не проверял. Добвалю в список исправлений.
Daro #19 - 2 года назад 0
Daro, хм, гуи конвертить в jass а затем в cjass, мсье знает толк в извращениях...
Так если че ваше гуи превратится в чистый jass после сохранения карты и если оно работает и гуи это ваше призвание - оставьте все как есть, имхо лучше оно работать не будет.
Я про что некоторые гуи - муи старые системы и скиллы неплохо было б не переписывать с нуля на хеш или Vjass, а оставить на муи раскрыв бдж функции.Глобалки (массив +I).Как-то так.
Я знаю, что СJass превращается после сохранения в Jass2.
quq_CCCP #20 - 2 года назад 0
Daro, ни одна тула не перепишет скилл с гуи на jass со структурами, хештаблицами и блекджеком с... Ну в общем смотрим что делает спелл и просто пишем на jass с учетом всех но и если.
Беда многих способностей еще и отсутствие совместимости и прочего, что нужно продумывать в живой карте где десятки способностей. Увы это порой не просто...
nvc123 #21 - 2 года назад (отредактировано ) 0
Daro, что значит оставить на муи?
как муи относится к гуи и джассу?
ты хоть знаешь что такое муи или просто увидел прикольное слово и решил вставлять его куда не лень
WakVellios #22 - 2 года назад 0
Не понимаю полезности, сокращает время переработки кода с тоннами условий? По-моему это необязательно, я большинстве случаев в GUI триггерах только событие ставлю ОО
nvc123 #23 - 2 года назад 0
WakVellios, приводит чужой код (или свой старый) к удобочитаемому виду
Clamp #24 - 1 год назад 0
И вот тут не ясно - требуется ли две отдельные переменные или одна изменяющаяся.
Всегда делай новую переменную.

Очень круто было бы иметь GUI с простенькими настройками и окнами ввода / вывода, чтобы не трогать буфер обмена. В настройках включение / отключение существующих проверок и какие-нибудь опции по стилю (их можно подсмотреть в любой IDE от JetBrains).