https://gall.dcinside.com/mgallery/board/view?id=trpg&no=183167
Roll20 @{target|에 약간 버그 비슷한 게 있네이게 prefix까지 동원하다 보니 생긴 버그 같기는 한데...아무튼 @{target|으로 값을 받아오고 있는 도중에엉뚱한 토큰을 클릭하면 매크로 계산 중에 target이 그 토큰으로 바뀌고심지어 @{target|첫gall.dcinside.comhttps://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을 왜 이렇게 불러오게 만들어 놓은 거야... ㅜㅜ
댓글 0