Понякога се налага да се извършват някой повтарящи се действия многократно. Обикновено това се случва когато се решават големи нива, с повтарящи се мотиви.
В подобни случаи някой текстови редактори предлагат възможност за използване на така наречените "макроси". Общо взето записвате някаква последователност от действия и след това може да я изпълните няколко пъти по заявка.
В YSokoban може да го направите (и без макроси) като копирате ходовете си в текстов редактор, редактирате ги и после ги изиграете (с вмъкване от клипборда). Това е възможно, но изисква много внимание и едва ли е лесно приложимо. От версия 1.500 YSokoban предоставя и макроси.
За да активирате диалога с макроси - натиснете [Макро] butona.
В макро диалога може да създавате макроси, като просто ги напишете използвайки lurd формат.
Възможно е да ги създадете и като натиснете бутона за запис: [Начало запис]. В такъв случай YSokoban ще записва вашите действия. Когато приключите - натиснете [Стоп Запис] (бутона [Макро] в главния екран се е променил на [Стоп Запис]) и всички ваши ходове ще бъдат записани във lurd формат. Сега може да ги изпълните многократно. Може и да ги запишете във файл, като им дадете име (попълвайки "Име" и натискайки [Съхранение]. От лявата страна на макро диалога ще видите всички записани макроси. Може да си избирате някой от вече записаните и да го изигравате.
В макро езика има не само LURD формат команди, а и други, с които може да се задава условно изпълнение, съхранение на позиция и други.
Може да използвате "M" или Shift-M клавишите (на латиница) за да изпълните макроса който редактирате в момента (долната част) или избран макрос (горната част).
Цъкане с мишката върху списъка с макроси извършва следното:
В LURD формата може да се задава повторител, например 3L4URD, числата записани преди всяка команда се използват за да се укаже колко пъти да бъде изпълнен командата или групата от команди. Група от команди се маркира със скоби, например: 3L4(URD) е еквивалентно на 3LURDURDURDURD.
Ако се зададе '*' (вместо число) то повторението ще се извършва докато е възможно (докато се стигне до невалиден ход, например опитваме се да минем през стена).
Освен това вътре в макроса може да активирате друг макрос като заградите името му в къдрави скоби. Например: {myMacro}. Пред къдравите скоби също може да укажете повторител. Примери:
*(lddr) *{macro} *l
Следните команди ще движат работника до безкрайност
*(lr) *(ldru)
Ако се използва '&' вместо '*' като повторител, тогава YSokoban ще проверява стриктно за движение или бутане в зависимост от зададената команда. Това означава, че ако е зададено бутане, а няма сандък за бутане в тази посока, то това се счита за невалиден ход (както и ако е зададено движение а има сандък). Това зависи от това дали се ползва малка/голяма буква в LURD формата, малките букви са за движение, големите за бутане. С други думи, ако ползвате '*' размера на буквите няма значение, ако ползвате '&' то той има значение.
Ход назад се задава с '~'. Точно както във вица: завиваш до скъсване и правиш половин оборот назад, често се ползва след команди със * (или &), за да се върнат няколкото направени нежелани хода напред.
Понякога се налага да запомним позицията на работника и после да го върнем там. Sometime there is a need to preserve current man position and later on go to that place. Запомнянето е направено като стек. Може да пъхате позиция в стека и да я вадите.
Възможно е да се зададе и относително отместване спрямо текущата позиция като се използва синтаксиса +[x,y]. Например +[3,4] ще постави в стека текущата позиция на работника но отместена с 3 колони и 4 реда (положителните числа значат надясно/надолу, отрицателните - наляво/нагоре). По-късно ^ (ако се използва) ще извади модифицираната позиция и работника ще опита да отиде там.
Командата @[3,5] обаче няма да извади нищо от стека, тази команда задава на работника да отиде на позиция отстояща на 3,5 спрямо текущата му позиция (т.е. 3 колони вдясно от текущата и 5 реда нагоре от текущия).
Командата @(3,5) (забележете кръглите скоби а не квадратни) ще накарат работника да отиде на колона 3, ред 5.
Абсолютните координати са същите като при координатна система включена с alt-R, първата координата е колона, втората е ред.
Следната таблица обобщава действието на различните команди в макро езика:
Symbol | Action | Action with [x,y] | Action with (x,y) |
---|---|---|---|
+ | пъха в стека текущата позиция на човека | пъха в стека текущата позиция на човека модифицирана със зададените относителни координати | пъха в стека зададената абсолютна позиция |
^ | вади от стека координатите и отива на тази позиция | вади от стека координатите, модифицира ги със зададените относителни координати и отива на тази позиция | вади от стека координатите и отива на позицията зададена с абсолютните координати (не ползва тези от стека) |
# | вади от стека координатите (но не ги ползва) | вади от стека координатите, модифицира ги със зададените относителни координати и ги пъха обратно в стека | вади от стека координатите, и пъха обратно в стека зададените абсолютни координати (не ползва тези от стека) |
@ | вади от стека координатите и отива на тази позиция (същото като ^) | отива на позиция с относително зададените координати (не вади нищо от стека) | отива на позиция с абсолютно зададените координати (не вади нищо от стека) |
Възможно е да се използва нещо подобно на if-then-else конструкция в макросите. Синтаксиса е:
? expression : then-moves / else-moves ;
или само
? expression : then-moves ;
Ключовите символи са '?' ':' '/' и ';'
Възможно е да се използва нещо подобно на while-do-otherwise конструкцията в макросите. Синтаксиса е (същия като при if, но се ползва двойна ?)
?? expression : do-moves / otherwise-moves ;
or just
?? expression : do-moves ;
В този случай do-move
се изпълнява многократно докато expression връща true.
Ако израза стане false то otherwise-moves
ще бъде изпълнен, но само веднъж.
Вътре в изразите за сравнения може да се използват аритметични изрази (например 1+2 > 3). Могат да се използват следните аритметични оператори:
Като операнди може да се използват:
За сравнение на числови стойности може да се използват: <, >, =, !=, <=, >=
Може да се сравнява съдържанието на дадена клетка като се укажат координати:
Клетките може да се сравняват с:
Сравнението може да се прави като се използва:
Може да се комбинират изразите с:
Няма приоритет, така че & и | се изпълняват от ляво надясно (използвайте { и } ако искате приоритет)
За да спрете цикъла използвайте !
Това ще спре ?? цикъла, както и &(...) или *(...)
Ако се използва в частта / ... ; на ?? цикъл, то ще спре по-външния цикъл (няма смисъл да спираме / част на ?? защото тя така или иначе се изпълнява само веднъж).
Примери:
*( ... // някакви движения ? [1,1]=# : ! ; // това ще спре *( ... ) цикъла ако вдясно и нагоре има стена ... // други движения )
*( ... // някакви движения ?? [1,1]=_ : rd / ! ; // това ще ходи надясно и надолу и накрая ще спре *( ... ) цикъла ... // други движения )
Ако искате да прекъснете няколко вложени цикъла - използвайте няколко ! (без интервал). Например:
*( *( ... ? [1,1]=# : !! ; // това ще прекъсне *( *( ...) ) цикъла ... ) )
или
*( ?? [1,1]=_ : ... ? [1,1]=# : !! ; // това ще прекъсне *(...) и ?? ... цикъла ... ; )
Може да пишете коментари в стил C++, т.е. всичко след // просто се пропуска.
Когато пощите макроса (убивате му бълхите или буболечките), то макроса се изпълнява постъпково.
Режима се включва като натиснете бутон <Пощене>.
За да ресетирате макроса (започнете изпълняването отначало), натиснете бутона <Отначало>.
Ако поставите символа ^ някъде той ще прекъсне изпълнението на макроса и ще активира макро диалога. Режима на пощене няма да бъде активиран, така че ако натиснете "Продължение" макроса ще продължи по нормален начин, но може да превключите към режим на пощене и да продължите постъпково изпълнението.