어제 'NPC의 토큰을 클릭하면 그 NPC로 대사를 할 수 있는' 매크로를 이렇게 만들었다가


/as "@{target|말할 토큰 선택|character_name}" ?{말할 내용|}


문득 

'character_name을 쓰면 시트랑 연동 안 되어 있는 NPC에는 못 쓰는데,

걍 token_name을 쓰는 게 낫지 않나???'라는 기분이 들어서 


/as "@{target|말할 토큰 선택|token_name}" ?{말할 내용|}


이렇게 만들었다가 깨달았다.



토큰에 따로 이름을 할당해 두지 않으면 제대로 작동을 하지 않는다는 것을...


채팅창에 /as "" 어쩌구저쩌구 식으로 입력을 해도, 

Roll20은 이걸 '빈칸 이름의 NPC가 뭐라고 떠드는' 것으로 해석하지 않고



이렇게 형식대로 쓰라고 꼽을 주며,

위의 target 문법을 쓰면 꼽조차 안 주고 장비를 정지한다. Roll20의 안 좋은 점 중 하나...




그래서 머 빈칸이 있을 때만 다르게 작동하게 할 방법 없나... 하고 이것저것 시도하던 도중에

우연히 위의 매크로에서 드롭박스에 'test'만 쳐 봤는데...





...??????


아니, 왜 NPC 이름이 test가 되느냐 하는 건 둘째치고,

저 의미불명의 'est'는 뭐임?????


글고 한국어로는 꼽 주더니만 왜 영어는 또 되는 거야???



/as "" Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.


그래서 이렇게 더 장문을 입력해 본 결과



이런 결과를 얻을 수 있었다.


즉, NPC 이름은 문장의 첫 단어를 사용하되,

영어 첫 단어의 마지막 세 글자가 본문에 유입되는 식으로 작동하는 것을 확인했다.


대관절 /as 문법이 어떤 식으로 돌아가길래 저런 황당한 버그가 발생했는가 호기심이 들어

이것저것 실험해 본 결과


내가 웹 프로그래밍에 대한 지식이 1도 없는 고로 '실제로' 내부에서 코드가 어떻게 작동하는지는 몰라도

어느 정도 버그의 구체적인 발생 원인까지는 이해할 수 있었다.



요약하자면


1. /as 문법은 영어+숫자에 한해서, 큰따옴표 없이도 NPC의 이름으로 인식하고 처리한다.


2. /as 문법에서 이름이 아닌 '본문'의 시작점을 셀 때는, 무지성으로 '/as' 뒤부터 센다.



이 두 가지 현상이 결부되어서 발생한 버그였다.



하나하나 설명해 보자면...



1. /as 문법은 영어+숫자에 한해서, 큰따옴표 없이도 NPC의 이름으로 인식하고 처리한다.



/as Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.


이 구문을 복사해서 붙여넣으면


3글자가 딸려오는 버그 없이, 이렇게 맨 앞의 단어 'Lorem'을 NPC의 이름으로 처리하는 것을 볼 수 있다.



아마 사용자들 중 주류인 영미권 사용자들이 일일히 따옴표 치는 걸 귀찮아하니까

대충 따옴표가 없어도 이어지는 문장의 '연속된 영어와 숫자로 이루어진 문자열'을 NPC 이름으로 받아버리는 모양.


/as 1q2w3e4r!




/as test동해물과 백두산이 마르고 닳도록




그래서 이런 식으로 작동한다.



달리 말하자면, NPC 이름에 한국어나 특수문자가 포함되어 있으면 그림의 떡인 기능이다.

이거 영어권 외 사용자들에 대한 차별 아닌가...


아무튼 해당 버그가 '영어로만 타이핑했을 때 발생하는' 이유는 이것이었던 것.



그렇다면 '마지막 3글자'가 딸려오는 이유는 또 무엇이었을까?




2. /as 문법에서 이름이 아닌 '본문'의 시작점을 셀 때는, 무지성으로 '/'부터 순차적으로 센다.



이것저것 시도해 본 결과, 한국어로도 같은 현상을 일으킬 수 있었다.


/as 동해물과 백두산이 "마르고" 닳도록





비슷한 현상이 발생했지만, 이번에는 유출되는 글자가 3글자가 아니다. 어째서일까?



뭔가 이상하다는 생각이 들어, 제일 처음 우리가 관찰했던 버그를

쿼리를 치환한 형태로 다시 써 봤다.


/as "" test



그리고 여기서 띄어쓰기를 하나 넣어보기로 했다.


/as  "" test





?! 이제는 단어가 온전히 나온다???


정확히는, 이제 '4글자'가 출력이 된다.



그리고 띄어쓰기가 아닌 다른 어떤 영어나 숫자가 아닌 문자,

한국어나 특문을 써도 마찬가지 현상이 일어났다.



그렇다면 결론은 간단하다. 중요한 건 '글자수'였던 거지.

우리가 관찰한 버그에서 [est]라는 세 글자가 출력되었던 건,

["" ]이라는 특수 문자가 마찬가지로 세 글자였기 때문이었던 거다.



/as 구문에서 NPC의 이름으로 출력되는 것은 영어+숫자 단어, 혹은 따옴표 안에 들어 있는 구문뿐이다.

아마 정규식을 사용해서 해당 형식에 맞는 부분을 찾는 식으로 동작하겠지.

하지만 아마도 시스템 상에서 NPC의 이름을 서칭할 때, 그 서칭된 문자열 상의 위치를 별도로 확인하지 않고

따라서 'NPC의 이름 뒤에 이어질, 채팅 내용'을 정할 때 본문의 시작부터 세는 방식으로 작동하는 것 같다.




즉 Roll20은 내부에서 이런 식으로 /as 구문을 처리하는 것이다.


평범하게 큰따옴표 형식을 맞춰 써 주거나, 실수로 NPC 이름을 제대로 적지 않더라도

문장을 영어로 시작한다면 별 문제가 되지 않을 것이다.



하지만 만약 특수문자나, 한국어 등으로 문장을 시작한다면?

그리고 정상적으로 NPC 이름의 일부로 처리할 수 없는 이런 문장들이 실제의 NPC 이름 앞을 차지한다면?




이렇게 버그가 발생하는 것이다.





이 내부구조를 모르고 봤으니 굉장히 기이하게 보였던 것.




그렇다면 이를 어떻게 응용할 수 있을까?



먼저, CSS 구문의 display 속성에는 None이 있어, 

해당 요소를 아예 나오지 않게 처리해 줄 수 있다.


또한 Roll20은 무의미하게 띄어쓰기를 여러 번 했을 경우, 그걸 하나의 띄어쓰기로 축약해 버린다.

대부분의 경우는 채팅창을 사용한 연출을 더 번거롭게 만드는 불필요한 요소지만...

이 둘을 응용하면, 



/as                             ["@{target|말할 토큰 선택|token_name}"???"](#" style="display: none;)?{말할 내용|}


이렇게 토큰의 이름보다 더 긴 띄어쓰기 빈칸을 만들어서, 

CSS를 포함한 내용 전체를 밀어내는 것으로




'이름이 존재하는 토큰'은 정상적으로 NPC 이름을 토큰명으로 출력하지만

그렇지 않을 경우 디폴트 익명 값을 NPC 이름으로 출력하는 매크로를 만들 수 있다.




이 외에도, &{template:default} 구문은 글자로 취급하지 않는다던가,

inline roll의 경우 $[[0]] 형태로 치환한 다음, 

여기서 '0'을 숫자로 받아서 NPC 이름으로 사용한다던가 하는 것도 관찰할 수 있었지만...



아무래도 그것들은 응용할 건덕지가 영 없어 보이고, 

글이 너무 길어지니 이쯤에서 생략.



다들 저 매크로 잘 사용해 줬으면 좋겠고...




fvtt 할인 중인 거 같으니 다들 JS 배우고 탈 Roll20 하자.

먼 파도파도 버그가 계속 나와...;;