https://gall.dcinside.com/mgallery/board/view?id=trpg&no=208392
Roll20)target 문법으로 매크로를 짤 때 주의해야 할 버그https://gall.dcinside.com/mgallery/board/view?id=trpg&no=183167 Roll20 @{target|에 약간 버그 비슷한 게 있네 - TRPG 마이너 갤러리이게gall.dcinside.com이 문제에 대해서 좀 더 연구해 본 결과
@{target|으로 속성을 호출하는 과정에 대해 조금 더 잘 이해할 수 있었다.
결론부터 말하자면, @{target|은 이 다른 속성들과 다른 순서로 작동하며,
1~3 단계에서 맨 위에 있는 @{target| 하나만을 바꾸고 다음 단계로 넘어가는 게 맞는 것 같다.
달리 말하자면, 중간에 ability / macro / 속성이 치환되면서
새로운 @{target|이 매크로의 윗 줄에 나타날 경우
다음 단계부터는 그 새롭게 나타난 @{target|이 먼저 치환된다.
(단, 4 이전에 해당 단계에서 새롭게 나타난 @{target|이 먼저 치환되는 건 아니다.
다음 단계부터 텍스트 전체를 스캔하는 느낌.)
달리 말하자면, 매크로의 구조가 매우 복잡해질 경우
먼저 처리되어야 할 @{target| 속성이 한참 나중에 치환되는 문제가 생기고,
이 때문에 매크로의 동작 순서가 꼬이는 문제가 빈번하게 이루어진다.
내가 저번에 '왜인지 이렇게 고치면 작동한다'고 한 것도 마찬가지 맥락.
계산 순서가 저 뒤로 밀려도 상관없는 'turn tracker에서 값 가져오기' 계산을
한참 뒤에 작동하도록 순서를 미룸으로써
먼저 치환되어야 할 @{target| 속성들을 참조하는 매크로들이 멀쩡하게 작동하도록 한 것이다.
다만 이런 방식으로 매크로를 천천히 작동하게 만드려니
Roll20에서 ability / macro / 속성의 치환을 99단계까지밖에 하지 않는 문제가 겹쳐서,
수십 개의 @{target| 속성들을 가져올 경우
해당 단계 내에 로직을 우겨넣는 것이 매우 힘들어지는 문제가 있었다.
그래서 고민하던 중이었는데...
잠깐, 이상하다고 생각하지 않는가?
1단계에서 @{target| 속성 단 하나를 치환하는데
어떻게 @{target| 속성을 100개 이상 불러낼 수 있지???
https://gall.dcinside.com/mgallery/board/view?id=trpg&no=183198
Roll20)target의 Turn tracker를 불러올 때 주의점예전에 이 글에서 Turn tracker를 포인터로 사용해서Roll20 내에서 각종 데이터를 전달하는 데 쓸 수 있다고 했었지?읽기 귀찮은 사람들을 위해 다시 한 번 간략히 설명하자면target으로 선택할 토큰과 연동gall.dcinside.com이건 어떻게 작동하는 거냔 말이야???
이걸 설명하기 위해서 간단한 개념증명을 만들어보도록 하자.
간단히 재귀적인 매크로를 하나 만들어본다.
해당 매크로는 자기 자신을 계속해서 참조하면서, 이 와중에 0을 하나 출력한다.
만약 Roll20에 치환 단계 제한이 없으면 이 매크로는 무한루프를 일으킬 것이다.
하지만 우리가 알다시피 제한이 있으므로, 해당 매크로는 100개 가량의 0을 출력하고 작동을 정지한다.
여기까지는 우리가 아는 바다.
이제, extend라는 속성(attribute)을 하나 매크로 시트에 정의하자.
마찬가지로 재귀적으로 작동할 수 있는 매크로다.
만약 앞에 @가 있을 경우, @를 하나씩 지워가면서 계속 작동하되
그 과정에서 @{target|test|token_name}을 하나씩 만들어낸다.
그리고 같은 방식으로 재귀 매크로를 동작시키되,
이 extend 속성이 100단계보다 더 많이 동작하도록, @를 잔뜩 붙여준다.
이 매크로를 실행하면...
놀랍게도, 0이 100개보다 훨씬 더 많이 만들어진다.
즉 매크로가 100단계보다 더 많이 치환 동작을 했다!
아마 Roll20은 내부적으로 치환 동작을 99단계만 반복하되,
출력되는 텍스트에 @{target|이 남아 있을 경우
추가로 치환 동작을 반복하도록 설계되어 있는 것으로 추정된다.
그리고 지저분하게 출력되는 token_name의 경우
! 문법과 delayAttributePrefix를 만든 것과 같은 방법을 사용해서 지워버릴 수 있다.
즉, 이를 바탕으로
@{target| 문법을 사용하는 경우
원하는 만큼 매크로의 치환 동작을 더 늘릴 수 있는 것이다.
@{target|을 반드시 사용해야만 하므로 제약이 있긴 하지만
기존 매크로의 제약을 효과적으로 우회할 수 있다는 이야기.
상당히 뜻깊은 발견이라서, 후닥닥 정리해 왔다.
---
...근데 대체 왜 이렇게 만들어둔 거지???
이러면 또 무한 루프로 동작하지 않는 매크로 같은 걸 얼마든지 만들 수 있다는 소린데;;
주문시전자를 보느기분