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을 출력하고 작동을 정지한다.

여기까지는 우리가 아는 바다.



{Macro|extend} @{target|test|token_name}



이제, extend라는 속성(attribute)을 하나 매크로 시트에 정의하자.

마찬가지로 재귀적으로 작동할 수 있는 매크로다.

만약 앞에 @가 있을 경우, @를 하나씩 지워가면서 계속 작동하되

그 과정에서 @{target|test|token_name}을 하나씩 만들어낸다.




그리고 같은 방식으로 재귀 매크로를 동작시키되,

이 extend 속성이 100단계보다 더 많이 동작하도록, @를 잔뜩 붙여준다.



이 매크로를 실행하면...





놀랍게도, 0이 100개보다 훨씬 더 많이 만들어진다.

즉 매크로가 100단계보다 더 많이 치환 동작을 했다!



아마 Roll20은 내부적으로 치환 동작을 99단계만 반복하되,

출력되는 텍스트에 @{target|이 남아 있을 경우

추가로 치환 동작을 반복하도록 설계되어 있는 것으로 추정된다. 




그리고 지저분하게 출력되는 token_name의 경우

! 문법과 delayAttributePrefix를 만든 것과 같은 방법을 사용해서 지워버릴 수 있다.



즉, 이를 바탕으로 

@{target| 문법을 사용하는 경우

원하는 만큼 매크로의 치환 동작을 더 늘릴 수 있는 것이다.




@{target|을 반드시 사용해야만 하므로 제약이 있긴 하지만

기존 매크로의 제약을 효과적으로 우회할 수 있다는 이야기.



상당히 뜻깊은 발견이라서, 후닥닥 정리해 왔다.


---


...근데 대체 왜 이렇게 만들어둔 거지???

이러면 또 무한 루프로 동작하지 않는 매크로 같은 걸 얼마든지 만들 수 있다는 소린데;;