어제 'NPC의 토큰을 클릭하면 그 NPC로 대사를 할 수 있는' 매크로를 이렇게 만들었다가
문득
'character_name을 쓰면 시트랑 연동 안 되어 있는 NPC에는 못 쓰는데,
걍 token_name을 쓰는 게 낫지 않나???'라는 기분이 들어서
이렇게 만들었다가 깨달았다.
토큰에 따로 이름을 할당해 두지 않으면 제대로 작동을 하지 않는다는 것을...
채팅창에 /as "" 어쩌구저쩌구 식으로 입력을 해도,
Roll20은 이걸 '빈칸 이름의 NPC가 뭐라고 떠드는' 것으로 해석하지 않고
이렇게 형식대로 쓰라고 꼽을 주며,
위의 target 문법을 쓰면 꼽조차 안 주고 장비를 정지한다. Roll20의 안 좋은 점 중 하나...
그래서 머 빈칸이 있을 때만 다르게 작동하게 할 방법 없나... 하고 이것저것 시도하던 도중에
우연히 위의 매크로에서 드롭박스에 'test'만 쳐 봤는데...
...??????
아니, 왜 NPC 이름이 test가 되느냐 하는 건 둘째치고,
저 의미불명의 'est'는 뭐임?????
글고 한국어로는 꼽 주더니만 왜 영어는 또 되는 거야???
그래서 이렇게 더 장문을 입력해 본 결과
이런 결과를 얻을 수 있었다.
즉, NPC 이름은 문장의 첫 단어를 사용하되,
영어 첫 단어의 마지막 세 글자가 본문에 유입되는 식으로 작동하는 것을 확인했다.
대관절 /as 문법이 어떤 식으로 돌아가길래 저런 황당한 버그가 발생했는가 호기심이 들어
이것저것 실험해 본 결과
내가 웹 프로그래밍에 대한 지식이 1도 없는 고로 '실제로' 내부에서 코드가 어떻게 작동하는지는 몰라도
어느 정도 버그의 구체적인 발생 원인까지는 이해할 수 있었다.
요약하자면
1. /as 문법은 영어+숫자에 한해서, 큰따옴표 없이도 NPC의 이름으로 인식하고 처리한다.
2. /as 문법에서 이름이 아닌 '본문'의 시작점을 셀 때는, 무지성으로 '/as' 뒤부터 센다.
이 두 가지 현상이 결부되어서 발생한 버그였다.
하나하나 설명해 보자면...
1. /as 문법은 영어+숫자에 한해서, 큰따옴표 없이도 NPC의 이름으로 인식하고 처리한다.
이 구문을 복사해서 붙여넣으면
3글자가 딸려오는 버그 없이, 이렇게 맨 앞의 단어 'Lorem'을 NPC의 이름으로 처리하는 것을 볼 수 있다.
아마 사용자들 중 주류인 영미권 사용자들이 일일히 따옴표 치는 걸 귀찮아하니까
대충 따옴표가 없어도 이어지는 문장의 '연속된 영어와 숫자로 이루어진 문자열'을 NPC 이름으로 받아버리는 모양.
그래서 이런 식으로 작동한다.
달리 말하자면, NPC 이름에 한국어나 특수문자가 포함되어 있으면 그림의 떡인 기능이다.
이거 영어권 외 사용자들에 대한 차별 아닌가...
아무튼 해당 버그가 '영어로만 타이핑했을 때 발생하는' 이유는 이것이었던 것.
그렇다면 '마지막 3글자'가 딸려오는 이유는 또 무엇이었을까?
2. /as 문법에서 이름이 아닌 '본문'의 시작점을 셀 때는, 무지성으로 '/'부터 순차적으로 센다.
이것저것 시도해 본 결과, 한국어로도 같은 현상을 일으킬 수 있었다.
비슷한 현상이 발생했지만, 이번에는 유출되는 글자가 3글자가 아니다. 어째서일까?
뭔가 이상하다는 생각이 들어, 제일 처음 우리가 관찰했던 버그를
쿼리를 치환한 형태로 다시 써 봤다.
그리고 여기서 띄어쓰기를 하나 넣어보기로 했다.
?! 이제는 단어가 온전히 나온다???
정확히는, 이제 '4글자'가 출력이 된다.
그리고 띄어쓰기가 아닌 다른 어떤 영어나 숫자가 아닌 문자,
한국어나 특문을 써도 마찬가지 현상이 일어났다.
그렇다면 결론은 간단하다. 중요한 건 '글자수'였던 거지.
우리가 관찰한 버그에서 [est]라는 세 글자가 출력되었던 건,
["" ]이라는 특수 문자가 마찬가지로 세 글자였기 때문이었던 거다.
/as 구문에서 NPC의 이름으로 출력되는 것은 영어+숫자 단어, 혹은 따옴표 안에 들어 있는 구문뿐이다.
아마 정규식을 사용해서 해당 형식에 맞는 부분을 찾는 식으로 동작하겠지.
하지만 아마도 시스템 상에서 NPC의 이름을 서칭할 때, 그 서칭된 문자열 상의 위치를 별도로 확인하지 않고
따라서 'NPC의 이름 뒤에 이어질, 채팅 내용'을 정할 때 본문의 시작부터 세는 방식으로 작동하는 것 같다.
즉 Roll20은 내부에서 이런 식으로 /as 구문을 처리하는 것이다.
평범하게 큰따옴표 형식을 맞춰 써 주거나, 실수로 NPC 이름을 제대로 적지 않더라도
문장을 영어로 시작한다면 별 문제가 되지 않을 것이다.
하지만 만약 특수문자나, 한국어 등으로 문장을 시작한다면?
그리고 정상적으로 NPC 이름의 일부로 처리할 수 없는 이런 문장들이 실제의 NPC 이름 앞을 차지한다면?
이렇게 버그가 발생하는 것이다.
이 내부구조를 모르고 봤으니 굉장히 기이하게 보였던 것.
그렇다면 이를 어떻게 응용할 수 있을까?
먼저, CSS 구문의 display 속성에는 None이 있어,
해당 요소를 아예 나오지 않게 처리해 줄 수 있다.
또한 Roll20은 무의미하게 띄어쓰기를 여러 번 했을 경우, 그걸 하나의 띄어쓰기로 축약해 버린다.
대부분의 경우는 채팅창을 사용한 연출을 더 번거롭게 만드는 불필요한 요소지만...
이 둘을 응용하면,
이렇게 토큰의 이름보다 더 긴 띄어쓰기 빈칸을 만들어서,
CSS를 포함한 내용 전체를 밀어내는 것으로
'이름이 존재하는 토큰'은 정상적으로 NPC 이름을 토큰명으로 출력하지만
그렇지 않을 경우 디폴트 익명 값을 NPC 이름으로 출력하는 매크로를 만들 수 있다.
이 외에도, &{template:default} 구문은 글자로 취급하지 않는다던가,
inline roll의 경우 $[[0]] 형태로 치환한 다음,
여기서 '0'을 숫자로 받아서 NPC 이름으로 사용한다던가 하는 것도 관찰할 수 있었지만...
아무래도 그것들은 응용할 건덕지가 영 없어 보이고,
글이 너무 길어지니 이쯤에서 생략.
다들 저 매크로 잘 사용해 줬으면 좋겠고...
fvtt 할인 중인 거 같으니 다들 JS 배우고 탈 Roll20 하자.
먼 파도파도 버그가 계속 나와...;;
해당 댓글은 삭제되었습니다.
걍 포트포워딩 굴려도 되지 않음?