The_Witcher

Script Language Aligner

» опубликован
» Предназначение: Работа с кодом
Утилита для автоматической расстановки отступов в коде для повышения его удобочитаемости и наглядности. Очень минималистична и удобна в использовании. Работает с языками Jass, vJass и Zinc.
Текущая версия: v3.2 (05.02.2012)

Использование

Скопируйте исходный код в буфер обмена (CTRL+C), после чего нажмите кнопку "Paste+Align+Copy". После чего вы можете вставить выровненный код в свою карту.

Пример

» Исходный код
library DoorSystem initializer Init
    // Door system by The_Witcher
    //
// this system opens every instance of the registered doortypes when a units comes close
// if the unit moves away from the door it will close again

    globals
        //if this is true doors will only close on leave if there are no units in their range
        public boolean CLOSE_ONLY_WHEN_EMPTY = true
         // These are the standart animations for the doors in your map
        private constant string STANDART_OPEN_ANIMATION = "Death Alternate"
                private constant string STANDART_STAND_OPEN_ANIMATION = "Stand Alternate"
        private constant string STANDART_CLOSE_ANIMATION = "Birth"
            private constant string STANDART_STAND_CLOSE_ANIMATION = "stand"
    endglobals

    //Doors will only be triggered when the entering unit matches these conditions
            private function DoorEventConditions takes nothing returns boolean
        return not (IsUnitType(GetFilterUnit(),UNIT_TYPE_DEAD) or GetUnitTypeId(GetFilterUnit()) == 0 )
            endfunction

    //-----------Don't modify anything below this line---------

            globals
                private integer array doors
        private real array range
               private integer total
        private hashtable h
                private boolexpr filt
                    private boolexpr enter
        private integer i
        private group g
        private timer tim
    endglobals

            private function FilterFunc takes nothing returns boolean
        return GetDestructableTypeId(GetFilterDestructable()) == doors[i] and LoadBoolean(h,GetHandleId(GetFilterDestructable()),1) != true and LoadBoolean(h,GetHandleId(GetFilterDestructable()),2) != true
    endfunction
        
    private function DoorActions takes nothing returns nothing
                    local destructable d = LoadDestructableHandle(h,GetHandleId(GetTriggeringTrigger()),0)  
        if GetTriggerEventId()==EVENT_GAME_ENTER_REGION and not LoadBoolean(h,GetHandleId(d),0) then
    call KillDestructable(d)
call SaveBoolean(h,GetHandleId(d),0,true)
            call SetDestructableAnimation(d,LoadStr(h,GetDestructableTypeId(d),4))
    call QueueDestructableAnimation(d,LoadStr(h,GetDestructableTypeId(d),5))
        elseif GetTriggerEventId()==EVENT_GAME_LEAVE_REGION and LoadBoolean(h,GetHandleId(d),0) then
            if not CLOSE_ONLY_WHEN_EMPTY then
                call DestructableRestoreLife(d,GetDestructableMaxLife(d),true)
                call SaveBoolean(h,GetHandleId(d),0,false)
      call SetDestructableAnimation(d, LoadStr(h,GetDestructableTypeId(d),6))
                call QueueDestructableAnimation(d, LoadStr(h,GetDestructableTypeId(d),7))
            else
          call GroupClear(g)
                call GroupEnumUnitsInRect(g, LoadRectHandle(h,GetHandleId(d),3), enter)
                if FirstOfGroup(g) == null then
        call DestructableRestoreLife(d,GetDestructableMaxLife(d),true)
                    call SaveBoolean(h,GetHandleId(d),0,false)
               call SetDestructableAnimation(d, LoadStr(h,GetDestructableTypeId(d),6))
             call QueueDestructableAnimation(d, LoadStr(h,GetDestructableTypeId(d),7))
                endif
            endif
endif
set d = null
    endfunction

private function RegisterEvents takes nothing returns nothing
local destructable d = GetEnumDestructable()
local trigger t = CreateTrigger()
local region g = CreateRegion()
local real x = GetDestructableX(d)
local real y = GetDestructableY(d)
local rect r = Rect(x-range[i], y-range[i], x+range[i], y+range[i])
call RegionAddRect(g,r)
call SaveBoolean(h,GetHandleId(d),0,false)
call SaveDestructableHandle(h,GetHandleId(t),0,d)
call SaveRectHandle(h,GetHandleId(d),3,r)
call SaveBoolean(h,GetHandleId(d),1,true)
call SaveStr(h,GetDestructableTypeId(d),4,STANDART_OPEN_ANIMATION)
call SaveStr(h,GetDestructableTypeId(d),5,STANDART_STAND_OPEN_ANIMATION)
call SaveStr(h,GetDestructableTypeId(d),6,STANDART_CLOSE_ANIMATION)
call SaveStr(h,GetDestructableTypeId(d),7,STANDART_STAND_CLOSE_ANIMATION)
call TriggerRegisterEnterRegion(t,g,enter)
call TriggerRegisterLeaveRegion(t,g,enter)
call TriggerAddAction(t,function DoorActions)
set t = null
set d = null
set r = null
set g = null
endfunction

            private function RescanAll takes nothing returns nothing
        set i = 0
        loop
    exitwhen i >= total
       call EnumDestructablesInRect(bj_mapInitialPlayableArea, filt, function RegisterEvents)
     set i = i + 1
        endloop
    endfunction

function OpenDoor takes destructable d, boolean flag returns nothing
call SaveBoolean(h,GetHandleId(h),0,flag)
endfunction

function ExcludeDoor takes destructable d, boolean flag returns nothing
call SaveBoolean(h,GetHandleId(h),2,flag)
endfunction
    
        function ChangeDoorTypeAnimations takes integer id, string openAnimation, string standOpenAnimation, string closeAnimation, string standCloseAnimation returns nothing
      call SaveStr(h,id,4,openAnimation)
        call SaveStr(h,id,5,standOpenAnimation)
    call SaveStr(h,id,6,closeAnimation)
        call SaveStr(h,id,7,standCloseAnimation)
    endfunction

        function AddDoorType takes integer id, real enterRange returns nothing
            set doors[total] = id
        set range[total] = enterRange
                    call SaveStr(h,id,4,STANDART_OPEN_ANIMATION)
        call SaveStr(h,id,5,STANDART_STAND_OPEN_ANIMATION)
            call SaveStr(h,id,6,STANDART_CLOSE_ANIMATION)
                call SaveStr(h,id,7,STANDART_STAND_CLOSE_ANIMATION)
            set total = total + 1
        call RescanAll()
        endfunction

  private function Init takes nothing returns nothing
                set h = InitHashtable()
        set total = 0
                set filt = Condition(function FilterFunc)
            set enter = Condition(function DoorEventConditions)
        set g = CreateGroup()
        set tim = CreateTimer()
        endfunction
        
            private function CatchNewDoors takes integer objectid, real x, real y, real face, real scale, integer variation returns nothing
                call TimerStart(tim,0.01,false,function RescanAll)
            endfunction
    
            private function CatchNewDoors2 takes integer objectid, real x, real y, real z, real face, real scale, integer variation returns nothing
                call TimerStart(tim,0.01,false,function RescanAll)
        endfunction
    
hook CreateDestructable CatchNewDoors
  hook CreateDestructableZ CatchNewDoors2

    endlibrary
» Конечный код
library DoorSystem initializer Init
    // Door system by The_Witcher
    //
    // this system opens every instance of the registered doortypes when a units comes close
    // if the unit moves away from the door it will close again

    globals
        //if this is true doors will only close on leave if there are no units in their range
        public boolean CLOSE_ONLY_WHEN_EMPTY = true
        // These are the standart animations for the doors in your map
        private constant string STANDART_OPEN_ANIMATION = "Death Alternate"
        private constant string STANDART_STAND_OPEN_ANIMATION = "Stand Alternate"
        private constant string STANDART_CLOSE_ANIMATION = "Birth"
        private constant string STANDART_STAND_CLOSE_ANIMATION = "stand"
    endglobals

    //Doors will only be triggered when the entering unit matches these conditions
    private function DoorEventConditions takes nothing returns boolean
        return not ( IsUnitType( GetFilterUnit( ), UNIT_TYPE_DEAD ) or GetUnitTypeId( GetFilterUnit( ) ) == 0 )
    endfunction

    //-----------Don't modify anything below this line---------

    globals
        private integer array doors
        private real array range
        private integer total
        private hashtable h
        private boolexpr filt
        private boolexpr enter
        private integer i
        private group g
        private timer tim
    endglobals

    private function FilterFunc takes nothing returns boolean
        return GetDestructableTypeId( GetFilterDestructable( ) ) == doors[i] and LoadBoolean( h, GetHandleId( GetFilterDestructable( ) ), 1 ) != true and LoadBoolean( h, GetHandleId( GetFilterDestructable( ) ), 2 ) != true
    endfunction
        
    private function DoorActions takes nothing returns nothing
        local destructable d = LoadDestructableHandle( h, GetHandleId( GetTriggeringTrigger( ) ), 0 )
        if GetTriggerEventId( )==EVENT_GAME_ENTER_REGION and not LoadBoolean( h, GetHandleId( d ), 0 ) then
            call KillDestructable( d )
            call SaveBoolean( h, GetHandleId( d ), 0, true )
            call SetDestructableAnimation( d, LoadStr( h, GetDestructableTypeId( d ), 4 ) )
            call QueueDestructableAnimation( d, LoadStr( h, GetDestructableTypeId( d ), 5 ) )
        elseif GetTriggerEventId( )==EVENT_GAME_LEAVE_REGION and LoadBoolean( h, GetHandleId( d ), 0 ) then
            if not CLOSE_ONLY_WHEN_EMPTY then
                call DestructableRestoreLife( d, GetDestructableMaxLife( d ), true )
                call SaveBoolean( h, GetHandleId( d ), 0, false )
                call SetDestructableAnimation( d, LoadStr( h, GetDestructableTypeId( d ), 6 ) )
                call QueueDestructableAnimation( d, LoadStr( h, GetDestructableTypeId( d ), 7 ) )
            else
                call GroupClear( g )
                call GroupEnumUnitsInRect( g, LoadRectHandle( h, GetHandleId( d ), 3 ), enter )
                if FirstOfGroup( g ) == null then
                    call DestructableRestoreLife( d, GetDestructableMaxLife( d ), true )
                    call SaveBoolean( h, GetHandleId( d ), 0, false )
                    call SetDestructableAnimation( d, LoadStr( h, GetDestructableTypeId( d ), 6 ) )
                    call QueueDestructableAnimation( d, LoadStr( h, GetDestructableTypeId( d ), 7 ) )
                endif
            endif
        endif
        set d = null
    endfunction

    private function RegisterEvents takes nothing returns nothing
        local destructable d = GetEnumDestructable( )
        local trigger t = CreateTrigger( )
        local region g = CreateRegion( )
        local real x = GetDestructableX( d )
        local real y = GetDestructableY( d )
        local rect r = Rect( x - range[i], y - range[i], x + range[i], y + range[i] )
        call RegionAddRect( g, r )
        call SaveBoolean( h, GetHandleId( d ), 0, false )
        call SaveDestructableHandle( h, GetHandleId( t ), 0, d )
        call SaveRectHandle( h, GetHandleId( d ), 3, r )
        call SaveBoolean( h, GetHandleId( d ), 1, true )
        call SaveStr( h, GetDestructableTypeId( d ), 4, STANDART_OPEN_ANIMATION )
        call SaveStr( h, GetDestructableTypeId( d ), 5, STANDART_STAND_OPEN_ANIMATION )
        call SaveStr( h, GetDestructableTypeId( d ), 6, STANDART_CLOSE_ANIMATION )
        call SaveStr( h, GetDestructableTypeId( d ), 7, STANDART_STAND_CLOSE_ANIMATION )
        call TriggerRegisterEnterRegion( t, g, enter )
        call TriggerRegisterLeaveRegion( t, g, enter )
        call TriggerAddAction( t, function DoorActions )
        set t = null
        set d = null
        set r = null
        set g = null
    endfunction

    private function RescanAll takes nothing returns nothing
        set i = 0
        loop
            exitwhen i >= total
            call EnumDestructablesInRect( bj_mapInitialPlayableArea, filt, function RegisterEvents )
            set i = i + 1
        endloop
    endfunction

    function OpenDoor takes destructable d, boolean flag returns nothing
        call SaveBoolean( h, GetHandleId( h ), 0, flag )
    endfunction

    function ExcludeDoor takes destructable d, boolean flag returns nothing
        call SaveBoolean( h, GetHandleId( h ), 2, flag )
    endfunction
    
    function ChangeDoorTypeAnimations takes integer id, string openAnimation, string standOpenAnimation, string closeAnimation, string standCloseAnimation returns nothing
        call SaveStr( h, id, 4, openAnimation )
        call SaveStr( h, id, 5, standOpenAnimation )
        call SaveStr( h, id, 6, closeAnimation )
        call SaveStr( h, id, 7, standCloseAnimation )
    endfunction

    function AddDoorType takes integer id, real enterRange returns nothing
        set doors[total] = id
        set range[total] = enterRange
        call SaveStr( h, id, 4, STANDART_OPEN_ANIMATION )
        call SaveStr( h, id, 5, STANDART_STAND_OPEN_ANIMATION )
        call SaveStr( h, id, 6, STANDART_CLOSE_ANIMATION )
        call SaveStr( h, id, 7, STANDART_STAND_CLOSE_ANIMATION )
        set total = total + 1
        call RescanAll( )
    endfunction

    private function Init takes nothing returns nothing
        set h = InitHashtable( )
        set total = 0
        set filt = Condition( function FilterFunc )
        set enter = Condition( function DoorEventConditions )
        set g = CreateGroup( )
        set tim = CreateTimer( )
    endfunction
        
    private function CatchNewDoors takes integer objectid, real x, real y, real face, real scale, integer variation returns nothing
        call TimerStart( tim, 0.01, false, function RescanAll )
    endfunction
    
    private function CatchNewDoors2 takes integer objectid, real x, real y, real z, real face, real scale, integer variation returns nothing
        call TimerStart( tim, 0.01, false, function RescanAll )
    endfunction
    
    hook CreateDestructable CatchNewDoors
    hook CreateDestructableZ CatchNewDoors2

endlibrary

История изменений

v3.2:
  • Исправлен баг с интерфейсом
  • Исправлен баг с "i = - 1" (теперь становится "i = -1")
v3.1:
  • Исправлен мелкий баг
v3.0:
  • Переписана бОльшая часть кода
  • Исправлен баг с "operator x="
» предыдущее
v2.1:
  • Добавлена поддержка для строк вроде "-n" (которые преобразовывались в " - n" в прошлой версии)
  • Добавлена поддержка комментариев /* и */
  • Исправлен баг при обработке комбинации private static
  • Изменены изначальные настройки
v2.0:
  • Переписан весь код: устранены баги при обработке ключевых слов static, private, constant и т.д.
  • Добавлена кнопка восстановления старой версии кода (в случае, если программа сработала некорректно)
  • Добавлены опции форматирования пробелов
v1.3:
  • Добавлена поддержка блоков module
v1.2:
  • Большие изменения в коде
  • Убрана поддержка кода на pascal (существует собственный выравниватель)
  • Добавлена поддержка постоянных функций (constant function)
  • Добавлена обработка унылого кода без пробелов вроде 'if(s==2)then'
v1.1:
  • Добавлена поддержка блоков static if
  • Изменён интерфейс


Просмотров: 11 839

Hanabishi #1 - 9 лет назад 0
о очень хорошо а то чужой код самому было лень править
да и прогу сам написать чёт не догадался
MyRtZ #2 - 9 лет назад 0
Что такое отступ в коде?
Бтв жаль что только vJass
Faion #3 - 9 лет назад 0
Отступы в коде = просто оформление кода, для читабельности.
Прога весьма полезна для для любитлей респилить чужие мапы и дернуть код.
Nekit1234007 #4 - 9 лет назад 0
MyRtZ, исходный и конечный код религия не позволяет сравнить?
Скайнет #5 - 9 лет назад 0
депротект васи !, как бе делает тоже самое
Rewenger #6 - 9 лет назад (отредактировано ) 0
Скайнет, не надо пороть чепухи. Неужели ты будешь протектить и депротектить свою карту ради этого, теряя все уникальные имена переменных и функций?
Скайнет #7 - 9 лет назад 0
лол.
речь очевидно идёт не о своём коде, иначе я не знаю, зачем кому-то писать свой код нечитабельным и затем прогонять через что-то
reALien #8 - 9 лет назад 0
Код из нубовских времен
H #9 - 9 лет назад 0
Мне бы такой для html, с синтаксом php из воблы =`(
А то по пол часа приходится разравнивать код записанный в одну огромную строку.
JaBeN_Симфер #10 - 9 лет назад 0
Прикол весь в том, что даже Jass Shop Pro, в котором до сих пор очень удобно писать код, умеет это делать, и даже блоками, и + ко всему можно закомментировать/раскомментировать сразу несколько строк. Но в отличии от этой проги, Jass Shop Pro не понимает vJass, но врядли это нужно, если в карте после компиляции будет чистый Jass.
Doc #11 - 9 лет назад 0
reALien, именно так я и поступил о_о.
JaBeN_Симфер, ага, а про комментарии /* */ вы не в курсе? И редактировать в карте код вы тоже будете прогоняя его в голове в обычный?
MyRtZ, да, жаль что нет сжасса, но буржуи его не любят.
2 комментария удалено
Skino #14 - 9 лет назад 0
Прога очень поможет моему проэкту. А есть ещё прога которая код делает более читаемым в плане замены на ассоциативные имена что бы было например local player p а не local player XVI
spellwerk #15 - 9 лет назад 0
но врядли это нужно, если в карте после компиляции будет чистый Jass.
зачем тогда v/cJass по вашему нужны?
а то что отступы блоками, дак это и TESH умеет, выделил да нажал таб
а утилита полезная, больше половины кодеров не представляют, зачем нужны эти пробелы, как следствие код их разбирать очень и очень трудно
RunixMing47 #16 - 9 лет назад 0
Люди, хватит нести бред, просто маленькая прога делающая ваш код немного читабельнее, я использовал что бы хоть как то понять старые функции, метод действия которых я забыл и исправить баги в них.
FruityKilla #17 - 8 лет назад 0
"удобочитаемости"
wtf? мы на каком языке разговариваем?
spellwerk #18 - 8 лет назад 0
"удобочитаемости"
wtf? мы на каком языке разговариваем?
Русском
NoSilence #19 - 8 лет назад 0
971 КБ
ну уж очень минимальна!
Это сообщение удалено
DualShock #21 - 8 лет назад 0
Я пользуюсь, норм прога.
vladfaust #22 - 8 лет назад 0
Сделайте поддержку cJass!
OBowb #23 - 8 лет назад 0
мощно
XyZoD #24 - 8 лет назад 0
Довольнотаки бесполезно.
Это сообщение удалено
ScorpioT1000 #26 - 8 лет назад 0
cJass для меня дороже этой хрени =)
Skino #27 - 8 лет назад 0
Очень полезная прога.
Xipxop #28 - 6 лет назад 2
В программе найден 1 баг.
Если есть строка:
if(If()) then А If это не if!!
то он делает так:
if ( if() ) then что НЕПРАВИЛЬНО
Это сообщение удалено