https://gall.dcinside.com/mgallery/board/view?id=trpg&no=183167

Roll20 @{target|에 약간 버그 비슷한 게 있네이게 prefix까지 동원하다 보니 생긴 버그 같기는 한데...아무튼 @{target|으로 값을 받아오고 있는 도중에엉뚱한 토큰을 클릭하면 매크로 계산 중에 target이 그 토큰으로 바뀌고심지어 @{target|첫gall.dcinside.com


https://gall.dcinside.com/mgallery/board/view?id=trpg&no=183198

Roll20)target의 Turn tracker를 불러올 때 주의점예전에 이 글에서 Turn tracker를 포인터로 사용해서Roll20 내에서 각종 데이터를 전달하는 데 쓸 수 있다고 했었지?읽기 귀찮은 사람들을 위해 다시 한 번 간략히 설명하자면target으로 선택할 토큰과 연동gall.dcinside.com


이미 @{target} 관련 버그가 있다는 글을 올린 게 두 개나 있는데

이쯤 되면 그냥 @{target} 자체에 문제가 있다는 생각밖에 안 들기 시작한다...



암튼, 매크로를 또 꼬아버리는 골치아픈 문제가 하나 더 있다.





Roll20 커뮤니티 위키에 있는 연산 순서 테이블.

우리의 상식으로는, @{target|어쩌구|저쩌구_속성명} 방식으로 attribute를 호출하는 건

@{selected|저쩌구_속성명}, @{시트 이름|저쩌구_속성명}, @{tracker|어쩌구_턴_트래커_토큰이름}

와 완전히 동일한 순서로 처리되어야 할 것 같이 보인다.



근데 아무리 봐도, @{target|어쩌구|저쩌구_속성명}이 한 단계에서 동시에 처리가 안 되는 상황이 있다.

검증을 위해 개념증명 하나를 만들어 왔다.




Macro라는 시트를 만든 다음, delayAttributePrefix, delayAbilityPrefix 어빌리티와 속성을 만들어둔다.

속성의 delay들은 각각 {Macro|delayAttributePrefix}, {Macro|delayAbilityPrefix}로 치환되기 때문에

%@@@@@@{Macro|delayAbilityPrefix} 식으로 매크로를 작성하면, 연산 순서의 1-3이 반복될 때마다

@가 하나씩 사라지면서 지연 동작을 하게 되는 방식.



그리고 '병사 확인'을 출력하는 간단한 속성을 하나 정의해 둔다.





그리고 어빌리티로 test1, test2를 정의한다.

test1은 그냥 클릭한 토큰의 token_name을 가져오는 매크로.

test2는 지연 치환을 이용해서, 클릭한 토큰의 token_name이 '병사'일 경우

'병사 확인'이라는 값을 출력하고,

그 외의 경우에는 에러를 토해내는 매우 단순한 매크로다.


실제로 이 매크로는 의도대로 매우 잘 작동한다. 아무 문제도 없지.




그러면 이 '작동하는 매크로'를 4번 반복하는 매크로를 정의하면

아무 문제도 없이 '병사 확인'을 4번 출력하겠지?





...???? 왜인지 버그가 일어난다.


정확히는, 첫 번째 %{Macro|test2}는 매우 잘 작동한다.

문제는 두 번째 줄부터 @{target|test|token_name}이 '병사'로 치환되기도 전에

먼저 @{Macro|@{target|test|token_name}이 치환되려고 하는 것이다.



그러니까, 똑같은 단계에 있는 @{target|test|token_name} 중

더 위에 있는 놈들만 바뀌고, 나머지는 더 늦게 바뀐다는 것이다!




이 문제를 해결하려면 어떻게 해야 할까?




test2와 비슷하지만, 조금 더 지연되어 동작하는 test4를 정의하고

이걸 같은 방식으로 test5에서 반복시키면






왜인지 버그가 조금 더 완화되는 것을 알 수 있다!



즉, 버그가 생기지 않을 때까지 @{target|test|token_name}을 참조하는

다른 매크로들을 느리게 작동하게 하면

버그를 예방할 수 있다.





....대체 왜 그렇게 되는데????????????





꼭 @{target|test|token_name}이 한 번의 1-3 단계 반복마다 하나씩만 바뀌는 것 같은데,

대체 왜 그렇게 설계해 놓은 것인지 알 수가 없다;;

내 분석이 100% 맞는 건지도 잘 모르겠음, 호출 순서에 따라 뭔가 달라지는 느낌도 있어서...




그리고 지금 내가 작성하고 있는 건독 매크로를 보자면...



이런 식으로, target의 턴 트래커 정보를 받아오거나,

차량인지 사람인지 검증하거나, [장갑치]와 [방어치]를 부위별로 불러오면서

수동으로 그 중 어느 걸 사용할지 결정하거나... 하는 식으로

@{target| 문법을 매크로 하나에 열 번 스무 번씩 쓸 수밖에 없다.



그리고 이놈들이 호출되는 단계는 당연히 단계마다 다 다르다.



그러면 어떻게 되느냐?








이런 식으로, 작성자도 이해할 수 없는 @@@@가 엄청나게 붙게 된다.


저기서 @를 한 개만 줄이거나 늘려도 버그가 난다. 이유는 모른다.

수십 단계를 거쳐서 호출이 되는데 몇 단계를 거쳐서 @{target}을 부르는지 그걸 어케 카운트해...



저 ?{달성치}는 이 스파게티의 절정으로,

원래는 저걸 넣으면 index 순서가 꼬여서 버그가 나야 정상인데

오히려 저걸 빼면 버그가 일어남;; 진짜 뭔데...?




그러면 이따구로 매크로를 짜 놓으면 나중에 수정은 어찌 하냐구요?



나도 몰라 ㅅㅂ;;





지연 치환 자체가 반쯤 버그성 테크닉이라고는 하지만

대체 target을 왜 이렇게 불러오게 만들어 놓은 거야... ㅜㅜ